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:
M | atc.c | | | 2 | ++ |
M | atd.c | | | 55 | +++++++++++++++++++++++++++++++++++++------------------ |
M | atd.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",
};