| | |
| | | m_robotData.position = ROBOT_POSITION::Port1; |
| | | m_robotData.armState[0] = FALSE; |
| | | m_robotData.armState[1] = FALSE; |
| | | m_pActiveContext = nullptr; |
| | | } |
| | | |
| | | CEFEM::~CEFEM() |
| | | { |
| | | |
| | | if (m_pActiveContext != nullptr) { |
| | | m_pActiveContext->release(); |
| | | m_pActiveContext = nullptr; |
| | | } |
| | | } |
| | | |
| | | const char* CEFEM::getClassName() |
| | | { |
| | | static char* pszName = "CEFEM"; |
| | | return pszName; |
| | | } |
| | | |
| | | void CEFEM::setContext(CContext* pContext) |
| | | { |
| | | if (m_pActiveContext != nullptr) { |
| | | m_pActiveContext->release(); |
| | | } |
| | | m_pActiveContext = pContext; |
| | | m_pActiveContext->addRef(); |
| | | } |
| | | |
| | | void CEFEM::setPort(unsigned int index, CLoadPort* pPort) |
| | |
| | | LOGI("<CEquipment-%s>发送RobotCmdS成功.", m_strName.c_str()); |
| | | } |
| | | else { |
| | | LOGI("<CEquipment-%s>发送RobotCmds失败,code:%d", m_strName.c_str(), code); |
| | | LOGE("<CEquipment-%s>发送RobotCmds失败,code:%d", m_strName.c_str(), code); |
| | | } |
| | | |
| | | return 0; |
| | | }); |
| | | }); |
| | | } |
| | | |
| | | return 0; |
| | |
| | | void CEFEM::initPins() |
| | | { |
| | | // 加入Pin初始化代码 |
| | | LOGI("<CEFEM>initPins"); |
| | | LOGD("<CEFEM>initPins"); |
| | | } |
| | | |
| | | void CEFEM::initSteps() |
| | |
| | | } |
| | | |
| | | { |
| | | // VCR Event Report |
| | | // 机器上报扫码结果,扫码器预计安装在巡边检机器上 |
| | | CEqReadStep* pStep = new CEqReadStep(0x5fef, 15 * 2, |
| | | [&](void* pFrom, int code, const char* pszData, size_t size) -> int { |
| | | if (code == ROK && pszData != nullptr && size > 0) { |
| | | decodeVCREventReport((CStep*)pFrom, pszData, size); |
| | | } |
| | | return -1; |
| | | }); |
| | | pStep->setName(STEP_EQ_VCR1_EVENT_REPORT); |
| | | pStep->setProp("Port", (void*)1); |
| | | pStep->setWriteSignalDev(0x4a); |
| | | if (addStep(STEP_ID_VCR1_EVENT_REPORT, pStep) != 0) { |
| | | delete pStep; |
| | | } |
| | | } |
| | | |
| | | { |
| | | // eq cim message clear |
| | | CEqCimMessageClearStep* pStep = new CEqCimMessageClearStep(); |
| | | pStep->setName(STEP_CIM_MESSAGE_CLEAR); |
| | |
| | | pStep->setWriteSignalDev(0x66); |
| | | pStep->setDataDev(0x90a); |
| | | if (addStep(STEP_ID_MASTER_RECIPE_LIST_CMD_REPLY, pStep) != 0) { |
| | | delete pStep; |
| | | } |
| | | } |
| | | |
| | | { |
| | | // master recipe list report |
| | | CEqReadStep* pStep = new CEqReadStep(0x6955, 255 * 2, |
| | | [&](void* pFrom, int code, const char* pszData, size_t size) -> int { |
| | | CEqReadStep* pTmpStep = (CEqReadStep*)pFrom; |
| | | short ret = MRLRC_OK; |
| | | if (code == ROK && pszData != nullptr && size > 0) { |
| | | // 此处解释配方数据 |
| | | ret = decodeRecipeListReport(pszData, size); |
| | | } |
| | | pTmpStep->setReturnCode(ret); |
| | | return -1; |
| | | }); |
| | | pStep->setName(STEP_EQ_MASTER_RECIPE_LIST); |
| | | pStep->setWriteSignalDev(0x4b); |
| | | pStep->setReturnDev(0x91d); |
| | | if (addStep(STEP_ID_MASTER_RECIPE_LIST_REPORT, pStep) != 0) { |
| | | delete pStep; |
| | | } |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | // FAC Data Report |
| | | addFacDataReportStep(0x6589, 0x04d, 1); |
| | | /* |
| | | { |
| | | // Panel Data Report |
| | | CEqReadStep* pStep = new CEqReadStep(0x617f, 386 * 2, |
| | | [&](void* pFrom, int code, const char* pszData, size_t size) -> int { |
| | | if (code == ROK && pszData != nullptr && size > 0) { |
| | | decodePanelDataReport((CStep*)pFrom, pszData, size); |
| | | } |
| | | return -1; |
| | | }); |
| | | pStep->setName(STEP_EQ_PANEL_DATA_REPORT); |
| | | pStep->setProp("Port", (void*)1); |
| | | pStep->setWriteSignalDev(0x15e); |
| | | if (addStep(STEP_ID_PANEL_DATA_REPORT, pStep) != 0) { |
| | | delete pStep; |
| | | } |
| | | } |
| | | |
| | | { |
| | | // FAC Data Report |
| | | CEqReadStep* pStep = new CEqReadStep(0x6301, 108 * 2, |
| | | CEqReadStep* pStep = new CEqReadStep(0x6589, 133 * 2, |
| | | [&](void* pFrom, int code, const char* pszData, size_t size) -> int { |
| | | if (code == ROK && pszData != nullptr && size > 0) { |
| | | decodeFacDataReport((CStep*)pFrom, pszData, size); |
| | |
| | | delete pStep; |
| | | } |
| | | } |
| | | */ |
| | | |
| | | { |
| | | // JOB Data Request |
| | | CEqReadStep* pStep = new CEqReadStep(0x617d, 2 * 2, |
| | | CEqReadStep* pStep = new CEqReadStep(0x0, 0, |
| | | [&](void* pFrom, int code, const char* pszData, size_t size) -> int { |
| | | if (code == ROK && pszData != nullptr && size > 0) { |
| | | decodeJobDataRequest((CStep*)pFrom, pszData, size); |
| | | if (code == ROK /* && pszData != nullptr && size > 0*/) { |
| | | // 由于EFEM没有发送参数到master, 我们只需要返回数据 |
| | | // Cassette Sequence No和Job Sequence No根据上一次调试缓存而来 |
| | | // decodeJobDataRequest((CStep*)pFrom, pszData, size); |
| | | |
| | | // efme, 获取数据后返回 |
| | | // Cassette Sequence No 1W |
| | | // Job Sequence No 1W |
| | | // Job DataS 256W |
| | | // 获取数据后返回给EFEM |
| | | // Job DataS 320W |
| | | // ACK 1W |
| | | // Reserved 15W |
| | | short ack = (short)JobDataRequestAck::NG; // 不存在jobData |
| | | char szBuffer[1024] = { 0 }; |
| | | CJobDataS* pJobDataS = m_pPort[3]->getJobDataSWithCassette(4001, 1); |
| | | if (pJobDataS != nullptr) { |
| | | int size = pJobDataS->serialize(szBuffer, 1024); |
| | | ((CEqReadStep*)pFrom)->setReturnData(szBuffer, size); |
| | | LOGI("<CEFEM-%s>JobDataRequest received (code=%d, size=%zu)", m_strName.c_str(), code, size); |
| | | if (m_pActiveContext != nullptr) { |
| | | CJobDataS* pJobDataS = ((CGlass*)m_pActiveContext)->getJobDataS(); |
| | | if (pJobDataS != nullptr) { |
| | | pJobDataS->serialize(szBuffer, 1024); |
| | | ack = (short)JobDataRequestAck::OK; |
| | | LOGI("<CEFEM-%s>JobDataRequest OK (CassetteSeq=%d, JobSeq=%d)", |
| | | m_strName.c_str(), |
| | | pJobDataS->getCassetteSequenceNo(), |
| | | pJobDataS->getJobSequenceNo()); |
| | | } |
| | | else { |
| | | LOGW("<CEFEM-%s>JobDataRequest NG (JobDataS is null)", m_strName.c_str()); |
| | | } |
| | | } |
| | | else { |
| | | LOGW("<CEFEM-%s>JobDataRequest NG (ActiveContext is null)", m_strName.c_str()); |
| | | } |
| | | memcpy(&szBuffer[320 * 2], &ack, sizeof(short)); |
| | | LOGI("<CEFEM-%s>JobDataRequest response ack=%d", m_strName.c_str(), (int)ack); |
| | | ((CEqReadStep*)pFrom)->setReturnData(szBuffer, 336 * 2); |
| | | } |
| | | return -1; |
| | | }); |
| | |
| | | m_pPort[i]->onReceiveLBData(pszData, size); |
| | | } |
| | | } |
| | | m_pAligner->onReceiveLBData(pszData, size); |
| | | |
| | | |
| | | // 更新信号到LoadPort, Robot, Aligner, Fliper |
| | | m_pPort[0]->setLinkSignalBlock(0, &m_bLinkSignal[0][0]); |
| | | m_pPort[1]->setLinkSignalBlock(0, &m_bLinkSignal[1][0]); |
| | | m_pPort[2]->setLinkSignalBlock(0, &m_bLinkSignal[2][0]); |
| | | m_pPort[3]->setLinkSignalBlock(0, &m_bLinkSignal[3][0]); |
| | | m_pArmTray[0]->setLinkSignalBlock(0, &m_bLinkSignal[4][0]); |
| | | m_pArmTray[1]->setLinkSignalBlock(0, &m_bLinkSignal[5][0]); |
| | | m_pAligner->setLinkSignalBlock(0, &m_bLinkSignal[6][0]); |
| | | m_pFliper->setLinkSignalBlock(0, &m_bLinkSignal[7][0]); |
| | | m_pPort[0]->setLinkSignalUpstreamBlock(0, &m_bLinkSignalToUpstream[0][0]); |
| | | m_pPort[1]->setLinkSignalUpstreamBlock(0, &m_bLinkSignalToUpstream[1][0]); |
| | | m_pPort[2]->setLinkSignalUpstreamBlock(0, &m_bLinkSignalToUpstream[2][0]); |
| | | m_pPort[3]->setLinkSignalUpstreamBlock(0, &m_bLinkSignalToUpstream[3][0]); |
| | | m_pArmTray[0]->setLinkSignalUpstreamBlock(0, &m_bLinkSignalToUpstream[4][0]); |
| | | m_pArmTray[1]->setLinkSignalUpstreamBlock(0, &m_bLinkSignalToUpstream[5][0]); |
| | | m_pAligner->setLinkSignalUpstreamBlock(0, &m_bLinkSignalToUpstream[6][0]); |
| | | m_pFliper->setLinkSignalUpstreamBlock(0, &m_bLinkSignalToUpstream[7][0]); |
| | | |
| | | m_pPort[0]->setLinkSignalDownstreamBlock(0, &m_bLinkSignalToDownstream[0][0]); |
| | | m_pPort[1]->setLinkSignalDownstreamBlock(0, &m_bLinkSignalToDownstream[1][0]); |
| | | m_pPort[2]->setLinkSignalDownstreamBlock(0, &m_bLinkSignalToDownstream[2][0]); |
| | | m_pPort[3]->setLinkSignalDownstreamBlock(0, &m_bLinkSignalToDownstream[3][0]); |
| | | m_pArmTray[0]->setLinkSignalDownstreamBlock(0, &m_bLinkSignalToDownstream[4][0]); |
| | | m_pArmTray[1]->setLinkSignalDownstreamBlock(0, &m_bLinkSignalToDownstream[5][0]); |
| | | m_pAligner->setLinkSignalDownstreamBlock(0, &m_bLinkSignalToDownstream[6][0]); |
| | | m_pFliper->setLinkSignalDownstreamBlock(0, &m_bLinkSignalToDownstream[7][0]); |
| | | } |
| | | |
| | | int CEFEM::onReceivedJob(int port, CJobDataS* pJobDataS) |
| | |
| | | |
| | | int CEFEM::onFetchedOutJob(int port, CJobDataB* pJobDataB) |
| | | { |
| | | if (port == 1) { |
| | | return m_pPort[0]->onFetchedOutJob(port, pJobDataB); |
| | | } |
| | | if (port == 2) { |
| | | return m_pPort[1]->onFetchedOutJob(port, pJobDataB); |
| | | } |
| | | if (port == 3) { |
| | | return m_pPort[2]->onFetchedOutJob(port, pJobDataB); |
| | | } |
| | | if (port == 4) { |
| | | return m_pPort[3]->onFetchedOutJob(port, pJobDataB); |
| | | } |
| | | if (port == 5) { |
| | | return m_pArmTray[0]->onFetchedOutJob(port, pJobDataB); |
| | | } |
| | | if (port == 6) { |
| | | return m_pArmTray[1]->onFetchedOutJob(port, pJobDataB); |
| | | } |
| | | if (port == 7) { |
| | | return m_pAligner->onFetchedOutJob(port, pJobDataB); |
| | | } |
| | | if (port == 8) { |
| | | return m_pFliper->onFetchedOutJob(port, pJobDataB); |
| | | // 转发到子单元设备 |
| | | CEquipment* pEqs[] = { m_pPort[0], m_pPort[1], m_pPort[2], m_pPort[3], m_pArmTray[0], m_pArmTray[1], |
| | | m_pAligner, m_pFliper }; |
| | | if (1 <= port && port <= 8) { |
| | | pEqs[port - 1]->onFetchedOutJob(port, pJobDataB); |
| | | } |
| | | |
| | | return -1; |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | int CEFEM::onStoredJob(int port, CJobDataB* pJobDataB) |
| | | { |
| | | if (port == 1) { |
| | | return m_pPort[0]->onStoredJob(port, pJobDataB); |
| | | } |
| | | if (port == 2) { |
| | | return m_pPort[1]->onStoredJob(port, pJobDataB); |
| | | } |
| | | if (port == 3) { |
| | | return m_pPort[2]->onStoredJob(port, pJobDataB); |
| | | } |
| | | if (port == 4) { |
| | | return m_pPort[3]->onStoredJob(port, pJobDataB); |
| | | } |
| | | if (port == 5) { |
| | | return m_pArmTray[0]->onStoredJob(port, pJobDataB); |
| | | } |
| | | if (port == 6) { |
| | | return m_pArmTray[1]->onStoredJob(port, pJobDataB); |
| | | } |
| | | if (port == 7) { |
| | | return m_pAligner->onStoredJob(port, pJobDataB); |
| | | } |
| | | if (port == 8) { |
| | | return m_pFliper->onStoredJob(port, pJobDataB); |
| | | // 转发到子单元设备 |
| | | CEquipment* pEqs[] = { m_pPort[0], m_pPort[1], m_pPort[2], m_pPort[3], m_pArmTray[0], m_pArmTray[1], |
| | | m_pAligner, m_pFliper }; |
| | | if (1 <= port && port <= 8) { |
| | | pEqs[port - 1]->onStoredJob(port, pJobDataB); |
| | | } |
| | | |
| | | return -1; |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | int CEFEM::getIndexerOperationModeBaseValue() |
| | | { |
| | | return 10000; |
| | | } |
| | | |
| | | void CEFEM::printDebugRobotState() |
| | | { |
| | | LOGD("<CEFEM>Robot status:%d, ARM1:%s, ARM2:%s", |
| | | m_robotData.status, |
| | | m_robotData.armState[0] ? _T("ON") : _T("OFF"), |
| | | m_robotData.armState[1] ? _T("ON") : _T("OFF")); |
| | | } |
| | | } |