已添加2个文件
已修改15个文件
404 ■■■■■ 文件已修改
SourceCode/Bond/Servo/CEquipmentPage2.cpp 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMaster.cpp 75 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMaster.h 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMyStatusbar.cpp 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMyStatusbar.h 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CRobotTask.cpp 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CRobotTask.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CRobotTaskDlg.cpp 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CRobotTaskDlg.h 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Common.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Model.cpp 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Servo.rc 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Servo.vcxproj 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Servo.vcxproj.filters 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/ServoDlg.cpp 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/ServoDlg.h 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/resource.h 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipmentPage2.cpp
@@ -82,14 +82,15 @@
    ASSERT(m_pEquipment);
    for (int i = 0; i < SLOT_MAX; i++) {
        SERVO::CGlass* pGlass = m_pEquipment->getGlassFromSlot(i+1);
        pGlass->addRef();
        SERVO::CGlass* pBuddy = pGlass->getBuddy();
        int index = m_listCtrl.InsertItem(m_listCtrl.GetItemCount(), _T(""));
        m_listCtrl.SetItemData(index, (DWORD_PTR)pGlass);
        m_listCtrl.SetItemText(index, 1, pGlass->getID().c_str());
        if (pBuddy != nullptr) {
            m_listCtrl.SetItemText(index, 2, pBuddy->getID().c_str());
        if (pGlass != nullptr) {
            pGlass->addRef();
            SERVO::CGlass* pBuddy = pGlass->getBuddy();
            int index = m_listCtrl.InsertItem(m_listCtrl.GetItemCount(), _T(""));
            m_listCtrl.SetItemData(index, (DWORD_PTR)pGlass);
            m_listCtrl.SetItemText(index, 1, pGlass->getID().c_str());
            if (pBuddy != nullptr) {
                m_listCtrl.SetItemText(index, 2, pBuddy->getID().c_str());
            }
        }
    }
SourceCode/Bond/Servo/CMaster.cpp
@@ -279,6 +279,19 @@
    unsigned CMaster::DispatchProc()
    {
        // å„种机器
        CLoadPort* pLoadPort1 = (CLoadPort*)getEquipment(EQ_ID_LOADPORT1);
        CLoadPort* pLoadPort2 = (CLoadPort*)getEquipment(EQ_ID_LOADPORT2);
        CFliper* pFliper = (CFliper*)getEquipment(EQ_ID_FLIPER);
        CVacuumBake* pVacuumBack = (CVacuumBake*)getEquipment(EQ_ID_VACUUMBAKE);
        CAligner* pAligner = (CAligner*)getEquipment(EQ_ID_ALIGNER);
        ASSERT(pLoadPort1);
        ASSERT(pLoadPort2);
        ASSERT(pFliper);
        ASSERT(pVacuumBack);
        ASSERT(pAligner);
        while (1) {
            // å¾…退出信号或时间到
            HANDLE hEvents[] = { m_hEventDispatchThreadExit[0], m_hDispatchEvent };
@@ -310,30 +323,24 @@
            // è°ƒåº¦é€»è¾‘处理
            else if (m_state == MASTERSTATE::RUNNING) {
                unlock();
                LOGI("调度处理中...");
                // LOGI("调度处理中...");
                lock();
                if (m_pActiveRobotTask != nullptr) {
                    unlock();
                    // æ£€æµ‹åˆ°å½“前有正在下午的任务,确保当前任务完成或中止后继续
                    LOGI("检测到当前有正在下午的任务,确保当前任务完成或中止后继续...");
                    // LOGI("检测到当前有正在下午的任务,确保当前任务完成或中止后继续...");
                    continue;
                }
                // LoadPort -> Fliper(G2)
                CLoadPort* pLoadPort1 = (CLoadPort*)getEquipment(EQ_ID_LOADPORT1);
                CLoadPort* pLoadPort2 = (CLoadPort*)getEquipment(EQ_ID_LOADPORT2);
                CFliper* pFliper = (CFliper*)getEquipment(EQ_ID_FLIPER);
                CVacuumBake* pVacuumBack = (CVacuumBake*)getEquipment(EQ_ID_VACUUMBAKE);
                ASSERT(pLoadPort1);
                ASSERT(pLoadPort2);
                ASSERT(pFliper);
                ASSERT(pVacuumBack);
                m_pActiveRobotTask = createTransferTask(pLoadPort1, pFliper);
                if (m_pActiveRobotTask != nullptr) {
                    std::string strDescription = m_pActiveRobotTask->getDescription();
                    unlock();
                    if (m_listener.onRobotTaskEvent != nullptr) {
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
                    }
                    LOGI("创建新任务<%s>...", strDescription.c_str());
                    continue;
                }
@@ -342,6 +349,9 @@
                if (m_pActiveRobotTask != nullptr) {
                    std::string strDescription = m_pActiveRobotTask->getDescription();
                    unlock();
                    if (m_listener.onRobotTaskEvent != nullptr) {
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
                    }
                    LOGI("创建新任务<%s>...", strDescription.c_str());
                    continue;
                }
@@ -353,7 +363,10 @@
                if (m_pActiveRobotTask != nullptr) {
                    std::string strDescription = m_pActiveRobotTask->getDescription();
                    unlock();
                    LOGI("创建新任务1<%s>...", strDescription.c_str());
                    if (m_listener.onRobotTaskEvent != nullptr) {
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
                    }
                    LOGI("创建新任务<%s>...", strDescription.c_str());
                    continue;
                }
@@ -361,16 +374,40 @@
                if (m_pActiveRobotTask != nullptr) {
                    std::string strDescription = m_pActiveRobotTask->getDescription();
                    unlock();
                    LOGI("创建新任务2<%s>...", strDescription.c_str());
                    if (m_listener.onRobotTaskEvent != nullptr) {
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
                    }
                    LOGI("创建新任务<%s>...", strDescription.c_str());
                    continue;
                }
                // Fliper(G2) -> Aligner
                // VacuumBake(G1) -> Aligner
                m_pActiveRobotTask = createTransferTask(pFliper, pAligner);
                if (m_pActiveRobotTask != nullptr) {
                    std::string strDescription = m_pActiveRobotTask->getDescription();
                    unlock();
                    if (m_listener.onRobotTaskEvent != nullptr) {
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
                    }
                    LOGI("创建新任务<%s>...", strDescription.c_str());
                    continue;
                }
                m_pActiveRobotTask = createTransferTask(pVacuumBack, pAligner);
                if (m_pActiveRobotTask != nullptr) {
                    std::string strDescription = m_pActiveRobotTask->getDescription();
                    unlock();
                    if (m_listener.onRobotTaskEvent != nullptr) {
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
                    }
                    LOGI("创建新任务<%s>...", strDescription.c_str());
                    continue;
                }
                // Fliper(G2) -> Aligner
                // VacuumBake(G1) -> Aligner
                // Aligner -> Bonder
@@ -554,6 +591,10 @@
                    lock();
                    delete m_pActiveRobotTask;
                    m_pActiveRobotTask = nullptr;
                    if (m_listener.onRobotTaskEvent != nullptr) {
                        m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
                    }
                }
                unlock();
            }
SourceCode/Bond/Servo/CMaster.h
@@ -29,6 +29,7 @@
    typedef std::function<void(void* pMaster, CEquipment* pEquipment, int state, int alarmId, int unitId, int level)> ONEQALARM;
    typedef std::function<void(void* pMaster, CEquipment* pEquipment, CVcrEventReport* pReport)> ONEQVCREVENTREPORT;
    typedef std::function<void(void* pMaster, CEquipment* pEquipment, int code)> ONEQDATACHANGED;
    typedef std::function<void(void* pMaster, CRobotTask* pTask, int code)> ONROBOTTASKEVENT;
    typedef struct _MasterListener
    {
        ONMASTERSTATECHANGED    onMasterStateChanged;
@@ -37,6 +38,7 @@
        ONEQALARM               onEqAlarm;
        ONEQVCREVENTREPORT        onEqVcrEventReport;
        ONEQDATACHANGED         onEqDataChanged;
        ONROBOTTASKEVENT        onRobotTaskEvent;
    } MasterListener;
    class CMaster
SourceCode/Bond/Servo/CMyStatusbar.cpp
@@ -43,7 +43,15 @@
        m_brBkgnd.DeleteObject();
    }
    m_crBkgnd = color;
    m_brBkgnd.CreateSolidBrush(color);
    m_btnCurTask.SetFaceColor(m_crBkgnd);
    m_btnCurTask.SetFrameColor(m_crBkgnd);
    m_btnCurTask.SetFrameColor(BS_HOVER, CColorTransfer::ApproximateColor(m_crBkgnd, 0.05));
    m_btnCurTask.SetFrameColor(BS_PRESS, CColorTransfer::ApproximateColor(m_crBkgnd, 0.12));
    m_btnCurTask.SetBkgndColor(BS_HOVER, CColorTransfer::ApproximateColor(m_crBkgnd, 0.05));
    m_btnCurTask.SetBkgndColor(BS_PRESS, CColorTransfer::ApproximateColor(m_crBkgnd, 0.12));
    Invalidate(); 
    UpdateWindow();
}
@@ -51,6 +59,8 @@
void CMyStatusbar::setForegroundColor(COLORREF cr)
{
    m_crForeground = cr;
    m_btnCurTask.SetTextColor(m_crForeground);
    Invalidate();
    UpdateWindow();
}
@@ -60,11 +70,23 @@
    SetDlgItemText(IDC_LABEL_RUNTIME, pszText);
}
void CMyStatusbar::setCurTaskBtnText(const char* pszText)
{
    SetDlgItemText(IDC_BUTTON_ROBOTTASK, pszText);
}
BOOL CMyStatusbar::OnInitDialog()
{
    CDialogEx::OnInitDialog();
    // TODO:  åœ¨æ­¤æ·»åŠ é¢å¤–çš„åˆå§‹åŒ–
    m_btnCurTask.SubclassDlgItem(IDC_BUTTON_ROBOTTASK, this);
    // m_btnCurTask.SetIcon(hIcon1, hIcon1, 24);
    m_btnCurTask.SetFaceColor(m_crBkgnd);
    m_btnCurTask.SetFrameColor(m_crBkgnd);
    m_btnCurTask.SetFrameColor(BS_HOVER, RGB(218, 218, 218));
    m_btnCurTask.SetFrameColor(BS_PRESS, RGB(168, 168, 168));
    return TRUE;  // return TRUE unless you set the focus to a control
                  // å¼‚常: OCX å±žæ€§é¡µåº”返回 FALSE
@@ -96,6 +118,22 @@
    // TODO: åœ¨æ­¤å¤„添加消息处理程序代码
}
BOOL CMyStatusbar::OnCommand(WPARAM wParam, LPARAM lParam)
{
    CWnd* pItem;
    CRect rcItem;
    switch (LOWORD(wParam)) {
    case IDC_BUTTON_ROBOTTASK:
        pItem = GetDlgItem(IDC_BUTTON_ROBOTTASK);
        pItem->GetWindowRect(rcItem);
        GetParent()->SendMessage(ID_MSG_STATUSBAR_BTN_CLICKED, rcItem.left, LOWORD(wParam));
        break;
    }
    return CDialogEx::OnCommand(wParam, lParam);
}
void CMyStatusbar::OnSize(UINT nType, int cx, int cy)
{
    CDialogEx::OnSize(nType, cx, cy);
@@ -110,8 +148,21 @@
    int x;
    GetClientRect(&rcClient);
    x = 120;
    x = 20;
    pItem = GetDlgItem(IDC_LABEL_RUNTIME);
    pItem->GetClientRect(rcItem);
    pItem->MoveWindow(x, (rcClient.Height() - rcItem.Height()) / 2, rcItem.Width(), rcItem.Height());
}
    x += rcItem.Width();
    x += 8;
    pItem = GetDlgItem(IDC_LABEL_CUR_TASK_L);
    pItem->GetClientRect(rcItem);
    pItem->MoveWindow(x, (rcClient.Height() - rcItem.Height()) / 2, rcItem.Width(), rcItem.Height());
    x += rcItem.Width();
    x += 8;
    pItem = GetDlgItem(IDC_BUTTON_ROBOTTASK);
    pItem->GetClientRect(rcItem);
    pItem->MoveWindow(x, (rcClient.Height() - rcItem.Height()) / 2, rcItem.Width(), rcItem.Height());
    x += rcItem.Width();
}
SourceCode/Bond/Servo/CMyStatusbar.h
@@ -1,5 +1,9 @@
#pragma once
#include "BlButton.h"
#include "ColorTransfer.h"
#define ID_MSG_STATUSBAR_BTN_CLICKED        WM_USER + 20398
// CMyStatusbar å¯¹è¯æ¡†
@@ -16,6 +20,7 @@
    void setBackgroundColor(COLORREF color);
    void setForegroundColor(COLORREF cr);
    void setRunTimeText(const char* pszText);
    void setCurTaskBtnText(const char* pszText);
