++timeout for firmware answer, --bug
[svn42.git] / go / door_daemon_zmq / main.go
index 8b359d0..8d376be 100644 (file)
@@ -6,7 +6,8 @@ import (
     "fmt"
     "os"
     "flag"
-    "log"
+    "time"
+    //~ "log"
 )
 
 //~ func StringArrayToByteArray(ss []string) [][]byte {
@@ -30,8 +31,8 @@ func usage() {
 }
 
 func init() {
-    flag.StringVar(&cmd_port_, "cmdport", "tcp://localhost:5555", "zmq command socket path")
-    flag.StringVar(&pub_port_, "pubport", "gmp://*:6666", "zmq public/listen socket path")
+    flag.StringVar(&cmd_port_, "cmdport", "tcp://127.0.01:3232", "zmq command socket path")
+    flag.StringVar(&pub_port_, "pubport", "pgm://233.252.1.42:4242", "zmq public/listen socket path")
     flag.Usage = usage
     flag.Parse()
 }
@@ -43,26 +44,56 @@ func main() {
         usage()
         os.Exit(1);
     }
-    
-    cmd_chans, pub_chans := ZmqsInit(cmd_port_, pub_port_)   
-    
-    serial_wr, serial_rd, err := OpenAndHandleSerial(args[0], pub_chans.Out())
+
+    zmqctx, cmd_chans, pub_chans := ZmqsInit(cmd_port_, pub_port_)
+    defer cmd_chans.Close()
+    defer pub_chans.Close()
+    defer zmqctx.Close()
+
+    serial_wr, serial_rd, err := OpenAndHandleSerial(args[0])
+    defer close(serial_wr)
     if err != nil {
-        close(serial_wr)
         panic(err)
     }
-    
-    serial_wr <- "f"
-    firmware_version := <- serial_rd
-    log.Print("Firmware version:", firmware_version)
 
-    for incoming_request := range cmd_chans.In() {
-        reply, err := HandleCommand(incoming_request, pub_chans.Out(), serial_wr, serial_rd)
-         if err != nil {
-            cmd_chans.Out() <- [][]byte{[]byte("ERROR"), []byte(err.Error())}
-            log.Print(err)
-         } else {
-            cmd_chans.Out() <- reply
-         }        
+    //~ serial_wr <- "f"
+    //~ firmware_version := <- serial_rd
+    //~ log.Print("Firmware version:", firmware_version)
+    var next_incoming_serial_is_client_reply bool
+    timeout_chan := make(chan bool)
+    defer close(timeout_chan)
+    for {
+        select {
+            case incoming_ser_line, is_notclosed := <- serial_rd:
+                if is_notclosed {
+                    if next_incoming_serial_is_client_reply {
+                        next_incoming_serial_is_client_reply = false
+                        cmd_chans.Out() <- incoming_ser_line
+                    }
+                    pub_chans.Out() <- incoming_ser_line
+                } else {
+                    os.Exit(1)
+                }
+            case tv, timeout_notclosed := <- timeout_chan:
+                if timeout_notclosed && tv && next_incoming_serial_is_client_reply {
+                        next_incoming_serial_is_client_reply = false
+                        cmd_chans.Out() <- [][]byte{[]byte("ERROR"), []byte("No reply from firmware")}
+                }
+            case incoming_request, ic_notclosed := <- cmd_chans.In():
+                if ! ic_notclosed {os.Exit(2)}
+                //~ log.Print(incoming_request)
+                 if err := HandleCommand(incoming_request, serial_wr, serial_rd); err != nil {
+                    //~ log.Print(err)
+                    out_msg := [][]byte{[]byte("ERROR"), []byte(err.Error())}
+                    cmd_chans.Out() <- out_msg
+                    //~ log.Print("sent error")
+                 } else {
+                    //~ log.Print(reply)
+                    pub_chans.Out() <- incoming_request
+                    next_incoming_serial_is_client_reply = true
+                    go func(){time.Sleep(3*time.Second); timeout_chan <- true;}()
+                    //~ log.Print("sent reply")
+                 }
+        }
     }
 }