// shmvar.h : // #if !defined(AGD_SHMVAR_H__8E807F2F_C6E5_4D6B_8193_F29943D450B3__INCLUDED_) #define AGD_SHMVAR_H__8E807F2F_C6E5_4D6B_8193_F29943D450B3__INCLUDED_ #include #include #include #include #include #include ///////////////////////////////////////////////////////////////////////////// #define _TRACK_TYPES_AT_LOAD 0 #define _TRACK_QT_WRITES 0 ///////////////////////////////////////////////////////////////////////////// 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; ///////////////////////////////////////////////////////////////////////////// // shmvar.h - Declarations: class CShmVariable : public QObject { Q_OBJECT Q_PROPERTY(QVariant val READ val WRITE setVal NOTIFY valChanged USER true) Q_PROPERTY(unsigned int vt READ vt CONSTANT) 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 }; Q_ENUM(VT) 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: explicit CShmVariable(void *pData, const std::type_info &rti, HSHM hShm, const char *pszName, int nIndex, QObject *pParent = 0); virtual ~CShmVariable(void); QVariant val(void); void setVal(const QVariant &val); unsigned int vt(void) const; unsigned long long CheckUpdateShm(bool fLock); signals: void valChanged(const QVariant &val) const; private: void valRaw(QVariant &v); void emitChanged(bool fLock = false); void Lock(void); void Unlock(void); private: enum VT m_vt; volatile V_Ptr m_data; V_Val m_cache; HSHM m_hShm; QString m_varName; int m_nIndex; }; ///////////////////////////////////////////////////////////////////////////// class CShmStringVariable : public QObject { Q_OBJECT Q_PROPERTY(QString val READ val WRITE setVal NOTIFY valChanged USER true) Q_PROPERTY(unsigned int vt READ vt CONSTANT) public: typedef enum { VT_Invalid, // 0 VT_Latin1, // 1 VT_UTF_8, // 2 VT_UTF_16, // 3 VT_UTF_32, // 4 VT_Unicode, // 5 VT_Last }VT; typedef union { void *pVoid; char *pszMbs; char16_t *pszWc16; char32_t *pszWc32; wchar_t *pszWcs; }V_Ptr; public: explicit CShmStringVariable(void *pData, size_t nCChData, VT vt, const std::type_info &rti, HSHM hShm, const char *pszName, int nIndex, QObject *pParent = 0); virtual ~CShmStringVariable(void); QString val(void); void setVal(const QString &val); unsigned int vt(void) const; unsigned long long CheckUpdateShm(bool fLock); signals: void valChanged(const QString &val) const; private: void valRaw(QString &v); void emitChanged(bool fLock = false); bool shmChanged(bool fLock); void Lock(void); void Unlock(void); void zeroTerm(volatile V_Ptr &rp, size_t at); private: VT m_vt; volatile V_Ptr m_data; V_Ptr m_cache; size_t m_nCbBuffer; size_t m_nCbString; HSHM m_hShm; QString m_varName; int m_nIndex; }; ///////////////////////////////////////////////////////////////////////////// class CShmBitVariable : public QObject { Q_OBJECT Q_PROPERTY(QVariant val READ val WRITE setVal NOTIFY valChanged USER true) Q_PROPERTY(unsigned int vt READ vt CONSTANT) 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 }; Q_ENUM(VT) public: explicit CShmBitVariable(void *pData, size_t nOffset, int nBitNr, HSHM hShm, const char *pszName, QObject *pParent = 0); virtual ~CShmBitVariable(void); QVariant val(void); void setVal(const QVariant &val); unsigned int vt(void) const; unsigned long long CheckUpdateShm(bool fLock); signals: void valChanged(const QVariant &val) const; private: void valRaw(QVariant &v); void emitChanged(bool fLock = false); void Lock(void); void Unlock(void); private: uint8_t *m_pShmByte; uint8_t m_mask; bool m_cacheVal; HSHM m_hShm; QString m_varName; int m_nIndex; int m_nBitNr; }; ///////////////////////////////////////////////////////////////////////////// #endif // !defined(AGD_SHMVAR_H__8E807F2F_C6E5_4D6B_8193_F29943D450B3__INCLUDED_)