private:
    void Resize();
@@ -24,7 +29,7 @@
    COLORREF m_crForeground;
    COLORREF m_crBkgnd;
    CBrush m_brBkgnd;
    CBlButton m_btnCurTask;
// å¯¹è¯æ¡†æ•°æ®
#ifdef AFX_DESIGN_TIME
@@ -40,4 +45,5 @@
    afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
    afx_msg void OnDestroy();
    afx_msg void OnSize(UINT nType, int cx, int cy);
    virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
};
SourceCode/Bond/Servo/CRobotTask.cpp
@@ -42,6 +42,25 @@
        return strOut;
    }
    std::string CRobotTask::getSimpleDescription() const
    {
        std::string strOut = "CRobotTask<ID:";
        strOut = strOut + std::to_string(m_robotCmdParam.sequenceNo);
        strOut = strOut + ",Arm:";
        strOut = strOut + std::to_string(m_robotCmdParam.armNo);
        strOut = strOut + ",GetPossion:";
        strOut = strOut + std::to_string(m_robotCmdParam.getPosition);
        strOut = strOut + ",GetSlot:";
        strOut = strOut + std::to_string(m_robotCmdParam.getSlotNo);
        strOut = strOut + ",PutPossion:";
        strOut = strOut + std::to_string(m_robotCmdParam.putPosition);
        strOut = strOut + ",PutSlot:";
        strOut = strOut + std::to_string(m_robotCmdParam.putSlotNo);
        strOut = strOut + ">";
        return strOut;
    }
    void CRobotTask::setContext(CContext* pContext)
    {
        if (pContext != nullptr) {
SourceCode/Bond/Servo/CRobotTask.h
@@ -13,6 +13,7 @@
    public:
        std::string& getId();
        std::string getDescription() const;
        std::string getSimpleDescription() const;
        void setContext(CContext* pContext);
        CContext* getContext();
        void setRobotTransferParam(int seq, int armNo, int fromPos, int toPos, int fromSlot, int toSlot);
SourceCode/Bond/Servo/CRobotTaskDlg.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,124 @@
// CRobotTaskDlg.cpp: å®žçŽ°æ–‡ä»¶
//
#include "stdafx.h"
#include "Servo.h"
#include "CRobotTaskDlg.h"
#include "afxdialogex.h"
// CRobotTaskDlg å¯¹è¯æ¡†
IMPLEMENT_DYNAMIC(CRobotTaskDlg, CDialogEx)
CRobotTaskDlg::CRobotTaskDlg(CWnd* pParent /*=nullptr*/)
    : CDialogEx(IDD_DIALOG_ROBOT_TASK, pParent)
{
    m_pRobotTask = nullptr;
}
CRobotTaskDlg::~CRobotTaskDlg()
{
}
void CRobotTaskDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CRobotTaskDlg, CDialogEx)
    ON_WM_CTLCOLOR()
    ON_WM_DESTROY()
    ON_WM_SIZE()
    ON_WM_ACTIVATE()
END_MESSAGE_MAP()
// CRobotTaskDlg æ¶ˆæ¯å¤„理程序
void CRobotTaskDlg::SetRobotTask(SERVO::CRobotTask* pRobotTask)
{
    m_pRobotTask = pRobotTask;
    // å„控件是否显示;
    GetDlgItem(IDC_LABEL_NO_TASK)->ShowWindow(m_pRobotTask == nullptr ? SW_SHOW : SW_HIDE);
    GetDlgItem(IDC_LABEL_GET_PUT)->ShowWindow(m_pRobotTask != nullptr ? SW_SHOW : SW_HIDE);
    if (m_pRobotTask != nullptr) {
        SERVO::CEquipment* pEq1, * pEq2;
        pEq1 = theApp.m_model.getMaster().getEquipment(m_pRobotTask->getSrcPosition());
        pEq2 = theApp.m_model.getMaster().getEquipment(m_pRobotTask->getTarPosition());
        CString strText;
        strText.Format(_T("%s --> %s"), pEq1->getName().c_str(), pEq2->getName().c_str());
        SetDlgItemText(IDC_LABEL_GET_PUT, strText);
    }
}
BOOL CRobotTaskDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();
    // TODO:  åœ¨æ­¤æ·»åŠ é¢å¤–çš„åˆå§‹åŒ–
    return TRUE;  // return TRUE unless you set the focus to a control
                  // å¼‚常: OCX å±žæ€§é¡µåº”返回 FALSE
}
HBRUSH CRobotTaskDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
    // TODO:  åœ¨æ­¤æ›´æ”¹ DC çš„任何特性
    // TODO:  å¦‚果默认的不是所需画笔,则返回另一个画笔
    return hbr;
}
void CRobotTaskDlg::OnDestroy()
{
    CDialogEx::OnDestroy();
    // TODO: åœ¨æ­¤å¤„添加消息处理程序代码
}
void CRobotTaskDlg::OnSize(UINT nType, int cx, int cy)
{
    CDialogEx::OnSize(nType, cx, cy);
    if (GetDlgItem(IDC_LABEL_NO_TASK) == nullptr) return;
    Resize();
}
void CRobotTaskDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
{
    CWnd::OnActivate(nState, pWndOther, bMinimized);
    if (nState == WA_INACTIVE) {
        ShowWindow(SW_HIDE);
    }
}
void CRobotTaskDlg::Resize()
{
    CRect rcClient, rcItem;
    CWnd* pItem;
    GetClientRect(&rcClient);
    pItem = GetDlgItem(IDC_LABEL_NO_TASK);
    pItem->GetClientRect(&rcItem);
    pItem->MoveWindow((rcClient.Width() - rcItem.Width()) / 2,
        (rcClient.Height() - rcItem.Height()) / 2, rcItem.Width(), rcItem.Height());
    pItem = GetDlgItem(IDC_LABEL_GET_PUT);
    pItem->GetClientRect(&rcItem);
    pItem->MoveWindow(12,
        12, rcItem.Width(), rcItem.Height());
}
SourceCode/Bond/Servo/CRobotTaskDlg.h
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
#pragma once
#include "CRobotTask.h"
// CRobotTaskDlg å¯¹è¯æ¡†
class CRobotTaskDlg : public CDialogEx
{
    DECLARE_DYNAMIC(CRobotTaskDlg)
public:
    CRobotTaskDlg(CWnd* pParent = nullptr);   // æ ‡å‡†æž„造函数
    virtual ~CRobotTaskDlg();
public:
    void SetRobotTask(SERVO::CRobotTask* pRobotTask);
private:
    void Resize();
private:
    SERVO::CRobotTask* m_pRobotTask;
// å¯¹è¯æ¡†æ•°æ®
#ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_DIALOG_ROBOT_TASK };
#endif
protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV æ”¯æŒ
    DECLARE_MESSAGE_MAP()
public:
    virtual BOOL OnInitDialog();
    afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
    afx_msg void OnDestroy();
    afx_msg void OnSize(UINT nType, int cx, int cy);
    afx_msg void OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized);
};
SourceCode/Bond/Servo/Common.h
@@ -17,6 +17,7 @@
#define RX_CODE_ALARM_CLEAR                1009
#define RX_CODE_EQ_DATA_CHANGED            1010
#define RX_CODE_MASTER_STATE_CHANGED    1011
#define RX_CODE_EQ_ROBOT_TASK            1012
/* Channel Name */
SourceCode/Bond/Servo/Model.cpp
@@ -170,6 +170,9 @@
        LOGE("<CModel>onEqDataChanged.");
        notifyPtr(RX_CODE_EQ_DATA_CHANGED, pEquipment);
    };
    masterListener.onRobotTaskEvent = [&](void* pMaster, SERVO::CRobotTask* pTask, int code) {
        notifyPtr(RX_CODE_EQ_ROBOT_TASK, pTask);
    };
    m_master.setListener(masterListener);
