#include "shmvar.h" #include #define GET_BOOL_VAL(p, m) (!!(*p & m)) #define SET_BIT(p, m) (*p |= m) #define CLR_BIT(p, m) (*p &= ~m) #define STORE_BIT(p, m, b) (b) ? SET_BIT(p, m) : CLR_BIT(p, m) CShmBitVariable::CShmBitVariable(void *pData, size_t nOffset, int nBitNr, HSHM hShm, const char *pszName, QObject *pParent) : QObject(pParent), m_varName(pszName), m_nBitNr(nBitNr) { if(!pData || !hShm || (nBitNr > 7)) { Q_ASSERT_X(false, "CShmBitVariable::CShmBitVariable", "Invalid parameter!"); return; } m_mask = (1 << nBitNr); m_pShmByte = (uint8_t*)pData + nOffset; m_cacheVal = GET_BOOL_VAL(m_pShmByte, m_mask); m_hShm = hShm; setObjectName(QStringLiteral("CShmBitVariable")); } CShmBitVariable::~CShmBitVariable(void) { } void CShmBitVariable::valRaw(QVariant &v) { bool bVal = GET_BOOL_VAL(m_pShmByte, m_mask); v.setValue(bVal); } QVariant CShmBitVariable::val(void) { QVariant v; Lock(); valRaw(v); Unlock(); return v; } void CShmBitVariable::setVal(const QVariant &val) { if(val.isValid() && !val.isNull()) { #if _TRACK_QT_WRITES char szDebugOut[256]; #endif // _TRACK_QT_WRITES if(val.canConvert()) { Lock(); bool bVal = GET_BOOL_VAL(m_pShmByte, m_mask); m_cacheVal = val.toBool(); if(bVal != m_cacheVal) { STORE_BIT(m_pShmByte, m_mask, m_cacheVal); emitChanged(false); #if _TRACK_QT_WRITES sprintf(szDebugOut, "CShmBitVariable::setVal: Bit %s : %c", m_varName.toStdString().c_str(), m_cacheVal ? '1' : '0'); qDebug() << szDebugOut; #endif // _TRACK_QT_WRITES } Unlock(); } } } unsigned int CShmBitVariable::vt(void) const { return VT_bool; } unsigned long long CShmBitVariable::CheckUpdateShm(bool fLock) { CHECK_UPDATE_SHM_RETVAL rv = {1, 0}; if(fLock) Lock(); bool bVal = GET_BOOL_VAL(m_pShmByte, m_mask); if(m_cacheVal != bVal) { m_cacheVal = bVal; emitChanged(false); rv.nUpdated = 1; } if(fLock) Unlock(); return rv.nRetval; } void CShmBitVariable::Lock(void) { ::GfaIpcLockSHM(m_hShm); // qDebug() << "CShmBitVariable::Lock"; } void CShmBitVariable::Unlock(void) { // qDebug() << "CShmBitVariable::Unlock"; ::GfaIpcUnlockSHM(m_hShm); } void CShmBitVariable::emitChanged(bool fLock) { // qDebug() << "val changed!"; if(fLock) emit valChanged(val()); else { QVariant v; valRaw(v); emit valChanged(v); } }