#define ELEN 8 // Puffergröße für Einheit
#define ELENSTR T("7") // dito als String (für sscanf), 1 Zeichen Luft
typedef TCHAR EINHEIT[ELEN]; // ein (ausreichender) Einheiten-Puffer
#include "resource.h"
#define SUB_XABLENK 0 // Nummer des Popup-Menüs: Koeffizient
#define SUB_RATE 1 // Samplerate (durchaus nicht zusammenhängend!)
#define SUB_XFARBE 2 // Farbe der Zeitbasis
#define WAS_XABLENK 0x01 // Bitmaske für InfoNeu() und Update()
#define WAS_RATE 0x02 // Abtastrate (nur Zeitbasis "A")
#define WAS_XANF 0x04 // Anfang der Verschiebung (übrige Zeitbasen)
#define WAS_SAMPLES 0x08 // Anzahl der Abtastwerte
#define WAS_FARBE 0x40 // Farbe für Kurvenzug, Masse- und Triggersymbol
#define WAS_ONOFF 0x80 // Ein/Ausschalten von ReadOut (Bit 0) und Kurve (Bit 7)
bool GetNameList(PCTSTR n, PTSTR buf, BYTE*bitnr);
bool FarbAuswahl(HWND,COLORREF&);
BYTE PointIntoRect(const RECT*rc, POINT*pt);
int rund(float f);
#define SUB_YVOR 1 // Nummer Popup (Vorteiler)
#define SUB_YINV 2 // Nummer des Menüpunktes (hier: kein Popup)
#define SUB_YABL 3 // Nummer des Popup-Menüs
#define SUB_YKOP 4 // Nummer Popup
#define SUB_YNUL 6 // kein Popup-Menü hier, aber trotzdem modifizierbar!
#define SUB_YNAM 7
#define SUB_YFARBE 8
#define WAS_YNAM 0x01
#define WAS_YVOR (1<<SUB_YVOR)
#define WAS_YINV (1<<SUB_YINV)
#define WAS_YABL (1<<SUB_YABL)
#define WAS_YKOP (1<<SUB_YKOP)
#define WAS_YNUL 0x20
struct KANALANZEIGE;
struct GRUPPE{
TCHAR name[8];
int ref; // Referenzzähler (Anzahl der Eingangskanäle)
bool SetVar(int,PCTSTR);
bool GetVar(int,PTSTR);
};
struct KANAL;
typedef int (_fastcall *GETKANALSAMPLE)(KANAL*,LPSTR);
struct KANAL:GRUPPE{
float voltprolsb; // Aktueller Koeffizient für ADU
float voltoffset; // Aktuelle Gleichspannungs-Verschiebung (meistens fest Null)
float fTastkopf; // >1 für Dämpfung (bspw. 10:1), <1 für aktiven Tastkopf
EINHEIT einheit; // Standardmäßig Volt
TCHAR sTastkopf[16]; // als String zur bequemen Ein/Ausgabe
TCHAR sNamen[16]; // Name:BitNr für Zusammenfassung (Logikan.)
WORD praefixe; // Erlaubte Präfixe (Standard: µV .. kV)
float nulllinie; // in div!
float div; // in <einheit>/div
float min,max; // Minimum und Maximum für Spannung/div (ohne Vorteiler)
HMENU submenu; // Zugehöriger Menü-Ast
COLORREF farbe;
// UINT flags; // "div" ungenau
// short*data;
POINT*poly;
int polycount,polyc2; // kann durch Optimierung weniger sein als zeit.samples
int kn; // Kanalnummer (0-basiert)
UINT idhigh;
UINT kopplung; // notfalls: simulierte Kopplung
BYTE byteoffset; // von CHANINFO-Struktur
BYTE maske; // von CHANINFO-Struktur
long sub; // Zur Simulation von AC-Kopplung
GETKANALSAMPLE getsample; // Routine je nach (simulierter) Kopplung
void Konstruktor(int); // Irgendwie geht das mit Konstruktor und Destruktor
void Destruktor(); // gründlich in die Hose!
bool InfoNeu(BYTE); // neue Beschreibung fürs Menü und Schnellzugriff
void DarstellungNeu(); // Neue Y-Ausdehnung (an Treiber weiterreichen)
void MaleKurve(HDC dc);
void CalcGraf(); // Kurvenzugpunkte aus Sampledaten berechnen
// bool RelayMsg(K_MSG,WPARAM,LPARAM);
inline bool GetNameList(PTSTR buf, BYTE*bitnr) {return ::GetNameList(sNamen,buf,bitnr);};
bool HatName(PCTSTR n); // Testet, ob Name enthalten ist
MASSE *masse; // Massesymbol (gehört NICHT zur Kanalanzeige!!)
KANALANZEIGE *anzeige;
KANAL() {masse=NULL; anzeige=NULL; poly=NULL;};
int GetTastkopfIndex(); // Index fürs Menü usw.
bool SetNamen(PCTSTR);
bool SetTastkopf(PCTSTR); // vom Dialog oder von .INI-Datei
// frisst auch Inversion und Einheit
// frisst auch Inversion, Einheit und Kopplung (Suffix =~_)
// Erhöhung auf nächsten "Rastwert" mit "++", Erniedrigung mit "--"
// Kleine Veränderung mit "+" oder "-", mit Shift: "+?" oder "-?"
bool SetAblenkung(PCTSTR); // vom Dialog oder von .INI-Datei
bool SetAblenkung(float); // in Volt pro Div, liefert stets TRUE
bool SetNulllinie(PCTSTR);
// Erhöhung um 1 Skalenteil mit "++", Erniedrigung mit "--"
// Kleine Veränderung mit "+" oder "-" (für DDE)
// Stufung für Gruppe mittels @ als Trennzeichen
bool SetNulllinie(float); // in Volt, liefert stets TRUE
bool SetKopplung(PCTSTR); // frisst "DC","AC","GND","R50","INV","=","~","_"
bool SetKopplung(UINT k); // liefert stets TRUE?
bool SetFarbe(PCTSTR);
bool SetFarbe(COLORREF);
// Allgemeiner Zugriff auf alle kanalbezogenen Variablen
bool SetVar(int,PCTSTR); // nummeriert
bool SetVar(PCTSTR,PCTSTR); // mit Name
bool SetVar(HSZ,PCTSTR); // mit DDE-Stringhandle
bool GetVar(int,PTSTR); // dito zum Lesen (Puffergröße 32 Zeichen)
bool GetVar(PCTSTR,PTSTR); // Bei unterschiedlichen Gruppenmitgliedern
bool GetVar(HSZ,PTSTR); // ...mit angehängtem Fragezeichen
void FarbAuswahl(HWND w) {COLORREF c=farbe; if (::FarbAuswahl(w,c)) SetFarbe(c);};
// void SetAnzeigen(BYTE,BYTE); // Anzeigen-Status setzen ("Fokussierung")
protected:
void LadeAblenkListe(); // Neues Menü erzeugen und einhängen
void LadeVorgabe(); // Laden von .INI-Datei oder Registry
bool RetteVorgabe(); // Speichern in .INI-Datei
void GetInfoString(PTSTR); // ASCII-Kurzbeschreibung fürs Menü
};
struct TRIGGERANZEIGE;
struct TRIGG{
TCHAR name[8];
HMENU submenu;
KREUZ *kreuz;
KANAL *k; // zeigt auf die jeweilige Quelle
TRIGGERANZEIGE *anzeige;
TRIGG() {kreuz=NULL; k=NULL; anzeige=NULL;};
enum MODUS{TM_AUTO,TM_NORMAL,TM_SINGLE} modus;
// BUG: Eigentlich ist MODUS ein Bitfeld, bestehend aus:
// * AutoTrigger (Gegenteil: Normal), * AutoArm (Gegenteil: Single),
// * Run (Gegenteil Stop)
// Und im Fall von AutoArm braucht man noch eine "Triggerblindheit" (hold-off),
// die aber nur bei synchroner Datenquelle sinnvoll umsetzbar ist.
int quelle; // Kanal (oder extern)
float pegel; // in div!
int pretrig; // zurzeit in Prozent
enum FLANKE{TF_STEIG,TF_FALL} flanke;
enum KOPPLUNG{TK_DC, TK_AC, TK_LF, TK_HF, TK_TVH, TK_TVL, TK_PAT=7} kopplung;
COLORREF farbe;
void Konstruktor(int); // Irgendwie geht das mit Konstruktor und Destruktor
void Destruktor(); // gründlich in die Hose!
bool SetModus(PCTSTR); // frisst Strings und auch Zahlen (0..2)
bool SetModus(enum MODUS);
bool SetQuelle(PCTSTR); // frisst Strings und auch Zahlen (0..?)
bool SetQuelle(int);
bool SetPegel(PCTSTR);
bool SetPegel(float);
bool SetPretrig(PCTSTR);
bool SetPretrig(int);
bool SetFlanke(PCTSTR); // frisst Strings und auch Zahlen (0 und 1)
bool SetFlanke(enum FLANKE);
bool SetKopplung(PCTSTR); // frisst Strings und auch Zahlen (0..7)
bool SetKopplung(enum KOPPLUNG);
bool SetFarbe(PCTSTR); // Farbe und auch Position sind...
bool SetFarbe(COLORREF); // Eigenschaft von ANZEIGE!
// Allgemeiner Zugriff auf alle triggerbezogenen Variablen
bool SetVar(int,PCTSTR); // nummeriert
bool SetVar(PCTSTR,PCTSTR); // mit Name
bool SetVar(HSZ,PCTSTR); // mit DDE-Stringhandle
bool GetVar(int,PTSTR); // dito zum Lesen (Puffergröße 32 Zeichen)
bool GetVar(PCTSTR,PTSTR);
bool GetVar(HSZ,PTSTR);
void FarbAuswahl(HWND w) {COLORREF c=farbe; if (::FarbAuswahl(w,c)) SetFarbe(c);};
protected:
void LadeVorgabe(); // Laden von .INI-Datei oder Registry
bool RetteVorgabe(); // Speichern in .INI-Datei
void LadeQuelleMenu(); // Menü auffüllen beim Konstruktor
bool InfoNeu(BYTE); // Menü, Anzeige, DDE, Kreuz aktualisieren
};
#define SUB_TMODUS 0 // Untermenü-Indizes
#define SUB_TQUELLE 1
#define SUB_TFLANKE 2
#define SUB_TKOPPLUNG 3
#define SUB_TPEGEL 4 // kein Untermenü, nur für Update();
#define SUB_TPRETRIG 5 // Untermenü mit ein paar fixen Werten??
#define SUB_TFARBE 6
#define WAS_TMODUS (1<<SUB_TMODUS)
#define WAS_TQUELLE (1<<SUB_TQUELLE)
#define WAS_TFLANKE (1<<SUB_TFLANKE)
#define WAS_TKOPPLUNG (1<<SUB_TKOPPLUNG)
#define WAS_TPEGEL (1<<SUB_TPEGEL)
#define WAS_TPRETRIG (1<<SUB_TPRETRIG)
struct ZEITANZEIGE;
struct ZEIT{
TCHAR name[8]; // "A" oder "B" (oder weitere Zeitbasen)
float div; // wird angezeigt bei YT-Betrieb
float min,max; // Sinnvolle Minima und Maxima für Zeit/div
union {
float rate; // NUR 1. Zeitbasis!
float anfang; // Jede andere Zeitbasis hat einen "Anfang" in die 1. Zeitbasis
};
float minrate,maxrate; // NUR 1. Zeitbasis!
DWORD samples;
// UINT flags; // Bit 0: "div" ungenau
UINT kn,idhigh; // Nummer, 0=Zeitbasis A
HMENU submenu;
COLORREF farbe;
ZEITANZEIGE *anzeige;
ZEIT() {anzeige=NULL;};
void Konstruktor(int); // Irgendwie geht das mit C++-Konstruktor und Destruktor
void Destruktor(); // gründlich in die Hose!
// void LadeXAblenkString(PTSTR);
bool SetAblenkung(PCTSTR); // vom Dialog oder von .INI-Datei
bool SetAblenkung(float); // in Sekunden pro Div
bool SetRate(PCTSTR); // Samplerate setzen (nur für 1. Zeitbasis!)
bool SetRate(float);
bool SetAnfang(PCTSTR); // Anfang setzen (nur für sonstige Zeitbasen)
bool SetAnfang(float);
bool SetSamples(PCTSTR);
bool SetSamples(DWORD);
bool SetFarbe(PCTSTR);
bool SetFarbe(COLORREF);
bool SetVar(int,PCTSTR); // nummeriert
bool SetVar(PCTSTR,PCTSTR); // mit Name
bool SetVar(HSZ,PCTSTR); // mit DDE-Stringhandle
bool GetVar(int,PTSTR); // dito zum Lesen (Puffergröße 32 Zeichen)
bool GetVar(PCTSTR,PTSTR);
bool GetVar(HSZ,PTSTR);
void FarbAuswahl(HWND w) {COLORREF c=farbe; if (::FarbAuswahl(w,c)) SetFarbe(c);};
protected:
void LadeAblenkListe(); // Popup-Menü laden
void LadeRateListe();
void LadeListenVonRateMinMax();
void LadeVorgabe();
bool RetteVorgabe();
bool InfoNeu(BYTE);
};
//#define OF_VAR 0x01 // "Variable" Einstellung
//#define OF_INV 0x02 // Invertierte Darstellung
//#define OF_XY 0x04 // XY-Betrieb (nur für "Zeitbasis" -> "Abtastrate")
/**********************************************************
** Anzeigen: Basisklasse, Kanal, Zeit, Trigger, Messung **
**********************************************************/
struct ANZEIGE:MINIWND{
MYBUTTON *nagel; // Pin zum Verschieben, Ein/Ausschalten und als Systemmenü
int grenzen[5]; // von string1 und Font abhängige Mausklick-Bereiche
BYTE hitkode; // Worüber die Maus gerade schwebt...
TCHAR string1[32],string2[32];
MYBUTTON *knopf[2]; // Bis zu 2 Knöpfe (rauf, runter)
ANZEIGE();
virtual ~ANZEIGE() {delete nagel;};
virtual void Paint(HDC);
virtual bool RelayMsg(UINT,WPARAM,LPARAM);
// virtual void PAS Update(BYTE);
void setTextColor(HDC,COLORREF);
};
// Hit-Kodes
#define HK_PRI 0x40 // Primärer Textbereich (bspw. Zeitbasis)
#define HK_SEC 0x80 // Sekundärer Textbereich (bspw. Samplerate)
#define HK_SYS 0xC0 // obere beide Bits gesetzt: System-Menü-Feld
#define HK_BUT0 0xC1 // Erster Knopf
#define HK_BUT1 0xC2 // Zweiter Knopf usw.
struct KANALANZEIGE:ANZEIGE{
KANAL *k; // Rückwärts-Link
MINIWND *kurve; // zur Darstellung der Pixel, zum Anklicken können...
KANALANZEIGE(KANAL*k);
~KANALANZEIGE() {delete knopf[1];delete knopf[0];};
void SetKnopfRect(RECT*,int);
virtual void Paint(HDC);
virtual bool RelayMsg(UINT,WPARAM,LPARAM);
void Update(BYTE);
};
struct ZEITANZEIGE:ANZEIGE{
ZEIT *z; // zugehörige Zeitbasis
ZEITANZEIGE(ZEIT*);
virtual ~ZEITANZEIGE() {delete knopf[1];delete knopf[0];};
virtual void Paint(HDC);
virtual bool RelayMsg(UINT,WPARAM,LPARAM);
void Update(BYTE);
};
struct TRIGGERANZEIGE:ANZEIGE{
TRIGG *t; // zugehöriger Trigger (vorerst nur einer!)
TRIGGERANZEIGE(TRIGG*); // string1 etwa: "+Y1: 4 V DC", Nr.2 = "PT 25%"
virtual ~TRIGGERANZEIGE() {delete knopf[0];};
virtual void Paint(HDC);
virtual bool RelayMsg(UINT,WPARAM,LPARAM);
void Update(BYTE);
};
Detected encoding: ANSI (CP1252) | 4
|
|