LAPTOP-SNT8I5JK\Boounion
2025-10-16 a351ed8a97a72bddfb281d2aa350a5c42a7f81a5
1.添加客户端列表显示;
已添加2个文件
已修改7个文件
377 ■■■■ 文件已修改
SourceCode/Bond/Servo/CMaster.h 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/ClientListDlg.cpp 141 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/ClientListDlg.h 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Servo.rc 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Servo.vcxproj 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Servo.vcxproj.user 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/ServoDlg.cpp 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/ServoDlg.h 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/resource.h 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMaster.h
@@ -1,4 +1,4 @@
#pragma once
#pragma once
#include <list>
#include "CEquipment.h"
#include "CEFEM.h"
@@ -171,7 +171,7 @@
            CEquipment* pTarEq, int nTarSlot, int armNo = 1);
    public:
        // â€”— IResourceView è¦†å†™ â€”—(注意 const)
        // â€”— IResourceView è¦†å†™ â€”—(注意 const)
        bool isProcessJobsEmpty() const override;
        bool recipeExists(const std::string& ppid) const override;
        bool carrierPresent(const std::string& carrierId) const override;
@@ -183,7 +183,7 @@
        std::string& getLastErrorText();
    public:
        // æ–°å¢žå‡½æ•°
        // æ–°å¢žå‡½æ•°
        CProcessJob* acquireNextProcessJob();
        CGlass* acquireNextGlass();
        int acquireGlassToQueue();
@@ -199,6 +199,9 @@
        bool canCreateControlJob();
        bool canCompleteControlJob();
        bool canDeleteControlJob();
        // DAQ Bridge鐩稿叧
        Collector* getCollector() const { return m_pCollector; }
    private:
        CRITICAL_SECTION m_criticalSection;
@@ -211,42 +214,42 @@
        bool m_bBatch;
    private:
        /* ç›‘控比特位的线程*/
        /* ç›‘控比特位的线程*/
        HANDLE m_hEventReadBitsThreadExit[2];
        HANDLE m_hReadBitsThreadHandle;
        unsigned m_nReadBitsThreadAddr;
        // è°ƒåº¦çº¿ç¨‹
        // è°ƒåº¦çº¿ç¨‹
        HANDLE m_hDispatchEvent;
        HANDLE m_hEventDispatchThreadExit[2];
        HANDLE m_hDispatchThreadHandle;
        unsigned m_nDispatchThreadAddr;
        // å¯åŠ¨æ—¶é—´ï¼Œè¿è¡Œæ—¶é—´ï¼ŒçŠ¶æ€
        // å¯åŠ¨æ—¶é—´ï¼Œè¿è¡Œæ—¶é—´ï¼ŒçŠ¶æ€
        ULONGLONG m_ullStartTime;
        ULONGLONG m_ullRunTime;
        MASTERSTATE m_state;
        // å½“前任务和已完成任务列表
        // å½“前任务和已完成任务列表
        CRobotTask* m_pActiveRobotTask;
        std::list< CRobotTask* > m_listTask;
        // é”™è¯¯ä»£ç 
        // é”™è¯¯ä»£ç 
        int m_nLastError;
        std::string m_strLastError;
        // åœ¨å¼€å§‹å·¥è‰ºå‰æ˜¯å¦å…ˆéœ€è¦å…ˆæ¯”较map
        // åœ¨å¼€å§‹å·¥è‰ºå‰æ˜¯å¦å…ˆéœ€è¦å…ˆæ¯”较map
        BOOL m_isCompareMapsBeforeProceeding;
        BOOL m_bJobMode;
        // åƒä¼ åœˆæ•°è®¡æ•°
        // åƒä¼ åœˆæ•°è®¡æ•°
        int m_nContinuousTransferCount;
        int m_nContinuousTransferStep;
        int m_nContinuousWorkingPort;
        int m_nContinuousWorkingSlot;
        // æ–°å¢žå·²ç»å¼€å§‹å¤„理的ProcessJob列表
        // æ–°å¢žå·²ç»å¼€å§‹å¤„理的ProcessJob列表
        std::vector<CProcessJob*> m_inProcesJobs;
        std::vector<CProcessJob*> m_completeProcessJobs;
        std::vector<CGlass*> m_queueGlasses;
