X-Git-Url: https://git.realraum.at/?p=svn42.git;a=blobdiff_plain;f=go%2Fuc_sensor_node_zmq%2Fmain.go;fp=go%2Fuc_sensor_node_zmq%2Fmain.go;h=fa917e88daa81109b0efc6a19a46feed557ec9e0;hp=2c7e0ae4498da6485a744b16a5ac113dc859cab8;hb=b558aac395859de274b40cb0d96f3932721bcaf5;hpb=1fdb2f07795d8370ba9619ae6011edab6d539b0b diff --git a/go/uc_sensor_node_zmq/main.go b/go/uc_sensor_node_zmq/main.go index 2c7e0ae..fa917e8 100644 --- a/go/uc_sensor_node_zmq/main.go +++ b/go/uc_sensor_node_zmq/main.go @@ -3,70 +3,91 @@ package main import ( - "flag" - "time" - zmq "github.com/vaughan0/go-zmq" -) + "flag" + "time" + zmq "github.com/vaughan0/go-zmq" +) // ---------- Main Code ------------- var ( - tty_dev_ string - pub_addr string - use_syslog_ bool - enable_debug_ bool - serial_speed_ uint + tty_dev_ string + pub_addr string + 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: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() + 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) } - }() +func ConnectSerialToZMQ(pub_sock *zmq.Socket, timeout time.Duration) { + 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) - serial_wr, serial_rd, err := OpenAndHandleSerial(tty_dev_, serial_speed_) - if err != nil { panic(err) } - defer close(serial_wr) + t := time.NewTimer(timeout) + for { + select { + case incoming_ser_line, seropen := <-serial_rd: + if !seropen { + return + } + t.Reset(timeout) + Syslog_.Printf("%s", incoming_ser_line) + if err := pub_sock.Send(incoming_ser_line); err != nil { + Syslog_.Println(err.Error()) + } - 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()) } - } + case <-t.C: + Syslog_.Print("Timeout, no message for 120 seconds") + } + } } func main() { - zmqctx, pub_sock := ZmqsInit(pub_addr) - if pub_sock == nil { panic("zmq socket creation failed") } - defer zmqctx.Close() - defer pub_sock.Close() + zmqctx, pub_sock := ZmqsInit(pub_addr) + if pub_sock == nil { + panic("zmq socket creation failed") + } + defer zmqctx.Close() + defer pub_sock.Close() - if enable_debug_ { - LogEnableDebuglog() - } else if use_syslog_ { - LogEnableSyslog() - Syslog_.Print("started") - } + if enable_debug_ { + LogEnableDebuglog() + } else if use_syslog_ { + LogEnableSyslog() + Syslog_.Print("started") + } - 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++ } - } + var backoff_exp uint32 = 0 + for { + start_time := time.Now().Unix() + ConnectSerialToZMQ(pub_sock, time.Second*120) + 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++ + } + } }