brain remembers latest events (note design-problem: does not distinguish between...
[svn42.git] / go / r3-eventbroker_zmq / metamovement.go
1 // (c) Bernhard Tittelbach, 2013
2
3 package main
4
5 import (
6     "time"
7     //~ "./brain"
8     pubsub "github.com/tuxychandru/pubsub"
9     "container/ring"
10     "./r3events"
11     )
12
13
14 func MetaEventRoutine_Movement(ps *pubsub.PubSub, granularity, gran_duration int , threshold uint32) {
15     var last_movement int64
16     movement_window := ring.New(granularity+1)
17     events_chan := ps.Sub("movement")
18     defer ps.Unsub(events_chan, "movement")
19     myticker := time.NewTicker(time.Duration(gran_duration) * time.Second)
20
21     for { select {
22         case event := <- events_chan:
23             switch event.(type) {
24                 case r3events.MovementSensorUpdate:
25                     movement_window.Value =  (uint32) (movement_window.Value.(uint32)  + 1)
26             }
27         case <- myticker.C:
28             movement_window.Prev().Value = (uint32) (0)
29             movement_window = movement_window.Next()
30             var movsum uint32 = 0
31             movement_window.Do(func(v interface{}){if v != nil {movsum += v.(uint32)}})
32             ts :=  time.Now().Unix()
33             if movsum > threshold {
34                 ps.Pub( r3events.SomethingReallyIsMoving{true,ts}, "movement")
35                 last_movement = ts
36             }
37
38             if last_movement > 0 && ts - last_movement < 3600*6 && ts - last_movement > 3600*3 {
39                 last_movement = 0
40                 ps.Pub( r3events.SomethingReallyIsMoving{false, ts}, "movement")
41             }
42     } }
43 }