SourceCode/Bond/Servo/ClientListDlg.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,141 @@
#include "stdafx.h"
#include "ClientListDlg.h"
#include "afxdialogex.h"
#include "../DAQBridge/core/Collector.h"
#include "CMaster.h"
#include "Model.h"
#include "Servo.h"
#include <chrono>
#include <iomanip>
#include <sstream>
// CClientListDlg å¯¹è¯æ¡†
IMPLEMENT_DYNAMIC(CClientListDlg, CDialogEx)
CClientListDlg::CClientListDlg(CWnd* pParent /*=nullptr*/)
    : CDialogEx(IDD_DIALOG_CLIENT_LIST, pParent)
{
}
CClientListDlg::~CClientListDlg()
{
}
void CClientListDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_LIST_CLIENTS, m_listClients);
}
BEGIN_MESSAGE_MAP(CClientListDlg, CDialogEx)
    ON_BN_CLICKED(IDC_BUTTON_REFRESH, &CClientListDlg::OnBnClickedRefresh)
    ON_WM_SYSCOMMAND()
END_MESSAGE_MAP()
// CClientListDlg æ¶ˆæ¯å¤„理程序
BOOL CClientListDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();
    // åˆå§‹åŒ–列表控件
    m_listClients.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_HEADERDRAGDROP);
    // æ·»åŠ åˆ—
    m_listClients.InsertColumn(0, _T("IP地址"), LVCFMT_LEFT, 120);
    m_listClients.InsertColumn(1, _T("端口"), LVCFMT_CENTER, 80);
    m_listClients.InsertColumn(2, _T("版本状态"), LVCFMT_CENTER, 100);
    m_listClients.InsertColumn(3, _T("连接状态"), LVCFMT_CENTER, 100);
    m_listClients.InsertColumn(4, _T("连接时间"), LVCFMT_LEFT, 150);
    // åˆ·æ–°å®¢æˆ·ç«¯åˆ—表
    RefreshClientList();
    return TRUE;  // é™¤éžå°†ç„¦ç‚¹è®¾ç½®åˆ°æŽ§ä»¶ï¼Œå¦åˆ™è¿”回 TRUE
}
void CClientListDlg::OnBnClickedRefresh()
{
    RefreshClientList();
}
void CClientListDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if (nID == SC_CLOSE)
    {
        CDialogEx::OnCancel();
        return;
    }
    CDialogEx::OnSysCommand(nID, lParam);
}
void CClientListDlg::RefreshClientList()
{
    // æ¸…空当前列表
    m_listClients.DeleteAllItems();
    m_clients.clear();
    // èŽ·å–Collector实例
    extern CServoApp theApp;
    SERVO::CMaster& master = theApp.m_model.getMaster();
    Collector* pCollector = master.getCollector();
    if (pCollector)
    {
        // èŽ·å–çœŸå®žçš„å®¢æˆ·ç«¯åˆ—è¡¨
        auto clientSummaries = pCollector->getClientList();
        // è½¬æ¢æ•°æ®æ ¼å¼
        for (const auto& summary : clientSummaries)
        {
            ClientInfo client;
            client.ip = summary.ip;
            client.port = summary.port;
            client.versionOk = summary.versionOk;
            client.status = summary.versionOk ? "已连接" : "版本不匹配";
            // èŽ·å–å½“å‰æ—¶é—´ä½œä¸ºè¿žæŽ¥æ—¶é—´ï¼ˆå®žé™…å®žçŽ°ä¸­åº”è¯¥ä»ŽCollector获取真实连接时间)
            auto now = std::chrono::system_clock::now();
            auto time_t = std::chrono::system_clock::to_time_t(now);
            std::tm tm;
            localtime_s(&tm, &time_t);
            std::ostringstream oss;
            oss << std::put_time(&tm, "%Y-%m-%d %H:%M:%S");
            client.connectTime = oss.str();
            m_clients.push_back(client);
        }
    }
    else
    {
        // å¦‚果无法获取Collector实例,显示提示信息
        ClientInfo noData;
        noData.ip = "无法获取数据";
        noData.port = 0;
        noData.versionOk = false;
        noData.status = "Collector未初始化";
        noData.connectTime = "";
        m_clients.push_back(noData);
    }
    // æ›´æ–°åˆ—表显示
    UpdateClientList(m_clients);
}
void CClientListDlg::UpdateClientList(const std::vector<ClientInfo>& clients)
{
    m_listClients.DeleteAllItems();
    for (size_t i = 0; i < clients.size(); ++i)
    {
        const ClientInfo& client = clients[i];
        int nItem = m_listClients.InsertItem(i, CString(client.ip.c_str()));
        m_listClients.SetItemText(nItem, 1, CString(std::to_string(client.port).c_str()));
        m_listClients.SetItemText(nItem, 2, client.versionOk ? _T("正常") : _T("异常"));
        m_listClients.SetItemText(nItem, 3, CString(client.status.c_str()));
        m_listClients.SetItemText(nItem, 4, CString(client.connectTime.c_str()));
    }
}
SourceCode/Bond/Servo/ClientListDlg.h
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,47 @@
#pragma once
#include "afxwin.h"
#include <vector>
#include <string>
// å®¢æˆ·ç«¯ä¿¡æ¯ç»“æž„
struct ClientInfo {
    std::string ip;
    uint16_t port;
    bool versionOk;
    std::string status;
    std::string connectTime;
};
// CClientListDlg å¯¹è¯æ¡†
class CClientListDlg : public CDialogEx
{
    DECLARE_DYNAMIC(CClientListDlg)
public:
    CClientListDlg(CWnd* pParent = nullptr);   // æ ‡å‡†æž„造函数
    virtual ~CClientListDlg();
// å¯¹è¯æ¡†æ•°æ®
#ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_DIALOG_CLIENT_LIST };
#endif
protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV æ”¯æŒ
    DECLARE_MESSAGE_MAP()
public:
    virtual BOOL OnInitDialog();
    afx_msg void OnBnClickedRefresh();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
private:
    void RefreshClientList();
    void UpdateClientList(const std::vector<ClientInfo>& clients);
private:
    CListCtrl m_listClients;
    std::vector<ClientInfo> m_clients;
};
SourceCode/Bond/Servo/Servo.rc
Binary files differ
SourceCode/Bond/Servo/Servo.vcxproj
@@ -237,6 +237,7 @@
    <ClInclude Include="CExpandableListCtrl.h" />
    <ClInclude Include="CGlassPool.h" />
    <ClInclude Include="ChangePasswordDlg.h" />
    <ClInclude Include="ClientListDlg.h" />
    <ClInclude Include="CMyStatusbar.h" />
    <ClInclude Include="CPageCollectionEvent.h" />
    <ClInclude Include="CPageGlassList.h" />
