LAPTOP-SNT8I5JK\Boounion
2025-02-18 5efff0895ad06eb0c5f04df7efe67a22b358beb3
SourceCode/Bond/Servo/CEquipment.cpp
@@ -1,16 +1,27 @@
#include "stdafx.h"
#include "CEquipment.h"
#include "ToolUnits.h"
namespace SERVO {
   CEquipment::CEquipment()
   CEquipment::CEquipment() : m_nID(0), m_strName(""), m_strDescription(""), m_station(0, 255)
   {
      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()
@@ -21,6 +32,16 @@
   void CEquipment::term()
   {
   }
   void CEquipment::setID(int nID)
   {
      m_nID = nID;
   }
   int CEquipment::getID()
   {
      return m_nID;
   }
   void CEquipment::setName(const char* pszName)
@@ -60,6 +81,7 @@
      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()
@@ -82,7 +104,19 @@
   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)
@@ -90,4 +124,54 @@
   }
   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;
   }
}