bool nrf_send_packet(const NRF_ADDR* targetAddr, const uint8_t* data) { if (targetAddr == NULL || data == NULL) { return false; } nrf_standby(); nrf_set_tx_addr(targetAddr->B, sizeof(targetAddr->B)); nrf_cmd_write(NRF_CMD_W_TX_PAYLOAD, data, NRF_PACKET_SIZE); nrf_ce_pulse(NRF_CE_PULSE_DELAY_US); if (nrf_wait_irq(NRF_TX_WAIT_MS)) { uint8_t status = nrf_reg_read(NRF_REG_STATUS); nrf_reg_write(NRF_REG_STATUS, NRF_STATUS_TX_DS | NRF_STATUS_MAX_RT); if (status & NRF_STATUS_TX_DS) { return true; } else if (status & NRF_STATUS_MAX_RT) { nrf_cmd_write(NRF_CMD_FLUSH_TX, NULL, 0); return false; } else { nrf_debugPrint("Unexpected status in sending packet:"); nrf_debugDumpBytes(&status, sizeof(status)); nrf_debugPrint("\r\n"); } } else { nrf_debugPrint("Sending timeout\r\n"); } return false; }
static void handle_set_msg(snrf_msg_t* msg) { /* capture before modifying */ const uint8_t key = msg->u.set.key; const uint32_t val = le_to_uint32(msg->u.set.val); if ((snrf_state != SNRF_STATE_CONF) && (key != SNRF_KEY_STATE)) { MAKE_COMPL_ERROR(msg, SNRF_ERR_VAL); return ; } /* completion sent back, assume success */ MAKE_COMPL_ERROR(msg, SNRF_ERR_SUCCESS); switch (key) { case SNRF_KEY_STATE: { if (val >= SNRF_STATE_MAX) { MAKE_COMPL_ERROR(msg, SNRF_ERR_VAL); break ; } if (val == snrf_state) { /* nothing */ break ; } if (val == SNRF_STATE_CONF) { nrf_set_powerdown_mode(); } else if (val == SNRF_STATE_TXRX) { nrf_set_rx_mode(); } snrf_state = val; break ; } case SNRF_KEY_CRC: if (val == SNRF_CRC_DISABLED) nrf_disable_crc(); else if (val == SNRF_CRC_8) nrf_enable_crc8(); else if (val == SNRF_CRC_16) nrf_enable_crc16(); else MAKE_COMPL_ERROR(msg, SNRF_ERR_VAL); break ; #if (NRF_CONFIG_NRF24L01P == 1) case SNRF_KEY_RATE: { static const uint8_t map[] = { NRF24L01P_RATE_250KBPS, /* invalid */ NRF24L01P_RATE_250KBPS, NRF24L01P_RATE_1MBPS, NRF24L01P_RATE_2MBPS }; if ((val == 0) || (val >= ARRAY_COUNT(map))) { MAKE_COMPL_ERROR(msg, SNRF_ERR_VAL); } else { nrf24l01p_set_rate(map[val]); } break ; } #endif #if (NRF_CONFIG_NRF24L01P == 1) case SNRF_KEY_CHAN: nrf24l01p_set_chan((uint8_t)val); break ; #endif case SNRF_KEY_ADDR_WIDTH: if (nrf_set_addr_width(val)) MAKE_COMPL_ERROR(msg, SNRF_ERR_VAL); break ; case SNRF_KEY_RX_ADDR: nrf_set_rx_addr((uint8_t*)&val); break ; case SNRF_KEY_TX_ADDR: nrf_set_tx_addr((uint8_t*)&val); break ; case SNRF_KEY_TX_ACK: /* disable tx ack */ if (val == 0) nrf_disable_tx_ack(); /* enable tx ack */ else if (val == 1) nrf_enable_tx_ack(); else MAKE_COMPL_ERROR(msg, SNRF_ERR_VAL); break ; case SNRF_KEY_PAYLOAD_WIDTH: if (val > SNRF_MAX_PAYLOAD_WIDTH) MAKE_COMPL_ERROR(msg, SNRF_ERR_VAL); else nrf_set_payload_width((uint8_t)val); break ; case SNRF_KEY_UART_FLAGS: uart_flags = (uint8_t)val; break ; default: MAKE_COMPL_ERROR(msg, SNRF_ERR_KEY); break ; } }