1.增加人工处理(移除、抱走)物料功能,以便和机器中的实物丰符合。
2.Port1 ~ Port4,type, mode, cassette type, transfer mode, enable mode, type auto change mode数据获取。
3.增加通用的读取cc-link int数据的CEqReadIntStep
已添加4个文件
已修改13个文件
970 ■■■■■ 文件已修改
Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.1.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEqPortChangeStep.cpp 268 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEqPortChangeStep.h 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEqReadIntStep.cpp 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEqReadIntStep.h 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipment.cpp 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipment.h 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipmentPage1.cpp 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipmentPage1.h 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipmentPage2.cpp 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipmentPage2.h 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMaster.cpp 224 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Common.h 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Servo.rc 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Servo.vcxproj 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Servo.vcxproj.filters 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/resource.h 补丁 | 查看 | 原始文档 | blame | 历史
Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.1.xlsx
Binary files differ
SourceCode/Bond/Servo/CEqPortChangeStep.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,268 @@
#include "stdafx.h"
#include "CEqPortChangeStep.h"
#include "Log.h"
namespace SERVO {
    CEqPortChangeStep::CEqPortChangeStep() : CReadStep()
    {
        m_nPortDev = 0;
        m_nPortType = 0;
        m_nPortMode = 0;
        m_nPortCassetteType = 0;
        m_nPortTransferMode = 0;
        m_nPortEanbleMode = 0;
        m_nPortTypeAutoChangeMode = 0;
    }
    CEqPortChangeStep::~CEqPortChangeStep()
    {
    }
    void CEqPortChangeStep::getAttributeVector(CAttributeVector& attrubutes)
    {
        CReadStep::getAttributeVector(attrubutes);
        std::string strTemp;
        attrubutes.addAttribute(new CAttribute("Port Dev",
            ("W" + CToolUnits::toHexString(m_nPortDev, strTemp)).c_str(), ""));
        attrubutes.addAttribute(new CAttribute("PortType",
            std::to_string(m_nPortType).c_str(), getPortTypeDescription(strTemp).c_str()));
        attrubutes.addAttribute(new CAttribute("PortMode",
            std::to_string(m_nPortMode).c_str(), getPortModeDescription(strTemp).c_str()));
        attrubutes.addAttribute(new CAttribute("PortCassetteType",
            std::to_string(m_nPortCassetteType).c_str(), getPortCassetteTypeDescription(strTemp).c_str()));
        attrubutes.addAttribute(new CAttribute("PortTransferMode",
            std::to_string(m_nPortTransferMode).c_str(), getPortTransferModeDescription(strTemp).c_str()));
        attrubutes.addAttribute(new CAttribute("PortEnableMode",
            std::to_string(m_nPortEanbleMode).c_str(), getPortEnableModeDescription(strTemp).c_str()));
        attrubutes.addAttribute(new CAttribute("PortTypeAutoChangeMode",
            std::to_string(m_nPortTypeAutoChangeMode).c_str(), getPortTypeAutoChangeModeDescription(strTemp).c_str()));
    }
    int CEqPortChangeStep::onReadData()
    {
        CReadStep::onReadData();
        char szBuffer[32];
        int nRet = m_pCclink->ReadData2(m_station, DeviceType::W, m_nPortDev, 32, szBuffer);
        if (0 != nRet) {
            return -1;
        }
        m_nPortType = (unsigned int)CToolUnits::toInt16(&szBuffer[0]);
        m_nPortMode = (unsigned int)CToolUnits::toInt16(&szBuffer[2]);
        m_nPortCassetteType = (unsigned int)CToolUnits::toInt32(&szBuffer[4]);
        m_nPortTransferMode = (unsigned int)CToolUnits::toInt16(&szBuffer[8]);
        m_nPortEanbleMode = (unsigned int)CToolUnits::toInt16(&szBuffer[10]);
        m_nPortTypeAutoChangeMode = (unsigned int)CToolUnits::toInt16(&szBuffer[12]);
        /*
        LOGI("<CEqAlarmStep> Equipment Alarm state Changed<State:%d, Unit:%d, Level:%d, Code:%d, ID:%d>\n",
            m_nAlarmState, m_nUnitId, m_nAlarmLevel, m_nAlarmCode, m_nAlarmId,
            m_strText.c_str(), m_strDescription.c_str());
*/
        return 0;
    }
    int CEqPortChangeStep::onComplete()
    {
        CReadStep::onComplete();
        LOGI("<CEQPortChangeStep> onComplete.");
        return 0;
    }
    int CEqPortChangeStep::onTimeout()
    {
        CReadStep::onTimeout();
        LOGI("<CEQPortChangeStep> onTimeout.");
        return 0;
    }
    void CEqPortChangeStep::setPortDev(int nDev)
    {
        m_nPortDev = nDev;
    }
    int CEqPortChangeStep::getPortType()
    {
        return m_nPortType;
    }
    /*
     1: Loading Port
     2: Unloading Port
     3: Both Port
     4: Buffer Port-Buffer Type
     5: Buffer Port-Loader in Buffer Type
     6: Buffer Port-Un-loader in Buffer Type
     7: Unloading Partial Port
     */
    std::string& CEqPortChangeStep::getPortTypeDescription(std::string& strDescription)
    {
        switch (m_nPortType) {
        case 1:
            strDescription = _T("Loading Port");
            break;
        case 2:
            strDescription = _T("Unloading Port");
            break;
        case 3:
            strDescription = _T("Both Port");
            break;
        case 4:
            strDescription = _T("Buffer Port - Buffer Type");
            break;
        case 5:
            strDescription = _T("Buffer Port - Loader in Buffer Type");
            break;
        case 6:
            strDescription = _T("Buffer Port - Un-loader in Buffer Type");
            break;
        case 7:
            strDescription = _T("Unloading Partial Port");
            break;
        default:
            strDescription = _T("");
            break;
        }
        return strDescription;
    }
    /*
     0: OutOfService
     1: TransferBlocked
     2: ReadyToLoad
     3: ReadyToUnload
     4: InService
     5: TransferReady
     */
    std::string& CEqPortChangeStep::getPortModeDescription(std::string& strDescription)
    {
        switch (m_nPortMode) {
        case 0:
            strDescription = _T("OutOfService");
            break;
        case 1:
            strDescription = _T("TransferBlocked");
            break;
        case 2:
            strDescription = _T("ReadyToLoad");
            break;
        case 3:
            strDescription = _T("ReadyToUnload");
            break;
        case 4:
            strDescription = _T("InService");
            break;
        case 5:
            strDescription = _T("TransferReady");
            break;
        default:
            strDescription = _T("");
            break;
        }
        return strDescription;
    }
    /*
     1: G1
     2: G2
     3: G1&G2
     */
    std::string& CEqPortChangeStep::getPortCassetteTypeDescription(std::string& strDescription)
    {
        switch (m_nPortCassetteType) {
        case 1:
            strDescription = _T("G1");
            break;
        case 2:
            strDescription = _T("G2");
            break;
        case 3:
            strDescription = _T("G1&G2");
            break;
        default:
            strDescription = _T("");
            break;
        }
        return strDescription;
    }
    /*
     1: MGV Mode
     2: AGV Mode
     3: Stocker Inline Mode
     */
    std::string& CEqPortChangeStep::getPortTransferModeDescription(std::string& strDescription)
    {
        switch (m_nPortTransferMode) {
        case 1:
            strDescription = _T("MGV Mode");
            break;
        case 2:
            strDescription = _T("AGV Mode");
            break;
        case 3:
            strDescription = _T("Stocker Inline Mode");
            break;
        default:
            strDescription = _T("");
            break;
        }
        return strDescription;
    }
    /*
     1 : Enable
     2 : Disable
     */
    std::string& CEqPortChangeStep::getPortEnableModeDescription(std::string& strDescription)
    {
        switch (m_nPortEanbleMode) {
        case 1:
            strDescription = _T("Enable");
            break;
        case 2:
            strDescription = _T("Disable");
            break;
        default:
            strDescription = _T("");
            break;
        }
        return strDescription;
    }
    /*
     1: Auto Change Enable
     2: Auto Change Disable
     */
    std::string& CEqPortChangeStep::getPortTypeAutoChangeModeDescription(std::string& strDescription)
    {
        switch (m_nPortTypeAutoChangeMode) {
        case 1:
            strDescription = _T("Auto Change Enable");
            break;
        case 2:
            strDescription = _T("Auto Change Disable");
            break;
        default:
            strDescription = _T("");
            break;
        }
        return strDescription;
    }
}
SourceCode/Bond/Servo/CEqPortChangeStep.h
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
#pragma once
#include "CReadStep.h"
namespace SERVO {
    class CEqPortChangeStep : public CReadStep
    {
    public:
        CEqPortChangeStep();
        ~CEqPortChangeStep();
    public:
        virtual void getAttributeVector(CAttributeVector& attrubutes);
        virtual int onReadData();
        virtual int onComplete();
        virtual int onTimeout();
        void setPortDev(int nDev);
        int getPortType();
        std::string& getPortTypeDescription(std::string& strDescription);
        std::string& getPortModeDescription(std::string& strDescription);
        std::string& getPortCassetteTypeDescription(std::string& strDescription);
        std::string& getPortTransferModeDescription(std::string& strDescription);
        std::string& getPortEnableModeDescription(std::string& strDescription);
        std::string& getPortTypeAutoChangeModeDescription(std::string& strDescription);
    private:
        int m_nPortDev;
        int m_nPortType;
        int m_nPortMode;
        int m_nPortCassetteType;
        int m_nPortTransferMode;
        int m_nPortEanbleMode;
        int m_nPortTypeAutoChangeMode;
    };
}
SourceCode/Bond/Servo/CEqReadIntStep.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,83 @@
#include "stdafx.h"
#include "CEqReadIntStep.h"
#include "Log.h"
namespace SERVO {
    CEqReadIntStep::CEqReadIntStep() : CReadStep()
    {
        m_nDataType = __INT16;
        m_nValueDev = 0;
        m_nValue = 0;
    }
    CEqReadIntStep::CEqReadIntStep(int dataType, int dev)
    {
        m_nDataType = dataType;
        m_nValueDev = dev;
        m_nValue = 0;
    }
    CEqReadIntStep::~CEqReadIntStep()
    {
    }
    void CEqReadIntStep::getAttributeVector(CAttributeVector& attrubutes)
    {
        CReadStep::getAttributeVector(attrubutes);
        std::string strTemp;
        attrubutes.addAttribute(new CAttribute("Dev",
            ("W" + CToolUnits::toHexString(m_nValueDev, strTemp)).c_str(), ""));
        attrubutes.addAttribute(new CAttribute("Value",
            std::to_string(m_nValue).c_str(), ""));
    }
    int CEqReadIntStep::onReadData()
    {
        CReadStep::onReadData();
        char szBuffer[32];
        int nRet = m_pCclink->ReadData2(m_station, DeviceType::W, m_nValueDev,
            m_nDataType == __INT16 ? 2 : 4, szBuffer);
        if (0 != nRet) {
            return -1;
        }
        if (m_nDataType == __INT16) {
            m_nValue = (unsigned int)CToolUnits::toInt16(&szBuffer[0]);
        }
        else {
            m_nValue = (unsigned int)CToolUnits::toInt32(&szBuffer[0]);
        }
        LOGI("<CEqReadIntStep>Value(%s) Changed<Dev:%d, Value:%d>\n",
            m_strName.c_str(), m_nValueDev, m_nValue);
        return 0;
    }
    int CEqReadIntStep::onComplete()
    {
        CReadStep::onComplete();
        LOGI("<CEQPortChangeStep> onComplete.");
        return 0;
    }
    int CEqReadIntStep::onTimeout()
    {
        CReadStep::onTimeout();
        LOGI("<CEQPortChangeStep> onTimeout.");
        return 0;
    }
    int CEqReadIntStep::getValue()
    {
        return m_nValue;
    }
}
SourceCode/Bond/Servo/CEqReadIntStep.h
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
#pragma once
#include "CReadStep.h"
namespace SERVO {
constexpr auto __INT16 = 1;
constexpr auto __INT32 = 2;
    class CEqReadIntStep : public CReadStep
    {
    public:
        CEqReadIntStep();
        CEqReadIntStep(int dataType, int dev);
        ~CEqReadIntStep();
    public:
        virtual void getAttributeVector(CAttributeVector& attrubutes);
        virtual int onReadData();
        virtual int onComplete();
        virtual int onTimeout();
        int getValue();
    private:
        int m_nDataType;
        int m_nValueDev;
        int m_nValue;
    };
}
SourceCode/Bond/Servo/CEquipment.cpp
@@ -366,12 +366,35 @@
            }
        }
        index = 0x350;
        bFlag = isBitOn(pszData, size, index);
        pStep = getStep(index);
        if (pStep != nullptr) {
            ((CWriteStep*)pStep)->onRecvSignal(bFlag);
        }
        // CIM Mode
        checkStepSignalStepSignal(0x350, pszData, size);
        // Port1 ~ Port4
        checkStepSignalStepSignal(0x3e0, pszData, size);
        checkStepSignalStepSignal(0x3e1, pszData, size);
        checkStepSignalStepSignal(0x3e2, pszData, size);
        checkStepSignalStepSignal(0x3e3, pszData, size);
        checkStepSignalStepSignal(0x3e8, pszData, size);
        checkStepSignalStepSignal(0x3e9, pszData, size);
        checkStepSignalStepSignal(0x3ea, pszData, size);
        checkStepSignalStepSignal(0x3eb, pszData, size);
        checkStepSignalStepSignal(0x3f0, pszData, size);
        checkStepSignalStepSignal(0x3f1, pszData, size);
        checkStepSignalStepSignal(0x3f2, pszData, size);
        checkStepSignalStepSignal(0x3f3, pszData, size);
        checkStepSignalStepSignal(0x3f8, pszData, size);
        checkStepSignalStepSignal(0x3f9, pszData, size);
        checkStepSignalStepSignal(0x3fa, pszData, size);
        checkStepSignalStepSignal(0x3fb, pszData, size);
        checkStepSignalStepSignal(0x400, pszData, size);
        checkStepSignalStepSignal(0x401, pszData, size);
        checkStepSignalStepSignal(0x402, pszData, size);
        checkStepSignalStepSignal(0x403, pszData, size);
        checkStepSignalStepSignal(0x408, pszData, size);
        checkStepSignalStepSignal(0x409, pszData, size);
        checkStepSignalStepSignal(0x40a, pszData, size);
        checkStepSignalStepSignal(0x40b, pszData, size);
    }
    BOOL CEquipment::isBitOn(const char* pszData, size_t size, int index)
