diff --git a/include/arm9/ui.h b/include/arm9/ui.h index b4085d5..d14eb32 100644 --- a/include/arm9/ui.h +++ b/include/arm9/ui.h @@ -13,6 +13,7 @@ void uiInit(); void uiDrawSplashScreen(); +void uiDrawConsoleWindow(); void uiClearConsoles(); void clearConsole(int which); void uiSetVerbose(bool verb); diff --git a/source/arm9/main.c b/source/arm9/main.c index 16c17e6..912cf6c 100644 --- a/source/arm9/main.c +++ b/source/arm9/main.c @@ -34,22 +34,22 @@ screen_init(); - uiDrawSplashScreen(); - uiInit(); + uiDrawSplashScreen(); + consoleSelect(&con_top); - uiPrintInfo("\x1B[32mGood morning\nHello !\e[0m\n\n"); + uiPrintIfVerbose("\x1B[32mGood morning\nHello !\e[0m\n\n"); PXI_sendWord(PXI_CMD_FORBID_POWER_OFF); - uiPrintInfo("Early filesystem init...\n"); + uiPrintIfVerbose("Early filesystem init...\n"); /* Try to read the settings file ASAP. */ if(fs_early_init()) { - uiPrintInfo("Loading settings...\n"); + uiPrintIfVerbose("Loading settings...\n"); if(loadSettings(&mode)) { @@ -73,29 +73,29 @@ else screen_init(); } - uiPrintInfo("Initializing devices...\n"); + uiPrintIfVerbose("Initializing devices...\n"); if(!devs_init()) screen_init(); - uiPrintInfo("Mounting filesystems...\n"); + uiPrintIfVerbose("Mounting filesystems...\n"); if(!mount_fs()) screen_init(); - uiPrintInfo("Detecting unit...\n"); + uiPrintIfVerbose("Detecting unit...\n"); unit_detect(); - uiPrintInfo("Detecting boot environment...\n"); + uiPrintIfVerbose("Detecting boot environment...\n"); boot_env_detect(); - uiPrintInfo("Detecting firmware...\n"); + uiPrintIfVerbose("Detecting firmware...\n"); fw_detect(); - uiPrintInfo("Entering menu...\n"); + uiPrintIfVerbose("Entering menu...\n"); - TIMER_sleep(1000); + TIMER_sleep(100); consoleClear(); @@ -104,11 +104,11 @@ finish_firmlaunch: - uiPrintInfo("Unmounting FS...\n"); + uiPrintIfVerbose("Unmounting FS...\n"); unmount_fs(); - uiPrintInfo("Closing devices...\n"); + uiPrintIfVerbose("Closing devices...\n"); devs_close(); @@ -120,12 +120,12 @@ const char *res_str[2] = {"\x1B[31mFailed!", "\x1B[32mOK!"}; bool sdRes, nandRes, wifiRes; - uiPrintInfo(" Initializing SD card... "); - uiPrintInfo("%s\e[0m\n", res_str[sdRes = dev_sdcard->init()]); - uiPrintInfo(" Initializing raw NAND... "); - uiPrintInfo("%s\e[0m\n", res_str[nandRes = dev_rawnand->init()]); - uiPrintInfo(" Initializing Wifi flash... "); - uiPrintInfo("%s\e[0m\n", res_str[wifiRes = dev_flash->init()]); + uiPrintIfVerbose(" Initializing SD card... "); + uiPrintIfVerbose("%s\e[0m\n", res_str[sdRes = dev_sdcard->init()]); + uiPrintIfVerbose(" Initializing raw NAND... "); + uiPrintIfVerbose("%s\e[0m\n", res_str[nandRes = dev_rawnand->init()]); + uiPrintIfVerbose(" Initializing Wifi flash... "); + uiPrintIfVerbose("%s\e[0m\n", res_str[wifiRes = dev_flash->init()]); bootInfo.sd_status = sdRes; bootInfo.nand_status = nandRes; @@ -170,7 +170,7 @@ res = f_mount(&sd_fs, "sdmc:", 1); - uiPrintInfo("%s\e[0m\n", res_str[res == FR_OK]); + uiPrintIfVerbose("%s\e[0m\n", res_str[res == FR_OK]); return res == FR_OK; } @@ -183,30 +183,30 @@ if(bootInfo.sd_status) { - uiPrintInfo("Mounting SD card FAT FS... "); + uiPrintIfVerbose("Mounting SD card FAT FS... "); res[0] = f_mount(&sd_fs, "sdmc:", 1); - if(res[0] == FR_OK) uiPrintInfo("%s\e[0m\n", res_str[1]); - //else uiPrintInfo("%s ERROR 0x%d\e[0m\n", res_str[0], res[0]); + if(res[0] == FR_OK) uiPrintIfVerbose("%s\e[0m\n", res_str[1]); + else uiPrintIfVerbose("%s ERROR 0x%d\e[0m\n", res_str[0], res[0]); finalRes &= res[0] == FR_OK; } else finalRes = false; if(bootInfo.nand_status) { - uiPrintInfo("Mounting twln FS... "); + uiPrintIfVerbose("Mounting twln FS... "); res[1] = f_mount(&nand_twlnfs, "twln:", 1); - if(res[1] == FR_OK) uiPrintInfo("%s\e[0m\n", res_str[1]); - else uiPrintInfo("%s ERROR 0x%d\e[0m\n", res_str[0], res[1]); + if(res[1] == FR_OK) uiPrintIfVerbose("%s\e[0m\n", res_str[1]); + else uiPrintIfVerbose("%s ERROR 0x%d\e[0m\n", res_str[0], res[1]); - uiPrintInfo("Mounting twlp FS... "); + uiPrintIfVerbose("Mounting twlp FS... "); res[2] = f_mount(&nand_twlpfs, "twlp:", 1); - if(res[2] == FR_OK) uiPrintInfo("%s\e[0m\n", res_str[1]); - else uiPrintInfo("%s ERROR 0x%d\e[0m\n", res_str[0], res[2]); + if(res[2] == FR_OK) uiPrintIfVerbose("%s\e[0m\n", res_str[1]); + else uiPrintIfVerbose("%s ERROR 0x%d\e[0m\n", res_str[0], res[2]); - uiPrintInfo("Mounting CTR NAND FAT FS... "); + uiPrintIfVerbose("Mounting CTR NAND FAT FS... "); res[3] = f_mount(&nand_fs, "nand:", 1); - if(res[3] == FR_OK) uiPrintInfo("%s\e[0m\n", res_str[1]); - else uiPrintInfo("%s ERROR 0x%d\e[0m\n", res_str[0], res[3]); + if(res[3] == FR_OK) uiPrintIfVerbose("%s\e[0m\n", res_str[1]); + else uiPrintIfVerbose("%s ERROR 0x%d\e[0m\n", res_str[0], res[3]); finalRes &= res[3] == res[2] == res[1] == FR_OK; } @@ -266,7 +266,7 @@ sprintf(bootInfo.model, "%s 3DS", bootInfo.unit_is_new3ds ? "New" : "Original"); - uiPrintInfo("%s detected!\n", bootInfo.model); + uiPrintIfVerbose("%s detected!\n", bootInfo.model); } #define CFG_REGS_BASE (IO_MEM_ARM9_ONLY) @@ -294,7 +294,7 @@ u8 *nand_sector = (u8*)malloc(0x200); if(!bootInfo.nand_status) - uiPrintInfo("\x1B[31mFailed!\e[0m\n"); + uiPrintIfVerbose("\x1B[31mFailed!\e[0m\n"); else { dev_decnand->read_sector(0x0B130000 >> 9, 1, nand_sector); @@ -311,7 +311,7 @@ const char *res_str[2] = {"\x1B[31mFailed!", "\x1B[32mOK!"}; bool success = loadConfigFile(); - uiPrintInfo("%s\e[0m\n", res_str[success]); + uiPrintIfVerbose("%s\e[0m\n", res_str[success]); if(success) { @@ -340,7 +340,7 @@ { uiClearConsoles(); - uiPrintInfo("Attempting to turn off...\n"); + uiPrintIfVerbose("Attempting to turn off...\n"); unmount_fs(); devs_close(); @@ -356,7 +356,7 @@ uiClearConsoles(); - uiPrintInfo("Attempting to reboot...\n"); + uiPrintIfVerbose("Attempting to reboot...\n"); unmount_fs(); devs_close(); diff --git a/source/arm9/menu.c b/source/arm9/menu.c index 1e81b29..d632be3 100644 --- a/source/arm9/menu.c +++ b/source/arm9/menu.c @@ -94,6 +94,7 @@ cursor_pos = 0; uiClearConsoles(); + uiDrawConsoleWindow(); TIMER_start(TIMER_0, TIMER_PRESCALER_64, TIMER_FREQ_64(60.0f), NULL); diff --git a/source/arm9/ui.c b/source/arm9/ui.c index 940824b..c025a05 100644 --- a/source/arm9/ui.c +++ b/source/arm9/ui.c @@ -18,7 +18,7 @@ static const void *bannerData = banner_ppm_bin; - +static void uiGetPPMInfo(const u8 *data, unsigned *width, unsigned *height); static void uiDrawPPM(unsigned start_x, unsigned start_y, const u8 *data); static void consoleMainInit() @@ -29,7 +29,6 @@ // randomize color randomColor = (rng_get_byte() % 6) + 1; - drawConsoleWindow(&con_top, 2, randomColor); consoleInit(SCREEN_LOW, &con_bottom); @@ -38,8 +37,11 @@ void uiDrawSplashScreen() { - uiDrawPPM(30,30, bannerData); - wait(0x6000000); // test + unsigned width, height; + + uiGetPPMInfo(bannerData, &width, &height); + // centered draw + uiDrawPPM((SCREEN_WIDTH_TOP - width) / 2, (SCREEN_HEIGHT_TOP - height) / 2, bannerData); } void uiInit() @@ -47,6 +49,11 @@ consoleMainInit(); } +void uiDrawConsoleWindow() +{ + drawConsoleWindow(&con_top, 2, randomColor); +} + static void clearConsoles() { consoleSelect(&con_bottom); @@ -206,30 +213,44 @@ } } +static inline void drawPixel(unsigned x, unsigned y, u16 color) +{ + u16 *framebuf = (u16 *) FRAMEBUF_TOP_A_1; + framebuf[x * SCREEN_HEIGHT_TOP + y] = color; +} + +static void uiGetPPMInfo(const u8 *data, unsigned *width, unsigned *height) +{ + /* get image dimensions */ + const char *ptr = (const char *) data + 3; + while(*ptr != 0x0A) ptr++; + ptr++; + + sscanf(ptr, "%i %i", width, height); +} static void uiDrawPPM(unsigned start_x, unsigned start_y, const u8 *data) { unsigned width, height; - u16 *framebuf = (u16 *) FRAMEBUF_TOP_A_1; /* get image dimensions */ const char *ptr = (const char *) data + 3; while(*ptr != 0x0A) ptr++; ptr++; - //sscanf(ptr, "%i %i", &width, &height); - width = 204; height = 21; + sscanf(ptr, "%i %i", &width, &height); const u8 *imagedata = data + 0x26; // skip ppm header + u16 color; for(unsigned x = 0; x < width; x++) { - for(unsigned y = height+start_y; y > start_y; y--) + for(unsigned y = height; y > 0; y--) { - //framebuf = &((u16*)FRAMEBUF_TOP_A_1)[SCREEN_HEIGHT_TOP * x + width - y]; - u8 *pixeldata = &imagedata[(width*(y-1)+x)*3]; - *framebuf++ = RGB8_to_565(pixeldata[0], pixeldata[1], pixeldata[2]); + const u8 *pixeldata = &imagedata[(x + (y-1) * width)*3]; + color = RGB8_to_565(pixeldata[2], pixeldata[0], pixeldata[1]); + drawPixel(start_x + x, start_y + height - y, color); } } }