|
16 | 16 | bool SAVED = false;
|
17 | 17 | int8_t USER;
|
18 | 18 | bool RESTART = false;
|
| 19 | + char** FILES; |
| 20 | + DIR *directory; |
| 21 | + struct dirent *file; |
19 | 22 | //}#pragma endregion Global
|
20 | 23 |
|
21 | 24 | //{#pragma region Emulator and Directories
|
|
93 | 96 | odroid_input_gamepad_init();
|
94 | 97 |
|
95 | 98 | // Battery
|
96 |
| - odroid_input_battery_level_init(); |
| 99 | + odroid_input_battery_level_init(); |
| 100 | + |
| 101 | + // SD |
| 102 | + odroid_sdcard_open("/sd"); |
97 | 103 |
|
98 | 104 | // Theme
|
99 | 105 | get_theme();
|
|
158 | 164 | STEP = 0;
|
159 | 165 | }
|
160 | 166 | nvs_close(handle);
|
| 167 | + printf("\nGet nvs_get_i8:%d\n", STEP); |
161 | 168 | }
|
162 | 169 | void set_step_state() {
|
| 170 | + printf("\nGet nvs_set_i8:%d\n", STEP); |
163 | 171 | nvs_handle handle;
|
164 | 172 | nvs_open("storage", NVS_READWRITE, &handle);
|
165 | 173 | nvs_set_i8(handle, "STEP", STEP);
|
|
177 | 185 |
|
178 | 186 | nvs_handle handle;
|
179 | 187 | err = nvs_open("storage", NVS_READWRITE, &handle);
|
180 |
| - |
181 |
| - err = nvs_get_i8(handle, "OFFSET", &ROMS.offset); |
| 188 | + err = nvs_get_i16(handle, "LAST", &ROMS.offset); |
182 | 189 | switch (err) {
|
183 | 190 | case ESP_OK:
|
184 | 191 | break;
|
|
189 | 196 | ROMS.offset = 0;
|
190 | 197 | }
|
191 | 198 | nvs_close(handle);
|
| 199 | + printf("\nGet nvs_get_i16:%d\n", ROMS.offset); |
192 | 200 | }
|
193 | 201 | void set_list_state() {
|
| 202 | + printf("\nSet nvs_set_i16:%d", ROMS.offset); |
194 | 203 | nvs_handle handle;
|
195 | 204 | nvs_open("storage", NVS_READWRITE, &handle);
|
196 |
| - nvs_set_i8(handle, "OFFSET", ROMS.offset); |
| 205 | + nvs_set_i16(handle, "LAST", ROMS.offset); |
197 | 206 | nvs_commit(handle);
|
198 | 207 | nvs_close(handle);
|
| 208 | + get_list_state(); |
199 | 209 | }
|
200 | 210 |
|
201 | 211 | void set_restore_states() {
|
|
348 | 358 | void draw_media(int x, int y, bool current) {
|
349 | 359 | int offset = (STEP-1) * 16;
|
350 | 360 | int i = 0;
|
351 |
| - if(current) { |
352 |
| - for(int h = 0; h < 16; h++) { |
353 |
| - for(int w = offset; w < (offset+16); w++) { |
354 |
| - buffer[i] = media[h][w] == WHITE ? GUI.fg : GUI.bg; |
355 |
| - i++; |
356 |
| - } |
357 |
| - } |
358 |
| - ili9341_write_frame_rectangleLE(x+1, y+1, 16, 16, buffer); |
359 |
| - } |
360 |
| - i = 0; |
361 | 361 | for(int h = 0; h < 16; h++) {
|
362 | 362 | for(int w = offset; w < (offset+16); w++) {
|
363 | 363 | buffer[i] = media[h][w] == WHITE ? current ? WHITE : GUI.fg : GUI.bg;
|
364 | 364 | i++;
|
365 | 365 | }
|
366 | 366 | }
|
367 |
| - current ? |
368 |
| - ili9341_write_frame_rectangleLE(x-1, y-1, 16, 16, buffer) : |
369 | 367 | ili9341_write_frame_rectangleLE(x, y, 16, 16, buffer);
|
370 | 368 | }
|
371 | 369 |
|
|
491 | 489 | //}#pragma endregion GUI
|
492 | 490 |
|
493 | 491 | //{#pragma region Files
|
494 |
| - inline static void swap(char** a, char** b) |
495 |
| - { |
496 |
| - char* t = *a; |
497 |
| - *a = *b; |
498 |
| - *b = t; |
499 |
| - } |
| 492 | + //{#pragma region Sort |
| 493 | + inline static void swap(char** a, char** b) { |
| 494 | + char* t = *a; |
| 495 | + *a = *b; |
| 496 | + *b = t; |
| 497 | + } |
500 | 498 |
|
501 |
| - static int strcicmp(char const *a, char const *b) |
502 |
| - { |
503 |
| - for (;; a++, b++) |
504 |
| - { |
505 |
| - int d = tolower((int)*a) - tolower((int)*b); |
506 |
| - if (d != 0 || !*a) return d; |
507 |
| - } |
508 |
| - } |
| 499 | + static int strcicmp(char const *a, char const *b) { |
| 500 | + for (;; a++, b++) |
| 501 | + { |
| 502 | + int d = tolower((int)*a) - tolower((int)*b); |
| 503 | + if (d != 0 || !*a) return d; |
| 504 | + } |
| 505 | + } |
509 | 506 |
|
510 |
| - static int partition (char* arr[], int low, int high) |
511 |
| - { |
512 |
| - char* pivot = arr[high]; |
513 |
| - int i = (low - 1); |
514 |
| - |
515 |
| - for (int j = low; j <= high- 1; j++) |
516 |
| - { |
517 |
| - if (strcicmp(arr[j], pivot) < 0) |
518 |
| - { |
519 |
| - i++; |
520 |
| - swap(&arr[i], &arr[j]); |
521 |
| - } |
522 |
| - } |
523 |
| - swap(&arr[i + 1], &arr[high]); |
524 |
| - return (i + 1); |
525 |
| - } |
526 |
| - |
527 |
| - void quick_sort(char* arr[], int low, int high) |
528 |
| - { |
529 |
| - if (low < high) |
530 |
| - { |
531 |
| - int pi = partition(arr, low, high); |
| 507 | + static int partition (char* arr[], int low, int high) { |
| 508 | + char* pivot = arr[high]; |
| 509 | + int i = (low - 1); |
532 | 510 |
|
533 |
| - quick_sort(arr, low, pi - 1); |
534 |
| - quick_sort(arr, pi + 1, high); |
535 |
| - } |
536 |
| - } |
| 511 | + for (int j = low; j <= high- 1; j++) |
| 512 | + { |
| 513 | + if (strcicmp(arr[j], pivot) < 0) |
| 514 | + { |
| 515 | + i++; |
| 516 | + swap(&arr[i], &arr[j]); |
| 517 | + } |
| 518 | + } |
| 519 | + swap(&arr[i + 1], &arr[high]); |
| 520 | + return (i + 1); |
| 521 | + } |
| 522 | + |
| 523 | + void quick_sort(char* arr[], int low, int high) { |
| 524 | + if (low < high) |
| 525 | + { |
| 526 | + int pi = partition(arr, low, high); |
537 | 527 |
|
538 |
| - void sort_files(char** files) |
539 |
| - { |
540 |
| - if (ROMS.total > 1) |
541 |
| - { |
542 |
| - quick_sort(files, 0, ROMS.total - 1); |
543 |
| - } |
544 |
| - } |
| 528 | + quick_sort(arr, low, pi - 1); |
| 529 | + quick_sort(arr, pi + 1, high); |
| 530 | + } |
| 531 | + } |
545 | 532 |
|
546 |
| - void get_files() { |
547 |
| - odroid_sdcard_open("/sd"); |
548 |
| - const int MAX_FILES = 1024; |
549 |
| - char** result = (char**)malloc(MAX_FILES * sizeof(void*)); |
| 533 | + void sort_files(char** files) |
| 534 | + { |
| 535 | + if (ROMS.total > 1) |
| 536 | + { |
| 537 | + quick_sort(files, 0, ROMS.total - 1); |
| 538 | + } |
| 539 | + } |
| 540 | + //}#pragma endregion Sort |
550 | 541 |
|
551 |
| - DIR *directory; |
552 |
| - struct dirent *file; |
| 542 | + void get_files() { |
| 543 | + FILES = (char**)malloc(MAX_FILES * sizeof(void*)); |
| 544 | + |
553 | 545 | char path[256] = "/sd/roms/";
|
554 | 546 | strcat(&path[strlen(path) - 1], DIRECTORIES[STEP]);
|
555 | 547 | strcpy(ROM.path, path);
|
|
564 | 556 | bool extenstion = strcmp(&file->d_name[rom_length - ext_lext], EXTENSIONS[STEP]) == 0 && file->d_name[0] != '.';
|
565 | 557 | if(extenstion) {
|
566 | 558 | size_t len = strlen(file->d_name);
|
567 |
| - result[ROMS.total] = (char*)malloc(len + 1); |
568 |
| - strcpy(result[ROMS.total], file->d_name); |
| 559 | + FILES[ROMS.total] = (char*)malloc(len + 1); |
| 560 | + strcpy(FILES[ROMS.total], file->d_name); |
569 | 561 | ROMS.total++;
|
570 | 562 | }
|
571 | 563 | }
|
572 | 564 | ROMS.pages = ROMS.total/ROMS.limit;
|
573 |
| - //printf("\nDIRECTORY:%s ROMS.page:%d ROMS.pages:%d\n", DIRECTORIES[STEP], ROMS.page, ROMS.pages); |
574 | 565 | closedir(directory);
|
575 | 566 | }
|
576 | 567 |
|
577 | 568 | if(ROMS.total > 0) {
|
578 |
| - sort_files(result); |
579 |
| - draw_files(result); |
580 |
| - draw_numbers(); |
| 569 | + sort_files(FILES); |
| 570 | + draw_files(); |
581 | 571 | } else {
|
582 | 572 | char message[100] = "no games available";
|
583 | 573 | int center = ceil((320/2)-((strlen(message)*5)/2));
|
584 | 574 | draw_text(center,134,message,false,false);
|
585 | 575 | }
|
586 | 576 | }
|
587 | 577 |
|
588 |
| - void draw_files(char** files) { |
589 |
| - |
| 578 | + void draw_files() { |
| 579 | + printf("\n"); |
590 | 580 | int x = ORIGIN.x;
|
591 | 581 | int y = POS.y + 48;
|
592 | 582 | int game = ROMS.offset ;
|
593 | 583 | ROMS.page = ROMS.offset/ROMS.limit;
|
594 | 584 |
|
| 585 | + printf("\nROMS.offset:%d", ROMS.offset); |
| 586 | + printf("\nROMS.limit:%d", ROMS.limit); |
| 587 | + printf("\nROMS.total:%d", ROMS.total); |
| 588 | + printf("\nROMS.page:%d", ROMS.page); |
| 589 | + printf("\nROMS.pages:%d", ROMS.pages); |
| 590 | + |
595 | 591 | for (int i = 0; i < 4; i++) draw_mask(0, y+(i*40)-6, 320, 40);
|
596 |
| - for(int n = 0; n < ROMS.total; n++) { |
597 |
| - if(game < (ROMS.limit+ROMS.offset) && n >= game && game < ROMS.total) { |
598 |
| - draw_media(x,y-6,game == ROMS.offset ? true : false); |
599 |
| - draw_text(x+24,y,files[n],true,game == ROMS.offset ? true : false); |
600 |
| - if(game == ROMS.offset) { |
601 |
| - strcpy(ROM.name, files[n]); |
602 |
| - int i = strlen(ROM.path); ROM.path[i] = '/'; |
603 |
| - ROM.path[i + 1] = 0; |
604 |
| - strcat(ROM.path, ROM.name); |
605 |
| - ROM.ready = true; |
606 |
| - } |
607 |
| - y+=20; |
608 |
| - game++; |
609 |
| - } |
| 592 | + |
| 593 | + int limit = (ROMS.offset + ROMS.limit) > ROMS.total ? ROMS.total : ROMS.offset + ROMS.limit; |
| 594 | + for(int n = ROMS.offset; n < limit; n++) { |
| 595 | + draw_text(x+24,y,FILES[n],true,n == ROMS.offset ? true : false); |
| 596 | + draw_media(x,y-6,n == ROMS.offset ? true : false); |
| 597 | + if(n == ROMS.offset) { |
| 598 | + strcpy(ROM.name, FILES[n]); |
| 599 | + ROM.ready = true; |
| 600 | + } |
| 601 | + y+=20; |
610 | 602 | }
|
| 603 | + |
| 604 | + |
| 605 | + draw_numbers(); |
611 | 606 | }
|
612 | 607 |
|
613 | 608 | void has_save_file(char *name) {
|
|
777 | 772 | void rom_run(bool resume) {
|
778 | 773 |
|
779 | 774 | set_restore_states();
|
780 |
| - |
| 775 | + |
781 | 776 | draw_background();
|
782 | 777 | char *message = !resume ? "loading..." : "hold start";
|
783 | 778 |
|
|
798 | 793 | odroid_system_application_set(PROGRAMS[STEP-1]);
|
799 | 794 | usleep(10000);
|
800 | 795 | esp_restart();
|
| 796 | + |
801 | 797 | }
|
802 | 798 |
|
803 | 799 | void rom_resume() {
|
|
927 | 923 | if(STEP != 0) {
|
928 | 924 | ROMS.offset--;
|
929 | 925 | if( ROMS.offset < 0 ) { ROMS.offset = ROMS.total - 1; }
|
930 |
| - get_files(); |
| 926 | + draw_files(); |
931 | 927 | }
|
932 | 928 | } else {
|
933 | 929 | if(SAVED) {
|
|
952 | 948 | if(STEP != 0) {
|
953 | 949 | ROMS.offset++;
|
954 | 950 | if( ROMS.offset > ROMS.total - 1 ) { ROMS.offset = 0; }
|
955 |
| - get_files(); |
| 951 | + draw_files(); |
956 | 952 | }
|
957 | 953 | } else {
|
958 | 954 | if(SAVED) {
|
|
979 | 975 | ROMS.page++;
|
980 | 976 | if( ROMS.page > ROMS.pages ) { ROMS.page = 0; }
|
981 | 977 | ROMS.offset = ROMS.page * ROMS.limit;
|
982 |
| - get_files(); |
| 978 | + draw_files(); |
983 | 979 | }
|
984 | 980 | }
|
985 | 981 | //debounce(ODROID_INPUT_START);
|
|
994 | 990 | ROMS.page--;
|
995 | 991 | if( ROMS.page < 0 ) { ROMS.page = ROMS.pages; };
|
996 | 992 | ROMS.offset = ROMS.page * ROMS.limit;
|
997 |
| - get_files(); |
| 993 | + draw_files(); |
998 | 994 | }
|
999 | 995 | }
|
1000 | 996 | //debounce(ODROID_INPUT_SELECT);
|
|
1013 | 1009 | if (ROM.ready && !LAUNCHER) {
|
1014 | 1010 | OPTION = 0;
|
1015 | 1011 | LAUNCHER = true;
|
| 1012 | + |
| 1013 | + char file_to_load[256] = ""; |
| 1014 | + sprintf(file_to_load, "%s/%s", ROM.path, ROM.name); |
| 1015 | + odroid_settings_RomFilePath_set(file_to_load); |
| 1016 | + |
1016 | 1017 | draw_launcher();
|
1017 | 1018 | } else {
|
1018 |
| - odroid_settings_RomFilePath_set(ROM.path); |
1019 | 1019 | switch(OPTION) {
|
1020 | 1020 | case 0:
|
1021 | 1021 | SAVED ? rom_resume() : rom_run(false);
|
|
1040 | 1040 | draw_background();
|
1041 | 1041 | draw_systems();
|
1042 | 1042 | draw_text(16,16,EMULATORS[STEP],false,true);
|
1043 |
| - STEP == 0 ? draw_themes() : get_files(); |
| 1043 | + STEP == 0 ? draw_themes() : draw_files(); |
1044 | 1044 | }
|
1045 | 1045 | debounce(ODROID_INPUT_B);
|
1046 | 1046 | }
|
|
0 commit comments