chenluhua1980
6 天以前 d400f022161ff47f02cd0ea95a5076d0187ecd4d
SourceCode/Bond/Servo/PortConfigurationDlg.cpp
@@ -438,14 +438,101 @@
{
    int selPort = (0 <= m_nCurSelPort && m_nCurSelPort <= 3) ? m_nCurSelPort
        : m_comboPort.GetCurSel();
    if (selPort < 0 || selPort >= 4) return;
    m_pPort[selPort]->sendCassetteCtrlCmd(CCC_PROCESS_START, nullptr, 0, 0, 0, nullptr, nullptr);
    if (selPort < 0 || selPort >= 4) {
        LOGE("ProcessStart invalid port index: %d", selPort);
        return;
    }
    SERVO::CLoadPort* pPort = m_pPort[selPort];
    if (pPort == nullptr) {
        LOGE("ProcessStart port pointer is null, index: %d", selPort);
        return;
    }
    constexpr short cmd = CCC_PROCESS_START;
    LOGI("ProcessStart request: port=%d, cmd=%d", selPort + 1, cmd);
    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];
    }
    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);
            }
            else {
                LOGE("ProcessStart write failed: port=%d, code=%d", selPort + 1, code);
            }
            return 0;
        });
    if (ret != 0) {
        LOGE("ProcessStart sendCassetteCtrlCmd immediate failure: port=%d, ret=%d", selPort + 1, ret);
    }
    else {
        LOGI("ProcessStart sendCassetteCtrlCmd dispatched: port=%d", selPort + 1);
    }
}
void CPortConfigurationDlg::OnBnClickedButtonProcessCancel()
{
    int selPort = (0 <= m_nCurSelPort && m_nCurSelPort <= 3) ? m_nCurSelPort
        : m_comboPort.GetCurSel();
    if (selPort < 0 || selPort >= 4) return;
    m_pPort[selPort]->sendCassetteCtrlCmd(CCC_PROCESS_CANCEL, nullptr, 0, 0, 0, nullptr, nullptr);
    if (selPort < 0 || selPort >= 4) {
        LOGE("ProcessCancel invalid port index: %d", selPort);
        return;
    }
    SERVO::CLoadPort* pPort = m_pPort[selPort];
    if (pPort == nullptr) {
        LOGE("ProcessCancel port pointer is null, index: %d", selPort);
        return;
    }
    constexpr short cmd = CCC_PROCESS_CANCEL;
    LOGI("ProcessCancel request: port=%d, cmd=%d", selPort + 1, cmd);
    int ret = pPort->sendCassetteCtrlCmd(cmd, nullptr, 0, 0, 0, nullptr,
        [selPort](int code) -> int {
            if (code == WOK) {
                LOGI("ProcessCancel write complete: port=%d, code=WOK", selPort + 1);
            }
            else {
                LOGE("ProcessCancel write failed: port=%d, code=%d", selPort + 1, code);
            }
            return 0;
        });
    if (ret != 0) {
        LOGE("ProcessCancel sendCassetteCtrlCmd immediate failure: port=%d, ret=%d", selPort + 1, ret);
    }
    else {
        LOGI("ProcessCancel sendCassetteCtrlCmd dispatched: port=%d", selPort + 1);
    }
}