X-Git-Url: https://git.realraum.at/?a=blobdiff_plain;f=go%2Fr3-eventbroker_zmq%2Fmetamovement.go;h=a24d4ed579615176f476152acc8106b8a4b5944e;hb=b07f14117f5b11ddce087d6a9177587c9438ca65;hp=7210e6d89c4585e20fca289a1613da934dd80b6c;hpb=ff98cdc53bc87b9d4f3215df248c188a84cb2fb1;p=svn42.git diff --git a/go/r3-eventbroker_zmq/metamovement.go b/go/r3-eventbroker_zmq/metamovement.go index 7210e6d..a24d4ed 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" + 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,35 @@ 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") + // this sucks..... + if last_movement > 0 && ts - last_movement < 3600*6 { + if ts - last_movement > 3600*3 { + last_movement = 0 + ps.Pub( r3events.SomethingReallyIsMoving{false,99,ts}, "movement") + } else if ts - last_movement > 3600 && last_movement3 > 0 { + last_movement3 = 0 + ps.Pub( r3events.SomethingReallyIsMoving{false,50,ts}, "movement") + } else if ts - last_movement > 1800 && last_movement2 > 0 { + last_movement2 = 0 + ps.Pub( r3events.SomethingReallyIsMoving{false,20,ts}, "movement") + } else if ts - last_movement > 120 && last_movement1 > 0 { + last_movement1 = 0 + ps.Pub( r3events.SomethingReallyIsMoving{false,5,ts}, "movement") + } } } } } \ No newline at end of file