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
31
35
36
37
41
42
43
47
48
54
55
56
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
85
91
92
97
98
99
100
101
102
103
104
105
112
113
114
115
116
117
118
119
137
138
139
140
162
169
177
185
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
207
211
212
218
241
242
247
263
264
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
303
304
305
306
307
308
309
310
315
316
317
318
319
320
321
322
323
324
325
326
327
328
332
336
337
341
345
346
350
354
355
356
357
358
363
/* ... */
#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(26, (uint8_t *)"Use [Joystick Left/Right] to scroll up/down");
BSP_LCD_DisplayStringAtLine(27, (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(28, menu [0]);
BSP_LCD_SetBackColor(LCD_COLOR_BLUE);
BSP_LCD_DisplayStringAtLine(29, menu [1]);
break;
case 0:
case 1:
BSP_LCD_SetBackColor(LCD_COLOR_BLUE);
BSP_LCD_DisplayStringAtLine(28, menu [0]);
BSP_LCD_SetBackColor(LCD_COLOR_MAGENTA);
BSP_LCD_DisplayStringAtLine(29, 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) { ... }
}{ ... }