#include "stdafx.h" #include "EQStateMonitor.h" #include "Common.h" #include "CBonder.h" #include "Log.h" #define EQSTATE_MAX 200 CEQStateMonitor::CEQStateMonitor() { m_nBeginAddr = 0; m_bStatusReport = FALSE; m_lastState = EQSTATE::Idle; m_nLastDoorState = 0; } CEQStateMonitor::~CEQStateMonitor() { } std::string& CEQStateMonitor::getClassName() { static std::string strClassName = "CEQStateMonitor"; return strClassName; } void CEQStateMonitor::onRecvBroadcast(void* pSender, CIntent* pIntent) { } void CEQStateMonitor::onData(int id, const void* pData, int size) { const char* pszData = (const char*)pData; if (m_nIndex + 1 == id) { int addr = m_nBeginAddr * 2; int state = (pszData[addr] & 0xff) | (pszData[addr + 1] & 0xff) << 8; if ((int)m_lastState != state && (state >= 1 && state <= 6)) { LOGI("state:%d", m_nIndex, state); ReportStatus(state); } int doorState = (pszData[addr + 2] & 0xff) | (pszData[addr + 3] & 0xff) << 8; if (m_nLastDoorState != doorState) { LOGI("door state:%d", m_nIndex, doorState); ReportDoorState((int)m_lastState, doorState); } } } void CEQStateMonitor::enableStatusReport(BOOL bEnable) { m_bStatusReport = bEnable; } void CEQStateMonitor::init() { CComponent::init(); } void CEQStateMonitor::term() { for (auto item : m_eqStates) { item->release(); } } void CEQStateMonitor::setBeginAddr(int nAddr) { m_nBeginAddr = nAddr; } void CEQStateMonitor::OnTimer(UINT nTimerid) { } void CEQStateMonitor::ReportStatus(int eqst) { BEQ::IUnit* pUnit = m_pBonder->getUnit(m_nIndex); ASSERT(pUnit); pUnit->setState((BEQ::EQ_STATE)(eqst-1)); LOGI(" ¸üÐÂÉ豸״̬(%d).", m_nIndex, eqst); CEQState* pState = new CEQState(m_nIndex, (EQSTATE)eqst); AddEQState(pState); SendBroadcast(&CIntent(BC_CODE_EQSTATE_EVENT, "", pState)); m_lastState = (EQSTATE)eqst; } void CEQStateMonitor::ReportDoorState(int eqst, int doorst) { BEQ::IUnit* pUnit = m_pBonder->getUnit(m_nIndex); ASSERT(pUnit); pUnit->setDoorState(doorst); LOGI("¸üа²È«ÃÅ״̬(%d).", m_nIndex, doorst); CEQState* pState = new CEQState(m_nIndex, (EQSTATE)eqst); pState->setDoorState(doorst); AddEQState(pState); SendBroadcast(&CIntent(BC_CODE_EQSTATE_EVENT, "", pState)); m_nLastDoorState = doorst; } void CEQStateMonitor::Serialize(CArchive& ar) { if (ar.IsStoring()) { Lock(); int count = (int)m_eqStates.size(); ar << count; for (auto item : m_eqStates) { item->Serialize(ar); } Unlock(); } else { Lock(); int count; ar >> count; for (int i = 0; i < count; i++) { CEQState* pState = new CEQState(); pState->addRef(); pState->Serialize(ar); AddEQState(pState); pState->release(); } Unlock(); } } void CEQStateMonitor::AddEQState(CEQState* pEQState) { Lock(); pEQState->addRef(); m_eqStates.push_back(pEQState); if (m_eqStates.size() > EQSTATE_MAX) { CEQState* pTemp = m_eqStates.front(); pTemp->release(); m_eqStates.pop_front(); } Unlock(); } void CEQStateMonitor::getEQStateList(std::list& list) { Lock(); list = m_eqStates; Unlock(); }