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 }
size_t strlen(const char *str)
Возращает длину строки
Definition: string.c:88
Структура массива
Definition: jse_array.h:40
uint32_t End
Когда отпущенно
Definition: jse_event.h:7
uint32_t Start
Когда нажато
Definition: jse_event.h:6
uint32_t Last
Последний вызов
Definition: jse_event.h:8
int8_t Status
Статус
Definition: jse_event.h:5
Definition: elk.h:48
size_t getTicks()
Получить количество тиков
Definition: timer.c:26
void OffTrigger(int index)
Выключить триггер
Definition: trigger.c:81
void OnTrigger(int index)
Включить триггер
Definition: trigger.c:69
int RegTrigger(int type, trigger_cmd_t handler)
Регистрация триггера
Definition: trigger.c:35