diff --git a/devices/devices.go b/devices/devices.go index 82d28f5..7370c67 100644 --- a/devices/devices.go +++ b/devices/devices.go @@ -1,15 +1,5 @@ package devices -import ( - "embed" - "encoding/binary" - "encoding/json" - "io" - "io/fs" - "os" - "strings" -) - //KeyMap singular keymap type KeyMap struct { Keymap []uint16 @@ -23,9 +13,6 @@ type KeyMaps struct { MCount int } -//go:embed json/* -var jsons embed.FS - type DeviceDef struct { Backend string IsColor bool @@ -49,31 +36,3 @@ type DeviceDef struct { } var DeviceTypes map[string]*DeviceDef - -func init() { - DeviceTypes = make(map[string]*DeviceDef) - files, _ := fs.ReadDir(jsons, "json") - for _, file := range files { - dev := new(DeviceDef) - data, _ := jsons.ReadFile("json/" + file.Name()) - json.Unmarshal(data, dev) - DeviceTypes[strings.Split(file.Name(), ".")[0]] = dev - } -} - -//LoadKM Load Orbmap KM structure -func LoadKeymap(file string, dev *DeviceDef) *KeyMap { - mapped := new(KeyMap) - of, _ := os.Open(file) - defer of.Close() - mapped.Keymap = make([]uint16, dev.NumKeys) - binary.Read(of, binary.LittleEndian, mapped.Keymap) - binary.Read(of, binary.LittleEndian, mapped.Color) - return mapped -} - -//SavePKMKeymap saves an orb after edit -func SaveKeymap(mapped interface{}, file io.WriteCloser) { - binary.Write(file, binary.LittleEndian, mapped) - file.Close() -} diff --git a/devices/devices_json.go b/devices/devices_json.go new file mode 100644 index 0000000..760884f --- /dev/null +++ b/devices/devices_json.go @@ -0,0 +1,44 @@ +// +build !xdr + +package devices + +import ( + "embed" + "encoding/binary" + "encoding/json" + "io" + "io/fs" + "os" + "strings" +) + +//go:embed json/* +var data embed.FS + +func init() { + DeviceTypes = make(map[string]*DeviceDef) + files, _ := fs.ReadDir(data, "json") + for _, file := range files { + dev := new(DeviceDef) + data, _ := data.ReadFile("json/" + file.Name()) + json.Unmarshal(data, dev) + DeviceTypes[strings.Split(file.Name(), ".")[0]] = dev + } +} + +//LoadKM Load Orbmap KM structure +func LoadKeymap(file string, dev *DeviceDef) *KeyMap { + mapped := new(KeyMap) + of, _ := os.Open(file) + defer of.Close() + mapped.Keymap = make([]uint16, dev.NumKeys) + binary.Read(of, binary.LittleEndian, mapped.Keymap) + binary.Read(of, binary.LittleEndian, mapped.Color) + return mapped +} + +//SavePKMKeymap saves an orb after edit +func SaveKeymap(mapped interface{}, file io.WriteCloser) { + binary.Write(file, binary.LittleEndian, mapped) + file.Close() +} diff --git a/devices/devices_xdr.go b/devices/devices_xdr.go new file mode 100644 index 0000000..cc7ab62 --- /dev/null +++ b/devices/devices_xdr.go @@ -0,0 +1,40 @@ +// +build xdr + +package devices + +import ( + "embed" + "github.com/davecgh/go-xdr/xdr2" + "io" + "io/fs" + "os" + "strings" +) + +//go:embed xdr/* +var data embed.FS + +func init() { + DeviceTypes = make(map[string]*DeviceDef) + files, _ := fs.ReadDir(data, "xdr") + for _, file := range files { + dev := new(DeviceDef) + data, _ := jsons.ReadFile("xdr/" + file.Name()) + xdr2.Unmarshal(data, dev) + DeviceTypes[strings.Split(file.Name(), ".")[0]] = dev + } +} + +//LoadKM Load Orbmap KM structure +func LoadKeymap(file string, dev *DeviceDef) *KeyMap { + mapped := new(KeyMap) + of, _ := os.Open(file) + xdr.Unmarshal(of, KeyMap) + return mapped +} + +//SavePKMKeymap saves an orb after edit +func SaveKeymap(mapped interface{}, file io.WriteCloser) { + xdr.Marshal(file, mapped) + file.Close() +} diff --git a/devices/translator/jsoxdr.go b/devices/translator/jsoxdr.go new file mode 100644 index 0000000..864e890 --- /dev/null +++ b/devices/translator/jsoxdr.go @@ -0,0 +1,22 @@ +package main + +import ( + "encoding/json" + "os" + "strings" + + "github.com/OrbTools/OrbCommon/devices" + xdr "github.com/davecgh/go-xdr/xdr2" +) + +func main() { + files, _ := os.ReadDir("devices/json/") + for _, file := range files { + data, _ := os.ReadFile("devices/json/" + file.Name()) + DevDef := &devices.DeviceDef{} + json.Unmarshal(data, DevDef) + xdo, _ := os.Create("devices/xdr/" + strings.Split(file.Name(), ".")[0] + ".bin") + xdr.Marshal(xdo, DevDef) + xdo.Close() + } +} diff --git a/devices/xdr/orbweaver.bin b/devices/xdr/orbweaver.bin new file mode 100644 index 0000000..7347435 Binary files /dev/null and b/devices/xdr/orbweaver.bin differ diff --git a/go.mod b/go.mod index d3afaf6..6aa821c 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,5 @@ module github.com/OrbTools/OrbCommon go 1.16 + +require github.com/davecgh/go-xdr v0.0.0-20161123171359-e6a2ba005892 // indirect diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..631189d --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +github.com/davecgh/go-xdr v0.0.0-20161123171359-e6a2ba005892 h1:qg9VbHo1TlL0KDM0vYvBG9EY0X0Yku5WYIPoFWt8f6o= +github.com/davecgh/go-xdr v0.0.0-20161123171359-e6a2ba005892/go.mod h1:CTDl0pzVzE5DEzZhPfvhY/9sPFMQIxaJ9VAMs9AagrE= diff --git a/hid/generated.bin b/hid/generated.bin new file mode 100644 index 0000000..0465c2c Binary files /dev/null and b/hid/generated.bin differ diff --git a/hid/generator/gen.go b/hid/generator/gen.go index e2f6585..a62dca3 100644 --- a/hid/generator/gen.go +++ b/hid/generator/gen.go @@ -7,6 +7,8 @@ import ( "os" "regexp" "strconv" + + xdr "github.com/davecgh/go-xdr/xdr2" ) type KeyMaps struct { @@ -78,7 +80,10 @@ func main() { } KeyMaps.Arr = Arr out, _ := os.Create("hid/generated.json") + xdo, _ := os.Create("hid/generated.bin") + defer xdo.Close() defer out.Close() jso, _ := json.Marshal(KeyMaps) + xdr.Marshal(xdo, KeyMaps) out.Write(jso) } diff --git a/hid/hid.go b/hid/hid_json.go similarity index 98% rename from hid/hid.go rename to hid/hid_json.go index af75307..5f8906f 100644 --- a/hid/hid.go +++ b/hid/hid_json.go @@ -1,3 +1,5 @@ +// +build !xdr + package hid import ( diff --git a/hid/hid_xdr.go b/hid/hid_xdr.go new file mode 100644 index 0000000..187bbc8 --- /dev/null +++ b/hid/hid_xdr.go @@ -0,0 +1,57 @@ +// +build xdr + +package hid + +import ( + "bytes" + _ "embed" + xdr "github.com/davecgh/go-xdr/xdr2" +) + +type KeyMaps struct { + Usb map[uint16]Key + Evdev map[uint16]Key + Xkb map[uint16]Key + Win map[uint16]Key + Mac map[uint16]Key + Code map[string]Key + Arr []Key +} + +type Key struct { + Usb uint16 + Evdev uint16 + Xkb uint16 + Win uint16 + Mac uint16 + Code string +} + +var Mappings KeyMaps = KeyMaps{} + +//go:embed generated.bin +var file []byte + +func init() { + xdr.Unmarshal(bytes.NewReader(file), Mappings) +} + +func GetMappingFromHID(uv uint16) Key { + return Mappings.Usb[uv] +} + +func GetMappingFromWindows(uv uint16) Key { + return Mappings.Win[uv] +} + +func GetMappingFromLinux(uv uint16) Key { + return Mappings.Evdev[uv] +} + +func GetMappingFromName(name string) Key { + return Mappings.Code[name] +} + +func GetMappingFromX(code uint16) Key { + return Mappings.Xkb[code] +} diff --git a/module.go b/module.go index d0d85fe..8250109 100644 --- a/module.go +++ b/module.go @@ -1,3 +1,4 @@ package OrbCommon //go:generate go run hid/generator/gen.go +//go:generate go run devices/translator/jsoxdr.go