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
31
32
40
41
45
46
47
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
77
78
79
80
81
82
83
84
85
86
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
114
116
117
118
119
120
121
136
137
138
139
140
141
142
143
147
148
149
150
151
152
153
154
155
156
157
158
159
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
186
187
188
189
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
232
233
234
235
236
241
265
266
271
272
273
274
275
276
277
278
279
280
281
286
287
288
289
290
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
318
319
320
321
322
323
324
325
326
327
331
332
333
338
/* ... */
#include "main.h"
Includes
uint32_t audio_flag = 0;
FILELIST_FileTypeDef file_list;
extern uint8_t prev_select;
AUDIO_DEMO_SelectMode audio_select_mode;
AUDIO_DEMO_StateMachine audio_demo;
AUDIO_PLAYBACK_StateTypeDef audio_state;
uint8_t *AUDIO_main_menu[] = {
(uint8_t *)
" 1 - Explore audio file ",
(uint8_t *)
" 2 - Start audio Player ",
(uint8_t *)
" 3 - Re-Enumerate ",
...};
Private variables
static uint8_t Audio_ShowWavFiles(void);
static void LCD_ClearTextZone(void);
Private function prototypes
/* ... */
void AUDIO_MenuProcess(void)
{
switch (audio_demo.state)
{
case AUDIO_DEMO_IDLE:
BSP_LCD_SetTextColor(LCD_COLOR_GREEN);
BSP_LCD_DisplayStringAtLine(16,
(uint8_t *)
" ");
BSP_LCD_DisplayStringAtLine(17,
(uint8_t *)
"Use [Buttons Left/Right] to scroll up/down ");
BSP_LCD_DisplayStringAtLine(18,
(uint8_t *)
"Use [Joystick Up/Down] to scroll audio menu ");
BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
AUDIO_MenuSelectItem(AUDIO_main_menu, 0);
audio_demo.state = AUDIO_DEMO_WAIT;
audio_demo.select = 0;
break;
case AUDIO_DEMO_IDLE:
case AUDIO_DEMO_WAIT:
if (audio_demo.select != prev_select)
{
prev_select = audio_demo.select;
AUDIO_MenuSelectItem(AUDIO_main_menu, audio_demo.select & 0x7F);
if (audio_demo.select & 0x80)
{
audio_demo.select &= 0x7F;
switch (audio_demo.select)
{
case 0:
audio_demo.state = AUDIO_DEMO_EXPLORE;
break;
case 0:
case 1:
BSP_LCD_SetTextColor(LCD_COLOR_GREEN);
BSP_LCD_DisplayStringAtLine(14,
(uint8_t *)
" ");
BSP_LCD_DisplayStringAtLine(15,
(uint8_t *)
" ");
BSP_LCD_DisplayStringAtLine(16,
(uint8_t *)
"Use [User Key] To Stop and return from player");
BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
audio_state = AUDIO_STATE_IDLE;
audio_demo.state = AUDIO_DEMO_PLAYBACK;
Audio_ChangeSelectMode(AUDIO_PLAYBACK_CONTROL);
break;
case 1:
case 2:
audio_demo.state = AUDIO_REENUMERATE;
break;
case 2:
default:
break;default
}switch (audio_demo.select) { ... }
}if (audio_demo.select & 0x80) { ... }
}if (audio_demo.select != prev_select) { ... }
break;
case AUDIO_DEMO_WAIT:
case AUDIO_DEMO_EXPLORE:
if (Appli_state == APPLICATION_AUDIO)
{
if (Audio_ShowWavFiles() > 0)
{
LCD_ErrLog("There is no WAV file on the microSD.\n");
Audio_ChangeSelectMode(AUDIO_SELECT_MENU);
}if (Audio_ShowWavFiles() > 0) { ... }
else
{
audio_demo.state = AUDIO_DEMO_WAIT;
}else { ... }
}if (Appli_state == APPLICATION_AUDIO) { ... }
break;
case AUDIO_DEMO_EXPLORE:
case AUDIO_DEMO_PLAYBACK:
if (Appli_state == APPLICATION_AUDIO)
{
if (audio_state == AUDIO_STATE_IDLE)
{
audio_state = AUDIO_STATE_INIT;
if (AUDIO_Start(0) == AUDIO_ERROR_IO)
{
Audio_ChangeSelectMode(AUDIO_SELECT_MENU);
}if (AUDIO_Start(0) == AUDIO_ERROR_IO) { ... }
else
{
BSP_LCD_SetTextColor(LCD_COLOR_YELLOW);
BSP_LCD_DisplayStringAtLine(10, (uint8_t *) "[ UP ] : Volume +");
BSP_LCD_DisplayStringAtLine(11, (uint8_t *) "[ DOWN ] : Volume -");
BSP_LCD_DisplayStringAtLine(12, (uint8_t *) "[ LEFT ] : Previous");
BSP_LCD_DisplayStringAtLine(13, (uint8_t *) "[ RIGHT ] : Next");
BSP_LCD_DisplayStringAtLine(14,
(uint8_t *) "[ SEL ] : Pause/Resume");
BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
}else { ... }
}if (audio_state == AUDIO_STATE_IDLE) { ... }
else
{
if (AUDIO_Process() == AUDIO_ERROR_IO)
{
Audio_ChangeSelectMode(AUDIO_SELECT_MENU);
}if (AUDIO_Process() == AUDIO_ERROR_IO) { ... }
}else { ... }
}if (Appli_state == APPLICATION_AUDIO) { ... }
break;
case AUDIO_DEMO_PLAYBACK:
case AUDIO_REENUMERATE:
USBH_Stop(&hUSBHost);
USBH_DeInit(&hUSBHost);
USBH_Start(&hUSBHost);
audio_demo.state = AUDIO_DEMO_WAIT;
break;
case AUDIO_REENUMERATE:
default:
break;default
}switch (audio_demo.state) { ... }
}{ ... }
/* ... */
void AUDIO_MenuSelectItem(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(19, menu[0]);
BSP_LCD_SetBackColor(LCD_COLOR_BLUE);
BSP_LCD_DisplayStringAtLine(20, menu[1]);
BSP_LCD_DisplayStringAtLine(21, menu[2]);
break;
case 0:
case 1:
BSP_LCD_SetBackColor(LCD_COLOR_BLUE);
BSP_LCD_DisplayStringAtLine(19, menu[0]);
BSP_LCD_SetBackColor(LCD_COLOR_MAGENTA);
BSP_LCD_DisplayStringAtLine(20, menu[1]);
BSP_LCD_SetBackColor(LCD_COLOR_BLUE);
BSP_LCD_DisplayStringAtLine(21, menu[2]);
break;
case 1:
case 2:
BSP_LCD_SetBackColor(LCD_COLOR_BLUE);
BSP_LCD_DisplayStringAtLine(19, menu[0]);
BSP_LCD_DisplayStringAtLine(20, menu[1]);
BSP_LCD_SetBackColor(LCD_COLOR_MAGENTA);
BSP_LCD_DisplayStringAtLine(21, menu[2]);
break;
case 2:
default:
BSP_LCD_SetBackColor(LCD_COLOR_BLUE);
BSP_LCD_DisplayStringAtLine(19, menu[0]);
BSP_LCD_DisplayStringAtLine(20, menu[1]);
BSP_LCD_DisplayStringAtLine(21, menu[2]);
break;default
}switch (item) { ... }
BSP_LCD_SetBackColor(LCD_COLOR_BLACK);
}{ ... }
/* ... */
void AUDIO_MenuProbeKey(JOYState_TypeDef state)
{
if (audio_select_mode == AUDIO_SELECT_MENU)
{
if ((state == JOY_UP) && (audio_demo.select > 0))
{
audio_demo.select--;
}if ((state == JOY_UP) && (audio_demo.select > 0)) { ... }
else if ((audio_demo.select < 2) && (state == JOY_DOWN))
{
audio_demo.select++;
}else if ((audio_demo.select < 2) && (state == JOY_DOWN)) { ... }
else if (state == JOY_SEL)
{
audio_demo.select |= 0x80;
}else if (state == JOY_SEL) { ... }
}if (audio_select_mode == AUDIO_SELECT_MENU) { ... }
else
{
AUDIO_PlaybackProbeKey(state);
}else { ... }
}{ ... }
/* ... */
void Audio_ChangeSelectMode(AUDIO_DEMO_SelectMode select_mode)
{
if (select_mode == AUDIO_SELECT_MENU)
{
AUDIO_MenuSelectItem(AUDIO_main_menu, 0x00);
LCD_ClearTextZone();
LCD_LOG_UpdateDisplay();
audio_demo.state = AUDIO_DEMO_IDLE;
AUDIO_Stop();
}if (select_mode == AUDIO_SELECT_MENU) { ... }
else if (select_mode == AUDIO_PLAYBACK_CONTROL)
{
LCD_ClearTextZone();
AUDIO_MenuSelectItem(AUDIO_main_menu, 0xFF);
}else if (select_mode == AUDIO_PLAYBACK_CONTROL) { ... }
audio_select_mode = select_mode;
audio_demo.select = 0;
}{ ... }
/* ... */
static uint8_t Audio_ShowWavFiles(void)
{
uint8_t i;
uint8_t line_idx = 0;
if ((FileList.ptr > 0) && (BSP_SD_IsDetected()))
{
BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
LCD_UsrLog("audio file(s) [ROOT]:\n\n");
for (i = 0; i < FileList.ptr; i++)
{
line_idx++;
if (line_idx > 9)
{
line_idx = 0;
LCD_UsrLog("> Press [Key] To Continue.\n");
while (BSP_PB_GetState(BUTTON_KEY) != RESET)
{
}while (BSP_PB_GetState(BUTTON_KEY) != RESET) { ... }
}if (line_idx > 9) { ... }
LCD_DbgLog(" |__");
LCD_DbgLog((char *)FileList.file[i].name);
LCD_DbgLog("\n");
}for (i = 0; i < FileList.ptr; i++) { ... }
BSP_LCD_SetTextColor(LCD_COLOR_WHITE);
LCD_UsrLog("\nEnd of files list.\n");
return 0;
}if ((FileList.ptr > 0) && (BSP_SD_IsDetected())) { ... }
else
{
return 1;
}else { ... }
}{ ... }
/* ... */
static void LCD_ClearTextZone(void)
{
uint8_t i = 0;
for (i = 0; i < 12; i++)
{
BSP_LCD_ClearStringLine(i + 3);
}for (i = 0; i < 12; i++) { ... }
}{ ... }