The Modified Dot Library for SX1272

This version has been restoring as initial changes.

Verify the following dependencies:

Mbed-os 5.11 libmdot 3.2.0 for Mbed OS5.11

Committer:
Jenkins@KEILDM1.dc.multitech.prv
Date:
Thu Aug 23 14:18:55 2018 -0500
Revision:
64:64982192a2af
Parent:
60:7985b4783af9
Child:
65:acc0468b9aec
mdot-library revision 3.1.0 and mbed-os revision mbed-os-5.7.7

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Mike Fiore 16:b630e18103e5 1 /** __ ___ ____ _ ______ __ ____ __ ____
Mike Fiore 16:b630e18103e5 2 * / |/ /_ __/ / /_(_)__/_ __/__ ____/ / / __/_ _____ / /____ __ _ ___ / _/__ ____
Mike Fiore 16:b630e18103e5 3 * / /|_/ / // / / __/ /___// / / -_) __/ _ \ _\ \/ // (_-</ __/ -_) ' \(_-< _/ // _ \/ __/ __
Mike Fiore 16:b630e18103e5 4 * /_/ /_/\_,_/_/\__/_/ /_/ \__/\__/_//_/ /___/\_, /___/\__/\__/_/_/_/___/ /___/_//_/\__/ /_/
Mike Fiore 16:b630e18103e5 5 * Copyright (C) 2015 by Multi-Tech Systems /___/
Mike Fiore 16:b630e18103e5 6 *
Mike Fiore 16:b630e18103e5 7 *
Mike Fiore 16:b630e18103e5 8 * @author Jason Reiss
Mike Fiore 16:b630e18103e5 9 * @date 10-31-2015
Mike Fiore 16:b630e18103e5 10 * @brief lora::Mote provides a user level class that abstracts the complexity of the Mac layer
Mike Fiore 16:b630e18103e5 11 *
Mike Fiore 16:b630e18103e5 12 * @details
Mike Fiore 16:b630e18103e5 13 *
Mike Fiore 16:b630e18103e5 14 */
Mike Fiore 16:b630e18103e5 15
Mike Fiore 16:b630e18103e5 16 #ifndef __LORA_MOTE_H__
Mike Fiore 16:b630e18103e5 17 #define __LORA_MOTE_H__
Mike Fiore 16:b630e18103e5 18
Mike Fiore 16:b630e18103e5 19 #include "rtos.h"
Mike Fiore 16:b630e18103e5 20 #include "MacEvents.h"
Mike Fiore 16:b630e18103e5 21 #include <vector>
Mike Fiore 16:b630e18103e5 22
Mike Fiore 16:b630e18103e5 23 class SxRadio;
Mike Fiore 16:b630e18103e5 24 class SxRadio1272;
Mike Fiore 16:b630e18103e5 25
Mike Fiore 16:b630e18103e5 26 namespace lora {
Mike Fiore 16:b630e18103e5 27
Mike Fiore 16:b630e18103e5 28 class Mac;
Mike Fiore 16:b630e18103e5 29 class ChannelPlan;
Mike Fiore 16:b630e18103e5 30
Mike Fiore 16:b630e18103e5 31 class MoteEvents: public MacEvents {
Mike Fiore 16:b630e18103e5 32
Mike Fiore 16:b630e18103e5 33 /**
Jenkins@KEILDM1.dc.multitech.prv 64:64982192a2af 34 * Fired at start of TX
Jenkins@KEILDM1.dc.multitech.prv 64:64982192a2af 35 */
Jenkins@KEILDM1.dc.multitech.prv 64:64982192a2af 36 virtual void TxStart(void);
Jenkins@KEILDM1.dc.multitech.prv 64:64982192a2af 37
Jenkins@KEILDM1.dc.multitech.prv 64:64982192a2af 38 /**
Mike Fiore 16:b630e18103e5 39 * Fired at end of TX
Mike Fiore 16:b630e18103e5 40 * @param dr datarate used for TX
Mike Fiore 16:b630e18103e5 41 */
Mike Fiore 16:b630e18103e5 42 virtual void TxDone(uint8_t dr);
Mike Fiore 16:b630e18103e5 43
Mike Fiore 16:b630e18103e5 44 /**
Mike Fiore 16:b630e18103e5 45 * Fired if TX timed out
Mike Fiore 16:b630e18103e5 46 */
Mike Fiore 16:b630e18103e5 47 virtual void TxTimeout(void);
Mike Fiore 16:b630e18103e5 48
Mike Fiore 16:b630e18103e5 49 /**
Mike Fiore 16:b630e18103e5 50 * Fired when JoinAccept message is received and MIC is validated
Mike Fiore 16:b630e18103e5 51 * @param payload received bytes
Mike Fiore 16:b630e18103e5 52 * @param size number of received bytes
Mike Fiore 16:b630e18103e5 53 * @param rssi of received packet
Mike Fiore 16:b630e18103e5 54 * @param snr of received packet
Mike Fiore 16:b630e18103e5 55 */
Mike Fiore 16:b630e18103e5 56 virtual void JoinAccept(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr);
Mike Fiore 16:b630e18103e5 57
Mike Fiore 16:b630e18103e5 58 /**
Mike Fiore 16:b630e18103e5 59 * Fired when JoinAccept message is received and MIC is not valid
Mike Fiore 16:b630e18103e5 60 * @param payload received bytes
Mike Fiore 16:b630e18103e5 61 * @param size number of received bytes
Mike Fiore 16:b630e18103e5 62 * @param rssi of received packet
Mike Fiore 16:b630e18103e5 63 * @param snr of received packet
Mike Fiore 16:b630e18103e5 64 */
Mike Fiore 16:b630e18103e5 65 virtual void JoinFailed(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr);
Mike Fiore 16:b630e18103e5 66
Mike Fiore 16:b630e18103e5 67 /**
Jenkins@KEILDM1.dc.multitech.prv 64:64982192a2af 68 * Fired when packet is received and MIC is valid
Mike Fiore 16:b630e18103e5 69 * @param port of packet
Mike Fiore 16:b630e18103e5 70 * @param payload received bytes
Mike Fiore 16:b630e18103e5 71 * @param size number of received bytes
Mike Fiore 16:b630e18103e5 72 * @param rssi of received packet
Mike Fiore 16:b630e18103e5 73 * @param snr of received packet
Mike Fiore 16:b630e18103e5 74 * @param ctrl Downlink control field of packet
Mike Fiore 16:b630e18103e5 75 * @param slot rx window packet was received
Mike Fiore 16:b630e18103e5 76 * @param retries number of attempts before ack was received
Jenkins@KEILDM1.dc.multitech.prv 64:64982192a2af 77 * @param address of the end device
Jenkins@KEILDM1.dc.multitech.prv 64:64982192a2af 78 * @param dupRx set if this packet has already been received
Mike Fiore 16:b630e18103e5 79 */
Jenkins@KEILDM1.dc.multitech.prv 64:64982192a2af 80 virtual void PacketRx(uint8_t port, uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr, lora::DownlinkControl ctrl, uint8_t slot, uint8_t retries = 0, uint32_t address = 0, bool dupRx=false);
Mike Fiore 16:b630e18103e5 81
Mike Fiore 16:b630e18103e5 82 /**
Mike Fiore 16:b630e18103e5 83 * Fired when radio has received a packet, packet is not validated
Mike Fiore 16:b630e18103e5 84 * @param payload received bytes
Mike Fiore 16:b630e18103e5 85 * @param size number of received bytes
Mike Fiore 16:b630e18103e5 86 * @param rssi of received packet
Mike Fiore 16:b630e18103e5 87 * @param snr of received packet
Mike Fiore 16:b630e18103e5 88 * @param ctrl Downlink control field of packet
Mike Fiore 16:b630e18103e5 89 * @param slot rx window packet was received
Mike Fiore 16:b630e18103e5 90 */
Mike Fiore 16:b630e18103e5 91 virtual void RxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr, lora::DownlinkControl ctrl, uint8_t slot);
Mike Fiore 16:b630e18103e5 92
Mike Fiore 16:b630e18103e5 93 /**
Mike Fiore 16:b630e18103e5 94 * Fired if rx window times out
Mike Fiore 16:b630e18103e5 95 * @param slot rx window that timed out
Mike Fiore 16:b630e18103e5 96 */
Mike Fiore 16:b630e18103e5 97 virtual void RxTimeout(uint8_t slot);
Mike Fiore 16:b630e18103e5 98
Mike Fiore 16:b630e18103e5 99 /**
Mike Fiore 16:b630e18103e5 100 * Fired if rx CRC error
Mike Fiore 16:b630e18103e5 101 * @param slot rx window that errored
Mike Fiore 16:b630e18103e5 102 */
Mike Fiore 16:b630e18103e5 103 virtual void RxError(uint8_t slot);
Mike Fiore 16:b630e18103e5 104
Mike Fiore 16:b630e18103e5 105 /**
Mike Fiore 16:b630e18103e5 106 * Fired if pong packet is received
Mike Fiore 16:b630e18103e5 107 * @param m_rssi of received packet at mote
Mike Fiore 16:b630e18103e5 108 * @param m_snr of received packet at mote
Mike Fiore 16:b630e18103e5 109 * @param s_rssi of received packet at server
Mike Fiore 16:b630e18103e5 110 * @param s_snr of received packet at server
Mike Fiore 16:b630e18103e5 111 */
Mike Fiore 16:b630e18103e5 112 virtual void Pong(int16_t m_rssi, int8_t m_snr, int16_t s_rssi, int8_t s_snr);
Mike Fiore 16:b630e18103e5 113
Mike Fiore 16:b630e18103e5 114 /**
Mike Fiore 16:b630e18103e5 115 * Fired if network link check answer is received
Mike Fiore 16:b630e18103e5 116 * @param m_rssi of received packet at mote
Mike Fiore 16:b630e18103e5 117 * @param m_snr of received packet at mote
Mike Fiore 16:b630e18103e5 118 * @param s_snr margin of received packet at server
Mike Fiore 16:b630e18103e5 119 * @param s_gateways number of gateways reporting the packet
Mike Fiore 16:b630e18103e5 120 */
Mike Fiore 16:b630e18103e5 121 virtual void NetworkLinkCheck(int16_t m_rssi, int8_t m_snr, int8_t s_snr, uint8_t s_gateways);
Mike Fiore 16:b630e18103e5 122
Mike Fiore 16:b630e18103e5 123 /**
Mike Fiore 16:b630e18103e5 124 * Callback to for device to measure the battery level and report to server
Mike Fiore 16:b630e18103e5 125 * @return battery level 0-255, 0 - external power, 1-254 level min-max, 255 device unable to measure battery
Mike Fiore 16:b630e18103e5 126 */
Mike Fiore 16:b630e18103e5 127 virtual uint8_t MeasureBattery();
Jenkins@KEILDM1.dc.multitech.prv 26:17479e0039f6 128
Jenkins@KEILDM1.dc.multitech.prv 26:17479e0039f6 129 /**
Jenkins@KEILDM1.dc.multitech.prv 26:17479e0039f6 130 * Fired when ack attempts are exhausted and RxTimeout or RxError occur
Jenkins@KEILDM1.dc.multitech.prv 26:17479e0039f6 131 * @param retries number of attempts to resend the packet
Jenkins@KEILDM1.dc.multitech.prv 26:17479e0039f6 132 */
Jenkins@KEILDM1.dc.multitech.prv 26:17479e0039f6 133 virtual void MissedAck(uint8_t retries);
Mike Fiore 16:b630e18103e5 134 };
Mike Fiore 16:b630e18103e5 135
Mike Fiore 16:b630e18103e5 136 class Mote {
Mike Fiore 16:b630e18103e5 137 public:
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 138 Mote(Settings* settings, ChannelPlan* plan);
Mike Fiore 16:b630e18103e5 139 virtual ~Mote();
Mike Fiore 16:b630e18103e5 140
Mike Fiore 16:b630e18103e5 141 /**
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 142 * MTS LoRa version
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 143 * @return string containing version information
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 144 */
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 145 const char* getId();
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 146
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 147 /**
Mike Fiore 16:b630e18103e5 148 * Indicator for network session join status
Mike Fiore 16:b630e18103e5 149 * @return true if joined to network
Mike Fiore 16:b630e18103e5 150 */
Mike Fiore 16:b630e18103e5 151 bool Joined();
Mike Fiore 16:b630e18103e5 152
Mike Fiore 16:b630e18103e5 153 /**
Mike Fiore 16:b630e18103e5 154 * Send join request
Mike Fiore 16:b630e18103e5 155 * @return LORA_OK if request was sent
Mike Fiore 16:b630e18103e5 156 */
Mike Fiore 16:b630e18103e5 157 uint8_t Join();
Mike Fiore 16:b630e18103e5 158
Mike Fiore 16:b630e18103e5 159 /**
Mike Fiore 16:b630e18103e5 160 * Send a packet
Mike Fiore 16:b630e18103e5 161 * @param port to send packet
Mike Fiore 16:b630e18103e5 162 * @param payload of packet
Mike Fiore 16:b630e18103e5 163 * @param size in bytes
Mike Fiore 16:b630e18103e5 164 * @return LORA_OK if successful
Mike Fiore 16:b630e18103e5 165 * @return LORA_MAX_PAYLOAD_EXCEEDED if payload size exceeds datarate maximum
Mike Fiore 16:b630e18103e5 166 * @return LORA_NO_CHANS_ENABLED if there is not an available channel that supports the current datarate
Mike Fiore 16:b630e18103e5 167 * @return LORA_LINK_BUSY if link was busy
Mike Fiore 16:b630e18103e5 168 * @return LORA_RADIO_BUSY if radio was busy
Mike Fiore 16:b630e18103e5 169 * @return LORA_BUFFER_FULL if mac commands filled the packet, client should resend the packet
Mike Fiore 16:b630e18103e5 170 */
Mike Fiore 16:b630e18103e5 171 uint8_t Send(uint8_t port, const uint8_t* payload, uint8_t size);
Mike Fiore 16:b630e18103e5 172
Mike Fiore 16:b630e18103e5 173 /**
Mike Fiore 16:b630e18103e5 174 * Configure the channel plan
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 175 * @param plan pointer to ChannelPlan object
Mike Fiore 16:b630e18103e5 176 * @return LORA_OK
Mike Fiore 16:b630e18103e5 177 */
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 178 uint8_t SetChannelPlan(ChannelPlan* plan);
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 179
Jenkins@KEILDM1.dc.multitech.prv 64:64982192a2af 180
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 181 Settings* GetSettings();
Mike Fiore 16:b630e18103e5 182
Mike Fiore 16:b630e18103e5 183 /**
Mike Fiore 16:b630e18103e5 184 * Get the channel mask of currently enabled channels
Mike Fiore 16:b630e18103e5 185 * @return vector containing channel bit masks
Mike Fiore 16:b630e18103e5 186 */
Mike Fiore 16:b630e18103e5 187 std::vector<uint16_t> GetChannelMask();
Mike Fiore 16:b630e18103e5 188
Mike Fiore 16:b630e18103e5 189 /**
Mike Fiore 16:b630e18103e5 190 * Set a 16 bit channel mask with index
Mike Fiore 16:b630e18103e5 191 * @param index of mask to set 0:0-15, 1:16-31 ...
Mike Fiore 16:b630e18103e5 192 * @param mask 16 bit mask of enabled channels
Mike Fiore 16:b630e18103e5 193 * @return true
Mike Fiore 16:b630e18103e5 194 */
Mike Fiore 16:b630e18103e5 195 virtual uint8_t SetChannelMask(uint8_t index, uint16_t mask);
Mike Fiore 16:b630e18103e5 196
Mike Fiore 16:b630e18103e5 197 /**
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 198 * Set the current frequency sub band for hybrid operation 1-8 else 0 for 64 channel operation
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 199 * @param sub_band 0-8
Mike Fiore 16:b630e18103e5 200 */
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 201 uint8_t SetFrequencySubBand(uint8_t sub_band);
Mike Fiore 16:b630e18103e5 202
Mike Fiore 16:b630e18103e5 203 /**
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 204 * Get the current frequency sub band
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 205 * @return sub band 0-8
Mike Fiore 16:b630e18103e5 206 */
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 207 uint8_t GetFrequencySubBand();
Mike Fiore 16:b630e18103e5 208
Mike Fiore 16:b630e18103e5 209 /**
Mike Fiore 16:b630e18103e5 210 * Add a channel to the channel plan
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 211 * EU868, AS923 and KR920 allows additional channels to be added
Mike Fiore 16:b630e18103e5 212 * Channels 0-2 are fixed default channels
Mike Fiore 16:b630e18103e5 213 *
Mike Fiore 16:b630e18103e5 214 * @param index of the channel
Mike Fiore 16:b630e18103e5 215 * @param frequency of the channel or 0 to remove channel
Mike Fiore 16:b630e18103e5 216 * @param range of datarates allowed by the channel
Mike Fiore 16:b630e18103e5 217 * @return LORA_OK if channel was added
Mike Fiore 16:b630e18103e5 218 */
Mike Fiore 16:b630e18103e5 219 uint8_t AddChannel(uint8_t index, uint32_t frequency, lora::DatarateRange range);
Mike Fiore 16:b630e18103e5 220
Mike Fiore 16:b630e18103e5 221 /**
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 222 * Add a downlink channel to the channel plan
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 223 * EU868, AS923 and KR920 allows downlink channels to be added
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 224 *
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 225 * @param index of the channel
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 226 * @param frequency of the channel or 0 to remove channel
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 227 * @return LORA_OK if channel was added
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 228 */
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 229 uint8_t AddDownlinkChannel(uint8_t index, uint32_t frequency);
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 230
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 231 /**
Mike Fiore 16:b630e18103e5 232 * Set network mode
Mike Fiore 16:b630e18103e5 233 * Choose Public LoRaWAN mode or Private Multitech mode
Mike Fiore 16:b630e18103e5 234 *
Mike Fiore 16:b630e18103e5 235 * Public mode uses 0x34 sync word with 5/6 second join windows
Mike Fiore 16:b630e18103e5 236 * Private mode uses 0x12 sync word with 1/2 second join windows
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 237 * US915/AU915 Rx1 and Rx2 are fixed per frequency sub band setting
Mike Fiore 16:b630e18103e5 238 *
Mike Fiore 16:b630e18103e5 239 * @param mode public or private
Mike Fiore 16:b630e18103e5 240 * @return LORA_OK
Mike Fiore 16:b630e18103e5 241 */
Mike Fiore 16:b630e18103e5 242 uint8_t SetNetworkMode(uint8_t mode);
Mike Fiore 16:b630e18103e5 243
Mike Fiore 16:b630e18103e5 244 /**
Mike Fiore 16:b630e18103e5 245 * Get a pointer to the mac layer
Mike Fiore 16:b630e18103e5 246 * @return Mac mac
Mike Fiore 16:b630e18103e5 247 */
Mike Fiore 16:b630e18103e5 248 Mac* GetMac();
Mike Fiore 16:b630e18103e5 249
Mike Fiore 16:b630e18103e5 250 /**
Mike Fiore 16:b630e18103e5 251 * Get a pointer to the radio
Mike Fiore 16:b630e18103e5 252 * Can be used to read radio registers or get a random value based on RSSI
Mike Fiore 16:b630e18103e5 253 *
Mike Fiore 16:b630e18103e5 254 * @return SxRadio pointer
Mike Fiore 16:b630e18103e5 255 */
Mike Fiore 16:b630e18103e5 256 SxRadio* GetRadio();
Mike Fiore 16:b630e18103e5 257
Mike Fiore 16:b630e18103e5 258 /**
Mike Fiore 16:b630e18103e5 259 * Get the current statistics for the device
Mike Fiore 16:b630e18103e5 260 * @return Statistics
Mike Fiore 16:b630e18103e5 261 */
Mike Fiore 16:b630e18103e5 262 Statistics& GetStats();
Mike Fiore 16:b630e18103e5 263
Mike Fiore 16:b630e18103e5 264 /**
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 265 * Reset the current statistics for the device
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 266 */
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 267 void ResetStats();
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 268
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 269 /**
Mike Fiore 16:b630e18103e5 270 * Get time on air with current settings for provided payload bytes
Mike Fiore 16:b630e18103e5 271 * 13 overhead bytes will be added to payload
Mike Fiore 16:b630e18103e5 272 * @param bytes of payload data
Mike Fiore 16:b630e18103e5 273 * @return time-on-air in ms
Mike Fiore 16:b630e18103e5 274 */
Mike Fiore 16:b630e18103e5 275 uint32_t GetTimeOnAir(uint8_t bytes);
Mike Fiore 16:b630e18103e5 276
Mike Fiore 16:b630e18103e5 277 /**
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 278 * Get time off air required to adhere to duty-cycle limitations
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 279 * @return time-off-air in ms
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 280 */
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 281 uint32_t GetTimeOffAir();
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 282
Jenkins@KEILDM1.dc.multitech.prv 60:7985b4783af9 283 /**
Mike Fiore 16:b630e18103e5 284 * Call before setting device in sleep mode to place radio in sleep
Mike Fiore 16:b630e18103e5 285 */
Mike Fiore 16:b630e18103e5 286 void Sleep();
Mike Fiore 16:b630e18103e5 287
Mike Fiore 16:b630e18103e5 288 protected:
Mike Fiore 16:b630e18103e5 289 SxRadio1272* _radio;
Mike Fiore 16:b630e18103e5 290 Settings* _settings;
Mike Fiore 16:b630e18103e5 291 Mac* _mac;
Mike Fiore 16:b630e18103e5 292
Mike Fiore 16:b630e18103e5 293 private:
Mike Fiore 16:b630e18103e5 294 ChannelPlan* _plan;
Mike Fiore 16:b630e18103e5 295 MoteEvents _events;
Mike Fiore 16:b630e18103e5 296 };
Mike Fiore 16:b630e18103e5 297
Mike Fiore 16:b630e18103e5 298 }
Mike Fiore 16:b630e18103e5 299 #endif