@@ -87,21 +87,15 @@ lorawan_status_t LoRaWANStack::set_application_port(uint8_t port)
87
87
LoRaWANStack::LoRaWANStack ()
88
88
: _loramac(_lora_time), _lora_phy(_lora_time),
89
89
_device_current_state(DEVICE_STATE_NOT_INITIALIZED), _mac_handlers(NULL ),
90
- _num_retry(1 ), _queue(NULL ), _duty_cycle_on(MBED_CONF_LORA_DUTY_CYCLE_ON)
90
+ _num_retry(1 ), _app_port(INVALID_PORT), _duty_cycle_on(MBED_CONF_LORA_DUTY_CYCLE_ON),
91
+ _queue(NULL )
91
92
{
92
93
#ifdef MBED_CONF_LORA_APP_PORT
93
- // is_port_valid() is not virtual, so we can call it in constructor
94
94
if (is_port_valid (MBED_CONF_LORA_APP_PORT)) {
95
95
_app_port = MBED_CONF_LORA_APP_PORT;
96
96
} else {
97
97
tr_error (" User defined port in .json is illegal." );
98
- _app_port = INVALID_PORT;
99
98
}
100
-
101
- #else
102
- // initialize it to INVALID_PORT (255) an illegal port number.
103
- // user should set the port
104
- _app_port = INVALID_PORT;
105
99
#endif
106
100
107
101
memset (&_lw_session, 0 , sizeof (_lw_session));
@@ -175,95 +169,6 @@ lorawan_status_t LoRaWANStack::initialize_mac_layer(EventQueue *queue)
175
169
return lora_state_machine ();
176
170
}
177
171
178
- #if defined(LORAWAN_COMPLIANCE_TEST)
179
- /* *
180
- *
181
- * Prepares the upload message to reserved ports
182
- *
183
- * \param port Application port
184
- */
185
- void LoRaWANStack::prepare_special_tx_frame (uint8_t port)
186
- {
187
- if (port == 224 ) {
188
- // Clear any normal message stuff before compliance test.
189
- memset (&_tx_msg, 0 , sizeof (_tx_msg));
190
-
191
- if (_compliance_test.link_check == true ) {
192
- _compliance_test.link_check = false ;
193
- _compliance_test.state = 1 ;
194
- _tx_msg.f_buffer_size = 3 ;
195
- _tx_msg.f_buffer [0 ] = 5 ;
196
- _tx_msg.f_buffer [1 ] = _compliance_test.demod_margin ;
197
- _tx_msg.f_buffer [2 ] = _compliance_test.nb_gateways ;
198
- } else {
199
- switch (_compliance_test.state ) {
200
- case 4 :
201
- _compliance_test.state = 1 ;
202
- _tx_msg.f_buffer_size = _compliance_test.app_data_size ;
203
-
204
- _tx_msg.f_buffer [0 ] = _compliance_test.app_data_buffer [0 ];
205
- for (uint8_t i = 1 ; i < MIN (_compliance_test.app_data_size , MBED_CONF_LORA_TX_MAX_SIZE); ++i) {
206
- _tx_msg.f_buffer [i] = _compliance_test.app_data_buffer [i];
207
- }
208
- break ;
209
- case 1 :
210
- _tx_msg.f_buffer_size = 2 ;
211
- _tx_msg.f_buffer [0 ] = _compliance_test.downlink_counter >> 8 ;
212
- _tx_msg.f_buffer [1 ] = _compliance_test.downlink_counter ;
213
- break ;
214
- }
215
- }
216
- }
217
- }
218
-
219
- /* * Hands over the compliance test frame to MAC layer
220
- *
221
- * \return returns the state of the LoRa MAC
222
- */
223
- lorawan_status_t LoRaWANStack::send_compliance_test_frame_to_mac ()
224
- {
225
- loramac_mcps_req_t mcps_req;
226
-
227
- get_phy_params_t phy_params;
228
- phy_param_t default_datarate;
229
- phy_params.attribute = PHY_DEF_TX_DR;
230
- default_datarate = _lora_phy.get_phy_params (&phy_params);
231
-
232
- prepare_special_tx_frame (_compliance_test.app_port );
233
-
234
- if (!_compliance_test.is_tx_confirmed ) {
235
- mcps_req.type = MCPS_UNCONFIRMED;
236
- mcps_req.req .unconfirmed .fport = _compliance_test.app_port ;
237
- mcps_req.f_buffer = _tx_msg.f_buffer ;
238
- mcps_req.f_buffer_size = _tx_msg.f_buffer_size ;
239
- mcps_req.req .unconfirmed .data_rate = default_datarate.value ;
240
-
241
- tr_info (" Transmit unconfirmed compliance test frame %d bytes." , mcps_req.f_buffer_size );
242
-
243
- for (uint8_t i = 0 ; i < mcps_req.f_buffer_size ; ++i) {
244
- tr_info (" Byte %d, data is 0x%x" , i+1 , ((uint8_t *)mcps_req.f_buffer )[i]);
245
- }
246
- } else if (_compliance_test.is_tx_confirmed ) {
247
- mcps_req.type = MCPS_CONFIRMED;
248
- mcps_req.req .confirmed .fport = _compliance_test.app_port ;
249
- mcps_req.f_buffer = _tx_msg.f_buffer ;
250
- mcps_req.f_buffer_size = _tx_msg.f_buffer_size ;
251
- mcps_req.req .confirmed .nb_trials = _num_retry;
252
- mcps_req.req .confirmed .data_rate = default_datarate.value ;
253
-
254
- tr_info (" Transmit confirmed compliance test frame %d bytes." , mcps_req.f_buffer_size );
255
-
256
- for (uint8_t i = 0 ; i < mcps_req.f_buffer_size ; ++i) {
257
- tr_info (" Byte %d, data is 0x%x" , i+1 , ((uint8_t *)mcps_req.f_buffer )[i]);
258
- }
259
- } else {
260
- return LORAWAN_STATUS_SERVICE_UNKNOWN;
261
- }
262
-
263
- return mcps_request_handler (&mcps_req);
264
- }
265
- #endif
266
-
267
172
uint16_t LoRaWANStack::check_possible_tx_size (uint16_t size)
268
173
{
269
174
loramac_tx_info_t tx_info;
@@ -286,51 +191,48 @@ lorawan_status_t LoRaWANStack::send_frame_to_mac()
286
191
lorawan_status_t status;
287
192
loramac_mib_req_confirm_t mib_get_params;
288
193
289
- get_phy_params_t phy_params;
290
- phy_param_t default_datarate;
291
- phy_params.attribute = PHY_DEF_TX_DR;
292
- default_datarate = _lora_phy.get_phy_params (&phy_params);
293
-
294
194
mcps_req.type = _tx_msg.type ;
295
195
296
196
if (MCPS_UNCONFIRMED == mcps_req.type ) {
297
- mcps_req.req .unconfirmed .fport = _tx_msg.message_u .unconfirmed .fport ;
298
197
mcps_req.f_buffer = _tx_msg.f_buffer ;
299
-
300
198
mcps_req.f_buffer_size = _tx_msg.f_buffer_size ;
301
199
200
+ mcps_req.fport = _tx_msg.fport ;
201
+ mcps_req.nb_trials = 1 ;
302
202
mib_get_params.type = MIB_CHANNELS_DATARATE;
303
203
if (mib_get_request (&mib_get_params) != LORAWAN_STATUS_OK) {
304
204
tr_debug (" Couldn't get MIB parameters: Using default data rate" );
305
- mcps_req.req . unconfirmed . data_rate = default_datarate. value ;
205
+ mcps_req.data_rate = _lora_phy. get_default_tx_datarate () ;
306
206
} else {
307
- mcps_req.req . unconfirmed . data_rate = mib_get_params.param .channel_data_rate ;
207
+ mcps_req.data_rate = mib_get_params.param .channel_data_rate ;
308
208
}
309
209
310
210
} else if (mcps_req.type == MCPS_CONFIRMED) {
311
- mcps_req.req .confirmed .fport = _tx_msg.message_u .confirmed .fport ;
312
211
mcps_req.f_buffer = _tx_msg.f_buffer ;
313
212
mcps_req.f_buffer_size = _tx_msg.f_buffer_size ;
314
- mcps_req.req .confirmed .nb_trials = _tx_msg.message_u .confirmed .nb_trials ;
213
+ mcps_req.fport = _tx_msg.fport ;
214
+ mcps_req.nb_trials = _tx_msg.nb_trials ;
315
215
316
216
mib_get_params.type = MIB_CHANNELS_DATARATE;
317
217
if (mib_get_request (&mib_get_params) != LORAWAN_STATUS_OK) {
318
218
tr_debug (" Couldn't get MIB parameters: Using default data rate" );
319
- mcps_req.req . confirmed . data_rate = default_datarate. value ;
219
+ mcps_req.data_rate = _lora_phy. get_default_tx_datarate () ;
320
220
} else {
321
- mcps_req.req . confirmed . data_rate = mib_get_params.param .channel_data_rate ;
221
+ mcps_req.data_rate = mib_get_params.param .channel_data_rate ;
322
222
}
323
223
324
224
} else if ( mcps_req.type == MCPS_PROPRIETARY) {
325
225
mcps_req.f_buffer = _tx_msg.f_buffer ;
326
226
mcps_req.f_buffer_size = _tx_msg.f_buffer_size ;
227
+ mcps_req.fport = 0 ;
228
+ mcps_req.nb_trials = 1 ;
327
229
328
230
mib_get_params.type = MIB_CHANNELS_DATARATE;
329
231
if (mib_get_request (&mib_get_params) != LORAWAN_STATUS_OK) {
330
232
tr_debug (" Couldn't get MIB parameters: Using default data rate" );
331
- mcps_req.req . proprietary . data_rate = default_datarate. value ;
233
+ mcps_req.data_rate = _lora_phy. get_default_tx_datarate () ;
332
234
} else {
333
- mcps_req.req . proprietary . data_rate = mib_get_params.param .channel_data_rate ;
235
+ mcps_req.data_rate = mib_get_params.param .channel_data_rate ;
334
236
}
335
237
336
238
} else {
@@ -661,7 +563,7 @@ int16_t LoRaWANStack::handle_tx(uint8_t port, const uint8_t* data,
661
563
|| (flags & MSG_FLAG_MASK) == MSG_UNCONFIRMED_PROPRIETARY) {
662
564
663
565
_tx_msg.type = MCPS_UNCONFIRMED;
664
- _tx_msg.message_u . unconfirmed . fport = _app_port;
566
+ _tx_msg.fport = _app_port;
665
567
}
666
568
667
569
// Handles all confirmed messages, including proprietary and multicast
@@ -670,8 +572,8 @@ int16_t LoRaWANStack::handle_tx(uint8_t port, const uint8_t* data,
670
572
|| (flags & MSG_FLAG_MASK) == MSG_CONFIRMED_PROPRIETARY) {
671
573
672
574
_tx_msg.type = MCPS_CONFIRMED;
673
- _tx_msg.message_u . confirmed . fport = _app_port;
674
- _tx_msg.message_u . confirmed . nb_trials = _num_retry;
575
+ _tx_msg.fport = _app_port;
576
+ _tx_msg.nb_trials = _num_retry;
675
577
}
676
578
677
579
tr_info (" RTS = %u bytes, PEND = %u" , _tx_msg.f_buffer_size , _tx_msg.pending_size );
@@ -1367,3 +1269,89 @@ lorawan_status_t LoRaWANStack::lora_state_machine()
1367
1269
1368
1270
return status;
1369
1271
}
1272
+
1273
+ #if defined(LORAWAN_COMPLIANCE_TEST)
1274
+ /* *
1275
+ *
1276
+ * Prepares the upload message to reserved ports
1277
+ *
1278
+ * \param port Application port
1279
+ */
1280
+ void LoRaWANStack::prepare_special_tx_frame (uint8_t port)
1281
+ {
1282
+ if (port == 224 ) {
1283
+ // Clear any normal message stuff before compliance test.
1284
+ memset (&_tx_msg, 0 , sizeof (_tx_msg));
1285
+
1286
+ if (_compliance_test.link_check == true ) {
1287
+ _compliance_test.link_check = false ;
1288
+ _compliance_test.state = 1 ;
1289
+ _tx_msg.f_buffer_size = 3 ;
1290
+ _tx_msg.f_buffer [0 ] = 5 ;
1291
+ _tx_msg.f_buffer [1 ] = _compliance_test.demod_margin ;
1292
+ _tx_msg.f_buffer [2 ] = _compliance_test.nb_gateways ;
1293
+ } else {
1294
+ switch (_compliance_test.state ) {
1295
+ case 4 :
1296
+ _compliance_test.state = 1 ;
1297
+ _tx_msg.f_buffer_size = _compliance_test.app_data_size ;
1298
+
1299
+ _tx_msg.f_buffer [0 ] = _compliance_test.app_data_buffer [0 ];
1300
+ for (uint8_t i = 1 ; i < MIN (_compliance_test.app_data_size , MBED_CONF_LORA_TX_MAX_SIZE); ++i) {
1301
+ _tx_msg.f_buffer [i] = _compliance_test.app_data_buffer [i];
1302
+ }
1303
+ break ;
1304
+ case 1 :
1305
+ _tx_msg.f_buffer_size = 2 ;
1306
+ _tx_msg.f_buffer [0 ] = _compliance_test.downlink_counter >> 8 ;
1307
+ _tx_msg.f_buffer [1 ] = _compliance_test.downlink_counter ;
1308
+ break ;
1309
+ }
1310
+ }
1311
+ }
1312
+ }
1313
+
1314
+ /* * Hands over the compliance test frame to MAC layer
1315
+ *
1316
+ * \return returns the state of the LoRa MAC
1317
+ */
1318
+ lorawan_status_t LoRaWANStack::send_compliance_test_frame_to_mac ()
1319
+ {
1320
+ loramac_mcps_req_t mcps_req;
1321
+
1322
+ prepare_special_tx_frame (_compliance_test.app_port );
1323
+
1324
+ if (!_compliance_test.is_tx_confirmed ) {
1325
+ mcps_req.type = MCPS_UNCONFIRMED;
1326
+ mcps_req.f_buffer = _tx_msg.f_buffer ;
1327
+ mcps_req.f_buffer_size = _tx_msg.f_buffer_size ;
1328
+ mcps_req.fport = _compliance_test.app_port ;
1329
+ mcps_req.nb_trials = 1 ;
1330
+ mcps_req.data_rate = _lora_phy.get_default_tx_datarate ();
1331
+
1332
+ tr_info (" Transmit unconfirmed compliance test frame %d bytes." , mcps_req.f_buffer_size );
1333
+
1334
+ for (uint8_t i = 0 ; i < mcps_req.f_buffer_size ; ++i) {
1335
+ tr_info (" Byte %d, data is 0x%x" , i+1 , ((uint8_t *)mcps_req.f_buffer )[i]);
1336
+ }
1337
+ } else if (_compliance_test.is_tx_confirmed ) {
1338
+ mcps_req.type = MCPS_CONFIRMED;
1339
+ mcps_req.f_buffer = _tx_msg.f_buffer ;
1340
+ mcps_req.f_buffer_size = _tx_msg.f_buffer_size ;
1341
+ mcps_req.fport = _compliance_test.app_port ;
1342
+ mcps_req.nb_trials = _num_retry;
1343
+ mcps_req.data_rate = _lora_phy.get_default_tx_datarate ();
1344
+
1345
+ tr_info (" Transmit confirmed compliance test frame %d bytes." , mcps_req.f_buffer_size );
1346
+
1347
+ for (uint8_t i = 0 ; i < mcps_req.f_buffer_size ; ++i) {
1348
+ tr_info (" Byte %d, data is 0x%x" , i+1 , ((uint8_t *)mcps_req.f_buffer )[i]);
1349
+ }
1350
+ } else {
1351
+ return LORAWAN_STATUS_SERVICE_UNKNOWN;
1352
+ }
1353
+
1354
+ return mcps_request_handler (&mcps_req);
1355
+ }
1356
+ #endif
1357
+
0 commit comments