123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545 |
- #include "shmvar.h"
- #include <QDebug>
- CShmVariable::CShmVariable(void *pData, const std::type_info &rti, HSHM hShm, const char *pszName, int nIndex, QObject *pParent)
- : QObject(pParent), m_vt(VT_Invalid), m_data({NULL}), m_varName(pszName)
- {
- if(!pData || !hShm)
- {
- Q_ASSERT_X(false, "CShmVariable::CShmVariable", "Invalid parameter!");
- return;
- }
- m_data.pVoid = pData;
- m_hShm = hShm;
- setObjectName(QStringLiteral("CShmVariable"));
- if((m_nIndex = nIndex) >= 0)
- {
- m_varName += QString("%1%2%3").arg('[').arg(nIndex).arg(']');
- }
- if(rti == typeid(bool))
- {
- m_vt = VT_bool;
- m_cache.boolVal = *m_data.pBool;
- #if _TRACK_TYPES_AT_LOAD
- qDebug() << "VT_bool";
- #endif // _TRACK_TYPES_AT_LOAD
- }
- else if(rti == typeid(char))
- {
- #ifdef __CHAR_UNSIGNED__
- m_vt = VT_UI1;
- m_cache.UI1Val = *m_data.pUI1;
- #if _TRACK_TYPES_AT_LOAD
- qDebug() << "VT_UI1";
- #endif // _TRACK_TYPES_AT_LOAD
- #else
- m_vt = VT_I1;
- m_cache.I1Val = *m_data.pI1;
- #if _TRACK_TYPES_AT_LOAD
- qDebug() << "VT_I1";
- #endif // _TRACK_TYPES_AT_LOAD
- #endif
- }
- else if(rti == typeid(signed char))
- {
- m_vt = VT_I1;
- m_cache.I1Val = *m_data.pI1;
- #if _TRACK_TYPES_AT_LOAD
- qDebug() << "VT_I1";
- #endif // _TRACK_TYPES_AT_LOAD
- }
- else if(rti == typeid(unsigned char))
- {
- m_vt = VT_UI1;
- m_cache.UI1Val = *m_data.pUI1;
- #if _TRACK_TYPES_AT_LOAD
- qDebug() << "VT_UI1";
- #endif // _TRACK_TYPES_AT_LOAD
- }
- else if(rti == typeid(short))
- {
- m_vt = VT_I2;
- m_cache.I2Val = *m_data.pI2;
- #if _TRACK_TYPES_AT_LOAD
- qDebug() << "VT_I2";
- #endif // _TRACK_TYPES_AT_LOAD
- }
- else if(rti == typeid(unsigned short))
- {
- m_vt = VT_UI2;
- m_cache.UI2Val = *m_data.pUI2;
- #if _TRACK_TYPES_AT_LOAD
- qDebug() << "VT_UI2";
- #endif // _TRACK_TYPES_AT_LOAD
- }
- else if(rti == typeid(int))
- {
- m_vt = VT_I4;
- m_cache.I4Val = *m_data.pI4;
- #if _TRACK_TYPES_AT_LOAD
- qDebug() << "VT_I4";
- #endif // _TRACK_TYPES_AT_LOAD
- }
- else if(rti == typeid(unsigned int))
- {
- m_vt = VT_UI4;
- m_cache.UI4Val = *m_data.pUI4;
- #if _TRACK_TYPES_AT_LOAD
- qDebug() << "VT_UI4";
- #endif // _TRACK_TYPES_AT_LOAD
- }
- else if(rti == typeid(long))
- {
- if(sizeof(long) == sizeof(long long))
- {
- m_vt = VT_I8;
- m_cache.I8Val = *m_data.pI8;
- #if _TRACK_TYPES_AT_LOAD
- qDebug() << "VT_I8";
- #endif // _TRACK_TYPES_AT_LOAD
- }
- else
- {
- m_vt = VT_I4;
- m_cache.I4Val = *m_data.pI4;
- #if _TRACK_TYPES_AT_LOAD
- qDebug() << "VT_I4";
- #endif // _TRACK_TYPES_AT_LOAD
- }
- }
- else if(rti == typeid(unsigned long))
- {
- if(sizeof(unsigned long) == sizeof(unsigned long long))
- {
- m_vt = VT_UI8;
- m_cache.UI8Val = *m_data.pUI8;
- #if _TRACK_TYPES_AT_LOAD
- qDebug() << "VT_UI8";
- #endif // _TRACK_TYPES_AT_LOAD
- }
- else
- {
- m_vt = VT_UI4;
- m_cache.UI4Val = *m_data.pUI4;
- #if _TRACK_TYPES_AT_LOAD
- qDebug() << "VT_UI4";
- #endif // _TRACK_TYPES_AT_LOAD
- }
- }
- else if(rti == typeid(long long))
- {
- m_vt = VT_I8;
- m_cache.I8Val = *m_data.pI8;
- #if _TRACK_TYPES_AT_LOAD
- qDebug() << "VT_I8";
- #endif // _TRACK_TYPES_AT_LOAD
- }
- else if(rti == typeid(unsigned long long))
- {
- m_vt = VT_UI8;
- m_cache.UI8Val = *m_data.pUI8;
- #if _TRACK_TYPES_AT_LOAD
- qDebug() << "VT_UI8";
- #endif // _TRACK_TYPES_AT_LOAD
- }
- else if(rti == typeid(float))
- {
- m_vt = VT_float;
- m_cache.FloatVal = *m_data.pFloat;
- #if _TRACK_TYPES_AT_LOAD
- qDebug() << "VT_float";
- #endif // _TRACK_TYPES_AT_LOAD
- }
- else if(rti == typeid(double))
- {
- m_vt = VT_double;
- m_cache.DoubleVal = *m_data.pDouble;
- #if _TRACK_TYPES_AT_LOAD
- qDebug() << "VT_double";
- #endif // _TRACK_TYPES_AT_LOAD
- }
- else
- {
- Q_ASSERT_X(false, "CShmVariable::CShmVariable", "Unknown data type!");
- }
- }
- CShmVariable::~CShmVariable(void)
- {
- }
- void CShmVariable::valRaw(QVariant &v)
- {
- switch(m_vt)
- {
- case VT_bool:
- v.setValue(*m_data.pBool);
- break;
- case VT_I1:
- v.setValue((signed int)*m_data.pI1);
- break;
- case VT_UI1:
- v.setValue((unsigned int)*m_data.pUI1);
- break;
- case VT_I2:
- v.setValue((signed int)*m_data.pI2);
- break;
- case VT_UI2:
- v.setValue((unsigned int)*m_data.pUI2);
- break;
- case VT_I4:
- v.setValue(*m_data.pI4);
- break;
- case VT_UI4:
- v.setValue(*m_data.pUI4);
- break;
- case VT_I8:
- v.setValue(*m_data.pI8);
- break;
- case VT_UI8:
- v.setValue(*m_data.pUI8);
- break;
- case VT_float:
- v.setValue(*m_data.pFloat);
- break;
- case VT_double:
- v.setValue(*m_data.pDouble);
- break;
- default:
- break;
- }
- }
- QVariant CShmVariable::val(void)
- {
- QVariant v;
- Lock();
- valRaw(v);
- Unlock();
- return v;
- }
- void CShmVariable::setVal(const QVariant &val)
- {
- if(val.isValid() && !val.isNull())
- {
- #if _TRACK_QT_WRITES
- char szDebugOut[256];
- #endif // _TRACK_QT_WRITES
- Lock();
- switch(m_vt)
- {
- case VT_bool:
- if(val.canConvert<bool>())
- {
- m_cache.boolVal = val.toBool();
- if(*m_data.pBool != m_cache.boolVal)
- {
- *m_data.pBool = m_cache.boolVal;
- emitChanged(false);
- #if _TRACK_QT_WRITES
- sprintf(szDebugOut, "CShmVariable::setVal: bool %s@(%p) - %s", m_varName.toStdString().c_str(), m_data.pVoid, m_cache.boolVal ? "true" : "false");
- qDebug() << szDebugOut;
- #endif // _TRACK_QT_WRITES
- }
- }
- break;
- case VT_I1:
- if(val.canConvert<int>())
- {
- m_cache.I1Val = (signed char)val.toInt();
- if(*m_data.pI1 != m_cache.I1Val)
- {
- *m_data.pI1 = m_cache.I1Val;
- emitChanged(false);
- #if _TRACK_QT_WRITES
- sprintf(szDebugOut, "CShmVariable::setVal: signed char %s@(%p) - %hhd", m_varName.toStdString().c_str(), m_data.pVoid, m_cache.I1Val);
- qDebug() << szDebugOut;
- #endif // _TRACK_QT_WRITES
- }
- }
- break;
- case VT_UI1:
- if(val.canConvert<int>())
- {
- m_cache.UI1Val = (unsigned char)val.toInt();
- if(*m_data.pUI1 != m_cache.UI1Val)
- {
- *m_data.pUI1 = m_cache.UI1Val;
- emitChanged(false);
- #if _TRACK_QT_WRITES
- sprintf(szDebugOut, "CShmVariable::setVal: unsigned char %s@(%p) - %hhu", m_varName.toStdString().c_str(), m_data.pVoid, m_cache.UI1Val);
- qDebug() << szDebugOut;
- #endif // _TRACK_QT_WRITES
- }
- }
- break;
- case VT_I2:
- if(val.canConvert<int>())
- {
- m_cache.I2Val = (signed short)val.toInt();
- if(*m_data.pI2 != m_cache.I2Val)
- {
- *m_data.pI2 = m_cache.I2Val;
- emitChanged(false);
- #if _TRACK_QT_WRITES
- sprintf(szDebugOut, "CShmVariable::setVal: signed short %s@(%p) - %hd", m_varName.toStdString().c_str(), m_data.pVoid, m_cache.I2Val);
- qDebug() << szDebugOut;
- #endif // _TRACK_QT_WRITES
- }
- }
- break;
- case VT_UI2:
- if(val.canConvert<int>())
- {
- m_cache.UI2Val = (unsigned short)val.toInt();
- if(*m_data.pUI2 != m_cache.UI2Val)
- {
- *m_data.pUI2 = m_cache.UI2Val;
- emitChanged(false);
- #if _TRACK_QT_WRITES
- sprintf(szDebugOut, "CShmVariable::setVal: unsigned short %s@(%p) - %hu", m_varName.toStdString().c_str(), m_data.pVoid, m_cache.UI2Val);
- qDebug() << szDebugOut;
- #endif // _TRACK_QT_WRITES
- }
- }
- break;
- case VT_I4:
- if(val.canConvert<int>())
- {
- m_cache.I4Val = (signed int)val.toInt();
- if(*m_data.pI4 != m_cache.I4Val)
- {
- *m_data.pI4 = m_cache.I4Val;
- emitChanged(false);
- #if _TRACK_QT_WRITES
- sprintf(szDebugOut, "CShmVariable::setVal: signed int %s@(%p) - %d", m_varName.toStdString().c_str(), m_data.pVoid, m_cache.I4Val);
- qDebug() << szDebugOut;
- #endif // _TRACK_QT_WRITES
- }
- }
- break;
- case VT_UI4:
- if(val.canConvert<int>())
- {
- m_cache.UI4Val = (unsigned int)val.toInt();
- if(*m_data.pUI4 != m_cache.UI4Val)
- {
- *m_data.pUI4 = m_cache.UI4Val;
- emitChanged(false);
- #if _TRACK_QT_WRITES
- sprintf(szDebugOut, "CShmVariable::setVal: unsigned int %s@(%p) - %u", m_varName.toStdString().c_str(), m_data.pVoid, m_cache.UI4Val);
- qDebug() << szDebugOut;
- #endif // _TRACK_QT_WRITES
- }
- }
- break;
- case VT_I8:
- if(val.canConvert<long long>())
- {
- m_cache.I8Val = (signed long long)val.toLongLong();
- if(*m_data.pI8 != m_cache.I8Val)
- {
- *m_data.pI8 = m_cache.I8Val;
- emitChanged(false);
- #if _TRACK_QT_WRITES
- sprintf(szDebugOut, "CShmVariable::setVal: signed long long %s@(%p) - %lld", m_varName.toStdString().c_str(), m_data.pVoid, m_cache.I8Val);
- qDebug() << szDebugOut;
- #endif // _TRACK_QT_WRITES
- }
- }
- break;
- case VT_UI8:
- if(val.canConvert<long long>())
- {
- m_cache.UI8Val = (unsigned long long)val.toLongLong();
- if(*m_data.pUI8 != m_cache.UI8Val)
- {
- *m_data.pUI8 = m_cache.UI8Val;
- emitChanged(false);
- #if _TRACK_QT_WRITES
- sprintf(szDebugOut, "CShmVariable::setVal: unsigned long long %s@(%p) - %llu", m_varName.toStdString().c_str(), m_data.pVoid, m_cache.UI8Val);
- qDebug() << szDebugOut;
- #endif // _TRACK_QT_WRITES
- }
- }
- break;
- case VT_float:
- if(val.canConvert<float>())
- {
- m_cache.FloatVal = (float)val.toFloat();
- if(*m_data.pFloat != m_cache.FloatVal)
- {
- *m_data.pFloat = m_cache.FloatVal;
- emitChanged(false);
- #if _TRACK_QT_WRITES
- sprintf(szDebugOut, "CShmVariable::setVal: float %s@(%p) - %f", m_varName.toStdString().c_str(), m_data.pVoid, m_cache.FloatVal);
- qDebug() << szDebugOut;
- #endif // _TRACK_QT_WRITES
- }
- }
- break;
- case VT_double:
- if(val.canConvert<double>())
- {
- m_cache.DoubleVal = (double)val.toDouble();
- if(*m_data.pDouble != m_cache.DoubleVal)
- {
- *m_data.pDouble = m_cache.DoubleVal;
- emitChanged(false);
- #if _TRACK_QT_WRITES
- sprintf(szDebugOut, "CShmVariable::setVal: double %s@(%p) - %f", m_varName.toStdString().c_str(), m_data.pVoid, m_cache.DoubleVal);
- qDebug() << szDebugOut;
- #endif // _TRACK_QT_WRITES
- }
- }
- break;
- default:
- qDebug() << "CShmVariable::setVal: invalid vartype!";
- break;
- }
- Unlock();
- }
- }
- unsigned int CShmVariable::vt(void) const
- {
- return m_vt;
- }
- unsigned long long CShmVariable::CheckUpdateShm(bool fLock)
- {
- CHECK_UPDATE_SHM_RETVAL rv = {1, 0};
- if(fLock)
- Lock();
- switch(m_vt)
- {
- case VT_bool:
- if(m_cache.boolVal != *m_data.pBool)
- {
- m_cache.boolVal = *m_data.pBool;
- emitChanged(false);
- rv.nUpdated = 1;
- }
- break;
- case VT_I1:
- if(m_cache.I1Val != *m_data.pI1)
- {
- m_cache.I1Val = *m_data.pI1;
- emitChanged(false);
- rv.nUpdated = 1;
- }
- break;
- case VT_UI1:
- if(m_cache.UI1Val != *m_data.pUI1)
- {
- m_cache.UI1Val = *m_data.pUI1;
- emitChanged(false);
- rv.nUpdated = 1;
- }
- break;
- case VT_I2:
- if(m_cache.I2Val != *m_data.pI2)
- {
- m_cache.I2Val = *m_data.pI2;
- emitChanged(false);
- rv.nUpdated = 1;
- }
- break;
- case VT_UI2:
- if(m_cache.UI2Val != *m_data.pUI2)
- {
- m_cache.UI2Val = *m_data.pUI2;
- emitChanged(false);
- rv.nUpdated = 1;
- }
- break;
- case VT_I4:
- if(m_cache.I4Val != *m_data.pI4)
- {
- m_cache.I4Val = *m_data.pI4;
- emitChanged(false);
- rv.nUpdated = 1;
- }
- break;
- case VT_UI4:
- if(m_cache.UI4Val != *m_data.pUI4)
- {
- m_cache.UI4Val = *m_data.pUI4;
- emitChanged(false);
- rv.nUpdated = 1;
- }
- break;
- case VT_I8:
- if(m_cache.I8Val != *m_data.pI8)
- {
- m_cache.I8Val = *m_data.pI8;
- emitChanged(false);
- rv.nUpdated = 1;
- }
- break;
- case VT_UI8:
- if(m_cache.UI8Val != *m_data.pUI8)
- {
- m_cache.UI8Val = *m_data.pUI8;
- emitChanged(false);
- rv.nUpdated = 1;
- }
- break;
- case VT_float:
- if(m_cache.FloatVal != *m_data.pFloat)
- {
- m_cache.FloatVal = *m_data.pFloat;
- emitChanged(false);
- rv.nUpdated = 1;
- }
- break;
- case VT_double:
- if(m_cache.DoubleVal != *m_data.pDouble)
- {
- m_cache.DoubleVal = *m_data.pDouble;
- emitChanged(false);
- rv.nUpdated = 1;
- }
- break;
- default:
- break;
- }
- if(fLock)
- Unlock();
- return rv.nRetval;
- }
- void CShmVariable::Lock(void)
- {
- ::GfaIpcLockSHM(m_hShm);
- // qDebug() << "CShmVariable::Lock";
- }
- void CShmVariable::Unlock(void)
- {
- // qDebug() << "CShmVariable::Unlock";
- ::GfaIpcUnlockSHM(m_hShm);
- }
- void CShmVariable::emitChanged(bool fLock)
- {
- // qDebug() << "val changed!";
- if(fLock)
- emit valChanged(val());
- else
- {
- QVariant v;
- valRaw(v);
- emit valChanged(v);
- }
- }
|