Files

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
}