From cbe189228810812547d16a3211ab0b174831f609 Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期一, 24 三月 2025 11:56:04 +0800
Subject: [PATCH] 1.修复一个闪退问题(Glass列表为空仍要下传导致); 2.在CEquipment派生类中实现限制上游移动(如下在加工且加工数量有限制);
---
SourceCode/Bond/Servo/CEquipment.cpp | 131 ++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 127 insertions(+), 4 deletions(-)
diff --git a/SourceCode/Bond/Servo/CEquipment.cpp b/SourceCode/Bond/Servo/CEquipment.cpp
index a8b8df8..4baffcc 100644
--- a/SourceCode/Bond/Servo/CEquipment.cpp
+++ b/SourceCode/Bond/Servo/CEquipment.cpp
@@ -190,6 +190,21 @@
attrubutes.addAttribute(new CAttribute(szTemp,
m_bVCREnable[i] ? _T("Enable") : _T("Disable"), ""));
}
+
+ for (auto item : m_inputPins) {
+ attrubutes.addAttribute(new CAttribute(item->getName().c_str(),
+ std::to_string((int)item->getType()).c_str(), ""));
+ }
+
+ for (auto item : m_outputPins) {
+ attrubutes.addAttribute(new CAttribute(item->getName().c_str(),
+ std::to_string((int)item->getType()).c_str(), ""));
+ }
+
+ for (auto item : m_glassList) {
+ attrubutes.addAttribute(new CAttribute("Glass",
+ item->getID().c_str(), ""));
+ }
}
void CEquipment::setReadBitBlock(unsigned int start, unsigned int end)
@@ -435,16 +450,124 @@
int CEquipment::recvIntent(CPin* pPin, CIntent* pIntent)
{
+ ASSERT(pPin);
+ CPin* pFromPin = pPin->getConnectedPin();
+ ASSERT(pFromPin);
+ CEquipment* pFromEq = pFromPin->getEquipment();
+ ASSERT(pFromEq);
+
+ LOGI("<CEquipment><%s-%s>收到来自<%s.%s>的Intent<%d,%s,0x%x>",
+ this->getName().c_str(),
+ pPin->getName().c_str(),
+ pFromEq->getName().c_str(),
+ pFromPin->getName().c_str(),
+ pIntent->getCode(),
+ pIntent->getMsg(),
+ pIntent->getContext());
+
+
+
+ // 以下解释处理数据
+ int code = pIntent->getCode();
+
+
+ // 测试
+ if (code == FLOW_TEST) {
+ AfxMessageBox(pIntent->getMsg());
+ return FLOW_ACCEPT;
+ }
+
+
+ // 信号
+ if (code == FLOW_SIGNAL) {
+ return FLOW_ACCEPT;
+ }
+
+
+ // 数据
+ if (code == FLOW_SIGNAL) {
+ return FLOW_ACCEPT;
+ }
+
+
+ // 物料
+ if (code == FLOW_MOVE_MATERIAL) {
+ CGlass* pGlass = (CGlass*)pIntent->getContext();
+ ASSERT(pGlass);
+ if (!glassWillArrive(pGlass)) {
+ return FLOW_REJECT;
+ }
+ return glassArrived(pGlass);
+ }
+
+
+
+ return FLOW_ACCEPT;
+ }
+
+ int CEquipment::outputGlass(int port)
+ {
+ CPin* pOutPin = nullptr;
+ if (port == 0) {
+ pOutPin = getPin("Out");
+ if (pOutPin == nullptr) {
+ pOutPin = getPin("Out1");
+ }
+ }
+ else if (port == 1) {
+ pOutPin = getPin("Out2");
+ }
+ if (pOutPin == nullptr) {
+ return -1;
+ }
+
+
+ // 模拟取出第一张Panel,传送到下一环节
+ Lock();
+ if (m_glassList.empty()) {
+ Unlock();
+ return -2;
+ }
+ CGlass* pContext = m_glassList.front();
+ pContext->addRef();
+
+ CIntent intent(FLOW_MOVE_MATERIAL, "", pContext);
+ int nRet = pOutPin->sendIntent(&intent);
+ if (nRet == FLOW_REJECT) {
+ LOGE("<CEquipment>对方拒绝接收Intent.");
+ }
+ else if (nRet == FLOW_ACCEPT) {
+ m_glassList.pop_front();
+ pContext->release(); // 添加到列队时addRef, 取出时release
+ }
+
+ pContext->release();
+ Unlock();
+
return 0;
}
- void CEquipment::addPanelToList(CPanel* pPanel)
+ BOOL CEquipment::glassWillArrive(CGlass* pGlass)
{
- ASSERT(pPanel);
+ return TRUE;
+ }
+
+ int CEquipment::glassArrived(CGlass* pGlass)
+ {
+ Lock();
+ pGlass->addRef();
+ m_glassList.push_back(pGlass);
+ Unlock();
+ return FLOW_ACCEPT;
+ }
+
+ void CEquipment::addGlassToList(CGlass* pGlass)
+ {
+ ASSERT(pGlass);
Lock();
- pPanel->addRef();
- m_panelList.push_back(pPanel);
+ pGlass->addRef();
+ m_glassList.push_back(pGlass);
Unlock();
}
}
--
Gitblit v1.9.3