Коды HID сканирования всегда 8 бит. Комбинации клавиш, такие как left- CTRL + <, </kbd> в этом случае, представляют собой последовательность "модификатора клавиши" (0x01 для left- CTRL ) и код ключа (0x36 для <, </kbd>).
Вист 0x0136 оказывается 310 10 , ошибочно считать последовательности кодов многобайтового сканирования как одно целое число, а не последовательность байтов по ряду причин:
- целочисленный байт для машинной архитектуры может не соответствовать определенному для кодовых последовательностей HID,
- В отчете HID-клавиатуры это один байт модификатора клавиши и до шести кодов клавиш - для комбинаций из до 6 обычных клавиш и восьми битов модификаторов для комбинаций shift, alt, ctrl и т. Д., Нажатых одновременно,
- В отчете HID-клавиатуры есть «зарезервированный» байт между модификатором и кодом первой клавиши в любом случае, поэтому 0x01 и 0x36 не являются смежными в любом случае независимо от порядка байтов машины.
В случае кодов сканирования HID ваши 310 10 на самом деле представляют собой два байта 0x01 и 0x36 (в шестнадцатеричном формате). Когда речь идет о байтовых последовательностях, более естественно использовать шестнадцатеричные обозначения - особенно в случае модификатора, который является битовой маской для нескольких клавиш shift / ctrl и т. Д. 0x36 представляет собой ключ <, </kbd>, а 0x01 - это ключевой модификатор left- CTRL .
Если ваше значение 310 было усечено, когда вы присвоили его 16-битному целому числу, скорее всего, вы передали его как одно значение интерфейсу, который ожидал uint8_t
. Но, как объяснялось выше, отправка 16-битного целого числа в любом случае некорректна.
Вместо отправки 0x0136 или 310 10 вам необходимо отправить последовательность байтов, чтобы сформировать действительный отчет о клавиатуре, как описано в дескрипторе отчета клавиатуры вашего устройства. В отчете HID-клавиатуры первый байт является «маской-модификатором» (0x01 / left- CTRL ), второй байт зарезервирован, затем имеется до 6 кодов клавиш (допускающих комбинации нескольких клавиш ) фактическое количество поддерживаемых ключей и, следовательно, длина отчета определяется дескриптором отчета.
Глядя на API в демонстрационной версии HID, которую вы связали, становится ясно, что все, что абстрагируется, и кажется, что вам действительно нужно сделать что-то вроде:
uint8_t key = HID_KEY_COMMA ;
esp_hidd_send_keyboard_value( hid_conn_id, LEFT_CONTROL_KEY_MASK, &key, 1 ) ;
Обратите внимание, что модификатор является битовой маской, допускающей любую комбинацию клавиш-модификаторов, например LEFT_CONTROL_KEY_MASK|RIGHT_CONTROL_KEY_MASK
. HID будет использовать это, чтобы указать несколько смен, но получатель может использовать его, чтобы разрешить левую или правую клавиши без различия.