/* QuickCase:W KNB Version 1.00 */
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
#include <math.h>
#include <io.h>
#include <direct.h>
#include <sys\types.h>
#include <sys\stat.h>
#include <errno.h>

// Aliases to introduce new win 3.1 terminology
#define UINT      WORD
#define HINSTANCE HANDLE
#define LPCSTR    LPSTR
#define LPARAM    LONG
#define CALLBACK  FAR PASCAL
#define WPARAM    WORD
#define WINAPI    FAR PASCAL

// Common Dialogs Usage: This is taken from the Borland C++ commdlg.h
typedef struct tagOFN
{
  DWORD   lStructSize;
  HWND    hwndOwner;
  HINSTANCE hInstance;
  LPCSTR  lpstrFilter;
  LPSTR   lpstrCustomFilter;
  DWORD   nMaxCustFilter;
  DWORD   nFilterIndex;
  LPSTR   lpstrFile;
  DWORD   nMaxFile;
  LPSTR   lpstrFileTitle;
  DWORD   nMaxFileTitle;
  LPCSTR  lpstrInitialDir;
  LPCSTR  lpstrTitle;
  DWORD   Flags;
  UINT    nFileOffset;
  UINT    nFileExtension;
  LPCSTR  lpstrDefExt;
  LPARAM  lCustData;
  UINT    (CALLBACK *lpfnHook)(HWND, UINT, WPARAM, LPARAM);
  LPCSTR  lpTemplateName;
} OPENFILENAME;

// These commdlg functions must be explicitely linked:
BOOL WINAPI GetOpenFileName(OPENFILENAME FAR*);
BOOL WINAPI GetSaveFileName(OPENFILENAME FAR*);
int  WINAPI GetFileTitle(LPCSTR, LPSTR, UINT);

#define OFN_READONLY                 0x00000001
#define OFN_OVERWRITEPROMPT          0x00000002
#define OFN_HIDEREADONLY             0x00000004
#define OFN_NOCHANGEDIR              0x00000008
#define OFN_SHOWHELP                 0x00000010
#define OFN_ENABLEHOOK               0x00000020
#define OFN_ENABLETEMPLATE           0x00000040
#define OFN_ENABLETEMPLATEHANDLE     0x00000080
#define OFN_NOVALIDATE               0x00000100
#define OFN_ALLOWMULTISELECT         0x00000200
#define OFN_EXTENSIONDIFFERENT       0x00000400
#define OFN_PATHMUSTEXIST            0x00000800
#define OFN_FILEMUSTEXIST            0x00001000
#define OFN_CREATEPROMPT             0x00002000
#define OFN_SHAREAWARE               0x00004000
#define OFN_NOREADONLYRETURN         0x00008000
#define OFN_NOTESTFILECREATE         0x00010000
// End of Common Dialogs Material

#define LPARAM_INITIALTEST 1L    // Zur Unterscheidung eines programmgesteuerten Kommandoaufrufs

// Kommandos des Wissenscompilers
typedef enum {
  CMD_ONLYATEMPLATE,             // Kommandomuster (Kommentarmechanismus)
  CMD_DATA,                      // Kommandos, die einen Kommandobehandler auslösen
  CMD_SIGNEDDIFFERENCE,          // Differenz zweier korrespondierender Werte
  CMD_ABSOLUTEDIFFERENCE,        // Betrag der Differenz zweier korrespondierender Werte
  NONCMD_ENDOFCOMMANDTABLE,      // Ausnahme: ist kein Kommando, sondern Sentinel (nicht ändern!!!)
  NONCMD_UNKNOWNCOMMAND,         // Alle Kommandos >= NONCMD_UNKNOWNCOMMAND lösen Fehlermeldungen aus
  NONCMD_NORMALPROGRAMEND,       // Ausnahme: ist auch kein richtiges Kommando
  NONCMD_EXPROUNDOPENER,         // Runde Klammer auf erwartet
  NONCMD_EXPCURLYOPENER,         // Geschweifte Klammmer auf erwartet
  NONCMD_ARGLISTCORRUPTED,       // Argumentliste stimmt nicht
  NONCMD_ARG1MORETHANEIGHT,      // Argument 1 hat unerlaubterweise mehr als 8 Zeichen
  NONCMD_ARG2MORETHANEIGHT,      // Argument 2 hat unerlaubterweise mehr als 8 Zeichen
  NONCMD_ARG2MUSTBEINT,          // Argument 3 muß als Integer interpretierbar sein
  NONCMD_ARG3MUSTBEINTORFLOAT,   // Argumenmt 4 muß als Integer oder Float interpretierbar sein
  NONCMD_ARG4MUSTBEINTORFLOAT,   // Argumenmt 5 muß als Integer oder Float interpretierbar sein
  NONCMD_SOURCECHANUMOUTOFRANGE, // Quellkanalnummer nicht im Bereich 0 bis 15
  NONCMD_ARG1MUSTBERAWDATA,      // Argument 1 muß der Name eines Rohdatenkanals sein
  NONCMD_ARG2MUSTBERAWDATA,      // Argument 2 muß der Name eines Rohdatenkanals sein
  NONCMD_FORGOTTENARROWSYMBOL,   // In einem CookedData-Kommando ist das Symbol "-->" vergessen worden
  NONCMD_ARG6MUSTBEINTORFLOAT,   // Argumenmt 6 muß als Integer oder Float interpretierbar sein
  NONCMD_ARG7MUSTBEINTORFLOAT    // Argumenmt 7 muß als Integer oder Float interpretierbar sein
} commandType;

