local for mbed5
radio.h@4:c6ef863d0b07, 2017-09-04 (annotated)
- Committer:
- GregCr
- Date:
- Mon Sep 04 15:16:44 2017 +0000
- Revision:
- 4:c6ef863d0b07
- Parent:
- 3:7e3595a9ebe0
- Child:
- 7:7d021a81fe46
Candidate release
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
GregCr | 0:deaafdfde3bb | 1 | /* |
GregCr | 4:c6ef863d0b07 | 2 | ______ _ |
GregCr | 0:deaafdfde3bb | 3 | / _____) _ | | |
GregCr | 0:deaafdfde3bb | 4 | ( (____ _____ ____ _| |_ _____ ____| |__ |
GregCr | 0:deaafdfde3bb | 5 | \____ \| ___ | (_ _) ___ |/ ___) _ \ |
GregCr | 0:deaafdfde3bb | 6 | _____) ) ____| | | || |_| ____( (___| | | | |
GregCr | 0:deaafdfde3bb | 7 | (______/|_____)_|_|_| \__)_____)\____)_| |_| |
GregCr | 0:deaafdfde3bb | 8 | (C)2016 Semtech |
GregCr | 0:deaafdfde3bb | 9 | |
GregCr | 0:deaafdfde3bb | 10 | Description: Handling of the node configuration protocol |
GregCr | 0:deaafdfde3bb | 11 | |
GregCr | 0:deaafdfde3bb | 12 | License: Revised BSD License, see LICENSE.TXT file include in the project |
GregCr | 0:deaafdfde3bb | 13 | |
GregCr | 0:deaafdfde3bb | 14 | Maintainer: Miguel Luis, Gregory Cristian and Matthieu Verdy |
GregCr | 0:deaafdfde3bb | 15 | */ |
GregCr | 0:deaafdfde3bb | 16 | #ifndef __RADIO_H__ |
GregCr | 0:deaafdfde3bb | 17 | #define __RADIO_H__ |
GregCr | 0:deaafdfde3bb | 18 | |
GregCr | 0:deaafdfde3bb | 19 | #include "mbed.h" |
GregCr | 0:deaafdfde3bb | 20 | |
GregCr | 0:deaafdfde3bb | 21 | /*! |
GregCr | 0:deaafdfde3bb | 22 | * \brief Structure describing the radio status |
GregCr | 0:deaafdfde3bb | 23 | */ |
GregCr | 0:deaafdfde3bb | 24 | typedef union RadioStatus_u |
GregCr | 0:deaafdfde3bb | 25 | { |
GregCr | 0:deaafdfde3bb | 26 | uint8_t Value; |
GregCr | 0:deaafdfde3bb | 27 | struct |
GregCr | 0:deaafdfde3bb | 28 | { //bit order is lsb -> msb |
GregCr | 0:deaafdfde3bb | 29 | uint8_t Reserved : 1; //!< Reserved |
GregCr | 0:deaafdfde3bb | 30 | uint8_t CmdStatus : 3; //!< Command status |
GregCr | 0:deaafdfde3bb | 31 | uint8_t ChipMode : 3; //!< Chip mode |
GregCr | 0:deaafdfde3bb | 32 | uint8_t CpuBusy : 1; //!< Flag for CPU radio busy |
GregCr | 0:deaafdfde3bb | 33 | }Fields; |
GregCr | 0:deaafdfde3bb | 34 | }RadioStatus_t; |
GregCr | 0:deaafdfde3bb | 35 | |
GregCr | 0:deaafdfde3bb | 36 | /*! |
GregCr | 0:deaafdfde3bb | 37 | * \brief Structure describing the error codes for callback functions |
GregCr | 0:deaafdfde3bb | 38 | */ |
GregCr | 4:c6ef863d0b07 | 39 | typedef enum |
GregCr | 0:deaafdfde3bb | 40 | { |
GregCr | 4:c6ef863d0b07 | 41 | IRQ_HEADER_ERROR_CODE = 0x01, |
GregCr | 4:c6ef863d0b07 | 42 | IRQ_SYNCWORD_ERROR_CODE = 0x02, |
GregCr | 4:c6ef863d0b07 | 43 | IRQ_CRC_ERROR_CODE = 0x04, |
GregCr | 4:c6ef863d0b07 | 44 | }IrqErrorCode_t; |
GregCr | 0:deaafdfde3bb | 45 | |
GregCr | 0:deaafdfde3bb | 46 | |
GregCr | 0:deaafdfde3bb | 47 | enum IrqPblSyncHeaderCode_t |
GregCr | 0:deaafdfde3bb | 48 | { |
GregCr | 4:c6ef863d0b07 | 49 | IRQ_PBL_DETECT_CODE = 0x01, |
GregCr | 4:c6ef863d0b07 | 50 | IRQ_SYNCWORD_VALID_CODE = 0x02, |
GregCr | 4:c6ef863d0b07 | 51 | IRQ_HEADER_VALID_CODE = 0x04, |
GregCr | 3:7e3595a9ebe0 | 52 | }; |
GregCr | 3:7e3595a9ebe0 | 53 | |
GregCr | 3:7e3595a9ebe0 | 54 | enum IrqTimeoutCode_t |
GregCr | 3:7e3595a9ebe0 | 55 | { |
GregCr | 4:c6ef863d0b07 | 56 | IRQ_RX_TIMEOUT = 0x00, |
GregCr | 4:c6ef863d0b07 | 57 | IRQ_TX_TIMEOUT = 0x01, |
GregCr | 4:c6ef863d0b07 | 58 | IRQ_XYZ = 0xFF, |
GregCr | 0:deaafdfde3bb | 59 | }; |
GregCr | 0:deaafdfde3bb | 60 | |
GregCr | 0:deaafdfde3bb | 61 | /*! |
GregCr | 0:deaafdfde3bb | 62 | * \brief The radio command opcodes |
GregCr | 0:deaafdfde3bb | 63 | */ |
GregCr | 4:c6ef863d0b07 | 64 | typedef enum RadioCommands_e RadioCommands_t; |
GregCr | 4:c6ef863d0b07 | 65 | |
GregCr | 4:c6ef863d0b07 | 66 | /*! |
GregCr | 4:c6ef863d0b07 | 67 | * \brief The radio callbacks structure |
GregCr | 4:c6ef863d0b07 | 68 | * Holds function pointers to be called on radio interrupts |
GregCr | 4:c6ef863d0b07 | 69 | */ |
GregCr | 4:c6ef863d0b07 | 70 | typedef struct |
GregCr | 4:c6ef863d0b07 | 71 | { |
GregCr | 4:c6ef863d0b07 | 72 | void ( *txDone )( void ); //!< Pointer to a function run on successful transmission |
GregCr | 4:c6ef863d0b07 | 73 | void ( *rxDone )( void ); //!< Pointer to a function run on successful reception |
GregCr | 4:c6ef863d0b07 | 74 | void ( *rxPreambleDetect )( void ); //!< Pointer to a function run on successful Preamble detection |
GregCr | 4:c6ef863d0b07 | 75 | void ( *rxSyncWordDone )( void ); //!< Pointer to a function run on successful SyncWord reception |
GregCr | 4:c6ef863d0b07 | 76 | void ( *rxHeaderDone )( void ); //!< Pointer to a function run on successful Header reception |
GregCr | 4:c6ef863d0b07 | 77 | void ( *txTimeout )( void ); //!< Pointer to a function run on transmission timeout |
GregCr | 4:c6ef863d0b07 | 78 | void ( *rxTimeout )( void ); //!< Pointer to a function run on reception timeout |
GregCr | 4:c6ef863d0b07 | 79 | void ( *rxError )( IrqErrorCode_t errCode ); //!< Pointer to a function run on reception error |
GregCr | 4:c6ef863d0b07 | 80 | void ( *cadDone )( bool cadFlag ); //!< Pointer to a function run on channel activity detected |
GregCr | 4:c6ef863d0b07 | 81 | }RadioCallbacks_t; |
GregCr | 0:deaafdfde3bb | 82 | |
GregCr | 0:deaafdfde3bb | 83 | /*! |
GregCr | 0:deaafdfde3bb | 84 | * \brief Class holding the basic communications with a radio |
GregCr | 0:deaafdfde3bb | 85 | * |
GregCr | 0:deaafdfde3bb | 86 | * It sets the functions to read/write registers, send commands and read/write |
GregCr | 0:deaafdfde3bb | 87 | * payload. |
GregCr | 0:deaafdfde3bb | 88 | * It also provides functions to run callback functions depending on the |
GregCr | 0:deaafdfde3bb | 89 | * interrupts generated from the radio. |
GregCr | 0:deaafdfde3bb | 90 | */ |
GregCr | 0:deaafdfde3bb | 91 | class Radio |
GregCr | 0:deaafdfde3bb | 92 | { |
GregCr | 0:deaafdfde3bb | 93 | protected: |
GregCr | 0:deaafdfde3bb | 94 | /*! |
GregCr | 0:deaafdfde3bb | 95 | * \brief Callback on Tx done interrupt |
GregCr | 0:deaafdfde3bb | 96 | */ |
GregCr | 4:c6ef863d0b07 | 97 | void ( *txDone )( void ); |
GregCr | 0:deaafdfde3bb | 98 | |
GregCr | 0:deaafdfde3bb | 99 | /*! |
GregCr | 0:deaafdfde3bb | 100 | * \brief Callback on Rx done interrupt |
GregCr | 0:deaafdfde3bb | 101 | */ |
GregCr | 4:c6ef863d0b07 | 102 | void ( *rxDone )( void ); |
GregCr | 4:c6ef863d0b07 | 103 | |
GregCr | 4:c6ef863d0b07 | 104 | /*! |
GregCr | 4:c6ef863d0b07 | 105 | * \brief Callback on Rx preamble detection interrupt |
GregCr | 4:c6ef863d0b07 | 106 | */ |
GregCr | 4:c6ef863d0b07 | 107 | void ( *rxPreambleDetect )( void ); |
GregCr | 4:c6ef863d0b07 | 108 | |
GregCr | 4:c6ef863d0b07 | 109 | /*! |
GregCr | 4:c6ef863d0b07 | 110 | * \brief Callback on Rx SyncWord interrupt |
GregCr | 4:c6ef863d0b07 | 111 | */ |
GregCr | 4:c6ef863d0b07 | 112 | void ( *rxSyncWordDone )( void ); |
GregCr | 0:deaafdfde3bb | 113 | |
GregCr | 0:deaafdfde3bb | 114 | /*! |
GregCr | 4:c6ef863d0b07 | 115 | * \brief Callback on Rx header received interrupt |
GregCr | 0:deaafdfde3bb | 116 | */ |
GregCr | 4:c6ef863d0b07 | 117 | void ( *rxHeaderDone )( void ); |
GregCr | 0:deaafdfde3bb | 118 | |
GregCr | 0:deaafdfde3bb | 119 | /*! |
GregCr | 4:c6ef863d0b07 | 120 | * \brief Callback on Tx timeout interrupt |
GregCr | 0:deaafdfde3bb | 121 | */ |
GregCr | 4:c6ef863d0b07 | 122 | void ( *txTimeout )( void ); |
GregCr | 4:c6ef863d0b07 | 123 | |
GregCr | 4:c6ef863d0b07 | 124 | /*! |
GregCr | 4:c6ef863d0b07 | 125 | * \brief Callback on Rx timeout interrupt |
GregCr | 4:c6ef863d0b07 | 126 | */ |
GregCr | 4:c6ef863d0b07 | 127 | void ( *rxTimeout )( void ); |
GregCr | 0:deaafdfde3bb | 128 | |
GregCr | 0:deaafdfde3bb | 129 | /*! |
GregCr | 0:deaafdfde3bb | 130 | * \brief Callback on Rx error interrupt |
GregCr | 0:deaafdfde3bb | 131 | * |
GregCr | 4:c6ef863d0b07 | 132 | * \param [out] errCode A code indicating the type of interrupt (SyncWord error or CRC error) |
GregCr | 0:deaafdfde3bb | 133 | */ |
GregCr | 0:deaafdfde3bb | 134 | void ( *rxError )( IrqErrorCode_t errCode ); |
GregCr | 0:deaafdfde3bb | 135 | |
GregCr | 0:deaafdfde3bb | 136 | /*! |
GregCr | 0:deaafdfde3bb | 137 | * \brief Callback on Channel Activity Detection done interrupt |
GregCr | 0:deaafdfde3bb | 138 | * |
GregCr | 0:deaafdfde3bb | 139 | * \param [out] cadFlag Flag for channel activity detected or not |
GregCr | 0:deaafdfde3bb | 140 | */ |
GregCr | 0:deaafdfde3bb | 141 | void ( *cadDone )( bool cadFlag ); |
GregCr | 0:deaafdfde3bb | 142 | |
GregCr | 0:deaafdfde3bb | 143 | public: |
GregCr | 0:deaafdfde3bb | 144 | /*! |
GregCr | 0:deaafdfde3bb | 145 | * \brief Constructor for radio class |
GregCr | 4:c6ef863d0b07 | 146 | * Sets the callbacks functions pointers |
GregCr | 0:deaafdfde3bb | 147 | * |
GregCr | 4:c6ef863d0b07 | 148 | * \param [in] callbacks The structure of callbacks function pointers |
GregCr | 4:c6ef863d0b07 | 149 | * to be called on radio interrupts |
GregCr | 4:c6ef863d0b07 | 150 | * |
GregCr | 0:deaafdfde3bb | 151 | */ |
GregCr | 4:c6ef863d0b07 | 152 | Radio( RadioCallbacks_t *callbacks ) |
GregCr | 0:deaafdfde3bb | 153 | { |
GregCr | 4:c6ef863d0b07 | 154 | this->txDone = callbacks->txDone; |
GregCr | 4:c6ef863d0b07 | 155 | this->rxDone = callbacks->rxDone; |
GregCr | 4:c6ef863d0b07 | 156 | this->rxPreambleDetect = callbacks->rxPreambleDetect; |
GregCr | 4:c6ef863d0b07 | 157 | this->rxSyncWordDone = callbacks->rxSyncWordDone; |
GregCr | 4:c6ef863d0b07 | 158 | this->rxHeaderDone = callbacks->rxHeaderDone; |
GregCr | 4:c6ef863d0b07 | 159 | this->txTimeout = callbacks->txTimeout; |
GregCr | 4:c6ef863d0b07 | 160 | this->rxTimeout = callbacks->rxTimeout; |
GregCr | 4:c6ef863d0b07 | 161 | this->rxError = callbacks->rxError; |
GregCr | 4:c6ef863d0b07 | 162 | this->cadDone = callbacks->cadDone; |
GregCr | 0:deaafdfde3bb | 163 | } |
GregCr | 4:c6ef863d0b07 | 164 | virtual ~Radio( void ){ }; |
GregCr | 0:deaafdfde3bb | 165 | |
GregCr | 0:deaafdfde3bb | 166 | /*! |
GregCr | 0:deaafdfde3bb | 167 | * \brief Resets the radio |
GregCr | 0:deaafdfde3bb | 168 | */ |
GregCr | 0:deaafdfde3bb | 169 | virtual void Reset( void ) = 0; |
GregCr | 0:deaafdfde3bb | 170 | |
GregCr | 0:deaafdfde3bb | 171 | /*! |
GregCr | 0:deaafdfde3bb | 172 | * \brief Gets the current radio status |
GregCr | 0:deaafdfde3bb | 173 | * |
GregCr | 0:deaafdfde3bb | 174 | * \retval status Radio status |
GregCr | 0:deaafdfde3bb | 175 | */ |
GregCr | 0:deaafdfde3bb | 176 | virtual RadioStatus_t GetStatus( void ) = 0; |
GregCr | 0:deaafdfde3bb | 177 | |
GregCr | 0:deaafdfde3bb | 178 | /*! |
GregCr | 0:deaafdfde3bb | 179 | * \brief Writes the given command to the radio |
GregCr | 0:deaafdfde3bb | 180 | * |
GregCr | 0:deaafdfde3bb | 181 | * \param [in] opcode Command opcode |
GregCr | 0:deaafdfde3bb | 182 | * \param [in] buffer Command parameters byte array |
GregCr | 0:deaafdfde3bb | 183 | * \param [in] size Command parameters byte array size |
GregCr | 0:deaafdfde3bb | 184 | */ |
GregCr | 0:deaafdfde3bb | 185 | virtual void WriteCommand( RadioCommands_t opcode, uint8_t *buffer, uint16_t size ) = 0; |
GregCr | 0:deaafdfde3bb | 186 | |
GregCr | 0:deaafdfde3bb | 187 | /*! |
GregCr | 0:deaafdfde3bb | 188 | * \brief Reads the given command from the radio |
GregCr | 0:deaafdfde3bb | 189 | * |
GregCr | 0:deaafdfde3bb | 190 | * \param [in] opcode Command opcode |
GregCr | 0:deaafdfde3bb | 191 | * \param [in] buffer Command parameters byte array |
GregCr | 0:deaafdfde3bb | 192 | * \param [in] size Command parameters byte array size |
GregCr | 0:deaafdfde3bb | 193 | */ |
GregCr | 0:deaafdfde3bb | 194 | virtual void ReadCommand( RadioCommands_t opcode, uint8_t *buffer, uint16_t size ) = 0; |
GregCr | 0:deaafdfde3bb | 195 | |
GregCr | 0:deaafdfde3bb | 196 | /*! |
GregCr | 0:deaafdfde3bb | 197 | * \brief Writes multiple radio registers starting at address |
GregCr | 0:deaafdfde3bb | 198 | * |
GregCr | 0:deaafdfde3bb | 199 | * \param [in] address First Radio register address |
GregCr | 0:deaafdfde3bb | 200 | * \param [in] buffer Buffer containing the new register's values |
GregCr | 0:deaafdfde3bb | 201 | * \param [in] size Number of registers to be written |
GregCr | 0:deaafdfde3bb | 202 | */ |
GregCr | 0:deaafdfde3bb | 203 | virtual void WriteRegister( uint16_t address, uint8_t *buffer, uint16_t size ) = 0; |
GregCr | 0:deaafdfde3bb | 204 | |
GregCr | 0:deaafdfde3bb | 205 | /*! |
GregCr | 0:deaafdfde3bb | 206 | * \brief Writes the radio register at the specified address |
GregCr | 0:deaafdfde3bb | 207 | * |
GregCr | 0:deaafdfde3bb | 208 | * \param [in] address Register address |
GregCr | 0:deaafdfde3bb | 209 | * \param [in] value New register value |
GregCr | 0:deaafdfde3bb | 210 | */ |
GregCr | 4:c6ef863d0b07 | 211 | virtual void WriteReg( uint16_t address, uint8_t value ) = 0; |
GregCr | 0:deaafdfde3bb | 212 | |
GregCr | 0:deaafdfde3bb | 213 | /*! |
GregCr | 0:deaafdfde3bb | 214 | * \brief Reads multiple radio registers starting at address |
GregCr | 0:deaafdfde3bb | 215 | * |
GregCr | 0:deaafdfde3bb | 216 | * \param [in] address First Radio register address |
GregCr | 0:deaafdfde3bb | 217 | * \param [out] buffer Buffer where to copy the registers data |
GregCr | 0:deaafdfde3bb | 218 | * \param [in] size Number of registers to be read |
GregCr | 0:deaafdfde3bb | 219 | */ |
GregCr | 0:deaafdfde3bb | 220 | virtual void ReadRegister( uint16_t address, uint8_t *buffer, uint16_t size ) = 0; |
GregCr | 0:deaafdfde3bb | 221 | |
GregCr | 0:deaafdfde3bb | 222 | /*! |
GregCr | 0:deaafdfde3bb | 223 | * \brief Reads the radio register at the specified address |
GregCr | 0:deaafdfde3bb | 224 | * |
GregCr | 0:deaafdfde3bb | 225 | * \param [in] address Register address |
GregCr | 0:deaafdfde3bb | 226 | * |
GregCr | 0:deaafdfde3bb | 227 | * \retval value The register value |
GregCr | 0:deaafdfde3bb | 228 | */ |
GregCr | 4:c6ef863d0b07 | 229 | virtual uint8_t ReadReg( uint16_t address ) = 0; |
GregCr | 0:deaafdfde3bb | 230 | |
GregCr | 0:deaafdfde3bb | 231 | /*! |
GregCr | 0:deaafdfde3bb | 232 | * \brief Writes Radio Data Buffer with buffer of size starting at offset. |
GregCr | 0:deaafdfde3bb | 233 | * |
GregCr | 0:deaafdfde3bb | 234 | * \param [in] offset Offset where to start writing |
GregCr | 0:deaafdfde3bb | 235 | * \param [in] buffer Buffer pointer |
GregCr | 0:deaafdfde3bb | 236 | * \param [in] size Buffer size |
GregCr | 0:deaafdfde3bb | 237 | */ |
GregCr | 0:deaafdfde3bb | 238 | virtual void WriteBuffer( uint8_t offset, uint8_t *buffer, uint8_t size ) = 0; |
GregCr | 0:deaafdfde3bb | 239 | |
GregCr | 0:deaafdfde3bb | 240 | /*! |
GregCr | 0:deaafdfde3bb | 241 | * \brief Reads Radio Data Buffer at offset to buffer of size |
GregCr | 0:deaafdfde3bb | 242 | * |
GregCr | 0:deaafdfde3bb | 243 | * \param [in] offset Offset where to start reading |
GregCr | 0:deaafdfde3bb | 244 | * \param [out] buffer Buffer pointer |
GregCr | 0:deaafdfde3bb | 245 | * \param [in] size Buffer size |
GregCr | 0:deaafdfde3bb | 246 | */ |
GregCr | 0:deaafdfde3bb | 247 | virtual void ReadBuffer( uint8_t offset, uint8_t *buffer, uint8_t size ) = 0; |
GregCr | 0:deaafdfde3bb | 248 | }; |
GregCr | 0:deaafdfde3bb | 249 | |
GregCr | 0:deaafdfde3bb | 250 | #endif // __RADIO_H__ |
GregCr | 0:deaafdfde3bb | 251 |