Added readme viewer to HOME menu

This commit is contained in:
d0k3 2017-10-02 03:08:47 +02:00
parent ee26458341
commit 42820b185c
4 changed files with 105 additions and 6 deletions

View File

@ -64,6 +64,10 @@ ifeq ($(SWITCH_SCREENS),1)
CFLAGS += -DSWITCH_SCREENS CFLAGS += -DSWITCH_SCREENS
endif endif
ifneq ("$(wildcard $(CURDIR)/../$(DATA)/README.md)","")
CFLAGS += -DHARDCODE_README
endif
ifneq ("$(wildcard $(CURDIR)/../$(DATA)/aeskeydb.bin)","") ifneq ("$(wildcard $(CURDIR)/../$(DATA)/aeskeydb.bin)","")
CFLAGS += -DHARDCODE_KEYS CFLAGS += -DHARDCODE_KEYS
endif endif
@ -103,7 +107,8 @@ export DEPSDIR := $(CURDIR)/$(BUILD)
CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp)))
SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))
BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/aeskeydb.bin))) \ BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/README.md))) \
$(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/aeskeydb.bin))) \
$(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/autorun.gm9))) $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/autorun.gm9)))
ifeq ($(SAFEMODE),1) ifeq ($(SAFEMODE),1)
BINFILES += $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/sm9*.*))) BINFILES += $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/sm9*.*)))
@ -219,6 +224,11 @@ $(OUTPUT).elf : $(OFILES)
@$(bin2o) @$(bin2o)
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
%_gm9.h %.gm9.o: %.gm9 %_gm9.h %.gm9.o: %.gm9
#---------------------------------------------------------------------------------
@echo $(notdir $<)
@$(bin2o)
#---------------------------------------------------------------------------------
%_md.h %.md.o: %.md
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
@echo $(notdir $<) @echo $(notdir $<)
@$(bin2o) @$(bin2o)

View File

