drivers/at: add URC registering and parsing feature
This commit is contained in:
parent
011b80cb92
commit
3393888cea
@ -266,3 +266,52 @@ out:
|
|||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef MODULE_AT_URC
|
||||||
|
void at_add_urc(at_dev_t *dev, at_urc_t *urc)
|
||||||
|
{
|
||||||
|
assert(urc);
|
||||||
|
assert(urc->code);
|
||||||
|
assert(strlen(urc->code) != 0);
|
||||||
|
assert(urc->cb);
|
||||||
|
|
||||||
|
clist_rpush(&dev->urc_list, &urc->list_node);
|
||||||
|
}
|
||||||
|
|
||||||
|
void at_remove_urc(at_dev_t *dev, at_urc_t *urc)
|
||||||
|
{
|
||||||
|
clist_remove(&dev->urc_list, &urc->list_node);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int _check_urc(clist_node_t *node, void *arg)
|
||||||
|
{
|
||||||
|
const char *buf = arg;
|
||||||
|
at_urc_t *urc = container_of(node, at_urc_t, list_node);
|
||||||
|
|
||||||
|
DEBUG("Trying to match with %s\n", urc->code);
|
||||||
|
|
||||||
|
if (strncmp(buf, urc->code, strlen(urc->code)) == 0) {
|
||||||
|
urc->cb(urc->arg, buf);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void at_process_urc(at_dev_t *dev, uint32_t timeout)
|
||||||
|
{
|
||||||
|
char buf[AT_BUF_SIZE];
|
||||||
|
|
||||||
|
DEBUG("Processing URC (timeout=%" PRIu32 "us)\n", timeout);
|
||||||
|
|
||||||
|
ssize_t res;
|
||||||
|
/* keep reading while received data are shorter than EOL */
|
||||||
|
while ((res = at_readline(dev, buf, sizeof(buf), true, timeout)) <
|
||||||
|
(ssize_t)sizeof(AT_RECV_EOL_1 AT_RECV_EOL_2) - 1) {
|
||||||
|
if (res < 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
clist_foreach(&dev->urc_list, _check_urc, buf);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|||||||
@ -39,6 +39,7 @@
|
|||||||
|
|
||||||
#include "isrpipe.h"
|
#include "isrpipe.h"
|
||||||
#include "periph/uart.h"
|
#include "periph/uart.h"
|
||||||
|
#include "clist.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@ -77,12 +78,41 @@ extern "C" {
|
|||||||
#define AT_RECV_ERROR "ERROR"
|
#define AT_RECV_ERROR "ERROR"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(MODULE_AT_URC) || DOXYGEN
|
||||||
|
#ifndef AT_BUF_SIZE
|
||||||
|
/** Internal buffer size used to process unsolicited result code data */
|
||||||
|
#define AT_BUF_SIZE (128)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Unsolicited result code callback
|
||||||
|
*
|
||||||
|
* @param[in] arg optional argument
|
||||||
|
* @param[in] code urc string received from the device
|
||||||
|
*/
|
||||||
|
typedef void (*at_urc_cb_t)(void *arg, const char *code);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Unsolicited result code data structure
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
clist_node_t list_node; /**< node list */
|
||||||
|
at_urc_cb_t cb; /**< callback */
|
||||||
|
const char *code; /**< URC string which must match */
|
||||||
|
void *arg; /**< optional argument */
|
||||||
|
} at_urc_t;
|
||||||
|
|
||||||
|
#endif /* MODULE_AT_URC */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief AT device structure
|
* @brief AT device structure
|
||||||
*/
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
isrpipe_t isrpipe; /**< isrpipe used for getting data from uart */
|
isrpipe_t isrpipe; /**< isrpipe used for getting data from uart */
|
||||||
uart_t uart; /**< UART device where the AT device is attached */
|
uart_t uart; /**< UART device where the AT device is attached */
|
||||||
|
#ifdef MODULE_AT_URC
|
||||||
|
clist_node_t urc_list; /**< list to keep track of all registered urc's */
|
||||||
|
#endif
|
||||||
} at_dev_t;
|
} at_dev_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -226,6 +256,32 @@ ssize_t at_readline(at_dev_t *dev, char *resp_buf, size_t len, bool keep_eol, ui
|
|||||||
*/
|
*/
|
||||||
void at_drain(at_dev_t *dev);
|
void at_drain(at_dev_t *dev);
|
||||||
|
|
||||||
|
#if defined(MODULE_AT_URC) || DOXYGEN
|
||||||
|
/**
|
||||||
|
* @brief Add a callback for an unsolicited response code
|
||||||
|
*
|
||||||
|
* @param[in] dev device to operate on
|
||||||
|
* @param[in] urc unsolicited result code to register
|
||||||
|
*/
|
||||||
|
void at_add_urc(at_dev_t *dev, at_urc_t *urc);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Remove an unsolicited response code from the list
|
||||||
|
*
|
||||||
|
* @param[in] dev device to operate on
|
||||||
|
* @param[in] urc unsolicited result code to remove
|
||||||
|
*/
|
||||||
|
void at_remove_urc(at_dev_t *dev, at_urc_t *urc);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Process out-of-band data received from the device
|
||||||
|
*
|
||||||
|
* @param[in] dev device to operate on
|
||||||
|
* @param[in] timeout timeout (in usec)
|
||||||
|
*/
|
||||||
|
void at_process_urc(at_dev_t *dev, uint32_t timeout);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
PSEUDOMODULES += at_urc
|
||||||
PSEUDOMODULES += auto_init_gnrc_rpl
|
PSEUDOMODULES += auto_init_gnrc_rpl
|
||||||
PSEUDOMODULES += can_mbox
|
PSEUDOMODULES += can_mbox
|
||||||
PSEUDOMODULES += can_pm
|
PSEUDOMODULES += can_pm
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user