@@ -449,6 +450,7 @@
    <ClCompile Include="CExpandableListCtrl.cpp" />
    <ClCompile Include="CGlassPool.cpp" />
    <ClCompile Include="ChangePasswordDlg.cpp" />
    <ClCompile Include="ClientListDlg.cpp" />
    <ClCompile Include="CMyStatusbar.cpp" />
    <ClCompile Include="CPageCollectionEvent.cpp" />
    <ClCompile Include="CPageGlassList.cpp" />
SourceCode/Bond/Servo/Servo.vcxproj.user
@@ -7,6 +7,6 @@
    <RemoteDebuggerCommand>\\DESKTOP-IODBVIQ\Servo\Debug\Servo.exe</RemoteDebuggerCommand>
    <RemoteDebuggerWorkingDirectory>\\DESKTOP-IODBVIQ\Servo\Debug\</RemoteDebuggerWorkingDirectory>
    <RemoteDebuggerServerName>DESKTOP-IODBVIQ</RemoteDebuggerServerName>
    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
    <DebuggerFlavor>WindowsRemoteDebugger</DebuggerFlavor>
  </PropertyGroup>
</Project>
SourceCode/Bond/Servo/ServoDlg.cpp
@@ -1,5 +1,5 @@
// ServoDlg.cpp : å®žçŽ°æ–‡ä»¶

