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