@@ -614,6 +637,34 @@
        }
    }
    BOOL CEquipment::removeClass(CGlass* pGlass)
    {
        Lock();
        bool bExist = std::find(m_glassList.begin(), m_glassList.end(), pGlass) != m_glassList.end();
        if (bExist) {
            pGlass->addPath(EQ_ID_OPERATOR_REMOVE);
            pGlass->release();
            m_glassList.remove(pGlass);
        }
        Unlock();
        if (bExist && m_listener.onDataChanged != nullptr) {
            m_listener.onDataChanged(this, 0);
        }
        return bExist;
    }
    void CEquipment::getGlassList(std::list<CGlass*>& list)
    {
        Lock();
        for (auto item : m_glassList) {
            item->addRef();
            list.push_back(item);
        }
        Unlock();
    }
    CGlass* CEquipment::getFrontGlass()
    {
        CGlass* pGlass = nullptr;
@@ -626,4 +677,13 @@
        return pGlass;
    }
    void CEquipment::checkStepSignalStepSignal(unsigned int addr, const char* pszData, size_t size)
    {
        BOOL bFlag = isBitOn(pszData, size, addr);
        SERVO::CStep* pStep = getStep(addr);
        if (pStep != nullptr) {
            ((CWriteStep*)pStep)->onRecvSignal(bFlag);
        }
    }
}
SourceCode/Bond/Servo/CEquipment.h
@@ -13,6 +13,8 @@
#include "CEqCimMessageClearStep.h"
#include "CEqDateTimeSetCmdStep.h"
#include "CEqVCREnableStep.h"
#include "CEqPortChangeStep.h"
#include "CEqReadIntStep.h"
#include <vector>
#include <map>
#include <list>
@@ -94,7 +96,9 @@
        virtual BOOL glassWillArrive(CGlass* pGlass);
        virtual int outputGlass(int port);
        virtual int glassArrived(CGlass* pGlass);
        void getGlassList(std::list<CGlass*>& list);
        CGlass* getFrontGlass();
        BOOL removeClass(CGlass* pGlass);
    // ä»¥ä¸‹ä¸ºä»ŽCC-Link读取到的Bit标志位检测函数
    public:
