Source file: /~heha/mb-iwp/Antriebe/Schrittmotorsteuerung/smc.zip/smc1.h

/************************************************
 * Zentralisierte Motorsteuerung		*
 * haftmann#software, September 2010		*
 ************************************************/

#define _WIN32_IE 0x0501	// Tray-Icon mit Ballon-Hilfe
#define NOATOM
#define NOCLIPBOARD
#define NOCRYPT
#define NODEFERWINDOWPOS
#define NOGDICAPMASKS
#define NOIME		// kein Japanisch <ime.h>
#define NOMCX		// kein Modem-Kram <mcx.h>
#define NOMETAFILE
#define NOOPENFILE
#define NOPROFILER
#define NOSERVICE	// keine Dienste <winsvc.h>
#define NOSOUND
#define NOSYSCOMMANDS
#define NOTEXTMETRIC
#define NOWH
#define WIN32_LEAN_AND_MEAN	// schneller compilieren
#include <windows.h>
#include <windowsx.h>
#include <shellapi.h>
#include <shlwapi.h>
#include <commctrl.h>
#include <stdio.h>
// meine Standard-Definitionen
#define elemof(x) (sizeof(x)/sizeof((x)[0]))
#define T(x) TEXT(x)
#ifndef __cplusplus
typedef enum {false,true} bool;
#endif//__cplusplus
#define nobreak

EXTERN_C HINSTANCE ghInstance;
EXTERN_C NOTIFYICONDATA nid;
#define MainWnd (nid.hWnd)
EXTERN_C HWND PropWnd;
EXTERN_C void SetTrayTip(void);

struct RECTS{
 short left,top,right,bottom;
 inline short width() const {return right-left;};
 inline short height() const {return bottom-top;};
 inline void set(RECT&r) {left=(short)r.left; top=(short)r.top; right=(short)r.right; bottom=(short)r.bottom;};
};

// Alles persistente zum Schreiben "in einem Rutsch"
struct CONFIG{
 RECTS WinPos;
 BYTE SerialNo[2];	// 0-basiert
 bool Load();
 void Save() const;
};

struct GDI{		// verwendete GDI-Objekte
 HRGN rgn;		// Fenster-Region
 HFONT SmallFont;
 HFONT NormalFont;
 HFONT BoldFont;
 HPEN FramePen;	// PS_INSIDEFRAME, sonst geht's nicht
/*
 HBRUSH brKurz;		// Kurzer Impuls: dunkelgelb
 HBRUSH brLang;		// Langer Impuls: hellgelb
 HBRUSH brFehl;		// Fehlerhafter Impuls: rot
 HPEN   peDivi;		// Teilerstrich (im Histogramm): blau, gepunktet
 HPEN   peXor;		// Stift für R2_XORPEN-Operationen (schwarz auf grau)
 HFONT  fnQuer;		// große Schrift (Diagramm-Hinterlegung)
 HFONT	fnKursiv;	// Kursivschrift (für Erläuterungen im Hardware-Dialog)
 HPEN	peZgr[2];	// Stift für Zeiger im Icon (3 Pixel dick) (Index 1 für hellen Hintergrund)
 HPEN	peBlau[2];	// blauer Stift Breite 0 (1 Pixel)
 HBRUSH	brBlau[2];	// blauer Pinsel (für Dreieck = »Sendemast«)*/
 void Create();
 void Delete();
};

extern CONFIG Config;
extern GDI Gdi;

/*** Sprechblase.c ***/
//EXTERN_C BOOL RegisterSprechblase(void);
//EXTERN_C void Sprechblase(void);

/*** wutils.c ***/
EXTERN_C TCHAR MBoxTitle[64];
EXTERN_C void _fastcall InitStruct(LPVOID p, UINT len);
EXTERN_C int vMBox(HWND Wnd, UINT id, UINT style, va_list arglist);
EXTERN_C int _cdecl MBox(HWND Wnd, UINT id, UINT style,...);
EXTERN_C UINT GetCheckboxGroup(HWND Wnd, UINT u, UINT o);
EXTERN_C void SetCheckboxGroup(HWND Wnd, UINT u, UINT o, UINT v);
EXTERN_C void EnableDlgItem(HWND Wnd, UINT id, BOOL state);
EXTERN_C void ShowDlgItem(HWND Wnd, UINT id, int state);
EXTERN_C void SubclassForUpDown(HWND Wnd, int id);
EXTERN_C void SetEditText(HWND Wnd, UINT id, LPTSTR s);	// dabei Markierung beibehalten
EXTERN_C int sinus(int radius, int sec);
EXTERN_C void _stdcall Line(HDC dc, int x1, int y1, int x2, int y2);
#undef UInt32x32To64
EXTERN_C ULONGLONG _fastcall UInt32x32To64(DWORD x,DWORD y);

#ifdef _DEBUG
void _cdecl DebugPrintf(LPCSTR s,...);
# define debug(x) DebugPrintf x
#else
# define debug(x)
#endif

// Worker
// Motorspezifische variable Daten aus der Firmware
struct MOTOR{	// etwa dieselbe Struktur wie "class Motor" in der Firmware
 BYTE phase;	// Bit 1 = referenzierte Position
 char accel;	// Beschleunigung (0 oder ±1), in Mikroschritt/125µs/ms
 short speed;	// momentane Geschwindigkeit, in Mikroschritt/125µs
 long ist;	// momentane Position, in Mikroschritt (=1/256 Halbschritt)
 BYTE flags;
 char OneAccel;
 short MaxSpeed;
 long Soll;
 long Anfang;
 long Ende;
 BYTE pdcounter;
 BYTE unused;
 WORD pFunc[3];
};
extern MOTOR md[6*3];

struct WORKER{
 HANDLE hThread;
 HANDLE hCom;
 HANDLE hMutex;
// OVERLAPPED ovl;
 bool running;		// 1=laufend, 0=Stop
 bool first;		// Runde
 BYTE idx;
 BYTE stat;		// Tasten- und Inkrementalgeber-Status
 int SendRecv(const void*s,int sl=1,void*r=NULL,int rl=0) const;
 int Send(BYTE s) const {return SendRecv(&s);};
 DWORD WINAPI ThreadProc();
 static DWORD WINAPI ThreadProc(void*p) {return ((WORKER*)p)->ThreadProc();};
 bool Start();
 void Stop();
};

extern WORKER w[2];

bool StartWorker();
void StopWorker();
enum {WM_LokalInput=WM_USER+0x220,	// wParam=0, lParam=4-Byte-Array
      WM_MotorChange};			// wParam=md-Index 0..11, lParam=md-Zeiger (md=Motordaten, struct MOTOR)

union LOKALINPUT{
 struct{
  BYTE ks,kp,kr;	// keystate, keypress, keyrelease
  char delta;		// knob rotation
 };
 LPARAM lp;
};

// wParam=0
// ((BYTE*)lParam)[0]=Tastenstatus
// ((BYTE*)lParam)[1]=gedrückte Tasten
// ((BYTE*)lParam)[2]=gelöste Tasten
// ((char*)lParam)[3]=Drehdistanz des Inkrementalgebers
Detected encoding: UTF-80