72 lines
1.7 KiB
Go
72 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"os"
|
|
"path/filepath"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
type ledStep struct {
|
|
frame [6][3]int
|
|
duration time.Duration
|
|
}
|
|
|
|
func loadLedPattern(state string) []ledStep {
|
|
names := map[string]string{"listening": "alice_listening", "processing": "alice_thinking", "speaking": "alice_speaking", "error": "error", "pause": "player_pause", "resume": "player_continue", "next": "player_next_track", "previous": "player_previous_track"}
|
|
name := names[state]
|
|
if name == "" {
|
|
return nil
|
|
}
|
|
file, err := os.Open(filepath.Join("/system/vendor/quasar/ledpatterns/oknix", name+".led"))
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
defer file.Close()
|
|
var steps []ledStep
|
|
scanner := bufio.NewScanner(file)
|
|
for scanner.Scan() {
|
|
fields := strings.Fields(scanner.Text())
|
|
if len(fields) != 7 {
|
|
continue
|
|
}
|
|
ms, err := strconv.Atoi(fields[6])
|
|
if err != nil || ms <= 0 || ms > 10000 {
|
|
return nil
|
|
}
|
|
step := ledStep{duration: time.Duration(ms) * time.Millisecond}
|
|
for i := range step.frame {
|
|
value, err := strconv.ParseUint(fields[i], 16, 24)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
step.frame[i] = [3]int{int(value >> 16), int(value>>8) & 255, int(value) & 255}
|
|
if state == "listening" {
|
|
step.frame[i][0] = min(255, step.frame[i][0]*3/2)
|
|
}
|
|
}
|
|
steps = append(steps, step)
|
|
}
|
|
return steps
|
|
}
|
|
|
|
func patternFrame(steps []ledStep, elapsed time.Duration) [6][3]int {
|
|
var total time.Duration
|
|
for _, step := range steps {
|
|
total += step.duration
|
|
}
|
|
if total == 0 {
|
|
return [6][3]int{}
|
|
}
|
|
elapsed %= total
|
|
for _, step := range steps {
|
|
if elapsed < step.duration {
|
|
return step.frame
|
|
}
|
|
elapsed -= step.duration
|
|
}
|
|
return steps[len(steps)-1].frame
|
|
}
|