Add LED controls in ui/beepberry subpackage

This commit is contained in:
FIGBERT 2023-07-01 21:44:28 +03:00
parent 68cfe2be80
commit 0714fec38b
No known key found for this signature in database
GPG key ID: 67F1598D607A844B
3 changed files with 100 additions and 0 deletions

2
go.mod
View file

@ -27,6 +27,8 @@ require (
maunium.net/go/mauflag v1.0.0 maunium.net/go/mauflag v1.0.0
maunium.net/go/mautrix v0.11.1 maunium.net/go/mautrix v0.11.1
mvdan.cc/xurls/v2 v2.4.0 mvdan.cc/xurls/v2 v2.4.0
periph.io/x/conn/v3 v3.7.0
periph.io/x/host/v3 v3.8.2
) )
require ( require (

5
go.sum
View file

@ -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/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 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= 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 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 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= 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 h1:tzxjVAj+wSBmDcF6zBB7/myTy3gX9xvi8Tyr28AuQgc=
mvdan.cc/xurls/v2 v2.4.0/go.mod h1:+GEjq9uNjqs8LQfM9nVnM8rff0OQ5Iash5rzX+N1CSg= 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=

93
ui/beepberry/led.go Normal file
View file

@ -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
}