From 76267bdfea4bfaaf858705aa5aad92bddde163e3 Mon Sep 17 00:00:00 2001 From: Alexandre Abadie Date: Thu, 17 Oct 2019 09:44:01 +0200 Subject: [PATCH] drivers/rn2xx3: cleanup sleep function --- drivers/include/rn2xx3.h | 14 +++----------- drivers/rn2xx3/rn2xx3.c | 18 ++++++++++++++++-- drivers/rn2xx3/rn2xx3_internal.c | 12 ++---------- 3 files changed, 21 insertions(+), 23 deletions(-) diff --git a/drivers/include/rn2xx3.h b/drivers/include/rn2xx3.h index d30029ca29..560b96bbbb 100644 --- a/drivers/include/rn2xx3.h +++ b/drivers/include/rn2xx3.h @@ -260,22 +260,14 @@ int rn2xx3_mac_init(rn2xx3_t *dev); int rn2xx3_write_cmd(rn2xx3_t *dev); /** - * @brief Writes a command to the RN2XX3 device but don't wait for timeout + * @brief Writes a command to the RN2XX3 device but don't wait for timeout or response * - * The module will immediately reply with a meaningful message if the command - * is valid or not. + * The response can be checked in the `dev->resp_buf` buffer after a small delay + * (for example 1ms). * * @param[in] dev RN2XX3 device descriptor * * @return RN2XX3_OK on success - * @return RN2XX3_ERR_INVALID_PARAM if command is invalid - * @return RN2XX3_ERR_NOT_JOINED if network is not joined - * @return RN2XX3_ERR_NO_FREE_CH if no free channel - * @return RN2XX3_ERR_SILENT if device is in Silent state - * @return RN2XX3_ERR_FR_CNT_REJOIN_NEEDED if frame counter rolled over - * @return RN2XX3_ERR_BUSY if MAC is not in Idle state - * @return RN2XX3_ERR_INVALID_DATA_LENGTH if payload is too large - * @return RN2XX3_ERR_KEYS_NOT_INIT if keys are not configured */ int rn2xx3_write_cmd_no_wait(rn2xx3_t *dev); diff --git a/drivers/rn2xx3/rn2xx3.c b/drivers/rn2xx3/rn2xx3.c index 28d0723213..ce0375677f 100644 --- a/drivers/rn2xx3/rn2xx3.c +++ b/drivers/rn2xx3/rn2xx3.c @@ -222,9 +222,23 @@ int rn2xx3_sys_factory_reset(rn2xx3_t *dev) int rn2xx3_sys_sleep(rn2xx3_t *dev) { size_t p = snprintf(dev->cmd_buf, sizeof(dev->cmd_buf) - 1, - "sys sleep %lu", (unsigned long)dev->sleep); + "sys sleep %" PRIu32 "", dev->sleep); dev->cmd_buf[p] = 0; - if (rn2xx3_write_cmd_no_wait(dev) == RN2XX3_ERR_INVALID_PARAM) { + + if (dev->int_state == RN2XX3_INT_STATE_SLEEP) { + DEBUG("[rn2xx3] sleep: device already in sleep mode\n"); + return RN2XX3_ERR_SLEEP_MODE; + } + + /* always succeeds */ + rn2xx3_write_cmd_no_wait(dev); + + /* Wait a little to check if the device could go to sleep. No answer means + it worked. */ + xtimer_usleep(US_PER_MS); + + DEBUG("[rn2xx3] RESP: %s\n", dev->resp_buf); + if (rn2xx3_process_response(dev) == RN2XX3_ERR_INVALID_PARAM) { DEBUG("[rn2xx3] sleep: cannot put module in sleep mode\n"); return RN2XX3_ERR_INVALID_PARAM; } diff --git a/drivers/rn2xx3/rn2xx3_internal.c b/drivers/rn2xx3/rn2xx3_internal.c index 520ef4e97b..d147336ca3 100644 --- a/drivers/rn2xx3/rn2xx3_internal.c +++ b/drivers/rn2xx3/rn2xx3_internal.c @@ -178,22 +178,14 @@ int rn2xx3_write_cmd(rn2xx3_t *dev) int rn2xx3_write_cmd_no_wait(rn2xx3_t *dev) { - DEBUG("[rn2xx3] CMD: %s\n", dev->cmd_buf); - - if (dev->int_state == RN2XX3_INT_STATE_SLEEP) { - DEBUG("[rn2xx3] ABORT: device is in sleep mode\n"); - return RN2XX3_ERR_SLEEP_MODE; - } + DEBUG("[rn2xx3] CMD (NO WAIT): %s\n", dev->cmd_buf); mutex_lock(&(dev->cmd_lock)); _uart_write_str(dev, dev->cmd_buf); _uart_write_str(dev, closing_seq); - - DEBUG("[rn2xx3] RET: %s\n", dev->resp_buf); - mutex_unlock(&(dev->cmd_lock)); - return rn2xx3_process_response(dev); + return RN2XX3_OK; } int rn2xx3_wait_response(rn2xx3_t *dev)