X-Git-Url: https://git.realraum.at/?a=blobdiff_plain;f=go%2Fr3-eventbroker_zmq%2Fmetamovement.go;fp=go%2Fr3-eventbroker_zmq%2Fmetamovement.go;h=98d8e8d562fe320776872a0fe14d44b74fb82d0b;hb=03f11406495d2de6340f0331f91ebfd25fbe67ed;hp=0000000000000000000000000000000000000000;hpb=845254e617b714552edbf860632f0e763a40d1a5;p=svn42.git diff --git a/go/r3-eventbroker_zmq/metamovement.go b/go/r3-eventbroker_zmq/metamovement.go new file mode 100644 index 0000000..98d8e8d --- /dev/null +++ b/go/r3-eventbroker_zmq/metamovement.go @@ -0,0 +1,46 @@ +// (c) Bernhard Tittelbach, 2013 + +package main + +import ( + "time" + //~ "./brain" + pubsub "github.com/tuxychandru/pubsub" + "container/ring" + ) + +type SomethingReallyIsMoving struct { + Movement bool + Ts int64 +} + + +func MetaEventRoutine_Movement(ps *pubsub.PubSub, granularity, gran_duration int , threshold uint32) { + var last_movement int64 + movement_window := ring.New(granularity+1) + events_chan := ps.Sub("movement") + myticker := time.NewTicker(time.Duration(gran_duration) * time.Second) + + for { select { + case event := <- events_chan: + switch event.(type) { + case MovementSensorUpdate: + movement_window.Value = (uint32) (movement_window.Value.(uint32) + 1) + } + case <- myticker.C: + 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( SomethingReallyIsMoving{true,ts}, "movement") + last_movement = ts + } + + if last_movement > 0 && ts - last_movement < 3600*6 && ts - last_movement > 3600*3 { + last_movement = 0 + ps.Pub( SomethingReallyIsMoving{false, ts}, "movement") + } + } } +} \ No newline at end of file