kvmkey/main.go

100 lines
1.8 KiB
Go

package main
import (
"io"
"log"
"net/http"
"time"
evdev "github.com/gvalkov/golang-evdev"
)
const devname = "Drop The Key"
const (
B_1 uint16 = 59 + iota
B_2
B_3
B_4
B_5
)
var keyUrl = map[uint16]string{
B_1: "http://atreides:5051/fromcur",
B_2: "http://atreides:5051/fromcurto/hoke",
B_3: "http://atreides:5051/fromcurto/rake",
B_4: "http://atreides:5051/to/hoke",
B_5: "http://atreides:5051/to/rake",
}
var showGrabFailMsg = true
func getAndGrab() (keydev *evdev.InputDevice) {
devices, _ := evdev.ListInputDevices("/dev/input/event*")
for _, dev := range devices {
if dev.Name == devname {
keydev = dev
}
}
if keydev == nil {
return
}
err := keydev.Grab()
if err != nil {
if showGrabFailMsg {
log.Print("found the device but failed to grab it")
showGrabFailMsg = false
}
return nil
}
log.Println("grabbed the device")
showGrabFailMsg = true
return
}
func handle_event(ev *evdev.InputEvent) {
if ev.Type != evdev.EV_KEY || ev.Value != 0 {
return
}
if ev.Code < B_1 || ev.Code > B_5 {
log.Print("ignoring unknown key", ev.Code)
return
}
log.Printf("received code %d, hitting %s", ev.Code, keyUrl[ev.Code])
resp, err := http.Get(keyUrl[ev.Code])
if err != nil {
log.Printf("error processing key %d (url %s): %s", ev.Code, keyUrl[ev.Code], err)
return
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
log.Print("error reading response:", err)
return
}
log.Print("output:\n", string(body))
}
func monitorForever(dev *evdev.InputDevice) {
for {
events, err := dev.Read()
if err != nil {
return
}
for i := range events {
go handle_event(&events[i])
}
}
}
func main() {
for {
keydev := getAndGrab()
if keydev == nil {
time.Sleep(5 * time.Second)
} else {
monitorForever(keydev)
log.Println("lost the device")
}
}
}