SourceCode/Bond/Servo/Servo.rc
Binary files differ
SourceCode/Bond/Servo/Servo.vcxproj
@@ -205,6 +205,7 @@
    <ClInclude Include="CRobotCmdTestDlg.h" />
    <ClInclude Include="CPagePortStatus.h" />
    <ClInclude Include="CPortStatusReport.h" />
    <ClInclude Include="CRobotTaskDlg.h" />
    <ClInclude Include="GridControl\CellRange.h" />
    <ClInclude Include="GridControl\GridCell.h" />
    <ClInclude Include="GridControl\GridCellBase.h" />
@@ -333,6 +334,7 @@
    <ClCompile Include="CRobotCmdTestDlg.cpp" />
    <ClCompile Include="CPagePortStatus.cpp" />
    <ClCompile Include="CPortStatusReport.cpp" />
    <ClCompile Include="CRobotTaskDlg.cpp" />
    <ClCompile Include="GridControl\GridCell.cpp" />
    <ClCompile Include="GridControl\GridCellBase.cpp" />
    <ClCompile Include="GridControl\GridCellButton.cpp" />
SourceCode/Bond/Servo/Servo.vcxproj.filters
@@ -155,6 +155,7 @@
    <ClCompile Include="CMyStatusbar.cpp" />
    <ClCompile Include="CRobotTask.cpp" />
    <ClCompile Include="CSlot.cpp" />
    <ClCompile Include="CRobotTaskDlg.cpp" />
  </ItemGroup>
  <ItemGroup>
    <ClInclude Include="AlarmManager.h" />
