#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;
};
Vorgefundene Kodierung: UTF-8 | 0
|