Опрос USB геймпада
- Войдите на сайт для отправки комментариев
Добрый день!
Есть USB геймпад, подключенный к stm32f4discovery через OTG. Опрос кнопок происходит по такой схеме:
if (Appli_state == APPLICATION_READY) { HID_LOGITECH_F710_Info_TypeDef *logitech_f710_info; logitech_f710_info = USBH_HID_GetLogitech_F710_Info(&hUsbHostFS); if (logitech_f710_info != NULL) { Обработка кнопок(); } }
С кнопками все работает как надо, проблема с обработкой стиков. Условие if (logitech_f710_info != NULL) означает, что когда ничего не нажато, ничего и не будет происходить. Мне нужно сделать так, чтобы когда я нажал стик вверх, начал выполняться код, а когда отпусил стик - код переставал выполняться. Код, который должен выполняться пока нажат стик представляет собой расчет данных (расчет зависит от переменной) и дальше отправка этих данных по УАРТ. Причем эта отправка должна происходить именно пока нажат и удерживается стик (грубо говоря код зациклен). Проблема состоит в том, что когда я НАЖАЛ стик, данные в стуктуре logitech_f710_info изменились, а когда я продолжаю УДЕРЖИВАТЬ стик, данные не изменяются, поэтому я не попадаю в условие if (logitech_f710_info != NULL). Значение стика остается таким, какое было при нажатии. Если зациклить нужный код с помощью while, то как отследить отпускание стика? Может быть есть способ как решить без использования while?
Вот структура функции обработки стика:
Получается при нажатии на стик выполняется первый блок if, а дальше просто не попадает в условие if (logitech_f710_info != NULL).
nanotroll,
скажите пожалуйста, какую библиотеку Вы используёте? Можно полный скетч глянуть, сл ссылкой на библиотеку, где Вы её брали?
Я не нанотроль, но полагаю, что ее зовут "STM32 USB host library"
Да, именно так, STM32 USB host library. Полный код могу выложить, но там много лишнего.
А на чём Вы её гоняете?
Можно ссылку на библиотеку?
Плата stm32f4discovery настроена как usb хост, там контроллер stm32f407vg. Библиотека http://www.st.com/en/embedded-software/stsw-stm32046.html.
Добрый день!
Пока нашел такое решение: в функции обработки стиков выставляю соответствующие переменные-флаги (нажат - отжат). Запускаю таймер, в обработчике прерывания по сравнению по флагам запускается функция отправки данных. Функция обработки стиков:
Обработчик прерывания таймера:
Функции moveToGaitPositions() и moveToStandingPositions() считают и заполняют массивы данными, которые потом отправляются по uart. Функция формирования строки и отправки по uart: