removed kicad-libs and teenstep after moving to github
[svn42.git] / go / door_client_zmq / main.go
index 2c2afe3..7ce4fb8 100644 (file)
@@ -17,30 +17,29 @@ import (
 var (
     cmd_port_ string
     sub_port_ string
+    cmd_method_ string
+    cmd_user_ string
 )
 
-func usage() {
-    fmt.Fprintf(os.Stderr, "Usage: door_client_zmq\n")
-    flag.PrintDefaults()
-}
-
 func init() {
-    flag.StringVar(&cmd_port_, "cmdport", "tcp://localhost:5555", "zmq command socket path")
-    flag.StringVar(&sub_port_, "pubport", "gmp://*:6666", "zmq subscribe/listen socket path")
-    flag.Usage = usage
+    flag.StringVar(&cmd_port_, "cmdport", "ipc:///run/tuer/door_cmd.ipc", "zmq command socket path")
+    flag.StringVar(&sub_port_, "pubport", "tcp://torwaechter.realraum.at:4242", "zmq subscribe/listen socket path")
+    flag.StringVar(&cmd_method_, "method", "", "zmq cmd method")
+    flag.StringVar(&cmd_user_, "usernick", "", "zmq cmd user identity")
     flag.Parse()
 }
 
 func LineReader(out chan <- [][]byte, stdin * os.File) {
     linescanner := bufio.NewScanner(stdin)
     linescanner.Split(bufio.ScanLines)
+    defer close(out)
     for linescanner.Scan() {
         if err := linescanner.Err(); err != nil {
             log.Print(err)
-            close(out)
             return
         }
-        text := bytes.Fields([]byte(linescanner.Text()))
+        //text := bytes.Fields(linescanner.Bytes()) //this returns a slice (aka pointer, no array deep-copy here)
+        text := bytes.Fields([]byte(linescanner.Text())) //this allocates a string and slices it -> no race-condition with overwriting any data
         if len(text) == 0 {
             continue
         }
@@ -48,12 +47,18 @@ func LineReader(out chan <- [][]byte, stdin * os.File) {
     }
 }
 
+func ByteArrayToString(bb [][]byte) string {
+    b := bytes.Join(bb, []byte(" "))
+    return string(b)
+}
+
 func main() {
-    cmd_chans, sub_chans := ZmqsInit(cmd_port_, sub_port_)
+    zmqctx, cmd_chans, sub_chans := ZmqsInit(cmd_port_, sub_port_)
     defer cmd_chans.Close()
     defer sub_chans.Close()
+    defer zmqctx.Close()
     var listen bool
-    var ignore_next bool
+    var ignore_next uint = 0
 
     user_input_chan := make(chan [][]byte, 1)
     go LineReader(user_input_chan, os.Stdin)
@@ -65,26 +70,30 @@ func main() {
             if input_open {
                 if len(input) == 0 { continue }
                  switch string(input[0]) {
+                    case "help", "?":
+                        fmt.Println("Available Commands: help, listen, quit. Everything else is passed through to door daemon")
                     case "listen":
                         listen = true
-                        fmt.Println("Now listening")
+                        fmt.Println("Now listening, @ are broadcasts")
                     case "quit":
-                        break
+                        os.Exit(0)
                     default:
-                        ignore_next = true
+                        ignore_next = 2
                         cmd_chans.Out() <- input
-                        fmt.Println( <- cmd_chans.In())
+                        reply := <- cmd_chans.In()
+                        fmt.Println(">",ByteArrayToString(reply))
                 }
             } else {
-                break
+                os.Exit(0)
             }
         case pubsubstuff := <- sub_chans.In():
-            if ignore_next {
-                ignore_next = false
+            if len(pubsubstuff) == 0 { continue}
+            if ignore_next > 0 {
+                ignore_next--
                 continue
             }
             if listen {
-                fmt.Println(pubsubstuff)
+                fmt.Println("@",ByteArrayToString(pubsubstuff))
             }
         }
     }