Direct_Url / do/ set LastSecs 0 set Millis 0 ;# not actual milliseconds, but incrementing set GridPW primhog set History 0 set Obj(0,0) {0 0} set Ts(0) 0,0 proc timestamp {} { global LastSecs Millis set now [clock seconds] if { $now eq $LastSecs } { incr Millis } else { set Millis 0 } set LastSecs $now format "T%011d%03d" [clock seconds] $Millis } proc bgerror {s} { puts stderr "#### BGERROR: $s" puts stderr "####" } proc do/slmatter {args} { global Obj Ts GridPW History array set a $args puts stderr "@@@@@ SLMATTER: $args" # @@@@@ SLMATTER: pw primhog mc 181700 max 12 after T01175496335010 sync 0 raw {spoke;1141319564;Strick%20Unknown;d1d8ed57-3be5-412f-9c1a-15be2855e846;blahblah} who Matter k 66af1ce5-e62f-157f-65d6-0ef4920d9bc4 # @@@@@ SLSENSOR: pw primhog mc 181700 max 12 after T01175496335010 sync 0 name {Strick Unknown} pos <-0.64026,2.30016,0.67695> rot <-0.05709,-0.02430,-1.81241> if {[regexp {^([^;]*)[;]} $a(raw) - cmd]} { # the objid still has the mc added to it, so subtract mc now puts stderr "----- SLMATTER: cmd: $cmd" if { $cmd == "spoke" } { puts stderr "----- SLMATTER: spoke:" if {[regexp {^([^;]*)[;]([^;]*)[;]([^;]*)[;]([^;]*)[;]([^;]*)} $a(raw) - cmd objid who key what]} { puts stderr "----- SLMATTER: chatting: $who :: $what" Chat $who $what $a(mc) } } elseif { $cmd == "moved" } { if {[regexp {^([^;]*)[;]([^;]*)[;]([^;]*)[;]([^;]*)[;]([^;]*)} $a(raw) - cmd objid gap to from]} { puts stderr "----- SLMATTER: moving: id $objid to $to" set objid [expr {$objid - $a(mc)}] regsub -all {[<>,]} $to " " to set x [lindex $to 0] set y [lindex $to 1] set z [lindex $to 2] puts stderr "----- SLMATTER: moving: id $objid to $to x $x y $y z $z" Replace $objid l "$x,$y,$z,0,0,0" $a(mc) } } } } set PuppetSerial 10 ;# danger, dont start at 1, cauz C+1 is the die signal proc register-puppet {name mc} { global Puppet PuppetSerial if { ! [info exists Puppet($name)]} { set Puppet($name) $PuppetSerial incr PuppetSerial } expr { $mc + $Puppet($name) } } proc do/slsensor {args} { global Obj Ts GridPW History array set a $args puts stderr "@@@@@ SLSENSOR: $args" if {[catch { # get an id number for the puppet regsub {[^A-Za-z0-9]} $a(name) _ name set num [register-puppet $name $a(mc)] Replace $num _puppet "$name;$a(pos);$a(rot)" $a(mc) # Sync $a(after) $a(max) $a(sync) $a(mc) } what]} { puts stderr "ERROR IN do/slsensor: $::errorInfo" error Rethrow--$what } return $what } #urlencode proc urlencode {text} { set url "" foreach byte [split [encoding convertto utf-8 $text] ""] { scan $byte %c i if {[string match {[%<>""]} $byte] || $i <= 32 || $i > 127} { append url [format %%%02X $i] } else { append url $byte } } return $url } proc Chat {who what mc} { global Obj Ts GridPW History #set who [urlencode $who] #set what [urlencode $what] set value [urlencode "$who >> $what"] set t [timestamp] set id $who set key _chat set Obj($id,$key) [list $t $value $mc] set Ts($t) $id,$key lappend History $t puts stderr "Chat $t --> $id $key $value $mc" # they should be consumed quickly, so waiting just 30 secs is reasonable after 30000 [list DropChat $t $id,$key] } proc DropChat {t x} { global Obj Ts GridPW History unset Ts($t) unset Obj($x) set History [lsort [array names Ts]] } proc Replace {id key value mc} { global Obj Ts GridPW History if {[info exists Obj($id,$key)]} { set oldt [lindex $Obj($id,$key) 0] puts stderr "Delete $oldt --> $id $key OLD $Obj($id,$key) OLD" unset Ts($oldt) unset Obj($id,$key) # remove entry from History set i [lsearch History $oldt] ;# search for it if {$i>0} { ;# if found, replace it with nothing set History [lreplace $History $i $i] } } set t [timestamp] set Obj($id,$key) [list $t $value $mc] set Ts($t) $id,$key lappend History $t puts stderr "Replace $t --> $id $key $value $mc" } proc do/put {args} { global Obj Ts GridPW History puts stderr "@@@@@ PUT: $args" #puts <$args> #foreach {x y} $args { puts "<$x#$y>" } array set a $args set mc 0 catch { set mc $a(mc) } Replace $a(id) $a(key) $a(value) $mc } proc do/sync {args} { puts stderr "@@@@@ SYNC: $args" global Obj Ts GridPW History array set a $args Sync $a(after) $a(max) $a(sync) $a(mc) } proc Sync {after max sync mc} { global Obj Ts GridPW History # stupid slow algo set n [llength $History] set i 0 set z {} foreach x $History { if { $x <= $after } continue set ts $x if { ! [info exists Ts($ts)] } { puts stderr "SKIPPING MISSING TS: $ts" #puts stderr " H:$History" #puts stderr " T:[lsort [array names Ts]]" continue } set pair [split $Ts($ts) ","] set id [lindex $pair 0] set key [lindex $pair 1] set value [lindex $Obj($id,$key) 1] set sender [lindex $Obj($id,$key) 2] puts stderr "...... sender <$sender> mc <$mc> ............" if { $sender == $mc } { # dont send updates back to sender puts stderr "OMIT TO SENDER: $mc: $ts -> $id $key $value OMIT" continue } append z "$ts $id $key $value\n" incr i #if ($i==$max) break if { [string length $z] > 900 } break; } puts stderr "===== Sync Returns: ``$z''" return $z } proc init {id k v} { Replace $id $k $v 000 } set green 0.0 set id 11111 foreach x {-15 -5 5 15} { foreach y {-20 -10 0 10 20} { #if {$x>=0} continue #if {$y>=0} continue incr id set green [expr {$green>0.95 ? 1.0 : $green+0.03}] init $id k cube init $id s "0.5;0.5;2.0;1;$green;0" init $id l "$x;$y;2;0;0;0" } } puts stderr "<<<<<<<<<<<<<<< BEGIN TEST" foreach x $History { puts "$x -> [join [split [do/sync after $x max 3 sync 1 mc 0] \n] | ]" } puts stderr ">>>>>>>>>>>>>>> END TEST" puts stderr "==========================================" puts stderr "==========================================" puts stderr "==========================================" puts stderr "==========================================" puts stderr "=========================================="