#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("<CEQStateMonitor-%d>state:%d", m_nIndex, state);
|
ReportStatus(state);
|
}
|
|
int doorState = (pszData[addr + 2] & 0xff) | (pszData[addr + 3] & 0xff) << 8;
|
if (m_nLastDoorState != doorState) {
|
LOGI("<CEQStateMonitor-%d>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("<CEQStateMonitor-%d> ¸üÐÂÉ豸״̬(%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("<CEQStateMonitor-%d>¸üа²È«ÃÅ״̬(%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<CEQState*>& list)
|
{
|
Lock();
|
list = m_eqStates;
|
Unlock();
|
}
|