2018-05-04 12:18:31 +00:00
|
|
|
package service
|
|
|
|
|
|
|
|
import(
|
|
|
|
"os"
|
|
|
|
"log"
|
|
|
|
"io/ioutil"
|
|
|
|
"time"
|
|
|
|
"sync/atomic"
|
|
|
|
|
2018-12-07 00:59:54 +01:00
|
|
|
pb "github.com/mame82/P4wnP1_aloa/proto"
|
2018-05-04 12:18:31 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
LED_TRIGGER_PATH = "/sys/class/leds/led0/trigger"
|
|
|
|
LED_BRIGHTNESS_PATH = "/sys/class/leds/led0/brightness"
|
|
|
|
LED_TRIGGER_MANUAL = "none"
|
|
|
|
LED_ON = "0"
|
|
|
|
LED_OFF = "1"
|
|
|
|
LED_DELAY_ON = 200 * time.Millisecond
|
|
|
|
LED_DELAY_OFF = 200 * time.Millisecond
|
|
|
|
LED_DELAY_PAUSE = 500 * time.Millisecond
|
|
|
|
)
|
|
|
|
|
2018-07-28 04:49:25 +02:00
|
|
|
|
|
|
|
type LedState struct {
|
|
|
|
blink_count *uint32
|
|
|
|
}
|
|
|
|
/*
|
2018-05-04 12:18:31 +00:00
|
|
|
var (
|
|
|
|
blink_count uint32 = 0
|
|
|
|
)
|
2018-07-28 04:49:25 +02:00
|
|
|
*/
|
|
|
|
func NewLed(led_on bool) (ledState *LedState, err error) {
|
|
|
|
blinkCount := uint32(0)
|
|
|
|
ledState = &LedState{ &blinkCount }
|
2018-05-04 12:18:31 +00:00
|
|
|
|
|
|
|
//set trigger of LED to manual
|
|
|
|
log.Println("Setting LED to manual trigger ...")
|
|
|
|
ioutil.WriteFile(LED_TRIGGER_PATH, []byte(LED_TRIGGER_MANUAL), os.ModePerm)
|
|
|
|
if led_on {
|
|
|
|
log.Println("Setting LED to ON ...")
|
|
|
|
ioutil.WriteFile(LED_BRIGHTNESS_PATH, []byte(LED_ON), os.ModePerm)
|
|
|
|
} else {
|
|
|
|
log.Println("Setting LED to OFF ...")
|
|
|
|
ioutil.WriteFile(LED_BRIGHTNESS_PATH, []byte(LED_OFF), os.ModePerm)
|
|
|
|
}
|
2018-07-28 04:49:25 +02:00
|
|
|
|
|
|
|
go ledState.led_loop() // watcher loop
|
|
|
|
|
|
|
|
ledState.SetLed(GetDefaultLEDSettings()) //set default setting
|
|
|
|
return ledState,nil
|
2018-05-04 12:18:31 +00:00
|
|
|
}
|
|
|
|
|
2018-07-28 04:49:25 +02:00
|
|
|
func (leds *LedState) led_loop() {
|
2018-05-04 12:18:31 +00:00
|
|
|
|
|
|
|
for {
|
2018-07-28 04:49:25 +02:00
|
|
|
for i := uint32(0); i < atomic.LoadUint32(leds.blink_count); i++ {
|
2018-05-04 12:18:31 +00:00
|
|
|
ioutil.WriteFile(LED_BRIGHTNESS_PATH, []byte(LED_ON), os.ModePerm)
|
|
|
|
time.Sleep(LED_DELAY_ON)
|
|
|
|
|
|
|
|
//Don't turn off led if blink_count >= 255 (solid)
|
2018-07-28 04:49:25 +02:00
|
|
|
if 255 > atomic.LoadUint32(leds.blink_count) {
|
2018-05-04 12:18:31 +00:00
|
|
|
ioutil.WriteFile(LED_BRIGHTNESS_PATH, []byte(LED_OFF), os.ModePerm)
|
|
|
|
time.Sleep(LED_DELAY_OFF)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
time.Sleep(LED_DELAY_PAUSE)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-07-28 04:49:25 +02:00
|
|
|
func (leds *LedState) SetLed(s *pb.LEDSettings) (error) {
|
2018-05-04 12:18:31 +00:00
|
|
|
//log.Printf("setLED called with %+v", s)
|
|
|
|
|
2018-07-28 04:49:25 +02:00
|
|
|
atomic.StoreUint32(leds.blink_count, s.BlinkCount)
|
2018-05-04 12:18:31 +00:00
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2018-07-28 04:49:25 +02:00
|
|
|
func (leds *LedState) GetLed() (res *pb.LEDSettings, err error) {
|
|
|
|
return &pb.LEDSettings{BlinkCount: atomic.LoadUint32(leds.blink_count)}, nil
|
2018-05-04 12:18:31 +00:00
|
|
|
}
|
2018-05-09 20:49:42 +00:00
|
|
|
|