summaryrefslogtreecommitdiff
path: root/Source/Kernel/Core/SB.ns.cpp
blob: 62714a1496d4888f69143c8ea27f8cafeabbfc18 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include "SB.ns.h"
#include <Mutex.class.h>
#include <TaskManager/Task.ns.h>
#include <MemoryManager/PhysMem.ns.h>
#include <DeviceManager/Disp.ns.h>

namespace SB {

SimpleVT *sb = NULL;

String msg;

u16int boot_progress = 0;
bool gone_multi = false;

Mutex lock(MUTEX_FALSE);

void init() {
	sb = new SimpleVT(1, 80, STATUSBAR_FGCOLOR, STATUSBAR_BGCOLOR);
	sb->map(0, 0);
	sb->hideCursor();
}

void reinit() {
	if (!gone_multi) return;
	lock.waitLock();
	delete sb;
	sb = new SimpleVT(1, Disp::mode.textCols, STATUSBAR_FGCOLOR, STATUSBAR_BGCOLOR);
	sb->map(0, 0);
	sb->hideCursor();
	lock.unlock();
}

void drawprogress(const String& s) {
	*sb << "\nMelon is loading :       {";
	for (u32int i = 0; i < boot_progress; i++) *sb << ":";
	*sb << ".";
	sb->moveCursor(0, 45);
	*sb << "}";
	sb->moveCursor(0, 51);
	*sb << "[" << s;
	sb->moveCursor(0, 78);
	*sb << "]";
}

void drawnormal() {
	*sb << "\n [Up:" << (s64int)Time::uptime() << "s";
	sb->moveCursor(0, 10);
	*sb << "] [Mem:" << (s64int)PhysMem::free() << "/" << (s64int)PhysMem::total();
	sb->moveCursor(0, 28);
	*sb << "] [Proc.:" << (s64int)Task::processes->size();
	sb->moveCursor(0, 39);
	*sb << "] [Threads:" << (s64int)Task::threads->size();
	sb->moveCursor(0, 52);
	*sb << "] [" << msg;
	sb->moveCursor(0, sb->width() - 2);
	*sb << "]";
}

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