// Ende Kommandos des Wissenscompilers

#define CHANNELMAX           16       // Maximale Anzahl Inputkanäle
#define NICEINTERVAL          4       // Mittelwertbildungsintervall für Niceplot-Pane
#define KNOWLEDGEMAX         64       // Maximale Anzahl Wissensknoten
#define SIZEOFDATACHUNK      74       // Anzahl Bytes die pro Messung übermittelt wird
#define SZRECEIVEQUEUE       74       // Größe der Empfangsqueue für serielle Übertragung
#define SZTRANSMITQUEUE      74       // Größe der Sendequeue für serielle Übertragung

typedef enum {
  ZEROMEANSNOCOMMAND=0,
  STARTRECORDING,
  ENDRECORDING
} SIM97CMD;

// Begin Stripchart-Material
typedef enum {SETUP,PLOT,SHUTDOWN} STRIPTYPE;

typedef struct StripChartStruct_tag {
  int xs, xe;             // The real xs and xe
  int ys, ye;             // The real ys and ye
  int x1, y1;             // Initial point on line drawn.
  int x2, y2;             // Terminating point on line drawn.
  int position;           // Tracks current plotting position.
  int old_position;       // Last plotting position.
  int old_value;          // Old value to plot.
  int new_value;          // New value to plot.
  double theMax;          // Zu erwartendes Maximum
  double theMin;          // Zu erwartendes Minimum
  double dPlotPaneHeight; // Panehöhe
} StripChartStruct;

void FAR PASCAL StripChartManager(HDC hdc,           // A handle to a device context (always)
                                  int ID,            // Chart Identifier (0 to 15)
                                  int wxs,           // Wanted left (if SETUP)
                                  int wys,           // Wanted top  (if SETUP)
                                  int wxe,           // Wanted right (if SETUP)
                                  int wye,           // Wanted bottom (if SETUP)
                                  double datum,      // Data Item to plot (if PLOT)
                                  double minimum,    // Minimal displayable value (if SETUP)
                                  double maximum,    // Maximal displayable value (if SETUP)
                                  STRIPTYPE doWhat); // SETUP or PLOT or SHUTDOWN

// End Stripchart-Material

// Begin Compiled Knowledge Material

typedef enum {
  UNDEFINED,                       // So erkennt man einen freien Slot im Array
  DATA,                            // Rohe ankommenden Daten
  SIGNEDDIFFERENCE,                // Differenz der Werte zweier Kanäle
  ABSOLUTEDIFFERENCE               // Betrag der Differenz der Werte zweier Kanäle
} KNOWTYPE;

typedef struct KnowledgeNode_tag {
  KNOWTYPE iAm;                    // Was bin ich                                      2
  BOOL plotMarked;                 // Zum Plotten markiert                             2
  BOOL writeMarked;                // Zum Schreiben markiert                           2
  char nameInKnowledge[9];         // Benennung                                        9
  int sourceChannel;               // Quellkanal, von dem die Daten genommen werden    2
  int sourceChannel2nd;            // 2. Quellkanal (bei Abweichungsmaßen)             2
  double minimum;                  // Minimal zu erwartender Datenwert                 8
  double maximum;                  // Maximal zu erwartender Datenwert                 8
  WORD data1Word;                  // Mehrzweck-Datenspeicher                          2
  WORD data2Word;                  // Mehrzweck-Datenspeicher                          2
  double data1Double;              // Mehrzweck-Datenspeicher                          8
  double data2Double;              // Mehrzweck-Datenspeicher                          8
  int idxUno;                      // Indizes, die..                                   2
  int idxDuo;                      // z.B. zum zeigen..                                2
  int idxTres;                     // auf andere Knoten..                              2
  int idQuattuor;                  // verwendet werden sollen                          2
} KNOWLEDGENODE;                   //

