door_daemon_zmq
[svn42.git] / go / door_daemon_zmq / handle_commands.go
diff --git a/go/door_daemon_zmq/handle_commands.go b/go/door_daemon_zmq/handle_commands.go
new file mode 100644 (file)
index 0000000..d33070a
--- /dev/null
@@ -0,0 +1,68 @@
+// (c) Bernhard Tittelbach, 2013
+
+package main
+
+import (
+    "errors"
+)
+
+type DoorCmdHandler struct {
+    Checker func([][]byte)(error)
+    FirmwareChar string
+}
+
+var cmdToDoorCmdHandler = map[string]DoorCmdHandler {
+  "open": DoorCmdHandler{ checkCmdDoorControl, "o"},
+  "close": DoorCmdHandler{ checkCmdDoorControl, "c"},
+  "toggle": DoorCmdHandler{ checkCmdDoorControl, "t"},
+  "status": DoorCmdHandler{ checkCmdDoorControl, "s"},
+}
+
+// ---------- Command Handling Code -------------
+
+func checkCmdDoorControl(tokens [][]byte) (error) {
+    doorctrl_usage := "syntax: <open|close|toggle> <method> <nickname>"
+    if len(tokens) != 3 {
+        return errors.New(doorctrl_usage)
+    }
+    cmd := string(tokens[0])
+    if ! (cmd == "open" || cmd == "close" || cmd == "toggle") {
+        return errors.New(doorctrl_usage)
+    }
+    method := string(tokens[1])
+    if ! (method == "Button" || method == "ssh" || method == "SSH" || method == "Phone") {
+        return errors.New("method must be one either Button, SSH or Phone")
+    }
+    if len(tokens[2]) == 0 && method != "Button" {
+        return errors.New("Operator nickname must be given")
+    }
+    return nil
+}
+
+func checkCmdStatus(tokens [][]byte) (error) {
+    if len(tokens) != 1 {
+        return errors.New("status command does not accept arguments")
+    }
+    return nil
+}
+
+func HandleCommand(tokens [][]byte, topub chan <- [][]byte, serial_wr chan string, serial_rd chan [][]byte) ([][]byte, error){
+    if len(tokens) < 1 {
+        return nil, errors.New("No Command to handle")
+    }
+    
+    dch, present := cmdToDoorCmdHandler[string(tokens[0])]
+    if ! present {
+        return nil, errors.New("Unknown Command")
+    }
+
+    if err := dch.Checker(tokens); err != nil {
+        //return error to sender
+        return nil, err
+    }
+    
+    topub <- tokens
+    serial_wr <- dch.FirmwareChar
+    fw_reply := <- serial_rd
+    return fw_reply, nil
+}