From 1e5596d626ebba0c150bea5804378cd35f95387e Mon Sep 17 00:00:00 2001
From: Christian Pointner <equinox@spreadspace.org>
Date: Fri, 1 Apr 2016 01:44:33 +0200
Subject: switch status commands work now


diff --git a/src/rhctl/audio_switch.go b/src/rhctl/audio_switch.go
index 2a88b0d..b3a526e 100644
--- a/src/rhctl/audio_switch.go
+++ b/src/rhctl/audio_switch.go
@@ -48,11 +48,6 @@ type SwitchResponse struct {
 	Message string
 }
 
-type SwitchCommand struct {
-	Cmd      SwitchCmdString
-	Response chan<- SwitchResponse
-}
-
 type SwitchUpdateType uint8
 
 const (
@@ -159,7 +154,7 @@ func (sw *AudioSwitch) Run() {
 				return
 			case cmd := <-sw.Commands:
 				sw.current = cmd
-				sw.port.tx <- cmd.Cmd.Generate(sw.unit)
+				sw.port.tx <- cmd.Cmd.Generate(append(cmd.Args, sw.unit)...)
 				sw.timer = time.NewTimer(sw.timeout)
 			case data := <-sw.port.rx:
 				sw.handleData(data)
diff --git a/src/rhctl/audio_switch_command.go b/src/rhctl/audio_switch_command.go
index 693689c..c90b1e4 100644
--- a/src/rhctl/audio_switch_command.go
+++ b/src/rhctl/audio_switch_command.go
@@ -171,3 +171,36 @@ func (c SwitchCmdString) Generate(args ...interface{}) string {
 	}
 	return s
 }
+
+type SwitchCommand struct {
+	Cmd      SwitchCmdString
+	Args     []interface{}
+	Response chan<- interface{}
+}
+
+func NewSwitchCommandFromStrings(cmd string, args ...string) (c *SwitchCommand, err error) {
+	c = &SwitchCommand{}
+	switch cmd {
+	case "status":
+		if len(args) == 0 {
+			return nil, fmt.Errorf("missing argument <status-type>")
+		}
+		switch args[0] {
+		case "audio":
+			c.Cmd = SwitchCmdStatusAudio
+		case "gpi":
+			c.Cmd = SwitchCmdStatusGPI
+		case "oc":
+			c.Cmd = SwitchCmdStatusOC
+		case "relay":
+			c.Cmd = SwitchCmdStatusRelay
+		case "silence":
+			c.Cmd = SwitchCmdStatusSilence
+		default:
+			return nil, fmt.Errorf("unknown status-type: '%s'", args[0])
+		}
+	default:
+		return nil, fmt.Errorf("unknown command '%s'", cmd)
+	}
+	return
+}
diff --git a/src/rhctl/switch_control.go b/src/rhctl/switch_control.go
index df3dce9..ca27b86 100644
--- a/src/rhctl/switch_control.go
+++ b/src/rhctl/switch_control.go
@@ -22,6 +22,8 @@
 package main
 
 import (
+	"fmt"
+
 	"github.com/btittelbach/pubsub"
 )
 
@@ -46,8 +48,9 @@ func (c CommandType) String() string {
 }
 
 type Command struct {
-	Type CommandType
-	args []string
+	Type     CommandType
+	Args     []string
+	Response chan<- interface{}
 }
 
 type SwitchControl struct {
@@ -58,9 +61,19 @@ type SwitchControl struct {
 }
 
 func (ctrl *SwitchControl) handleCommand(cmd *Command) {
-	rhdl.Printf("Telnet: got command: %+v", cmd)
 	switch cmd.Type {
 	case CmdStatus:
+		if len(cmd.Args) == 0 {
+			rhl.Printf("SwitchCTRL: ignoring empty raw switch command")
+			return
+		}
+		c, err := NewSwitchCommandFromStrings(cmd.Args[0], cmd.Args[1:]...)
+		if err != nil {
+			cmd.Response <- fmt.Errorf("switch command syntax error: %s", err.Error())
+			return
+		}
+		c.Response = cmd.Response
+		ctrl.sw.Commands <- c
 	case CmdServer:
 	case CmdSwitch:
 	}
diff --git a/src/rhctl/telnet.go b/src/rhctl/telnet.go
index 4189fc8..c4212e6 100644
--- a/src/rhctl/telnet.go
+++ b/src/rhctl/telnet.go
@@ -29,7 +29,7 @@ type TelnetInterface struct {
 	server *telgo.Server
 }
 
-func telnetStatus(c *telgo.Client, args []string, ctrl *SwitchControl) bool {
+func telnetCmdStatus(c *telgo.Client, args []string, ctrl *SwitchControl) bool {
 	ctrl.Commands <- &Command{Type: CmdStatus}
 	// TODO: implement this
 	return false
@@ -64,7 +64,7 @@ func telnetUpdateListener(c *telgo.Client, ctrl *SwitchControl) {
 	}
 }
 
-func telnetListen(c *telgo.Client, args []string, ctrl *SwitchControl) bool {
+func telnetCmdListen(c *telgo.Client, args []string, ctrl *SwitchControl) bool {
 	if len(args) <= 1 {
 		c.Sayln("missing argument: <type>")
 		return false
@@ -101,15 +101,30 @@ func telnetListen(c *telgo.Client, args []string, ctrl *SwitchControl) bool {
 	return false
 }
 
-func telnetServer(c *telgo.Client, args []string, ctrl *SwitchControl) bool {
+func telnetCmdServer(c *telgo.Client, args []string, ctrl *SwitchControl) bool {
 	ctrl.Commands <- &Command{Type: CmdServer}
 	// TODO: implement this
 	return false
 }
 
-func telnetSwitch(c *telgo.Client, args []string, ctrl *SwitchControl) bool {
-	ctrl.Commands <- &Command{Type: CmdSwitch}
-	// TODO: implement this
+func telnetCmdSwitch(c *telgo.Client, args []string, ctrl *SwitchControl) bool {
+	if len(args) < 2 {
+		c.Sayln("missing switch command")
+		return false
+	}
+	resp := make(chan interface{})
+	ctrl.Commands <- &Command{Type: CmdStatus, Args: args[1:], Response: resp}
+	r := <-resp
+	switch r.(type) {
+	case error:
+		c.Sayln("%v", r)
+	case SwitchResponse:
+		if r.(SwitchResponse).Result != SwitchOK {
+			c.Sayln("%v: %s", r.(SwitchResponse).Result, r.(SwitchResponse).Message)
+		}
+	default:
+		c.Sayln("invalid response of type %T: %+v", r, r)
+	}
 	return false
 }
 
@@ -179,10 +194,10 @@ func TelnetInit(conf *Config, ctrl *SwitchControl) (telnet *TelnetInterface) {
 	telnet = &TelnetInterface{}
 
 	cmdlist := make(telgo.CmdList)
-	cmdlist["status"] = func(c *telgo.Client, args []string) bool { return telnetStatus(c, args, ctrl) }
-	cmdlist["listen"] = func(c *telgo.Client, args []string) bool { return telnetListen(c, args, ctrl) }
-	cmdlist["server"] = func(c *telgo.Client, args []string) bool { return telnetServer(c, args, ctrl) }
-	cmdlist["switch"] = func(c *telgo.Client, args []string) bool { return telnetSwitch(c, args, ctrl) }
+	cmdlist["status"] = func(c *telgo.Client, args []string) bool { return telnetCmdStatus(c, args, ctrl) }
+	cmdlist["listen"] = func(c *telgo.Client, args []string) bool { return telnetCmdListen(c, args, ctrl) }
+	cmdlist["server"] = func(c *telgo.Client, args []string) bool { return telnetCmdServer(c, args, ctrl) }
+	cmdlist["switch"] = func(c *telgo.Client, args []string) bool { return telnetCmdSwitch(c, args, ctrl) }
 	cmdlist["help"] = telnetHelp
 	cmdlist["quit"] = telnetQuit
 
-- 
cgit v0.10.2