summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile12
-rw-r--r--main.vala30
-rw-r--r--serial.vala111
-rw-r--r--web.vala23
4 files changed, 176 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..14f49d1
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,12 @@
+PREFIX=/usr/local
+
+barcode-scanner: main.vala serial.vala web.vala
+ valac --output $@ --pkg posix --pkg linux --pkg libsoup-2.4 $^
+
+install: barcode-scanner
+ install -m755 barcode-scanner $(DESTDIR)$(PREFIX)/bin/barcode-scanner
+
+clean:
+ rm -f barcode-scanner
+
+.PHONY: clean install
diff --git a/main.vala b/main.vala
new file mode 100644
index 0000000..bd71163
--- /dev/null
+++ b/main.vala
@@ -0,0 +1,30 @@
+public static int main(string[] args) {
+ if(args.length < 2) {
+ stderr.printf("%s <device>\n", args[0]);
+ return 1;
+ }
+
+ var s = new Serial(args[1], 19200, 7, 1);
+
+ char[] detected = {};
+
+ while(true) {
+ uint8 buf[64];
+ int size = (int) Posix.read(s.fd, buf, 64);
+
+ for(int i = 0; i < size; i++)
+ if(buf[i] != '\r' && buf[i] != '\n') {
+ detected += (char) buf[i];
+ } else {
+ if(detected.length > 0) {
+ detected += '\0';
+ interpret(detected);
+ }
+ detected = {};
+ }
+ }
+}
+
+public static void interpret(char[] data) {
+ stdout.printf("%s\n", (string) data);
+}
diff --git a/serial.vala b/serial.vala
new file mode 100644
index 0000000..480d73c
--- /dev/null
+++ b/serial.vala
@@ -0,0 +1,111 @@
+public class Serial {
+ private Posix.termios newtio;
+ private Posix.termios restoretio;
+ public int fd=-1;
+
+ public signal void new_data(uchar[] data);
+
+ public Serial(string device, int rate, int bits, int stopbits) {
+ Posix.speed_t baudrate = Posix.B9600;
+
+ fd = Posix.open(device, Posix.O_RDONLY | Posix.O_NONBLOCK);
+
+ if(fd < 0) {
+ fd = -1;
+ stderr.printf("Could not open device!\n");
+ }
+
+ Posix.tcflush(fd, Posix.TCIOFLUSH);
+
+ Posix.tcgetattr(fd, out restoretio);
+
+ /* apply settings */
+ switch(rate) {
+ case 300:
+ baudrate = Posix.B300;
+ break;
+ case 600:
+ baudrate = Posix.B600;
+ break;
+ case 1200:
+ baudrate = Posix.B1200;
+ break;
+ case 2400:
+ baudrate = Posix.B2400;
+ break;
+ case 4800:
+ baudrate = Posix.B4800;
+ break;
+ case 9600:
+ baudrate = Posix.B9600;
+ break;
+ case 19200:
+ baudrate = Posix.B19200;
+ break;
+ case 38400:
+ baudrate = Posix.B38400;
+ break;
+ case 57600:
+ baudrate = Posix.B57600;
+ break;
+ case 115200:
+ baudrate = Posix.B115200;
+ break;
+ case 230400:
+ baudrate = Posix.B230400;
+ break;
+ default:
+ /* not supported */
+ break;
+ }
+
+ Posix.cfsetospeed(ref newtio, baudrate);
+ Posix.cfsetispeed(ref newtio, baudrate);
+
+ switch(bits) {
+ case 5:
+ newtio.c_cflag = (newtio.c_cflag & ~Posix.CSIZE) | Posix.CS5;
+ break;
+ case 6:
+ newtio.c_cflag = (newtio.c_cflag & ~Posix.CSIZE) | Posix.CS6;
+ break;
+ case 7:
+ newtio.c_cflag = (newtio.c_cflag & ~Posix.CSIZE) | Posix.CS7;
+ break;
+ case 8:
+ default:
+ newtio.c_cflag = (newtio.c_cflag & ~Posix.CSIZE) | Posix.CS8;
+ break;
+ }
+
+ newtio.c_cflag |= Posix.CLOCAL | Posix.CREAD;
+
+ newtio.c_cflag &= ~(Posix.PARENB | Posix.PARODD);
+
+ /* TODO: parity */
+
+ newtio.c_cflag &= ~Linux.Termios.CRTSCTS;
+
+ if(stopbits == 2)
+ newtio.c_cflag |= Posix.CSTOPB;
+ else
+ newtio.c_cflag &= ~Posix.CSTOPB;
+
+ newtio.c_iflag = Posix.IGNBRK;
+
+ newtio.c_lflag = 0;
+ newtio.c_oflag = 0;
+
+ newtio.c_cc[Posix.VTIME]=1;
+ newtio.c_cc[Posix.VMIN]=1;
+
+ newtio.c_lflag &= ~(Posix.ECHONL|Posix.NOFLSH);
+
+ int mcs=0;
+ Posix.ioctl(fd, Linux.Termios.TIOCMGET, out mcs);
+ mcs |= Linux.Termios.TIOCM_RTS;
+ Posix.ioctl(fd, Linux.Termios.TIOCMSET, out mcs);
+
+ Posix.tcsetattr(fd, Posix.TCSANOW, newtio);
+ }
+}
diff --git a/web.vala b/web.vala
new file mode 100644
index 0000000..860e607
--- /dev/null
+++ b/web.vala
@@ -0,0 +1,23 @@
+public class Web {
+ private Soup.SessionAsync session;
+ private static string server = "https://shop.kreativitaet-trifft-technik.de";
+
+ public Web() {
+ session = new Soup.SessionAsync ();
+ }
+
+ public void login() {
+ var message = new Soup.Message ("GET", server+"/login");
+ session.send_message (message);
+ }
+
+ public void logout() {
+ var message = new Soup.Message ("GET", server+"/logout");
+ session.send_message (message);
+ }
+
+ public void add(string article) {
+ var message = new Soup.Message ("GET", server+"/buy");
+ session.send_message (message);
+ }
+}