RegionEU433.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518
  1. /*!
  2. * \file RegionEU433.h
  3. *
  4. * \brief Region definition for EU433
  5. *
  6. * \copyright Revised BSD License, see section \ref LICENSE.
  7. *
  8. * \code
  9. * ______ _
  10. * / _____) _ | |
  11. * ( (____ _____ ____ _| |_ _____ ____| |__
  12. * \____ \| ___ | (_ _) ___ |/ ___) _ \
  13. * _____) ) ____| | | || |_| ____( (___| | | |
  14. * (______/|_____)_|_|_| \__)_____)\____)_| |_|
  15. * (C)2013-2017 Semtech
  16. *
  17. * ___ _____ _ ___ _ _____ ___ ___ ___ ___
  18. * / __|_ _/_\ / __| |/ / __/ _ \| _ \/ __| __|
  19. * \__ \ | |/ _ \ (__| ' <| _| (_) | / (__| _|
  20. * |___/ |_/_/ \_\___|_|\_\_| \___/|_|_\\___|___|
  21. * embedded.connectivity.solutions===============
  22. *
  23. * \endcode
  24. *
  25. * \author Miguel Luis ( Semtech )
  26. *
  27. * \author Gregory Cristian ( Semtech )
  28. *
  29. * \author Daniel Jaeckle ( STACKFORCE )
  30. *
  31. * \author Johannes Bruder ( STACKFORCE )
  32. *
  33. * \defgroup REGIONEU433 Region EU433
  34. * Implementation according to LoRaWAN Specification v1.0.2.
  35. * \{
  36. */
  37. #ifndef __REGION_EU433_H__
  38. #define __REGION_EU433_H__
  39. #ifdef __cplusplus
  40. extern "C"
  41. {
  42. #endif
  43. #include "Region.h"
  44. /*!
  45. * LoRaMac maximum number of channels
  46. */
  47. #define EU433_MAX_NB_CHANNELS 16
  48. /*!
  49. * Number of default channels
  50. */
  51. #define EU433_NUMB_DEFAULT_CHANNELS 3
  52. /*!
  53. * Number of channels to apply for the CF list
  54. */
  55. #define EU433_NUMB_CHANNELS_CF_LIST 5
  56. /*!
  57. * Minimal datarate that can be used by the node
  58. */
  59. #define EU433_TX_MIN_DATARATE DR_0
  60. /*!
  61. * Maximal datarate that can be used by the node
  62. */
  63. #define EU433_TX_MAX_DATARATE DR_7
  64. /*!
  65. * Minimal datarate that can be used by the node
  66. */
  67. #define EU433_RX_MIN_DATARATE DR_0
  68. /*!
  69. * Maximal datarate that can be used by the node
  70. */
  71. #define EU433_RX_MAX_DATARATE DR_7
  72. /*!
  73. * Default datarate used by the node
  74. */
  75. #define EU433_DEFAULT_DATARATE DR_0
  76. /*!
  77. * Minimal Rx1 receive datarate offset
  78. */
  79. #define EU433_MIN_RX1_DR_OFFSET 0
  80. /*!
  81. * Maximal Rx1 receive datarate offset
  82. */
  83. #define EU433_MAX_RX1_DR_OFFSET 5
  84. /*!
  85. * Default Rx1 receive datarate offset
  86. */
  87. #define EU433_DEFAULT_RX1_DR_OFFSET 0
  88. /*!
  89. * Minimal Tx output power that can be used by the node
  90. */
  91. #define EU433_MIN_TX_POWER TX_POWER_5
  92. /*!
  93. * Maximal Tx output power that can be used by the node
  94. */
  95. #define EU433_MAX_TX_POWER TX_POWER_0
  96. /*!
  97. * Default Tx output power used by the node
  98. */
  99. #define EU433_DEFAULT_TX_POWER TX_POWER_0
  100. /*!
  101. * Default Max EIRP
  102. */
  103. #define EU433_DEFAULT_MAX_EIRP 12.15f
  104. /*!
  105. * Default antenna gain
  106. */
  107. #define EU433_DEFAULT_ANTENNA_GAIN 2.15f
  108. /*!
  109. * ADR Ack limit
  110. */
  111. #define EU433_ADR_ACK_LIMIT 64
  112. /*!
  113. * ADR Ack delay
  114. */
  115. #define EU433_ADR_ACK_DELAY 32
  116. /*!
  117. * Enabled or disabled the duty cycle
  118. */
  119. #define EU433_DUTY_CYCLE_ENABLED 1
  120. /*!
  121. * Maximum RX window duration
  122. */
  123. #define EU433_MAX_RX_WINDOW 3000
  124. /*!
  125. * Receive delay 1
  126. */
  127. #define EU433_RECEIVE_DELAY1 1000
  128. /*!
  129. * Receive delay 2
  130. */
  131. #define EU433_RECEIVE_DELAY2 2000
  132. /*!
  133. * Join accept delay 1
  134. */
  135. #define EU433_JOIN_ACCEPT_DELAY1 5000
  136. /*!
  137. * Join accept delay 2
  138. */
  139. #define EU433_JOIN_ACCEPT_DELAY2 6000
  140. /*!
  141. * Maximum frame counter gap
  142. */
  143. #define EU433_MAX_FCNT_GAP 16384
  144. /*!
  145. * Ack timeout
  146. */
  147. #define EU433_ACKTIMEOUT 2000
  148. /*!
  149. * Random ack timeout limits
  150. */
  151. #define EU433_ACK_TIMEOUT_RND 1000
  152. /*!
  153. * Verification of default datarate
  154. */
  155. #if ( EU433_DEFAULT_DATARATE > DR_5 )
  156. #error "A default DR higher than DR_5 may lead to connectivity loss."
  157. #endif
  158. /*!
  159. * Second reception window channel frequency definition.
  160. */
  161. #define EU433_RX_WND_2_FREQ 434665000
  162. /*!
  163. * Second reception window channel datarate definition.
  164. */
  165. #define EU433_RX_WND_2_DR DR_0
  166. /*!
  167. * LoRaMac maximum number of bands
  168. */
  169. #define EU433_MAX_NB_BANDS 1
  170. /*
  171. * CLASS B
  172. */
  173. /*!
  174. * Beacon frequency
  175. */
  176. #define EU433_BEACON_CHANNEL_FREQ 434665000
  177. /*!
  178. * Payload size of a beacon frame
  179. */
  180. #define EU433_BEACON_SIZE 17
  181. /*!
  182. * Size of RFU 1 field
  183. */
  184. #define EU433_RFU1_SIZE 2
  185. /*!
  186. * Size of RFU 2 field
  187. */
  188. #define EU433_RFU2_SIZE 0
  189. /*!
  190. * Datarate of the beacon channel
  191. */
  192. #define EU433_BEACON_CHANNEL_DR DR_3
  193. /*!
  194. * Bandwith of the beacon channel
  195. */
  196. #define EU433_BEACON_CHANNEL_BW 0
  197. /*!
  198. * Ping slot channel datarate
  199. */
  200. #define EU433_PING_SLOT_CHANNEL_DR DR_3
  201. /*!
  202. * Band 0 definition
  203. * { DutyCycle, TxMaxPower, LastJoinTxDoneTime, LastTxDoneTime, TimeOff }
  204. */
  205. #define EU433_BAND0 { 100, EU433_MAX_TX_POWER, 0, 0, 0 } // 1.0 %
  206. /*!
  207. * LoRaMac default channel 1
  208. * Channel = { Frequency [Hz], RX1 Frequency [Hz], { ( ( DrMax << 4 ) | DrMin ) }, Band }
  209. */
  210. #define EU433_LC1 { 433175000, 0, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 }
  211. /*!
  212. * LoRaMac default channel 2
  213. * Channel = { Frequency [Hz], RX1 Frequency [Hz], { ( ( DrMax << 4 ) | DrMin ) }, Band }
  214. */
  215. #define EU433_LC2 { 433375000, 0, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 }
  216. /*!
  217. * LoRaMac default channel 3
  218. * Channel = { Frequency [Hz], RX1 Frequency [Hz], { ( ( DrMax << 4 ) | DrMin ) }, Band }
  219. */
  220. #define EU433_LC3 { 433575000, 0, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 }
  221. /*!
  222. * LoRaMac channels which are allowed for the join procedure
  223. */
  224. #define EU433_JOIN_CHANNELS ( uint16_t )( LC( 1 ) | LC( 2 ) | LC( 3 ) )
  225. /*!
  226. * Data rates table definition
  227. */
  228. static const uint8_t DataratesEU433[] = { 12, 11, 10, 9, 8, 7, 7, 50 };
  229. /*!
  230. * Bandwidths table definition in Hz
  231. */
  232. static const uint32_t BandwidthsEU433[] = { 125000, 125000, 125000, 125000, 125000, 125000, 250000, 0 };
  233. /*!
  234. * Maximum payload with respect to the datarate index. Cannot operate with repeater.
  235. */
  236. static const uint8_t MaxPayloadOfDatarateEU433[] = { 51, 51, 51, 115, 242, 242, 242, 242 };
  237. /*!
  238. * Maximum payload with respect to the datarate index. Can operate with repeater.
  239. */
  240. static const uint8_t MaxPayloadOfDatarateRepeaterEU433[] = { 51, 51, 51, 115, 222, 222, 222, 222 };
  241. /*!
  242. * \brief The function gets a value of a specific phy attribute.
  243. *
  244. * \param [IN] getPhy Pointer to the function parameters.
  245. *
  246. * \retval Returns a structure containing the PHY parameter.
  247. */
  248. PhyParam_t RegionEU433GetPhyParam( GetPhyParams_t* getPhy );
  249. /*!
  250. * \brief Updates the last TX done parameters of the current channel.
  251. *
  252. * \param [IN] txDone Pointer to the function parameters.
  253. */
  254. void RegionEU433SetBandTxDone( SetBandTxDoneParams_t* txDone );
  255. /*!
  256. * \brief Initializes the channels masks and the channels.
  257. *
  258. * \param [IN] type Sets the initialization type.
  259. */
  260. void RegionEU433InitDefaults( InitDefaultsParams_t* params );
  261. /*!
  262. * \brief Returns a pointer to the internal context and its size.
  263. *
  264. * \param [OUT] params Pointer to the function parameters.
  265. *
  266. * \retval Points to a structure where the module store its non-volatile context.
  267. */
  268. void* RegionEU433GetNvmCtx( GetNvmCtxParams_t* params );
  269. /*!
  270. * \brief Verifies a parameter.
  271. *
  272. * \param [IN] verify Pointer to the function parameters.
  273. *
  274. * \param [IN] type Sets the initialization type.
  275. *
  276. * \retval Returns true, if the parameter is valid.
  277. */
  278. bool RegionEU433Verify( VerifyParams_t* verify, PhyAttribute_t phyAttribute );
  279. /*!
  280. * \brief The function parses the input buffer and sets up the channels of the
  281. * CF list.
  282. *
  283. * \param [IN] applyCFList Pointer to the function parameters.
  284. */
  285. void RegionEU433ApplyCFList( ApplyCFListParams_t* applyCFList );
  286. /*!
  287. * \brief Sets a channels mask.
  288. *
  289. * \param [IN] chanMaskSet Pointer to the function parameters.
  290. *
  291. * \retval Returns true, if the channels mask could be set.
  292. */
  293. bool RegionEU433ChanMaskSet( ChanMaskSetParams_t* chanMaskSet );
  294. /*!
  295. * Computes the Rx window timeout and offset.
  296. *
  297. * \param [IN] datarate Rx window datarate index to be used
  298. *
  299. * \param [IN] minRxSymbols Minimum required number of symbols to detect an Rx frame.
  300. *
  301. * \param [IN] rxError System maximum timing error of the receiver. In milliseconds
  302. * The receiver will turn on in a [-rxError : +rxError] ms
  303. * interval around RxOffset
  304. *
  305. * \param [OUT]rxConfigParams Returns updated WindowTimeout and WindowOffset fields.
  306. */
  307. void RegionEU433ComputeRxWindowParameters( int8_t datarate, uint8_t minRxSymbols, uint32_t rxError, RxConfigParams_t *rxConfigParams );
  308. /*!
  309. * \brief Configuration of the RX windows.
  310. *
  311. * \param [IN] rxConfig Pointer to the function parameters.
  312. *
  313. * \param [OUT] datarate The datarate index which was set.
  314. *
  315. * \retval Returns true, if the configuration was applied successfully.
  316. */
  317. bool RegionEU433RxConfig( RxConfigParams_t* rxConfig, int8_t* datarate );
  318. /*!
  319. * \brief TX configuration.
  320. *
  321. * \param [IN] txConfig Pointer to the function parameters.
  322. *
  323. * \param [OUT] txPower The tx power index which was set.
  324. *
  325. * \param [OUT] txTimeOnAir The time-on-air of the frame.
  326. *
  327. * \retval Returns true, if the configuration was applied successfully.
  328. */
  329. bool RegionEU433TxConfig( TxConfigParams_t* txConfig, int8_t* txPower, TimerTime_t* txTimeOnAir );
  330. /*!
  331. * \brief The function processes a Link ADR Request.
  332. *
  333. * \param [IN] linkAdrReq Pointer to the function parameters.
  334. *
  335. * \retval Returns the status of the operation, according to the LoRaMAC specification.
  336. */
  337. uint8_t RegionEU433LinkAdrReq( LinkAdrReqParams_t* linkAdrReq, int8_t* drOut, int8_t* txPowOut, uint8_t* nbRepOut, uint8_t* nbBytesParsed );
  338. /*!
  339. * \brief The function processes a RX Parameter Setup Request.
  340. *
  341. * \param [IN] rxParamSetupReq Pointer to the function parameters.
  342. *
  343. * \retval Returns the status of the operation, according to the LoRaMAC specification.
  344. */
  345. uint8_t RegionEU433RxParamSetupReq( RxParamSetupReqParams_t* rxParamSetupReq );
  346. /*!
  347. * \brief The function processes a Channel Request.
  348. *
  349. * \param [IN] newChannelReq Pointer to the function parameters.
  350. *
  351. * \retval Returns the status of the operation, according to the LoRaMAC specification.
  352. */
  353. uint8_t RegionEU433NewChannelReq( NewChannelReqParams_t* newChannelReq );
  354. /*!
  355. * \brief The function processes a TX ParamSetup Request.
  356. *
  357. * \param [IN] txParamSetupReq Pointer to the function parameters.
  358. *
  359. * \retval Returns the status of the operation, according to the LoRaMAC specification.
  360. * Returns -1, if the functionality is not implemented. In this case, the end node
  361. * shall not process the command.
  362. */
  363. int8_t RegionEU433TxParamSetupReq( TxParamSetupReqParams_t* txParamSetupReq );
  364. /*!
  365. * \brief The function processes a DlChannel Request.
  366. *
  367. * \param [IN] dlChannelReq Pointer to the function parameters.
  368. *
  369. * \retval Returns the status of the operation, according to the LoRaMAC specification.
  370. */
  371. uint8_t RegionEU433DlChannelReq( DlChannelReqParams_t* dlChannelReq );
  372. /*!
  373. * \brief Alternates the datarate of the channel for the join request.
  374. *
  375. * \param [IN] currentDr Current datarate.
  376. *
  377. * \retval Datarate to apply.
  378. */
  379. int8_t RegionEU433AlternateDr( int8_t currentDr, AlternateDrType_t type );
  380. /*!
  381. * \brief Calculates the back-off time.
  382. *
  383. * \param [IN] calcBackOff Pointer to the function parameters.
  384. */
  385. void RegionEU433CalcBackOff( CalcBackOffParams_t* calcBackOff );
  386. /*!
  387. * \brief Searches and set the next random available channel
  388. *
  389. * \param [OUT] channel Next channel to use for TX.
  390. *
  391. * \param [OUT] time Time to wait for the next transmission according to the duty
  392. * cycle.
  393. *
  394. * \param [OUT] aggregatedTimeOff Updates the aggregated time off.
  395. *
  396. * \retval Function status [1: OK, 0: Unable to find a channel on the current datarate]
  397. */
  398. LoRaMacStatus_t RegionEU433NextChannel( NextChanParams_t* nextChanParams, uint8_t* channel, TimerTime_t* time, TimerTime_t* aggregatedTimeOff );
  399. /*!
  400. * \brief Adds a channel.
  401. *
  402. * \param [IN] channelAdd Pointer to the function parameters.
  403. *
  404. * \retval Status of the operation.
  405. */
  406. LoRaMacStatus_t RegionEU433ChannelAdd( ChannelAddParams_t* channelAdd );
  407. /*!
  408. * \brief Removes a channel.
  409. *
  410. * \param [IN] channelRemove Pointer to the function parameters.
  411. *
  412. * \retval Returns true, if the channel was removed successfully.
  413. */
  414. bool RegionEU433ChannelsRemove( ChannelRemoveParams_t* channelRemove );
  415. /*!
  416. * \brief Sets the radio into continuous wave mode.
  417. *
  418. * \param [IN] continuousWave Pointer to the function parameters.
  419. */
  420. void RegionEU433SetContinuousWave( ContinuousWaveParams_t* continuousWave );
  421. /*!
  422. * \brief Computes new datarate according to the given offset
  423. *
  424. * \param [IN] downlinkDwellTime Downlink dwell time configuration. 0: No limit, 1: 400ms
  425. *
  426. * \param [IN] dr Current datarate
  427. *
  428. * \param [IN] drOffset Offset to be applied
  429. *
  430. * \retval newDr Computed datarate.
  431. */
  432. uint8_t RegionEU433ApplyDrOffset( uint8_t downlinkDwellTime, int8_t dr, int8_t drOffset );
  433. /*!
  434. * \brief Sets the radio into beacon reception mode
  435. *
  436. * \param [IN] rxBeaconSetup Pointer to the function parameters
  437. */
  438. void RegionEU433RxBeaconSetup( RxBeaconSetup_t* rxBeaconSetup, uint8_t* outDr );
  439. /*! \} defgroup REGIONEU433 */
  440. #ifdef __cplusplus
  441. }
  442. #endif
  443. #endif // __REGION_EU433_H__