From ce1f594a53793d4b1ec6648b44c12f65caea9128 Mon Sep 17 00:00:00 2001 From: Yann MAGNIN Date: Tue, 4 Jan 2022 15:18:58 +0100 Subject: [PATCH] vxBoot - 1.0.0 : GUI @add <> src/gui : add GUI menu <> src/loader/kernel : move kernel image list interaction <> assets-cg/fonts : add font for fxcg50 device <> include/vxBoot/config : add VXBOOT_VERSION macro @update <> src/cli/entry : move CLI main loop here <> src/main : link GUI en move CLI @fix <> src/loader/scan : fix file type check for emulator --- CMakeLists.txt | 11 ++- assets-cg/fonts/font8x9.png | Bin 0 -> 17324 bytes assets-cg/fonts/fxconv-metadata.txt | 8 ++ include/vxBoot/cli.h | 4 + include/vxBoot/config.h | 9 ++ include/vxBoot/gui.h | 32 +++++++ include/vxBoot/loader.h | 8 ++ src/cli/entry.c | 70 ++++++++++++++ src/gui/entry.c | 137 ++++++++++++++++++++++++++++ src/gui/fx9860g.c | 51 +++++++++++ src/gui/fxcg50.c | 52 +++++++++++ src/loader/kernel.c | 35 +++++++ src/loader/scan.c | 13 ++- src/main.c | 75 ++------------- 14 files changed, 433 insertions(+), 72 deletions(-) create mode 100644 assets-cg/fonts/font8x9.png create mode 100644 assets-cg/fonts/fxconv-metadata.txt create mode 100644 include/vxBoot/config.h create mode 100644 include/vxBoot/gui.h create mode 100644 src/cli/entry.c create mode 100644 src/gui/entry.c create mode 100644 src/gui/fx9860g.c create mode 100644 src/gui/fxcg50.c create mode 100644 src/loader/kernel.c diff --git a/CMakeLists.txt b/CMakeLists.txt index b35c017..9e53f98 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.15) -project(vxBoot VERSION 0.0.3 LANGUAGES C) +project(vxBoot VERSION 1.0.0 LANGUAGES C) include(GenerateG1A) include(GenerateG3A) @@ -8,7 +8,11 @@ find_package(Gint 2.1 REQUIRED) set(SOURCES src/main.c + src/gui/entry.c + src/gui/fx9860g.c + src/gui/fxcg50.c src/cli/parser.c + src/cli/entry.c src/fs/smemfs/mount.c src/fs/smemfs/pread.c src/terminal/close.c @@ -25,6 +29,7 @@ set(SOURCES src/loader/elf/image.c src/loader/error.c src/loader/entry.c + src/loader/kernel.c src/hardware/get_info.c ) # Shared assets, fx-9860G-only assets and fx-CG-50-only assets @@ -35,13 +40,13 @@ set(ASSETS_fx assets-fx/fonts/hexa.png ) set(ASSETS_cg - # ... + assets-cg/fonts/font8x9.png ) fxconv_declare_assets(${ASSETS} ${ASSETS_fx} ${ASSETS_cg} WITH_METADATA) add_executable(vxBoot ${SOURCES} ${ASSETS} ${ASSETS_${FXSDK_PLATFORM}}) -target_compile_options(vxBoot PRIVATE -Wall -Wextra -Os) +target_compile_options(vxBoot PRIVATE -Wall -Wextra -Os -DVXBOOT_VERSION="${PROJECT_VERSION}") target_include_directories(vxBoot PRIVATE include/) if("${FXSDK_PLATFORM_LONG}" STREQUAL fx9860G) diff --git a/assets-cg/fonts/font8x9.png b/assets-cg/fonts/font8x9.png new file mode 100644 index 0000000000000000000000000000000000000000..af01487a08ba5c9bd509ad10978f4eb0cf3bbd09 GIT binary patch literal 17324 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 XkNuY`V7ltb00000NkvXXu0mjfQ6hLx literal 0 HcmV?d00001 diff --git a/assets-cg/fonts/fxconv-metadata.txt b/assets-cg/fonts/fxconv-metadata.txt new file mode 100644 index 0000000..c5beb94 --- /dev/null +++ b/assets-cg/fonts/fxconv-metadata.txt @@ -0,0 +1,8 @@ +font8x9.png: + type: font + name: font_fxcg50 + charset: print + grid.size: 8x11 + grid.padding: 1 + grid.border: 0 + height: 9 diff --git a/include/vxBoot/cli.h b/include/vxBoot/cli.h index 1d48b27..f53e8ed 100644 --- a/include/vxBoot/cli.h +++ b/include/vxBoot/cli.h @@ -4,6 +4,10 @@ #include #include + +/* cli_main() : main entry for the CLI */ +extern void cli_main(void); + extern int cli_parser_strtotab(int *argc, char ***argv, char const *str); extern void cli_parser_strtotab_quit(int *argc, char ***argv); diff --git a/include/vxBoot/config.h b/include/vxBoot/config.h new file mode 100644 index 0000000..901a028 --- /dev/null +++ b/include/vxBoot/config.h @@ -0,0 +1,9 @@ +#ifndef VXBOOT_CONFIG +# define VXBOOT_CONFIG 1 + +/* vxBoot version */ +#ifndef VXBOOT_VERSION +# define VXBOOT_VERSION "0.0.0" +#endif + +#endif /* VXBOOT_CONFIG */ diff --git a/include/vxBoot/gui.h b/include/vxBoot/gui.h new file mode 100644 index 0000000..a7ee1b5 --- /dev/null +++ b/include/vxBoot/gui.h @@ -0,0 +1,32 @@ +#ifndef __VXBOOT_GUI_H__ +# define __VXBOOT_GUI_H__ + +#include +#include + +/* internal GUI information */ +struct gui_meta { + struct { + int anchor; + int select; + int count; + int line; + } list; + struct { + int x; + int y; + int width; + int offset; + } scroll; +}; + +/* gui_main() : main entry for the GUI */ +extern void gui_main(void); + +/* gui_fx9860g_display() : fx9860-specific display */ +extern void gui_fx9860g_display(struct gui_meta *gui); + +/* gui_fxcg50_display() : fxcg50-specific display */ +extern void gui_fxcg50_display(struct gui_meta *gui); + +#endif /*__VXBOOT_GUI_H__*/ diff --git a/include/vxBoot/loader.h b/include/vxBoot/loader.h index 62e2f0d..a8f680a 100644 --- a/include/vxBoot/loader.h +++ b/include/vxBoot/loader.h @@ -114,6 +114,14 @@ struct ldimg { /* loader_scan() : scan the storage memory and try to find ELF PIE file */ extern int loader_scan(void); +/* loader_kernel_img_get() : get the image ID information */ +extern struct ldimg *loader_kernel_img_get(int id); + +/* loader_kernel_img_count() : count the number of kernel image found */ +extern int loader_kernel_img_count(void); + + + /* loader() : try to load a ELF PIE file */ #define LOADER_DEFAULT 0 #define LOADER_DUMP 1 diff --git a/src/cli/entry.c b/src/cli/entry.c new file mode 100644 index 0000000..45af8bf --- /dev/null +++ b/src/cli/entry.c @@ -0,0 +1,70 @@ +#include "vxBoot/cli.h" +#include "vxBoot/builtin.h" +#include "vxBoot/terminal.h" + +#include + +//TODO: better API for the command-line parser + +/* internal builtin list */ +struct { + const char *name; + int (*f)(int argc, char **argv); +} cmd_list[] = { + {.name = "ls", &ls_main}, + {.name = "ld", &ld_main}, + {.name = "hw", &hw_main}, + {.name = "help", &help_main}, + {.name = NULL, NULL} +}; + +/* try to find the appropriate command */ +static int (*check_cmd(char *cmd))(int, char**) +{ + for (int i = 0; cmd_list[i].name != NULL; ++i) { + if (strcmp(cmd, cmd_list[i].name) != 0) + continue; + if (cmd_list[i].f == NULL) + terminal_write("command exist but not implemented\n"); + return (cmd_list[i].f); + } + return (NULL); +} + +void cli_main(void) +{ + int (*builtin)(int, char**); + const char *usrline; + char buff[128]; + char **argv; + int argc; + int ret; + + /* CLI loop */ + ret = 0; + while (1) { + /* get user command */ + usrline = (ret != 0) ? "/[%d]>" : "/>"; + terminal_write(usrline, ret); + ret = 0; + if (terminal_read(buff, 128) <= 1) + continue; + + /* parse and try to find the command */ + if (cli_parser_strtotab(&argc, &argv, buff) != 0) { + terminal_write("error when processing \"%s\"", buff); + ret = 255; + continue; + } + builtin = check_cmd(argv[0]); + if (builtin == NULL) { + terminal_write("command \"%s\" not found\n", argv[0]); + ret = 127; + continue; + } + + /* execute the command and free'd allocated memories */ + ret = builtin(argc, argv); + cli_parser_strtotab_quit(&argc, &argv); + } +} diff --git a/src/gui/entry.c b/src/gui/entry.c new file mode 100644 index 0000000..3f7c415 --- /dev/null +++ b/src/gui/entry.c @@ -0,0 +1,137 @@ +#include "vxBoot/gui.h" +#include "vxBoot/loader.h" + +#include +#include + +//--- +// Private +//--- + + + + +//-- +// Public +//--- + + +/* gui_main() : main loop for the GUI display */ +void gui_main(void) +{ + struct gui_meta disp; + void (*display)(struct gui_meta*); + int key; + + + disp.list.anchor = 0; + disp.list.select = 0; + disp.list.count = loader_kernel_img_count(); +#ifdef FX9860G + disp.list.line = 5; + disp.scroll.y = 10; + disp.scroll.offset = 0; + if (disp.list.count - 6 > 0) { + disp.scroll.width = (6 * 48) / disp.list.count; + disp.scroll.offset = (38 - disp.scroll.width); + disp.scroll.offset /= (disp.list.count - 6); + } + display = &gui_fx9860g_display; +#endif +#ifdef FXCG50 + disp.list.line = 11; + disp.scroll.y = 21; + disp.scroll.offset = 0; + if (disp.list.count - 11 > 0) { + disp.scroll.width = 167 / (disp.list.count - 11); + disp.scroll.offset = (167 - disp.scroll.width); + disp.scroll.offset /= (disp.list.count - 11); + } + display = &gui_fxcg50_display; +#endif + while (1) { + dclear(C_BLACK); + (*display)(&disp); + dupdate(); + + key = getkey().key; + if (key == KEY_F6) + break; + if (key == KEY_EXE || key == KEY_SHIFT) { + loader( + loader_kernel_img_get(disp.list.select)->inode, + LOADER_DEFAULT + ); + } + if (key == KEY_UP) { + disp.list.select -= 1; + if (disp.list.select < 0) + disp.list.select = 0; + if (disp.list.select < disp.list.anchor) + disp.list.anchor -= 1; + } + if (key != KEY_DOWN) + continue; + disp.list.select += 1; + if (disp.list.select >= disp.list.count) + disp.list.select = disp.list.count - 1; + if (disp.list.select - disp.list.anchor >= disp.list.line) + disp.list.anchor += 1; + } + +} + +#if 0 +/* gui_main() : main loop for the GUI display */ +void gui_main(void) +{ + int select_height; + int disp_start; + int max_line; + int offsetW; + int offsetH; + int selected; + int lheight; + int loffset; + int lrest; + int count; + int key; + int pos; + int i; + + selected = 0; + disp_start = 0; + offsetW = (DWIDTH * 5) / 100; + offsetH = (DHEIGHT * 5) / 100; + select_height = DHEIGHT - (offsetH * 3) - 6; + select_height = select_height - (offsetH * 2) - 6; + max_line = (select_height / (FHEIGHT + 6)) + 1; + count = loader_kernel_img_count(); + lheight = (max_line * select_height) / count; + lrest = select_height - lheight; + while (1) { + dclear(C_BLACK); + dupdate(); + + key = getkey().key; + if (key == KEY_F6) + break; + if (key == KEY_EXE || key == KEY_SHIFT) { + loader( + loader_kernel_img_get(selected)->inode, + LOADER_DEFAULT + ); + } + if (key == KEY_UP) { + selected -= 1; + if (selected < 0) selected = 0; + if (selected < disp_start) disp_start -= 1; + } + if (key == KEY_DOWN) { + selected += 1; + if (selected >= count) selected = count - 1; + if (selected - disp_start >= max_line) disp_start += 1; + } + } +} +#endif diff --git a/src/gui/fx9860g.c b/src/gui/fx9860g.c new file mode 100644 index 0000000..6415020 --- /dev/null +++ b/src/gui/fx9860g.c @@ -0,0 +1,51 @@ +#include "vxBoot/gui.h" +#include "vxBoot/loader.h" + +#include + +#if FX9860G +/* fx9860g_display() : Hardcoded display for the fx9860g */ +void gui_fx9860g_display(struct gui_meta *disp) +{ + char const * name; + int posy; + int tmp; + int sy; + int i; + + dprint_opt( + DWIDTH / 2, 1, + C_WHITE, C_BLACK, + DTEXT_CENTER, DTEXT_TOP, + "VxBoot version %s", + VXBOOT_VERSION + ); + drect_border(8, 8, 120, 50, C_NONE, 1, C_WHITE); + if (disp->scroll.offset > 0) { + sy = disp->scroll.y + (disp->list.anchor * disp->scroll.offset); + dline(118, sy, 118, sy + disp->scroll.width, C_WHITE); + } + i = disp->list.anchor - 1; + while (++i < disp->list.count && i - disp->list.anchor < 6) { + posy = 10 + ((i - disp->list.anchor) * 7); + name = loader_kernel_img_get(i)->inode->name; + dtext(11, posy + 1, C_WHITE, name); + if (i != disp->list.select) + continue; + tmp = (disp->scroll.offset > 0) ? 116 : 118; + drect(10, posy, tmp, posy + 6, C_INVERT); + } + dprint_opt( + DWIDTH / 2, 54, + C_WHITE, C_BLACK, + DTEXT_CENTER, DTEXT_MIDDLE, + "Use arrows to select" + ); + dprint_opt( + DWIDTH / 2, 60, + C_WHITE, C_BLACK, + DTEXT_CENTER, DTEXT_MIDDLE, + "Press [EXE] to boot" + ); +} +#endif diff --git a/src/gui/fxcg50.c b/src/gui/fxcg50.c new file mode 100644 index 0000000..0694d7b --- /dev/null +++ b/src/gui/fxcg50.c @@ -0,0 +1,52 @@ +#include "vxBoot/gui.h" +#include "vxBoot/loader.h" +#include "vxBoot/config.h" + +#include + +/* fxcg50_display() : Hardcoded display for the fxcg50 */ +void gui_fxcg50_display(struct gui_meta *disp) +{ + char const * name; + int posy; + int tmp; + int sy; + int i; + + dprint_opt( + DWIDTH / 2, 5, + C_WHITE, C_BLACK, + DTEXT_CENTER, DTEXT_TOP, + "VxBoot version %s", + VXBOOT_VERSION + ); + drect_border(17, 18, 378, 189, C_NONE, 1, C_WHITE); + if (disp->scroll.offset > 0) { + sy = disp->scroll.y + (disp->list.anchor * disp->scroll.offset); + dline(375, sy, 375, sy + disp->scroll.width, C_WHITE); + } + i = disp->list.anchor - 1; + while (++i < disp->list.count && i - disp->list.anchor < 11) { + posy = 22 + ((i - disp->list.anchor) * 15); + name = loader_kernel_img_get(i)->inode->name; + dtext(22, posy + 2, C_WHITE, name); + if (i != disp->list.select) + continue; + tmp = (disp->scroll.offset > 0) ? 373 : 375; + drect(20, posy, tmp, posy + 13, C_INVERT); + } + + dprint_opt( + DWIDTH / 2, 200, + C_WHITE, C_BLACK, + DTEXT_CENTER, DTEXT_MIDDLE, + "Use arrows keys to select entry" + ); + dprint_opt( + DWIDTH / 2, 212, + C_WHITE, C_BLACK, + DTEXT_CENTER, DTEXT_MIDDLE, + "Press [EXE] to boot the selected OS" + ); + +} diff --git a/src/loader/kernel.c b/src/loader/kernel.c new file mode 100644 index 0000000..ac47f6d --- /dev/null +++ b/src/loader/kernel.c @@ -0,0 +1,35 @@ +#include "vxBoot/loader.h" + + +/* kernel image list */ +struct ldimg *kernel_img_list = NULL; + + +/* loader_kernel_img_get() : get the image ID information */ +struct ldimg *loader_kernel_img_get(int id) +{ + struct ldimg *img; + + img = kernel_img_list; + while (--id >= 0) { + if (img == NULL) + return NULL; + img = img->next; + } + return img; +} + +/* loader_kernel_img_count() : count the number of kernel image found */ +int loader_kernel_img_count(void) +{ + struct ldimg *img; + int counter; + + counter = 0; + img = kernel_img_list; + while (img != NULL) { + counter = counter + 1; + img = img->next; + } + return counter; +} diff --git a/src/loader/scan.c b/src/loader/scan.c index 8f32522..bc19006 100644 --- a/src/loader/scan.c +++ b/src/loader/scan.c @@ -6,18 +6,23 @@ #include + /* internal kernel image list */ -struct ldimg *kernel_img_list = NULL; +extern struct ldimg *kernel_img_list; - -/* hypervisor_get_image_list(): Dump all ELF file stored into the SMEM */ +/* hypervisor_get_image_list(): Dump all ELF file stored into the SMEM + * + * @note: + * on real calculator, all file transfered using USB are concidered to be + * 'archived', but on emulator they are concidered like file. */ static int loader_list_img(struct ldimg **image, struct smemfs_inode *inode) { if (inode == NULL) return (0); int counter = 0; - if (inode->type != BFile_Type_Archived) { + if (inode->type != BFile_Type_Archived + && inode->type != BFile_Type_File) { counter += loader_list_img(image, inode->child); goto anchor; } diff --git a/src/main.c b/src/main.c index 25c6c66..2f0db9e 100644 --- a/src/main.c +++ b/src/main.c @@ -1,56 +1,24 @@ #include "vxBoot/terminal.h" -#include "vxBoot/cli.h" -#include "vxBoot/builtin.h" #include "vxBoot/fs/smemfs.h" #include "vxBoot/loader.h" +#include "vxBoot/gui.h" +#include "vxBoot/cli.h" -#include #include -#include - -//TODO: better API for the command-line parser - -/* internal builtin list */ -struct { - const char *name; - int (*f)(int argc, char **argv); -} cmd_list[] = { - {.name = "ls", &ls_main}, - {.name = "ld", &ld_main}, - {.name = "hw", &hw_main}, - {.name = "help", &help_main}, - {.name = NULL, NULL} -}; - -/* try to find the appropriate command */ -static int (*check_cmd(char *cmd))(int, char**) -{ - for (int i = 0; cmd_list[i].name != NULL; ++i) { - if (strcmp(cmd, cmd_list[i].name) != 0) - continue; - if (cmd_list[i].f == NULL) - terminal_write("command exist but not implemented\n"); - return (cmd_list[i].f); - } - return (NULL); -} /* entry of the bootloader */ int main(void) { - int (*builtin)(int, char**); - const char *usrline; - char buff[128]; - char **argv; - int argc; - int ret; - /* change default font on fx9860 */ #ifdef FX9860G extern font_t font_hexa; dfont(&font_hexa); #endif +#ifdef FXCG50 + extern font_t font_fxcg50; + dfont(&font_fxcg50); +#endif /* early log */ terminal_open(); @@ -64,32 +32,9 @@ int main(void) smemfs_mount(); loader_scan(); - /* CLI loop */ - ret = 0; - while (1) { - /* get user command */ - usrline = (ret != 0) ? "/[%d]>" : "/>"; - terminal_write(usrline, ret); - ret = 0; - if (terminal_read(buff, 128) <= 1) - continue; - - /* parse and try to find the command */ - if (cli_parser_strtotab(&argc, &argv, buff) != 0) { - terminal_write("error when processing \"%s\"", buff); - ret = 255; - continue; - } - builtin = check_cmd(argv[0]); - if (builtin == NULL) { - terminal_write("command \"%s\" not found\n", argv[0]); - ret = 127; - continue; - } - - /* execute the command and free'd allocated memories */ - ret = builtin(argc, argv); - cli_parser_strtotab_quit(&argc, &argv); - } + /* GUI Loop */ + if (loader_kernel_img_count() >= 1) + gui_main(); + cli_main(); return (1); }