1.修改逻辑,CStep不在设置和调用Listener,而是直接调用成员变量m_pEquipment的虚函数onStepEvent来传递数据。
已修改13个文件
326 ■■■■■ 文件已修改
SourceCode/Bond/Servo/AlarmDlg.cpp 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEqCassetteTransferStateStep.cpp 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEqProcessStep.cpp 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipment.cpp 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipment.h 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMaster.cpp 105 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMaster.h 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CReadStep.cpp 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CStep.cpp 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CStep.h 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CWriteStep.cpp 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Model.cpp 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Model.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/AlarmDlg.cpp
@@ -55,34 +55,6 @@
            if (RX_CODE_ALARM_SET == code) {
                UpdatePageData();
                // 通知设备状态
                /*
                SERVO::CEqAlarmStep* pStep = nullptr;
                if (pAny->getPtrValue("ptr", (void*&)pStep)) {
                    if (pStep != nullptr) {
                        // 获取 AlarmManager 单例
                        AlarmManager& alarmManager = AlarmManager::getInstance();
                        // 从 pStep 获取需要的参数,假设这些值是从 pStep 中获取的
                        AlarmData alarmData;
                        alarmData.nId = pStep->getAlarmId();
                        alarmData.nSeverityLevel = pStep->getAlarmLevel();
                        alarmData.nDeviceId = pStep->getEquipment()->getID();
                        alarmData.nUnitId = pStep->getUnitId();
                        alarmData.strDeviceName = alarmManager.getDeviceNameById(alarmData.nDeviceId);
                        alarmData.strUnitName = alarmManager.getUnitNameById(alarmData.nDeviceId, alarmData.nUnitId);
                        const AlarmInfo* pAlarmInfo = alarmManager.getAlarmInfoByID(pStep->getAlarmId());
                        alarmData.strDescription = pAlarmInfo != nullptr ? pAlarmInfo->strAlarmText : "";
                        if (pStep->getAlarmState() == 1) {
                            alarmData.strStartTime = getCurrentTimeString();
                            alarmData.strEndTime = "";
                            InsertAlarmData(&m_listCtrl, alarmData);
                        }
                    }
                }
                */
            }
            else if (RX_CODE_ALARM_CLEAR == code) {
                UpdatePageData();
SourceCode/Bond/Servo/CEqCassetteTransferStateStep.cpp
@@ -239,7 +239,7 @@
        case CASSETTE_MAPPING_USE:
            strDescription = _T("mapping use");
            break;
        case CASSETTE_MAPPING_USE:
        case CASSETTE_MAPPING_NOT_USE:
            strDescription = _T("mapping not use");
            break;
        default:
SourceCode/Bond/Servo/CEqProcessStep.cpp
@@ -3,6 +3,7 @@
#include "CEqProcessStep.h"
#include "Log.h"
#include "ToolUnits.h"
#include "CEquipment.h"
namespace SERVO {
@@ -94,8 +95,9 @@
            index += 20;
        }
        if (m_nCurrentGroup == m_nTotalGroup && m_listener.onEvent != nullptr) {
            m_listener.onEvent(this, STEP_EVENT_PROCESS_DATA, nullptr);
        if (m_nCurrentGroup == m_nTotalGroup) {
            ASSERT(m_pEquipment);
            m_pEquipment->onStepEvent(this, STEP_EVENT_PROCESS_DATA);
        }
SourceCode/Bond/Servo/CEquipment.cpp
@@ -23,7 +23,7 @@
    CEquipment::CEquipment() : m_nID(0), m_strName(""), m_strDescription(""), m_station(0, 255)
    {
        m_listener = { nullptr, nullptr, nullptr };
        m_listener = { nullptr, nullptr, nullptr, nullptr };
        m_alive = {FALSE, 0, FALSE};
        m_bCimState = FALSE;
        m_bUpstreamInline = FALSE;
@@ -65,6 +65,7 @@
    {
        m_listener.onAlive = listener.onAlive;
        m_listener.onCimStateChanged = listener.onCimStateChanged;
        m_listener.onAlarm = listener.onAlarm;
        m_listener.onDataChanged = listener.onDataChanged;
    }
@@ -485,6 +486,26 @@
        return m_bVCREnable[index];
    }
    int CEquipment::onStepEvent(CStep* pStep, int code)
    {
        if (code == STEP_EVENT_READDATA) {
            if (isAlarmStep(pStep)) {
                SERVO::CEqAlarmStep* pEqAlarmStep = (SERVO::CEqAlarmStep*)pStep;
                int state = pEqAlarmStep->getAlarmState();
                ASSERT(state == 0 || state == 1);
                if (m_listener.onAlarm != nullptr) {
                    m_listener.onAlarm(this, state,
                        pEqAlarmStep->getAlarmId(),
                        pEqAlarmStep->getUnitId(),
                        pEqAlarmStep->getAlarmLevel());
                }
            }
        }
        return 0;
    }
    CPin* CEquipment::addPin(PinType type, char* pszName)
    {
        // 不允许名字添加重复的pin
@@ -715,4 +736,10 @@
        return pGlass;
    }
    bool CEquipment::isAlarmStep(SERVO::CStep* pStep)
    {
        return CToolUnits::startsWith(pStep->getName(), STEP_ALARM_START);
    }
}
SourceCode/Bond/Servo/CEquipment.h
@@ -29,10 +29,12 @@
    typedef std::function<void(void* pEiuipment, BOOL bAlive)> ONALIVE;
    typedef std::function<void(void* pEiuipment, int code)> ONDATACHANGED;
    typedef std::function<void(void* pEiuipment, int state, int alarmId, int unitId, int level)> ONALARM;
    typedef struct _EquipmentListener
    {
        ONALIVE                onAlive;
        ONALIVE                onCimStateChanged;
        ONALARM                onAlarm;
        ONDATACHANGED        onDataChanged;
    } EquipmentListener;
@@ -89,6 +91,7 @@
        virtual void onTimer(UINT nTimerid);
        virtual void serialize(CArchive& ar);
        virtual void onReceiveLBData(const char* pszData, size_t size);
        virtual int onStepEvent(CStep* pStep, int code);
        virtual CPin* addPin(PinType type, char* pszName);
        CPin* getPin(char* pszName);
        std::vector<CPin*>& CEquipment::getInputPins();
@@ -100,6 +103,7 @@
        void getGlassList(std::list<CGlass*>& list);
        CGlass* getFrontGlass();
        BOOL removeClass(CGlass* pGlass);
        bool isAlarmStep(SERVO::CStep* pStep);
    // 以下为从CC-Link读取到的Bit标志位检测函数
    public:
SourceCode/Bond/Servo/CMaster.cpp
@@ -6,7 +6,6 @@
#define ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(name,ws,index,psd) {                \
    CEqCassetteTransferStateStep* pStep = new CEqCassetteTransferStateStep();    \
    pStep->setName(name);                                                        \
    pStep->setListener(listener);                                                \
    pStep->setWriteSignalDev(ws);                                                \
    pStep->setPortStatusDev(psd);                                                \
    if (pEquipment->addStep(index, pStep) != 0) {                                \
@@ -41,21 +40,12 @@
    {
        m_listener.onEqAlive = listener.onEqAlive;
        m_listener.onEqCimStateChanged = listener.onEqCimStateChanged;
        m_listener.onEqStepEvent = listener.onEqStepEvent;
        m_listener.onEqAlarm = listener.onEqAlarm;
    }
    int CMaster::init()
    {
        LOGI("<Master>正在初始化...");
        StepListener listener;
        listener.onEvent = [&](void* pStep, int code, void* pData) -> void {
            TRACE("<CEquipment>onEvent<%d, 0x%x>.\n", code, pData);
            if (m_listener.onEqStepEvent != nullptr) {
                m_listener.onEqStepEvent((CStep*)pStep, code, pData);
            }
        };
        //     cclink
@@ -85,17 +75,17 @@
        // 初始化添加各子设备
        addLoadPort(0, listener);
        addLoadPort(1, listener);
        addLoadPort(2, listener);
        addLoadPort(3, listener);
        addFliper(listener);
        addVacuumBake(listener);
        addAligner(listener);
        addEFEM(listener);
        addBonder(0, listener);
        addBonder(1, listener);
        addBakeCooling(listener);
        addLoadPort(0);
        addLoadPort(1);
        addLoadPort(2);
        addLoadPort(3);
        addFliper();
        addVacuumBake();
        addAligner();
        addEFEM();
        addBonder(0);
        addBonder(1);
        addBakeCooling();
        connectEquipments();
        
@@ -139,6 +129,12 @@
                m_listener.onEqCimStateChanged(this, p, bOn);
            }
        };
        listener.onAlarm = [&](void* pEquipment, int state, int alarmId, int unitId, int level) -> void {
            CEquipment* p = (CEquipment*)pEquipment;
            if (m_listener.onEqAlarm != nullptr) {
                m_listener.onEqAlarm(this, p, state, alarmId, unitId, level);
            }
        };
        listener.onDataChanged = [&](void* pEquipment, int code) -> void {
            m_bDataModify = TRUE;
        };
@@ -167,7 +163,7 @@
    /* 添加LoadPort1
     * index -- 0~3
     */
    int CMaster::addLoadPort(int index, StepListener& listener)
    int CMaster::addLoadPort(int index)
    {
        ASSERT(index == 0 || index == 1 || index == 2 || index == 3);
        char szName[64];
@@ -185,7 +181,7 @@
        return 0;
    }
    int CMaster::addFliper(StepListener& listener)
    int CMaster::addFliper()
    {
        CFliper* pEquipment = new CFliper();
        pEquipment->setID(EQ_ID_FLIPER);
@@ -202,7 +198,7 @@
        return 0;
    }
    int CMaster::addVacuumBake(StepListener& listener)
    int CMaster::addVacuumBake()
    {
        CVacuumBake* pEquipment = new CVacuumBake();
        pEquipment->setID(EQ_ID_VACUUMBAKE);
@@ -219,7 +215,7 @@
        return 0;
    }
    int CMaster::addAligner(StepListener& listener)
    int CMaster::addAligner()
    {
        CAligner* pEquipment = new CAligner();
        pEquipment->setID(EQ_ID_ALIGNER);
@@ -236,7 +232,7 @@
        return 0;
    }
    int CMaster::addEFEM(StepListener& listener)
    int CMaster::addEFEM()
    {
        CEFEM* pEquipment = new CEFEM();
        pEquipment->setID(EQ_ID_EFEM);
@@ -252,7 +248,6 @@
        {
            CEqModeStep* pStep = new CEqModeStep();
            pStep->setName(STEP_MODE);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0x30);
            pStep->setModeDev(0x4a8c);
            if (pEquipment->addStep(0x360, pStep) != 0) {
@@ -262,7 +257,6 @@
        {
            CEqStatusStep* pStep = new CEqStatusStep();
            pStep->setName(STEP_STATUS);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0x31);
            pStep->setStatusDev(0x4a68);
            if (pEquipment->addStep(0x361, pStep) != 0) {
@@ -272,7 +266,6 @@
        {
            CEqAlarmStep* pStep = new CEqAlarmStep();
            pStep->setName(STEP_ALARM_BLOCK1);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0x32);
            pStep->setAlarmDev(0x4c1d);
            if (pEquipment->addStep(0x362, pStep) != 0) {
@@ -282,7 +275,6 @@
        {
            CEqAlarmStep* pStep = new CEqAlarmStep();
            pStep->setName(STEP_ALARM_BLOCK2);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0x33);
            pStep->setAlarmDev(0x4c4a);
            if (pEquipment->addStep(0x363, pStep) != 0) {
@@ -292,7 +284,6 @@
        {
            CEqAlarmStep* pStep = new CEqAlarmStep();
            pStep->setName(STEP_ALARM_BLOCK3);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0x34);
            pStep->setAlarmDev(0x4c77);
            if (pEquipment->addStep(0x364, pStep) != 0) {
@@ -302,7 +293,6 @@
        {
            CEqAlarmStep* pStep = new CEqAlarmStep();
            pStep->setName(STEP_ALARM_BLOCK4);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0x35);
            pStep->setAlarmDev(0x4ca4);
            if (pEquipment->addStep(0x365, pStep) != 0) {
@@ -312,7 +302,6 @@
        {
            CEqAlarmStep* pStep = new CEqAlarmStep();
            pStep->setName(STEP_ALARM_BLOCK5);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0x36);
            pStep->setAlarmDev(0x4cd1);
            if (pEquipment->addStep(0x366, pStep) != 0) {
@@ -322,7 +311,6 @@
        {
            CEqProcessStep* pStep = new CEqProcessStep();
            pStep->setName(STEP_PROCESS);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0x37);
            pStep->setProcessDev(0x5864);
            if (pEquipment->addStep(0x367, pStep) != 0) {
@@ -332,7 +320,6 @@
        {
            CEqCimModeChangeStep* pStep = new CEqCimModeChangeStep();
            pStep->setName(STEP_CIM_MODE_CHANGE);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0x50);
            pStep->setCimModeDev(0x15);
            if (pEquipment->addStep(0x350, pStep) != 0) {
@@ -342,7 +329,6 @@
        {
            CEqCimMessageCmdStep* pStep = new CEqCimMessageCmdStep();
            pStep->setName(STEP_CIM_MESSAGE_CMD);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0x51);
            pStep->setCimMessageDev(0x0);
            if (pEquipment->addStep(0x351, pStep) != 0) {
@@ -352,7 +338,6 @@
        {
            CEqCimMessageClearStep* pStep = new CEqCimMessageClearStep();
            pStep->setName(STEP_CIM_MESSAGE_CLEAR);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0x52);
            pStep->setClearCimMessageDev(0x13);
            if (pEquipment->addStep(0x352, pStep) != 0) {
@@ -362,7 +347,6 @@
        {
            CEqDateTimeSetCmdStep* pStep = new CEqDateTimeSetCmdStep();
            pStep->setName(STEP_DATETIME_SET_CMD);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0x53);
            pStep->setDateTimeDev(0x16);
            if (pEquipment->addStep(0x353, pStep) != 0) {
@@ -372,7 +356,6 @@
        {
            CEqVCREnableStep* pStep = new CEqVCREnableStep();
            pStep->setName(STEP_EQ_VCR_ENABLE);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0x54);
            pStep->setEqVCRModeDev(0x1F);
            if (pEquipment->addStep(0x354, pStep) != 0) {
@@ -382,7 +365,6 @@
        {
            CEqModeChangeStep* pStep = new CEqModeChangeStep();
            pStep->setName(STEP_EQ_MODE_CHANGE);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(0x55);
            pStep->setEqModeDev(0x1E);
            if (pEquipment->addStep(0x355, pStep) != 0) {
@@ -394,7 +376,6 @@
        {
            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;
@@ -403,7 +384,6 @@
        {
            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;
@@ -412,7 +392,6 @@
        {
            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;
@@ -421,7 +400,6 @@
        {
            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;
@@ -430,7 +408,6 @@
        {
            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;
@@ -439,7 +416,6 @@
        {
            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;
@@ -450,7 +426,6 @@
        {
            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;
@@ -459,7 +434,6 @@
        {
            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;
@@ -468,7 +442,6 @@
        {
            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;
@@ -477,7 +450,6 @@
        {
            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;
@@ -486,7 +458,6 @@
        {
            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;
@@ -495,7 +466,6 @@
        {
            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;
@@ -506,7 +476,6 @@
        {
            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;
@@ -515,7 +484,6 @@
        {
            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;
@@ -524,7 +492,6 @@
        {
            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;
@@ -533,7 +500,6 @@
        {
            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;
@@ -542,7 +508,6 @@
        {
            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;
@@ -551,7 +516,6 @@
        {
            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;
@@ -562,7 +526,6 @@
        {
            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;
@@ -571,7 +534,6 @@
        {
            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;
@@ -580,7 +542,6 @@
        {
            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;
@@ -589,7 +550,6 @@
        {
            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;
@@ -598,7 +558,6 @@
        {
            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;
@@ -607,7 +566,6 @@
        {
            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;
@@ -674,7 +632,7 @@
     * index -- 0, bonder1
     * index -- 1, bonder2
     */
    int CMaster::addBonder(int index, StepListener& listener)
    int CMaster::addBonder(int index)
    {
        ASSERT(index == 0 || index == 1);
        CBonder* pEquipment = new CBonder();
@@ -691,7 +649,6 @@
        {
            CEqModeStep* pStep = new CEqModeStep();
            pStep->setName(STEP_MODE);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(index == 0 ? 0x330 : 0x630);
            pStep->setModeDev(index == 0 ? 0x6a8c : 0x848c);
            if (pEquipment->addStep(0x360, pStep) != 0) {
@@ -701,7 +658,6 @@
        {
            CEqStatusStep* pStep = new CEqStatusStep();
            pStep->setName(STEP_STATUS);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(index == 0 ? 0x331 : 0x631);
            pStep->setStatusDev(index == 0 ? 0x6a68 : 0x8a68);
            if (pEquipment->addStep(0x361, pStep) != 0) {
@@ -711,7 +667,6 @@
        {
            CEqAlarmStep* pStep = new CEqAlarmStep();
            pStep->setName(STEP_ALARM_BLOCK1);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(index == 0 ? 0x332 : 0x632);
            pStep->setAlarmDev(index == 0 ? 0x6c1d : 0x8c1d);
            if (pEquipment->addStep(0x362, pStep) != 0) {
@@ -721,7 +676,6 @@
        {
            CEqAlarmStep* pStep = new CEqAlarmStep();
            pStep->setName(STEP_ALARM_BLOCK2);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(index == 0 ? 0x333 : 0x633);
            pStep->setAlarmDev(index == 0 ? 0x6c4a : 0x8c4a);
            if (pEquipment->addStep(0x363, pStep) != 0) {
@@ -731,7 +685,6 @@
        {
            CEqAlarmStep* pStep = new CEqAlarmStep();
            pStep->setName(STEP_ALARM_BLOCK3);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(index == 0 ? 0x334 : 0x634);
            pStep->setAlarmDev(index == 0 ? 0x6c77 : 0x8c77);
            if (pEquipment->addStep(0x364, pStep) != 0) {
@@ -741,7 +694,6 @@
        {
            CEqAlarmStep* pStep = new CEqAlarmStep();
            pStep->setName(STEP_ALARM_BLOCK4);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(index == 0 ? 0x335 : 0x635);
            pStep->setAlarmDev(index == 0 ? 0x6ca4 : 0x8ca4);
            if (pEquipment->addStep(0x365, pStep) != 0) {
@@ -751,7 +703,6 @@
        {
            CEqAlarmStep* pStep = new CEqAlarmStep();
            pStep->setName(STEP_ALARM_BLOCK5);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(index == 0 ? 0x336 : 0x636);
            pStep->setAlarmDev(index == 0 ? 0x6cd1 : 0x8cd1);
            if (pEquipment->addStep(0x366, pStep) != 0) {
@@ -761,7 +712,6 @@
        {
            CEqProcessStep* pStep = new CEqProcessStep();
            pStep->setName(STEP_PROCESS);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(index == 0 ? 0x337 : 0x637);
            pStep->setProcessDev(index == 0 ? 0x7864 : 0x9864);
            if (pEquipment->addStep(0x367, pStep) != 0) {
@@ -771,7 +721,6 @@
        {
            CEqCimModeChangeStep* pStep = new CEqCimModeChangeStep();
            pStep->setName(STEP_CIM_MODE_CHANGE);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(index == 0 ? 0x350 : 0x650);
            pStep->setCimModeDev(index == 0 ? 0x965 : 0x12b5);
            if (pEquipment->addStep(0x350, pStep) != 0) {
@@ -781,7 +730,6 @@
        {
            CEqCimMessageCmdStep* pStep = new CEqCimMessageCmdStep();
            pStep->setName(STEP_CIM_MESSAGE_CMD);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(index == 0 ? 0x351 : 0x651);
            pStep->setCimMessageDev(index == 0 ? 0x950 : 0x12a0);
            if (pEquipment->addStep(0x351, pStep) != 0) {
@@ -791,7 +739,6 @@
        {
            CEqCimMessageClearStep* pStep = new CEqCimMessageClearStep();
            pStep->setName(STEP_CIM_MESSAGE_CLEAR);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(index == 0 ? 0x352 : 0x652);
            pStep->setClearCimMessageDev(index == 0 ? 0x963 : 0x12b3);
            if (pEquipment->addStep(0x352, pStep) != 0) {
@@ -801,7 +748,6 @@
        {
            CEqDateTimeSetCmdStep* pStep = new CEqDateTimeSetCmdStep();
            pStep->setName(STEP_DATETIME_SET_CMD);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(index == 0 ? 0x353 : 0x653);
            pStep->setDateTimeDev(index == 0 ? 0x966 : 0x12b6);
            if (pEquipment->addStep(0x353, pStep) != 0) {
@@ -811,7 +757,6 @@
        {
            CEqModeChangeStep* pStep = new CEqModeChangeStep();
            pStep->setName(STEP_EQ_MODE_CHANGE);
            pStep->setListener(listener);
            pStep->setWriteSignalDev(index == 0 ? 0x355 : 0x655);
            pStep->setEqModeDev(index == 0 ? 0x96E : 0x12be);
            if (pEquipment->addStep(0x355, pStep) != 0) {
@@ -827,7 +772,7 @@
        return 0;
    }
    int CMaster::addBakeCooling(StepListener& listener)
    int CMaster::addBakeCooling()
    {
        CBakeCooling* pEquipment = new CBakeCooling();
        pEquipment->setID(EQ_ID_BAKE_COOLING);
SourceCode/Bond/Servo/CMaster.h
@@ -14,11 +14,12 @@
namespace SERVO {
    typedef std::function<void(void* pMaster, CEquipment* pEiuipment, BOOL bAlive)> ONEQALIVE;
    typedef std::function<void(CStep* pStep, int code, void* pData)> ONEQSTEPEVENT;
    typedef std::function<void(void* pMaster, CEquipment* pEquipment, int state, int alarmId, int unitId, int level)> ONEQALARM;
    typedef struct _MasterListener
    {
        ONEQALIVE                onEqAlive;
        ONEQALIVE                onEqCimStateChanged;
        ONEQSTEPEVENT            onEqStepEvent;
        ONEQALARM               onEqAlarm;
    } MasterListener;
    class CMaster
@@ -39,13 +40,13 @@
    private:
        int addToEquipmentList(CEquipment* pEquipment);
        int addLoadPort(int index, StepListener& listener);
        int addFliper(StepListener& listener);
        int addVacuumBake(StepListener& listener);
        int addAligner(StepListener& listener);
        int addEFEM(StepListener& listener);
        int addBonder(int index, StepListener& listener);
        int addBakeCooling(StepListener& listener);
        int addLoadPort(int index);
        int addFliper();
        int addVacuumBake();
        int addAligner();
        int addEFEM();
        int addBonder(int index);
        int addBakeCooling();
        void connectEquipments();
        int saveCache();
        int saveCacheAndBackups();
SourceCode/Bond/Servo/CReadStep.cpp
@@ -1,6 +1,7 @@
#include "stdafx.h"
#include "CReadStep.h"
#include "Common.h"
#include "CEquipment.h"
namespace SERVO {
@@ -83,9 +84,8 @@
                nextStep();
                ASSERT(m_pCclink);
                if (0 == onReadData()) {
                    if (m_listener.onEvent != nullptr) {
                        m_listener.onEvent(this, STEP_EVENT_READDATA, nullptr);
                    }
                    ASSERT(m_pEquipment);
                    m_pEquipment->onStepEvent(this, STEP_EVENT_READDATA);
                }
                // 2.给对方写ON
@@ -112,9 +112,8 @@
                // 6.完成
                nextStep();
                if (0 == onComplete()) {
                    if (m_listener.onEvent != nullptr) {
                        m_listener.onEvent(this, STEP_EVENT_COMPLETE, nullptr);
                    }
                    ASSERT(m_pEquipment);
                    m_pEquipment->onStepEvent(this, STEP_EVENT_COMPLETE);
                }
            }
        }
SourceCode/Bond/Servo/CStep.cpp
@@ -6,7 +6,6 @@
    CStep::CStep()
    {
        m_listener = {nullptr};
        m_pCclink = nullptr;
        InitializeCriticalSection(&m_criticalSection);
    }
@@ -14,11 +13,6 @@
    CStep::~CStep()
    {
        DeleteCriticalSection(&m_criticalSection);
    }
    void CStep::setListener(StepListener listener)
    {
        m_listener.onEvent = listener.onEvent;
    }
    void CStep::setCcLink(CCCLinkIEControl* pCcLink)
SourceCode/Bond/Servo/CStep.h
@@ -8,12 +8,6 @@
#define STEP_EVENT_READDATA            0x01
#define STEP_EVENT_COMPLETE            0x02
    typedef std::function<void(void* pStep, int code, void* pData)> ONSTEPEVENT;
    typedef struct _StepListener
    {
        ONSTEPEVENT            onEvent;
    } StepListener;
    class CEquipment;
    class CStep
    {
@@ -22,7 +16,6 @@
        virtual ~CStep();
    public:
        void setListener(StepListener listener);
        void setCcLink(CCCLinkIEControl* pCcLink);
        void setEquipment(CEquipment* pEquipment);
        CEquipment* getEquipment();
@@ -39,7 +32,6 @@
        void convertString(const char* pszBuffer, int size, std::string& strOut);
    protected:
        StepListener m_listener;
        StationIdentifier m_station;
        std::string m_strName;
        CEquipment* m_pEquipment;
SourceCode/Bond/Servo/CWriteStep.cpp
@@ -1,6 +1,7 @@
#include "stdafx.h"
#include "CWriteStep.h"
#include "Common.h"
#include "CEquipment.h"
namespace SERVO {
@@ -120,9 +121,8 @@
                // 6.完成
                nextStep();
                if (0 == onComplete()) {
                    if (m_listener.onEvent != nullptr) {
                        m_listener.onEvent(this, STEP_EVENT_COMPLETE, nullptr);
                    }
                    ASSERT(m_pEquipment);
                    m_pEquipment->onStepEvent(this, STEP_EVENT_COMPLETE);
                }
            }
        }
SourceCode/Bond/Servo/Model.cpp
@@ -105,64 +105,50 @@
        notifyPtr(RX_CODE_EQ_ALIVE, pEquipment);
    };
    masterListener.onEqStepEvent = [&](SERVO::CStep* pStep, int code, void* pData) -> void {
        if (code == STEP_EVENT_READDATA) {
            LOGI("<CModel>onEqStepEvent,数据变化:%s(%s, 0x%x).\n", pStep->getEquipment()->getName().c_str(),
                pStep->getName().c_str(), pData);
            notifyPtr(RX_CODE_STEP_EVENT_READDATA, pStep);
            // 处理警告信息
            if (isAlarmStep(pStep)) {
                // 保存到数据库
                AlarmManager& alarmManager = AlarmManager::getInstance();
                std::string strAlarmText;
                SERVO::CEquipment* pEquipment = pStep->getEquipment();
                SERVO::CEqAlarmStep* pEqAlarmStep = (SERVO::CEqAlarmStep*)pStep;
                const AlarmInfo* pAlarmInfo = alarmManager.getAlarmInfoByID(pEqAlarmStep->getAlarmId());
                if (pAlarmInfo != nullptr) {
                    strAlarmText = pAlarmInfo->strAlarmText;
                }
                int state = pEqAlarmStep->getAlarmState();
                if (state == 1) {
                    AlarmData alarmData;
                    alarmData.nId = pEqAlarmStep->getAlarmId();
                    alarmData.nSeverityLevel = pEqAlarmStep->getAlarmLevel();
                    alarmData.nDeviceId = pEqAlarmStep->getEquipment()->getID();
                    alarmData.nUnitId = pEqAlarmStep->getUnitId();
                    alarmData.strDeviceName = alarmManager.getDeviceNameById(alarmData.nDeviceId);
                    alarmData.strUnitName = alarmManager.getUnitNameById(alarmData.nDeviceId, alarmData.nUnitId);
                    alarmData.strStartTime = CToolUnits::timeToString2(CToolUnits::getTimestamp());
                    alarmData.strEndTime = "";
                    const AlarmInfo* alarmInfo = alarmManager.getAlarmInfoByID(alarmData.nId);
                    alarmData.strDescription = alarmInfo != nullptr ? alarmInfo->strAlarmText : "";
                    int nAlarmEventId = 0;
                    bool result = alarmManager.addAlarm(alarmData, nAlarmEventId);
                    if (result) {
                        LOGI("<CModel> Alarm added successfully!");
                    }
                    else {
                        LOGE("<CModel> Failed to add alarm.");
                    }
                    notifyPtr(RX_CODE_ALARM_SET, pStep);
                }
                else {
                    alarmManager.clearAlarmByAttributes(pEqAlarmStep->getAlarmId(),
                        pEqAlarmStep->getEquipment()->getID(),
                        pEqAlarmStep->getUnitId(),
                        CToolUnits::getCurrentTimeString());
                    notifyPtr(RX_CODE_ALARM_CLEAR, pStep);
                }
                m_hsmsPassive.requestAlarmReport(pEqAlarmStep->getAlarmState(),
                    pEquipment->getBaseAlarmId() + pEqAlarmStep->getAlarmId(),
                    strAlarmText.c_str());
            }
    masterListener.onEqAlarm = [&](void* pMaster, SERVO::CEquipment* pEquipment, int state, int alarmId, int unitId, int level) -> void {
        AlarmManager& alarmManager = AlarmManager::getInstance();
        std::string strAlarmText;
        const AlarmInfo* pAlarmInfo = alarmManager.getAlarmInfoByID(alarmId);
        if (pAlarmInfo != nullptr) {
            strAlarmText = pAlarmInfo->strAlarmText;
        }
    };
        if (state == 1) {
            AlarmData alarmData;
            alarmData.nId = alarmId;
            alarmData.nSeverityLevel = level;
            alarmData.nDeviceId = pEquipment->getID();
            alarmData.nUnitId = unitId;
            alarmData.strDeviceName = alarmManager.getDeviceNameById(alarmData.nDeviceId);
            alarmData.strUnitName = alarmManager.getUnitNameById(alarmData.nDeviceId, alarmData.nUnitId);
            alarmData.strStartTime = CToolUnits::timeToString2(CToolUnits::getTimestamp());
            alarmData.strEndTime = "";
            const AlarmInfo* alarmInfo = alarmManager.getAlarmInfoByID(alarmData.nId);
            alarmData.strDescription = alarmInfo != nullptr ? alarmInfo->strAlarmText : "";
            int nAlarmEventId = 0;
            bool result = alarmManager.addAlarm(alarmData, nAlarmEventId);
            if (result) {
                LOGI("<CModel> Alarm added successfully!");
            }
            else {
                LOGE("<CModel> Failed to add alarm.");
            }
            notify(RX_CODE_ALARM_SET);
        }
        else {
            alarmManager.clearAlarmByAttributes(alarmId,
                pEquipment->getID(),
                unitId,
                CToolUnits::getCurrentTimeString());
            notify(RX_CODE_ALARM_CLEAR);
        }
        m_hsmsPassive.requestAlarmReport(state,
            pEquipment->getBaseAlarmId() + alarmId,
            strAlarmText.c_str());
    };
    m_master.setListener(masterListener);
@@ -395,9 +381,4 @@
    }
    return 0;
}
bool CModel::isAlarmStep(SERVO::CStep* pStep)
{
    return CToolUnits::startsWith(pStep->getName(), STEP_ALARM_START);
}
SourceCode/Bond/Servo/Model.h
@@ -14,7 +14,6 @@
    void setWorkDir(const char* pszWorkDir);
    int init();
    int term();
    bool isAlarmStep(SERVO::CStep* pStep);
public:
    int notify(int code);