diff --git a/drivers/gnss/gnss_quectel_lcx6g.c b/drivers/gnss/gnss_quectel_lcx6g.c index 09fa8fd8e4..6d632f147b 100644 --- a/drivers/gnss/gnss_quectel_lcx6g.c +++ b/drivers/gnss/gnss_quectel_lcx6g.c @@ -78,17 +78,6 @@ struct quectel_lcx6g_data { k_timeout_t pm_timeout; }; -#define MODEM_CHAT_SCRIPT_NO_ABORT_DEFINE(_sym, _script_chats, _callback, _timeout) \ - static struct modem_chat_script _sym = { \ - .name = #_sym, \ - .script_chats = _script_chats, \ - .script_chats_size = ARRAY_SIZE(_script_chats), \ - .abort_matches = NULL, \ - .abort_matches_size = 0, \ - .callback = _callback, \ - .timeout = _timeout, \ - } - #ifdef CONFIG_PM_DEVICE MODEM_CHAT_MATCH_DEFINE(pair003_success_match, "$PAIR001,003,0*38", "", NULL); MODEM_CHAT_SCRIPT_CMDS_DEFINE( @@ -100,11 +89,10 @@ MODEM_CHAT_SCRIPT_NO_ABORT_DEFINE(suspend_script, suspend_script_cmds, NULL, QUECTEL_LCX6G_SCRIPT_TIMEOUT_S); #endif /* CONFIG_PM_DEVICE */ -MODEM_CHAT_MATCH_DEFINE(any_match, "", "", NULL); MODEM_CHAT_MATCH_DEFINE(pair062_ack_match, "$PAIR001,062,0*3F", "", NULL); MODEM_CHAT_SCRIPT_CMDS_DEFINE( resume_script_cmds, - MODEM_CHAT_SCRIPT_CMD_RESP("$PAIR002*38", any_match), + MODEM_CHAT_SCRIPT_CMD_RESP("$PAIR002*38", modem_chat_any_match), MODEM_CHAT_SCRIPT_CMD_RESP("$PAIR062,0,1*3F", pair062_ack_match), MODEM_CHAT_SCRIPT_CMD_RESP("$PAIR062,1,0*3F", pair062_ack_match), MODEM_CHAT_SCRIPT_CMD_RESP("$PAIR062,2,0*3C", pair062_ack_match), diff --git a/include/zephyr/modem/chat.h b/include/zephyr/modem/chat.h index 28a2bc6bf9..afb57c912f 100644 --- a/include/zephyr/modem/chat.h +++ b/include/zephyr/modem/chat.h @@ -81,9 +81,15 @@ struct modem_chat_match { #define MODEM_CHAT_MATCH_DEFINE(_sym, _match, _separators, _callback) \ const static struct modem_chat_match _sym = MODEM_CHAT_MATCH(_match, _separators, _callback) +/* Helper struct to match any response without callback. */ +extern const struct modem_chat_match modem_chat_any_match; + #define MODEM_CHAT_MATCHES_DEFINE(_sym, ...) \ const static struct modem_chat_match _sym[] = {__VA_ARGS__} +/* Helper struct to match nothing. */ +extern const struct modem_chat_match modem_chat_empty_matches[0]; + /** * @brief Modem chat script chat */ @@ -118,18 +124,21 @@ struct modem_chat_script_chat { .timeout = 0, \ } -#define MODEM_CHAT_SCRIPT_CMD_RESP_NONE(_request, _timeout) \ +#define MODEM_CHAT_SCRIPT_CMD_RESP_NONE(_request, _timeout_ms) \ { \ .request = (uint8_t *)(_request), \ .request_size = (uint16_t)(sizeof(_request) - 1), \ .response_matches = NULL, \ .response_matches_size = 0, \ - .timeout = _timeout, \ + .timeout = _timeout_ms, \ } #define MODEM_CHAT_SCRIPT_CMDS_DEFINE(_sym, ...) \ const struct modem_chat_script_chat _sym[] = {__VA_ARGS__} +/* Helper struct to have no chat script command. */ +extern const struct modem_chat_script_chat modem_chat_empty_script_chats[0]; + enum modem_chat_script_result { MODEM_CHAT_SCRIPT_RESULT_SUCCESS, MODEM_CHAT_SCRIPT_RESULT_ABORT, @@ -166,7 +175,7 @@ struct modem_chat_script { uint32_t timeout; }; -#define MODEM_CHAT_SCRIPT_DEFINE(_sym, _script_chats, _abort_matches, _callback, _timeout) \ +#define MODEM_CHAT_SCRIPT_DEFINE(_sym, _script_chats, _abort_matches, _callback, _timeout_s) \ const static struct modem_chat_script _sym = { \ .name = #_sym, \ .script_chats = _script_chats, \ @@ -174,9 +183,16 @@ struct modem_chat_script { .abort_matches = _abort_matches, \ .abort_matches_size = ARRAY_SIZE(_abort_matches), \ .callback = _callback, \ - .timeout = _timeout, \ + .timeout = _timeout_s, \ } +#define MODEM_CHAT_SCRIPT_NO_ABORT_DEFINE(_sym, _script_chats, _callback, _timeout_s) \ + MODEM_CHAT_SCRIPT_DEFINE(_sym, _script_chats, modem_chat_empty_matches, \ + _callback, _timeout_s) + +#define MODEM_CHAT_SCRIPT_EMPTY_DEFINE(_sym) \ + MODEM_CHAT_SCRIPT_NO_ABORT_DEFINE(_sym, modem_chat_empty_script_chats, NULL, 0) + enum modem_chat_script_send_state { /* No data to send */ MODEM_CHAT_SCRIPT_SEND_STATE_IDLE, diff --git a/subsys/modem/modem_chat.c b/subsys/modem/modem_chat.c index e2b36d19c3..d69eb3dd6f 100644 --- a/subsys/modem/modem_chat.c +++ b/subsys/modem/modem_chat.c @@ -12,6 +12,10 @@ LOG_MODULE_REGISTER(modem_chat, CONFIG_MODEM_MODULES_LOG_LEVEL); #include +const struct modem_chat_match modem_chat_any_match = MODEM_CHAT_MATCH("", "", NULL); +const struct modem_chat_match modem_chat_empty_matches[0]; +const struct modem_chat_script_chat modem_chat_empty_script_chats[0]; + #define MODEM_CHAT_MATCHES_INDEX_RESPONSE (0) #define MODEM_CHAT_MATCHES_INDEX_ABORT (1) #define MODEM_CHAT_MATCHES_INDEX_UNSOL (2) @@ -227,7 +231,7 @@ static bool modem_chat_script_chat_is_no_response(struct modem_chat *chat) const struct modem_chat_script_chat *script_chat = &chat->script->script_chats[chat->script_chat_it]; - return (script_chat->response_matches_size == 0) ? true : false; + return (script_chat->response_matches_size == 0); } static uint16_t modem_chat_script_chat_get_send_timeout(struct modem_chat *chat) @@ -267,6 +271,9 @@ static bool modem_chat_send_script_request_part(struct modem_chat *chat) request_part_size = request_size - chat->script_send_pos; ret = modem_pipe_transmit(chat->pipe, request_part, request_part_size); if (ret < 1) { + if (ret < 0) { + LOG_ERR("Failed to %s %u bytes. (%d)", "transmit", request_part_size, ret); + } return false; } @@ -754,8 +761,12 @@ int modem_chat_run_script_async(struct modem_chat *chat, const struct modem_chat } /* Validate script */ - if ((script->script_chats == NULL) || (script->script_chats_size == 0) || - ((script->abort_matches != NULL) && (script->abort_matches_size == 0))) { + if (script->script_chats == NULL || + (script->script_chats_size == 0 + && script->script_chats != modem_chat_empty_script_chats) || + (script->abort_matches_size == 0 + && script->abort_matches != NULL + && script->abort_matches != modem_chat_empty_matches)) { return -EINVAL; } @@ -795,7 +806,7 @@ int modem_chat_run_script(struct modem_chat *chat, const struct modem_chat_scrip return ret; } - return chat->script_result == MODEM_CHAT_SCRIPT_RESULT_SUCCESS ? 0 : -EAGAIN; + return (chat->script_result == MODEM_CHAT_SCRIPT_RESULT_SUCCESS) ? 0 : -EAGAIN; } void modem_chat_script_abort(struct modem_chat *chat)