#include "stdafx.h" #include "CEquipment.h" #include "ToolUnits.h" namespace SERVO { CEquipment::CEquipment() { m_listener = { nullptr, nullptr }; m_alive = {FALSE, 0, FALSE}; m_bCimState = FALSE; InitializeCriticalSection(&m_criticalSection); } CEquipment::~CEquipment() { DeleteCriticalSection(&m_criticalSection); } void CEquipment::setListener(EquipmentListener listener) { m_listener.onAlive = listener.onAlive; m_listener.onCimStateChanged = listener.onCimStateChanged; } void CEquipment::init() { } void CEquipment::term() { } void CEquipment::setName(const char* pszName) { m_strName = pszName; } std::string& CEquipment::getName() { return m_strName; } void CEquipment::setDescription(const char* pszDescription) { m_strDescription = pszDescription; } std::string& CEquipment::getDescription() { return m_strDescription; } void CEquipment::setStation(int network, int station) { m_station.nNetNo = network; m_station.nStNo = station; } const StationIdentifier& CEquipment::getStation() { return m_station; } void CEquipment::setReadBitBlock(unsigned int start, unsigned int end) { m_blockReadBit.type = (unsigned int)DeviceType::LB;; m_blockReadBit.start = start; m_blockReadBit.end = end; m_blockReadBit.size = (m_blockReadBit.end - m_blockReadBit.start + 1) / 8; ASSERT(m_blockReadBit.size < BLOCK_BUFFER_MAX); } MemoryBlock& CEquipment::getReadBitBlock() { return m_blockReadBit; } void CEquipment::setWriteBitBlock(unsigned int start, unsigned int end) { m_blockWriteBit.type = (unsigned int)DeviceType::LB; m_blockWriteBit.start = start; m_blockWriteBit.end = end; m_blockWriteBit.size = (m_blockWriteBit.end - m_blockWriteBit.start + 1) / 8; } MemoryBlock& CEquipment::getWriteBitBlock() { return m_blockWriteBit; } void CEquipment::onTimer(UINT nTimerid) { // ÿ¸ôÒ»Ã룬¼ì²éÒ»ÏÂALIVE״̬ static int tick = 0; tick++; if (tick % (4 * 1) == 0) { m_alive.count++; if (m_alive.alive && m_alive.count > ALIVE_TIMEOUT) { m_alive.alive = FALSE; if (m_listener.onAlive != nullptr) { m_listener.onAlive(this, m_alive.alive); } } } } void CEquipment::serialize(CArchive& ar) { } void CEquipment::onReceiveLBData(const char* pszData, size_t size) { TRACE("%s onReceiveLBData: %d bytes\n", m_strName.c_str(), size); for (unsigned int i = 0; i < size; i++) { if (pszData[i] != 0) TRACE("%d[%x]\n", i, pszData[i]); } // ÒÔϽâÊͺʹ¦ÀíÊý¾Ý // alive /* BOOL bAliveFlag = isBitOn(pszData, size, 0x340); if (m_alive.flag != bAliveFlag) { m_alive.flag = bAliveFlag; m_alive.count = 0; // ״̬ if (!m_alive.alive) { m_alive.alive = TRUE; if (m_listener.onAlive != nullptr) { m_listener.onAlive(this, m_alive.alive); } } } */ // CIM State BOOL bCimState = isBitOn(pszData, size, 0x341); if ((bCimState && !m_bCimState) || (!bCimState && m_bCimState)) { m_bCimState = bCimState; if (m_listener.onCimStateChanged != nullptr) { m_listener.onCimStateChanged(this, m_bCimState); } } } BOOL CEquipment::isBitOn(const char* pszData, size_t size, int index) { int byteIndex, bitIndex; byteIndex = (index) / 8; bitIndex = (index) % 8; return CToolUnits::getBit(pszData[byteIndex], bitIndex); } BOOL CEquipment::isAlive() { return m_alive.alive; } }