X-Git-Url: https://git.realraum.at/?a=blobdiff_plain;f=go%2Fr3-eventbroker_zmq%2Fmetamovement.go;h=e61838deb48c0d00051b083c134cd3fde0eb1cff;hb=eb53c27cdbdd790e391d29a51dec89c12a1dc3ef;hp=ecde4cbebb4ebba243400f35458151d61fe134ec;hpb=b40171692bb6090aae3e75c4eb355ce077a61a89;p=svn42.git diff --git a/go/r3-eventbroker_zmq/metamovement.go b/go/r3-eventbroker_zmq/metamovement.go index ecde4cb..e61838d 100644 --- a/go/r3-eventbroker_zmq/metamovement.go +++ b/go/r3-eventbroker_zmq/metamovement.go @@ -4,15 +4,23 @@ package main import ( "time" - //~ "./brain" pubsub "github.com/tuxychandru/pubsub" "container/ring" - r3events "svn.spreadspace.org/realraum/go.svn/r3-eventbroker_zmq/r3events" + r3events "svn.spreadspace.org/realraum/go.svn/r3events" ) +/// Movement Meta Event Injector: +/// threshold number of movements within gran_duration*granularity seconds -> SomethingReallyIsMoving{True} +/// No movement within 3 hours but movement within the last 6 hours -> SomethingReallyIsMoving{False} +/// +/// Thus SomethingReallyIsMoving{True} fires regularly, but at most every gran_duration seconds +/// While SomethingReallyIsMoving{False} fires only once to assure us that everybody might really be gone + + func MetaEventRoutine_Movement(ps *pubsub.PubSub, granularity, gran_duration int , threshold uint32) { - var last_movement int64 + var last_movement,last_movement1,last_movement2,last_movement3 int64 + var confidence uint8 movement_window := ring.New(granularity+1) events_chan := ps.Sub("movement") defer ps.Unsub(events_chan, "movement") @@ -24,20 +32,36 @@ func MetaEventRoutine_Movement(ps *pubsub.PubSub, granularity, gran_duration int case r3events.MovementSensorUpdate: movement_window.Value = (uint32) (movement_window.Value.(uint32) + 1) } - case <- myticker.C: + case gots := <- myticker.C: + ts := gots.Unix() movement_window.Prev().Value = (uint32) (0) movement_window = movement_window.Next() var movsum uint32 = 0 movement_window.Do(func(v interface{}){if v != nil {movsum += v.(uint32)}}) - ts := time.Now().Unix() if movsum > threshold { - ps.Pub( r3events.SomethingReallyIsMoving{true,ts}, "movement") + confidence = uint8(movsum) + ps.Pub( r3events.SomethingReallyIsMoving{true, confidence ,ts}, "movement") last_movement = ts + last_movement1 = ts + last_movement2 = ts + last_movement3 = ts } if last_movement > 0 && ts - last_movement < 3600*6 && ts - last_movement > 3600*3 { last_movement = 0 - ps.Pub( r3events.SomethingReallyIsMoving{false, ts}, "movement") + ps.Pub( r3events.SomethingReallyIsMoving{false,99,ts}, "movement") + } + if last_movement1 > 0 && ts - last_movement < 3600*6 && ts - last_movement1 > 120 { + last_movement1 = 0 + ps.Pub( r3events.SomethingReallyIsMoving{false,10,ts}, "movement") + } + if last_movement2 > 0 && ts - last_movement < 3600*6 && ts - last_movement2 > 1800 { + last_movement2 = 0 + ps.Pub( r3events.SomethingReallyIsMoving{false,25,ts}, "movement") + } + if last_movement3 > 0 && ts - last_movement < 3600*6 && ts - last_movement3 > 3600 { + last_movement3 = 0 + ps.Pub( r3events.SomethingReallyIsMoving{false,50,ts}, "movement") } } } } \ No newline at end of file