From 0714fec38bbcd58e4e027fae1f0bd29f35150591 Mon Sep 17 00:00:00 2001 From: FIGBERT Date: Sat, 1 Jul 2023 21:44:28 +0300 Subject: [PATCH] Add LED controls in ui/beepberry subpackage --- go.mod | 2 + go.sum | 5 +++ ui/beepberry/led.go | 93 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 ui/beepberry/led.go diff --git a/go.mod b/go.mod index 9254172..089f9f4 100644 --- a/go.mod +++ b/go.mod @@ -27,6 +27,8 @@ require ( maunium.net/go/mauflag v1.0.0 maunium.net/go/mautrix v0.11.1 mvdan.cc/xurls/v2 v2.4.0 + periph.io/x/conn/v3 v3.7.0 + periph.io/x/host/v3 v3.8.2 ) require ( diff --git a/go.sum b/go.sum index bd684f4..d81741a 100644 --- a/go.sum +++ b/go.sum @@ -15,6 +15,7 @@ github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/jonboulle/clockwork v0.3.0 h1:9BSCMi8C+0qdApAp4auwX0RkLGUjs956h0EkuQymUhg= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -127,3 +128,7 @@ maunium.net/go/mautrix v0.11.1 h1:S5TZGY3M1/bJcd6Y5SUWsNvqQAgFjgFYk5ULm/NCkqk= maunium.net/go/mautrix v0.11.1/go.mod h1:K29EcHwsNg6r7fMfwvi0GHQ9o5wSjqB9+Q8RjCIQEjA= mvdan.cc/xurls/v2 v2.4.0 h1:tzxjVAj+wSBmDcF6zBB7/myTy3gX9xvi8Tyr28AuQgc= mvdan.cc/xurls/v2 v2.4.0/go.mod h1:+GEjq9uNjqs8LQfM9nVnM8rff0OQ5Iash5rzX+N1CSg= +periph.io/x/conn/v3 v3.7.0 h1:f1EXLn4pkf7AEWwkol2gilCNZ0ElY+bxS4WE2PQXfrA= +periph.io/x/conn/v3 v3.7.0/go.mod h1:ypY7UVxgDbP9PJGwFSVelRRagxyXYfttVh7hJZUHEhg= +periph.io/x/host/v3 v3.8.2 h1:ayKUDzgUCN0g8+/xM9GTkWaOBhSLVcVHGTfjAOi8OsQ= +periph.io/x/host/v3 v3.8.2/go.mod h1:yFL76AesNHR68PboofSWYaQTKmvPXsQH2Apvp/ls/K4= diff --git a/ui/beepberry/led.go b/ui/beepberry/led.go new file mode 100644 index 0000000..955911d --- /dev/null +++ b/ui/beepberry/led.go @@ -0,0 +1,93 @@ +package beepberry + +import ( + "periph.io/x/conn/v3/i2c" + "periph.io/x/conn/v3/i2c/i2creg" + "periph.io/x/host/v3" +) + +const ( + write = 0x80 + + power = 0x20 + red = 0x21 + green = 0x22 + blue = 0x23 +) + +type LED struct { + bus i2c.BusCloser + chip *i2c.Dev +} + +func NewLED() (*LED, error) { + if _, err := host.Init(); err != nil { + return nil, err + } + + i, err := i2creg.Open("1") + if err != nil { + return nil, err + } + + return &LED{ + bus: i, + chip: &i2c.Dev{Addr: 0x1F, Bus: i}, + }, nil +} + +func (l *LED) Close() error { + return l.bus.Close() +} + +func (l *LED) On() error { + _, err := l.chip.Write([]byte{power + write, 0x01}) + return err +} + +func (l *LED) Off() error { + _, err := l.chip.Write([]byte{power + write, 0x00}) + return err +} + +func (l *LED) SetColor(r, g, b uint16) error { + if _, err := l.chip.Write([]byte{red + write, byte(r)}); err != nil { + return err + } + + if _, err := l.chip.Write([]byte{green + write, byte(g)}); err != nil { + return err + } + + if _, err := l.chip.Write([]byte{blue + write, byte(b)}); err != nil { + return err + } + + return nil +} + +func (l *LED) IsOn() (bool, error) { + p := make([]byte, 1) + if err := l.chip.Tx([]byte{power}, p); err != nil { + return false, err + } + + return p[0] > 0, nil +} + +func (l *LED) Color() ([]byte, error) { + r := make([]byte, 1) + if err := l.chip.Tx([]byte{red}, r); err != nil { + return nil, err + } + g := make([]byte, 1) + if err := l.chip.Tx([]byte{green}, g); err != nil { + return nil, err + } + b := make([]byte, 1) + if err := l.chip.Tx([]byte{blue}, b); err != nil { + return nil, err + } + + return []byte{r[0], g[0], b[0]}, nil +}