Работа с триггерами Последнее обновление: 02.06.2023 / 10:27

В данной статье, в краце рассказано как работать с триггерами в ядре.

Что такое триггеры?



Триггеры позволяет, вызывать ваш код, когда в системе, выполняется определенный триггер.
К примеру это нажатие клавишы клавиатуры, передвижение мыши.
Ниже мы расскажем, пример их использования.

Как зарегистрировать триггер?



/**
* @brief Вызывается триггер нажатия клавиатуры с пользовательским названием OnKeyboardPressed
* Название команды может быть любое!
* А вот что возвращают элементы, зависит от типов триггера, смотрите ниже.
*
* Для примера, в триггере нажатия клавиатуры возращается всего первых два триггера, остальные не используются.
*
* @param int data1 - Возращает код клавишы
* @param int data2 - Возращает 1 или 0, если клавиша нажата или нет
*/

void OnKeyboardPressed(void* data1,void* data2,void* data3,void* data4,void* data5){
qemu_log("[OKP] Key: %d | %x",(int) data1,(int) data2);
}

/**
* @brief Регистрируем триггер, на нажатия клавиатуры
*
* Первый аргумент указывает, какой тип триггера используется, коды смотрите ниже
* Второй аргумент указывает, какую команду вызывать, если сработал триггер.
* Учтите, что команда должна существовать.
*
* @return Возвращает индекс данного триггера
*/
int Index = RegTrigger(0x0001,&OnKeyboardPressed); ///< Регистрация нажатий клавиатуры

/**
* @brief Выключает триггер
* После этой команды, ваша команда не получает события, пока вы его снова не включите.
*/
OffTrigger(Index);

/**
* @brief Включает триггер
* После этой команды, ваша команда снова получает события, пока вы его снова не выключите.
*/
OnTrigger(Index);

ВНИМАНИЕ

Если ваша программа завершила работу, не забывайте отключать ваши триггеры, чтобы они не конфликтовали.
А еще будет лучше, если будете ставить метку, что триггер больше не потребуется.


Какие триггеры существуют?



// Актуальный список всегда здесь: https://github.com/pimnik98/Sayori/blob/main/kernel/include/sys/trigger.h
#define TRIGGER_KEY_PRESSED 0x0001
#define TRIGGER_MOUSE_MOVE 0x0002
#define TRIGGER_MOUSE_CLICK 0x0003
#define TRIGGER_ELF_START 0x0004
#define TRIGGER_ELF_END 0x0005
#define TRIGGER_ELF_FAILRUN 0x0006
#define TRIGGER_MAIN_RUNNER1 0x1111
#define TRIGGER_MAIN_RUNNER2 0x2222
#define TRIGGER_MAIN_RUNNER3 0x3333
#define TRIGGER_MAIN_RUNNER4 0x4444

А теперь немного о том, что возвращают триггеры

TRIGGER_KEY_PRESSED (0x0001)


Информация

Данный триггер, сработает, вы нажали на клавишу клавиатуры.

* Первый аргумент (data1): (int) Код клавиши
* Второй аргумент (data2): (int) Возвращает 1, если клавиша нажата, или 0 если отпущена
* Третий аргумент (data3): (int) Всегда возвращает 0
* Четвертый аргумент (data4): (int) Всегда возвращает 0
* Пятый аргумент (data5): (int) Всегда возвращает 0

TRIGGER_MOUSE_MOVE (0x0002)


Информация

Данный триггер, сработает, только если вы сдвинули мышь.

* Первый аргумент (data1): (int) Координаты по X
* Второй аргумент (data2): (int) Координаты по Y
* Третий аргумент (data3): (int) Всегда возвращает 0
* Четвертый аргумент (data4): (int) Всегда возвращает 0
* Пятый аргумент (data5): (int) Всегда возвращает 0

TRIGGER_MOUSE_CLICK (0x0003)


Информация

Данный триггер, сработает, только если вы нажали клавишу мышки.

* Первый аргумент (data1): (int) Нажали, левую кнопку мыши
* Второй аргумент (data2): (int) Нажали, правую кнопку мыши
* Третий аргумент (data3): (int) Нажали, среднюю кнопку мыши
* Четвертый аргумент (data4): (int) Координаты по X
* Пятый аргумент (data5): (int) Координаты по Y

TRIGGER_ELF_START (0x0004)


Информация

Данный триггер, сработает, при запуске программы.

* Первый аргумент (data1): (char*) Название программы
* Второй аргумент (data2): (int) Координаты по Y
* Третий аргумент (data3): (int) Всегда возвращает 0
* Четвертый аргумент (data4): (int) Всегда возвращает 0
* Пятый аргумент (data5): (int) Всегда возвращает 0

TRIGGER_ELF_END (0x0005)


Информация

Данный триггер, сработает, при выходе из программы.
Учтите, что не все программы возращают return

* Первый аргумент (data1): (char*) Название программы
* Второй аргумент (data2): (int) Код выхода из программы
* Третий аргумент (data3): (int) Всегда возвращает 0
* Четвертый аргумент (data4): (int) Всегда возвращает 0
* Пятый аргумент (data5): (int) Всегда возвращает 0

TRIGGER_ELF_FAILRUN (0x0006)


Информация

Данный триггер, сработает, если при запуске программы произошли ошибки.

* Первый аргумент (data1): (char*) Название программы
* Второй аргумент (data2): (int) Код ошибки (1 - файл не найден | 2 - файл не является ELF)
* Третий аргумент (data3): (int) Всегда возвращает 0
* Четвертый аргумент (data4): (int) Всегда возвращает 0
* Пятый аргумент (data5): (int) Всегда возвращает 0

TRIGGER_MAIN_RUNNER1-4 (0x1111 | 0x2222 | 0x3333 | 0x4444)


Информация

Данный триггер, работает постоянно, без работы задержки, если вам необходимо отрисовать экран используйте для этого punch();, а также рекомендуется делать искусственную задержку.

* Первый аргумент (data1): (int) Всегда возвращает 0
* Второй аргумент (data2): (int) Всегда возвращает 0
* Третий аргумент (data3): (int) Всегда возвращает 0
* Четвертый аргумент (data4): (int) Всегда возвращает 0
* Пятый аргумент (data5): (int) Всегда возвращает 0