]> hydra-www.ietfng.org Git - acmetensortoys-snakecontrol/commitdiff
Add door monitor support
authorNathaniel Wesley Filardo <nwfilardo@gmail.com>
Tue, 12 Dec 2017 19:20:37 +0000 (14:20 -0500)
committerNathaniel Wesley Filardo <nwfilardo@gmail.com>
Sun, 11 Feb 2018 00:05:48 +0000 (19:05 -0500)
While here, tweak regexes in lcdproc-monitor

bin/.gitignore
bin/door-monitor.sh [new file with mode: 0755]
bin/lcdproc-monitor.expect
bin/monitor-log-cgi.sh
bin/pollfd.c [new file with mode: 0644]
runit/pi-sc-doormon/log/run [new file with mode: 0755]
runit/pi-sc-doormon/run [new file with mode: 0755]

index 0d20b6487c61e7d1bde93acf4a14b7a89083a16d..6130b4a9864d1efeded70d65bbc10aa37317e85e 100644 (file)
@@ -1 +1,2 @@
 *.pyc
+pollfd
diff --git a/bin/door-monitor.sh b/bin/door-monitor.sh
new file mode 100755 (executable)
index 0000000..e7c8b20
--- /dev/null
@@ -0,0 +1,46 @@
+#!/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 ; }
index 45a52bb2611b0e6b952d687f4a62345d04531005..5f3a4405773877fdd54c4d954fdb8850b941d26b 100755 (executable)
@@ -5,6 +5,9 @@ package require lcdproclib
 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"
 
@@ -40,21 +43,28 @@ set sid [::lcdproclib::spawnlcd "localhost" "13666"]
 ::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 } {
@@ -66,23 +76,36 @@ 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" {}
   }
 }
index d20a57db5f52ecc331b9c8d1eb8657eabd262b75..09c980709fef1138579c668b114dd1e3b659d1d5 100755 (executable)
@@ -3,7 +3,7 @@
 echo "Content-Type: text/plain"
 echo
 cat /run/snakecontrol/remind.out
-echo
 echo "---"
-echo
+tail -n 1 /run/snakecontrol/door-monitor.log/current
+echo "---"
 exec tail -n 40 /run/snakecontrol/monitor.log/current
diff --git a/bin/pollfd.c b/bin/pollfd.c
new file mode 100644 (file)
index 0000000..66f6749
--- /dev/null
@@ -0,0 +1,75 @@
+#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);
+       }
+}
diff --git a/runit/pi-sc-doormon/log/run b/runit/pi-sc-doormon/log/run
new file mode 100755 (executable)
index 0000000..f7c46c2
--- /dev/null
@@ -0,0 +1,4 @@
+#!/bin/sh
+mkdir -p /run/snakecontrol/door-monitor.log
+chown -R pi:pi /run/snakecontrol/door-monitor.log
+exec chpst -u pi svlogd -tt /run/snakecontrol/door-monitor.log
diff --git a/runit/pi-sc-doormon/run b/runit/pi-sc-doormon/run
new file mode 100755 (executable)
index 0000000..fc78754
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec /home/pi/sc/bin/door-monitor.sh