diff --git a/gatchat/gatchat.c b/gatchat/gatchat.c index 3fd564df..546bd687 100644 --- a/gatchat/gatchat.c +++ b/gatchat/gatchat.c @@ -38,6 +38,9 @@ /* #define WRITE_SCHEDULER_DEBUG 1 */ +#define COMMAND_FLAG_EXPECT_PDU 0x1 +#define COMMAND_FLAG_EXPECT_SHORT_PROMPT 0x2 + struct at_chat; static void chat_wakeup_writer(struct at_chat *chat); @@ -46,7 +49,7 @@ static const char *none_prefix[] = { NULL }; struct at_command { char *cmd; char **prefixes; - gboolean expect_pdu; + guint flags; guint id; guint gid; GAtResultFunc callback; @@ -226,7 +229,7 @@ static gboolean at_chat_unregister_all(struct at_chat *chat, static struct at_command *at_command_create(guint gid, const char *cmd, const char **prefix_list, - gboolean expect_pdu, + guint flags, GAtNotifyFunc listing, GAtResultFunc func, gpointer user_data, @@ -280,7 +283,7 @@ static struct at_command *at_command_create(guint gid, const char *cmd, c->cmd[len] = '\0'; c->gid = gid; - c->expect_pdu = expect_pdu; + c->flags = flags; c->prefixes = prefixes; c->callback = func; c->listing = listing; @@ -533,7 +536,7 @@ static gboolean at_chat_handle_command_response(struct at_chat *p, } out: - if (cmd->listing && cmd->expect_pdu) + if (cmd->listing && (cmd->flags & COMMAND_FLAG_EXPECT_PDU)) hint = G_AT_SYNTAX_EXPECT_PDU; else hint = G_AT_SYNTAX_EXPECT_MULTILINE; @@ -541,7 +544,7 @@ out: if (p->syntax->set_hint) p->syntax->set_hint(p->syntax, hint); - if (cmd->listing && cmd->expect_pdu) { + if (cmd->listing && (cmd->flags & COMMAND_FLAG_EXPECT_PDU)) { p->pdu_notify = line; return TRUE; } @@ -646,7 +649,8 @@ static void have_pdu(struct at_chat *p, char *pdu) cmd = g_queue_peek_head(p->command_queue); - if (cmd && cmd->expect_pdu && p->cmd_bytes_written > 0) { + if (cmd && (cmd->flags & COMMAND_FLAG_EXPECT_PDU) && + p->cmd_bytes_written > 0) { char c = cmd->cmd[p->cmd_bytes_written - 1]; if (c == '\r') @@ -801,7 +805,7 @@ static gboolean wakeup_no_response(gpointer user_data) at_chat_finish_command(chat, FALSE, NULL); - cmd = at_command_create(0, chat->wakeup, none_prefix, FALSE, + cmd = at_command_create(0, chat->wakeup, none_prefix, 0, NULL, wakeup_cb, chat, NULL, TRUE); if (cmd == NULL) { chat->timeout_source = 0; @@ -852,7 +856,7 @@ static gboolean can_write_data(gpointer data) } if (chat->cmd_bytes_written == 0 && wakeup_first == TRUE) { - cmd = at_command_create(0, chat->wakeup, none_prefix, FALSE, + cmd = at_command_create(0, chat->wakeup, none_prefix, 0, NULL, wakeup_cb, chat, NULL, TRUE); if (cmd == NULL) return FALSE; @@ -889,6 +893,16 @@ static gboolean can_write_data(gpointer data) if (bytes_written < towrite) return TRUE; + /* + * If we're expecting a short prompt, set the hint for all lines + * sent to the modem except the last + */ + if ((cmd->flags & COMMAND_FLAG_EXPECT_SHORT_PROMPT) && + chat->cmd_bytes_written < len && + chat->syntax->set_hint) + chat->syntax->set_hint(chat->syntax, + G_AT_SYNTAX_EXPECT_SHORT_PROMPT); + /* Full command submitted, update timer */ if (chat->wakeup_timer) g_timer_start(chat->wakeup_timer); @@ -991,7 +1005,7 @@ static gboolean at_chat_set_wakeup_command(struct at_chat *chat, static guint at_chat_send_common(struct at_chat *chat, guint gid, const char *cmd, const char **prefix_list, - gboolean expect_pdu, + guint flags, GAtNotifyFunc listing, GAtResultFunc func, gpointer user_data, @@ -1002,7 +1016,7 @@ static guint at_chat_send_common(struct at_chat *chat, guint gid, if (chat == NULL || chat->command_queue == NULL) return 0; - c = at_command_create(gid, cmd, prefix_list, expect_pdu, listing, func, + c = at_command_create(gid, cmd, prefix_list, flags, listing, func, user_data, notify, FALSE); if (c == NULL) return 0; @@ -1438,7 +1452,7 @@ guint g_at_chat_send(GAtChat *chat, const char *cmd, gpointer user_data, GDestroyNotify notify) { return at_chat_send_common(chat->parent, chat->group, - cmd, prefix_list, FALSE, NULL, + cmd, prefix_list, 0, NULL, func, user_data, notify); } @@ -1451,7 +1465,7 @@ guint g_at_chat_send_listing(GAtChat *chat, const char *cmd, return 0; return at_chat_send_common(chat->parent, chat->group, - cmd, prefix_list, FALSE, + cmd, prefix_list, 0, listing, func, user_data, notify); } @@ -1464,10 +1478,23 @@ guint g_at_chat_send_pdu_listing(GAtChat *chat, const char *cmd, return 0; return at_chat_send_common(chat->parent, chat->group, - cmd, prefix_list, TRUE, + cmd, prefix_list, + COMMAND_FLAG_EXPECT_PDU, listing, func, user_data, notify); } +guint g_at_chat_send_and_expect_short_prompt(GAtChat *chat, const char *cmd, + const char **prefix_list, + GAtResultFunc func, + gpointer user_data, + GDestroyNotify notify) +{ + return at_chat_send_common(chat->parent, chat->group, + cmd, prefix_list, + COMMAND_FLAG_EXPECT_SHORT_PROMPT, + NULL, func, user_data, notify); +} + gboolean g_at_chat_cancel(GAtChat *chat, guint id) { /* We use id 0 for wakeup commands */