// End Compiled Knowledge Material

typedef enum {
  C4RM_FREE,                       // Free alten Speicher
  C4RM_QUESTPREPARED,              // Frage: Speicher bereit ?
  C4RM_ALLOC                       // Alloziere neuen Speicher
} C4RMtype; // Für Care4RecordingMemory

typedef enum {
  NOTHING,                         // Noch keine serielle Schnittstelle geöffnet
  USINGCOM1,                       // Habe COM1 geöffnet
  USINGCOM2                        // Habe COM2 geöffnet
} SERUSETYPE;

#define obsStaticObserved              101
#define obsStaticRealtime              102
#define obsStaticRecord                103
#define obsListObserve                 104
#define obsListWrite                   105
#define obsStaticLegend                106

#define shoIco                         200
#define shoStL1                        201
#define shoStL2                        202
#define shoStL3                        203
#define shoStL4                        204
#define shoStL5                        205
#define shoStL6                        206
#define shoStL7                        207
#define shoStL8                        208
#define shoStL9                        209

#define infIco                         300
#define infStL1                        301
#define infStL2                        302

#define knoEdit                        400
#define ID_CLOSEIT                     401

#define ansStExplain              501
#define ansRadioCom1              502
#define ansRadioCom2              503

#define IDM_EINSTELLUNGEN               1000
#define IDM_E_NAMINGDATAFILE            1020
#define IDM_E_ECHTZEITBEOBACHTUNGUNDAUF 1050
#define IDM_E_WELTWISSEN                1100
#define IDM_E_ANSCHLSSE                 1200
#define IDM_E_MANUSTART                 1250
#define IDM_HLP_INHALT                  2050
#define IDM_HLP_KURZBERSICHT            2100
#define IDM_HLP_INFO                    2150
#define IDM_EXIT                        2200
#define IDM_INTERNAL_MACHINETEST        2250 // Intern benutztes Kommando, erscheint nicht im Munue
#define IDM_INTERNAL_QUESTPAGIN         2300 // Intern benutztes Kommando, erscheint nicht im Munue
#define IDM_INTERNAL_TASKCOUNT          2350 // Intern benutztes Kommando, erscheint nicht im Munue
#define IDM_INTERNAL_MEMSETUP           2400 // Intern benutztes Kommando, erscheint nicht im Munue
#define IDM_INTERNAL_N_COM_QU           2450 // Intern benutztes Kommando, erscheint nicht im Munue
#define IDM_COM1_COM2_QUEST             2500

