local for mbed5
Diff: radio.h
- Revision:
- 0:deaafdfde3bb
- Child:
- 3:7e3595a9ebe0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/radio.h Tue Sep 06 06:56:46 2016 +0000 @@ -0,0 +1,235 @@ +/* + / _____) _ | | +( (____ _____ ____ _| |_ _____ ____| |__ + \____ \| ___ | (_ _) ___ |/ ___) _ \ + _____) ) ____| | | || |_| ____( (___| | | | +(______/|_____)_|_|_| \__)_____)\____)_| |_| + (C)2016 Semtech + +Description: Handling of the node configuration protocol + +License: Revised BSD License, see LICENSE.TXT file include in the project + +Maintainer: Miguel Luis, Gregory Cristian and Matthieu Verdy +*/ +#ifndef __RADIO_H__ +#define __RADIO_H__ + +#include "mbed.h" + +/*! + * \brief Structure describing the radio status + */ +typedef union RadioStatus_u +{ + uint8_t Value; + struct + { //bit order is lsb -> msb + uint8_t Reserved : 1; //!< Reserved + uint8_t CmdStatus : 3; //!< Command status + uint8_t ChipMode : 3; //!< Chip mode + uint8_t CpuBusy : 1; //!< Flag for CPU radio busy + }Fields; +}RadioStatus_t; + +/*! + * \brief Structure describing the ranging codes for callback functions + */ +enum IrqRangingCode_t +{ + IRQ_RANGING_SLAVE_ERROR_CODE, + IRQ_RANGING_SLAVE_VALID_CODE, + IRQ_RANGING_SLAVE_RESPONSE_DONE_CODE, + IRQ_RANGING_MASTER_TIMEOUT_CODE, + IRQ_RANGING_MASTER_VALID_CODE, +}; + +/*! + * \brief Structure describing the error codes for callback functions + */ +enum IrqErrorCode_t +{ + IRQ_HEADER_ERROR_CODE = 0x01, + IRQ_SYNCWORD_ERROR_CODE = 0x02, + IRQ_GFSK_ERROR_CODE = 0x04, + IRQ_LORA_CRC_ERROR_CODE = 0x04, +}; + + +enum IrqPblSyncHeaderCode_t +{ + IRQ_PBL_DETECT_CODE = 0x01, + IRQ_SYNCWORD_VALID_CODE = 0x02, + IRQ_hEADER_VALID_CODE = 0x04, +}; + +/*! + * \brief The radio command opcodes + */ +enum RadioCommands_t; + +/*! + * \brief Class holding the basic communications with a radio + * + * It sets the functions to read/write registers, send commands and read/write + * payload. + * It also provides functions to run callback functions depending on the + * interrupts generated from the radio. + */ +class Radio +{ +protected: + /*! + * \brief Callback on Tx done interrupt + */ + void ( *txDone )( ); + + /*! + * \brief Callback on Rx done interrupt + */ + void ( *rxDone )( ); + + /*! + * \brief Callback on Rx SyncWord done interrupt + */ + void ( *rxPblSyncWordHeader )( IrqPblSyncHeaderCode_t val ); + + /*! + * \brief Callback on Rx Tx timeout interrupt + */ + void ( *rxTxTimeout )( ); + + /*! + * \brief Callback on Rx error interrupt + * + * \param [out] errCode A code indicating the type of interrupt ( SyncWord error or CRC error) + */ + void ( *rxError )( IrqErrorCode_t errCode ); + + /*! + * \brief Callback on ranging done interrupt + * + * \param [out] val A flag indicating the type of interrupt (Master/Slave and Valid/Error) + */ + void ( *rangingDone )( IrqRangingCode_t val ); + + /*! + * \brief Callback on Channel Activity Detection done interrupt + * + * \param [out] cadFlag Flag for channel activity detected or not + */ + void ( *cadDone )( bool cadFlag ); + +public: + /*! + * \brief Constructor for radio class + * + * Sets the callbacks functions pointers + */ + Radio( void ( *txDone )( ), void ( *rxDone )( ), void ( *rxPblSyncWordHeader )(IrqPblSyncHeaderCode_t val ), + void ( *rxTxTimeout )( ), void ( *rxError )( IrqErrorCode_t errorCode ), void ( *rangingDone )( IrqRangingCode_t val ), + void ( *cadDone )( bool channelActivityDetected ) ) + { + this->txDone = txDone; + this->rxDone = rxDone; + this->rxPblSyncWordHeader = rxPblSyncWordHeader; + this->rxTxTimeout = rxTxTimeout; + this->rxError = rxError; + this->rangingDone = rangingDone; + this->cadDone = cadDone; + } + virtual ~Radio( ){ }; + + /*! + * \brief Resets the radio + */ + virtual void Reset( void ) = 0; + + /*! + * \brief Gets the current radio status + * + * \retval status Radio status + */ + virtual RadioStatus_t GetStatus( void ) = 0; + + /*! + * \brief Writes the given command to the radio + * + * \param [in] opcode Command opcode + * \param [in] buffer Command parameters byte array + * \param [in] size Command parameters byte array size + */ + virtual void WriteCommand( RadioCommands_t opcode, uint8_t *buffer, uint16_t size ) = 0; + + /*! + * \brief Reads the given command from the radio + * + * \param [in] opcode Command opcode + * \param [in] buffer Command parameters byte array + * \param [in] size Command parameters byte array size + */ + virtual void ReadCommand( RadioCommands_t opcode, uint8_t *buffer, uint16_t size ) = 0; + + /*! + * \brief Writes multiple radio registers starting at address + * + * \param [in] address First Radio register address + * \param [in] buffer Buffer containing the new register's values + * \param [in] size Number of registers to be written + */ + virtual void WriteRegister( uint16_t address, uint8_t *buffer, uint16_t size ) = 0; + + /*! + * \brief Writes the radio register at the specified address + * + * \param [in] address Register address + * \param [in] value New register value + */ + virtual void WriteRegister( uint16_t address, uint8_t value ) = 0; + + /*! + * \brief Reads multiple radio registers starting at address + * + * \param [in] address First Radio register address + * \param [out] buffer Buffer where to copy the registers data + * \param [in] size Number of registers to be read + */ + virtual void ReadRegister( uint16_t address, uint8_t *buffer, uint16_t size ) = 0; + + /*! + * \brief Reads the radio register at the specified address + * + * \param [in] address Register address + * + * \retval value The register value + */ + virtual uint8_t ReadRegister( uint16_t address ) = 0; + + /*! + * \brief Writes Radio Data Buffer with buffer of size starting at offset. + * + * \param [in] offset Offset where to start writing + * \param [in] buffer Buffer pointer + * \param [in] size Buffer size + */ + virtual void WriteBuffer( uint8_t offset, uint8_t *buffer, uint8_t size ) = 0; + + /*! + * \brief Reads Radio Data Buffer at offset to buffer of size + * + * \param [in] offset Offset where to start reading + * \param [out] buffer Buffer pointer + * \param [in] size Buffer size + */ + virtual void ReadBuffer( uint8_t offset, uint8_t *buffer, uint8_t size ) = 0; + + /*! + * \brief Return firmware version + * + * \retval firmware The firmware version + */ + virtual uint16_t GetFirmwareVersion( void ) = 0; +}; + +#endif // __RADIO_H__ +