1.与EFEM对接调试Port Command(Type Change、Mode Change、Transfer Mode Change、Enable Mode Change、Type Auto Change、Cassette Type Change)并修改完善代码。
2.增加Recive Able信号的获取,并以此作为能否放料的逻辑判断依据。
3.配方获取完善,待测。
| | |
| | | } |
| | | |
| | | // 更新信号到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::getIndexerOperationModeBaseValue() |
| | | { |
| | | return 10000; |
| | | } |
| | | |
| | | void CEFEM::printDebugString001() |
| | | { |
| | | for (int i = 0; i < 8; i++) { |
| | | LOGI("<CEquipment-%s>%d, Signal:%s, %s, %s, %s", |
| | | m_strName.c_str(), i, |
| | | m_bLinkSignal[i][SIGNAL_UPSTREAM_INLINE] ? "ON" : "OFF", |
| | | m_bLinkSignal[i][SIGNAL_UPSTREAM_TROUBLE] ? "ON" : "OFF", |
| | | m_bLinkSignal[i][SIGNAL_INTERLOCK] ? "ON" : "OFF", |
| | | m_bLinkSignal[i][SIGNAL_SEND_ABLE] ? "ON" : "OFF" |
| | | ); |
| | | } |
| | | } |
| | | } |
| | |
| | | int robotCmd(ROBOT_CMD_PARAM& robotCmdParam, ONWRITED onWritedBlock = nullptr); |
| | | int robotCmds(ROBOT_CMD_PARAM* robotCmdParam, unsigned int count, ONWRITED onWritedBlock = nullptr); |
| | | RMDATA& getRobotMonitoringData(); |
| | | void printDebugString001(); |
| | | |
| | | // 快捷封装 |
| | | int robotSendHome(int seq, ONWRITED onWritedBlock = nullptr); |
| | |
| | | m_bLocalAlarm = FALSE; |
| | | m_bAutoRecipeChange = FALSE; |
| | | m_bVCREnable[0] = FALSE; |
| | | memset(m_bLinkSignal, 0, sizeof(m_bLinkSignal)); |
| | | memset(m_bLinkSignalToUpstream, 0, sizeof(m_bLinkSignalToUpstream)); |
| | | memset(m_bLinkSignalToDownstream, 0, sizeof(m_bLinkSignalToDownstream)); |
| | | m_pCclink = nullptr; |
| | | m_nBaseAlarmId = 0; |
| | | m_pArm = nullptr; |
| | |
| | | BOOL bFlag; |
| | | int index = 0; |
| | | for (int i = 0; i < 8; i++) { |
| | | m_bLinkSignal[i][SIGNAL_UPSTREAM_INLINE] = isBitOn(pszData, size, index + 0); |
| | | m_bLinkSignal[i][SIGNAL_UPSTREAM_TROUBLE] = isBitOn(pszData, size, index + 1); |
| | | m_bLinkSignal[i][SIGNAL_INTERLOCK] = isBitOn(pszData, size, index + 2); |
| | | m_bLinkSignal[i][SIGNAL_SEND_ABLE] = isBitOn(pszData, size, index + 3); |
| | | m_bLinkSignalToUpstream[i][SIGNAL_UPSTREAM_INLINE] = isBitOn(pszData, size, index + 0); |
| | | m_bLinkSignalToUpstream[i][SIGNAL_UPSTREAM_TROUBLE] = isBitOn(pszData, size, index + 1); |
| | | m_bLinkSignalToUpstream[i][SIGNAL_INTERLOCK] = isBitOn(pszData, size, index + 2); |
| | | m_bLinkSignalToUpstream[i][SIGNAL_SEND_ABLE] = isBitOn(pszData, size, index + 3); |
| | | index += 0x40; |
| | | } |
| | | if(m_bLinkSignal[0][SIGNAL_SEND_ABLE]) { |
| | | if(m_bLinkSignalToUpstream[0][SIGNAL_SEND_ABLE]) { |
| | | onSendAble(); |
| | | } |
| | | |
| | | for (int i = 0; i < 8; i++) { |
| | | m_bLinkSignalToDownstream[i][SIGNAL_UPSTREAM_INLINE] = isBitOn(pszData, size, index + 0); |
| | | m_bLinkSignalToDownstream[i][SIGNAL_UPSTREAM_TROUBLE] = isBitOn(pszData, size, index + 1); |
| | | m_bLinkSignalToDownstream[i][SIGNAL_INTERLOCK] = isBitOn(pszData, size, index + 2); |
| | | m_bLinkSignalToDownstream[i][SIGNAL_RECEIVE_ABLE] = isBitOn(pszData, size, index + 3); |
| | | index += 0x40; |
| | | } |
| | | if (m_bLinkSignalToDownstream[0][SIGNAL_RECEIVE_ABLE]) { |
| | | onSendAble(); |
| | | } |
| | | |
| | |
| | | return m_bVCREnable[index]; |
| | | } |
| | | |
| | | BOOL CEquipment::isLinkSignalOn(unsigned int path, unsigned int signal) |
| | | BOOL CEquipment::isLinkSignalUpstreamOn(unsigned int path, unsigned int signal) |
| | | { |
| | | if (path >= PATH_MAX) return FALSE; |
| | | if (signal >= SIGNAL_MAX) return FALSE; |
| | | return m_bLinkSignal[path][signal]; |
| | | return m_bLinkSignalToUpstream[path][signal]; |
| | | } |
| | | |
| | | void CEquipment::setLinkSignal(unsigned int path, unsigned int signal, BOOL bOn) |
| | | BOOL CEquipment::isLinkSignalDownstreamOn(unsigned int path, unsigned int signal) |
| | | { |
| | | if (path >= PATH_MAX) return FALSE; |
| | | if (signal >= SIGNAL_MAX) return FALSE; |
| | | return m_bLinkSignalToDownstream[path][signal]; |
| | | } |
| | | |
| | | void CEquipment::setLinkSignalUpstream(unsigned int path, unsigned int signal, BOOL bOn) |
| | | { |
| | | if (path >= PATH_MAX) return; |
| | | if (signal >= SIGNAL_MAX) return; |
| | | m_bLinkSignal[path][signal] = bOn; |
| | | m_bLinkSignalToUpstream[path][signal] = bOn; |
| | | } |
| | | |
| | | void CEquipment::setLinkSignalBlock(unsigned int path, BOOL* pSignal) |
| | | void CEquipment::setLinkSignalUpstreamBlock(unsigned int path, BOOL* pSignal) |
| | | { |
| | | if (path >= PATH_MAX) return; |
| | | for (int i = 0; i < SIGNAL_MAX; i++) { |
| | | m_bLinkSignal[path][i] = pSignal[i]; |
| | | m_bLinkSignalToUpstream[path][i] = pSignal[i]; |
| | | } |
| | | } |
| | | |
| | | void CEquipment::setLinkSignalDownstream(unsigned int path, unsigned int signal, BOOL bOn) |
| | | { |
| | | if (path >= PATH_MAX) return; |
| | | if (signal >= SIGNAL_MAX) return; |
| | | m_bLinkSignalToDownstream[path][signal] = bOn; |
| | | } |
| | | |
| | | void CEquipment::setLinkSignalDownstreamBlock(unsigned int path, BOOL* pSignal) |
| | | { |
| | | if (path >= PATH_MAX) return; |
| | | for (int i = 0; i < SIGNAL_MAX; i++) { |
| | | m_bLinkSignalToDownstream[path][i] = pSignal[i]; |
| | | } |
| | | } |
| | | |
| | |
| | | std::vector<CPin*>& CEquipment::getOutputPins() |
| | | { |
| | | return m_outputPins; |
| | | } |
| | | |
| | | CRecipeList* CEquipment::getRecipeList(int unitNo) |
| | | { |
| | | return m_recipesManager.getRecipeList(unitNo); |
| | | } |
| | | |
| | | int CEquipment::recvIntent(CPin* pPin, CIntent* pIntent) |
| | |
| | | return 0; |
| | | } |
| | | |
| | | int CEquipment::masterRecipeListRequest(short unitNo) |
| | | int CEquipment::masterRecipeListRequest(short unitNo, ONSYNCINGSTATECHANGED block) |
| | | { |
| | | SERVO::CEqWriteStep* pStep = (SERVO::CEqWriteStep*)getStepWithName(STEP_EQ_MASTER_RECIPE_LIST_REQ); |
| | | if (pStep == nullptr) { |
| | |
| | | } |
| | | |
| | | LOGI("<CEquipment-%s>正在请求单元<%d>主配方列表", m_strName.c_str(), unitNo); |
| | | m_recipesManager.setOnSyncingStateChanged(block); |
| | | if (m_recipesManager.syncing() != 0) { |
| | | return -2; |
| | | } |
| | |
| | | if (!m_slot[i].isEnable()) continue; |
| | | if (m_slot[i].isLock()) continue; |
| | | if (!m_slot[i].isEmpty()) continue; |
| | | int lsPath = m_slot[i].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]) continue; |
| | | |
| | | MaterialsType slotType = m_slot[i].getType(); |
| | | if (type == MaterialsType::G1 && slotType == MaterialsType::G2) continue; |
| | |
| | | CGlass* pGlass = (CGlass*)m_slot[i].getContext(); |
| | | if (pGlass == nullptr) continue; |
| | | int lsPath = m_slot[i].getLinkSignalPath(); |
| | | if(!m_bLinkSignal[lsPath][SIGNAL_UPSTREAM_INLINE] |
| | | || m_bLinkSignal[lsPath][SIGNAL_UPSTREAM_TROUBLE] |
| | | || !m_bLinkSignal[lsPath][SIGNAL_INTERLOCK] |
| | | || !m_bLinkSignal[lsPath][SIGNAL_SEND_ABLE] ) continue; |
| | | if(!m_bLinkSignalToUpstream[lsPath][SIGNAL_UPSTREAM_INLINE] |
| | | || m_bLinkSignalToUpstream[lsPath][SIGNAL_UPSTREAM_TROUBLE] |
| | | || !m_bLinkSignalToUpstream[lsPath][SIGNAL_INTERLOCK] |
| | | || !m_bLinkSignalToUpstream[lsPath][SIGNAL_SEND_ABLE] ) continue; |
| | | |
| | | MaterialsType glassType = pGlass->getType(); |
| | | if (glassType == MaterialsType::G1 && putSlotType == MaterialsType::G2) continue; |
| | |
| | | CGlass* pGlass = (CGlass*)m_slot[i].getContext(); |
| | | if (pGlass == nullptr) continue; |
| | | int lsPath = m_slot[i].getLinkSignalPath(); |
| | | if (!m_bLinkSignal[lsPath][SIGNAL_UPSTREAM_INLINE] |
| | | || m_bLinkSignal[lsPath][SIGNAL_UPSTREAM_TROUBLE] |
| | | || !m_bLinkSignal[lsPath][SIGNAL_INTERLOCK] |
| | | || !m_bLinkSignal[lsPath][SIGNAL_SEND_ABLE]) continue; |
| | | if (!m_bLinkSignalToUpstream[lsPath][SIGNAL_UPSTREAM_INLINE] |
| | | || m_bLinkSignalToUpstream[lsPath][SIGNAL_UPSTREAM_TROUBLE] |
| | | || !m_bLinkSignalToUpstream[lsPath][SIGNAL_INTERLOCK] |
| | | || !m_bLinkSignalToUpstream[lsPath][SIGNAL_SEND_ABLE]) continue; |
| | | |
| | | MaterialsType glassType = pGlass->getType(); |
| | | if (glassType == MaterialsType::G1 && putSlotType == MaterialsType::G2) continue; |
| | |
| | | return 0; |
| | | } |
| | | |
| | | int CEquipment::onRecieveAble() |
| | | { |
| | | LOGI("<CEquipment-%s>onRecieveAble.", m_strName.c_str()); |
| | | |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | int CEquipment::onProcessStateChanged(PROCESS_STATE state) |
| | | { |
| | | return 0; |
| | |
| | | |
| | | return TRUE; |
| | | } |
| | | |
| | | void CEquipment::printDebugString001() |
| | | { |
| | | for (int i = 0; i < 8; i++) { |
| | | LOGI("<CEquipment-%s>Link Signal to UP stream Path#%d, Signal:%s, %s, %s, %s", |
| | | m_strName.c_str(), i, |
| | | m_bLinkSignalToUpstream[i][SIGNAL_UPSTREAM_INLINE] ? "ON" : "OFF", |
| | | m_bLinkSignalToUpstream[i][SIGNAL_UPSTREAM_TROUBLE] ? "ON" : "OFF", |
| | | m_bLinkSignalToUpstream[i][SIGNAL_INTERLOCK] ? "ON" : "OFF", |
| | | m_bLinkSignalToUpstream[i][SIGNAL_SEND_ABLE] ? "ON" : "OFF" |
| | | ); |
| | | } |
| | | for (int i = 0; i < 8; i++) { |
| | | LOGI("<CEquipment-%s>Link Signal to Down stream Path#%d, Signal:%s, %s, %s, %s", |
| | | m_strName.c_str(), i, |
| | | m_bLinkSignalToDownstream[i][SIGNAL_UPSTREAM_INLINE] ? "ON" : "OFF", |
| | | m_bLinkSignalToDownstream[i][SIGNAL_UPSTREAM_TROUBLE] ? "ON" : "OFF", |
| | | m_bLinkSignalToDownstream[i][SIGNAL_INTERLOCK] ? "ON" : "OFF", |
| | | m_bLinkSignalToDownstream[i][SIGNAL_SEND_ABLE] ? "ON" : "OFF" |
| | | ); |
| | | } |
| | | } |
| | | } |
| | |
| | | #define SIGNAL_UPSTREAM_TROUBLE 1 |
| | | #define SIGNAL_INTERLOCK 2 |
| | | #define SIGNAL_SEND_ABLE 3 |
| | | #define SIGNAL_RECEIVE_ABLE 4 |
| | | |
| | | typedef std::function<void(int writeCode, int retCode)> ONWRITEDRET; |
| | | |
| | | typedef std::function<void(void* pEiuipment, BOOL bAlive)> ONALIVE; |
| | |
| | | CPin* getPin(char* pszName); |
| | | std::vector<CPin*>& CEquipment::getInputPins(); |
| | | std::vector<CPin*>& CEquipment::getOutputPins(); |
| | | CRecipeList* getRecipeList(int unitNo); |
| | | virtual int recvIntent(CPin* pPin, CIntent* pIntent); |
| | | virtual int fetchedOutJob(CJobDataB* pJobDataB); |
| | | virtual int storedJob(CJobDataB* pJobDataB, short putSlot); |
| | |
| | | virtual int onStoredJob(int port, CJobDataB* pJobDataB); |
| | | virtual int onProcessData(CProcessData* pProcessData); |
| | | virtual int onSendAble(); |
| | | virtual int onRecieveAble(); |
| | | virtual int onProcessStateChanged(PROCESS_STATE state); |
| | | virtual int getIndexerOperationModeBaseValue(); |
| | | bool isAlarmStep(SERVO::CStep* pStep); |
| | |
| | | int setDateTime(short year, short month, short day, short hour, short minute, short second); |
| | | int setDispatchingMode(DISPATCHING_MODE mode, ONWRITED onWritedBlock = nullptr); |
| | | int indexerOperationModeChange(IDNEXER_OPERATION_MODE mode, ONWRITEDRET onWritedRetBlock); |
| | | |
| | | void printDebugString001(); |
| | | |
| | | |
| | | // 请求主配方列表 |
| | | // unitNo: 0:local; Others:unit No |
| | | int masterRecipeListRequest(short unitNo); |
| | | int masterRecipeListRequest(short unitNo, ONSYNCINGSTATECHANGED block); |
| | | |
| | | // 请求配方参数 |
| | | // masterRecipeId: 主配方id |
| | |
| | | BOOL isLocalAlarm(); |
| | | BOOL isAutoRecipeChange(); |
| | | BOOL isVCREnable(unsigned int index); |
| | | BOOL isLinkSignalOn(unsigned int path, unsigned int signal); |
| | | BOOL isLinkSignalUpstreamOn(unsigned int path, unsigned int signal); |
| | | BOOL isLinkSignalDownstreamOn(unsigned int path, unsigned int signal); |
| | | |
| | | // 只在模拟测试时使用的函数,用于模拟信号 |
| | | void setLinkSignal(unsigned int path, unsigned int signal, BOOL bOn); |
| | | void setLinkSignalBlock(unsigned int path, BOOL* pSignal); |
| | | void setLinkSignalUpstream(unsigned int path, unsigned int signal, BOOL bOn); |
| | | void setLinkSignalUpstreamBlock(unsigned int path, BOOL* pSignal); |
| | | void setLinkSignalDownstream(unsigned int path, unsigned int signal, BOOL bOn); |
| | | void setLinkSignalDownstreamBlock(unsigned int path, BOOL* pSignal); |
| | | |
| | | protected: |
| | | inline void Lock() { EnterCriticalSection(&m_criticalSection); } |
| | |
| | | BOOL m_bLocalAlarm; |
| | | BOOL m_bAutoRecipeChange; |
| | | BOOL m_bVCREnable[VCR_MAX]; |
| | | BOOL m_bLinkSignal[PATH_MAX][SIGNAL_MAX]; |
| | | BOOL m_bLinkSignalToUpstream[PATH_MAX][SIGNAL_MAX]; |
| | | BOOL m_bLinkSignalToDownstream[PATH_MAX][SIGNAL_MAX]; |
| | | |
| | | protected: |
| | | CCCLinkIEControl* m_pCclink; |
| | |
| | | |
| | | for (int nRow = 0; nRow < SIGNAL_GRID_ROWS; ++nRow) { |
| | | for (int nCol = 0; nCol < SIGNAL_GRID_COLS; ++nCol) { |
| | | BOOL bCurrentState = m_pEquipment->isLinkSignalOn(nRow, nCol); |
| | | BOOL bCurrentState = m_pEquipment->isLinkSignalUpstreamOn(nRow, nCol); |
| | | UpdateSignalState(nRow, nCol, bCurrentState); |
| | | } |
| | | } |
| | |
| | | int index = nRow * SIGNAL_GRID_COLS + nCol; |
| | | if (index >= 0 && index < (int)m_vSignalList.size() && m_vSignalList[index].bClickable && m_pEquipment != nullptr) { |
| | | // 读取当前状态并切换 |
| | | const BOOL bCurrentState = m_pEquipment->isLinkSignalOn(nRow, nCol); |
| | | m_pEquipment->setLinkSignal(nRow, nCol, !bCurrentState); |
| | | const BOOL bCurrentState = m_pEquipment->isLinkSignalUpstreamOn(nRow, nCol); |
| | | m_pEquipment->setLinkSignalUpstream(nRow, nCol, !bCurrentState); |
| | | } |
| | | }); |
| | | |
| | |
| | | } \ |
| | | } |
| | | |
| | | #define CHECK_WRITE_STEP_SIGNAL2(addr, data, size) { \ |
| | | BOOL bFlag = isBitOn(data, size, addr); \ |
| | | SERVO::CStep* pStep = getStep(addr); \ |
| | | if (pStep != nullptr) { \ |
| | | ((CWriteStep*)pStep)->onRecvSignal(bFlag ? addr : 0); \ |
| | | } \ |
| | | } |
| | | |
| | | namespace SERVO { |
| | | CLoadPort::CLoadPort() : CEquipment() |
| | | { |
| | |
| | | static int cassetteTypeReply[] = { STEP_ID_PROT1_CASSETTE_TYPE_CHANGE_REPLY, STEP_ID_PROT2_CASSETTE_TYPE_CHANGE_REPLY, |
| | | STEP_ID_PROT3_CASSETTE_TYPE_CHANGE_REPLY, STEP_ID_PROT4_CASSETTE_TYPE_CHANGE_REPLY }; |
| | | |
| | | CHECK_READ_STEP_SIGNAL2(typeReply[m_nIndex], pszData, size); |
| | | CHECK_READ_STEP_SIGNAL2(modeReply[m_nIndex], pszData, size); |
| | | CHECK_READ_STEP_SIGNAL2(transferModeReply[m_nIndex], pszData, size); |
| | | CHECK_READ_STEP_SIGNAL2(enableModeReply[m_nIndex], pszData, size); |
| | | CHECK_READ_STEP_SIGNAL2(typeAutoReply[m_nIndex], pszData, size); |
| | | CHECK_READ_STEP_SIGNAL2(cassetteTypeReply[m_nIndex], pszData, size); |
| | | CHECK_WRITE_STEP_SIGNAL2(typeReply[m_nIndex], pszData, size); |
| | | CHECK_WRITE_STEP_SIGNAL2(modeReply[m_nIndex], pszData, size); |
| | | CHECK_WRITE_STEP_SIGNAL2(transferModeReply[m_nIndex], pszData, size); |
| | | CHECK_WRITE_STEP_SIGNAL2(enableModeReply[m_nIndex], pszData, size); |
| | | CHECK_WRITE_STEP_SIGNAL2(typeAutoReply[m_nIndex], pszData, size); |
| | | CHECK_WRITE_STEP_SIGNAL2(cassetteTypeReply[m_nIndex], pszData, size); |
| | | } |
| | | |
| | | int CLoadPort::decodePortStatusReport(CStep* pStep, const char* pszData, size_t size) |
| | |
| | | else if (nCmd == ID_EQSGRAPHITEM_TEST4) { |
| | | SERVO::CEquipment* pEquipment = (SERVO::CEquipment*)pItem->pData; |
| | | if (pEquipment != nullptr) { |
| | | pEquipment->setLinkSignal(0, SIGNAL_UPSTREAM_INLINE, TRUE); |
| | | pEquipment->setLinkSignal(0, SIGNAL_UPSTREAM_TROUBLE, FALSE); |
| | | pEquipment->setLinkSignal(0, SIGNAL_INTERLOCK, TRUE); |
| | | pEquipment->setLinkSignal(0, SIGNAL_SEND_ABLE, TRUE); |
| | | pEquipment->setLinkSignal(1, SIGNAL_UPSTREAM_INLINE, TRUE); |
| | | pEquipment->setLinkSignal(1, SIGNAL_UPSTREAM_TROUBLE, FALSE); |
| | | pEquipment->setLinkSignal(1, SIGNAL_INTERLOCK, TRUE); |
| | | pEquipment->setLinkSignal(1, SIGNAL_SEND_ABLE, TRUE); |
| | | pEquipment->setLinkSignalUpstream(0, SIGNAL_UPSTREAM_INLINE, TRUE); |
| | | pEquipment->setLinkSignalUpstream(0, SIGNAL_UPSTREAM_TROUBLE, FALSE); |
| | | pEquipment->setLinkSignalUpstream(0, SIGNAL_INTERLOCK, TRUE); |
| | | pEquipment->setLinkSignalUpstream(0, SIGNAL_SEND_ABLE, TRUE); |
| | | pEquipment->setLinkSignalUpstream(1, SIGNAL_UPSTREAM_INLINE, TRUE); |
| | | pEquipment->setLinkSignalUpstream(1, SIGNAL_UPSTREAM_TROUBLE, FALSE); |
| | | pEquipment->setLinkSignalUpstream(1, SIGNAL_INTERLOCK, TRUE); |
| | | pEquipment->setLinkSignalUpstream(1, SIGNAL_SEND_ABLE, TRUE); |
| | | } |
| | | |
| | | if (pEquipment != nullptr && (pEquipment->getID() == EQ_ID_Bonder1 |
| | |
| | | else if (nCmd == ID_EQSGRAPHITEM_TEST5) { |
| | | SERVO::CEquipment* pEquipment = (SERVO::CEquipment*)pItem->pData; |
| | | if (pEquipment != nullptr) { |
| | | pEquipment->setLinkSignal(0, SIGNAL_UPSTREAM_INLINE, TRUE); |
| | | pEquipment->setLinkSignal(0, SIGNAL_UPSTREAM_TROUBLE, TRUE); |
| | | pEquipment->setLinkSignal(0, SIGNAL_INTERLOCK, TRUE); |
| | | pEquipment->setLinkSignal(0, SIGNAL_SEND_ABLE, FALSE); |
| | | pEquipment->setLinkSignal(1, SIGNAL_UPSTREAM_INLINE, TRUE); |
| | | pEquipment->setLinkSignal(1, SIGNAL_UPSTREAM_TROUBLE, TRUE); |
| | | pEquipment->setLinkSignal(1, SIGNAL_INTERLOCK, TRUE); |
| | | pEquipment->setLinkSignal(1, SIGNAL_SEND_ABLE, FALSE); |
| | | pEquipment->setLinkSignalUpstream(0, SIGNAL_UPSTREAM_INLINE, TRUE); |
| | | pEquipment->setLinkSignalUpstream(0, SIGNAL_UPSTREAM_TROUBLE, TRUE); |
| | | pEquipment->setLinkSignalUpstream(0, SIGNAL_INTERLOCK, TRUE); |
| | | pEquipment->setLinkSignalUpstream(0, SIGNAL_SEND_ABLE, FALSE); |
| | | pEquipment->setLinkSignalUpstream(1, SIGNAL_UPSTREAM_INLINE, TRUE); |
| | | pEquipment->setLinkSignalUpstream(1, SIGNAL_UPSTREAM_TROUBLE, TRUE); |
| | | pEquipment->setLinkSignalUpstream(1, SIGNAL_INTERLOCK, TRUE); |
| | | pEquipment->setLinkSignalUpstream(1, SIGNAL_SEND_ABLE, FALSE); |
| | | } |
| | | } |
| | | else if (nCmd == ID_EQSGRAPHITEM_TEST6) { |
| | |
| | | |
| | | // 请求主配方列表 |
| | | if (pEquipment != nullptr) { |
| | | pEquipment->masterRecipeListRequest(0); |
| | | pEquipment->masterRecipeListRequest(0, nullptr); |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | for (int nRow = 0; nRow < 8; ++nRow) { |
| | | for (int nCol = 0; nCol < 8; ++nCol) { |
| | | BOOL bCurrentState = m_pEquipment->isLinkSignalOn(nRow, nCol); |
| | | BOOL bCurrentState = m_pEquipment->isLinkSignalUpstreamOn(nRow, nCol); |
| | | UpdateSignalState(nRow, nCol, bCurrentState); |
| | | } |
| | | } |
| | |
| | | #include "MsgDlg.h" |
| | | |
| | | |
| | | #define DELAY_CLOSE 2000 |
| | | |
| | | |
| | | // CPagePortProperty 对话框 |
| | | |
| | | IMPLEMENT_DYNAMIC(CPagePortProperty, CHMPropertyPage) |
| | |
| | | // TODO: 在此处添加消息处理程序代码 |
| | | } |
| | | |
| | | int g_nMsgDlgShow = 0; |
| | | void CPagePortProperty::OnBnClickedCheckEnable() |
| | | { |
| | | BOOL bCheck = ((CButton*)GetDlgItem(IDC_CHECK_ENABLE))->GetCheck() == BST_CHECKED; |
| | |
| | | |
| | | |
| | | // enable port |
| | | g_nMsgDlgShow = 0; |
| | | CMsgDlg msgDlg("请等待", "正在操作,请等待..."); |
| | | |
| | | ASSERT(m_pPort != nullptr); |
| | |
| | | if (code == WOK) { |
| | | LOGI("%s Port 成功.", bCheck ? _T("enable") : _T("disable")); |
| | | |
| | | msgDlg.DelayClose(3000); |
| | | if (g_nMsgDlgShow == 0 && ::IsWindow(msgDlg.GetSafeHwnd())) { |
| | | strMsg.Format(_T("%s Port 成功."), bCheck ? _T("enable") : _T("disable")); |
| | | msgDlg.DelayClose(3000); |
| | | msgDlg.DelayClose(DELAY_CLOSE); |
| | | msgDlg.SetIcon(MSG_BOX_SUCCEED); |
| | | msgDlg.SetTitle(_T("操作成功")); |
| | | msgDlg.SetMessage((LPTSTR)(LPCTSTR)strMsg); |
| | | msgDlg.SetMarquee(FALSE, 0); |
| | | msgDlg.SetCompleteCode(0); |
| | | } |
| | | } |
| | | else { |
| | | LOGI("%s Port 失败,code:%d", bCheck ? _T("enable") : _T("disable"), code); |
| | | |
| | | msgDlg.DelayClose(3000); |
| | | if (g_nMsgDlgShow == 0 && ::IsWindow(msgDlg.GetSafeHwnd())) { |
| | | strMsg.Format(_T("%s Port 失败,code:%d"), bCheck ? _T("enable") : _T("disable"), code); |
| | | msgDlg.DelayClose(3000); |
| | | msgDlg.DelayClose(DELAY_CLOSE); |
| | | msgDlg.SetIcon(MSG_BOX_ERROR); |
| | | msgDlg.SetTitle(_T("操作失败")); |
| | | msgDlg.SetMessage((LPTSTR)(LPCTSTR)strMsg); |
| | | msgDlg.SetMarquee(FALSE, 0); |
| | | msgDlg.SetCompleteCode(-1); |
| | | |
| | | } |
| | | // 还原控件状态 |
| | | EnableCtrls(!bCheck); |
| | | ((CButton*)GetDlgItem(IDC_CHECK_ENABLE))->SetCheck(!bCheck ? BST_CHECKED : BST_UNCHECKED); |
| | |
| | | }); |
| | | |
| | | msgDlg.DoModal(); |
| | | g_nMsgDlgShow = 1; |
| | | } |
| | | |
| | | void CPagePortProperty::OnCbnSelchangeComboPortType() |
| | | { |
| | | g_nMsgDlgShow = 0; |
| | | CMsgDlg msgDlg("请等待", "正在操作,请等待..."); |
| | | msgDlg.SetData((DWORD_PTR)this); |
| | | |
| | |
| | | if (code == WOK) { |
| | | LOGI("设置Port Type(%d)成功.", index + 1); |
| | | |
| | | msgDlg.DelayClose(3000); |
| | | if (g_nMsgDlgShow == 0 && ::IsWindow(msgDlg.GetSafeHwnd())) { |
| | | strMsg.Format(_T("设置Port Type(%d)成功"), index + 1); |
| | | msgDlg.DelayClose(3000); |
| | | msgDlg.DelayClose(DELAY_CLOSE); |
| | | msgDlg.SetIcon(MSG_BOX_SUCCEED); |
| | | msgDlg.SetTitle(_T("操作成功")); |
| | | msgDlg.SetMessage((LPTSTR)(LPCTSTR)strMsg); |
| | | msgDlg.SetMarquee(FALSE, 0); |
| | | msgDlg.SetCompleteCode(0); |
| | | } |
| | | } |
| | | else { |
| | | LOGI("设置Port Type(%d)失败,code:%d", index + 1, code); |
| | | |
| | | msgDlg.DelayClose(3000); |
| | | if (g_nMsgDlgShow == 0 && ::IsWindow(msgDlg.GetSafeHwnd())) { |
| | | strMsg.Format(_T("设置Port Type(%d)失败,code:%d"), index + 1, code); |
| | | msgDlg.DelayClose(3000); |
| | | msgDlg.DelayClose(DELAY_CLOSE); |
| | | msgDlg.SetIcon(MSG_BOX_ERROR); |
| | | msgDlg.SetTitle(_T("操作失败")); |
| | | msgDlg.SetMessage((LPTSTR)(LPCTSTR)strMsg); |
| | | msgDlg.SetMarquee(FALSE, 0); |
| | | msgDlg.SetCompleteCode(-1); |
| | | } |
| | | } |
| | | |
| | | return 0; |
| | | }); |
| | | |
| | | msgDlg.DoModal(); |
| | | g_nMsgDlgShow = 1; |
| | | } |
| | | |
| | | void CPagePortProperty::OnCbnSelchangeComboPortMode() |
| | | { |
| | | g_nMsgDlgShow = 0; |
| | | CMsgDlg msgDlg("请等待", "正在操作,请等待..."); |
| | | msgDlg.SetData((DWORD_PTR)this); |
| | | |
| | |
| | | if (code == WOK) { |
| | | LOGI("设置Port Mode(%d)成功.", index); |
| | | |
| | | msgDlg.DelayClose(3000); |
| | | if (g_nMsgDlgShow == 0 && ::IsWindow(msgDlg.GetSafeHwnd())) { |
| | | strMsg.Format(_T("设置Port Mode(%d)成功"), index); |
| | | msgDlg.DelayClose(3000); |
| | | msgDlg.DelayClose(DELAY_CLOSE); |
| | | msgDlg.SetIcon(MSG_BOX_SUCCEED); |
| | | msgDlg.SetTitle(_T("操作成功")); |
| | | msgDlg.SetMessage((LPTSTR)(LPCTSTR)strMsg); |
| | | msgDlg.SetMarquee(FALSE, 0); |
| | | msgDlg.SetCompleteCode(0); |
| | | } |
| | | } |
| | | else { |
| | | LOGI("设置Port Mode(%d)失败,code:%d", index, code); |
| | | |
| | | msgDlg.DelayClose(3000); |
| | | if (g_nMsgDlgShow == 0 && ::IsWindow(msgDlg.GetSafeHwnd())) { |
| | | strMsg.Format(_T("设置Port Mode(%d)失败,code:%d"), index, code); |
| | | msgDlg.DelayClose(3000); |
| | | msgDlg.DelayClose(DELAY_CLOSE); |
| | | msgDlg.SetIcon(MSG_BOX_ERROR); |
| | | msgDlg.SetTitle(_T("操作失败")); |
| | | msgDlg.SetMessage((LPTSTR)(LPCTSTR)strMsg); |
| | | msgDlg.SetMarquee(FALSE, 0); |
| | | msgDlg.SetCompleteCode(-1); |
| | | } |
| | | } |
| | | |
| | | return 0; |
| | | }); |
| | | |
| | | msgDlg.DoModal(); |
| | | g_nMsgDlgShow = 1; |
| | | } |
| | | |
| | | void CPagePortProperty::OnCbnSelchangeComboPortCassertType() |
| | | { |
| | | g_nMsgDlgShow = 0; |
| | | CMsgDlg msgDlg("请等待", "正在操作,请等待..."); |
| | | msgDlg.SetData((DWORD_PTR)this); |
| | | |
| | | ASSERT(m_pPort != nullptr); |
| | | int index = ((CComboBox*)GetDlgItem(IDC_COMBO_PORT_CASSERT_TYPE))->GetCurSel(); |
| | | m_pPort->setPortMode(SERVO::PortMode(index + 1), [&](int code) -> int { |
| | | m_pPort->setCassetteType(SERVO::CassetteType(index + 1), [&](int code) -> int { |
| | | Sleep(100); |
| | | CString strMsg; |
| | | |
| | | if (code == WOK) { |
| | | LOGI("设置Cassette type(%d)成功.", index + 1); |
| | | |
| | | msgDlg.DelayClose(3000); |
| | | if (g_nMsgDlgShow == 0 && ::IsWindow(msgDlg.GetSafeHwnd())) { |
| | | strMsg.Format(_T("设置Cassette type(%d)成功"), index + 1); |
| | | msgDlg.DelayClose(3000); |
| | | msgDlg.DelayClose(DELAY_CLOSE); |
| | | msgDlg.SetIcon(MSG_BOX_SUCCEED); |
| | | msgDlg.SetTitle(_T("操作成功")); |
| | | msgDlg.SetMessage((LPTSTR)(LPCTSTR)strMsg); |
| | | msgDlg.SetMarquee(FALSE, 0); |
| | | msgDlg.SetCompleteCode(0); |
| | | } |
| | | } |
| | | else { |
| | | LOGI("设置Cassette type(%d)失败,code:%d", index + 1, code); |
| | | |
| | | msgDlg.DelayClose(3000); |
| | | if (g_nMsgDlgShow == 0 && ::IsWindow(msgDlg.GetSafeHwnd())) { |
| | | strMsg.Format(_T("设置Cassette type(%d)失败,code:%d"), index + 1, code); |
| | | msgDlg.DelayClose(3000); |
| | | msgDlg.DelayClose(DELAY_CLOSE); |
| | | msgDlg.SetIcon(MSG_BOX_ERROR); |
| | | msgDlg.SetTitle(_T("操作失败")); |
| | | msgDlg.SetMessage((LPTSTR)(LPCTSTR)strMsg); |
| | | msgDlg.SetMarquee(FALSE, 0); |
| | | msgDlg.SetCompleteCode(-1); |
| | | } |
| | | } |
| | | |
| | | return 0; |
| | | }); |
| | | |
| | | msgDlg.DoModal(); |
| | | g_nMsgDlgShow = 1; |
| | | } |
| | | |
| | | void CPagePortProperty::OnCbnSelchangeComboPortTransferMode() |
| | | { |
| | | // TODO: 在此添加控件通知处理程序代码 |
| | | g_nMsgDlgShow = 0; |
| | | CMsgDlg msgDlg("请等待", "正在操作,请等待..."); |
| | | msgDlg.SetData((DWORD_PTR)this); |
| | | |
| | | ASSERT(m_pPort != nullptr); |
| | | int index = ((CComboBox*)GetDlgItem(IDC_COMBO_PORT_TRANSFER_MODE))->GetCurSel(); |
| | | m_pPort->setPortMode(SERVO::PortMode(index + 1), [&](int code) -> int { |
| | | m_pPort->setTransferMode(SERVO::TransferMode(index + 1), [&](int code) -> int { |
| | | Sleep(100); |
| | | CString strMsg; |
| | | |
| | | if (code == WOK) { |
| | | LOGI("设置Transfer mode(%d)成功.", index + 1); |
| | | |
| | | msgDlg.DelayClose(3000); |
| | | if (g_nMsgDlgShow == 0 && ::IsWindow(msgDlg.GetSafeHwnd())) { |
| | | strMsg.Format(_T("设置Transfer mode(%d)成功"), index + 1); |
| | | msgDlg.DelayClose(3000); |
| | | msgDlg.DelayClose(DELAY_CLOSE); |
| | | msgDlg.SetIcon(MSG_BOX_SUCCEED); |
| | | msgDlg.SetTitle(_T("操作成功")); |
| | | msgDlg.SetMessage((LPTSTR)(LPCTSTR)strMsg); |
| | | msgDlg.SetMarquee(FALSE, 0); |
| | | msgDlg.SetCompleteCode(0); |
| | | } |
| | | } |
| | | else { |
| | | LOGI("设置Transfer mode(%d)失败,code:%d", index + 1, code); |
| | | |
| | | msgDlg.DelayClose(3000); |
| | | if (g_nMsgDlgShow == 0 && ::IsWindow(msgDlg.GetSafeHwnd())) { |
| | | strMsg.Format(_T("设置Transfer mode(%d)失败,code:%d"), index + 1, code); |
| | | msgDlg.DelayClose(3000); |
| | | msgDlg.DelayClose(DELAY_CLOSE); |
| | | msgDlg.SetIcon(MSG_BOX_ERROR); |
| | | msgDlg.SetTitle(_T("操作失败")); |
| | | msgDlg.SetMessage((LPTSTR)(LPCTSTR)strMsg); |
| | | msgDlg.SetMarquee(FALSE, 0); |
| | | msgDlg.SetCompleteCode(-1); |
| | | } |
| | | } |
| | | |
| | | return 0; |
| | | }); |
| | | |
| | | msgDlg.DoModal(); |
| | | g_nMsgDlgShow = 1; |
| | | } |
| | | |
| | | void CPagePortProperty::OnBnClickedCheckAutoChange() |
| | | { |
| | | BOOL bCheck = ((CButton*)GetDlgItem(IDC_CHECK_AUTO_CHANGE))->GetCheck() == BST_CHECKED; |
| | | EnableCtrls(bCheck); |
| | | |
| | | |
| | | // enable port |
| | | g_nMsgDlgShow = 0; |
| | | CMsgDlg msgDlg("请等待", "正在操作,请等待..."); |
| | | |
| | | ASSERT(m_pPort != nullptr); |
| | |
| | | if (code == WOK) { |
| | | LOGI("%s Auto Change 成功.", bCheck ? _T("enable") : _T("disable")); |
| | | |
| | | msgDlg.DelayClose(3000); |
| | | if (g_nMsgDlgShow == 0 && ::IsWindow(msgDlg.GetSafeHwnd())) { |
| | | strMsg.Format(_T("%s Auto Change 成功."), bCheck ? _T("enable") : _T("disable")); |
| | | msgDlg.DelayClose(3000); |
| | | msgDlg.DelayClose(DELAY_CLOSE); |
| | | msgDlg.SetIcon(MSG_BOX_SUCCEED); |
| | | msgDlg.SetTitle(_T("操作成功")); |
| | | msgDlg.SetMessage((LPTSTR)(LPCTSTR)strMsg); |
| | | msgDlg.SetMarquee(FALSE, 0); |
| | | msgDlg.SetCompleteCode(0); |
| | | } |
| | | } |
| | | else { |
| | | LOGI("%s Auto Change 失败,code:%d", bCheck ? _T("enable") : _T("disable"), code); |
| | | |
| | | msgDlg.DelayClose(3000); |
| | | if (g_nMsgDlgShow == 0 && ::IsWindow(msgDlg.GetSafeHwnd())) { |
| | | strMsg.Format(_T("%s Auto Change 失败,code:%d"), bCheck ? _T("enable") : _T("disable"), code); |
| | | msgDlg.DelayClose(3000); |
| | | msgDlg.DelayClose(DELAY_CLOSE); |
| | | msgDlg.SetIcon(MSG_BOX_ERROR); |
| | | msgDlg.SetTitle(_T("操作失败")); |
| | | msgDlg.SetMessage((LPTSTR)(LPCTSTR)strMsg); |
| | | msgDlg.SetMarquee(FALSE, 0); |
| | | msgDlg.SetCompleteCode(-1); |
| | | } |
| | | |
| | | // 还原控件状态 |
| | | ((CButton*)GetDlgItem(IDC_CHECK_AUTO_CHANGE))->SetCheck(!bCheck ? BST_CHECKED : BST_UNCHECKED); |
| | |
| | | }); |
| | | |
| | | msgDlg.DoModal(); |
| | | g_nMsgDlgShow = 1; |
| | | } |
| | | |
| | | void CPagePortProperty::EnableCtrls(BOOL bEnable) |
| | |
| | | reset(); |
| | | return MRLRC_GROUP_COUNT_NG; |
| | | } |
| | | if (currentGroup == 0) { |
| | | reset(); |
| | | } |
| | | if (m_nCurrentGroupCount + 1 > currentGroup) { |
| | | return MRLRC_DUPLICATION_GROUP_COUNT_NG; |
| | | } |
| | |
| | | m_hWorkStop = nullptr; |
| | | m_hWorkThreadHandle = nullptr; |
| | | m_nTimeoutCount = 0; |
| | | m_onSyncingStateChanged = nullptr; |
| | | ::InitializeCriticalSection(&m_cs); |
| | | } |
| | | |
| | |
| | | m_nTimeoutCount = 0; |
| | | unlock(); |
| | | |
| | | if (m_onSyncingStateChanged != nullptr) { |
| | | m_onSyncingStateChanged(m_nSyncStatus); |
| | | } |
| | | |
| | | if (m_hWorkStop == nullptr) { |
| | | m_hWorkStop = ::CreateEvent(NULL, TRUE, FALSE, NULL); |
| | |
| | | m_nSyncStatus = SS_FAILED; |
| | | m_nTimeoutCount = 0; |
| | | unlock(); |
| | | |
| | | if (m_onSyncingStateChanged != nullptr) { |
| | | m_onSyncingStateChanged(m_nSyncStatus); |
| | | } |
| | | |
| | | } |
| | | |
| | | short CRecipesManager::decodeRecipeListReport(const char* pszData, size_t size) |
| | |
| | | int nRet = pRecipeList->addRecipePacket(toatlGroupCount, currentGroupCount, pszIdsData, 250 * 2); |
| | | if (MRLRC_CURRENT_RECIPE_COMPLETE == nRet) { |
| | | lock(); |
| | | if (m_nTotalMasterRecipeCount == m_mapRecipesTemp.size()) { |
| | | for (auto item : m_mapRecipes) { |
| | | delete item.second; |
| | | } |
| | |
| | | m_mapRecipesTemp.clear(); |
| | | m_nSyncStatus = SS_COMPLETE; |
| | | unlock(); |
| | | return MRLRC_OK; |
| | | |
| | | if (m_onSyncingStateChanged != nullptr) { |
| | | m_onSyncingStateChanged(m_nSyncStatus); |
| | | } |
| | | unlock(); |
| | | |
| | | return MRLRC_OK; |
| | | } |
| | | else if (MRLRC_CONTINUE == nRet) { |
| | | return MRLRC_CONTINUE; |
| | |
| | | return iter->second; |
| | | } |
| | | |
| | | CRecipeList* CRecipesManager::getRecipeList(int unitNo) |
| | | { |
| | | auto iter = m_mapRecipes.find(unitNo); |
| | | if (iter == m_mapRecipes.end()) return nullptr; |
| | | return iter->second; |
| | | } |
| | | |
| | | void CRecipesManager::setOnSyncingStateChanged(ONSYNCINGSTATECHANGED block) |
| | | { |
| | | m_onSyncingStateChanged = block; |
| | | } |
| | | |
| | | unsigned CRecipesManager::TimeoutCheckWorkingProc() |
| | | { |
| | | while (1) { |
| | |
| | | #pragma once |
| | | #include <map> |
| | | #include "CRecipeList.h" |
| | | #include <functional> |
| | | |
| | | |
| | | #define SS_NONE 0 |
| | |
| | | #define SS_FAILED 4 |
| | | |
| | | namespace SERVO { |
| | | typedef std::function<void(int state)> ONSYNCINGSTATECHANGED; |
| | | |
| | | class CRecipesManager |
| | | { |
| | | public: |
| | |
| | | virtual ~CRecipesManager(); |
| | | |
| | | public: |
| | | void setOnSyncingStateChanged(ONSYNCINGSTATECHANGED block); |
| | | unsigned TimeoutCheckWorkingProc(); |
| | | int syncing(); |
| | | void syncFailed(); |
| | | short decodeRecipeListReport(const char* pszData, size_t size); |
| | | short decodeRecipeParameterReport(const char* pszData, size_t size); |
| | | CRecipeList* getRecipeListFromTemp(int unitNo); |
| | | CRecipeList* getRecipeList(int unitNo); |
| | | |
| | | public: |
| | | inline void lock() { ::EnterCriticalSection(&m_cs); }; |
| | |
| | | int m_nTotalParameterCount; |
| | | std::map<int, CRecipeList*> m_mapRecipes; |
| | | std::map<int, CRecipeList*> m_mapRecipesTemp; |
| | | ONSYNCINGSTATECHANGED m_onSyncingStateChanged; |
| | | }; |
| | | } |
| | | |
| | |
| | | m_crTitle = CR_MSGBOX_TITLE; |
| | | m_crMessage = CR_MSGBOX_MESSAGE; |
| | | m_nIcon = MSG_BOX_TIP; |
| | | m_bDelayClose = FALSE; |
| | | } |
| | | |
| | | CMsgDlg::CMsgDlg(CString strTitle, CString strMessage) |
| | |
| | | |
| | | void CMsgDlg::DelayClose(int nDelay) |
| | | { |
| | | if (!m_bDelayClose) { |
| | | m_bDelayClose = TRUE; |
| | | SetTimer(1, nDelay, NULL); |
| | | } |
| | | } |
| | | |
| | | void CMsgDlg::ShowCloseButton(BOOL bVisible) |
| | | { |
| | |
| | | int m_nCompleteCode; |
| | | DWORD_PTR m_dwData; |
| | | DWORD_PTR m_dwDataEx; |
| | | BOOL m_bDelayClose; |
| | | |
| | | |
| | | // 对话框数据 |
| | |
| | | #include "Servo.h" |
| | | #include "afxdialogex.h" |
| | | #include "PageRecipe.h" |
| | | #include "MsgDlg.h" |
| | | |
| | | |
| | | // CPageRecipe 对话框 |
| | | |
| | |
| | | |
| | | void CPageRecipe::FillDataToListCtrl(const std::vector<RecipeInfo>& vecRecipe) { |
| | | CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST_PPID); |
| | | if (pListCtrl == nullptr || pListCtrl->m_hWnd == nullptr) { |
| | | if (pListCtrl == nullptr || !::IsWindow(pListCtrl->m_hWnd)) { |
| | | return; |
| | | } |
| | | |
| | |
| | | m_listPPID.SetColumnWidth(nColCount - 1, LVSCW_AUTOSIZE_USEHEADER); |
| | | } |
| | | |
| | | void CPageRecipe::FillRecipeListToListCtrl(SERVO::CRecipeList* pList) |
| | | { |
| | | CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST_PPID); |
| | | if (pListCtrl == nullptr || !::IsWindow(pListCtrl->m_hWnd)) { |
| | | return; |
| | | } |
| | | |
| | | // 清空当前CListCtrl中的所有项 |
| | | pListCtrl->DeleteAllItems(); |
| | | if (pList == nullptr) { |
| | | return; |
| | | } |
| | | |
| | | |
| | | // 遍历数据并插入到CListCtrl中 |
| | | std::map<int, short>& ids = pList->getIds(); |
| | | for (auto item : ids) { |
| | | int index = m_listPPID.InsertItem(m_listPPID.GetItemCount(), _T("")); |
| | | m_listPPID.SetItemText(index, 1, std::to_string(item.first).c_str()); |
| | | m_listPPID.SetItemText(index, 2, std::to_string(item.second).c_str()); |
| | | } |
| | | |
| | | // 获取列数 |
| | | int nColCount = m_listPPID.GetHeaderCtrl()->GetItemCount(); |
| | | m_listPPID.SetColumnWidth(nColCount - 1, LVSCW_AUTOSIZE_USEHEADER); |
| | | } |
| | | |
| | | void CPageRecipe::DoDataExchange(CDataExchange* pDX) |
| | | { |
| | | CDialogEx::DoDataExchange(pDX); |
| | |
| | | ON_BN_CLICKED(IDC_BUTTON_REFRESH, &CPageRecipe::OnBnClickedButtonRefresh) |
| | | ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_PPID, &CPageRecipe::OnLvnItemChangedListPPID) |
| | | ON_WM_DESTROY() |
| | | ON_CBN_SELCHANGE(IDC_COMBO_EQUIPMENT, &CPageRecipe::OnCbnSelchangeComboEquipment) |
| | | ON_WM_SHOWWINDOW() |
| | | END_MESSAGE_MAP() |
| | | |
| | | |
| | |
| | | ListView_SetImageList(pListCtrl->GetSafeHwnd(), imageList, LVSIL_SMALL); |
| | | pListCtrl->InsertColumn(0, _T(""), LVCFMT_RIGHT, 0); // 隐藏列 |
| | | pListCtrl->InsertColumn(1, _T("No."), LVCFMT_LEFT, width[1]); |
| | | pListCtrl->InsertColumn(2, _T("PPID"), LVCFMT_LEFT, width[2]); |
| | | pListCtrl->InsertColumn(2, _T("PPID/Recipe ID"), LVCFMT_LEFT, width[2]); |
| | | pListCtrl->InsertColumn(3, _T("描述"), LVCFMT_LEFT, width[3]); |
| | | pListCtrl->InsertColumn(4, _T("创建时间"), LVCFMT_LEFT, width[4]); |
| | | pListCtrl->SetColumnWidth(4, LVSCW_AUTOSIZE_USEHEADER); |
| | | |
| | | |
| | | // 获取所有数据 |
| | | auto vecData = RecipeManager::getInstance().getAllRecipes(); |
| | |
| | | |
| | | // 按钮竖直排列在右侧 |
| | | CWnd* buttons[] = { |
| | | GetDlgItem(IDC_BUTTON_MODIFY), |
| | | GetDlgItem(IDC_BUTTON_REFRESH), |
| | | GetDlgItem(IDC_BUTTON_DELETE), |
| | | GetDlgItem(IDC_BUTTON_DELETE_ALL), |
| | | GetDlgItem(IDC_BUTTON_REFRESH) |
| | | GetDlgItem(IDC_BUTTON_MODIFY) |
| | | }; |
| | | |
| | | for (auto pBtn : buttons) { |
| | |
| | | |
| | | void CPageRecipe::OnBnClickedButtonRefresh() |
| | | { |
| | | // TODO: 在此添加控件通知处理程序代码 |
| | | CComboBox* pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_EQUIPMENT); |
| | | int nSel = pComboBox->GetCurSel(); |
| | | SERVO::CEquipment* pEq = (SERVO::CEquipment*)pComboBox->GetItemDataPtr(nSel); |
| | | |
| | | if (pEq == nullptr) { |
| | | // 获取master配方(本地) |
| | | auto vecData = RecipeManager::getInstance().getAllRecipes(); |
| | | FillDataToListCtrl(vecData); |
| | | } |
| | | else { |
| | | // enable port |
| | | CMsgDlg msgDlg("请等待", "正在获取配方..."); |
| | | pEq->masterRecipeListRequest(0, [&](int status) -> void { |
| | | if (status == SS_FAILED) { |
| | | CString strMsg; |
| | | strMsg.Format(_T("获取配方失败!")); |
| | | msgDlg.DelayClose(3000); |
| | | msgDlg.SetIcon(MSG_BOX_ERROR); |
| | | msgDlg.SetTitle(_T("操作失败")); |
| | | msgDlg.SetMessage((LPTSTR)(LPCTSTR)strMsg); |
| | | msgDlg.SetMarquee(FALSE, 0); |
| | | msgDlg.SetCompleteCode(-1); |
| | | } |
| | | else if (status == SS_COMPLETE) { |
| | | CString strMsg; |
| | | strMsg.Format(_T("获取配方完成!")); |
| | | msgDlg.DelayClose(3000); |
| | | msgDlg.SetIcon(MSG_BOX_SUCCEED); |
| | | msgDlg.SetTitle(_T("操作成功")); |
| | | msgDlg.SetMessage((LPTSTR)(LPCTSTR)strMsg); |
| | | msgDlg.SetMarquee(FALSE, 0); |
| | | msgDlg.SetCompleteCode(0); |
| | | } |
| | | }); |
| | | msgDlg.DoModal(); |
| | | } |
| | | } |
| | | |
| | | void CPageRecipe::OnLvnItemChangedListPPID(NMHDR* pNMHDR, LRESULT* pResult) |
| | |
| | | LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); |
| | | *pResult = 0; |
| | | |
| | | CComboBox* pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_EQUIPMENT); |
| | | int nEqSel = pComboBox->GetCurSel(); |
| | | int selectedCount = ListView_GetSelectedCount(m_listPPID.GetSafeHwnd()); |
| | | GetDlgItem(IDC_BUTTON_MODIFY)->EnableWindow(selectedCount > 0); |
| | | GetDlgItem(IDC_BUTTON_DELETE)->EnableWindow(selectedCount > 0); |
| | | GetDlgItem(IDC_BUTTON_DELETE_ALL)->EnableWindow(selectedCount > 0); |
| | | |
| | | GetDlgItem(IDC_BUTTON_MODIFY)->EnableWindow(nEqSel == 0 && selectedCount > 0); |
| | | GetDlgItem(IDC_BUTTON_DELETE)->EnableWindow(nEqSel == 0 && selectedCount > 0); |
| | | GetDlgItem(IDC_BUTTON_DELETE_ALL)->EnableWindow(nEqSel == 0 && selectedCount > 0); |
| | | } |
| | | |
| | | void CPageRecipe::OnCbnSelchangeComboEquipment() |
| | | { |
| | | CComboBox* pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_EQUIPMENT); |
| | | int nEqSel = pComboBox->GetCurSel(); |
| | | int selectedCount = ListView_GetSelectedCount(m_listPPID.GetSafeHwnd()); |
| | | |
| | | GetDlgItem(IDC_BUTTON_MODIFY)->EnableWindow(nEqSel == 0 && selectedCount > 0); |
| | | GetDlgItem(IDC_BUTTON_DELETE)->EnableWindow(nEqSel == 0 && selectedCount > 0); |
| | | GetDlgItem(IDC_BUTTON_DELETE_ALL)->EnableWindow(nEqSel == 0 && selectedCount > 0); |
| | | GetDlgItem(IDC_EDIT_KEYWORD)->EnableWindow(nEqSel == 0); |
| | | GetDlgItem(IDC_BUTTON_SEARCH)->EnableWindow(nEqSel == 0); |
| | | |
| | | SERVO::CEquipment* pEq = (SERVO::CEquipment*)pComboBox->GetItemDataPtr(nEqSel); |
| | | if (pEq == nullptr) { |
| | | auto vecData = RecipeManager::getInstance().getAllRecipes(); |
| | | FillDataToListCtrl(vecData); |
| | | } |
| | | else { |
| | | SERVO::CRecipeList* pRecipeList = pEq->getRecipeList(0); |
| | | FillRecipeListToListCtrl(pRecipeList); |
| | | } |
| | | |
| | | |
| | | |
| | | } |
| | | |
| | | |
| | | void CPageRecipe::OnDestroy() |
| | | { |
| | |
| | | WritePrivateProfileString("PageRecipeListCtrl", strItem, strTemp, strIniFile); |
| | | } |
| | | } |
| | | |
| | | |
| | | void CPageRecipe::OnShowWindow(BOOL bShow, UINT nStatus) |
| | | { |
| | | CDialogEx::OnShowWindow(bShow, nStatus); |
| | | |
| | | if (bShow) { |
| | | CComboBox* pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_EQUIPMENT); |
| | | if (pComboBox->GetCount() == 0) { |
| | | SERVO::CMaster& master = theApp.m_model.getMaster(); |
| | | SERVO::CEquipment* pEq[] = { |
| | | nullptr, |
| | | master.getEquipment(EQ_ID_EFEM), |
| | | master.getEquipment(EQ_ID_Bonder1), |
| | | master.getEquipment(EQ_ID_Bonder2), |
| | | master.getEquipment(EQ_ID_BAKE_COOLING), |
| | | master.getEquipment(EQ_ID_VACUUMBAKE), |
| | | master.getEquipment(EQ_ID_MEASUREMENT), |
| | | }; |
| | | |
| | | CComboBox* pComboBox = (CComboBox*)GetDlgItem(IDC_COMBO_EQUIPMENT); |
| | | for (int i = 0; i < sizeof(pEq) / sizeof(pEq[0]); i++) { |
| | | pComboBox->InsertString(i, |
| | | pEq[i] == nullptr ? _T("Master") : pEq[i]->getName().c_str()); |
| | | pComboBox->SetItemDataPtr(i, pEq[i]); |
| | | } |
| | | pComboBox->SetCurSel(0); |
| | | } |
| | | } |
| | | } |
| | |
| | | |
| | | private: |
| | | void FillDataToListCtrl(const std::vector<RecipeInfo>& vecRecipe); |
| | | void FillRecipeListToListCtrl(SERVO::CRecipeList* pList); |
| | | |
| | | // 对话框数据 |
| | | #ifdef AFX_DESIGN_TIME |
| | |
| | | CListCtrl m_listPPID; |
| | | public: |
| | | afx_msg void OnDestroy(); |
| | | afx_msg void OnCbnSelchangeComboEquipment(); |
| | | afx_msg void OnShowWindow(BOOL bShow, UINT nStatus); |
| | | }; |
| | |
| | | dlg.DoModal(); |
| | | } |
| | | else if (id == IDC_BUTTON_SETTINGS) { |
| | | SERVO::CEFEM* pEFEM = (SERVO::CEFEM*)theApp.m_model.m_master.getEquipment(EQ_ID_EFEM); |
| | | pEFEM->printDebugString001(); |
| | | SERVO::CEquipment* pEq = theApp.m_model.m_master.getEquipment(EQ_ID_EFEM); |
| | | pEq->printDebugString001(); |
| | | pEq = theApp.m_model.m_master.getEquipment(EQ_ID_Bonder1); |
| | | pEq->printDebugString001(); |
| | | pEq = theApp.m_model.m_master.getEquipment(EQ_ID_Bonder2); |
| | | pEq->printDebugString001(); |
| | | } |
| | | else if (id == IDC_BUTTON_OPERATOR) { |
| | | int menuId = (int)wParam; |