Обнаружение изменения вывода raspberry pi — GPIO в Qt5

#c #raspberry-pi #qml #qt5 #gpio

#c #raspberry-pi #qml #qt5 #gpio

Вопрос:

Я довольно новичок в raspberry pi.

Суть моей проблемы заключается в следующем:

У меня есть изменение вывода GPIO, которое необходимо отслеживать (постоянно опрашивать), чтобы увидеть, изменится ли оно. Если это изменится, я должен загрузить новый файл QML в свой проект Qt5 с помощью загрузчика. Я знаю, как выполнить часть загрузки, учитывая ее довольно простую. Мне нужен способ опроса pin-кода GPIO и получения уведомлений об изменении.

Я читал, что класс QSocketNotifier может быть полезен. Но я, честно говоря, понятия не имею, как это сделать.

Приветствуется любая помощь в выяснении, как это сделать. Спасибо 🙂

РЕДАКТИРОВАТЬ: Я создаю что-то вроде главного меню для выбора различных опций в графическом интерфейсе для системы на базе raspberry pi, работающей на Debian. Это примерно как телевизионная приставка. Аналогично кнопкам на основе графического интерфейса пользователя на экране, он должен иметь возможность получать аппаратное прерывание от внешних кнопок, подключенных к выводам GPIO, которое вызывает загрузку новой страницы / начало нового действия.

Если я правильно понимаю, часть кода на c должна фиксировать это изменение pin-кода и передавать его в часть QML. Мне нужно уметь это делать.

Ответ №1:

Вы ничего не сказали об окружающей среде и о чем-либо еще, что нужно сделать. Если нет других задач или o / s, может быть, это то, что вы хотите?:

 int last_state = -1;   // impossible state so change is noticed the first time
for (;;)  // do forever
{
       int state = get_gpio (THE_EVENT);
       if (state == last_state)
       {
            sleep (100);
            continue;
       }
       do_loader_stuff();
       last_state = state;
}
  

Комментарии:

1. Спасибо за быстрый ответ. Ну, это будет соответствовать C , не так ли? Загрузчик обрабатывается в коде QML проекта. Мне нужно, чтобы раздел QML проекта был уведомлен. Секунду, я обновлю свой вопрос. Возможно, это поможет.

Ответ №2:

Вы можете настроить вывод так, чтобы он управлялся прерыванием. Способ, которым это работает, заключается в том, что после выполнения настройки теперь вы можете select() использовать файл, представляющий pin-код, и select() вернется, когда pin-код изменит состояние.

Вот документация по интерфейсу sysfs gpio:https://www.kernel.org/doc/Documentation/gpio/sysfs.txt

Вот как будет выглядеть настройка для вывода 19:

 QFile exportFile("/sys/class/gpio/gpio19/export");
exportFile.open(QIODevice::WriteOnly);
exportFile.write("19");

QFile directionFile("/sys/class/gpio/gpio19/direction");
directionFile.open(QIODevice::WriteOnly);
directionFile.write("in");

QFile edgeFile("/sys/class/gpio/gpio19/edge");
edgeFile.open(QIODevice::WriteOnly);
edgeFile.write("body");
  

Теперь вместо select() прямого использования вы можете использовать QSocketNotifier .

 QFile file("/sys/class/gpio/gpio19/value");

QSocketNotifier notifier(file.handle(), QSocketNotifier::Read);
connect(amp;notifier, amp;QSocketNotifier::activated, this, amp;MyClass::interruptFired);