#!/bin/rc bind -a '#t' /dev com=/dev/eia1 echo 'b2400 e0 d0 l8 pn' >$com^'ctl' fn onpowfail { log 'syncing fossil/venti...' sleep 1 f=`{ls /srv/fscons*>[2]/dev/null} for(i in $f){ { echo echo fsys all sync } < $i >> $i } sleep 2 venti/sync >/dev/null >[2=1] sleep 1 } fn onpowret { # should unhalt fossil here } fn onlowbat { } fn onlowbatret { } # some helper stuff fn send { echo -n $* } fn recvn { dd -bs $1 -count 1 >[2] /dev/null echo } fn recvln { read | sed 's/ //g' } fn log { echo `{date} APC: $* >[1=2] } # fn reset { log 'reseting...' send Y e=`{recvln} if(! ~ $e SM){ log 'setting smartmode failed: '^$"e exit } send A e=`{recvln} if(! ~ $e OK){ log 'frontpanel test failed: '^$"e } log 'done' } fn info { for(t in $*){ send $t e=`{recvln} d=$t switch($t){ case B d='battery voltage' case C d='internal temperature' case F d='line frequency' case L d='input line voltage' case O d='output line voltage' case P d='power load (%)' case f d='battery level (%)' case n d='serial number' case b d='firmware revision' } log $"d^': '^$"e } } { reset info n b B C F L O P f while(){ c=`{recvn 1} switch($c){ case '!' log 'power failure' info f O P onpowfail case '$' log 'power returned' info L O onpowret case '%' log 'low battery' info f onlowbat case '+' log 'return from low battery' info f onlowbatret case '?' log 'abnormal condition' log 'will reset in 10 seconds...' sleep 10 reset case '=' log 'return from abnormal condition' case '#' log 'replace battery' case '&' log 'check alarm' case '|' log 'variable changed' case * log 'unknown status code: '^$"c } } } <$com >$com