// ServoDlg.cpp : å®žçŽ°æ–‡ä»¶
//
#include "stdafx.h"
@@ -28,6 +28,7 @@
#include "CPageCollectionEvent.h"
#include "CControlJobDlg.h"
#include "InputDialog.h"
#include "ClientListDlg.h"
#include "CControlJobManagerDlg.h"
@@ -36,32 +37,32 @@
#endif
/* åˆ›å»ºç»ˆç«¯çš„定时器 */
/* åˆ›å»ºç»ˆç«¯çš„定时器 */
#define TIMER_ID_CREATE_TERMINAL        1
/* è¿è¡Œæ—¶é—´å®šæ—¶å™¨ */
/* è¿è¡Œæ—¶é—´å®šæ—¶å™¨ */
#define TIMER_ID_UPDATE_RUMTIME            2
/* Test */
#define TIMER_ID_TEST                    3
// ç”¨äºŽåº”用程序“关于”菜单项的 CAboutDlg å¯¹è¯æ¡†
// ç”¨äºŽåº”用程序“关于”菜单项的 CAboutDlg å¯¹è¯æ¡†
class CAboutDlg : public CDialogEx
{
public:
    CAboutDlg();
// å¯¹è¯æ¡†æ•°æ®
// å¯¹è¯æ¡†æ•°æ®
#ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_ABOUTBOX };
#endif
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV æ”¯æŒ
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV æ”¯æŒ
// å®žçް
// å®žçް
protected:
    DECLARE_MESSAGE_MAP()
};
@@ -79,7 +80,7 @@
END_MESSAGE_MAP()
// CServoDlg å¯¹è¯æ¡†
// CServoDlg å¯¹è¯æ¡†
CServoDlg::CServoDlg(CWnd* pParent /*=NULL*/)
@@ -134,6 +135,8 @@
    ON_UPDATE_COMMAND_UI(ID_MENU_TEST_MESSAGE_SET, &CServoDlg::OnUpdateMenuTestMessageSet)
    ON_COMMAND(ID_MENU_TEST_MESSAGE_CLEAR, &CServoDlg::OnMenuTestMessageClear)
    ON_UPDATE_COMMAND_UI(ID_MENU_TEST_MESSAGE_CLEAR, &CServoDlg::OnUpdateMenuTestMessageClear)
    ON_COMMAND(ID_MENU_TOOLS_CLIENT_LIST, &CServoDlg::OnMenuToolsClientList)
    ON_UPDATE_COMMAND_UI(ID_MENU_TOOLS_CLIENT_LIST, &CServoDlg::OnUpdateMenuToolsClientList)
    ON_COMMAND(ID_MENU_HELP_ABOUT, &CServoDlg::OnMenuHelpAbout)
    ON_WM_INITMENUPOPUP()
    ON_WM_TIMER()
@@ -144,12 +147,12 @@
END_MESSAGE_MAP()
// CServoDlg æ¶ˆæ¯å¤„理程序
// CServoDlg æ¶ˆæ¯å¤„理程序
void CServoDlg::InitRxWindows()
{
    /* code */
    // è®¢é˜…数据
    // è®¢é˜…数据
    IRxWindows* pRxWindows = RX_GetRxWindows();
    pRxWindows->enableLog(5);
    if (m_pObserver == NULL) {
@@ -208,7 +211,7 @@
                else if (state == SERVO::MASTERSTATE::STARTING) {
                    m_pMyStatusbar->setBackgroundColor(STATUSBAR_BK_STARTING);
                    m_pMyStatusbar->setForegroundColor(RGB(0, 0, 0));
                    m_pMyStatusbar->setRunTimeText("正在启动...");
                    m_pMyStatusbar->setRunTimeText("正在启动...");
                }
                else if (state == SERVO::MASTERSTATE::MSERROR) {
                    m_pTopToolbar->GetBtn(IDC_BUTTON_RUN)->EnableWindow(TRUE);
@@ -217,7 +220,7 @@
                    m_pTopToolbar->GetBtn(IDC_BUTTON_STOP)->EnableWindow(FALSE);
                    m_pMyStatusbar->setBackgroundColor(STATUSBAR_BK_ALARM);
                    m_pMyStatusbar->setForegroundColor(RGB(0, 0, 0));
                    m_pMyStatusbar->setRunTimeText("启动失败.");
                    m_pMyStatusbar->setRunTimeText("启动失败.");
                    m_pTopToolbar->GetBtn(IDC_BUTTON_ALARM)->EnableWindow(TRUE);
                    KillTimer(TIMER_ID_UPDATE_RUMTIME);
                }
@@ -230,7 +233,7 @@
                    m_pMyStatusbar->setForegroundColor(RGB(0, 0, 0));
                    m_pMyStatusbar->setRunTimeText(theApp.m_model.getMaster().getLastErrorText().c_str());
                    if (theApp.m_model.getMaster().getLastError() == ER_CODE_AOI_NG) {
                        AfxMessageBox(_T("AOI检测失败,请操作员介入解决问题!"));
                        AfxMessageBox(_T("AOI检测失败,请操作员介入解决问题!"));
                    }
                    m_pTopToolbar->GetBtn(IDC_BUTTON_ALARM)->EnableWindow(TRUE);
                    KillTimer(TIMER_ID_UPDATE_RUMTIME);
@@ -274,13 +277,13 @@
                        }
                    }
                    else if (exCode == ROBOT_EVENT_FINISH) {
                        m_pMyStatusbar->setCurTaskBtnText("无");
                        m_pMyStatusbar->setCurTaskBtnText("无");
                    }
                    else if (exCode == ROBOT_EVENT_ABORT) {
                        m_pMyStatusbar->setCurTaskBtnText("无");
                        m_pMyStatusbar->setCurTaskBtnText("无");
                    }
                    else if (exCode == ROBOT_EVENT_RESTORE) {
                        m_pMyStatusbar->setCurTaskBtnText("无");
                        m_pMyStatusbar->setCurTaskBtnText("无");
                    }
                }
            }
