| | |
| | | // recipe parameter report |
| | | CEqReadStep* pStep = new CEqReadStep(0x12a54, 257 * 2, |
| | | [&](void* pFrom, int code, const char* pszData, size_t size) -> int { |
| | | CEqReadStep* pTmpStep = (CEqReadStep*)pFrom; |
| | | if (code == ROK && pszData != nullptr && size > 0) { |
| | | // æ¤å¤è§£éé
æ¹æ°æ® |
| | | short ret = decodeRecipeParameterReport(pszData, size); |
| | | pStep->setReturnCode(ret); |
| | | pTmpStep->setReturnCode(ret); |
| | | } |
| | | pStep->setReturnCode(MRLRC_OK); |
| | | pTmpStep->setReturnCode(MRLRC_OK); |
| | | return -1; |
| | | }); |
| | | pStep->setName(STEP_EQ_RECIPE_PARAMETER); |
| | |
| | | return pGlass->isProcessed(m_nID, getSlotUnit(slot)); |
| | | } |
| | | |
| | | int CBakeCooling::parsingParams(const char* pszData, size_t size, std::vector<CParam>& parsms) |
| | | int CBakeCooling::parsingParams(const char* pszData, size_t size, std::vector<CParam>& params) |
| | | { |
| | | ASSERT(pszData); |
| | | if (size < 250) return 0; |
| | |
| | | |
| | | // 1.A_è
çç¤æ¶é´ |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8; |
| | | parsms.push_back(CParam("A_è
çç¤æ¶é´", 0, "", v * 0.01f)); |
| | | params.push_back(CParam("A_è
çç¤æ¶é´", "", "", v * 0.01f)); |
| | | i += 2; |
| | | |
| | | // 2.A_è
å·å´æ¶é´ |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8; |
| | | parsms.push_back(CParam("A_è
å·å´æ¶é´", 0, "", v * 0.01f)); |
| | | params.push_back(CParam("A_è
å·å´æ¶é´", "", "", v * 0.01f)); |
| | | i += 2; |
| | | |
| | | // 3.B_è
çç¤æ¶é´ |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8; |
| | | parsms.push_back(CParam("B_è
çç¤æ¶é´", 0, "", v * 0.01f)); |
| | | params.push_back(CParam("B_è
çç¤æ¶é´", "", "", v * 0.01f)); |
| | | i += 2; |
| | | |
| | | // 4.BB_è
å·å´æ¶é´ |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8; |
| | | parsms.push_back(CParam("B_è
å·å´æ¶é´", 0, "", v * 0.01f)); |
| | | params.push_back(CParam("B_è
å·å´æ¶é´", "", "", v * 0.01f)); |
| | | i += 2; |
| | | |
| | | // 5.A_çç¤æ¸©åº¦è®¾å® |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8; |
| | | parsms.push_back(CParam("A_çç¤æ¸©åº¦è®¾å®", 0, "", v * 0.1f)); |
| | | params.push_back(CParam("A_çç¤æ¸©åº¦è®¾å®", "", "", v * 0.1f)); |
| | | i += 2; |
| | | |
| | | // 6.B_çç¤æ¸©åº¦è®¾å® |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8; |
| | | parsms.push_back(CParam("B_çç¤æ¸©åº¦è®¾å®", 0, "", v * 0.1f)); |
| | | params.push_back(CParam("B_çç¤æ¸©åº¦è®¾å®", "", "", v * 0.1f)); |
| | | i += 2; |
| | | |
| | | |
| | | return (int)parsms.size(); |
| | | return (int)params.size(); |
| | | } |
| | | |
| | | } |
| | |
| | | { |
| | | // recipe parameter report |
| | | CEqReadStep* pStep = new CEqReadStep(m_nIndex == 0 ? 0xaa54 : 0xea54, 257 * 2, |
| | | [&](void* pFrom, int code, const char* pszData, size_t size) -> int { |
| | | [&, pStep](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) { |
| | | // æ¤å¤è§£éé
æ¹æ°æ® |
| | | short ret = decodeRecipeParameterReport(pszData, size); |
| | | pStep->setReturnCode(ret); |
| | | ret = decodeRecipeParameterReport(pszData, size); |
| | | } |
| | | pStep->setReturnCode(MRLRC_OK); |
| | | pTmpStep->setReturnCode(ret); |
| | | return -1; |
| | | }); |
| | | pStep->setName(STEP_EQ_RECIPE_PARAMETER); |
| | |
| | | return m_nIndex == 0 ? 15000 : 20000; |
| | | } |
| | | |
| | | int CBonder::parsingParams(const char* pszData, size_t size, std::vector<CParam>& parsms) |
| | | int CBonder::parsingParams(const char* pszData, size_t size, std::vector<CParam>& params) |
| | | { |
| | | ASSERT(pszData); |
| | | if (size < 250) return 0; |
| | |
| | | |
| | | // 1.æ ¡æ£å¯¹ä½å»¶æ¶ |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8; |
| | | parsms.push_back(CParam("æ ¡æ£å¯¹ä½å»¶æ¶", 0, "", v * 0.01f)); |
| | | params.push_back(CParam("æ ¡æ£å¯¹ä½å»¶æ¶", "", "", v * 0.01f)); |
| | | i += 2; |
| | | |
| | | // 2.ä¿åæ¶é´ |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8; |
| | | parsms.push_back(CParam("ä¿åæ¶é´", 0, "", v * 0.01f)); |
| | | params.push_back(CParam("ä¿åæ¶é´", "", "", v * 0.01f)); |
| | | i += 2; |
| | | |
| | | // 3.è
ä½ç ´çç©ºå»¶æ¶ |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8; |
| | | parsms.push_back(CParam("è
ä½ç ´ç空延æ¶", 0, "", v * 0.01f)); |
| | | params.push_back(CParam("è
ä½ç ´ç空延æ¶", "", "", v * 0.01f)); |
| | | i += 2; |
| | | |
| | | // 4.è
ä½ååæ³µå¯å¨å»¶æ¶ |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8; |
| | | parsms.push_back(CParam("è
ä½ååæ³µå¯å¨å»¶æ¶", 0, "", v * 0.1f)); |
| | | params.push_back(CParam("è
ä½ååæ³µå¯å¨å»¶æ¶", "", "", v * 0.1f)); |
| | | i += 2; |
| | | |
| | | // 5.è
ä½è´´éæ½çç©ºå»¶æ¶ |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8; |
| | | parsms.push_back(CParam("è
ä½è´´éæ½ç空延æ¶", 0, "", v * 0.1f)); |
| | | params.push_back(CParam("è
ä½è´´éæ½ç空延æ¶", "", "", v * 0.1f)); |
| | | i += 2; |
| | | |
| | | // 6.å ççå¾
å»¶æ¶ |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8; |
| | | parsms.push_back(CParam("å ççå¾
å»¶æ¶", 0, "", v * 0.1f)); |
| | | params.push_back(CParam("å ççå¾
å»¶æ¶", "", "", v * 0.1f)); |
| | | i += 2; |
| | | |
| | | // 7.æ°åååè®¾å® |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24; |
| | | parsms.push_back(CParam("æ°ååå设å®", 0, "", v * 0.1f)); |
| | | params.push_back(CParam("æ°ååå设å®", "", "", v * 0.001f)); |
| | | i += 4; |
| | | |
| | | // 8.æ°åå åéç |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24; |
| | | parsms.push_back(CParam("æ°åå åéç", 0, "", v * 0.1f)); |
| | | params.push_back(CParam("æ°åå åéç", "", "", v * 0.001f)); |
| | | i += 4; |
| | | |
| | | // 9.æ°åæ³åéç |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24; |
| | | parsms.push_back(CParam("æ°åæ³åéç", 0, "", v * 0.1f)); |
| | | params.push_back(CParam("æ°åæ³åéç", "", "", v * 0.001f)); |
| | | i += 4; |
| | | |
| | | // 10.è´´éååä¸é |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24; |
| | | parsms.push_back(CParam("è´´éååä¸é", 0, "", v * 0.1f)); |
| | | params.push_back(CParam("è´´éååä¸é", "", "", v * 0.1f)); |
| | | i += 4; |
| | | |
| | | // 11.Z轴转ç©éåº¦è®¾å® |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24; |
| | | parsms.push_back(CParam("ä¸è
Z轴转ç©é度设å®", 0, "", v * 0.001f)); |
| | | params.push_back(CParam("ä¸è
Z轴转ç©é度设å®", "", "", v * 0.001f)); |
| | | i += 4; |
| | | |
| | | // 12.ä¸è
æ¸©åº¦è®¾å® |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8; |
| | | parsms.push_back(CParam("ä¸è
温度设å®", 0, "", v * 0.1f)); |
| | | params.push_back(CParam("ä¸è
温度设å®", "", "", v * 0.1f)); |
| | | i += 2; |
| | | |
| | | // 13.ä¸è
æ¸©åº¦è®¾å® |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8; |
| | | parsms.push_back(CParam("ä¸è
温度设å®", 0, "", v * 0.1f)); |
| | | params.push_back(CParam("ä¸è
温度设å®", "", "", v * 0.1f)); |
| | | i += 2; |
| | | |
| | | // 14.ä¸è
Zè½´é¢è´´åä½é度 |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24; |
| | | parsms.push_back(CParam("ä¸è
Zè½´é¢è´´åä½é度", 0, "", v * 0.001f)); |
| | | params.push_back(CParam("ä¸è
Zè½´é¢è´´åä½é度", "", "", v * 0.001f)); |
| | | i += 4; |
| | | |
| | | // 15.ä¸è
Zè½´è´´éä½é度 |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24; |
| | | parsms.push_back(CParam("ä¸è
Zè½´è´´éä½é度", 0, "", v * 0.001f)); |
| | | params.push_back(CParam("ä¸è
Zè½´è´´éä½é度", "", "", v * 0.001f)); |
| | | i += 4; |
| | | |
| | | // 16.ä¸è
Zä¸è
å çä½é´è· |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24; |
| | | parsms.push_back(CParam("ä¸è
Zä¸è
å çä½é´è·", 0, "", v * 0.001f)); |
| | | params.push_back(CParam("ä¸è
Zä¸è
å çä½é´è·", "", "", v * 0.001f)); |
| | | i += 4; |
| | | |
| | | // 17.ä¸è
è´´éä½åå
¥é |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24; |
| | | parsms.push_back(CParam("ä¸è
è´´éä½åå
¥é", 0, "", v * 0.001f)); |
| | | params.push_back(CParam("ä¸è
è´´éä½åå
¥é", "", "", v * 0.001f)); |
| | | i += 4; |
| | | |
| | | // 18.ä¸è
Zè½´ç ´ç空è·ç¦» |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24; |
| | | parsms.push_back(CParam("ä¸è
Zè½´ç ´ç空è·ç¦»", 0, "", v * 0.001f)); |
| | | params.push_back(CParam("ä¸è
Zè½´ç ´ç空è·ç¦»", "", "", v * 0.001f)); |
| | | i += 4; |
| | | |
| | | // 19.ä¸é¡¶Pinç ´ç空è·ç¦» |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24; |
| | | parsms.push_back(CParam("ä¸é¡¶Pinç ´ç空è·ç¦»", 0, "", v * 0.001f)); |
| | | params.push_back(CParam("ä¸é¡¶Pinç ´ç空è·ç¦»", "", "", v * 0.001f)); |
| | | i += 4; |
| | | |
| | | // 20.ä¸é¡¶Pinå çä½é´è· |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24; |
| | | parsms.push_back(CParam("ä¸é¡¶Pinå çä½é´è·", 0, "", v * 0.001f)); |
| | | params.push_back(CParam("ä¸é¡¶Pinå çä½é´è·", "", "", v * 0.001f)); |
| | | i += 4; |
| | | |
| | | // 21.è
ä½ç空泵ç空è§è®¾å®å¼ |
| | | parsms.push_back(CParam("è
ä½ç空泵ç空è§è®¾å®å¼", 0, "", (double)toFloat(&pszData[i]))); |
| | | params.push_back(CParam("è
ä½ç空泵ç空è§è®¾å®å¼", "", "", (double)toFloat(&pszData[i]))); |
| | | i += 4; |
| | | |
| | | // 22.è
ä½ååæ³µå°è¾¾è®¾å®å¼ |
| | | parsms.push_back(CParam("è
ä½ååæ³µå°è¾¾è®¾å®å¼", 0, "", (double)toFloat(&pszData[i]))); |
| | | params.push_back(CParam("è
ä½ååæ³µå°è¾¾è®¾å®å¼", "", "", (double)toFloat(&pszData[i]))); |
| | | i += 4; |
| | | |
| | | |
| | | return (int)parsms.size(); |
| | | return (int)params.size(); |
| | | } |
| | | } |
| | |
| | | // 主é
æ¹ä¸æ¥ |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_MASTER_RECIPE_LIST_REPORT, pszData, size); |
| | | |
| | | // é
æ¹åæ° |
| | | CHECK_WRITE_STEP_SIGNAL(STEP_ID_RECIPE_PARAMETER_CMD_REPLY, pszData, size); |
| | | CHECK_READ_STEP_SIGNAL(STEP_ID_RECIPE_PARAMETER_REPORT, pszData, size); |
| | | |
| | | |
| | | // CIM Mode |
| | | CHECK_WRITE_STEP_SIGNAL(STEP_ID_CIMMODE_CHANGED_CMD_REPLY, pszData, size); |
| | | |
| | |
| | | CRecipeList* CEquipment::getRecipeList(int unitNo) |
| | | { |
| | | return m_recipesManager.getRecipeList(unitNo); |
| | | } |
| | | |
| | | bool CEquipment::saveRecipeList(int unitNo, std::string& strFilepath) |
| | | { |
| | | return m_recipesManager.saveRecipeList(unitNo, strFilepath); |
| | | } |
| | | |
| | | bool CEquipment::readRecipeList(int unitNo, std::string& strFilepath) |
| | | { |
| | | return m_recipesManager.readRecipeList(unitNo, strFilepath); |
| | | } |
| | | |
| | | int CEquipment::recvIntent(CPin* pPin, CIntent* pIntent) |
| | |
| | | |
| | | return f; |
| | | } |
| | | |
| | | int CEquipment::parsingParams(const char* pszData, size_t size, std::string& strOut) |
| | | { |
| | | std::vector<CParam> params; |
| | | int nRet = parsingParams(pszData, size, params); |
| | | if (nRet <= 0) return nRet; |
| | | |
| | | char szBuffer[256]; |
| | | for (auto p : params) { |
| | | if(!strOut.empty()) strOut.append(","); |
| | | if (p.getValueType() == PVT_INT) { |
| | | sprintf_s(szBuffer, 256, "%s:%d", p.getName().c_str(), p.getIntValue()); |
| | | } |
| | | else if (p.getValueType() == PVT_DOUBLE) { |
| | | sprintf_s(szBuffer, 256, "%s:%f", p.getName().c_str(), p.getDoubleValue()); |
| | | } |
| | | strOut.append(szBuffer); |
| | | } |
| | | |
| | | return 0; |
| | | }; |
| | | } |
| | |
| | | std::vector<CPin*>& CEquipment::getInputPins(); |
| | | std::vector<CPin*>& CEquipment::getOutputPins(); |
| | | CRecipeList* getRecipeList(int unitNo); |
| | | bool saveRecipeList(int unitNo, std::string& strFilepath); |
| | | bool readRecipeList(int unitNo, std::string& strFilepath); |
| | | virtual int recvIntent(CPin* pPin, CIntent* pIntent); |
| | | virtual int fetchedOutJob(int port, CJobDataB* pJobDataB); |
| | | virtual int storedJob(int port, CJobDataB* pJobDataB, short putSlot); |
| | |
| | | int recipeParameterRequest(short masterRecipeId, short localRecipeId, short unitNo, ONSYNCINGSTATECHANGED block); |
| | | |
| | | // è§£æé
æ¹åæ°å表 |
| | | virtual int parsingParams(const char* pszData, size_t size, std::vector<CParam>& parsms) { return 0; }; |
| | | virtual int parsingParams(const char* pszData, size_t size, std::vector<CParam>& params) { return 0; }; |
| | | virtual int parsingParams(const char* pszData, size_t size, std::string& strOut); |
| | | |
| | | // è·åæå®çSlot |
| | | CSlot* getSlot(int index); |
| | |
| | | // recipe parameter report |
| | | CEqReadStep* pStep = new CEqReadStep(0x1aa54, 257 * 2, |
| | | [&](void* pFrom, int code, const char* pszData, size_t size) -> int { |
| | | CEqReadStep* pTmpStep = (CEqReadStep*)pFrom; |
| | | if (code == ROK && pszData != nullptr && size > 0) { |
| | | // æ¤å¤è§£éé
æ¹æ°æ® |
| | | short ret = decodeRecipeParameterReport(pszData, size); |
| | | pStep->setReturnCode(ret); |
| | | pTmpStep->setReturnCode(ret); |
| | | } |
| | | pStep->setReturnCode(MRLRC_OK); |
| | | pTmpStep->setReturnCode(MRLRC_OK); |
| | | return -1; |
| | | }); |
| | | pStep->setName(STEP_EQ_RECIPE_PARAMETER); |
| | |
| | | return 35000; |
| | | } |
| | | |
| | | int CMeasurement::parsingParams(const char* pszData, size_t size, std::vector<CParam>& parsms) |
| | | int CMeasurement::parsingParams(const char* pszData, size_t size, std::vector<CParam>& params) |
| | | { |
| | | ASSERT(pszData); |
| | | if (size < 250) return 0; |
| | |
| | | |
| | | // 1.æ£æµåè½å¯ç¨/ç¦ç¨ |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8; |
| | | parsms.push_back(CParam("æ£æµåè½å¯ç¨/ç¦ç¨", 0, "", v)); |
| | | params.push_back(CParam("æ£æµåè½å¯ç¨/ç¦ç¨", "", "", v)); |
| | | i += 2; |
| | | |
| | | // 2.æ£æµé度 |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24; |
| | | params.push_back(CParam("æ£æµé度", "", "", v * 0.001)); |
| | | i += 4; |
| | | |
| | | return (int)parsms.size(); |
| | | return (int)params.size(); |
| | | } |
| | | } |
| | |
| | | #include "CRecipeList.h" |
| | | #include "Common.h" |
| | | #include "ToolUnits.h" |
| | | #include <fstream> |
| | | |
| | | |
| | | namespace SERVO { |
| | |
| | | } |
| | | |
| | | if (m_nCurrentGroupCount == m_nToatlGroupCount) { |
| | | m_nToatlGroupCount = 0; |
| | | m_nCurrentGroupCount = 0; |
| | | return MRLRC_CURRENT_RECIPE_COMPLETE; |
| | | } |
| | | |
| | |
| | | m_paramsRawData.clear(); |
| | | } |
| | | |
| | | void CRecipeList::reset2() |
| | | { |
| | | m_nToatlGroupCount = 0; |
| | | m_nCurrentGroupCount = 0; |
| | | } |
| | | |
| | | int CRecipeList::addParamsPacket(int totalCount, int totalGroup, int currentGroup, |
| | | short unitId, short recipeId, |
| | | const char* pszData, size_t size) |
| | | { |
| | | if (m_nToatlGroupCount == 0) m_nToatlGroupCount = totalGroup; |
| | | if (m_nToatlGroupCount != totalGroup) { |
| | | reset(); |
| | | reset2(); |
| | | return MRLRC_GROUP_COUNT_NG; |
| | | } |
| | | if (currentGroup == 0) { |
| | | reset(); |
| | | reset2(); |
| | | } |
| | | if (m_nCurrentGroupCount + 1 > currentGroup) { |
| | | return MRLRC_DUPLICATION_GROUP_COUNT_NG; |
| | |
| | | m_paramsRawData[recipeId].insert(m_paramsRawData[recipeId].end(), (uint8_t*)(pszData), (uint8_t*)(pszData) + size); |
| | | if (m_nCurrentGroupCount == m_nToatlGroupCount) { |
| | | // è§£éæ°æ®å°±äº¤ç»åºç¨å±å§ |
| | | reset2(); |
| | | |
| | | return MRLRC_CURRENT_RECIPE_COMPLETE; |
| | | } |
| | | |
| | |
| | | return MRLRC_CONTINUE; |
| | | } |
| | | |
| | | // åºåå |
| | | bool CRecipeList::serialize(const std::string& filename) const |
| | | { |
| | | std::ofstream ofs(filename, std::ios::binary); |
| | | if (!ofs) return false; |
| | | |
| | | // ååºæ¬æå |
| | | ofs.write(reinterpret_cast<const char*>(&m_nUnitNo), sizeof(m_nUnitNo)); |
| | | ofs.write(reinterpret_cast<const char*>(&m_nToatlGroupCount), sizeof(m_nToatlGroupCount)); |
| | | ofs.write(reinterpret_cast<const char*>(&m_nCurrentGroupCount), sizeof(m_nCurrentGroupCount)); |
| | | |
| | | // д m_ids |
| | | size_t idsSize = m_ids.size(); |
| | | ofs.write(reinterpret_cast<const char*>(&idsSize), sizeof(idsSize)); |
| | | for (auto& kv : m_ids) { |
| | | ofs.write(reinterpret_cast<const char*>(&kv.first), sizeof(kv.first)); |
| | | ofs.write(reinterpret_cast<const char*>(&kv.second), sizeof(kv.second)); |
| | | } |
| | | |
| | | // д m_paramsRawData |
| | | size_t paramsSize = m_paramsRawData.size(); |
| | | ofs.write(reinterpret_cast<const char*>(¶msSize), sizeof(paramsSize)); |
| | | for (auto& kv : m_paramsRawData) { |
| | | // д key |
| | | ofs.write(reinterpret_cast<const char*>(&kv.first), sizeof(kv.first)); |
| | | |
| | | // å vector å¤§å° |
| | | size_t vecSize = kv.second.size(); |
| | | ofs.write(reinterpret_cast<const char*>(&vecSize), sizeof(vecSize)); |
| | | |
| | | // å vector å
容 |
| | | if (!kv.second.empty()) { |
| | | ofs.write(reinterpret_cast<const char*>(kv.second.data()), vecSize); |
| | | } |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | |
| | | // ååºåå |
| | | bool CRecipeList::deserialize(const std::string& filename) |
| | | { |
| | | std::ifstream ifs(filename, std::ios::binary); |
| | | if (!ifs) return false; |
| | | |
| | | reset(); // æ¸
ç©ºæ§æ°æ® |
| | | |
| | | // è¯»åºæ¬æå |
| | | ifs.read(reinterpret_cast<char*>(&m_nUnitNo), sizeof(m_nUnitNo)); |
| | | ifs.read(reinterpret_cast<char*>(&m_nToatlGroupCount), sizeof(m_nToatlGroupCount)); |
| | | ifs.read(reinterpret_cast<char*>(&m_nCurrentGroupCount), sizeof(m_nCurrentGroupCount)); |
| | | |
| | | // 读 m_ids |
| | | size_t idsSize = 0; |
| | | ifs.read(reinterpret_cast<char*>(&idsSize), sizeof(idsSize)); |
| | | for (size_t i = 0; i < idsSize; ++i) { |
| | | int key; |
| | | short value; |
| | | ifs.read(reinterpret_cast<char*>(&key), sizeof(key)); |
| | | ifs.read(reinterpret_cast<char*>(&value), sizeof(value)); |
| | | m_ids[key] = value; |
| | | } |
| | | |
| | | // 读 m_paramsRawData |
| | | size_t paramsSize = 0; |
| | | ifs.read(reinterpret_cast<char*>(¶msSize), sizeof(paramsSize)); |
| | | for (size_t i = 0; i < paramsSize; ++i) { |
| | | short key; |
| | | size_t vecSize = 0; |
| | | ifs.read(reinterpret_cast<char*>(&key), sizeof(key)); |
| | | ifs.read(reinterpret_cast<char*>(&vecSize), sizeof(vecSize)); |
| | | |
| | | std::vector<uint8_t> buffer(vecSize); |
| | | if (vecSize > 0) { |
| | | ifs.read(reinterpret_cast<char*>(buffer.data()), vecSize); |
| | | } |
| | | m_paramsRawData[key] = std::move(buffer); |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | } |
| | |
| | | #pragma once |
| | | #pragma once |
| | | #include <map> |
| | | |
| | | |
| | |
| | | std::map<int, short>& getIds(); |
| | | std::unordered_map<short, std::vector<uint8_t>>& getParamsRawData(); |
| | | void reset(); |
| | | void reset2(); |
| | | |
| | | // æ·»å åæ°å
|
| | | // æ·»å åæ°å
|
| | | int addParamsPacket(int totalCount, int totalGroup, int currentGroup, |
| | | short unitId, short recipeId, |
| | | const char* pszData, size_t size); |
| | | |
| | | // â æ°å¢åºåååååºåå彿° |
| | | bool serialize(const std::string& filename) const; |
| | | bool deserialize(const std::string& filename); |
| | | |
| | | private: |
| | | int m_nUnitNo; |
| | | int m_nToatlGroupCount; |
| | |
| | | |
| | | // æ¾å°å¯¹åºCRecipeList, æ¾ä¸å°åè¿åNG |
| | | lock(); |
| | | CRecipeList* pRecipeList = getRecipeListFromTemp(unitNo); |
| | | CRecipeList* pRecipeList = getRecipeList(unitNo); |
| | | if (pRecipeList == nullptr) { |
| | | unlock(); |
| | | return MRLRC_NG; |
| | |
| | | lock(); |
| | | m_nSyncStatus = SS_PARAMS_COMPLETE; |
| | | unlock(); |
| | | |
| | | if (m_onSyncingStateChanged != nullptr) { |
| | | m_onSyncingStateChanged(m_nSyncStatus); |
| | | } |
| | | |
| | | return MRLRC_OK; |
| | | } |
| | | |
| | |
| | | return iter->second; |
| | | } |
| | | |
| | | bool CRecipesManager::saveRecipeList(int unitNo, std::string& strFilepath) |
| | | { |
| | | CRecipeList* pRecipeList = getRecipeList(unitNo); |
| | | if (pRecipeList == nullptr) return false; |
| | | return pRecipeList->serialize(strFilepath); |
| | | } |
| | | |
| | | bool CRecipesManager::readRecipeList(int unitNo, std::string& strFilepath) |
| | | { |
| | | CRecipeList* pRecipeList = getRecipeList(unitNo); |
| | | if (pRecipeList == nullptr) { |
| | | pRecipeList = new CRecipeList(); |
| | | m_mapRecipes[unitNo] = pRecipeList; |
| | | } |
| | | return pRecipeList->deserialize(strFilepath); |
| | | } |
| | | |
| | | void CRecipesManager::setOnSyncingStateChanged(ONSYNCINGSTATECHANGED block) |
| | | { |
| | | m_onSyncingStateChanged = block; |
| | |
| | | short decodeRecipeParameterReport(const char* pszData, size_t size); |
| | | CRecipeList* getRecipeListFromTemp(int unitNo); |
| | | CRecipeList* getRecipeList(int unitNo); |
| | | bool saveRecipeList(int unitNo, std::string& strFilepath); |
| | | bool readRecipeList(int unitNo, std::string& strFilepath); |
| | | |
| | | public: |
| | | inline void lock() { ::EnterCriticalSection(&m_cs); }; |
| | |
| | | // recipe parameter report |
| | | CEqReadStep* pStep = new CEqReadStep(0x16a54, 257 * 2, |
| | | [&](void* pFrom, int code, const char* pszData, size_t size) -> int { |
| | | CEqReadStep* pTmpStep = (CEqReadStep*)pFrom; |
| | | if (code == ROK && pszData != nullptr && size > 0) { |
| | | // æ¤å¤è§£éé
æ¹æ°æ® |
| | | short ret = decodeRecipeParameterReport(pszData, size); |
| | | pStep->setReturnCode(ret); |
| | | pTmpStep->setReturnCode(ret); |
| | | } |
| | | pStep->setReturnCode(MRLRC_OK); |
| | | pTmpStep->setReturnCode(MRLRC_OK); |
| | | return -1; |
| | | }); |
| | | pStep->setName(STEP_EQ_RECIPE_PARAMETER); |
| | |
| | | return 30000; |
| | | } |
| | | |
| | | int CVacuumBake::parsingParams(const char* pszData, size_t size, std::vector<CParam>& parsms) |
| | | int CVacuumBake::parsingParams(const char* pszData, size_t size, std::vector<CParam>& params) |
| | | { |
| | | ASSERT(pszData); |
| | | if (size < 250) return 0; |
| | |
| | | |
| | | // 1.A_è
å çæ¶é´ |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8; |
| | | parsms.push_back(CParam("A_è
å çæ¶é´", 0, "", v * 0.1f)); |
| | | params.push_back(CParam("A_è
å çæ¶é´", "", "", v * 0.1f)); |
| | | i += 2; |
| | | |
| | | // 2.B_è
å çæ¶é´ |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8; |
| | | parsms.push_back(CParam("B_è
å çæ¶é´", 0, "", v * 0.1f)); |
| | | params.push_back(CParam("B_è
å çæ¶é´", "", "", v * 0.1f)); |
| | | i += 2; |
| | | |
| | | // 3.A_è
ç ´ç空æ¶é´ |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8; |
| | | parsms.push_back(CParam("A_è
ç ´ç空æ¶é´", 0, "", v * 0.01f)); |
| | | params.push_back(CParam("A_è
ç ´ç空æ¶é´", "", "", v * 0.01f)); |
| | | i += 2; |
| | | |
| | | // 4.B_è
ç ´ç空æ¶é´ |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8; |
| | | parsms.push_back(CParam("B_è
ç ´ç空æ¶é´", 0, "", v * 0.01f)); |
| | | params.push_back(CParam("B_è
ç ´ç空æ¶é´", "", "", v * 0.01f)); |
| | | i += 2; |
| | | |
| | | // 5.A_è
ç空å°è¾¾å¼ |
| | | parsms.push_back(CParam("A_è
ç空å°è¾¾å¼", 0, "", (double)toFloat(&pszData[i]))); |
| | | params.push_back(CParam("A_è
ç空å°è¾¾å¼", "", "", (double)toFloat(&pszData[i]))); |
| | | i += 4; |
| | | |
| | | // 6.B_è
ç空å°è¾¾å¼ |
| | | parsms.push_back(CParam("B_è
ç空å°è¾¾å¼", 0, "", (double)toFloat(&pszData[i]))); |
| | | params.push_back(CParam("B_è
ç空å°è¾¾å¼", "", "", (double)toFloat(&pszData[i]))); |
| | | i += 4; |
| | | |
| | | // 7.A_è
温æ§è¡¨ä¸»æ§æ¸©åº¦è®¾å® |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24; |
| | | parsms.push_back(CParam("A_è
温æ§è¡¨ä¸»æ§æ¸©åº¦è®¾å®", 0, "", v * 0.1f)); |
| | | params.push_back(CParam("A_è
温æ§è¡¨ä¸»æ§æ¸©åº¦è®¾å®", "", "", v * 0.1f)); |
| | | i += 4; |
| | | |
| | | // 8.B_è
温æ§è¡¨ä¸»æ§æ¸©åº¦è®¾å® |
| | | v = (pszData[i] & 0xff) | (pszData[i + 1] & 0xff) << 8 | (pszData[i + 2] & 0xff) << 16 | (pszData[i + 3] & 0xff) << 24; |
| | | parsms.push_back(CParam("B_è
温æ§è¡¨ä¸»æ§æ¸©åº¦è®¾å®", 0, "", v * 0.1f)); |
| | | params.push_back(CParam("B_è
温æ§è¡¨ä¸»æ§æ¸©åº¦è®¾å®", "", "", v * 0.1f)); |
| | | i += 4; |
| | | |
| | | |
| | | return (int)parsms.size(); |
| | | return (int)params.size(); |
| | | } |
| | | } |
| | |
| | | m_listPPID.SetColumnWidth(nColCount - 1, LVSCW_AUTOSIZE_USEHEADER); |
| | | } |
| | | |
| | | void CPageRecipe::FillRecipeListToListCtrl(SERVO::CRecipeList* pList) |
| | | void CPageRecipe::FillRecipeListToListCtrl(SERVO::CEquipment* pEq) |
| | | { |
| | | SERVO::CRecipeList* pRecipeList = pEq->getRecipeList(0); |
| | | CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST_PPID); |
| | | if (pListCtrl == nullptr || !::IsWindow(pListCtrl->m_hWnd)) { |
| | | return; |
| | |
| | | |
| | | // æ¸
空å½åCListCtrlä¸çææé¡¹ |
| | | pListCtrl->DeleteAllItems(); |
| | | if (pList == nullptr) { |
| | | if (pRecipeList == nullptr) { |
| | | return; |
| | | } |
| | | |
| | | // éåæ°æ®å¹¶æå
¥å°CListCtrlä¸ |
| | | std::map<int, short>& ids = pList->getIds(); |
| | | std::map<int, short>& ids = pRecipeList->getIds(); |
| | | auto rawDatas = pRecipeList->getParamsRawData(); |
| | | 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()); |
| | | |
| | | auto iter = rawDatas.find(item.second); |
| | | if (iter != rawDatas.end()) { |
| | | std::string strDescription; |
| | | pEq->parsingParams((const char*)iter->second.data(), iter->second.size(), strDescription); |
| | | } |
| | | } |
| | | |
| | | // è·ååæ° |
| | |
| | | pEq[i] == nullptr ? _T("Master") : pEq[i]->getName().c_str()); |
| | | pComboBox->SetItemDataPtr(i, pEq[i]); |
| | | |
| | | // 读å忥 |
| | | char szBuffer[_MAX_PATH]; |
| | | if (pEq[i]) { |
| | | pEq[i]->masterRecipeListRequest(0, nullptr); |
| | | sprintf_s(szBuffer, _MAX_PATH, "%s\\Recipe\\EQ%d_Unit0.recipelist", (LPTSTR)(LPCTSTR)theApp.m_strAppDir, pEq[i]->getID()); |
| | | std::string strFilepath(szBuffer); |
| | | pEq[i]->readRecipeList(0, strFilepath); |
| | | } |
| | | } |
| | | pComboBox->SetCurSel(0); |
| | |
| | | } |
| | | else { |
| | | InitListCtrlHeaderForDevice(); |
| | | SERVO::CRecipeList* pRecipeList = pEq->getRecipeList(0); |
| | | FillRecipeListToListCtrl(pRecipeList); |
| | | FillRecipeListToListCtrl(pEq); |
| | | } |
| | | } |
| | | |
| | |
| | | SERVO::CEquipment* pEq = (SERVO::CEquipment*)pMsgDlg->GetDataEx(); |
| | | HANDLE hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL); |
| | | int nStep = 0; |
| | | |
| | | // åå¤é
æ¹è·¯å¾ |
| | | char szBuffer[_MAX_PATH]; |
| | | sprintf_s(szBuffer, _MAX_PATH, "%s\\Recipe\\EQ%d_Unit0.recipelist", (LPTSTR)(LPCTSTR)theApp.m_strAppDir, pEq->getID()); |
| | | std::string strFilepath(szBuffer); |
| | | |
| | | pEq->masterRecipeListRequest(0, [&, pEq, pMsgDlg, hEvent](int status) -> void { |
| | | Sleep(300); |
| | | if (status == SS_FAILED || status == SS_TIMEOUT) { |
| | |
| | | }); |
| | | ::WaitForSingleObject(hEvent, INFINITE); |
| | | if (nStep != 1) { |
| | | pEq->saveRecipeList(0, strFilepath); |
| | | pMsgDlg->SetIcon(MSG_BOX_SUCCEED); |
| | | pMsgDlg->SetMarquee(FALSE, 0); |
| | | pMsgDlg->SetCompleteCode(-1); |
| | |
| | | auto& ids = pRecipeList->getIds(); |
| | | pMsgDlg->SetTitle(_T("æ£å¨è·ååæ°")); |
| | | for (auto item : ids) { |
| | | int recipeId = item.second; |
| | | CString strMsg; |
| | | strMsg.Format(_T("æ£å¨è·åé
æ¹ %d åæ°..."), item.second); |
| | | pMsgDlg->SetMessage((LPTSTR)(LPCTSTR)strMsg); |
| | | pEq->recipeParameterRequest(0, item.second, 0, [&, pEq, pMsgDlg](int status) -> void { |
| | | pEq->recipeParameterRequest(0, recipeId, 0, [&, pEq, pMsgDlg, recipeId, hEvent](int status) -> void { |
| | | Sleep(500); |
| | | if (status == SS_FAILED || status == SS_TIMEOUT) { |
| | | CString strMsg; |
| | | strMsg.Format(status == SS_FAILED ? _T("è·åé
æ¹ %d åæ°å¤±è´¥ï¼") : _T("è·åé
æ¹ %d åæ°è¶
æ¶ï¼"), item.second); |
| | | strMsg.Format(status == SS_FAILED ? _T("è·åé
æ¹ %d åæ°å¤±è´¥ï¼") : _T("è·åé
æ¹ %d åæ°è¶
æ¶ï¼"), recipeId); |
| | | pMsgDlg->SetMessage((LPTSTR)(LPCTSTR)strMsg); |
| | | |
| | | Sleep(300); |
| | | Sleep(30); |
| | | SetEvent(hEvent); |
| | | } |
| | | else if (status == SS_PARAMS_COMPLETE) { |
| | |
| | | strMsg.Format(_T("è·åé
æ¹ %d 忰宿ï¼"), item.second); |
| | | pMsgDlg->SetMessage((LPTSTR)(LPCTSTR)strMsg); |
| | | |
| | | Sleep(300); |
| | | Sleep(30); |
| | | SetEvent(hEvent); |
| | | } |
| | | }); |
| | |
| | | ResetEvent(hEvent); |
| | | } |
| | | |
| | | |
| | | pEq->saveRecipeList(0, strFilepath); |
| | | pMsgDlg->SetIcon(MSG_BOX_SUCCEED); |
| | | pMsgDlg->SetTitle(_T("æä½å®æ")); |
| | | pMsgDlg->SetCompleteCode(0); |
| | |
| | | pMsgDlg->DelayClose(3000); |
| | | }; |
| | | |
| | | SERVO::CRecipeList* pRecipeList = pEq->getRecipeList(0); |
| | | FillRecipeListToListCtrl(pRecipeList); |
| | | FillRecipeListToListCtrl(pEq); |
| | | CloseHandle(hEvent); |
| | | |
| | | |
| | | |
| | | // 卿¤æå°é
æ¹åæ°ä»¥ä¾¿æ ¸å¯¹æ°æ® |
| | | SERVO::CRecipeList* pRecipeList = pEq->getRecipeList(0); |
| | | ASSERT(pRecipeList); |
| | | auto rawDatas = pRecipeList->getParamsRawData(); |
| | | for (auto item : rawDatas) { |
| | | TRACE("================= é
æ¹ %d\n", item.first); |
| | | |
| | | std::vector<CParam> params; |
| | | pEq->parsingParams((const char*)item.second.data(), item.second.size(), params); |
| | | for (auto p : params) { |
| | | if (p.getValueType() == PVT_INT) { |
| | | TRACE("%s: %d\n", p.getName().c_str(), p.getIntValue()); |
| | | } |
| | | else if (p.getValueType() == PVT_DOUBLE) { |
| | | TRACE("%s: %f\n", p.getName().c_str(), p.getDoubleValue()); |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | return 0; |
| | | } |
| | |
| | | void InitListCtrlHeaderForDevice(); |
| | | void UpdateRecipeByPPID(const CString& strPPID); |
| | | void FillDataToListCtrl(const std::vector<RecipeInfo>& vecRecipe); |
| | | void FillRecipeListToListCtrl(SERVO::CRecipeList* pList); |
| | | void FillRecipeListToListCtrl(SERVO::CEquipment* pEq); |
| | | |
| | | // å¯¹è¯æ¡æ°æ® |
| | | #ifdef AFX_DESIGN_TIME |
| | |
| | | int nRecipeID; // åé
æ¹ID |
| | | std::string strRecipeName; // åé
æ¹åç§° |
| | | std::string strDeviceName; // 设å¤åç§° |
| | | std::vector<uint8_t> paramsRawData; // é
æ¹åå§æ°æ® |
| | | std::vector<CParam*> m_params; // åºç«æ¶è®°å½åæ° |
| | | }; |
| | | |
| | | // é
æ¹ä¿¡æ¯ |
| | |
| | | std::string strDescription; // é
æ¹æè¿° |
| | | std::string strCreateTime; // å建æ¶é´ |
| | | std::vector<DeviceRecipe> vecDeviceList; // å
³èç设å¤ä¿¡æ¯å表 |
| | | std::vector<CParam*> m_params; // åºç«æ¶è®°å½åæ° |
| | | void RecipeInfo::addIntParam(const char* pszName, const char* pszId, const char* pszUnit, int value) |
| | | { |
| | | CParam* pParam = new CParam(pszName, pszId, pszUnit, value); |
| | | m_params.push_back(pParam); |
| | | } |
| | | |
| | | void RecipeInfo::addDoubleParam(const char* pszName, const char* pszId, const char* pszUnit, double value) |
| | | { |
| | | CParam* pParam = new CParam(pszName, pszId, pszUnit, value); |
| | | m_params.push_back(pParam); |
| | | } |
| | | |
| | | std::vector<CParam*>& RecipeInfo::getParams() |
| | | { |
| | | return m_params; |
| | | } |
| | | }; |
| | | |
| | | using RecipeMap = std::unordered_map<std::string, RecipeInfo>; // æ PPID æ å°çé
æ¹è¡¨ |