machine/usb/hid,joystick: fix hidreport (3) (#3802)

* machine/usb/hid,joystick: fix hidreport (3) and handling of logical, usage, and physical minimum/maximum values
Этот коммит содержится в:
sago35 2023-07-01 18:58:23 +09:00 коммит произвёл GitHub
родитель 4619896c19
коммит ad32d26511
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
2 изменённых файлов: 56 добавлений и 34 удалений

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

@ -3,12 +3,12 @@ package descriptor
const ( const (
hidUsagePage = 0x05 hidUsagePage = 0x05
hidUsage = 0x09 hidUsage = 0x09
hidLogicalMinimum = 0x15 hidLogicalMinimum = 0x14
hidLogicalMaximum = 0x25 hidLogicalMaximum = 0x24
hidUsageMinimum = 0x19 hidUsageMinimum = 0x18
hidUsageMaximum = 0x29 hidUsageMaximum = 0x28
hidPhysicalMinimum = 0x35 hidPhysicalMinimum = 0x34
hidPhysicalMaximum = 0x46 hidPhysicalMaximum = 0x44
hidUnitExponent = 0x55 hidUnitExponent = 0x55
hidUnit = 0x65 hidUnit = 0x65
hidCollection = 0xa1 hidCollection = 0xa1
@ -18,6 +18,13 @@ const (
hidReportID = 0x85 hidReportID = 0x85
) )
const (
hidSizeValue0 = 0x00
hidSizeValue1 = 0x01
hidSizeValue2 = 0x02
hidSizeValue4 = 0x03
)
var ( var (
HIDUsagePageGenericDesktop = []byte{hidUsagePage, 0x01} HIDUsagePageGenericDesktop = []byte{hidUsagePage, 0x01}
HIDUsagePageSimulationControls = []byte{hidUsagePage, 0x02} HIDUsagePageSimulationControls = []byte{hidUsagePage, 0x02}
@ -129,51 +136,69 @@ func HIDReportID(id int) []byte {
} }
func HIDLogicalMinimum(min int) []byte { func HIDLogicalMinimum(min int) []byte {
if min > 255 { switch {
return []byte{hidLogicalMinimum + 1, uint8(min), uint8(min >> 8)} case min < -32767 || 65535 < min:
return []byte{hidLogicalMinimum + hidSizeValue4, uint8(min), uint8(min >> 8), uint8(min >> 16), uint8(min >> 24)}
case min < -127 || 255 < min:
return []byte{hidLogicalMinimum + hidSizeValue2, uint8(min), uint8(min >> 8)}
default:
return []byte{hidLogicalMinimum + hidSizeValue1, byte(min)}
} }
return []byte{hidLogicalMinimum, byte(min)}
} }
func HIDLogicalMaximum(max int) []byte { func HIDLogicalMaximum(max int) []byte {
if max > 255 { switch {
return []byte{hidLogicalMaximum + 1, uint8(max), uint8(max >> 8)} case max < -32767 || 65535 < max:
return []byte{hidLogicalMaximum + hidSizeValue4, uint8(max), uint8(max >> 8), uint8(max >> 16), uint8(max >> 24)}
case max < -127 || 255 < max:
return []byte{hidLogicalMaximum + hidSizeValue2, uint8(max), uint8(max >> 8)}
default:
return []byte{hidLogicalMaximum + hidSizeValue1, byte(max)}
} }
return []byte{hidLogicalMaximum, byte(max)}
} }
func HIDUsageMinimum(min int) []byte { func HIDUsageMinimum(min int) []byte {
if min > 255 { switch {
return []byte{hidUsageMinimum + 1, uint8(min), uint8(min >> 8)} case min < -32767 || 65535 < min:
return []byte{hidUsageMinimum + hidSizeValue4, uint8(min), uint8(min >> 8), uint8(min >> 16), uint8(min >> 24)}
case min < -127 || 255 < min:
return []byte{hidUsageMinimum + hidSizeValue2, uint8(min), uint8(min >> 8)}
default:
return []byte{hidUsageMinimum + hidSizeValue1, byte(min)}
} }
return []byte{hidUsageMinimum, byte(min)}
} }
func HIDUsageMaximum(max int) []byte { func HIDUsageMaximum(max int) []byte {
if max > 255 { switch {
return []byte{hidUsageMaximum + 1, uint8(max), uint8(max >> 8)} case max < -32767 || 65535 < max:
return []byte{hidUsageMaximum + hidSizeValue4, uint8(max), uint8(max >> 8), uint8(max >> 16), uint8(max >> 24)}
case max < -127 || 255 < max:
return []byte{hidUsageMaximum + hidSizeValue2, uint8(max), uint8(max >> 8)}
default:
return []byte{hidUsageMaximum + hidSizeValue1, byte(max)}
} }
return []byte{hidUsageMaximum, byte(max)}
} }
func HIDPhysicalMinimum(min int) []byte { func HIDPhysicalMinimum(min int) []byte {
if min > 255 { switch {
return []byte{hidPhysicalMinimum + 1, uint8(min), uint8(min >> 8)} case min < -32767 || 65535 < min:
return []byte{hidPhysicalMinimum + hidSizeValue4, uint8(min), uint8(min >> 8), uint8(min >> 16), uint8(min >> 24)}
case min < -127 || 255 < min:
return []byte{hidPhysicalMinimum + hidSizeValue2, uint8(min), uint8(min >> 8)}
default:
return []byte{hidPhysicalMinimum + hidSizeValue1, byte(min)}
} }
return []byte{hidPhysicalMinimum, byte(min)}
} }
func HIDPhysicalMaximum(max int) []byte { func HIDPhysicalMaximum(max int) []byte {
if max > 255 { switch {
return []byte{hidPhysicalMaximum + 1, uint8(max), uint8(max >> 8)} case max < -32767 || 65535 < max:
return []byte{hidPhysicalMaximum + hidSizeValue4, uint8(max), uint8(max >> 8), uint8(max >> 16), uint8(max >> 24)}
case max < -127 || 255 < max:
return []byte{hidPhysicalMaximum + hidSizeValue2, uint8(max), uint8(max >> 8)}
default:
return []byte{hidPhysicalMaximum + hidSizeValue1, byte(max)}
} }
return []byte{hidPhysicalMaximum, byte(max)}
} }
func HIDUnitExponent(exp int) []byte { func HIDUnitExponent(exp int) []byte {

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

@ -80,10 +80,7 @@ var JoystickDefaultHIDReport = Append([][]byte{
HIDLogicalMaximum(1), HIDLogicalMaximum(1),
HIDReportSize(1), HIDReportSize(1),
HIDReportCount(16), HIDReportCount(16),
HIDInputDataVarAbs, HIDUnitExponent(0),
HIDReportCount(1),
HIDReportSize(3),
HIDUnitExponent(-16),
HIDUnit(0), HIDUnit(0),
HIDInputDataVarAbs, HIDInputDataVarAbs,