diff --git a/backend/keypad/keypad_common.go b/backend/keypad/keypad_common.go new file mode 100644 index 0000000..61535ef --- /dev/null +++ b/backend/keypad/keypad_common.go @@ -0,0 +1,42 @@ +package keypad + +import ( + "fmt" + "path/filepath" + + "github.com/OrbTools/OrbCommon/devices" + "github.com/OrbTools/OrbMap/registry" +) + +type Keypad struct { + eventcodes []byte + ecm map[uint16]int + keymaps *devices.KeyMaps + definition *devices.DeviceDef +} + +//ProbcOrbFiles processes orbs +func (p *Keypad) ProcOrbs(dev *devices.DeviceDef, orbs []string) { + p.definition = dev + p.keymaps = &devices.KeyMaps{Currentmap: 0} + if len(orbs) > 0 { + for _, orb := range orbs { + abs, _ := filepath.Abs(orb) + fmt.Println("Loading Orb " + abs) + KMap := devices.LoadKeymap(abs, dev) + p.keymaps.Maps = append(p.keymaps.Maps, KMap) + } + p.keymaps.MCount = len(orbs) + } else { + panic("No orbs") + } + p.ecm = make(map[uint16]int) + p.eventcodes = p.definition.Binding + for i := 0; i < len(p.eventcodes); i++ { + p.ecm[uint16(p.eventcodes[i])] = i + } +} + +func init() { + registry.Systems["keypad"] = registry.Device(&Keypad{}) +} diff --git a/devices/orbweaver/orbweaver_linux.go b/backend/keypad/keypad_linux.go similarity index 50% rename from devices/orbweaver/orbweaver_linux.go rename to backend/keypad/keypad_linux.go index 397a7f9..cee32c7 100644 --- a/devices/orbweaver/orbweaver_linux.go +++ b/backend/keypad/keypad_linux.go @@ -1,36 +1,27 @@ // +build linux !windows - -package orbweaver +package keypad import ( "bytes" "encoding/binary" "unsafe" - morb "github.com/OrbTools/OrbCommon/devices/orbweaver" "github.com/OrbTools/OrbMap/keyevents" evdev "github.com/gvalkov/golang-evdev" ) //OrbLoop Main loop for this device -func OrbLoop(km *morb.KeyMaps, KeyBus chan *keyevents.KeyEvent) { - eventcodes = morb.BINDING[:] - for i := 0; i < len(eventcodes); i++ { - ecm[uint16(eventcodes[i])] = i - } +func (p *Keypad) OrbLoop(KeyBus chan *keyevents.KeyEvent) { println("UnixLoop starting") - f, err := evdev.Open("/dev/input/by-id/usb-Razer_Razer_Orbweaver_Chroma-event-kbd") - if err != nil { - panic(err) - } + f, _ := evdev.Open(p.definition.Device.SystemFile) f.Grab() var evsize = int(unsafe.Sizeof(keyevents.KeyEvent{})) b := make([]byte, evsize) for { f.File.Read(b) - KeyEv := &keyevents.KeyEvent{} + KeyEv := new(keyevents.KeyEvent) binary.Read(bytes.NewBuffer(b), binary.LittleEndian, KeyEv) - KeyEv.Code = km.Maps[km.Currentmap].Keymap[ecm[KeyEv.Code]] + KeyEv.Code = p.keymaps.Maps[p.keymaps.Currentmap].Keymap[p.ecm[KeyEv.Code]] if KeyEv.Code != 0 && KeyEv.Type != 4 { KeyBus <- KeyEv } diff --git a/devices/orbweaver/orbweaver_windows.go b/backend/keypad/keypad_windows.go similarity index 83% rename from devices/orbweaver/orbweaver_windows.go rename to backend/keypad/keypad_windows.go index 9bbe558..1c193cc 100644 --- a/devices/orbweaver/orbweaver_windows.go +++ b/backend/keypad/keypad_windows.go @@ -1,21 +1,18 @@ // +build windows -package orbweaver +package keypad import ( "bytes" "encoding/binary" "fmt" - morb "github.com/OrbTools/OrbCommon/devices/orbweaver" "github.com/OrbTools/OrbCommon/hid" "github.com/OrbTools/OrbMap/keyevents" "github.com/google/gousb" ) const ( - vendor = gousb.ID(0x1532) - prod = gousb.ID(0x0207) leftControl byte = 0x1 leftShift byte = 0x2 leftAlt byte = 0x4 @@ -101,14 +98,10 @@ func (s *swapInt) Differ(s2 *swapInt) []byte { } //OrbLoop Main loop for this device -func OrbLoop(km *morb.KeyMaps, KeyBus chan *keyevents.KeyEvent) { - eventcodes = morb.BINDING[:] - for i := 0; i < len(eventcodes); i++ { - ecm[uint16(eventcodes[i])] = i - } +func (p *Keypad) OrbLoop(KeyBus chan *keyevents.KeyEvent) { fmt.Println("Windows Loop Init") ctx := gousb.NewContext() - dev, err := ctx.OpenDeviceWithVIDPID(vendor, prod) + dev, err := ctx.OpenDeviceWithVIDPID(gousb.ID(p.definition.Device.VendorID), gousb.ID(p.definition.Device.ProdID)) if err != nil { panic(err) } @@ -145,10 +138,9 @@ func OrbLoop(km *morb.KeyMaps, KeyBus chan *keyevents.KeyEvent) { dat := append(addin, tdat...) for i := 0; i < len(dat); i++ { if dat[i] != 0 { - dat[i] = byte(hid.GetLinuxFromHid(uint16(dat[i]))) - dat[i] = byte(km.Maps[km.Currentmap].Keymap[ecm[uint16(dat[i])]]) - dat[i] = byte(hid.GetHidFromLinux(uint16(dat[i]))) - dat[i] = byte(hid.GetWindowsFromHid(uint16(dat[i]))) + dat[i] = byte(hid.GetMappingFromHID(uint16(dat[i])).Evdev) + dat[i] = byte(p.keymaps.Maps[p.keymaps.Currentmap].Keymap[p.ecm[uint16(dat[i])]]) + dat[i] = byte(hid.GetMappingFromLinux(uint16(dat[i])).Win) } } err = binary.Read(bytes.NewReader(dat), binary.LittleEndian, swaper.S1) diff --git a/boot.go b/boot.go new file mode 100644 index 0000000..0f16404 --- /dev/null +++ b/boot.go @@ -0,0 +1,5 @@ +package main + +import ( + _ "github.com/OrbTools/OrbMap/backend/keypad" +) \ No newline at end of file diff --git a/devices/orbweaver/orbweaver_common.go b/devices/orbweaver/orbweaver_common.go deleted file mode 100644 index 80a20d9..0000000 --- a/devices/orbweaver/orbweaver_common.go +++ /dev/null @@ -1,36 +0,0 @@ -package orbweaver - -import ( - "fmt" - "path/filepath" - "strings" - - morb "github.com/OrbTools/OrbCommon/devices/orbweaver" -) - -var eventcodes []byte -var ecm map[uint16]int - -func init() { - ecm = make(map[uint16]int) -} - -//ProcOrbFiles processes orbs -func ProcOrbFiles(orbs string) *morb.KeyMaps { - keymaps := &morb.KeyMaps{Currentmap: 0} - if len(orbs) > 0 { - for idx, orb := range strings.Split(orbs, ";") { - abs, err := filepath.Abs(orb) - if err != nil { - panic(err) - } - fmt.Println("Loading Orb " + abs) - KMap := morb.LoadKM(abs) - keymaps.Maps[idx] = KMap - } - keymaps.MCount = len(orbs) - } else { - panic("No orbs") - } - return keymaps -} diff --git a/generators/backends.go b/generators/backends.go new file mode 100644 index 0000000..2edf0f9 --- /dev/null +++ b/generators/backends.go @@ -0,0 +1,19 @@ +package main + +import ( + "io/ioutil" + "os" +) + +func main() { + out, _ := os.Create("boot.go") + out.Write([]byte("package main\n\nimport (\n")) + files, _ := ioutil.ReadDir("./backend/") + BasePkg := "github.com/OrbTools/OrbMap/backend/" + for _, fil := range files { + if fil.IsDir() { + out.Write([]byte("\t_ \"" + BasePkg + fil.Name() + "\"\n")) + } + } + out.Write([]byte(")")) +} diff --git a/go.mod b/go.mod index 7a5b165..ee5af1c 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/OrbTools/OrbMap go 1.16 require ( - github.com/OrbTools/OrbCommon v0.0.0-20210604213605-2c1ec68f6f91 + github.com/OrbTools/OrbCommon v0.0.0-20210724194347-38cc36047c7d github.com/bendahl/uinput v1.4.1 github.com/google/gousb v1.1.1 github.com/gvalkov/golang-evdev v0.0.0-20191114124502-287e62b94bcb diff --git a/go.sum b/go.sum index dafb2aa..5e78520 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/OrbTools/OrbCommon v0.0.0-20210604213605-2c1ec68f6f91 h1:zsCP3Xou+cciiCjs/hTT5Ecr9WT1X0mIsfX4MR0nYW8= -github.com/OrbTools/OrbCommon v0.0.0-20210604213605-2c1ec68f6f91/go.mod h1:8HEhD7wF9Fqritt/jYxDmjbxEScWhFfVajdYdPO5Y14= +github.com/OrbTools/OrbCommon v0.0.0-20210724194347-38cc36047c7d h1:v3tlCft2Rbg3Fojm+bKWnkMjmABiMhGeL+wVAcSTp8Q= +github.com/OrbTools/OrbCommon v0.0.0-20210724194347-38cc36047c7d/go.mod h1:8HEhD7wF9Fqritt/jYxDmjbxEScWhFfVajdYdPO5Y14= github.com/bendahl/uinput v1.4.1 h1:ecxSLcVxWk0EFyZBtmCTnOKjK/HCNdsUcWXRTkNt06k= github.com/bendahl/uinput v1.4.1/go.mod h1:Np7w3DINc9wB83p12fTAM3DPPhFnAKP0WTXRqCQJ6Z8= github.com/google/gousb v1.1.1 h1:2sjwXlc0PIBgDnXtNxUrHcD/RRFOmAtRq4QgnFBE6xc= diff --git a/main.go b/main.go index 799a358..f02c652 100644 --- a/main.go +++ b/main.go @@ -3,17 +3,28 @@ package main import ( "flag" + "strings" - "github.com/OrbTools/OrbMap/devices/orbweaver" + "github.com/OrbTools/OrbCommon/devices" "github.com/OrbTools/OrbMap/emu" "github.com/OrbTools/OrbMap/keyevents" + "github.com/OrbTools/OrbMap/registry" ) +//go:generate go run generators/backends.go func main() { - orbs := flag.String("orbweaver", "", "Comma seperated string of orbs for the orbweaver") + str := make(map[string]*string) + for d, dev := range devices.DeviceTypes { + str[d] = flag.String(d, "", "Comma seperated list of orb files for "+d+" "+dev.Backend) + } flag.Parse() KeyBus := make(chan *keyevents.KeyEvent, 128) - Maps := orbweaver.ProcOrbFiles(*orbs) - go orbweaver.OrbLoop(Maps, KeyBus) + for sys, orbs := range str { + if len(*orbs) > 0 { + devh := registry.NewOf(devices.DeviceTypes[sys].Backend) + devh.ProcOrbs(devices.DeviceTypes[sys], strings.Split(*orbs, ",")) + go devh.OrbLoop(KeyBus) + } + } emu.ProcKey(KeyBus) } diff --git a/registry/registry.go b/registry/registry.go new file mode 100644 index 0000000..c3143f6 --- /dev/null +++ b/registry/registry.go @@ -0,0 +1,26 @@ +package registry + +import ( + "reflect" + + "github.com/OrbTools/OrbCommon/devices" + "github.com/OrbTools/OrbMap/keyevents" +) + +var ( + Systems map[string]Device +) + +type Device interface { + OrbLoop(chan *keyevents.KeyEvent) + ProcOrbs(*devices.DeviceDef, []string) +} + +func init() { + Systems = make(map[string]Device) +} + +func NewOf(name string) Device { + nInter := reflect.New(reflect.ValueOf(Systems[name]).Type().Elem()) + return nInter.Interface().(Device) +}