Source file: /~heha/ewa/Motor/cdesk.zip/simulate.h

#pragma once
#include <windows.h>
#include <vector>

/* Ein Vielkanal-Signalgenerator, der dem Verhalten des
   (im C2000-Mikrocontroller enthaltenen) Frequenzumrichters entspricht.
   Anwendung vmtl. als Singleton.
   WAVEFORMATEX enthält nChannels und nBlockAlign zur Generierung der Samples.
   Zunächst auf 16-Bit vzb. Daten fixiert.
 */

struct Simulate{
 struct GENPARAM{
  TCHAR name[32];
//  BYTE datatype;	// kodiert auch Sample-Größe
//  BYTE offset;		// Position in der struct, in Bits für Bit-Typen, in Bytes für alles andere
  BYTE contribute;	// Wird in Waveform integriert? 1 = links, 2 = rechts
  BYTE curve;		// Kurvenform: Sinus, Dreieck ... (s.u.)
  union{
   struct{		// relevant?	Sinus	Dreieck	Rechtck	Rausch	Arb
    double freq;	// Frequenz	ja	ja	ja	nein?	ja
    double amp;		// Amplitude	ja	ja	ja	ja	ja
    double ofs;		// Offset	ja	ja	ja	ja	ja
    double pha;		// Phase	ja	ja	ja	nein	ja
    double sym;		// Symmetrie	nein	ja	ja	nein	nein
   };
   double dvalues[5];	// Alle double-Werte
  };
  union{
   struct{
    BYTE fm;		// Index FM-Gen	ja	ja	ja	nein?	ja
    BYTE pm;		// Index PM-Gen	ja	ja	ja	nein	ja
    BYTE am;		// Index AM-Gen	ja	ja	ja	ja	ja	Indizes jeweils +1, 0 = keine Modulation
    BYTE om;		// Addieren	ja	ja	ja	ja	ja
   };
   BYTE xm[4];		// Alle Modulator-Indizes zusammengefasst
  };
  enum{
   sine,triangle,rectangle,noise,arb_step,arb_lin	// Kurvenform; arb_step = Index abrunden, arb_lin=lineare Approximation bei krummem Index
  };
  double*arb;		// Arbiträrdaten Länge <arblen>
  DWORD arblen;
 };
 struct GENSTATE{
  double pha,amp;
 };
 std::vector<GENPARAM> genparams;
 mutable std::vector<GENSTATE> genstates;
 double dt;
 unsigned blocklen;


// struct INITPARAM{
//  WAVEFORMATEX wf;
//  GENPARAM gp[3];
// };
// typedef void(*cb_t)(char*data,DWORD len, void*cbd);
// Simulate(INITPARAM*ip, cb_t cb, void*cbd);	// blocklen in Samples, nicht in Bytes
// ~Simulate();
// bool okay() const;
 bool start();		// Startet Thread, der zeitlich passend den Callback aufruft
 bool stop();
 __int64 time;		// Bei start() auf 0
 static INT_PTR CALLBACK SimulDlgProc(HWND,UINT,WPARAM,LPARAM);
 void generate(char*buffer) const;	// Nächsten Waveform-Block erzeugen, Länge = blocklen Samples, für den Fall der Waveform-Ausgabe
private:
// cb_t cb;
// void*cbd;
// HANDLE hThread,hTerminate;
// DWORD threadId;
// static DWORD CALLBACK threadproc(void*p);
// DWORD threadproc();
 void generate(unsigned j,char*cluster) const;
 void onListChange(HWND hDlg);
 void onListItemChange(HWND hDlg);
 void onCurveChange(HWND hDlg,GENPARAM&);
 void onNameChange(HWND hDlg,GENPARAM&,bool autoassign=false);	// Eineindeutigen Namen garantieren
 bool NameUniq(GENPARAM&,const TCHAR*) const;
};
Detected encoding: ANSI (CP1252)4
Wrong umlauts? - Assume file is ANSI (CP1252) encoded