@@ -330,9 +333,9 @@
{
    CDialogEx::OnInitDialog();
    // å°†â€œå…³äºŽ...”菜单项添加到系统菜单中。
    // å°†â€œå…³äºŽ...”菜单项添加到系统菜单中。
    // IDM_ABOUTBOX å¿…须在系统命令范围内。
    // IDM_ABOUTBOX å¿…须在系统命令范围内。
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);
@@ -350,17 +353,17 @@
        }
    }
    // è®¾ç½®æ­¤å¯¹è¯æ¡†çš„图标。  å½“应用程序主窗口不是对话框时,框架将自动
    //  æ‰§è¡Œæ­¤æ“ä½œ
    SetIcon(m_hIcon, TRUE);            // è®¾ç½®å¤§å›¾æ ‡
    SetIcon(m_hIcon, FALSE);        // è®¾ç½®å°å›¾æ ‡
    // è®¾ç½®æ­¤å¯¹è¯æ¡†çš„图标。  å½“应用程序主窗口不是对话框时,框架将自动
    //  æ‰§è¡Œæ­¤æ“ä½œ
    SetIcon(m_hIcon, TRUE);            // è®¾ç½®å¤§å›¾æ ‡
    SetIcon(m_hIcon, FALSE);        // è®¾ç½®å°å›¾æ ‡
    // model init
    theApp.m_model.init();
    SetTimer(TIMER_ID_TEST, 1000, nullptr);
    // èœå•
    // èœå•
    CMenu menu;
    menu.LoadMenu(IDR_MENU_APP);
    SetMenu(&menu);
@@ -397,13 +400,13 @@
    CHmTab* m_pTab = CHmTab::Hook(GetDlgItem(IDC_TAB1)->m_hWnd);
    m_pTab->SetPaddingLeft(20);
    m_pTab->SetItemMarginLeft(18);
    m_pTab->AddItem("״̬ͼ", FALSE);
    m_pTab->AddItem("连接图", TRUE);
    m_pTab->AddItem("状态图", FALSE);
    m_pTab->AddItem("连接图", TRUE);
    m_pTab->AddItem("Glass", TRUE);
    m_pTab->AddItem("配方", TRUE);
    m_pTab->AddItem("报警", TRUE);
    m_pTab->AddItem("日志", TRUE);
    m_pTab->AddItem("搬运任务", TRUE);
    m_pTab->AddItem("配方", TRUE);
    m_pTab->AddItem("报警", TRUE);
    m_pTab->AddItem("日志", TRUE);
    m_pTab->AddItem("搬运任务", TRUE);
    m_pTab->SetCurSel(0);
    m_pTab->SetBkgndColor(RGB(222, 222, 222));
    ShowChildPage(0);
@@ -425,7 +428,7 @@
    // è°ƒæ•´åˆå§‹çª—口位置
    // è°ƒæ•´åˆå§‹çª—口位置
    CRect rcWnd;
    GetWindowRect(&rcWnd);
    int width = GetSystemMetrics(SM_CXSCREEN);
