From 6df6302161eb6021ad3c324d7a3f5494c63dc21e Mon Sep 17 00:00:00 2001
From: darker <mr.darker@163.com>
Date: 星期二, 18 二月 2025 08:39:53 +0800
Subject: [PATCH] Merge branch 'clh' into liuyang

---
 SourceCode/Bond/Servo/CEquipment.cpp |   60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 60 insertions(+), 0 deletions(-)

diff --git a/SourceCode/Bond/Servo/CEquipment.cpp b/SourceCode/Bond/Servo/CEquipment.cpp
index 6f8cd0b..6534f88 100644
--- a/SourceCode/Bond/Servo/CEquipment.cpp
+++ b/SourceCode/Bond/Servo/CEquipment.cpp
@@ -1,16 +1,25 @@
 #include "stdafx.h"
 #include "CEquipment.h"
+#include "ToolUnits.h"
+
 
 namespace SERVO {
 
 	CEquipment::CEquipment()
 	{
+		m_alive = {FALSE, 0, FALSE};
+		m_listener.onAlive = {nullptr};
 		InitializeCriticalSection(&m_criticalSection);
 	}
 
 	CEquipment::~CEquipment()
 	{
 		DeleteCriticalSection(&m_criticalSection);
+	}
+
+	void CEquipment::setListener(EquipmentListener listener)
+	{
+		m_listener.onAlive = listener.onAlive;
 	}
 
 	void CEquipment::init()
@@ -60,6 +69,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 +92,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 +112,42 @@
 
 	}
 
+	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]);
+		}
+
+
+		// 解释数据
+		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);
+				}
+			}
+		}
+	}
+
+	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;
+	}
 }

--
Gitblit v1.9.3