@@ -51,107 +51,6 @@ LoRaMacCommand::LoRaMacCommand()
51
51
memset (mac_cmd_buffer_to_repeat, 0 , sizeof (mac_cmd_buffer_to_repeat));
52
52
}
53
53
54
- LoRaMacCommand::~LoRaMacCommand ()
55
- {
56
- }
57
-
58
- lorawan_status_t LoRaMacCommand::add_mac_command (uint8_t cmd, uint8_t p1,
59
- uint8_t p2)
60
- {
61
- lorawan_status_t status = LORAWAN_STATUS_BUSY;
62
- // The maximum buffer length must take MAC commands to re-send into account.
63
- const uint8_t bufLen = LORA_MAC_COMMAND_MAX_LENGTH
64
- - mac_cmd_buf_idx_to_repeat;
65
-
66
- switch (cmd) {
67
- case MOTE_MAC_LINK_CHECK_REQ:
68
- if (mac_cmd_buf_idx < bufLen) {
69
- mac_cmd_buffer[mac_cmd_buf_idx++] = cmd;
70
- // No payload for this command
71
- status = LORAWAN_STATUS_OK;
72
- }
73
- break ;
74
- case MOTE_MAC_LINK_ADR_ANS:
75
- if (mac_cmd_buf_idx < (bufLen - 1 )) {
76
- mac_cmd_buffer[mac_cmd_buf_idx++] = cmd;
77
- // Margin
78
- mac_cmd_buffer[mac_cmd_buf_idx++] = p1;
79
- status = LORAWAN_STATUS_OK;
80
- }
81
- break ;
82
- case MOTE_MAC_DUTY_CYCLE_ANS:
83
- if (mac_cmd_buf_idx < bufLen) {
84
- mac_cmd_buffer[mac_cmd_buf_idx++] = cmd;
85
- // No payload for this answer
86
- status = LORAWAN_STATUS_OK;
87
- }
88
- break ;
89
- case MOTE_MAC_RX_PARAM_SETUP_ANS:
90
- if (mac_cmd_buf_idx < (bufLen - 1 )) {
91
- mac_cmd_buffer[mac_cmd_buf_idx++] = cmd;
92
- // Status: Datarate ACK, Channel ACK
93
- mac_cmd_buffer[mac_cmd_buf_idx++] = p1;
94
- // This is a sticky MAC command answer. Setup indication
95
- // _lora_mac.set_mlme_schedule_ul_indication();
96
- sticky_mac_cmd = true ;
97
- status = LORAWAN_STATUS_OK;
98
- }
99
- break ;
100
- case MOTE_MAC_DEV_STATUS_ANS:
101
- if (mac_cmd_buf_idx < (bufLen - 2 )) {
102
- mac_cmd_buffer[mac_cmd_buf_idx++] = cmd;
103
- // 1st byte Battery
104
- // 2nd byte Margin
105
- mac_cmd_buffer[mac_cmd_buf_idx++] = p1;
106
- mac_cmd_buffer[mac_cmd_buf_idx++] = p2;
107
- status = LORAWAN_STATUS_OK;
108
- }
109
- break ;
110
- case MOTE_MAC_NEW_CHANNEL_ANS:
111
- if (mac_cmd_buf_idx < (bufLen - 1 )) {
112
- mac_cmd_buffer[mac_cmd_buf_idx++] = cmd;
113
- // Status: Datarate range OK, Channel frequency OK
114
- mac_cmd_buffer[mac_cmd_buf_idx++] = p1;
115
- status = LORAWAN_STATUS_OK;
116
- }
117
- break ;
118
- case MOTE_MAC_RX_TIMING_SETUP_ANS:
119
- if (mac_cmd_buf_idx < bufLen) {
120
- mac_cmd_buffer[mac_cmd_buf_idx++] = cmd;
121
- // No payload for this answer
122
- // This is a sticky MAC command answer. Setup indication
123
- // _lora_mac.set_mlme_schedule_ul_indication();
124
- sticky_mac_cmd = true ;
125
- status = LORAWAN_STATUS_OK;
126
- }
127
- break ;
128
- case MOTE_MAC_TX_PARAM_SETUP_ANS:
129
- if (mac_cmd_buf_idx < bufLen) {
130
- mac_cmd_buffer[mac_cmd_buf_idx++] = cmd;
131
- // No payload for this answer
132
- status = LORAWAN_STATUS_OK;
133
- }
134
- break ;
135
- case MOTE_MAC_DL_CHANNEL_ANS:
136
- if (mac_cmd_buf_idx < bufLen) {
137
- mac_cmd_buffer[mac_cmd_buf_idx++] = cmd;
138
- // Status: Uplink frequency exists, Channel frequency OK
139
- mac_cmd_buffer[mac_cmd_buf_idx++] = p1;
140
- // This is a sticky MAC command answer. Setup indication
141
- // _lora_mac.set_mlme_schedule_ul_indication();
142
- sticky_mac_cmd = true ;
143
- status = LORAWAN_STATUS_OK;
144
- }
145
- break ;
146
- default :
147
- return LORAWAN_STATUS_SERVICE_UNKNOWN;
148
- }
149
- if (status == LORAWAN_STATUS_OK) {
150
- mac_cmd_in_next_tx = true ;
151
- }
152
- return status;
153
- }
154
-
155
54
void LoRaMacCommand::clear_command_buffer ()
156
55
{
157
56
mac_cmd_buf_idx = 0 ;
@@ -185,7 +84,8 @@ void LoRaMacCommand::parse_mac_commands_to_repeat()
185
84
mac_cmd_buffer_to_repeat[cmd_cnt++] = mac_cmd_buffer[i];
186
85
break ;
187
86
}
188
- // NON-STICKY
87
+
88
+ // NON-STICKY
189
89
case MOTE_MAC_DEV_STATUS_ANS: { // 2 bytes payload
190
90
i += 2 ;
191
91
break ;
@@ -298,7 +198,7 @@ lorawan_status_t LoRaMacCommand::process_mac_commands(uint8_t *payload, uint8_t
298
198
299
199
// Add the answers to the buffer
300
200
for (uint8_t i = 0 ; i < (linkAdrNbBytesParsed / 5 ); i++) {
301
- ret_value = add_mac_command (MOTE_MAC_LINK_ADR_ANS, status, 0 );
201
+ ret_value = add_link_adr_ans ( status);
302
202
}
303
203
// Update MAC index
304
204
mac_index += linkAdrNbBytesParsed - 1 ;
@@ -307,7 +207,7 @@ lorawan_status_t LoRaMacCommand::process_mac_commands(uint8_t *payload, uint8_t
307
207
case SRV_MAC_DUTY_CYCLE_REQ:
308
208
mac_sys_params.max_duty_cycle = payload[mac_index++];
309
209
mac_sys_params.aggregated_duty_cycle = 1 << mac_sys_params.max_duty_cycle ;
310
- ret_value = add_mac_command (MOTE_MAC_DUTY_CYCLE_ANS, 0 , 0 );
210
+ ret_value = add_duty_cycle_ans ( );
311
211
break ;
312
212
case SRV_MAC_RX_PARAM_SETUP_REQ: {
313
213
rx_param_setup_req_t rxParamSetupReq;
@@ -317,32 +217,26 @@ lorawan_status_t LoRaMacCommand::process_mac_commands(uint8_t *payload, uint8_t
317
217
mac_index++;
318
218
319
219
rxParamSetupReq.frequency = (uint32_t ) payload[mac_index++];
320
- rxParamSetupReq.frequency |= (uint32_t ) payload[mac_index++]
321
- << 8 ;
322
- rxParamSetupReq.frequency |= (uint32_t ) payload[mac_index++]
323
- << 16 ;
220
+ rxParamSetupReq.frequency |= (uint32_t ) payload[mac_index++] << 8 ;
221
+ rxParamSetupReq.frequency |= (uint32_t ) payload[mac_index++] << 16 ;
324
222
rxParamSetupReq.frequency *= 100 ;
325
223
326
224
// Perform request on region
327
225
status = lora_phy.accept_rx_param_setup_req (&rxParamSetupReq);
328
226
329
227
if ((status & 0x07 ) == 0x07 ) {
330
- mac_sys_params.rx2_channel .datarate =
331
- rxParamSetupReq.datarate ;
332
- mac_sys_params.rx2_channel .frequency =
333
- rxParamSetupReq.frequency ;
228
+ mac_sys_params.rx2_channel .datarate = rxParamSetupReq.datarate ;
229
+ mac_sys_params.rx2_channel .frequency = rxParamSetupReq.frequency ;
334
230
mac_sys_params.rx1_dr_offset = rxParamSetupReq.dr_offset ;
335
231
}
336
- ret_value = add_mac_command (MOTE_MAC_RX_PARAM_SETUP_ANS, status,
337
- 0 );
232
+ ret_value = add_rx_param_setup_ans (status);
338
233
}
339
234
break ;
340
235
case SRV_MAC_DEV_STATUS_REQ: {
341
236
uint8_t batteryLevel = BAT_LEVEL_NO_MEASURE;
342
237
// we don't have a mechanism at the moment to measure
343
238
// battery levels
344
- ret_value = add_mac_command (MOTE_MAC_DEV_STATUS_ANS,
345
- batteryLevel, snr & 0x3F );
239
+ ret_value = add_dev_status_ans (batteryLevel, snr & 0x3F );
346
240
break ;
347
241
}
348
242
case SRV_MAC_NEW_CHANNEL_REQ: {
@@ -358,7 +252,7 @@ lorawan_status_t LoRaMacCommand::process_mac_commands(uint8_t *payload, uint8_t
358
252
359
253
status = lora_phy.request_new_channel (channel_id, &chParam);
360
254
361
- ret_value = add_mac_command (MOTE_MAC_NEW_CHANNEL_ANS, status, 0 );
255
+ ret_value = add_new_channel_ans ( status);
362
256
}
363
257
break ;
364
258
case SRV_MAC_RX_TIMING_SETUP_REQ: {
@@ -369,7 +263,7 @@ lorawan_status_t LoRaMacCommand::process_mac_commands(uint8_t *payload, uint8_t
369
263
}
370
264
mac_sys_params.recv_delay1 = delay * 1000 ;
371
265
mac_sys_params.recv_delay2 = mac_sys_params.recv_delay1 + 1000 ;
372
- ret_value = add_mac_command (MOTE_MAC_RX_TIMING_SETUP_ANS, 0 , 0 );
266
+ ret_value = add_rx_timing_setup_ans ( );
373
267
}
374
268
break ;
375
269
case SRV_MAC_TX_PARAM_SETUP_REQ: {
@@ -392,30 +286,25 @@ lorawan_status_t LoRaMacCommand::process_mac_commands(uint8_t *payload, uint8_t
392
286
// Check the status for correctness
393
287
if (lora_phy.accept_tx_param_setup_req (ul_dwell_time, dl_dwell_time)) {
394
288
// Accept command
395
- mac_sys_params.uplink_dwell_time =
396
- ul_dwell_time;
397
- mac_sys_params.downlink_dwell_time =
398
- dl_dwell_time;
399
- mac_sys_params.max_eirp =
400
- max_eirp_table[max_eirp];
289
+ mac_sys_params.uplink_dwell_time = ul_dwell_time;
290
+ mac_sys_params.downlink_dwell_time = dl_dwell_time;
291
+ mac_sys_params.max_eirp = max_eirp_table[max_eirp];
401
292
// Add command response
402
- ret_value = add_mac_command (MOTE_MAC_TX_PARAM_SETUP_ANS, 0 , 0 );
293
+ ret_value = add_tx_param_setup_ans ( );
403
294
}
404
295
}
405
296
break ;
406
297
case SRV_MAC_DL_CHANNEL_REQ: {
407
-
408
298
uint8_t channel_id = payload[mac_index++];
409
299
uint32_t rx1_frequency;
410
300
411
301
rx1_frequency = (uint32_t ) payload[mac_index++];
412
302
rx1_frequency |= (uint32_t ) payload[mac_index++] << 8 ;
413
303
rx1_frequency |= (uint32_t ) payload[mac_index++] << 16 ;
414
304
rx1_frequency *= 100 ;
415
-
416
305
status = lora_phy.dl_channel_request (channel_id, rx1_frequency);
417
306
418
- ret_value = add_mac_command (MOTE_MAC_DL_CHANNEL_ANS, status, 0 );
307
+ ret_value = add_dl_channel_ans ( status);
419
308
}
420
309
break ;
421
310
default :
@@ -433,3 +322,129 @@ bool LoRaMacCommand::is_sticky_mac_command_pending()
433
322
}
434
323
return false ;
435
324
}
325
+
326
+ int32_t LoRaMacCommand::cmd_buffer_remaining () const
327
+ {
328
+ // The maximum buffer length must take MAC commands to re-send into account.
329
+ return sizeof (mac_cmd_buffer) - mac_cmd_buf_idx_to_repeat - mac_cmd_buf_idx;
330
+ }
331
+
332
+ lorawan_status_t LoRaMacCommand::add_link_check_req ()
333
+ {
334
+ lorawan_status_t ret = LORAWAN_STATUS_LENGTH_ERROR;
335
+ if (cmd_buffer_remaining () > 0 ) {
336
+ mac_cmd_buffer[mac_cmd_buf_idx++] = MOTE_MAC_LINK_CHECK_REQ;
337
+ // No payload for this command
338
+ ret = LORAWAN_STATUS_OK;
339
+ mac_cmd_in_next_tx = true ;
340
+ }
341
+ return ret;
342
+ }
343
+
344
+ lorawan_status_t LoRaMacCommand::add_link_adr_ans (uint8_t status)
345
+ {
346
+ lorawan_status_t ret = LORAWAN_STATUS_LENGTH_ERROR;
347
+ if (cmd_buffer_remaining () > 1 ) {
348
+ mac_cmd_buffer[mac_cmd_buf_idx++] = MOTE_MAC_LINK_ADR_ANS;
349
+ mac_cmd_buffer[mac_cmd_buf_idx++] = status;
350
+ ret = LORAWAN_STATUS_OK;
351
+ mac_cmd_in_next_tx = true ;
352
+ }
353
+ return ret;
354
+ }
355
+
356
+ lorawan_status_t LoRaMacCommand::add_duty_cycle_ans ()
357
+ {
358
+ lorawan_status_t ret = LORAWAN_STATUS_LENGTH_ERROR;
359
+ if (cmd_buffer_remaining () > 0 ) {
360
+ mac_cmd_buffer[mac_cmd_buf_idx++] = MOTE_MAC_DUTY_CYCLE_ANS;
361
+ // No payload for this answer
362
+ ret = LORAWAN_STATUS_OK;
363
+ mac_cmd_in_next_tx = true ;
364
+ }
365
+ return ret;
366
+ }
367
+
368
+ lorawan_status_t LoRaMacCommand::add_rx_param_setup_ans (uint8_t status)
369
+ {
370
+ lorawan_status_t ret = LORAWAN_STATUS_LENGTH_ERROR;
371
+ if (cmd_buffer_remaining () > 1 ) {
372
+ mac_cmd_buffer[mac_cmd_buf_idx++] = MOTE_MAC_RX_PARAM_SETUP_ANS;
373
+ // Status: Datarate ACK, Channel ACK
374
+ mac_cmd_buffer[mac_cmd_buf_idx++] = status;
375
+ // This is a sticky MAC command answer. Setup indication
376
+ sticky_mac_cmd = true ;
377
+ ret = LORAWAN_STATUS_OK;
378
+ mac_cmd_in_next_tx = true ;
379
+ }
380
+ return ret;
381
+ }
382
+
383
+ lorawan_status_t LoRaMacCommand::add_dev_status_ans (uint8_t battery, uint8_t margin)
384
+ {
385
+ lorawan_status_t ret = LORAWAN_STATUS_LENGTH_ERROR;
386
+ if (cmd_buffer_remaining () > 2 ) {
387
+ mac_cmd_buffer[mac_cmd_buf_idx++] = MOTE_MAC_DEV_STATUS_ANS;
388
+ // 1st byte Battery
389
+ // 2nd byte Margin
390
+ mac_cmd_buffer[mac_cmd_buf_idx++] = battery;
391
+ mac_cmd_buffer[mac_cmd_buf_idx++] = margin;
392
+ ret = LORAWAN_STATUS_OK;
393
+ mac_cmd_in_next_tx = true ;
394
+ }
395
+ return ret;
396
+ }
397
+
398
+ lorawan_status_t LoRaMacCommand::add_new_channel_ans (uint8_t status)
399
+ {
400
+ lorawan_status_t ret = LORAWAN_STATUS_LENGTH_ERROR;
401
+ if (cmd_buffer_remaining () > 1 ) {
402
+ mac_cmd_buffer[mac_cmd_buf_idx++] = MOTE_MAC_NEW_CHANNEL_ANS;
403
+ // Status: Datarate range OK, Channel frequency OK
404
+ mac_cmd_buffer[mac_cmd_buf_idx++] = status;
405
+ ret = LORAWAN_STATUS_OK;
406
+ mac_cmd_in_next_tx = true ;
407
+ }
408
+ return ret;
409
+ }
410
+
411
+ lorawan_status_t LoRaMacCommand::add_rx_timing_setup_ans ()
412
+ {
413
+ lorawan_status_t ret = LORAWAN_STATUS_LENGTH_ERROR;
414
+ if (cmd_buffer_remaining () > 0 ) {
415
+ mac_cmd_buffer[mac_cmd_buf_idx++] = MOTE_MAC_RX_TIMING_SETUP_ANS;
416
+ // No payload for this answer
417
+ // This is a sticky MAC command answer. Setup indication
418
+ sticky_mac_cmd = true ;
419
+ ret = LORAWAN_STATUS_OK;
420
+ mac_cmd_in_next_tx = true ;
421
+ }
422
+ return ret;
423
+ }
424
+
425
+ lorawan_status_t LoRaMacCommand::add_tx_param_setup_ans ()
426
+ {
427
+ lorawan_status_t ret = LORAWAN_STATUS_LENGTH_ERROR;
428
+ if (cmd_buffer_remaining () > 0 ) {
429
+ mac_cmd_buffer[mac_cmd_buf_idx++] = MOTE_MAC_TX_PARAM_SETUP_ANS;
430
+ // No payload for this answer
431
+ ret = LORAWAN_STATUS_OK;
432
+ mac_cmd_in_next_tx = true ;
433
+ }
434
+ return ret;
435
+ }
436
+
437
+ lorawan_status_t LoRaMacCommand::add_dl_channel_ans (uint8_t status)
438
+ {
439
+ lorawan_status_t ret = LORAWAN_STATUS_LENGTH_ERROR;
440
+ if (cmd_buffer_remaining () > 0 ) {
441
+ mac_cmd_buffer[mac_cmd_buf_idx++] = MOTE_MAC_DL_CHANNEL_ANS;
442
+ // Status: Uplink frequency exists, Channel frequency OK
443
+ mac_cmd_buffer[mac_cmd_buf_idx++] = status;
444
+ // This is a sticky MAC command answer. Setup indication
445
+ sticky_mac_cmd = true ;
446
+ ret = LORAWAN_STATUS_OK;
447
+ mac_cmd_in_next_tx = true ;
448
+ }
449
+ return ret;
450
+ }
0 commit comments