You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
391 lines
12 KiB
C++
391 lines
12 KiB
C++
#if !defined UTILITY
|
|
#define UTILITY
|
|
|
|
#include <math.h>
|
|
#include <Afxmt.h>
|
|
#include <afxtempl.h>
|
|
#include <memory>
|
|
#include <stdexcept>
|
|
|
|
#define CAST_BOOL(a) ((a) ? TRUE : FALSE)
|
|
|
|
#ifdef BUILD_UTILITYDLL
|
|
#define UTILITYDLL __declspec(dllexport)
|
|
#else
|
|
#define UTILITYDLL __declspec(dllimport)
|
|
#endif
|
|
|
|
#if _MSC_VER > 1200 // Version Higher than VC6
|
|
/* D:\MITLIB\mcctrdll need this to prevent linker error LNK2019: unresolved external symbol
|
|
"__declspec(dllimport) public: __thiscall ATL::CStringT<char,class StrTraitMFC<char,class ATL::ChTraitsCRT<char>>>::CStringT<char,class StrTraitMFC<char,class ATL::ChTraitsCRT<char>>>(char const *)" (__imp_??0?$CStringT@DV?$StrTraitMFC@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@QAE@PBD@Z)*/
|
|
template class __declspec (dllexport) CArray<int, int>;
|
|
#endif
|
|
|
|
void UTILITYDLL DebugLog(LPSTR lpFormat, ...);
|
|
void UTILITYDLL DebugLog(bool bTraceData, LPSTR lpFormat, ...);
|
|
void UTILITYDLL DebugLog(LPCTSTR lpName, bool bTraceData, LPSTR lpFormat, ...);
|
|
|
|
void UTILITYDLL DebugLogTiming(LPSTR lpFormat, ...);
|
|
void UTILITYDLL DebugLogTiming(bool bTraceData, LPSTR lpFormat, ...);
|
|
void UTILITYDLL DebugLogTiming(LPCTSTR lpName, bool bTraceData, LPSTR lpFormat, ...);
|
|
|
|
void UTILITYDLL StartDebugLog();
|
|
void UTILITYDLL StopDebugLog();
|
|
|
|
void UTILITYDLL StartDebugTimingLog();
|
|
void UTILITYDLL StopDebugTimingLog();
|
|
|
|
bool UTILITYDLL IsDebugLogStarted();
|
|
bool UTILITYDLL IsDebugLogTimingStarted();
|
|
|
|
// All GUI Activities Events Log
|
|
void UTILITYDLL GUIEventLog(LPSTR lpFormat, ...);
|
|
|
|
void UTILITYDLL StartGUIEventLog();
|
|
void UTILITYDLL StopGUIEventLog();
|
|
|
|
class UTILITYDLL CMyWaitTimeoutException : public std::exception
|
|
{
|
|
public:
|
|
CMyWaitTimeoutException();
|
|
virtual ~CMyWaitTimeoutException();
|
|
};
|
|
|
|
class UTILITYDLL CMyWaitInterruptedException : public std::exception
|
|
{
|
|
public:
|
|
CMyWaitInterruptedException();
|
|
virtual ~CMyWaitInterruptedException();
|
|
};
|
|
|
|
class UTILITYDLL CMyWait
|
|
{
|
|
public:
|
|
CMyWait();
|
|
virtual ~CMyWait();
|
|
// ************************************
|
|
// Method: Wait
|
|
// FullName: CMyWait::Wait
|
|
// Access: public
|
|
// Returns: DWORD
|
|
// Qualifier:
|
|
// Parameter: HANDLE handle
|
|
// Parameter: DWORD dwTimeout
|
|
// ************************************
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// return : 0 -> timeout or error
|
|
// 1 -> first event signal
|
|
static DWORD Wait(HANDLE handle, DWORD dwTimeout);
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// return : 1 -> first event signal
|
|
// throw exception on timeout or error
|
|
static DWORD WaitEx(HANDLE handle, DWORD dwTimeout);
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// return : 0 -> timeout or error
|
|
// 1 -> first event signal
|
|
// n -> n th event signal
|
|
static DWORD Wait(LPHANDLE handle, BOOL bWaitForAll, DWORD dwTimeout, int nNoOfHandle);
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// return : 1 -> first event signal
|
|
// n -> n th event signal
|
|
// throw exception on timeout or error
|
|
static DWORD WaitEx(LPHANDLE handle, BOOL bWaitForAll, DWORD dwTimeout, int nNoOfHandle);
|
|
static void Interrupt(DWORD threadId);
|
|
|
|
// This sleep function will return after the delay in millis and
|
|
// continue to process messages send to the Main UI message pump
|
|
static void Sleep(DWORD millis);
|
|
};
|
|
|
|
class UTILITYDLL CEvt : public CMyWait
|
|
{
|
|
public:
|
|
CEvt(); // create an object without name, this object can only be used in the local thread
|
|
explicit CEvt(LPCTSTR pszNo); // create an object with the name pszNo
|
|
|
|
HANDLE GetEvt(BOOL bState);
|
|
~CEvt();
|
|
|
|
BOOL operator =(const BOOL bState);
|
|
BOOL operator ==(const BOOL bState);
|
|
BOOL operator !=(const BOOL bState);
|
|
// Operations
|
|
BOOL WaitEvt(DWORD dwTimeOut = INFINITE);
|
|
BOOL WaitResetEvt(DWORD dwTimeOut = INFINITE);
|
|
BOOL WaitEvtEx(DWORD dwTimeOut = INFINITE);
|
|
BOOL WaitResetEvtEx(DWORD dwTimeOut = INFINITE);
|
|
BOOL Reset(void);
|
|
BOOL Set(void);
|
|
|
|
CString GetEvtName();
|
|
|
|
private:
|
|
CString m_csName;
|
|
CEvent m_evtActivate;
|
|
CEvent m_evtDeactivate;
|
|
};
|
|
|
|
class UTILITYDLL CHighResPerformanceCounter
|
|
{
|
|
public:
|
|
// default constructor
|
|
CHighResPerformanceCounter();
|
|
|
|
// default destructor
|
|
virtual ~CHighResPerformanceCounter();
|
|
|
|
// record start count
|
|
void StartCnt(void);
|
|
|
|
// record stop count
|
|
void StopCnt(void);
|
|
|
|
/// Gets current time span in msec.
|
|
LONGLONG GetCurrentTimeSpanInMsec();
|
|
double GetCurrentTimeSpanInSec();
|
|
double GetCurrentTimeSpanInMin();
|
|
double GetCurrentTimeSpanInHr();
|
|
|
|
LONGLONG GetTimeSpanInMsec();
|
|
double GetTimeSpanInSec();
|
|
double GetTimeSpanInMin();
|
|
double GetTimeSpanInHr();
|
|
|
|
LONG GetTimeRemaining(LONG timeout);
|
|
|
|
// get current counter
|
|
static LONGLONG GetCurrentCnt();
|
|
|
|
// cal msec time span in count
|
|
static LONGLONG CalMsecTimeSpanInCnt(LONGLONG lMsec);
|
|
|
|
// cal time span in msec
|
|
static LONGLONG CalTimeSpanInMsec(LONGLONG lcount);
|
|
|
|
// cal time span in sec
|
|
static double CalTimeSpanInSec(LONGLONG lcount);
|
|
|
|
// cal time span in mins
|
|
static double CalTimeSpanInMin(LONGLONG lCnt);
|
|
|
|
// cal time span in hours
|
|
static double CalTimeSpanInHr(LONGLONG lCnt);
|
|
|
|
private:
|
|
// Start count
|
|
LARGE_INTEGER m_lStartCnt;
|
|
|
|
// Stop count
|
|
LARGE_INTEGER m_lStopCnt;
|
|
};
|
|
|
|
class UTILITYDLL CIniFile
|
|
{
|
|
public:
|
|
CIniFile(LPCTSTR sFileName = nullptr, LPCTSTR sSectionName = nullptr);
|
|
virtual ~CIniFile();
|
|
|
|
CIniFile& SetFileName(LPCTSTR sFileName);
|
|
CIniFile& SetSectionName(LPCTSTR m_sSectionName);
|
|
|
|
// Get SectionName
|
|
LPCTSTR GetSectionName();
|
|
|
|
// Get FileName
|
|
LPCTSTR GetFileName();
|
|
|
|
BOOL WriteString(LPCTSTR lpKeyName, LPCTSTR lpString);
|
|
BOOL WriteLong(LPCTSTR lpKeyName, long lLong);
|
|
BOOL WriteDouble(LPCTSTR lpKeyName, double dDouble);
|
|
CString GetString(LPCTSTR lpKeyName, LPCTSTR lpDefaultString, BOOL bCreateIfFail = TRUE);
|
|
long GetLong(LPCTSTR lpKeyName, long lDefaultLong, BOOL bCreateIfFail = TRUE);
|
|
double GetDouble(LPCTSTR lpKeyName, double dDefaultDouble, BOOL bCreateIfFail = TRUE);
|
|
bool GetBool(LPCTSTR lpKeyName, LPCTSTR lpDefaultString, BOOL bCreateIfFail = TRUE);
|
|
|
|
// write longlong value to file
|
|
BOOL WriteLongLong(LPCTSTR lpKeyName, LONGLONG lLong);
|
|
|
|
// get longlong value from file
|
|
LONGLONG GetLongLong(LPCTSTR lpKeyName, LONGLONG lDefaultLong, BOOL bCreateIfFail = TRUE);
|
|
|
|
// write longlong value to file
|
|
static BOOL WriteLongLong(LPCTSTR pszFileName, LPCTSTR pszSectionName, LPCTSTR lpKeyName, LONGLONG lLong);
|
|
|
|
// get long long value from file
|
|
static LONGLONG GetLongLong(LPCTSTR pszFileName, LPCTSTR pszSectionName, LPCTSTR lpKeyName, LONGLONG lDefaultLong, BOOL bCreateIfFail = TRUE);
|
|
|
|
static BOOL WriteString(LPCTSTR pszFileName, LPCTSTR pszSectionName, LPCTSTR lpKeyName, LPCTSTR lpString);
|
|
static BOOL WriteLong(LPCTSTR pszFileName, LPCTSTR pszSectionName, LPCTSTR lpKeyName, long lLong);
|
|
static BOOL WriteDouble(LPCTSTR pszFileName, LPCTSTR pszSectionName, LPCTSTR lpKeyName, double dDouble);
|
|
static CString GetString(LPCTSTR pszFileName, LPCTSTR pszSectionName, LPCTSTR lpKeyName, LPCTSTR lpDefaultString, BOOL bCreateIfFail = TRUE);
|
|
static long GetLong(LPCTSTR pszFileName, LPCTSTR pszSectionName, LPCTSTR lpKeyName, long lDefaultLong, BOOL bCreateIfFail = TRUE);
|
|
static double GetDouble(LPCTSTR pszFileName, LPCTSTR pszSectionName, LPCTSTR lpKeyName, double dDefaultDouble, BOOL bCreateIfFail = TRUE);
|
|
static bool GetBool(LPCTSTR pszFileName, LPCTSTR pszSectionName, LPCTSTR lpKeyName, LPCTSTR lpDefaultString, BOOL bCreateIfFail = TRUE);
|
|
|
|
// attributes
|
|
private:
|
|
static const int MAX_INI_FILE_PATH = 512;
|
|
char m_sFileName[MAX_INI_FILE_PATH];
|
|
char m_sSectionName[MAX_INI_FILE_PATH];
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CMyPoint
|
|
|
|
class UTILITYDLL CMyPoint
|
|
{
|
|
public:
|
|
CMyPoint()
|
|
{
|
|
x = 0;
|
|
y = 0;
|
|
}
|
|
|
|
double x;
|
|
double y;
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CThreePoint
|
|
// x3, y3
|
|
// _______________
|
|
// | |
|
|
// | - |
|
|
// | } |
|
|
// | + __|___- |
|
|
// | | |
|
|
// | | |
|
|
// | + |
|
|
// |_______________|
|
|
//
|
|
// x1, y1 x2, y2
|
|
//
|
|
// dx = x3 - x1 / No of y pt
|
|
// dy = y2 - y1 / No of x pt
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// tan theta = adjacent / opposite = y / x
|
|
// cos theta = adjacent / hypo = x / hypo
|
|
// sine theta = opposite / hypo = y / hypo
|
|
// cotan theta = opposite / adjacent = x / y
|
|
// secant theta = hypo / adjacent = hypo / x
|
|
// cosecant theta = hypo / opposite = hypo / y
|
|
#define PI 3.1415926535897932384626433832795
|
|
#define RAD_TO_DEGREE 180 / PI // 1 RADIAN = 57.29577951
|
|
|
|
class UTILITYDLL CThreePoint
|
|
{
|
|
public:
|
|
CThreePoint();
|
|
|
|
enum
|
|
{
|
|
PT1,
|
|
PT2,
|
|
PT3,
|
|
};
|
|
|
|
double Getx(int iPt);
|
|
|
|
double Gety(int iPt);
|
|
|
|
void Setx(int iPt, double x);
|
|
|
|
void Sety(int iPt, double y);
|
|
|
|
void Setx(double p1, double p2, int iPitchStep = 0);
|
|
|
|
void Setx(double p1, double p2, double p3, int iStep = 0, int iPitchStep = 0);
|
|
|
|
void Sety(double p1, double p2, int iStep = 0);
|
|
|
|
void Sety(double p1, double p2, double p3, int iStep = 0, int iPitchStep = 0);
|
|
|
|
double Pitchx(void);
|
|
|
|
double Pitchy(void);
|
|
|
|
double Dx(void);
|
|
|
|
double Dy(void);
|
|
|
|
double Xcentre(void);
|
|
|
|
double Ycentre(void);
|
|
|
|
// get theta in radian
|
|
double Theta();
|
|
|
|
// get theta in degree
|
|
double ThetaInDegree();
|
|
|
|
double x,
|
|
y;
|
|
protected:
|
|
CMyPoint pt1,
|
|
pt2,
|
|
pt3;
|
|
CMyPoint delta;
|
|
CMyPoint pitch;
|
|
};
|
|
|
|
// class CInput;
|
|
|
|
class UTILITYDLL CTrigger : public CMyWait
|
|
{
|
|
public:
|
|
CTrigger();
|
|
virtual ~CTrigger();
|
|
|
|
void InsertTrigger(CEvt* pEvt, BOOL bState);
|
|
void InsertTrigger(HANDLE handle);
|
|
// void InsertInput(CInput* pInput, BOOL bState, DWORD dwDebounce, DWORD dwTimeout);
|
|
DWORD Wait(DWORD dwTimeOut = INFINITE);
|
|
BOOL WaitForAll(DWORD dwTimeOut = INFINITE);
|
|
void Reset();
|
|
|
|
protected:
|
|
DWORD m_dwCount;
|
|
CTypedPtrArray<CPtrArray, HANDLE> m_aHandle;
|
|
private:
|
|
DWORD WaitFor(DWORD dwTimeOut, BOOL bWaitForAll);
|
|
};
|
|
|
|
class UTILITYDLL CSharedMemory : public CObject
|
|
{
|
|
public:
|
|
CSharedMemory();
|
|
virtual ~CSharedMemory();
|
|
DWORD CreateSharedMem(LPCTSTR pszName, DWORD dwBytes);
|
|
// Will return 0 or ERROR_ALREADY_EXISTS if it already exists.
|
|
LPVOID Open(DWORD dwTimeout = INFINITE); // SM must be opened before use. The pointer
|
|
// returns must be type casted to it type
|
|
// Returns NULL if the SM was not created ot failed
|
|
BOOL Close(); // SM should be closed after use so that others can open the SM
|
|
BOOL IsOpen()
|
|
{
|
|
return m_bOpen;
|
|
} // Check if SM is opened
|
|
|
|
DWORD GetLength()
|
|
{
|
|
return m_dwLength;
|
|
}
|
|
|
|
#ifdef _DEBUG
|
|
virtual void AssertValid() const;
|
|
virtual void Dump(CDumpContext& dc) const;
|
|
#endif
|
|
|
|
protected:
|
|
DECLARE_DYNAMIC(CSharedMemory)
|
|
|
|
private:
|
|
HANDLE m_hMutex;
|
|
LPVOID m_pvData;
|
|
HANDLE m_hMapping;
|
|
BOOL m_bOpen;
|
|
DWORD m_dwLength;
|
|
};
|
|
|
|
#endif
|