X-Git-Url: https://git.realraum.at/?a=blobdiff_plain;f=go%2Fr3-eventbroker_zmq%2Fmetamovement.go;h=3ccfd7227ad50771b8d49f824ec59b37e3343476;hb=a87c91b7d4544703879b7ef6e472b863765e3949;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..3ccfd72 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") @@ -22,22 +30,41 @@ func MetaEventRoutine_Movement(ps *pubsub.PubSub, granularity, gran_duration int case event := <- events_chan: switch event.(type) { case r3events.MovementSensorUpdate: - movement_window.Value = (uint32) (movement_window.Value.(uint32) + 1) + if movement_window.Value == nil { + movement_window.Value = uint32(1) + } else { + 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