From 3e0ceaf4e569ea1f57a14de2f6135d1f1a50d080 Mon Sep 17 00:00:00 2001
From: mrDarker <mr.darker@163.com>
Date: 星期三, 27 八月 2025 13:47:31 +0800
Subject: [PATCH] Merge branch 'clh' into liuyang

---
 SourceCode/Bond/Servo/PortConfigurationDlg.cpp |  124 +++++++++++++++++++++++++++++++++++++++-
 1 files changed, 119 insertions(+), 5 deletions(-)

diff --git a/SourceCode/Bond/Servo/PortConfigurationDlg.cpp b/SourceCode/Bond/Servo/PortConfigurationDlg.cpp
index 891aaac..8b0f98f 100644
--- a/SourceCode/Bond/Servo/PortConfigurationDlg.cpp
+++ b/SourceCode/Bond/Servo/PortConfigurationDlg.cpp
@@ -12,6 +12,9 @@
 #include "ServoCommo.h"
 
 
+
+#define CHECKBOX_ALL_ID        0x1234
+
 // CPortConfigurationDlg 瀵硅瘽妗�
 
 IMPLEMENT_DYNAMIC(CPortConfigurationDlg, CDialogEx)
@@ -25,6 +28,8 @@
     m_pPort[2] = dynamic_cast<SERVO::CLoadPort*>(theApp.m_model.m_master.getEquipment(EQ_ID_LOADPORT3));
     m_pPort[3] = dynamic_cast<SERVO::CLoadPort*>(theApp.m_model.m_master.getEquipment(EQ_ID_LOADPORT4));
     m_nCurSelPort = -1;
+    m_pCheckBox = nullptr;
+    m_bCheckedAll = FALSE;
 }
 
 CPortConfigurationDlg::~CPortConfigurationDlg()
@@ -91,6 +96,7 @@
             }
         }
     }
+    m_pCheckBox->SetCheck(IsCheckedAll() ? BST_CHECKED : BST_UNCHECKED);
 }
 
 void CPortConfigurationDlg::InitGrid()
@@ -123,7 +129,8 @@
     m_wndGrid.SetColumnWidth(nColIdx, 50);
     m_wndGrid.SetItemText(0, nColIdx++, _T("Slot ID"));
     m_wndGrid.SetColumnWidth(nColIdx, 60);
-    m_wndGrid.SetItemText(0, nColIdx++, _T("鍚敤"));
+    m_wndGrid.SetItemText(0, nColIdx++, _T("Glass ID"));
+
 
     // 璁剧疆琛屼负鏍峰紡
     m_wndGrid.SetFixedRowSelection(FALSE);
@@ -146,6 +153,17 @@
     for (int i = 0; i < nRows; ++i) {
         m_wndGrid.SetRowHeight(i, nEachRowHeight);
     }
+
+    CRect rect;
+    BOOL bOK = m_wndGrid.GetCellRect(0, 1, rect);
+    m_pCheckBox = new CCustomCheckBox();
+    m_pCheckBox->Create(_T("閫夋嫨鎵�鏈�"),
+        WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, // 鑷姩鍕鹃��
+        CRect(0, 0, 150, 32), &m_wndGrid, CHECKBOX_ALL_ID);
+    m_pCheckBox->SetFont(GetFont());
+    m_pCheckBox->MoveWindow(rect.left + 5, rect.top + 3, 150, rect.Height() - 6);
+    m_pCheckBox->SetBackgroundColor(g_nGridFixCellColor);
+    m_pCheckBox->SetNotifyHwnd(GetSafeHwnd());
 }
 
 void CPortConfigurationDlg::DoDataExchange(CDataExchange* pDX)
@@ -161,6 +179,10 @@
 BEGIN_MESSAGE_MAP(CPortConfigurationDlg, CDialogEx)
     ON_CBN_SELCHANGE(IDC_COMBO_PORT, &CPortConfigurationDlg::OnSelchangeComboPort)
     ON_BN_CLICKED(IDC_BUTTON_APPLY, &CPortConfigurationDlg::OnBnClickedButtonApply)
+    ON_MESSAGE(WM_CHECKBOX_STATE_CHANGED, &CPortConfigurationDlg::OnCheckAllClicked)
+    ON_WM_DESTROY()
+    ON_BN_CLICKED(IDC_BUTTON_PROCESS_START, &CPortConfigurationDlg::OnBnClickedButtonProcessStart)
+    ON_BN_CLICKED(IDC_BUTTON_PROCESS_CANCEL, &CPortConfigurationDlg::OnBnClickedButtonProcessCancel)
 END_MESSAGE_MAP()
 
 
@@ -203,7 +225,8 @@
 	LoadPortConfigToUI(m_pPort[0]);     // 榛樿鍔犺浇绗竴涓鍙g殑閰嶇疆
 
 	// 璁剧疆瀵硅瘽妗嗘爣棰�
