From 22f2984276ff75433ebeab877c96b48905826e6c Mon Sep 17 00:00:00 2001
From: chenluhua1980 <Chenluhua@qq.com>
Date: 星期五, 06 二月 2026 16:51:25 +0800
Subject: [PATCH] 1.Slot防护

---
 SourceCode/Bond/Servo/PortConfigurationDlg.cpp |   49 ++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 48 insertions(+), 1 deletions(-)

diff --git a/SourceCode/Bond/Servo/PortConfigurationDlg.cpp b/SourceCode/Bond/Servo/PortConfigurationDlg.cpp
index 27bc7a8..2de5acd 100644
--- a/SourceCode/Bond/Servo/PortConfigurationDlg.cpp
+++ b/SourceCode/Bond/Servo/PortConfigurationDlg.cpp
@@ -451,7 +451,54 @@
 
     constexpr short cmd = CCC_PROCESS_START;
     LOGI("ProcessStart request: port=%d, cmd=%d", selPort + 1, cmd);
-    int ret = pPort->sendCassetteCtrlCmd(cmd, nullptr, 0, 0, 0, nullptr,
+    short jobExistence[12] = { 0 };
+    short slotProcess = 0;
+    short jobCount = 0; // 0 = Process All Glass (per spec)
+    bool anyScheduled = false;
+
+    // Prefer hardware scan map for job existence (first 16 slots).
+    const short scanMap = pPort->getScanCassetteMap();
+    if (scanMap != 0) {
+        jobExistence[0] = scanMap;
+    }
+
+    // Build existence/selected maps from current glass list (up to 192 slots).
+    const int maxSlots = 12 * 16;
+    const int totalSlots = (SLOT_MAX < maxSlots) ? SLOT_MAX : maxSlots;
+    for (int slot = 1; slot <= totalSlots; ++slot) {
+        SERVO::CGlass* pGlass = pPort->getGlassFromSlot(slot);
+        if (pGlass == nullptr) continue;
+
+        const int wordIndex = (slot - 1) / 16;
+        const int bitIndex = (slot - 1) % 16;
+        jobExistence[wordIndex] = (short)(jobExistence[wordIndex] | (1 << bitIndex));
+
+        if (slot <= 16 && pGlass->isScheduledForProcessing()) {
+            slotProcess = (short)(slotProcess | (1 << bitIndex));
+            anyScheduled = true;
+        }
+    }
+
+    // If no slot explicitly selected, default to all existing in the first word.
+    if (!anyScheduled) {
+        slotProcess = jobExistence[0];
+    }
+
+    bool hasExistence = false;
+    for (short w : jobExistence) {
+        if (w != 0) { hasExistence = true; break; }
+    }
+    const int portStatus = pPort->getPortStatus();
+    if (!hasExistence) {
+        LOGE("ProcessStart blocked: no JobExistence map (port=%d, portStatus=%d, scanMap=%d, cassetteId=%s).",
+            selPort + 1, portStatus, scanMap, pPort->getCassetteId().c_str());
+        return;
+    }
+    if (portStatus != PORT_INUSE) {
+        LOGW("ProcessStart warning: port status is %d (expected INUSE).", portStatus);
+    }
+
+    int ret = pPort->sendCassetteCtrlCmd(cmd, jobExistence, 12, slotProcess, jobCount, nullptr,
         [selPort](int code) -> int {
             if (code == WOK) {
                 LOGI("ProcessStart write complete: port=%d, code=WOK", selPort + 1);

--
Gitblit v1.9.3