From 829fe6c6bc33d53fda9c31fd45a37e1df87befff Mon Sep 17 00:00:00 2001
From: mrDarker <mr.darker@163.com>
Date: 星期五, 30 一月 2026 11:16:24 +0800
Subject: [PATCH] Merge branch 'clh' into liuyang
---
SourceCode/Bond/Servo/HsmsPassive.cpp | 1051 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 981 insertions(+), 70 deletions(-)
diff --git a/SourceCode/Bond/Servo/HsmsPassive.cpp b/SourceCode/Bond/Servo/HsmsPassive.cpp
index 20ae2db..98d6a85 100644
--- a/SourceCode/Bond/Servo/HsmsPassive.cpp
+++ b/SourceCode/Bond/Servo/HsmsPassive.cpp
@@ -3,6 +3,7 @@
#include "Log.h"
#include "Model.h"
#include "Common.h"
+#include "RecipeManager.h"
#include <time.h>
#include <iostream>
#include <time.h>
@@ -11,6 +12,48 @@
#include <algorithm>
#include <set>
#include <regex>
+#include <sstream>
+
+// ---- Encoding helpers ----
+static bool hasUtf8Bom(const std::string& s)
+{
+ return s.size() >= 3 &&
+ static_cast<unsigned char>(s[0]) == 0xEF &&
+ static_cast<unsigned char>(s[1]) == 0xBB &&
+ static_cast<unsigned char>(s[2]) == 0xBF;
+}
+
+static bool isLikelyUtf8(const std::string& s)
+{
+ // Simple heuristic: try to convert; if success without errors, treat as UTF-8.
+ int wlen = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, s.c_str(), (int)s.size(), nullptr, 0);
+ return wlen > 0;
+}
+
+static CStringW Utf8ToWide(const char* psz)
+{
+ if (psz == nullptr) return L"";
+ int wlen = MultiByteToWideChar(CP_UTF8, 0, psz, -1, nullptr, 0);
+ if (wlen <= 0) return L"";
+ CStringW ws;
+ LPWSTR buf = ws.GetBufferSetLength(wlen - 1);
+ MultiByteToWideChar(CP_UTF8, 0, psz, -1, buf, wlen);
+ ws.ReleaseBuffer();
+ return ws;
+}
+
+static CStringW AnsiToWide(const char* psz)
+{
+ if (psz == nullptr) return L"";
+ int wlen = MultiByteToWideChar(CP_ACP, 0, psz, -1, nullptr, 0);
+ if (wlen <= 0) return L"";
+ CStringW ws;
+ LPWSTR buf = ws.GetBufferSetLength(wlen - 1);
+ MultiByteToWideChar(CP_ACP, 0, psz, -1, buf, wlen);
+ ws.ReleaseBuffer();
+ return ws;
+}
+// ---- End helpers ----
// ControlState values (keep in sync with Model::ControlState / VariableList.txt)
static constexpr uint8_t kControlStateOnlineRemote = 5;
@@ -19,6 +62,19 @@
const char ACK[2] = {0, 1};
const char* ACK0 = &ACK[0];
const char* ACK1 = &ACK[1];
+
+// Log SECS-II message briefly to avoid huge strings causing issues.
+static void LogSecsMessageBrief(const char* tag, IMessage* pMessage, size_t maxLen = 1024)
+{
+ if (pMessage == nullptr) return;
+ const char* msgStr = pMessage->toString();
+ if (msgStr == nullptr) return;
+ std::string buf(msgStr);
+ if (buf.size() > maxLen) {
+ buf = buf.substr(0, maxLen) + "...<truncated>";
+ }
+ LOGI("%s%s", tag, buf.c_str());
+}
unsigned __stdcall CimWorkThreadFunction(LPVOID lpParam)
{
@@ -51,8 +107,6 @@
m_listener.onEQOffLine = nullptr;
m_listener.onEQOnLine = nullptr;
m_listener.onCommand = nullptr;
- m_listener.onEQConstantRequest = nullptr;
- m_listener.onEQConstantSend = nullptr;
m_pActiveAction = nullptr;
InitializeCriticalSection(&m_criticalSection);
}
@@ -202,6 +256,9 @@
SERVO::CReport* pReport = new SERVO::CReport(RPTID, vids);
for (auto vid : vids) {
SERVO::CVariable* pVariable = getVariable(vid);
+ if (pVariable == nullptr) {
+ pVariable = getDataVariable(vid);
+ }
if (pVariable != nullptr) {
pReport->addVariable(pVariable);
LOGI("<CHsmsPassive>defineReport RPTID=%d", RPTID);
@@ -409,15 +466,222 @@
return 0;
}
+int CHsmsPassive::loadDataVarialbles(const char* pszFilepath)
+{
+ if (pszFilepath == NULL) {
+ return -1;
+ }
+ m_strDataVariableFilepath = pszFilepath;
+ m_bDataVariableUtf8 = false;
+ m_bDataVariableUtf8Bom = false;
+ CFile file;
+ if (!file.Open(pszFilepath, CFile::modeRead | CFile::shareDenyNone)) {
+ return -1;
+ }
+ const ULONGLONG nLen = file.GetLength();
+ if (nLen == 0) {
+ return -1;
+ }
+ std::string buffer;
+ buffer.resize(static_cast<size_t>(nLen));
+ file.Read(buffer.data(), static_cast<UINT>(nLen));
+ file.Close();
+
+ if (hasUtf8Bom(buffer)) {
+ m_bDataVariableUtf8 = true;
+ m_bDataVariableUtf8Bom = true;
+ buffer = buffer.substr(3);
+ }
+ else if (isLikelyUtf8(buffer)) {
+ m_bDataVariableUtf8 = true;
+ }
+ CStringW content = m_bDataVariableUtf8 ? Utf8ToWide(buffer.c_str()) : AnsiToWide(buffer.c_str());
+
+ // Regex: DVID,DV Name,DV Format,DV Remark
+ std::wregex pattern(L"^\\d+,[^,]*,[^,]*,.*");
+ std::vector<SERVO::CDataVariable*> dataVars;
+ int index;
+ CStringW strLine, strId, strName, strFormat, strRemark;
+ std::wstringstream ss(content.GetString());
+ auto narrowFromW = [](const CStringW& s) -> std::string {
+ int need = WideCharToMultiByte(CP_ACP, 0, s, -1, nullptr, 0, nullptr, nullptr);
+ if (need <= 0) return {};
+ std::string out(static_cast<size_t>(need - 1), '\0');
+ WideCharToMultiByte(CP_ACP, 0, s, -1, out.data(), need, nullptr, nullptr);
+ return out;
+ };
+ std::wstring line;
+ while (std::getline(ss, line, L'\n')) {
+ strLine = line.c_str();
+ strLine.Trim();
+ if (strLine.IsEmpty()) continue;
+ if (!std::regex_match(static_cast<LPCWSTR>(strLine), pattern)) {
+ continue;
+ }
+ index = strLine.Find(L",", 0);
+ if (index < 0) continue;
+ strId = strLine.Left(index);
+
+ strLine = strLine.Right(strLine.GetLength() - index - 1);
+ index = strLine.Find(L",", 0);
+ if (index < 0) continue;
+ strName = strLine.Left(index);
+
+ strLine = strLine.Right(strLine.GetLength() - index - 1);
+ index = strLine.Find(L",", 0);
+ if (index < 0) continue;
+ strFormat = strLine.Left(index);
+
+ strRemark = strLine.Right(strLine.GetLength() - index - 1);
+ strRemark.Replace(L"\\r\\n", L"\r\n");
+
+ std::string sId = narrowFromW(strId);
+ std::string sName = narrowFromW(strName);
+ std::string sFormat = narrowFromW(strFormat);
+ std::string sRemark = narrowFromW(strRemark);
+
+ SERVO::CDataVariable* pVarialble = new SERVO::CDataVariable(
+ sId.c_str(),
+ sName.c_str(),
+ sFormat.c_str(),
+ sRemark.c_str());
+ dataVars.push_back(pVarialble);
+ }
+
+ if (!dataVars.empty()) {
+ clearAllDataVariabel();
+ for (auto item : dataVars) {
+ m_dataVariabels.push_back(item);
+ }
+ }
+
+ return 0;
+}
+
+int CHsmsPassive::loadEquipmentConstants(const char* pszFilepath)
+{
+ if (pszFilepath == NULL) return -1;
+ m_strEquipmentConstantFilepath = pszFilepath;
+ m_bEquipmentConstantUtf8 = false;
+ m_bEquipmentConstantUtf8Bom = false;
+
+ CFile file;
+ if (!file.Open(pszFilepath, CFile::modeRead | CFile::shareDenyNone)) {
+ return -1;
+ }
+ const ULONGLONG nLen = file.GetLength();
+ if (nLen == 0) {
+ return -1;
+ }
+ std::string buffer;
+ buffer.resize(static_cast<size_t>(nLen));
+ file.Read(buffer.data(), static_cast<UINT>(nLen));
+ file.Close();
+
+ if (hasUtf8Bom(buffer)) {
+ m_bEquipmentConstantUtf8 = true;
+ m_bEquipmentConstantUtf8Bom = true;
+ buffer = buffer.substr(3);
+ }
+ else if (isLikelyUtf8(buffer)) {
+ m_bEquipmentConstantUtf8 = true;
+ }
+ CStringW content = m_bEquipmentConstantUtf8 ? Utf8ToWide(buffer.c_str()) : AnsiToWide(buffer.c_str());
+ if (content.IsEmpty()) return -1;
+
+ std::wregex pattern(L"^\\d+,[^,]*,[^,]*,([^,]*),.*");
+ std::vector<EquipmentConstantEntry> constants;
+ CStringW strLine, strId, strName, strFormat, strRemark, strDefault;
+ std::wstringstream ss(content.GetString());
+ auto narrowFromW = [](const CStringW& s) -> std::string {
+ int need = WideCharToMultiByte(CP_ACP, 0, s, -1, nullptr, 0, nullptr, nullptr);
+ if (need <= 0) return {};
+ std::string out(static_cast<size_t>(need - 1), '\0');
+ WideCharToMultiByte(CP_ACP, 0, s, -1, out.data(), need, nullptr, nullptr);
+ return out;
+ };
+ std::wstring line;
+ while (std::getline(ss, line, L'\n')) {
+ strLine = line.c_str();
+ strLine.Trim();
+ if (strLine.IsEmpty()) continue;
+ if (strLine.Find(L"ECID") == 0) continue; // skip header
+ if (!std::regex_match(static_cast<LPCWSTR>(strLine), pattern)) {
+ continue;
+ }
+ int last = 0;
+ int idx = strLine.Find(L",", last);
+ if (idx < 0) continue;
+ strId = strLine.Left(idx);
+ last = idx + 1;
+
+ idx = strLine.Find(L",", last);
+ if (idx < 0) continue;
+ strName = strLine.Mid(last, idx - last);
+ last = idx + 1;
+
+ idx = strLine.Find(L",", last);
+ if (idx < 0) continue;
+ strFormat = strLine.Mid(last, idx - last);
+ last = idx + 1;
+
+ idx = strLine.Find(L",", last);
+ if (idx < 0) continue;
+ strRemark = strLine.Mid(last, idx - last);
+ last = idx + 1;
+
+ strDefault = strLine.Right(strLine.GetLength() - last);
+
+ EquipmentConstantEntry entry;
+ entry.id = _wtoi(strId);
+ entry.name = narrowFromW(strName);
+ entry.format = narrowFromW(strFormat);
+ entry.remark = narrowFromW(strRemark);
+ entry.value = narrowFromW(strDefault);
+ constants.push_back(entry);
+ }
+
+ if (!constants.empty()) {
+ m_equipmentConstants = std::move(constants);
+ }
+ return 0;
+}
+
std::vector<SERVO::CVariable*>& CHsmsPassive::getVariables()
{
return m_variabels;
+}
+
+std::vector<SERVO::CDataVariable*>& CHsmsPassive::getDataVariables()
+{
+ return m_dataVariabels;
}
unsigned int CHsmsPassive::getMaxVariableId() const
{
unsigned int maxId = 0;
for (auto item : m_variabels) {
+ if (item && item->getVarialbleId() > maxId) {
+ maxId = item->getVarialbleId();
+ }
+ }
+ for (auto item : m_dataVariabels) {
+ if (item && item->getVarialbleId() > maxId) {
+ maxId = item->getVarialbleId();
+ }
+ }
+ return maxId;
+}
+
+unsigned int CHsmsPassive::getMaxDataVariableId() const
+{
+ unsigned int maxId = 0;
+ for (auto item : m_variabels) {
+ if (item && item->getVarialbleId() > maxId) {
+ maxId = item->getVarialbleId();
+ }
+ }
+ for (auto item : m_dataVariabels) {
if (item && item->getVarialbleId() > maxId) {
maxId = item->getVarialbleId();
}
@@ -443,7 +707,30 @@
return item;
}
}
+ // try numeric id string
+ if (pszName != nullptr && *pszName) {
+ const int id = atoi(pszName);
+ if (id > 0) {
+ return getVariable(id);
+ }
+ }
+ return nullptr;
+}
+
+SERVO::CDataVariable* CHsmsPassive::getDataVariable(int dvid)
+{
+ for (auto item : m_dataVariabels) {
+ if (item->getVarialbleId() == (unsigned int)dvid) return item;
+ }
+ return nullptr;
+}
+
+SERVO::CDataVariable* CHsmsPassive::getDataVariable(const char* pszName)
+{
+ for (auto item : m_dataVariabels) {
+ if (item->getName().compare(pszName) == 0) return item;
+ }
return nullptr;
}
@@ -468,6 +755,14 @@
delete item;
}
m_variabels.clear();
+}
+
+void CHsmsPassive::clearAllDataVariabel()
+{
+ for (auto item : m_dataVariabels) {
+ delete item;
+ }
+ m_dataVariabels.clear();
}
CStringA WideToUtf8(const CStringW& ws)
@@ -530,6 +825,9 @@
if (auto v = getVariable(pszName)) {
v->setValue(value);
}
+ else if (auto dv = getDataVariable(pszName)) {
+ dv->setValue(value);
+ }
Unlock();
}
@@ -539,6 +837,9 @@
if (auto v = getVariable(pszName)) {
v->setValue(value);
}
+ else if (auto dv = getDataVariable(pszName)) {
+ dv->setValue(value);
+ }
Unlock();
}
@@ -547,6 +848,9 @@
Lock();
if (auto v = getVariable(pszName)) {
v->setValue(vars);
+ }
+ else if (auto dv = getDataVariable(pszName)) {
+ dv->setValue(vars);
}
Unlock();
}
@@ -574,8 +878,8 @@
Lock();
int maxId = 0;
for (auto v : m_variabels) {
- if (v != nullptr && v->getVarialbleId() > maxId) {
- maxId = v->getVarialbleId();
+ if (v != nullptr && static_cast<int>(v->getVarialbleId()) > maxId) {
+ maxId = static_cast<int>(v->getVarialbleId());
}
}
outId = maxId + 1;
@@ -612,6 +916,75 @@
if (filepath.empty()) return -3;
return writeVariablesToFile(filepath);
+}
+
+int CHsmsPassive::deleteDataVariable(int dvid)
+{
+ Lock();
+ auto it = std::find_if(m_dataVariabels.begin(), m_dataVariabels.end(), [=](SERVO::CDataVariable* v) {
+ return v != nullptr && v->getVarialbleId() == (unsigned int)dvid;
+ });
+ if (it == m_dataVariabels.end()) {
+ Unlock();
+ return -1;
+ }
+ delete *it;
+ m_dataVariabels.erase(it);
+ auto filepath = m_strDataVariableFilepath;
+ Unlock();
+
+ if (filepath.empty()) return -2;
+ return writeDataVariablesToFile(filepath);
+}
+
+int CHsmsPassive::addDataVariable(const char* pszName, const char* pszFormat, const char* pszRemark, int& outId)
+{
+ if (pszName == nullptr || pszFormat == nullptr) return -1;
+ std::string fmt = pszFormat;
+ std::transform(fmt.begin(), fmt.end(), fmt.begin(), ::toupper);
+ if (!isValidFormat(fmt)) return -2;
+
+ Lock();
+ int maxId = 0;
+ for (auto v : m_dataVariabels) {
+ if (v != nullptr && static_cast<int>(v->getVarialbleId()) > maxId) {
+ maxId = static_cast<int>(v->getVarialbleId());
+ }
+ }
+ outId = maxId + 1;
+
+ SERVO::CDataVariable* pNew = new SERVO::CDataVariable(std::to_string(outId).c_str(), pszName, fmt.c_str(), pszRemark ? pszRemark : "");
+ m_dataVariabels.push_back(pNew);
+ auto filepath = m_strDataVariableFilepath;
+ Unlock();
+
+ if (filepath.empty()) return -3;
+ return writeDataVariablesToFile(filepath);
+}
+
+int CHsmsPassive::updateDataVariable(int dvid, const char* pszName, const char* pszFormat, const char* pszRemark)
+{
+ if (pszName == nullptr || pszFormat == nullptr) return -1;
+ std::string fmt = pszFormat;
+ std::transform(fmt.begin(), fmt.end(), fmt.begin(), ::toupper);
+ if (!isValidFormat(fmt)) return -2;
+
+ Lock();
+ auto it = std::find_if(m_dataVariabels.begin(), m_dataVariabels.end(), [=](SERVO::CDataVariable* v) {
+ return v != nullptr && v->getVarialbleId() == (unsigned int)dvid;
+ });
+ if (it == m_dataVariabels.end()) {
+ Unlock();
+ return -4;
+ }
+ (*it)->setName(pszName);
+ (*it)->setFormat(fmt.c_str());
+ (*it)->setRemark(pszRemark ? pszRemark : "");
+ auto filepath = m_strDataVariableFilepath;
+ Unlock();
+
+ if (filepath.empty()) return -3;
+ return writeDataVariablesToFile(filepath);
}
int CHsmsPassive::writeVariablesToFile(const std::string& filepath)
@@ -660,6 +1033,53 @@
}
file.Close();
+ return 0;
+}
+
+int CHsmsPassive::writeDataVariablesToFile(const std::string& filepath)
+{
+ if (filepath.empty()) return -3;
+
+ CFile file;
+ if (!file.Open(filepath.c_str(), CFile::modeCreate | CFile::modeWrite | CFile::shareDenyNone)) {
+ return -3;
+ }
+
+ const std::string headerAnsi = "DVID,DV Name,DV Format,DV Remark\r\n";
+ if (m_bDataVariableUtf8) {
+ if (m_bDataVariableUtf8Bom) {
+ const BYTE bom[3] = { 0xEF, 0xBB, 0xBF };
+ file.Write(bom, 3);
+ }
+ CStringA header = AnsiToUtf8(headerAnsi);
+ file.Write(header.GetString(), header.GetLength());
+ }
+ else {
+ file.Write(headerAnsi.data(), (UINT)headerAnsi.size());
+ }
+
+ for (auto v : m_dataVariabels) {
+ if (v == nullptr) continue;
+ std::string lineAnsi;
+ lineAnsi.reserve(256);
+ lineAnsi += std::to_string(v->getVarialbleId());
+ lineAnsi.push_back(',');
+ lineAnsi += v->getName();
+ lineAnsi.push_back(',');
+ lineAnsi += SERVO::CVariable::formatToString(v->getFormat());
+ lineAnsi.push_back(',');
+ lineAnsi += v->getRemark();
+ lineAnsi.append("\r\n");
+
+ if (m_bDataVariableUtf8) {
+ CStringA outLine = AnsiToUtf8(lineAnsi);
+ file.Write(outLine.GetString(), outLine.GetLength());
+ }
+ else {
+ file.Write(lineAnsi.data(), (UINT)lineAnsi.size());
+ }
+ }
+ file.Close();
return 0;
}
@@ -775,6 +1195,9 @@
SERVO::CReport* pReport = new SERVO::CReport(_wtoi(strId), vids);
for (auto vid : vids) {
SERVO::CVariable* pVariable = getVariable(vid);
+ if (pVariable == nullptr) {
+ pVariable = getDataVariable(vid);
+ }
if (pVariable != nullptr) {
pReport->addVariable(pVariable);
}
@@ -853,6 +1276,9 @@
SERVO::CReport* pReport = new SERVO::CReport(rptid, vids);
for (auto vid : vids) {
SERVO::CVariable* pVariable = getVariable((int)vid);
+ if (pVariable == nullptr) {
+ pVariable = getDataVariable((int)vid);
+ }
if (pVariable != nullptr) {
pReport->addVariable(pVariable);
}
@@ -869,6 +1295,9 @@
SERVO::CReport* pReport = new SERVO::CReport(rptid, vids);
for (auto vid : vids) {
SERVO::CVariable* pVariable = getVariable((int)vid);
+ if (pVariable == nullptr) {
+ pVariable = getDataVariable((int)vid);
+ }
if (pVariable != nullptr) {
pReport->addVariable(pVariable);
}
@@ -1298,13 +1727,22 @@
HEADER* pHeader = pMessage->getHeader();
int nStream = (pHeader->stream & 0x7F);
- LOGI("<HSMS>[Received]%s", pMessage->toString());
+ LogSecsMessageBrief("<HSMS>[Received]", pMessage);
if (nStream == 1 && pHeader->function == 1) {
// S1F1
replyAreYouThere(pMessage);
}
else if (nStream == 1 && pHeader->function == 3) {
replySelectedEquipmentStatusData(pMessage);
+ }
+ else if (nStream == 1 && pHeader->function == 11) {
+ replyStatusVariableNamelistRequest(pMessage);
+ }
+ else if (nStream == 1 && pHeader->function == 21) {
+ replyDataVariableNamelistRequest(pMessage);
+ }
+ else if (nStream == 1 && pHeader->function == 23) {
+ replyCollectionEventNamelistRequest(pMessage);
}
else if (nStream == 1 && pHeader->function == 13) {
replyEstablishCommunications(pMessage);
@@ -1351,6 +1789,12 @@
else if (nStream == 7 && pHeader->function == 19) {
replyQueryPPIDList(pMessage);
}
+ else if (nStream == 7 && pHeader->function == 17) {
+ replyDeletePPID(pMessage);
+ }
+ else if (nStream == 7 && pHeader->function == 5) {
+ replyProcessProgramRequest(pMessage);
+ }
else if (nStream == 10 && pHeader->function == 3) {
replyTerminalDisplay(pMessage);
}
@@ -1390,7 +1834,12 @@
return -1;
}
- int nBufSize = file.GetLength();
+ ULONGLONG len = file.GetLength();
+ if (len > INT_MAX) {
+ file.Close();
+ return -1;
+ }
+ int nBufSize = static_cast<int>(len);
char* pszBuffer = new char[nBufSize];
file.Read(pszBuffer, nBufSize);
file.Close();
@@ -1460,7 +1909,16 @@
if (pszBuffer == nullptr) {
index += sizeof(int);
for (auto item : m_listActionSpooling) {
- index += item->serialize(pszBuffer, nBufferSize);
+ if (item == nullptr || item->getSendMessage() == nullptr) {
+ LOGE("<HSMS>skip spooling item: null send message");
+ continue;
+ }
+ int nRet = item->serialize(nullptr, 0);
+ if (nRet <= 0) {
+ LOGE("<HSMS>skip spooling item: serialize failed");
+ continue;
+ }
+ index += nRet;
}
index += calcSpoolCfgSize();
@@ -1468,15 +1926,31 @@
return index;
}
else {
- int nTemp, nRet;
+ int nTemp = 0;
+ int nRet = 0;
- nTemp = (int)m_listActionSpooling.size();
+ for (auto item : m_listActionSpooling) {
+ if (item == nullptr || item->getSendMessage() == nullptr) {
+ continue;
+ }
+ if (item->serialize(nullptr, 0) > 0) {
+ ++nTemp;
+ }
+ }
+
memcpy(&pszBuffer[index], &nTemp, sizeof(int));
index += sizeof(int);
for (auto item : m_listActionSpooling) {
+ if (item == nullptr || item->getSendMessage() == nullptr) {
+ LOGE("<HSMS>skip spooling item: null send message");
+ continue;
+ }
nRet = item->serialize(&pszBuffer[index], nBufferSize);
- if (nRet <= 0) break;
+ if (nRet <= 0) {
+ LOGE("<HSMS>skip spooling item: serialize failed");
+ continue;
+ }
index += nRet;
}
@@ -1522,7 +1996,10 @@
for (int i = 0; i < nTemp; i++) {
CHsmsAction* pAction = new CHsmsAction();
nRet = pAction->unserialize(&pszBuffer[index], nBufferSize - index);
- if (nRet <= 0) break;
+ if (nRet <= 0 || pAction->getSendMessage() == nullptr) {
+ delete pAction;
+ break;
+ }
index += nRet;
m_listActionSpooling.push_back(pAction);
}
@@ -1603,6 +2080,11 @@
Unlock();
if (!selected) {
IMessage* pMsg = pAction->getSendMessage();
+ if (pMsg == NULL) {
+ LOGE("<HSMS>spooling drop: null send message");
+ delete pAction;
+ continue;
+ }
uint8_t streamId = 0;
uint8_t functionId = 0;
if (pMsg && pMsg->getHeader()) {
@@ -1624,15 +2106,20 @@
if (pAction->isNeedWaitReply()) {
// 濡傛灉闇�瑕佺瓑寰呭洖澶�
+ IMessage* pMessage = pAction->getSendMessage();
+ if (pMessage == NULL) {
+ LOGE("<HSMS>drop action: null send message");
+ delete pAction;
+ continue;
+ }
Lock();
m_pActiveAction = pAction;
- IMessage* pMessage = pAction->getSendMessage();
Unlock();
ASSERT(pMessage);
m_pPassive->sendMessage(pMessage);
LOGI("<HSMS>[SEND]SysByte=%u sessionId:%d", pMessage->getHeader()->systemBytes, pMessage->getHeader()->sessionId);
- LOGI("<HSMS>[SEND]%s", pMessage->toString());
+ LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
int nRet = WaitForSingleObject(pAction->getEvent(), pAction->getTimeout() * 1000);
if (nRet == WAIT_TIMEOUT) {
@@ -1650,15 +2137,20 @@
Unlock();
}
else {
+ IMessage* pMessage = pAction->getSendMessage();
+ if (pMessage == NULL) {
+ LOGE("<HSMS>drop action: null send message");
+ delete pAction;
+ continue;
+ }
Lock();
m_listActionSent.push_back(pAction);
- IMessage* pMessage = pAction->getSendMessage();
Unlock();
ASSERT(pMessage);
m_pPassive->sendMessage(pMessage);
LOGI("<HSMS>[SEND]SysByte=%u sessionId:%d", pMessage->getHeader()->systemBytes, pMessage->getHeader()->sessionId);
- LOGI("<HSMS>[SEND]%s", pMessage->toString());
+ LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
}
}
@@ -1682,7 +2174,7 @@
m_pPassive->sendMessage(pMessage);
LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
- LOGI("<HSMS>[SEND]%s", pMessage->toString());
+ LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
HSMS_Destroy1Message(pMessage);
}
@@ -1695,11 +2187,15 @@
Lock();
CHsmsAction* pAction = new CHsmsAction(ACTION_HELLO, FALSE, m_nActionTimeout);
- m_listAction.push_back(pAction);
IMessage* pMessage = NULL;
- HSMS_Create1Message(pMessage, m_nSessionId, 1 | REPLY, 1, ++m_nSystemByte);
- ASSERT(pMessage);
+ if (HSMS_Create1Message(pMessage, m_nSessionId, 1 | REPLY, 1, ++m_nSystemByte) != 0 || pMessage == NULL) {
+ LOGE("<HSMS>S1F1 create message failed");
+ delete pAction;
+ Unlock();
+ return ER_CREATED_MESSAGE;
+ }
pAction->setSendMessage(pMessage);
+ m_listAction.push_back(pAction);
SetEvent(m_hCimWorkEvent);
Unlock();
@@ -1725,7 +2221,7 @@
m_pPassive->sendMessage(pMessage);
LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
- LOGI("<HSMS>[SEND]%s", pMessage->toString());
+ LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
HSMS_Destroy1Message(pMessage);
return 0;
@@ -1788,7 +2284,7 @@
m_pPassive->sendMessage(pMessage);
LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
- LOGI("<HSMS>[SEND]%s", pMessage->toString());
+ LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
HSMS_Destroy1Message(pMessage);
return 0;
@@ -1835,12 +2331,271 @@
m_pPassive->sendMessage(pMessage);
LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
- LOGI("<HSMS>[SEND]%s", pMessage->toString());
+ LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
HSMS_Destroy1Message(pMessage);
return 0;
+}
+
+// S1F11
+int CHsmsPassive::replyStatusVariableNamelistRequest(IMessage* pRecv)
+{
+ if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
+ return ER_NOTSELECT;
+ }
+
+ std::vector<unsigned short> reqIds;
+ ISECS2Item* pBody = pRecv->getBody();
+ if (pBody != nullptr && pBody->getType() == SITYPE::L) {
+ const int sz = pBody->getSubItemSize();
+ for (int i = 0; i < sz; ++i) {
+ unsigned short id = 0;
+ if (pBody->getSubItemU2(i, id)) {
+ reqIds.push_back(id);
+ }
+ }
+ }
+
+ // Build response list items: {L:3 SVID, SVNAME, UNITS}
+ std::vector<unsigned short> svids;
+ std::set<unsigned short> requested(reqIds.begin(), reqIds.end());
+ Lock();
+ if (reqIds.empty()) {
+ for (auto v : m_variabels) {
+ svids.push_back(static_cast<unsigned short>(v->getVarialbleId()));
+ }
+ }
+ else {
+ // include requested IDs (existing + unknown marker)
+ for (auto id : requested) {
+ svids.push_back(id);
+ }
+ }
+ Unlock();
+
+ IMessage* pMessage = NULL;
+ HSMS_Create1Message(pMessage, m_nSessionId, 1, 12, pRecv->getHeader()->systemBytes);
+ ASSERT(pMessage);
+
+ ISECS2Item* pList = pMessage->getBody(); // Body is L[n] of {SVID, SVNAME, UNITS}
+ for (auto id : svids) {
+ ISECS2Item* pEntry = pList->addItem();
+ pEntry->addU2Item(id, "SVID");
+ SERVO::CVariable* v = getVariable((int)id);
+ if (v != nullptr) {
+ pEntry->addItem(v->getName().c_str(), "SVNAME");
+ // Use remark as UNITS if provided; empty string if none.
+ pEntry->addItem(v->getRemark().c_str(), "UNITS");
+ }
+ else {
+ // Unknown SVID: A:0 for name/units
+ pEntry->addItem("", "SVNAME");
+ pEntry->addItem("", "UNITS");
+ }
+ }
+
+ m_pPassive->sendMessage(pMessage);
+ LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
+ pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
+ LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
+ HSMS_Destroy1Message(pMessage);
+
+ return ER_NOERROR;
+}
+
+int CHsmsPassive::writeEquipmentConstantsToFile(const std::string& filepath)
+{
+ if (filepath.empty()) return -1;
+ CFile file;
+ if (!file.Open(filepath.c_str(), CFile::modeCreate | CFile::modeWrite | CFile::shareDenyNone)) {
+ return -1;
+ }
+ const std::string headerAnsi = "ECID,EC Name,EC Format,EC Remark,Default Value\r\n";
+ if (m_bEquipmentConstantUtf8) {
+ if (m_bEquipmentConstantUtf8Bom) {
+ const BYTE bom[3] = { 0xEF, 0xBB, 0xBF };
+ file.Write(bom, 3);
+ }
+ CStringA header = AnsiToUtf8(headerAnsi);
+ file.Write(header.GetString(), header.GetLength());
+ }
+ else {
+ file.Write(headerAnsi.data(), (UINT)headerAnsi.size());
+ }
+ for (const auto& e : m_equipmentConstants) {
+ std::string line;
+ line.reserve(128);
+ line += std::to_string(e.id);
+ line.push_back(',');
+ line += e.name;
+ line.push_back(',');
+ line += e.format;
+ line.push_back(',');
+ line += e.remark;
+ line.push_back(',');
+ line += e.value;
+ line.append("\r\n");
+ if (m_bEquipmentConstantUtf8) {
+ CStringA out = AnsiToUtf8(line);
+ file.Write(out.GetString(), out.GetLength());
+ }
+ else {
+ file.Write(line.data(), (UINT)line.size());
+ }
+ }
+ file.Close();
+ return 0;
+}
+// S1F21/S1F22 - Data Variable Namelist
+int CHsmsPassive::replyDataVariableNamelistRequest(IMessage* pRecv)
+{
+ if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
+ return ER_NOTSELECT;
+ }
+
+ std::vector<unsigned short> reqIds;
+ ISECS2Item* pBody = pRecv->getBody();
+ if (pBody != nullptr && pBody->getType() == SITYPE::L) {
+ const int sz = pBody->getSubItemSize();
+ for (int i = 0; i < sz; ++i) {
+ unsigned short id = 0;
+ if (pBody->getSubItemU2(i, id)) {
+ reqIds.push_back(id);
+ }
+ }
+ }
+
+ std::vector<unsigned short> dvids;
+ std::set<unsigned short> requested(reqIds.begin(), reqIds.end());
+ Lock();
+ if (reqIds.empty()) {
+ for (auto v : m_dataVariabels) {
+ if (v) dvids.push_back(static_cast<unsigned short>(v->getVarialbleId()));
+ }
+ }
+ else {
+ for (auto id : requested) dvids.push_back(id);
+ }
+ Unlock();
+
+ IMessage* pMessage = NULL;
+ HSMS_Create1Message(pMessage, m_nSessionId, 1, 22, pRecv->getHeader()->systemBytes);
+ ASSERT(pMessage);
+
+ ISECS2Item* pList = pMessage->getBody(); // L[n] of {DVID, DVNAME, UNITS}
+ for (auto id : dvids) {
+ ISECS2Item* pEntry = pList->addItem();
+ pEntry->addU2Item(id, "DVID");
+ SERVO::CDataVariable* v = getDataVariable((int)id);
+ if (v != nullptr) {
+ pEntry->addItem(v->getName().c_str(), "DVNAME");
+ pEntry->addItem(v->getRemark().c_str(), "UNITS");
+ }
+ else {
+ pEntry->addItem("", "DVNAME");
+ pEntry->addItem("", "UNITS");
+ }
+ }
+
+ m_pPassive->sendMessage(pMessage);
+ LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
+ pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
+ LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
+ HSMS_Destroy1Message(pMessage);
+
+ return ER_NOERROR;
+}
+
+// S1F23
+int CHsmsPassive::replyCollectionEventNamelistRequest(IMessage* pRecv)
+{
+ if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
+ return ER_NOTSELECT;
+ }
+
+ std::vector<unsigned short> reqIds;
+ ISECS2Item* pBody = pRecv->getBody();
+ if (pBody != nullptr && pBody->getType() == SITYPE::L) {
+ const int sz = pBody->getSubItemSize();
+ for (int i = 0; i < sz; ++i) {
+ unsigned short id = 0;
+ if (pBody->getSubItemU2(i, id)) {
+ reqIds.push_back(id);
+ }
+ }
+ }
+
+ struct CEInfo {
+ unsigned short id{ 0 };
+ std::string name;
+ std::vector<unsigned short> vids;
+ };
+ std::vector<CEInfo> ceInfos;
+ {
+ Lock();
+ if (reqIds.empty()) {
+ for (auto e : m_collectionEvents) {
+ if (e == nullptr) continue;
+ CEInfo info;
+ info.id = static_cast<unsigned short>(e->getEventId());
+ info.name = e->getName();
+ std::set<unsigned short> vidSet;
+ for (auto rpt : e->getReports()) {
+ if (rpt == nullptr) continue;
+ for (auto vid : rpt->getVids()) {
+ vidSet.insert(static_cast<unsigned short>(vid));
+ }
+ }
+ info.vids.assign(vidSet.begin(), vidSet.end());
+ ceInfos.push_back(std::move(info));
+ }
+ }
+ else {
+ for (auto id : reqIds) {
+ CEInfo info;
+ info.id = id;
+ SERVO::CCollectionEvent* e = getEvent(id);
+ if (e != nullptr) {
+ info.name = e->getName();
+ std::set<unsigned short> vidSet;
+ for (auto rpt : e->getReports()) {
+ if (rpt == nullptr) continue;
+ for (auto vid : rpt->getVids()) {
+ vidSet.insert(static_cast<unsigned short>(vid));
+ }
+ }
+ info.vids.assign(vidSet.begin(), vidSet.end());
+ }
+ ceInfos.push_back(std::move(info));
+ }
+ }
+ Unlock();
+ }
+
+ IMessage* pMessage = NULL;
+ HSMS_Create1Message(pMessage, m_nSessionId, 1, 24, pRecv->getHeader()->systemBytes);
+ ASSERT(pMessage);
+
+ ISECS2Item* pList = pMessage->getBody(); // Body is L[n] of {CEID, CENAME, L[VIDs]}
+ for (const auto& info : ceInfos) {
+ ISECS2Item* pEntry = pList->addItem();
+ pEntry->addU2Item(info.id, "CEID");
+ pEntry->addItem(info.name.c_str(), "CENAME"); // empty if unknown
+ ISECS2Item* pVidList = pEntry->addItem();
+ for (auto vid : info.vids) {
+ pVidList->addU2Item(vid, "VID");
+ }
+ }
+
+ m_pPassive->sendMessage(pMessage);
+ LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
+ pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
+ LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
+ HSMS_Destroy1Message(pMessage);
+
+ return ER_NOERROR;
}
// S2F13
@@ -1851,32 +2606,42 @@
}
- // 瑕佽幏鍙栫殑甯搁噺琛ㄨ〃
- BOOL bCheckData = FALSE;
std::vector<EQConstant> eqcs;
{
ISECS2Item* pItem = pRecv->getBody();
- int ecidSize = pItem->getSubItemSize();
+ const int ecidSize = pItem ? pItem->getSubItemSize() : 0;
for (int i = 0; i < ecidSize; i++) {
- EQConstant eqc;
- unsigned short id;
- if (pItem->getSubItemU2(i, id)) {
+ EQConstant eqc{};
+ unsigned short id = 0;
+ if (pItem && pItem->getSubItemU2(i, id)) {
eqc.id = id;
eqcs.push_back(eqc);
}
}
}
-
-
- // 浜ょ敱涓婂眰搴旂敤鏉ヨ幏鍙栨満鍣ㄥ父閲忓��
- if (m_listener.onEQConstantRequest != nullptr) {
- m_listener.onEQConstantRequest(this, eqcs);
+ // 绌哄垪琛ㄨ〃绀鸿姹傚叏閮� ECID
+ if (eqcs.empty()) {
+ for (const auto& e : m_equipmentConstants) {
+ EQConstant eqc{};
+ eqc.id = e.id;
+ strcpy_s(eqc.szValue, EQCONSTANT_VALUE_MAX, e.value.c_str());
+ eqcs.push_back(eqc);
+ }
+ } else {
+ for (auto& item : eqcs) {
+ auto it = std::find_if(m_equipmentConstants.begin(), m_equipmentConstants.end(),
+ [&](const EquipmentConstantEntry& e) { return e.id == item.id; });
+ if (it != m_equipmentConstants.end()) {
+ strcpy_s(item.szValue, EQCONSTANT_VALUE_MAX, it->value.c_str());
+ } else {
+ item.szValue[0] = '\0'; // unknown -> empty
+ }
+ }
}
-
// 鍥炲
IMessage* pMessage = NULL;
- HSMS_Create1Message(pMessage, m_nSessionId, 1, 14, pRecv->getHeader()->systemBytes);
+ HSMS_Create1Message(pMessage, m_nSessionId, 2, 14, pRecv->getHeader()->systemBytes);
ASSERT(pMessage);
ISECS2Item* pItem = pMessage->getBody();
for (auto& item : eqcs) {
@@ -1886,7 +2651,7 @@
m_pPassive->sendMessage(pMessage);
LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
- LOGI("<HSMS>[SEND]%s", pMessage->toString());
+ LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
HSMS_Destroy1Message(pMessage);
return 0;
@@ -1900,33 +2665,38 @@
}
- // 瑕佽缃殑甯搁噺琛ㄨ〃
- BOOL bCheckData = FALSE;
+ // 瑕佽缃殑甯搁噺琛�
std::vector<EQConstant> eqcs;
{
ISECS2Item* pItem = pRecv->getBody();
- int ecidSize = pItem->getSubItemSize();
+ int ecidSize = pItem ? pItem->getSubItemSize() : 0;
for (int i = 0; i < ecidSize; i++) {
- ISECS2Item* pItemEqc = pItem->getSubItem(i);
- if (pItemEqc != nullptr) {
- EQConstant eqc;
- unsigned short eqcid;
- const char* pszValue;
- if (pItemEqc->getSubItemU2(0, eqcid)
- && pItemEqc->getSubItemString(1, pszValue)) {
- eqc.id = eqcid;
- strcpy_s(eqc.szValue, EQCONSTANT_VALUE_MAX, pszValue);
- eqcs.push_back(eqc);
- }
+ ISECS2Item* pItemEqc = pItem ? pItem->getSubItem(i) : nullptr;
+ if (pItemEqc == nullptr) continue;
+ EQConstant eqc{};
+ unsigned short eqcid = 0;
+ const char* pszValue = nullptr;
+ if (pItemEqc->getSubItemU2(0, eqcid)
+ && pItemEqc->getSubItemString(1, pszValue)) {
+ eqc.id = eqcid;
+ strcpy_s(eqc.szValue, EQCONSTANT_VALUE_MAX, pszValue);
+ eqcs.push_back(eqc);
}
}
}
-
- // 浜ょ敱涓婂眰搴旂敤鏉ヤ繚瀛樺拰璁剧疆鏈哄櫒甯搁噺鍊�
- std::vector<unsigned int> ecvs;
- if (m_listener.onEQConstantSend != nullptr) {
- m_listener.onEQConstantSend(this, eqcs);
+ // 鏇存柊鍐呭瓨琛ㄥ苟钀界洏
+ bool changed = false;
+ for (auto& item : eqcs) {
+ auto it = std::find_if(m_equipmentConstants.begin(), m_equipmentConstants.end(),
+ [&](const EquipmentConstantEntry& e) { return e.id == item.id; });
+ if (it != m_equipmentConstants.end()) {
+ it->value = item.szValue;
+ changed = true;
+ }
+ }
+ if (changed && !m_strEquipmentConstantFilepath.empty()) {
+ writeEquipmentConstantsToFile(m_strEquipmentConstantFilepath);
}
@@ -2287,7 +3057,7 @@
m_pPassive->sendMessage(pMessage);
LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
- LOGI("<HSMS>[SEND]%s", pMessage->toString());
+ LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
HSMS_Destroy1Message(pMessage);
return 0;
@@ -2369,6 +3139,86 @@
return 0;
}
+// S7F17 Delete Process Program (PPID list) / S7F18
+int CHsmsPassive::replyDeletePPID(IMessage* pRecv)
+{
+ if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
+ return ER_NOTSELECT;
+ }
+
+ bool allOk = true;
+ const bool deleteAll = (pRecv->getBody() == nullptr || pRecv->getBody()->getSubItemSize() == 0);
+ std::vector<std::string> ppids;
+ ISECS2Item* pBody = pRecv->getBody();
+ const int nCount = pBody ? pBody->getSubItemSize() : 0;
+ for (int i = 0; i < nCount; ++i) {
+ const char* pszPPID = nullptr;
+ if (pBody->getSubItemString(i, pszPPID) && pszPPID != nullptr) {
+ ppids.emplace_back(pszPPID);
+ }
+ else {
+ allOk = false;
+ }
+ }
+
+ if (deleteAll || !ppids.empty()) {
+ if (m_listener.onDeletePPID != nullptr) {
+ allOk = m_listener.onDeletePPID(this, ppids);
+ }
+ else {
+ // no handler provided; treat as failure
+ allOk = false;
+ LOGW("<HSMS>DeletePPID request ignored: no onDeletePPID listener");
+ }
+ }
+
+
+ replyAck(7, 18, pRecv->getHeader()->systemBytes, allOk ? BYTE(0) : BYTE(1), "ACKC7");
+ return 0;
+}
+
+// S7F5 Process Program Request -> reply S7F6 with PPID + PPBODY
+int CHsmsPassive::replyProcessProgramRequest(IMessage* pRecv)
+{
+ if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
+ return ER_NOTSELECT;
+ }
+ ISECS2Item* pBody = pRecv->getBody();
+ const char* pszPPID = nullptr;
+ if (pBody == nullptr || !pBody->getString(pszPPID) || pszPPID == nullptr) {
+ return ER_PARAM_ERROR;
+ }
+ std::string ppid(pszPPID);
+ std::string ppbody;
+ // 绠�鍗曡仛鍚堬細浠� RecipeManager 鍙栬澶囬厤鏂癸紝鎷兼垚鏂囨湰
+ auto recipeInfo = RecipeManager::getInstance().getRecipeByPPID(ppid);
+ if (!recipeInfo.strPPID.empty()) {
+ for (const auto& dev : recipeInfo.vecDeviceList) {
+ if (!ppbody.empty()) ppbody.append("\n");
+ ppbody.append(dev.strDeviceName);
+ ppbody.append(",");
+ ppbody.append(std::to_string(dev.nRecipeID));
+ ppbody.append(",");
+ ppbody.append(dev.strRecipeName);
+ // 闄勫姞鍙傛暟澶у皬淇℃伅锛堢洰鍓嶇己灏戝叿浣撳弬鏁板垪琛級
+ ppbody.append(",paramsSize=");
+ ppbody.append(std::to_string(dev.paramsRawData.size()));
+ }
+ }
+
+ IMessage* pMessage = nullptr;
+ if (HSMS_Create1Message(pMessage, m_nSessionId, 7, 6, pRecv->getHeader()->systemBytes) != 0 || pMessage == nullptr) {
+ return ER_CREATED_MESSAGE;
+ }
+ ISECS2Item* pRspBody = pMessage->getBody(); // top-level L:2
+ pRspBody->addItem(ppid.c_str(), "PPID");
+ pRspBody->addItem(ppbody.c_str(), "PPBODY");
+ m_pPassive->sendMessage(pMessage);
+ LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
+ HSMS_Destroy1Message(pMessage);
+ return 0;
+}
+
// S7F19
int CHsmsPassive::replyQueryPPIDList(IMessage* pRecv)
{
@@ -2392,7 +3242,7 @@
m_pPassive->sendMessage(pMessage);
LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
- LOGI("<HSMS>[SEND]%s", pMessage->toString());
+ LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
HSMS_Destroy1Message(pMessage);
return 0;
@@ -2565,7 +3415,7 @@
m_pPassive->sendMessage(pReply);
LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
pReply->getHeader()->sessionId, pReply->getHeader()->sType, pReply->getHeader()->systemBytes);
- LOGI("<HSMS>[SEND]%s", pReply->toString());
+ LogSecsMessageBrief("<HSMS>[SEND]", pReply);
HSMS_Destroy1Message(pReply);
@@ -2595,13 +3445,33 @@
m_pPassive->sendMessage(pMessage);
LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
- LOGI("<HSMS>[SEND]%s", pMessage->toString());
+ LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
HSMS_Destroy1Message(pMessage);
return 0;
}
// 瑙i噴鏁版嵁锛屽緱鍒癈ProcessJob
+ // 瀹归噺鍓嶇疆妫�鏌ワ細褰撳墠瀹炵幇浠呮敮鎸佸崟鎵� PJ 闆嗗悎锛屽鏋滃凡鏈� PJ/CJ锛岀洿鎺ヨ繑鍥� ACKA=false
+ if (m_pModel != nullptr && !m_pModel->getMaster().isProcessJobsEmpty()) {
+ IMessage* pMessage = NULL;
+ HSMS_Create1Message(pMessage, m_nSessionId, 16, 16, ++m_nSystemByte);
+ ASSERT(pMessage);
+ pMessage->getBody()->addItem(); // PRJOBID list 涓虹┖
+ ISECS2Item* pItemErrors = pMessage->getBody()->addItem();
+ pItemErrors->addBoolItem(false, "ACKA");
+ ISECS2Item* pItemErrors2 = pItemErrors->addItem();
+ auto err = pItemErrors2->addItem();
+ err->addU4Item(1000, "ERRCODE");
+ err->addItem("PJobSpace=0 (existing ProcessJob/ControlJob)", "ERRTEXT");
+ m_pPassive->sendMessage(pMessage);
+ LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
+ pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
+ LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
+ HSMS_Destroy1Message(pMessage);
+ return 0;
+ }
+
ISECS2Item* pItemPjs, * pItemPj,* pItemCarriers, * pItemCarrier, *pItemSlots, *pItemRecipes;
unsigned short DATAID;
const char* pszPrjobid, *pszMF, *pszCarrierId, *pszRecipeName;
@@ -2653,7 +3523,11 @@
}
- // 鍥炲鎶ユ枃
+ ASSERT(m_listener.onPRJobMultiCreate != nullptr);
+ int nRet = m_listener.onPRJobMultiCreate(this, pjs);
+
+
+ // 鍥炲鎶ユ枃锛堝湪鏍¢獙/钀藉簱鍚庡啀鍥炲锛屼互渚垮甫涓婄湡瀹炵殑 issues锛�
IMessage* pMessage = NULL;
HSMS_Create1Message(pMessage, m_nSessionId, 16, 16, ++m_nSystemByte);
ASSERT(pMessage);
@@ -2679,15 +3553,15 @@
}
}
}
+ else {
+ pItemErrors->addBoolItem(true, "ACKA");
+ pItemErrors->addItem(); // 绌哄垪琛�
+ }
m_pPassive->sendMessage(pMessage);
LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
- LOGI("<HSMS>[SEND]%s", pMessage->toString());
+ LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
HSMS_Destroy1Message(pMessage);
-
-
- ASSERT(m_listener.onPRJobMultiCreate != nullptr);
- int nRet = m_listener.onPRJobMultiCreate(this, pjs);
// 閲婃斁鏈夐棶棰�(鏈坊鍔犲埌master)鐨勫唴瀛�
@@ -2709,8 +3583,12 @@
CHsmsAction* pAction = new CHsmsAction(ACTION_ALARM_REPORT, TRUE, m_nActionTimeout);
IMessage* pMessage = NULL;
- HSMS_Create1Message(pMessage, m_nSessionId, 5 | REPLY, 1, ++m_nSystemByte);
- ASSERT(pMessage);
+ if (HSMS_Create1Message(pMessage, m_nSessionId, 5 | REPLY, 1, ++m_nSystemByte) != 0 || pMessage == NULL) {
+ LOGE("<HSMS>S5F1 create message failed");
+ delete pAction;
+ Unlock();
+ return ER_CREATED_MESSAGE;
+ }
ISECS2Item* pItem = pMessage->getBody();
pItem->addBinaryItem(szALCD, 1, "ALCD");
pItem->addU4Item(ALID, "ALID");
@@ -2742,6 +3620,10 @@
if (pEvent == nullptr) {
return ER_NO_EVENT;
}
+ // 瑙﹀彂 PauseEvent 妫�娴嬫々锛堢敱 Master 璐熻矗瀹為檯绛栫暐锛�
+ if (m_pModel != nullptr) {
+ m_pModel->getMaster().handleCollectionEvent(CEID);
+ }
SERVO::CReport* pReport = pEvent->getFirstReport();
@@ -2749,8 +3631,12 @@
Lock();
CHsmsAction* pAction = new CHsmsAction(ACTION_EVENT_REPORT, TRUE, m_nActionTimeout);
IMessage* pMessage = NULL;
- HSMS_Create1Message(pMessage, m_nSessionId, 6 | REPLY, 11, ++m_nSystemByte);
- ASSERT(pMessage);
+ if (HSMS_Create1Message(pMessage, m_nSessionId, 6 | REPLY, 11, ++m_nSystemByte) != 0 || pMessage == NULL) {
+ LOGE("<HSMS>S6F11 create message failed");
+ delete pAction;
+ Unlock();
+ return ER_CREATED_MESSAGE;
+ }
ISECS2Item* pItem = pMessage->getBody();
// pItem->addU2Item(++DATAID, "DATAID"); // 鏍规嵁鍒殑鏃ュ織鏄剧ずDATAID鎭掍负0锛屾墍浠ユ垜浠厛鐓т娇鐢�0
pItem->addU2Item(0, "DATAID");
@@ -2885,7 +3771,32 @@
int CHsmsPassive::requestEventReportSend_OCR_PanelID_Read_OK()
{
- return requestEventReportSend("OCR_PanelID_Read_OK");
+ return requestEventReportSend_OCR_PanelID_Read(1);
+}
+
+int CHsmsPassive::requestEventReportSend_OCR_PanelID_Read(short vcrResult)
+{
+ const char* eventName = "OCR_PanelID_Read_OK";
+ switch (vcrResult) {
+ case 1: // OK & Match
+ eventName = "OCR_PanelID_Read_OK";
+ break;
+ case 2: // OK & Mismatch
+ eventName = "OCR_PanelID_Read_Mismatch";
+ break;
+ case 3: // Fail & KeyIn Match
+ eventName = "OCR_PanelID_Read_NG";
+ break;
+ case 4: // Fail & KeyIn Mismatch
+ eventName = "OCR_PanelID_Read_NG_Mismatch";
+ break;
+ default:
+ LOGE("<CHsmsPassive>Unknown VCR result=%d, fallback to OCR_PanelID_Read_OK", vcrResult);
+ eventName = "OCR_PanelID_Read_OK";
+ break;
+ }
+
+ return requestEventReportSend(eventName);
}
int CHsmsPassive::requestEventReportSend_LoadPortNotAssoc()
--
Gitblit v1.9.3