#pragma once
#include "F28x_Project.h" // int16
#ifndef __cplusplus
# error Must be C++
#endif
#include <cstring>
//*********** Structure Definition ********//
template<class _Ty> struct DLOG_4CH{
_Ty input[4], *output[4], prev_value, trig_value;
bool triggered;
int16 pre_scalar, skip_count, size, count;
inline void init() {memset(this,0,sizeof*this);}
inline void operator() (_Ty v0, _Ty v1, _Ty v2, _Ty v3) {
input[0]=v0;
input[1]=v1;
input[2]=v2;
input[3]=v3;
}
void operator() ();
};
// Round-Robin-Datenpuffer mit Trigger-Funktion
// T = Datentyp
// C = Anzahl Kanäle (alle mit gleichem Datentyp)
// L = (maximale) Länge der Historiendaten
// TC = Trigger-Kanal (0 = erster, negativ = kein Trigger),
// TL = Trigger-Low (Y),
// TH = Trigger-High (Y),
// TP = Trigger-Position (X)
// Die Triggersuche beginnt erst bei vollständig gefülltem Puffer,
// typischerweise in Puffermitte.
// rewind(), get() und clear()/cont() werden vom Anzeigeprogramm gerufen.
template<class T,int C=1,int L=160,int TC=-1,T TL=0,T TH=TL, int TP=L/2> class DataLog{
int wi,fill;
mutable bool stop; // im Trigger-Modus: Trigger in der Mitte gefunden
mutable int ri;
T buf[C*L];
public:
DataLog():wi(0),fill(0),stop(false) {}
void clear() {fill=0;stop=false;} // Ende Auslesen: Puffer löschen
int rewind() const{stop=true; ri=wi; return fill;} // Puffer zum sequenziellen Lesen vorbereiten
void cont() const{stop=false;} // Ende Auslesen: Weiter loggen, nicht löschen
void put(const T*v) {
if (stop) return;
if (C==1) buf[wi]=*v;
else memcpy(buf+wi*C,v,sizeof(T)*C);
if (++wi==L) wi=0;
if (fill<L) ++fill;
if (TC>=0 && fill==L && getTcAt(TP)<TL && getTcAt(TP+1)>=TH) stop=true;
}
T*putaddr() { // liefert Zeiger zum Füllen mit dem nächsten Datensatz
if (stop) return 0;
T*r=buf+wi*C;
if (++wi==L) wi=0;
if (fill<L) ++fill;
if (TC>=0 && fill==L && getTcAt(TP)<TL && getTcAt(TP+1)>=TH) stop=true;
return r;
}
const T*get() const{
const T*r=buf+ri*C;
if (++ri==L) ri=0;
return r;
}
private:
const T*getAt(int i) const{
i+=wi;
if (i>=L) i-=L;
return buf+i*C;
}
T getTcAt(int i) const{return getAt(i)[TC];}
};
Detected encoding: ASCII (7 bit) | 8
|