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 | ||||||
|  |  | ||||||
		Загрузка…
	
	Создание таблицы
		
		Сослаться в новой задаче
	
	 deadprogram
						deadprogram