Программирование на основе событий (GUI) на C для встроенной системы

Я нахожусь в процессе создания управляемого событиями GUI во встроенной системе. Я только что закончил реализацию графических элементов и функций сенсорного экрана.

Мой вопрос, как / советы по реализации этого в 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, и возвращает ненулевой идентификатор кнопки, если была нажата кнопка. Затем следует циклически перебирать массив кнопок, проверять идентичный идентификатор кнопки и вызывать этот обработчик кнопок.

Имеет ли смысл то, что я пытался описать в программировании, управляемом событиями? Любые мысли очень приветствуются (и, пожалуйста, потерпите меня, поскольку я новичок в этом).

2 ответа

Ответ будет зависеть от того, для какой платформы вы разрабатываете. Встроенная ОСРВ для контроллера Microchip будет иметь один набор ограничений, тогда как ОСРВ для решения ARM будет совершенно другим. Вы должны уточнить, какое оборудование или как минимум, для какого микроконтроллера вы разрабатываете.

Вы можете запрограммировать большую часть события на прерывание на основе таймера, затем вы можете вызывать каждое прерывание через 2 или 5 мс, что означает, что все ваши события могут отслеживаться одновременно (псевдо ОСРВ).

Другие вопросы по тегам