SayoriOS 0.3.3

tshell.c
См. документацию.
1
11 #include <kernel.h>
12 #include <io/ports.h>
13 #include <io/imaging.h>
14 #include <io/colors.h>
15 #include <lib/stdio.h>
16 #include <lib/tui.h>
17 #include <drv/input/keymap.h>
18
19 int32_t oldPosX = 0; // Последние местоположение символа по X (место печати)
20 int32_t oldPosY = 0; // Последние местоположение символа по Y (место печати)
21 int32_t curMenu = 0; // Текущие меню
22 uint32_t bakMenu = -1;
23
24 void headBar(){
25 drawLine(2,TUI_BASE_COLOR_HEAD);
26 char* OSNAME = " SayoriOS v0.3.5 (Dev)";
27 setPosX(0);
28 setPosY(16*1);
29 tty_puts_color(OSNAME,getColorsTUI(false), TUI_BASE_COLOR_HEAD);
30
31 tty_setcolor(getColorsTUI(false));
32 char* TIME = "10/10/2022 12:23";
33 setPosX((getMaxStrLineTUI()-16)*8);
34 setPosY(16*1);
35 drawRect((getMaxStrLineTUI()-16)*8,16,18*8, 16,TUI_BASE_COLOR_HEAD);
36 tty_puts_color(TIME,getColorsTUI(false), TUI_BASE_COLOR_HEAD);
37 }
38
39 void headBarOld(){
40 setPosX(16);
41 setPosY(16*4);
42 char infoCPU[512];
43 substr(infoCPU, "CPU: sgetNameBrand()", 0, (getMaxListMenuTUI()/2)-2);
44 tty_puts_color(infoCPU,getColorsTUI(false), getColorsTUI(true));
45
46 setPosX(16);
47 setPosY(16*5);
48 char infoRAM[512];
49 //substr(infoRAM, strcat(format_string("RAM: %d",(getInstalledRam())), kb), 0, (getMaxListMenuTUI()/2)-2);
50 tty_puts_color(infoRAM,getColorsTUI(false), getColorsTUI(true));
51
52 setPosX(16);
53 setPosY(16*6);
54 char infoVideo[512];
55 substr(infoVideo, "Video: Basic video adapter (Unknown)", 0, (getMaxListMenuTUI()/2)-2);
56 tty_puts_color(infoVideo,getColorsTUI(false), getColorsTUI(true));
57
58 setPosX(16);
59 setPosY(16*7);
60 char infoDisplay[512];
61 substr(infoDisplay, "Display", 0, (getMaxListMenuTUI()/2)-2);
62 tty_puts_color(infoDisplay,getColorsTUI(false), getColorsTUI(true));
63 }
64
65 void footBar(char* text){
66 drawRect(0,getHeightScreen()-16,1024,getHeightScreen(),VESA_LIGHT_GREY);
67 setPosX(0);
68 setPosY(getHeightScreen()-16);
69 tty_puts_color(text,VESA_BLACK, VESA_LIGHT_GREY);
70 }
71
72 void updateLoop(){
73 // Получаем последнию позицию курсора
74 oldPosX = getPosX();
75 oldPosY = getPosY();
76
77 // Выводим нажатую кнопку во второй колонке в шапке
78 //char* TIME = "10/10/2022 12:23";
79 setPosX((getMaxStrLineTUI()-20)*8);
80 setPosY(0);
81 tty_setcolor(getColorsTUI(false));
82 drawRect((getMaxStrLineTUI()-16)*8,0,20*8, 15, TUI_BASE_COLOR_HEAD);
83
84 /* CAUSES PageFault
85 * Оставлю до лучших времен, крашиться, причина не известна
86 struct synapse_time* TIME = get_time();
87 char hrw[3];
88 char mnw[3];
89 char scw[3];
90
91 char dw[3];
92 char mw[3];
93 char yw[5];
94
95 itoa(TIME->hours, hrw);
96 itoa(TIME->minutes, mnw);
97 itoa(TIME->seconds, scw);
98
99 itoa(TIME->day, dw);
100 itoa(TIME->month, mw);
101 itoa(TIME->year, yw);
102
103 char totaltime[48] = {0};
104 strcpy(totaltime, dw);
105 strcat(totaltime, "/");
106 strcat(totaltime, mw);
107 strcat(totaltime, "/");
108 strcat(totaltime, yw);
109 strcat(totaltime, " ");
110 if(TIME->hours<10) strcat(totaltime, "0");
111 strcat(totaltime, hrw);
112 strcat(totaltime, ":");
113 if(TIME->minutes<10) strcat(totaltime, "0");
114 strcat(totaltime, mnw);
115 strcat(totaltime, ":");
116 if(TIME->seconds<10) strcat(totaltime, "0");
117 strcat(totaltime, scw);
118
119 tty_puts_color(totaltime, getColorsTUI(false), TUI_BASE_COLOR_HEAD);
120
121 */
122 if (getCharRaw() != 0){
123 qemu_printf("Last key ID: %d",getCharRaw());
124 }
125 // Возращаем указатель обратно
126 setPosX(oldPosX);
127 setPosY(oldPosY);
128 }
129
130 void menu0(bool items){
131 if (items){
132 setCurrentItemTUI(0);
133 cleanItems();
134 addItem("Info PC",true,"",""); // 0
135 addItem("List PCI-Devices",true,"",""); // 1
136 addItem("Application List",true,"",""); // 2
137 addItem("Exit to Console",false,"",""); // 3
138 addItem("Reboot",false,"",""); // 4
139 addItem("Shutdown",false,"",""); // 5
140 }
141 curMenu = 0;
142 bakMenu = -1;
143 createMenuBox("Base menu:");
144
145 }
146
147 void menu1(bool items){
148 if (items){
149 setCurrentItemTUI(0);
150 cleanItems();
151 addItem("OS: SayoriOS v0.3.5 (Dev)",true,"","");
152 addItem("CPU: CX",true,"","");
153 addItem("RAM: ASD kb",true,"","");
154 addItem("Display: %s",true,"",""); // 2
155 addItem("Video: Basic video adapter (Unknown)",true,"","");
156 addItem("Back",false,"","");
157 }
158 curMenu = 1;
159 bakMenu = 0;
160 createMenuBox("System Info");
161 }
162
163 void menuExit(){
164 cleanItems();
165 addItem("Yes, close TShell",false,"","");
166 addItem("No, I don't want to log out of TShell",false,"","");
167 curMenu = -2;
168 bakMenu = -1;
169 createMenuBox("Are you sure you want to quit TShell?");
170 }
171
172 void menuGen(bool items){
173 uint32_t h = curMenu;
174 if (h == 0){
175 menu0(items);
176 } else if (h == 1){
177 menu1(items);
178 } else if (h == -2){
179 menuExit(items);
180 }
181 }
182
183 uint32_t menuHandler(){
184 uint32_t h = curMenu;
185 uint32_t i = getCurrentItemTUI();
186 qemu_printf("[menuHandler] Handler: %d | Item: %d\n",h,i);
187 if (h == 0 && i == 0){
188 menu1(true);
189 return 0;
190 } else if (h == 0 && i == 1){
191 createErrorBox("Error in TShell. ","This functionality has not yet been implemented.");
192 sleep_ms(3000);
193 cleanWorkSpace(TUI_BASE_COLOR_BODY);
194 curMenu = 0;
195 menuGen(true);
196 return 0;
197 } else if (h == 0 && i == 2){
198 createErrorBox("Error in TShell. ","This functionality has not yet been implemented.");
199 sleep_ms(3000);
200 cleanWorkSpace(TUI_BASE_COLOR_BODY);
201 curMenu = 0;
202 menuGen(true);
203 return 0;
204 } else if ((h == 0 && i == 3) || (h == -2 && i == 0)){
205 return -1;
206 } else if (h == -2 && i == 1){
207 cleanWorkSpace(TUI_BASE_COLOR_BODY);
208 setModeTUI(TUI_DEFAULT);
209 return 0;
210 } else if (h == 0 && i == 4){
211 reboot();
212 return 0;
213 } else if (h == 0 && i == 5){
214 shutdown();
215 return 0;
216 } else if (h == 1 && i == 5){
217 menu0(true);
218 return 0;
219 }
220 return 0;
221 }
222
223 int tshell(){
224 tui_configurate();
225 int32_t i = 0;
226 setLastUpdateTUI(getTicks()+5);
227 while(1){
228 //qemu_log("Wait to %d",getIntKeyboardWait());
229 if (getTicks() < getLastUpdateTUI()){
230 // Просто игнорируем работу цикла
231 continue;
232 }
233 // Выполняем цикл
234 updateLoop();
235 if (getModeTUI() == TUI_ERROR_BOX){
236
237 } else if (getModeTUI() == TUI_MENU_BOX){
238 //changeStageKeyboard(0);
239 if (getCharRaw() == KEY_ENTER){
240 setLastUpdateTUI(getTicks()+3);
241 uint32_t handler = menuHandler();
242 if (handler == -1){
243 clean_tty_screen();
244 tui_destroy();
245 break;
246 }
247 continue;
248 } else if (getCharRaw() == KEY_UP){
249 setCurrentItemTUI(getCurrentItemTUI()-1);
250 // Нажата клавиша вверх
251 if (getCurrentItemTUI() < 0){
252 setCurrentItemTUI(getMaxListMenuTUI()-1);
253 }
254 menuGen(false);
255 } else if (getCharRaw() == KEY_DOWN){
256 // Нажата клавиша вниз
257 setCurrentItemTUI(getCurrentItemTUI()+1);
258 if (getCurrentItemTUI() >= getMaxListMenuTUI()){
259 setCurrentItemTUI(0);
260 }
261 menuGen(false);
262 } else if (getCharRaw() == KEY_ESC){
263 if (bakMenu != -1){
264 curMenu = bakMenu;
265 menuGen(true);
266 } else {
267 cleanWorkSpace(TUI_BASE_COLOR_BODY);
268 setModeTUI(TUI_DEFAULT);
269 }
270 setLastUpdateTUI(getTicks()+5);
271 continue;
272 }
273 setLastUpdateTUI(getTicks()+5);
274 continue;
275
276 } else if (getCharRaw() == KEY_ESC){
277 curMenu = -2;
278 menuGen(true);
279 setLastUpdateTUI(getTicks()+5);
280 continue;
281 } else if (getCharRaw() == KEY_START || getCharRaw()== KEY_F1){
282 //exec("/initrd/apps/hi",0,"");
283 curMenu = 0;
284 menuGen(true);
285 continue;
286 //break;
287 } else if (getCharRaw() == KEY_F12){
288 // Нажата клавиша F12 - закроем TUI и вернем управление shell()
289 createErrorBox("Error in TUI module. ","You will be returned to the console in 1 seconds.");
290 sleep_ms(1000);
291 //bgColor = VESA_BLACK;
292 clean_tty_screen();
293 tui_destroy();
294 break;
295 } else {
296 if (i == 0){
297 i = 1;
298 // Чистим экран
299 clean_tty_screen();
300 // Рисуем обводку
301 drawRectLine(0,16*2,getWidthScreen(),getWorkSpaceHeightTUI()+32,VESA_WHITE,VESA_LIGHT_GREY,1);
302 // Выводим шапку
303 headBar();
304 cleanWorkSpace(TUI_BASE_COLOR_BODY);
305
306 // Выводим ноги
307 footBar(" Press 'Start' to open menu");
308 // Установка позиции для печати
309 setPosX(8);
310 setPosY(16*8);
311 //changeStageKeyboard(1);
312 }
313 // Обновляем таймер, для переотображения
314 setLastUpdateTUI(getTicks()+3);
315 }
316 }
317 //
318
319 return 0;
320 }
substr
void substr(char *restrict dest, const char *restrict source, int from, int length)
Вырезает и возвращает подстроку из строки
Definition: string.c:492
drawRect
void drawRect(uint32_t x, uint32_t y, uint32_t w, uint32_t h, uint32_t color)
Рисуем залитый прямоугольник
Definition: pixel.c:25
drawRectLine
void drawRectLine(int x, int y, int w, int h, int color, int color2, int c)
Рисует узор вокруг прямоугольника
Definition: pixel.c:44
qemu_printf
void qemu_printf(const char *text,...)
Вывод QEMU через COM1 информации
Definition: ports.c:149
shutdown
void shutdown()
Выключение устройства
Definition: system.c:64
reboot
void reboot()
Перезагрузка устройства
Definition: system.c:49
getTicks
size_t getTicks()
Получить количество тиков
Definition: timer.c:26
sleep_ms
void sleep_ms(uint32_t milliseconds)
Ожидание по миллисекундам
Definition: timer.c:68
getPosY
uint32_t getPosY()
Получение позиции по y.
Definition: tty.c:95
getPosX
uint32_t getPosX()
Получение позиции по x.
Definition: tty.c:85
setPosX
void setPosX(uint32_t x)
Изменяем позицию курсора по X.
Definition: tty.c:154
setPosY
void setPosY(uint32_t y)
Изменяем позицию курсора по Y.
Definition: tty.c:164
tty_setcolor
void tty_setcolor(uint32_t color)
Изменение цвета текста
Definition: tty.c:108