Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: LsrModule.h
- Revision:
- 0:f9cf4a19bb84
- Child:
- 1:8ecba4bfc183
diff -r 000000000000 -r f9cf4a19bb84 LsrModule.h
--- /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