From 6b80da0fe2a6053b39802a6701db6df0ab1fde24 Mon Sep 17 00:00:00 2001
From: mrDarker <mr.darker@163.com>
Date: 星期五, 05 九月 2025 17:27:35 +0800
Subject: [PATCH] 1. 添加设备配方参数显示界面

---
 SourceCode/Bond/Servo/HsmsPassive.cpp |  223 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 215 insertions(+), 8 deletions(-)

diff --git a/SourceCode/Bond/Servo/HsmsPassive.cpp b/SourceCode/Bond/Servo/HsmsPassive.cpp
index f44acb0..1b122ec 100644
--- a/SourceCode/Bond/Servo/HsmsPassive.cpp
+++ b/SourceCode/Bond/Servo/HsmsPassive.cpp
@@ -108,6 +108,8 @@
 	ASSERT(pParent);
 	ASSERT(pVariable);
 
+
+	ISECS2Item* pItemList;
 	SERVO::SVFromat format = pVariable->getFormat();
 	switch (format)
 	{
@@ -123,6 +125,16 @@
 	case SERVO::SVFromat::A20:
 	case SERVO::SVFromat::A50:
 		pParent->addItem(pVariable->getValue().c_str(), "SV");
+		break;
+	case SERVO::SVFromat::L:
+		pItemList = pParent->addItem();
+		{
+			auto vars = pVariable->getVarsValue();
+			for (auto v : vars) {
+				addVariableValueToItem(pItemList, &v);
+			}
+		}
+		break;
 	default:
 		break;
 	}
@@ -313,6 +325,14 @@
 	auto v = getVariable(pszName);
 	if (v != nullptr) {
 		v->setValue(value);
+	}
+}
+
+void CHsmsPassive::setVariableValue(const char* pszName, std::vector<SERVO::CVariable>& vars)
+{
+	auto v = getVariable(pszName);
+	if (v != nullptr) {
+		v->setValue(vars);
 	}
 }
 
@@ -611,6 +631,9 @@
 		}
 		else if (nStream == 10 && pHeader->function == 3) {
 			replyTerminalDisplay(pMessage);
+		}
+		else if (nStream == 14 && pHeader->function == 9) {
+			replyCreateObj(pMessage);
 		}
 		else if (nStream == 16 && pHeader->function == 15) {
 			replyPRJobMultiCreate(pMessage);
@@ -933,6 +956,7 @@
 	return 0;
 }
 
+// S1F3
 int CHsmsPassive::replySelectedEquipmentStatusData(IMessage* pRecv)
 {
 	if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
@@ -1517,6 +1541,140 @@
 	return 0;
 }
 
