/** * @file radio.h * @brief RADIO peripheral driver -- NRF_1Mbit proprietary mode. */ #pragma once #include #include /** * @brief PTT packet transmitted on every FHSS hop. * * The receiver uses @p slot to resynchronise its FHSS counter after * receiving the first packet. */ typedef struct __attribute__((packed)) { uint32_t slot; /**< Sender's FHSS slot number at time of transmission. */ uint8_t flags; /**< Bitmask: PTT_FLAG_ACTIVE when voice channel is open. */ } ptt_frame_t; #define PTT_FLAG_ACTIVE 0x01u /**< PTT button is held on the transmitting side. */ /** @brief Configure the RADIO peripheral (mode, packet format, address, CRC, power). */ void radio_init(void); /** * @brief Set the RF channel. * @param ch Channel index 0-39, maps to 2400+ch MHz (MAP=0). */ void radio_set_channel(uint8_t ch); /** * @brief Transmit one packet synchronously. * * Loads @p data into the internal packet buffer, asserts TASKS_TXEN, and * returns after EVENTS_END fires. RADIO is DISABLED automatically via the * END_DISABLE shortcut before the function returns. * * @param data Payload bytes. * @param len Payload length (0-255 bytes). */ void radio_tx(const uint8_t *data, uint8_t len); /** * @brief Transmit one FHSS hop: advance channel, send PTT frame, hold dwell time. * * Call repeatedly in a loop while the PTT button is held. Each call occupies * exactly FHSS_DWELL_MS milliseconds. */ void radio_tx_burst(void); /** * @brief Receive one FHSS hop: advance channel, listen for FHSS_DWELL_MS ms. * * If a packet with a valid CRC arrives during the dwell window, @p frame_out * is filled and the function returns true. The caller should then call * fhss_set_slot(frame_out->slot + 1) to synchronise the hopping sequence. * * @param frame_out Destination for the received frame (must not be NULL). * @return true if a valid packet was received, false on timeout or CRC error. */ bool radio_rx_burst(ptt_frame_t *frame_out);