#define IDS_ERR_REGISTER_CLASS           1
#define IDS_ERR_CREATE_WINDOW            2
#define IDS_DIRECTPLOT                   3
#define IDS_SIGNEDDIFFERENCE             5
#define IDS_ABSOLUTEDIFFERENCE           6
#define IDS_ERR_FETCHOPENEREXPECT        7
#define IDS_ERR_KNOWLEDGEREADBACK        8
#define IDS_ERR_KNOWLEDGESRCCREATE       9
#define IDS_ERR_CANNOTALLOCKNOWVECTOR    10
#define IDS_ERR_OPENCOMPILERLOG          11
#define IDS_ERR_FNCDOCOMMANDERR          12
#define IDS_KCERR_UNKNOWN                13
#define IDS_KCERR_UNKNOWNCOMMAND         14
#define IDS_KCERR_EXPROUNDOPENER         15
#define IDS_KCERR_EXPCURLYOPENER         16
#define IDS_KCERR_NORMALPROGRAMEND       17
#define IDS_KCERR_ARGLISTCORRUPTED       18
#define IDS_KCERR_ARG1MORETHANEIGHT      19
#define IDS_KCERR_ARG2MORETHANEIGHT      20
#define IDS_KCERR_ARG2MUSTBEINT          21
#define IDS_KCERR_ARG3MUSTBEINTORFLOAT   22
#define IDS_KCERR_ARG4MUSTBEINTORFLOAT   23
#define IDS_ERR_CANNOTCHANGETODRIVEC     24
#define IDS_ERR_CANNOTCHANGETOMYDIR      25
#define IDS_KCERR_SOURCECHANUMOUTOFRANG  26
#define IDS_ERR_UNDEFDPLOTMARKEDKNOSLOT  27
#define IDS_ERR_UNKNOWNKNOTYPEINKNOSLOT  28
#define IDS_KCERR_ARG1MUSTBERAWDATA      29
#define IDS_KCERR_ARG2MUSTBERAWDATA      30
#define IDS_KCERR_FORGOTTENARROWSYMBOL   31
#define IDS_KCERR_ARG6MUSTBEINTORFLOAT   32
#define IDS_KCERR_ARG7MUSTBEINTORFLOAT   33
#define IDS_EN_ERRSPACE                  34
#define IDS_TEST_WRONGMACHINE            35
#define IDS_TEST_WRONGWINDOWS            36
#define IDS_TEST_WRONGMODE               37
#define IDS_TEST_386NOFUN                38
#define IDS_ERR_MEMVECTORSALLOC          39
#define IDS_ERR_MEMVECTORSFREE           40
#define IDS_ERR_CANNOTOPENDATAFILE       41
#define IDS_ERR_NOACCESSTOSYSINI         42
#define IDS_ERR_COM_IE_BADID             43
#define IDS_ERR_COM_IE_BAUDRATE          44
#define IDS_ERR_COM_IE_BYTESIZE          45
#define IDS_ERR_COM_IE_DEFAULT           46
#define IDS_ERR_COM_IE_HARDWARE          47
#define IDS_ERR_COM_IE_MEMORY            48
#define IDS_ERR_COM_IE_NOPEN             49
#define IDS_ERR_COM_IE_OPEN              50
#define IDS_ERR_COM_GETCOMMSTATE         51
#define IDS_ERR_COM_SETCOMMSTATE         52
#define IDS_ERR_COM_UNKNOWN              53
#define IDS_ERR_CE_RXOVER                54
#define IDS_ERR_CE_OVERRUN               55
#define IDS_ERR_CE_RXPARITY              56
#define IDS_ERR_CE_FRAME                 57
#define IDS_ERR_CE_BREAK                 58
#define IDS_ERR_CE_CTSTO                 59
#define IDS_ERR_CE_DSRTO                 60
#define IDS_ERR_CE_RLSDTO                61
#define IDS_ERR_CE_TXFULL                62
#define IDS_ERR_CE_PTO                   63
#define IDS_ERR_CE_IOE                   64
#define IDS_ERR_CE_DNS                   65
#define IDS_ERR_CE_OOP                   66
#define IDS_ERR_CE_MODE                  67
#define IDS_ERR_READCOMMSZFAILURE        68

char szString[128];   /* variable to load resource strings         */

char szAppName[20];   /* class name for the window               */
HWND hInst;
HWND hWndMain;

void cwCenter(HWND, int);

