1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
22
23
24
25
26
27
28
29
30
36
37
43
44
50
51
57
58
59
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
93
99
100
105
106
107
108
109
110
111
112
113
120
121
122
123
124
125
126
127
145
146
147
148
170
177
185
193
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
215
219
220
226
249
250
255
271
272
277
278
279
280
281
282
283
284
285
286
287
288
301
302
303
304
305
306
307
312
313
314
315
316
317
318
319
320
321
322
323
324
325
329
333
334
338
342
343
347
351
352
353
354
355
360
/* ... */
#include "main.h"
Includes
HID_DEMO_StateMachine hid_demo;
uint8_t prev_select = 0;
osSemaphoreId MenuEvent;
uint8_t *DEMO_KEYBOARD_menu[] = {
(uint8_t *)
" 1 - Start Keyboard / Clear ",
(uint8_t *)
" 2 - Return ",
...};
uint8_t *DEMO_MOUSE_menu[] = {
(uint8_t *)
" 1 - Start Mouse / Re-Initialize ",
(uint8_t *)
" 2 - Return ",
...};
uint8_t *DEMO_HID_menu[] = {
(uint8_t *)
" 1 - Start HID ",
(uint8_t *)
" 2 - Re-Enumerate ",
...};
Private variables
static void HID_DEMO_ProbeKey(JOYState_TypeDef state);
static void USBH_MouseDemo(USBH_HandleTypeDef * phost);
static void USBH_KeybdDemo(USBH_HandleTypeDef * phost);
static void HID_MenuThread(void const *argument);
Private function prototypes
/* ... */
void HID_MenuInit(void)
{
osSemaphoreDef(osSem);
MenuEvent = osSemaphoreCreate(osSemaphore(osSem), 1);
osSemaphoreRelease(MenuEvent);
osThreadDef(Menu_Thread, HID_MenuThread, osPriorityHigh, 0,
8 * configMINIMAL_STACK_SIZE);
osThreadCreate(osThread(Menu_Thread), NULL);
BSP_LCD_SetTextColor(LCD_COLOR_GREEN);
BSP_LCD_DisplayStringAtLine(18,
(uint8_t *)
"Use [Joystick Left/Right] to scroll up/down");
BSP_LCD_DisplayStringAtLine(19,
(uint8_t *)
"Use [Joystick Up/Down] to scroll HID menu");
}{ ... }
/* ... */
void HID_UpdateMenu(void)
{
hid_demo.state = HID_DEMO_IDLE;
osSemaphoreRelease(MenuEvent);
}{ ... }
/* ... */
void HID_MenuThread(void const *argument)
{
for (;;)
{
if (osSemaphoreWait(MenuEvent, osWaitForever) == osOK)
{
switch (hid_demo.state)
{
case HID_DEMO_IDLE:
HID_SelectItem(DEMO_HID_menu, 0);
hid_demo.state = HID_DEMO_WAIT;
hid_demo.select = 0;
osSemaphoreRelease(MenuEvent);
break;
case HID_DEMO_IDLE:
case HID_DEMO_WAIT:
if (hid_demo.select != prev_select)
{
prev_select = hid_demo.select;
HID_SelectItem(DEMO_HID_menu, hid_demo.select & 0x7F);
if (hid_demo.select & 0x80)
{
switch (hid_demo.select & 0x7F)
{
case 0:
hid_demo.state = HID_DEMO_START;
osSemaphoreRelease(MenuEvent);
break;
case 0:
case 1:
hid_demo.state = HID_DEMO_REENUMERATE;
osSemaphoreRelease(MenuEvent);
break;
case 1:
default:
break;default
}switch (hid_demo.select & 0x7F) { ... }
}if (hid_demo.select & 0x80) { ... }
}if (hid_demo.select != prev_select) { ... }
break;
case HID_DEMO_WAIT:
case HID_DEMO_START:
if (Appli_state == APPLICATION_READY)
{
if (USBH_HID_GetDeviceType(&hUSBHost) == HID_KEYBOARD)
{
hid_demo.keyboard_state = HID_KEYBOARD_IDLE;
hid_demo.state = HID_DEMO_KEYBOARD;
}if (USBH_HID_GetDeviceType(&hUSBHost) == HID_KEYBOARD) { ... }
else if (USBH_HID_GetDeviceType(&hUSBHost) == HID_MOUSE)
{
hid_demo.mouse_state = HID_MOUSE_IDLE;
hid_demo.state = HID_DEMO_MOUSE;
}else if (USBH_HID_GetDeviceType(&hUSBHost) == HID_MOUSE) { ... }
}if (Appli_state == APPLICATION_READY) { ... }
else
{
LCD_ErrLog("No supported HID device!\n");
hid_demo.state = HID_DEMO_WAIT;
}else { ... }
osSemaphoreRelease(MenuEvent);
break;
case HID_DEMO_START:
case HID_DEMO_REENUMERATE:
USBH_ReEnumerate(&hUSBHost);
hid_demo.state = HID_DEMO_WAIT;
osSemaphoreRelease(MenuEvent);
break;
case HID_DEMO_REENUMERATE:
case HID_DEMO_MOUSE:
if (Appli_state == APPLICATION_READY)
{
HID_MouseMenuProcess();
USBH_MouseDemo(&hUSBHost);
}if (Appli_state == APPLICATION_READY) { ... }
break;
case HID_DEMO_MOUSE:
case HID_DEMO_KEYBOARD:
if (Appli_state == APPLICATION_READY)
{
HID_KeyboardMenuProcess();
USBH_KeybdDemo(&hUSBHost);
}if (Appli_state == APPLICATION_READY) { ... }
break;
case HID_DEMO_KEYBOARD:
default:
break;default
}switch (hid_demo.state) { ... }
if (Appli_state == APPLICATION_DISCONNECT)
{
Appli_state = APPLICATION_IDLE;
LCD_LOG_ClearTextZone();
LCD_ErrLog("HID device disconnected!\n");
hid_demo.state = HID_DEMO_IDLE;
hid_demo.select = 0;
}if (Appli_state == APPLICATION_DISCONNECT) { ... }
hid_demo.select &= 0x7F;
}if (osSemaphoreWait(MenuEvent, osWaitForever) == osOK) { ... }
}for (;;) { ... }
}{ ... }
/* ... */
void USBH_HID_EventCallback(USBH_HandleTypeDef * phost)
{
osSemaphoreRelease(MenuEvent);
}{ ... }
/* ... */
void HID_SelectItem(uint8_t ** menu, uint8_t item)
{
BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
switch (item)
{
case 0:
BSP_LCD_SetBackColor(LCD_COLOR_MAGENTA);
BSP_LCD_DisplayStringAtLine(20, menu[0]);
BSP_LCD_SetBackColor(LCD_COLOR_BLUE);
BSP_LCD_DisplayStringAtLine(21, menu[1]);
break;
case 0:
case 1:
BSP_LCD_SetBackColor(LCD_COLOR_BLUE);
BSP_LCD_DisplayStringAtLine(20, menu[0]);
BSP_LCD_SetBackColor(LCD_COLOR_MAGENTA);
BSP_LCD_DisplayStringAtLine(21, menu[1]);
BSP_LCD_SetBackColor(LCD_COLOR_BLUE);
break;case 1:
}switch (item) { ... }
BSP_LCD_SetBackColor(LCD_COLOR_BLACK);
}{ ... }
/* ... */
static void HID_DEMO_ProbeKey(JOYState_TypeDef state)
{
if ((state == JOY_UP) && (hid_demo.select > 0))
{
hid_demo.select--;
}if ((state == JOY_UP) && (hid_demo.select > 0)) { ... }
else if ((state == JOY_DOWN) && (hid_demo.select < 1))
{
hid_demo.select++;
}else if ((state == JOY_DOWN) && (hid_demo.select < 1)) { ... }
else if (state == JOY_SEL)
{
hid_demo.select |= 0x80;
}else if (state == JOY_SEL) { ... }
}{ ... }
/* ... */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
__IO JOYState_TypeDef JoyState = JOY_NONE;
if (GPIO_Pin == GPIO_PIN_8)
{
JoyState = BSP_JOY_GetState();
HID_DEMO_ProbeKey(JoyState);
switch (JoyState)
{
case JOY_LEFT:
LCD_LOG_ScrollBack();
break;
case JOY_LEFT:
case JOY_RIGHT:
LCD_LOG_ScrollForward();
break;
case JOY_RIGHT:
default:
break;default
}switch (JoyState) { ... }
BSP_IO_ITClear();
osSemaphoreRelease(MenuEvent);
}if (GPIO_Pin == GPIO_PIN_8) { ... }
}{ ... }
/* ... */
static void USBH_MouseDemo(USBH_HandleTypeDef * phost)
{
HID_MOUSE_Info_TypeDef *m_pinfo;
if (hid_demo.mouse_state != HID_MOUSE_START)
{
m_pinfo = USBH_HID_GetMouseInfo(phost);
if (m_pinfo != NULL)
{
USR_MOUSE_ProcessData(&mouse_info);
if (m_pinfo->buttons[0])
{
HID_MOUSE_ButtonPressed(0);
}if (m_pinfo->buttons[0]) { ... }
else
{
HID_MOUSE_ButtonReleased(0);
}else { ... }
if (m_pinfo->buttons[1])
{
HID_MOUSE_ButtonPressed(2);
}if (m_pinfo->buttons[1]) { ... }
else
{
HID_MOUSE_ButtonReleased(2);
}else { ... }
if (m_pinfo->buttons[2])
{
HID_MOUSE_ButtonPressed(1);
}if (m_pinfo->buttons[2]) { ... }
else
{
HID_MOUSE_ButtonReleased(1);
}else { ... }
}if (m_pinfo != NULL) { ... }
}if (hid_demo.mouse_state != HID_MOUSE_START) { ... }
}{ ... }
/* ... */
static void USBH_KeybdDemo(USBH_HandleTypeDef * phost)
{
HID_KEYBD_Info_TypeDef *k_pinfo;
char c;
if (hid_demo.keyboard_state != HID_KEYBOARD_START)
{
k_pinfo = USBH_HID_GetKeybdInfo(phost);
if (k_pinfo != NULL)
{
c = USBH_HID_GetASCIICode(k_pinfo);
if (c != 0)
{
USR_KEYBRD_ProcessData(c);
}if (c != 0) { ... }
}if (k_pinfo != NULL) { ... }
}if (hid_demo.keyboard_state != HID_KEYBOARD_START) { ... }
}{ ... }