summaryrefslogtreecommitdiffstats
path: root/src/modem.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/modem.c')
-rw-r--r--src/modem.c92
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;
+}
+