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.
Fork of lmic_MOTE_L152RC_2 by
lmic.h
00001 /******************************************************************************* 00002 * Copyright (c) 2014-2015 IBM Corporation. 00003 * All rights reserved. This program and the accompanying materials 00004 * are made available under the terms of the Eclipse Public License v1.0 00005 * which accompanies this distribution, and is available at 00006 * http://www.eclipse.org/legal/epl-v10.html 00007 * 00008 * Contributors: 00009 * IBM Zurich Research Lab - initial API, implementation and documentation 00010 *******************************************************************************/ 00011 00012 //! @file 00013 //! @brief LMIC API 00014 00015 #ifndef _lmic_h_ 00016 #define _lmic_h_ 00017 00018 #include "oslmic.h " 00019 #include "lorabase.h" 00020 #include "config.h" 00021 00022 // LMIC version 00023 #define LMIC_VERSION_MAJOR 1 00024 #define LMIC_VERSION_MINOR 5 00025 #define LMIC_VERSION_BUILD 1431528305 00026 00027 enum { MAX_FRAME_LEN = 64 }; //!< Library cap on max frame length 00028 00029 enum { TXCONF_ATTEMPTS = 8 }; //!< Transmit attempts for confirmed frames 00030 00031 enum { MAX_MISSED_BCNS = 20 }; // threshold for triggering rejoin requests 00032 enum { MAX_RXSYMS = 100 }; // stop tracking beacon beyond this 00033 00034 enum { LINK_CHECK_CONT = 12 , // continue with this after reported dead link 00035 LINK_CHECK_DEAD = 24 , // after this UP frames and no response from NWK assume link is dead 00036 LINK_CHECK_INIT = -12 , // UP frame count until we inc datarate 00037 LINK_CHECK_OFF =-128 }; // link check disabled 00038 00039 enum { TIME_RESYNC = 6*128 }; // secs 00040 enum { TXRX_GUARD_ms = 6000 }; // msecs - don't start TX-RX transaction before beacon 00041 enum { JOIN_GUARD_ms = 9000 }; // msecs - don't start Join Req/Acc transaction before beacon 00042 enum { TXRX_BCNEXT_secs = 2 }; // secs - earliest start after beacon time 00043 enum { RETRY_PERIOD_secs = 3 }; // secs - random period for retrying a confirmed send 00044 00045 #if defined(CFG_eu868) // EU868 spectrum ==================================================== 00046 00047 enum { MAX_CHANNELS = 16 }; //!< Max supported channels 00048 enum { MAX_BANDS = 4 }; 00049 00050 enum { LIMIT_CHANNELS = (1<<4) }; // EU868 will never have more channels 00051 //! \internal 00052 struct band_t { 00053 u2_t txcap; // duty cycle limitation: 1/txcap 00054 s1_t txpow; // maximum TX power 00055 u1_t lastchnl; // last used channel 00056 ostime_t avail; // channel is blocked until this time 00057 }; 00058 TYPEDEF_xref2band_t; //!< \internal 00059 00060 #elif defined(CFG_us915) // US915 spectrum ================================================= 00061 00062 enum { MAX_XCHANNELS = 2 }; // extra channels in RAM, channels 0-71 are immutable 00063 enum { MAX_TXPOW_125kHz = 30 }; 00064 00065 #endif // ========================================================================== 00066 00067 // Keep in sync with evdefs.hpp::drChange 00068 enum { DRCHG_SET, DRCHG_NOJACC, DRCHG_NOACK, DRCHG_NOADRACK, DRCHG_NWKCMD }; 00069 enum { KEEP_TXPOW = -128 }; 00070 00071 00072 //! \internal 00073 struct rxsched_t { 00074 u1_t dr; 00075 u1_t intvExp; // 0..7 00076 u1_t slot; // runs from 0 to 128 00077 u1_t rxsyms; 00078 ostime_t rxbase; 00079 ostime_t rxtime; // start of next spot 00080 u4_t freq; 00081 }; 00082 TYPEDEF_xref2rxsched_t; //!< \internal 00083 00084 00085 //! Parsing and tracking states of beacons. 00086 enum { BCN_NONE = 0x00, //!< No beacon received 00087 BCN_PARTIAL = 0x01, //!< Only first (common) part could be decoded (info,lat,lon invalid/previous) 00088 BCN_FULL = 0x02, //!< Full beacon decoded 00089 BCN_NODRIFT = 0x04, //!< No drift value measured yet 00090 BCN_NODDIFF = 0x08 }; //!< No differential drift measured yet 00091 //! Information about the last and previous beacons. 00092 struct bcninfo_t { 00093 ostime_t txtime; //!< Time when the beacon was sent 00094 s1_t rssi; //!< Adjusted RSSI value of last received beacon 00095 s1_t snr; //!< Scaled SNR value of last received beacon 00096 u1_t flags; //!< Last beacon reception and tracking states. See BCN_* values. 00097 u4_t time; //!< GPS time in seconds of last beacon (received or surrogate) 00098 // 00099 u1_t info; //!< Info field of last beacon (valid only if BCN_FULL set) 00100 s4_t lat; //!< Lat field of last beacon (valid only if BCN_FULL set) 00101 s4_t lon; //!< Lon field of last beacon (valid only if BCN_FULL set) 00102 }; 00103 00104 // purpose of receive window - lmic_t.rxState 00105 enum { RADIO_RST=0, RADIO_TX=1, RADIO_RX=2, RADIO_RXON=3 }; 00106 // Netid values / lmic_t.netid 00107 enum { NETID_NONE=(int)~0U, NETID_MASK=(int)0xFFFFFF }; 00108 // MAC operation modes (lmic_t.opmode). 00109 enum { OP_NONE = 0x0000, 00110 OP_SCAN = 0x0001, // radio scan to find a beacon 00111 OP_TRACK = 0x0002, // track my networks beacon (netid) 00112 OP_JOINING = 0x0004, // device joining in progress (blocks other activities) 00113 OP_TXDATA = 0x0008, // TX user data (buffered in pendTxData) 00114 OP_POLL = 0x0010, // send empty UP frame to ACK confirmed DN/fetch more DN data 00115 OP_REJOIN = 0x0020, // occasionally send JOIN REQUEST 00116 OP_SHUTDOWN = 0x0040, // prevent MAC from doing anything 00117 OP_TXRXPEND = 0x0080, // TX/RX transaction pending 00118 OP_RNDTX = 0x0100, // prevent TX lining up after a beacon 00119 OP_PINGINI = 0x0200, // pingable is initialized and scheduling active 00120 OP_PINGABLE = 0x0400, // we're pingable 00121 OP_NEXTCHNL = 0x0800, // find a new channel 00122 OP_LINKDEAD = 0x1000, // link was reported as dead 00123 OP_TESTMODE = 0x2000, // developer test mode 00124 }; 00125 // TX-RX transaction flags - report back to user 00126 enum { TXRX_ACK = 0x80, // confirmed UP frame was acked 00127 TXRX_NACK = 0x40, // confirmed UP frame was not acked 00128 TXRX_NOPORT = 0x20, // set if a frame with a port was RXed, clr if no frame/no port 00129 TXRX_PORT = 0x10, // set if a frame with a port was RXed, LMIC.frame[LMIC.dataBeg-1] => port 00130 TXRX_DNW1 = 0x01, // received in 1st DN slot 00131 TXRX_DNW2 = 0x02, // received in 2dn DN slot 00132 TXRX_PING = 0x04 }; // received in a scheduled RX slot 00133 // Event types for event callback 00134 enum _ev_t { EV_SCAN_TIMEOUT=1, EV_BEACON_FOUND, 00135 EV_BEACON_MISSED, EV_BEACON_TRACKED, EV_JOINING, 00136 EV_JOINED, EV_RFU1, EV_JOIN_FAILED, EV_REJOIN_FAILED, 00137 EV_TXCOMPLETE, EV_LOST_TSYNC, EV_RESET, 00138 EV_RXCOMPLETE, EV_LINK_DEAD, EV_LINK_ALIVE }; 00139 typedef enum _ev_t ev_t; 00140 00141 00142 struct lmic_t { 00143 // Radio settings TX/RX (also accessed by HAL) 00144 ostime_t txend; 00145 ostime_t rxtime; 00146 u4_t freq; 00147 s1_t rssi; 00148 s1_t snr; 00149 rps_t rps; 00150 u1_t rxsyms; 00151 u1_t dndr; 00152 s1_t txpow; // dBm 00153 s1_t txpow_limit; // dBm maximum permitted 00154 00155 osjob_t osjob; 00156 00157 // Channel scheduling 00158 #if defined(CFG_eu868) 00159 band_t bands[MAX_BANDS]; 00160 u4_t channelFreq[MAX_CHANNELS]; 00161 u2_t channelDrMap[MAX_CHANNELS]; 00162 u2_t channelMap; 00163 #elif defined(CFG_us915) 00164 u4_t xchFreq[MAX_XCHANNELS]; // extra channel frequencies (if device is behind a repeater) 00165 u2_t xchDrMap[MAX_XCHANNELS]; // extra channel datarate ranges ---XXX: ditto 00166 u2_t channelMap[(72+MAX_XCHANNELS+15)/16]; // enabled bits 00167 u2_t chRnd; // channel randomizer 00168 #endif 00169 u1_t txChnl; // channel for next TX 00170 u1_t globalDutyRate; // max rate: 1/2^k 00171 ostime_t globalDutyAvail; // time device can send again 00172 00173 u4_t netid; // current network id (~0 - none) 00174 u2_t opmode; 00175 u1_t upRepeat; // configured up repeat 00176 s1_t adrTxPow; // ADR adjusted TX power 00177 u1_t datarate; // current data rate 00178 u1_t errcr; // error coding rate (used for TX only) 00179 u1_t rejoinCnt; // adjustment for rejoin datarate 00180 u1_t joinBlock; // during join attempt: current channel block 00181 u1_t joinBlockChnl; // during join attempt: current 125KHz channel 00182 s2_t drift; // last measured drift 00183 s2_t lastDriftDiff; 00184 s2_t maxDriftDiff; 00185 00186 u1_t pendTxPort; 00187 u1_t pendTxConf; // confirmed data 00188 u1_t pendTxLen; // +0x80 = confirmed 00189 u1_t pendTxData[MAX_LEN_PAYLOAD]; 00190 00191 u2_t devNonce; // last generated nonce 00192 u1_t nwkKey[16]; // network session key 00193 u1_t artKey[16]; // application router session key 00194 devaddr_t devaddr; 00195 u4_t seqnoDn; // device level down stream seqno 00196 u4_t seqnoUp; 00197 00198 u1_t dnConf; // dn frame confirm pending: LORA::FCT_ACK or 0 00199 s1_t adrAckReq; // counter until we reset data rate (0=off) 00200 u1_t adrChanged; 00201 00202 u1_t margin; 00203 bit_t ladrAns; // link adr adapt answer pending 00204 bit_t devsAns; // device status answer pending 00205 u1_t adrEnabled; 00206 u1_t moreData; // NWK has more data pending 00207 bit_t dutyCapAns; // have to ACK duty cycle settings 00208 u1_t snchAns; // answer set new channel 00209 // 2nd RX window (after up stream) 00210 u1_t dn2Dr; 00211 u4_t dn2Freq; 00212 u1_t dn2Ans; // 0=no answer pend, 0x80+ACKs 00213 00214 // Class B state 00215 u1_t missedBcns; // unable to track last N beacons 00216 u1_t bcninfoTries; // how often to try (scan mode only) 00217 u1_t pingSetAns; // answer set cmd and ACK bits 00218 rxsched_t ping; // pingable setup 00219 00220 // Public part of MAC state 00221 u1_t txCnt; 00222 u1_t txrxFlags; // transaction flags (TX-RX combo) 00223 u1_t dataBeg; // 0 or start of data (dataBeg-1 is port) 00224 u1_t dataLen; // 0 no data or zero length data, >0 byte count of data 00225 u1_t frame[MAX_LEN_FRAME]; 00226 00227 u1_t bcnChnl; 00228 u1_t bcnRxsyms; // 00229 ostime_t bcnRxtime; 00230 bcninfo_t bcninfo; // Last received beacon info 00231 }; 00232 //! \var struct lmic_t LMIC 00233 //! The state of LMIC MAC layer is encapsulated in this variable. 00234 DECLARE_LMIC; //!< \internal 00235 00236 //! Construct a bit map of allowed datarates from drlo to drhi (both included). 00237 #define DR_RANGE_MAP(drlo,drhi) (((u2_t)0xFFFF<<(drlo)) & ((u2_t)0xFFFF>>(15-(drhi)))) 00238 #if defined(CFG_eu868) 00239 enum { BAND_MILLI=0, BAND_CENTI=1, BAND_DECI=2, BAND_AUX=3 }; 00240 bit_t LMIC_setupBand (u1_t bandidx, s1_t txpow, u2_t txcap); 00241 #endif 00242 bit_t LMIC_setupChannel (u1_t channel, u4_t freq, u2_t drmap, s1_t band); 00243 void LMIC_disableChannel (u1_t channel); 00244 00245 void LMIC_setDrTxpow (dr_t dr, s1_t txpow); // set default/start DR/txpow 00246 void LMIC_setAdrMode (bit_t enabled); // set ADR mode (if mobile turn off) 00247 bit_t LMIC_startJoining (void); 00248 00249 void LMIC_shutdown (void); 00250 void LMIC_init (void); 00251 void LMIC_reset (void); 00252 void LMIC_clrTxData (void); 00253 void LMIC_setTxData (void); 00254 int LMIC_setTxData2 (u1_t port, xref2u1_t data, u1_t dlen, u1_t confirmed); 00255 void LMIC_sendAlive (void); 00256 00257 bit_t LMIC_enableTracking (u1_t tryBcnInfo); 00258 void LMIC_disableTracking (void); 00259 00260 void LMIC_stopPingable (void); 00261 void LMIC_setPingable (u1_t intvExp); 00262 void LMIC_tryRejoin (void); 00263 00264 void LMIC_setSession (u4_t netid, devaddr_t devaddr, xref2u1_t nwkKey, xref2u1_t artKey); 00265 void LMIC_setLinkCheckMode (bit_t enabled); 00266 00267 void LMIC_reverse_memcpy(u1_t *dst, const u1_t *src, size_t len); 00268 // Special APIs - for development or testing 00269 // !!!See implementation for caveats!!! 00270 00271 #endif // _lmic_h_
Generated on Mon Jul 18 2022 07:47:29 by
