#include <kernel/myelin.h>
#include <kernel/console.h>
#include <boot/splash.h>
/**
* \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;
}