Skip to content

Commit 65eede8

Browse files
martinjaegernashif
authored andcommitted
lorawan: add LoRaWAN Class C support
The functions for Class C mode are already provided by LoRaMAC layer. A device in this mode is listening for incoming downlink messages almost continuously, which results in higher energy consumption. Class C mode is required for FUOTA. Signed-off-by: Martin Jäger <martin@libre.solar>
1 parent 6d42ded commit 65eede8

File tree

1 file changed

+15
-8
lines changed

1 file changed

+15
-8
lines changed

subsys/lorawan/lorawan.c

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -363,28 +363,35 @@ int lorawan_join(const struct lorawan_join_config *join_cfg)
363363

364364
int lorawan_set_class(enum lorawan_class dev_class)
365365
{
366-
LoRaMacStatus_t status;
367366
MibRequestConfirm_t mib_req;
367+
DeviceClass_t current_class;
368+
LoRaMacStatus_t status;
368369

369370
mib_req.Type = MIB_DEVICE_CLASS;
371+
LoRaMacMibGetRequestConfirm(&mib_req);
372+
current_class = mib_req.Param.Class;
370373

371374
switch (dev_class) {
372375
case LORAWAN_CLASS_A:
373376
mib_req.Param.Class = CLASS_A;
374377
break;
375378
case LORAWAN_CLASS_B:
376-
case LORAWAN_CLASS_C:
377-
LOG_ERR("Device class not supported yet!");
379+
LOG_ERR("Class B not supported yet!");
378380
return -ENOTSUP;
381+
case LORAWAN_CLASS_C:
382+
mib_req.Param.Class = CLASS_C;
383+
break;
379384
default:
380385
return -EINVAL;
381386
}
382387

383-
status = LoRaMacMibSetRequestConfirm(&mib_req);
384-
if (status != LORAMAC_STATUS_OK) {
385-
LOG_ERR("Failed to set device class: %s",
386-
lorawan_status2str(status));
387-
return lorawan_status2errno(status);
388+
if (mib_req.Param.Class != current_class) {
389+
status = LoRaMacMibSetRequestConfirm(&mib_req);
390+
if (status != LORAMAC_STATUS_OK) {
391+
LOG_ERR("Failed to set device class: %s",
392+
lorawan_status2str(status));
393+
return lorawan_status2errno(status);
394+
}
388395
}
389396

390397
return 0;

0 commit comments

Comments
 (0)