@@ -110,6 +114,7 @@
    private:
        BOOL isBitOn(const char* pszData, size_t size, int index);
        inline BOOL equalBool(BOOL b1, BOOL b2);
        void checkStepSignalStepSignal(unsigned int addr, const char* pszData, size_t size);
    protected:
        inline void Lock() { EnterCriticalSection(&m_criticalSection); }
SourceCode/Bond/Servo/CEquipmentPage1.cpp
@@ -28,6 +28,9 @@
BEGIN_MESSAGE_MAP(CEquipmentPage1, CHMPropertyPage)
    ON_WM_CTLCOLOR()
    ON_WM_DESTROY()
    ON_WM_SIZE()
END_MESSAGE_MAP()
@@ -35,7 +38,6 @@
void CEquipmentPage1::OnApply()
{
    __super::OnApply();
    AfxMessageBox("CEquipmentPage1::OnApply()");
}
void CEquipmentPage1::setEquipment(SERVO::CEquipment* pEquipment)
@@ -52,3 +54,27 @@
    return TRUE;  // return TRUE unless you set the focus to a control
                  // å¼‚常: OCX å±žæ€§é¡µåº”返回 FALSE
}
HBRUSH CEquipmentPage1::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CHMPropertyPage::OnCtlColor(pDC, pWnd, nCtlColor);
    // TODO:  åœ¨æ­¤æ›´æ”¹ DC çš„任何特性
    // TODO:  å¦‚果默认的不是所需画笔,则返回另一个画笔
    return hbr;
}
void CEquipmentPage1::OnDestroy()
{
    CHMPropertyPage::OnDestroy();
    // TODO: åœ¨æ­¤å¤„添加消息处理程序代码
}
void CEquipmentPage1::OnSize(UINT nType, int cx, int cy)
{
    CHMPropertyPage::OnSize(nType, cx, cy);
    // TODO: åœ¨æ­¤å¤„添加消息处理程序代码
}
SourceCode/Bond/Servo/CEquipmentPage1.h
@@ -30,4 +30,7 @@
    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);
};
SourceCode/Bond/Servo/CEquipmentPage2.cpp
@@ -24,10 +24,16 @@
void CEquipmentPage2::DoDataExchange(CDataExchange* pDX)
{
    CHMPropertyPage::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_LIST1, m_listCtrl);
}
BEGIN_MESSAGE_MAP(CEquipmentPage2, CHMPropertyPage)
    ON_WM_CTLCOLOR()
    ON_WM_DESTROY()
    ON_WM_SIZE()
    ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, &CEquipmentPage2::OnLvnItemchangedList1)
    ON_BN_CLICKED(IDC_BUTTON_REMOVE, &CEquipmentPage2::OnBnClickedButtonRemove)
