machine/usb/hid/joystick: handle case where we cannot find the correct HID descriptor
Signed-off-by: deadprogram <ron@hybridgroup.com>
Этот коммит содержится в:
родитель
2ab7ee6a8a
коммит
25b03414dc
3 изменённых файлов: 23 добавлений и 5 удалений
|
@ -302,7 +302,12 @@ func EnableMIDI(txHandler func(), rxHandler func([]byte), setupHandler func(usb.
|
||||||
|
|
||||||
// EnableJoystick enables HID. This function must be executed from the init().
|
// EnableJoystick enables HID. This function must be executed from the init().
|
||||||
func EnableJoystick(txHandler func(), rxHandler func([]byte), setupHandler func(usb.Setup) bool, hidDesc []byte) {
|
func EnableJoystick(txHandler func(), rxHandler func([]byte), setupHandler func(usb.Setup) bool, hidDesc []byte) {
|
||||||
class := descriptor.FindClassHIDType(descriptor.CDCJoystick.Configuration, descriptor.ClassHIDJoystick.Bytes())
|
class, err := descriptor.FindClassHIDType(descriptor.CDCJoystick.Configuration, descriptor.ClassHIDJoystick.Bytes())
|
||||||
|
if err != nil {
|
||||||
|
// TODO: some way to notify about error
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
class.ClassLength(uint16(len(hidDesc)))
|
class.ClassLength(uint16(len(hidDesc)))
|
||||||
descriptor.CDCJoystick.HID[2] = hidDesc
|
descriptor.CDCJoystick.HID[2] = hidDesc
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ package descriptor
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
|
"errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
var configurationCDCHID = [configurationTypeLen]byte{
|
var configurationCDCHID = [configurationTypeLen]byte{
|
||||||
|
@ -76,10 +77,22 @@ func (d ClassHIDType) ClassLength(v uint16) {
|
||||||
binary.LittleEndian.PutUint16(d.data[7:9], v)
|
binary.LittleEndian.PutUint16(d.data[7:9], v)
|
||||||
}
|
}
|
||||||
|
|
||||||
func FindClassHIDType(data, section []byte) ClassHIDType {
|
var errNoClassHIDFound = errors.New("no classHID found")
|
||||||
idx := bytes.Index(data, section)
|
|
||||||
|
|
||||||
return ClassHIDType{data: data[idx : idx+ClassHIDTypeLen]}
|
// FindClassHIDType tries to find the ClassHID class in the descriptor.
|
||||||
|
func FindClassHIDType(des, class []byte) (ClassHIDType, error) {
|
||||||
|
if len(des) < ClassHIDTypeLen || len(class) == 0 {
|
||||||
|
return ClassHIDType{}, errNoClassHIDFound
|
||||||
|
}
|
||||||
|
|
||||||
|
// search only for ClassHIDType without the ClassLength,
|
||||||
|
// in case it has already been set.
|
||||||
|
idx := bytes.Index(des, class[:ClassHIDTypeLen-2])
|
||||||
|
if idx == -1 {
|
||||||
|
return ClassHIDType{}, errNoClassHIDFound
|
||||||
|
}
|
||||||
|
|
||||||
|
return ClassHIDType{data: des[idx : idx+ClassHIDTypeLen]}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var classHID = [ClassHIDTypeLen]byte{
|
var classHID = [ClassHIDTypeLen]byte{
|
||||||
|
|
|
@ -30,7 +30,7 @@ func UseSettings(def Definitions, rxHandlerFunc func(b []byte), setupFunc func(s
|
||||||
State: def.NewState(),
|
State: def.NewState(),
|
||||||
}
|
}
|
||||||
if setupFunc == nil {
|
if setupFunc == nil {
|
||||||
setupFunc = js.setupFunc
|
setupFunc = hid.DefaultSetupHandler
|
||||||
}
|
}
|
||||||
machine.EnableJoystick(js.handler, rxHandlerFunc, setupFunc, hidDesc)
|
machine.EnableJoystick(js.handler, rxHandlerFunc, setupFunc, hidDesc)
|
||||||
Joystick = js
|
Joystick = js
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче