#include "SB.ns.h" #include #include #include #include #define BOOT_ITEMS 17 namespace SB { SimpleVT *sb = NULL; String msg; u16int boot_progress = 0; u16int height; bool gone_multi = false; Mutex lock(MUTEX_FALSE); void init() { sb = new SimpleVT(1, 80, STATUSBAR_FGCOLOR, STATUSBAR_BGCOLOR); height = 1; sb->map(0, 0); *sb << MVT::hidecsr(); } void drawprogress(const String& s) { *sb << MVT::clear(); int d = (sb->width() / 2) - ((BOOT_ITEMS + 4) / 2); if (height == 1) d -= 4; *sb << MVT::movecsr(0, d) << "{"; for (u32int i = 0; i < boot_progress; i++) *sb << ":"; *sb << "." << MVT::movecsr(0, BOOT_ITEMS + d + 3) << "}"; if (height > 1) { *sb << "\n"; *sb << "Loading : [" << s << MVT::movecsr(1, sb->width() - 2) << "]"; } else { *sb << MVT::movecsr(0, 0) << "Melon is loading :" << MVT::movecsr(0, d + BOOT_ITEMS + 6) << "[" << s; *sb << MVT::movecsr(0, sb->width() - 2) << "]"; } } void drawnormal() { *sb << MVT::clear() << MVT::movecsr(0, 0) << " [Up:" << (s64int)Time::uptime() << "s"; *sb << MVT::movecsr(0, 10) << "] [Mem:" << (s64int)PhysMem::free() << "/" << (s64int)PhysMem::total(); *sb << MVT::movecsr(0, 28) << "] [Proc.:" << (s64int)Task::processes->size() << MVT::setcsrcol(39); if (height > 1) { *sb << "]" << MVT::movecsr(1, 0); *sb << " [Threads:" << (s64int)Task::threads->size(); *sb << MVT::setcsrcol(12) << "] [" << msg; *sb << MVT::setcsrcol(sb->width() - 2) << "]"; } else { *sb << "] [Threads:" << (s64int)Task::threads->size(); *sb << MVT::setcsrcol(52) << "] [" << msg << MVT::setcsrcol(sb->width() - 2) << "]"; } } void reinit() { if (!gone_multi) return; lock.waitLock(); delete sb; height = (Disp::mode.textCols < 80 ? 2 : 1); sb = new SimpleVT(height, Disp::mode.textCols, STATUSBAR_FGCOLOR, STATUSBAR_BGCOLOR); sb->map(0, 0); *sb << MVT::hidecsr(); if (boot_progress != 0) { drawprogress(msg); } else { drawnormal(); } lock.unlock(); } u32int thread(void*) { while (!gone_multi); //Synchronize while (1) { lock.waitLock(); if (boot_progress != 0) { drawprogress(msg); } else { drawnormal(); } lock.unlock(); Task::currThread()->sleep(100); } return 0; } void gomulti() { new Thread(thread, 0, true); gone_multi = true; } void progress(const String& s) { if (gone_multi) { lock.waitLock(); boot_progress++; msg = s; lock.unlock(); } else { boot_progress++; drawprogress(s); } } void message(const String& s) { if (!gone_multi) return; lock.waitLock(); boot_progress = 0; msg = s; drawnormal(); lock.unlock(); } } //END NS