END_MESSAGE_MAP()
@@ -35,7 +41,6 @@
void CEquipmentPage2::OnApply()
{
    __super::OnApply();
    AfxMessageBox("CEquipmentPage2::OnApply()");
}
void CEquipmentPage2::setEquipment(SERVO::CEquipment* pEquipment)
@@ -48,8 +53,128 @@
{
    CHMPropertyPage::OnInitDialog();
    AfxMessageBox(m_pEquipment->getClassName());
    // è¯»å‡ºåˆ—宽
    CString strIniFile, strItem;
    strIniFile.Format(_T("%s\\configuration.ini"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir);
    int width[8] = { 0, 218, 180, 180, 180, 180, 180, 180 };
    for (int i = 0; i < 8; i++) {
        strItem.Format(_T("Col_%d_Width"), i);
        width[i] = GetPrivateProfileInt("EquipmentPage2ListCtrl", strItem, width[i], strIniFile);
    }
    // æŠ¥è¡¨æŽ§ä»¶
    DWORD dwStyle = m_listCtrl.GetExtendedStyle();
    dwStyle |= LVS_EX_FULLROWSELECT;
    dwStyle |= LVS_EX_GRIDLINES;
    m_listCtrl.SetExtendedStyle(dwStyle);
    HIMAGELIST imageList = ImageList_Create(24, 24, ILC_COLOR24, 1, 1);
    ListView_SetImageList(m_listCtrl.GetSafeHwnd(), imageList, LVSIL_SMALL);
    m_listCtrl.InsertColumn(0, _T(""), LVCFMT_RIGHT, width[0]);
    m_listCtrl.InsertColumn(1, _T("ID"), LVCFMT_LEFT, width[1]);
    m_listCtrl.InsertColumn(2, _T("时间"), LVCFMT_LEFT, width[2]);
    m_listCtrl.SetColumnWidth(2, LVSCW_AUTOSIZE_USEHEADER);
    ASSERT(m_pEquipment);
    std::list<SERVO::CGlass*> list;
    m_pEquipment->getGlassList(list);
    for (auto item : list) {
        item->addRef();
        item->release();        // é‡Šæ”¾list中的引用
        int index = m_listCtrl.InsertItem(m_listCtrl.GetItemCount(), _T(""));
        m_listCtrl.SetItemData(index, (DWORD_PTR)item);
        m_listCtrl.SetItemText(index, 1, item->getID().c_str());
    }
    return TRUE;  // return TRUE unless you set the focus to a control
                  // å¼‚常: OCX å±žæ€§é¡µåº”返回 FALSE
}
HBRUSH CEquipmentPage2::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CHMPropertyPage::OnCtlColor(pDC, pWnd, nCtlColor);
    // TODO:  åœ¨æ­¤æ›´æ”¹ DC çš„任何特性
    // TODO:  å¦‚果默认的不是所需画笔,则返回另一个画笔
    return hbr;
}
void CEquipmentPage2::OnDestroy()
{
    CHMPropertyPage::OnDestroy();
    // ä¿å­˜åˆ—宽
    CString strIniFile, strItem, strTemp;
    strIniFile.Format(_T("%s\\configuration.ini"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir);
    CHeaderCtrl* pHeader = m_listCtrl.GetHeaderCtrl();
    for (int i = 0; i < pHeader->GetItemCount(); i++) {
        RECT rect;
        pHeader->GetItemRect(i, &rect);
        strItem.Format(_T("Col_%d_Width"), i);
        strTemp.Format(_T("%d"), rect.right - rect.left);
        WritePrivateProfileString("EquipmentPage2ListCtrl", strItem, strTemp, strIniFile);
    }
    for (int i = 0; i < m_listCtrl.GetItemCount(); i++) {
        SERVO::CGlass* pGlass = (SERVO::CGlass*)m_listCtrl.GetItemData(i);
        pGlass->release();
    }
}
void CEquipmentPage2::OnSize(UINT nType, int cx, int cy)
{
    CHMPropertyPage::OnSize(nType, cx, cy);
    if (GetDlgItem(IDC_LIST1) == nullptr) return;
    CWnd* pItem;
    CRect rcClient, rcItem;
    GetClientRect(&rcClient);
    int x = 12;
    int y2 = rcClient.bottom - 12;
    pItem = GetDlgItem(IDC_BUTTON_REMOVE);
    pItem->GetWindowRect(&rcItem);
    pItem->MoveWindow(x, y2 - rcItem.Height(), rcItem.Width(), rcItem.Height());
    y2 -= rcItem.Height();
    y2 -= 8;
    m_listCtrl.MoveWindow(x, 58, rcClient.Width() - 24, y2 - 58);
}
void CEquipmentPage2::OnLvnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult)
{
    LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
    if (LVIF_STATE == pNMLV->uChanged) {
        int nItem = pNMLV->iItem;
        GetDlgItem(IDC_BUTTON_REMOVE)->EnableWindow(GetSelectedItemIndex() >= 0);
    }
    *pResult = 0;
}
int CEquipmentPage2::GetSelectedItemIndex()
{
    POSITION pos = m_listCtrl.GetFirstSelectedItemPosition();
    return m_listCtrl.GetNextSelectedItem(pos);
}
void CEquipmentPage2::OnBnClickedButtonRemove()
{
    int index = GetSelectedItemIndex();
    if (index >= 0) {
        SERVO::CGlass* pGlass = (SERVO::CGlass*)m_listCtrl.GetItemData(index);
        ASSERT(m_pEquipment);
        BOOL bRet = m_pEquipment->removeClass(pGlass);
        if (bRet) {
            pGlass->release();
            m_listCtrl.DeleteItem(index);
        }
    }
}
SourceCode/Bond/Servo/CEquipmentPage2.h
@@ -1,6 +1,7 @@
#pragma once
#include "CHMPropertyPage.h"
#include "CEquipment.h"
#include "ListCtrlEx.h"
// CEpuipmentPage2 å¯¹è¯æ¡†
@@ -16,7 +17,11 @@
    void setEquipment(SERVO::CEquipment* pEquipment);
