chenluhua1980
2025-12-11 5e9b9b53a8a853365c29149871bd024c9ca0cbac
SourceCode/Bond/Servo/HsmsPassive.cpp
@@ -8,6 +8,8 @@
#include <time.h>  
#include <stdlib.h>  
#include <string.h>  
#include <algorithm>
#include <set>
#include <regex>
@@ -373,6 +375,17 @@
   return m_variabels;
}
unsigned int CHsmsPassive::getMaxVariableId() const
{
   unsigned int maxId = 0;
   for (auto item : m_variabels) {
      if (item && item->getVarialbleId() > maxId) {
         maxId = item->getVarialbleId();
      }
   }
   return maxId;
}
SERVO::CVariable* CHsmsPassive::getVariable(int variableId)
{
   for (auto item : m_variabels) {
@@ -453,7 +466,93 @@
   if (filepath.empty()) return -2;
   // 写回文件,保持原编码(UTF-8 或本地编码)
   return writeVariablesToFile(filepath);
}
void CHsmsPassive::setVariableValue(const char* pszName, __int64 value)
{
   auto v = getVariable(pszName);
   if (v != nullptr) {
      v->setValue(value);
   }
}
void CHsmsPassive::setVariableValue(const char* pszName, const char* value)
{
   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);
   }
}
static bool isValidFormat(const std::string& fmt)
{
   static const std::set<std::string> allow = { "U1","U2","I2","A20","A50","L" };
   return allow.count(fmt) > 0;
}
int CHsmsPassive::addVariable(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_variabels) {
      if (v != nullptr && v->getVarialbleId() > maxId) {
         maxId = v->getVarialbleId();
      }
   }
   outId = maxId + 1;
   SERVO::CVariable* pNew = new SERVO::CVariable(std::to_string(outId).c_str(), pszName, fmt.c_str(), pszRemark ? pszRemark : "");
   m_variabels.push_back(pNew);
   auto filepath = m_strVariableFilepath;
   Unlock();
   if (filepath.empty()) return -3;
   return writeVariablesToFile(filepath);
}
int CHsmsPassive::updateVariable(int variableId, 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_variabels.begin(), m_variabels.end(), [=](SERVO::CVariable* v) {
      return v != nullptr && v->getVarialbleId() == variableId;
      });
   if (it == m_variabels.end()) {
      Unlock();
      return -4;
   }
   (*it)->setName(pszName);
   (*it)->setFormat(fmt.c_str());
   (*it)->setRemark(pszRemark ? pszRemark : "");
   auto filepath = m_strVariableFilepath;
   Unlock();
   if (filepath.empty()) return -3;
   return writeVariablesToFile(filepath);
}
int CHsmsPassive::writeVariablesToFile(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;
@@ -499,32 +598,11 @@
   return 0;
}
void CHsmsPassive::setVariableValue(const char* pszName, __int64 value)
{
   auto v = getVariable(pszName);
   if (v != nullptr) {
      v->setValue(value);
   }
}
void CHsmsPassive::setVariableValue(const char* pszName, const char* value)
{
   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);
   }
}
int CHsmsPassive::loadReports(const char* pszFilepath)
{
   m_strReportFilepath = pszFilepath;
   m_bReportUtf8 = false;
   m_bReportUtf8Bom = false;
   // 兼容 UTF-8/BOM 与本地编码读取
   CFile file;
   if (!file.Open(pszFilepath, CFile::modeRead | CFile::shareDenyNone)) {
@@ -548,6 +626,8 @@
   // UTF-8 BOM
   if (nLen >= 3 && bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) {
      offset = 3;
      m_bReportUtf8 = true;
      m_bReportUtf8Bom = true;
   }
   // UTF-16 LE BOM
@@ -577,6 +657,7 @@
         MultiByteToWideChar(CP_UTF8, 0, buffer.data() + off,
            static_cast<int>(buffer.size() - off), temp.data(), need);
         content = temp.c_str();
         m_bReportUtf8 = true;
         return true;
      };
@@ -677,6 +758,14 @@
   return false;
}
int CHsmsPassive::deleteReport(int rptid)
{
   if (!removeReport(rptid)) {
      return -1;
   }
   return writeReportsToFile(m_strReportFilepath);
}
void CHsmsPassive::clearAllReport()
{
   for (auto item : m_reports) {
@@ -685,6 +774,59 @@
   m_reports.clear();
}
int CHsmsPassive::writeReportsToFile(const std::string& filepath)
{
   if (filepath.empty()) return -1;
   CFile file;
   if (!file.Open(filepath.c_str(), CFile::modeCreate | CFile::modeWrite)) {
      return -1;
   }
   if (m_bReportUtf8 && m_bReportUtf8Bom) {
      const BYTE bom[3] = { 0xEF, 0xBB, 0xBF };
      file.Write(bom, 3);
   }
   // header
   const std::string headerAnsi = "RPTID,(VID1,VID2,...)\r\n";
   if (m_bReportUtf8) {
      CStringA header = AnsiToUtf8(headerAnsi);
      file.Write(header.GetString(), header.GetLength());
   }
   else {
      file.Write(headerAnsi.data(), (UINT)headerAnsi.size());
   }
   for (auto rpt : m_reports) {
      if (rpt == nullptr) continue;
      std::string line;
      line.reserve(64);
      line += std::to_string(rpt->getReportId());
      line += ",(";
      const auto& vids = rpt->getVids();
      for (size_t i = 0; i < vids.size(); ++i) {
         line += std::to_string(vids[i]);
         if (i + 1 < vids.size()) {
            line.push_back(',');
         }
      }
      line += ")\r\n";
      if (m_bReportUtf8) {
         CStringA out = AnsiToUtf8(line);
         file.Write(out.GetString(), out.GetLength());
      }
      else {
         file.Write(line.data(), (UINT)line.size());
      }
   }
   file.Close();
   return 0;
}
int CHsmsPassive::loadCollectionEvents(const char* pszFilepath)
{
   CFile file;