Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Teodor 29. 08. 2016, 10:26:28

Název: Zápis času
Přispěvatel: Teodor 29. 08. 2016, 10:26:28
Čau, potřebuju poradit ohledně zápisu času do pole.
Při změně stavu se mi má zapsat čas do pole -> start_time a end_time jakmile událost zmizí.
Jenže se zapisuje furt jeden a ten samý čas do start_time a do end_time.

tady je kód:

Kód: [Vybrat]
struct bits {


unsigned bit0 : 1;
unsigned bit1 : 1;
unsigned bit2 : 1;
unsigned bit3 : 1;
unsigned bit4 : 1;
unsigned bit5 : 1;
unsigned bit6 : 1;
unsigned bit7 : 1;


};


 union u {

unsigned char status;
bits b;

 };


struct time {

boost::posix_time::ptime start_time, end_time;

int ps;


}times[18];



void thread_scanner() {

u PINS, ps;
ps.status = 0;


ptime current_time = microsec_clock::local_time();


while(true) {

wait(1);

ICO300_get_DI(&PINS.status);

// PINS.status = PINS.b.bit0;


// if(PINS.b.bit0 != ps.b.bit0) {
 
cout << "hodnota_bit0: " << PINS.b.bit0 << endl;
cout << " " << endl;
cout << "cas start_time: " << times[0].start_time << endl;
cout << "cas end_time: " << times[1].end_time << endl;

{

if(PINS.b.bit0 != 1)

{
times[0].start_time = current_time;

}

else
{
times[1].end_time = current_time;

}

}

ptime t0  = times[0].start_time;
ptime t1  = times[1].end_time;
time_duration pin1 = t1-t0;
cout << " odchylka v sec: " << pin1.total_seconds() << endl;


}

};

Nulovat to pole nebo jak si to ošetřit???
Název: Re:Zápis času
Přispěvatel: v 29. 08. 2016, 10:35:38
přehodit
   ptime current_time = microsec_clock::local_time();
   
   
