X-Git-Url: https://git.realraum.at/?a=blobdiff_plain;f=go%2Fuc_sensor_node_zmq%2Fmain.go;h=2c7e0ae4498da6485a744b16a5ac113dc859cab8;hb=d038b0ad0b1371588093d0cb282b96df747884e6;hp=434f553664b2e331c7093c783fb868ea9aa0ed09;hpb=4869706a93dc29d91cc5b219d9f210d72822cdaf;p=svn42.git diff --git a/go/uc_sensor_node_zmq/main.go b/go/uc_sensor_node_zmq/main.go index 434f553..2c7e0ae 100644 --- a/go/uc_sensor_node_zmq/main.go +++ b/go/uc_sensor_node_zmq/main.go @@ -4,6 +4,8 @@ package main import ( "flag" + "time" + zmq "github.com/vaughan0/go-zmq" ) @@ -12,33 +14,59 @@ import ( var ( tty_dev_ string pub_addr string - use_syslog_ bool + use_syslog_ bool + enable_debug_ bool + serial_speed_ uint ) +const exponential_backof_activation_threshold int64 = 4 + func init() { - flag.StringVar(&pub_addr, "brokeraddr", "tcp://torwaechter.realraum.at:4244", "zmq address to send stuff to") + flag.StringVar(&pub_addr, "brokeraddr", "tcp://torwaechter.realraum.at:4243", "zmq address to send stuff to") flag.StringVar(&tty_dev_, "ttydev", "/dev/ttyACM0", "path do tty uc device") + flag.UintVar(&serial_speed_, "serspeed", 0, "tty baudrate (0 to disable setting a baudrate e.g. in case of ttyACM)") flag.BoolVar(&use_syslog_, "syslog", false, "log to syslog local1 facility") - //~ flag.Usage = flag.PrintDefaults + flag.BoolVar(&enable_debug_, "debug", false, "debugging messages on") flag.Parse() } +func ConnectSerialToZMQ(pub_sock *zmq.Socket) { + defer func() { + if x:= recover(); x != nil { Syslog_.Println(x) } + }() + + serial_wr, serial_rd, err := OpenAndHandleSerial(tty_dev_, serial_speed_) + if err != nil { panic(err) } + defer close(serial_wr) + + for incoming_ser_line := range(serial_rd) { + Syslog_.Printf("%s",incoming_ser_line) + if err := pub_sock.Send(incoming_ser_line); err != nil { Syslog_.Println(err.Error()) } + } +} + func main() { zmqctx, pub_sock := ZmqsInit(pub_addr) + if pub_sock == nil { panic("zmq socket creation failed") } defer zmqctx.Close() defer pub_sock.Close() - if use_syslog_ { + if enable_debug_ { + LogEnableDebuglog() + } else if use_syslog_ { LogEnableSyslog() Syslog_.Print("started") } - serial_wr, serial_rd, err := OpenAndHandleSerial(tty_dev_) - if err != nil { panic(err) } - defer close(serial_wr) - - for incoming_ser_line := range(serial_rd) { - Syslog_.Printf("%s",incoming_ser_line) - if err := pub_sock.Send(incoming_ser_line); err != nil { panic(err) } + var backoff_exp uint32 = 0 + for { + start_time := time.Now().Unix() + ConnectSerialToZMQ(pub_sock) + run_time := time.Now().Unix() - start_time + if run_time > exponential_backof_activation_threshold { + backoff_exp = 0 + } + time.Sleep(150*(1 << backoff_exp) * time.Millisecond) + if backoff_exp < 12 { backoff_exp++ } } }