SayoriOS 0.3.3

jse_event.c
1 #include "portability.h"
3 #include <io/ports.h>
4 #include "io/tty.h"
5 #include "lib/stdio.h"
6
7
8 #include <drv/input/keyboard.h>
9 #include <drv/input/mouse.h>
10
11 #include "../elk_config.h"
12 #include "../elk.h"
13
14 int jse_event_kbd_i = -1;
15 int jse_event_mouse_i = -1;
16
17 JSE_EVENT_KBD_KEY_STATE jse_event_kbd_state[256]= {0}; // Массив для отслеживания состояния каждой клавиши
18 uint32_t jse_event_kbd_combo = 0;
19 uint32_t jse_event_kbd_lastCode = 0;
20 uint32_t jse_event_kbd_lastTime = 0;
21
22
23 uint32_t jse_event_mouse_lastTime = 0;
24 uint32_t jse_event_mouse_x = 0;
25 uint32_t jse_event_mouse_y = 0;
26 uint32_t jse_event_mouse_combo = 0;
27
28
29 void jse_event_mouse(void* data1,void* data2,void* data3,void* data4,void* data5){
30 jse_event_mouse_x = (int) data4;
31 jse_event_mouse_y = (int) data5;
32 jse_event_mouse_combo = ((int) data1 << 2) | ((int) data2 << 1) | (int) data3;
33 }
34
35 void jse_event_kbd(void* data1,void* data2,void* data3,void* data4,void* data5){
36 int keyCode = (int)data1;
37 int keyPress = (int)data2;
39 jse_event_kbd_lastCode = (keyPress?keyCode:0);
40 uint32_t jse_event_kbd_lastTime = 0;
41 jse_event_kbd_state[keyCode].Last = getTicks(); // Сохраняем время последнего вызова
42 // Обновляем состояние клавиши
43 if (keyPress) { // Клавиша зажата
44 if (jse_event_kbd_state[keyCode].Status == 0) { // Клавиша была отпущена
45 jse_event_kbd_state[keyCode].Start = getTicks(); // Устанавливаем время нажатия
46 jse_event_kbd_state[keyCode].End = 0;
47 jse_event_kbd_state[keyCode].Status = 1; // Обновляем статус клавиши
48 jse_event_kbd_combo |= (1 << keyCode); // Установка комбо-значения
49 } else {
50 return;
51 }
52 } else { // Клавиша отпущена
53 if (jse_event_kbd_state[keyCode].Status == 1) { // Клавиша была зажата
54 jse_event_kbd_state[keyCode].End = getTicks(); // Устанавливаем время отпускания
55 jse_event_kbd_state[keyCode].Status = 0; // Обновляем статус клавиши
56 jse_event_kbd_state[keyCode].Last = getTicks(); // Сохраняем время последнего вызова
57 jse_event_kbd_combo &= ~(1 << keyCode); // Снятие комбо-значения
58 }
59 }
60 }
61
62
63
64 jsval_t jse_ext_event_test1(struct js *js, jsval_t *args, int nargs) {
65 int x = 0x1000; // Fetch 1st arg
66 char* test = "Test elly net!";
67 qemu_log(" [JSE] [EXT] [Event] [test1] x:%x", test);
68 return js_mkstr(js, test, strlen(test));
69 }
70
71 jsval_t jse_ext_event_kbd_waitForAnyKey(struct js *js, jsval_t *args, int nargs) {
72 if (nargs == 0) return js_mknum(0);
73 while (1){
74 for (int i = 0; i < nargs; i++){
75 int c = jse_getInt(js,args[i]);
76 if (jse_event_kbd_lastCode == c){
77 return js_mknum(c);
78 }
79 }
80 }
81 return js_mktrue();
82 }
83
84 jsval_t jse_ext_event_kbd_waitForAnyKeyOnce(struct js *js, jsval_t *args, int nargs) {
85 if (nargs == 0) return js_mknum(0);
86 while (1){
87 for (int i = 0; i < nargs; i++){
88 int c = jse_getInt(js,args[i]);
89 if (jse_event_kbd_lastCode == c){
90 jse_event_kbd_lastCode = 0;
91 return js_mknum(c);
92 }
93 }
94 }
95 return js_mktrue();
96 }
97
98 jsval_t jse_ext_event_kbd(struct js *js, jsval_t *args, int nargs) {
99 if (nargs != 1) return js_mknum(jse_event_kbd_lastCode);
100 int c = jse_getInt(js,args[0]);
101 if (c == 0) return js_mknum(jse_event_kbd_lastCode);
102 if (c == 1) return js_mknum(jse_event_kbd_lastTime);
103 if (c == 2) return js_mknum(jse_event_kbd_combo);
104 return js_mkundef();
105 }
106
107
108 jsval_t jse_ext_event_mouse(struct js *js, jsval_t *args, int nargs) {
109 if (nargs != 1) return js_mknum(jse_event_mouse_combo);
110 int c = jse_getInt(js,args[0]);
111 if (c == 0) return js_mknum(jse_event_mouse_combo);
112 if (c == 1) return js_mknum(jse_event_mouse_x);
113 if (c == 2) return js_mknum(jse_event_mouse_y);
114 if (c == 3) return js_mknum(jse_event_mouse_lastTime);
115 return js_mkundef();
116 }
117
118 jsval_t jse_ext_event_debug(struct js *js, jsval_t *args, int nargs) {
119 if (nargs != 1) return js_mkundef();
120 int t = js_type(args[0]);
121 int x = jse_getInt(js,args[0]);
122
123 const char* str = js_str(js,args[0]);
124 qemu_log(" [JSE] [EXT] [Event] [Debug] T:%d | X:%x | (%d) %s", t, x, strlen(str), str);
125
126 if (t == JS_PRIV){
127 // Это тип данных объекта
128 JSE_ARRAY* arr = js_getObjectToArray(js, args[0]);
129 //jse_array_editByID(arr, 2, (JSE_ARRAY_VALUE){.int_value = 5730575}, JSE_ARRAY_TYPE_INT);
130 jse_array_link_dump(arr, 0);
131 jse_array_destroZ(arr,0);
132 jse_array_free(arr);
133 }
134
135 return js_mktrue();
136 }
137
138 void jse_event_config(struct js* js){
139 qemu_note("[JSE] [EXT] [Event] Registration of functions");
140 js_set(js, js_glob(js), "event_debug", js_mkfun(jse_ext_event_debug));
141 js_set(js, js_glob(js), "event_test1", js_mkfun(jse_ext_event_test1));
142 js_set(js, js_glob(js), "kbd", js_mkfun(jse_ext_event_kbd));
143 js_set(js, js_glob(js), "kbd_waitForAnyKey", js_mkfun(jse_ext_event_kbd_waitForAnyKey));
144 js_set(js, js_glob(js), "kbd_waitForAnyKeyOnce", js_mkfun(jse_ext_event_kbd_waitForAnyKeyOnce));
145 js_set(js, js_glob(js), "mouse", js_mkfun(jse_ext_event_mouse));
146
147 if (jse_event_kbd_i == -1){
148 jse_event_kbd_i = RegTrigger(0x0001, &jse_event_kbd);
149 } else {
150 OnTrigger(jse_event_kbd_i);
151 }
152
153 if (jse_event_mouse_i == -1){
154 jse_event_mouse_i = RegTrigger(0x0003, &jse_event_mouse);
155 } else {
156 OnTrigger(jse_event_mouse_i);
157 }
158
160 keyboardctl(KEYBOARD_ECHO, false);
161 set_cursor_enabled(false);
162 }
163
164 void jse_event_destroy(struct js* js){
165 qemu_note("[JSE] [EXT] [Event] Destroy");
166 if (jse_event_kbd_i != -1){
167 OffTrigger(jse_event_kbd_i);
168 }
169
170 if (jse_event_mouse_i != -1){
171 OffTrigger(jse_event_mouse_i);
172 }
173
175 keyboardctl(KEYBOARD_ECHO, true);
176 set_cursor_enabled(true);
177 }
strlen
size_t strlen(const char *str)
Возращает длину строки
Definition: string.c:88
JSE_ARRAY
Структура массива
Definition: jse_array.h:40
JSE_EVENT_KBD_KEY_STATE_t
Definition: jse_event.h:4
JSE_EVENT_KBD_KEY_STATE_t::End
uint32_t End
Когда отпущенно
Definition: jse_event.h:7
JSE_EVENT_KBD_KEY_STATE_t::Start
uint32_t Start
Когда нажато
Definition: jse_event.h:6
JSE_EVENT_KBD_KEY_STATE_t::Last
uint32_t Last
Последний вызов
Definition: jse_event.h:8
JSE_EVENT_KBD_KEY_STATE_t::Status
int8_t Status
Статус
Definition: jse_event.h:5
js
Definition: elk.h:48
getTicks
size_t getTicks()
Получить количество тиков
Definition: timer.c:26
OffTrigger
void OffTrigger(int index)
Выключить триггер
Definition: trigger.c:81
OnTrigger
void OnTrigger(int index)
Включить триггер
Definition: trigger.c:69
RegTrigger
int RegTrigger(int type, trigger_cmd_t handler)
Регистрация триггера
Definition: trigger.c:35