+ zmqctx, sub_in_chans, pub_out_socket, keylookup_socket := ZmqsInit(doorsub_addr_, sensorssub_port_, pub_port_, keylookup_addr_)
+ if sub_in_chans != nil {defer sub_in_chans.Close()}
+ defer zmqctx.Close()
+ if pub_out_socket != nil {defer pub_out_socket.Close()}
+ if keylookup_socket != nil {defer keylookup_socket.Close()}
+ if sub_in_chans == nil || pub_out_socket == nil || keylookup_socket == nil {
+ panic("zmq sockets must not be nil !!")
+ }
+
+ ps := pubsub.New(10)
+ defer ps.Shutdown() // ps.Shutdown should be called before zmq_ctx.Close(), since it will cause goroutines to shutdown and close zqm_sockets which is needed for zmq_ctx.Close() to return
+ //~ ticker := time.NewTicker(time.Duration(5) * time.Minute)
+
+ store_these_events_chan := ps.Sub("door", "doorcmd", "presence", "sensors", "buttons", "movement")
+ go BrainCenter(zmqctx, brain_listen_addr_, store_these_events_chan)
+
+ go MetaEventRoutine_Movement(ps, 10, 20, 10)
+ go MetaEventRoutine_Presence(ps, 21, 200)
+
+ // --- get update on most recent status ---
+ answ := ZmqsAskQuestionsAndClose(zmqctx, door_cmd_addr_, [][][]byte{[][]byte{[]byte("status")}})
+ for _, a := range(answ) {
+ ParseSocketInputLine(a, ps, keylookup_socket)
+ }
+
+ publish_these_events_chan := ps.Sub("door", "doorcmd", "presence", "sensors", "buttons", "movement")
+ for {
+ select {
+ case subin := <- sub_in_chans.In():
+ ParseSocketInputLine(subin, ps, keylookup_socket)
+ //~ case <- ticker.C:
+ //~ MakeTimeTick(ps)
+ case event_interface := <- publish_these_events_chan:
+ data, err := r3events.MarshalEvent2ByteByte(event_interface)
+ Debug_.Printf("publishing %s",data)
+ if err != nil {
+ Syslog_.Print(err)
+ continue
+ }
+ if err := pub_out_socket.Send(data); err != nil {
+ panic(err)
+ }
+ }
+ }
+