commit 309b3d3984a06635d0b990dab7e678ea8d01fa56 Author: Anna Rose Wiggins Date: Fri Jun 27 12:18:21 2025 -0400 Initial commit. diff --git a/cmd/joyful/main.go b/cmd/joyful/main.go new file mode 100644 index 0000000..49cb922 --- /dev/null +++ b/cmd/joyful/main.go @@ -0,0 +1,75 @@ +package main + +import ( + "fmt" + "syscall" + "time" + + "github.com/holoplot/go-evdev" +) + +func main() { + // Define virtual device + vDevice, err := evdev.CreateDevice( + "joyful-joystick", + evdev.InputID{ + BusType: 0x03, + Vendor: 0x4711, + Product: 0x0816, + Version: 1, + }, + map[evdev.EvType][]evdev.EvCode{ + evdev.EV_KEY: jsButtons(), + evdev.EV_ABS: { + evdev.ABS_X, + evdev.ABS_Y, + evdev.ABS_Z, + evdev.ABS_RX, + evdev.ABS_RY, + evdev.ABS_RZ, + evdev.ABS_THROTTLE, + evdev.ABS_WHEEL, + }, + }, + ) + if err != nil { + fmt.Printf("Failed to create vDevice: %s", err.Error()) + } + + var value int32 = 1 + for { + eventTime := syscall.NsecToTimeval(int64(time.Now().Nanosecond())) + + vDevice.WriteOne(&evdev.InputEvent{ + Time: eventTime, + Type: evdev.EV_KEY, + Code: evdev.BTN_TRIGGER, + Value: value, + }) + + if value == 0 { + value = 1 + } else { + value = 0 + } + + time.Sleep(1000) + } +} + +func jsButtons() []evdev.EvCode { + buttons := make([]evdev.EvCode, 80) + i := 0 + + for code := 0x120; code <= 0x12f; code++ { + buttons[i] = evdev.EvCode(code) + i++ + } + + for code := 0x2c0; code <= 0x2ff; code++ { + buttons[i] = evdev.EvCode(code) + i++ + } + + return buttons +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..6582f6b --- /dev/null +++ b/go.mod @@ -0,0 +1,5 @@ +module git.annabunches.net/annabunches/joyful + +go 1.24.4 + +require github.com/holoplot/go-evdev v0.0.0-20240306072622-217e18f17db1 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..33d2d90 --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +github.com/holoplot/go-evdev v0.0.0-20240306072622-217e18f17db1 h1:92OsBIf5KB1Tatx+uUGOhah73jyNUrt7DmfDRXXJ5Xo= +github.com/holoplot/go-evdev v0.0.0-20240306072622-217e18f17db1/go.mod h1:iHAf8OIncO2gcQ8XOjS7CMJ2aPbX2Bs0wl5pZyanEqk=