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
32
33
34
39
40
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
77
78
79
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
101
103
104
105
106
107
108
123
124
125
126
127
128
129
130
134
135
136
137
138
139
140
141
142
143
144
145
152
153
154
155
161
163
164
165
166
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
209
210
211
212
213
218
242
243
248
249
250
251
252
253
254
255
256
257
258
263
264
265
266
267
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
295
296
297
298
299
300
301
302
303
304
308
309
310
315
/* ... */
#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(14, (uint8_t *)" ");
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 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 Tamper] 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_ReEnumerate(&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(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_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);
}{ ... }
/* ... */
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 [Tamper] To Continue.\n");
while(BSP_PB_GetState(BUTTON_TAMPER) != SET)
{
}while (BSP_PB_GetState(BUTTON_TAMPER) != SET) { ... }
}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++) { ... }
}{ ... }