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