diff options
Diffstat (limited to 'src/modem.c')
-rw-r--r-- | src/modem.c | 92 |
1 files changed, 89 insertions, 3 deletions
diff --git a/src/modem.c b/src/modem.c index dd2cf75..44eec06 100644 --- a/src/modem.c +++ b/src/modem.c @@ -1,8 +1,94 @@ #include "modem.h" +#include "lock.h" -int modem_open(const char *dev) { -} +/* Baudrate for the TTY. Should be greater the 64000. */ +#define BAUD_RATE B115200 + +struct modem *modem_open(const char *dev) { + struct modem *m; + int fd = -1, n; + struct termios ts, ts2; + + assert(dev); + + if (device_lock(dev) != 0) + return -1; + + if ((fd = open(dev, O_RDWR|O_NDELAY)) < 0) { + daemon_log(LOG_ERR, "Failed to open device <%s>: %s", dev, strerror(errno)); + goto fail; + } + + if ((n = fcntl(fd, F_GETFL, 0)) < 0 || fcntl(fd, F_SETFL, n & ~O_NDELAY) < 0) { + daemon_log(LOG_ERR, "Failed to remove O_NDELAY flag from device: %s", strerror(errno)); + goto fail; + } + + memset(&ts, 0, sizeof ts); + ts.c_cflag = CRTSCTS | IGNPAR | HUPCL | CS8; + ts.c_iflag = IGNPAR; + ts.c_oflag = 0; + ts.c_lflag = 0; + + ts.c_cc[VMIN] = 1; + ts.c_cc[VTIME] = 0; + + cfsetospeed(&ts, BAUD_RATE); + cfsetispeed(&ts, BAUD_RATE); + + tcflush(fd, TCIFLUSH); + + if (tcsetattr(fd, TCSANOW, &ts) < 0) { + daemon_log(LOG_ERR, "Failed to set TTY attributes: %s", strerror(errno)); + goto fail; + } + + if (tcgetattr(fd, &ts2) < 0 || memcmp(&ts, &ts2) != 0) { + daemon_log(LOG_ERR, "Failed to set TTY attributes"); + goto fail; + } + + m = malloc(sizeof(struct modem)); + assert(m); + memset(m, 0, sizeof(struct modem)); + m->dev = strdup(dev); + assert(m->dev); + m->fd = fd; + m->state = MODEM_STATE_INIT; -int modem_close(int fd) { + return m; + +fail: + if (fd >= 0) + close(fd); + + device_unlock(dev); + + return NULL; } + +void modem_close(struct modem *m) { + assert(m); + device_unlock(m->dev); + + close(m->fd); + free(m->dev); + free(m); +} + +static void* modem_cb(oop_source *source, int fd, oop_event event, void *user) { + struct modem *m; + + assert(source && user); + m = (struct modem*) user; + + if (m->mode == MODEM_STATE_INIT) { + } else if (m->mode == MODEM_STATE_AUDIO) { + + if (event) + } + + return OOP_CONTINUE; +} + |