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 "";
    }
}