Source file: /~heha/ewa/Reluktanzmotor/maweig-Motor-200831.zip/DLOG_4CH.h

#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