Динамический USB HID дискриптор

unicorn79
Offline
Зарегистрирован: 03.12.2014

Добрый день всем, уважаемые! В данный момент работаю на базе Ардуино и возник такой нестандартный вопрос - возможна ли в принципе реализация Динамического USB HID дискриптора устройства на базе Arduino (например Leonardo)? Что натолкнуло на мысль - увидел в просторах интернета следующий код - выдержка из .cpp где стандартно описывается HID дискриптор:

    0x05, 0x01,                    //     USAGE_PAGE (Generic Desktop)
    0x09, 0x30,                    //     USAGE (X)
    0x09, 0x31,                    //     USAGE (Y)
    0x09, 0x38,                    //     USAGE (Wheel)
#ifdef ABSOLUTE_MOUSE_MODE
    0x15, 0x01,                    //     LOGICAL_MINIMUM (1)       <<<< This allows us to talk to any display resolution
    0x25, 0x64,                    //     LOGICAL_MAXIMUM (100)     <<<<  as though it was 100x100 pixels
    0x75, 0x08,                    //     REPORT_SIZE (8)
    0x95, 0x03,                    //     REPORT_COUNT (3)
    0x81, 0x02,                    //     INPUT (Data,Var,Abs)      <<<< This allows us to moveTo absolute positions
#else
    0x15, 0x81,                    //     LOGICAL_MINIMUM (-127)
    0x25, 0x7f,                    //     LOGICAL_MAXIMUM (127)
    0x75, 0x08,                    //     REPORT_SIZE (8)
    0x95, 0x03,                    //     REPORT_COUNT (3)
    0x81, 0x06,                    //     INPUT (Data,Var,Rel)
#endif
    0xc0,                          //   END_COLLECTION
    0xc0,                          // END_COLLECTION

, где в зависимости от ABSOLUTE_MOUSE_MODE дискриптор будет разным. Однако, хотелось бы понять, каким образом из вне можно дать понять Ардуино, какую часть дискриптора грузить при следующем ребуте девайса. Самым простым решением было бы следить за каким-либо ПИНом и его замыканием и, в зависимости от этого, уже применять условие. Хотелось бы спросить у знающих людей, возможно ли такое реализовать в принципе. Также уточню, что триггером может выступать не обязательно ПИН платы, главное, чтоб это мог задать сам пользователь. Спасибо!

rkit
Offline
Зарегистрирован: 23.11.2016

Возможно. Есть такая волшебная конструкция в программировании - оператор if. Воспользуйся им.

unicorn79
Offline
Зарегистрирован: 03.12.2014

Спасибо. Могу ли я опрашивать состояние пинов вне стандартного скетча (.ino), прописывая опрос непосредственно в исходниках?

sadman41
Offline
Зарегистрирован: 19.10.2016

Можете

unicorn79
Offline
Зарегистрирован: 03.12.2014

Благодарю, буду пробовать!

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

А что использовать EEPROM и хранить там дискриптор(ы) запретили уже ?

unicorn79
Offline
Зарегистрирован: 03.12.2014

Komandir пишет:

А что использовать EEPROM и хранить там дискриптор(ы) запретили уже ?

Спасибо. Я думаю обязательно рассмотрю вариант хранения, например,  2 различных дескриптора в EEPROM, но в данный момент пытаюсь отработать вариант считывания ПИНА из исходника соответствующей библиотеки (.cpp) и в зависимоти от результата выбора дескриптора. Этот вариант наиболее удобен, на мой взгляд.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Вы же нас не посвятили в суть своей разработки ...

unicorn79
Offline
Зарегистрирован: 03.12.2014

Komandir пишет:

Вы же нас не посвятили в суть своей разработки ...

Суть проста. Есть мышь на Леонардо, задача предоставить пользователю возможность путем замыкания ПИна самостоятельно выбирать режим работы USB HID мыши после ребута (относительная/абсолютная система смещения координат). По факту задача свелась в выборе по джамперу того или иного USB HID дескриптора.