Arduino LMIC 6.0.1
Arduino LoRaWAN(r) MAC in C
Loading...
Searching...
No Matches
lmic_accessors.h
1/*
2
3Module: lmic_accessors.h
4
5Function:
6 Accessors for the LMIC instance: getters for status and settings,
7 setters for the few things a client may change directly.
8
9Copyright notice and license info:
10 See LICENSE file accompanying this project.
11
12Author:
13 Terry Moore, MCCI Corporation September 2026
14
15Description:
16 Clients should use these instead of reading or writing fields of
17 the LMIC object. The field layout changes in V7 (regional state
18 moves into unions); these accessors do not.
19
20 Where the LMIC field name differs from the LoRaWAN specification's
21 name for the same thing, the accessor uses the specification's name
22 (LoRaWAN 1.0.3 and Regional Parameters 1.0.3revA): FCntUp, FCntDown,
23 DevAddr, NetID, DevNonce, DataRate, TXPower, ChIndex, RX2DataRate,
24 FPort, FRMPayload, RSSI, SNR. Things the specification does not name
25 (operating mode, radio parameter word, timing) keep LMIC names.
26
27 Fields that exist only when a feature is compiled in (beacons,
28 ping, DeviceTimeReq) have getters only when the feature is
29 compiled in. Fields that depend on the region have getters that
30 return false when the active region has no such field.
31
32 See mcci-catena/arduino-lmic#1089.
33
34*/
35
36#ifndef _lmic_accessors_h_ /* prevent multiple includes */
37#define _lmic_accessors_h_
38
39#ifndef _lmic_h_
40# include "lmic.h"
41#endif
42
43LMIC_BEGIN_DECLS
44
45/****************************************************************************\
46|
47| Region
48|
49\****************************************************************************/
50
52typedef enum lmic_region_kind_e {
53 LMIC_REGION_KIND_CONFIGURABLE = 1,
54 LMIC_REGION_KIND_FIXED = 2,
55} lmic_region_kind_t;
56
58static inline u1_t LMIC_getRegion(void) {
59 return CFG_region;
60}
61
63static inline lmic_region_kind_t LMIC_getRegionKind(void) {
64#if CFG_LMIC_EU_like
65 return LMIC_REGION_KIND_CONFIGURABLE;
66#else
67 return LMIC_REGION_KIND_FIXED;
68#endif
69}
70
71/****************************************************************************\
72|
73| Radio and link status
74|
75\****************************************************************************/
76
78static inline u4_t LMIC_getFrequency(void) {
79 return LMIC.freq;
80}
81
83static inline dr_t LMIC_getDataRate(void) {
84 return LMIC.datarate;
85}
86
88static inline rps_t LMIC_getRps(void) {
89 return LMIC.rps;
90}
91
93static inline s1_t LMIC_getAdrTXPower(void) {
94 return LMIC.adrTxPow;
95}
96
98static inline s1_t LMIC_getRadioTxPower(void) {
99 return LMIC.txpow;
100}
101
103static inline s1_t LMIC_getRSSI(void) {
104 return LMIC.rssi;
105}
106
108static inline s1_t LMIC_getSNR(void) {
109 return LMIC.snr;
110}
111
113static inline u1_t LMIC_getTxChIndex(void) {
114 return LMIC.txChnl;
115}
116
118static inline dr_t LMIC_getRX2DataRate(void) {
119 return LMIC.dn2Dr;
120}
121
123static inline u4_t LMIC_getRX2Frequency(void) {
124 return LMIC.dn2Freq;
125}
126
128static inline rxsyms_t LMIC_getRxsyms(void) {
129 return LMIC.rxsyms;
130}
131
133static inline u1_t LMIC_getSaveIrqFlags(void) {
134 return LMIC.saveIrqFlags;
135}
136
138static inline bit_t LMIC_getNoRxIqInversion(void) {
139 return LMIC.noRXIQinversion != 0;
140}
141
143static inline ostime_t LMIC_getLbtTicks(void) {
144 return LMIC.lbt_ticks;
145}
146
148static inline s1_t LMIC_getLbtDbmax(void) {
149 return LMIC.lbt_dbmax;
150}
151
152/****************************************************************************\
153|
154| Timing
155|
156\****************************************************************************/
157
159static inline ostime_t LMIC_getTxend(void) {
160 return LMIC.txend;
161}
162
164static inline ostime_t LMIC_getRxtime(void) {
165 return LMIC.rxtime;
166}
167
169static inline ostime_t LMIC_getNextRxTime(void) {
170 return LMIC.nextRxTime;
171}
172
174static inline ostime_t LMIC_getGlobalDutyAvail(void) {
175 return LMIC.globalDutyAvail;
176}
177
178/****************************************************************************\
179|
180| MAC state
181|
182\****************************************************************************/
183
185static inline u2_t LMIC_getOpmode(void) {
186 return LMIC.opmode;
187}
188
190static inline u2_t LMIC_getTxrxFlags(void) {
191 return LMIC.txrxFlags;
192}
193
195static inline u4_t LMIC_getFCntUp(void) {
196 return LMIC.seqnoUp;
197}
198
200static inline u4_t LMIC_getFCntDown(void) {
201 return LMIC.seqnoDn;
202}
203
205static inline devaddr_t LMIC_getDevAddr(void) {
206 return LMIC.devaddr;
207}
208
210static inline u4_t LMIC_getNetID(void) {
211 return LMIC.netid;
212}
213
215static inline u2_t LMIC_getDevNonce(void) {
216 return LMIC.devNonce;
217}
218
219/****************************************************************************\
220|
221| Received data
222|
223\****************************************************************************/
224
229static inline u1_t LMIC_getFRMPayload(const u1_t **ppData, u1_t *pLen) {
230 if (LMIC.dataLen == 0 || LMIC.dataBeg == 0) {
231 *ppData = NULL;
232 *pLen = 0;
233 return 0;
234 }
235 *ppData = LMIC.frame + LMIC.dataBeg;
236 *pLen = LMIC.dataLen;
237 return LMIC.frame[LMIC.dataBeg - 1];
238}
239
241static inline u1_t LMIC_getFRMPayloadLen(void) {
242 return LMIC.dataLen;
243}
244
245/****************************************************************************\
246|
247| Setters for raw (non-LoRaWAN) transmission
248|
249\****************************************************************************/
250
252static inline void LMIC_setFrequency(u4_t freq) {
253 LMIC.freq = freq;
254}
255
257static inline void LMIC_setDataRate(dr_t dr) {
258 LMIC.datarate = dr;
259}
260
262static inline void LMIC_setRps(rps_t rps) {
263 LMIC.rps = rps;
264}
265
267static inline void LMIC_setRadioTxPower(s1_t txpow) {
268 LMIC.txpow = txpow;
269}
270
272static inline void LMIC_setLbt(ostime_t ticks, s1_t dbmax) {
273 LMIC.lbt_ticks = ticks;
274 LMIC.lbt_dbmax = dbmax;
275}
276
278static inline void LMIC_setNoRxIqInversion(bit_t fNoInversion) {
279 LMIC.noRXIQinversion = fNoInversion;
280}
281
283static inline void LMIC_setRX2DataRate(dr_t dr) {
284 LMIC.dn2Dr = dr;
285}
286
291static inline u1_t LMIC_setRawTxData(const u1_t *pData, u1_t len) {
292 // MAX_LEN_FRAME is an int enumerator, usually 255. Comparing a u1_t
293 // against it directly draws -Wtype-limits ("always false") in that
294 // configuration; comparing against a u1_t holding the same value does not,
295 // and still clamps when MAX_LEN_FRAME is configured to be less than 255.
296 u1_t const maxLen = MAX_LEN_FRAME;
297
298 if (len > maxLen)
299 len = maxLen;
300 os_copyMem(LMIC.frame, pData, len);
301 LMIC.dataLen = len;
302 return len;
303}
304
308static inline void LMIC_getRawRxData(const u1_t **ppData, u1_t *pLen) {
309 *ppData = LMIC.frame;
310 *pLen = LMIC.dataLen;
311}
312
314static inline void LMIC_setNextRxTime(ostime_t t) {
315 LMIC.nextRxTime = t;
316}
317
318LMIC_END_DECLS
319
320#endif /* _lmic_accessors_h_ */
LMIC API.
#define os_copyMem(pDest, pSrc, nSrc)
Copy buffer.
Definition oslmic.h:70