while(true) {   
Název: Re:Zápis času
Přispěvatel: Teodor 29. 08. 2016, 10:38:44
přehodit
   ptime current_time = microsec_clock::local_time();
   
   
while(true) {

super, díky!
Já si toho nevšiml, neměl jsem to předtim v cyklu.
Název: Re:Zápis času
Přispěvatel: Teodor 29. 08. 2016, 10:53:06
Jak si mám zkorigovat čas, když se mi vypisuje záporně??? Jakmile sepne výstup tak se čas zapisuje kladně a jinak při odepnutym výstupu se vypisuje záporně?
A další věc, potřebuji aby se mi vypsal jen jeden řádek když dojde k události. Takhle mi to pulsuje furt do konsole a to se blbě čte. Mne nic nenapadá s tim výpisem.
Název: Re:Zápis času
Přispěvatel: JSH 29. 08. 2016, 12:19:14
Jak si mám zkorigovat čas, když se mi vypisuje záporně??? Jakmile sepne výstup tak se čas zapisuje kladně a jinak při odepnutym výstupu se vypisuje záporně?
A další věc, potřebuji aby se mi vypsal jen jeden řádek když dojde k události. Takhle mi to pulsuje furt do konsole a to se blbě čte. Mne nic nenapadá s tim výpisem.
Nemá cenu abys čas vypisoval při každé změně. Má cenu ho vypsat jen po zapsání end_time. Pokud ho vypisuješ po změně start_time, tak používáš starý end_time. Pak samozřejmě dostaneš záporný rozdíl.
Název: Re:Zápis času
Přispěvatel: Teodor 29. 08. 2016, 14:56:18
Jak si mám zkorigovat čas, když se mi vypisuje záporně??? Jakmile sepne výstup tak se čas zapisuje kladně a jinak při odepnutym výstupu se vypisuje záporně?
A další věc, potřebuji aby se mi vypsal jen jeden řádek když dojde k události. Takhle mi to pulsuje furt do konsole a to se blbě čte. Mne nic nenapadá s tim výpisem.
Nemá cenu abys čas vypisoval při každé změně. Má cenu ho vypsat jen po zapsání end_time. Pokud ho vypisuješ po změně start_time, tak používáš starý end_time. Pak samozřejmě dostaneš záporný rozdíl.

No, vypisuji tam rozdíl start a end, jak to teda ošetřit??
Jo a ještě jedna věc, pro dalších 7 pinů mi to háže celkový čas v mikrosekundách od 1.1.1970, jak to ošetřit???
Název: Re:Zápis času
Přispěvatel: Neviditelný 29. 08. 2016, 15:41:25
Vypiš ten čas jen tehdy, když ta událost nebo co sleduješ končí, tím se vyhneš odčítání minulosti od přítomnosti. Pro těch zbylých 7 pinů asi nikde nenastavuješ start_time a ta proměnná se defaultně inicializuje na nulu, která zde znamená začátek UNIXové epochy, tedy 1. 1. 1970.
Název: Re:Zápis času
Přispěvatel: Teodor 29. 08. 2016, 16:07:05
Vypiš ten čas jen tehdy, když ta událost nebo co sleduješ končí, tím se vyhneš odčítání minulosti od přítomnosti. Pro těch zbylých 7 pinů asi nikde nenastavuješ start_time a ta proměnná se defaultně inicializuje na nulu, která zde znamená začátek UNIXové epochy, tedy 1. 1. 1970.

Jasný, to jsem si taky myslel, že se to defaultně nastavuje na 0.

Tady mám kód, u kterýho potřebuju, aby se mi vypsal ten rozdíl časů jakmile přijde událost. Použil jsem fci nanosleep ve vláknu, což je prej špatně, protože to vlákno to uspí..
V kódu mám zakomentovaný if podmínky , dle kterých by to logicky mělo jít, ale nejde. Tak budu rád, za nějaký konstruktivní návrh.


Kód: [Vybrat]
void wait(int milli_seconds) { //fce casovace, defaultne jsem ji nastavil na 100[ms]

this_thread::sleep_for(chrono::milliseconds(milli_seconds));

}


Kód: [Vybrat]
/*

int nsleep(unsigned long millisec) {

struct timespec req = {0};
time_t sec = (int)(millisec/1000);
millisec = millisec - (sec*1000);
req.tv_sec = sec;
req.tv_nsec = millisec *1000000L;
while(nanosleep(&req, &req) == -1)

continue;

return 1;


};

*/


Kód: [Vybrat]
void thread_scanner() {

u PINS, ps;
ps.status = 0;





while(true) {

ptime current_time = microsec_clock::local_time();

wait(1);

ICO300_get_DI(&PINS.status);


if(PINS.b.bit0 != 1)

{
times[0].start_time = current_time;

}

else
{
times[1].end_time = current_time;

}



if(PINS.b.bit1 != 1)

{
times[2].start_time = current_time;

}

else

{

times[3].end_time = current_time;
}


if(PINS.b.bit2 != 1)

{
times[4].start_time = current_time;
}

else

{
times[5].end_time = current_time;
}

if(PINS.b.bit3 != 1)

{

times[6].start_time = current_time;
}


else

{
times[7].end_time = current_time;

}

if(PINS.b.bit4 != 1)

{
times[8].start_time = current_time;

}

else

{
times[9].end_time = current_time;

}

if(PINS.b.bit5 != 1)

{
times[10].start_time = current_time;

}

else

{
times[11].end_time = current_time;

}

if(PINS.b.bit6 != 1)

{
times[12].start_time = current_time;

}

else

{
times[13].end_time = current_time;

}

if(PINS.b.bit7 != 1)

{
times[14].start_time = current_time;

}


else

{
times[15].end_time = current_time;

}






// nsleep(2000);

wait(2000); //nanosleep, ceka 2sekundy

ptime t0  = times[0].start_time;
ptime t1  = times[1].end_time;
time_duration pin1 = t1-t0;

// if((pin1.total_microseconds() == 4000000)) {

// cout << " odchylka v [s]: "  << pin1.total_seconds() << endl;
// cout << " " << endl;
cout << " pin1 :"  << pin1.total_microseconds() << '\n';
// cout << " " << endl;
// cout << "odchylka v [ms]: "  << pin1.total_milliseconds() << endl;
// cout << " " << endl;
// cout << "zbytkove vteriny: " << pin1.fractional_seconds() << endl;

// }



ptime t2 = times[2].start_time;
ptime t3 = times[3].end_time;
time_duration pin2 = t3-t2;

// if((pin2.total_microseconds() == 4000000)) {


cout << " pin2: " << pin2.total_microseconds() << '\n';

// }



ptime t4 = times[4].start_time;
ptime t5 = times[5].end_time;
time_duration pin3 = t5-t4;

// if((pin3.total_microseconds() == 4000000)) {

cout << " pin3: " << pin3.total_microseconds() << '\n';

// }



ptime t6 = times[6].start_time;
ptime t7 = times[7].end_time;
time_duration pin4 = t7-t6;

// if((pin4.total_microseconds() == 4000000)) {


cout << " pin4: " << pin4.total_microseconds() << '\n';

// }



ptime t8 = times[8].start_time;
ptime t9 = times[9].end_time;
time_duration pin5 = t9-t8;

// if((pin5.total_microseconds() == 4000000)) {
cout << " pin5: " << pin5.total_microseconds() << '\n';

// }



ptime t10 = times[10].start_time;
ptime t11 = times[11].end_time;
time_duration pin6 = t11-t10;

// if((pin6.total_microseconds() == 4000000)) {

cout << " pin6: " << pin6.total_microseconds() << '\n';

// }



ptime t12 = times[12].start_time;
ptime t13 = times[13].end_time;
time_duration pin7 = t13-t12;

// if(( pin7.total_microseconds() == 4000000)) {

cout << " pin7: " << pin7.total_microseconds() << '\n';

// }




ptime t14 = times[14].start_time;
ptime t15 = times[15].end_time;
time_duration pin8 = t15-t14;

// if(( pin8.total_microseconds() == 4000000)) {

cout << " pin8: " << pin8.total_microseconds() << '\n';

// }

}



};
Název: Re:Zápis času
Přispěvatel: v 29. 08. 2016, 16:15:52
postněte minimální příklad pro jeden vstup a odstraňte všechny ty zbytečné prázdné řádky a zakomentovaný kód
Název: Re:Zápis času
Přispěvatel: Mirek 29. 08. 2016, 16:16:49
Jak si mám zkorigovat čas, když se mi vypisuje záporně??? Jakmile sepne výstup tak se čas zapisuje kladně a jinak při odepnutym výstupu se vypisuje záporně?
A další věc, potřebuji aby se mi vypsal jen jeden řádek když dojde k události. Takhle mi to pulsuje furt do konsole a to se blbě čte. Mne nic nenapadá s tim výpisem.
Nemá cenu abys čas vypisoval při každé změně. Má cenu ho vypsat jen po zapsání end_time. Pokud ho vypisuješ po změně start_time, tak používáš starý end_time. Pak samozřejmě dostaneš záporný rozdíl.

No, vypisuji tam rozdíl start a end, jak to teda ošetřit??
Jo a ještě jedna věc, pro dalších 7 pinů mi to háže celkový čas v mikrosekundách od 1.1.1970, jak to ošetřit???

Tvůj kód je velmi nepřehledný.

Máš nějaký speciální důvod, proč start_time dáváš do times[0] a end_time do times[1]? Logicky by mi to patřilo k sobě.

Proč vypisuješ proměnné start_time a end_time ještě před tím, než do nich proběhne přiřazení hodnoty?

Time_duration ti musí vyjít negativní pokaždé, když máš přechod z 1 -> 0.

Proč v podmínce používáš "!= 1"? Je to správně ale komplikuje to pochopení kódu a zvyšuje riziko chyby při jeho údržbě.

Proč jsi proměnnou s údaji o trvání pulzu nazval pin1? To je docela matoucí.

Každopádně, tvůj jednoduchý SW na hraní by mohl vypadat třeba takto (obsah smyčky):

Kód: [Vybrat]
time_duration pin1;

wait(1);

ICO300_get_DI(&PINS.status);

cout << "hodnota_bit0: " << PINS.b.bit0 << endl;
cout << " " << endl;

if(PINS.b.bit0 == 0) {
times[0].start_time = current_time;

        cout << "cas start_time: " << times[0].start_time << endl;
        cout << "cas end_time: " << times[1].end_time << endl;
} else {
times[0].end_time = current_time;

time_duration pin1 = times[1].end_time - times[0].start_time;

        pin1 = t1-t0;

        cout << "cas start_time: " << times[0].start_time << endl;
        cout << "cas end_time: " << times[1].end_time << endl;

        cout << " odchylka v sec: " << pin1.total_seconds() << endl;
}

Název: Re:Zápis času
Přispěvatel: Teodor 29. 08. 2016, 17:07:44
Tady to je, uznávám, že jsem to předtím naprasil na všech osm pinů.
Je to nepřehledné, ono jde o to, odevzdat hotový úkol ve firmě, nikoho nezajímá jak je to udělané, prostě aby to bylo...
Jak říkám, nanosleep prej použít nemám, protože to uspává vlákno...Mne to přišlo jako log. řešení, když vzorkuji 1ms..
Naopak výpis rozdílu času jen když nastane událost(na vstupu bude 1) mi prostě nešel..

tady je kód:

Kód: [Vybrat]
#include <stdio.h>
#include <unistd.h>
#include <cstdint>
#include <thread>
#include <iostream>
#include <iomanip>
#include <ctime>
#include <time.h>
#include "boost/date_time/posix_time/posix_time.hpp"


extern "C" {

#include "libico.h" //mnou upraveny header pro DIO->kvuli prehlednosti fci

}

using namespace std;
using namespace boost::posix_time;


 void wait(int milli_seconds) { //fce casovace, defaultne jsem ji nastavil na 100[ms]

this_thread::sleep_for(chrono::milliseconds(milli_seconds));

}

int nsleep(unsigned long millisec) {

struct timespec req = {0};
time_t sec = (int)(millisec/1000);
millisec = millisec - (sec*1000);
req.tv_sec = sec;
req.tv_nsec = millisec *1000000L;
while(nanosleep(&req, &req) == -1)

continue;

return 1;

};

struct bits {


unsigned bit0 : 1;
unsigned bit1 : 1;
unsigned bit2 : 1;
unsigned bit3 : 1;
unsigned bit4 : 1;
unsigned bit5 : 1;
unsigned bit6 : 1;
unsigned bit7 : 1;


};


 union u {

unsigned char status;
bits b;

 };


struct time {

boost::posix_time::ptime start_time, end_time;

int ps;


}times[8];



void thread_scanner() {

u PINS, ps;

while(true) {

ptime current_time = microsec_clock::local_time();

wait(1);

ICO300_get_DI(&PINS.status);


if(PINS.b.bit0 != 1)

{
times[0].start_time = current_time;

}

else
{
times[1].end_time = current_time;

}


nsleep(2000); //nanosleep, ceka 2sekundy



ptime t0  = times[0].start_time;
ptime t1  = times[0].end_time;
time_duration pin1 = t1-t0;

cout << " pin1 :"  << pin1.total_microseconds() << '\n';

};



int main() {


ICO300_set_DIO_mode(0xFF); //definovani DIO -> vsechny jsou vstupni -> 1

ICO300_set_DO(0); //pro bezproblemovost provozu jsem vynuloval DO

thread scanner{thread_scanner}; //inicializace vlakna

scanner.join();

return 0;

}

Název: Re:Zápis času
Přispěvatel: Teodor 29. 08. 2016, 17:16:33
Jak si mám zkorigovat čas, když se mi vypisuje záporně??? Jakmile sepne výstup tak se čas zapisuje kladně a jinak při odepnutym výstupu se vypisuje záporně?
A další věc, potřebuji aby se mi vypsal jen jeden řádek když dojde k události. Takhle mi to pulsuje furt do konsole a to se blbě čte. Mne nic nenapadá s tim výpisem.
Nemá cenu abys čas vypisoval při každé změně. Má cenu ho vypsat jen po zapsání end_time. Pokud ho vypisuješ po změně start_time, tak používáš starý end_time. Pak samozřejmě dostaneš záporný rozdíl.

No, vypisuji tam rozdíl start a end, jak to teda ošetřit??
Jo a ještě jedna věc, pro dalších 7 pinů mi to háže celkový čas v mikrosekundách od 1.1.1970, jak to ošetřit???

Tvůj kód je velmi nepřehledný.

Máš nějaký speciální důvod, proč start_time dáváš do times[0] a end_time do times[1]? Logicky by mi to patřilo k sobě.

Proč vypisuješ proměnné start_time a end_time ještě před tím, než do nich proběhne přiřazení hodnoty?

Time_duration ti musí vyjít negativní pokaždé, když máš přechod z 1 -> 0.

Proč v podmínce používáš "!= 1"? Je to správně ale komplikuje to pochopení kódu a zvyšuje riziko chyby při jeho údržbě.

Proč jsi proměnnou s údaji o trvání pulzu nazval pin1? To je docela matoucí.

Každopádně, tvůj jednoduchý SW na hraní by mohl vypadat třeba takto (obsah smyčky):

Kód: [Vybrat]
time_duration pin1;

wait(1);

ICO300_get_DI(&PINS.status);

cout << "hodnota_bit0: " << PINS.b.bit0 << endl;
cout << " " << endl;

if(PINS.b.bit0 == 0) {
times[0].start_time = current_time;

        cout << "cas start_time: " << times[0].start_time << endl;
        cout << "cas end_time: " << times[1].end_time << endl;
} else {
times[0].end_time = current_time;

time_duration pin1 = times[1].end_time - times[0].start_time;

        pin1 = t1-t0;

        cout << "cas start_time: " << times[0].start_time << endl;
        cout << "cas end_time: " << times[1].end_time << endl;

        cout << " odchylka v sec: " << pin1.total_seconds() << endl;
}


Speciální důvod pro to nemám.
pin1 jsem to nazval schválně, abych se vyznal na konektoru
negace mi přijde přehlednější než to mít na férovku v podmínce
Nepřehledné to je, s tím souhlasím, protože za ten měsíc nebyl čas to napsat elegantněji, jednak to na firmě nikoho nezajímá, protože všichni chtěji vidět hotový SW. A za druhé sem strávil dost času hledáním dokumentace ohledně HW pak rozchození komunikace, padající Debian při spuštěné postgresql atd..
Název: Re:Zápis času
Přispěvatel: JSH 29. 08. 2016, 17:43:43
Je to nepřehledné, ono jde o to, odevzdat hotový úkol ve firmě, nikoho nezajímá jak je to udělané, prostě aby to bylo...
Code review je u Vás sprosté slovo? Smím se zeptat, co je to za firmu?
Název: Re:Zápis času
Přispěvatel: Teodor 29. 08. 2016, 18:26:53
Je to nepřehledné, ono jde o to, odevzdat hotový úkol ve firmě, nikoho nezajímá jak je to udělané, prostě aby to bylo...
Code review je u Vás sprosté slovo? Smím se zeptat, co je to za firmu?

To se i tu nechce moc řešit, uvidim jestli mne ve středu nevyrazí...
Název: Re:Zápis času
Přispěvatel: Mirek 29. 08. 2016, 19:48:36
Tady to je, uznávám, že jsem to předtím naprasil na všech osm pinů.
Je to nepřehledné, ono jde o to, odevzdat hotový úkol ve firmě, nikoho nezajímá jak je to udělané, prostě aby to bylo...
Jak říkám, nanosleep prej použít nemám, protože to uspává vlákno...Mne to přišlo jako log. řešení, když vzorkuji 1ms..
Naopak výpis rozdílu času jen když nastane událost(na vstupu bude 1) mi prostě nešel..

tady je kód:

Kód: [Vybrat]
#include <stdio.h>
#include <unistd.h>
#include <cstdint>
#include <thread>
#include <iostream>
#include <iomanip>
#include <ctime>
#include <time.h>
#include "boost/date_time/posix_time/posix_time.hpp"


extern "C" {

#include "libico.h" //mnou upraveny header pro DIO->kvuli prehlednosti fci

}

using namespace std;
using namespace boost::posix_time;


 void wait(int milli_seconds) { //fce casovace, defaultne jsem ji nastavil na 100[ms]

this_thread::sleep_for(chrono::milliseconds(milli_seconds));

}

int nsleep(unsigned long millisec) {

struct timespec req = {0};
time_t sec = (int)(millisec/1000);
millisec = millisec - (sec*1000);
req.tv_sec = sec;
req.tv_nsec = millisec *1000000L;
while(nanosleep(&req, &req) == -1)

continue;

return 1;

};

struct bits {


unsigned bit0 : 1;
unsigned bit1 : 1;
unsigned bit2 : 1;
unsigned bit3 : 1;
unsigned bit4 : 1;
unsigned bit5 : 1;
unsigned bit6 : 1;
unsigned bit7 : 1;


};


 union u {

unsigned char status;
bits b;

 };


struct time {

boost::posix_time::ptime start_time, end_time;

int ps;


}times[8];



void thread_scanner() {

u PINS, ps;

while(true) {

ptime current_time = microsec_clock::local_time();

wait(1);

ICO300_get_DI(&PINS.status);


if(PINS.b.bit0 != 1)

{
times[0].start_time = current_time;

}

else
{
times[1].end_time = current_time;

}


nsleep(2000); //nanosleep, ceka 2sekundy



ptime t0  = times[0].start_time;
ptime t1  = times[0].end_time;
time_duration pin1 = t1-t0;

cout << " pin1 :"  << pin1.total_microseconds() << '\n';

};



int main() {


ICO300_set_DIO_mode(0xFF); //definovani DIO -> vsechny jsou vstupni -> 1

ICO300_set_DO(0); //pro bezproblemovost provozu jsem vynuloval DO

thread scanner{thread_scanner}; //inicializace vlakna

scanner.join();

return 0;

}

Nepoužíváš konzistentně indexy do pole - na jednom místě jsi to změnil, na druhém ti to zůstalo.
Proč čekáš 2sec když máš (spíš chceš mít) periodu vzorkování 1 ms?
Proč jsi nepřesunul výpočet délky trvání do příslušné větve podmínky if? RTakhle ti to bude vždycky při přechodu 1 -> 0 vypisovat záporné číslo...
Nerozumím úplně přesně tomu proč jsi volání nanosleep vložil zrovna tam, kam jsi ho vložil. A vlastně proč ho tam vlastně máš.
K té periodě vzorkování - i kdybys vyhodil ty 2 sec, nebude ti to sedět na 1 msec. Měl bys změřit trvání aktivního kódu a čekat 1 ms - doba_provádění_kódu. Hlavně jestli to provozuješ na nějakém málo výkonném industrial embedded systému.

Ale dělej jak sám myslíš.
Název: Re:Zápis času
Přispěvatel: e3k 29. 08. 2016, 21:14:31
Je to nepřehledné, ono jde o to, odevzdat hotový úkol ve firmě, nikoho nezajímá jak je to udělané, prostě aby to bylo...
to tak nefunguje. kvalita kodu je podstatny faktor.
Název: Re:Zápis času
Přispěvatel: Teodor 29. 08. 2016, 21:56:12
Tady to je, uznávám, že jsem to předtím naprasil na všech osm pinů.
Je to nepřehledné, ono jde o to, odevzdat hotový úkol ve firmě, nikoho nezajímá jak je to udělané, prostě aby to bylo...
Jak říkám, nanosleep prej použít nemám, protože to uspává vlákno...Mne to přišlo jako log. řešení, když vzorkuji 1ms..
Naopak výpis rozdílu času jen když nastane událost(na vstupu bude 1) mi prostě nešel..

tady je kód:

Kód: [Vybrat]
#include <stdio.h>
#include <unistd.h>
#include <cstdint>
#include <thread>
#include <iostream>
#include <iomanip>
#include <ctime>
#include <time.h>
#include "boost/date_time/posix_time/posix_time.hpp"


extern "C" {

#include "libico.h" //mnou upraveny header pro DIO->kvuli prehlednosti fci

}

using namespace std;
using namespace boost::posix_time;


 void wait(int milli_seconds) { //fce casovace, defaultne jsem ji nastavil na 100[ms]

this_thread::sleep_for(chrono::milliseconds(milli_seconds));

}

int nsleep(unsigned long millisec) {

struct timespec req = {0};
time_t sec = (int)(millisec/1000);
millisec = millisec - (sec*1000);
req.tv_sec = sec;
req.tv_nsec = millisec *1000000L;
while(nanosleep(&req, &req) == -1)

continue;

return 1;

};

struct bits {


unsigned bit0 : 1;
unsigned bit1 : 1;
unsigned bit2 : 1;
unsigned bit3 : 1;
unsigned bit4 : 1;
unsigned bit5 : 1;
unsigned bit6 : 1;
unsigned bit7 : 1;


};


 union u {

unsigned char status;
bits b;

 };


struct time {

boost::posix_time::ptime start_time, end_time;

int ps;


}times[8];



void thread_scanner() {

u PINS, ps;

while(true) {

ptime current_time = microsec_clock::local_time();

wait(1);

ICO300_get_DI(&PINS.status);


if(PINS.b.bit0 != 1)

{
times[0].start_time = current_time;

}

else
{
times[1].end_time = current_time;

}


nsleep(2000); //nanosleep, ceka 2sekundy



ptime t0  = times[0].start_time;
ptime t1  = times[0].end_time;
time_duration pin1 = t1-t0;

cout << " pin1 :"  << pin1.total_microseconds() << '\n';

};



int main() {


ICO300_set_DIO_mode(0xFF); //definovani DIO -> vsechny jsou vstupni -> 1

ICO300_set_DO(0); //pro bezproblemovost provozu jsem vynuloval DO

thread scanner{thread_scanner}; //inicializace vlakna

scanner.join();

return 0;

}

Nepoužíváš konzistentně indexy do pole - na jednom místě jsi to změnil, na druhém ti to zůstalo.
Proč čekáš 2sec když máš (spíš chceš mít) periodu vzorkování 1 ms?
Proč jsi nepřesunul výpočet délky trvání do příslušné větve podmínky if? RTakhle ti to bude vždycky při přechodu 1 -> 0 vypisovat záporné číslo...
Nerozumím úplně přesně tomu proč jsi volání nanosleep vložil zrovna tam, kam jsi ho vložil. A vlastně proč ho tam vlastně máš.
K té periodě vzorkování - i kdybys vyhodil ty 2 sec, nebude ti to sedět na 1 msec. Měl bys změřit trvání aktivního kódu a čekat 1 ms - doba_provádění_kódu. Hlavně jestli to provozuješ na nějakém málo výkonném industrial embedded systému.

Ale dělej jak sám myslíš.

index pole jsem tam nechal omylem, jinak to mam správně, ale to je fuk.
Tak vzorkovačka je 1ms a ten výpis co to vlákno dává je nečitelný při téhle vzorkovačce, proto jsem tam nacpal nanosleep..
Snažil jsem se udělat výpis jen při změně stavu(jakmile by byla 1 na vstupu tak by to vypsalo rozdíl času, ale to se mi prostě nepovedlo, byť to bylo logicky správně přes if..)
Což to já přehodim, ještě to nějak upravim.
No, provozuje se to na prototypu industrial embedded počítači od Axiomteku. Nikdo s tím přede mnou nedělala a neví jak se to chová.
Já jako junior vývojář jsem tohle dostal za úkol, celý kód bych psal jinak a déle, tohle je prostě rychlozkvašená prasečina, kterou bych rád ve středu odevzdal, aby bylo vidět, že to funguje...
Název: Re:Zápis času
Přispěvatel: Teodor 29. 08. 2016, 21:57:43
Je to nepřehledné, ono jde o to, odevzdat hotový úkol ve firmě, nikoho nezajímá jak je to udělané, prostě aby to bylo...
to tak nefunguje. kvalita kodu je podstatny faktor.

Já to vim, ale ne když na to má člověk cca 14 dní, má prototyp HW, který předním nikdo neměl, musí si o tom sehnat dokumentaci a další věci. Pak se dozví, že nikoho nezajímá jak je to naprogramovaný, ale jestli to funguje jak má, pokud ne tak to tester vrátí k předělání...
Název: Re:Zápis času
Přispěvatel: Mirek 29. 08. 2016, 23:19:37
Nepoužíváš konzistentně indexy do pole - na jednom místě jsi to změnil, na druhém ti to zůstalo.
Proč čekáš 2sec když máš (spíš chceš mít) periodu vzorkování 1 ms?
Proč jsi nepřesunul výpočet délky trvání do příslušné větve podmínky if? RTakhle ti to bude vždycky při přechodu 1 -> 0 vypisovat záporné číslo...
Nerozumím úplně přesně tomu proč jsi volání nanosleep vložil zrovna tam, kam jsi ho vložil. A vlastně proč ho tam vlastně máš.
K té periodě vzorkování - i kdybys vyhodil ty 2 sec, nebude ti to sedět na 1 msec. Měl bys změřit trvání aktivního kódu a čekat 1 ms - doba_provádění_kódu. Hlavně jestli to provozuješ na nějakém málo výkonném industrial embedded systému.

Ale dělej jak sám myslíš.

index pole jsem tam nechal omylem, jinak to mam správně, ale to je fuk.
Tak vzorkovačka je 1ms a ten výpis co to vlákno dává je nečitelný při téhle vzorkovačce, proto jsem tam nacpal nanosleep..
Snažil jsem se udělat výpis jen při změně stavu(jakmile by byla 1 na vstupu tak by to vypsalo rozdíl času, ale to se mi prostě nepovedlo, byť to bylo logicky správně přes if..)
Což to já přehodim, ještě to nějak upravim.
No, provozuje se to na prototypu industrial embedded počítači od Axiomteku. Nikdo s tím přede mnou nedělala a neví jak se to chová.
Já jako junior vývojář jsem tohle dostal za úkol, celý kód bych psal jinak a déle, tohle je prostě rychlozkvašená prasečina, kterou bych rád ve středu odevzdal, aby bylo vidět, že to funguje...
[/quote]
Inu, proč ne.

Ale stejně mi pořád vrtá hlavou co to vlastně má dělat a k čemu to je. A proč to logování třeba nemůže být do souboru. A proč nevadí že to nezkoušíš se skutečným vzorkovacím kmitočtem, atd. Ale to už je tvůj boj.
Název: Re:Zápis času
Přispěvatel: Teodor 30. 08. 2016, 07:09:19
Nepoužíváš konzistentně indexy do pole - na jednom místě jsi to změnil, na druhém ti to zůstalo.
Proč čekáš 2sec když máš (spíš chceš mít) periodu vzorkování 1 ms?
Proč jsi nepřesunul výpočet délky trvání do příslušné větve podmínky if? RTakhle ti to bude vždycky při přechodu 1 -> 0 vypisovat záporné číslo...
Nerozumím úplně přesně tomu proč jsi volání nanosleep vložil zrovna tam, kam jsi ho vložil. A vlastně proč ho tam vlastně máš.
K té periodě vzorkování - i kdybys vyhodil ty 2 sec, nebude ti to sedět na 1 msec. Měl bys změřit trvání aktivního kódu a čekat 1 ms - doba_provádění_kódu. Hlavně jestli to provozuješ na nějakém málo výkonném industrial embedded systému.

Ale dělej jak sám myslíš.

index pole jsem tam nechal omylem, jinak to mam správně, ale to je fuk.
Tak vzorkovačka je 1ms a ten výpis co to vlákno dává je nečitelný při téhle vzorkovačce, proto jsem tam nacpal nanosleep..
Snažil jsem se udělat výpis jen při změně stavu(jakmile by byla 1 na vstupu tak by to vypsalo rozdíl času, ale to se mi prostě nepovedlo, byť to bylo logicky správně přes if..)
Což to já přehodim, ještě to nějak upravim.
No, provozuje se to na prototypu industrial embedded počítači od Axiomteku. Nikdo s tím přede mnou nedělala a neví jak se to chová.
Já jako junior vývojář jsem tohle dostal za úkol, celý kód bych psal jinak a déle, tohle je prostě rychlozkvašená prasečina, kterou bych rád ve středu odevzdal, aby bylo vidět, že to funguje...
Inu, proč ne.

Ale stejně mi pořád vrtá hlavou co to vlastně má dělat a k čemu to je. A proč to logování třeba nemůže být do souboru. A proč nevadí že to nezkoušíš se skutečným vzorkovacím kmitočtem, atd. Ale to už je tvůj boj.
[/quote]

Do souboru jsem to chtěl taky nacpat, ale to mi nebylo dovoleno.
No já to dneska upravim podle toho co tu je a kašlu na to.