From 3f749424589988af048b65a0c91cf9380c338883 Mon Sep 17 00:00:00 2001 From: Minizbot2012 Date: Sat, 24 Jul 2021 02:51:35 -0400 Subject: [PATCH 1/4] Modularization support Should allow future devices to be easily added --- boot.go | 5 ++++ devices/orbweaver/orbweaver_common.go | 33 ++++++++++++++++---------- devices/orbweaver/orbweaver_linux.go | 9 ++----- devices/orbweaver/orbweaver_windows.go | 8 ++----- generators/devices.go | 19 +++++++++++++++ main.go | 17 +++++++++---- registry/registry.go | 18 ++++++++++++++ 7 files changed, 79 insertions(+), 30 deletions(-) create mode 100644 boot.go create mode 100644 generators/devices.go create mode 100644 registry/registry.go diff --git a/boot.go b/boot.go new file mode 100644 index 0000000..df68fd0 --- /dev/null +++ b/boot.go @@ -0,0 +1,5 @@ +package main + +import ( + _ "github.com/OrbTools/OrbMap/devices/orbweaver" +) \ No newline at end of file diff --git a/devices/orbweaver/orbweaver_common.go b/devices/orbweaver/orbweaver_common.go index 80a20d9..9730f46 100644 --- a/devices/orbweaver/orbweaver_common.go +++ b/devices/orbweaver/orbweaver_common.go @@ -3,34 +3,41 @@ package orbweaver import ( "fmt" "path/filepath" - "strings" morb "github.com/OrbTools/OrbCommon/devices/orbweaver" + "github.com/OrbTools/OrbMap/registry" ) -var eventcodes []byte -var ecm map[uint16]int - -func init() { - ecm = make(map[uint16]int) +type Orbweaver struct { + eventcodes []byte + ecm map[uint16]int + keymaps *morb.KeyMaps } -//ProcOrbFiles processes orbs -func ProcOrbFiles(orbs string) *morb.KeyMaps { - keymaps := &morb.KeyMaps{Currentmap: 0} +//ProbcOrbFiles processes orbs +func (p Orbweaver) ProcOrbs(orbs []string) { + p.keymaps = &morb.KeyMaps{Currentmap: 0} if len(orbs) > 0 { - for idx, orb := range strings.Split(orbs, ";") { + for idx, orb := range orbs { abs, err := filepath.Abs(orb) if err != nil { panic(err) } fmt.Println("Loading Orb " + abs) KMap := morb.LoadKM(abs) - keymaps.Maps[idx] = KMap + p.keymaps.Maps[idx] = KMap } - keymaps.MCount = len(orbs) + p.keymaps.MCount = len(orbs) } else { panic("No orbs") } - return keymaps + p.ecm = make(map[uint16]int) + p.eventcodes = morb.BINDING[:] + for i := 0; i < len(p.eventcodes); i++ { + p.ecm[uint16(p.eventcodes[i])] = i + } +} + +func init() { + registry.Systems["orbweaver"] = registry.Device(&Orbweaver{}) } diff --git a/devices/orbweaver/orbweaver_linux.go b/devices/orbweaver/orbweaver_linux.go index 397a7f9..7a65aad 100644 --- a/devices/orbweaver/orbweaver_linux.go +++ b/devices/orbweaver/orbweaver_linux.go @@ -7,17 +7,12 @@ import ( "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 Orbweaver) 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 { @@ -30,7 +25,7 @@ func OrbLoop(km *morb.KeyMaps, KeyBus chan *keyevents.KeyEvent) { f.File.Read(b) KeyEv := &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/devices/orbweaver/orbweaver_windows.go index 9bbe558..05b0c98 100644 --- a/devices/orbweaver/orbweaver_windows.go +++ b/devices/orbweaver/orbweaver_windows.go @@ -101,11 +101,7 @@ 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 Orbweaver) OrbLoop(KeyBus chan *keyevents.KeyEvent) { fmt.Println("Windows Loop Init") ctx := gousb.NewContext() dev, err := ctx.OpenDeviceWithVIDPID(vendor, prod) @@ -146,7 +142,7 @@ func OrbLoop(km *morb.KeyMaps, KeyBus chan *keyevents.KeyEvent) { 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(p.keymaps.Maps[p.keymaps.Currentmap].Keymap[p.ecm[uint16(dat[i])]]) dat[i] = byte(hid.GetHidFromLinux(uint16(dat[i]))) dat[i] = byte(hid.GetWindowsFromHid(uint16(dat[i]))) } diff --git a/generators/devices.go b/generators/devices.go new file mode 100644 index 0000000..9e8df44 --- /dev/null +++ b/generators/devices.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("./devices/") + BasePkg := "github.com/OrbTools/OrbMap/devices/" + for _, fil := range files { + if fil.IsDir() { + out.Write([]byte("\t_ \"" + BasePkg + fil.Name() + "\"\n")) + } + } + out.Write([]byte(")")) +} diff --git a/main.go b/main.go index 799a358..7648f3c 100644 --- a/main.go +++ b/main.go @@ -3,17 +3,26 @@ package main import ( "flag" + "strings" - "github.com/OrbTools/OrbMap/devices/orbweaver" "github.com/OrbTools/OrbMap/emu" "github.com/OrbTools/OrbMap/keyevents" + "github.com/OrbTools/OrbMap/registry" ) +//go:generate go run generators/devices.go func main() { - orbs := flag.String("orbweaver", "", "Comma seperated string of orbs for the orbweaver") + str := make(map[string]*string) + for d := range registry.Systems { + str[d] = flag.String(d, "", "Comma seperated list of orb files for "+d) + } 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 { + registry.Systems[sys].ProcOrbs(strings.Split(*orbs, ",")) + go registry.Systems[sys].OrbLoop(KeyBus) + } + } emu.ProcKey(KeyBus) } diff --git a/registry/registry.go b/registry/registry.go new file mode 100644 index 0000000..8786cc3 --- /dev/null +++ b/registry/registry.go @@ -0,0 +1,18 @@ +package registry + +import ( + "github.com/OrbTools/OrbMap/keyevents" +) + +var ( + Systems map[string]Device +) + +type Device interface { + OrbLoop(chan *keyevents.KeyEvent) + ProcOrbs([]string) +} + +func init() { + Systems = make(map[string]Device) +} From 38891f6105acc1051b91a92e748a0e554e59611e Mon Sep 17 00:00:00 2001 From: Minizbot2012 Date: Sat, 24 Jul 2021 03:01:10 -0400 Subject: [PATCH 2/4] reduce windows translation complexity for hid.go --- devices/orbweaver/orbweaver_windows.go | 6 ++---- go.mod | 2 +- go.sum | 4 ++-- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/devices/orbweaver/orbweaver_windows.go b/devices/orbweaver/orbweaver_windows.go index 05b0c98..3e9ddd4 100644 --- a/devices/orbweaver/orbweaver_windows.go +++ b/devices/orbweaver/orbweaver_windows.go @@ -7,7 +7,6 @@ import ( "encoding/binary" "fmt" - morb "github.com/OrbTools/OrbCommon/devices/orbweaver" "github.com/OrbTools/OrbCommon/hid" "github.com/OrbTools/OrbMap/keyevents" "github.com/google/gousb" @@ -141,10 +140,9 @@ func (p Orbweaver) OrbLoop(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(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.GetHidFromLinux(uint16(dat[i]))) - dat[i] = byte(hid.GetWindowsFromHid(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/go.mod b/go.mod index 7a5b165..8e878d5 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-20210724065833-4ff2abe0a12c 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..9336fff 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-20210724065833-4ff2abe0a12c h1:oTZtQVfLPB3ef+m8NVY8pnvAZgrvMRyr6u21HdkRa9I= +github.com/OrbTools/OrbCommon v0.0.0-20210724065833-4ff2abe0a12c/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= From 838a8806ad48e8cb25139ab0eb44bac9e1d4b86c Mon Sep 17 00:00:00 2001 From: Minizbot2012 Date: Sat, 24 Jul 2021 15:40:01 -0400 Subject: [PATCH 3/4] Final fix before major revamp, works --- devices/orbweaver/orbweaver_common.go | 2 +- devices/orbweaver/orbweaver_linux.go | 2 +- devices/orbweaver/orbweaver_windows.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/devices/orbweaver/orbweaver_common.go b/devices/orbweaver/orbweaver_common.go index 9730f46..fbba343 100644 --- a/devices/orbweaver/orbweaver_common.go +++ b/devices/orbweaver/orbweaver_common.go @@ -15,7 +15,7 @@ type Orbweaver struct { } //ProbcOrbFiles processes orbs -func (p Orbweaver) ProcOrbs(orbs []string) { +func (p *Orbweaver) ProcOrbs(orbs []string) { p.keymaps = &morb.KeyMaps{Currentmap: 0} if len(orbs) > 0 { for idx, orb := range orbs { diff --git a/devices/orbweaver/orbweaver_linux.go b/devices/orbweaver/orbweaver_linux.go index 7a65aad..acae9bf 100644 --- a/devices/orbweaver/orbweaver_linux.go +++ b/devices/orbweaver/orbweaver_linux.go @@ -12,7 +12,7 @@ import ( ) //OrbLoop Main loop for this device -func (p Orbweaver) OrbLoop(KeyBus chan *keyevents.KeyEvent) { +func (p *Orbweaver) 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 { diff --git a/devices/orbweaver/orbweaver_windows.go b/devices/orbweaver/orbweaver_windows.go index 3e9ddd4..0a94de1 100644 --- a/devices/orbweaver/orbweaver_windows.go +++ b/devices/orbweaver/orbweaver_windows.go @@ -100,7 +100,7 @@ func (s *swapInt) Differ(s2 *swapInt) []byte { } //OrbLoop Main loop for this device -func (p Orbweaver) OrbLoop(KeyBus chan *keyevents.KeyEvent) { +func (p *Orbweaver) OrbLoop(KeyBus chan *keyevents.KeyEvent) { fmt.Println("Windows Loop Init") ctx := gousb.NewContext() dev, err := ctx.OpenDeviceWithVIDPID(vendor, prod) From 9c905fab16043d2f4f8dd95d066ab4e208b8df93 Mon Sep 17 00:00:00 2001 From: Minizbot2012 Date: Sat, 24 Jul 2021 15:53:04 -0400 Subject: [PATCH 4/4] Major refactor and code rebuild Main new feature is the idea of "Backends" This allows customization beyond what is already available Devices can now be defined in a json file as part of OrbCommon --- backend/keypad/keypad_common.go | 42 ++++++++++++++++++ .../keypad/keypad_linux.go | 12 ++---- .../keypad/keypad_windows.go | 8 ++-- boot.go | 2 +- devices/orbweaver/orbweaver_common.go | 43 ------------------- generators/{devices.go => backends.go} | 4 +- go.mod | 2 +- go.sum | 4 +- main.go | 12 +++--- registry/registry.go | 10 ++++- 10 files changed, 71 insertions(+), 68 deletions(-) create mode 100644 backend/keypad/keypad_common.go rename devices/orbweaver/orbweaver_linux.go => backend/keypad/keypad_linux.go (70%) rename devices/orbweaver/orbweaver_windows.go => backend/keypad/keypad_windows.go (93%) delete mode 100644 devices/orbweaver/orbweaver_common.go rename generators/{devices.go => backends.go} (75%) 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 70% rename from devices/orbweaver/orbweaver_linux.go rename to backend/keypad/keypad_linux.go index acae9bf..cee32c7 100644 --- a/devices/orbweaver/orbweaver_linux.go +++ b/backend/keypad/keypad_linux.go @@ -1,6 +1,5 @@ // +build linux !windows - -package orbweaver +package keypad import ( "bytes" @@ -12,18 +11,15 @@ import ( ) //OrbLoop Main loop for this device -func (p *Orbweaver) OrbLoop(KeyBus chan *keyevents.KeyEvent) { +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 = p.keymaps.Maps[p.keymaps.Currentmap].Keymap[p.ecm[KeyEv.Code]] if KeyEv.Code != 0 && KeyEv.Type != 4 { diff --git a/devices/orbweaver/orbweaver_windows.go b/backend/keypad/keypad_windows.go similarity index 93% rename from devices/orbweaver/orbweaver_windows.go rename to backend/keypad/keypad_windows.go index 0a94de1..1c193cc 100644 --- a/devices/orbweaver/orbweaver_windows.go +++ b/backend/keypad/keypad_windows.go @@ -1,6 +1,6 @@ // +build windows -package orbweaver +package keypad import ( "bytes" @@ -13,8 +13,6 @@ import ( ) const ( - vendor = gousb.ID(0x1532) - prod = gousb.ID(0x0207) leftControl byte = 0x1 leftShift byte = 0x2 leftAlt byte = 0x4 @@ -100,10 +98,10 @@ func (s *swapInt) Differ(s2 *swapInt) []byte { } //OrbLoop Main loop for this device -func (p *Orbweaver) OrbLoop(KeyBus chan *keyevents.KeyEvent) { +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) } diff --git a/boot.go b/boot.go index df68fd0..0f16404 100644 --- a/boot.go +++ b/boot.go @@ -1,5 +1,5 @@ package main import ( - _ "github.com/OrbTools/OrbMap/devices/orbweaver" + _ "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 fbba343..0000000 --- a/devices/orbweaver/orbweaver_common.go +++ /dev/null @@ -1,43 +0,0 @@ -package orbweaver - -import ( - "fmt" - "path/filepath" - - morb "github.com/OrbTools/OrbCommon/devices/orbweaver" - "github.com/OrbTools/OrbMap/registry" -) - -type Orbweaver struct { - eventcodes []byte - ecm map[uint16]int - keymaps *morb.KeyMaps -} - -//ProbcOrbFiles processes orbs -func (p *Orbweaver) ProcOrbs(orbs []string) { - p.keymaps = &morb.KeyMaps{Currentmap: 0} - if len(orbs) > 0 { - for idx, orb := range orbs { - abs, err := filepath.Abs(orb) - if err != nil { - panic(err) - } - fmt.Println("Loading Orb " + abs) - KMap := morb.LoadKM(abs) - p.keymaps.Maps[idx] = KMap - } - p.keymaps.MCount = len(orbs) - } else { - panic("No orbs") - } - p.ecm = make(map[uint16]int) - p.eventcodes = morb.BINDING[:] - for i := 0; i < len(p.eventcodes); i++ { - p.ecm[uint16(p.eventcodes[i])] = i - } -} - -func init() { - registry.Systems["orbweaver"] = registry.Device(&Orbweaver{}) -} diff --git a/generators/devices.go b/generators/backends.go similarity index 75% rename from generators/devices.go rename to generators/backends.go index 9e8df44..2edf0f9 100644 --- a/generators/devices.go +++ b/generators/backends.go @@ -8,8 +8,8 @@ import ( func main() { out, _ := os.Create("boot.go") out.Write([]byte("package main\n\nimport (\n")) - files, _ := ioutil.ReadDir("./devices/") - BasePkg := "github.com/OrbTools/OrbMap/devices/" + 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")) diff --git a/go.mod b/go.mod index 8e878d5..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-20210724065833-4ff2abe0a12c + 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 9336fff..5e78520 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -github.com/OrbTools/OrbCommon v0.0.0-20210724065833-4ff2abe0a12c h1:oTZtQVfLPB3ef+m8NVY8pnvAZgrvMRyr6u21HdkRa9I= -github.com/OrbTools/OrbCommon v0.0.0-20210724065833-4ff2abe0a12c/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 7648f3c..f02c652 100644 --- a/main.go +++ b/main.go @@ -5,23 +5,25 @@ import ( "flag" "strings" + "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/devices.go +//go:generate go run generators/backends.go func main() { str := make(map[string]*string) - for d := range registry.Systems { - str[d] = flag.String(d, "", "Comma seperated list of orb files for "+d) + 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) for sys, orbs := range str { if len(*orbs) > 0 { - registry.Systems[sys].ProcOrbs(strings.Split(*orbs, ",")) - go registry.Systems[sys].OrbLoop(KeyBus) + 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 index 8786cc3..c3143f6 100644 --- a/registry/registry.go +++ b/registry/registry.go @@ -1,6 +1,9 @@ package registry import ( + "reflect" + + "github.com/OrbTools/OrbCommon/devices" "github.com/OrbTools/OrbMap/keyevents" ) @@ -10,9 +13,14 @@ var ( type Device interface { OrbLoop(chan *keyevents.KeyEvent) - ProcOrbs([]string) + 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) +}