#!/usr/bin/tclsh set ::debug 0 set ::modem_lock /var/lock/owfs/modem. set ::owfs /mnt/1wire set ::driver 12.A76721000000 set ::driverpio $::driver/PIO.A set ::driverinit [list \ [list $::driver/set_alarm 011] \ ] proc logger {msg {priority err}} { syslog -facility daemon -ident modems $priority $msg if {$::debug} {puts stderr "$priority: $msg"} } proc owget {name} { if {[catch {open $::owfs/$name} f]} { logger "ERROR: $f" return "" } set res [read -nonewline $f] close $f return $res } proc owput {name {val ""}} { if {[catch {open $::owfs/$name WRONLY} f]} { logger "ERROR(owput): $f" return 0 } puts $f $val close $f return 1 } proc DoInit {{dev ""}} { if {($dev=="") || ($dev==$::driver)} { if {$::debug} {logger "driver init" info} foreach l $::driverinit {owput [lindex $l 0] [lindex $l 1]} } } proc TurnOn {} { if {$::debug} { logger "driver ON" info } owput $::driverpio 1 } proc TurnOff {} { if {$::debug} { logger "driver OFF" info } owput $::driverpio 0 } set mode [lindex $argv 0] if {(($argc != 1) && ($argc != 2)) || (($mode != "init") && ($mode != "on") && ($mode != "off"))} { puts stderr "Usage: $argv0 init \[device\] | on \[reason\] | off \[reason\]" exit 1 } package require Syslog if {[file exists $::owfs/uncached]} {set ::uncached uncached/} {set ::uncached ""} set arg2 [string trim [lindex $argv 1]] if {$mode == "init"} { DoInit $arg2 if {[glob -nocomplain $::modem_lock*] == ""} {TurnOff} {TurnOn} owput $::driver/latch.ALL "0,0" exit 0 } if {[regexp {^[a-zA-Z0-9_]*$} $arg2] == 0} { puts stderr "Bad symbol in '$arg2'. Should by only letters, digits, and underlines." exit 1 } append lock_file $::modem_lock $arg2 if {$mode == "on"} { if {[glob -nocomplain $::modem_lock*] == ""} { TurnOn } catch {exec touch $lock_file} exit 0 } if {$mode == "off"} { if {[file exists $lock_file]} { file delete -force $lock_file } if {[glob -nocomplain $::modem_lock*] == ""} { TurnOff } exit 0 }