From: ian Date: Mon, 23 Jan 2006 22:18:12 +0000 (+0000) Subject: lights by left and right arrows X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ijackson/git?p=trains.git;a=commitdiff_plain;h=ebfe663793ecfd1ff8ff31f0f4b026397210387e lights by left and right arrows --- diff --git a/hostside/eventrun.events b/hostside/eventrun.events index 6110ed1..df76a97 100644 --- a/hostside/eventrun.events +++ b/hostside/eventrun.events @@ -8,8 +8,8 @@ b2 tw ask_speed -1 ec tw ask_speed +1 e6 tw ask_randspeed -ea tw ask_manual 0 -e9 tw ask_manual 1 +ea tw ask_funcs l +e9 tw ask_funcs r e8 tw ask_figureeight e7 tw ask_loop e5 tw ask_randpath diff --git a/hostside/stopgap-controller b/hostside/stopgap-controller index 1375f1f..826106b 100755 --- a/hostside/stopgap-controller +++ b/hostside/stopgap-controller @@ -7,7 +7,7 @@ set testonly 0 set port /dev/ttya0 #set port /dev/ttyS0 -set loco 1 +set loco 2 set ch(funcsevery) 10 set ch(speeddirnevery) 30 @@ -40,6 +40,12 @@ set funcs ff7f # unset pointpos($point) # unset segdetect($seg) ;# unset: shown D0; {}: shown D1; or: after id, D1->0 +set funcsr1 {0x061 0x020 0x000 0x040 0x060} +set funcsl1 {0x181 0x080 0x000 0x100 0x180} +set funcsr2 {0x021 0x020 0x000} +set funcsl2 {0x041 0x040 0x000} +set funcsval 0x000 + proc gui {m} { puts "GUI $m" } @@ -388,12 +394,49 @@ proc newspeeddirn {} { return "speed126 $loco $speed $dirn" } +proc funcs_removebits {lr headent} { + global funcsval + set funcsval [format 0x%x [expr {$funcsval & ~$headent}]] +} +proc funcs_addbits {lr list} { + global loco funcsval + set headent [lindex $list 0] + set val $funcsval + set add $headent + if {$add & 0x01} { + set rand 0x[randbyte]0 + set add [expr {$add & $rand}] + set val [expr {$val | $add}] + debug "funcs $lr v=$funcsval add=$add new=$val rand=$rand ($list)" + } else { + set val [expr {$val | $add}] + debug "funcs $lr v=$funcsval add=$add new=$val ($list)" + } + set funcsval $val +} + +proc funcsnmralist {} { + global loco funcsval + return "funcs5to8 $loco $funcsval" +} + proc newfuncs {} { - global loco - set b3 0x[randbyte] - set value [expr {($b3 & 127) * 16}] - debug "funcs b3=$b3 value=[format %x $value]" - return "funcs5to8 $loco $value" + global loco funcsval + foreach lr {l r} { + upvar #0 funcs${lr}${loco} list + set now [lindex $list 0] + funcs_removebits $lr $now + funcs_addbits $lr $list + } + return [funcsnmralist] +} + +proc nmrachange {thing argstring} { + global $thing + set bin [eval exec ./hostside-old -s/dev/stdout $argstring] + binary scan $bin H* x + debug "changed $thing=$x ($argstring)" + set $thing ff$x } proc maybechange {thing force} { @@ -419,17 +462,14 @@ proc maybechange {thing force} { set l $fixed if {![llength $l]} { return 0 } } - set bin [eval exec ./hostside-old -s/dev/stdout $l] - binary scan $bin H* x - debug "changed $thing=$x" - set $thing ff$x + nmrachange $thing $l return 1 } proc changewhat {} { global ch chwa catch { after cancel $chwa } - if {[maybechange speeddirn 0] || [maybechange funcs 0]} { + if {[maybechange speeddirn 0] + [maybechange funcs 0]} { set interval $ch(minint) } else { set interval 1000 @@ -478,12 +518,12 @@ proc setup {} { proc setup_complete {} { global rand +# exec [xset s off] set rand [open /dev/urandom {RDONLY} 0] fconfigure $rand -encoding binary -translation binary tellpic 0a } - #---------- # for keyboard control @@ -511,7 +551,16 @@ proc ask_randspeed {} { maybechange speeddirn 1 } -proc ask_manual {rightp} { global pointasked; set pointasked M$rightp } +proc ask_funcs {lr} { + global loco + upvar #0 funcs${lr}${loco} list + set now [lindex $list 0] + funcs_removebits $lr $now + set list [concat [lrange $list 1 end] $now] + funcs_addbits $lr $list + nmrachange funcs [funcsnmralist] +} + proc ask_figureeight {} { global pointasked; set pointasked 0 } proc ask_loop {} { global pointasked; set pointasked 1 } proc ask_randpath {} { global pointasked; catch { unset pointasked } }