#include #include #include /** * \brief Call a splash_action_function */ static void splash_do(splash_action_function func, void* arg) { func(arg); } /** * \brief Draw the progress bar * \param num Current action * \param count Number of actions * \param screen Screen information * \param text Action message */ static void splash_paint(int num, int count, struct splash_screen screen, const char* text) { u32 i, j = screen.width - (count - num), k = screen.width; /* * Draw bar outline */ console.screen.fore = screen.line; console.cursor.x = screen.x - 1; console.cursor.y = screen.y - 1; console_writechar(218); for (i = 0; i < k; ++i) console_writechar(196); console_writechar(191); console.cursor.x = screen.x - 1; console.cursor.y++; console_writechar(179); for (i = 0; i < k; ++i) console_writechar(' '); console_writechar(179); console.cursor.x = screen.x - 1; console.cursor.y++; console_writechar(192); for (i = 0; i < k; ++i) console_writechar(196); console_writechar(217); console.cursor.x = screen.x; console.cursor.y++; /* * Write message */ console.screen.fore = screen.text; console_writestring(text); /* * Draw progress */ console.screen.fore = screen.fill; console.cursor.x = screen.x; console.cursor.y = screen.y; for (i = 0; i < j; ++i) console_writechar(219); for (; j < k; ++j) console_writechar(' '); } /** * \brief Draw a splash screen while booting the system * \param screen Splash screen info * \param actions Actions which need to be completed to boot the system * \param count Number of actions */ void splash(struct splash_screen screen, struct splash_action* actions, u32 count) { u8 saved_fore = console.screen.fore; u8 saved_back = console.screen.back; u32 saved_flags = console.cursor.flags; u32 i = 0; console.cursor.flags &= ~(CONSOLE_CURSOR_ENABLED); console.screen.back = screen.back; console_clear(); if (!(screen.bar)) { console.cursor.x = console.cursor.y = 0; console.screen.fore = screen.text; console_writestring("MYELIN (booting)...\n\n"); } while (i < count) { if (screen.bar) { console_clear(); console.cursor.x = console.cursor.y = 0; console.screen.fore = screen.text; console_writestring("MYELIN (booting)...\n\n"); splash_paint(i + 1, count, screen, actions[i].msg); splash_do(actions[i].func, actions[i].arg); } else { /* * Save y co-ord in case a callback function prints its * own text */ unsigned y1 = console.cursor.y, y2; console.screen.fore = screen.text; console_writestring(actions[i].msg); console.cursor.x = 0; console.cursor.y++; splash_do(actions[i].func, actions[i].arg); console.cursor.x = console.screen.columns - 7; y2 = console.cursor.y; console.cursor.y = y1; console.screen.fore = screen.line; console_writestring("["); console.screen.fore = screen.fill; console_writestring("DONE"); console.screen.fore = screen.line; console_writestring("]\n"); console.cursor.x = 0; console.cursor.y = y2; } ++i; } console.screen.fore = saved_fore; console.screen.back = saved_back; console.cursor.flags = saved_flags; }