@@ -315,6 +316,7 @@
    <ClInclude Include="CMyStatusbar.h" />
    <ClInclude Include="CRobotTask.h" />
    <ClInclude Include="CSlot.h" />
    <ClInclude Include="CRobotTaskDlg.h" />
  </ItemGroup>
  <ItemGroup>
    <ResourceCompile Include="Servo.rc" />
SourceCode/Bond/Servo/ServoDlg.cpp
@@ -84,6 +84,7 @@
    m_pPageRecipe = nullptr;
    m_pTopToolbar = nullptr;
    m_pMyStatusbar = nullptr;
    m_pRobotTaskDlg = nullptr;
}
void CServoDlg::DoDataExchange(CDataExchange* pDX)
@@ -119,6 +120,7 @@
    ON_MESSAGE(ID_MSG_PANEL_RESIZE, OnPanelResize)
    ON_NOTIFY(BYHMTAB_SEL_CHANGED, IDC_TAB1, &CServoDlg::OnTabSelChanged)
    ON_MESSAGE(ID_MSG_TOOLBAR_BTN_CLICKED, &CServoDlg::OnToolbarBtnClicked)
    ON_MESSAGE(ID_MSG_STATUSBAR_BTN_CLICKED, &CServoDlg::OnStatusbarBtnClicked)
