1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
21
22
23
24
25
26
27
28
29
30
34
35
36
40
41
42
46
47
53
54
55
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
84
90
91
96
97
98
99
100
101
102
103
104
111
112
113
114
115
116
117
118
136
137
138
139
161
168
176
184
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
206
210
211
217
240
241
246
262
263
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
302
303
304
305
306
307
308
313
314
315
316
317
318
319
320
321
322
323
324
325
326
330
334
335
339
343
344
348
352
353
354
355
356
361
/* ... */
#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(15, (uint8_t *)"Use [Joystick Left/Right] to scroll up/down");
BSP_LCD_DisplayStringAtLine(16, (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(18, menu[0]);
BSP_LCD_SetBackColor(LCD_COLOR_BLUE);
BSP_LCD_DisplayStringAtLine(19, menu[1]);
break;
case 0:
case 1:
BSP_LCD_SetBackColor(LCD_COLOR_BLUE);
BSP_LCD_DisplayStringAtLine(18, menu[0]);
BSP_LCD_SetBackColor(LCD_COLOR_MAGENTA);
BSP_LCD_DisplayStringAtLine(19, 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 == MFX_IRQOUT_PIN)
{
/* ... */
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 == MFX_IRQOUT_PIN) { ... }
}{ ... }
/* ... */
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) { ... }
}{ ... }