rembitvar.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. #include "remvar.h"
  2. #define GET_BOOL_VAL(p, m) (!!(*p & m))
  3. #define SET_BIT(p, m) (*p |= m)
  4. #define CLR_BIT(p, m) (*p &= ~m)
  5. #define STORE_BIT(p, m, b) (b) ? SET_BIT(p, m) : CLR_BIT(p, m)
  6. /////////////////////////////////////////////////////////////////////////////
  7. CRemBitVariable::CRemBitVariable(void *pData, size_t nOffset, int nBitNr, HSHM hShm, bool bIsDbPersitent, const char *pszName, CRemanent *pParent)
  8. : m_name(pszName), m_pszPath(NULL), m_hShm(hShm), m_pParent(pParent), m_nUpdates(0), m_fLogValue(0.0), m_bMustLog(false), m_bIsDbPersitent(bIsDbPersitent), m_nCbVarpath(0)
  9. {
  10. if(!pData || !hShm || (nBitNr > 7))
  11. {
  12. ASSERT(false);
  13. return;
  14. }
  15. m_mask = (1 << nBitNr);
  16. m_pShmByte = (uint8_t*)pData + nOffset;
  17. Lock();
  18. m_cacheVal = GET_BOOL_VAL(m_pShmByte, m_mask);
  19. Unlock();
  20. }
  21. CRemBitVariable::~CRemBitVariable(void)
  22. {
  23. }
  24. /////////////////////////////////////////////////////////////////////////////
  25. void CRemBitVariable::InitPath(CRemanent *pParent, const char *pszMemberName)
  26. {
  27. if(!pszMemberName)
  28. pszMemberName = "";
  29. if(pParent)
  30. {
  31. m_path = pParent->GetPath();
  32. if(m_path.size() > 0)
  33. m_path += "/";
  34. m_path += pszMemberName;
  35. }
  36. else
  37. {
  38. m_path = pszMemberName;
  39. }
  40. m_pszPath = m_path.c_str();
  41. m_nCbVarpath = m_path.length();
  42. }
  43. bool CRemBitVariable::SaveJSON(FILE *f, int nIndent, bool bValueOnly, bool bWriteComma)
  44. {
  45. if(m_bIsDbPersitent)
  46. return true;
  47. if(bWriteComma)
  48. {
  49. if(fprintf(f, ",") < 0)
  50. return false;
  51. }
  52. if(!bValueOnly)
  53. {
  54. if(fprintf(f, "\n") < 0)
  55. return false;
  56. if(nIndent > 0)
  57. {
  58. if(fprintf(f, "%*s", nIndent * _JSON_SPACES_PER_TAB, "") < 0)
  59. return false;
  60. }
  61. if(fprintf(f, "\"%s\": ", m_name.c_str()) < 0)
  62. return false;
  63. }
  64. if(fprintf(f, "%s", m_cacheVal ? "true" : "false") < 0)
  65. return false;
  66. return true;
  67. }
  68. void CRemBitVariable::CreateMembersTable(CRemVarTable &vt)
  69. {
  70. if(!m_bIsDbPersitent)
  71. vt.AddVar(static_cast<CRemanent*>(this));
  72. }
  73. bool CRemBitVariable::SetJSONValue(const Json::Value &jv, bool fLock)
  74. {
  75. bool bRet = true;
  76. if(fLock)
  77. Lock();
  78. switch(jv.type())
  79. {
  80. case Json::booleanValue:
  81. m_cacheVal = jv.asBool();
  82. break;
  83. case Json::intValue:
  84. m_cacheVal = !!jv.asInt();
  85. break;
  86. default:
  87. bRet = false;
  88. }
  89. if(bRet)
  90. {
  91. STORE_BIT(m_pShmByte, m_mask, m_cacheVal);
  92. }
  93. if(fLock)
  94. Unlock();
  95. return bRet;
  96. }
  97. bool CRemBitVariable::SetDoubleValue(double val, bool fLock)
  98. {
  99. m_cacheVal = !!val;
  100. if(fLock) Lock();
  101. STORE_BIT(m_pShmByte, m_mask, m_cacheVal);
  102. if(fLock) Unlock();
  103. return true;
  104. }
  105. unsigned long long CRemBitVariable::CheckUpdateShm(bool fLock)
  106. {
  107. bool bVal;
  108. CHECK_UPDATE_SHM_RETVAL rv = {1, 0};
  109. if(m_bIsDbPersitent)
  110. return rv.nRetval;
  111. if(fLock)
  112. Lock();
  113. bVal = GET_BOOL_VAL(m_pShmByte, m_mask);
  114. if(m_cacheVal != bVal)
  115. {
  116. m_cacheVal = bVal;
  117. m_fLogValue = m_cacheVal ? 1.0 : 0.0;
  118. rv.nUpdated = 1;
  119. }
  120. if(fLock)
  121. Unlock();
  122. if(rv.nUpdated)
  123. {
  124. m_bMustLog = true;
  125. m_nUpdates++;
  126. }
  127. return rv.nRetval;
  128. }
  129. void CRemBitVariable::Log(time_t ts, CRemLogger &rlogger)
  130. {
  131. if(!m_bIsDbPersitent && m_bMustLog)
  132. {
  133. rlogger.Log(m_pszPath, m_nCbVarpath, m_fLogValue, NULL, 0, ts, true);
  134. m_bMustLog = false;
  135. }
  136. }
  137. void CRemBitVariable::Lock(void)
  138. {
  139. ::GfaIpcLockSHM(m_hShm);
  140. }
  141. void CRemBitVariable::Unlock(void)
  142. {
  143. ::GfaIpcUnlockSHM(m_hShm);
  144. }