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

Я новичок в Raspberry Pi.

Суть моей проблемы в следующем:

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

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

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

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

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


person Ra41P    schedule 07.07.2014    source источник


Ответы (2)


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

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;
}
person wallyk    schedule 07.07.2014
comment
Спасибо за быстрый ответ. Что ж, это будет придерживаться C ++, не так ли? Загрузчик обрабатывается в QML-коде проекта. Мне нужно, чтобы я получил уведомление о QML-разделе проекта. Секундочку, обновлю свой вопрос. Может, это поможет. - person Ra41P; 07.07.2014

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

Вот документация по интерфейсу 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(&notifier, &QSocketNotifier::activated, this, &MyClass::interruptFired);
person Joshua D. Boyd    schedule 15.09.2017