LONG FAR PASCAL WndProc(HWND,WORD,WORD,LONG);
BOOL FAR PASCAL OBSERVEMsgProc(HWND,WORD,WORD,LONG);
BOOL FAR PASCAL SHORTINMsgProc(HWND,WORD,WORD,LONG);
BOOL FAR PASCAL INFOBOXMsgProc(HWND,WORD,WORD,LONG);
BOOL FAR PASCAL KNOWLEDGMsgProc(HWND,WORD,WORD,LONG);
BOOL FAR PASCAL QUERYSRCMsgProc(HWND,WORD,WORD,LONG);
BOOL FAR PASCAL ANSCHLUEMsgProc(HWND,WORD,WORD,LONG);
int nCwRegisterClasses(void);
void CwUnRegisterClasses(void);
void FAR PASCAL DrawBackground4N(HWND hWnd,HDC aHDC,int NVariables);
BOOL FAR PASCAL DrawOutStandPane(HDC hdc,POINT LeftTop,POINT LeftBottom,POINT RightBottom,POINT RightTop);
BOOL FAR PASCAL DrawInFallPane(HDC hdc,POINT LeftTop,POINT LeftBottom,POINT RightBottom,POINT RightTop,BOOL WhiteArea);
BOOL FAR PASCAL DrawOuterTextPane(HDC hdc,POINT LeftTop,POINT LeftBottom,POINT RightBottom,POINT RightTop);
BOOL FAR PASCAL DrawTextPane(HDC hdc,POINT LeftTop,POINT LeftBottom,POINT RightBottom,POINT RightTop,BOOL WhiteArea);
void FAR PASCAL DrawPixelLineale(HDC hdc,int resolutionSmall,int resolutionBig);
void FAR PASCAL InitPaneNames(void);
void FAR PASCAL DrawPaneNames(HDC hdc);
void FAR PASCAL DrawYAchsenBeschriftung(HDC hdc);
void FAR PASCAL ExecuteNextMonitorStep(void);
BOOL FAR PASCAL CopyInDatToDatChunk(void);
double FAR PASCAL Renorm(double oldVal,double oldMin,double oldMax,double newMin,double newMax);
void FAR PASCAL ExplainCommError(int errCode);
void FAR PASCAL PlotCurrentValues(void);
void FAR PASCAL OutputMessage(LPSTR msg);
void FAR PASCAL UpdateMonStruct(BOOL withFeedback);
void FAR PASCAL MakeDisplayAutistic(void);
void FAR PASCAL MakeDisplayNonAutistic(void);
void FAR PASCAL OutputScanCount(void);
int FAR PASCAL TxtPaneChaNoCursorIsOn(void);
void FAR PASCAL OutputDoubleAsLiteral(double value,BOOL notOnlyErase);
void FAR PASCAL OutputTCAsLiteral(int hours,int minutes,int seconds,int frames);
void FAR PASCAL NicePlotValue(double value,double minValue,double maxValue,BOOL notOnlyErase);
BOOL FAR PASCAL IsEscapeCondition(void);
BYTE FAR *wmalloc(LONG cbData);
void wfree(BYTE FAR *pbData);
int FAR PASCAL MakeInt(BYTE a,BYTE b);
float FAR PASCAL MakeFloat(BYTE a,BYTE b,BYTE c,BYTE d);
void FAR PASCAL InternalErrorBox(int ID);
void FAR PASCAL CommunicationErrorBox(int ID);
void TranslateCRLFToEdit(char *txt);
void FAR PASCAL WriteKnowledgeSourceText(FILE *target,LPSTR editText);
void FAR PASCAL DoNamingOfHeadPane(int channel);
void FAR PASCAL KillNamingOfHeadPane(void);
void FAR PASCAL FindSelectionFromSubstring(int *beg,int *end,LPSTR string,LPSTR sub);
int FAR PASCAL IntInArg1NotInArg2(int *arg1,int lenArg1,int *arg2,int lenArg2);
double FAR PASCAL Range(double value1,double value2);
BOOL FAR PASCAL InfoWhatMachineAndSystem(void);
BOOL FAR PASCAL InfoIsVirtMemOff(void);
void FAR PASCAL InfoAvailableMemory(void);
BOOL FAR PASCAL Care4RecordingMemory(C4RMtype toDo);
void FAR PASCAL WriteoutRecordingSession(void);
// Communication functions
BOOL FAR PASCAL ComCare4Protocol(void);
int FAR PASCAL GetErrIDS4OpenComm(int ErrCode);
BOOL FAR PASCAL CanComPortBeOpened(LPSTR name);
BOOL FAR PASCAL CheckChecksum(BYTE *bufPointer,int sumBytes,int checkInt);
SIM97CMD FAR PASCAL ChunkIsASim97Command(LPSTR chunk);
void FAR PASCAL ExecuteSim97Command(SIM97CMD cmd,LPSTR chunk);
// Knowledge Compiler
BOOL FAR PASCAL KCCompileKnowledge(LPSTR program);
commandType FAR PASCAL KCGetCommand(void);
BOOL FAR PASCAL KCDoCommand(commandType cmd);
// Hilfsfunktionen des Compilers
BOOL FAR PASCAL KCiswhite(char c);
void FAR PASCAL KCeatString(char *string);
void FAR PASCAL KCeatWhite(void);
BOOL FAR PASCAL KCfetchToken(char *strTarget,char cEnd,char cForbidden,int trgSize);
void FAR PASCAL KCKnoCompilerErrorMessage(commandType noncmd);
void FAR PASCAL KCMemorizeUnproofedLine(void);
void FAR PASCAL KCCopyErrorContext(void);
void FAR PASCAL KCkillTrailingBlanks(char *text);
void FAR PASCAL KCReplaceCommentsWithBlanks(LPSTR program);
void FAR PASCAL KCClearKnoArgs(void);
BOOL FAR PASCAL KCInterpretableInt(LPSTR txt);
BOOL FAR PASCAL KCInterpretableIntOrFloat(LPSTR txt);
int FAR PASCAL KCGetSrcChanOfSlotNamed(LPSTR name);
// Kommandobehandler des Compilers
BOOL FAR PASCAL KCEatTemplate(void);
BOOL FAR PASCAL KCCmdData(void);
BOOL FAR PASCAL KCCmdSignedDifference(void);
BOOL FAR PASCAL KCCmdAbsoluteDifference(void);
// DAC4-Karte von Kolter
void KolterDAC4DefTransforms(double ch0Min,double ch0Max,double ch1Min,double ch1Max,
                             double ch2Min,double ch2Max,double ch3Min,double ch3Max);
void KolterDAC4Burst(double ch0Data,double ch1Data,double ch2Data,double ch3Data);
void KolterDAC4LogicalOne(int channel);
void KolterDAC4LogicalZero(int channel);
void KolterDAC4LogicalNeutral(int channel);
