From 4c76ad4f4924b08c58d49d187fa0fd60d17535f8 Mon Sep 17 00:00:00 2001 From: Anna Rose Wiggins Date: Fri, 4 Jul 2025 00:30:05 -0400 Subject: [PATCH] Start implementing timer logic for proportional axis checking. --- cmd/joyful/main.go | 22 ++++++++++++++++++++++ internal/mappingrules/matching.go | 12 ++++++++++++ 2 files changed, 34 insertions(+) diff --git a/cmd/joyful/main.go b/cmd/joyful/main.go index 612b8e6..e6616b5 100644 --- a/cmd/joyful/main.go +++ b/cmd/joyful/main.go @@ -4,6 +4,7 @@ import ( "fmt" "os" "path/filepath" + "time" "git.annabunches.net/annabunches/joyful/internal/config" "git.annabunches.net/annabunches/joyful/internal/logger" @@ -12,6 +13,10 @@ import ( "github.com/holoplot/go-evdev" ) +const ( + TimerCheckIntervalMs = 250 +) + func readConfig() *config.ConfigParser { parser := &config.ConfigParser{} homeDir, err := os.UserHomeDir() @@ -89,6 +94,12 @@ func mapEvents(vBuffers map[string]*virtualdevice.EventBuffer, pDevices map[stri go eventWatcher(device, eventChannel) } + for _, rule := range rules { + if timedRule, ok := rule.(*mappingrules.ProportionalAxisMappingRule); ok { + go timerWatcher(timedRule, eventChannel) + } + } + // initialize the mode variable mode := "main" @@ -141,5 +152,16 @@ func eventWatcher(device *evdev.InputDevice, channel chan<- ChannelEvent) { continue } channel <- ChannelEvent{Device: device, Event: event} + // TODO: should we sleep at all here? + } +} + +func timerWatcher(rule *mappingrules.ProportionalAxisMappingRule, channel chan<- ChannelEvent) { + for { + event := rule.TimerEvent() + if event != nil { + channel <- ChannelEvent{Device: rule.Output.Device, Event: event} + } + time.Sleep(TimerCheckIntervalMs * time.Millisecond) } } diff --git a/internal/mappingrules/matching.go b/internal/mappingrules/matching.go index 8c20dee..afd783b 100644 --- a/internal/mappingrules/matching.go +++ b/internal/mappingrules/matching.go @@ -136,3 +136,15 @@ func (rule *LatchedMappingRule) MatchEvent(device *evdev.InputDevice, event *evd return eventFromTarget(rule.Output, value, mode) } + +func (rule *ProportionalAxisMappingRule) MatchEvent(device *evdev.InputDevice, event *evdev.InputEvent, mode *string) *evdev.InputEvent { + // STUB + return nil +} + +// TimerEvent returns an event when enough time has passed (compared to the last recorded axis value) +// to emit an event. +func (rule *ProportionalAxisMappingRule) TimerEvent() *evdev.InputEvent { + // STUB + return nil +}