From 427944b75e0a4abc4cc2af2f16858739a8833e6e Mon Sep 17 00:00:00 2001 From: Dylan Van Assche Date: Wed, 12 May 2021 18:34:03 +0200 Subject: [PATCH 7/8] at: allow custom callbacks for AT command response processing --- src/at.c | 32 +++++++++++++++++--------------- src/at.h | 14 +++++++++++++- src/manager.h | 1 + 3 files changed, 31 insertions(+), 16 deletions(-) diff --git a/src/at.c b/src/at.c index 533ed1c..35b7042 100644 --- a/src/at.c +++ b/src/at.c @@ -16,14 +16,6 @@ #include -struct AtCommand { - char *cmd; - char *subcmd; - char *value; - char *expected; - int retries; -}; - static GArray *configure_commands = NULL; static GArray *suspend_commands = NULL; static GArray *resume_commands = NULL; @@ -69,6 +61,7 @@ gboolean at_send_command(struct EG25Manager *manager) len = sprintf(command, "AT+%s=\"%s\"\r\n", at_cmd->cmd, at_cmd->subcmd); else if (at_cmd->subcmd && at_cmd->value) len = sprintf(command, "AT+%s=\"%s\",%s\r\n", at_cmd->cmd, at_cmd->subcmd, at_cmd->value); + manager->at_callback = at_cmd->callback; ret = write(manager->at_fd, command, len); if (ret < len) @@ -154,7 +147,10 @@ int at_append_command(struct EG25Manager *manager, const char *cmd, const char *subcmd, const char *value, - const char *expected) + const char *expected, + void (*callback) + (struct EG25Manager *manager, + const char *response)) { struct AtCommand *at_cmd = calloc(1, sizeof(struct AtCommand)); @@ -168,6 +164,8 @@ int at_append_command(struct EG25Manager *manager, at_cmd->value = g_strdup(value); if (expected) at_cmd->expected = g_strdup(expected); + if (callback) + at_cmd->callback = callback; manager->at_cmds = g_list_append(manager->at_cmds, at_cmd); @@ -217,8 +215,12 @@ static gboolean modem_response(gint fd, */ else if (strstr(response, "ERROR") && !strstr(response, "fast/poweroff")) retry_at_command(manager); - else if (strstr(response, "OK")) - at_process_result(manager, response); + else if (strstr(response, "OK")) { + if (manager->at_callback != NULL) + manager->at_callback(manager, response); + else + g_warning("AT command succesfull but no callback registered"); + } else // Not a recognized response, try running next command, just in case at_next_command(manager); @@ -326,7 +328,7 @@ void at_sequence_configure(struct EG25Manager *manager) { for (guint i = 0; i < configure_commands->len; i++) { struct AtCommand *cmd = &g_array_index(configure_commands, struct AtCommand, i); - at_append_command(manager, cmd->cmd, cmd->subcmd, cmd->value, cmd->expected); + at_append_command(manager, cmd->cmd, cmd->subcmd, cmd->value, cmd->expected, at_process_result); } at_send_command(manager); } @@ -335,7 +337,7 @@ void at_sequence_suspend(struct EG25Manager *manager) { for (guint i = 0; i < suspend_commands->len; i++) { struct AtCommand *cmd = &g_array_index(suspend_commands, struct AtCommand, i); - at_append_command(manager, cmd->cmd, cmd->subcmd, cmd->value, cmd->expected); + at_append_command(manager, cmd->cmd, cmd->subcmd, cmd->value, cmd->expected, at_process_result); } at_send_command(manager); } @@ -344,7 +346,7 @@ void at_sequence_resume(struct EG25Manager *manager) { for (guint i = 0; i < resume_commands->len; i++) { struct AtCommand *cmd = &g_array_index(resume_commands, struct AtCommand, i); - at_append_command(manager, cmd->cmd, cmd->subcmd, cmd->value, cmd->expected); + at_append_command(manager, cmd->cmd, cmd->subcmd, cmd->value, cmd->expected, at_process_result); } at_send_command(manager); } @@ -353,7 +355,7 @@ void at_sequence_reset(struct EG25Manager *manager) { for (guint i = 0; i < reset_commands->len; i++) { struct AtCommand *cmd = &g_array_index(reset_commands, struct AtCommand, i); - at_append_command(manager, cmd->cmd, cmd->subcmd, cmd->value, cmd->expected); + at_append_command(manager, cmd->cmd, cmd->subcmd, cmd->value, cmd->expected, at_process_result); } at_send_command(manager); } diff --git a/src/at.h b/src/at.h index e0445af..0364e2c 100644 --- a/src/at.h +++ b/src/at.h @@ -8,6 +8,15 @@ #include "manager.h" +typedef struct AtCommand { + char *cmd; + char *subcmd; + char *value; + char *expected; + void (*callback)(struct EG25Manager *manager, const char *response); + int retries; +} AtCommand; + int at_init(struct EG25Manager *manager, toml_table_t *config); void at_destroy(struct EG25Manager *manager); @@ -19,7 +28,10 @@ int at_append_command(struct EG25Manager *manager, const char *cmd, const char *subcmd, const char *value, - const char *expected); + const char *expected, + void (*callback) + (struct EG25Manager *manager, + const char *response)); void at_sequence_configure(struct EG25Manager *manager); void at_sequence_suspend(struct EG25Manager *manager); diff --git a/src/manager.h b/src/manager.h index 30028e6..3cc0118 100644 --- a/src/manager.h +++ b/src/manager.h @@ -47,6 +47,7 @@ struct EG25Manager { int at_fd; guint at_source; GList *at_cmds; + void (*at_callback)(struct EG25Manager *manager, const char *response); enum EG25State modem_state; gchar *modem_usb_id; -- 2.31.1