LMIC for MOTE_L152RC
Currently version 1.5
LoRaWAN network configuration for end-device
The following three pieces of information uniquely identifies end-device to network to allow over-the-air activation. These are stored in the end-device prior to join procedure.
AppEUI
Uniquely identifies application provider of end-device.
Least-significant byte first, 8 bytes. Use LMIC_reverse_memcpy() for AppEUI to keep same byte order as that on lora server.
example C code
static const u1_t APPEUI[8] = { 0x01, 0x00, 0x01, 0x00, 0x00, 0x0C, 0x25, 0x00 };
This is copied into LMIC by os_getArtEui()
callback function in application.
DevEUI
End-device ID, unique to each end-node.
Least-significant byte first, 8 bytes. Use LMIC_reverse_memcpy() for DevEUI to keep same byte order as that on lora server.
example C code
static const u1_t DEVEUI[8] = { 0x00, 0x00, 0x00, 0x00, 0x01, 0x0C, 0x25, 0x00 };
This is copied into LMIC by os_getDevEui()
callback function in application.
AppKey (aka DevKey)
128-bit (16byte) AES key.
example C code
static const u1_t DEVKEY[16] = { 0xe4, 0x72, 0x71, 0xc5, 0xf5, 0x30, 0xa9, 0x9f, 0xcf, 0xc4, 0x0e, 0xab, 0xea, 0xd7, 0x19, 0x42 };
This is copied into LMIC by os_getDevKey()
callback function in application.
Using over-the air activation, the end-device (LMIC) performs a join procedure every time it starts for first time, or has lost session context information. When join procedure has successfully completed, the end-device will have a network session key (NwkSKey) and an application session key (AppSKey), which are used for encryption and message integrity check.
configuration with http://us01-iot.semtech.com/
- log in to server
- click on Applications
- find your application and click it
- go to configure motes
- to create a mote, you may enter a new DevEUI
- you may copy-paste the 16byte application key from an already existing mote, if you desire.
Information
DevEUI is entered in reverse order into C-code from that shown on server (unique device ID).
AppEUI is entered in reverse order into C-code from that shown on server.
AppEUI is equivalent to "Application"
transmit power limits
FCC Part 15 rules permit one watt of transmit power when more than 50 channels are used. When received by a 64-channel gateway, the maximum power may be used.
However, if end-device is sending to a 8-channel gateway (single SX1301), the maximum transmit power permitted is +20dBm.
To configure LMIC for use with 8-channel gateway, CHNL_HYBRID
should be defined in in config.h, and should be undefined for use with 64-channel gateway.
CHNL_HYBRID | 125KHz | 500KHz |
---|---|---|
defined value | channels | channel |
0 | 0 to 7 | 64 |
1 | 8 to 15 | 65 |
2 | 16 to 23 | 66 |
3 | 24 to 31 | 67 |
4 | 32 to 39 | 68 |
5 | 40 to 47 | 69 |
6 | 48 to 55 | 70 |
7 | 56 to 63 | 71 |
undef | 0 to 63 | 64 to 71 |
lmic.h@8:0faa1bb768b5, 2015-10-21 (annotated)
- Committer:
- dudmuck
- Date:
- Wed Oct 21 01:03:34 2015 +0000
- Revision:
- 8:0faa1bb768b5
- Parent:
- 5:e4ba433f0ac1
parse channel mask in join accept, tx power table, channel search in nextJoinState()
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dudmuck | 0:f2716e543d97 | 1 | /******************************************************************************* |
dudmuck | 0:f2716e543d97 | 2 | * Copyright (c) 2014-2015 IBM Corporation. |
dudmuck | 0:f2716e543d97 | 3 | * All rights reserved. This program and the accompanying materials |
dudmuck | 0:f2716e543d97 | 4 | * are made available under the terms of the Eclipse Public License v1.0 |
dudmuck | 0:f2716e543d97 | 5 | * which accompanies this distribution, and is available at |
dudmuck | 0:f2716e543d97 | 6 | * http://www.eclipse.org/legal/epl-v10.html |
dudmuck | 0:f2716e543d97 | 7 | * |
dudmuck | 0:f2716e543d97 | 8 | * Contributors: |
dudmuck | 0:f2716e543d97 | 9 | * IBM Zurich Research Lab - initial API, implementation and documentation |
dudmuck | 0:f2716e543d97 | 10 | *******************************************************************************/ |
dudmuck | 0:f2716e543d97 | 11 | |
dudmuck | 0:f2716e543d97 | 12 | //! @file |
dudmuck | 0:f2716e543d97 | 13 | //! @brief LMIC API |
dudmuck | 0:f2716e543d97 | 14 | |
dudmuck | 0:f2716e543d97 | 15 | #ifndef _lmic_h_ |
dudmuck | 0:f2716e543d97 | 16 | #define _lmic_h_ |
dudmuck | 0:f2716e543d97 | 17 | |
dudmuck | 0:f2716e543d97 | 18 | #include "oslmic.h" |
dudmuck | 0:f2716e543d97 | 19 | #include "lorabase.h" |
dudmuck | 0:f2716e543d97 | 20 | |
dudmuck | 0:f2716e543d97 | 21 | // LMIC version |
dudmuck | 0:f2716e543d97 | 22 | #define LMIC_VERSION_MAJOR 1 |
dudmuck | 0:f2716e543d97 | 23 | #define LMIC_VERSION_MINOR 5 |
dudmuck | 0:f2716e543d97 | 24 | #define LMIC_VERSION_BUILD 1431528305 |
dudmuck | 0:f2716e543d97 | 25 | |
dudmuck | 0:f2716e543d97 | 26 | enum { MAX_FRAME_LEN = 64 }; //!< Library cap on max frame length |
dudmuck | 0:f2716e543d97 | 27 | enum { TXCONF_ATTEMPTS = 8 }; //!< Transmit attempts for confirmed frames |
dudmuck | 0:f2716e543d97 | 28 | enum { MAX_MISSED_BCNS = 20 }; // threshold for triggering rejoin requests |
dudmuck | 0:f2716e543d97 | 29 | enum { MAX_RXSYMS = 100 }; // stop tracking beacon beyond this |
dudmuck | 0:f2716e543d97 | 30 | |
dudmuck | 0:f2716e543d97 | 31 | enum { LINK_CHECK_CONT = 12 , // continue with this after reported dead link |
dudmuck | 0:f2716e543d97 | 32 | LINK_CHECK_DEAD = 24 , // after this UP frames and no response from NWK assume link is dead |
dudmuck | 0:f2716e543d97 | 33 | LINK_CHECK_INIT = -12 , // UP frame count until we inc datarate |
dudmuck | 0:f2716e543d97 | 34 | LINK_CHECK_OFF =-128 }; // link check disabled |
dudmuck | 0:f2716e543d97 | 35 | |
dudmuck | 0:f2716e543d97 | 36 | enum { TIME_RESYNC = 6*128 }; // secs |
dudmuck | 0:f2716e543d97 | 37 | enum { TXRX_GUARD_ms = 6000 }; // msecs - don't start TX-RX transaction before beacon |
dudmuck | 0:f2716e543d97 | 38 | enum { JOIN_GUARD_ms = 9000 }; // msecs - don't start Join Req/Acc transaction before beacon |
dudmuck | 0:f2716e543d97 | 39 | enum { TXRX_BCNEXT_secs = 2 }; // secs - earliest start after beacon time |
dudmuck | 0:f2716e543d97 | 40 | enum { RETRY_PERIOD_secs = 3 }; // secs - random period for retrying a confirmed send |
dudmuck | 0:f2716e543d97 | 41 | |
dudmuck | 0:f2716e543d97 | 42 | #if defined(CFG_eu868) // EU868 spectrum ==================================================== |
dudmuck | 0:f2716e543d97 | 43 | |
dudmuck | 0:f2716e543d97 | 44 | enum { MAX_CHANNELS = 16 }; //!< Max supported channels |
dudmuck | 0:f2716e543d97 | 45 | enum { MAX_BANDS = 4 }; |
dudmuck | 0:f2716e543d97 | 46 | |
dudmuck | 0:f2716e543d97 | 47 | enum { LIMIT_CHANNELS = (1<<4) }; // EU868 will never have more channels |
dudmuck | 0:f2716e543d97 | 48 | //! \internal |
dudmuck | 0:f2716e543d97 | 49 | struct band_t { |
dudmuck | 0:f2716e543d97 | 50 | u2_t txcap; // duty cycle limitation: 1/txcap |
dudmuck | 0:f2716e543d97 | 51 | s1_t txpow; // maximum TX power |
dudmuck | 0:f2716e543d97 | 52 | u1_t lastchnl; // last used channel |
dudmuck | 0:f2716e543d97 | 53 | ostime_t avail; // channel is blocked until this time |
dudmuck | 0:f2716e543d97 | 54 | }; |
dudmuck | 0:f2716e543d97 | 55 | TYPEDEF_xref2band_t; //!< \internal |
dudmuck | 0:f2716e543d97 | 56 | |
dudmuck | 0:f2716e543d97 | 57 | #elif defined(CFG_us915) // US915 spectrum ================================================= |
dudmuck | 0:f2716e543d97 | 58 | |
dudmuck | 0:f2716e543d97 | 59 | enum { MAX_XCHANNELS = 2 }; // extra channels in RAM, channels 0-71 are immutable |
dudmuck | 0:f2716e543d97 | 60 | enum { MAX_TXPOW_125kHz = 30 }; |
dudmuck | 0:f2716e543d97 | 61 | |
dudmuck | 0:f2716e543d97 | 62 | #endif // ========================================================================== |
dudmuck | 0:f2716e543d97 | 63 | |
dudmuck | 0:f2716e543d97 | 64 | // Keep in sync with evdefs.hpp::drChange |
dudmuck | 0:f2716e543d97 | 65 | enum { DRCHG_SET, DRCHG_NOJACC, DRCHG_NOACK, DRCHG_NOADRACK, DRCHG_NWKCMD }; |
dudmuck | 0:f2716e543d97 | 66 | enum { KEEP_TXPOW = -128 }; |
dudmuck | 0:f2716e543d97 | 67 | |
dudmuck | 0:f2716e543d97 | 68 | |
dudmuck | 0:f2716e543d97 | 69 | //! \internal |
dudmuck | 0:f2716e543d97 | 70 | struct rxsched_t { |
dudmuck | 0:f2716e543d97 | 71 | u1_t dr; |
dudmuck | 0:f2716e543d97 | 72 | u1_t intvExp; // 0..7 |
dudmuck | 0:f2716e543d97 | 73 | u1_t slot; // runs from 0 to 128 |
dudmuck | 0:f2716e543d97 | 74 | u1_t rxsyms; |
dudmuck | 0:f2716e543d97 | 75 | ostime_t rxbase; |
dudmuck | 0:f2716e543d97 | 76 | ostime_t rxtime; // start of next spot |
dudmuck | 0:f2716e543d97 | 77 | u4_t freq; |
dudmuck | 0:f2716e543d97 | 78 | }; |
dudmuck | 0:f2716e543d97 | 79 | TYPEDEF_xref2rxsched_t; //!< \internal |
dudmuck | 0:f2716e543d97 | 80 | |
dudmuck | 0:f2716e543d97 | 81 | |
dudmuck | 0:f2716e543d97 | 82 | //! Parsing and tracking states of beacons. |
dudmuck | 0:f2716e543d97 | 83 | enum { BCN_NONE = 0x00, //!< No beacon received |
dudmuck | 0:f2716e543d97 | 84 | BCN_PARTIAL = 0x01, //!< Only first (common) part could be decoded (info,lat,lon invalid/previous) |
dudmuck | 0:f2716e543d97 | 85 | BCN_FULL = 0x02, //!< Full beacon decoded |
dudmuck | 0:f2716e543d97 | 86 | BCN_NODRIFT = 0x04, //!< No drift value measured yet |
dudmuck | 0:f2716e543d97 | 87 | BCN_NODDIFF = 0x08 }; //!< No differential drift measured yet |
dudmuck | 0:f2716e543d97 | 88 | //! Information about the last and previous beacons. |
dudmuck | 0:f2716e543d97 | 89 | struct bcninfo_t { |
dudmuck | 0:f2716e543d97 | 90 | ostime_t txtime; //!< Time when the beacon was sent |
dudmuck | 0:f2716e543d97 | 91 | s1_t rssi; //!< Adjusted RSSI value of last received beacon |
dudmuck | 0:f2716e543d97 | 92 | s1_t snr; //!< Scaled SNR value of last received beacon |
dudmuck | 0:f2716e543d97 | 93 | u1_t flags; //!< Last beacon reception and tracking states. See BCN_* values. |
dudmuck | 0:f2716e543d97 | 94 | u4_t time; //!< GPS time in seconds of last beacon (received or surrogate) |
dudmuck | 0:f2716e543d97 | 95 | // |
dudmuck | 0:f2716e543d97 | 96 | u1_t info; //!< Info field of last beacon (valid only if BCN_FULL set) |
dudmuck | 0:f2716e543d97 | 97 | s4_t lat; //!< Lat field of last beacon (valid only if BCN_FULL set) |
dudmuck | 0:f2716e543d97 | 98 | s4_t lon; //!< Lon field of last beacon (valid only if BCN_FULL set) |
dudmuck | 0:f2716e543d97 | 99 | }; |
dudmuck | 0:f2716e543d97 | 100 | |
dudmuck | 0:f2716e543d97 | 101 | // purpose of receive window - lmic_t.rxState |
dudmuck | 0:f2716e543d97 | 102 | enum { RADIO_RST=0, RADIO_TX=1, RADIO_RX=2, RADIO_RXON=3 }; |
dudmuck | 0:f2716e543d97 | 103 | // Netid values / lmic_t.netid |
dudmuck | 0:f2716e543d97 | 104 | enum { NETID_NONE=(int)~0U, NETID_MASK=(int)0xFFFFFF }; |
dudmuck | 0:f2716e543d97 | 105 | // MAC operation modes (lmic_t.opmode). |
dudmuck | 0:f2716e543d97 | 106 | enum { OP_NONE = 0x0000, |
dudmuck | 0:f2716e543d97 | 107 | OP_SCAN = 0x0001, // radio scan to find a beacon |
dudmuck | 0:f2716e543d97 | 108 | OP_TRACK = 0x0002, // track my networks beacon (netid) |
dudmuck | 0:f2716e543d97 | 109 | OP_JOINING = 0x0004, // device joining in progress (blocks other activities) |
dudmuck | 0:f2716e543d97 | 110 | OP_TXDATA = 0x0008, // TX user data (buffered in pendTxData) |
dudmuck | 0:f2716e543d97 | 111 | OP_POLL = 0x0010, // send empty UP frame to ACK confirmed DN/fetch more DN data |
dudmuck | 0:f2716e543d97 | 112 | OP_REJOIN = 0x0020, // occasionally send JOIN REQUEST |
dudmuck | 0:f2716e543d97 | 113 | OP_SHUTDOWN = 0x0040, // prevent MAC from doing anything |
dudmuck | 0:f2716e543d97 | 114 | OP_TXRXPEND = 0x0080, // TX/RX transaction pending |
dudmuck | 0:f2716e543d97 | 115 | OP_RNDTX = 0x0100, // prevent TX lining up after a beacon |
dudmuck | 0:f2716e543d97 | 116 | OP_PINGINI = 0x0200, // pingable is initialized and scheduling active |
dudmuck | 0:f2716e543d97 | 117 | OP_PINGABLE = 0x0400, // we're pingable |
dudmuck | 0:f2716e543d97 | 118 | OP_NEXTCHNL = 0x0800, // find a new channel |
dudmuck | 0:f2716e543d97 | 119 | OP_LINKDEAD = 0x1000, // link was reported as dead |
dudmuck | 0:f2716e543d97 | 120 | OP_TESTMODE = 0x2000, // developer test mode |
dudmuck | 0:f2716e543d97 | 121 | }; |
dudmuck | 0:f2716e543d97 | 122 | // TX-RX transaction flags - report back to user |
dudmuck | 0:f2716e543d97 | 123 | enum { TXRX_ACK = 0x80, // confirmed UP frame was acked |
dudmuck | 0:f2716e543d97 | 124 | TXRX_NACK = 0x40, // confirmed UP frame was not acked |
dudmuck | 0:f2716e543d97 | 125 | TXRX_NOPORT = 0x20, // set if a frame with a port was RXed, clr if no frame/no port |
dudmuck | 0:f2716e543d97 | 126 | TXRX_PORT = 0x10, // set if a frame with a port was RXed, LMIC.frame[LMIC.dataBeg-1] => port |
dudmuck | 0:f2716e543d97 | 127 | TXRX_DNW1 = 0x01, // received in 1st DN slot |
dudmuck | 0:f2716e543d97 | 128 | TXRX_DNW2 = 0x02, // received in 2dn DN slot |
dudmuck | 0:f2716e543d97 | 129 | TXRX_PING = 0x04 }; // received in a scheduled RX slot |
dudmuck | 0:f2716e543d97 | 130 | // Event types for event callback |
dudmuck | 0:f2716e543d97 | 131 | enum _ev_t { EV_SCAN_TIMEOUT=1, EV_BEACON_FOUND, |
dudmuck | 0:f2716e543d97 | 132 | EV_BEACON_MISSED, EV_BEACON_TRACKED, EV_JOINING, |
dudmuck | 0:f2716e543d97 | 133 | EV_JOINED, EV_RFU1, EV_JOIN_FAILED, EV_REJOIN_FAILED, |
dudmuck | 0:f2716e543d97 | 134 | EV_TXCOMPLETE, EV_LOST_TSYNC, EV_RESET, |
dudmuck | 0:f2716e543d97 | 135 | EV_RXCOMPLETE, EV_LINK_DEAD, EV_LINK_ALIVE }; |
dudmuck | 0:f2716e543d97 | 136 | typedef enum _ev_t ev_t; |
dudmuck | 0:f2716e543d97 | 137 | |
dudmuck | 0:f2716e543d97 | 138 | |
dudmuck | 0:f2716e543d97 | 139 | struct lmic_t { |
dudmuck | 0:f2716e543d97 | 140 | // Radio settings TX/RX (also accessed by HAL) |
dudmuck | 0:f2716e543d97 | 141 | ostime_t txend; |
dudmuck | 0:f2716e543d97 | 142 | ostime_t rxtime; |
dudmuck | 0:f2716e543d97 | 143 | u4_t freq; |
dudmuck | 0:f2716e543d97 | 144 | s1_t rssi; |
dudmuck | 0:f2716e543d97 | 145 | s1_t snr; |
dudmuck | 0:f2716e543d97 | 146 | rps_t rps; |
dudmuck | 0:f2716e543d97 | 147 | u1_t rxsyms; |
dudmuck | 0:f2716e543d97 | 148 | u1_t dndr; |
dudmuck | 0:f2716e543d97 | 149 | s1_t txpow; // dBm |
dudmuck | 5:e4ba433f0ac1 | 150 | s1_t txpow_limit; // dBm maximum permitted |
dudmuck | 0:f2716e543d97 | 151 | |
dudmuck | 0:f2716e543d97 | 152 | osjob_t osjob; |
dudmuck | 0:f2716e543d97 | 153 | |
dudmuck | 0:f2716e543d97 | 154 | // Channel scheduling |
dudmuck | 0:f2716e543d97 | 155 | #if defined(CFG_eu868) |
dudmuck | 0:f2716e543d97 | 156 | band_t bands[MAX_BANDS]; |
dudmuck | 0:f2716e543d97 | 157 | u4_t channelFreq[MAX_CHANNELS]; |
dudmuck | 0:f2716e543d97 | 158 | u2_t channelDrMap[MAX_CHANNELS]; |
dudmuck | 0:f2716e543d97 | 159 | u2_t channelMap; |
dudmuck | 0:f2716e543d97 | 160 | #elif defined(CFG_us915) |
dudmuck | 0:f2716e543d97 | 161 | u4_t xchFreq[MAX_XCHANNELS]; // extra channel frequencies (if device is behind a repeater) |
dudmuck | 0:f2716e543d97 | 162 | u2_t xchDrMap[MAX_XCHANNELS]; // extra channel datarate ranges ---XXX: ditto |
dudmuck | 0:f2716e543d97 | 163 | u2_t channelMap[(72+MAX_XCHANNELS+15)/16]; // enabled bits |
dudmuck | 0:f2716e543d97 | 164 | u2_t chRnd; // channel randomizer |
dudmuck | 0:f2716e543d97 | 165 | #endif |
dudmuck | 0:f2716e543d97 | 166 | u1_t txChnl; // channel for next TX |
dudmuck | 0:f2716e543d97 | 167 | u1_t globalDutyRate; // max rate: 1/2^k |
dudmuck | 0:f2716e543d97 | 168 | ostime_t globalDutyAvail; // time device can send again |
dudmuck | 0:f2716e543d97 | 169 | |
dudmuck | 0:f2716e543d97 | 170 | u4_t netid; // current network id (~0 - none) |
dudmuck | 0:f2716e543d97 | 171 | u2_t opmode; |
dudmuck | 0:f2716e543d97 | 172 | u1_t upRepeat; // configured up repeat |
dudmuck | 0:f2716e543d97 | 173 | s1_t adrTxPow; // ADR adjusted TX power |
dudmuck | 0:f2716e543d97 | 174 | u1_t datarate; // current data rate |
dudmuck | 0:f2716e543d97 | 175 | u1_t errcr; // error coding rate (used for TX only) |
dudmuck | 0:f2716e543d97 | 176 | u1_t rejoinCnt; // adjustment for rejoin datarate |
dudmuck | 8:0faa1bb768b5 | 177 | u1_t joinBlock; // during join attempt: current channel block |
dudmuck | 8:0faa1bb768b5 | 178 | u1_t joinBlockChnl; // during join attempt: current 125KHz channel |
dudmuck | 0:f2716e543d97 | 179 | s2_t drift; // last measured drift |
dudmuck | 0:f2716e543d97 | 180 | s2_t lastDriftDiff; |
dudmuck | 0:f2716e543d97 | 181 | s2_t maxDriftDiff; |
dudmuck | 0:f2716e543d97 | 182 | |
dudmuck | 0:f2716e543d97 | 183 | u1_t pendTxPort; |
dudmuck | 0:f2716e543d97 | 184 | u1_t pendTxConf; // confirmed data |
dudmuck | 0:f2716e543d97 | 185 | u1_t pendTxLen; // +0x80 = confirmed |
dudmuck | 0:f2716e543d97 | 186 | u1_t pendTxData[MAX_LEN_PAYLOAD]; |
dudmuck | 0:f2716e543d97 | 187 | |
dudmuck | 0:f2716e543d97 | 188 | u2_t devNonce; // last generated nonce |
dudmuck | 0:f2716e543d97 | 189 | u1_t nwkKey[16]; // network session key |
dudmuck | 0:f2716e543d97 | 190 | u1_t artKey[16]; // application router session key |
dudmuck | 0:f2716e543d97 | 191 | devaddr_t devaddr; |
dudmuck | 0:f2716e543d97 | 192 | u4_t seqnoDn; // device level down stream seqno |
dudmuck | 0:f2716e543d97 | 193 | u4_t seqnoUp; |
dudmuck | 0:f2716e543d97 | 194 | |
dudmuck | 0:f2716e543d97 | 195 | u1_t dnConf; // dn frame confirm pending: LORA::FCT_ACK or 0 |
dudmuck | 0:f2716e543d97 | 196 | s1_t adrAckReq; // counter until we reset data rate (0=off) |
dudmuck | 0:f2716e543d97 | 197 | u1_t adrChanged; |
dudmuck | 0:f2716e543d97 | 198 | |
dudmuck | 0:f2716e543d97 | 199 | u1_t margin; |
dudmuck | 0:f2716e543d97 | 200 | bit_t ladrAns; // link adr adapt answer pending |
dudmuck | 0:f2716e543d97 | 201 | bit_t devsAns; // device status answer pending |
dudmuck | 0:f2716e543d97 | 202 | u1_t adrEnabled; |
dudmuck | 0:f2716e543d97 | 203 | u1_t moreData; // NWK has more data pending |
dudmuck | 0:f2716e543d97 | 204 | bit_t dutyCapAns; // have to ACK duty cycle settings |
dudmuck | 0:f2716e543d97 | 205 | u1_t snchAns; // answer set new channel |
dudmuck | 0:f2716e543d97 | 206 | // 2nd RX window (after up stream) |
dudmuck | 0:f2716e543d97 | 207 | u1_t dn2Dr; |
dudmuck | 0:f2716e543d97 | 208 | u4_t dn2Freq; |
dudmuck | 0:f2716e543d97 | 209 | u1_t dn2Ans; // 0=no answer pend, 0x80+ACKs |
dudmuck | 0:f2716e543d97 | 210 | |
dudmuck | 0:f2716e543d97 | 211 | // Class B state |
dudmuck | 0:f2716e543d97 | 212 | u1_t missedBcns; // unable to track last N beacons |
dudmuck | 0:f2716e543d97 | 213 | u1_t bcninfoTries; // how often to try (scan mode only) |
dudmuck | 0:f2716e543d97 | 214 | u1_t pingSetAns; // answer set cmd and ACK bits |
dudmuck | 0:f2716e543d97 | 215 | rxsched_t ping; // pingable setup |
dudmuck | 0:f2716e543d97 | 216 | |
dudmuck | 0:f2716e543d97 | 217 | // Public part of MAC state |
dudmuck | 0:f2716e543d97 | 218 | u1_t txCnt; |
dudmuck | 0:f2716e543d97 | 219 | u1_t txrxFlags; // transaction flags (TX-RX combo) |
dudmuck | 0:f2716e543d97 | 220 | u1_t dataBeg; // 0 or start of data (dataBeg-1 is port) |
dudmuck | 0:f2716e543d97 | 221 | u1_t dataLen; // 0 no data or zero length data, >0 byte count of data |
dudmuck | 0:f2716e543d97 | 222 | u1_t frame[MAX_LEN_FRAME]; |
dudmuck | 0:f2716e543d97 | 223 | |
dudmuck | 0:f2716e543d97 | 224 | u1_t bcnChnl; |
dudmuck | 0:f2716e543d97 | 225 | u1_t bcnRxsyms; // |
dudmuck | 0:f2716e543d97 | 226 | ostime_t bcnRxtime; |
dudmuck | 0:f2716e543d97 | 227 | bcninfo_t bcninfo; // Last received beacon info |
dudmuck | 0:f2716e543d97 | 228 | }; |
dudmuck | 0:f2716e543d97 | 229 | //! \var struct lmic_t LMIC |
dudmuck | 0:f2716e543d97 | 230 | //! The state of LMIC MAC layer is encapsulated in this variable. |
dudmuck | 0:f2716e543d97 | 231 | DECLARE_LMIC; //!< \internal |
dudmuck | 0:f2716e543d97 | 232 | |
dudmuck | 0:f2716e543d97 | 233 | //! Construct a bit map of allowed datarates from drlo to drhi (both included). |
dudmuck | 0:f2716e543d97 | 234 | #define DR_RANGE_MAP(drlo,drhi) (((u2_t)0xFFFF<<(drlo)) & ((u2_t)0xFFFF>>(15-(drhi)))) |
dudmuck | 0:f2716e543d97 | 235 | #if defined(CFG_eu868) |
dudmuck | 0:f2716e543d97 | 236 | enum { BAND_MILLI=0, BAND_CENTI=1, BAND_DECI=2, BAND_AUX=3 }; |
dudmuck | 0:f2716e543d97 | 237 | bit_t LMIC_setupBand (u1_t bandidx, s1_t txpow, u2_t txcap); |
dudmuck | 0:f2716e543d97 | 238 | #endif |
dudmuck | 0:f2716e543d97 | 239 | bit_t LMIC_setupChannel (u1_t channel, u4_t freq, u2_t drmap, s1_t band); |
dudmuck | 0:f2716e543d97 | 240 | void LMIC_disableChannel (u1_t channel); |
dudmuck | 0:f2716e543d97 | 241 | |
dudmuck | 0:f2716e543d97 | 242 | void LMIC_setDrTxpow (dr_t dr, s1_t txpow); // set default/start DR/txpow |
dudmuck | 0:f2716e543d97 | 243 | void LMIC_setAdrMode (bit_t enabled); // set ADR mode (if mobile turn off) |
dudmuck | 0:f2716e543d97 | 244 | bit_t LMIC_startJoining (void); |
dudmuck | 0:f2716e543d97 | 245 | |
dudmuck | 0:f2716e543d97 | 246 | void LMIC_shutdown (void); |
dudmuck | 0:f2716e543d97 | 247 | void LMIC_init (void); |
dudmuck | 0:f2716e543d97 | 248 | void LMIC_reset (void); |
dudmuck | 0:f2716e543d97 | 249 | void LMIC_clrTxData (void); |
dudmuck | 0:f2716e543d97 | 250 | void LMIC_setTxData (void); |
dudmuck | 0:f2716e543d97 | 251 | int LMIC_setTxData2 (u1_t port, xref2u1_t data, u1_t dlen, u1_t confirmed); |
dudmuck | 0:f2716e543d97 | 252 | void LMIC_sendAlive (void); |
dudmuck | 0:f2716e543d97 | 253 | |
dudmuck | 0:f2716e543d97 | 254 | bit_t LMIC_enableTracking (u1_t tryBcnInfo); |
dudmuck | 0:f2716e543d97 | 255 | void LMIC_disableTracking (void); |
dudmuck | 0:f2716e543d97 | 256 | |
dudmuck | 0:f2716e543d97 | 257 | void LMIC_stopPingable (void); |
dudmuck | 0:f2716e543d97 | 258 | void LMIC_setPingable (u1_t intvExp); |
dudmuck | 0:f2716e543d97 | 259 | void LMIC_tryRejoin (void); |
dudmuck | 0:f2716e543d97 | 260 | |
dudmuck | 0:f2716e543d97 | 261 | void LMIC_setSession (u4_t netid, devaddr_t devaddr, xref2u1_t nwkKey, xref2u1_t artKey); |
dudmuck | 0:f2716e543d97 | 262 | void LMIC_setLinkCheckMode (bit_t enabled); |
dudmuck | 0:f2716e543d97 | 263 | |
dudmuck | 8:0faa1bb768b5 | 264 | void LMIC_reverse_memcpy(u1_t *dst, const u1_t *src, size_t len); |
dudmuck | 0:f2716e543d97 | 265 | // Special APIs - for development or testing |
dudmuck | 0:f2716e543d97 | 266 | // !!!See implementation for caveats!!! |
dudmuck | 0:f2716e543d97 | 267 | |
dudmuck | 0:f2716e543d97 | 268 | #endif // _lmic_h_ |