Zápis času

Zápis času
« kdy: 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???
« Poslední změna: 29. 08. 2016, 10:35:53 od Teodor »


v

Re:Zápis času
« Odpověď #1 kdy: 29. 08. 2016, 10:35:38 »
přehodit
   ptime current_time = microsec_clock::local_time();
   
   
while(true) {   

Re:Zápis času
« Odpověď #2 kdy: 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.

Re:Zápis času
« Odpověď #3 kdy: 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.

JSH

Re:Zápis času
« Odpověď #4 kdy: 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.


Re:Zápis času
« Odpověď #5 kdy: 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???

Neviditelný

Re:Zápis času
« Odpověď #6 kdy: 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.

Re:Zápis času
« Odpověď #7 kdy: 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';

// }

}



};

v

Re:Zápis času
« Odpověď #8 kdy: 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

Mirek

Re:Zápis času
« Odpověď #9 kdy: 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;
}


Re:Zápis času
« Odpověď #10 kdy: 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;

}


Re:Zápis času
« Odpověď #11 kdy: 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..

JSH

Re:Zápis času
« Odpověď #12 kdy: 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?

Re:Zápis času
« Odpověď #13 kdy: 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í...

Mirek

Re:Zápis času
« Odpověď #14 kdy: 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íš.