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 }
void substr(char *restrict dest, const char *restrict source, int from, int length)
Вырезает и возвращает подстроку из строки
Definition: string.c:492
void drawRect(uint32_t x, uint32_t y, uint32_t w, uint32_t h, uint32_t color)
Рисуем залитый прямоугольник
Definition: pixel.c:25
void drawRectLine(int x, int y, int w, int h, int color, int color2, int c)
Рисует узор вокруг прямоугольника
Definition: pixel.c:44
void qemu_printf(const char *text,...)
Вывод QEMU через COM1 информации
Definition: ports.c:149
void shutdown()
Выключение устройства
Definition: system.c:64
void reboot()
Перезагрузка устройства
Definition: system.c:49
size_t getTicks()
Получить количество тиков
Definition: timer.c:26
void sleep_ms(uint32_t milliseconds)
Ожидание по миллисекундам
Definition: timer.c:68
uint32_t getPosY()
Получение позиции по y.
Definition: tty.c:95
uint32_t getPosX()
Получение позиции по x.
Definition: tty.c:85
void setPosX(uint32_t x)
Изменяем позицию курсора по X.
Definition: tty.c:154
void setPosY(uint32_t y)
Изменяем позицию курсора по Y.
Definition: tty.c:164
void tty_setcolor(uint32_t color)
Изменение цвета текста
Definition: tty.c:108