lightshowpi/light/rpi/basic_light.go

69 lines
1.1 KiB
Go

package rpi
import (
"fmt"
"sync"
"github.com/warthog618/gpiod"
)
// BasicLight is a BasicLight implementation for the Raspberry Pi
type BasicLight struct {
pin int
line *gpiod.Line
manager *Manager
isOn bool
isOnLock sync.Mutex
}
// On turns on the light
func (bl *BasicLight) On() error {
bl.isOnLock.Lock()
defer bl.isOnLock.Unlock()
if bl.isOn {
return nil
}
err := bl.line.SetValue(0)
if err != nil {
return fmt.Errorf("failed to set pin %d to low (on): %w", bl.pin, err)
}
bl.isOn = true
return nil
}
// Off turns off the light
func (bl *BasicLight) Off() error {
bl.isOnLock.Lock()
defer bl.isOnLock.Unlock()
if !bl.isOn {
return nil
}
err := bl.line.SetValue(1)
if err != nil {
return fmt.Errorf("failed to set pin %d to high (on): %w", bl.pin, err)
}
bl.isOn = false
return nil
}
// State of whether the light is on or off
func (bl *BasicLight) State() (isOn bool, err error) {
bl.isOnLock.Lock()
defer bl.isOnLock.Unlock()
return bl.isOn, nil
}
// Close underlying open connection
func (bl *BasicLight) Close() error {
return bl.manager.closeLine(bl.pin)
}