private:
    int GetSelectedItemIndex();
private:
    SERVO::CEquipment* m_pEquipment;
    CListCtrlEx m_listCtrl;
// å¯¹è¯æ¡†æ•°æ®
@@ -30,4 +35,9 @@
    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 OnLvnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult);
    afx_msg void OnBnClickedButtonRemove();
};
SourceCode/Bond/Servo/CMaster.cpp
@@ -378,6 +378,230 @@
            }
        }
        // Port1
        {
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d1f);
            pStep->setName(STEP_EQ_PORT1_TYPE);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0x80);
            if (pEquipment->addStep(0x3e0, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d20);
            pStep->setName(STEP_EQ_PORT1_MODE);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0x88);
            if (pEquipment->addStep(0x3e8, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT32, 0x4d21);
            pStep->setName(STEP_EQ_PORT1_CASSETTE_TYPE);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0x90);
            if (pEquipment->addStep(0x3f0, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d23);
            pStep->setName(STEP_EQ_PORT1_TRANSFER_MODE);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0x98);
            if (pEquipment->addStep(0x3f8, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d24);
            pStep->setName(STEP_EQ_PORT1_ENABLE);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0xa0);
            if (pEquipment->addStep(0x400, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d25);
            pStep->setName(STEP_EQ_PORT1_TYPE_ATUO);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0xa8);
            if (pEquipment->addStep(0x408, pStep) != 0) {
                delete pStep;
            }
        }
        // Port2
        {
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d2f);
            pStep->setName(STEP_EQ_PORT2_TYPE);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0x81);
            if (pEquipment->addStep(0x3e1, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d30);
            pStep->setName(STEP_EQ_PORT2_MODE);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0x89);
            if (pEquipment->addStep(0x3e9, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT32, 0x4d31);
            pStep->setName(STEP_EQ_PORT2_CASSETTE_TYPE);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0x91);
            if (pEquipment->addStep(0x3f1, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d33);
            pStep->setName(STEP_EQ_PORT2_TRANSFER_MODE);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0x99);
            if (pEquipment->addStep(0x3f9, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d34);
            pStep->setName(STEP_EQ_PORT2_ENABLE);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0xa1);
            if (pEquipment->addStep(0x401, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d35);
            pStep->setName(STEP_EQ_PORT2_TYPE_ATUO);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0xa9);
            if (pEquipment->addStep(0x409, pStep) != 0) {
                delete pStep;
            }
        }
        // Port3
        {
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d3f);
            pStep->setName(STEP_EQ_PORT3_TYPE);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0x82);
            if (pEquipment->addStep(0x3e2, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d40);
            pStep->setName(STEP_EQ_PORT3_MODE);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0x8a);
            if (pEquipment->addStep(0x3ea, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT32, 0x4d41);
            pStep->setName(STEP_EQ_PORT3_CASSETTE_TYPE);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0x92);
            if (pEquipment->addStep(0x3f2, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d43);
            pStep->setName(STEP_EQ_PORT3_TRANSFER_MODE);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0x9a);
            if (pEquipment->addStep(0x3fa, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d44);
            pStep->setName(STEP_EQ_PORT3_ENABLE);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0xa2);
            if (pEquipment->addStep(0x402, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d45);
            pStep->setName(STEP_EQ_PORT3_TYPE_ATUO);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0xaa);
            if (pEquipment->addStep(0x40a, pStep) != 0) {
                delete pStep;
            }
        }
        // Port4
        {
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d4f);
            pStep->setName(STEP_EQ_PORT4_TYPE);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0x83);
            if (pEquipment->addStep(0x3e3, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d50);
            pStep->setName(STEP_EQ_PORT4_MODE);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0x8b);
            if (pEquipment->addStep(0x3eb, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT32, 0x4d51);
            pStep->setName(STEP_EQ_PORT4_CASSETTE_TYPE);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0x93);
            if (pEquipment->addStep(0x3f3, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d53);
            pStep->setName(STEP_EQ_PORT4_TRANSFER_MODE);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0x9b);
            if (pEquipment->addStep(0x3fb, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d54);
            pStep->setName(STEP_EQ_PORT4_ENABLE);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0xa3);
            if (pEquipment->addStep(0x403, pStep) != 0) {
                delete pStep;
            }
        }
        {
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d55);
            pStep->setName(STEP_EQ_PORT4_TYPE_ATUO);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0xab);
            if (pEquipment->addStep(0x40b, pStep) != 0) {
                delete pStep;
            }
        }
        pEquipment->init();
        LOGE("已添加“EFEM(ROBOT)”.");
        return 0;