-    if (0 <= m_nCurSelPort && m_nCurSelPort <= 3) {
+    BOOL bAutoPopup = 0 <= m_nCurSelPort && m_nCurSelPort <= 3;
+    if (bAutoPopup) {
         CString strTitle;
         strTitle.Format(_T("%s Configuration"), ports[m_nCurSelPort]);
         SetWindowText(strTitle);
@@ -212,6 +235,10 @@
         SetWindowText(_T("Port Configuration"));
     }
 
+
+    // Porcess Start / Process Cancel 鎸夐挳鐘舵��
+    GetDlgItem(IDC_BUTTON_PROCESS_START)->EnableWindow(FALSE);
+    GetDlgItem(IDC_BUTTON_PROCESS_CANCEL)->EnableWindow(FALSE);
 
 	return TRUE;  // return TRUE unless you set the focus to a control
 	// 寮傚父: OCX 灞炴�ч〉搴旇繑鍥� FALSE
@@ -226,6 +253,12 @@
 	}
 
 	// 鍔犺浇閫変腑绔彛鐨勯厤缃埌 UI
+    for (int i = 1; i <= 8; i++) {
+        m_wndGrid.SetItemText(i, 0, "");
+        m_wndGrid.SetItemText(i, 1, "");
+        m_wndGrid.SetCellType(i, 1, RUNTIME_CLASS(CGridCellNumeric));
+    }
+    m_wndGrid.Invalidate();
 	LoadPortConfigToUI(m_pPort[selPort]);
 }
 
@@ -284,7 +317,7 @@
 	}
 
     // 鑾峰彇 Grid 琛ㄦ牸涓� Slot 鐘舵�侊紙绗�1~8琛岋級
-    for (int i = 1; i <= 8; ++i) {
+    for (int i = 1; i <= SLOT_MAX; ++i) {
         SERVO::CGlass* pGlass = (SERVO::CGlass*)m_wndGrid.GetItemData(i, 0);
         if (pGlass != nullptr) {
             CGridCellCheck* pCheck = dynamic_cast<CGridCellCheck*>(m_wndGrid.GetCell(i, 1));
@@ -297,9 +330,90 @@
             pJobDataS->setProductId(config.strProductID.c_str());
             pJobDataS->setOperationId(config.strOperationID.c_str());
             pJobDataS->setMaterialsType(config.nMaterialType);
+
+            RecipeInfo stRecipeInfo = RecipeManager::getInstance().getRecipeByPPID(config.strRecipe);
+            std::vector<DeviceRecipe> vecRecipeInfo = stRecipeInfo.vecDeviceList;
+
+            for (const auto& info : vecRecipeInfo) {
+                const std::string& name = info.strDeviceName;
+                short nRecipeID = (short)info.nRecipeID;
+
+                if (name == EQ_NAME_EFEM) {
+                    pJobDataS->setDeviceRecipeId(0, nRecipeID);
+                }
+                else if (name == EQ_NAME_BONDER1) {
+                    pJobDataS->setDeviceRecipeId(1, nRecipeID);
+                }
+                else if (name == EQ_NAME_BONDER2) {
+                    pJobDataS->setDeviceRecipeId(2, nRecipeID);
+                }
+                else if (name == EQ_NAME_BAKE_COOLING) {
+                    pJobDataS->setDeviceRecipeId(3, nRecipeID);
+                }
+                else if (name == EQ_NAME_VACUUMBAKE) {
+                    pJobDataS->setDeviceRecipeId(4, nRecipeID);
+                }
+                else if (name == EQ_NAME_MEASUREMENT) {
+                    pJobDataS->setDeviceRecipeId(5, nRecipeID);
+                }
+            }
+        }
+    }
+
+    GetDlgItem(IDC_BUTTON_PROCESS_START)->EnableWindow(TRUE);
+    GetDlgItem(IDC_BUTTON_PROCESS_CANCEL)->EnableWindow(TRUE);
+}
+
+void CPortConfigurationDlg::OnDestroy()
+{
+    CDialogEx::OnDestroy();
+
+    if (m_pCheckBox != nullptr) {
+        m_pCheckBox->DestroyWindow();
+        delete m_pCheckBox;
+        m_pCheckBox = nullptr;
+    }
+}
+
+LRESULT  CPortConfigurationDlg::OnCheckAllClicked(WPARAM wParam, LPARAM lParam)
+{
+    UINT ctrlID = (UINT)wParam;
+    BOOL bChecked = (BOOL)lParam;
+    for (int i = 1; i <= SLOT_MAX; ++i) {
+        CGridCellCheck* pCheck = dynamic_cast<CGridCellCheck*>(m_wndGrid.GetCell(i, 1));
+        if (pCheck != nullptr) {
+            pCheck->SetCheck(bChecked);
         }
     }
 
 
-    OnOK();
-}
\ No newline at end of file
+    return 0;
+}
+
+BOOL CPortConfigurationDlg::IsCheckedAll()
+{
+    for (int i = 1; i <= SLOT_MAX; ++i) {
+        CGridCellCheck* pCheck = dynamic_cast<CGridCellCheck*>(m_wndGrid.GetCell(i, 1));
+        if (pCheck != nullptr) {
+            if (!pCheck->GetCheck()) return FALSE;
+        }
+    }
+
+    return TRUE;
+}
+
+void CPortConfigurationDlg::OnBnClickedButtonProcessStart()
+{
+    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);
+}
+
+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);
+}

--
Gitblit v1.9.3