X-Git-Url: https://git.realraum.at/?a=blobdiff_plain;f=go%2Fuc_sensor_node_zmq%2Fmain.go;h=2c7e0ae4498da6485a744b16a5ac113dc859cab8;hb=6656f26adaada3bd9341595a7312f6a4ba0e181c;hp=52a8aad6feb2c8d73880b2665fef3ab931bb99e4;hpb=59b5b0d11e44853e93a5a66dc66133254f844753;p=svn42.git diff --git a/go/uc_sensor_node_zmq/main.go b/go/uc_sensor_node_zmq/main.go index 52a8aad..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,32 +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.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++ } } }