69 lines
1.1 KiB
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)
|
||
|
}
|