// logvar.h : // #if !defined(AGD_LOGVAR_H__ED3E1EC3_3899_4602_A824_5B7A58880AAC__INCLUDED_) #define AGD_LOGVAR_H__ED3E1EC3_3899_4602_A824_5B7A58880AAC__INCLUDED_ #include #include #include #include #include #include #include #include #include #include #include "datalogger.h" ///////////////////////////////////////////////////////////////////////////// typedef union _CHECK_UPDATE_SHM_RETVAL { struct { unsigned int nChecked; unsigned int nUpdated; }; unsigned long long nRetval; }CHECK_UPDATE_SHM_RETVAL, *LPCHECK_UPDATE_SHM_RETVAL; typedef const CHECK_UPDATE_SHM_RETVAL *LPCCHECK_UPDATE_SHM_RETVAL; ///////////////////////////////////////////////////////////////////////////// // logvar.h - Declarations: class CLoggable { public: virtual void InitPath(CLoggable *pParent, const char *pszMemberName) = 0; virtual const char* GetPath(void) const = 0; virtual void InitTagID(CDataLogger &rdl) = 0; virtual void Sample(void) = 0; virtual void LogInterval(time_t nTimestamp, CDataLogger &rdl) = 0; virtual void LogValueChanged(time_t nTimestamp, CDataLogger &rdl, bool bStartup, bool bWriteNull) = 0; }; ///////////////////////////////////////////////////////////////////////////// class CLogVariable : public CLoggable { public: enum VT { VT_Invalid, VT_bool, VT_I1, VT_UI1, VT_I2, VT_UI2, VT_I4, VT_UI4, VT_I8, VT_UI8, VT_float, VT_double, VT_string }; typedef union { void *pVoid; bool *pBool; signed char *pI1; unsigned char *pUI1; signed short *pI2; unsigned short *pUI2; signed int *pI4; unsigned int *pUI4; signed long long *pI8; unsigned long long *pUI8; float *pFloat; double *pDouble; }V_Ptr; typedef union { bool boolVal; signed char I1Val; unsigned char UI1Val; signed short I2Val; unsigned short UI2Val; signed int I4Val; unsigned int UI4Val; signed long long I8Val; unsigned long long UI8Val; float FloatVal; double DoubleVal; }V_Val; public: CLogVariable(LogTypes lt, void *pData, bool *pbLogCond, const std::type_info &rti, HSHM hShm, const char *pszName, int nIndex, CLoggable *pParent); CLogVariable(LogTypes lt, void *pData, void *pBase, size_t nCvOffset, unsigned int nCvBitNr, const std::type_info &rti, HSHM hShm, const char *pszName, int nIndex, CLoggable *pParent); virtual ~CLogVariable(void); public: virtual void InitPath(CLoggable *pParent, const char *pszMemberName); virtual const char* GetPath(void) const { return m_pszPath;} virtual void InitTagID(CDataLogger &rdl); virtual void Sample(void); virtual void LogInterval(time_t nTimestamp, CDataLogger &rdl); virtual void LogValueChanged(time_t nTimestamp, CDataLogger &rdl, bool bStartup, bool bWriteNull); private: void Lock(void); void Unlock(void); bool CanLog(bool fLock); private: LogTypes m_lt; bool *m_pbLogCond; bool m_bOldLogCond; std::string m_name; std::string m_path; const char *m_pszPath; int m_nIndex; enum VT m_vt; volatile V_Ptr m_data; V_Val m_cache; double m_fLastSample; double m_fSamples; double m_fMin; double m_fMax; HSHM m_hShm; CLoggable *m_pParent; unsigned long long m_nUpdates; unsigned long m_nTagID; unsigned int m_nSampleCount; bool m_bIsIntervalLog; bool m_bIsCondLog; uint8_t *m_pnCvByte; uint8_t m_nCvMask; bool m_bCvIsBit; bool m_bIsDbPersistant; }; ///////////////////////////////////////////////////////////////////////////// class CLogBitVariable : public CLoggable { public: CLogBitVariable(LogTypes lt, void *pData, size_t nOffset, unsigned int nBitNr, bool *pbLogCond, HSHM hShm, const char *pszName, CLoggable *pParent); CLogBitVariable(LogTypes lt, void *pData, size_t nOffset, unsigned int nBitNr, size_t nCvOffset, unsigned int nCvBitNr, HSHM hShm, const char *pszName, CLoggable *pParent); virtual ~CLogBitVariable(void); public: virtual void InitPath(CLoggable *pParent, const char *pszMemberName); virtual const char* GetPath(void) const { return m_pszPath;} virtual void InitTagID(CDataLogger &rdl); virtual void Sample(void); virtual void LogInterval(time_t nTimestamp, CDataLogger &rdl); virtual void LogValueChanged(time_t nTimestamp, CDataLogger &rdl, bool bStartup, bool bWriteNull); private: void Lock(void); void Unlock(void); bool CanLog(bool fLock); private: LogTypes m_lt; bool *m_pbLogCond; bool m_bOldLogCond; std::string m_name; std::string m_path; const char *m_pszPath; bool m_cacheVal; double m_fLastSample; double m_fSamples; double m_fMin; double m_fMax; HSHM m_hShm; CLoggable *m_pParent; unsigned long long m_nUpdates; unsigned long m_nTagID; unsigned int m_nSampleCount; bool m_bIsIntervalLog; bool m_bIsCondLog; uint8_t *m_pnByte; uint8_t m_nMask; uint8_t *m_pnCvByte; uint8_t m_nCvMask; bool m_bCvIsBit; bool m_bIsDbPersistant; }; ///////////////////////////////////////////////////////////////////////////// #endif // !defined(AGD_LOGVAR_H__ED3E1EC3_3899_4602_A824_5B7A58880AAC__INCLUDED_)