1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
21
22
25
26
38
44
45
46
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
81
82
83
84
85
86
87
88
89
90
91
98
127
136
145
151
153
154
155
156
157
170
171
172
173
178
179
180
181
182
183
184
185
186
187
200
201
202
203
204
205
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
271
272
273
274
275
280
281
282
283
284
285
289
293
297
/* ... */
#include "main.h"
Includes
#define MENU_UPDATE_EVENT 0x10
Private define
MSC_DEMO_StateMachine msc_demo;
osSemaphoreId MenuEvent;
osSemaphoreId osJoySemaphore;
uint8_t *MSC_main_menu[] =
{
(uint8_t *)" 1 - File Operations ",
(uint8_t *)" 2 - Explorer Disk ",
(uint8_t *)" 3 - Re-Enumerate ",
...};
Private variables
static void MSC_SelectItem(uint8_t **menu, uint8_t item);
static void MSC_DEMO_ProbeKey(JOYState_TypeDef state);
void Joystick_MscMenu(void);
static void MSC_MenuThread(void const *argument);
Private function prototypes
/* ... */
void Menu_Init(void)
{
osSemaphoreDef(osSem);
MenuEvent = osSemaphoreCreate(osSemaphore(osSem), 1);
osSemaphoreRelease(MenuEvent);
osThreadDef(Menu_Thread, MSC_MenuThread, osPriorityHigh, 0, 8 * configMINIMAL_STACK_SIZE);
osThreadCreate(osThread(Menu_Thread), NULL);
osSemaphoreDef(JOY_SEM);
osJoySemaphore = osSemaphoreCreate(osSemaphore(JOY_SEM) , 1);
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 MSC menu");
}{ ... }
/* ... */
static void MSC_MenuThread(void const *argument)
{
uint32_t ITstatus = 0;
for(;;)
{
if(osSemaphoreWait(MenuEvent, 100) == osOK)
{
switch(msc_demo.state)
{
case MSC_DEMO_IDLE:
MSC_SelectItem(MSC_main_menu, 0);
msc_demo.state = MSC_DEMO_WAIT;
msc_demo.select = 0;
osSemaphoreRelease(MenuEvent);
break;
case MSC_DEMO_IDLE:
case MSC_DEMO_WAIT:
MSC_SelectItem(MSC_main_menu, msc_demo.select & 0x7F);
if(msc_demo.select & 0x80)
{
switch(msc_demo.select & 0x7F)
{
case 0:
msc_demo.state = MSC_DEMO_FILE_OPERATIONS;
osSemaphoreRelease(MenuEvent);
break;
case 0:
case 1:
msc_demo.state = MSC_DEMO_EXPLORER;
osSemaphoreRelease(MenuEvent);
break;
case 1:
case 2:
msc_demo.state = MSC_REENUMERATE;
osSemaphoreRelease(MenuEvent);
break;
case 2:
default:
break;default
}switch (msc_demo.select & 0x7F) { ... }
}if (msc_demo.select & 0x80) { ... }
break;
case MSC_DEMO_WAIT:
case MSC_DEMO_FILE_OPERATIONS:
if(Appli_state == APPLICATION_READY)
{
MSC_File_Operations();
}if (Appli_state == APPLICATION_READY) { ... }
msc_demo.state = MSC_DEMO_WAIT;
break;
case MSC_DEMO_FILE_OPERATIONS:
case MSC_DEMO_EXPLORER:
if(Appli_state == APPLICATION_READY)
{
Explore_Disk("0:/", 1);
}if (Appli_state == APPLICATION_READY) { ... }
msc_demo.state = MSC_DEMO_WAIT;
break;
case MSC_DEMO_EXPLORER:
case MSC_REENUMERATE:
USBH_ReEnumerate(&hUSBHost);
msc_demo.state = MSC_DEMO_WAIT;
break;
case MSC_REENUMERATE:
default:
break;default
}switch (msc_demo.state) { ... }
msc_demo.select &= 0x7F;
}if (osSemaphoreWait(MenuEvent, 100) == osOK) { ... }
if (osJoySemaphore != NULL)
{
if(osSemaphoreWait(osJoySemaphore , 0) == osOK)
{
ITstatus = BSP_IO_ITGetStatus(JOY_ALL_PINS);
if (ITstatus)
{
Joystick_MscMenu();
BSP_IO_ITClear();
}if (ITstatus) { ... }
}if (osSemaphoreWait(osJoySemaphore , 0) == osOK) { ... }
}if (osJoySemaphore != NULL) { ... }
}for (;;) { ... }
}{ ... }
/* ... */
void Joystick_MscMenu(void)
{
static JOYState_TypeDef JoyState = JOY_NONE;
JoyState = BSP_JOY_GetState();
MSC_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) { ... }
osSemaphoreRelease(MenuEvent);
}{ ... }
/* ... */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == MFX_IRQOUT_PIN)
{
/* ... */
osSemaphoreRelease(osJoySemaphore);
}if (GPIO_Pin == MFX_IRQOUT_PIN) { ... }
}{ ... }
/* ... */
static void MSC_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:
default:
BSP_LCD_SetBackColor(LCD_COLOR_BLUE);
BSP_LCD_DisplayStringAtLine(17, menu [0]);
BSP_LCD_DisplayStringAtLine(18, menu [1]);
BSP_LCD_DisplayStringAtLine(19, menu [2]);
break; default
}switch (item) { ... }
BSP_LCD_SetBackColor(LCD_COLOR_BLACK);
}{ ... }
/* ... */
static void MSC_DEMO_ProbeKey(JOYState_TypeDef state)
{
msc_demo.select &= 0x7F;
if((state == JOY_UP) && (msc_demo.select > 0))
{
msc_demo.select--;
}if ((state == JOY_UP) && (msc_demo.select > 0)) { ... }
else if((state == JOY_DOWN) && (msc_demo.select < 2))
{
msc_demo.select++;
}else if ((state == JOY_DOWN) && (msc_demo.select < 2)) { ... }
else if(state == JOY_SEL)
{
msc_demo.select |= 0x80;
}else if (state == JOY_SEL) { ... }
}{ ... }