Qt C++ RPi GPIO kezelése

 ( makgab | 2014. október 28., kedd - 21:42 )

Üdv!

Egy Raspberry-n próbálom figyelni a tactile switch button-t: http://adafru.it/1601
A /sys/class/gpio/gpioxx/value fájlokban vannak értékek: alapéretlemezett: "1", lenyomott gomb: "0"

Ha figyelem konzolon (cat /sys/class/gpio/gpio18/value), akkor ez működik is, látszódik a value változása (1->0, 0->1). De Qt C++-ban nem működik:

mainwindows.cpp:

...
const QString MainWindow::file_GPIO1 = "/sys/class/gpio/gpio18/value";
...
MainWindow::MainWindow(QWidget *parent)
...
watcher = new QFileSystemWatcher(this);
connect(watcher, SIGNAL(fileChanged(const QString &)), this, SLOT(fileChanged(const QString &)));
watcher->addPath(file_GPIO1);
...
void MainWindow::fileChanged(const QString & path)
{
qDebug() << path;

// get the file content ********************************
QFile file( path );
if(!file.open(QIODevice::ReadOnly))
{
qDebug() << "Error opening file: " << file.error();
return;
}
...
if ( path == file_GPIO1 && line == "0" ) {
...

Mintha a fileChanged() nem futna le. Fedora 20 alatt simán működik, igaz ott "/tmp/testfile" állománnyal.
Sőt rootként is próbáltam. Ez a gpioxx/value fájl más mint a txt fájl?

--
G.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Itt is ez a probléma... :(
Ez nem egy sima txt fájl lesz, ill. a RPi nem beleírja az értéket(?).

Van ötlete valakinek, hogy mivel lehetne ezt orvosolni?

--
G.

Itt találtam egy kódot (GPIOClass):

int GPIOClass::getval_gpio(string& val){

string getval_str = "/sys/class/gpio/gpio" + this->gpionum + "/value";
ifstream getvalgpio(getval_str.c_str());// open value file for gpio
if (getvalgpio < 0){
cout << " OPERATION FAILED: Unable to get value of GPIO"<< this->gpionum <<" ."<< endl;
return -1;
}

getvalgpio >> val ; //read gpio value

if(val != "0")
val = "1";
else
val = "0";

getvalgpio.close(); //close the value file
return 0;
}

Csak hogyan lenne szép ezt lekérdezni Qt-ban? Egy QTimer-el szép megoldás?

--
G.

Mivel jobb megoldást nem találtam, ez maradt:


# mainwindow.h
...
public:
...
// Timer
QTimer *timer;
...
private slots:
...
void update();


# mainwindow.cpp
...
#include "GPIOClass.h"
#include < stdlib.h >
...

MainWindow::MainWindow(QWidget *parent){
...
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(200);
...

// example GPIO #18 test
void MainWindow::update()
{
string state18;
GPIOClass *gpio18 = new GPIOClass("18");
gpio18->getval_gpio(state18);
if (state18 == "0") {
QMessageBox::information(this,"Update event","onUpdate event... 18");
} // if
}

Erre a kódra a Raspberry-n is lefutott az update() fv a #18 gomb lenyomására. :)

--
G.