Upgrade to latest LMIC code (v4.2.0-1)

This commit is contained in:
Manuel Bleichenbacher 2022-09-21 20:48:49 +02:00
parent 46ad09736b
commit 68d5669833
10 changed files with 100 additions and 35 deletions

View File

@ -169,7 +169,7 @@
// enable support for MCMD_DeviceTimeReq and MCMD_DeviceTimeAns // enable support for MCMD_DeviceTimeReq and MCMD_DeviceTimeAns
// this is always defined, and non-zero to enable it. // this is always defined, and non-zero to enable it.
#if !defined(LMIC_ENABLE_DeviceTimeReq) #if !defined(LMIC_ENABLE_DeviceTimeReq)
# define LMIC_ENABLE_DeviceTimeReq 0 # define LMIC_ENABLE_DeviceTimeReq 1
#endif #endif
// LMIC_ENABLE_user_events // LMIC_ENABLE_user_events

View File

@ -174,7 +174,7 @@ void hal_pollPendingIRQs_helper();
void hal_processPendingIRQs(void); void hal_processPendingIRQs(void);
/// \brief check for any pending interrupts: stub if interrupts are enabled. /// \brief check for any pending interrupts: stub if interrupts are enabled.
static void inline hal_pollPendingIRQs(void) static inline void hal_pollPendingIRQs(void)
{ {
#if !defined(LMIC_USE_INTERRUPTS) #if !defined(LMIC_USE_INTERRUPTS)
hal_pollPendingIRQs_helper(); hal_pollPendingIRQs_helper();

View File

@ -119,7 +119,7 @@ void os_wmsbf4 (xref2u1_t buf, u4_t v) {
#if !defined(os_getBattLevel) #if !defined(os_getBattLevel)
u1_t os_getBattLevel (void) { u1_t os_getBattLevel (void) {
return MCMD_DEVS_BATT_NOINFO; return LMIC.client.devStatusAns_battery;
} }
#endif #endif
@ -764,6 +764,9 @@ applyAdrRequests(
p4 = opts[oidx+4]; // ChMaskCtl, NbTrans p4 = opts[oidx+4]; // ChMaskCtl, NbTrans
u1_t chpage = p4 & MCMD_LinkADRReq_Redundancy_ChMaskCntl_MASK; // channel page u1_t chpage = p4 & MCMD_LinkADRReq_Redundancy_ChMaskCntl_MASK; // channel page
// notice that we ignore map_ok except on the last setting.
// so LMICbandplan_mapChannels should report failure status, but do
// the work; if it fails, we'll back it out.
map_ok = LMICbandplan_mapChannels(chpage, chmap); map_ok = LMICbandplan_mapChannels(chpage, chmap);
LMICOS_logEventUint32("applyAdrRequests: mapChannels", ((u4_t)chpage << 16)|(chmap << 0)); LMICOS_logEventUint32("applyAdrRequests: mapChannels", ((u4_t)chpage << 16)|(chmap << 0));
} }
@ -2815,6 +2818,7 @@ void LMIC_reset (void) {
void LMIC_init (void) { void LMIC_init (void) {
LMIC.opmode = OP_SHUTDOWN; LMIC.opmode = OP_SHUTDOWN;
LMIC.client.devStatusAns_battery = MCMD_DEVS_BATT_NOINFO;
LMICbandplan_init(); LMICbandplan_init();
} }
@ -3102,3 +3106,47 @@ int LMIC_getNetworkTimeReference(lmic_time_reference_t *pReference) {
#endif // LMIC_ENABLE_DeviceTimeReq #endif // LMIC_ENABLE_DeviceTimeReq
return 0; return 0;
} }
///
/// \brief set battery level to be returned by `DevStatusAns`.
///
/// \param uBattLevel is the 8-bit value to be returned. Per LoRaWAN 1.0.3 line 769,
/// this is \c MCMD_DEVS_EXT_POWER (0) if on external power,
/// \c MCMD_DEVS_NOINFO (255) if not able to measure battery level,
/// or a value in [ \c MCMD_DEVS_BATT_MIN, \c MCMD_DEVS_BATT_MAX ], numerically
/// [1, 254], to represent the charge state of the battery. Note that
/// this is not millivolts.
///
/// \returns
/// This function returns the previous value of the battery level.
///
/// \details
/// The LMIC maintains an idea of the current battery state, initially set to
/// \c MCMD_DEVS_NOINFO after the call to LMIC_init(). The appplication then calls
/// this function from time to time to update the battery level.
///
/// It is possible (in non-Arduino environments) to supply a local implementation
/// of os_getBatteryLevel(). In that case, it's up to the implementation to decide
/// whether to use the value supplied by this API.
///
/// This implementation was chosen to minimize the risk of a battery measurement
/// introducting breaking delays into the LMIC.
///
u1_t LMIC_setBatteryLevel(u1_t uBattLevel) {
const u1_t result = LMIC.client.devStatusAns_battery;
LMIC.client.devStatusAns_battery = uBattLevel;
return result;
}
///
/// \brief get battery level that is to be returned by `DevStatusAns`.
///
/// \returns
/// This function returns the saved value of the battery level.
///
/// \see LMIC_setBatteryLevel()
///
u1_t LMIC_getBatteryLevel(void) {
return LMIC.client.devStatusAns_battery;
}

View File

@ -106,7 +106,7 @@ extern "C"{
((((major)*UINT32_C(1)) << 24) | (((minor)*UINT32_C(1)) << 16) | (((patch)*UINT32_C(1)) << 8) | (((local)*UINT32_C(1)) << 0)) ((((major)*UINT32_C(1)) << 24) | (((minor)*UINT32_C(1)) << 16) | (((patch)*UINT32_C(1)) << 8) | (((local)*UINT32_C(1)) << 0))
#define ARDUINO_LMIC_VERSION \ #define ARDUINO_LMIC_VERSION \
ARDUINO_LMIC_VERSION_CALC(4, 0, 1, 1) /* 4.0.1-pre1 */ ARDUINO_LMIC_VERSION_CALC(4, 2, 0, 1) /* 4.2.0-1 */
#define ARDUINO_LMIC_VERSION_GET_MAJOR(v) \ #define ARDUINO_LMIC_VERSION_GET_MAJOR(v) \
((((v)*UINT32_C(1)) >> 24u) & 0xFFu) ((((v)*UINT32_C(1)) >> 24u) & 0xFFu)
@ -459,7 +459,7 @@ struct lmic_client_data_s {
u2_t clockError; //! Inaccuracy in the clock. CLOCK_ERROR_MAX represents +/-100% error u2_t clockError; //! Inaccuracy in the clock. CLOCK_ERROR_MAX represents +/-100% error
/* finally, things that are (u)int8_t */ /* finally, things that are (u)int8_t */
/* none at the moment */ u1_t devStatusAns_battery; //!< value to report in MCMD_DevStatusAns message.
}; };
/* /*
@ -740,6 +740,9 @@ int LMIC_registerEventCb(lmic_event_cb_t *pEventCb, void *pUserData);
int LMIC_findNextChannel(uint16_t *, const uint16_t *, uint16_t, int); int LMIC_findNextChannel(uint16_t *, const uint16_t *, uint16_t, int);
u1_t LMIC_getBatteryLevel(void);
u1_t LMIC_setBatteryLevel(u1_t /* uBattLevel */);
// APIs for client half of compliance. // APIs for client half of compliance.
typedef u1_t lmic_compliance_rx_action_t; typedef u1_t lmic_compliance_rx_action_t;

View File

@ -35,6 +35,11 @@
// //
// BEG: AS923 related stuff // BEG: AS923 related stuff
// //
enum {
AS923_REGION_TX_EIRP_MAX_DBM =
(LMIC_COUNTRY_CODE == LMIC_COUNTRY_CODE_JP) ? AS923_JP_TX_EIRP_MAX_DBM
: AS923_TX_EIRP_MAX_DBM
};
// see table in section 2.7.3 // see table in section 2.7.3
CONST_TABLE(u1_t, _DR2RPS_CRC)[] = { CONST_TABLE(u1_t, _DR2RPS_CRC)[] = {
@ -130,7 +135,7 @@ static CONST_TABLE(s1_t, TXMAXEIRP)[16] = {
static int8_t LMICas923_getMaxEIRP(uint8_t mcmd_txparam) { static int8_t LMICas923_getMaxEIRP(uint8_t mcmd_txparam) {
// if uninitialized, return default. // if uninitialized, return default.
if (mcmd_txparam == 0xFF) if (mcmd_txparam == 0xFF)
return AS923_TX_EIRP_MAX_DBM; return AS923_REGION_TX_EIRP_MAX_DBM;
else else
return TABLE_GET_S1( return TABLE_GET_S1(
TXMAXEIRP, TXMAXEIRP,
@ -199,7 +204,7 @@ void LMICas923_initDefaultChannels(bit_t join) {
} }
LMIC.bands[BAND_CENTI].txcap = AS923_TX_CAP; LMIC.bands[BAND_CENTI].txcap = AS923_TX_CAP;
LMIC.bands[BAND_CENTI].txpow = AS923_TX_EIRP_MAX_DBM; LMIC.bands[BAND_CENTI].txpow = AS923_REGION_TX_EIRP_MAX_DBM;
LMIC.bands[BAND_CENTI].lastchnl = os_getRndU1() % MAX_CHANNELS; LMIC.bands[BAND_CENTI].lastchnl = os_getRndU1() % MAX_CHANNELS;
LMIC.bands[BAND_CENTI].avail = os_getTime(); LMIC.bands[BAND_CENTI].avail = os_getTime();
} }
@ -457,7 +462,7 @@ ostime_t LMICas923_nextJoinState(void) {
void void
LMICas923_initJoinLoop(void) { LMICas923_initJoinLoop(void) {
// LMIC.txParam is set to 0xFF by the central code at init time. // LMIC.txParam is set to 0xFF by the central code at init time.
LMICeulike_initJoinLoop(NUM_DEFAULT_CHANNELS, /* adr dBm */ AS923_TX_EIRP_MAX_DBM); LMICeulike_initJoinLoop(NUM_DEFAULT_CHANNELS, /* adr dBm */ AS923_REGION_TX_EIRP_MAX_DBM);
} }
void void

View File

@ -108,7 +108,7 @@ int LMIC_findNextChannel(
memcpy(pShuffleMask, pEnableMask, nEntries * sizeof(*pShuffleMask)); memcpy(pShuffleMask, pEnableMask, nEntries * sizeof(*pShuffleMask));
nSet16 = sidewaysSum16(pShuffleMask, nEntries); nSet16 = sidewaysSum16(pShuffleMask, nEntries);
} else { } else {
// don't try to skip the last channel becuase it can't be chosen. // don't try to skip the last channel because it can't be chosen.
lastChannel = -1; lastChannel = -1;
} }
@ -121,7 +121,7 @@ int LMIC_findNextChannel(
// the last channel bit. Post condition: if we really clered a bit, // the last channel bit. Post condition: if we really clered a bit,
// saveLastChannelVal will be non-zero. // saveLastChannelVal will be non-zero.
saveLastChannelVal = 0; saveLastChannelVal = 0;
if (nSet16 > 16 && lastChannel >= 0 && lastChannel <= nEntries * 16) { if (nSet16 > 16 && lastChannel >= 0 && lastChannel <= (int)(nEntries * 16)) {
uint16_t const saveLastChannelMask = (1 << (lastChannel & 0xF)); uint16_t const saveLastChannelMask = (1 << (lastChannel & 0xF));
saveLastChannelVal = pShuffleMask[lastChannel >> 4] & saveLastChannelMask; saveLastChannelVal = pShuffleMask[lastChannel >> 4] & saveLastChannelMask;

View File

@ -99,6 +99,9 @@ bit_t LMICuslike_canMapChannels(u1_t chpage, u2_t chmap) {
|| channel map appllies to 500kHz (ch 64..71) and in addition || channel map appllies to 500kHz (ch 64..71) and in addition
|| all channels 0..63 are turned off or on. MCMC_LADR_CHP_BANK || all channels 0..63 are turned off or on. MCMC_LADR_CHP_BANK
|| is also special, in that it enables subbands. || is also special, in that it enables subbands.
||
|| TODO(tmm@mcci.com) revise the 0xFF00 mask for regions with other than
|| eight 500 kHz channels.
*/ */
if (chpage < MCMD_LinkADRReq_ChMaskCntl_USLIKE_SPECIAL) { if (chpage < MCMD_LinkADRReq_ChMaskCntl_USLIKE_SPECIAL) {
// operate on channels 0..15, 16..31, 32..47, 48..63, 64..71 // operate on channels 0..15, 16..31, 32..47, 48..63, 64..71
@ -111,17 +114,22 @@ bit_t LMICuslike_canMapChannels(u1_t chpage, u2_t chmap) {
return 1; return 1;
} }
} else if (chpage == MCMD_LinkADRReq_ChMaskCntl_USLIKE_BANK) { } else if (chpage == MCMD_LinkADRReq_ChMaskCntl_USLIKE_BANK) {
if (chmap == 0 || (chmap & 0xFF00) != 0) { if ((chmap & 0xFF00) != 0) {
// no bits set, or reserved bitsset , fail. // Reserved bits set, fail.
return 0; return 0;
} }
} else if (chpage == MCMD_LinkADRReq_ChMaskCntl_USLIKE_125ON || } else if (chpage == MCMD_LinkADRReq_ChMaskCntl_USLIKE_125ON ||
chpage == MCMD_LinkADRReq_ChMaskCntl_USLIKE_125OFF) { chpage == MCMD_LinkADRReq_ChMaskCntl_USLIKE_125OFF) {
u1_t const en125 = chpage == MCMD_LinkADRReq_ChMaskCntl_USLIKE_125ON; //
// if disabling all 125kHz chans, you might think we must have
// if disabling all 125kHz chans, must have at least one 500kHz chan // at least one 500kHz chan; but that's a local conclusion.
// don't allow reserved bits to be set in chmap. // Some network servers will disable all (including 500kHz)
if ((! en125 && chmap == 0) || (chmap & 0xFF00) != 0) // then turn things back on in the next LinkADRReq. So
// we can't fail that here.
//
// But don't allow reserved bits to be set in chmap.
//
if ((chmap & 0xFF00) != 0)
return 0; return 0;
} else { } else {
return 0; return 0;

View File

@ -589,20 +589,20 @@ enum {
// Bit fields byte#3 of MCMD_LinkADRReq payload // Bit fields byte#3 of MCMD_LinkADRReq payload
enum { enum {
MCMD_LinkADRReq_Redundancy_RFU = 0x80, MCMD_LinkADRReq_Redundancy_RFU = 0x80, ///< mask for RFU bit
MCMD_LinkADRReq_Redundancy_ChMaskCntl_MASK= 0x70, MCMD_LinkADRReq_Redundancy_ChMaskCntl_MASK= 0x70, ///< mask for the channel-mask control field.
MCMD_LinkADRReq_Redundancy_NbTrans_MASK = 0x0F, MCMD_LinkADRReq_Redundancy_NbTrans_MASK = 0x0F, ///< mask for the `NbTrans` (repetition) field.
MCMD_LinkADRReq_ChMaskCntl_EULIKE_DIRECT = 0x00, // direct masking for EU MCMD_LinkADRReq_ChMaskCntl_EULIKE_DIRECT = 0x00, ///< EU-like: direct masking for EU
MCMD_LinkADRReq_ChMaskCntl_EULIKE_ALL_ON = 0x60, // EU: enable everything. MCMD_LinkADRReq_ChMaskCntl_EULIKE_ALL_ON = 0x60, ///< EU-like: enable everything.
MCMD_LinkADRReq_ChMaskCntl_USLIKE_500K = 0x40, // mask is for the 8 us-like 500 kHz channels MCMD_LinkADRReq_ChMaskCntl_USLIKE_500K = 0x40, ///< US-like: mask is for the 8 us-like 500 kHz channels
MCMD_LinkADRReq_ChMaskCntl_USLIKE_SPECIAL = 0x50, // first special for us-like MCMD_LinkADRReq_ChMaskCntl_USLIKE_SPECIAL = 0x50, ///< US-like: first special for us-like
MCMD_LinkADRReq_ChMaskCntl_USLIKE_BANK = 0x50, // special: bits are banks. MCMD_LinkADRReq_ChMaskCntl_USLIKE_BANK = 0x50, ///< US-like: special: bits are banks.
MCMD_LinkADRReq_ChMaskCntl_USLIKE_125ON = 0x60, // special channel page enable, bits applied to 64..71 MCMD_LinkADRReq_ChMaskCntl_USLIKE_125ON = 0x60, ///< US-like: special channel page enable, bits applied to 64..71
MCMD_LinkADRReq_ChMaskCntl_USLIKE_125OFF = 0x70, // special channel page: disble 125K, bits apply to 64..71 MCMD_LinkADRReq_ChMaskCntl_USLIKE_125OFF = 0x70, ///< US-like: special channel page: disable 125K, bits apply to 64..71
MCMD_LinkADRReq_ChMaskCntl_CN470_ALL_ON = 0x60, // turn all on for China. MCMD_LinkADRReq_ChMaskCntl_CN470_ALL_ON = 0x60, ///< CN-470: turn all on for China.
}; };
// Bit fields byte#0 of MCMD_LinkADRReq payload // Bit fields byte#0 of MCMD_LinkADRReq payload

View File

@ -68,6 +68,7 @@ enum {
AS923_FREQ_MAX = 928000000 AS923_FREQ_MAX = 928000000
}; };
enum { enum {
AS923_JP_TX_EIRP_MAX_DBM = 13, // 13 dBm = 19.95mW < 20mW
AS923_TX_EIRP_MAX_DBM = 16 // 16 dBm AS923_TX_EIRP_MAX_DBM = 16 // 16 dBm
}; };
enum { DR_PAGE_AS923 = 0x10 * (LMIC_REGION_as923 - 1) }; enum { DR_PAGE_AS923 = 0x10 * (LMIC_REGION_as923 - 1) };
@ -75,14 +76,14 @@ enum { DR_PAGE_AS923 = 0x10 * (LMIC_REGION_as923 - 1) };
enum { AS923_LMIC_REGION_EIRP = 1 }; // region uses EIRP enum { AS923_LMIC_REGION_EIRP = 1 }; // region uses EIRP
enum { AS923JP_LBT_US = 5000 }; // microseconds of LBT time -- 5000 ==> enum { AS923JP_LBT_US = 5000 }; // microseconds of LBT time -- 5000 ==>
// 5 ms. We use us rather than ms for // 5 ms. We use us rather than ms for
// future 128us support, and just for // future 128us support, and just for
// backward compatibility -- there // backward compatibility -- there
// is code that uses the _US constant, // is code that uses the _US constant,
// and it's awkward to break it. // and it's awkward to break it.
enum { AS923JP_LBT_DB_MAX = -80 }; // maximum channel strength in dB; if TX enum { AS923JP_LBT_DB_MAX = -80 }; // maximum channel strength in dB; if TX
// we measure more than this, we don't tx. // we measure more than this, we don't tx.
// AS923 v1.1, all channels face a 1% duty cycle. So this will have to change // AS923 v1.1, all channels face a 1% duty cycle. So this will have to change
// in the future via a config. But this code base needs major changes for // in the future via a config. But this code base needs major changes for

View File

@ -238,7 +238,7 @@ void os_wmsbf4 (xref2u1_t buf, u4_t value);
u2_t os_rlsbf2 (xref2cu1_t buf); u2_t os_rlsbf2 (xref2cu1_t buf);
#endif #endif
#ifndef os_wlsbf2 #ifndef os_wlsbf2
//! Write 16-bit quntity into buffer in little endian byte order. //! Write 16-bit quantity into buffer in little endian byte order.
void os_wlsbf2 (xref2u1_t buf, u2_t value); void os_wlsbf2 (xref2u1_t buf, u2_t value);
#endif #endif