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

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


person uniquenamehere    schedule 12.02.2013    source источник
comment
Да. Это основной способ реализации систем, управляемых событиями.   -  person Linuxios    schedule 13.02.2013
comment
Пока это выглядит очень хорошо. Одна вещь, которую я нахожу удобной без RTOS, — это очередь заданий/планировщик. Вы можете иметь обработчик событий в очереди заданий, но также выполнять там и другие действия, а также периодические задачи, которые вы не хотите выполнять в ISR. Затем ваш основной цикл просто опрашивает очередь заданий, и разные задания запускают другие задания, например обновление экрана.   -  person c.fogelklou    schedule 17.02.2013
comment
Похоже, вы разрабатываете свой собственный фреймворк, управляемый событиями. Элементы, которые вам все еще нужны, — это очередь событий и, скорее всего, конечные автоматы. Возможно, вас могли бы вдохновить существующие фреймворки этого типа с открытым исходным кодом, такие как QP-nano или QP/C, написанные на C и подходящие для микроконтроллеров нижнего уровня. Что касается интеграции такой платформы со встроенным графическим интерфейсом, я бы также рекомендовал Application Note QP™ и встроенный графический интерфейс emWin по адресу state-machine.com/emwin/AN_QP_and_emWin.pdf   -  person Miro Samek    schedule 23.06.2013
comment
@ Миро: Ты прав. Я нахожусь в процессе обучения, и я чувствую, что прежде чем использовать какие-либо библиотеки для вещей, я хочу создать свои собственные простые программы, которые имеют основные концепции. Таким образом, я буду чувствовать себя комфортно, используя готовые библиотеки, как вы привели пример выше. Спасибо за полезную заметку по применению!   -  person uniquenamehere    schedule 24.06.2013


Ответы (2)


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

person Shaun Neal    schedule 13.02.2013
comment
Я хочу написать все это сам, и в этом приложении не нужна ОСРВ. Я разрабатываю на ARM Cortex M3. Я не упомянул RTOS, потому что не использую и не планирую ее использовать. - person uniquenamehere; 13.02.2013

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

person Suyash Walkunde    schedule 09.12.2020
comment
Вы можете оставить комментарий, когда у вас будет достаточно репо, пожалуйста - person zeytin; 09.12.2020