From 6aed4ad7b3d74bb523152d0ee5455557f4e89bb8 Mon Sep 17 00:00:00 2001 From: "Such Meme, Many Skill" Date: Wed, 18 Mar 2020 00:41:09 +0100 Subject: [PATCH] Start gfx rewrite & reorganize TE --- source/tegraexplorer/common/common.h | 58 +++++++++++ source/tegraexplorer/common/strings.c | 19 ++++ source/tegraexplorer/common/structs.c | 48 +++++++++ source/tegraexplorer/common/types.h | 31 ++++++ source/tegraexplorer/emmc.c | 1 + source/tegraexplorer/emmc.h | 4 +- source/tegraexplorer/gfx.c | 51 +++++++-- source/tegraexplorer/gfx/gfxutils.c | 112 ++++++++++++++++++++ source/tegraexplorer/gfx/gfxutils.h | 15 +++ source/tegraexplorer/gfx/menu.c | 123 ++++++++++++++++++++++ source/tegraexplorer/gfx/menu.h | 4 + source/tegraexplorer/te.c | 145 +++++++++++++++++--------- source/tegraexplorer/te.h | 2 + source/tegraexplorer/tools.c | 3 +- source/tegraexplorer/utils/utils.c | 13 +++ source/tegraexplorer/utils/utils.h | 3 + 16 files changed, 570 insertions(+), 62 deletions(-) create mode 100644 source/tegraexplorer/common/common.h create mode 100644 source/tegraexplorer/common/strings.c create mode 100644 source/tegraexplorer/common/structs.c create mode 100644 source/tegraexplorer/common/types.h create mode 100644 source/tegraexplorer/gfx/gfxutils.c create mode 100644 source/tegraexplorer/gfx/gfxutils.h create mode 100644 source/tegraexplorer/gfx/menu.c create mode 100644 source/tegraexplorer/gfx/menu.h create mode 100644 source/tegraexplorer/utils/utils.c create mode 100644 source/tegraexplorer/utils/utils.h diff --git a/source/tegraexplorer/common/common.h b/source/tegraexplorer/common/common.h new file mode 100644 index 0000000..0361650 --- /dev/null +++ b/source/tegraexplorer/common/common.h @@ -0,0 +1,58 @@ +#pragma once +#include "types.h" + +extern const char *gfx_file_size_names[]; +extern const char *menu_sd_states[]; +extern const char *emmc_fs_entries[]; + +enum mainmenu_main_return { + MAIN_SDCARD = 0, + MAIN_EMMC_SAF, + MAIN_EMMC_SYS, + MAIN_EMMC_USR, + MAIN_EMUMMC_SAF, + MAIN_EMUMMC_SYS, + MAIN_EMUMMC_USR, + MAIN_MOUNT_SD, + MAIN_TOOLS, + MAIN_SD_FORMAT, + MAIN_CREDITS, + MAIN_EXIT +}; + +extern menu_entry mainmenu_main[]; + +enum mainmenu_shutdown_return { + SHUTDOWN_REBOOT_RCM = 1, + SHUTDOWN_REBOOT_NORMAL, + SHUTDOWN_POWER_OFF, + SHUTDOWN_HEKATE, + SHUTDOWN_AMS +}; + +extern menu_entry mainmenu_shutdown[]; + +enum mainmenu_tools_return { + TOOLS_DISPLAY_INFO = 1, + TOOLS_DISPLAY_GPIO, + TOOLS_DUMPFIRMWARE, + TOOLS_DUMPUSERSAVE, + TOOLS_DUMP_BOOT, + TOOLS_RESTORE_BOOT +}; + +extern menu_entry mainmenu_tools[]; + +enum mainmenu_format_return { + FORMAT_EMUMMC = 1, + FORMAT_ALL_FAT32 +}; + +extern menu_entry mainmenu_format[]; + +enum mmc_types { + SYSMMC = 1, + EMUMMC +}; + +extern menu_entry utils_mmcChoice[]; \ No newline at end of file diff --git a/source/tegraexplorer/common/strings.c b/source/tegraexplorer/common/strings.c new file mode 100644 index 0000000..ca4f3c7 --- /dev/null +++ b/source/tegraexplorer/common/strings.c @@ -0,0 +1,19 @@ +#include "common.h" + +const char *gfx_file_size_names[] = { + "B ", + "KB", + "MB", + "GB" +}; + +const char *menu_sd_states[] = { + "\nUnmount SD", + "\nMount SD" +}; + +const char *emmc_fs_entries[] = { + "SYSTEM", + "USER", + "SAFE" +}; \ No newline at end of file diff --git a/source/tegraexplorer/common/structs.c b/source/tegraexplorer/common/structs.c new file mode 100644 index 0000000..e3cef82 --- /dev/null +++ b/source/tegraexplorer/common/structs.c @@ -0,0 +1,48 @@ +#include "common.h" +#include "types.h" + +menu_entry mainmenu_main[] = { + {"[SD:/] SD CARD\n", COLOR_GREEN, ISMENU}, + {"[SYSTEM:/] EMMC", COLOR_ORANGE, ISMENU}, + {"[USER:/] EMMC", COLOR_ORANGE, ISMENU}, + {"[SAFE:/] EMMC", COLOR_ORANGE, ISMENU}, + {"\n[SYSTEM:/] EMUMMC", COLOR_BLUE, ISMENU}, + {"[USER:/] EMUMMC", COLOR_BLUE, ISMENU}, + {"[SAFE:/] EMUMMC", COLOR_BLUE, ISMENU}, + {"\nMount/Unmount SD", COLOR_WHITE, ISMENU}, + {"Tools", COLOR_VIOLET, ISMENU}, + {"SD format", COLOR_VIOLET, ISMENU}, + {"\nCredits", COLOR_WHITE, ISMENU}, + {"Exit", COLOR_WHITE, ISMENU} +}; + +menu_entry mainmenu_shutdown[] = { + {"Back", COLOR_WHITE, ISMENU}, + {"\nReboot to RCM", COLOR_VIOLET, ISMENU}, + {"Reboot normally", COLOR_ORANGE, ISMENU}, + {"Power off\n", COLOR_BLUE, ISMENU}, + {"Reboot to Hekate", COLOR_GREEN, ISMENU}, + {"Reboot to Atmosphere", COLOR_GREEN, ISMENU} +}; + +menu_entry mainmenu_tools[] = { + {"Back", COLOR_WHITE, ISMENU}, + {"\nDisplay Console Info", COLOR_GREEN, ISMENU}, + {"Display GPIO pins", COLOR_VIOLET, ISMENU}, + {"Dump Firmware", COLOR_BLUE, ISMENU}, + {"Dump User Saves", COLOR_YELLOW, ISMENU}, + {"[DEBUG] Dump bis", COLOR_RED, ISMENU}, + {"[DEBUG] Restore bis", COLOR_RED, ISMENU} +}; + +menu_entry mainmenu_format[] = { + {"Back\n", COLOR_WHITE, ISMENU}, + {"Format entire SD to FAT32", COLOR_RED, ISMENU}, + {"Format for EmuMMC setup (FAT32/RAW)", COLOR_RED, ISMENU} +}; + +menu_entry utils_mmcChoice[] = { + {"Back\n", COLOR_WHITE, ISMENU}, + {"SysMMC", COLOR_ORANGE, ISMENU}, + {"EmuMMC", COLOR_BLUE, ISMENU} +}; \ No newline at end of file diff --git a/source/tegraexplorer/common/types.h b/source/tegraexplorer/common/types.h new file mode 100644 index 0000000..44f6579 --- /dev/null +++ b/source/tegraexplorer/common/types.h @@ -0,0 +1,31 @@ +#pragma once +#include "../../utils/types.h" + +#define ISDIR (1 << 0) +#define ISARC (1 << 1) + +#define ISHIDE (1 << 8) +#define ISMENU (1 << 9) +#define ISSKIP (1 << 10) + +#define ISGB (1 << 7) +#define ISMB (1 << 6) +#define ISKB (1 << 5) +#define ISB (1 << 4) + +#define SETBIT(object, shift, value) ((value) ? (object |= shift) : (object &= ~shift)) + +/* Bit table for property as a file: +0000 0001: Directory bit +0000 0010: Archive bit (or hideme) +0001 0000: Size component is a Byte +0010 0000: Size component is a KiloByte +0100 0000: Size component is a MegaByte +1000 0000: Size component is a GigaByte : note that this won't surpass gigabytes, but i don't expect people to have a single file that's a terrabyte big +*/ + +typedef struct { + char *name; + u32 storage; + u16 property; +} menu_entry; \ No newline at end of file diff --git a/source/tegraexplorer/emmc.c b/source/tegraexplorer/emmc.c index be8e41b..d19328c 100644 --- a/source/tegraexplorer/emmc.c +++ b/source/tegraexplorer/emmc.c @@ -22,6 +22,7 @@ #include "../mem/sdram.h" #include "../storage/emummc.h" #include "../config/config.h" +#include "common/common.h" sdmmc_storage_t storage; emmc_part_t *system_part; diff --git a/source/tegraexplorer/emmc.h b/source/tegraexplorer/emmc.h index 3f7bb78..db75470 100644 --- a/source/tegraexplorer/emmc.h +++ b/source/tegraexplorer/emmc.h @@ -50,7 +50,9 @@ static const u8 bis_key_source[3][0x20] = { 0x4D, 0x12, 0xE1, 0x4B, 0x2A, 0x47, 0x4C, 0x1C, 0x09, 0xCB, 0x03, 0x59, 0xF0, 0x15, 0xF4, 0xE4} }; +/* enum mmc_types { SYSMMC = 0, EMUMMC -}; \ No newline at end of file +}; +*/ \ No newline at end of file diff --git a/source/tegraexplorer/gfx.c b/source/tegraexplorer/gfx.c index 73b85d0..83ecc00 100644 --- a/source/tegraexplorer/gfx.c +++ b/source/tegraexplorer/gfx.c @@ -58,6 +58,24 @@ int message(u32 color, const char* message, ...){ return btn_wait(); } +/* +int gfx_errprint(u32 color, int func, int err, int add){ + clearscreen(); + SWAPCOLOR(COLOR_ORANGE); + gfx_printf("\nAn error occured:\n\n"); + gfx_printf("Function: %s\nErrcode: %d\nDesc: %s\n"); + + if (add) + gfx_printf("Additional info: %d"); + + gfx_printf("\nPress any button to return"); + + + RESETCOLOR; + return btn_wait(); +} +*/ +// Change makemenu to combine makefilemenu to save space + make nagivation more consistant int makemenu(menu_item menu[], int menuamount){ int currentpos = 1, i, res; clearscreen(); @@ -216,7 +234,7 @@ void printfsentry(fs_entry file, bool highlight, bool refresh){ int makefilemenu(fs_entry *files, int amount, char *path){ int currentpos = -2, i, res = 0, offset = 0, quickoffset = 300; - u32 timer; + u32 timer, scrolltimer; bool refresh = false; clearscreen(); gfx_con_setpos(544, 0); @@ -237,17 +255,28 @@ int makefilemenu(fs_entry *files, int amount, char *path){ refresh = false; gfx_printf("\n%k%K %s %s\n\nTime taken for screen draw: %dms ", COLOR_BLUE, COLOR_DEFAULT, (offset + 60 < amount) ? "v" : " ", (offset > 0) ? "^" : " ", get_tmr_ms() - timer); - if (quickoffset == 300) - res = btn_wait(); - else { - msleep(quickoffset); - res = btn_read(); - } + while (btn_read() & BTN_POWER); - if (res == 0) - quickoffset = 300; - else if (quickoffset > 46) - quickoffset -= 45; + res = 0; + while (!res){ + res = btn_read(); + + if (!res) + quickoffset = 300; + + if (quickoffset < 300){ + scrolltimer = get_tmr_ms(); + while (res){ + if (scrolltimer + quickoffset <= get_tmr_ms()) + break; + + res = btn_read(); + } + } + + if (quickoffset > 46 && res) + quickoffset -= 45; + } if ((res & BTN_VOL_UP) && currentpos > -2){ currentpos--; diff --git a/source/tegraexplorer/gfx/gfxutils.c b/source/tegraexplorer/gfx/gfxutils.c new file mode 100644 index 0000000..eb5e57e --- /dev/null +++ b/source/tegraexplorer/gfx/gfxutils.c @@ -0,0 +1,112 @@ +#include "gfxutils.h" +#include +#include +#include "menu.h" +#include "../../gfx/gfx.h" +#include "../../power/max17050.h" +#include "../../utils/btn.h" +#include "../../utils/util.h" +#include "../../mem/heap.h" + + +void gfx_clearscreen(){ + int battery = 0; + max17050_get_property(MAX17050_RepSOC, &battery); + + gfx_clear_grey(0x1B); + SWAPCOLOR(COLOR_DEFAULT); + SWAPBGCOLOR(COLOR_WHITE); + + gfx_box(0, 1263, 719, 1279, COLOR_WHITE); + gfx_con_setpos(0, 1263); + gfx_printf("Move: Vol+/- | Select: Pow | Battery: %3d%%", battery >> 8); + + gfx_box(0, 0, 719, 15, COLOR_WHITE); + gfx_con_setpos(0, 0); + gfx_printf("Tegraexplorer v1.3.3\n"); + + RESETCOLOR; +} + +int gfx_message(u32 color, const char* message, ...){ + va_list ap; + va_start(ap, message); + + gfx_clearscreen(); + SWAPCOLOR(color); + + gfx_vprintf(message, ap); + + va_end(ap); + return btn_wait(); +} + +int gfx_errprint(u32 color, int func, int err, int add){ + gfx_clearscreen(); + SWAPCOLOR(COLOR_ORANGE); + gfx_printf("\nAn error occured:\n\n"); + gfx_printf("Function: %s\nErrcode: %d\nDesc: %s\n"); + + if (add) + gfx_printf("Additional info: %d"); + + gfx_printf("\nPress any button to return"); + + + RESETCOLOR; + return btn_wait(); +} + +int gfx_makewaitmenu(char *hiddenmessage, int timer){ + int res; + u32 start = get_tmr_s(); + + while (btn_read() != 0); + + while(1){ + res = btn_read(); + + if (res & BTN_VOL_DOWN || res & BTN_VOL_UP) + return 0; + + if (start + timer > get_tmr_s()) + gfx_printf("\r ", timer + start - get_tmr_s()); + + else if (res & BTN_POWER) + return 1; + + else + gfx_printf("\r%s", hiddenmessage); + } +} + +void gfx_printlength(int size, char *toprint){ + char *temp; + temp = (char*) malloc (size + 1); + + if (strlen(toprint) > size){ + strlcpy(temp, toprint, size); + memset(temp + size - 3, '.', 3); + memset(temp + size, '\0', 1); + } + else + strcpy(temp, toprint); + + gfx_printf("%s", temp); + free(temp); +} + +void gfx_printandclear(char *in, int length){ + u32 x, y; + + gfx_printlength(length, in); + gfx_con_getpos(&x, &y); + + gfx_box(x, y, 719, y + 16, COLOR_DEFAULT); +} + +void gfx_printfilesize(int size, char *type){ + SWAPCOLOR(COLOR_VIOLET); + gfx_printf("\a%4d\e%s", size, type); + RESETCOLOR; +} \ No newline at end of file diff --git a/source/tegraexplorer/gfx/gfxutils.h b/source/tegraexplorer/gfx/gfxutils.h new file mode 100644 index 0000000..0719582 --- /dev/null +++ b/source/tegraexplorer/gfx/gfxutils.h @@ -0,0 +1,15 @@ +#pragma once +#include "../../gfx/gfx.h" +#include "../../utils/types.h" + +#define SWAPCOLOR(color) gfx_printf("%k", color) +#define SWAPBGCOLOR(color) gfx_printf("%K", color) +#define RESETCOLOR gfx_printf("%k%K", COLOR_WHITE, COLOR_DEFAULT) + +void gfx_clearscreen(); +int gfx_message(u32 color, const char* message, ...); +int gfx_errprint(u32 color, int func, int err, int add); +int gfx_makewaitmenu(char *hiddenmessage, int timer); +void gfx_printlength(int size, char *toprint); +void gfx_printandclear(char *in, int length); +void gfx_printfilesize(int size, char *type); \ No newline at end of file diff --git a/source/tegraexplorer/gfx/menu.c b/source/tegraexplorer/gfx/menu.c new file mode 100644 index 0000000..1901370 --- /dev/null +++ b/source/tegraexplorer/gfx/menu.c @@ -0,0 +1,123 @@ +#include "menu.h" +#include "gfxutils.h" +#include "../common/types.h" +#include "../../utils/btn.h" +#include "../common/common.h" +#include "../../utils/util.h" +#include "../../mem/minerva.h" + +void _printentry(menu_entry entry, bool highlighted, bool refresh){ + int size; + + if (entry.property & ISMENU) + SWAPCOLOR(entry.storage); + else if (entry.property & ISDIR) + SWAPCOLOR(COLOR_WHITE); + else { + SWAPCOLOR(COLOR_VIOLET); + + for (size = 4; size < 8; size++) + if ((entry.property & (1 << size))) + break; + } + + + if (highlighted){ + SWAPBGCOLOR(COLOR_WHITE); + if ((entry.property & ISMENU) ? entry.storage == COLOR_WHITE : entry.property & ISDIR) + SWAPCOLOR(COLOR_DEFAULT); + } + else + SWAPBGCOLOR(COLOR_DEFAULT); + + + if (refresh) + gfx_printandclear(entry.name, 37); + else + gfx_printlength(37, entry.name); + + if (entry.property & ISDIR || entry.property & ISMENU) + gfx_printf("\n"); + else { + SWAPCOLOR(COLOR_BLUE); + gfx_printf("\a%d\e%s", entry.storage, gfx_file_size_names[size - 4]); + } +} + +int menu_make(menu_entry *entries, int amount, char *toptext){ + int currentpos = 0, i, res = 0, offset = 0, delay = 300; + u32 scrolltimer, timer; + bool refresh = false; + + gfx_clearscreen(); + + gfx_con_setpos(512, 0); + SWAPCOLOR(COLOR_DEFAULT); + SWAPBGCOLOR(COLOR_WHITE); + gfx_printf("%3d entries\n", amount); + RESETCOLOR; + + SWAPCOLOR(COLOR_GREEN); + gfx_printlength(42, toptext); + RESETCOLOR; + + while (!(res & BTN_POWER)){ + gfx_con_setpos(0, 47); + timer = get_tmr_ms(); + + if (!currentpos){ + while (currentpos < amount && entries[currentpos].property & (ISSKIP | ISHIDE)) + currentpos++; + } + if (currentpos == amount - 1){ + while (currentpos >= 1 && entries[currentpos].property & (ISSKIP | ISHIDE)) + currentpos--; + } + + for (int i = 0 + offset; i < amount && i < 60 + offset; i++) + if (!(entries[i].property & ISHIDE)) + _printentry(entries[i], (i == currentpos), refresh); + + gfx_printf("\n%k%K %s %s\n\nTime taken for screen draw: %dms ", COLOR_BLUE, COLOR_DEFAULT, (offset + 60 < amount) ? "v" : " ", (offset > 0) ? "^" : " ", get_tmr_ms() - timer); + + while (btn_read() & BTN_POWER); + + res = 0; + while (!res){ + res = btn_read(); + + if (!res) + delay = 300; + + if (delay < 300){ + scrolltimer = get_tmr_ms(); + while (res){ + if (scrolltimer + delay <= get_tmr_ms()) + break; + + res = btn_read(); + } + } + + if (delay > 46 && res) + delay -= 45; + } + + if (res & BTN_VOL_UP && currentpos >= 1){ + currentpos--; + while(entries[currentpos].property & (ISSKIP | ISHIDE) && currentpos >= 1) + currentpos--; + } + + else if (res & BTN_VOL_DOWN && currentpos < amount - 1){ + currentpos++; + while(entries[currentpos].property & (ISSKIP | ISHIDE) && currentpos < amount - 1) + currentpos++; + } + + } + + minerva_periodic_training(); + //return (mode) ? currentpos : entries[currentpos].property; + return currentpos; +} \ No newline at end of file diff --git a/source/tegraexplorer/gfx/menu.h b/source/tegraexplorer/gfx/menu.h new file mode 100644 index 0000000..c5336da --- /dev/null +++ b/source/tegraexplorer/gfx/menu.h @@ -0,0 +1,4 @@ +#pragma once +#include "../common/types.h" + +int menu_make(menu_entry *entries, int amount, char *toptext); \ No newline at end of file diff --git a/source/tegraexplorer/te.c b/source/tegraexplorer/te.c index fe39af9..3401a5a 100644 --- a/source/tegraexplorer/te.c +++ b/source/tegraexplorer/te.c @@ -11,11 +11,17 @@ #include "../storage/emummc.h" #include "script.h" +#include "common/common.h" +#include "gfx/menu.h" + +#include "utils/utils.h" + extern bool sd_mount(); extern void sd_unmount(); extern bool return_sd_mounted(int value); extern int launch_payload(char *path); +/* menu_item mainmenu[MAINMENU_AMOUNT] = { {"[SD:/] SD CARD\n", COLOR_GREEN, SD_CARD, 1}, {"[SYSTEM:/] EMMC", COLOR_ORANGE, EMMC_SYS, 1}, @@ -64,12 +70,9 @@ menu_item mmcChoice[3] = { {"SysMMC", COLOR_ORANGE, SYSMMC, 1}, {"EmuMMC", COLOR_BLUE, EMUMMC, 1} }; +*/ + -const char emmc_entries[3][8] = { - "SAFE", - "SYSTEM", - "USER" -}; int res = 0; @@ -81,7 +84,7 @@ void MainMenu_EMMC(){ if (makewaitmenu("You're about to enter EMMC\nModifying anything here\n can result in a BRICK!\n\nPlease only continue\n if you know what you're doing\n\nPress Vol+/- to return\n", "Press Power to enter", 4)){ connect_mmc(SYSMMC); - if (!mount_mmc(emmc_entries[res - 2], res - 1)) + if (!mount_mmc(emmc_fs_entries[res - 2], res - 1)) fileexplorer("emmc:/"); else message(COLOR_RED, "EMMC failed to mount!"); @@ -91,7 +94,7 @@ void MainMenu_EMMC(){ void MainMenu_EMUMMC(){ connect_mmc(EMUMMC); - if (!mount_mmc(emmc_entries[res - 5], res - 4)) + if (!mount_mmc(emmc_fs_entries[res - 5], res - 4)) fileexplorer("emmc:/"); else message(COLOR_RED, "EMUMMC failed to mount!"); @@ -105,52 +108,46 @@ void MainMenu_MountSD(){ } void MainMenu_Tools(){ - res = makemenu(toolsmenu, 8); + //res = makemenu(toolsmenu, 8); + res = menu_make(mainmenu_tools, 7, "-- Tools Menu --"); switch(res){ - case DISPLAY_INFO: + case TOOLS_DISPLAY_INFO: displayinfo(); break; - case DISPLAY_GPIO: + case TOOLS_DISPLAY_GPIO: displaygpio(); break; - case DUMPFIRMWARE: + case TOOLS_DUMPFIRMWARE: dumpfirmware(SYSMMC); break; - case DUMPUSERSAVE: - if (mainmenu[4].property >= 0){ - if ((res = makemenu(mmcChoice, 3)) >= 0) - dumpusersaves(res); - } - else - dumpusersaves(SYSMMC); + case TOOLS_DUMPUSERSAVE: + if ((res = utils_mmcMenu()) > 0) + dumpusersaves(res); break; - case DUMP_BOOT: + case TOOLS_DUMP_BOOT: dump_emmc_parts(PART_BOOT | PART_PKG2, SYSMMC); break; - case RESTORE_BOOT: + case TOOLS_RESTORE_BOOT: if (makewaitmenu( "WARNING!\nThis will mess with your switch boot files\nMake a nand backup beforehand!\n\nThis will pull from path:\nsd:/tegraexplorer/boot.bis\n\nVol +/- to cancel\n", "Power to confirm", 5 )) { - if (emu_cfg.enabled){ - if ((res = makemenu(mmcChoice, 3)) >= 0) - restore_bis_using_file("sd:/tegraexplorer/boot.bis", res); - } - else - restore_bis_using_file("sd:/tegraexplorer/boot.bis", SYSMMC); + if ((res = utils_mmcMenu()) > 0) + restore_bis_using_file("sd:/tegraexplorer/boot.bis", res); } break; } } void MainMenu_SDFormat(){ - res = makemenu(formatmenu, 4); + //res = makemenu(formatmenu, 4); + res = menu_make(mainmenu_format, 3, "-- Format Menu --"); - if (res >= 0){ + if (res > 0){ if(makewaitmenu("Are you sure you want to format your sd?\nThis will delete everything on your SD card\nThis action is irreversible!\n\nPress Vol+/- to cancel\n", "Press Power to continue", 10)){ if (format(res)){ sd_unmount(); @@ -164,31 +161,37 @@ void MainMenu_Credits(){ } void MainMenu_Exit(){ - if (return_sd_mounted(1)){ + if (return_sd_mounted(1)){ + /* shutdownmenu[5].property = (checkfile("/bootloader/update.bin")) ? 1 : -1; shutdownmenu[6].property = (checkfile("/atmosphere/reboot_payload.bin")) ? 1 : -1; + */ + + SETBIT(mainmenu_shutdown[4].property, ISHIDE, !checkfile("/bootloader/update.bin")); + SETBIT(mainmenu_shutdown[5].property, ISHIDE, !checkfile("/atmosphere/reboot_payload.bin")); } else { - shutdownmenu[5].property = -1; - shutdownmenu[6].property = -1; + for (int i = 4; i <= 5; i++) + SETBIT(mainmenu_shutdown[i].property, ISHIDE, 1); } - res = makemenu(shutdownmenu, 7); + //res = makemenu(shutdownmenu, 7); + res = menu_make(mainmenu_shutdown, 6, "-- Shutdown Menu --"); switch(res){ - case REBOOT_RCM: + case SHUTDOWN_REBOOT_RCM: reboot_rcm(); - case REBOOT_NORMAL: + case SHUTDOWN_REBOOT_NORMAL: reboot_normal(); - case POWER_OFF: + case SHUTDOWN_POWER_OFF: power_off(); - case HEKATE: + case SHUTDOWN_HEKATE: launch_payload("/bootloader/update.bin"); - case AMS: + case SHUTDOWN_AMS: launch_payload("/atmosphere/reboot_payload.bin"); } //todo declock bpmp } @@ -213,6 +216,7 @@ void RunMenuOption(int option){ mainmenu_functions[option - 1](); } +/* void fillmainmenu(){ int i; @@ -232,38 +236,81 @@ void fillmainmenu(){ break; case 8: if (return_sd_mounted(1)){ - mainmenu[i].property = 2; - strcpy(mainmenu[i].name, "\nUnmount SD"); + //mainmenu[i].property = 2; + //strcpy(mainmenu[i].name, "\nUnmount SD"); + mainmenu_main[7].name = (menu_sd_states[0]); } else { - mainmenu[i].property = 1; - strcpy(mainmenu[i].name, "\nMount SD"); + //mainmenu[i].property = 1; + //strcpy(mainmenu[i].name, "\nMount SD"); + mainmenu_main[7].name = (menu_sd_states[1]); } break; } } } +*/ void te_main(){ + int setter; if (dump_biskeys() == -1){ message(COLOR_RED, "Biskeys failed to dump!\nEmmc will not be mounted!"); - mainmenu[1].property = -1; - mainmenu[2].property = -1; - mainmenu[3].property = -1; + for (int i = 1; i <= 3; i++) + mainmenu_main[i].property |= ISHIDE; } if (emummc_load_cfg()){ - mainmenu[4].property = -2; - mainmenu[5].property = -2; - mainmenu[6].property = -2; + for (int i = 4; i <= 6; i++) + mainmenu_main[i].property |= ISHIDE; } disconnect_mmc(); while (1){ - fillmainmenu(); - res = makemenu(mainmenu, MAINMENU_AMOUNT); + //fillmainmenu(); + + setter = return_sd_mounted(1); + + if (emu_cfg.enabled){ + for (int i = 4; i <= 6; i++) + SETBIT(mainmenu_main[i].property, ISHIDE, !setter); + } + SETBIT(mainmenu_main[0].property, ISHIDE, !setter); + mainmenu_main[7].name = (menu_sd_states[!setter]); + + /* + if (return_sd_mounted(1)){ + if (emu_cfg.enabled){ + for (int i = 4; i <= 6; i++) + SETBIT(mainmenu_main[i], ISHIDE, 0); + } + SETBIT(mainmenu_main[0], ISHIDE, 0); + mainmenu_main[7].name = (menu_sd_states[0]); + } + else { + if (emu_cfg.enabled){ + for (int i = 4; i <= 6; i++) + SETBIT(mainmenu_main[i], ISHIDE, 1); + } + SETBIT(mainmenu_main[0], ISHIDE, 1); + mainmenu_main[7].name = (menu_sd_states[1]); + } + */ + + setter = return_sd_mounted(10); + SETBIT(mainmenu_main[9].property, ISHIDE, !setter); + + /* + if (return_sd_mounted(10)) + SETBIT(mainmenu_main[0], ISHIDE, 0); + else + SETBIT(mainmenu_main[0], ISHIDE, 1); + */ + + + //res = makemenu(mainmenu, MAINMENU_AMOUNT); + res = menu_make(mainmenu_main, 12, "-- Main Menu --") + 1; RunMenuOption(res); } } \ No newline at end of file diff --git a/source/tegraexplorer/te.h b/source/tegraexplorer/te.h index 908a076..54bf50b 100644 --- a/source/tegraexplorer/te.h +++ b/source/tegraexplorer/te.h @@ -11,6 +11,7 @@ typedef struct _menu_item { short property; } menu_item; +/* enum mainmenu_return { SD_CARD = 1, EMMC_SAF, @@ -47,5 +48,6 @@ enum formatmenu_return { FORMAT_EMUMMC = 0, FORMAT_ALL_FAT32 }; +*/ void te_main(); \ No newline at end of file diff --git a/source/tegraexplorer/tools.c b/source/tegraexplorer/tools.c index 354d448..55de07c 100644 --- a/source/tegraexplorer/tools.c +++ b/source/tegraexplorer/tools.c @@ -13,6 +13,7 @@ #include "emmc.h" #include "fs.h" #include "io.h" +#include "common/common.h" extern bool sd_mount(); extern void sd_unmount(); @@ -188,7 +189,7 @@ int format(int mode){ timer = get_tmr_s(); totalsectors = sd_storage.csd.capacity; - if (mode == 0){ + if (mode == FORMAT_EMUMMC){ if (totalsectors < 83886080){ gfx_printf("%kYou seem to be running this on a <=32GB SD\nNot enough free space for emummc!", COLOR_RED); fatalerror = true; diff --git a/source/tegraexplorer/utils/utils.c b/source/tegraexplorer/utils/utils.c new file mode 100644 index 0000000..0a98b50 --- /dev/null +++ b/source/tegraexplorer/utils/utils.c @@ -0,0 +1,13 @@ +#include "utils.h" +#include "../common/common.h" +#include "../gfx/menu.h" +#include "../../storage/emummc.h" + +int utils_mmcMenu(){ + int res; + + if (emu_cfg.enabled) + return menu_make(utils_mmcChoice, 3, "-- Choose MMC --"); + else + return SYSMMC; +} \ No newline at end of file diff --git a/source/tegraexplorer/utils/utils.h b/source/tegraexplorer/utils/utils.h new file mode 100644 index 0000000..eff2122 --- /dev/null +++ b/source/tegraexplorer/utils/utils.h @@ -0,0 +1,3 @@ +#pragma once + +int utils_mmcMenu(); \ No newline at end of file