1 /*!
2  * \file      RegionRU864.h
3  *
4  * \brief     Region definition for RU864
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  * \defgroup  REGIONRU864 Region RU864
32  *            Implementation according to LoRaWAN Specification v1.0.2.
33  * \{
34  */
35 #ifndef __REGION_RU864_H__
36 #define __REGION_RU864_H__
37 
38 #ifdef __cplusplus
39 extern "C"
40 {
41 #endif
42 
43 #include "region/Region.h"
44 
45 /*!
46  * LoRaMac maximum number of channels
47  */
48 #define RU864_MAX_NB_CHANNELS                       16
49 
50 /*!
51  * Number of default channels
52  */
53 #define RU864_NUMB_DEFAULT_CHANNELS                 2
54 
55 /*!
56  * Number of channels to apply for the CF list
57  */
58 #define RU864_NUMB_CHANNELS_CF_LIST                 5
59 
60 /*!
61  * Minimal datarate that can be used by the node
62  */
63 #define RU864_TX_MIN_DATARATE                       DR_0
64 
65 /*!
66  * Maximal datarate that can be used by the node
67  */
68 #define RU864_TX_MAX_DATARATE                       DR_7
69 
70 /*!
71  * Minimal datarate that can be used by the node
72  */
73 #define RU864_RX_MIN_DATARATE                       DR_0
74 
75 /*!
76  * Maximal datarate that can be used by the node
77  */
78 #define RU864_RX_MAX_DATARATE                       DR_7
79 
80 /*!
81  * Default datarate used by the node
82  */
83 #define RU864_DEFAULT_DATARATE                      DR_0
84 
85 /*!
86  * Minimal Rx1 receive datarate offset
87  */
88 #define RU864_MIN_RX1_DR_OFFSET                     0
89 
90 /*!
91  * Maximal Rx1 receive datarate offset
92  */
93 #define RU864_MAX_RX1_DR_OFFSET                     5
94 
95 /*!
96  * Minimal Tx output power that can be used by the node
97  */
98 #define RU864_MIN_TX_POWER                          TX_POWER_7
99 
100 /*!
101  * Maximal Tx output power that can be used by the node
102  */
103 #define RU864_MAX_TX_POWER                          TX_POWER_0
104 
105 /*!
106  * Default Tx output power used by the node
107  */
108 #define RU864_DEFAULT_TX_POWER                      TX_POWER_0
109 
110 /*!
111  * Default Max EIRP
112  */
113 #define RU864_DEFAULT_MAX_EIRP                      16.0f
114 
115 /*!
116  * Default antenna gain
117  */
118 #define RU864_DEFAULT_ANTENNA_GAIN                  2.15f
119 
120 /*!
121  * Enabled or disabled the duty cycle
122  */
123 #define RU864_DUTY_CYCLE_ENABLED                    1
124 
125 /*!
126  * Maximum RX window duration
127  */
128 #define RU864_MAX_RX_WINDOW                         3000 //TODO
129 
130 #if ( RU864_DEFAULT_DATARATE > DR_5 )
131 #error "A default DR higher than DR_5 may lead to connectivity loss."
132 #endif
133 
134 /*!
135  * Second reception window channel frequency definition.
136  */
137 #define RU864_RX_WND_2_FREQ                         869100000
138 
139 /*!
140  * Second reception window channel datarate definition.
141  */
142 #define RU864_RX_WND_2_DR                           DR_0
143 
144 /*!
145  * Default uplink dwell time configuration
146  */
147 #define RU864_DEFAULT_UPLINK_DWELL_TIME             0
148 
149 /*
150  * CLASS B
151  */
152 /*!
153  * Beacon frequency
154  */
155 #define RU864_BEACON_CHANNEL_FREQ                   869100000
156 
157 /*!
158  * Ping slot channel frequency
159  */
160 #define RU864_PING_SLOT_CHANNEL_FREQ                868900000
161 
162 /*!
163  * Payload size of a beacon frame
164  */
165 #define RU864_BEACON_SIZE                           17
166 
167 /*!
168  * Size of RFU 1 field
169  */
170 #define RU864_RFU1_SIZE                             1
171 
172 /*!
173  * Size of RFU 2 field
174  */
175 #define RU864_RFU2_SIZE                             0
176 
177 /*!
178  * Datarate of the beacon channel
179  */
180 #define RU864_BEACON_CHANNEL_DR                     DR_3
181 
182 /*!
183  * Bandwith of the beacon channel (Index of BandwidthsRU864[])
184  */
185 #define RU864_BEACON_CHANNEL_BW                     0
186 
187 /*!
188  * Datarate of the ping slot channel
189  */
190 #define RU864_PING_SLOT_CHANNEL_DR                  DR_3
191 
192 /*!
193  * Ping slot channel datarate
194  */
195 #define RU864_PING_SLOT_CHANNEL_DR                  DR_3
196 
197 /*!
198  * Maximum number of bands
199  */
200 #define RU864_MAX_NB_BANDS                          1
201 
202 /*!
203  * Band 0 definition
204  * Band = { DutyCycle, TxMaxPower, LastBandUpdateTime, LastMaxCreditAssignTime, TimeCredits, MaxTimeCredits, ReadyForTransmission }
205  */
206 #define RU864_BAND0                                 { 100 , RU864_MAX_TX_POWER, 0, 0, 0, 0, 0 } //  1.0 %
207 
208 /*!
209  * LoRaMac default channel 1
210  * Channel = { Frequency [Hz], RX1 Frequency [Hz], { ( ( DrMax << 4 ) | DrMin ) }, Band }
211  */
212 #define RU864_LC1                                   { 868900000, 0, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 }
213 
214 /*!
215  * LoRaMac default channel 2
216  * Channel = { Frequency [Hz], RX1 Frequency [Hz], { ( ( DrMax << 4 ) | DrMin ) }, Band }
217  */
218 #define RU864_LC2                                   { 869100000, 0, { ( ( DR_5 << 4 ) | DR_0 ) }, 0 }
219 
220 
221 /*!
222  * LoRaMac channels which are allowed for the join procedure
223  */
224 #define RU864_JOIN_CHANNELS                         ( uint16_t )( LC( 1 ) | LC( 2 ) )
225 
226 /*!
227  * Data rates table definition
228  */
229 static const uint8_t DataratesRU864[]  = { 12, 11, 10,  9,  8,  7, 7, 50 };
230 
231 /*!
232  * Bandwidths table definition in Hz
233  */
234 static const uint32_t BandwidthsRU864[] = { 125000, 125000, 125000, 125000, 125000, 125000, 250000, 0 };
235 
236 /*!
237  * Maximum payload with respect to the datarate index.
238  */
239 static const uint8_t MaxPayloadOfDatarateRU864[] = { 51, 51, 51, 115, 242, 242, 242, 242 };
240 
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 RegionRU864GetPhyParam( GetPhyParams_t* getPhy );
249 
250 /*!
251  * \brief Updates the last TX done parameters of the current channel.
252  *
253  * \param [IN] txDone Pointer to the function parameters.
254  */
255 void RegionRU864SetBandTxDone( SetBandTxDoneParams_t* txDone );
256 
257 /*!
258  * \brief Initializes the channels masks and the channels.
259  *
260  * \param [IN] type Sets the initialization type.
261  */
262 void RegionRU864InitDefaults( InitDefaultsParams_t* params );
263 
264 /*!
265  * \brief Verifies a parameter.
266  *
267  * \param [IN] verify Pointer to the function parameters.
268  *
269  * \param [IN] type Sets the initialization type.
270  *
271  * \retval Returns true, if the parameter is valid.
272  */
273 bool RegionRU864Verify( VerifyParams_t* verify, PhyAttribute_t phyAttribute );
274 
275 /*!
276  * \brief The function parses the input buffer and sets up the channels of the
277  *        CF list.
278  *
279  * \param [IN] applyCFList Pointer to the function parameters.
280  */
281 void RegionRU864ApplyCFList( ApplyCFListParams_t* applyCFList );
282 
283 /*!
284  * \brief Sets a channels mask.
285  *
286  * \param [IN] chanMaskSet Pointer to the function parameters.
287  *
288  * \retval Returns true, if the channels mask could be set.
289  */
290 bool RegionRU864ChanMaskSet( ChanMaskSetParams_t* chanMaskSet );
291 
292 /*!
293  * Computes the Rx window timeout and offset.
294  *
295  * \param [IN] datarate     Rx window datarate index to be used
296  *
297  * \param [IN] minRxSymbols Minimum required number of symbols to detect an Rx frame.
298  *
299  * \param [IN] rxError      System maximum timing error of the receiver. In milliseconds
300  *                          The receiver will turn on in a [-rxError : +rxError] ms
301  *                          interval around RxOffset
302  *
303  * \param [OUT]rxConfigParams Returns updated WindowTimeout and WindowOffset fields.
304  */
305 void RegionRU864ComputeRxWindowParameters( int8_t datarate, uint8_t minRxSymbols, uint32_t rxError, RxConfigParams_t *rxConfigParams );
306 
307 /*!
308  * \brief Configuration of the RX windows.
309  *
310  * \param [IN] rxConfig Pointer to the function parameters.
311  *
312  * \param [OUT] datarate The datarate index which was set.
313  *
314  * \retval Returns true, if the configuration was applied successfully.
315  */
316 bool RegionRU864RxConfig( RxConfigParams_t* rxConfig, int8_t* datarate );
317 
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 RegionRU864TxConfig( TxConfigParams_t* txConfig, int8_t* txPower, TimerTime_t* txTimeOnAir );
330 
331 /*!
332  * \brief The function processes a Link ADR Request.
333  *
334  * \param [IN] linkAdrReq Pointer to the function parameters.
335  *
336  * \retval Returns the status of the operation, according to the LoRaMAC specification.
337  */
338 uint8_t RegionRU864LinkAdrReq( LinkAdrReqParams_t* linkAdrReq, int8_t* drOut, int8_t* txPowOut, uint8_t* nbRepOut, uint8_t* nbBytesParsed );
339 
340 /*!
341  * \brief The function processes a RX Parameter Setup Request.
342  *
343  * \param [IN] rxParamSetupReq Pointer to the function parameters.
344  *
345  * \retval Returns the status of the operation, according to the LoRaMAC specification.
346  */
347 uint8_t RegionRU864RxParamSetupReq( RxParamSetupReqParams_t* rxParamSetupReq );
348 
349 /*!
350  * \brief The function processes a Channel Request.
351  *
352  * \param [IN] newChannelReq Pointer to the function parameters.
353  *
354  * \retval Returns the status of the operation, according to the LoRaMAC specification.
355  */
356 int8_t RegionRU864NewChannelReq( NewChannelReqParams_t* newChannelReq );
357 
358 /*!
359  * \brief The function processes a TX ParamSetup Request.
360  *
361  * \param [IN] txParamSetupReq Pointer to the function parameters.
362  *
363  * \retval Returns the status of the operation, according to the LoRaMAC specification.
364  *         Returns -1, if the functionality is not implemented. In this case, the end node
365  *         shall not process the command.
366  */
367 int8_t RegionRU864TxParamSetupReq( TxParamSetupReqParams_t* txParamSetupReq );
368 
369 /*!
370  * \brief The function processes a DlChannel Request.
371  *
372  * \param [IN] dlChannelReq Pointer to the function parameters.
373  *
374  * \retval Returns the status of the operation, according to the LoRaMAC specification.
375  */
376 int8_t RegionRU864DlChannelReq( DlChannelReqParams_t* dlChannelReq );
377 
378 /*!
379  * \brief Alternates the datarate of the channel for the join request.
380  *
381  * \param [IN] currentDr Current datarate.
382  *
383  * \retval Datarate to apply.
384  */
385 int8_t RegionRU864AlternateDr( int8_t currentDr, AlternateDrType_t type );
386 
387 /*!
388  * \brief Searches and set the next random available channel
389  *
390  * \param [OUT] channel Next channel to use for TX.
391  *
392  * \param [OUT] time Time to wait for the next transmission according to the duty
393  *              cycle.
394  *
395  * \param [OUT] aggregatedTimeOff Updates the aggregated time off.
396  *
397  * \retval Function status [1: OK, 0: Unable to find a channel on the current datarate]
398  */
399 LoRaMacStatus_t RegionRU864NextChannel( NextChanParams_t* nextChanParams, uint8_t* channel, TimerTime_t* time, TimerTime_t* aggregatedTimeOff );
400 
401 /*!
402  * \brief Adds a channel.
403  *
404  * \param [IN] channelAdd Pointer to the function parameters.
405  *
406  * \retval Status of the operation.
407  */
408 LoRaMacStatus_t RegionRU864ChannelAdd( ChannelAddParams_t* channelAdd );
409 
410 /*!
411  * \brief Removes a channel.
412  *
413  * \param [IN] channelRemove Pointer to the function parameters.
414  *
415  * \retval Returns true, if the channel was removed successfully.
416  */
417 bool RegionRU864ChannelsRemove( ChannelRemoveParams_t* channelRemove  );
418 
419 /*!
420  * \brief Computes new datarate according to the given offset
421  *
422  * \param [IN] downlinkDwellTime Downlink dwell time configuration. 0: No limit, 1: 400ms
423  *
424  * \param [IN] dr Current datarate
425  *
426  * \param [IN] drOffset Offset to be applied
427  *
428  * \retval newDr Computed datarate.
429  */
430 uint8_t RegionRU864ApplyDrOffset( uint8_t downlinkDwellTime, int8_t dr, int8_t drOffset );
431 
432 /*!
433  * \brief Sets the radio into beacon reception mode
434  *
435  * \param [IN] rxBeaconSetup Pointer to the function parameters
436  */
437 void RegionRU864RxBeaconSetup( RxBeaconSetup_t* rxBeaconSetup, uint8_t* outDr );
438 
439 /*! \} defgroup REGIONRU864 */
440 
441 #ifdef __cplusplus
442 }
443 #endif
444 
445 #endif // __REGION_RU864_H__
446