From 05d304f759dd9ab604bdd1659130f5fa02c16b49 Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Sat, 14 Sep 2019 13:31:25 -0400 Subject: [PATCH 01/35] Fix #453: US v1.3 compliance 12.5 DL count hack The US v1.3 compliance test section 12.5 requires that we not increment the downlink count for an EchoRequest unless the EchoResponse is permitted with the current data rate (what the LMIC code calls "feasibility"). We can't tell if a message is feasible unless we actually try to send it, and we increment the downlink count centrally. Workaournd is to decrement the downlink count if the LMIC says the EchoResponse is infeasible. --- src/lmic/lmic_compliance.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/lmic/lmic_compliance.c b/src/lmic/lmic_compliance.c index cf80618e..a70a8e43 100644 --- a/src/lmic/lmic_compliance.c +++ b/src/lmic/lmic_compliance.c @@ -753,6 +753,11 @@ static void acSendUplinkBuffer(void) { LMIC_COMPLIANCE_PRINTF("%s: queued %u bytes\n", __func__, LMIC_Compliance.uplinkSize); } else { LMIC_COMPLIANCE_PRINTF("%s: uplink %u bytes failed (error %d)\n", __func__, LMIC_Compliance.uplinkSize, eSend); + if (eSend == LMIC_ERROR_TX_NOT_FEASIBLE) { + // Reverse the increment of the downlink count. Needed for US compliance. + if (CFG_region == LMIC_REGION_us915) + --LMIC_Compliance.downlinkCount; + } LMIC_Compliance.eventflags |= LMIC_COMPLIANCE_EVENT_UPLINK_COMPLETE; fsmEval(); } From ef543e0bafc9e28dcaefd4cc2f1517ff361e2fcf Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Sat, 14 Sep 2019 13:39:20 -0400 Subject: [PATCH 02/35] Fix #454: add V1.0.2 config for US pow2dbm() US compliance testing doesn't support v1.0.3 devices that support the extended power range. For squeaky-clean logs, add an option to select whether we're complying with 1.0.3 or 1.0.2. Do it in a way that allows generalization to future 1.1 support. --- README.md | 45 ++++++++++++++++++++++++++-- src/lmic/config.h | 5 ++++ src/lmic/lmic_config_preconditions.h | 9 ++++++ src/lmic/lmic_us915.c | 5 +++- src/lmic/lorabase_us915.h | 6 ++++ 5 files changed, 67 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b79ed62f..7f60bc70 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,9 @@ requires C99 mode to be enabled by default. - [Working with MCCI Murata-based boards](#working-with-mcci-murata-based-boards) - [Event-Handling Issues](#event-handling-issues) - [Configuration](#configuration) + - [Selecting the LoRaWAN Version](#selecting-the-lorawan-version) + - [Selecting V1.0.2](#selecting-v102) + - [Selecting V1.0.3](#selecting-v103) - [Selecting the LoRaWAN Region Configuration](#selecting-the-lorawan-region-configuration) - [eu868, as923, in866, kr920](#eu868-as923-in866-kr920) - [us915, au921](#us915-au921) @@ -188,10 +191,48 @@ so that your local changes are more clearly separated from the distribution files. The Arduino environment doesn't give us a better way to do this, unless you change `BOARDS.txt`. -Unlike other ports of the LMIC code, in this port, you should not edit `src/lmic/config.h` to configure this package. +Unlike other ports of the LMIC code, in this port, you should not edit `src/lmic/config.h` to configure this package. The intention is that you'll edit the `project_config/lmic_project_config.h` (if using the Arduino environment), or change compiler command-line input (if using PlatformIO, make, etc.). The following configuration variables are available. +### Selecting the LoRaWAN Version + +This library implements V1.0.3 of the LoRaWAN specification. However, it can also be used with V1.0.2. The only significant change when selecting V1.0.2 is that the US accepted power range in MAC commands is 10 dBm to 30 dBm; whereas in V1.0.3 the accepted range 2 dBm to 30 dBm. + +The default LoRaWAN version, if no version is explicitly selected, is V1.0.3. + +`LMIC_LORAWAN_SPEC_VERSION` is defined as an integer reflecting the targeted spec version; it will be set to `LMIC_LORAWAN_SPEC_VERSION_1_0_2` or `LMIC_LORAWAN_SPEC_VERSION_1_0_3`. Arithmetic comparisons can be done on these version numbers: and we guarantee `LMIC_LORAWAN_SPEC_VERSION_1_0_3 > LMIC_LORAWAN_SPEC_VERSION_1_0_2`, but the details of the how the versions are encoded may change, and your code should not rely upon the details. + +#### Selecting V1.0.2 + +In `project_config/lmic_project_config.h`, add: + +```c +#define LMIC_LORAWAN_SPEC_VERSION LMIC_LORAWAN_SPEC_VERSION_1_0_2 +``` + +On your compiler command line, add: + +```shell +-D LMIC_LORAWAN_SPEC_VERSION=LMIC_LORAWAN_SPEC_VERSION_1_0_2 +``` + +#### Selecting V1.0.3 + +In `project_config/lmic_project_config.h`, add: + +```c +#define LMIC_LORAWAN_SPEC_VERSION LMIC_LORAWAN_SPEC_VERSION_1_0_3 +``` + +On your compiler command line, add: + +```shell +-D LMIC_LORAWAN_SPEC_VERSION=LMIC_LORAWAN_SPEC_VERSION_1_0_3 +``` + +This is the default. + ### Selecting the LoRaWAN Region Configuration The library supports the following regions: @@ -210,7 +251,7 @@ The library requires that the compile environment or the project config file def MCCI BSPs add menu entries to the Arduino IDE so you can select the target region interactively. -The library changes configuration pretty substantially according to the region selected, and this affects the symbols in-scope in your sketches and cpp files. Some of the differences are listed below. This list is not comprehensive, and is subject to change in future major releases. +The library changes configuration pretty substantially according to the region selected, and this affects the symbols in-scope in your sketches and `.cpp` files. Some of the differences are listed below. This list is not comprehensive, and is subject to change in future major releases. #### eu868, as923, in866, kr920 diff --git a/src/lmic/config.h b/src/lmic/config.h index 29ffec52..c50ad363 100644 --- a/src/lmic/config.h +++ b/src/lmic/config.h @@ -199,4 +199,9 @@ # define LMIC_ENABLE_event_logging 0 /* PARAM */ #endif +// LMIC_LORAWAN_SPEC_VERSION +#if !defined(LMIC_LORAWAN_SPEC_VERSION) +# define LMIC_LORAWAN_SPEC_VERSION LMIC_LORAWAN_SPEC_VERSION_1_0_3 +#endif + #endif // _lmic_config_h_ diff --git a/src/lmic/lmic_config_preconditions.h b/src/lmic/lmic_config_preconditions.h index 6819cab4..7873447c 100644 --- a/src/lmic/lmic_config_preconditions.h +++ b/src/lmic/lmic_config_preconditions.h @@ -203,4 +203,13 @@ Revision history: #define CFG_LMIC_EU_like (!!(CFG_LMIC_REGION_MASK & CFG_LMIC_EU_like_MASK)) #define CFG_LMIC_US_like (!!(CFG_LMIC_REGION_MASK & CFG_LMIC_US_like_MASK)) +// +// The supported LMIC LoRaWAAN spec versions. These need to be numerically ordered, +// so that we can (for example) compare +// +// LMIC_LORAWAN_SPEC_VERSION < LMIC_LORAWAN_SPEC_VERSION_1_0_3. +// +#define LMIC_LORAWAN_SPEC_VERSION_1_0_2 0x01000200u +#define LMIC_LORAWAN_SPEC_VERSION_1_0_3 0x01000300u + #endif /* _LMIC_CONFIG_PRECONDITIONS_H_ */ diff --git a/src/lmic/lmic_us915.c b/src/lmic/lmic_us915.c index 8fb592fe..0d84ac13 100644 --- a/src/lmic/lmic_us915.c +++ b/src/lmic/lmic_us915.c @@ -68,7 +68,10 @@ uint8_t LMICus915_maxFrameLen(uint8_t dr) { } int8_t LMICus915_pow2dbm(uint8_t mcmd_ladr_p1) { - if ((mcmd_ladr_p1 & MCMD_LinkADRReq_POW_MASK) == MCMD_LinkADRReq_POW_MASK) + if ((mcmd_ladr_p1 & MCMD_LinkADRReq_POW_MASK) > + ((LMIC_LORAWAN_SPEC_VERSION < LMIC_LORAWAN_SPEC_VERSION_1_0_3) + ? US915_LinkAdrReq_POW_MAX_1_0_2 + : US915_LinkAdrReq_POW_MAX_1_0_3)) return -128; else return ((s1_t)(US915_TX_MAX_DBM - (((mcmd_ladr_p1)&MCMD_LinkADRReq_POW_MASK)<<1))); diff --git a/src/lmic/lorabase_us915.h b/src/lmic/lorabase_us915.h index 31bc61b1..ed960c6e 100644 --- a/src/lmic/lorabase_us915.h +++ b/src/lmic/lorabase_us915.h @@ -77,6 +77,12 @@ enum { // on an 64-channel bandplan. See code // that computes tx power. }; + +enum { + US915_LinkAdrReq_POW_MAX_1_0_2 = 0xA, + US915_LinkAdrReq_POW_MAX_1_0_3 = 0xE, +}; + enum { DR_PAGE_US915 = 0x10 * (LMIC_REGION_us915 - 1) }; enum { US915_LMIC_REGION_EIRP = 0 }; // region doesn't use EIRP, uses tx power From 540034cd2bc3373f2c05a17b2a9e13a0de1056d4 Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Wed, 2 Oct 2019 07:35:25 -0400 Subject: [PATCH 03/35] Fix #466: recognize TTGO and Heltec boards --- src/hal/getpinmap_thisboard.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hal/getpinmap_thisboard.cpp b/src/hal/getpinmap_thisboard.cpp index b975b08e..7c43b709 100644 --- a/src/hal/getpinmap_thisboard.cpp +++ b/src/hal/getpinmap_thisboard.cpp @@ -57,6 +57,8 @@ const HalPinmap_t *GetPinmap_ThisBoard(void) return GetPinmap_Catena4801(); #elif defined(PINNOCHIO_SCOUT) return GetPinmap_PinnochioScount(); +#elif defined(ARDUINO_HELTEC_WIFI_LORA_32_V2) || defined(ARDUINO_TTGO_LoRa32_V1) + return GetPinmap_ttgo_lora32_v1(); #else #pragma message("Board not supported -- use an explicit pinmap") return nullptr; From b86692b504398a1df6fbcaa6e026b45b13684aec Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Wed, 2 Oct 2019 07:43:54 -0400 Subject: [PATCH 04/35] Log rxsyms in compliance app --- .../compliance-otaa-halconfig/compliance-otaa-halconfig.ino | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/compliance-otaa-halconfig/compliance-otaa-halconfig.ino b/examples/compliance-otaa-halconfig/compliance-otaa-halconfig.ino index beae4cbd..0ea6e8f2 100644 --- a/examples/compliance-otaa-halconfig/compliance-otaa-halconfig.ino +++ b/examples/compliance-otaa-halconfig/compliance-otaa-halconfig.ino @@ -98,6 +98,7 @@ public: u2_t opmode; u2_t fcntDn; u2_t fcntUp; + u2_t rxsyms; rps_t rps; u1_t txChnl; u1_t datarate; @@ -134,6 +135,7 @@ public: pn->opmode = LMIC.opmode; pn->fcntDn = (u2_t) LMIC.seqnoDn; pn->fcntUp = (u2_t) LMIC.seqnoUp; + pn->rxsyms = LMIC.rxsyms; pn->rps = LMIC.rps; pn->txChnl = LMIC.txChnl; pn->datarate = LMIC.datarate; @@ -484,6 +486,7 @@ void eventPrint(cEventQueue::eventnode_t &e) { printOpmode(e.opmode); printTxend(e); Serial.print(F(", delta ms ")); Serial.print(osticks2ms(e.time - e.txend)); + Serial.print(F(", rxsyms=")); Serial.print(unsigned(e.rxsyms)); break; case EV_JOIN_TXCOMPLETE: From f4b239384f17955afd65ee3d2153b9076f8c09b7 Mon Sep 17 00:00:00 2001 From: Manuel Bl <10954524+manuelbl@users.noreply.github.com> Date: Sun, 6 Oct 2019 15:50:47 +0200 Subject: [PATCH 05/35] Fix Heltec v2 pinmap and add more Heltec pinmaps --- src/arduino_lmic_hal_boards.h | 3 +- src/hal/getpinmap_heltec_lora32.cpp | 80 +++++++++++++++++++++++++++++ src/hal/getpinmap_thisboard.cpp | 4 +- 3 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 src/hal/getpinmap_heltec_lora32.cpp diff --git a/src/arduino_lmic_hal_boards.h b/src/arduino_lmic_hal_boards.h index 170bbec3..7c84e6e5 100644 --- a/src/arduino_lmic_hal_boards.h +++ b/src/arduino_lmic_hal_boards.h @@ -35,7 +35,8 @@ const HalPinmap_t *GetPinmap_Catena4617(); const HalPinmap_t *GetPinmap_Catena4618(); const HalPinmap_t *GetPinmap_Catena4630(); const HalPinmap_t *GetPinmap_Catena4801(); -const HalPinmap_t* GetPinmap_ttgo_lora32_v1 (); +const HalPinmap_t* GetPinmap_ttgo_lora32_v1(); +const HalPinmap_t* GetPinmap_heltec_lora32(); const HalPinmap_t *GetPinmap_ThisBoard(); diff --git a/src/hal/getpinmap_heltec_lora32.cpp b/src/hal/getpinmap_heltec_lora32.cpp new file mode 100644 index 00000000..897907a5 --- /dev/null +++ b/src/hal/getpinmap_heltec_lora32.cpp @@ -0,0 +1,80 @@ +/* + +Module: getpinmap_heltec_lora32.cpp + +Function: + Arduino-LMIC C++ HAL pinmap for Heltec WiFi LoRa 32 (V1 & V2) and Heltec Wireless Stick + +Copyright & License: + See accompanying LICENSE file. + +Author: + Manuel Bleichenbacher, manuel.bleichenbacher@gmail.com October 2019 + +*/ + +#include +#include + +#include "../lmic/oslmic.h" + +// Note: The pin constants SS, RST_LoRa and DIOx are defined in pins_arduino.h +// (board-specific variant in Arduino core). Even if it won't be used, this +// file needs to compile for all other variants as well. +#if !defined(ARDUINO_HELTEC_WIFI_LORA_32) && !defined(ARDUINO_HELTEC_WIFI_LORA_32_V2) && !defined(ARDUINO_HELTEC_WIRELESS_STICK) +#undef SS +#undef RST_LoRa +#undef DIO0 +#undef DIO1 +#undef DIO2 +#define SS HalPinmap_t::UNUSED_PIN +#define RST_LoRa HalPinmap_t::UNUSED_PIN +#define DIO0 HalPinmap_t::UNUSED_PIN +#define DIO1 HalPinmap_t::UNUSED_PIN +#define DIO2 HalPinmap_t::UNUSED_PIN +#endif + + +namespace Arduino_LMIC +{ + +class HalConfiguration_heltec_lora32 : public HalConfiguration_t +{ +public: + enum DIGITAL_PINS : uint8_t + { + PIN_SX1276_NSS = SS, + PIN_SX1276_NRESET = RST_LoRa, + PIN_SX1276_DIO0 = DIO0, + PIN_SX1276_DIO1 = DIO1, + PIN_SX1276_DIO2 = DIO2, + PIN_SX1276_ANT_SWITCH_RX = HalPinmap_t::UNUSED_PIN, + PIN_SX1276_ANT_SWITCH_TX_BOOST = HalPinmap_t::UNUSED_PIN, + PIN_SX1276_ANT_SWITCH_TX_RFO = HalPinmap_t::UNUSED_PIN, + PIN_VDD_BOOST_ENABLE = HalPinmap_t::UNUSED_PIN, + }; +}; + +static HalConfiguration_heltec_lora32 myConfig; + +static const HalPinmap_t myPinmap = + { + .nss = HalConfiguration_heltec_lora32::PIN_SX1276_NSS, + .rxtx = HalConfiguration_heltec_lora32::PIN_SX1276_ANT_SWITCH_RX, + .rst = HalConfiguration_heltec_lora32::PIN_SX1276_NRESET, + .dio = { + HalConfiguration_heltec_lora32::PIN_SX1276_DIO0, + HalConfiguration_heltec_lora32::PIN_SX1276_DIO1, + HalConfiguration_heltec_lora32::PIN_SX1276_DIO2, + }, + .rxtx_rx_active = 0, + .rssi_cal = 10, + .spi_freq = 8000000, /* 8MHz */ + .pConfig = &myConfig}; + +const HalPinmap_t *GetPinmap_heltec_lora32(void) +{ + return &myPinmap; +} + +}; // namespace Arduino_LMIC diff --git a/src/hal/getpinmap_thisboard.cpp b/src/hal/getpinmap_thisboard.cpp index 7c43b709..044ca948 100644 --- a/src/hal/getpinmap_thisboard.cpp +++ b/src/hal/getpinmap_thisboard.cpp @@ -57,8 +57,10 @@ const HalPinmap_t *GetPinmap_ThisBoard(void) return GetPinmap_Catena4801(); #elif defined(PINNOCHIO_SCOUT) return GetPinmap_PinnochioScount(); -#elif defined(ARDUINO_HELTEC_WIFI_LORA_32_V2) || defined(ARDUINO_TTGO_LoRa32_V1) +#elif defined(ARDUINO_TTGO_LoRa32_V1) return GetPinmap_ttgo_lora32_v1(); +#elif defined(ARDUINO_HELTEC_WIFI_LORA_32) || defined(ARDUINO_HELTEC_WIFI_LORA_32_V2) || defined(ARDUINO_HELTEC_WIRELESS_STICK) + return GetPinmap_heltec_lora32(); #else #pragma message("Board not supported -- use an explicit pinmap") return nullptr; From 43b79c098edf9dc641a62fedb787691810869232 Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Thu, 31 Oct 2019 14:46:12 -0400 Subject: [PATCH 06/35] Improve documentation of events --- doc/LMIC-v3.0.99.docx | Bin 99142 -> 100177 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/LMIC-v3.0.99.docx b/doc/LMIC-v3.0.99.docx index df05e42ad3a0e779bde50185f9adfade921384d7..0b2d43e3292a7ee93dbc8ebc6bbb8f6a28b0bddc 100644 GIT binary patch delta 89726 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 TfdT+V90KCT$b5^89OZuiUvc}c delta 88732 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

    rBOiXJ>J$!-m3I#{IdN#vbnPCLQ>3!U+|? zS?C8*_SyMj@`jkKGfj0kc_-r6J;2#I?TZS%Sj8&?NLslVQ80SYT4bxj>a1i5KNvIxoh0JISWvApBbK zgE73~-J`=8AjPl>#xlnzkeW_WUt`0cI8k z;6aT8!D7Pz>hLME> z*tq`tC~z7Dh3Id76qE#Qz#kzbj~Bj9)-aMV00j(rks!wZi-Ot162k$HQQ=Oo_sC>C zzpoz1mZXs@`Om}AcLktWxmaqtySRD?Sh~2w*24i5^uJGCs3<531pi)AVGo#A1aiTI my Date: Wed, 27 Nov 2019 22:35:13 -0500 Subject: [PATCH 07/35] Add documentation on radio driver --- doc/RadioDriver.md | 116 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 doc/RadioDriver.md diff --git a/doc/RadioDriver.md b/doc/RadioDriver.md new file mode 100644 index 00000000..044d839f --- /dev/null +++ b/doc/RadioDriver.md @@ -0,0 +1,116 @@ +# Radio Driver parameters + + + + + + + +- [Common parameters](#common-parameters) + - [`LMIC.rps` (IN)](#lmicrps-in) + - [`LMIC.freq` (IN)](#lmicfreq-in) + - [`LMIC.saveIrqFlags` (OUT)](#lmicsaveirqflags-out) +- [Transmit parameters](#transmit-parameters) + - [`LMIC.radio_txpow` (IN)](#lmicradio_txpow-in) + - [`LMIC.frame[]` (IN)](#lmicframe-in) + - [`LMIC.datalen` (IN)](#lmicdatalen-in) + - [`LMIC.txend` (OUT)](#lmictxend-out) +- [Receive parameters](#receive-parameters) + - [LMIC.frame[] (OUT)](#lmicframe-out) + - [`LMIC.datalen` (OUT)](#lmicdatalen-out) + - [`LMIC.rxtime` (IN/OUT)](#lmicrxtime-inout) + - [`LMIC.lbt_ticks` (IN)](#lmiclbt_ticks-in) + - [`LMIC.lbt_dbmax` (IN)](#lmiclbt_dbmax-in) + - [`LMIC.rxsyms` (IN)](#lmicrxsyms-in) + - [`LMIC.noRXIQinversion` (IN)](#lmicnorxiqinversion-in) + - [`LMIC.snr` (OUT)](#lmicsnr-out) + - [`LMIC.rssi` (OUT)](#lmicrssi-out) + + + + + +## Common parameters + +### `LMIC.rps` (IN) + +This is the "radio parameter setting", and it encodes several radio settings. + +- Spreading factor: FSK or SF7..12 +- Bandwidth: 125, 250 or 500 kHz +- Coding Rate: 4/5, 4/6, 4/7 or 4/8. +- CRC enabled/disabled +- Implicit header mode on/off. (If on, receive length must be known in advance.) + +### `LMIC.freq` (IN) + +This specifies the frequency, in Hertz. + +### `LMIC.saveIrqFlags` (OUT) + +Updated for LoRa operations only; the IRQ flags at the time of interrupt. + +## Transmit parameters + +### `LMIC.radio_txpow` (IN) + +This specifies the transmit power in dBm. + +### `LMIC.frame[]` (IN) + +The array of data to be sent. + +### `LMIC.datalen` (IN) + +The length of the array to be sent. + +### `LMIC.txend` (OUT) + +The OS time at which the TX end interrupt was recognized. + +## Receive parameters + +### LMIC.frame[] (OUT) + +Filled with data received.. + +### `LMIC.datalen` (OUT) + +Set to number of bytes received in total. + +### `LMIC.rxtime` (IN/OUT) + +Input: When to start receiving, in OS tick time. + +Output: time of RXDONE interrupt. (FSK timeout doesn't currently set.) + +### `LMIC.lbt_ticks` (IN) + +How long to monitor for LBT, in OS ticks. + +### `LMIC.lbt_dbmax` (IN) + +Maximum RSSI on channel before transmit. + +### `LMIC.rxsyms` (IN) + +The timeout in symbols. + +### `LMIC.noRXIQinversion` (IN) + +If true, disable IQ inversion during receive. + +### `LMIC.snr` (OUT) + +Set to SNR * 4 after LoRa receive. (Set to 0 for FSK receive.) + +### `LMIC.rssi` (OUT) + +Set to RSSI + `RSSI_OFF` after LoRa receive. (Set to 0 for FSK receive; `RSSI_OFF` is 64.) You must subtract RSSI_OFF from `LMIC.rssi` to get the RSSI in dB. From 93539d9657b58008d55ff8066975c9a44c747e02 Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Wed, 27 Nov 2019 22:40:17 -0500 Subject: [PATCH 08/35] Fix #493: correct RSSI calcs; v3.0.99.6 --- src/lmic/lmic.h | 2 +- src/lmic/radio.c | 31 ++++++++++++++++++++++++++----- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/lmic/lmic.h b/src/lmic/lmic.h index d05d2c04..609a9c1c 100644 --- a/src/lmic/lmic.h +++ b/src/lmic/lmic.h @@ -105,7 +105,7 @@ extern "C"{ #define ARDUINO_LMIC_VERSION_CALC(major, minor, patch, local) \ (((major) << 24ul) | ((minor) << 16ul) | ((patch) << 8ul) | ((local) << 0ul)) -#define ARDUINO_LMIC_VERSION ARDUINO_LMIC_VERSION_CALC(3, 0, 99, 5) /* v3.0.99.5 */ +#define ARDUINO_LMIC_VERSION ARDUINO_LMIC_VERSION_CALC(3, 0, 99, 6) /* v3.0.99.6 */ #define ARDUINO_LMIC_VERSION_GET_MAJOR(v) \ (((v) >> 24u) & 0xFFu) diff --git a/src/lmic/radio.c b/src/lmic/radio.c index c97e3aae..c36f5b78 100644 --- a/src/lmic/radio.c +++ b/src/lmic/radio.c @@ -249,6 +249,14 @@ #define SX1276_RSSI_ADJUST_LF -164 // add to rssi value to get dB (LF) #define SX1276_RSSI_ADJUST_HF -157 // add to rssi value to get dB (HF) +#ifdef CFG_sx1276_radio +# define SX127X_RSSI_ADJUST_LF SX1276_RSSI_ADJUST_LF +# define SX127X_RSSI_ADJUST_HF SX1276_RSSI_ADJUST_HF +#else +# define SX127X_RSSI_ADJUST_LF SX1272_RSSI_ADJUST +# define SX127X_RSSI_ADJUST_HF SX1272_RSSI_ADJUST +#endif + // per datasheet 2.5.2 (but note that we ought to ask Semtech to confirm, because // datasheet is unclear). #define SX127X_RX_POWER_UP us2osticks(500) // delay this long to let the receiver power up. @@ -1240,9 +1248,21 @@ void radio_irq_handler_v2 (u1_t dio, ostime_t now) { readBuf(RegFifo, LMIC.frame, LMIC.dataLen); // read rx quality parameters LMIC.snr = readReg(LORARegPktSnrValue); // SNR [dB] * 4 - LMIC.rssi = readReg(LORARegPktRssiValue); - LMIC_X_DEBUG_PRINTF("RX snr=%u rssi=%d\n", LMIC.snr/4, SX127X_RSSI_ADJUST_HF + LMIC.rssi); - LMIC.rssi = LMIC.rssi - 125 + 64; // RSSI [dBm] (-196...+63) + s2_t rssi = readReg(LORARegPktRssiValue); + if (LMIC.freq > SX127X_FREQ_LF_MAX) + rssi -= SX127X_RSSI_ADJUST_HF; + else + rssi -= SX127X_RSSI_ADJUST_LF; + if (LMIC.snr < 0) + rssi = rssi - (-LMIC.snr >> 2); + else if (rssi > -100) { + s2_t rssiadj = (rssi * 16 + 7) / 15; + rssi += rssiadj; + } + + LMIC_X_DEBUG_PRINTF("RX snr=%u rssi=%d\n", LMIC.snr/4, rssi); + // ugh compatibility requires a biased range. RSSI + LMIC.rssi = (s1_t) (RSSI_OFF + (rssi < -196 ? -196 : rssi > 63 ? 63 : rssi)); // RSSI [dBm] (-196...+63) } else if( flags & IRQ_LORA_RXTOUT_MASK ) { // indicate timeout LMIC.dataLen = 0; @@ -1273,8 +1293,9 @@ void radio_irq_handler_v2 (u1_t dio, ostime_t now) { // now read the FIFO readBuf(RegFifo, LMIC.frame, LMIC.dataLen); // read rx quality parameters - LMIC.snr = 0; // determine snr - LMIC.rssi = 0; // determine rssi + LMIC.snr = 0; // SX127x doesn't give SNR for FSK. + LMIC.rssi = -64 + RSSI_OFF; // SX127x doesn't give packet RSSI for FSK, + // so substitute a dummy value. } else if( flags1 & IRQ_FSK1_TIMEOUT_MASK ) { // indicate timeout LMIC.dataLen = 0; From 1dcfbfa23ac9db12ce412032ce76e6121ab1ed7d Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Sat, 21 Dec 2019 21:12:38 -0500 Subject: [PATCH 09/35] Update RadioDriver.md docs --- doc/RadioDriver.md | 48 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 43 insertions(+), 5 deletions(-) diff --git a/doc/RadioDriver.md b/doc/RadioDriver.md index 044d839f..60d8533c 100644 --- a/doc/RadioDriver.md +++ b/doc/RadioDriver.md @@ -13,17 +13,23 @@ +- [Radio Driver Operation](#radio-driver-operation) + - [`os_radio(RADIO_RST)`](#os_radioradio_rst) + - [`os_radio(RADIO_TX)`](#os_radioradio_tx) + - [`os_radio(RADIO_RX)`](#os_radioradio_rx) + - [`os_radio(RADIO_RXON)`](#os_radioradio_rxon) - [Common parameters](#common-parameters) - [`LMIC.rps` (IN)](#lmicrps-in) - [`LMIC.freq` (IN)](#lmicfreq-in) - [`LMIC.saveIrqFlags` (OUT)](#lmicsaveirqflags-out) + - [`LMIC.osjob` (IN/OUT)](#lmicosjob-inout) - [Transmit parameters](#transmit-parameters) - [`LMIC.radio_txpow` (IN)](#lmicradio_txpow-in) - [`LMIC.frame[]` (IN)](#lmicframe-in) - [`LMIC.datalen` (IN)](#lmicdatalen-in) - [`LMIC.txend` (OUT)](#lmictxend-out) - [Receive parameters](#receive-parameters) - - [LMIC.frame[] (OUT)](#lmicframe-out) + - [`LMIC.frame[]` (OUT)](#lmicframe-out) - [`LMIC.datalen` (OUT)](#lmicdatalen-out) - [`LMIC.rxtime` (IN/OUT)](#lmicrxtime-inout) - [`LMIC.lbt_ticks` (IN)](#lmiclbt_ticks-in) @@ -37,6 +43,34 @@ +## Radio Driver Operation + +The LMIC radio driver operates asynchronously. Operations are started by calling the `os_radio()` function with a parameter describing the operation to be performed. + +Various parameters in the LMIC structure are as input to control the operation; others are updated to return results. + +### `os_radio(RADIO_RST)` + +The radio is reset, and put to sleep. This operation is synchronous. + +### `os_radio(RADIO_TX)` + +A frame is transmitted. The parameters are given in [common parameters](#common-parameters) and [transmit parameters](#transmit-parameters). + +When the operation completes, `LMIC.osjob` is scheduled. + +### `os_radio(RADIO_RX)` + +A single frame is received ad the specified time, and the radio is put back to sleep if no frame is found. + +When the operation completes, `LMIC.osjob` is scheduled. + +### `os_radio(RADIO_RXON)` + +The radio is placed in continuous receive mode. If a frame is received, `LMIC.osjob` is scheduled. Continuous receive is canceled by calling [`os_radio(RADIO_RST)`](#os_radioradio_rst). + +This operation is not supported in FSK mode. + ## Common parameters ### `LMIC.rps` (IN) @@ -57,6 +91,10 @@ This specifies the frequency, in Hertz. Updated for LoRa operations only; the IRQ flags at the time of interrupt. +### `LMIC.osjob` (IN/OUT) + +When asynchronous operations complete, `LMIC.osjob.func` is used as the callback function, and `LMIC.osjob` is used to schedule the work. + ## Transmit parameters ### `LMIC.radio_txpow` (IN) @@ -77,9 +115,9 @@ The OS time at which the TX end interrupt was recognized. ## Receive parameters -### LMIC.frame[] (OUT) +### `LMIC.frame[]` (OUT) -Filled with data received.. +Filled with data received. ### `LMIC.datalen` (OUT) @@ -89,7 +127,7 @@ Set to number of bytes received in total. Input: When to start receiving, in OS tick time. -Output: time of RXDONE interrupt. (FSK timeout doesn't currently set.) +Output: time of RXDONE interrupt. (Note: FSK timeout doesn't currently set this cell on RX timeout.) ### `LMIC.lbt_ticks` (IN) @@ -101,7 +139,7 @@ Maximum RSSI on channel before transmit. ### `LMIC.rxsyms` (IN) -The timeout in symbols. +The timeout in symbols. Only used for `os_radio(RADIO_RX)`; not used for continuous receive. ### `LMIC.noRXIQinversion` (IN) From 676dab875503cc31eaf9144cb245530aa454e785 Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Wed, 2 Oct 2019 07:46:01 -0400 Subject: [PATCH 10/35] For issue #467, assume 10-bit rxsyms (partial correction) --- src/lmic/radio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lmic/radio.c b/src/lmic/radio.c index c36f5b78..508b0a61 100644 --- a/src/lmic/radio.c +++ b/src/lmic/radio.c @@ -467,7 +467,7 @@ static void configLoraModem () { // set ModemConfig1 writeReg(LORARegModemConfig1, mc1); - mc2 = (SX1272_MC2_SF7 + ((sf-1)<<4)); + mc2 = (SX1272_MC2_SF7 + ((sf-1)<<4) + ((LMIC.rxsyms >> 8) & 0x3) ); if (getNocrc(LMIC.rps) == 0) { mc2 |= SX1276_MC2_RX_PAYLOAD_CRCON; } From d18c906e0a508dc4ec707406dc9be10083a12da7 Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Sun, 22 Dec 2019 18:25:46 -0500 Subject: [PATCH 11/35] Bump version to v3.0.99.7 --- src/lmic/lmic.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lmic/lmic.h b/src/lmic/lmic.h index 609a9c1c..53b08c65 100644 --- a/src/lmic/lmic.h +++ b/src/lmic/lmic.h @@ -105,7 +105,7 @@ extern "C"{ #define ARDUINO_LMIC_VERSION_CALC(major, minor, patch, local) \ (((major) << 24ul) | ((minor) << 16ul) | ((patch) << 8ul) | ((local) << 0ul)) -#define ARDUINO_LMIC_VERSION ARDUINO_LMIC_VERSION_CALC(3, 0, 99, 6) /* v3.0.99.6 */ +#define ARDUINO_LMIC_VERSION ARDUINO_LMIC_VERSION_CALC(3, 0, 99, 7) /* v3.0.99.7 */ #define ARDUINO_LMIC_VERSION_GET_MAJOR(v) \ (((v) >> 24u) & 0xFFu) From 01ef67b7c947c898b5c596fe60d8a0d4f590c89c Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Sun, 22 Dec 2019 18:28:02 -0500 Subject: [PATCH 12/35] Get rid of another ASSERT() in FSK path --- src/lmic/radio.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/lmic/radio.c b/src/lmic/radio.c index 508b0a61..f5d5bbe4 100644 --- a/src/lmic/radio.c +++ b/src/lmic/radio.c @@ -971,8 +971,14 @@ static void rxlora (u1_t rxmode) { } static void rxfsk (u1_t rxmode) { - // only single rx (no continuous scanning, no noise sampling) - ASSERT( rxmode == RXMODE_SINGLE ); + // only single or continuous rx (no noise sampling) + if (rxmode == RXMODE_SCAN) { + // indicate no bytes received. + LMIC.dataLen = 0; + // complete the request by scheduling the job. + os_setCallback(&LMIC.osjob, LMIC.osjob.func); + } + // select FSK modem (from sleep mode) //writeReg(RegOpMode, 0x00); // (not LoRa) opmodeFSK(); @@ -1003,8 +1009,12 @@ static void rxfsk (u1_t rxmode) { hal_pin_rxtx(0); // now instruct the radio to receive - hal_waitUntil(LMIC.rxtime); // busy wait until exact rx time - opmode(OPMODE_RX); // no single rx mode available in FSK + if (rxmode == RXMODE_SINGLE) { + hal_waitUntil(LMIC.rxtime); // busy wait until exact rx time + opmode(OPMODE_RX); // no single rx mode available in FSK + } else { + opmode(OPMODE_RX); + } } static void startrx (u1_t rxmode) { From b7b640dd3c30f9a94599386559cbd0d1f40f7296 Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Sun, 22 Dec 2019 18:29:38 -0500 Subject: [PATCH 13/35] Add logs with flags so we can diagnose timing probs --- src/lmic/radio.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/lmic/radio.c b/src/lmic/radio.c index f5d5bbe4..e258d5b9 100644 --- a/src/lmic/radio.c +++ b/src/lmic/radio.c @@ -773,6 +773,7 @@ static void txfsk () { hal_pin_rxtx(1); // now we actually start the transmission + LMICOS_logEventUint32("+Tx FSK", LMIC.dataLen); opmode(OPMODE_TX); } @@ -817,6 +818,7 @@ static void txlora () { hal_pin_rxtx(1); // now we actually start the transmission + LMICOS_logEventUint32("+Tx LoRa", LMIC.dataLen); opmode(OPMODE_TX); #if LMIC_DEBUG_LEVEL > 0 @@ -942,12 +944,14 @@ static void rxlora (u1_t rxmode) { // now instruct the radio to receive if (rxmode == RXMODE_SINGLE) { // single rx hal_waitUntil(LMIC.rxtime); // busy wait until exact rx time + LMICOS_logEvent("+Rx LoRa Single"); opmode(OPMODE_RX_SINGLE); #if LMIC_DEBUG_LEVEL > 0 ostime_t now = os_getTime(); LMIC_DEBUG_PRINTF("start single rx: now-rxtime: %"LMIC_PRId_ostime_t"\n", now - LMIC.rxtime); #endif } else { // continous rx (scan or rssi) + LMICOS_logEvent("+Rx LoRa Continuous"); opmode(OPMODE_RX); } @@ -1011,8 +1015,10 @@ static void rxfsk (u1_t rxmode) { // now instruct the radio to receive if (rxmode == RXMODE_SINGLE) { hal_waitUntil(LMIC.rxtime); // busy wait until exact rx time + LMICOS_logEvent("+Rx FSK"); opmode(OPMODE_RX); // no single rx mode available in FSK } else { + LMICOS_logEvent("+Rx FSK Continuous"); opmode(OPMODE_RX); } } @@ -1228,6 +1234,7 @@ void radio_irq_handler_v2 (u1_t dio, ostime_t now) { writeReg(LORARegFifoAddrPtr, 0x00); u1_t s = readReg(RegOpMode); u1_t c = readReg(LORARegModemConfig2); + LMICOS_logEventUint32("+Tx LoRa Continuous", (r << 8) + c); opmode(OPMODE_TX); return; #else /* ! CFG_TxContinuousMode */ @@ -1290,7 +1297,7 @@ void radio_irq_handler_v2 (u1_t dio, ostime_t now) { u1_t flags1 = readReg(FSKRegIrqFlags1); u1_t flags2 = readReg(FSKRegIrqFlags2); - LMICOS_logEventUint32("radio_irq_handler_v2: FSK", (flags2 << UINT32_C(8)) | flags1); + LMICOS_logEventUint32("*radio_irq_handler_v2: FSK", (flags2 << UINT32_C(8)) | flags1); if( flags2 & IRQ_FSK2_PACKETSENT_MASK ) { // save exact tx time From 4bae5fa291b1fb78dd00102d8376f9d8704d0824 Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Sun, 22 Dec 2019 19:24:32 -0500 Subject: [PATCH 14/35] Fix #467: make rxsyms a 2-byte value --- src/lmic/lmic.c | 28 +++++++++++++++++++--------- src/lmic/lmic.h | 6 +++--- src/lmic/lmic_bandplan.h | 2 +- src/lmic/radio.c | 16 ++++++++++++---- 4 files changed, 35 insertions(+), 17 deletions(-) diff --git a/src/lmic/lmic.c b/src/lmic/lmic.c index 7a1beecf..3e11a541 100644 --- a/src/lmic/lmic.c +++ b/src/lmic/lmic.c @@ -294,6 +294,16 @@ ostime_t calcAirTime (rps_t rps, u1_t plen) { // 500kHz | 0 1 2 3 4 5 // +static void setRxsyms (ostime_t rxsyms) { + if (rxsyms >= (1u << 10u)) { + LMIC.rxsyms = (1u << 10u) - 1; + } else if (rxsyms < 0) { + LMIC.rxsyms = 0; + } else { + LMIC.rxsyms = rxsyms; + } +} + #if !defined(DISABLE_BEACONS) static ostime_t calcRxWindow (u1_t secs, dr_t dr) { ostime_t rxoff, err; @@ -306,9 +316,9 @@ static ostime_t calcRxWindow (u1_t secs, dr_t dr) { rxoff = (LMIC.drift * (ostime_t)secs) >> BCN_INTV_exp; err = (LMIC.lastDriftDiff * (ostime_t)secs) >> BCN_INTV_exp; } - u1_t rxsyms = LMICbandplan_MINRX_SYMS_LoRa_ClassB; + u2_t rxsyms = LMICbandplan_MINRX_SYMS_LoRa_ClassB; err += (ostime_t)LMIC.maxDriftDiff * LMIC.missedBcns; - LMIC.rxsyms = LMICbandplan_MINRX_SYMS_LoRa_ClassB + (err / dr2hsym(dr)); + setRxsyms(LMICbandplan_MINRX_SYMS_LoRa_ClassB + (err / dr2hsym(dr))); return (rxsyms-LMICbandplan_PAMBL_SYMS) * dr2hsym(dr) + rxoff; } @@ -1434,16 +1444,16 @@ ostime_t LMICcore_adjustForDrift (ostime_t delay, ostime_t hsym) { // adjust rxsyms (the size of the window in syms) according to our // uncertainty. do this in a strange order to avoid a divide if we can. // rely on hsym = Tsym / 2 - if ((255 - LMIC.rxsyms) * hsym < drift) { - LMIC.rxsyms = 255; + if ((1023 - LMIC.rxsyms) * hsym < drift) { + LMIC.rxsyms = 1023; } else { - LMIC.rxsyms = (u1_t) (LMIC.rxsyms + drift / hsym); + LMIC.rxsyms = (u2_t) (LMIC.rxsyms + drift / hsym); } } return delay; } -ostime_t LMICcore_RxWindowOffset (ostime_t hsym, u1_t rxsyms_in) { +ostime_t LMICcore_RxWindowOffset (ostime_t hsym, u2_t rxsyms_in) { ostime_t const Tsym = 2 * hsym; ostime_t rxsyms; ostime_t rxoffset; @@ -1452,7 +1462,7 @@ ostime_t LMICcore_RxWindowOffset (ostime_t hsym, u1_t rxsyms_in) { if (rxsyms < rxsyms_in) { rxsyms = rxsyms_in; } - LMIC.rxsyms = (u1_t) rxsyms; + setRxsyms(rxsyms); rxoffset = (8 - rxsyms) * hsym - LMICbandplan_RX_EXTRA_MARGIN_osticks; @@ -1498,9 +1508,9 @@ static void txDone (ostime_t delay, osjobcb_t func) { // change params and rps (US only) before we increment txChnl LMICbandplan_setRx1Params(); - // LMIC.rxsyms carries the TX datarate (can be != LMIC.datarate [confirm retries etc.]) + // LMIC.dndr carries the TX datarate (can be != LMIC.datarate [confirm retries etc.]) // Setup receive - LMIC.rxtime is preloaded with 1.5 symbols offset to tune - // into the middle of the 8 symbols preamble. + // into the middle of the 8 symbols preamble. if( LMICbandplan_isFSK() ) { LMICbandplan_txDoneFSK(delay, func); } diff --git a/src/lmic/lmic.h b/src/lmic/lmic.h index 53b08c65..fbd39160 100644 --- a/src/lmic/lmic.h +++ b/src/lmic/lmic.h @@ -188,7 +188,7 @@ struct rxsched_t { u1_t dr; u1_t intvExp; // 0..7 u1_t slot; // runs from 0 to 128 - u1_t rxsyms; + u2_t rxsyms; ostime_t rxbase; ostime_t rxtime; // start of next spot u4_t freq; @@ -498,13 +498,14 @@ struct lmic_t { s2_t drift; // last measured drift s2_t lastDriftDiff; s2_t maxDriftDiff; + u2_t bcnRxsyms; // #endif /* (u)int8_t things */ lmic_engine_update_state_t engineUpdateState; // state of the engineUpdate() evaluator. s1_t rssi; s1_t snr; // LMIC.snr is SNR times 4 - u1_t rxsyms; + u2_t rxsyms; // symbols for receive timeout. u1_t dndr; s1_t txpow; // transmit dBm (administrative) s1_t radio_txpow; // the radio driver's copy of txpow, in dB limited by adrTxPow, and @@ -586,7 +587,6 @@ struct lmic_t { #if !defined(DISABLE_BEACONS) u1_t bcnChnl; - u1_t bcnRxsyms; // #endif u1_t noRXIQinversion; diff --git a/src/lmic/lmic_bandplan.h b/src/lmic/lmic_bandplan.h index 74efc619..8b3a4540 100644 --- a/src/lmic/lmic_bandplan.h +++ b/src/lmic/lmic_bandplan.h @@ -227,6 +227,6 @@ ostime_t LMICcore_rndDelay(u1_t secSpan); void LMICcore_setDrJoin(u1_t reason, u1_t dr); ostime_t LMICcore_adjustForDrift(ostime_t delay, ostime_t hsym); -ostime_t LMICcore_RxWindowOffset(ostime_t hsym, u1_t rxsyms_in); +ostime_t LMICcore_RxWindowOffset(ostime_t hsym, u2_t rxsyms_in); #endif // _lmic_bandplan_h_ diff --git a/src/lmic/radio.c b/src/lmic/radio.c index e258d5b9..5bb07da5 100644 --- a/src/lmic/radio.c +++ b/src/lmic/radio.c @@ -471,6 +471,11 @@ static void configLoraModem () { if (getNocrc(LMIC.rps) == 0) { mc2 |= SX1276_MC2_RX_PAYLOAD_CRCON; } +#if CFG_TxContinuousMode + // Only for testing + // set ModemConfig2 (sf, TxContinuousMode=1, AgcAutoOn=1 SymbTimeoutHi=00) + mc2 |= 0x8; +#endif writeReg(LORARegModemConfig2, mc2); mc3 = SX1276_MC3_AGCAUTO; @@ -527,15 +532,18 @@ static void configLoraModem () { // set ModemConfig1 writeReg(LORARegModemConfig1, mc1); - // set ModemConfig2 (sf, AgcAutoOn=1 SymbTimeoutHi=00) - writeReg(LORARegModemConfig2, (SX1272_MC2_SF7 + ((sf-1)<<4)) | 0x04); + // set ModemConfig2 (sf, AgcAutoOn=1 SymbTimeoutHi) + u1_t mc2; + mc2 = (SX1272_MC2_SF7 + ((sf-1)<<4)) | 0x04 | ((LMIC.rxsyms >> 8) & 0x3)); #if CFG_TxContinuousMode // Only for testing // set ModemConfig2 (sf, TxContinuousMode=1, AgcAutoOn=1 SymbTimeoutHi=00) - writeReg(LORARegModemConfig2, (SX1272_MC2_SF7 + ((sf-1)<<4)) | 0x06); + mc2 |= 0x8; #endif + writeReg(LORARegModemConfig2, mc2); + #else #error Missing CFG_sx1272_radio/CFG_sx1276_radio #endif /* CFG_sx1272_radio */ @@ -924,7 +932,7 @@ static void rxlora (u1_t rxmode) { } // set symbol timeout (for single rx) - writeReg(LORARegSymbTimeoutLsb, LMIC.rxsyms); + writeReg(LORARegSymbTimeoutLsb, (uint8_t) LMIC.rxsyms); // set sync word writeReg(LORARegSyncWord, LORA_MAC_PREAMBLE); From 044807a9587673928658d59be0e36bbcadf0af99 Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Sun, 22 Dec 2019 21:19:28 -0500 Subject: [PATCH 15/35] Since there are multiple rxmodes, log the value --- src/lmic/radio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lmic/radio.c b/src/lmic/radio.c index 5bb07da5..8a1a1d44 100644 --- a/src/lmic/radio.c +++ b/src/lmic/radio.c @@ -959,7 +959,7 @@ static void rxlora (u1_t rxmode) { LMIC_DEBUG_PRINTF("start single rx: now-rxtime: %"LMIC_PRId_ostime_t"\n", now - LMIC.rxtime); #endif } else { // continous rx (scan or rssi) - LMICOS_logEvent("+Rx LoRa Continuous"); + LMICOS_logEventUint32("+Rx LoRa Continuous", rxmode); opmode(OPMODE_RX); } From b912a44aa13f0199248486af182696d0ab74359d Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Mon, 23 Dec 2019 13:16:08 -0500 Subject: [PATCH 16/35] Change type of rxsyms to rxsyms_t --- .../compliance-otaa-halconfig.ino | 2 +- src/lmic/lmic.c | 6 +++--- src/lmic/lmic.h | 8 ++++---- src/lmic/lmic_bandplan.h | 2 +- src/lmic/lorabase.h | 1 + 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/examples/compliance-otaa-halconfig/compliance-otaa-halconfig.ino b/examples/compliance-otaa-halconfig/compliance-otaa-halconfig.ino index 0ea6e8f2..00e3f6e9 100644 --- a/examples/compliance-otaa-halconfig/compliance-otaa-halconfig.ino +++ b/examples/compliance-otaa-halconfig/compliance-otaa-halconfig.ino @@ -98,7 +98,7 @@ public: u2_t opmode; u2_t fcntDn; u2_t fcntUp; - u2_t rxsyms; + rxsyms_t rxsyms; rps_t rps; u1_t txChnl; u1_t datarate; diff --git a/src/lmic/lmic.c b/src/lmic/lmic.c index 3e11a541..55949f20 100644 --- a/src/lmic/lmic.c +++ b/src/lmic/lmic.c @@ -316,7 +316,7 @@ static ostime_t calcRxWindow (u1_t secs, dr_t dr) { rxoff = (LMIC.drift * (ostime_t)secs) >> BCN_INTV_exp; err = (LMIC.lastDriftDiff * (ostime_t)secs) >> BCN_INTV_exp; } - u2_t rxsyms = LMICbandplan_MINRX_SYMS_LoRa_ClassB; + rxsyms_t rxsyms = LMICbandplan_MINRX_SYMS_LoRa_ClassB; err += (ostime_t)LMIC.maxDriftDiff * LMIC.missedBcns; setRxsyms(LMICbandplan_MINRX_SYMS_LoRa_ClassB + (err / dr2hsym(dr))); @@ -1447,13 +1447,13 @@ ostime_t LMICcore_adjustForDrift (ostime_t delay, ostime_t hsym) { if ((1023 - LMIC.rxsyms) * hsym < drift) { LMIC.rxsyms = 1023; } else { - LMIC.rxsyms = (u2_t) (LMIC.rxsyms + drift / hsym); + LMIC.rxsyms = (rxsyms_t) (LMIC.rxsyms + drift / hsym); } } return delay; } -ostime_t LMICcore_RxWindowOffset (ostime_t hsym, u2_t rxsyms_in) { +ostime_t LMICcore_RxWindowOffset (ostime_t hsym, rxsyms_t rxsyms_in) { ostime_t const Tsym = 2 * hsym; ostime_t rxsyms; ostime_t rxoffset; diff --git a/src/lmic/lmic.h b/src/lmic/lmic.h index fbd39160..564d9aff 100644 --- a/src/lmic/lmic.h +++ b/src/lmic/lmic.h @@ -185,10 +185,10 @@ enum { KEEP_TXPOW = -128 }; #if !defined(DISABLE_PING) //! \internal struct rxsched_t { - u1_t dr; + dr_t dr; u1_t intvExp; // 0..7 u1_t slot; // runs from 0 to 128 - u2_t rxsyms; + rxsyms_t rxsyms; ostime_t rxbase; ostime_t rxtime; // start of next spot u4_t freq; @@ -498,14 +498,14 @@ struct lmic_t { s2_t drift; // last measured drift s2_t lastDriftDiff; s2_t maxDriftDiff; - u2_t bcnRxsyms; // + rxsyms_t bcnRxsyms; // #endif /* (u)int8_t things */ lmic_engine_update_state_t engineUpdateState; // state of the engineUpdate() evaluator. s1_t rssi; s1_t snr; // LMIC.snr is SNR times 4 - u2_t rxsyms; // symbols for receive timeout. + rxsyms_t rxsyms; // symbols for receive timeout. u1_t dndr; s1_t txpow; // transmit dBm (administrative) s1_t radio_txpow; // the radio driver's copy of txpow, in dB limited by adrTxPow, and diff --git a/src/lmic/lmic_bandplan.h b/src/lmic/lmic_bandplan.h index 8b3a4540..ca69ce77 100644 --- a/src/lmic/lmic_bandplan.h +++ b/src/lmic/lmic_bandplan.h @@ -227,6 +227,6 @@ ostime_t LMICcore_rndDelay(u1_t secSpan); void LMICcore_setDrJoin(u1_t reason, u1_t dr); ostime_t LMICcore_adjustForDrift(ostime_t delay, ostime_t hsym); -ostime_t LMICcore_RxWindowOffset(ostime_t hsym, u2_t rxsyms_in); +ostime_t LMICcore_RxWindowOffset(ostime_t hsym, rxsyms_t rxsyms_in); #endif // _lmic_bandplan_h_ diff --git a/src/lmic/lorabase.h b/src/lmic/lorabase.h index 873658b2..8256bcf9 100644 --- a/src/lmic/lorabase.h +++ b/src/lmic/lorabase.h @@ -44,6 +44,7 @@ typedef u1_t cr_t; typedef u1_t sf_t; typedef u1_t bw_t; typedef u1_t dr_t; +typedef u2_t rxsyms_t; // Radio parameter set (encodes SF/BW/CR/IH/NOCRC) // 2..0: Spreading factor From f213c432ac696dc296d1522a4045314fc2baa8a6 Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Mon, 23 Dec 2019 21:42:30 -0500 Subject: [PATCH 17/35] Fix #502: add os_radio(RADIO_TX_AT), version is 3.0.99.8 --- doc/RadioDriver.md | 10 ++++++++-- src/lmic/lmic.h | 4 ++-- src/lmic/radio.c | 11 +++++++++++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/doc/RadioDriver.md b/doc/RadioDriver.md index 60d8533c..1473e613 100644 --- a/doc/RadioDriver.md +++ b/doc/RadioDriver.md @@ -71,6 +71,10 @@ The radio is placed in continuous receive mode. If a frame is received, `LMIC.os This operation is not supported in FSK mode. +### `os_radio(RADIO_TX_AT)` + +This is like `os_radio(RADIO_TX)`, but the transmission is scheduled at `LMIC.txend`. + ## Common parameters ### `LMIC.rps` (IN) @@ -109,9 +113,11 @@ The array of data to be sent. The length of the array to be sent. -### `LMIC.txend` (OUT) +### `LMIC.txend` (IN, OUT) + +For `RADIO_TX_AT`, an input parameter, for the scheduled TX time. -The OS time at which the TX end interrupt was recognized. +For all transmissions, updated to the OS time at which the TX end interrupt was recognized. ## Receive parameters diff --git a/src/lmic/lmic.h b/src/lmic/lmic.h index 564d9aff..f12ffcf1 100644 --- a/src/lmic/lmic.h +++ b/src/lmic/lmic.h @@ -105,7 +105,7 @@ extern "C"{ #define ARDUINO_LMIC_VERSION_CALC(major, minor, patch, local) \ (((major) << 24ul) | ((minor) << 16ul) | ((patch) << 8ul) | ((local) << 0ul)) -#define ARDUINO_LMIC_VERSION ARDUINO_LMIC_VERSION_CALC(3, 0, 99, 7) /* v3.0.99.7 */ +#define ARDUINO_LMIC_VERSION ARDUINO_LMIC_VERSION_CALC(3, 0, 99, 8) /* v3.0.99.8 */ #define ARDUINO_LMIC_VERSION_GET_MAJOR(v) \ (((v) >> 24u) & 0xFFu) @@ -219,7 +219,7 @@ struct bcninfo_t { #endif // !DISABLE_BEACONS // purpose of receive window - lmic_t.rxState -enum { RADIO_RST=0, RADIO_TX=1, RADIO_RX=2, RADIO_RXON=3 }; +enum { RADIO_RST=0, RADIO_TX=1, RADIO_RX=2, RADIO_RXON=3, RADIO_TX_AT=4, }; // Netid values / lmic_t.netid enum { NETID_NONE=(int)~0U, NETID_MASK=(int)0xFFFFFF }; // MAC operation modes (lmic_t.opmode). diff --git a/src/lmic/radio.c b/src/lmic/radio.c index 8a1a1d44..74346c49 100644 --- a/src/lmic/radio.c +++ b/src/lmic/radio.c @@ -781,6 +781,8 @@ static void txfsk () { hal_pin_rxtx(1); // now we actually start the transmission + if (LMIC.txend) + hal_waitUntil(LMIC.txend); // busy wait until exact rx time LMICOS_logEventUint32("+Tx FSK", LMIC.dataLen); opmode(OPMODE_TX); } @@ -826,6 +828,8 @@ static void txlora () { hal_pin_rxtx(1); // now we actually start the transmission + if (LMIC.txend) + hal_waitUntil(LMIC.txend); // busy wait until exact rx time LMICOS_logEventUint32("+Tx LoRa", LMIC.dataLen); opmode(OPMODE_TX); @@ -1350,9 +1354,16 @@ void os_radio (u1_t mode) { case RADIO_TX: // transmit frame now + LMIC.txend = 0; starttx(); // buf=LMIC.frame, len=LMIC.dataLen break; + case RADIO_TX_AT: + if (LMIC.txend == 0) + LMIC.txend = 1; + starttx(); + break; + case RADIO_RX: // receive frame now (exactly at rxtime) startrx(RXMODE_SINGLE); // buf=LMIC.frame, time=LMIC.rxtime, timeout=LMIC.rxsyms From 5933c6415046f12bb6fa0a34249c49b6e9995e8a Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Fri, 27 Dec 2019 14:34:53 -0500 Subject: [PATCH 18/35] Fix #493: further correct RSSI calcs (sign error, fix non-linearity correction) --- src/lmic/radio.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/lmic/radio.c b/src/lmic/radio.c index 74346c49..ecf5c5af 100644 --- a/src/lmic/radio.c +++ b/src/lmic/radio.c @@ -1277,16 +1277,17 @@ void radio_irq_handler_v2 (u1_t dio, ostime_t now) { readBuf(RegFifo, LMIC.frame, LMIC.dataLen); // read rx quality parameters LMIC.snr = readReg(LORARegPktSnrValue); // SNR [dB] * 4 - s2_t rssi = readReg(LORARegPktRssiValue); + u1_t const rRssi = readReg(LORARegPktRssiValue); + s2_t rssi = rRssi; if (LMIC.freq > SX127X_FREQ_LF_MAX) - rssi -= SX127X_RSSI_ADJUST_HF; + rssi += SX127X_RSSI_ADJUST_HF; else - rssi -= SX127X_RSSI_ADJUST_LF; + rssi += SX127X_RSSI_ADJUST_LF; if (LMIC.snr < 0) rssi = rssi - (-LMIC.snr >> 2); else if (rssi > -100) { - s2_t rssiadj = (rssi * 16 + 7) / 15; - rssi += rssiadj; + // correct nonlinearity -- this is the same as multiplying rRssi * 16/15 initially. + rssi += (rRssi / 15); } LMIC_X_DEBUG_PRINTF("RX snr=%u rssi=%d\n", LMIC.snr/4, rssi); From e59c1234af435c5b97adab052f8cd56e9d9522eb Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Fri, 27 Dec 2019 15:51:55 -0500 Subject: [PATCH 19/35] Version is v3.0.99.9 --- src/lmic/lmic.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lmic/lmic.h b/src/lmic/lmic.h index f12ffcf1..f0080752 100644 --- a/src/lmic/lmic.h +++ b/src/lmic/lmic.h @@ -105,7 +105,7 @@ extern "C"{ #define ARDUINO_LMIC_VERSION_CALC(major, minor, patch, local) \ (((major) << 24ul) | ((minor) << 16ul) | ((patch) << 8ul) | ((local) << 0ul)) -#define ARDUINO_LMIC_VERSION ARDUINO_LMIC_VERSION_CALC(3, 0, 99, 8) /* v3.0.99.8 */ +#define ARDUINO_LMIC_VERSION ARDUINO_LMIC_VERSION_CALC(3, 0, 99, 9) /* v3.0.99.9 */ #define ARDUINO_LMIC_VERSION_GET_MAJOR(v) \ (((v) >> 24u) & 0xFFu) From 9671dea56a8942c1d2bb03521e5e4a93fe5a0cfe Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Sat, 28 Dec 2019 17:34:35 -0500 Subject: [PATCH 20/35] Part of fix #442: Detect late RX/TX launches; improve HAL timing a bit --- src/hal/hal.cpp | 24 +++++++++++++++++++----- src/lmic/hal.h | 5 +++-- src/lmic/lmic.h | 29 +++++++++++++++++++++++++++++ src/lmic/radio.c | 35 +++++++++++++++++++++++++++-------- 4 files changed, 78 insertions(+), 15 deletions(-) diff --git a/src/hal/hal.cpp b/src/hal/hal.cpp index 6b7bfd43..fa7cafb6 100644 --- a/src/hal/hal.cpp +++ b/src/hal/hal.cpp @@ -248,16 +248,30 @@ static s4_t delta_time(u4_t time) { return (s4_t)(time - hal_ticks()); } -void hal_waitUntil (u4_t time) { +u4_t hal_waitUntil (u4_t time) { s4_t delta = delta_time(time); + // check for already too late. + if (delta < 0) + return -delta; + // From delayMicroseconds docs: Currently, the largest value that - // will produce an accurate delay is 16383. - while (delta > (16000 / US_PER_OSTICK)) { - delay(16); - delta -= (16000 / US_PER_OSTICK); + // will produce an accurate delay is 16383. Also, STM32 does a better + // job with delay is less than 10,000 us; so reduce in steps. + while (delta > (9000 / US_PER_OSTICK)) { + // deliberately delay 8ms rather than 9ms, so we + // will exit loop with delta typically positive. + // Depends on BSP keeping time accurately even if interrupts + // are disabled. + delay(8); + // re-synchronize. + delta = delta_time(time); } if (delta > 0) delayMicroseconds(delta * US_PER_OSTICK); + + // we aren't "late". Callers are interested in gross delays, not + // necessarily delays due to poor timekeeping here. + return 0; } // check and rewind for target time diff --git a/src/lmic/hal.h b/src/lmic/hal.h index 00a6e585..ac09089d 100644 --- a/src/lmic/hal.h +++ b/src/lmic/hal.h @@ -110,9 +110,10 @@ void hal_sleep (void); u4_t hal_ticks (void); /* - * busy-wait until specified timestamp (in ticks) is reached. + * busy-wait until specified timestamp (in ticks) is reached. If on-time, return 0, + * otherwise return the number of ticks we were late. */ -void hal_waitUntil (u4_t time); +u4_t hal_waitUntil (u4_t time); /* * check and rewind timer for target time. diff --git a/src/lmic/lmic.h b/src/lmic/lmic.h index f0080752..daeda411 100644 --- a/src/lmic/lmic.h +++ b/src/lmic/lmic.h @@ -417,6 +417,32 @@ struct lmic_client_data_s { /* +Structure: lmic_radio_data_t + +Function: + Holds LMIC radio driver. + +Description: + Eventually this will be used for all portable things for the radio driver, + but for now it's where we can start to add things. + +*/ + +typedef struct lmic_radio_data_s lmic_radio_data_t; + +struct lmic_radio_data_s { + // total os ticks of accumulated delay error. Can overflow! + ostime_t rxlate_ticks; + // number of rx late launches. + unsigned rxlate_count; + // total os ticks of accumulated tx delay error. Can overflow! + ostime_t txlate_ticks; + // number of tx late launches. + unsigned txlate_count; +}; + +/* + Structure: lmic_t Function: @@ -439,6 +465,9 @@ struct lmic_t { rxsched_t ping; // pingable setup #endif + // the radio driver portable context + lmic_radio_data_t radio; + /* (u)int32_t things */ // Radio settings TX/RX (also accessed by HAL) diff --git a/src/lmic/radio.c b/src/lmic/radio.c index ecf5c5af..dbfc81f9 100644 --- a/src/lmic/radio.c +++ b/src/lmic/radio.c @@ -781,8 +781,13 @@ static void txfsk () { hal_pin_rxtx(1); // now we actually start the transmission - if (LMIC.txend) - hal_waitUntil(LMIC.txend); // busy wait until exact rx time + if (LMIC.txend) { + u4_t nLate = hal_waitUntil(LMIC.txend); // busy wait until exact tx time + if (nLate > 0) { + LMIC.radio.txlate_ticks += nLate; + ++LMIC.radio.txlate_count; + } + } LMICOS_logEventUint32("+Tx FSK", LMIC.dataLen); opmode(OPMODE_TX); } @@ -828,8 +833,13 @@ static void txlora () { hal_pin_rxtx(1); // now we actually start the transmission - if (LMIC.txend) - hal_waitUntil(LMIC.txend); // busy wait until exact rx time + if (LMIC.txend) { + u4_t nLate = hal_waitUntil(LMIC.txend); // busy wait until exact tx time + if (nLate) { + LMIC.radio.txlate_ticks += nLate; + ++LMIC.radio.txlate_count; + } + } LMICOS_logEventUint32("+Tx LoRa", LMIC.dataLen); opmode(OPMODE_TX); @@ -955,9 +965,14 @@ static void rxlora (u1_t rxmode) { // now instruct the radio to receive if (rxmode == RXMODE_SINGLE) { // single rx - hal_waitUntil(LMIC.rxtime); // busy wait until exact rx time - LMICOS_logEvent("+Rx LoRa Single"); + u4_t nLate = hal_waitUntil(LMIC.rxtime); // busy wait until exact rx time + LMICOS_logEventUint32("+Rx LoRa Single", nLate); opmode(OPMODE_RX_SINGLE); + if (nLate) + { + ++LMIC.radio.rxlate_count; + LMIC.radio.rxlate_ticks += nLate; + } #if LMIC_DEBUG_LEVEL > 0 ostime_t now = os_getTime(); LMIC_DEBUG_PRINTF("start single rx: now-rxtime: %"LMIC_PRId_ostime_t"\n", now - LMIC.rxtime); @@ -1026,9 +1041,13 @@ static void rxfsk (u1_t rxmode) { // now instruct the radio to receive if (rxmode == RXMODE_SINGLE) { - hal_waitUntil(LMIC.rxtime); // busy wait until exact rx time - LMICOS_logEvent("+Rx FSK"); + u4_t nLate = hal_waitUntil(LMIC.rxtime); // busy wait until exact rx time + LMICOS_logEventUint32("+Rx FSK", nLate); opmode(OPMODE_RX); // no single rx mode available in FSK + if (nLate) { + LMIC.radio.rxlate_ticks += nLate; + ++LMIC.radio.rxlate_count; + } } else { LMICOS_logEvent("+Rx FSK Continuous"); opmode(OPMODE_RX); From a4044c0ff4eb5d5ba4a373f09a8f0a23f79c7a8a Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Sat, 28 Dec 2019 17:41:46 -0500 Subject: [PATCH 21/35] Partial Fix #442: clean up window calculations based on lab study --- src/lmic/config.h | 8 ++++ src/lmic/lmic.c | 91 ++++++++++++++++++++++++---------------- src/lmic/lmic.h | 15 +++++++ src/lmic/lmic_bandplan.h | 3 +- src/lmic/lmic_eu_like.c | 7 ++-- 5 files changed, 83 insertions(+), 41 deletions(-) diff --git a/src/lmic/config.h b/src/lmic/config.h index c50ad363..8673b46a 100644 --- a/src/lmic/config.h +++ b/src/lmic/config.h @@ -204,4 +204,12 @@ # define LMIC_LORAWAN_SPEC_VERSION LMIC_LORAWAN_SPEC_VERSION_1_0_3 #endif +// LMIC_ENABLE_arbitrary_clock_error +// We normally don't want to allow users to set wide clock errors, because +// we assume reasonably-disciplined os_getTime() values. But... there might +// be platforms that require wider errors. +#if !defined(LMIC_ENABLE_arbitrary_clock_error) +# define LMIC_ENABLE_arbitrary_clock_error 0 /* PARAM */ +#endif + #endif // _lmic_config_h_ diff --git a/src/lmic/lmic.c b/src/lmic/lmic.c index 55949f20..78e8397b 100644 --- a/src/lmic/lmic.c +++ b/src/lmic/lmic.c @@ -1430,43 +1430,63 @@ static void setupRx2 (void) { radioRx(); } -ostime_t LMICcore_adjustForDrift (ostime_t delay, ostime_t hsym) { - if (LMIC.client.clockError != 0) { - // Calculate how much the clock will drift maximally after delay has - // passed. This indicates the amount of time we can be early - // _or_ late. - ostime_t drift = (int64_t)delay * LMIC.client.clockError / MAX_CLOCK_ERROR; - - // Increase the receive window by twice the maximum drift (to - // compensate for a slow or a fast clock). - delay -= drift; - - // adjust rxsyms (the size of the window in syms) according to our - // uncertainty. do this in a strange order to avoid a divide if we can. - // rely on hsym = Tsym / 2 - if ((1023 - LMIC.rxsyms) * hsym < drift) { - LMIC.rxsyms = 1023; - } else { - LMIC.rxsyms = (rxsyms_t) (LMIC.rxsyms + drift / hsym); +//! \brief Adjust the delay (in ticks) of the target window-open time from nominal. +//! \param hsym the duration of one-half symbol in osticks. +//! \param rxsyms_in the nominal window length -- minimum length of time to delay. +//! \return Effective delay to use (positive for later, negative for earlier). +//! \post LMIC.rxsyms is set to the number of rxsymbols to be used for preamble timeout. +//! \bug For FSK, the radio driver ignores LMIC.rxsysms, and uses a fixed value of 4080 bits +//! (81 ms) +//! +//! \details The calculation of the RX Window opening time has to balance several things. +//! The system clock might be inaccurate. Generally, the LMIC assumes that the timebase +//! is accurage to 100 ppm, or 0.01%. 0.01% of a 6 second window is 600 microseconds. +//! For LoRa, the fastest data rates of interest is SF7 (1024 us/symbol); with an 8-byte +//! preamble, the shortest preamble is 8.092ms long. If using FSK, the symbol rate is +//! 20 microseconds, but the preamble is 8*5 bits long, so the preamble is 800 microseconds. +//! If the user has not set the clock error, an error of 0.01% is assumed. +ostime_t LMICcore_adjustForDrift (ostime_t delay, ostime_t hsym, rxsyms_t rxsyms_in) { + ostime_t rxoffset; + + // decide if we want to move left or right of the reference time. + rxoffset = -LMICbandplan_RX_EXTRA_MARGIN_osticks; + + u2_t clockerr = LMIC.client.clockError; + + // Most crystal oscillators are 100 ppm. If things are that tight, there's + // no point in specifying a drift, as 6 seconds at 100ppm is +/- 600 microseconds. + // We position the windows at the front, and there's some extra margin, so... + // don't bother setting values <= 100 ppm. + if (clockerr != 0) + { + // client has set clock error. Limit this to 0.1% unless there's + // a compile-time configuration. (In other words, assume that millis() + // clock is accurate to 0.1%.) You should never use clockerror to + // compensate for system-late problems. + u2_t const maxError = LMIC_kMaxClockError_ppm * MAX_CLOCK_ERROR / (1000 * 1000); + if (! LMIC_ENABLE_arbitrary_clock_error && clockerr > maxError) + { + clockerr = maxError; + } } - } - return delay; -} -ostime_t LMICcore_RxWindowOffset (ostime_t hsym, rxsyms_t rxsyms_in) { - ostime_t const Tsym = 2 * hsym; - ostime_t rxsyms; - ostime_t rxoffset; + // If the clock is slow, the window needs to open earlier in our time + // in order to open at or before the specified time (in real world),. + // Don't bother to round, as this is very fine-grained. + // and bear in mind that the delay is always + ostime_t drift = (ostime_t)(((int64_t)delay * clockerr) / MAX_CLOCK_ERROR); - rxsyms = ((2 * (int)rxsyms_in - 8) * Tsym + LMICbandplan_RX_ERROR_ABS_osticks * 2 + Tsym - 1) / Tsym; - if (rxsyms < rxsyms_in) { - rxsyms = rxsyms_in; - } - setRxsyms(rxsyms); + // we add symbols if we're starting tx before the window. + rxoffset -= drift; + + // if we're starting before the window, extend the number of symbols + // for timeout appropriately. + if (rxoffset < 0) + rxsyms_in += (-rxoffset + 2 * hsym - 1) / (2 * hsym); - rxoffset = (8 - rxsyms) * hsym - LMICbandplan_RX_EXTRA_MARGIN_osticks; + setRxsyms(rxsyms_in); - return rxoffset; + return delay + rxoffset; } static void schedRx12 (ostime_t delay, osjobcb_t func, u1_t dr) { @@ -1478,8 +1498,8 @@ static void schedRx12 (ostime_t delay, osjobcb_t func, u1_t dr) { // that are too long for SF12, and too short for other SFs, so we follow the // Semtech reference code. // - // This also sets LMIC.rxsyms. - LMIC.rxtime = LMIC.txend + LMICcore_adjustForDrift(delay + LMICcore_RxWindowOffset(hsym, LMICbandplan_MINRX_SYMS_LoRa_ClassA), hsym); + // This also sets LMIC.rxsyms. This is NOT normally used for FSK; see LMICbandplan_txDoneFSK() + LMIC.rxtime = LMIC.txend + LMICcore_adjustForDrift(delay, hsym, LMICbandplan_MINRX_SYMS_LoRa_ClassA); LMIC_X_DEBUG_PRINTF("%"LMIC_PRId_ostime_t": sched Rx12 %"LMIC_PRId_ostime_t"\n", os_getTime(), LMIC.rxtime - RX_RAMPUP); os_setTimedCallback(&LMIC.osjob, LMIC.rxtime - RX_RAMPUP, func); @@ -1509,8 +1529,7 @@ static void txDone (ostime_t delay, osjobcb_t func) { LMICbandplan_setRx1Params(); // LMIC.dndr carries the TX datarate (can be != LMIC.datarate [confirm retries etc.]) - // Setup receive - LMIC.rxtime is preloaded with 1.5 symbols offset to tune - // into the middle of the 8 symbols preamble. + // Setup receive -- either schedule FSK or schedule rx1 or rx2 window. if( LMICbandplan_isFSK() ) { LMICbandplan_txDoneFSK(delay, func); } diff --git a/src/lmic/lmic.h b/src/lmic/lmic.h index daeda411..aaa493e8 100644 --- a/src/lmic/lmic.h +++ b/src/lmic/lmic.h @@ -320,9 +320,24 @@ static inline bit_t LMIC_BEACON_SUCCESSFUL(lmic_beacon_error_t e) { return e < 0; } +// LMIC_CFG_max_clock_error_ppm +#if !defined(LMIC_CFG_max_clock_error_ppm) +# define LMIC_CFG_max_clock_error_ppm 2000 /* max clock error: 0.2% (2000 ppm) */ +#endif + + enum { // This value represents 100% error in LMIC.clockError MAX_CLOCK_ERROR = 65536, + //! \brief maximum clock error that users can specify: 2000 ppm (0.2%). + //! \details This is the limit for clock error, unless LMIC_ENABLE_arbitrary_clock_error is set. + //! The default is 2,000 ppm, which is .002, or 0.2%. If your clock error is bigger, + //! usually you want to calibrate it so that millis() and micros() are reasonably + //! accurate. Important: do not use clock error to compensate for late serving + //! of the LMIC. If you see that LMIC.radio.rxlate_count is increasing, you need + //! to adjust your application logic so the LMIC gets serviced promptly when a + //! Class A downlink (or beacon) is pending. + LMIC_kMaxClockError_ppm = 2000, }; // callbacks for client alerts. diff --git a/src/lmic/lmic_bandplan.h b/src/lmic/lmic_bandplan.h index ca69ce77..16a4ca5f 100644 --- a/src/lmic/lmic_bandplan.h +++ b/src/lmic/lmic_bandplan.h @@ -226,7 +226,6 @@ // internal APIs ostime_t LMICcore_rndDelay(u1_t secSpan); void LMICcore_setDrJoin(u1_t reason, u1_t dr); -ostime_t LMICcore_adjustForDrift(ostime_t delay, ostime_t hsym); -ostime_t LMICcore_RxWindowOffset(ostime_t hsym, rxsyms_t rxsyms_in); +ostime_t LMICcore_adjustForDrift(ostime_t delay, ostime_t hsym, rxsyms_t rxsyms_in); #endif // _lmic_bandplan_h_ diff --git a/src/lmic/lmic_eu_like.c b/src/lmic/lmic_eu_like.c index 982ae496..48e4a07a 100644 --- a/src/lmic/lmic_eu_like.c +++ b/src/lmic/lmic_eu_like.c @@ -255,13 +255,14 @@ void LMICeulike_setRx1Freq(void) { // Class A txDone handling for FSK. void LMICeulike_txDoneFSK(ostime_t delay, osjobcb_t func) { - ostime_t const hsym = us2osticksRound(80); + // one symbol == one bit at 50kHz == 20us. + ostime_t const hsym = us2osticksRound(10); - // start a little earlier. + // start a little earlier. PRERX_FSK is in bytes; one byte at 50 kHz == 160us delay -= LMICbandplan_PRERX_FSK * us2osticksRound(160); // set LMIC.rxtime and LMIC.rxsyms: - LMIC.rxtime = LMIC.txend + LMICcore_adjustForDrift(delay + LMICcore_RxWindowOffset(hsym, LMICbandplan_RXLEN_FSK), hsym); + LMIC.rxtime = LMIC.txend + LMICcore_adjustForDrift(delay, hsym, 8 * LMICbandplan_RXLEN_FSK); os_setTimedCallback(&LMIC.osjob, LMIC.rxtime - RX_RAMPUP, func); } From 4a267e598409ed31a947503f1ec8b3f55c90f31c Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Sat, 28 Dec 2019 17:49:25 -0500 Subject: [PATCH 22/35] Fix #504: AVR 32-bit shifts need casts on left operand --- src/lmic/lmic.c | 28 ++++++++++++++-------------- src/lmic/lmic.h | 8 ++++---- src/lmic/lmic_us_like.c | 2 +- src/lmic/radio.c | 2 +- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/lmic/lmic.c b/src/lmic/lmic.c index 78e8397b..3fcb4e84 100644 --- a/src/lmic/lmic.c +++ b/src/lmic/lmic.c @@ -757,7 +757,7 @@ applyAdrRequests( u1_t chpage = p4 & MCMD_LinkADRReq_Redundancy_ChMaskCntl_MASK; // channel page map_ok = LMICbandplan_mapChannels(chpage, chmap); - LMICOS_logEventUint32("applyAdrRequests: mapChannels", (chpage << 16)|(chmap << 0)); + LMICOS_logEventUint32("applyAdrRequests: mapChannels", ((u4_t)chpage << 16)|(chmap << 0)); } } @@ -799,7 +799,7 @@ applyAdrRequests( changes = 1; } - LMICOS_logEventUint32("applyAdrRequests: setDrTxPow", (adrAns << 16)|(dr << 8)|(p1 << 0)); + LMICOS_logEventUint32("applyAdrRequests: setDrTxPow", ((u4_t)adrAns << 16)|(dr << 8)|(p1 << 0)); // handle power changes here, too. changes |= setDrTxpow(DRCHG_NWKCMD, dr, pow2dBm(p1)); @@ -846,7 +846,7 @@ scan_mac_cmds_link_adr( if( !LMICbandplan_canMapChannels(chpage, chmap) ) { adrAns &= ~MCMD_LinkADRAns_ChannelACK; - LMICOS_logEventUint32("scan_mac_cmds_link_adr: failed canMapChannels", (chpage << UINT32_C(16))|(chmap << UINT32_C(0))); + LMICOS_logEventUint32("scan_mac_cmds_link_adr: failed canMapChannels", ((u4_t)chpage << 16)|((u4_t)chmap << 0)); } if( !validDR(dr) ) { @@ -1003,7 +1003,7 @@ scan_mac_cmds( if( ans == (MCMD_NewChannelAns_DataRateACK|MCMD_NewChannelAns_ChannelACK)) { if ( ! LMIC_setupChannel(chidx, freq, DR_RANGE_MAP(MinDR, MaxDR), -1) ) { - LMICOS_logEventUint32("NewChannelReq: setupChannel failed", (MaxDR << 24u) | (MinDR << 16u) | (raw_f_not_zero << 8) | (chidx << 0)); + LMICOS_logEventUint32("NewChannelReq: setupChannel failed", ((u4_t)MaxDR << 24u) | ((u4_t)MinDR << 16u) | (raw_f_not_zero << 8) | (chidx << 0)); ans &= ~MCMD_NewChannelAns_ChannelACK; } } @@ -1214,7 +1214,7 @@ static bit_t decodeFrame (void) { goto norx; } if( poff > pend ) { - LMICOS_logEventUint32("decodeFrame: corrupted frame", (dlen << 16) | (fct << 8) | (poff - pend)); + LMICOS_logEventUint32("decodeFrame: corrupted frame", ((u4_t)dlen << 16) | (fct << 8) | (poff - pend)); EV(specCond, ERR, (e_.reason = EV::specCond_t::CORRUPTED_FRAME, e_.eui = MAIN::CDEV->getEui(), e_.info = 0x1000000 + (poff-pend) + (fct<<8) + (dlen<<16))); @@ -1255,7 +1255,7 @@ static bit_t decodeFrame (void) { e_.eui = MAIN::CDEV->getEui(), e_.info = LMIC.seqnoDn, e_.info2 = seqno)); - LMICOS_logEventUint32("decodeFrame: rollover discarded", (seqno << 16) | (LMIC.lastDnConf << 8) | (ftype << 0)); + LMICOS_logEventUint32("decodeFrame: rollover discarded", ((u4_t)seqno << 16) | (LMIC.lastDnConf << 8) | (ftype << 0)); goto norx; } if( seqno != LMIC.seqnoDn-1 || !LMIC.lastDnConf || ftype != HDR_FTYPE_DCDN ) { @@ -1263,19 +1263,19 @@ static bit_t decodeFrame (void) { e_.eui = MAIN::CDEV->getEui(), e_.info = LMIC.seqnoDn, e_.info2 = seqno)); - LMICOS_logEventUint32("decodeFrame: Retransmit confimed discarded", (seqno << 16) | (LMIC.lastDnConf << 8) | (ftype << 0)); + LMICOS_logEventUint32("decodeFrame: Retransmit confimed discarded", ((u4_t)seqno << 16) | (LMIC.lastDnConf << 8) | (ftype << 0)); goto norx; } // Replay of previous sequence number allowed only if // previous frame and repeated both requested confirmation // but set a flag, so we don't actually process the message. - LMICOS_logEventUint32("decodeFrame: Retransmit confimed accepted", (seqno << 16) | (LMIC.lastDnConf << 8) | (ftype << 0)); + LMICOS_logEventUint32("decodeFrame: Retransmit confimed accepted", ((u4_t)seqno << 16) | (LMIC.lastDnConf << 8) | (ftype << 0)); replayConf = 1; LMIC.dnConf = FCT_ACK; } else { if( seqnoDiff > LMICbandplan_MAX_FCNT_GAP) { - LMICOS_logEventUint32("decodeFrame: gap too big", (seqnoDiff << 16) | (seqno & 0xFFFFu)); + LMICOS_logEventUint32("decodeFrame: gap too big", ((u4_t)seqnoDiff << 16) | (seqno & 0xFFFFu)); goto norx; } if( seqno > LMIC.seqnoDn ) { @@ -1289,7 +1289,7 @@ static bit_t decodeFrame (void) { // DN frame requested confirmation - provide ACK once with next UP frame LMIC.dnConf = LMIC.lastDnConf = (ftype == HDR_FTYPE_DCDN ? FCT_ACK : 0); if (LMIC.dnConf) - LMICOS_logEventUint32("decodeFrame: Confirmed downlink", (seqno << 16) | (LMIC.lastDnConf << 8) | (ftype << 0)); + LMICOS_logEventUint32("decodeFrame: Confirmed downlink", ((u4_t)seqno << 16) | (LMIC.lastDnConf << 8) | (ftype << 0)); } if (port == 0 && olen != 0 && pend > poff) { @@ -1374,7 +1374,7 @@ static bit_t decodeFrame (void) { e_.info = Base::lsbf4(&d[pend]), e_.info2 = seqno)); // discard the data - LMICOS_logEventUint32("decodeFrame: discarding replay", (seqno << 16) | (LMIC.lastDnConf << 8) | (ftype << 0)); + LMICOS_logEventUint32("decodeFrame: discarding replay", ((u4_t)seqno << 16) | (LMIC.lastDnConf << 8) | (ftype << 0)); goto norx; } @@ -1911,7 +1911,7 @@ static bit_t buildDataFrame (void) { u1_t maxFlen = LMICbandplan_maxFrameLen(LMIC.datarate); if (flen > maxFlen) { - LMICOS_logEventUint32("frame too long for this bandplan", (dlen << 16) | (flen << 8) | maxFlen); + LMICOS_logEventUint32("frame too long for this bandplan", ((u4_t)dlen << 16) | (flen << 8) | maxFlen); return 0; } @@ -1925,7 +1925,7 @@ static bit_t buildDataFrame (void) { LMIC.seqnoUp += 1; DO_DEVDB(LMIC.seqnoUp,seqnoUp); } else { - LMICOS_logEventUint32("retransmit", (LMIC.frame[OFF_DAT_FCT] << 24u) | (LMIC.txCnt << 16u) | (LMIC.upRepeatCount << 8u) | (LMIC.upRepeat<<0u)); + LMICOS_logEventUint32("retransmit", ((u4_t)LMIC.frame[OFF_DAT_FCT] << 24u) | ((u4_t)LMIC.txCnt << 16u) | (LMIC.upRepeatCount << 8u) | (LMIC.upRepeat<<0u)); EV(devCond, INFO, (e_.reason = EV::devCond_t::RE_TX, e_.eui = MAIN::CDEV->getEui(), e_.info = LMIC.seqnoUp-1, @@ -2848,7 +2848,7 @@ void LMIC_setTxData (void) { } void LMIC_setTxData_strict (void) { - LMICOS_logEventUint32(__func__, (LMIC.pendTxPort << 24u) | (LMIC.pendTxConf << 16u) | (LMIC.pendTxLen << 0u)); + LMICOS_logEventUint32(__func__, ((u4_t)LMIC.pendTxPort << 24u) | ((u4_t)LMIC.pendTxConf << 16u) | (LMIC.pendTxLen << 0u)); LMIC.opmode |= OP_TXDATA; if( (LMIC.opmode & OP_JOINING) == 0 ) { LMIC.txCnt = 0; // reset the confirmed uplink FSM diff --git a/src/lmic/lmic.h b/src/lmic/lmic.h index aaa493e8..29b56751 100644 --- a/src/lmic/lmic.h +++ b/src/lmic/lmic.h @@ -103,18 +103,18 @@ extern "C"{ // Arduino LMIC version #define ARDUINO_LMIC_VERSION_CALC(major, minor, patch, local) \ - (((major) << 24ul) | ((minor) << 16ul) | ((patch) << 8ul) | ((local) << 0ul)) + ((((major)*UINT32_C(1)) << 24) | (((minor)*UINT32_C(1)) << 16) | (((patch)*UINT32_C(1)) << 8) | (((local)*UINT32_C(1)) << 0)) #define ARDUINO_LMIC_VERSION ARDUINO_LMIC_VERSION_CALC(3, 0, 99, 9) /* v3.0.99.9 */ #define ARDUINO_LMIC_VERSION_GET_MAJOR(v) \ - (((v) >> 24u) & 0xFFu) + ((((v)*UINT32_C(1)) >> 24u) & 0xFFu) #define ARDUINO_LMIC_VERSION_GET_MINOR(v) \ - (((v) >> 16u) & 0xFFu) + ((((v)*UINT32_C(1)) >> 16u) & 0xFFu) #define ARDUINO_LMIC_VERSION_GET_PATCH(v) \ - (((v) >> 8u) & 0xFFu) + ((((v)*UINT32_C(1)) >> 8u) & 0xFFu) #define ARDUINO_LMIC_VERSION_GET_LOCAL(v) \ ((v) & 0xFFu) diff --git a/src/lmic/lmic_us_like.c b/src/lmic/lmic_us_like.c index c6b075fe..d1383bdc 100644 --- a/src/lmic/lmic_us_like.c +++ b/src/lmic/lmic_us_like.c @@ -186,7 +186,7 @@ bit_t LMICuslike_mapChannels(u1_t chpage, u2_t chmap) { } } - LMICOS_logEventUint32("LMICuslike_mapChannels", (LMIC.activeChannels125khz << 16u)|(LMIC.activeChannels500khz << 0u)); + LMICOS_logEventUint32("LMICuslike_mapChannels", ((u4_t)LMIC.activeChannels125khz << 16u)|(LMIC.activeChannels500khz << 0u)); return (LMIC.activeChannels125khz > 0) || (LMIC.activeChannels500khz > 0); } diff --git a/src/lmic/radio.c b/src/lmic/radio.c index dbfc81f9..59cbc6a0 100644 --- a/src/lmic/radio.c +++ b/src/lmic/radio.c @@ -1329,7 +1329,7 @@ void radio_irq_handler_v2 (u1_t dio, ostime_t now) { u1_t flags1 = readReg(FSKRegIrqFlags1); u1_t flags2 = readReg(FSKRegIrqFlags2); - LMICOS_logEventUint32("*radio_irq_handler_v2: FSK", (flags2 << UINT32_C(8)) | flags1); + LMICOS_logEventUint32("*radio_irq_handler_v2: FSK", ((u2_t)flags2 << 8) | flags1); if( flags2 & IRQ_FSK2_PACKETSENT_MASK ) { // save exact tx time From 306330fcb5be10c9897f96d2885af530d168a5d3 Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Mon, 30 Dec 2019 11:19:58 -0500 Subject: [PATCH 23/35] Fix #508: don't depend on delayMicroseconds() --- src/hal/hal.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/hal/hal.cpp b/src/hal/hal.cpp index fa7cafb6..7791c207 100644 --- a/src/hal/hal.cpp +++ b/src/hal/hal.cpp @@ -257,6 +257,7 @@ u4_t hal_waitUntil (u4_t time) { // From delayMicroseconds docs: Currently, the largest value that // will produce an accurate delay is 16383. Also, STM32 does a better // job with delay is less than 10,000 us; so reduce in steps. + // It's nice to use delay() for the longer times. while (delta > (9000 / US_PER_OSTICK)) { // deliberately delay 8ms rather than 9ms, so we // will exit loop with delta typically positive. @@ -266,8 +267,11 @@ u4_t hal_waitUntil (u4_t time) { // re-synchronize. delta = delta_time(time); } - if (delta > 0) - delayMicroseconds(delta * US_PER_OSTICK); + + // unluckily, delayMicroseconds() isn't very accurate. + // so spin using delta_time(). + while (delta_time(time) > 0) + /* loop */; // we aren't "late". Callers are interested in gross delays, not // necessarily delays due to poor timekeeping here. From 5b4d28f710b28fe05639825cc98d80b209b46a47 Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Mon, 30 Dec 2019 11:48:27 -0500 Subject: [PATCH 24/35] Fix #510: correct macCmd validity check --- src/lmic/lmic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lmic/lmic.c b/src/lmic/lmic.c index 3fcb4e84..3dce9c07 100644 --- a/src/lmic/lmic.c +++ b/src/lmic/lmic.c @@ -721,7 +721,7 @@ static CONST_TABLE(u1_t, macCmdSize)[] = { static u1_t getMacCmdSize(u1_t macCmd) { if (macCmd < 2) return 0; - if (macCmd >= LENOF_TABLE(macCmdSize) - 2) + if ((macCmd - 2) >= LENOF_TABLE(macCmdSize)) return 0; return TABLE_GET_U1(macCmdSize, macCmd - 2); } From 28e9dc67162b26b89479faefebb91c4a24d50a1e Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Mon, 30 Dec 2019 11:50:30 -0500 Subject: [PATCH 25/35] Fix #485: handle invalid commands properly in scan_mac_cmds --- src/lmic/lmic.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lmic/lmic.c b/src/lmic/lmic.c index 3dce9c07..2157bca3 100644 --- a/src/lmic/lmic.c +++ b/src/lmic/lmic.c @@ -893,8 +893,9 @@ scan_mac_cmds( cmd = opts[oidx]; /* compute length, and exit for illegal commands */ + // cmdlen == 0 for error, or > 0 length of command. int const cmdlen = getMacCmdSize(cmd); - if (cmdlen > olen - oidx) { + if (cmdlen <= 0 || cmdlen > olen - oidx) { // "the first unknown command terminates processing" olen = oidx; break; From df3455adc99cbec9a68540f26af935c23c268b2c Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Mon, 30 Dec 2019 11:59:42 -0500 Subject: [PATCH 26/35] Fix #507, address part of #48: drop out of class B on err --- src/lmic/lmic.c | 66 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 49 insertions(+), 17 deletions(-) diff --git a/src/lmic/lmic.c b/src/lmic/lmic.c index 2157bca3..a7c75562 100644 --- a/src/lmic/lmic.c +++ b/src/lmic/lmic.c @@ -626,7 +626,9 @@ static void stateJustJoined (void) { #if !defined(DISABLE_BEACONS) // Decode beacon - do not overwrite bcninfo unless we have a match! static lmic_beacon_error_t decodeBeacon (void) { - ASSERT(LMIC.dataLen == LEN_BCN); // implicit header RX guarantees this + if (LMIC.dataLen != LEN_BCN) { // implicit header RX guarantees this + return LMIC_BEACON_ERROR_INVALID; + } xref2u1_t d = LMIC.frame; if(! LMICbandplan_isValidBeacon1(d)) return LMIC_BEACON_ERROR_INVALID; // first (common) part fails CRC check @@ -1070,13 +1072,12 @@ scan_mac_cmds( #if defined(ENABLE_MCMD_BeaconTimingAns) && !defined(DISABLE_BEACONS) case MCMD_BeaconTimingAns: { - // Ignore if tracking already enabled - if( (LMIC.opmode & OP_TRACK) == 0 ) { + // Ignore if tracking already enabled or bcninfoTries == 0 + if( (LMIC.opmode & OP_TRACK) == 0 && LMIC.bcninfoTries != 0) { LMIC.bcnChnl = opts[oidx+3]; // Enable tracking - bcninfoTries LMIC.opmode |= OP_TRACK; - // Cleared later in txComplete handling - triggers EV_BEACON_FOUND - ASSERT(LMIC.bcninfoTries!=0); + // LMIC.bcninfoTries is cleared later in txComplete handling - triggers EV_BEACON_FOUND // Setup RX parameters LMIC.bcninfo.txtime = (LMIC.rxtime + ms2osticks(os_rlsbf2(&opts[oidx+1]) * MCMD_BeaconTimingAns_TUNIT) @@ -1557,12 +1558,22 @@ static bit_t processJoinAccept (void) { if ((LMIC.txrxFlags & TXRX_DNW1) != 0 && LMIC.dataLen == 0) return 0; - ASSERT((LMIC.opmode & OP_TXRXPEND)!=0); + // formerly we asserted. + if ((LMIC.opmode & OP_TXRXPEND) == 0) + // nothing we can do. + return 1; + + // formerly we asserted. + if ((LMIC.opmode & (OP_JOINING|OP_REJOIN)) == 0) { + // we shouldn't be here. just drop the frame, but clean up txrxpend. + return processJoinAccept_badframe(); + } if( LMIC.dataLen == 0 ) { // we didn't get any data and we're in slot 2. So... there's no join frame. return processJoinAccept_nojoinframe(); } + u1_t hdr = LMIC.frame[0]; u1_t dlen = LMIC.dataLen; u4_t mic = os_rlsbf4(&LMIC.frame[dlen-4]); // safe before modified by encrypt! @@ -1624,7 +1635,6 @@ static bit_t processJoinAccept (void) { ? EV::joininfo_t::REJOIN_ACCEPT : EV::joininfo_t::ACCEPT))); - ASSERT((LMIC.opmode & (OP_JOINING|OP_REJOIN))!=0); // // XXX(tmm@mcci.com) OP_REJOIN confuses me, and I'm not sure why we're // adjusting DRs here. We've just received a join accept, and the @@ -1676,7 +1686,12 @@ static bit_t processJoinAccept_nojoinframe(void) { // the rejoin-sent count. Internal callers will turn on rejoin // occasionally. if( (LMIC.opmode & OP_JOINING) == 0) { - ASSERT((LMIC.opmode & OP_REJOIN) != 0); + // formerly, we asserted ((LMIC.opmode & OP_REJOIN) != 0); + // but now we just return 1 if it's not asserted. + if ( (LMIC.opmode & OP_REJOIN) == 0) { + LMIC.opmode &= ~OP_TXRXPEND; + return 1; + } LMIC.opmode &= ~(OP_REJOIN|OP_TXRXPEND); if( LMIC.rejoinCnt < 10 ) LMIC.rejoinCnt++; @@ -2011,7 +2026,9 @@ static void onBcnRx (xref2osjob_t osjob) { // Implicitely cancels any pending TX/RX transaction. // Also cancels an onpoing joining procedure. static void startScan (void) { - ASSERT(LMIC.devaddr!=0 && (LMIC.opmode & OP_JOINING)==0); + // formerly, we asserted. + if (LMIC.devaddr == 0 || (LMIC.opmode & OP_JOINING) != 0) + return; if( (LMIC.opmode & OP_SHUTDOWN) != 0 ) return; // Cancel onging TX/RX transaction @@ -2200,7 +2217,10 @@ static bit_t processDnData_norx(void); static bit_t processDnData_txcomplete(void); static bit_t processDnData (void) { - ASSERT((LMIC.opmode & OP_TXRXPEND)!=0); + // if no TXRXPEND, we shouldn't be here and can do nothign. + // formerly we asserted. + if ((LMIC.opmode & OP_TXRXPEND) == 0) + return 1; if( LMIC.dataLen == 0 ) { // if this is an RX1 window, shouldn't we return 0 to schedule @@ -2446,7 +2466,7 @@ static void processBeacon (xref2osjob_t osjob) { e_.eui = MAIN::CDEV->getEui(), e_.info = drift, e_.info2 = /*occasion BEACON*/0)); - ASSERT((LMIC.bcninfo.flags & (BCN_PARTIAL|BCN_FULL)) != 0); + // formerly we'd assert on BCN_PARTIAL|BCN_FULL, but we can't get here if so } else { ev = EV_BEACON_MISSED; LMIC.bcninfo.txtime += BCN_INTV_osticks - LMIC.drift; @@ -2454,9 +2474,9 @@ static void processBeacon (xref2osjob_t osjob) { LMIC.missedBcns++; // Delay any possible TX after surmised beacon - it's there although we missed it txDelay(LMIC.bcninfo.txtime + BCN_RESERVE_osticks, 4); - if( LMIC.missedBcns > MAX_MISSED_BCNS ) - LMIC.opmode |= OP_REJOIN; // try if we can roam to another network - if( LMIC.bcnRxsyms > MAX_RXSYMS ) { + // if too many missed beacons or we lose sync, drop back to Class A. + if( LMIC.missedBcns > MAX_MISSED_BCNS || + LMIC.bcnRxsyms > MAX_RXSYMS ) { LMIC.opmode &= ~(OP_TRACK|OP_PINGABLE|OP_PINGINI|OP_REJOIN); reportEventAndUpdate(EV_LOST_TSYNC); return; @@ -2525,8 +2545,14 @@ static void engineUpdate_inner (void) { if( (LMIC.opmode & OP_TRACK) != 0 ) { // We are tracking a beacon - ASSERT( now + RX_RAMPUP - LMIC.bcnRxtime <= 0 ); + // formerly asserted ( now - (LMIC.bcnRxtime - RX_RAMPUP) <= 0 ); rxtime = LMIC.bcnRxtime - RX_RAMPUP; + if (now - rxtime < 0) { + // too late: drop out of Class B. + LMIC.opmode &= ~(OP_TRACK|OP_PINGABLE|OP_PINGINI|OP_REJOIN); + reportEventNoUpdate(EV_LOST_TSYNC); + return; + } } #endif // !DISABLE_BEACONS @@ -2647,8 +2673,14 @@ static void engineUpdate_inner (void) { LMIC.freq = LMIC.ping.freq; LMIC.rps = dndr2rps(LMIC.ping.dr); LMIC.dataLen = 0; - ASSERT(LMIC.rxtime - now+RX_RAMPUP >= 0 ); - os_setTimedCallback(&LMIC.osjob, LMIC.rxtime - RX_RAMPUP, FUNC_ADDR(startRxPing)); + ostime_t rxtime_ping = LMIC.rxtime - RX_RAMPUP; + // did we miss the time? + if (now - rxtime_ping > 0) { + LMIC.opmode &= ~(OP_TRACK|OP_PINGABLE|OP_PINGINI|OP_REJOIN); + reportEventNoUpdate(EV_LOST_TSYNC); + } else { + os_setTimedCallback(&LMIC.osjob, rxtime_ping, FUNC_ADDR(startRxPing)); + } return; } // no - just wait for the beacon From 1752835f7aa9db62905246194469da255e0d4b82 Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Mon, 30 Dec 2019 12:03:20 -0500 Subject: [PATCH 27/35] Fix documentation --- src/lmic/lmic.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lmic/lmic.c b/src/lmic/lmic.c index a7c75562..a54cbb08 100644 --- a/src/lmic/lmic.c +++ b/src/lmic/lmic.c @@ -1446,7 +1446,8 @@ static void setupRx2 (void) { //! For LoRa, the fastest data rates of interest is SF7 (1024 us/symbol); with an 8-byte //! preamble, the shortest preamble is 8.092ms long. If using FSK, the symbol rate is //! 20 microseconds, but the preamble is 8*5 bits long, so the preamble is 800 microseconds. -//! If the user has not set the clock error, an error of 0.01% is assumed. +//! Unless LMIC_ENABLE_arbitrary_clock_error is true, we fold clock errors of > 0.4% back +//! to 0.4%. ostime_t LMICcore_adjustForDrift (ostime_t delay, ostime_t hsym, rxsyms_t rxsyms_in) { ostime_t rxoffset; From bf2498953625db5ed5c5c5d2ec305fcbdbf837bc Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Mon, 30 Dec 2019 12:11:03 -0500 Subject: [PATCH 28/35] Fix #442: re-adjust window calcuations, expand jitter, fix clock error, so we arrive on-time --- src/lmic/lmic.c | 20 +++++++++++++------- src/lmic/lmic.h | 5 +++-- src/lmic/oslmic.h | 4 ++-- src/lmic/radio.c | 27 ++++++++++++++++----------- 4 files changed, 34 insertions(+), 22 deletions(-) diff --git a/src/lmic/lmic.c b/src/lmic/lmic.c index a54cbb08..71df863c 100644 --- a/src/lmic/lmic.c +++ b/src/lmic/lmic.c @@ -1476,16 +1476,22 @@ ostime_t LMICcore_adjustForDrift (ostime_t delay, ostime_t hsym, rxsyms_t rxsyms // If the clock is slow, the window needs to open earlier in our time // in order to open at or before the specified time (in real world),. // Don't bother to round, as this is very fine-grained. - // and bear in mind that the delay is always ostime_t drift = (ostime_t)(((int64_t)delay * clockerr) / MAX_CLOCK_ERROR); - // we add symbols if we're starting tx before the window. - rxoffset -= drift; - - // if we're starting before the window, extend the number of symbols - // for timeout appropriately. + // calculate the additional rxsyms needed to hit the window nominally. + ostime_t const tsym = 2 * hsym; + ostime_t driftwin; + driftwin = 2 * drift; if (rxoffset < 0) - rxsyms_in += (-rxoffset + 2 * hsym - 1) / (2 * hsym); + driftwin += -rxoffset; + // else we'll hit the window nominally. + + rxsyms_in += (driftwin + tsym - 1) / tsym; + + // reduce the rxoffset by the drift; this compensates for a slow clock; + // but it makes the rxtime too early by approximately `drift` if clock + // is fast. + rxoffset -= drift; setRxsyms(rxsyms_in); diff --git a/src/lmic/lmic.h b/src/lmic/lmic.h index 29b56751..4fda1db6 100644 --- a/src/lmic/lmic.h +++ b/src/lmic/lmic.h @@ -331,13 +331,14 @@ enum { MAX_CLOCK_ERROR = 65536, //! \brief maximum clock error that users can specify: 2000 ppm (0.2%). //! \details This is the limit for clock error, unless LMIC_ENABLE_arbitrary_clock_error is set. - //! The default is 2,000 ppm, which is .002, or 0.2%. If your clock error is bigger, + //! The default is 4,000 ppm, which is .004, or 0.4%; this is what you get on an + //! STM32L0 running with the HSI oscillator after cal. If your clock error is bigger, //! usually you want to calibrate it so that millis() and micros() are reasonably //! accurate. Important: do not use clock error to compensate for late serving //! of the LMIC. If you see that LMIC.radio.rxlate_count is increasing, you need //! to adjust your application logic so the LMIC gets serviced promptly when a //! Class A downlink (or beacon) is pending. - LMIC_kMaxClockError_ppm = 2000, + LMIC_kMaxClockError_ppm = 4000, }; // callbacks for client alerts. diff --git a/src/lmic/oslmic.h b/src/lmic/oslmic.h index f6edae08..197dde05 100644 --- a/src/lmic/oslmic.h +++ b/src/lmic/oslmic.h @@ -124,7 +124,7 @@ void radio_monitor_rssi(ostime_t n, oslmic_radio_rssi_t *pRssi); // to platform issues. It's specified in units of ostime_t. It must reflect // platform jitter and latency, as well as the speed of the LMIC when running // on this plaform. -#define RX_RAMPUP (us2osticks(2000)) +#define RX_RAMPUP (us2osticks(10000)) #endif #ifndef TX_RAMPUP @@ -132,7 +132,7 @@ void radio_monitor_rssi(ostime_t n, oslmic_radio_rssi_t *pRssi); // to platform issues. It's specified in units of ostime_t. It must reflect // platform jitter and latency, as well as the speed of the LMIC when running // on this plaform. -#define TX_RAMPUP (us2osticks(2000)) +#define TX_RAMPUP (us2osticks(10000)) #endif #ifndef OSTICKS_PER_SEC diff --git a/src/lmic/radio.c b/src/lmic/radio.c index 59cbc6a0..97f139d4 100644 --- a/src/lmic/radio.c +++ b/src/lmic/radio.c @@ -902,6 +902,18 @@ static CONST_TABLE(u1_t, rxlorairqmask)[] = { [RXMODE_RSSI] = 0x00, }; +//! \brief handle late RX events. +//! \param nLate is the number of `ostime_t` ticks that the event was late. +//! \details If nLate is non-zero, increment the count of events, totalize +//! the number of ticks late, and (if implemented) adjust the estimate of +//! what would be best to return from `os_getRadioRxRampup()`. +static void rxlate (u4_t nLate) { + if (nLate) { + LMIC.radio.rxlate_ticks += nLate; + ++LMIC.radio.rxlate_count; + } +} + // start LoRa receiver (time=LMIC.rxtime, timeout=LMIC.rxsyms, result=LMIC.frame[LMIC.dataLen]) static void rxlora (u1_t rxmode) { // select LoRa modem (from sleep mode) @@ -966,13 +978,9 @@ static void rxlora (u1_t rxmode) { // now instruct the radio to receive if (rxmode == RXMODE_SINGLE) { // single rx u4_t nLate = hal_waitUntil(LMIC.rxtime); // busy wait until exact rx time - LMICOS_logEventUint32("+Rx LoRa Single", nLate); opmode(OPMODE_RX_SINGLE); - if (nLate) - { - ++LMIC.radio.rxlate_count; - LMIC.radio.rxlate_ticks += nLate; - } + LMICOS_logEventUint32("+Rx LoRa Single", nLate); + rxlate(nLate); #if LMIC_DEBUG_LEVEL > 0 ostime_t now = os_getTime(); LMIC_DEBUG_PRINTF("start single rx: now-rxtime: %"LMIC_PRId_ostime_t"\n", now - LMIC.rxtime); @@ -1042,12 +1050,9 @@ static void rxfsk (u1_t rxmode) { // now instruct the radio to receive if (rxmode == RXMODE_SINGLE) { u4_t nLate = hal_waitUntil(LMIC.rxtime); // busy wait until exact rx time - LMICOS_logEventUint32("+Rx FSK", nLate); opmode(OPMODE_RX); // no single rx mode available in FSK - if (nLate) { - LMIC.radio.rxlate_ticks += nLate; - ++LMIC.radio.rxlate_count; - } + LMICOS_logEventUint32("+Rx FSK", nLate); + rxlate(nLate); } else { LMICOS_logEvent("+Rx FSK Continuous"); opmode(OPMODE_RX); From b8ca89857fc0c55470aaaa7b124c580b28629d29 Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Mon, 30 Dec 2019 12:13:29 -0500 Subject: [PATCH 29/35] Fix #511: use a function for RX_RAMPUP --- src/lmic/lmic.c | 20 +++++++++----------- src/lmic/lmic_eu_like.c | 2 +- src/lmic/oslmic.h | 16 ++++++++++------ src/lmic/radio.c | 4 ++++ 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/lmic/lmic.c b/src/lmic/lmic.c index 71df863c..19fdb098 100644 --- a/src/lmic/lmic.c +++ b/src/lmic/lmic.c @@ -1501,17 +1501,15 @@ ostime_t LMICcore_adjustForDrift (ostime_t delay, ostime_t hsym, rxsyms_t rxsyms static void schedRx12 (ostime_t delay, osjobcb_t func, u1_t dr) { ostime_t hsym = dr2hsym(dr); - // Center the receive window on the center of the expected preamble and timeout. - // (again note that hsym is half a sumbol time, so no /2 needed) - // we leave RX_RAMPUP unadjusted for the clock drift. The IBM LMIC generates delays - // that are too long for SF12, and too short for other SFs, so we follow the - // Semtech reference code. + // Schedule the start of the receive window. os_getRadioRxRampup() is used to make sure we + // exit "sleep" well enough in advance of the receive window to be able to + // time things accurately. // // This also sets LMIC.rxsyms. This is NOT normally used for FSK; see LMICbandplan_txDoneFSK() LMIC.rxtime = LMIC.txend + LMICcore_adjustForDrift(delay, hsym, LMICbandplan_MINRX_SYMS_LoRa_ClassA); - LMIC_X_DEBUG_PRINTF("%"LMIC_PRId_ostime_t": sched Rx12 %"LMIC_PRId_ostime_t"\n", os_getTime(), LMIC.rxtime - RX_RAMPUP); - os_setTimedCallback(&LMIC.osjob, LMIC.rxtime - RX_RAMPUP, func); + LMIC_X_DEBUG_PRINTF("%"LMIC_PRId_ostime_t": sched Rx12 %"LMIC_PRId_ostime_t"\n", os_getTime(), LMIC.rxtime - os_getRadioRxRampup()); + os_setTimedCallback(&LMIC.osjob, LMIC.rxtime - os_getRadioRxRampup(), func); } static void setupRx1 (osjobcb_t func) { @@ -2552,8 +2550,8 @@ static void engineUpdate_inner (void) { if( (LMIC.opmode & OP_TRACK) != 0 ) { // We are tracking a beacon - // formerly asserted ( now - (LMIC.bcnRxtime - RX_RAMPUP) <= 0 ); - rxtime = LMIC.bcnRxtime - RX_RAMPUP; + // formerly asserted ( now - (LMIC.bcnRxtime - os_getRadioRxRampup()) <= 0 ); + rxtime = LMIC.bcnRxtime - os_getRadioRxRampup(); if (now - rxtime < 0) { // too late: drop out of Class B. LMIC.opmode &= ~(OP_TRACK|OP_PINGABLE|OP_PINGINI|OP_REJOIN); @@ -2672,7 +2670,7 @@ static void engineUpdate_inner (void) { #if !defined(DISABLE_PING) if( (LMIC.opmode & OP_PINGINI) != 0 ) { // One more RX slot in this beacon period? - if( rxschedNext(&LMIC.ping, now+RX_RAMPUP) ) { + if( rxschedNext(&LMIC.ping, now+os_getRadioRxRampup()) ) { if( txbeg != 0 && (txbeg - LMIC.ping.rxtime) < 0 ) goto txdelay; LMIC.rxsyms = LMIC.ping.rxsyms; @@ -2680,7 +2678,7 @@ static void engineUpdate_inner (void) { LMIC.freq = LMIC.ping.freq; LMIC.rps = dndr2rps(LMIC.ping.dr); LMIC.dataLen = 0; - ostime_t rxtime_ping = LMIC.rxtime - RX_RAMPUP; + ostime_t rxtime_ping = LMIC.rxtime - os_getRadioRxRampup(); // did we miss the time? if (now - rxtime_ping > 0) { LMIC.opmode &= ~(OP_TRACK|OP_PINGABLE|OP_PINGINI|OP_REJOIN); diff --git a/src/lmic/lmic_eu_like.c b/src/lmic/lmic_eu_like.c index 48e4a07a..46694e36 100644 --- a/src/lmic/lmic_eu_like.c +++ b/src/lmic/lmic_eu_like.c @@ -263,7 +263,7 @@ LMICeulike_txDoneFSK(ostime_t delay, osjobcb_t func) { // set LMIC.rxtime and LMIC.rxsyms: LMIC.rxtime = LMIC.txend + LMICcore_adjustForDrift(delay, hsym, 8 * LMICbandplan_RXLEN_FSK); - os_setTimedCallback(&LMIC.osjob, LMIC.rxtime - RX_RAMPUP, func); + os_setTimedCallback(&LMIC.osjob, LMIC.rxtime - os_getRadioRxRampup(), func); } #endif // CFG_LMIC_EU_like diff --git a/src/lmic/oslmic.h b/src/lmic/oslmic.h index 197dde05..448b0290 100644 --- a/src/lmic/oslmic.h +++ b/src/lmic/oslmic.h @@ -119,12 +119,13 @@ void radio_monitor_rssi(ostime_t n, oslmic_radio_rssi_t *pRssi); //================================================================================ -#ifndef RX_RAMPUP -// RX_RAMPUP specifies the extra time we must allow to set up an RX event due -// to platform issues. It's specified in units of ostime_t. It must reflect -// platform jitter and latency, as well as the speed of the LMIC when running -// on this plaform. -#define RX_RAMPUP (us2osticks(10000)) +#ifndef RX_RAMPUP_DEFAULT +//! \brief RX_RAMPUP_DEFAULT specifies the extra time we must allow to set up an RX event due +//! to platform issues. It's specified in units of ostime_t. It must reflect +//! platform jitter and latency, as well as the speed of the LMIC when running +//! on this plaform. It's not used directly; clients call os_getRadioRxRampup(), +//! which might adaptively vary this based on observed timeouts. +#define RX_RAMPUP_DEFAULT (us2osticks(10000)) #endif #ifndef TX_RAMPUP @@ -196,6 +197,9 @@ void os_setTimedCallback (xref2osjob_t job, ostime_t time, osjobcb_t cb); #ifndef os_clearCallback void os_clearCallback (xref2osjob_t job); #endif +#ifndef os_getRadioRxRampup +ostime_t os_getRadioRxRampup (void); +#endif #ifndef os_getTime ostime_t os_getTime (void); #endif diff --git a/src/lmic/radio.c b/src/lmic/radio.c index 97f139d4..fdbbf19d 100644 --- a/src/lmic/radio.c +++ b/src/lmic/radio.c @@ -1401,3 +1401,7 @@ void os_radio (u1_t mode) { } hal_enableIRQs(); } + +ostime_t os_getRadioRxRampup (void) { + return RX_RAMPUP_DEFAULT; +} From 7a1f6abfd716313ae8c16c49bb30fba0a104b2e7 Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Mon, 30 Dec 2019 12:20:27 -0500 Subject: [PATCH 30/35] Fix #512: 2 hour beaconless operation --- src/lmic/lmic.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/lmic/lmic.h b/src/lmic/lmic.h index 4fda1db6..0cb0c7be 100644 --- a/src/lmic/lmic.h +++ b/src/lmic/lmic.h @@ -127,8 +127,10 @@ extern "C"{ enum { MAX_FRAME_LEN = MAX_LEN_FRAME }; //!< Library cap on max frame length enum { TXCONF_ATTEMPTS = 8 }; //!< Transmit attempts for confirmed frames -enum { MAX_MISSED_BCNS = 20 }; // threshold for triggering rejoin requests enum { MAX_RXSYMS = 100 }; // stop tracking beacon beyond this +enum { MAX_MISSED_BCNS = (2 * 60 * 60 + 127) / 128 }; //!< threshold for dropping out of class B, triggering rejoin requests + // note that we need 100 ppm timing accuracy for + // this, to keep the timing error to +/- 700ms. enum { LINK_CHECK_CONT = 0 , // continue with this after reported dead link LINK_CHECK_DEAD = 32 , // after this UP frames and no response to ack from NWK assume link is dead (ADR_ACK_DELAY) From 5afe184950c5fbc955adcb3c76dc79793b12125e Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Mon, 30 Dec 2019 12:24:27 -0500 Subject: [PATCH 31/35] Fix #513: increase MAX_RXSYMS for beacons to something more reasonable --- src/lmic/lmic.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/lmic/lmic.h b/src/lmic/lmic.h index 0cb0c7be..135f917d 100644 --- a/src/lmic/lmic.h +++ b/src/lmic/lmic.h @@ -127,10 +127,15 @@ extern "C"{ enum { MAX_FRAME_LEN = MAX_LEN_FRAME }; //!< Library cap on max frame length enum { TXCONF_ATTEMPTS = 8 }; //!< Transmit attempts for confirmed frames -enum { MAX_RXSYMS = 100 }; // stop tracking beacon beyond this enum { MAX_MISSED_BCNS = (2 * 60 * 60 + 127) / 128 }; //!< threshold for dropping out of class B, triggering rejoin requests // note that we need 100 ppm timing accuracy for // this, to keep the timing error to +/- 700ms. +enum { MAX_RXSYMS = 350 }; // Stop tracking beacon if sync error grows beyond this. A 0.4% clock error + // at SF9.125k means 512 ms; one sybol is 4.096 ms, + // so this needs to be at least 125 for an STM32L0. + // And for 100ppm clocks and 2 hours of beacon misses, + // this needs to accomodate 1.4 seconds of error at + // 4.096 ms/sym or at least 342 symbols. enum { LINK_CHECK_CONT = 0 , // continue with this after reported dead link LINK_CHECK_DEAD = 32 , // after this UP frames and no response to ack from NWK assume link is dead (ADR_ACK_DELAY) From 4e9b4bae298080c58aef5d2f698a3f40fd1cc5e4 Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Mon, 30 Dec 2019 12:24:50 -0500 Subject: [PATCH 32/35] Improve compliance sketch On STM32L0 platforms, capture the 32 kHz clock in LPTIM1, and output the values, giving a useful 100ppm time reference. Display additional entries in the log (like the scheduled RX time) so we can compare time to desired times. Miscellaneous enhancements. --- .../compliance-otaa-halconfig.ino | 155 ++++++++++++++---- 1 file changed, 124 insertions(+), 31 deletions(-) diff --git a/examples/compliance-otaa-halconfig/compliance-otaa-halconfig.ino b/examples/compliance-otaa-halconfig/compliance-otaa-halconfig.ino index 00e3f6e9..bbf913ea 100644 --- a/examples/compliance-otaa-halconfig/compliance-otaa-halconfig.ino +++ b/examples/compliance-otaa-halconfig/compliance-otaa-halconfig.ino @@ -60,6 +60,32 @@ lmic_rxmessage_cb_t myRxMessageCb; const char * const evNames[] = { LMIC_EVENT_NAME_TABLE__INIT }; +static void rtccount_begin(); +static uint16_t rtccount_read(); + +#define NEED_USBD_LL_ConnectionState 0 +#ifdef ARDUINO_ARCH_STM32 +# ifdef _mcci_arduino_version +# if _mcci_arduino_version < _mcci_arduino_version_calc(2, 5, 0, 10) +# undef NEED_USBD_LL_ConnectionState +# define NEED_USBD_LL_ConnectionState 1 +# endif // _mcci_arduino_version < _mcci_arduino_version_calc(2, 5, 0, 10) +# endif // def _mcci_arduino_version +#endif // def ARDUINO_ARCH_STM32 + +#define NEED_STM32_ClockCalibration 0 +#ifdef ARDUINO_ARCH_STM32 +# ifdef _mcci_arduino_version +# if _mcci_arduino_version <= _mcci_arduino_version_calc(2, 5, 0, 10) +# undef NEED_STM32_ClockCalibration +# define NEED_STM32_ClockCalibration 1 +# endif // _mcci_arduino_version <= _mcci_arduino_version_calc(2, 5, 0, 10) +# endif // def _mcci_arduino_version +# define SUPPORT_STM32_ClockCalibration 1 +#else +# define SUPPORT_STM32_ClockCalibration 0 +#endif // def ARDUINO_ARCH_STM32 + /* Name: myEventCb() @@ -93,8 +119,12 @@ public: uint32_t datum; ostime_t time; ostime_t txend; + ostime_t rxtime; ostime_t globalDutyAvail; + u4_t nLateRx; + ostime_t ticksLateRx; u4_t freq; + u2_t rtccount; u2_t opmode; u2_t fcntDn; u2_t fcntUp; @@ -126,11 +156,15 @@ public: auto const pn = &m_queue[m_tail]; pn->job = LMIC.osjob; pn->time = os_getTime(); + pn->rtccount = rtccount_read(); pn->txend = LMIC.txend; + pn->rxtime = LMIC.rxtime; pn->globalDutyAvail = LMIC.globalDutyAvail; pn->event = event; pn->pMessage = pMessage; pn->datum = datum; + pn->nLateRx = LMIC.radio.rxlate_count; + pn->ticksLateRx = LMIC.radio.rxlate_ticks; pn->freq = LMIC.freq; pn->opmode = LMIC.opmode; pn->fcntDn = (u2_t) LMIC.seqnoDn; @@ -205,6 +239,8 @@ void myEventCb(void *pUserData, ev_t ev) { void eventPrint(cEventQueue::eventnode_t &e); void printFcnts(cEventQueue::eventnode_t &e); void printTxend(cEventQueue::eventnode_t &e); +void printRxtime(cEventQueue::eventnode_t &e); +void printLateStats(cEventQueue::eventnode_t &e); void eventPrintAll(void) { while (eventPrintOne()) @@ -288,6 +324,10 @@ void printTxend(cEventQueue::eventnode_t &e) { Serial.print(F(", avail=")); Serial.print(e.globalDutyAvail); } +void printRxtime(cEventQueue::eventnode_t &e) { + Serial.print(F(", rxtime=")); Serial.print(e.rxtime); +} + void printTxChnl(u1_t txChnl) { Serial.print(F(": ch=")); Serial.print(unsigned(txChnl)); @@ -308,6 +348,13 @@ void printSaveIrqFlags(u1_t saveIrqFlags) { printHex2(saveIrqFlags); } +void printLateStats(cEventQueue::eventnode_t &e) { + Serial.print(F(", nLateRx=")); + Serial.print(e.nLateRx); + Serial.print(F(" ticks=")); + Serial.print(e.ticksLateRx); +} + void printFcnts(cEventQueue::eventnode_t &e) { Serial.print(F(", FcntUp=")); printHex4(e.fcntUp); @@ -353,7 +400,13 @@ void eventPrint(cEventQueue::eventnode_t &e) { Serial.print(e.time); Serial.print(F(" (")); Serial.print(osticks2ms(e.time)); +#if SUPPORT_STM32_ClockCalibration + Serial.print(F(" ms, lptim1=")); + Serial.print(e.rtccount); + Serial.print(F("): ")); +#else Serial.print(F(" ms): ")); +#endif if (ev == ev_t(-1) || ev == ev_t(-2)) { Serial.print(e.pMessage); @@ -371,6 +424,7 @@ void eventPrint(cEventQueue::eventnode_t &e) { printOpmode(e.opmode); printTxrxflags(e.txrxFlags); printSaveIrqFlags(e.saveIrqFlags); + printLateStats(e); #if LMIC_ENABLE_event_logging printAllRegisters(); #endif @@ -450,6 +504,7 @@ void eventPrint(cEventQueue::eventnode_t &e) { printTxrxflags(e.txrxFlags); printFcnts(e); printTxend(e); + printLateStats(e); break; case EV_LOST_TSYNC: break; @@ -485,12 +540,13 @@ void eventPrint(cEventQueue::eventnode_t &e) { printDatarate(e.datarate); printOpmode(e.opmode); printTxend(e); - Serial.print(F(", delta ms ")); Serial.print(osticks2ms(e.time - e.txend)); + printRxtime(e); Serial.print(F(", rxsyms=")); Serial.print(unsigned(e.rxsyms)); break; case EV_JOIN_TXCOMPLETE: printSaveIrqFlags(e.saveIrqFlags); + printLateStats(e); break; default: @@ -652,9 +708,6 @@ void setup() { // Reset the MAC state. Session and pending data transfers will be discarded. LMIC_reset(); - // set clock rate error to 0.1% - //LMIC_setClockError(1 * MAX_CLOCK_ERROR / 1000); - // do the network-specific setup prior to join. setupForNetwork(false); @@ -740,26 +793,6 @@ void loop() { } } -#define NEED_USBD_LL_ConnectionState 0 -#ifdef ARDUINO_ARCH_STM32 -# ifdef _mcci_arduino_version -# if _mcci_arduino_version < _mcci_arduino_version_calc(2, 5, 0, 10) -# undef NEED_USBD_LL_ConnectionState -# define NEED_USBD_LL_ConnectionState 1 -# endif // _mcci_arduino_version < _mcci_arduino_version_calc(2, 5, 0, 10) -# endif // def _mcci_arduino_version -#endif // def ARDUINO_ARCH_STM32 - -#define NEED_STM32_ClockCalibration 0 -#ifdef ARDUINO_ARCH_STM32 -# ifdef _mcci_arduino_version -# if _mcci_arduino_version <= _mcci_arduino_version_calc(2, 5, 0, 10) -# undef NEED_STM32_ClockCalibration -# define NEED_STM32_ClockCalibration 1 -# endif // _mcci_arduino_version <= _mcci_arduino_version_calc(2, 5, 0, 10) -# endif // def _mcci_arduino_version -#endif // def ARDUINO_ARCH_STM32 - // there's a problem with running 2.5 of the MCCI STM32 BSPs; // hack around it. @@ -769,19 +802,23 @@ uint32_t USBD_LL_ConnectionState(void) { } #endif // NEED_USBD_LL_ConnectionState -#if NEED_STM32_ClockCalibration - static constexpr bool kUsesLSE = true; // _mcci_arduino_version indicates that LSE clock is used. -#else - static constexpr bool kUsesLSE = false; -#endif - +static constexpr bool kMustCalibrateLSE = NEED_STM32_ClockCalibration; // _mcci_arduino_version indicates that LSE clock is used. +static constexpr bool kCanCalibrateLSE = SUPPORT_STM32_ClockCalibration; void setup_calibrateSystemClock(void) { - if (kUsesLSE) { + if (kMustCalibrateLSE) { Serial.println("need to calibrate clock"); #if NEED_STM32_ClockCalibration Stm32_CalibrateSystemClock(); #endif // NEED_STM32_ClockCalibration + Serial.println("setting LPTIM1"); + // set clock rate error to 0.4% + LMIC_setClockError(4 * MAX_CLOCK_ERROR / 1000); + rtccount_begin(); + } else if (kCanCalibrateLSE) { + Serial.println("assuming BIOS has calibrated clock, setting LPTIM1"); + LMIC_setClockError(4 * MAX_CLOCK_ERROR / 1000); + rtccount_begin(); } else { Serial.println("calibration not supported"); } @@ -1183,3 +1220,59 @@ MeasureMicrosPerRtcSecond( return end - start; } #endif // NEED_STM32_ClockCalibration + +#if SUPPORT_STM32_ClockCalibration +static void rtccount_begin() + { + // enable clock to LPTIM1 + __HAL_RCC_LPTIM1_CLK_ENABLE(); + auto const pLptim = LPTIM1; + + // set LPTIM1 clock to LSE clock. + __HAL_RCC_LPTIM1_CONFIG(RCC_LPTIM1CLKSOURCE_LSE); + + // disable everything so we can tweak the CFGR + pLptim->CR = 0; + + // disable interrupts (needs to be done while disabled globally) + pLptim->IER = 0; + + // upcount from selected internal clock (which is LSE) + auto rCfg = pLptim->CFGR & ~0x01FEEEDF; + rCfg |= 0; + pLptim->CFGR = rCfg; + + // enable the counter but don't start it + pLptim->CR = LPTIM_CR_ENABLE; + delayMicroseconds(100); + + // set ARR to max value so we can count from 0 to 0xFFFF. + // must be done after enabling. + pLptim->ARR = 0xFFFF; + + // start in continuous mode. + pLptim->CR = LPTIM_CR_ENABLE | LPTIM_CR_CNTSTRT; + } + +static uint16_t rtccount_read() + { + auto const pLptim = LPTIM1; + uint32_t v1, v2; + + for (v1 = pLptim->CNT & 0xFFFF; (v2 = pLptim->CNT & 0xFFFF) != v1; v1 = v2) + /* loop */; + + return (uint16_t) v1; + } + +#else +static void rtccount_begin() + { + // nothing + } + +static uint16_t rtccount_read() + { + return 0; + } +#endif From 8f60f2f6a4645bb08b7aa723f4ea859f8874f662 Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Mon, 30 Dec 2019 12:36:46 -0500 Subject: [PATCH 33/35] Improve compliance application sign-on --- .../compliance-otaa-halconfig.ino | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/examples/compliance-otaa-halconfig/compliance-otaa-halconfig.ino b/examples/compliance-otaa-halconfig/compliance-otaa-halconfig.ino index bbf913ea..161541d5 100644 --- a/examples/compliance-otaa-halconfig/compliance-otaa-halconfig.ino +++ b/examples/compliance-otaa-halconfig/compliance-otaa-halconfig.ino @@ -22,6 +22,8 @@ Author: #include class cEventQueue; +#define APPLICATION_VERSION _mcci_arduino_version_calc(3,0,99,10) + // // For compliance tests with the RWC5020A, we use the default addresses // from the tester; except that we use APPKEY 0,..., 0, 2, to avoid @@ -757,12 +759,13 @@ void setup_printSignOn() setup_printSignOnDashLine(); Serial.println(filebasename(__FILE__)); - Serial.print(F("LMIC version ")); + Serial.print(F("Version ")); + printVersion(APPLICATION_VERSION); + Serial.print(F("\nLMIC version ")); printVersion(ARDUINO_LMIC_VERSION); Serial.print(F(" configured for region ")); Serial.print(CFG_region); - Serial.println('.'); - Serial.println(F("Remember to select 'Line Ending: Newline' at the bottom of the monitor window.")); + Serial.println(F(".\nRemember to select 'Line Ending: Newline' at the bottom of the monitor window.")); setup_printSignOnDashLine(); printNl(); From 86baf4b4653abf668daace8bde56f7e03c773d30 Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Mon, 30 Dec 2019 12:38:08 -0500 Subject: [PATCH 34/35] Set LMIC version to v3.0.99.10 --- src/lmic/lmic.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lmic/lmic.h b/src/lmic/lmic.h index 135f917d..fe92003b 100644 --- a/src/lmic/lmic.h +++ b/src/lmic/lmic.h @@ -105,7 +105,7 @@ extern "C"{ #define ARDUINO_LMIC_VERSION_CALC(major, minor, patch, local) \ ((((major)*UINT32_C(1)) << 24) | (((minor)*UINT32_C(1)) << 16) | (((patch)*UINT32_C(1)) << 8) | (((local)*UINT32_C(1)) << 0)) -#define ARDUINO_LMIC_VERSION ARDUINO_LMIC_VERSION_CALC(3, 0, 99, 9) /* v3.0.99.9 */ +#define ARDUINO_LMIC_VERSION ARDUINO_LMIC_VERSION_CALC(3, 0, 99, 10) /* v3.0.99.10 */ #define ARDUINO_LMIC_VERSION_GET_MAJOR(v) \ ((((v)*UINT32_C(1)) >> 24u) & 0xFFu) From 3b9b02d222874f34bc2ea890cea8218a99b85214 Mon Sep 17 00:00:00 2001 From: Terry Moore Date: Mon, 30 Dec 2019 13:11:53 -0500 Subject: [PATCH 35/35] Switch compliance version macro to one that is not BSP-dependent --- .../compliance-otaa-halconfig/compliance-otaa-halconfig.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/compliance-otaa-halconfig/compliance-otaa-halconfig.ino b/examples/compliance-otaa-halconfig/compliance-otaa-halconfig.ino index 161541d5..c6c65082 100644 --- a/examples/compliance-otaa-halconfig/compliance-otaa-halconfig.ino +++ b/examples/compliance-otaa-halconfig/compliance-otaa-halconfig.ino @@ -22,7 +22,7 @@ Author: #include class cEventQueue; -#define APPLICATION_VERSION _mcci_arduino_version_calc(3,0,99,10) +#define APPLICATION_VERSION ARDUINO_LMIC_VERSION_CALC(3,0,99,10) // // For compliance tests with the RWC5020A, we use the default addresses