summaryrefslogtreecommitdiff
path: root/src/rhctl
diff options
context:
space:
mode:
Diffstat (limited to 'src/rhctl')
-rw-r--r--src/rhctl/audio_switch.go7
-rw-r--r--src/rhctl/audio_switch_command.go33
-rw-r--r--src/rhctl/switch_control.go19
-rw-r--r--src/rhctl/telnet.go35
4 files changed, 75 insertions, 19 deletions
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