END_MESSAGE_MAP()
@@ -183,6 +185,25 @@
                    m_pMyStatusbar->setBackgroundColor(STATUSBAR_BK_RUNNING);
                    m_pMyStatusbar->setForegroundColor(RGB(255, 255, 255));
                    SetTimer(TIMER_ID_UPDATE_RUMTIME, 500, nullptr);
                }
            }
            else if (RX_CODE_EQ_ROBOT_TASK == code) {
                SERVO::CRobotTask* pTask = theApp.m_model.getMaster().getActiveRobotTask();
                if (m_pRobotTaskDlg != nullptr) {
                    m_pRobotTaskDlg->SetRobotTask(pTask);
                }
                if (pTask == nullptr) {
                    m_pMyStatusbar->setCurTaskBtnText("无");
                }
                else {
                    SERVO::CEquipment* pEq1, * pEq2;
                    pEq1 = theApp.m_model.getMaster().getEquipment(pTask->getSrcPosition());
                    pEq2 = theApp.m_model.getMaster().getEquipment(pTask->getTarPosition());
                    if (pEq1 != nullptr && pEq2 != nullptr) {
                        CString strText;
                        strText.Format(_T("%s --> %s"), pEq1->getName().c_str(), pEq2->getName().c_str());
                        m_pMyStatusbar->setCurTaskBtnText((LPTSTR)(LPCTSTR)strText);
                    }
                }
            }