@ -31,6 +31,12 @@
#ifdef AUTORUN_SCRIPT #ifdef AUTORUN_SCRIPT
#include "autorun_gm9.h" #include "autorun_gm9.h"
#endif #endif
#ifdef HARDCODE_README
#include "README_md.h"
#else
#define README_md NULL
#define README_md_size 0
#endif
#define N_PANES 2 #define N_PANES 2
@ -1490,6 +1496,7 @@ u32 HomeMoreMenu(char* current_path, DirStruct* current_dir, DirStruct* clipboar
int hsrestore = ((CheckHealthAndSafetyInject("1:") == 0) || (CheckHealthAndSafetyInject("4:") == 0)) ? (int) ++n_opt : -1; int hsrestore = ((CheckHealthAndSafetyInject("1:") == 0) || (CheckHealthAndSafetyInject("4:") == 0)) ? (int) ++n_opt : -1;
int clock = ++n_opt; int clock = ++n_opt;
int sysinfo = ++n_opt; int sysinfo = ++n_opt;
int readme = (README_md != NULL) ? (int) ++n_opt : -1;
if (sdformat > 0) optionstr[sdformat - 1] = "SD format menu"; if (sdformat > 0) optionstr[sdformat - 1] = "SD format menu";
if (bonus > 0) optionstr[bonus - 1] = "Bonus drive setup"; if (bonus > 0) optionstr[bonus - 1] = "Bonus drive setup";
@ -1498,6 +1505,7 @@ u32 HomeMoreMenu(char* current_path, DirStruct* current_dir, DirStruct* clipboar
if (hsrestore > 0) optionstr[hsrestore - 1] = "Restore H&S"; if (hsrestore > 0) optionstr[hsrestore - 1] = "Restore H&S";
if (clock > 0) optionstr[clock - 1] = "Set RTC date&time"; if (clock > 0) optionstr[clock - 1] = "Set RTC date&time";
if (sysinfo > 0) optionstr[sysinfo - 1] = "System info"; if (sysinfo > 0) optionstr[sysinfo - 1] = "System info";
if (readme > 0) optionstr[readme - 1] = "Show ReadMe";
int user_select = ShowSelectPrompt(n_opt, optionstr, promptstr); int user_select = ShowSelectPrompt(n_opt, optionstr, promptstr);
if (user_select == sdformat) { // format SD card if (user_select == sdformat) { // format SD card
@ -1598,7 +1606,11 @@ u32 HomeMoreMenu(char* current_path, DirStruct* current_dir, DirStruct* clipboar
else if (user_select == sysinfo) { // Myria's system info else if (user_select == sysinfo) { // Myria's system info
char* sysinfo_txt = (char*) TEMP_BUFFER; char* sysinfo_txt = (char*) TEMP_BUFFER;
MyriaSysinfo(sysinfo_txt); MyriaSysinfo(sysinfo_txt);
MemTextViewer(sysinfo_txt, strnlen(sysinfo_txt, TEMP_BUFFER_SIZE), false); MemTextViewer(sysinfo_txt, strnlen(sysinfo_txt, TEMP_BUFFER_SIZE), 1, false);
return 0;
}
else if (user_select == readme) { // Display GodMode9 readme
MemToCViewer((const char*) README_md, README_md_size, "GodMode9 ReadMe Table of Contents");
return 0; return 0;
} else return 1; } else return 1;

View File

@ -884,8 +884,8 @@ void MemTextView(const char* text, u32 len, char* line0, int off_disp, int lno,
} }
} }
bool MemTextViewer(const char* text, u32 len, bool as_script) { bool MemTextViewer(const char* text, u32 len, u32 start, bool as_script) {
u32 ww = 0; u32 ww = TV_LLEN_DISP;
// check if this really is text // check if this really is text
if (!ValidateText(text, len)) { if (!ValidateText(text, len)) {
@ -921,6 +921,7 @@ bool MemTextViewer(const char* text, u32 len, bool as_script) {
char* line0 = (char*) text; char* line0 = (char*) text;
int lcurr = 1; int lcurr = 1;
int off_disp = 0; int off_disp = 0;
for (; lcurr < (int) start; line0 = line_seek(text, len, 0, line0, 1), lcurr++);
while (true) { while (true) {
// display text on screen // display text on screen
MemTextView(text, len, line0, off_disp, lcurr, ww, 0, as_script); MemTextView(text, len, line0, off_disp, lcurr, ww, 0, as_script);
@ -967,6 +968,81 @@ bool MemTextViewer(const char* text, u32 len, bool as_script) {
return true; return true;
} }
// right now really only intended for use with the GodMode9 readme
// (misses safety checks for wider compatibility)
bool MemToCViewer(const char* text, u32 len, const char* title) {
const u32 max_captions = 24; // we assume this is enough
char* captions[max_captions];
u32 lineno[max_captions];
u32 ww = TV_LLEN_DISP;
// check if this really is text
if (!ValidateText(text, len)) {
ShowPrompt(false, "Error: Invalid text data");
return false;
}
// clear screens / view start of readme on top
script_color_active = COLOR_TVRUN;
ClearScreenF(true, true, COLOR_STD_BG);
MemTextView(text, len, (char*) text, 0, 1, ww, 0, false);
// parse text for markdown captions
u32 n_captions = 0;
char* ptr = (char*) text;
for (u32 lno = 1;; lno++) {
char* ptr_next = line_seek(text, len, 0, ptr, 1);
if (ptr == ptr_next) break;
if (*ptr == '#') {
captions[n_captions] = ptr;
lineno[n_captions] = lno;
if ((lno > 1) && (++n_captions >= max_captions)) break;
}
ptr = ptr_next;
}
int cursor = -1;
while (true) {
// display ToC
u32 y0 = TV_VPAD;
u32 x0 = (SCREEN_WIDTH_BOT - GetDrawStringWidth(title)) / 2;
DrawStringF(BOT_SCREEN, x0, y0, COLOR_TVTEXT, COLOR_STD_BG, "%s\n%*.*s", title,
strnlen(title, 40), strnlen(title, 40), "========================================");
y0 += 2 * (FONT_HEIGHT_EXT + (2*TV_VPAD));
for (u32 i = 0; (i < n_captions) && (y0 < SCREEN_HEIGHT); i++) {
u32 text_color = ((int) i == cursor) ? COLOR_TVRUN : COLOR_TVTEXT;
char* caption = captions[i];
u32 len = 0;
u32 lvl = 0;
for (; *caption == '#'; caption++, lvl++);
for (; IS_WHITESPACE(*caption); caption++);
for (; caption[len] != '\n' && caption[len] != '\r'; len++);
DrawStringF(BOT_SCREEN, x0 + (lvl-1) * (FONT_WIDTH_EXT/2), y0, text_color, COLOR_STD_BG,
"%*.*s", len, len, caption);
y0 += FONT_HEIGHT_EXT + (2*TV_VPAD);
}
// handle user input
u32 pad_state = InputWait(0);
if ((cursor >= 0) && (pad_state & BUTTON_A)) {
return MemTextViewer(text, len, lineno[cursor], false);
} else if (pad_state & BUTTON_B) {
break;
} else if (pad_state & BUTTON_UP) {
cursor = (cursor <= 0) ? ((int) n_captions - 1) : cursor - 1;
MemTextView(text, len, captions[cursor], 0, lineno[cursor], ww, 0, false);
} else if (pad_state & BUTTON_DOWN) {
if (++cursor >= (int) n_captions) cursor = 0;
MemTextView(text, len, captions[cursor], 0, lineno[cursor], ww, 0, false);
}
}
// clear screens
ClearScreenF(true, true, COLOR_STD_BG);
return true;
}
bool FileTextViewer(const char* path, bool as_script) { bool FileTextViewer(const char* path, bool as_script) {
// load text file (completely into memory) // load text file (completely into memory)
char* text = (char*) TEMP_BUFFER; char* text = (char*) TEMP_BUFFER;
@ -975,7 +1051,7 @@ bool FileTextViewer(const char* path, bool as_script) {
for (len = 0; (len < flen) && text[len]; len++); for (len = 0; (len < flen) && text[len]; len++);
// let MemTextViewer take over // let MemTextViewer take over
return MemTextViewer(text, len, as_script); return MemTextViewer(text, len, 1, as_script);
} }
bool ExecuteGM9Script(const char* path_script) { bool ExecuteGM9Script(const char* path_script) {

View File

@ -8,6 +8,7 @@
#define SCRIPT_MAX_SIZE (SCRIPT_BUFFER_SIZE-VAR_BUFFER_SIZE-1) #define SCRIPT_MAX_SIZE (SCRIPT_BUFFER_SIZE-VAR_BUFFER_SIZE-1)
bool ValidateText(const char* text, u32 size); bool ValidateText(const char* text, u32 size);
bool MemTextViewer(const char* text, u32 len, bool as_script); bool MemTextViewer(const char* text, u32 len, u32 start, bool as_script);
bool MemToCViewer(const char* text, u32 len, const char* title);
bool FileTextViewer(const char* path, bool as_script); bool FileTextViewer(const char* path, bool as_script);
bool ExecuteGM9Script(const char* path_script); bool ExecuteGM9Script(const char* path_script);