shmbitvar.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. #include "shmvar.h"
  2. #include <QDebug>
  3. #define GET_BOOL_VAL(p, m) (!!(*p & m))
  4. #define SET_BIT(p, m) (*p |= m)
  5. #define CLR_BIT(p, m) (*p &= ~m)
  6. #define STORE_BIT(p, m, b) (b) ? SET_BIT(p, m) : CLR_BIT(p, m)
  7. CShmBitVariable::CShmBitVariable(void *pData, size_t nOffset, int nBitNr, HSHM hShm, const char *pszName, QObject *pParent)
  8. : QObject(pParent), m_varName(pszName), m_nBitNr(nBitNr)
  9. {
  10. if(!pData || !hShm || (nBitNr > 7))
  11. {
  12. Q_ASSERT_X(false, "CShmBitVariable::CShmBitVariable", "Invalid parameter!");
  13. return;
  14. }
  15. m_mask = (1 << nBitNr);
  16. m_pShmByte = (uint8_t*)pData + nOffset;
  17. m_cacheVal = GET_BOOL_VAL(m_pShmByte, m_mask);
  18. m_hShm = hShm;
  19. setObjectName(QStringLiteral("CShmBitVariable"));
  20. }
  21. CShmBitVariable::~CShmBitVariable(void)
  22. {
  23. }
  24. void CShmBitVariable::valRaw(QVariant &v)
  25. {
  26. bool bVal = GET_BOOL_VAL(m_pShmByte, m_mask);
  27. v.setValue(bVal);
  28. }
  29. QVariant CShmBitVariable::val(void)
  30. {
  31. QVariant v;
  32. Lock();
  33. valRaw(v);
  34. Unlock();
  35. return v;
  36. }
  37. void CShmBitVariable::setVal(const QVariant &val)
  38. {
  39. if(val.isValid() && !val.isNull())
  40. {
  41. #if _TRACK_QT_WRITES
  42. char szDebugOut[256];
  43. #endif // _TRACK_QT_WRITES
  44. if(val.canConvert<bool>())
  45. {
  46. Lock();
  47. bool bVal = GET_BOOL_VAL(m_pShmByte, m_mask);
  48. m_cacheVal = val.toBool();
  49. if(bVal != m_cacheVal)
  50. {
  51. STORE_BIT(m_pShmByte, m_mask, m_cacheVal);
  52. emitChanged(false);
  53. #if _TRACK_QT_WRITES
  54. sprintf(szDebugOut, "CShmBitVariable::setVal: Bit %s : %c", m_varName.toStdString().c_str(), m_cacheVal ? '1' : '0');
  55. qDebug() << szDebugOut;
  56. #endif // _TRACK_QT_WRITES
  57. }
  58. Unlock();
  59. }
  60. }
  61. }
  62. unsigned int CShmBitVariable::vt(void) const
  63. {
  64. return VT_bool;
  65. }
  66. unsigned long long CShmBitVariable::CheckUpdateShm(bool fLock)
  67. {
  68. CHECK_UPDATE_SHM_RETVAL rv = {1, 0};
  69. if(fLock)
  70. Lock();
  71. bool bVal = GET_BOOL_VAL(m_pShmByte, m_mask);
  72. if(m_cacheVal != bVal)
  73. {
  74. m_cacheVal = bVal;
  75. emitChanged(false);
  76. rv.nUpdated = 1;
  77. }
  78. if(fLock)
  79. Unlock();
  80. return rv.nRetval;
  81. }
  82. void CShmBitVariable::Lock(void)
  83. {
  84. ::GfaIpcLockSHM(m_hShm);
  85. // qDebug() << "CShmBitVariable::Lock";
  86. }
  87. void CShmBitVariable::Unlock(void)
  88. {
  89. // qDebug() << "CShmBitVariable::Unlock";
  90. ::GfaIpcUnlockSHM(m_hShm);
  91. }
  92. void CShmBitVariable::emitChanged(bool fLock)
  93. {
  94. // qDebug() << "val changed!";
  95. if(fLock)
  96. emit valChanged(val());
  97. else
  98. {
  99. QVariant v;
  100. valRaw(v);
  101. emit valChanged(v);
  102. }
  103. }