All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Please refer to Releases pre-certification-results document for further information.
fuota-test-01 exampleNewChannelReq amd DlChannelReq handling to ignore command for AU915, CN470 and US915 regionsSX126xSetLoRaSymbNumTimeout to round up the timeout to the nearest possible number of symbol.GetNextLowerTxDr function implementation.FifoLevel IRQ instead of FifoEmpty IRQRISING to RISING_FALLING edge.USB_POWERping-pong and rx-sensi examples to use the right FSK_BANDWIDTH and FSK_AFC_BANDWIDTH parametersRegionIN865RxParamSetupReq DrOffset verificationAU915_MAX_RX1_DR_OFFSET value to 5 instead of 6AU915_MAX_RX1_DR_OFFSET value to 5 instead of 6FRAGMENTATION_FRAG_SESSION_SETUP_REQ checks which verify FragNb and FragSize validity.SX126xSetOperatingMode on SX126xSetTxContinuousWave and SX126xSetTxInfinitePreamble functionsSX126xIoRfSwitchInit)RegionXXInitDefaults. Fixes an issue on US based bands where the channels mask was not being reset.JoinAccept max payload size (33) by LORAMAC_JOIN_ACCEPT_FRAME_MAX_SIZE definition.IsChannelFree API in order to provide reception bandwidthRegionCommonComputeSymbolTimeLoRa, RegionCommonComputeSymbolTimeFsk and RegionCommonComputeRxWindowParameters
API implementations to use integer divisions instead of double division.SX126xSetLoRaSymbNumTimeout to call the workaround only if the number of symbols is equal to or higher than 64.{ after extern "C" in cmac.h fileFragSessionStatusAns message construction for Received&index fieldLoRaMacCryptoHandleJoinAccept function DevNonce, RJCount0 and RJCount1 handling.LoRaMacCrypto.c conditional pre-processing.Rx1Frequency reset for dynamic channel plansAS923_1_JP sub planUSE_RADIO_DEBUG directive is definedSX126xClearIrqStatus call to only clear read flagsSecureElementProcessJoinAccept API to the secure-element.hLoRaMacDeInitialization API to ease dynamic region changeMOTE_MAC_TX_PARAM_SETUP_ANS as sticky MAC commandCHANGELOG.md fileLmhpFragmentation implementationCommissioning.h files to a single one located under src/apps/LoRaMac/common directoryRadio.TimeOnAir API in order to be independent of the current hardware settingsse-identity.h fileMlmeRequest and McpsRequest APIs to report back when the next transmission is possibleResetMacParameters to perform a complete re-initialization of the regional layer after processing the join acceptGEN_APP_KEY support as it is equivalent to LoRaWAN 1.1.x APP_KEYreadme.md fileSX126xGetRandom API implementationRadioStandby in LoRa modem case inside RadioSetRxConfig APILoRaSymbNumTimeout handlingPHY_BEACON_CHANNEL_FREQ for AU915 regionSRV_MAC_DEVICE_TIME_ANS, SRV_MAC_PING_SLOT_INFO_ANS and SRV_MAC_BEACON_TIMING_ANS processing to be executed only if corresponding MLME request is queuedFCntUp counter could sometimes be incremented by 2 instead of 1LoRaMacProcess functiontimer.c/h, rtc-driver.c/h and added a systime.c/h moduleBoardDisableIrq and BoardEnableIrq functions by CRITICAL_SECTION_BEGIN and CRITICAL_SECTION_END
respectivelyLoRaMac.c and LoRaMac.h implementationprintf and scanf functions when GCC is used as compilersymbolTimeout and Offset from
downlink expected time)TxTimeout occursTxCw(Tx Continuous Wave) certification protocol commandsymbolTimeout (1 symbol equals 1 byte) when in RxSingle modeGpioMcuInit function to first configure the output pin state before activating the pinAdrAckCounter handling as expected by the test housesResetMacParameters to the initializationLoRaMacPayload bufferNmeaStringSize variableRX_TIMEOUT irq clear into the irq handlerHAL_UART_ErrorCallbackTxPower limitation for US band on LoRaMacMibSetRequestConfirm function. The power will be limited
anyway when the SendFrameOnChannel functions is calledLoRaMacMlmeRequest case MLME_JOIN. Function will return LORAMAC_STATUS_BUSY in
case the MAC is in status MAC_TX_DELAYEDCalibrateTimer functionPrepareFrame where repeated MAC commands were not handled correctlyOnRadioRxDone Node now drops frames on port 0 with fOpts > 0OnRadioRxDone Node now receives frames with fOpts > 0 when no payload is presentChannelsDefaultDatarateMAC_RX_ABORT. Reset MAC_TX_RUNNING only in OnMacStateCheckTimerEventLORAMAC_DEFAULT_DATARATE by ChannelsDefaultDatarate in LoRaMacChannelAddSX127xInit function more than onceSX1276SetOpMode and SX1272SetOpModeLoRaMacChannelRemoveMAX_FCNT_GAPMIB_REPEATER_SUPPORT. (Issue #42)LoRaMacState to allow adding channels during TX procedure. (Issue #43)PrepareRxDoneAbort to prepare a break-out of OnRadioRxDone in case of an errorTimerHwDelayMs function to be re-entrantnbRetries to NbTrials in structure McpsReqConfirmed_t. (Issue #37)SetNextChannel. Added enabling default channels in case of join request. (Issue #39)LoRaMacFlags.Bits.McpsInd in OnRadioRxDoneNodeAckRequested if we received an ACK or in case of timeoutAdrNextDr functionTimerIrqHandler. Now, it is possible to insert timers in callbackSRV_MAC_NEW_CHANNEL_REQ MAC command by adding a fix to the macIndex variable on US915 bandLORAMAC_MIN_RX1_DR_OFFSET and LORAMAC_MAX_RX1_DR_OFFSET definitions to LoRaMac-board.h. Can be different
upon used PHY layerstdint.h names. Helps on code portabilityrand and srand to rand1 and srand1. Helps on code portabilityID1, ID2 and ID3 definition from board.h to board.c, usb-cdc-board.c and usb-dfu-board.cBoardMeasureBatterieLevel to BoardGetBatteryLevelSetMaxPayloadLength API function to SX1272 and SX1276 radio driversGetStatusstdint.h names. Helps on code portability (Issue #20)__ffs function from utilities.h to spi-board.c. This function is only used there__IO attribute by volatileLoRaMacEvent_t into LoRaMacCallbacks_t and added a function pointer for getting battery level statusLoRaMacSetDutyCycleOn into LoRaMacSetTestDutyCycleOnLoRaMacSetMicTest into LoRaMacTestSetMicLoRaMacEventInfo.TxDatarate now returns LoRaWAN data rate (DR0 -> DR7) instead of (SF12 -> DF7)LoRaMac-board.h now implements the settings for the PHY layers specified by LoRaWAN 1.0 specification. (EU433, CN780, EU868, US915) (Issue #19)NULL definition from board.hRAND_SEED. It has been replaced by a function named BoardGetRandomSeedfputc function redefinition from Utilities.cPACKED attribute for data structuresIsChannelFree check on LoRaMacSetNextChannel function. LoRaWAN is an ALHOA protocol. (Pull request #8)LoRaMacPrepareFrame function behavior when no applicative payload is presentMacCommandBufferIndex management. (Issue #18)< to <=Rx1DrOffset management. In previous version DR1 was missing for all offsetsOnRxDone callback: bad address, bad MIC, bad frame. (Pull request #10)SRV_MAC_NEW_CHANNEL_REQ (Pull request #7)SRV_MAC_NEW_CHANNEL_REQ command (Pull request #5)for loop indexes were wrong. (Pull request #4)Corrected the Port 0 MAC commands decryption
Changed the way the upper layer is notified. Now it is only notified when all the operations are finished
When a ClassA Tx cycle starts a timer is launched to check every second if everything is finished
Added a new parameter to LoRaMacEventFlags structure that indicates on which Rx window the data has been received
Added a new parameter to LoRaMacEventFlags structure that indicates if there is applicative data on the received payload
Corrected ADR MAC command behavior
DutyCycle enforcement implementation (EU868 PHY only)
REMARK 1 The regulatory duty cycle enforcement is enabled by default which means that for lower data rates the
node may not transmit a new frame as quickly as requested
The formula used to compute the node idle time is
Toff = TimeOnAir / DutyCycle - TxTimeOnAir
Example:
A device just transmitted a 0.5 s long frame on one default channel
This channel is in a sub-band allowing 1% duty-cycle. Therefore this whole sub-band (868 MHz - 868.6 MHz) will be
unavailable for 49.5 s.
REMARK 2 The duty cycle enforcement can be disabled for test purposes by calling the LoRaMacSetDutyCycleOn
function with false parameter.
Implemented aggregated duty cycle management
Added a function to create new channels
Implemented the missing features on the JoinAccept MAC command
Updated LoRaMacJoinDecrypt function to handle the CFList field
HardFault_Handler functionSetRxConfig function the FSK modem preamble register nameSrvAckRequested variable was never resetLoRaMacSetNextChannel functionSRV_MAC_RX2_SETUP_REQ frequency handling
Added a x100 multiplicationSRV_MAC_NEW_CHANNEL_REQNbRepTimeoutTimer initial value. RxWindow2Delay already contains RxWindow1Delay in itvoid ( *RxDone )( uint8_t *payload, uint16_t *size, double rssi, double snr, uint8_t rawSnr );void ( *RxDone )( uint8_t *payload, uint16_t size, double rssi, double snr, uint8_t rawSnr );The application payload for the Bleeper platforms is as follows:
LoRaMac port 1:
{ 0xX0/0xX1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
---------- ---------- ---------- ---------- ----
| | | | |
SELECTOR/LED PRESSURE TEMPERATURE ALTITUDE BATTERY
MSB nibble = SELECTOR (barometric)
LSB bit = LED
rand() and srand() standard C functions. These functions are redefined in order to get the same behavior across different compiler tool chains implementationsLoRaMacInitNwkIds LoRaMac API function had to be modified
void LoRaMacInitNwkIds( uint32_t devAddr, uint8_t *nwkSKey, uint8_t *appSKey );void LoRaMacInitNwkIds( uint32_t netID, uint32_t devAddr, uint8_t *nwkSKey, uint8_t *appSKey );LoRaMac-board.h file located in each specific board directory__builtin_ffs function__ffs function implementation to utilities.h fileThe application payload for the SK-iM880A platform is as follows:
LoRaMac port 3:
{ 0x00/0x01, 0x00, 0x00, 0x00 }
---------- ----- ----------
| | |
LED POTI VDD
LoRaMacSendOnChannel function in LoRaMacPrepareFrame and LoRaMacSendFrameOnChannel
LoRaMacSendOnChannel now calls the 2 newly defined functionsLORAMAC_EVENT_INFO_STATUS_MAC_ERROR event info statusThe application payload for the Bleeper platform is as follows:
LoRaMac port 1:
{ 0x00/0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
---------- ---------- ---------- ---------- ----
| | | | |
LED PRESSURE TEMPERATURE ALTITUDE BATTERY
(barometric)
The application payload for the LoRaMote platform is as follows:
LoRaMac port 2:
{ 0x00/0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
---------- ---------- ---------- ---------- ---- ---------------- ---------------- ----------
| | | | | | | |
LED PRESSURE TEMPERATURE ALTITUDE BATTERY LATITUDE LONGITUDE ALTITUDE
(barometric) (gps)
Implemented an application LED control
If the server sends on port 1 an application payload of one byte with the following contents:
0: LED off
1: LED on
The node transmits periodically on port 1 the LED status on 1st byte and the message “Hello World!!!!” the array looks lik
{ 0, 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!', '!', '!', '!' }