mirror of
https://github.com/kidoman/embd
synced 2024-12-22 12:50:19 +01:00
led: support led functionality on the bbb
This commit is contained in:
parent
f7b316332e
commit
bf8a4be4d9
10
bbb.go
10
bbb.go
@ -16,6 +16,9 @@ func init() {
|
|||||||
return newGPIODriver(bbbPins, newDigitalPin, newBBBAnalogPin)
|
return newGPIODriver(bbbPins, newDigitalPin, newBBBAnalogPin)
|
||||||
},
|
},
|
||||||
I2C: newI2CDriver,
|
I2C: newI2CDriver,
|
||||||
|
LEDDriver: func() LEDDriver {
|
||||||
|
return newLEDDriver(bbbLEDMap)
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -88,6 +91,13 @@ var bbbPins = PinMap{
|
|||||||
&PinDesc{ID: "P9_40", Aliases: []string{"1", "AIN1"}, Caps: CapAnalog, AnalogLogical: 1},
|
&PinDesc{ID: "P9_40", Aliases: []string{"1", "AIN1"}, Caps: CapAnalog, AnalogLogical: 1},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var bbbLEDMap = LEDMap{
|
||||||
|
"beaglebone:green:usr0": []string{"0", "USR0", "usr0"},
|
||||||
|
"beaglebone:green:usr1": []string{"1", "USR1", "usr1"},
|
||||||
|
"beaglebone:green:usr2": []string{"2", "USR2", "usr2"},
|
||||||
|
"beaglebone:green:usr3": []string{"3", "USR3", "usr3"},
|
||||||
|
}
|
||||||
|
|
||||||
type bbbAnalogPin struct {
|
type bbbAnalogPin struct {
|
||||||
n int
|
n int
|
||||||
|
|
||||||
|
@ -1,10 +1,14 @@
|
|||||||
package embd
|
package embd
|
||||||
|
|
||||||
import "fmt"
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
type Descriptor struct {
|
type Descriptor struct {
|
||||||
GPIO func() GPIO
|
GPIO func() GPIO
|
||||||
I2C func() I2C
|
I2C func() I2C
|
||||||
|
LEDDriver func() LEDDriver
|
||||||
}
|
}
|
||||||
|
|
||||||
type Describer func(rev int) *Descriptor
|
type Describer func(rev int) *Descriptor
|
||||||
@ -24,3 +28,5 @@ func DescribeHost() (*Descriptor, error) {
|
|||||||
|
|
||||||
return describer(rev), nil
|
return describer(rev), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var ErrFeatureNotSupport = errors.New("embd: feature is not supported")
|
||||||
|
4
gpio.go
4
gpio.go
@ -51,6 +51,10 @@ func InitGPIO() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if desc.GPIO == nil {
|
||||||
|
return ErrFeatureNotSupport
|
||||||
|
}
|
||||||
|
|
||||||
gpioInstance = desc.GPIO()
|
gpioInstance = desc.GPIO()
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
4
i2c.go
4
i2c.go
@ -37,6 +37,10 @@ func InitI2C() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if desc.I2C == nil {
|
||||||
|
return ErrFeatureNotSupport
|
||||||
|
}
|
||||||
|
|
||||||
i2cInstance = desc.I2C()
|
i2cInstance = desc.I2C()
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
59
led.go
Normal file
59
led.go
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
package embd
|
||||||
|
|
||||||
|
type LED interface {
|
||||||
|
On() error
|
||||||
|
Off() error
|
||||||
|
|
||||||
|
Toggle() error
|
||||||
|
|
||||||
|
Close() error
|
||||||
|
}
|
||||||
|
|
||||||
|
type LEDDriver interface {
|
||||||
|
LED(key interface{}) (LED, error)
|
||||||
|
|
||||||
|
Close() error
|
||||||
|
}
|
||||||
|
|
||||||
|
var ledDriverInstance LEDDriver
|
||||||
|
|
||||||
|
func InitLED() error {
|
||||||
|
desc, err := DescribeHost()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if desc.LEDDriver == nil {
|
||||||
|
return ErrFeatureNotSupport
|
||||||
|
}
|
||||||
|
|
||||||
|
ledDriverInstance = desc.LEDDriver()
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func CloseLED() error {
|
||||||
|
return ledDriverInstance.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewLED(key interface{}) (LED, error) {
|
||||||
|
return ledDriverInstance.LED(key)
|
||||||
|
}
|
||||||
|
|
||||||
|
func LEDOn(key interface{}) error {
|
||||||
|
led, err := NewLED(key)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return led.On()
|
||||||
|
}
|
||||||
|
|
||||||
|
func LEDOff(key interface{}) error {
|
||||||
|
led, err := NewLED(key)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return led.Off()
|
||||||
|
}
|
172
leddriver.go
Normal file
172
leddriver.go
Normal file
@ -0,0 +1,172 @@
|
|||||||
|
package embd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type LEDMap map[string][]string
|
||||||
|
|
||||||
|
type ledDriver struct {
|
||||||
|
ledMap LEDMap
|
||||||
|
|
||||||
|
initializedLEDs map[string]LED
|
||||||
|
}
|
||||||
|
|
||||||
|
func newLEDDriver(ledMap LEDMap) LEDDriver {
|
||||||
|
return &ledDriver{
|
||||||
|
ledMap: ledMap,
|
||||||
|
initializedLEDs: map[string]LED{},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *ledDriver) lookup(k interface{}) (string, error) {
|
||||||
|
var ks string
|
||||||
|
switch key := k.(type) {
|
||||||
|
case int:
|
||||||
|
ks = strconv.Itoa(key)
|
||||||
|
case string:
|
||||||
|
ks = key
|
||||||
|
case fmt.Stringer:
|
||||||
|
ks = key.String()
|
||||||
|
default:
|
||||||
|
return "", errors.New("led: invalid key type")
|
||||||
|
}
|
||||||
|
|
||||||
|
for id := range d.ledMap {
|
||||||
|
for _, alias := range d.ledMap[id] {
|
||||||
|
if alias == ks {
|
||||||
|
return id, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "", fmt.Errorf("led: no match found for %q", k)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *ledDriver) LED(k interface{}) (LED, error) {
|
||||||
|
id, err := d.lookup(k)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
led := newLED(id)
|
||||||
|
d.initializedLEDs[id] = led
|
||||||
|
|
||||||
|
return led, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *ledDriver) Close() error {
|
||||||
|
for _, led := range d.initializedLEDs {
|
||||||
|
if err := led.Close(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type led struct {
|
||||||
|
id string
|
||||||
|
|
||||||
|
brightness *os.File
|
||||||
|
|
||||||
|
initialized bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func newLED(id string) LED {
|
||||||
|
return &led{id: id}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *led) init() error {
|
||||||
|
if l.initialized {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var err error
|
||||||
|
if l.brightness, err = l.brightnessFile(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
l.initialized = true
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *led) brightnessFilePath() string {
|
||||||
|
return fmt.Sprintf("/sys/class/leds/%v/brightness", l.id)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *led) openFile(path string) (*os.File, error) {
|
||||||
|
return os.OpenFile(path, os.O_RDWR, os.ModeExclusive)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *led) brightnessFile() (*os.File, error) {
|
||||||
|
return l.openFile(l.brightnessFilePath())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *led) On() error {
|
||||||
|
if err := l.init(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := l.brightness.WriteString("1")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *led) Off() error {
|
||||||
|
if err := l.init(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := l.brightness.WriteString("0")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *led) isOn() (bool, error) {
|
||||||
|
l.brightness.Seek(0, 0)
|
||||||
|
bytes, err := ioutil.ReadAll(l.brightness)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
str := string(bytes)
|
||||||
|
str = strings.TrimSpace(str)
|
||||||
|
if str == "1" {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *led) Toggle() error {
|
||||||
|
if err := l.init(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
state, err := l.isOn()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if state {
|
||||||
|
return l.Off()
|
||||||
|
}
|
||||||
|
return l.On()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *led) Close() error {
|
||||||
|
if !l.initialized {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := l.brightness.Close(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
l.initialized = false
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
2
samples/.gitignore
vendored
2
samples/.gitignore
vendored
@ -8,6 +8,8 @@ gpiodetect
|
|||||||
gpiodirect
|
gpiodirect
|
||||||
gpioshort
|
gpioshort
|
||||||
l3gd20
|
l3gd20
|
||||||
|
led
|
||||||
|
ledshort
|
||||||
lsm303
|
lsm303
|
||||||
mcp4725
|
mcp4725
|
||||||
pca9685
|
pca9685
|
||||||
|
44
samples/led.go
Normal file
44
samples/led.go
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
// +build ignore
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"os/signal"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/kidoman/embd"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
if err := embd.InitLED(); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
defer embd.CloseLED()
|
||||||
|
|
||||||
|
led, err := embd.NewLED(3)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
led.Off()
|
||||||
|
led.Close()
|
||||||
|
}()
|
||||||
|
|
||||||
|
quit := make(chan os.Signal, 1)
|
||||||
|
signal.Notify(quit, os.Interrupt, os.Kill)
|
||||||
|
defer signal.Stop(quit)
|
||||||
|
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-time.After(500 * time.Millisecond):
|
||||||
|
if err := led.Toggle(); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
fmt.Printf("Toggled\n")
|
||||||
|
case <-quit:
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
18
samples/ledshort.go
Normal file
18
samples/ledshort.go
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
// +build ignore
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/kidoman/embd"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
embd.InitLED()
|
||||||
|
defer embd.CloseLED()
|
||||||
|
|
||||||
|
embd.LEDOn(3)
|
||||||
|
time.Sleep(1 * time.Second)
|
||||||
|
embd.LEDOff(3)
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user