/************************************************
* 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-8 | 0
|