7
7
#include <math.h>
8
8
#include <dirent.h>
9
9
#include <unistd.h>
10
- #include <ctype.h>
11
- #include <errno.h>
10
+ #include <ctype.h>
11
+ #include <errno.h>
12
12
13
13
/*
14
14
General
15
- */
15
+ */
16
16
#include "freertos/FreeRTOS.h"
17
17
#include "freertos/task.h"
18
18
#include "nvs_flash.h"
52
52
53
53
//{#pragma region Globals
54
54
#define WHITE 65535
55
- #define BLACK 0
55
+ #define BLACK 0
56
56
int OPTION = 0 ;
57
57
extern int ACTION = 0 ;
58
58
int OPTIONS = 3 ;
61
61
int x , y , w , h , i , size ;
62
62
uint16_t * buffer ;
63
63
bool INIT = false;
64
- bool SAVED = false;
64
+ bool SAVED = false;
65
65
bool forceConsoleReset ;
66
66
//}#pragma endregion Globals
67
67
72
72
int w ;
73
73
int h ;
74
74
} SCR ;
75
- SCR SCREEN = {0 ,0 ,320 ,240 };
75
+ SCR SCREEN = {0 ,0 ,320 ,240 };
76
76
77
77
typedef struct {
78
78
char label [20 ];
91
91
{"Resume Game" ,0 , 0 },
92
92
{"Restart Game" ,1 , 10 },
93
93
{"Save Game" ,3 , 25 },
94
- {"Exit Game" ,6 , 20 }
95
- };
96
- STATES STATE ;
94
+ {"Exit Game" ,6 , 20 }
95
+ };
96
+ STATES STATE ;
97
97
98
98
typedef struct {
99
99
int bg ;
125
125
{29614 ,52857 ,"light" }
126
126
};
127
127
THEME GUI ;
128
- //}#pragma endregion Structs
128
+ //}#pragma endregion Structs
129
129
130
130
//{#pragma region Sprites
131
131
const uint16_t FONT_5x7 [7 ][250 ] = {
@@ -206,7 +206,7 @@ const uint16_t FONT_5x7[7][250] = {
206
206
207
207
//{#pragma region Debounce
208
208
void debounce (int key ) {
209
- while (gamepad .values [key ]) odroid_input_gamepad_read (& gamepad );
209
+ while (gamepad .values [key ]) odroid_input_gamepad_read (& gamepad );
210
210
}
211
211
//}#pragma endregion Debounce
212
212
@@ -217,12 +217,12 @@ const uint16_t FONT_5x7[7][250] = {
217
217
ESP_ERROR_CHECK (nvs_flash_erase ());
218
218
err = nvs_flash_init ();
219
219
}
220
- ESP_ERROR_CHECK ( err );
220
+ ESP_ERROR_CHECK ( err );
221
221
nvs_handle handle ;
222
222
nvs_open ("storage" , NVS_READWRITE , & handle );
223
223
nvs_set_i8 (handle , "DELETE_SAVE" , del );
224
- nvs_commit (handle );
225
- nvs_close (handle );
224
+ nvs_commit (handle );
225
+ nvs_close (handle );
226
226
}
227
227
228
228
void hud_delete_save (char * file_to_delete ) {
@@ -231,7 +231,7 @@ const uint16_t FONT_5x7[7][250] = {
231
231
ESP_ERROR_CHECK (nvs_flash_erase ());
232
232
err = nvs_flash_init ();
233
233
}
234
- ESP_ERROR_CHECK ( err );
234
+ ESP_ERROR_CHECK ( err );
235
235
236
236
nvs_handle handle ;
237
237
err = nvs_open ("storage" , NVS_READWRITE , & handle );
@@ -244,28 +244,28 @@ const uint16_t FONT_5x7[7][250] = {
244
244
break ;
245
245
default :
246
246
DELETE_SAVE = 0 ;
247
- }
248
- nvs_close (handle );
249
- printf ("\nDELETE_SAVE:%d\n\n" , DELETE_SAVE );
247
+ }
248
+ nvs_close (handle );
249
+ printf ("\nDELETE_SAVE:%d\n\n" , DELETE_SAVE );
250
250
if (DELETE_SAVE == 1 ) {
251
251
hud_prepare_delete (0 );
252
252
struct stat st ;
253
- if (stat (file_to_delete , & st ) == 0 ) {
253
+ if (stat (file_to_delete , & st ) == 0 ) {
254
254
unlink (file_to_delete );
255
255
esp_restart ();
256
- }
257
- }
258
- }
256
+ }
257
+ }
258
+ }
259
259
260
260
void hud_check_saves (char * save_name ) {
261
261
char * dir = strrchr (save_name , '.' );
262
262
char save_dir [256 ] = "/sd/odroid/data/" ;
263
- strcat (& save_dir [strlen (save_dir ) - 1 ], dir + 1 );
264
- char file_to_delete [256 ] = "" ;
263
+ strcat (& save_dir [strlen (save_dir ) - 1 ], dir + 1 );
264
+ char file_to_delete [256 ] = "" ;
265
265
sprintf (file_to_delete , "%s/%s" , save_dir , save_name );
266
- strcat (& file_to_delete [strlen (file_to_delete ) - 1 ], ".sav" );
267
- DIR * directory ;
268
- directory = opendir (save_dir );
266
+ strcat (& file_to_delete [strlen (file_to_delete ) - 1 ], ".sav" );
267
+ DIR * directory ;
268
+ directory = opendir (save_dir );
269
269
if (directory == NULL ) {
270
270
perror ("opendir() error" );
271
271
} else {
@@ -278,14 +278,14 @@ const uint16_t FONT_5x7[7][250] = {
278
278
gets (tmp );
279
279
if (strcmp (save_name , tmp ) == 0 ) {
280
280
SAVED = true;
281
- printf ("\n******\nfile_to_delete:%s\nsave_name:%s\ntmp%s\n******\n" , file_to_delete , save_name , tmp );
281
+ printf ("\n******\nfile_to_delete:%s\nsave_name:%s\ntmp%s\n******\n" , file_to_delete , save_name , tmp );
282
282
hud_delete_save (file_to_delete );
283
283
}
284
- }
284
+ }
285
285
closedir (directory );
286
286
}
287
287
}
288
- //}#pragma endregion Files
288
+ //}#pragma endregion Files
289
289
290
290
//{#pragma region Text
291
291
int hud_letter (char letter ) {
@@ -346,7 +346,7 @@ const uint16_t FONT_5x7[7][250] = {
346
346
ESP_ERROR_CHECK (nvs_flash_erase ());
347
347
err = nvs_flash_init ();
348
348
}
349
- ESP_ERROR_CHECK ( err );
349
+ ESP_ERROR_CHECK ( err );
350
350
351
351
nvs_handle handle ;
352
352
err = nvs_open ("storage" , NVS_READWRITE , & handle );
@@ -360,10 +360,10 @@ const uint16_t FONT_5x7[7][250] = {
360
360
break ;
361
361
default :
362
362
USER = 0 ;
363
- }
363
+ }
364
364
nvs_close (handle );
365
365
}
366
- //}#pragma endregion Theme
366
+ //}#pragma endregion Theme
367
367
368
368
//{#pragma region Display
369
369
void hud_logo () {
@@ -376,18 +376,18 @@ const uint16_t FONT_5x7[7][250] = {
376
376
for (int c = 0 ; c < w ; c ++ ) {
377
377
buffer [i ] = logo [r ][c ] == 0 ? GUI .bg : GUI .fg ;
378
378
i ++ ;
379
- }
380
- }
381
- ili9341_write_frame_rectangleLE (x , y , w , h , buffer );
379
+ }
380
+ }
381
+ ili9341_write_frame_rectangleLE (x , y , w , h , buffer );
382
382
//hud_text(x,y+18,"In Game Menu",false,false);
383
- }
383
+ }
384
384
385
385
void hud_progress (char * string , bool bar ) {
386
386
hud_background ();
387
- hud_logo ();
387
+ hud_logo ();
388
388
w = strlen (string )* 5 ;
389
389
x = (SCREEN .w /2 )- (w /2 );
390
- y = (SCREEN .h /2 )- (h /2 );
390
+ y = (SCREEN .h /2 )- (h /2 );
391
391
hud_text (x ,y ,string ,false,false);
392
392
if (bar ) {
393
393
y += 10 ;
@@ -397,88 +397,91 @@ const uint16_t FONT_5x7[7][250] = {
397
397
}
398
398
ili9341_write_frame_rectangleLE (x + n , y , 1 , 5 , buffer );
399
399
usleep (15000 );
400
- }
400
+ }
401
401
}
402
- }
402
+ }
403
403
404
404
void hud_options () {
405
405
x = 16 ;
406
- y = 28 ;
406
+ y = 28 ;
407
407
w = 5 ;
408
408
h = 5 ;
409
409
i = 0 ;
410
410
int n ;
411
411
if (OPTIONS == 6 ) {
412
- for (n = 0 ; n < OPTIONS ; n ++ ) {
412
+ for (n = 0 ; n < OPTIONS ; n ++ ) {
413
413
STATE = WITHSAVE [n ];
414
414
y += 20 ;
415
415
for (int r = 0 ; r < 5 ; r ++ ){for (int c = 0 ; c < 5 ; c ++ ) {
416
416
buffer [i ] = icons [r + STATE .offset ][c ] == WHITE ? OPTION == n ? WHITE : GUI .fg : GUI .bg ;i ++ ;
417
417
}}
418
418
if (n == OPTIONS - 1 ) {y = 216 ;}
419
419
ili9341_write_frame_rectangleLE (x , y , w , h , buffer );
420
- hud_text (x + 10 ,y ,STATE .label ,false,OPTION == n ?true:false);
420
+ hud_text (x + 10 ,y ,STATE .label ,false,OPTION == n ?true:false);
421
421
i = 0 ;
422
422
}
423
423
STATE = WITHSAVE [OPTION ];
424
424
} else {
425
- for (n = 0 ; n < OPTIONS ; n ++ ) {
425
+ for (n = 0 ; n < OPTIONS ; n ++ ) {
426
426
STATE = WITHOUTSAVE [n ];
427
427
y += 20 ;
428
428
for (int r = 0 ; r < 5 ; r ++ ){for (int c = 0 ; c < 5 ; c ++ ) {
429
429
buffer [i ] = icons [r + STATE .offset ][c ] == WHITE ? OPTION == n ? WHITE : GUI .fg : GUI .bg ;i ++ ;
430
430
}}
431
431
if (n == OPTIONS - 1 ) {y = 216 ;}
432
432
ili9341_write_frame_rectangleLE (x , y , w , h , buffer );
433
- hud_text (x + 10 ,y ,STATE .label ,false,OPTION == n ?true:false);
434
- i = 0 ;
435
- }
436
- STATE = WITHOUTSAVE [OPTION ];
433
+ hud_text (x + 10 ,y ,STATE .label ,false,OPTION == n ?true:false);
434
+ i = 0 ;
435
+ }
436
+ STATE = WITHOUTSAVE [OPTION ];
437
437
}
438
438
}
439
- //}#pragma endregion Display
439
+ //}#pragma endregion Display
440
440
441
441
//{#pragma region Init
442
- void hud_init () {
442
+ void hud_init () {
443
443
if (!INIT ) {
444
444
size = 320 * 30 * sizeof (uint16_t );
445
- buffer = (uint16_t * )malloc (size );
446
- if (!buffer ) abort ();
447
- OPTION = 0 ;
445
+ buffer = (uint16_t * )malloc (size );
446
+ if (!buffer ) abort ();
447
+ OPTION = 0 ;
448
448
OPTIONS = SAVED ? 6 : 4 ;
449
449
hud_theme ();
450
450
GUI = THEMES [USER ];
451
- STATE = OPTIONS == 6 ? WITHSAVE [OPTION ] : WITHOUTSAVE [OPTION ];
451
+ STATE = OPTIONS == 6 ? WITHSAVE [OPTION ] : WITHOUTSAVE [OPTION ];
452
452
INIT = true;
453
- }
453
+ }
454
454
}
455
455
456
456
void hud_deinit () {
457
457
size = 0 ;
458
- buffer = realloc (buffer , size );
458
+ buffer = realloc (buffer , size );
459
459
free (buffer );
460
460
INIT = false;
461
461
}
462
- //}#pragma endregion Init
462
+ //}#pragma endregion Init
463
463
464
464
//{#pragma region Menu
465
465
void hud_menu (void ) {
466
- int volume = odroid_audio_volume_get ();
466
+ int volume = odroid_audio_volume_get ();
467
+ #ifdef CONFIG_LCD_DRIVER_CHIP_RETRO_ESP32
468
+ volume = 4 ;
469
+ #endif
467
470
odroid_audio_terminate ();
468
- hud_init ();
471
+ hud_init ();
469
472
hud_debug ("HUD - MENU" );
470
473
hud_background ();
471
474
hud_logo ();
472
475
hud_options ();
473
476
while (1 ) {
474
477
475
- odroid_input_gamepad_read (& gamepad );
478
+ odroid_input_gamepad_read (& gamepad );
476
479
/*
477
480
UP
478
481
*/
479
482
if (gamepad .values [ODROID_INPUT_UP ]) {
480
483
OPTION -- ;
481
- if ( OPTION < 0 ) { OPTION = OPTIONS - 1 ; }
484
+ if ( OPTION < 0 ) { OPTION = OPTIONS - 1 ; }
482
485
hud_options ();
483
486
usleep (200000 );
484
487
//debounce(ODROID_INPUT_UP);
@@ -488,10 +491,10 @@ const uint16_t FONT_5x7[7][250] = {
488
491
*/
489
492
if (gamepad .values [ODROID_INPUT_DOWN ]) {
490
493
OPTION ++ ;
491
- if ( OPTION >= OPTIONS ) { OPTION = 0 ; }
494
+ if ( OPTION >= OPTIONS ) { OPTION = 0 ; }
492
495
hud_options ();
493
496
usleep (200000 );
494
- //debounce(ODROID_INPUT_DOWN);
497
+ //debounce(ODROID_INPUT_DOWN);
495
498
}
496
499
/*
497
500
BUTTON B
@@ -500,13 +503,13 @@ const uint16_t FONT_5x7[7][250] = {
500
503
ACTION = 0 ;
501
504
debounce (ODROID_INPUT_B );
502
505
return 0 ;
503
- }
506
+ }
504
507
/*
505
508
BUTTON A
506
509
*/
507
510
if (gamepad .values [ODROID_INPUT_A ]) {
508
- odroid_audio_volume_set (volume );
509
- hud_debug (STATE .label );
511
+ odroid_audio_volume_set (volume );
512
+ hud_debug (STATE .label );
510
513
ACTION = STATE .action ;
511
514
switch (ACTION ) {
512
515
case 0 : // "Resume Game"
@@ -516,7 +519,7 @@ const uint16_t FONT_5x7[7][250] = {
516
519
case 1 : // "Restart Game"
517
520
odroid_settings_StartAction_set (1 );
518
521
forceConsoleReset = true;
519
- esp_restart ();
522
+ esp_restart ();
520
523
break ;
521
524
case 2 : // "Reload Game"
522
525
esp_restart ();
@@ -530,16 +533,16 @@ const uint16_t FONT_5x7[7][250] = {
530
533
hud_progress ("Deleting..." , true);
531
534
hud_prepare_delete (1 );
532
535
ili9341_clear (0 );
533
- esp_restart ();
536
+ esp_restart ();
534
537
//return 0;
535
538
break ;
536
539
case 6 : // "Exit Game"
537
540
odroid_system_application_set (0 );
538
- esp_restart ();
539
- break ;
541
+ esp_restart ();
542
+ break ;
540
543
}
541
544
debounce (ODROID_INPUT_A );
542
545
}
543
546
}
544
547
}
545
- //}#pragma endregion Menu
548
+ //}#pragma endregion Menu
0 commit comments