| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #pragma once |
| | | #include <string> |
| | | #include <vector> |
| | | #include <unordered_map> |
| | | #include <unordered_set> |
| | | #include <algorithm> |
| | | #include <cstdint> |
| | | #include <chrono> |
| | | #include <optional> |
| | | |
| | | namespace SERVO { |
| | | /// PJ çå½å¨æï¼è´´è¿ E40 常è§ç¶æï¼ |
| | | enum class PJState : uint8_t { |
| | | NoState = 0, |
| | | Queued, |
| | | SettingUp, |
| | | InProcess, |
| | | Paused, |
| | | Aborting, |
| | | Completed, |
| | | Aborted, |
| | | Failed |
| | | }; |
| | | |
| | | /// é
æ¹æå®æ¹å¼ï¼å¯¹åº S16F15 é PRRECIPEMETHODï¼ |
| | | enum class RecipeMethod : uint8_t { |
| | | NoTuning = 1, // 1 - recipe without variable tuning |
| | | WithTuning = 2 // 2 - recipe with variable tuning |
| | | }; |
| | | |
| | | /// å¯å¨çç¥ï¼å¯¹åº S16F15 é PRPROCESSSTARTï¼ |
| | | enum class StartPolicy : uint8_t { |
| | | Queued = 0, // 建ç«åæé |
| | | AutoStart = 1 // æ¡ä»¶æ»¡è¶³åèªå¨å¯å¨ |
| | | }; |
| | | |
| | | /** é
æ¹åæ°å¯¹ï¼S16F15 ä¸ RCPPARNM / RCPPARVALï¼ */ |
| | | struct PJParam { |
| | | std::string name; // RCPPARNM |
| | | std::string value; // RCPPARVAL |
| | | }; |
| | | |
| | | /** |
| | | {L:2 |
| | | CARRIERID |
| | | {L:j |
| | | SLOTID |
| | | } |
| | | } |
| | | */ |
| | | struct CarrierSlotInfo { |
| | | std::string carrierId; // CARRIERID |
| | | std::vector<uint8_t> slots; // SLOTID[] |
| | | std::vector<void*> contexts; // Glass |
| | | }; |
| | | |
| | | /// ç®åèµæºè§å¾æ¥å£ï¼ä¾ Validate() æ¥è¯¢ï¼ç±è®¾å¤ç«¯å®ç°è
å¨å¤é¨æä¾ï¼ |
| | | struct IResourceView { |
| | | virtual ~IResourceView() = default; |
| | | virtual bool isProcessJobsEmpty() const = 0; |
| | | virtual bool recipeExists(const std::string& ppid) const = 0; |
| | | virtual bool carrierPresent(const std::string& carrierId) const = 0; |
| | | virtual bool slotUsable(const std::string& carrierId, uint16_t slot) const = 0; |
| | | virtual bool ceidDefined(uint32_t ceid) const = 0; |
| | | // ä½ ä¹å¯ä»¥æ©å±ï¼portç¶æãå ç¨æ
åµãCJ/PJ空é´ç |
| | | }; |
| | | |
| | | /// PJ 主类 |
| | | /** |
| | | * ProcessJob ââ ä¸ S16F15ï¼PRJobMultiCreateï¼å段ä¸ä¸å¯¹åºçæ¿è½½ç±» |
| | | * |
| | | * S16F15 ç»æï¼æ ¸å¿èéï¼ï¼ |
| | | * {L:6 |
| | | * PRJOBID -> m_pjId |
| | | * MF -> m_mf |
| | | * {L:n { CARRIERID {L:j SLOTID} } } |
| | | * {L:3 |
| | | * PRRECIPEMETHOD -> m_recipeType |
| | | * RCPSPECï¼PPIDï¼ -> m_recipeSpec |
| | | * {L:m { RCPPARNM RCPPARVAL }} -> m_params |
| | | * } |
| | | * PRPROCESSSTART -> m_startPolicy |
| | | * {L:k PRPAUSEEVENTID} -> m_pauseEvents |
| | | * } |
| | | */ |
| | | class CProcessJob { |
| | | public: |
| | | // ââ æé / åºæ¬è®¾ç½® ââ |
| | | CProcessJob(); |
| | | explicit CProcessJob(std::string pjId); |
| | | |
| | | const std::string& id() const noexcept { return m_pjId; } |
| | | const std::string& parentCjId() const noexcept { return m_parentCjId; } |
| | | PJState state() const noexcept { return m_state; } |
| | | StartPolicy startPolicy() const noexcept { return m_startPolicy; } |
| | | RecipeMethod recipeMethod() const noexcept { return m_recipeMethod; } |
| | | const std::string& recipeSpec() const noexcept { return m_recipeSpec; } // PPID æ Spec |
| | | std::string getStateText(); |
| | | |
| | | // ç»å®ç¶ CJ |
| | | void setParentCjId(std::string cjId); |
| | | |
| | | // é
æ¹ |
| | | void setRecipe(RecipeMethod method, std::string spec); |
| | | |
| | | // å¯å¨çç¥ |
| | | void setStartPolicy(StartPolicy sp) { m_startPolicy = sp; } |
| | | |
| | | // åæ° |
| | | void addParam(std::string name, std::string value); |
| | | void setParams(std::vector<PJParam> params); |
| | | |
| | | // æåäºä»¶ |
| | | void addPauseEvent(uint32_t ceid); |
| | | void setPauseEvents(std::vector<uint32_t> ceids); |
| | | |
| | | // ââ æ ¡éª ââ |
| | | struct ValidationIssue { |
| | | uint32_t code; // èªå®ä¹é误ç |
| | | std::string text; // ææ¬æè¿° |
| | | }; |
| | | // è¿åé®é¢æ¸
åï¼ç©º=éè¿ï¼ |
| | | bool validate(const IResourceView& rv); |
| | | const std::vector<ValidationIssue>& issues(); |
| | | |
| | | // ââ ç¶ææºï¼å¸¦å®å«ï¼ââ |
| | | bool queue(); // NoState -> Queued |
| | | bool start(); // Queued/SettingUp -> InProcess |
| | | bool enterSettingUp(); // Queued -> SettingUp |
| | | bool pause(); // InProcess -> Paused |
| | | bool resume(); // Paused -> InProcess |
| | | bool complete(); // InProcess -> Completed |
| | | bool abort(); // Any (æªç»æ) -> Aborted |
| | | bool fail(std::string reason); // ä»»ææ -> Failedï¼è®°å½å¤±è´¥åå ï¼ |
| | | |
| | | // ââ 访é®å¨ï¼ç¨äºä¸æ¥/æ¥è¯¢ï¼ââ |
| | | const std::vector<PJParam>& params() const noexcept { return m_params; } |
| | | const std::vector<uint32_t>& pauseEvents() const noexcept { return m_pauseEvents; } |
| | | const std::string& failReason() const noexcept { return m_failReason; } |
| | | |
| | | // æ¶é´æ³ï¼å¯ç¨äºæ¥è¡¨/è¿½æº¯ï¼ |
| | | std::optional<std::chrono::system_clock::time_point> tQueued() const { return m_tQueued; } |
| | | std::optional<std::chrono::system_clock::time_point> tStart() const { return m_tStart; } |
| | | std::optional<std::chrono::system_clock::time_point> tEnd() const { return m_tEnd; } |
| | | |
| | | // é¿åº¦éå¶å·¥å
·ï¼å¯å¨éææ¶ç»ä¸çç¥ï¼ |
| | | static void clampString(std::string& s, size_t maxLen); |
| | | static bool asciiPrintable(const std::string& s); |
| | | |
| | | // æ¸
空并æ´ä½è®¾ç½® |
| | | void setCarriers(std::vector<CarrierSlotInfo> carriers); |
| | | |
| | | // 追å ä¸ä¸ªè½½å
· |
| | | void addCarrier(std::string carrierId, std::vector<uint8_t> slots); |
| | | |
| | | // 访é®å¨ |
| | | const std::vector<CarrierSlotInfo>& carriers() const noexcept { return m_carriers; } |
| | | CarrierSlotInfo* getCarrier(std::string& strId); |
| | | |
| | | // å¤å®æ¯å¦âæè½½å
·/å¡ä½âæ¹å¼ |
| | | bool usesCarrierSlots() const noexcept { return !m_carriers.empty(); } |
| | | |
| | | |
| | | public: |
| | | // ====== çæ¬å¤´å¸¸éï¼å»ºè®®ä¿çï¼ä¾¿äºå
¼å®¹ï¼====== |
| | | static constexpr uint32_t PJ_FILE_MAGIC = 0x504A4A31; // "PJJ1" |
| | | static constexpr uint16_t PJ_FILE_VERSION = 0x0001; |
| | | |
| | | // ====== æµå¼åºååæ¥å£ ====== |
| | | void serialize(std::ostream& os) const; |
| | | static bool deserialize(std::istream& is, CProcessJob& out, std::string* err = nullptr); |
| | | |
| | | private: |
| | | // å
é¨ç¶æè½¬ç§»å¸®å© |
| | | void markQueued(); |
| | | void markStart(); |
| | | void markEnd(); |
| | | |
| | | private: |
| | | // æ è¯ |
| | | std::string m_pjId; |
| | | std::string m_parentCjId; |
| | | |
| | | // é
æ¹ |
| | | RecipeMethod m_recipeMethod{ RecipeMethod::NoTuning }; |
| | | std::string m_recipeSpec; // PPID / Spec |
| | | |
| | | // ç©æ |
| | | static constexpr uint8_t MATERIAL_FORMAT = 14; // substrate |
| | | std::vector<CarrierSlotInfo> m_carriers; // {L:n { CARRIERID {L:j SLOTID} }} |
| | | |
| | | // åæ° / æåäºä»¶ |
| | | std::vector<PJParam> m_params; |
| | | std::vector<uint32_t> m_pauseEvents; |
| | | |
| | | // ç¶æ & è®°å½ |
| | | StartPolicy m_startPolicy{ StartPolicy::Queued }; // 0=Queued, 1=AutoStart |
| | | PJState m_state{ PJState::NoState }; |
| | | std::string m_failReason; |
| | | |
| | | // æ¶é´æ³ |
| | | std::optional<std::chrono::system_clock::time_point> m_tQueued; |
| | | std::optional<std::chrono::system_clock::time_point> m_tStart; |
| | | std::optional<std::chrono::system_clock::time_point> m_tEnd; |
| | | |
| | | // 约æï¼å¯æä½ 们åè®®è°æ´ï¼ |
| | | static constexpr size_t MAX_ID_LEN = 64; // PJID/ CJID/ CarrierID/ MID/ PPID |
| | | static constexpr size_t MAX_PARAM_K = 32; // åæ°å |
| | | static constexpr size_t MAX_PARAM_V = 64; // åæ°å¼ |
| | | |
| | | // é误å表 |
| | | std::vector<ValidationIssue> m_issues; |
| | | }; |
| | | } |
| | | |
| | | |