Я нахожусь в процессе создания графического интерфейса, управляемого событиями, во встроенной системе. Я только что закончил реализацию графики виджета и функциональности сенсорного экрана.
Мой вопрос заключается в том, как / советы по реализации этого в C и во встроенной системе.
Вот как я думал в ОЧЕНЬ общем «псевдо» коде:
mainloop()
{
<All initializations etc.>
eventloop();
}
eventloop()
{
eventhandler();
sleep_low_power_uc_mode();
}
touchscreen_interrupt_service_routine()
{
int * x, *y;
eventtype event = TOUCHSCREEN_CLICK;
get_XY_coordinate(x, y);
post_event(*x, *y, event);
}
eventhandler()
{
int * x, *y;
eventtype * event;
static int current_state;
get_event(x, y, event);
if(event != NO_EVENT)
{
handle_events(*x, *y, *event, current_state);
}
}
handle_events(int x, int y, eventtype event, int * current_state)
{
int buttonID, i=0;
buttonID = check_if_button_pressed(x, y, current_state);
while(buttons[i].enabled != FALSE)
{
if(buttonID == buttons[i].ID)
{
call_buttons_respective_handler();
}
}
}
Здесь я предполагаю, что у меня есть сенсорный экран, который разбудит мое устройство, управляемое микроконтроллером, аппаратным прерыванием. Eventloop() — это бесконечный цикл событий, который будет обрабатывать любые события, а затем переходить в спящий режим до следующего прерывания сенсорного экрана. Процедура обслуживания прерывания сенсорного экрана получит координаты X и Y с сенсорного экрана и отправит событие с помощью функции post_event(). Функция event_handler(), которая является функцией внутри функции eventloop(), будет получать события (если они есть) и вызывать функцию handle_events(). Функция handle_events() проверяет, была ли нажата кнопка (например) с заданным событием, координатами X и Y, и возвращает ненулевой идентификатор кнопки, если кнопка была нажата. Затем следует перебрать массив кнопок, проверить идентичный идентификатор кнопки и вызвать обработчик этой кнопки.
Имеет ли то, что я пытался описать, смысл в программировании, управляемом событиями? Любые мысли очень приветствуются (и, пожалуйста, потерпите меня, поскольку я новичок в этом).