atd

Unnamed repository; edit this file 'description' to name the repository.
git clone git://git.nihaljere.xyz/atd
Log | Files | Refs

commit 7635bb81119275ddc51d3805eb6fb7e576ffc40e
parent d2e63b164650ae83bbd99ea3cf31467ad15fd3db
Author: Nihal Jere <nihal@nihaljere.xyz>
Date:   Fri,  4 Jun 2021 23:28:47 -0500

prepare for proper URC handling

Diffstat:
Matc.c | 2++
Matd.c | 55+++++++++++++++++++++++++++++++++++++------------------
Matd.h | 52+++++++++++++++++++++++++++++++++++++++++-----------
3 files changed, 80 insertions(+), 29 deletions(-)

diff --git a/atc.c b/atc.c @@ -96,6 +96,8 @@ main(int argc, char *argv[]) if (buf == STATUS_OK) fprintf(stderr, "OK\n"); + else + fprintf(stderr, "ERROR\n"); sleep(1); diff --git a/atd.c b/atd.c @@ -47,6 +47,11 @@ struct fdbuf { char *outptr; }; +struct command currentcmd; +int cmd_progress; +bool active_command = false; +bool check_call_status = false; + ssize_t parse_str(char *in, char **out) { @@ -92,6 +97,7 @@ ssize_t cmdadd(int index, struct fdbuf fdbuf) { break; default: fprintf(stderr, "got code: %d\n", cmd.op); + return -2; } /* we already checked that the queue has enough capacity */ @@ -121,33 +127,38 @@ handle_resp(struct command cmd, int fd, struct fdbuf *fdbuf) char *start = fdbuf->out, *ptr = memmem(fdbuf->out, fdbuf->outlen, "\r\n", 2); enum status status = 0; - for (int i = 0; i < fdbuf->outlen; i++) { - fprintf(stderr, "%x ", fdbuf->out[i]); - } - fprintf(stderr, "\n"); - if (ptr == NULL) return 0; // find next line with content while (start == ptr) { - ptr += sizeof("\r\n"); + ptr += sizeof("\r\n") - 1; start = ptr; - ptr = memmem(start, BUFSIZE - (ptr - fdbuf->out), "\r\n", 2); + ptr = memmem(start, fdbuf->outlen - (ptr - fdbuf->out), "\r\n", 2); } - if (strncmp(start, "NO CARRIER", sizeof("NO CARRIER") - 1) == 0) { - status = STATUS_ERROR; - fprintf(stderr, "got NO CARRIER\n"); - } else if (strncmp(start, "OK", sizeof("OK") - 1) == 0) { + if (strncmp(start, "OK", sizeof("OK") - 1) == 0) { status = STATUS_OK; + active_command = false; fprintf(stderr, "got OK\n"); + } else if (strncmp(start, "ERROR", sizeof("ERROR") - 1) == 0) { + status = STATUS_ERROR; + active_command = false; + fprintf(stderr, "got ERROR\n"); + } else if (strncmp(start, "NO CARRIER", sizeof("NO CARRIER") - 1) == 0) { + check_call_status = true; + fprintf(stderr, "got NO CARRIER\n"); } else if (strncmp(start, "RING", sizeof("RING") - 1) == 0) { + check_call_status = true; fprintf(stderr, "got RING\n"); + } else if (strncmp(start, "CONNECT", sizeof("CONNECT") - 1) == 0) { + check_call_status = true; + fprintf(stderr, "got CONNECT\n"); + } else if (strncmp(start, "BUSY", sizeof("BUSY") - 1) == 0) { + check_call_status = true; + fprintf(stderr, "got BUSY\n"); } - fprintf(stderr, "fd: %d\n", fd); - if (status && fd > 0) send_status(fd, status); @@ -158,6 +169,11 @@ handle_resp(struct command cmd, int fd, struct fdbuf *fdbuf) } ssize_t +update_call_status() +{ +} + +ssize_t fdbuf_write(int fd, struct fdbuf *fdbuf) { int wr = write(fd, &fdbuf->in, fdbuf->inlen); @@ -184,6 +200,12 @@ fdbuf_read(int fd, struct fdbuf *fdbuf) return r; } +bool +send_command(int fd, struct fdbuf *fdbuf, enum atcmd atcmd) +{ + ssize_t ret; +} + static int setup_modem_tty(int fd) { @@ -223,7 +245,6 @@ int main(int argc, char *argv[]) struct pollfd fds[MAX_FDS]; sigset_t mask; char *next; - bool active_command = false; sigemptyset(&mask); sigaddset(&mask, SIGINT); @@ -341,8 +362,6 @@ int main(int argc, char *argv[]) memmove(fdbufs[BACKEND].out, fdbufs[BACKEND].out + ret, BUFSIZE - ret); fdbufs[BACKEND].outlen -= ret; fdbufs[BACKEND].outptr -= ret; - /* TODO: temporary, only change this if it is a response to the command */ - active_command = false; } if (cmdq.count && !active_command) @@ -360,9 +379,9 @@ int main(int argc, char *argv[]) continue; if (cmd.op == CMD_DIAL) { - ret = snprintf(fdbufs[BACKEND].in, BUFSIZE, cmddata[cmd.op].atcmd, cmd.data.dial.num); + ret = snprintf(fdbufs[BACKEND].in, BUFSIZE, atcmds[cmddata[cmd.op].atcmd], cmd.data.dial.num); } else { - ret = snprintf(fdbufs[BACKEND].in, BUFSIZE, cmddata[cmd.op].atcmd); + ret = snprintf(fdbufs[BACKEND].in, BUFSIZE, atcmds[cmddata[cmd.op].atcmd]); } fprintf(stderr, "after data\n"); if (ret >= BUFSIZE) { diff --git a/atd.h b/atd.h @@ -9,36 +9,66 @@ enum ops { CMD_HANGUP, }; +enum callstatus { + CALL_ACTIVE, + CALL_HELD, + CALL_DIALING, + CALL_ALERTING, + CALL_INCOMING, + CALL_WAITING, +}; + enum status { STATUS_OK = 1, STATUS_ERROR, }; +enum atcmd { + ATD, + ATA, + ATH, + CLCC, +}; + +union atdata { + struct { + char *num; + } dial; +}; + struct command { int index; enum ops op; - union { - struct { - char *num; - } dial; - } data; + union atdata data; +}; + +struct call { + enum callstatus status; + char num[PHONE_NUMBER_MAX_LEN]; }; /* should have at most 256 things */ -enum types { +enum type { TYPE_NONE = 0, TYPE_STRING, }; #define MAX_PARAMS 1 struct command_args { - char *atcmd; - char type[MAX_PARAMS + 1]; + enum atcmd atcmd; + enum type type[MAX_PARAMS + 1]; }; struct command_args cmddata[] = { - [CMD_DIAL] = { "ATD%s;\r", { TYPE_STRING, TYPE_NONE} }, - [CMD_ANSWER] = { "ATA\r", { TYPE_NONE} }, - [CMD_HANGUP] = { "ATH\r", { TYPE_NONE} }, + [CMD_DIAL] = { ATD, { TYPE_STRING, TYPE_NONE} }, + [CMD_ANSWER] = { ATA, { TYPE_NONE} }, + [CMD_HANGUP] = { ATH, { TYPE_NONE} }, +}; + +char *atcmds[] = { + [ATD] = "ATD%s;\r", + [ATA] = "ATA\r", + [ATH] = "ATH\r", + [CLCC] = "AT+CLCC\r", };