From 65eede8194e07501005dc910310a42e9c8ffd9a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20J=C3=A4ger?= Date: Mon, 13 Jun 2022 11:35:34 +0200 Subject: [PATCH] lorawan: add LoRaWAN Class C support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- subsys/lorawan/lorawan.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/subsys/lorawan/lorawan.c b/subsys/lorawan/lorawan.c index a8e55597db1..c55dd58c99a 100644 --- a/subsys/lorawan/lorawan.c +++ b/subsys/lorawan/lorawan.c @@ -363,28 +363,35 @@ out: int lorawan_set_class(enum lorawan_class dev_class) { - LoRaMacStatus_t status; MibRequestConfirm_t mib_req; + DeviceClass_t current_class; + LoRaMacStatus_t status; mib_req.Type = MIB_DEVICE_CLASS; + LoRaMacMibGetRequestConfirm(&mib_req); + current_class = mib_req.Param.Class; switch (dev_class) { case LORAWAN_CLASS_A: mib_req.Param.Class = CLASS_A; break; case LORAWAN_CLASS_B: - case LORAWAN_CLASS_C: - LOG_ERR("Device class not supported yet!"); + LOG_ERR("Class B not supported yet!"); return -ENOTSUP; + case LORAWAN_CLASS_C: + mib_req.Param.Class = CLASS_C; + break; default: return -EINVAL; } - status = LoRaMacMibSetRequestConfirm(&mib_req); - if (status != LORAMAC_STATUS_OK) { - LOG_ERR("Failed to set device class: %s", - lorawan_status2str(status)); - return lorawan_status2errno(status); + if (mib_req.Param.Class != current_class) { + status = LoRaMacMibSetRequestConfirm(&mib_req); + if (status != LORAMAC_STATUS_OK) { + LOG_ERR("Failed to set device class: %s", + lorawan_status2str(status)); + return lorawan_status2errno(status); + } } return 0;