Комментарии 13
Хороший код, мне почти всё нравится.
Os скорее всего ломается в Interface::FillDescriptor, все таки такое колдунство с указателями в плюсовую модель памяти не вписывается.
Если тестами покрыть будет вполне продакшн код. Не знаю чего здесь вообще надо поддерживать, юсб стек не поменяется.
0
Спасибо!
Проблема еще с отладкой, потому что в отладке компилируется в Og, остается только Wireshark. Уже определил, что не прилетает только Hid-report, так что обязательно найду, в чем дело.
Проблема еще с отладкой, потому что в отладке компилируется в Og, остается только Wireshark. Уже определил, что не прилетает только Hid-report, так что обязательно найду, в чем дело.
0
А вы разбейте код на 2 объектных файла, второй собирайте без оптимизаций и тупо дампьте память объектов в UART.
А так вообще gcc позволяет -g -Os, тогда будет оптимизированный код и отладочная информация, но т.к. код оптимизированный привязка к исходникам будет приблизительная.
0
Хм, никогда не миксовал разные настройки компилятора для разных объектных файлов в одном проекте, интересное предложение, спасибо).
Сейчас покопался в F072, там удалось проблему решить путем отказа от constexpr-массива с репортом, вот так:
Хотя в HEX-редакторе открыл итоговую прошивку, массив там присутствует, так что текущее решение надо признать костылём и разбираться дальше.
Сейчас покопался в F072, там удалось проблему решить путем отказа от constexpr-массива с репортом, вот так:
template<uint8_t... _Data>
struct HidReport
{
//static constexpr uint8_t Data[sizeof...(_Data)] = {_Data...}; - было так
static uint8_t Data[];
};
template<uint8_t... _Data>
uint8_t HidReport<_Data...>::Data[] = {_Data...};
Хотя в HEX-редакторе открыл итоговую прошивку, массив там присутствует, так что текущее решение надо признать костылём и разбираться дальше.
0
Здорово.
Вот бы еще HidReport байты обернуть в классы чтоб можно было по человечески редактировать.
0
Думал об этом, но пока остановился на таком варианте с оглядкой на HID Descriptor tool. Сделал в этой утилите report, вставил целиком в код.
0
Его в классы особо не обернуть. Это пары тэг-значение. В лучшем случае — набор «классов» той же структуры. Я думаю попробовать подобное реализовать на макросах. Что-то вроде
Но без знания об устройстве подобных дескрипторов это не сильно поможет. Хех, примерно этим я сейчас и занимаюсь — пытаюсь понять как оно устроено.
USAGE( KEYBOARD ),
REPORT_ID( 1 ),
USAGE_PAGE( KEYCODES ),
USAGE_MINMAX( 0, 101 ),
...
Но без знания об устройстве подобных дескрипторов это не сильно поможет. Хех, примерно этим я сейчас и занимаюсь — пытаюсь понять как оно устроено.
0
Ну почему же, я так это примерно вижу: составить много небольших классов, а окончательный дескриптор собирать как раз-таки с помощью variadic-ов. Делать все на макросах не хочется (собственно, присоединяюсь в этом вопросе к вашему оппоненту на radiokot-е. Вы осилили USB на чистых регистрах, с таким уровнем вникнуть в C++ с его фишками для вас будет несложно).
0
А думаете почему для нескольких стандартных дескрипторов (даже не для всех!) прописали классы, а для HID — нет? Потому что уж слишком они гибкие. Вы можете нарисовать клавиатуру с 10 кнопками, колесиком и индикатором камеры, к примеру. Да еще совмещенную с джойстком управления танком и космолетом. Честное слово, в стандарте USB есть специальные коды для подобных джойстиков.
А на С++ мне переходить чтобы что? Вон VladislavS с радиокота показывал свои дескрипторы, написанные на С++. Писать сложнее, менять сложнее, а преимуществ ни одного.
Вы осилили USB на чистых регистрах, с такими способностями вникнуть в C++ с его фишками для вас будет несложноПотому и осилил, что интересуюсь не абстракциями над абстракциями, а именно низким уровнем. С++ объективно сложнее Си, значит и код, на нем написанный, поймет меньшее число людей. Код из моих примеров поймет даже программист на паскале (если они под stm бывают) или ассемблере.
А на С++ мне переходить чтобы что? Вон VladislavS с радиокота показывал свои дескрипторы, написанные на С++. Писать сложнее, менять сложнее, а преимуществ ни одного.
0
Согласен, что все очень гибко. Поэтому и остановился на варианте «Вставь дескриптор целиком». Хотя HID Descriptor tool мне очень не понравилась, хотелось бы увидеть графическую утилиту с понятным интерфейсом, желательно с кнопками типа «Добавить->Джойстик танка Т-72», а не как сейчас.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Stm32 + USB на шаблонах C++. Продолжение. Делаем HID