Merge branch 'clh' into liuyang
| | |
| | | LOGI("onRecvDataMessage(%s).", pMessage->toString()); |
| | | |
| | | if (nStream == 5 && pHeader->function == 1) { |
| | | // S1F1 |
| | | // S5F1 |
| | | replyAck(5, 2, pMessage->getHeader()->systemBytes, 0, _T("ACK0")); |
| | | } |
| | | }; |
| | |
| | | return 0; |
| | | } |
| | | |
| | | int CHsmsActive::hsmsTransmitSpooledData() |
| | | { |
| | | IMessage* pMessage = nullptr; |
| | | int nRet = HSMS_Create1Message(pMessage, m_nSessionId, 6 | REPLY, 23, ++m_nSystemByte); |
| | | pMessage->getBody()->setU1(0, "RSDC"); |
| | | m_pActive->sendMessage(pMessage); |
| | | HSMS_Destroy1Message(pMessage); |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | int CHsmsActive::hsmsPurgeSpooledData() |
| | | { |
| | | IMessage* pMessage = nullptr; |
| | | int nRet = HSMS_Create1Message(pMessage, m_nSessionId, 6 | REPLY, 23, ++m_nSystemByte); |
| | | |
| | | pMessage->getBody()->setU1(1, "RSDC"); |
| | | m_pActive->sendMessage(pMessage); |
| | | HSMS_Destroy1Message(pMessage); |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | int CHsmsActive::replyAck0(IMessage* pMessage) |
| | | { |
| | | return 0; |
| | |
| | | // Configure Spooling |
| | | int hsmsConfigureSpooling(std::map<unsigned int, std::set<unsigned int>>& spoolingConfig); |
| | | |
| | | // åéææ¸
空ç¼åçæ¶æ¯ |
| | | int hsmsTransmitSpooledData(); |
| | | int hsmsPurgeSpooledData(); |
| | | |
| | | // éè¿çreply彿° |
| | | void replyAck(int s, int f, unsigned int systemBytes, BYTE ack, const char* pszAckName); |
| | | |
| | |
| | | ON_BN_CLICKED(IDC_BUTTON_DEFINE_REPORT, &CEAPSimulatorDlg::OnBnClickedButtonDefineReport) |
| | | ON_BN_CLICKED(IDC_BUTTON_LINE_REPORT, &CEAPSimulatorDlg::OnBnClickedButtonLineReport) |
| | | ON_BN_CLICKED(IDC_BUTTON_CONFIGURE_SPOOLING, &CEAPSimulatorDlg::OnBnClickedButtonConfigureSpooling) |
| | | ON_BN_CLICKED(IDC_BUTTON_TRANSMIT_SPOOLED_DATA, &CEAPSimulatorDlg::OnBnClickedButtonTransmitSpooledData) |
| | | ON_BN_CLICKED(IDC_BUTTON_PURGE_SPOOLED_DATA, &CEAPSimulatorDlg::OnBnClickedButtonPurgeSpooledData) |
| | | END_MESSAGE_MAP() |
| | | |
| | | |
| | |
| | | GetDlgItem(IDC_BUTTON_DEFINE_REPORT)->EnableWindow(enabled); |
| | | GetDlgItem(IDC_BUTTON_LINE_REPORT)->EnableWindow(enabled); |
| | | GetDlgItem(IDC_BUTTON_CONFIGURE_SPOOLING)->EnableWindow(enabled); |
| | | GetDlgItem(IDC_BUTTON_TRANSMIT_SPOOLED_DATA)->EnableWindow(enabled); |
| | | GetDlgItem(IDC_BUTTON_PURGE_SPOOLED_DATA)->EnableWindow(enabled); |
| | | } |
| | | |
| | | void CEAPSimulatorDlg::OnBnClickedButtonConnect() |
| | |
| | | spoolingConfig[5].insert(66); |
| | | theApp.m_model.m_pHsmsActive->hsmsConfigureSpooling(spoolingConfig); |
| | | } |
| | | |
| | | void CEAPSimulatorDlg::OnBnClickedButtonTransmitSpooledData() |
| | | { |
| | | theApp.m_model.m_pHsmsActive->hsmsTransmitSpooledData(); |
| | | } |
| | | |
| | | void CEAPSimulatorDlg::OnBnClickedButtonPurgeSpooledData() |
| | | { |
| | | theApp.m_model.m_pHsmsActive->hsmsPurgeSpooledData(); |
| | | } |
| | |
| | | afx_msg void OnBnClickedButtonDefineReport(); |
| | | afx_msg void OnBnClickedButtonLineReport(); |
| | | afx_msg void OnBnClickedButtonConfigureSpooling(); |
| | | afx_msg void OnBnClickedButtonTransmitSpooledData(); |
| | | afx_msg void OnBnClickedButtonPurgeSpooledData(); |
| | | }; |
| | |
| | | #define IDC_BUTTON_LINE_REPORT2 1012 |
| | | #define IDC_BUTTON_CONFIGURE_SPOOLING 1012 |
| | | #define IDC_RADIO_DISABLE 1013 |
| | | #define IDC_BUTTON_TRANSMIT_SPOOLED_DATA 1013 |
| | | #define IDC_EDIT_CEID 1014 |
| | | #define IDC_BUTTON_PURGE_SPOOLED_DATA 1014 |
| | | #define IDC_LIST1 1015 |
| | | #define IDC_EDIT_CE_NAME 1015 |
| | | #define IDC_LIST2 1016 |
| | |
| | | virtual ISECS2Item* addU1Item(unsigned char value, const char* pszNote) = 0; |
| | | virtual void setBinary(const char* pszData, unsigned int len, const char* pszNote) = 0; |
| | | virtual void setString(const char* pszText, const char* pszNote) = 0; |
| | | virtual void setU1(unsigned char value, const char* pszNote) = 0; |
| | | virtual ISECS2Item* addItem() = 0; |
| | | }; |
| | |
| | | return nullptr; |
| | | } |
| | | |
| | | CSlot* CEquipment::isSlotAvailable(unsigned int slot) |
| | | { |
| | | if (slot >= 8) return nullptr; |
| | | if (!m_slot[slot].isEnable()) return nullptr; |
| | | if (m_slot[slot].isLock()) return nullptr; |
| | | if (!m_slot[slot].isEmpty()) return nullptr; |
| | | int lsPath = m_slot[slot].getLinkSignalPath(); |
| | | if (!m_bLinkSignalToDownstream[lsPath][SIGNAL_UPSTREAM_INLINE] |
| | | || m_bLinkSignalToDownstream[lsPath][SIGNAL_UPSTREAM_TROUBLE] |
| | | || !m_bLinkSignalToDownstream[lsPath][SIGNAL_INTERLOCK] |
| | | || !m_bLinkSignalToDownstream[lsPath][SIGNAL_RECEIVE_ABLE]) return nullptr; |
| | | |
| | | return &m_slot[slot]; |
| | | } |
| | | |
| | | CSlot* CEquipment::getNonEmptySlot(MaterialsType putSlotType) |
| | | { |
| | | for (int i = 0; i < SLOT_MAX; i++) { |
| | |
| | | return nullptr; |
| | | } |
| | | |
| | | CSlot* CEquipment::getProcessedSlotCt(unsigned int slot) |
| | | { |
| | | if (slot >= 8) return nullptr; |
| | | if (!m_slot[slot].isEnable()) return nullptr; |
| | | if (m_slot[slot].isLock()) return nullptr; |
| | | CGlass* pGlass = (CGlass*)m_slot[slot].getContext(); |
| | | if (pGlass == nullptr) return nullptr; |
| | | int lsPath = m_slot[slot].getLinkSignalPath(); |
| | | if (!m_bLinkSignalToUpstream[lsPath][SIGNAL_UPSTREAM_INLINE] |
| | | || m_bLinkSignalToUpstream[lsPath][SIGNAL_UPSTREAM_TROUBLE] |
| | | || !m_bLinkSignalToUpstream[lsPath][SIGNAL_INTERLOCK] |
| | | || !m_bLinkSignalToUpstream[lsPath][SIGNAL_SEND_ABLE]) return nullptr; |
| | | |
| | | return &m_slot[slot]; |
| | | } |
| | | |
| | | CSlot* CEquipment::getInspFailSlot() |
| | | { |
| | | for (int i = 0; i < SLOT_MAX; i++) { |
| | |
| | | // è·åä¸ä¸ªæå®ç©æç±»å(G1,G2,G1&G2)çç©ºæ§½ä½ |
| | | CSlot* getAvailableSlotForGlass(MaterialsType type); |
| | | CSlot* getAvailableSlotForGlassExcludeSignal(MaterialsType type); |
| | | CSlot* isSlotAvailable(unsigned int slot); |
| | | |
| | | // 卿å®çæ§½å表ä¸ï¼è·åä¸ä¸ªæå®ç©æç±»å(G1,G2,G1&G2)çç©ºæ§½ä½ |
| | | CSlot* getAvailableSlotForGlass2(MaterialsType type, const std::vector<int>& candidates); |
| | |
| | | CSlot* getProcessedSlot(MaterialsType putSlotType); |
| | | CSlot* getProcessedSlot2(MaterialsType putSlotType, const std::vector<int>& candidates); |
| | | CSlot* getInspFailSlot(); |
| | | CSlot* getProcessedSlotCt(unsigned int slot); |
| | | |
| | | // è·åç»çç©æ |
| | | CGlass* getGlassFromSlot(int slotNo); |
| | |
| | | m_isCompareMapsBeforeProceeding = FALSE; |
| | | m_bEnableEventReport = true; |
| | | m_bEnableAlarmReport = true; |
| | | m_bContinuousTransfer = false; |
| | | InitializeCriticalSection(&m_criticalSection); |
| | | } |
| | | |
| | |
| | | return -1; |
| | | } |
| | | |
| | | m_bContinuousTransfer = false; |
| | | setState(MASTERSTATE::STARTING); |
| | | m_ullStartTime = GetTickCount64(); |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | int CMaster::startContinuousTransfer() |
| | | { |
| | | if (m_state != MASTERSTATE::READY) { |
| | | return -1; |
| | | } |
| | | |
| | | m_bContinuousTransfer = true; |
| | | setState(MASTERSTATE::STARTING); |
| | | m_ullStartTime = GetTickCount64(); |
| | | |
| | |
| | | int CMaster::stop() |
| | | { |
| | | // è¿è¡æ¶é´ä¸ºç´¯å ç»æï¼æ¬æ¬¡åæ¢æ¶å·æ°ï¼ |
| | | if (m_state != MASTERSTATE::RUNNING) { |
| | | if (m_state != MASTERSTATE::RUNNING && m_state != MASTERSTATE::RUNNING_CONTINUOUS_TRANSFER) { |
| | | return -1; |
| | | } |
| | | |
| | |
| | | |
| | | |
| | | unlock(); |
| | | if(!m_bContinuousTransfer) |
| | | setState(MASTERSTATE::RUNNING); |
| | | else |
| | | setState(MASTERSTATE::RUNNING_CONTINUOUS_TRANSFER); |
| | | |
| | | continue; |
| | | } |
| | | |
| | |
| | | unlock(); |
| | | continue; |
| | | } |
| | | |
| | | // åä¼ æ¨¡å¼è°åº¦é»è¾ |
| | | else if (m_state == MASTERSTATE::RUNNING_CONTINUOUS_TRANSFER) { |
| | | // æ£æµå¤ærobotç¶æ |
| | | RMDATA& rmd = pEFEM->getRobotMonitoringData(); |
| | | if (rmd.status != ROBOT_STATUS::Idle && rmd.status != ROBOT_STATUS::Run) { |
| | | unlock(); |
| | | continue; |
| | | } |
| | | |
| | | if (m_pActiveRobotTask != nullptr) { |
| | | if (m_pActiveRobotTask->isPicked()) { |
| | | m_pActiveRobotTask->place(); |
| | | } |
| | | unlock(); |
| | | // æ£æµå°å½åææ£å¨ä¸åçä»»å¡ï¼ç¡®ä¿å½åä»»å¡å®ææä¸æ¢åç»§ç» |
| | | // LOGI("æ£æµå°å½åææ£å¨ä¸åçä»»å¡ï¼ç¡®ä¿å½åä»»å¡å®ææä¸æ¢åç»§ç»..."); |
| | | continue; |
| | | } |
| | | |
| | | // Measurement -> LoadPort |
| | | for (int s = 0; s < 4; s++) { |
| | | PortType pt = pLoadPorts[s]->getPortType(); |
| | | if (!rmd.armState[0] && pLoadPorts[s]->isEnable() |
| | | && (pt == PortType::Unloading || pt == PortType::Both) |
| | | && pLoadPorts[s]->getPortStatus() == PORT_INUSE) { |
| | | for (int slot = 0; slot < SLOT_MAX; slot++) { |
| | | m_pActiveRobotTask = createTransferTask_continuous_transfer(pMeasurement, |
| | | 0, pLoadPorts[s], slot); |
| | | if (m_pActiveRobotTask != nullptr) { |
| | | goto CT_PORT_PUT; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | CT_PORT_PUT: |
| | | CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask); |
| | | |
| | | |
| | | // BakeCooling ->Measurement |
| | | if (!rmd.armState[0]) { |
| | | m_pActiveRobotTask = createTransferTask_continuous_transfer(pBakeCooling, |
| | | 3, pMeasurement, 0); |
| | | CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask); |
| | | } |
| | | |
| | | |
| | | // BakeCoolingå
é¨ |
| | | if (!rmd.armState[0]) { |
| | | m_pActiveRobotTask = createTransferTask_continuous_transfer(pBakeCooling, |
| | | 2, pBakeCooling, 3); |
| | | CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask); |
| | | } |
| | | if (!rmd.armState[0]) { |
| | | m_pActiveRobotTask = createTransferTask_continuous_transfer(pBakeCooling, |
| | | 1, pBakeCooling, 2); |
| | | CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask); |
| | | } |
| | | if (!rmd.armState[0]) { |
| | | m_pActiveRobotTask = createTransferTask_continuous_transfer(pBakeCooling, |
| | | 0, pBakeCooling, 1); |
| | | CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask); |
| | | } |
| | | |
| | | // Bonder2 -> BakeCooling |
| | | if (!rmd.armState[0]) { |
| | | m_pActiveRobotTask = createTransferTask_continuous_transfer(pBonder2, |
| | | 0, pBakeCooling, 0); |
| | | CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask); |
| | | } |
| | | |
| | | // Bonder1 -> Bonder2 |
| | | if (!rmd.armState[0] && !pBonder2->hasBondClass()) { |
| | | m_pActiveRobotTask = createTransferTask_continuous_transfer(pBonder1, |
| | | 0, pBonder2, 0); |
| | | CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask); |
| | | } |
| | | |
| | | // VacuumBake(G1) -> Bonder1 |
| | | if (!rmd.armState[0] && !pBonder1->hasBondClass()) { |
| | | m_pActiveRobotTask = createTransferTask_continuous_transfer(pVacuumBake, |
| | | 0, pBonder1, 0); |
| | | CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask); |
| | | } |
| | | |
| | | // Fliper(G2) -> VacuumBake(G1) |
| | | if (!rmd.armState[0]) { |
| | | m_pActiveRobotTask = createTransferTask_continuous_transfer(pFliper, |
| | | 0, pVacuumBake, 0); |
| | | CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask); |
| | | } |
| | | |
| | | // Aligner -> Fliper(G2) |
| | | if (!rmd.armState[1]) { |
| | | m_pActiveRobotTask = createTransferTask_continuous_transfer(pAligner, |
| | | 0, pFliper, 0); |
| | | CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask); |
| | | } |
| | | |
| | | // LoadPort -> Aligner |
| | | for (int s = 0; s < 4; s++) { |
| | | PortType pt = pLoadPorts[s]->getPortType(); |
| | | if (!rmd.armState[0] && pLoadPorts[s]->isEnable() |
| | | && (pt == PortType::Loading || pt == PortType::Both) |
| | | && pLoadPorts[s]->getPortStatus() == PORT_INUSE) { |
| | | for (int slot = 0; slot < SLOT_MAX; slot++) { |
| | | m_pActiveRobotTask = createTransferTask_continuous_transfer(pLoadPorts[s], |
| | | slot, pAligner, 0); |
| | | if (m_pActiveRobotTask != nullptr) { |
| | | pEFEM->setContext(m_pActiveRobotTask->getContext()); |
| | | goto CT_PORT_GET; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | CT_PORT_GET: |
| | | CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask); |
| | | |
| | | |
| | | unlock(); |
| | | continue; |
| | | } |
| | | |
| | | |
| | | unlock(); |
| | | } |
| | | |
| | |
| | | return pTask; |
| | | } |
| | | |
| | | CRobotTask* CMaster::createTransferTask_continuous_transfer(CEquipment* pSrcEq, int nSrcSlot, |
| | | CEquipment* pTarEq, int nTarSlot, int armNo/* = 1*/) |
| | | { |
| | | if (!pSrcEq->IsEnabled()) { |
| | | return nullptr; |
| | | } |
| | | if (!pTarEq->IsEnabled()) { |
| | | return nullptr; |
| | | } |
| | | |
| | | CRobotTask* pTask = nullptr; |
| | | CSlot* pTarSlot = pTarEq->isSlotAvailable(nTarSlot); |
| | | CSlot* pSrcSlot = pSrcEq->getProcessedSlotCt(nSrcSlot); |
| | | if (pSrcSlot != nullptr && nullptr != pTarSlot) { |
| | | pTask = new CRobotTask(); |
| | | pTask->setContext(pSrcSlot->getContext()); |
| | | pTask->setEFEM((CEFEM*)getEquipment(EQ_ID_EFEM)); |
| | | taskSeqNo = pTask->setRobotTransferParam(taskSeqNo, armNo, pSrcSlot->getPosition(), |
| | | pTarSlot->getPosition(), pSrcSlot->getNo(), pTarSlot->getNo()); |
| | | } |
| | | |
| | | |
| | | return pTask; |
| | | } |
| | | |
| | | int CMaster::abortCurrentTask() |
| | | { |
| | | lock(); |
| | |
| | | READY = 0, |
| | | STARTING, |
| | | RUNNING, |
| | | RUNNING_CONTINUOUS_TRANSFER, |
| | | STOPPING, |
| | | MSERROR |
| | | }; |
| | |
| | | int init(); |
| | | int term(); |
| | | int start(); |
| | | int startContinuousTransfer(); |
| | | int stop(); |
| | | void clearError(); |
| | | ULONGLONG getRunTime(); |
| | |
| | | CRobotTask* createTransferTask_bake_to_cooling(CEquipment* pSrcEq); |
| | | CRobotTask* createTransferTask_bakecooling_to_measurement(CEquipment* pSrcEq, CEquipment* pTarEq); |
| | | CRobotTask* createTransferTask_restore(CEquipment* pEqSrc, CLoadPort** pPorts); |
| | | CRobotTask* createTransferTask_continuous_transfer(CEquipment* pSrcEq, int nSrcSlot, |
| | | CEquipment* pTarEq, int nTarSlot, int armNo = 1); |
| | | |
| | | private: |
| | | CRITICAL_SECTION m_criticalSection; |
| | |
| | | std::list<CEquipment*> m_listEquipment; |
| | | std::string m_strFilepath; |
| | | BOOL m_bDataModify; |
| | | bool m_bContinuousTransfer; |
| | | |
| | | private: |
| | | /* çæ§æ¯ç¹ä½ç线ç¨*/ |
| | |
| | | } |
| | | */ |
| | | |
| | | theApp.m_model.m_hsmsPassive.requestAlarmReport(1, 2, "abc"); |
| | | static int i = 0; |
| | | i++; |
| | | static char* pszText[] = {"123", "456", "789", "abc", "def"}; |
| | | theApp.m_model.m_hsmsPassive.requestAlarmReport(i%3, i, pszText[i%5]); |
| | | } |
| | | |
| | | |
| | |
| | | BOOL CHsmsAction::incrementAndCheckTimeout() |
| | | { |
| | | unsigned int nResponseTime = InterlockedIncrement(&m_nResponseTime); |
| | | return nResponseTime >= m_nTimeout; |
| | | return nResponseTime >= m_nTimeout + 1; |
| | | } |
| | | |
| | | int CHsmsAction::serialize(char* pszBuffer, int nBufferSize) |
| | |
| | | m_listener.onCommand = nullptr; |
| | | m_listener.onEQConstantRequest = nullptr; |
| | | m_listener.onEQConstantSend = nullptr; |
| | | m_pActiveAction = nullptr; |
| | | InitializeCriticalSection(&m_criticalSection); |
| | | } |
| | | |
| | |
| | | delete item; |
| | | } |
| | | m_listActionSent.clear(); |
| | | for (auto item : m_listActionSpooling) { |
| | | delete item; |
| | | } |
| | | m_listActionSpooling.clear(); |
| | | Unlock(); |
| | | |
| | | if (m_hCimWorkEvent != NULL) { |
| | |
| | | { |
| | | LOGI("onRecvMsg:%s", pMessage->toString()); |
| | | Lock(); |
| | | if (m_pActiveAction != nullptr && |
| | | (m_pActiveAction->getSendMessage()->getHeader()->systemBytes == pMessage->getHeader()->systemBytes)) { |
| | | SetEvent(m_pActiveAction->getEvent()); |
| | | LOGI("CHsmsPassive::å½åçå¾
æåå¤"); |
| | | TRACE("CHsmsPassive::å½åçå¾
æåå¤\n"); |
| | | Unlock(); |
| | | return 0; |
| | | } |
| | | Unlock(); |
| | | |
| | | |
| | | Lock(); |
| | | CHsmsAction* pAction = nullptr; |
| | | for (auto iter = m_listActionSent.begin(); iter != m_listActionSent.end(); iter++) { |
| | | if ((*iter)->getSendMessage()->getHeader()->systemBytes == pMessage->getHeader()->systemBytes) { |
| | | LOGI("CHsmsPassive::æ¾å°"); |
| | | pAction = (*iter); |
| | | SetEvent(pAction->getEvent()); |
| | | m_listActionSent.erase(iter); |
| | | break; |
| | | } |
| | |
| | | else if (nStream == 5 && pHeader->function == 3) { |
| | | replyEanbleDisableAlarmReport(pMessage); |
| | | } |
| | | else if (nStream == 6 && pHeader->function == 23) { |
| | | replyPurgeSpooledData(pMessage); |
| | | } |
| | | else if (nStream == 7 && pHeader->function == 19) { |
| | | replyQueryPPIDList(pMessage); |
| | | } |
| | |
| | | return 0; |
| | | } |
| | | |
| | | int CHsmsPassive::loadCacheFromFile(const char* pszFilepath) |
| | | { |
| | | m_strCacheFilepath = pszFilepath; |
| | | |
| | | CFile file; |
| | | if (!file.Open(m_strCacheFilepath.c_str(), CFile::modeRead) ) { |
| | | return -1; |
| | | } |
| | | |
| | | int nBufSize = file.GetLength(); |
| | | char* pszBuffer = new char[nBufSize]; |
| | | file.Read(pszBuffer, nBufSize); |
| | | file.Close(); |
| | | int nRet = unserialize(pszBuffer, nBufSize); |
| | | delete[] pszBuffer; |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | int CHsmsPassive::saveCache() |
| | | { |
| | | CFile file; |
| | | if (!file.Open(m_strCacheFilepath.c_str(), CFile::modeWrite | CFile::modeCreate)) { |
| | | return -1; |
| | | } |
| | | |
| | | int nSize = serialize(nullptr, 0); |
| | | char* pszBuffer = new char[nSize]; |
| | | int nRet = serialize(pszBuffer, nSize); |
| | | file.Write(pszBuffer, nSize); |
| | | file.Close(); |
| | | delete[] pszBuffer; |
| | | |
| | | return nRet; |
| | | } |
| | | |
| | | int CHsmsPassive::term() |
| | | { |
| | | // ç»æçº¿ç¨ |
| | |
| | | return 0; |
| | | } |
| | | |
| | | int CHsmsPassive::serialize(char* pszBuffer, int nBufferSize) |
| | | { |
| | | int index = 0; |
| | | if (pszBuffer == nullptr) { |
| | | index += sizeof(int); |
| | | for (auto item : m_listActionSpooling) { |
| | | index += item->serialize(pszBuffer, nBufferSize); |
| | | } |
| | | |
| | | return index; |
| | | } |
| | | else { |
| | | int nTemp, nRet; |
| | | |
| | | nTemp = (int)m_listActionSpooling.size(); |
| | | memcpy(&pszBuffer[index], &nTemp, sizeof(int)); |
| | | index += sizeof(int); |
| | | |
| | | for (auto item : m_listActionSpooling) { |
| | | nRet = item->serialize(&pszBuffer[index], nBufferSize); |
| | | if (nRet <= 0) break; |
| | | index += nRet; |
| | | } |
| | | |
| | | return index; |
| | | } |
| | | } |
| | | |
| | | int CHsmsPassive::unserialize(const char* pszBuffer, int nBufferSize) |
| | | { |
| | | int index = 0, nTemp, nRet = 0; |
| | | |
| | | if (index + sizeof(int) > nBufferSize) return -1; |
| | | memcpy(&nTemp, &pszBuffer[index], sizeof(int)); |
| | | index += sizeof(int); |
| | | |
| | | for (int i = 0; i < nTemp; i++) { |
| | | CHsmsAction* pAction = new CHsmsAction(); |
| | | nRet = pAction->unserialize(&pszBuffer[index], nBufferSize - index); |
| | | if (nRet <= 0) break; |
| | | index += nRet; |
| | | m_listActionSpooling.push_back(pAction); |
| | | } |
| | | |
| | | return index + nRet; |
| | | } |
| | | |
| | | unsigned CHsmsPassive::OnCimWork() |
| | | { |
| | | while (m_bCimWorking) { |
| | |
| | | while (!list.empty()) { |
| | | Lock(); |
| | | CHsmsAction* pAction = list.front(); |
| | | if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) { |
| | | m_listActionSpooling.push_back(pAction); |
| | | Unlock(); |
| | | continue; |
| | | } |
| | | Unlock(); |
| | | list.pop_front(); |
| | | TRACE("OnCimWork 004.\n"); |
| | | |
| | | if (pAction->isNeedWaitReply()) { |
| | | // 妿éè¦çå¾
åå¤ |
| | | Lock(); |
| | | m_pActiveAction = pAction; |
| | | IMessage* pMessage = pAction->getSendMessage(); |
| | | Unlock(); |
| | | |
| | | ASSERT(pMessage); |
| | | m_pPassive->sendMessage(pMessage); |
| | | LOGI("<HSMS> [SEND] SysByte=%u sessionId:%d", pMessage->getHeader()->systemBytes, pMessage->getHeader()->sessionId); |
| | | |
| | | if (pAction->isNeedWaitReply()) { |
| | | // 妿éè¦çå¾
åå¤ |
| | | int nRet = WaitForSingleObject(pAction->getEvent(), pAction->getTimeout() * 1000); |
| | | if (nRet == WAIT_TIMEOUT) { |
| | | TRACE("Timeout...\n"); |
| | |
| | | //pContext->setEvent(); |
| | | } |
| | | } |
| | | |
| | | delete pAction; |
| | | pAction = NULL; |
| | | TRACE("delete m_pCurrentAction, next...\n"); |
| | | Lock(); |
| | | delete m_pActiveAction; |
| | | m_pActiveAction = nullptr; |
| | | Unlock(); |
| | | } |
| | | else { |
| | | Lock(); |
| | | m_listActionSent.push_back(pAction); |
| | | IMessage* pMessage = pAction->getSendMessage(); |
| | | Unlock(); |
| | | |
| | | ASSERT(pMessage); |
| | | m_pPassive->sendMessage(pMessage); |
| | | LOGI("<HSMS> [SEND] SysByte=%u sessionId:%d", pMessage->getHeader()->systemBytes, pMessage->getHeader()->sessionId); |
| | | |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | TRACE("OnCimWork \n"); |
| | |
| | | return 0; |
| | | } |
| | | |
| | | // S1F13 |
| | | int CHsmsPassive::replyEstablishCommunications(IMessage* pRecv) |
| | | { |
| | | if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) { |
| | |
| | | return 0; |
| | | } |
| | | |
| | | // S6F23 |
| | | int CHsmsPassive::replyPurgeSpooledData(IMessage* pRecv) |
| | | { |
| | | if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) { |
| | | return ER_NOTSELECT; |
| | | } |
| | | ISECS2Item* pBody = pRecv->getBody(); |
| | | if (pBody == nullptr || pBody->getType() != SITYPE::U1) ER_PARAM_ERROR; |
| | | unsigned char RSDC; // 0 - transmit; 1 - purge; |
| | | pBody->getU1(RSDC); |
| | | if (RSDC != 0 && RSDC != 1) ER_PARAM_ERROR; |
| | | |
| | | BYTE ACK = 0; // 0 - ok; 1 - retryable busy; 2 - no spool data; |
| | | if (m_listActionSpooling.empty()) { |
| | | ACK = 2; |
| | | } |
| | | replyAck(6, 24, pRecv->getHeader()->systemBytes, ACK, "RSDA"); |
| | | |
| | | |
| | | // ä¸¢å¼ |
| | | if (RSDC == 1) { |
| | | Lock(); |
| | | for (auto item : m_listActionSpooling) { |
| | | delete item; |
| | | } |
| | | m_listActionSpooling.clear(); |
| | | Unlock(); |
| | | } |
| | | else { |
| | | Lock(); |
| | | for (auto item : m_listActionSpooling) { |
| | | m_listAction.push_back(item); |
| | | } |
| | | m_listActionSpooling.clear(); |
| | | Unlock(); |
| | | SetEvent(m_hCimWorkEvent); |
| | | } |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | // S7F19 |
| | | int CHsmsPassive::replyQueryPPIDList(IMessage* pRecv) |
| | | { |
| | |
| | | // S5F1 |
| | | int CHsmsPassive::requestAlarmReport(int ALCD, int ALID, const char* ALTX) |
| | | { |
| | | if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) { |
| | | return ER_NOTSELECT; |
| | | } |
| | | |
| | | char szALCD[1]; |
| | | szALCD[0] = ALCD & 0xff; |
| | | |
| | | Lock(); |
| | | CHsmsAction* pAction = new CHsmsAction(ACTION_ALARM_REPORT, TRUE, m_nActionTimeout); |
| | | m_listAction.push_back(pAction); |
| | | |
| | | IMessage* pMessage = NULL; |
| | | HSMS_Create1Message(pMessage, m_nSessionId, 5 | REPLY, 1, ++m_nSystemByte); |
| | | ASSERT(pMessage); |
| | |
| | | pItem->addU4Item(ALID, "ALID"); |
| | | pItem->addItem(ALTX, "ALTX"); |
| | | pAction->setSendMessage(pMessage); |
| | | |
| | | SetEvent(m_hCimWorkEvent); |
| | | Unlock(); |
| | | |
| | | int size = pAction->serialize(nullptr, 0);; |
| | | if (size > 0) { |
| | | char* pszBuffer = new char[size]; |
| | | pAction->serialize(pszBuffer, size); |
| | | AfxMessageBox("abc"); |
| | | |
| | | CHsmsAction* pAction2 = new CHsmsAction(); |
| | | pAction2->unserialize(pszBuffer, size); |
| | | AfxMessageBox("def"); |
| | | m_pPassive->sendMessage(pAction2->getSendMessage()); |
| | | if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) { |
| | | m_listActionSpooling.push_back(pAction); |
| | | } |
| | | else { |
| | | m_listAction.push_back(pAction); |
| | | SetEvent(m_hCimWorkEvent); |
| | | } |
| | | Unlock(); |
| | | |
| | | return ER_NOERROR; |
| | | } |
| | |
| | | // S6F11 |
| | | int CHsmsPassive::requestEventReportSend(unsigned int DATAID, unsigned int CEID, const std::vector<std::string>& values) |
| | | { |
| | | if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) { |
| | | return ER_NOTSELECT; |
| | | } |
| | | |
| | | SERVO::CCollectionEvent* pEvent = getEvent(CEID); |
| | | if (pEvent == nullptr) { |
| | | return ER_NO_EVENT; |
| | |
| | | |
| | | Lock(); |
| | | CHsmsAction* pAction = new CHsmsAction(ACTION_EVENT_REPORT, TRUE, m_nActionTimeout); |
| | | m_listAction.push_back(pAction); |
| | | IMessage* pMessage = NULL; |
| | | HSMS_Create1Message(pMessage, m_nSessionId, 6 | REPLY, 11, ++m_nSystemByte); |
| | | ASSERT(pMessage); |
| | |
| | | pItemList3->addItem(item.c_str(), "V"); |
| | | } |
| | | pAction->setSendMessage(pMessage); |
| | | |
| | | if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) { |
| | | m_listActionSpooling.push_back(pAction); |
| | | } |
| | | else { |
| | | m_listAction.push_back(pAction); |
| | | SetEvent(m_hCimWorkEvent); |
| | | } |
| | | Unlock(); |
| | | |
| | | return ER_NOERROR; |
| | |
| | | void OnTimer(UINT nTimerid); |
| | | void setActionTimeout(int nSecond); |
| | | int init(CModel* pModel, const char* pszName, unsigned int port); |
| | | int loadCacheFromFile(const char* pszFilepath); |
| | | int saveCache(); |
| | | int term(); |
| | | int serialize(char* pszBuffer, int nBufferSize); |
| | | int unserialize(const char* pszBuffer, int nBufferSize); |
| | | |
| | | public: |
| | | /* requestå¼å¤´ç彿°ä¸ºä¸»å¨åéæ°æ®ç彿° */ |
| | |
| | | int replyCommand(IMessage* pRecv); |
| | | int replyConfigureSpooling(IMessage* pRecv); |
| | | int replyEanbleDisableAlarmReport(IMessage* pRecv); |
| | | int replyPurgeSpooledData(IMessage* pRecv); |
| | | int replyQueryPPIDList(IMessage* pRecv); |
| | | int replyTerminalDisplay(IMessage* pRecv); |
| | | |
| | |
| | | CRITICAL_SECTION m_criticalSection; |
| | | std::list<CHsmsAction*> m_listAction; |
| | | std::list<CHsmsAction*> m_listActionSent; |
| | | std::list<CHsmsAction*> m_listActionSpooling; |
| | | |
| | | private: |
| | | SECSListener m_listener; |
| | |
| | | HANDLE m_hCimWorkEvent; |
| | | HANDLE m_hCimWorkThreadHandle; |
| | | unsigned m_nCimWorkThrdaddr; |
| | | std::string m_strCacheFilepath; |
| | | CHsmsAction* m_pActiveAction; |
| | | |
| | | private: |
| | | // CVariable vector |
| | |
| | | m_hsmsPassive.loadReports((LPTSTR)(LPCTSTR)strVarialbleFile); |
| | | strVarialbleFile.Format(_T("%s\\CollectionEventList.txt"), (LPTSTR)(LPCTSTR)m_strWorkDir); |
| | | m_hsmsPassive.loadCollectionEvents((LPTSTR)(LPCTSTR)strVarialbleFile); |
| | | strVarialbleFile.Format(_T("%s\\HsmsPassive.cache"), (LPTSTR)(LPCTSTR)m_strWorkDir); |
| | | m_hsmsPassive.loadCacheFromFile(strVarialbleFile); |
| | | |
| | | |
| | | SERVO::MasterListener masterListener; |
| | |
| | | |
| | | int CModel::term() |
| | | { |
| | | m_hsmsPassive.saveCache(); |
| | | m_hsmsPassive.term(); |
| | | CLog::GetLog()->SetOnLogCallback(nullptr); |
| | | m_master.term(); |
| | |
| | | SERVO::MASTERSTATE state = theApp.m_model.getMaster().getState(); |
| | | if (state == SERVO::MASTERSTATE::READY) { |
| | | m_pTopToolbar->GetBtn(IDC_BUTTON_RUN)->EnableWindow(TRUE); |
| | | m_pTopToolbar->GetBtn(IDC_BUTTON_RUN_CT)->EnableWindow(TRUE); |
| | | m_pTopToolbar->GetBtn(IDC_BUTTON_STOP)->EnableWindow(FALSE); |
| | | m_pMyStatusbar->setBackgroundColor(STATUSBAR_BK_NORMAL); |
| | | m_pMyStatusbar->setForegroundColor(RGB(0, 0, 0)); |
| | |
| | | } |
| | | else if (state == SERVO::MASTERSTATE::MSERROR) { |
| | | m_pTopToolbar->GetBtn(IDC_BUTTON_RUN)->EnableWindow(TRUE); |
| | | m_pTopToolbar->GetBtn(IDC_BUTTON_RUN_CT)->EnableWindow(TRUE); |
| | | m_pTopToolbar->GetBtn(IDC_BUTTON_STOP)->EnableWindow(FALSE); |
| | | m_pMyStatusbar->setBackgroundColor(STATUSBAR_BK_ALARM); |
| | | m_pMyStatusbar->setForegroundColor(RGB(0, 0, 0)); |
| | | m_pMyStatusbar->setRunTimeText("å¯å¨å¤±è´¥."); |
| | | } |
| | | else if (state == SERVO::MASTERSTATE::RUNNING) { |
| | | else if (state == SERVO::MASTERSTATE::RUNNING || state == SERVO::MASTERSTATE::RUNNING_CONTINUOUS_TRANSFER) { |
| | | m_pTopToolbar->GetBtn(IDC_BUTTON_RUN)->EnableWindow(FALSE); |
| | | m_pTopToolbar->GetBtn(IDC_BUTTON_RUN_CT)->EnableWindow(FALSE); |
| | | m_pTopToolbar->GetBtn(IDC_BUTTON_STOP)->EnableWindow(TRUE); |
| | | m_pMyStatusbar->setBackgroundColor(STATUSBAR_BK_RUNNING); |
| | | m_pMyStatusbar->setForegroundColor(RGB(255, 255, 255)); |
| | |
| | | else { |
| | | if (theApp.m_model.getMaster().start() == 0) { |
| | | m_pTopToolbar->GetBtn(IDC_BUTTON_RUN)->EnableWindow(FALSE); |
| | | m_pTopToolbar->GetBtn(IDC_BUTTON_RUN_CT)->EnableWindow(FALSE); |
| | | } |
| | | } |
| | | } |
| | | else if (id == IDC_BUTTON_RUN_CT) { |
| | | if (theApp.m_model.getMaster().getState() == SERVO::MASTERSTATE::MSERROR) { |
| | | AfxMessageBox("å½åææºå°åçé误ï¼ä¸è½å¯å¨ï¼è¯·ç¡®è®¤è§£å³é®é¢ååå°è¯éæ°å¯å¨ï¼"); |
| | | } |
| | | else { |
| | | if (theApp.m_model.getMaster().startContinuousTransfer() == 0) { |
| | | m_pTopToolbar->GetBtn(IDC_BUTTON_RUN)->EnableWindow(FALSE); |
| | | m_pTopToolbar->GetBtn(IDC_BUTTON_RUN_CT)->EnableWindow(FALSE); |
| | | } |
| | | } |
| | | } |
| | |
| | | if (state == SERVO::MASTERSTATE::RUNNING) { |
| | | strText.Format(_T("æ£å¨è¿è¡ï¼%02d:%02d:%02d %s"), h, m, s, pszSuffix); |
| | | } |
| | | else if (state == SERVO::MASTERSTATE::RUNNING_CONTINUOUS_TRANSFER) { |
| | | strText.Format(_T("åä¼ æ¨¡å¼ï¼%02d:%02d:%02d %s"), h, m, s, pszSuffix); |
| | | } |
| | | else { |
| | | strText.Format(_T("å·²è¿è¡ï¼%02d:%02d:%02d %s"), h, m, s, pszSuffix); |
| | | } |
| | |
| | | { |
| | | CDialogEx::DoDataExchange(pDX); |
| | | DDX_Control(pDX, IDC_BUTTON_RUN, m_btnRun); |
| | | DDX_Control(pDX, IDC_BUTTON_RUN_CT, m_btnRunCt); |
| | | DDX_Control(pDX, IDC_BUTTON_STOP, m_btnStop); |
| | | DDX_Control(pDX, IDC_BUTTON_ALARM, m_btnAlarm); |
| | | DDX_Control(pDX, IDC_BUTTON_SETTINGS, m_btnSettings); |
| | |
| | | CDialogEx::OnInitDialog(); |
| | | |
| | | InitBtn(m_btnRun, "Run_High_32.ico", "Run_Gray_32.ico"); |
| | | InitBtn(m_btnRunCt, "RunCt_High_32.ico", "RunCt_Gray_32.ico"); |
| | | InitBtn(m_btnStop, "Stop_High_32.ico", "Stop_Gray_32.ico"); |
| | | InitBtn(m_btnAlarm, "Alarm_o_32.ico", "Alarm_gray_32.ico"); |
| | | InitBtn(m_btnSettings, "Settings_High_32.ico", "Settings_Gray_32.ico"); |
| | |
| | | int x = 2, y = 3; |
| | | |
| | | pItem = GetDlgItem(IDC_BUTTON_RUN); |
| | | pItem->MoveWindow(x, y, BTN_WIDTH, nBthHeight); |
| | | x += BTN_WIDTH; |
| | | x += 2; |
| | | |
| | | pItem = GetDlgItem(IDC_BUTTON_RUN_CT); |
| | | pItem->MoveWindow(x, y, BTN_WIDTH, nBthHeight); |
| | | x += BTN_WIDTH; |
| | | x += 2; |
| | |
| | | { |
| | | switch (LOWORD(wParam)) { |
| | | case IDC_BUTTON_RUN: |
| | | case IDC_BUTTON_RUN_CT: |
| | | case IDC_BUTTON_STOP: |
| | | case IDC_BUTTON_ALARM: |
| | | case IDC_BUTTON_SETTINGS: |
| | |
| | | |
| | | private: |
| | | CBlButton m_btnRun; |
| | | CBlButton m_btnRunCt; |
| | | CBlButton m_btnStop; |
| | | CBlButton m_btnAlarm; |
| | | CBlButton m_btnSettings; |