2c7e0ae4498da6485a744b16a5ac113dc859cab8
[svn42.git] / go / uc_sensor_node_zmq / main.go
1 // (c) Bernhard Tittelbach, 2013
2
3 package main
4
5 import (
6     "flag"
7     "time"
8     zmq "github.com/vaughan0/go-zmq"
9 )
10
11
12 // ---------- Main Code -------------
13
14 var (
15     tty_dev_ string
16     pub_addr string
17     use_syslog_ bool
18     enable_debug_ bool
19     serial_speed_ uint
20 )
21
22 const exponential_backof_activation_threshold int64 = 4
23
24 func init() {
25     flag.StringVar(&pub_addr, "brokeraddr", "tcp://torwaechter.realraum.at:4243", "zmq address to send stuff to")
26     flag.StringVar(&tty_dev_, "ttydev", "/dev/ttyACM0", "path do tty uc device")
27     flag.UintVar(&serial_speed_, "serspeed", 0, "tty baudrate (0 to disable setting a baudrate e.g. in case of ttyACM)")
28     flag.BoolVar(&use_syslog_, "syslog", false, "log to syslog local1 facility")    
29     flag.BoolVar(&enable_debug_, "debug", false, "debugging messages on")    
30     flag.Parse()
31 }
32
33 func ConnectSerialToZMQ(pub_sock *zmq.Socket) {
34     defer func() {
35         if x:= recover(); x != nil { Syslog_.Println(x) }
36     }()
37
38     serial_wr, serial_rd, err := OpenAndHandleSerial(tty_dev_, serial_speed_)
39     if err != nil { panic(err) }
40     defer close(serial_wr)
41
42     for incoming_ser_line := range(serial_rd) {
43         Syslog_.Printf("%s",incoming_ser_line)
44         if err := pub_sock.Send(incoming_ser_line); err != nil { Syslog_.Println(err.Error()) }
45     }
46 }
47
48 func main() {
49     zmqctx, pub_sock := ZmqsInit(pub_addr)
50     if pub_sock == nil { panic("zmq socket creation failed") }
51     defer zmqctx.Close()   
52     defer pub_sock.Close()
53
54     if enable_debug_ {
55         LogEnableDebuglog()
56     } else if use_syslog_ {
57         LogEnableSyslog()
58         Syslog_.Print("started")
59     }
60
61     var backoff_exp uint32 = 0
62     for {
63         start_time := time.Now().Unix()
64         ConnectSerialToZMQ(pub_sock)
65         run_time := time.Now().Unix() - start_time
66         if run_time > exponential_backof_activation_threshold {
67             backoff_exp = 0
68         }
69         time.Sleep(150*(1 << backoff_exp) * time.Millisecond)
70         if backoff_exp < 12 { backoff_exp++ }
71     }
72 }