SourceCode/Bond/Servo/Common.h
@@ -50,35 +50,60 @@
#define BTN_ALARM_BKGND_PRESS            RGB(133, 203, 225)
/* Equipment ID */
#define EQ_ID_EFEM            1
#define EQ_ID_Bonder1        2
#define EQ_ID_Bonder2        3
#define EQ_ID_LOADPORT1        4
#define EQ_ID_LOADPORT2        5
#define EQ_ID_LOADPORT3        6
#define EQ_ID_LOADPORT4        7
#define EQ_ID_FLIPER        8
#define EQ_ID_VACUUMBAKE    9
#define EQ_ID_ALIGNER        10
#define EQ_ID_BAKE_COOLING    11
#define EQ_ID_EFEM                1
#define EQ_ID_Bonder1            2
#define EQ_ID_Bonder2            3
#define EQ_ID_LOADPORT1            4
#define EQ_ID_LOADPORT2            5
#define EQ_ID_LOADPORT3            6
#define EQ_ID_LOADPORT4            7
#define EQ_ID_FLIPER            8
#define EQ_ID_VACUUMBAKE        9
#define EQ_ID_ALIGNER            10
#define EQ_ID_BAKE_COOLING        11
#define EQ_ID_OPERATOR_REMOVE    999
/* step name */
#define STEP_MODE                _T("EQMode")
#define STEP_STATUS                _T("EQStatus")
#define STEP_ALARM_START        _T("EQAlarm")
#define STEP_ALARM_BLOCK1        _T("EQAlarm1")
#define STEP_ALARM_BLOCK2        _T("EQAlarm2")
#define STEP_ALARM_BLOCK3        _T("EQAlarm3")
#define STEP_ALARM_BLOCK4        _T("EQAlarm4")
#define STEP_ALARM_BLOCK5        _T("EQAlarm5")
#define STEP_PROCESS            _T("EQProcess")
#define STEP_CIM_MODE_CHANGE    _T("EQCimModeChange")
#define STEP_EQ_MODE_CHANGE        _T("EQModeChange")
#define STEP_CIM_MESSAGE_CMD    _T("EQCimMessageCmd")
#define STEP_CIM_MESSAGE_CLEAR    _T("EQCimMessageClear")
#define STEP_DATETIME_SET_CMD    _T("EQDateTimeSetCmd")
#define STEP_EQ_VCR_ENABLE        _T("EQVCREnable")
#define STEP_MODE                        _T("EQMode")
#define STEP_STATUS                        _T("EQStatus")
#define STEP_ALARM_START                _T("EQAlarm")
#define STEP_ALARM_BLOCK1                _T("EQAlarm1")
#define STEP_ALARM_BLOCK2                _T("EQAlarm2")
#define STEP_ALARM_BLOCK3                _T("EQAlarm3")
#define STEP_ALARM_BLOCK4                _T("EQAlarm4")
#define STEP_ALARM_BLOCK5                _T("EQAlarm5")
#define STEP_PROCESS                    _T("EQProcess")
#define STEP_CIM_MODE_CHANGE            _T("EQCimModeChange")
#define STEP_EQ_MODE_CHANGE                _T("EQModeChange")
#define STEP_CIM_MESSAGE_CMD            _T("EQCimMessageCmd")
#define STEP_CIM_MESSAGE_CLEAR            _T("EQCimMessageClear")
#define STEP_DATETIME_SET_CMD            _T("EQDateTimeSetCmd")
#define STEP_EQ_VCR_ENABLE                _T("EQVCREnable")
#define STEP_EQ_PORT1_TYPE                _T("EQPort1Type")
#define STEP_EQ_PORT1_MODE                _T("EQPort1Mode")
#define STEP_EQ_PORT1_CASSETTE_TYPE        _T("EQPort1CassetteType")
#define STEP_EQ_PORT1_TRANSFER_MODE        _T("EQPort1TransferMode")
#define STEP_EQ_PORT1_ENABLE            _T("EQPort1Enable")
#define STEP_EQ_PORT1_TYPE_ATUO            _T("EQPort1TypeAuto")
#define STEP_EQ_PORT2_TYPE                _T("EQPort2Type")
#define STEP_EQ_PORT2_MODE                _T("EQPort2Mode")
#define STEP_EQ_PORT2_CASSETTE_TYPE        _T("EQPort2CassetteType")
#define STEP_EQ_PORT2_TRANSFER_MODE        _T("EQPort2TransferMode")
#define STEP_EQ_PORT2_ENABLE            _T("EQPort2Enable")
#define STEP_EQ_PORT2_TYPE_ATUO            _T("EQPort2TypeAuto")
#define STEP_EQ_PORT3_TYPE                _T("EQPort3Type")
#define STEP_EQ_PORT3_MODE                _T("EQPort3Mode")
#define STEP_EQ_PORT3_CASSETTE_TYPE        _T("EQPort3CassetteType")
#define STEP_EQ_PORT3_TRANSFER_MODE        _T("EQPort3TransferMode")
#define STEP_EQ_PORT3_ENABLE            _T("EQPort3Enable")
#define STEP_EQ_PORT3_TYPE_ATUO            _T("EQPort3TypeAuto")
#define STEP_EQ_PORT4_TYPE                _T("EQPort4Type")
#define STEP_EQ_PORT4_MODE                _T("EQPort4Mode")
#define STEP_EQ_PORT4_CASSETTE_TYPE        _T("EQPort4CassetteType")
#define STEP_EQ_PORT4_TRANSFER_MODE        _T("EQPort4TransferMode")
#define STEP_EQ_PORT4_ENABLE            _T("EQPort4Enable")
#define STEP_EQ_PORT4_TYPE_ATUO            _T("EQPort4TypeAuto")
/* base alarm */
SourceCode/Bond/Servo/Servo.rc
Binary files differ
SourceCode/Bond/Servo/Servo.vcxproj
@@ -213,7 +213,9 @@
    <ClInclude Include="CEqDateTimeSetCmdStep.h" />
    <ClInclude Include="CEqModeChangeStep.h" />
    <ClInclude Include="CEqModeStep.h" />
    <ClInclude Include="CEqPortChangeStep.h" />
    <ClInclude Include="CEqProcessStep.h" />
    <ClInclude Include="CEqReadIntStep.h" />
    <ClInclude Include="CEqStatusStep.h" />
    <ClInclude Include="CEquipmentPage1.h" />
    <ClInclude Include="CEquipmentPage2.h" />
