SayoriOS  0.3.3
tty.c
См. документацию.
1 
10 #include <stdarg.h>
11 #include <mem/vmm.h>
12 #include <io/tty.h>
13 #include <sys/scheduler.h>
14 #include <io/ports.h>
15 #include <io/status_loggers.h>
16 #include <drv/fpu.h>
17 #include <lib/math.h>
18 #include <io/rgb_image.h>
19 #include "lib/sprintf.h"
20 #include "drv/psf.h"
21 
22 // TODO: Eurica! Split tty.c into 2 files:
23 // tty.c - only text processing functions
24 // default_console.c - TTY client
25 
26 // TODO: Keep here.
27 volatile uint8_t tty_feedback = 1;
28 size_t tty_line_fill[1024];
29 uint32_t tty_pos_x = 0;
30 uint32_t tty_pos_y = 0;
31 int32_t tty_off_pos_x = 8;
32 int32_t tty_off_pos_p = 0;
33 uint32_t tty_off_pos_h = 16;
34 uint32_t tty_text_color;
35 uint32_t tty_bg_color;
36 bool stateTTY = true;
38 
39 // TODO: Move to things/cursor.c
40 thread_t* threadTTY01;
41 bool showAnimTextCursor = true;
42 void animTextCursor();
44 
48 void tty_taskInit(){
49  qemu_log("Starting task...");
50  process_t* proc = get_current_proc();
51  qemu_log("Process at: %x", proc);
52  threadTTY01 = thread_create(proc,
54  0x4000,
55  true,
56  false);
57 }
58 
63  qemu_log("[tFC] Configurate...");
64  qemu_log("\t[TTY Configurator] Using default PSF fonts");
65  tty_off_pos_x = 8;
66  tty_off_pos_p = 0;
67  tty_off_pos_h = 16;
68  qemu_log("TTY_OFF_POS_X: %d; TTY_OFF_POS_P: %d; TTY_OFF_POS_H: %d", tty_off_pos_x, tty_off_pos_p, tty_off_pos_h);
69 }
70 
76 void tty_changeState(bool state){
77  stateTTY = state;
78 }
79 
85 uint32_t getPosX(){
86  return tty_pos_x;
87 }
88 
89 
95 uint32_t getPosY(){
96  return tty_pos_y;
97 }
98 
99 void set_cursor_enabled(bool en) {
100  showAnimTextCursor = en;
101 }
102 
108 void tty_setcolor(uint32_t color) {
109  tty_text_color = color;
110 }
111 
112 uint32_t tty_getcolor() {
113  return tty_text_color;
114 }
115 
121 void tty_set_bgcolor(uint32_t color) {
122  tty_bg_color = color;
123 }
124 
129 void tty_scroll(uint32_t num_rows) {
130  uint32_t row_pos_offset = tty_off_pos_h * num_rows;
131 
132  uint8_t *addr = (uint8_t*)getFrameBufferAddr();
133  uint32_t pitch = getDisplayPitch();
134 
135  uint8_t *read_ptr = addr + (row_pos_offset * pitch);
136  uint8_t *write_ptr = addr;
137 
138  tty_pos_y -= row_pos_offset;
139 
140  uint32_t num_bytes = (pitch * VESA_HEIGHT) - (pitch * row_pos_offset);
141 
142  memcpy(write_ptr, read_ptr, num_bytes);
143 
144  // Очистка строк
145  write_ptr = addr + num_bytes;
146  memset(write_ptr, 0, pitch * row_pos_offset);
147 }
148 
154 void setPosX(uint32_t x){
155  tty_pos_x = x;
156 }
157 
158 
164 void setPosY(uint32_t y){
165  tty_pos_y = y;
166 }
167 
177 void buffer_set_pixel4(uint8_t *buffer, size_t width, size_t height, size_t x, size_t y, size_t color) {
178  if(x >= width || y >= height)
179  return;
180 
181  size_t pixpos = PIXIDX(width * 4, x * 4, y);
182 
183  buffer[pixpos + 0] = (uint8_t)color;
184  buffer[pixpos + 1] = (uint8_t)(color >> 8);
185  buffer[pixpos + 2] = (uint8_t)(color >> 16);
186 }
187 
193 void _tty_putchar(char c, char c1) {
194  if ((tty_pos_x + tty_off_pos_x) >= (int) VESA_WIDTH || c == '\n') {
196  tty_pos_x = 0;
197 
198  if ((tty_pos_y + tty_off_pos_h) >= (int) VESA_HEIGHT) {
199  tty_scroll(1);
200  }
201 
203  } else if (c == '\t') {
204  tty_pos_x += 4 * tty_off_pos_h;
205  } else if(c != '\n') {
206  if (tty_pos_y + tty_off_pos_h >= (int) VESA_HEIGHT) {
207  tty_scroll(1);
208  }
209 
210  draw_vga_ch(c, c1, tty_pos_x, tty_pos_y, tty_text_color);
211 
213  }
214 }
215 
216 void tty_putchar(char c, char c1) {
217  _tty_putchar(c, c1);
218  punch();
219 }
220 
226  if (tty_pos_x < tty_off_pos_x) { // Old: == 0
227  if (tty_pos_y >= tty_off_pos_h) {
229  }
231  } else {
233  }
234 
236  punch();
237 }
238 
239 
245 void _tty_puts(const char str[]) {
246  for (size_t i = 0, len = strlen(str); i < len; i++) {
247  _tty_putchar(str[i], str[i+1]);
248  if (isUTF(str[i])){
249  i++;
250  }
251  }
252 }
253 
260 void _tty_print(const char* format, va_list args) {
261  char* a = 0;
262 
263  vasprintf(&a, format, args);
264 
265  _tty_puts(a);
266 
267  kfree(a);
268 }
269 
270 void _tty_printf(const char *text, ...) {
271  int sAT = (showAnimTextCursor?1:0);
272  if (sAT == 1){
273  showAnimTextCursor = false;
274  }
275  if (stateTTY){
276  va_list args;
277  va_start(args, text);
278  _tty_print(text, args);
279  va_end(args);
280  }
281 
282  if (sAT == 1){
283  showAnimTextCursor = true;
284  }
285 }
286 
291  qemu_log("animTextCursor Work...");
292  bool vis = false;
293  int ox = 0, oy = 0;
294 
295  while(1) {
296  if(!showAnimTextCursor)
297  continue;
298 
299  ox = getPosX();
300  oy = getPosY();
301 
302  if (!vis){
303  drawRect(ox,oy+tty_off_pos_h-3,tty_off_pos_x,3,0x333333);
304  vis = true;
305  } else {
306  drawRect(ox,oy+tty_off_pos_h-3,tty_off_pos_x,3,0x000000);
307  vis = false;
308  }
309 
310  punch();
311  sleep_ms(250);
312  }
313 
314  // So, it never quits
315 // qemu_log("animTextCursor complete...");
316 // thread_exit(threadTTY01);
317 }
318 
319 void clean_tty_screen_no_update() {
320  clean_screen();
321 
322  tty_pos_x = 0;
323  tty_pos_y = 0;
324 }
325 
326 void clean_tty_screen() {
327  clean_tty_screen_no_update();
328 
329  punch();
330 }
size_t strlen(const char *str)
Возращает длину строки
Definition: string.c:88
void * memset(void *ptr, char value, size_t num)
Заполнение массива указанными символами
Definition: string.c:203
void * memcpy(void *restrict destination, const void *restrict source, size_t n)
Копирование непересекающихся массивов используя SSE.
Definition: string.c:173
bool isUTF(char c)
Проверяет, является ли символ формата UTF-8.
Definition: string.c:27
void drawRect(uint32_t x, uint32_t y, uint32_t w, uint32_t h, uint32_t color)
Рисуем залитый прямоугольник
Definition: pixel.c:25
volatile process_t * get_current_proc(void)
Получить текущий обработчик процесса
Definition: scheduler.c:125
Definition: stdarg.h:9
void sleep_ms(uint32_t milliseconds)
Ожидание по миллисекундам
Definition: timer.c:68
size_t tty_line_fill[1024]
....
Definition: tty.c:28
void tty_taskInit()
Инициализация потоков
Definition: tty.c:48
uint32_t getPosY()
Получение позиции по y.
Definition: tty.c:95
void tty_fontConfigurate()
Инициализация системы для печати через шрифты
Definition: tty.c:62
thread_t * threadTTY01
Поток с анимацией курсора
Definition: tty.c:40
bool stateTTY
Статус, разрешен ли вывод текста через tty_printf.
Definition: tty.c:36
uint32_t tty_off_pos_h
...
Definition: tty.c:33
void tty_scroll(uint32_t num_rows)
Прокрутка экрана на num_rows строк
Definition: tty.c:129
uint32_t getPosX()
Получение позиции по x.
Definition: tty.c:85
uint32_t tty_bg_color
Текущий задний фон
Definition: tty.c:35
volatile uint8_t tty_feedback
...
Definition: tty.c:27
void setPosX(uint32_t x)
Изменяем позицию курсора по X.
Definition: tty.c:154
void tty_changeState(bool state)
Меняет состояние печати через printf.
Definition: tty.c:76
void tty_backspace()
Удаление последнего символа
Definition: tty.c:225
void _tty_print(const char *format, va_list args)
Подфункция-обработчик для tty_printf.
Definition: tty.c:260
void setPosY(uint32_t y)
Изменяем позицию курсора по Y.
Definition: tty.c:164
void _tty_putchar(char c, char c1)
Вывод одного символа
Definition: tty.c:193
int32_t tty_off_pos_x
...
Definition: tty.c:31
void _tty_puts(const char str[])
Вывод строки
Definition: tty.c:245
void tty_set_bgcolor(uint32_t color)
Изменение цвета заднего фона
Definition: tty.c:121
void tty_setcolor(uint32_t color)
Изменение цвета текста
Definition: tty.c:108
uint32_t tty_pos_y
Позиция на экране по Y.
Definition: tty.c:30
void animTextCursor()
Анимация курсора (для tty)
Definition: tty.c:290
uint32_t tty_text_color
Текущий цвет шрифта
Definition: tty.c:34
void buffer_set_pixel4(uint8_t *buffer, size_t width, size_t height, size_t x, size_t y, size_t color)
Устновливает пиксель RGB в буфере в котором все пиксели представляют собой RGBA (альфа канал игнориру...
Definition: tty.c:177
bool showAnimTextCursor
Отображать ли анимацию курсора
Definition: tty.c:41
int32_t tty_off_pos_p
...
Definition: tty.c:32
uint32_t tty_pos_x
Позиция на экране по X.
Definition: tty.c:29