Skip to content

Commit 46379d8

Browse files
author
Cruz Monrreal
authored
Merge pull request #6741 from kivaisan/refactor_maccommand
Lora: Split add_mac_command() into separate methods
2 parents 0196ba7 + e7f01e3 commit 46379d8

File tree

3 files changed

+235
-149
lines changed

3 files changed

+235
-149
lines changed

features/lorawan/lorastack/mac/LoRaMac.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1432,7 +1432,7 @@ void LoRaMac::setup_link_check_request()
14321432

14331433
_mlme_confirmation.req_type = MLME_LINK_CHECK;
14341434
_params.flags.bits.mlme_req = 1;
1435-
mac_commands.add_mac_command(MOTE_MAC_LINK_CHECK_REQ, 0, 0);
1435+
mac_commands.add_link_check_req();
14361436
}
14371437

14381438
lorawan_status_t LoRaMac::prepare_join(const lorawan_connect_t *params, bool is_otaa)

features/lorawan/lorastack/mac/LoRaMacCommand.cpp

Lines changed: 143 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -51,107 +51,6 @@ LoRaMacCommand::LoRaMacCommand()
5151
memset(mac_cmd_buffer_to_repeat, 0, sizeof(mac_cmd_buffer_to_repeat));
5252
}
5353

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-
15554
void LoRaMacCommand::clear_command_buffer()
15655
{
15756
mac_cmd_buf_idx = 0;
@@ -185,7 +84,8 @@ void LoRaMacCommand::parse_mac_commands_to_repeat()
18584
mac_cmd_buffer_to_repeat[cmd_cnt++] = mac_cmd_buffer[i];
18685
break;
18786
}
188-
// NON-STICKY
87+
88+
// NON-STICKY
18989
case MOTE_MAC_DEV_STATUS_ANS: { // 2 bytes payload
19090
i += 2;
19191
break;
@@ -298,7 +198,7 @@ lorawan_status_t LoRaMacCommand::process_mac_commands(uint8_t *payload, uint8_t
298198

299199
// Add the answers to the buffer
300200
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);
302202
}
303203
// Update MAC index
304204
mac_index += linkAdrNbBytesParsed - 1;
@@ -307,7 +207,7 @@ lorawan_status_t LoRaMacCommand::process_mac_commands(uint8_t *payload, uint8_t
307207
case SRV_MAC_DUTY_CYCLE_REQ:
308208
mac_sys_params.max_duty_cycle = payload[mac_index++];
309209
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();
311211
break;
312212
case SRV_MAC_RX_PARAM_SETUP_REQ: {
313213
rx_param_setup_req_t rxParamSetupReq;
@@ -317,32 +217,26 @@ lorawan_status_t LoRaMacCommand::process_mac_commands(uint8_t *payload, uint8_t
317217
mac_index++;
318218

319219
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;
324222
rxParamSetupReq.frequency *= 100;
325223

326224
// Perform request on region
327225
status = lora_phy.accept_rx_param_setup_req(&rxParamSetupReq);
328226

329227
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;
334230
mac_sys_params.rx1_dr_offset = rxParamSetupReq.dr_offset;
335231
}
336-
ret_value = add_mac_command(MOTE_MAC_RX_PARAM_SETUP_ANS, status,
337-
0);
232+
ret_value = add_rx_param_setup_ans(status);
338233
}
339234
break;
340235
case SRV_MAC_DEV_STATUS_REQ: {
341236
uint8_t batteryLevel = BAT_LEVEL_NO_MEASURE;
342237
// we don't have a mechanism at the moment to measure
343238
// 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);
346240
break;
347241
}
348242
case SRV_MAC_NEW_CHANNEL_REQ: {
@@ -358,7 +252,7 @@ lorawan_status_t LoRaMacCommand::process_mac_commands(uint8_t *payload, uint8_t
358252

359253
status = lora_phy.request_new_channel(channel_id, &chParam);
360254

361-
ret_value = add_mac_command(MOTE_MAC_NEW_CHANNEL_ANS, status, 0);
255+
ret_value = add_new_channel_ans(status);
362256
}
363257
break;
364258
case SRV_MAC_RX_TIMING_SETUP_REQ: {
@@ -369,7 +263,7 @@ lorawan_status_t LoRaMacCommand::process_mac_commands(uint8_t *payload, uint8_t
369263
}
370264
mac_sys_params.recv_delay1 = delay * 1000;
371265
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();
373267
}
374268
break;
375269
case SRV_MAC_TX_PARAM_SETUP_REQ: {
@@ -392,30 +286,25 @@ lorawan_status_t LoRaMacCommand::process_mac_commands(uint8_t *payload, uint8_t
392286
// Check the status for correctness
393287
if (lora_phy.accept_tx_param_setup_req(ul_dwell_time, dl_dwell_time)) {
394288
// 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];
401292
// 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();
403294
}
404295
}
405296
break;
406297
case SRV_MAC_DL_CHANNEL_REQ: {
407-
408298
uint8_t channel_id = payload[mac_index++];
409299
uint32_t rx1_frequency;
410300

411301
rx1_frequency = (uint32_t) payload[mac_index++];
412302
rx1_frequency |= (uint32_t) payload[mac_index++] << 8;
413303
rx1_frequency |= (uint32_t) payload[mac_index++] << 16;
414304
rx1_frequency *= 100;
415-
416305
status = lora_phy.dl_channel_request(channel_id, rx1_frequency);
417306

418-
ret_value = add_mac_command(MOTE_MAC_DL_CHANNEL_ANS, status, 0);
307+
ret_value = add_dl_channel_ans(status);
419308
}
420309
break;
421310
default:
@@ -433,3 +322,129 @@ bool LoRaMacCommand::is_sticky_mac_command_pending()
433322
}
434323
return false;
435324
}
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

Comments
 (0)