Я занимаюсь созданием графического интерфейса, управляемого событиями, в встроенной системе. Я только что закончил реализацию графических элементов виджета и сенсорного экрана.Программирование, управляемое событиями (GUI) в C для встроенной системы
Мой вопрос - как это сделать/советы по реализации этого в 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 и возвращают ненулевой кнопкуID, если кнопка нажата. Затем следующий - это петля через массив кнопок и проверка идентичного кнопкиID и вызов этого обработчика кнопок.
Является ли то, что я пытался описать, имеет смысл в программировании, управляемом событиями? Любые мысли очень приветствуются (и, пожалуйста, несите меня, поскольку я новичок в этом).
Да. Это основной способ внедрения систем, управляемых событиями. – Linuxios
Пока это действительно хорошо. Одна вещь, которую я считаю удобной без RTOS, - это очередь/планировщик заданий. У вас может быть обработчик событий в очереди заданий, но также и другие вещи, а также периодические задачи, которые вы не хотите делать в ISR. Затем ваш основной цикл просто проверяет очередь заданий, а разные задания запускают другие задания, например, обновление экрана. –
Кажется, что вы разрабатываете свою собственную платформу, управляемую событиями. Элементы, которые вам по-прежнему нужны, - это очередность событий и, скорее всего, государственные машины. Возможно, вы можете получить вдохновение от существующих инфраструктур с открытым исходным кодом этого типа, таких как QP-nano или QP/C, запрограммированные на C и подходящие для микроконтроллеров с низким уровнем конца. Что касается интеграции такой структуры со встроенным графическим интерфейсом, я бы также рекомендовал приложение «QP ™ и emWin Embedded GUI» на http://www.state-machine.com/emwin/AN_QP_and_emWin.pdf –