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,
53 &animTextCursor,
54 0x4000,
55 true,
56 false);
57 }
58
62 void tty_fontConfigurate(){
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') {
195 tty_line_fill[tty_pos_y] = tty_pos_x;
196 tty_pos_x = 0;
197
198 if ((tty_pos_y + tty_off_pos_h) >= (int) VESA_HEIGHT) {
199 tty_scroll(1);
200 }
201
202 tty_pos_y += tty_off_pos_h;
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
212 tty_pos_x += tty_off_pos_x;
213 }
214 }
215
216 void tty_putchar(char c, char c1) {
217 _tty_putchar(c, c1);
218 punch();
219 }
220
225 void tty_backspace() {
226 if (tty_pos_x < tty_off_pos_x) { // Old: == 0
227 if (tty_pos_y >= tty_off_pos_h) {
228 tty_pos_y -= tty_off_pos_h;
229 }
230 tty_pos_x = tty_line_fill[tty_pos_y];
231 } else {
232 tty_pos_x -= tty_off_pos_x;
233 }
234
235 drawRect(tty_pos_x, tty_pos_y, tty_off_pos_x, tty_off_pos_h, 0x000000);
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
290 void animTextCursor(){
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 }
strlen
size_t strlen(const char *str)
Возращает длину строки
Definition: string.c:88
memset
void * memset(void *ptr, char value, size_t num)
Заполнение массива указанными символами
Definition: string.c:203
memcpy
void * memcpy(void *restrict destination, const void *restrict source, size_t n)
Копирование непересекающихся массивов используя SSE.
Definition: string.c:173
isUTF
bool isUTF(char c)
Проверяет, является ли символ формата UTF-8.
Definition: string.c:27
drawRect
void drawRect(uint32_t x, uint32_t y, uint32_t w, uint32_t h, uint32_t color)
Рисуем залитый прямоугольник
Definition: pixel.c:25
get_current_proc
volatile process_t * get_current_proc(void)
Получить текущий обработчик процесса
Definition: scheduler.c:125
va_list
Definition: stdarg.h:9
sleep_ms
void sleep_ms(uint32_t milliseconds)
Ожидание по миллисекундам
Definition: timer.c:68
tty_line_fill
size_t tty_line_fill[1024]
....
Definition: tty.c:28
tty_taskInit
void tty_taskInit()
Инициализация потоков
Definition: tty.c:48
getPosY
uint32_t getPosY()
Получение позиции по y.
Definition: tty.c:95
tty_fontConfigurate
void tty_fontConfigurate()
Инициализация системы для печати через шрифты
Definition: tty.c:62
threadTTY01
thread_t * threadTTY01
Поток с анимацией курсора
Definition: tty.c:40
stateTTY
bool stateTTY
Статус, разрешен ли вывод текста через tty_printf.
Definition: tty.c:36
tty_off_pos_h
uint32_t tty_off_pos_h
...
Definition: tty.c:33
tty_scroll
void tty_scroll(uint32_t num_rows)
Прокрутка экрана на num_rows строк
Definition: tty.c:129
getPosX
uint32_t getPosX()
Получение позиции по x.
Definition: tty.c:85
tty_bg_color
uint32_t tty_bg_color
Текущий задний фон
Definition: tty.c:35
tty_feedback
volatile uint8_t tty_feedback
...
Definition: tty.c:27
setPosX
void setPosX(uint32_t x)
Изменяем позицию курсора по X.
Definition: tty.c:154
tty_changeState
void tty_changeState(bool state)
Меняет состояние печати через printf.
Definition: tty.c:76
tty_backspace
void tty_backspace()
Удаление последнего символа
Definition: tty.c:225
_tty_print
void _tty_print(const char *format, va_list args)
Подфункция-обработчик для tty_printf.
Definition: tty.c:260
setPosY
void setPosY(uint32_t y)
Изменяем позицию курсора по Y.
Definition: tty.c:164
_tty_putchar
void _tty_putchar(char c, char c1)
Вывод одного символа
Definition: tty.c:193
tty_off_pos_x
int32_t tty_off_pos_x
...
Definition: tty.c:31
_tty_puts
void _tty_puts(const char str[])
Вывод строки
Definition: tty.c:245
tty_set_bgcolor
void tty_set_bgcolor(uint32_t color)
Изменение цвета заднего фона
Definition: tty.c:121
tty_setcolor
void tty_setcolor(uint32_t color)
Изменение цвета текста
Definition: tty.c:108
tty_pos_y
uint32_t tty_pos_y
Позиция на экране по Y.
Definition: tty.c:30
animTextCursor
void animTextCursor()
Анимация курсора (для tty)
Definition: tty.c:290
tty_text_color
uint32_t tty_text_color
Текущий цвет шрифта
Definition: tty.c:34
buffer_set_pixel4
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
showAnimTextCursor
bool showAnimTextCursor
Отображать ли анимацию курсора
Definition: tty.c:41
tty_off_pos_p
int32_t tty_off_pos_p
...
Definition: tty.c:32
tty_pos_x
uint32_t tty_pos_x
Позиция на экране по X.
Definition: tty.c:29