Tak znova já,
a zase vlákno.
Potřebuju nějaký brainstorming ohledně vlákna, které čeká na událost a pak ještě využít timer v c++ pod linuxem, který mi bude časovat po zadaný čas.
A nechtěl bys to radši napsat ještě maďarsky? Takhle možná někoho geniálního může napadnout, na co se vlastně ptáš.
V podstatě mi jde o to, aby vlákno zareagovalo když se na vstupu jakéhokoli pinu objeví log 1(+5V) a timer mi změřil nějaký odchylky, maximální a minimální odchylku od vzorkovací frekvence)
No a co je na tom za problém? Opět myslím, že samostatné vlákno na tohle vůbec nepotřebuješ, ale to je vedlejší, protože ať to poběží v hlavním vlákně nebo někde jinde, logika bude stejná. Prostě s dostatečnou vzorkovací frekvencí čti ze vstupu data a dle potřeby zareaguj. Stačí ti na to if a nanosleep().
Tady posílám kód, zadefinoval do threadu - vymaskování bitů.
Přiznám se, že mne tam mate to vlákno, nicméně něčím vzorkovat musím, tak mne když tak naveďte pokud je to sémanticky blbě.
void thread_scanner() { //fce vlakna, ktera obsahuje scanner DI
int stav;
const long INTERVAL_MS = 500 * NANO_SECOND_MULTIPLIER; //vypocet pro funkci nanosleep
while(true) {
wait(100);
unsigned char pins; //v ramci vylouceni problemu s headerem od vyrobce jsem radeji deklaroval promenou takto
ICO300_get_DI(&pins); //ziskani stavu a predani promenne pins referenci
for(int i = 0; i < 8; i++){ //vymaskovani jednotlivych bitu
stav = (int)(pins & 1); //stav jednotlivych bitu po bitovem logickem soucinu
pins >>= 1; //bitovy posun doprava
}
if (stav != 0) { //pokud je stav kterehokoli bitu jiny nez nula, tak se vypise
cout << stav;
}
else { //jinak jsem pouzil fci nanosleep, abych nevypisoval neustale do konzole nuly
timespec sleepValue = {0};
sleepValue.tv_nsec = INTERVAL_MS;
nanosleep(&sleepValue, NULL);
}
}
}