@@ -286,7 +288,9 @@
    <ClCompile Include="CEqDateTimeSetCmdStep.cpp" />
    <ClCompile Include="CEqModeChangeStep.cpp" />
    <ClCompile Include="CEqModeStep.cpp" />
    <ClCompile Include="CEqPortChangeStep.cpp" />
    <ClCompile Include="CEqProcessStep.cpp" />
    <ClCompile Include="CEqReadIntStep.cpp" />
    <ClCompile Include="CEqStatusStep.cpp" />
    <ClCompile Include="CEquipmentPage1.cpp" />
    <ClCompile Include="CEquipmentPage2.cpp" />
SourceCode/Bond/Servo/Servo.vcxproj.filters
@@ -79,6 +79,8 @@
    <ClCompile Include="CEquipmentPage2.cpp" />
    <ClCompile Include="CHMPropertyPage.cpp" />
    <ClCompile Include="CHMPropertyDlg.cpp" />
    <ClCompile Include="CEqPortChangeStep.cpp" />
    <ClCompile Include="CEqReadIntStep.cpp" />
  </ItemGroup>
  <ItemGroup>
    <ClInclude Include="AlarmManager.h" />
@@ -156,6 +158,8 @@
    <ClInclude Include="CEquipmentPage2.h" />
    <ClInclude Include="CHMPropertyPage.h" />
    <ClInclude Include="CHMPropertyDlg.h" />
    <ClInclude Include="CEqPortChangeStep.h" />
    <ClInclude Include="CEqReadIntStep.h" />
  </ItemGroup>
  <ItemGroup>
    <ResourceCompile Include="Servo.rc" />
SourceCode/Bond/Servo/resource.h
Binary files differ