machine/usb/hid/joystick: handle case where we cannot find the correct HID descriptor

Signed-off-by: deadprogram <ron@hybridgroup.com>
Этот коммит содержится в:
deadprogram 2023-04-17 14:38:15 +02:00 коммит произвёл Ron Evans
родитель 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().
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)))
descriptor.CDCJoystick.HID[2] = hidDesc

Просмотреть файл

@ -3,6 +3,7 @@ package descriptor
import (
"bytes"
"encoding/binary"
"errors"
)
var configurationCDCHID = [configurationTypeLen]byte{
@ -76,10 +77,22 @@ func (d ClassHIDType) ClassLength(v uint16) {
binary.LittleEndian.PutUint16(d.data[7:9], v)
}
func FindClassHIDType(data, section []byte) ClassHIDType {
idx := bytes.Index(data, section)
var errNoClassHIDFound = errors.New("no classHID found")
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{

Просмотреть файл

@ -30,7 +30,7 @@ func UseSettings(def Definitions, rxHandlerFunc func(b []byte), setupFunc func(s
State: def.NewState(),
}
if setupFunc == nil {
setupFunc = js.setupFunc
setupFunc = hid.DefaultSetupHandler
}
machine.EnableJoystick(js.handler, rxHandlerFunc, setupFunc, hidDesc)
Joystick = js