1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
21
30
31
32
36
37
38
39
44
45
46
47
48
49
50
51
52
53
54
55
56
57
62
63
64
65
66
72
109
123
137
141
145
152
159
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
187
204
205
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
254
255
256
257
258
263
264
265
266
267
268
269
270
271
272
273
274
287
288
289
290
291
/* ... */
#include "main.h"
Includes
uint8_t *DEMO_main_menu[] =
{
(uint8_t *)" 1 - Mass Storage demo ",
(uint8_t *)" 2 - Humain Interface demo ",
(uint8_t *)" 3 - Re-Enumerate MSC ",
(uint8_t *)" 4 - Re-Enumerate HID ",
...};
Private typedef
uint8_t prev_select = 0;
DEMO_StateMachine demo;
Private variables
/* ... */
void DUAL_MenuInit(void)
{
LCD_UsrLogY("USB Host Full speed initialized.\n");
LCD_UsrLogY("USB Host High speed initialized.\n");
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 DUAL menu");
Demo_SelectItem(DEMO_main_menu, 0);
}{ ... }
/* ... */
void DUAL_MenuProcess(void)
{
switch(demo.state)
{
case DEMO_IDLE:
Demo_SelectItem(DEMO_main_menu, 0);
LCD_UsrLog("Select an operation to continue.\n");
demo.state = DEMO_WAIT;
demo.select = 0;
break;case DEMO_IDLE:
case DEMO_WAIT:
if(demo.select != prev_select)
{
prev_select = demo.select;
Demo_SelectItem(DEMO_main_menu, demo.select & 0x7F);
if(demo.select & 0x80)
{
demo.select &= 0x7F;
switch(demo.select)
{
case 0:
demo.state = DEMO_MSC_START;
break;
case 0:
case 1:
demo.state = DEMO_HID_START;
break;
case 1:
case 2:
demo.state = DEMO_MSC_REENUMERATE;
break;
case 2:
case 3:
demo.state = DEMO_HID_REENUMERATE;
break;
case 3:
default:
break;default
}switch (demo.select) { ... }
}if (demo.select & 0x80) { ... }
}if (demo.select != prev_select) { ... }
break;
case DEMO_WAIT:
case DEMO_MSC_START:
if(Appli_HS_state == APPLICATION_HS_READY)
{
demo.state = DEMO_MSC;
demo.msc_state = APPLI_MSC_IDLE;
}if (Appli_HS_state == APPLICATION_HS_READY) { ... }
else
{
LCD_ErrLog("No Mass storage device connected.\n");
demo.state = DEMO_WAIT;
}else { ... }
break;
case DEMO_MSC_START:
case DEMO_HID_START:
if(Appli_FS_state == APPLICATION_FS_READY)
{
demo.state = DEMO_HID;
demo.hid_state = APPLI_HID_IDLE;
}if (Appli_FS_state == APPLICATION_FS_READY) { ... }
else
{
LCD_ErrLog("No HID device connected.\n");
demo.state = DEMO_WAIT;
}else { ... }
break;
case DEMO_HID_START:
case DEMO_MSC:
MSC_MenuProcess();
break;
case DEMO_MSC:
case DEMO_HID:
HID_MenuProcess();
break;
case DEMO_HID:
case DEMO_MSC_REENUMERATE:
LCD_DbgLog("Starting Enumeration MSC....");
LCD_DbgLog("\n");
USBH_ReEnumerate(&hUSBHost_HS);
demo.state = DEMO_WAIT;
break;
case DEMO_MSC_REENUMERATE:
case DEMO_HID_REENUMERATE:
LCD_DbgLog("Starting Enumeration HID....");
LCD_DbgLog("\n");
USBH_ReEnumerate(&hUSBHost_FS);
demo.state = DEMO_WAIT;
break;
case DEMO_HID_REENUMERATE:
default:
break;default
}switch (demo.state) { ... }
if(Appli_FS_state == APPLICATION_FS_DISCONNECT)
{
Appli_FS_state = APPLICATION_IDLE;
LCD_LOG_ClearTextZone();
LCD_ErrLog("device FS disconnected!\n");
demo.state = DEMO_IDLE;
demo.select = 0;
}if (Appli_FS_state == APPLICATION_FS_DISCONNECT) { ... }
if(Appli_HS_state == APPLICATION_HS_DISCONNECT)
{
Appli_HS_state = APPLICATION_IDLE;
LCD_LOG_ClearTextZone();
LCD_ErrLog("device HS disconnected!\n");
demo.state = DEMO_IDLE;
demo.select = 0;
}if (Appli_HS_state == APPLICATION_HS_DISCONNECT) { ... }
}{ ... }
/* ... */
void Demo_ProbeKey(JOYState_TypeDef state)
{
if((state == JOY_UP) && (demo.select > 0))
{
demo.select--;
}if ((state == JOY_UP) && (demo.select > 0)) { ... }
else if(((demo.state == DEMO_WAIT) && (state == JOY_DOWN) && (demo.select < 3)) ||
((demo.state == DEMO_MSC) && (state == JOY_DOWN) && (demo.select < 2)) ||
((demo.state == DEMO_HID) && (state == JOY_DOWN) && (demo.select < 1)))
{
demo.select++;
}else if (((demo.state == DEMO_WAIT) && (state == JOY_DOWN) && (demo.select < 3)) || ((demo.state == DEMO_MSC) && (state == JOY_DOWN) && (demo.select < 2)) || ((demo.state == DEMO_HID) && (state == JOY_DOWN) && (demo.select < 1))) { ... }
else if(state == JOY_SEL)
{
demo.select |= 0x80;
}else if (state == JOY_SEL) { ... }
}{ ... }
/* ... */
void Demo_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(17, menu[0]);
BSP_LCD_SetBackColor(LCD_COLOR_BLUE);
BSP_LCD_DisplayStringAtLine(18, menu[1]);
BSP_LCD_DisplayStringAtLine(19, menu[2]);
break;
case 0:
case 1:
BSP_LCD_SetBackColor(LCD_COLOR_BLUE);
BSP_LCD_DisplayStringAtLine(17, menu[0]);
BSP_LCD_SetBackColor(LCD_COLOR_MAGENTA);
BSP_LCD_DisplayStringAtLine(18, menu[1]);
BSP_LCD_SetBackColor(LCD_COLOR_BLUE);
BSP_LCD_DisplayStringAtLine(19, menu[2]);
break;
case 1:
case 2:
BSP_LCD_SetBackColor(LCD_COLOR_BLUE);
BSP_LCD_DisplayStringAtLine(17, menu[0]);
BSP_LCD_SetBackColor(LCD_COLOR_BLUE);
BSP_LCD_DisplayStringAtLine(18, menu[1]);
BSP_LCD_SetBackColor(LCD_COLOR_MAGENTA);
BSP_LCD_DisplayStringAtLine(19, menu[2]);
break;
case 2:
case 3:
BSP_LCD_SetBackColor(LCD_COLOR_BLUE);
BSP_LCD_DisplayStringAtLine(17, menu[1]);
BSP_LCD_SetBackColor(LCD_COLOR_BLUE);
BSP_LCD_DisplayStringAtLine(18, menu[2]);
BSP_LCD_SetBackColor(LCD_COLOR_MAGENTA);
BSP_LCD_DisplayStringAtLine(19, menu[3]);
break;
case 3:
default:
break;default
}switch (item) { ... }
BSP_LCD_SetBackColor(LCD_COLOR_BLACK);
}{ ... }
/* ... */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
static JOYState_TypeDef JoyState = JOY_NONE;
if(GPIO_Pin == GPIO_PIN_2)
{
JoyState = BSP_JOY_GetState();
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(JOY_ALL_PINS);
}if (GPIO_Pin == GPIO_PIN_2) { ... }
}{ ... }