Fix warnings and rx logic.
2 files changed, 33 insertions(+), 12 deletions(-)

M nrf24.c
M nrf24.h
M nrf24.c +28 -10
@@ 15,7 15,7 @@ 
 #define RF24_RX_ADDR_P0_ADDR 0x0A // location of pipe 0 rx address
 #define RF24_RX_ADDR_P1_ADDR 0x0B // location of pipe 1 rx address
 #define RF24_RX_PW_P0_ADDR 0x11   // Payload len of (rx) pipe 0
-
+#define RF24_FIFO_STATUS_ADDR 0x17
 
 
 #define RF24_TX_ADDR_ADDR 0x10 // location of tx address

          
@@ 44,8 44,12 @@ 
 #define PWR_UP      (1 << 1)
 #define PRIM_RX     (1 << 0)
 
-// #define LOG debug_printf
-#define LOG 
+#ifdef NDEBUG
+#define LOG
+#else
+#define LOG debug_printf
+#endif
+// #define LOG
 
 const struct rf24_settings rf24_defaults =
   {

          
@@ 170,7 174,7 @@ uint8_t rf24_write_register(uint8_t reg,
   if (write_status != CTL_NO_ERROR) {
     LOG("write_register, write error: %d\n", write_status);
   }
-  
+
   ctl_spi_deselect_device(&nrf24_device);
   LOG("rf24_write_register ok\n");
 

          
@@ 200,6 204,11 @@ void rf24_set_status(uint8_t value)
   (void)rf24_write_register(RF24_STATUS_ADDR, value);
 }
 
+uint8_t rf24_get_fifo_status(void)
+{
+  return rf24_read_register(RF24_FIFO_STATUS_ADDR);
+}
+
 void rf24_set_channel(uint8_t ch)
 {
   uint8_t s;

          
@@ 276,7 285,7 @@ int rf24_get_rx_payload_len(uint8_t pipe
   return 0;
 }
 
-int rf24_get_rx_payload(char *payload, uint8_t payload_max_len, uint8_t *len)
+int rf24_get_rx_payload(unsigned char *payload, uint8_t payload_max_len, uint8_t *len)
 {
   CTL_STATUS_t transfer_status, read_status;
   uint8_t data, command;

          
@@ 324,7 333,7 @@ int rf24_set_tx_payload(const char *payl
   transfer_status = ctl_spi_exchange(&nrf24_device, &command, &data, 1);
   if (transfer_status != CTL_NO_ERROR) {
     LOG("rf24_set_tx_payload, transfer error: %d\n", transfer_status);
-    
+
     ctl_spi_deselect_device(&nrf24_device);
     return RF24_ERROR;
   }

          
@@ 414,6 423,7 @@ void rf24_receive_task_code(void *p);
 void rf24_start_listening_with_callback(nrf24_payload_handler payload_handler)
 {
   rf24_start_listening();
+  nrf24_payload_handler_fn = payload_handler;
   if (!nrf24_listening_task_running) {
     nrf24_listening_task_running = true;
     memset(listening_task_stack, 0xcd, sizeof(listening_task_stack));

          
@@ 472,11 482,11 @@ void rf24_init(const struct rf24_setting
   nrf24_listening_task_running = false;
 
   ctl_spi_attach_device(spi_bus, &nrf24_device);
-  
+
   nrf24_device.select = rf24_select;
   nrf24_cs_fn = select_fn;
   nrf24_ce_fn = ce_fn;
-  
+
   ctl_spi_set_protocol(&nrf24_device, CTL_SPI_MODE0, 8, 100000, 0xFF);
 
   rf24_ce(false);

          
@@ 492,7 502,7 @@ void rf24_init(const struct rf24_setting
   }
 
   s = rf24_read_register_array(0x0A, addr, 5);
-  LOG("rf24 default address: %02x %02x %02x %02x %02x\n", addr[0], addr[1], addr[2], addr[3], addr[4]); 
+  LOG("rf24 default address: %02x %02x %02x %02x %02x\n", addr[0], addr[1], addr[2], addr[3], addr[4]);
 
   s = rf24_write_register(0x05, 76);
   LOG("channel write status: %d\n", s);

          
@@ 528,11 538,16 @@ void rf24_receive_task_code(void *p)
   while(1) {
     ctl_events_set_clear(&rf24_events, 0, RX_PACKET_ARRIVED_EVENT|ERROR_EVENT);
 
+    LOG("%ld RF24 RX task: waiting for data...\n", ctl_get_current_time());
     wait_status = ctl_events_wait(CTL_EVENT_WAIT_ANY_EVENTS_WITH_AUTO_CLEAR,
       &rf24_events, RX_PACKET_ARRIVED_EVENT|ERROR_EVENT,
       CTL_TIMEOUT_INFINITE, 0);
 
+
+    LOG("wait_status: %x\n", wait_status);
+
     if (wait_status & RX_PACKET_ARRIVED_EVENT) {
+      out = false;
       while (!out) {
         // read status
         // read payload

          
@@ 540,6 555,7 @@ void rf24_receive_task_code(void *p)
         // read fifo status
 
         status = rf24_status();
+        LOG("rf24_status: %x\n", status);
         if ((status & RF24_STATUS_RX_DR) == 0) {
           out = true;
           break;

          
@@ 554,7 570,9 @@ void rf24_receive_task_code(void *p)
         rf24_set_status(status);
 
         if (nrf24_payload_handler_fn) {
-          nrf24_payload_handler_fn(fifo_no, payload);
+          nrf24_payload_handler_fn(fifo_no, payload, 32);
+        } else {
+          LOG("warning: no payload handler\n");
         }
       }
     }

          
M nrf24.h +5 -2
@@ 12,11 12,13 @@ 
 #define RF24_STATUS_TX_FULL (1 << 0) // TX FIFO full
 #define RF24_STATUS_MASK 0b01111111 // bits 0..6 are used in status
 
+#define RF24_FIFO_STATUS_RX_FULL (1 << 1) // RX FIFO full
+
 #define RF24_OK 0
 #define RF24_ERROR -1
 
 typedef void (*nrf24_pin_state)(int state);
-typedef void (*nrf24_payload_handler)(uint8_t fifo_no, const char *payload);
+typedef void (*nrf24_payload_handler)(uint8_t fifo_no, const unsigned char *payload, uint8_t payload_len);
 
 struct rf24_settings {
   bool data_received_interrupt;

          
@@ 34,9 36,10 @@ void rf24_init(const struct rf24_setting
 void rf24_get_config(struct rf24_settings* config);
 uint8_t rf24_status(void);
 void rf24_set_status(uint8_t value);
+uint8_t rf24_get_fifo_status(void);
 void rf24_set_rx_addr(uint8_t pipe_no, const uint8_t *addr, uint8_t addr_len);
 void rf24_set_rx_payload_len(uint8_t pipe_no, uint8_t payload_len);
-int rf24_get_rx_payload(char *payload, uint8_t payload_max_len, uint8_t *len);
+int rf24_get_rx_payload(unsigned char *payload, uint8_t payload_max_len, uint8_t *len);
 int rf24_set_tx_payload(const char *payload, uint8_t payload_len);
 void rf24_enable_pipes(uint8_t pipe_mask);
 void rf24_set_tx_addr(const uint8_t *addr, uint8_t addr_len);