Skip to content
Permalink
Browse files

drivers: modem: cmd handler: introduce cmd handler driver layer

This is a generic command handler implementation which uses the
supplied modem interface to process incoming data and hand it
back to the modem driver via callbacks defined for:
- modem responses
- unsolicited messages
- specified handlers for current operation

The individual modem drivers define functions as command handlers
via the MODEM_CMD_DEFINE() macro.

To use these handlers, a modem operation defines a series of
modem_cmd structures and passes them to the modem_cmd_send()
function.  The modem_cmd includes data for:
- a matching string for when to execute the handler
- # of parameters to parse after the matching string
- delimeters for the parameters

Example modem driver setup code looks like this:

/* create modem context object */
static struct modem_context mctx;

/* net_buf receive pool */
NET_BUF_POOL_DEFINE(mdm_recv_pool, MDM_RECV_MAX_BUF,
		    MDM_RECV_BUF_SIZE, 0, NULL);

/* modem cmds */
static struct modem_cmd_handler_data cmd_handler_data;
static u8_t cmd_read_buf[MDM_RECV_BUF_SIZE];
static u8_t cmd_match_buf[MDM_RECV_BUF_SIZE];

/* modem response handlers */
static struct modem_cmd response_cmds[] = {
	MODEM_CMD("OK", on_cmd_ok, 0U, ""),
	MODEM_CMD("ERROR", on_cmd_error, 0U, ""),
	MODEM_CMD("+CME ERROR: ", on_cmd_exterror, 1U, ""),
};

/* unsolicited handlers */
static struct modem_cmd unsol_cmds[] = {
	MODEM_CMD("+UUSOCL: ", on_cmd_socknotifyclose, 1U, ""),
	MODEM_CMD("+UUSORD: ", on_cmd_socknotifydata, 2U, ","),
	MODEM_CMD("+UUSORF: ", on_cmd_socknotifydata, 2U, ","),
	MODEM_CMD("+CREG: ", on_cmd_socknotifycreg, 1U, ""),
};

/* setup cmd handler data */
cmd_handler_data.cmds[CMD_RESP] = response_cmds;
cmd_handler_data.cmds_len[CMD_RESP] = ARRAY_SIZE(response_cmds);
cmd_handler_data.cmds[CMD_UNSOL] = unsol_cmds;
cmd_handler_data.cmds_len[CMD_UNSOL] = ARRAY_SIZE(unsol_cmds);
cmd_handler_data.read_buf = &cmd_read_buf[0];
cmd_handler_data.read_buf_len = sizeof(cmd_read_buf);
cmd_handler_data.match_buf = &cmd_match_buf[0];
cmd_handler_data.match_buf_len = sizeof(cmd_match_buf);
cmd_handler_data.buf_pool = &mdm_recv_pool;
cmd_handler_data.alloc_timeout = BUF_ALLOC_TIMEOUT;
ret = modem_cmd_handler_init(&mctx.cmd_handler, &cmd_handler_data);

Signed-off-by: Michael Scott <mike@foundries.io>
  • Loading branch information...
mike-scott authored and ioannisg committed Aug 7, 2019
1 parent d56a05f commit 02abddccd63c35db8bb89f8bc42634a4f47ecfac
Showing with 706 additions and 0 deletions.
  1. +1 −0 drivers/modem/CMakeLists.txt
  2. +23 −0 drivers/modem/Kconfig
  3. +492 −0 drivers/modem/modem_cmd_handler.c
  4. +190 −0 drivers/modem/modem_cmd_handler.h
@@ -9,6 +9,7 @@ zephyr_sources_ifdef(CONFIG_MODEM_CONTEXT
)

zephyr_sources_ifdef(CONFIG_MODEM_IFACE_UART modem_iface_uart.c)
zephyr_sources_ifdef(CONFIG_MODEM_CMD_HANDLER modem_cmd_handler.c)

if(CONFIG_MODEM_UBLOX_SARA_R4)
zephyr_library_include_directories(${ZEPHYR_BASE}/subsys/net/ip)
@@ -75,6 +75,29 @@ config MODEM_IFACE_UART
along with the modem_iface reference from your modem_context object
and the UART device name.

config MODEM_CMD_HANDLER
bool "Generic modem command handler"
help
This generic command handler uses a modem interface to process
incoming data and hand it back to the modem driver via callbacks
defined for:
- modem responses
- unsolicited messages
- specified handlers for current operation
To configure this layer for use, create a modem_cmd_handler_data
object and pass it's reference to modem_cmd_handler_init() along with
the modem_cmd_handler reference from your modem_context object.

config MODEM_CMD_HANDLER_MAX_PARAM_COUNT
int "Maximum number of params parsed per command"
depends on MODEM_CMD_HANDLER
default 6
help
This option sets the maximum number of parameters which may be
parsed by the command handler. This is also limited by the length
of the match_buf (match_buf_len) field as it needs to be large
enough to hold a single line of data (ending with /r).

endif # MODEM_CONTEXT

config MODEM_SHELL

0 comments on commit 02abddc

Please sign in to comment.
You can’t perform that action at this time.