From da9df9d46ed3fc50e0c03497bd9f76b8aa1a4595 Mon Sep 17 00:00:00 2001
From: chenluhua1980 <Chenluhua@qq.com>
Date: 星期三, 14 一月 2026 15:37:48 +0800
Subject: [PATCH] 1.修复以下问题: 作业前置条件不足导致 PJ 验证失败:onPRJobMultiCreate 调 CMaster::setProcessJobs,CProcessJob::validate 要求“当前没有其它 PJ”(issue 1000),且 carrierPresent/slotUsable 必须为真。只要本地还有未结批的 PJ/CJ 或载具/槽位状态未就绪(ID 未绑、Slot 未使能),Host 发送的 CreateMultiPJ 会直接被丢弃(返回 size=0),但当前代码没有向 Host 回 ACK/NAK,Host 会误以为创建成功。
---
SourceCode/Bond/Servo/CControlJob.cpp | 69 ++++++++++++++++++++++++----------
1 files changed, 48 insertions(+), 21 deletions(-)
diff --git a/SourceCode/Bond/Servo/CControlJob.cpp b/SourceCode/Bond/Servo/CControlJob.cpp
index 8dc2b18..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,23 +319,12 @@
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;
}
--
Gitblit v1.9.3