@@ -439,22 +442,22 @@
    Resize();
    // ç›¸å½“于延时调用master的初始化
    // ç›¸å½“于延时调用master的初始化
    theApp.m_model.m_master.init();
    theApp.m_model.loadPortParams();
    // åˆå§‹åŒ–master以后需要控件绑定数据
    // åˆå§‹åŒ–master以后需要控件绑定数据
    m_pPageGraph1->BindEquipmentToGraph();
    // æ›´æ–°ç™»å½•状态
    // æ›´æ–°ç™»å½•状态
    UpdateLoginStatus();
    //SystemLogManager::getInstance.log(SystemLogManager::LogType::Info, _T("BondEq启动..."));
    //SystemLogManager::getInstance.log(SystemLogManager::LogType::Info, _T("BondEq启动..."));
    //SystemLogManager::getInstance.
    return TRUE;  // é™¤éžå°†ç„¦ç‚¹è®¾ç½®åˆ°æŽ§ä»¶ï¼Œå¦åˆ™è¿”回 TRUE
    return TRUE;  // é™¤éžå°†ç„¦ç‚¹è®¾ç½®åˆ°æŽ§ä»¶ï¼Œå¦åˆ™è¿”回 TRUE
}
void CServoDlg::OnSysCommand(UINT nID, LPARAM lParam)
@@ -470,19 +473,19 @@
    }
}
// å¦‚果向对话框添加最小化按钮,则需要下面的代码
//  æ¥ç»˜åˆ¶è¯¥å›¾æ ‡ã€‚  å¯¹äºŽä½¿ç”¨æ–‡æ¡£/视图模型的 MFC åº”用程序,
//  è¿™å°†ç”±æ¡†æž¶è‡ªåŠ¨å®Œæˆã€‚
// å¦‚果向对话框添加最小化按钮,则需要下面的代码
//  æ¥ç»˜åˆ¶è¯¥å›¾æ ‡ã€‚  å¯¹äºŽä½¿ç”¨æ–‡æ¡£/视图模型的 MFC åº”用程序,
//  è¿™å°†ç”±æ¡†æž¶è‡ªåŠ¨å®Œæˆã€‚
void CServoDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // ç”¨äºŽç»˜åˆ¶çš„设备上下文
        CPaintDC dc(this); // ç”¨äºŽç»˜åˆ¶çš„设备上下文
        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
        // ä½¿å›¾æ ‡åœ¨å·¥ä½œåŒºçŸ©å½¢ä¸­å±…中
        // ä½¿å›¾æ ‡åœ¨å·¥ä½œåŒºçŸ©å½¢ä¸­å±…中
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
@@ -490,7 +493,7 @@
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;
        // ç»˜åˆ¶å›¾æ ‡
        // ç»˜åˆ¶å›¾æ ‡
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
@@ -499,8 +502,8 @@
    }
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CServoDlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
@@ -660,6 +663,17 @@
    pCmdUI->Enable(TRUE);
}
void CServoDlg::OnMenuToolsClientList()
{
    CClientListDlg dlg;
    dlg.DoModal();
}
void CServoDlg::OnUpdateMenuToolsClientList(CCmdUI* pCmdUI)
{
    pCmdUI->Enable(TRUE);
}
void CServoDlg::OnMenuHelpAbout()
{
    theApp.m_model.getMaster().test();
@@ -669,14 +683,14 @@
void CServoDlg::OnBnClickedOk()
{
    // TODO: åœ¨æ­¤æ·»åŠ æŽ§ä»¶é€šçŸ¥å¤„ç†ç¨‹åºä»£ç 
    // TODO: åœ¨æ­¤æ·»åŠ æŽ§ä»¶é€šçŸ¥å¤„ç†ç¨‹åºä»£ç 
    CDialogEx::OnOK();
}
void CServoDlg::OnBnClickedCancel()
{
    // TODO: åœ¨æ­¤æ·»åŠ æŽ§ä»¶é€šçŸ¥å¤„ç†ç¨‹åºä»£ç 
    // TODO: åœ¨æ­¤æ·»åŠ æŽ§ä»¶é€šçŸ¥å¤„ç†ç¨‹åºä»£ç 
    CDialogEx::OnCancel();
}
@@ -870,7 +884,7 @@
void CServoDlg::OnClose()
{
    // TODO: åœ¨æ­¤æ·»åŠ æ¶ˆæ¯å¤„ç†ç¨‹åºä»£ç å’Œ/或调用默认值
    // TODO: åœ¨æ­¤æ·»åŠ æ¶ˆæ¯å¤„ç†ç¨‹åºä»£ç å’Œ/或调用默认值
    CDialogEx::OnClose();
}
@@ -895,7 +909,7 @@
void CServoDlg::OnTimer(UINT_PTR nIDEvent)
{
    if (TIMER_ID_CREATE_TERMINAL == nIDEvent) {
        // é¢„先创建终端窗口
        // é¢„先创建终端窗口
        KillTimer(TIMER_ID_CREATE_TERMINAL);
        char szBuffer[MAX_PATH];
        sprintf_s(szBuffer, MAX_PATH, "%s\\RES\\TeminalMsg.html", (LPTSTR)(LPCTSTR)theApp.m_strAppDir);
@@ -982,7 +996,7 @@
        ::EnableMenuItem(hMenu, ID_OPEATOR_SWITCH, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
        ::EnableMenuItem(hMenu, ID_OPERATOR_LOGOUT, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
        m_pTopToolbar->SetOperatorBtnText(_T("未登录"));
        m_pTopToolbar->SetOperatorBtnText(_T("未登录"));
    }
}
@@ -992,14 +1006,14 @@
    if (id == IDC_BUTTON_RUN || id == IDC_BUTTON_STOP) {
        UserRole emRole = UserManager::getInstance().getCurrentUserRole();
        if (emRole != UserRole::SuperAdmin) {
            AfxMessageBox(_T("当前用户并非管理员!!!"));
            AfxMessageBox(_T("当前用户并非管理员!!!"));
            return 1;
        }
    }
    if (id == IDC_BUTTON_RUN) {
        if (theApp.m_model.getMaster().getState() == SERVO::MASTERSTATE::MSERROR) {
            AfxMessageBox("当前有机台发生错误,不能启动,请确认解决问题后再尝试重新启动!");
            AfxMessageBox("当前有机台发生错误,不能启动,请确认解决问题后再尝试重新启动!");
        }
        else {
            if (theApp.m_model.getMaster().start() == 0) {
@@ -1011,7 +1025,7 @@
    }
    else if (id == IDC_BUTTON_RUN_BATCH) {
        if (theApp.m_model.getMaster().getState() == SERVO::MASTERSTATE::MSERROR) {
            AfxMessageBox("当前有机台发生错误,不能启动,请确认解决问题后再尝试重新启动!");
            AfxMessageBox("当前有机台发生错误,不能启动,请确认解决问题后再尝试重新启动!");
        }
        else {
            if (theApp.m_model.getMaster().startBatch() == 0) {
@@ -1023,7 +1037,7 @@
    }
    else if (id == IDC_BUTTON_RUN_CT) {
        if (theApp.m_model.getMaster().getState() == SERVO::MASTERSTATE::MSERROR) {
            AfxMessageBox("当前有机台发生错误,不能启动,请确认解决问题后再尝试重新启动!");
            AfxMessageBox("当前有机台发生错误,不能启动,请确认解决问题后再尝试重新启动!");
        }
        else {
            if (theApp.m_model.getMaster().startContinuousTransfer() == 0) {
@@ -1082,7 +1096,7 @@
        else if (2 == menuId) {
            CUserManagerDlg dlg;
            if (dlg.DoModal() != IDOK) {
                logManager.log(SystemLogManager::LogType::Operation, _T("用户管理的预操作被取消!"));
                logManager.log(SystemLogManager::LogType::Operation, _T("用户管理的预操作被取消!"));
            }
        }
        else if (3 == menuId) {
@@ -1090,14 +1104,14 @@
            dlg.DoModal();
        }
        else if (4 == menuId) {
            int ret = AfxMessageBox(_T("是否切换用户?切换用户会退出当前账号!"), MB_OKCANCEL | MB_ICONEXCLAMATION);
            int ret = AfxMessageBox(_T("是否切换用户?切换用户会退出当前账号!"), MB_OKCANCEL | MB_ICONEXCLAMATION);
            if (ret != IDOK) {
                return 0;
            }
            logManager.log(SystemLogManager::LogType::Operation, _T("确认切换角色!"));
            logManager.log(SystemLogManager::LogType::Operation, _T("确认切换角色!"));
            if (userManager.isLoggedIn()) {
                logManager.log(SystemLogManager::LogType::Info, _T("退出登录!"));
                logManager.log(SystemLogManager::LogType::Info, _T("退出登录!"));
                userManager.logout();
            }
@@ -1106,13 +1120,13 @@
        }
        else {
            CString cstrMessage;
            cstrMessage.Format(_T("是否退出用户 [%s]?"), userManager.getCurrentUser().c_str());
            cstrMessage.Format(_T("是否退出用户 [%s]?"), userManager.getCurrentUser().c_str());
            int ret = AfxMessageBox(_T(cstrMessage), MB_OKCANCEL | MB_ICONEXCLAMATION);
            if (ret != IDOK) {
                return 0;
            }
            logManager.log(SystemLogManager::LogType::Info, _T("退出登录!"));
            logManager.log(SystemLogManager::LogType::Info, _T("退出登录!"));
            userManager.logout();
        }
@@ -1156,16 +1170,16 @@
    SERVO::MASTERSTATE state = theApp.m_model.getMaster().getState();
    if (state == SERVO::MASTERSTATE::RUNNING) {
        strText.Format(_T("正在运行:%02d:%02d:%02d   %s"), h, m, s, pszSuffix);
        strText.Format(_T("正在运行:%02d:%02d:%02d   %s"), h, m, s, pszSuffix);
    }
    else if (state == SERVO::MASTERSTATE::RUNNING_CONTINUOUS_TRANSFER) {
        strText.Format(_T("千传模式:%02d:%02d:%02d   %s"), h, m, s, pszSuffix);
        strText.Format(_T("千传模式:%02d:%02d:%02d   %s"), h, m, s, pszSuffix);
    }
    else if (state == SERVO::MASTERSTATE::RUNNING_BATCH) {
        strText.Format(_T("JOB模式:%02d:%02d:%02d   %s"), h, m, s, pszSuffix);
        strText.Format(_T("JOB模式:%02d:%02d:%02d   %s"), h, m, s, pszSuffix);
    }
    else {
        strText.Format(_T("已运行:%02d:%02d:%02d   %s"), h, m, s, pszSuffix);
        strText.Format(_T("已运行:%02d:%02d:%02d   %s"), h, m, s, pszSuffix);
    }
    return strText;
SourceCode/Bond/Servo/ServoDlg.h
@@ -1,5 +1,5 @@
// ServoDlg.h : å¤´æ–‡ä»¶

// ServoDlg.h : å¤´æ–‡ä»¶
//
#pragma once
@@ -20,12 +20,12 @@
#include "CPageGlassList.h"
// CServoDlg å¯¹è¯æ¡†
// CServoDlg å¯¹è¯æ¡†
class CServoDlg : public CDialogEx
{
// æž„造
// æž„造
public:
    CServoDlg(CWnd* pParent = NULL);    // æ ‡å‡†æž„造函数
    CServoDlg(CWnd* pParent = NULL);    // æ ‡å‡†æž„造函数
public:
@@ -50,16 +50,16 @@
    CPageLog*     m_pPageLog;
    CPageTransferLog* m_pPageTransferLog;
// å¯¹è¯æ¡†æ•°æ®
// å¯¹è¯æ¡†æ•°æ®
#ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_SERVO_DIALOG };
#endif
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV æ”¯æŒ
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV æ”¯æŒ
// å®žçް
// å®žçް
protected:
    HICON m_hIcon;
    COLORREF m_crBkgnd;
@@ -70,7 +70,7 @@
    CPanelAttributes* m_pPanelAttributes;
    CMyStatusbar* m_pMyStatusbar;
    // ç”Ÿæˆçš„æ¶ˆæ¯æ˜ å°„函数
    // ç”Ÿæˆçš„æ¶ˆæ¯æ˜ å°„函数
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
@@ -98,6 +98,8 @@
    afx_msg void OnUpdateMenuTestMessageSet(CCmdUI* pCmdUI);
    afx_msg void OnMenuTestMessageClear();
    afx_msg void OnUpdateMenuTestMessageClear(CCmdUI* pCmdUI);
    afx_msg void OnMenuToolsClientList();
    afx_msg void OnUpdateMenuToolsClientList(CCmdUI* pCmdUI);
    afx_msg void OnMenuHelpAbout();
    afx_msg void OnTimer(UINT_PTR nIDEvent);
    afx_msg LRESULT OnPanelResize(WPARAM wParam, LPARAM lParam);
SourceCode/Bond/Servo/resource.h
Binary files differ