@@ -546,6 +567,12 @@
        m_pMyStatusbar = nullptr;
    }
    if (m_pRobotTaskDlg != nullptr) {
        m_pRobotTaskDlg->DestroyWindow();
        delete m_pRobotTaskDlg;
        m_pRobotTaskDlg = nullptr;
    }
    if (m_pTerminalDisplayDlg != nullptr) {
        m_pTerminalDisplayDlg->DestroyWindow();
        delete m_pTerminalDisplayDlg;
@@ -777,6 +804,27 @@
    return 0;
}
LRESULT CServoDlg::OnStatusbarBtnClicked(WPARAM wParam, LPARAM lParam)
{
    int id = (int)lParam;
    int x = (int)wParam;
    if (id == IDC_BUTTON_ROBOTTASK) {
        if (m_pRobotTaskDlg == nullptr) {
            m_pRobotTaskDlg = new CRobotTaskDlg();
            m_pRobotTaskDlg->Create(IDD_DIALOG_ROBOT_TASK, this);
        }
        CRect rcBar;
        int h = 258;
        int w = 388;
        m_pRobotTaskDlg->SetRobotTask(theApp.m_model.getMaster().getActiveRobotTask());
        m_pMyStatusbar->GetWindowRect(rcBar);
        m_pRobotTaskDlg->MoveWindow(x, rcBar.top - h, w, h);
        m_pRobotTaskDlg->ShowWindow(SW_SHOW);
    }
    return 0;
}
CString& CServoDlg::GetRuntimeFormatText(CString& strText, const char* pszSuffix)
{
    ULONGLONG ullRunTime = (ULONGLONG)(theApp.m_model.getMaster().getRunTime() * 0.001);
SourceCode/Bond/Servo/ServoDlg.h
@@ -15,6 +15,7 @@
#include "CPageGraph2.h"
#include "TopToolbar.h"
#include "CMyStatusbar.h"
#include "CRobotTaskDlg.h"
// CServoDlg å¯¹è¯æ¡†
@@ -37,12 +38,12 @@
private:
    IObserver* m_pObserver;
    CTerminalDisplayDlg* m_pTerminalDisplayDlg;
    CRobotTaskDlg* m_pRobotTaskDlg;
    CPageGraph1* m_pPageGraph1;
    CPageGraph2* m_pPageGraph2;
    CPageRecipe* m_pPageRecipe;
    CPageAlarm*     m_pPageAlarm;
    CPageLog*     m_pPageLog;
// å¯¹è¯æ¡†æ•°æ®
#ifdef AFX_DESIGN_TIME
@@ -95,4 +96,5 @@
    afx_msg LRESULT OnPanelResize(WPARAM wParam, LPARAM lParam);
    afx_msg void OnTabSelChanged(NMHDR* nmhdr, LRESULT* result);
    LRESULT OnToolbarBtnClicked(WPARAM wParam, LPARAM lParam);
    LRESULT OnStatusbarBtnClicked(WPARAM wParam, LPARAM lParam);
};
SourceCode/Bond/Servo/resource.h
Binary files differ