Как стать автором
Обновить

Комментарии 13

Хороший код, мне почти всё нравится.
Os скорее всего ломается в Interface::FillDescriptor, все таки такое колдунство с указателями в плюсовую модель памяти не вписывается.


Если тестами покрыть будет вполне продакшн код. Не знаю чего здесь вообще надо поддерживать, юсб стек не поменяется.

Спасибо!
Проблема еще с отладкой, потому что в отладке компилируется в Og, остается только Wireshark. Уже определил, что не прилетает только Hid-report, так что обязательно найду, в чем дело.

А вы разбейте код на 2 объектных файла, второй собирайте без оптимизаций и тупо дампьте память объектов в UART.


А так вообще gcc позволяет -g -Os, тогда будет оптимизированный код и отладочная информация, но т.к. код оптимизированный привязка к исходникам будет приблизительная.

Хм, никогда не миксовал разные настройки компилятора для разных объектных файлов в одном проекте, интересное предложение, спасибо).
Сейчас покопался в 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-редакторе открыл итоговую прошивку, массив там присутствует, так что текущее решение надо признать костылём и разбираться дальше.

А в чем проблема? Это же данные уходящие на хост, как их можно из прошивки выкинуть?

Это было одно из предположений (почему-то ведь не работает с constexpr), но неверное, как оказалось.

Здорово.
Вот бы еще HidReport байты обернуть в классы чтоб можно было по человечески редактировать.

Думал об этом, но пока остановился на таком варианте с оглядкой на HID Descriptor tool. Сделал в этой утилите report, вставил целиком в код.
Его в классы особо не обернуть. Это пары тэг-значение. В лучшем случае — набор «классов» той же структуры. Я думаю попробовать подобное реализовать на макросах. Что-то вроде
USAGE( KEYBOARD ),
  REPORT_ID( 1 ),
  USAGE_PAGE( KEYCODES ),
  USAGE_MINMAX( 0, 101 ),
...

Но без знания об устройстве подобных дескрипторов это не сильно поможет. Хех, примерно этим я сейчас и занимаюсь — пытаюсь понять как оно устроено.
Ну почему же, я так это примерно вижу: составить много небольших классов, а окончательный дескриптор собирать как раз-таки с помощью variadic-ов. Делать все на макросах не хочется (собственно, присоединяюсь в этом вопросе к вашему оппоненту на radiokot-е. Вы осилили USB на чистых регистрах, с таким уровнем вникнуть в C++ с его фишками для вас будет несложно).
А думаете почему для нескольких стандартных дескрипторов (даже не для всех!) прописали классы, а для HID — нет? Потому что уж слишком они гибкие. Вы можете нарисовать клавиатуру с 10 кнопками, колесиком и индикатором камеры, к примеру. Да еще совмещенную с джойстком управления танком и космолетом. Честное слово, в стандарте USB есть специальные коды для подобных джойстиков.
Вы осилили USB на чистых регистрах, с такими способностями вникнуть в C++ с его фишками для вас будет несложно
Потому и осилил, что интересуюсь не абстракциями над абстракциями, а именно низким уровнем. С++ объективно сложнее Си, значит и код, на нем написанный, поймет меньшее число людей. Код из моих примеров поймет даже программист на паскале (если они под stm бывают) или ассемблере.
А на С++ мне переходить чтобы что? Вон VladislavS с радиокота показывал свои дескрипторы, написанные на С++. Писать сложнее, менять сложнее, а преимуществ ни одного.
Согласен, что все очень гибко. Поэтому и остановился на варианте «Вставь дескриптор целиком». Хотя HID Descriptor tool мне очень не понравилась, хотелось бы увидеть графическую утилиту с понятным интерфейсом, желательно с кнопками типа «Добавить->Джойстик танка Т-72», а не как сейчас.
Джойстик танка Т-72
Все же не настолько подробно там расписано :)
Хотя глянуть в документацию все-таки рекомендую — одно перечисление вариатов джойстиков лично меня заставило долго смеяться.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.