Refactoring.

This commit is contained in:
Anna Rose Wiggins 2025-07-04 09:40:35 -04:00
parent f773897509
commit f6162d0f7b
3 changed files with 56 additions and 50 deletions

View file

@ -4,7 +4,6 @@ import (
"fmt" "fmt"
"os" "os"
"path/filepath" "path/filepath"
"time"
"git.annabunches.net/annabunches/joyful/internal/config" "git.annabunches.net/annabunches/joyful/internal/config"
"git.annabunches.net/annabunches/joyful/internal/logger" "git.annabunches.net/annabunches/joyful/internal/logger"
@ -13,11 +12,6 @@ import (
"github.com/holoplot/go-evdev" "github.com/holoplot/go-evdev"
) )
const (
TimerCheckIntervalMs = 250
DeviceCheckIntervalMs = 1
)
func readConfig() *config.ConfigParser { func readConfig() *config.ConfigParser {
parser := &config.ConfigParser{} parser := &config.ConfigParser{}
homeDir, err := os.UserHomeDir() homeDir, err := os.UserHomeDir()
@ -71,25 +65,7 @@ func main() {
rules := config.BuildRules(pDevices, getVirtualDevices(vBuffers)) rules := config.BuildRules(pDevices, getVirtualDevices(vBuffers))
logger.Logf("Created %d mapping rules.", len(rules)) logger.Logf("Created %d mapping rules.", len(rules))
// Listen for events and map them forever // start listening for events on devices and timers
mapEvents(vBuffers, pDevices, rules)
}
type ChannelEventType int
const (
ChannelEventInput ChannelEventType = iota
ChannelEventTimer
)
type ChannelEvent struct {
Type ChannelEventType
Device *evdev.InputDevice
Event *evdev.InputEvent
}
func mapEvents(vBuffers map[string]*virtualdevice.EventBuffer, pDevices map[string]*evdev.InputDevice, rules []mappingrules.MappingRule) {
// start listening for events on all devices
eventChannel := make(chan ChannelEvent, 1000) eventChannel := make(chan ChannelEvent, 1000)
for _, device := range pDevices { for _, device := range pDevices {
go eventWatcher(device, eventChannel) go eventWatcher(device, eventChannel)
@ -139,28 +115,3 @@ func mapEvents(vBuffers map[string]*virtualdevice.EventBuffer, pDevices map[stri
} }
} }
} }
func eventWatcher(device *evdev.InputDevice, channel chan<- ChannelEvent) {
for {
event, err := device.ReadOne()
if err != nil {
logger.LogError(err, "Error while reading event. Disconnecting device.")
return
}
channel <- ChannelEvent{Device: device, Event: event, Type: ChannelEventInput}
if event.Type == evdev.EV_SYN {
time.Sleep(DeviceCheckIntervalMs * time.Millisecond)
}
}
}
func timerWatcher(rule *mappingrules.ProportionalAxisMappingRule, channel chan<- ChannelEvent) {
for {
event := rule.TimerEvent()
if event != nil {
channel <- ChannelEvent{Device: rule.Output.Device, Event: event, Type: ChannelEventTimer}
}
time.Sleep(TimerCheckIntervalMs * time.Millisecond)
}
}

39
cmd/joyful/threads.go Normal file
View file

@ -0,0 +1,39 @@
package main
import (
"time"
"git.annabunches.net/annabunches/joyful/internal/logger"
"git.annabunches.net/annabunches/joyful/internal/mappingrules"
"github.com/holoplot/go-evdev"
)
const (
TimerCheckIntervalMs = 250
DeviceCheckIntervalMs = 1
)
func eventWatcher(device *evdev.InputDevice, channel chan<- ChannelEvent) {
for {
event, err := device.ReadOne()
if err != nil {
logger.LogError(err, "Error while reading event. Disconnecting device.")
return
}
channel <- ChannelEvent{Device: device, Event: event, Type: ChannelEventInput}
if event.Type == evdev.EV_SYN {
time.Sleep(DeviceCheckIntervalMs * time.Millisecond)
}
}
}
func timerWatcher(rule *mappingrules.ProportionalAxisMappingRule, channel chan<- ChannelEvent) {
for {
event := rule.TimerEvent()
if event != nil {
channel <- ChannelEvent{Device: rule.Output.Device, Event: event, Type: ChannelEventTimer}
}
time.Sleep(TimerCheckIntervalMs * time.Millisecond)
}
}

16
cmd/joyful/types.go Normal file
View file

@ -0,0 +1,16 @@
package main
import "github.com/holoplot/go-evdev"
type ChannelEventType int
const (
ChannelEventInput ChannelEventType = iota
ChannelEventTimer
)
type ChannelEvent struct {
Type ChannelEventType
Device *evdev.InputDevice
Event *evdev.InputEvent
}