linux terminal-kommando till c/c++ kod?

Permalänk
Medlem

linux terminal-kommando till c/c++ kod?

Hej! Kör linux och har en device som jag via terminalen hämtar data via genom att skriva
"cat /dev/lirc0 | hexdump" och får då ut data smidigt:

0000000 ffff 00ff 0a5a 0100 0352 0000 01c2 0100
0000010 01c2 0000 01c2 0100 01c2 0000 01c2 0100
0000020 0384 0000 0190 0100 0384 0000 0546 0100

Det jag nu undrar är ifall någon är kunnig nog att kunna få ut samma sak i c/c++ (jag sitter i Qt)? (Optimalt vore om man kunde få bort adressen i starten på varje rad (indikerat med fetstil) så att ovanstående blir enligt nedan).
ffff 00ff 0a5a 0100 0352 0000 01c2 0100
01c2 0000 01c2 0100 01c2 0000 01c2 0100
0384 0000 0190 0100 0384 0000 0546 0100

jag har försökt med olika sätt. tänkte man kan öppna filen "lirc0" och läsa från den, men utan resultat. tycker som att det hänger sig vid inläsningen av datan.

försök1 (med Qt):
QFile file("/dev/lirc0"); //"/dev/input/mice" för att testa data från musen.
if(file.open(QIODevice::ReadOnly))
qDebug()<<"fel";
else{
QTextStream in(&file);
qDebug() << in.readAll(); }

försök2 (ren c++)
ifstream f;
f.open("/dev/lirc0");
char out[100];
if (f.is_open()) {
while ( f.good() ) {
f >> out;
qDebug() << out;
}
f.close();
}

Någon som är duktig där ute?

Permalänk
Medlem

int rc;
FILE * fp = fopen("/dev/lirc0", "rb");
while(!feof(fp)) {
fread(&rc, sizeof(int), 1, fp);
}

Visa signatur

Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410

Permalänk
Medlem

Varför inte snacka snällt med Lircs bibiliotek så får lirc dekoda alla kommandon?

EDIT: Googlade åt dig: http://www.lirc.org/html/technical.html#applications

Visa signatur

Jag är en optimist; det är aldrig så dåligt så att det inte kan bli sämre.

Permalänk
Medlem
Skrivet av zyberzero:

Varför inte snacka snällt med Lircs bibiliotek så får lirc dekoda alla kommandon?

EDIT: Googlade åt dig: http://www.lirc.org/html/technical.html#applications

Tack för svaret! har dock testat det som en tok och min device vill inte fungera med irrecord tyvärr så vill hämta in datan likt ovanstående kommando och parsa själv.

Permalänk
Medlem
Skrivet av MagnusL:

int rc;
FILE * fp = fopen("/dev/lirc0", "rb");
while(!feof(fp)) {
fread(&rc, sizeof(int), 1, fp);
}

Tack för den! fast det ger mig inte allt som "cat ... | hexdump" ger mig utan verkar missa många data.

16777215
16779866
850
16777666
450
16777666
400
16777716
...
...

Permalänk

Om filen inte har ett "slut" så kommer inläsningen att vänta tills ett sådant finns tillgängligt. För att komma runt det kan man om man använt fopen & fcntl alternativt open lägga till flaggan O_NONBLOCK. Då kommer inte kommandot att hänga sig längre. Man får dock ta hänsyn till funktionerna kommer att returnera även när det inte finns data tillgängligt.

Eftersom du försöker använda lirc så kan du utnyttja dess programmeringsgränssnitt istället.:

http://www.lirc.org/html/technical.html under rubriken The lirc_client library.

Tillägg: Tydligen kan man ställa in O_NONBLOCK med Qt om man lägger till flaggan IO_Async.

Din kod hade då fått ändrats till något i stil med följande

if(file.open(QIODevice::ReadOnly | QIODevice::IO_Async))

Permalänk
Medlem
Skrivet av Korkskruv:

Om filen inte har ett "slut" så kommer inläsningen att vänta tills ett sådant finns tillgängligt. För att komma runt det kan man om man använt fopen & fcntl alternativt open lägga till flaggan O_NONBLOCK. Då kommer inte kommandot att hänga sig längre. Man får dock ta hänsyn till funktionerna kommer att returnera även när det inte finns data tillgängligt.

Eftersom du försöker använda lirc så kan du utnyttja dess programmeringsgränssnitt istället.:

http://www.lirc.org/html/technical.html under rubriken The lirc_client library.

Tillägg: Tydligen kan man ställa in O_NONBLOCK med Qt om man lägger till flaggan IO_Async.

Din kod hade då fått ändrats till något i stil med följande

if(file.open(QIODevice::ReadOnly | QIODevice::IO_Async))

Tackar för svaret nu har det löst sig! jo försökte massor mer lirc men det gick inte få kontakt med min device tyvärr så därför jag får göra på detta sätt