Functioning shell for controlling lights :^)

This commit is contained in:
kayos@tcp.direct 2022-07-08 06:26:51 -07:00
parent e6874ed3b8
commit cd0c68e8a2
Signed by: kayos
GPG Key ID: 4B841471B4BEE979
3 changed files with 77 additions and 30 deletions

@ -5,7 +5,6 @@ import (
"fmt" "fmt"
"os" "os"
"strings" "strings"
"sync"
"time" "time"
cli "git.tcp.direct/Mirrors/go-prompt" cli "git.tcp.direct/Mirrors/go-prompt"
@ -132,7 +131,7 @@ func cmdScan(br *lights.Bridge, args []string) error {
if err != nil { if err != nil {
return err return err
} }
for resp, _ := range r.Success { for resp := range r.Success {
log.Info().Msg(resp) log.Info().Msg(resp)
} }
var count = 0 var count = 0
@ -171,20 +170,20 @@ func StartCLI() {
var hist []string var hist []string
processBridges(lights.Lucifer.Bridges) processBridges(lights.Lucifer.Bridges)
comphead := 0 /* comphead := 0
compmu := &sync.Mutex{} compmu := &sync.Mutex{}
cleanSlate := func(b *cli.Buffer) { cleanSlate := func(b *cli.Buffer) {
compmu.Lock() compmu.Lock()
defer compmu.Lock() defer compmu.Lock()
sugs := completer(*b.Document()) sugs := completer(*b.Document())
if comphead > len(sugs)-2 { if comphead > len(sugs)-2 {
comphead = 0 comphead = 0
return return
} }
comphead++ comphead++
b.CursorLeft(len(b.Document().TextBeforeCursor())) b.CursorLeft(len(b.Document().TextBeforeCursor()))
b.InsertText(sugs[comphead].Text, true, true) b.InsertText(sugs[comphead].Text, true, true)
} }*/
p := cli.New( p := cli.New(
executor, executor,
@ -205,16 +204,16 @@ func StartCLI() {
return fmt.Sprintf("ziggs[%s] %s ", sel, bulb), true return fmt.Sprintf("ziggs[%s] %s ", sel, bulb), true
}), }),
cli.OptionTitle("ziggs"), cli.OptionTitle("ziggs"),
cli.OptionAddKeyBind(cli.KeyBind{ /* cli.OptionAddKeyBind(cli.KeyBind{
Key: cli.Tab, Key: cli.Tab,
Fn: cleanSlate, Fn: cleanSlate,
}), }),
cli.OptionCompletionOnDown(), */cli.OptionCompletionOnDown(),
cli.OptionAddKeyBind(cli.KeyBind{ /* cli.OptionAddKeyBind(cli.KeyBind{
Key: cli.Down, Key: cli.Down,
Fn: cleanSlate, Fn: cleanSlate,
}), }),
) */)
p.Run() p.Run()
} }

@ -1,12 +1,59 @@
package interactive package interactive
import ( import (
"errors"
"strconv"
cli "git.tcp.direct/Mirrors/go-prompt" cli "git.tcp.direct/Mirrors/go-prompt"
"github.com/amimof/huego"
"git.tcp.direct/kayos/ziggs/lights" "git.tcp.direct/kayos/ziggs/lights"
) )
func cmdLights(br *lights.Bridge, args []string) error { func cmdLights(br *lights.Bridge, args []string) error {
if len(br.HueLights) <= 0 {
return errors.New("no lights found")
}
for _, l := range br.HueLights {
log.Info().Str("caller", l.Name).
Int("ID", l.ID).Str("type", l.ProductName).
Str("model", l.ModelID).Bool("on", l.IsOn()).Msgf("%v", l.State)
}
return nil
}
func cmdGroups(br *lights.Bridge, args []string) error {
var groupmap = make(map[string]*huego.Group)
gs, err := br.Bridge.GetGroups()
if err != nil {
return err
}
for _, g := range gs {
groupmap[g.Name] = &g
}
if len(args) > 0 {
switch {
case args[1] == "+":
return groupmap[args[0]].Bri(groupmap[args[0]].State.Bri + 25)
case args[1] == "-":
return groupmap[args[0]].Bri(groupmap[args[0]].State.Bri - 25)
default:
newBrightness, numErr := strconv.Atoi(args[1])
if numErr != nil {
return numErr
}
return groupmap[args[0]].Bri(uint8(newBrightness))
}
}
if len(gs) == 0 {
return errors.New("no lights found")
}
for _, g := range gs {
log.Info().Str("caller", g.Name).Str("type", g.Type).Int("ID", g.ID).
Str("class", g.Class).Bool("on", g.IsOn()).Msgf("%v", g.GroupState)
}
return nil return nil
} }
@ -15,6 +62,7 @@ type reactor func(bridge *lights.Bridge, args []string) error
var bridgeCMD = map[string]reactor{ var bridgeCMD = map[string]reactor{
"scan": cmdScan, "scan": cmdScan,
"lights": cmdLights, "lights": cmdLights,
"groups": cmdGroups,
} }
const use = "use" const use = "use"

@ -13,16 +13,16 @@ import (
var ( var (
saveTermios unix.Termios saveTermios unix.Termios
saveTermiosFD int saveTermiosFD int
saveTermiosOnce sync.Once saveTermiosOnce = &sync.Once{}
) )
func getOriginalTermios(fd int) (unix.Termios, error) { func getOriginalTermios(fd int) (unix.Termios, error) {
var err error var err error
saveTermiosOnce.Do(func() { saveTermiosOnce.Do(func() {
saveTermiosFD = fd saveTermiosFD = fd
var saveTermiosPtr *unix.Termios var saveTermiosPtr unix.Termios
termios.Tcgetattr(uintptr(fd), saveTermiosPtr) err = termios.Tcgetattr(uintptr(fd), &saveTermiosPtr)
saveTermios = *saveTermiosPtr saveTermios = saveTermiosPtr
}) })
return saveTermios, err return saveTermios, err
} }