123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- #include "shmvar.h"
- #include <QDebug>
- #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<bool>())
- {
- 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);
- }
- }
|