From 5a66d26a2899a2450a50f00d09c728ae151715be Mon Sep 17 00:00:00 2001
From: mrDarker <mr.darker@163.com>
Date: 星期三, 23 七月 2025 11:19:42 +0800
Subject: [PATCH] Merge branch 'clh' into liuyang
---
SourceCode/Bond/Servo/PortConfigurationDlg.cpp | 226 ++++++++++++++++++++++++++++++++++++--------------------
1 files changed, 146 insertions(+), 80 deletions(-)
diff --git a/SourceCode/Bond/Servo/PortConfigurationDlg.cpp b/SourceCode/Bond/Servo/PortConfigurationDlg.cpp
index b60a1e1..62b883a 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)
@@ -24,10 +27,18 @@
m_pPort[1] = dynamic_cast<SERVO::CLoadPort*>(theApp.m_model.m_master.getEquipment(EQ_ID_LOADPORT2));
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()
{
+}
+
+void CPortConfigurationDlg::setCurSelPort(int sel)
+{
+ m_nCurSelPort = sel;
}
int CPortConfigurationDlg::GetLoadPortEqID(const std::string& strPortName)
@@ -50,24 +61,42 @@
SetDlgItemText(IDC_EDIT_OPERATIONID, "");
m_comboMaterialsType.SetCurSel(0);
- SERVO::CSlot* pSlot = pPort->getSlot(0);
- if (pSlot == nullptr) {
- return;
- }
+ bool bJobInfoSet = false;
+ for (int i = 0; i < SLOT_MAX; ++i) {
+ SERVO::CSlot* pSlot = pPort->getSlot(i);
+ if (!pSlot) {
+ continue;
+ }
- SERVO::CGlass* pGlass = dynamic_cast<SERVO::CGlass*>(pSlot->getContext());
- if (pGlass != nullptr) {
- SERVO::CJobDataS* pJS = pGlass->getJobDataS();
- if (pJS) {
- SetDlgItemText(IDC_EDIT_LOTID, CString(pJS->getLotId().c_str()));
- SetDlgItemText(IDC_EDIT_PRODUCTID, CString(pJS->getProductId().c_str()));
- SetDlgItemText(IDC_EDIT_OPERATIONID, CString(pJS->getOperationId().c_str()));
- m_comboMaterialsType.SetCurSel(pJS->getMaterialsType() - 1);
+
+ // 璁剧疆 Panel ID 鍜屽嬀閫夋
+ SERVO::CGlass* pGlass = dynamic_cast<SERVO::CGlass*>(pSlot->getContext());
+ int nRow = i + 1;
+ if (pGlass != nullptr) {
+ m_wndGrid.SetItemState(nRow, 0, GVIS_READONLY);
+ m_wndGrid.SetItemText(nRow, 0, pSlot->getName().c_str());
+ m_wndGrid.SetCellType(nRow, 1, RUNTIME_CLASS(CGridCellCheck));
+ CGridCellCheck* pCheck = dynamic_cast<CGridCellCheck*>(m_wndGrid.GetCell(nRow, 1));
+ ASSERT(pCheck);
+ pCheck->SetCheck(pGlass->isScheduledForProcessing());
+ pCheck->SetText(pGlass->getID().c_str());
+ }
+ m_wndGrid.SetItemData(nRow, 0, (LPARAM)pGlass);
+
+
+ // 鍥炲~ Job 淇℃伅锛堝彧鍙栫涓�涓湁鏁� Glass锛�
+ if (!bJobInfoSet && pGlass) {
+ SERVO::CJobDataS* pJS = pGlass->getJobDataS();
+ if (pJS) {
+ SetDlgItemText(IDC_EDIT_LOTID, CString(pJS->getLotId().c_str()));
+ SetDlgItemText(IDC_EDIT_PRODUCTID, CString(pJS->getProductId().c_str()));
+ SetDlgItemText(IDC_EDIT_OPERATIONID, CString(pJS->getOperationId().c_str()));
+ m_comboMaterialsType.SetCurSel(pJS->getMaterialsType() - 1);
+ bJobInfoSet = true;
+ }
}
}
-
- // 濉厖 Grid
- FillGrid(pSlot, pGlass);
+ m_pCheckBox->SetCheck(IsCheckedAll() ? BST_CHECKED : BST_UNCHECKED);
}
void CPortConfigurationDlg::InitGrid()
@@ -100,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);
@@ -123,46 +153,17 @@
for (int i = 0; i < nRows; ++i) {
m_wndGrid.SetRowHeight(i, nEachRowHeight);
}
-}
-void CPortConfigurationDlg::FillGrid(SERVO::CSlot* pSlot, SERVO::CGlass* pGlass)
-{
- //CStringArray recipeOptions;
- //recipeOptions.Add(_T("Recipe A"));
- //recipeOptions.Add(_T("Recipe B"));
- //recipeOptions.Add(_T("Recipe C"));
-
- // 鍘婚櫎琛ㄥご锛屼粠绗�2琛屽紑濮嬪~鍏呮暟鎹�
- for (int i = 1; i < SLOT_MAX + 1; ++i) {
- CString strIndex;
- strIndex.Format(_T("%d"), i);
- m_wndGrid.SetItemText(i, 0, strIndex);
- m_wndGrid.SetItemState(i, 0, GVIS_READONLY);
-
- if (i != 3) {
- // Checkbox
- m_wndGrid.SetCellType(i, 1, RUNTIME_CLASS(CGridCellCheck));
- CGridCellCheck* pCheck = static_cast<CGridCellCheck*>(m_wndGrid.GetCell(i, 1));
- if (pCheck) {
- // 璁剧疆 Panel ID 鍜屽嬀閫夋
- CGridCellCheck* pCheck = static_cast<CGridCellCheck*>(m_wndGrid.GetCell(i, 1));
- if (pCheck && pSlot && pGlass) {
- pCheck->SetCheck(pSlot->isEnable() ? TRUE : FALSE);
- pCheck->SetText(pGlass ? pGlass->getID().c_str() : _T(""));
- }
- else {
- pCheck->SetCheck(FALSE);
- pCheck->SetText(_T(""));
- }
- }
- }
- else {
- m_wndGrid.SetItemState(i, 1, GVIS_READONLY);
- }
- }
-
- m_wndGrid.Invalidate();
- m_wndGrid.UpdateWindow();
+ 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)
@@ -178,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()
@@ -193,7 +198,13 @@
for (const auto& item : ports) {
m_comboPort.AddString(item);
}
- m_comboPort.SetCurSel(0); // 榛樿閫夋嫨绗竴涓鍙�
+ if (0 <= m_nCurSelPort && m_nCurSelPort <= 3) {
+ m_comboPort.SetCurSel(m_nCurSelPort);
+ m_comboPort.EnableWindow(FALSE);
+ }
+ else {
+ m_comboPort.SetCurSel(0);
+ }
// 鍒濆鍖栭厤鏂逛笅鎷夋鍐呭
std::vector<std::string> vecRecipe = RecipeManager::getInstance().getAllPPID();
@@ -214,7 +225,21 @@
LoadPortConfigToUI(m_pPort[0]); // 榛樿鍔犺浇绗竴涓鍙g殑閰嶇疆
// 璁剧疆瀵硅瘽妗嗘爣棰�
- SetWindowText(_T("Port Configuration"));
+ BOOL bAutoPopup = 0 <= m_nCurSelPort && m_nCurSelPort <= 3;
+ if (bAutoPopup) {
+ CString strTitle;
+ strTitle.Format(_T("%s Configuration"), ports[m_nCurSelPort]);
+ SetWindowText(strTitle);
+ }
+ else {
+ 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
@@ -287,35 +312,76 @@
}
// 鑾峰彇 Grid 琛ㄦ牸涓� Slot 鐘舵�侊紙绗�1~8琛岋級
- for (int i = 1; i <= 8; ++i) {
- SERVO::SlotConfig slot;
- slot.nSlotID = 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));
+ ASSERT(pCheck);
+ pGlass->setScheduledForProcessing(pCheck->GetCheck());
+ pGlass->setType(static_cast<SERVO::MaterialsType>(config.nMaterialType));
- CGridCellCheck* pCheck = static_cast<CGridCellCheck*>(m_wndGrid.GetCell(i, 1));
- if (pCheck) {
- slot.isEnabled = pCheck->GetCheck();
+ SERVO::CJobDataS* pJobDataS = pGlass->getJobDataS();
+ pJobDataS->setLotId(config.strLotID.c_str());
+ pJobDataS->setProductId(config.strProductID.c_str());
+ pJobDataS->setOperationId(config.strOperationID.c_str());
+ pJobDataS->setMaterialsType(config.nMaterialType);
}
-
- config.vecSlot.push_back(slot);
}
- int nEqID = GetLoadPortEqID(config.strPortName);
- if (nEqID < 0) {
- AfxMessageBox(_T("鏈煡鐨勭鍙e悕绉帮紒"));
- return;
+ 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);
+ }
}
- SERVO::CLoadPort* pPort = dynamic_cast<SERVO::CLoadPort*>(theApp.m_model.m_master.getEquipment(nEqID));
- if (!pPort) {
- AfxMessageBox(_T("鎵句笉鍒板搴旂殑 LoadPort 璁惧锛�"));
- return;
+
+ 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;
+ }
}
- // 搴旂敤閰嶇疆锛堜緥濡傛祴璇曠敓鎴愮幓鐠冿級
- if (pPort->testGenerateGlassListFromConfig(config) < 0) {
- AfxMessageBox(_T("Failed to generate glass list from configuration!"));
- return;
- }
+ return TRUE;
+}
- OnOK();
-}
\ No newline at end of file
+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