P4wnP1_aloa/service/SubSysLED.go

92 lines
1.9 KiB
Go

package service
import (
pb "github.com/mame82/P4wnP1_go/proto"
"io/ioutil"
"log"
"os"
"sync/atomic"
"time"
)
const (
pLED_TRIGGER_PATH = "/sys/class/leds/led0/trigger"
pLED_BRIGHTNESS_PATH = "/sys/class/leds/led0/brightness"
pLED_TRIGGER_MANUAL = "none"
pLED_ON = "0"
pLED_OFF = "1"
pLED_DELAY_ON = 200 * time.Millisecond
pLED_DELAY_OFF = 200 * time.Millisecond
pLED_DELAY_PAUSE = 500 * time.Millisecond
)
type LedState1 struct {
Available bool
IsRunning bool
BlinkCount *uint32
}
type LedService struct {
state *LedState1
}
func NewLedService() (res *LedService) {
res = &LedService{
state: &LedState1{},
}
bc := uint32(0)
res.state.BlinkCount = &bc
return res
}
func (l *LedService) led_loop() {
ioutil.WriteFile(pLED_BRIGHTNESS_PATH, []byte(pLED_ON), os.ModePerm)
for l.state.IsRunning{
for i := uint32(0); i < atomic.LoadUint32(l.state.BlinkCount) && l.state.IsRunning; i++ {
ioutil.WriteFile(pLED_BRIGHTNESS_PATH, []byte(pLED_ON), os.ModePerm)
time.Sleep(pLED_DELAY_ON)
//Don't turn off led if blink_count >= 255 (solid)
if 255 > atomic.LoadUint32(l.state.BlinkCount) {
ioutil.WriteFile(pLED_BRIGHTNESS_PATH, []byte(pLED_OFF), os.ModePerm)
time.Sleep(pLED_DELAY_OFF)
}
}
time.Sleep(pLED_DELAY_PAUSE)
}
ioutil.WriteFile(pLED_BRIGHTNESS_PATH, []byte(pLED_ON), os.ModePerm)
}
func (l *LedService) Start() error {
//set trigger of LED to manual
log.Println("Setting LED to manual trigger ...")
ioutil.WriteFile(pLED_TRIGGER_PATH, []byte(pLED_TRIGGER_MANUAL), os.ModePerm)
l.state.IsRunning = true
go l.led_loop()
return nil
}
func (l *LedService) Stop() {
l.state.IsRunning = false
}
func (l *LedService) GetState() *LedState1 {
return l.state
}
func (l *LedService) DeploySettings(sets *pb.LEDSettings) {
atomic.StoreUint32(l.state.BlinkCount, sets.BlinkCount)
}
func (LedService) LoadSettings() {
panic("implement me")
}
func (LedService) StoreSettings() {
panic("implement me")
}