Library for using the LSR SiFlex/ProFlex RF modules with mbed.

Revision:
0:f9cf4a19bb84
Child:
1:8ecba4bfc183
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LsrModule.h	Mon Jul 25 16:18:48 2016 +0000
@@ -0,0 +1,296 @@
+/**
+ * @file LsrModule.h
+ * @author LS Research LLC
+ * @version 1.0
+ *
+ * @section LICENSE
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details at
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @section DESCRIPTION
+ *
+ * UART communication API for LS Research's ProFLEX01 and SiFLEX02 ModFLEX Shields.
+ */
+
+/**
+ * Modified by Mark Harris at SAIT.ca
+ * Improved functionality for mbed
+ */
+
+#ifndef LsrModule_h
+#define LsrModule_h
+
+#include <inttypes.h>
+#include "mbed.h"
+
+#ifndef NULL
+    #define NULL    0
+#endif
+
+#define SIFLEX02  ///< Use with a SiFLEX02 ModFLEX Shield (900MHz)
+//#define PROFLEX01  ///< Use with a ProFLEX01 ModFLEX Shield (2.4GHz)
+
+/**
+* Message Index Defintions.
+*
+*/
+#define LSR_MODULE_MSG_START_BYTE_INDEX                                 0
+#define LSR_MODULE_MSG_LENGTH_BYTE_INDEX                                1
+#define LSR_MODULE_MSG_TYPE_BYTE_INDEX                                  2
+
+/**
+* Message Byte Types.
+*
+*/
+#define LSR_MODULE_SERIAL_MSG_START_BYTE                                0x01
+#define LSR_MODULE_SERIAL_MSG_END_BYTE                                  0x04
+
+/**
+* Rx Message Type Limits.
+*
+*/
+#define LSR_MODULE_MIN_SERIAL_RX_MSG_TYPE                               0x81
+#define LSR_MODULE_MAX_SERIAL_RX_MSG_TYPE                               0xC5
+
+/**
+* LSR Module Host TX Message Definitions.
+*
+*/
+#define LSR_MODULE_QUERY_VERSION_MSG_TYPE                               0x01
+#define LSR_MODULE_SET_SECURITY_TX_FRAME_COUNTER_MSG_TYPE               0x0C
+#define LSR_MODULE_QUERY_SECURITY_TX_FRAME_COUNTER_MSG_TYPE             0x0D
+#define LSR_MODULE_SET_BASIC_RF_SETTINGS_MSG_TYPE                       0x10
+#define LSR_MODULE_QUERY_BASIC_RF_SETTINGS_MSG_TYPE                     0x11
+#define LSR_MODULE_SAVE_SETTINGS_TO_NV_MEMORY_MSG_TYPE                  0x12
+#define LSR_MODULE_RESET_REQUEST_MSG_TYPE                               0x13
+#define LSR_MODULE_QUERY_SUPPLY_VOLTAGE_MSG_TYPE                        0x14
+#define LSR_MODULE_QUERY_STATISTICS_MSG_TYPE                            0x15
+#define LSR_MODULE_CLEAR_STATISTICS_MSG_TYPE                            0x16
+#define LSR_MODULE_SET_HOST_DATA_RATE_MSG_TYPE                          0x18
+#define LSR_MODULE_SEND_SIMPLE_SHORT_RF_DATA_PACKET_MSG_TYPE            0x20
+#define LSR_MODULE_SEND_ADVANCED_SHORT_RF_DATA_PACKET_MSG_TYPE          0x22
+#define LSR_MODULE_SEND_SIMPLE_LONG_RF_DATA_PACKET_MSG_TYPE             0x24
+#define LSR_MODULE_SEND_ADVANCED_LONG_RF_DATA_PACKET_MSG_TYPE           0x26
+#define LSR_MODULE_SEND_SIMPLE_REPEATED_RF_DATA_PACKET_MSG_TYPE         0x2A
+#define LSR_MODULE_CHANNEL_ENERGY_SCAN_MSG_TYPE                         0x44
+
+/**
+* LSR Module Settings Definitions.
+*
+*/
+#define LSR_MODULE_TX_POWER_LEVEL_MIN                                   0
+#define LSR_MODULE_SECURITY_OVERHEAD                                    14
+#define LSR_MODULE_MIN_SERIAL_RX_MSG_LENGTH                             5
+#define LSR_MODULE_MAX_SERIAL_RX_MSG_LENGTH                             131
+
+#ifdef PROFLEX01
+    #define LSR_MODULE_RF_CHANNEL_MIN                                   11
+    #define LSR_MODULE_RF_CHANNEL_MAX                                   25
+    #define LSR_MODULE_TX_POWER_LEVEL_MAX                               19
+    #define LSR_MODULE_SIMPLE_SHORT_RF_DATA_LENGTH                      98
+    #define LSR_MODULE_ADVANCED_SHORT_RF_DATA_LENGTH                    98
+    #define LSR_MODULE_SIMPLE_LONG_RF_DATA_LENGTH                       98
+    #define LSR_MODULE_ADVANCED_LONG_RF_DATA_LENGTH                     98
+    #define LSR_MODULE_MAX_SERIAL_TX_MSG_LENGTH                         115
+#elif defined SIFLEX02
+    #define LSR_MODULE_RF_CHANNEL_MIN                                   1
+    #define LSR_MODULE_RF_CHANNEL_MAX                                   10
+    #define LSR_MODULE_TX_POWER_LEVEL_MAX                               21
+    #define LSR_MODULE_SIMPLE_SHORT_RF_DATA_LENGTH                      112
+    #define LSR_MODULE_ADVANCED_SHORT_RF_DATA_LENGTH                    110
+    #define LSR_MODULE_SIMPLE_LONG_RF_DATA_LENGTH                       100
+    #define LSR_MODULE_ADVANCED_LONG_RF_DATA_LENGTH                     98
+    #define LSR_MODULE_MAX_SERIAL_TX_MSG_LENGTH                         121
+#else
+    #error "Incorrect module type"
+#endif
+
+/**
+* Receiver ConfigurationBitmask Definitions.
+*
+*/
+#define LSR_MODULE_RX_CONFIG_ALLOW_BROADCAST_ADDRESS_BITMASK            0x01
+#define LSR_MODULE_RX_CONFIG_ALLOW_BROADCAST_PAN_BITMASK                0x02
+#define LSR_MODULE_RX_CONFIG_PROMISCUOUS_MODE_BITMASK                   0x04
+#define LSR_MODULE_RX_CONFIG_ALLOW_SECURED_PACKETS_MODE_BITMASK         0x08
+#define LSR_MODULE_RX_CONFIG_MAX                                        (LSR_MODULE_RX_CONFIG_ALLOW_BROADCAST_ADDRESS_BITMASK + LSR_MODULE_RX_CONFIG_ALLOW_BROADCAST_PAN_BITMASK + LSR_MODULE_RX_CONFIG_PROMISCUOUS_MODE_BITMASK + LSR_MODULE_RX_CONFIG_ALLOW_SECURED_PACKETS_MODE_BITMASK)
+
+/**
+* Transmit Options Bitmask Definitions.
+*
+*/
+#define LSR_MODULE_TX_OPTIONS_RETRIES_ACKS_BITMASK                      0x01
+#define LSR_MODULE_TX_OPTIONS_USE_SECURITY_BITMASK                      0x02
+#define LSR_MODULE_TX_OPTIONS_MAX                                       (LSR_MODULE_TX_OPTIONS_RETRIES_ACKS_BITMASK + LSR_MODULE_TX_OPTIONS_USE_SECURITY_BITMASK)
+
+/**
+* Host UART Data Rate Definitions.
+*
+*/
+#define LSR_MODULE_HOST_DATA_RATE_1200                                  0
+#define LSR_MODULE_HOST_DATA_RATE_2400                                  1
+#define LSR_MODULE_HOST_DATA_RATE_4800                                  2
+#define LSR_MODULE_HOST_DATA_RATE_9600                                  3
+#define LSR_MODULE_HOST_DATA_RATE_19200                                 4
+#define LSR_MODULE_HOST_DATA_RATE_38400                                 5
+#define LSR_MODULE_HOST_DATA_RATE_57600                                 6
+#define LSR_MODULE_HOST_DATA_RATE_115200                                7
+#define LSR_MODULE_HOST_DATA_RATE_MAX                                   LSR_MODULE_HOST_DATA_RATE_115200
+#define LSR_MODULE_10MS_UART_TIMEOUT                                    239
+
+/**
+* Channel Energy Scan Duration Definitions.
+*
+*/
+#define LSR_MODULE_SCAN_DURATION_MAX                                    14
+
+/**
+* Type Defintions.
+*
+*/
+typedef unsigned int    word_t;
+
+/**
+* Word structure.
+*
+*/
+typedef struct _words
+{
+    uint8_t lb; ///< Low byte.
+    uint8_t hb; ///< High byte.
+} Words_t;
+
+/**
+* Word union.
+*
+*/
+typedef union _wordu
+{
+    word_t   w; ///< Word.
+    uint16_t    u16; ///< Unsigned 16.
+    Words_t  ws; ///< Word structure.
+} Wordu_t;
+
+/**
+* Word structure.
+*
+*/
+typedef struct _dwords
+{
+    uint8_t lb; ///< Low byte.
+    uint8_t mlb; ///< Middle low byte.
+    uint8_t mhb; ///< Middle high byte.
+    uint8_t hb; ///<  High byte.
+} DWords_t;
+
+/**
+* Double word union.
+*
+*/
+typedef union _dwordu
+{
+    uint32_t u32; ///< Unsigned 32.
+    DWords_t dws; ///< Double word structure.
+} DWordu_t;
+
+
+class LsrModule : Serial
+{
+    public:
+    uint8_t* pu8RxBuffer; ///< Pointer to private UART receive buffer.
+    uint8_t u8RxMsgLength; ///< Length of private UART receive buffer.
+    //Functions:
+    LsrModule(PinName tx, PinName rx, int baudRate = 19200);
+    ~LsrModule();
+    bool SubscribeRxMsgCallback(uint8_t u8RxMsgType, void (*callback)(void)); 
+    bool UnsubscribeRxMsgCallback(uint8_t u8RxMsgType); 
+    void RunHostRxStateMachine(void);
+    // Tx Messages:
+    // 0x01
+    void QueryVersionMsg(void);
+    // 0x0C
+    void SetSecurityTransmitFrameCounterMsg(uint32_t* pu32FrameCounter);
+    // 0x0D
+    void QuerySecurityTransmitFrameCounterMsg(void);
+    // 0x10
+    void SetBasicRfSettingsMsg(uint16_t u16PanId, uint16_t u16AddrShort, uint8_t* pu8AddrLong, uint8_t u8RfChannel, uint8_t u8TxPowerLevel, uint8_t u8ReceiverConfig, uint8_t* pu8SecurityKey);
+    // 0x11
+    void QueryBasicRfSettingsMsg(void);
+    // 0x12
+    void SaveSettingsToNVMemoryMsg(void);
+    // 0x13
+    void ResetRequestMsg(void);
+    // 0x14
+    void QuerySupplyVoltageMsg(void);
+    // 0x15
+    void QueryStatisticsMsg(void);
+    // 0x16
+    void ClearStatisticsMsg(void);
+    // 0x18
+    void SetHostDataRateMsg(uint8_t u8HostDataRate);
+    // 0x20
+    void SendSimpleShortAddrRfDataPacketMsg(uint8_t* pu8Data, uint8_t u8DataLength, uint16_t u16DestAddress, uint8_t u8TxOptions, uint8_t u8PacketId);
+    // 0x22
+    void SendAdvancedShortAddrRfDataPacketMsg(uint8_t* pu8Data, uint8_t u8DataLength, uint16_t u16DestPanId, uint16_t u16DestAddress, uint8_t u8TxOptions, uint8_t u8PacketId);
+    // 0x24
+    void SendSimpleLongAddrRfDataPacketMsg(uint8_t* pu8Data, uint8_t u8DataLength, uint8_t* pu8DestAddress, uint8_t u8TxOptions, uint8_t u8PacketId);
+    // 0x26
+    void SendAdvancedLongAddrRfDataPacketMsg(uint8_t* pu8Data, uint8_t u8DataLength, uint16_t u16DestPanId, uint8_t* pu8DestAddress, uint8_t u8TxOptions, uint8_t u8PacketId);
+    // 0x44
+    void ChannelEnergyScanMsg(uint16_t u16ChannelMask, uint8_t u8ScanDuration);
+
+
+    private:
+    // Variables
+    uint8_t u8RxReadByte;
+    uint8_t u8ForLoopCounter;
+    uint8_t u8UartRxBufferIndex;
+    uint8_t u8UartTxBufferIndex;
+    uint8_t u8TxMsgChecksum;///< Transmit message checksum.
+    uint8_t au8UartRxBuffer[LSR_MODULE_MAX_SERIAL_RX_MSG_LENGTH];///< Receive buffer for UART communication from module.
+    uint8_t au8UartTxBuffer[LSR_MODULE_MAX_SERIAL_TX_MSG_LENGTH];///< Transmit buffer for UART communication to module.
+    bool bUartMethodFlag;
+
+    
+    // Function Pointers
+    void (LsrModule::*ptrHostState)(void);///< Runs uart UART receive state machine.
+    void (LsrModule::*ptrHostProcessCallbackState)(uint8_t*);///< Used to process received UART messages.
+    
+    
+    // Functions
+    void AddSerialMsgHeader(uint8_t u8MsgType, uint8_t u8MsgLength);
+    void AddSerialByteToMsgBuffer(uint8_t u8Data);
+    void AddSerialMsgTrailer(void);
+    void WriteSerialMsg(void);
+    void HostProcessCallbackMsgStart (uint8_t* pu8MsgBuffer, uint8_t u8Length);
+    // Rx Message Callbacks
+    
+
+    // Rx functions
+    bool ValidMsgLengthAndType(uint8_t u8MsgType, uint8_t u8MsgLength);
+    bool ValidRxChecksum(uint8_t* pu8MsgBuffer, uint8_t u8MsgLength);
+    void SerialFlush(void);
+    bool SerialAvailable(void);
+    uint8_t SerialRead(void);
+    
+    
+    // Rx State Machine States
+    void SerialRxCleanupRestart(void);
+    void HostRxWaitForMsgStartByteState(void);
+    void HostRxGetMsgLengthState(void);
+    void HostRxGetMsgTypeState(void);
+    void HostRxWaitToGetRestOfMsgState(void);
+    void HostRxValidateMsgState(void);
+    void HostRxGoodMsgState(void);
+};
+
+#endif
\ No newline at end of file