From bc7f1c4e028e69be51079b59dae4ae5c4d43f5bb Mon Sep 17 00:00:00 2001
From: chenluhua1980 <Chenluhua@qq.com>
Date: 星期六, 31 一月 2026 21:54:56 +0800
Subject: [PATCH] 1.状态指示图,目前灰色表示掉线,绿色表示在线。增加Slot的小点表示有没有料,及加工状态 。 2.增加图示

---
 SourceCode/Bond/Servo/CControlJob.cpp |  101 ++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 80 insertions(+), 21 deletions(-)

diff --git a/SourceCode/Bond/Servo/CControlJob.cpp b/SourceCode/Bond/Servo/CControlJob.cpp
index e88f816..cb1e794 100644
--- a/SourceCode/Bond/Servo/CControlJob.cpp
+++ b/SourceCode/Bond/Servo/CControlJob.cpp
@@ -4,9 +4,12 @@
 #include "SerializeUtil.h"
 
 static inline std::string trimCopy(std::string s) {
-    auto notspace = [](int ch) { return !std::isspace(ch); };
-    s.erase(s.begin(), std::find_if(s.begin(), s.end(), notspace));
-    s.erase(std::find_if(s.rbegin(), s.rend(), notspace).base(), s.end());
+    s.erase(s.begin(),
+        std::find_if(s.begin(), s.end(),
+            [](char c) { return !std::isspace(static_cast<unsigned char>(c)); }));
+    s.erase(std::find_if(s.rbegin(), s.rend(),
+        [](char c) { return !std::isspace(static_cast<unsigned char>(c)); }).base(),
+        s.end());
     return s;
 }
 
@@ -35,6 +38,12 @@
         m_tEnd = src.m_tEnd;
     }
 
+    void CControlJob::setId(std::string& id)
+    {
+        m_cjId = trimCopy(id);
+        clampString(m_cjId, MAX_ID_LEN);
+    }
+
     bool CControlJob::addPJ(const std::string& pjId) {
         if (pjId.empty()) return false;
         auto id = pjId;
@@ -57,6 +66,28 @@
         return true;
     }
 
+    bool CControlJob::addPjPointer(CProcessJob* pj)
+    {
+        for (auto item : m_pjs) {
+            if (item->id().compare(pj->id()) == 0) return false;
+        }
+
+        m_pjs.push_back(pj);
+        return true;
+    }
+
+    bool CControlJob::removePjPointer(const std::string& id)
+    {
+        for(auto iter = m_pjs.begin(); iter != m_pjs.end(); ++iter) {
+            if ((*iter)->id().compare(id) == 0) {
+                m_pjs.erase(iter);
+                return true;
+            }
+        }
+
+        return false;
+    }
+
     bool CControlJob::removePJ(const std::string& pjId) {
         auto it = std::find(m_pjIds.begin(), m_pjIds.end(), pjId);
         if (it == m_pjIds.end()) return false;
@@ -71,6 +102,11 @@
     const std::vector<CControlJob::ValidationIssue>& CControlJob::issues()
     {
         return m_issues;
+    }
+
+    void CControlJob::clearIssues()
+    {
+        m_issues.clear();
     }
 
     bool CControlJob::validateForCreate(
@@ -184,9 +220,11 @@
         return true;
     }
 
-    bool CControlJob::abort() {
+    bool CControlJob::abort(std::string reason) {
         if (m_state == CJState::Completed || m_state == CJState::Aborted || m_state == CJState::Failed)
             return false;
+        m_failReason = trimCopy(reason);
+        clampString(m_failReason, 128);
         m_state = CJState::Aborted;
         markEnd();
         return true;
@@ -281,24 +319,45 @@
         out = CControlJob(cjId);
         out.setPriority(prio);
 
-        // 直接恢复内部状态(若你要求走状态机,可在这里按合法过渡调用 queue()/start()/...)
-        // 简化:直接赋值(你在 CControlJob.cpp 内部,可访问私有成员)
-        struct Access : CControlJob {
-            using CControlJob::m_state;
-            using CControlJob::m_failReason;
-            using CControlJob::m_tQueued;
-            using CControlJob::m_tStart;
-            using CControlJob::m_tEnd;
-            using CControlJob::m_pjIds;
-        };
-        auto& a = reinterpret_cast<Access&>(out);
-        a.m_state = static_cast<CJState>(st);
-        a.m_failReason = std::move(failText);
-        a.m_tQueued = std::move(tQ);
-        a.m_tStart = std::move(tS);
-        a.m_tEnd = std::move(tE);
-        a.m_pjIds = std::move(pjIds);
+        out.m_state = static_cast<CJState>(st);
+        out.m_failReason = std::move(failText);
+        out.m_tQueued = std::move(tQ);
+        out.m_tStart = std::move(tS);
+        out.m_tEnd = std::move(tE);
+        out.m_pjIds = std::move(pjIds);
 
         return true;
     }
+
+    std::string CControlJob::getStateText()
+    {
+        switch (m_state)
+        {
+        case SERVO::CJState::NoState:
+            return "NoState";
+            break;
+        case SERVO::CJState::Queued:
+            return "Queued";
+            break;
+        case SERVO::CJState::Executing:
+            return "Executing";
+            break;
+        case SERVO::CJState::Paused:
+            return "Paused";
+            break;
+        case SERVO::CJState::Completed:
+            return "Completed";
+            break;
+        case SERVO::CJState::Aborted:
+            return "Aborted";
+            break;
+        case SERVO::CJState::Failed:
+            return "Failed";
+            break;
+        default:
+            break;
+        }
+
+        return "";
+    }
 }

--
Gitblit v1.9.3