--- /dev/null
+#!/usr/bin/zsh
+
+set -e -u
+
+I2C_ADDRESS="21" # hex
+GPIO_LEFT_OFFSET=6
+GPIO_RIGHT_OFFSET=7
+
+GPIO_IRQ=22
+
+[ -d /sys/bus/i2c/devices/i2c-1/1-00${I2C_ADDRESS} ] || {
+ echo pcf8574 0x${I2C_ADDRESS} > /sys/bus/i2c/devices/i2c-1/new_device
+}
+
+sleep 1
+[ -d /sys/bus/i2c/devices/i2c-1/1-00${I2C_ADDRESS}/gpio ] || {
+ echo "No GPIO chip registered. Bailing out."
+ exit 1
+}
+
+GPIOBASE=`cat /sys/bus/i2c/devices/i2c-1/1-00${I2C_ADDRESS}/gpio/gpiochip*/base`
+
+GPIO_LEFT=$((GPIOBASE+GPIO_LEFT_OFFSET))
+
+[ -d /sys/class/gpio/gpio${GPIO_LEFT} ] || {
+ echo ${GPIO_LEFT} > /sys/class/gpio/export
+}
+
+GPIO_RIGHT=$((GPIOBASE+GPIO_RIGHT_OFFSET))
+
+[ -d /sys/class/gpio/gpio${GPIO_RIGHT} ] || {
+ echo ${GPIO_RIGHT} > /sys/class/gpio/export
+}
+
+# IRQ gpio
+[ -d /sys/class/gpio/gpio${GPIO_IRQ} ] || {
+ echo ${GPIO_IRQ} > /sys/class/gpio/export
+}
+echo 1 > /sys/class/gpio/gpio${GPIO_IRQ}/active_low
+echo rising > /sys/class/gpio/gpio${GPIO_IRQ}/edge
+
+exec 3</sys/class/gpio/gpio${GPIO_IRQ}/value
+
+/home/pi/sc/bin/pollfd 3 -1 | { while read i; do
+ echo "DATA: door left=$(cat /sys/class/gpio/gpio${GPIO_LEFT}/value) right=$(cat /sys/class/gpio/gpio${GPIO_RIGHT}/value)"
+done ; }
spawn tail --retry --follow=name /run/snakecontrol/monitor.log/current
set logsid ${spawn_id}
+spawn tail --retry --follow=name /run/snakecontrol/door-monitor.log/current
+set doorlogsid ${spawn_id}
+
set sid [::lcdproclib::spawnlcd "localhost" "13666"]
::lcdproclib::cmd ${sid} "client_set -name viv"
::lcdproclib::cmd ${sid} "widget_add 1 v_rh string"
::lcdproclib::cmd ${sid} "widget_add 1 i_lt icon"
-::lcdproclib::cmd ${sid} "widget_set 1 i_lt 9 3 ARROW_UP"
+::lcdproclib::cmd ${sid} "widget_set 1 i_lt 8 3 ARROW_UP"
::lcdproclib::cmd ${sid} "widget_add 1 v_lt string"
::lcdproclib::cmd ${sid} "widget_add 1 i_rt icon"
-::lcdproclib::cmd ${sid} "widget_set 1 i_rt 9 4 ARROW_UP"
+::lcdproclib::cmd ${sid} "widget_set 1 i_rt 8 4 ARROW_UP"
::lcdproclib::cmd ${sid} "widget_add 1 v_rt string"
+::lcdproclib::cmd ${sid} "widget_add 1 v_mdmxl string"
+::lcdproclib::cmd ${sid} "widget_set 1 v_mdmxl 14 3 @"
+::lcdproclib::cmd ${sid} "widget_add 1 v_mdmx string"
+
::lcdproclib::cmd ${sid} "widget_add 1 v_ldmxl string"
-::lcdproclib::cmd ${sid} "widget_set 1 v_ldmxl 17 3 @"
+::lcdproclib::cmd ${sid} "widget_set 1 v_ldmxl 14 3 @"
::lcdproclib::cmd ${sid} "widget_add 1 v_ldmx string"
::lcdproclib::cmd ${sid} "widget_add 1 v_rdmxl string"
-::lcdproclib::cmd ${sid} "widget_set 1 v_rdmxl 17 4 @"
+::lcdproclib::cmd ${sid} "widget_set 1 v_rdmxl 14 4 @"
::lcdproclib::cmd ${sid} "widget_add 1 v_rdmx string"
+::lcdproclib::cmd ${sid} "widget_add 1 v_ldoor string"
+::lcdproclib::cmd ${sid} "widget_add 1 v_rdoor string"
+
::lcdproclib::cmd ${sid} "screen_set 1 -priority info"
proc drawtemp { scr wid x y } {
set datapfx "^\[^ \]* DATA: "
set datare "(\[^ \r\n]*)"
+set dskip "\[^\n\]*"
while { true } {
expect {
- -i ${logsid} -re "${datapfx}hide-near.* temp=${datare}.*\n" { drawtemp 1 "v_lh" 4 3 }
- -i ${logsid} -re "${datapfx}hide-far.* temp=${datare}.*\n" { drawtemp 1 "v_rh" 4 4 }
- -i ${logsid} -re "${datapfx}tank-near.* temp=${datare}.*\n" { drawtemp 1 "v_lt" 11 3 }
- -i ${logsid} -re "${datapfx}tank-far.* temp=${datare}.*\n" { drawtemp 1 "v_rt" 11 4 }
- -i ${logsid} -re "${datapfx}tank-mid.* temp=${datare}.*\n" { drawtemp 1 "v_mt" 3 2 }
- -i ${logsid} -re "${datapfx}tank-mid.* humid=${datare}.*\n" { drawtemp 1 "v_mh" 9 2 }
- -i ${logsid} -re "${datapfx}dmx-near.* dmx=${datare}.*\n" {
- ::lcdproclib::cmd ${sid} "widget_set 1 v_ldmx 18 3 ${expect_out(1,string)}"
+ -i ${logsid} -re "${datapfx}hide-near${dskip} temp=${datare}${dskip}\n" { drawtemp 1 "v_lh" 3 3 }
+ -i ${logsid} -re "${datapfx}hide-far${dskip} temp=${datare}${dskip}\n" { drawtemp 1 "v_rh" 3 4 }
+ -i ${logsid} -re "${datapfx}tank-near${dskip} temp=${datare}${dskip}\n" { drawtemp 1 "v_lt" 9 3 }
+ -i ${logsid} -re "${datapfx}tank-far${dskip} temp=${datare}${dskip}\n" { drawtemp 1 "v_rt" 9 4 }
+ -i ${logsid} -re "${datapfx}tank-mid${dskip} temp=${datare}${dskip}\n" { drawtemp 1 "v_mt" 3 2 }
+ -i ${logsid} -re "${datapfx}tank-mid${dskip} humid=${datare}${dskip}\n" { drawtemp 1 "v_mh" 9 2 }
+ -i ${logsid} -re "${datapfx}dmx-near${dskip} dmx=${datare}${dskip}\n" {
+ set hex [ format %X ${expect_out(1,string)} ]
+ ::lcdproclib::cmd ${sid} "widget_set 1 v_ldmx 15 3 ${hex}"
}
- -i ${logsid} -re "${datapfx}dmx-mid.* dmx=${datare}.*\n" {
- ::lcdproclib::cmd ${sid} "widget_set 1 v_rdmx 18 4 ${expect_out(1,string)}"
+ -i ${logsid} -re "${datapfx}dmx-mid${dskip} dmx=${datare}${dskip}\n" {
+ set hex [ format %X ${expect_out(1,string)} ]
+ ::lcdproclib::cmd ${sid} "widget_set 1 v_rdmx 15 4 ${hex}"
}
-i ${logsid} -re "\n" {}
- -i ${sid} -re "^listen .*\n" {}
- -i ${sid} -re "^ignore .*\n" {}
+
+ -i ${doorlogsid} -re "${datapfx}door${dskip} left=${datare} right=${datare}${dskip}\n" {
+ set o [ expr { ${expect_out(1,string)} == 0 ? " " : "!" } ]
+ ::lcdproclib::cmd ${sid} "widget_set 1 v_ldoor 18 3 \"$o\""
+
+ set o [ expr { ${expect_out(2,string)} == 0 ? " " : "!" } ]
+ ::lcdproclib::cmd ${sid} "widget_set 1 v_rdoor 18 4 \"$o\""
+ }
+ -i ${doorlogsid} -re "\n" {}
+
+ -i ${sid} -re "^listen ${dskip}\n" {}
+ -i ${sid} -re "^ignore ${dskip}\n" {}
}
}
--- /dev/null
+#include <sys/epoll.h>
+#include <sys/types.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+int
+main(int argc, char **argv) {
+
+ int fd;
+ int efd;
+ int tmo;
+ struct epoll_event ev;
+
+ if (argc <= 2) {
+ fprintf(stderr, "Need fd and timeout\n");
+ exit(1);
+ }
+
+ fd = atoi(argv[1]);
+ if (fd < 0) {
+ fprintf(stderr, "Invalid fd\n");
+ exit(1);
+ }
+
+ tmo = atoi(argv[2]);
+
+ if ((efd = epoll_create1(0)) < 0) {
+ fprintf(stderr, "epoll_create1 failed: %d\n", errno);
+ exit(1);
+ }
+
+ ev.events = EPOLLPRI | EPOLLET;
+ ev.data.fd = fd;
+ if (epoll_ctl(efd, EPOLL_CTL_ADD, fd, &ev) < 0) {
+ fprintf(stderr, "epoll_ctl ADD failed: %d\n", errno);
+ exit(1);
+ }
+
+ while(1) {
+ int er, rr;
+ char buf[8] = {0, };
+
+ memset(&ev, 0, sizeof(ev));
+
+ er = epoll_wait(efd, &ev, 1, tmo);
+
+ if (er < 0) {
+ fprintf(stderr, "epoll_wait() failure: %d\n", errno);
+ exit(2);
+ }
+
+ if (lseek(fd, 0, SEEK_SET) != 0) {
+ fprintf(stderr, "lseek failed: %d\n", errno);
+ exit(2);
+ }
+
+ if ((rr = read(fd, buf, sizeof(buf))) < 2) {
+ fprintf(stderr, "read failed: ret=%d err=%d\n", rr, errno);
+ exit(2);
+ }
+
+ if (er == 0) {
+ printf("tick: %s", buf);
+ } else {
+ if (ev.events & EPOLLPRI) {
+ printf("irq: %s", buf);
+ }
+ }
+
+ fflush(stdout);
+ }
+}