diff --git a/pkg/semtech-loramac/contrib/semtech_loramac.c b/pkg/semtech-loramac/contrib/semtech_loramac.c index 4e6d0195c2fa4e07b29cec45024c224de4861892..0114d65576427789c3f6dbd72a488a1edcefa9ba 100644 --- a/pkg/semtech-loramac/contrib/semtech_loramac.c +++ b/pkg/semtech-loramac/contrib/semtech_loramac.c @@ -171,6 +171,11 @@ static void mcps_confirm(McpsConfirm_t *confirm) break; } } + else { + msg_t msg; + msg.type = MSG_TYPE_LORAMAC_TX_CNF_FAILED; + msg_send(&msg, semtech_loramac_pid); + } } /* MCPS-Indication event function */ @@ -555,6 +560,14 @@ void *_semtech_loramac_event_loop(void *arg) mac->state = SEMTECH_LORAMAC_STATE_IDLE; break; } + case MSG_TYPE_LORAMAC_TX_CNF_FAILED: + DEBUG("[semtech-loramac] loramac TX failed\n"); + msg_t msg_ret; + msg_ret.type = MSG_TYPE_LORAMAC_TX_CNF_FAILED; + msg_send(&msg_ret, mac->caller_pid); + /* switch back to idle state now*/ + mac->state = SEMTECH_LORAMAC_STATE_IDLE; + break; case MSG_TYPE_LORAMAC_RX: { msg_t msg_ret; @@ -678,10 +691,18 @@ uint8_t semtech_loramac_recv(semtech_loramac_t *mac) /* Wait until the mac receive some information */ msg_t msg; msg_receive(&msg); - uint8_t ret = SEMTECH_LORAMAC_TX_DONE; - if (msg.type == MSG_TYPE_LORAMAC_RX) { - ret = SEMTECH_LORAMAC_DATA_RECEIVED; - } + uint8_t ret; + switch (msg.type) { + case MSG_TYPE_LORAMAC_RX: + ret = SEMTECH_LORAMAC_DATA_RECEIVED; + break; + case MSG_TYPE_LORAMAC_TX_CNF_FAILED: + ret = SEMTECH_LORAMAC_TX_CNF_FAILED; + break; + default: + ret = SEMTECH_LORAMAC_TX_DONE; + break; + } DEBUG("[semtech-loramac] MAC reply received: %d\n", ret); diff --git a/pkg/semtech-loramac/include/semtech_loramac.h b/pkg/semtech-loramac/include/semtech_loramac.h index 065ddd0a2c898b3b5e2cec99e6923296ea11d68d..c0e07750cf9961b97ce3bdda8994ee177f0b7b7a 100644 --- a/pkg/semtech-loramac/include/semtech_loramac.h +++ b/pkg/semtech-loramac/include/semtech_loramac.h @@ -45,6 +45,7 @@ extern "C" { #define MSG_TYPE_LORAMAC_TX_DONE (0x3462) /**< MAC TX completes */ #define MSG_TYPE_LORAMAC_RX (0x3463) /**< Some data received */ #define MSG_TYPE_LORAMAC_LINK_CHECK (0x3464) /**< Link check info received */ +#define MSG_TYPE_LORAMAC_TX_CNF_FAILED (0x3465) /**< MAC TX confirmed failed */ /** @} */ /** @@ -61,6 +62,7 @@ enum { SEMTECH_LORAMAC_NOT_JOINED, /**< MAC is not joined */ SEMTECH_LORAMAC_TX_SCHEDULED, /**< TX data scheduled */ SEMTECH_LORAMAC_TX_DONE, /**< Transmission completed */ + SEMTECH_LORAMAC_TX_CNF_FAILED, /**< Confirmable transmission failed */ SEMTECH_LORAMAC_DATA_RECEIVED, /**< Data received */ SEMTECH_LORAMAC_BUSY /**< Internal MAC is busy */ }; diff --git a/tests/pkg_semtech-loramac/main.c b/tests/pkg_semtech-loramac/main.c index 0d19cf4e5f1ba90aadf7f58af4567cfe6d06f041..a107aca2c4605346acff86e6f19a1b5a9942e6be 100644 --- a/tests/pkg_semtech-loramac/main.c +++ b/tests/pkg_semtech-loramac/main.c @@ -411,6 +411,10 @@ static int _cmd_loramac(int argc, char **argv) (char *)loramac.rx_data.payload, loramac.rx_data.port); break; + case SEMTECH_LORAMAC_TX_CNF_FAILED: + puts("Confirmable TX failed"); + break; + case SEMTECH_LORAMAC_TX_DONE: puts("TX complete, no data received"); break;