+// S14F9
+int CHsmsPassive::replyCreateObj(IMessage* pRecv)
+{
+	if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
+		return ER_NOTSELECT;
+	}
+	ISECS2Item* pBody = pRecv->getBody();
+	if (pBody == nullptr || pBody->getType() != SITYPE::L) ER_PARAM_ERROR;
+	
+
+	// 鏄惁鍒涘缓鎴愬姛骞跺噯澶囧洖澶嶆姤鏂�
+	bool bCreateOk = false;
+	IMessage* pReply = NULL;
+	HSMS_Create1Message(pReply, m_nSessionId, 14, 10, ++m_nSystemByte);
+	ASSERT(pReply);
+
+
+
+	// 瑙i噴鏁版嵁锛屽緱鍒癈ontrolJob
+	ISECS2Item* pItemAttrs, * pItemAttr, *pItemAttrData;
+	const char* pszObjSpec, *pszObjType, *pszAttrId, *pszProcessJobId;
+	std::string strObjName, strObjId;
+	if (!pBody->getSubItemString(0, pszObjSpec)) return ER_PARAM_ERROR;
+	if (!pBody->getSubItemString(1, pszObjType)) return ER_PARAM_ERROR;
+
+	pReply->getBody()->addItem(pszObjSpec, "OBJSPEC");
+	ISECS2Item* pReplyItemAttrs = pReply->getBody()->addItem();
+	ISECS2Item* pReplyItemAcks = pReply->getBody()->addItem();
+	ISECS2Item* pReplyItemAck = pReplyItemAcks->addU1Item(0, "OBJACK");
+	ISECS2Item* pReplyItemErrs = pReplyItemAcks->addItem();
+
+	// 褰撳墠鍙鐞嗙被鍚勪负ControlJob
+	if (_strcmpi(pszObjType, "ControlJob") == 0) {
+
+		// 绫籭d
+		std::regex re("^([^:]+):([^>]+)>");
+		std::smatch match;
+		std::string strObjSpec(pszObjSpec);
+		if (!std::regex_search(strObjSpec, match, re)) {
+			ISECS2Item* pItemError = pReplyItemErrs->addItem();
+			pItemError->addU4Item(2001, "ERRCODE");
+			pItemError->addItem("鍙傛暟鎴栨姤鏂囦笉姝g‘", "ERRTEXT");
+			goto MYREPLY;
+		}
+
+		if (match[1].compare("ControlJob") != 0) {
+			ISECS2Item* pItemError = pReplyItemErrs->addItem();
+			pItemError->addU4Item(2001, "ERRCODE");
+			pItemError->addItem("涓嶆敮鎸佺殑OBJ", "ERRTEXT");
+			goto MYREPLY;
+		}
+		strObjId = match[2];
+
+		// 鍒涘缓绫籆ControlJob
+		SERVO::CControlJob controlJob(strObjId);
+
+		// 绫诲睘鎬�
+		pItemAttrs = pBody->getSubItem(2);
+		if (pItemAttrs == nullptr) return ER_PARAM_ERROR;
+		for (int i = 0; i < pItemAttrs->getSubItemSize(); i++) {
+			pItemAttr = pItemAttrs->getSubItem(i);
+			if (pItemAttr == nullptr) continue;
+			if (!pItemAttr->getSubItemString(0, pszAttrId)) continue;
+			if (_strcmpi(pszAttrId, CJ_ATTR_PRIORITY) == 0) {
+				uint8_t priority;
+				if (pItemAttr->getSubItemU1(1, priority)) {
+					controlJob.setPriority(priority);
+				}
+			}
+			else if (_strcmpi(pszAttrId, CJ_ATTR_PRJOBLIST) == 0) {
+				pItemAttrData = pItemAttr->getSubItem(1);
+				if (pItemAttrData != nullptr && pItemAttrData->getType() == SITYPE::L) {
+					for (int i = 0; i < pItemAttrData->getSubItemSize(); i++) {
+						if (pItemAttrData->getSubItemString(i, pszProcessJobId)) {
+							std::string strProcessJobId(pszProcessJobId);
+							controlJob.addPJ(strProcessJobId);
+						}
+					}
+				}
+			}
+		}
+
+
+		ASSERT(m_listener.onControlJobCreate != nullptr);
+		int nRet = m_listener.onControlJobCreate(this, controlJob);
+		bCreateOk = nRet == 0;
+
+		// 娣诲姞鏂板缓绫荤殑鍚勭灞炴�у埌鍥炲鎶ユ枃涓�
+		if(bCreateOk) {
+			{
+				ISECS2Item* pReplyItemAttr = pReplyItemAttrs->addItem();
+				pReplyItemAttr->addItem(CJ_ATTR_PRIORITY, "ATTRID");
+				pReplyItemAttr->addU1Item(controlJob.priority(), "ATTRDATA");
+			}
+
+			{
+				ISECS2Item* pReplyItemAttr = pReplyItemAttrs->addItem();
+				pReplyItemAttr->addItem(CJ_ATTR_PRJOBLIST, "ATTRID");
+				ISECS2Item* pItemPjs = pReplyItemAttr->addItem();
+				auto pjIds = controlJob.pjIds();
+				for (auto id : pjIds) {
+					pItemPjs->addItem(id.c_str(), "PRJOBID");
+				}
+			}
+		}
+		else {
+			auto issues = controlJob.issues();
+			for (auto i : issues) {
+				ISECS2Item* pItemError = pReplyItemErrs->addItem();
+				pItemError->addU4Item(i.code, "ERRCODE");
+				pItemError->addItem(i.text.c_str(), "ERRTEXT");
+			}
+		}
+	}
+
+
+	else {
+		ISECS2Item* pItemError = pReplyItemErrs->addItem();
+		pItemError->addU4Item(2001, "ERRCODE");
+		pItemError->addItem("涓嶆敮鎸佺殑OBJ", "ERRTEXT");
+	}
+
+
+	// 瀹屽杽鎶ユ枃骞跺洖澶�
+MYREPLY:
+	pReplyItemAck->setU1(bCreateOk ? 0 : 1, "OBJACK");
+	m_pPassive->sendMessage(pReply);
+	LOGI("<HSMS>[SECS Msg SEND]S14F10 (SysByte=%u)", pReply->getHeader()->systemBytes);
+	HSMS_Destroy1Message(pReply);
+
+
+	return 0;
+}
+
 // S16F15
 int CHsmsPassive::replyPRJobMultiCreate(IMessage* pRecv)
 {
@@ -1590,7 +1748,7 @@
 	ISECS2Item* pItemErrors = pMessage->getBody()->addItem();
 	bool bHasError = false;
 	for (auto p : pjs) {
-		if (p->issue().empty()) {
+		if (p->issues().empty()) {
 			pItemPrjobIds->addItem(p->id().c_str(), "PRJOBID");
 		}
 		else {
@@ -1601,10 +1759,10 @@
 		pItemErrors->addBoolItem(false, "ACKA");
 		ISECS2Item* pItemErrors2 = pItemErrors->addItem();
 		for (auto p : pjs) {
-			if (!p->issue().empty()) {
+			if (!p->issues().empty()) {
 				ISECS2Item* pItemErr = pItemErrors2->addItem();
-				pItemErr->addU4Item(p->issue()[0].code, "ERRCODE");
-				pItemErr->addItem(("<" + p->id() + ">" + p->issue()[0].text).c_str(), "ERRTEXT");
+				pItemErr->addU4Item(p->issues()[0].code, "ERRCODE");
+				pItemErr->addItem(("<" + p->id() + ">" + p->issues()[0].text).c_str(), "ERRTEXT");
 			}
 		}
 	}
@@ -1615,7 +1773,7 @@
 
 	// 閲婃斁鏈夐棶棰�(鏈坊鍔犲埌master)鐨勫唴瀛�
 	for (auto p : pjs) {
-		if(!p->issue().empty()) delete p;
+		if(!p->issues().empty()) delete p;
 	}
 	pjs.clear();
 
@@ -1679,9 +1837,9 @@
 	pItemList2->addU4Item(pReport->getReportId(), "RPTID");
 	ISECS2Item* pItemList3 = pItemList2->addItem();
 
-	auto values = pReport->getVariables();
-	for (auto item : values) {
-		pItemList3->addItem(item->getValue().c_str(), "V");
+	auto vars = pReport->getVariables();
+	for (auto var : vars) {
+		addVariableValueToItem(pItemList3, var);
 	}
 	pAction->setSendMessage(pMessage);
 	if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
@@ -1716,6 +1874,55 @@
 	return requestEventReportSend("CarrierID_Readed");
 }
 
+int CHsmsPassive::requestEventReportSend_Port_Unload_Ready()
+{
+	return requestEventReportSend("Port_Unload_Ready");
+}
+
+int CHsmsPassive::requestEventReportSend_Port_Load_Ready()
+{
+	return requestEventReportSend("Port_Load_Ready");
+}
+
+int CHsmsPassive::requestEventReportSend_Port_Blocked()
+{
+	return requestEventReportSend("Port_Blocked");
+}
+
+int CHsmsPassive::requestEventReportSend_PJ_Queued()
+{
+	return requestEventReportSend("PJ_Queued");
+}
+
+int CHsmsPassive::requestEventReportSend_PJ_Start()
+{
+	return requestEventReportSend("PJ_Start");
+}
+
+int CHsmsPassive::requestEventReportSend_PJ_End()
+{
+	return requestEventReportSend("PJ_End");
+}
+
+int CHsmsPassive::requestEventReportSend_CJ_Start()
+{
+	return requestEventReportSend("CJ_Start");
+}
+
+int CHsmsPassive::requestEventReportSend_CJ_End()
+{
+	return requestEventReportSend("CJ_End");
+}
+
+int CHsmsPassive::requestEventReportSend_Panel_Start()
+{
+	return requestEventReportSend("Panel_Start");
+}
+
+int CHsmsPassive::requestEventReportSend_Panel_End()
+{
+	return requestEventReportSend("Panel_End");
+}
 
 
 

--
Gitblit v1.9.3