| | |
| | | #include "stdafx.h" |
| | | #include "CGlass.h" |
| | | #include "Log.h" |
| | | |
| | | |
| | | namespace SERVO { |
| | | CGlass::CGlass() |
| | | { |
| | | m_pPath = nullptr; |
| | | m_type = MaterialsType::G1; |
| | | m_pBuddy = nullptr; |
| | | m_nOriginPort = 0; |
| | | m_nOriginSlot = 0; |
| | | m_bScheduledForProcessing = FALSE; |
| | | m_pProcessJob = nullptr; |
| | | } |
| | | |
| | | CGlass::~CGlass() |
| | | { |
| | | reset(); |
| | | } |
| | | |
| | | void CGlass::reset() |
| | | { |
| | | CPath* pPath = m_pPath; |
| | | while (pPath != nullptr) { |
| | |
| | | pPath = pTemp; |
| | | } |
| | | m_pPath = nullptr; |
| | | |
| | | if (m_pBuddy != nullptr) { |
| | | m_pBuddy->release(); |
| | | m_pBuddy = nullptr; |
| | | } |
| | | } |
| | | |
| | | std::string& CGlass::getClassName() |
| | |
| | | return strText; |
| | | } |
| | | |
| | | MaterialsType CGlass::getType() const |
| | | { |
| | | return m_type; |
| | | } |
| | | |
| | | void CGlass::setType(MaterialsType type) |
| | | { |
| | | m_type = type; |
| | | } |
| | | |
| | | void CGlass::setID(const char* pszID) |
| | | { |
| | | m_strID = pszID; |
| | | } |
| | | |
| | | std::string& CGlass::getID() |
| | | const std::string& CGlass::getID() const |
| | | { |
| | | return m_strID; |
| | | } |
| | | |
| | | CPath* CGlass::getPathWithSiteID(unsigned int nSiteId) |
| | | void CGlass::setOriginPort(int port, int slot) |
| | | { |
| | | CPath* pPath = m_pPath; |
| | | while (pPath != nullptr) { |
| | | if (nSiteId == pPath->getSiteID()) { |
| | | return pPath; |
| | | } |
| | | pPath = pPath->getNext(); |
| | | } |
| | | m_nOriginPort = port; |
| | | m_nOriginSlot = slot; |
| | | } |
| | | |
| | | return nullptr; |
| | | void CGlass::getOrginPort(int& port, int& slot) |
| | | { |
| | | port = m_nOriginPort; |
| | | slot = m_nOriginSlot; |
| | | } |
| | | |
| | | BOOL CGlass::isScheduledForProcessing() |
| | | { |
| | | return m_bScheduledForProcessing; |
| | | } |
| | | |
| | | void CGlass::setScheduledForProcessing(BOOL bProcessing) |
| | | { |
| | | m_bScheduledForProcessing = bProcessing; |
| | | } |
| | | |
| | | CProcessJob* CGlass::getProcessJob() |
| | | { |
| | | return m_pProcessJob; |
| | | } |
| | | |
| | | void CGlass::setProcessJob(CProcessJob* pProcessJob) |
| | | { |
| | | m_pProcessJob = pProcessJob; |
| | | } |
| | | |
| | | CPath* CGlass::getPath() |
| | |
| | | return m_pPath; |
| | | } |
| | | |
| | | void CGlass::addPath(unsigned int nSiteId) |
| | | std::string CGlass::getPathDescription() const |
| | | { |
| | | CPath* pPath = new CPath(nSiteId); |
| | | std::string strOut, strPath; |
| | | char szBuffer[256]; |
| | | |
| | | CPath* pTemp = m_pPath; |
| | | while (pTemp != nullptr) { |
| | | pTemp->getSimpleDescription(strPath); |
| | | if (strPath.compare("ARM1") != 0 && strPath.compare("ARM2") != 0) { |
| | | if (!strOut.empty()) strOut.append(" -> "); |
| | | strOut.append(strPath); |
| | | } |
| | | |
| | | pTemp = pTemp->getNext(); |
| | | } |
| | | |
| | | return strOut; |
| | | } |
| | | |
| | | CPath* CGlass::getPathWithEq(unsigned int nEqId, unsigned int nUnit) const |
| | | { |
| | | CPath* pTemp = m_pPath; |
| | | while (pTemp != nullptr) { |
| | | if (pTemp->getEqID() == nEqId && pTemp->getUnit() == nUnit) { |
| | | return pTemp; |
| | | } |
| | | |
| | | pTemp = pTemp->getNext(); |
| | | } |
| | | |
| | | return nullptr; |
| | | } |
| | | |
| | | void CGlass::addPath(unsigned int nEqId, unsigned int nUnit, unsigned int slot) |
| | | { |
| | | CPath* pPath = new CPath(nEqId, nUnit, slot); |
| | | if (m_pPath == nullptr) { |
| | | m_pPath = pPath; |
| | | } |
| | |
| | | if (ar.IsStoring()) |
| | | { |
| | | Lock(); |
| | | ar << (int)m_type; |
| | | WriteString(ar, m_strID); |
| | | ar << m_nOriginPort; |
| | | ar << m_nOriginSlot; |
| | | ar << m_bScheduledForProcessing; |
| | | ar << (ULONGLONG)m_pPath; |
| | | if (m_pPath != nullptr) { |
| | | m_pPath->serialize(ar); |
| | | } |
| | | char temp[JOBDATAS_SIZE] = { 0 }; |
| | | m_jobDataS.serialize(temp, JOBDATAS_SIZE); |
| | | ar.Write(temp, JOBDATAS_SIZE); |
| | | ar << (ULONGLONG)m_pBuddy; |
| | | WriteString(ar, m_strBuddyId); |
| | | Unlock(); |
| | | } |
| | | else |
| | | { |
| | | Lock(); |
| | | ReadString(ar, m_strID); |
| | | ULONGLONG ullPath; |
| | | int type; |
| | | |
| | | Lock(); |
| | | ar >> type; |
| | | m_type = (MaterialsType)type; |
| | | ReadString(ar, m_strID); |
| | | ar >> m_nOriginPort; |
| | | ar >> m_nOriginSlot; |
| | | ar >> m_bScheduledForProcessing; |
| | | ar >> ullPath; |
| | | if (ullPath != 0) { |
| | | m_pPath = new CPath(); |
| | | m_pPath->serialize(ar); |
| | | } |
| | | |
| | | char temp[JOBDATAS_SIZE]; |
| | | ar.Read(temp, JOBDATAS_SIZE); |
| | | m_jobDataS.unserialize(temp, JOBDATAS_SIZE); |
| | | ar >> ullPath; m_pBuddy = (CGlass*)ullPath; |
| | | ReadString(ar, m_strBuddyId); |
| | | Unlock(); |
| | | } |
| | | } |
| | | |
| | | void CGlass::setJobDataS(CJobDataS* pJobDataS) |
| | | { |
| | | m_jobDataS.copy(pJobDataS); |
| | | } |
| | | |
| | | void CGlass::updateJobDataS(CJobDataS* pJobDataS) |
| | | { |
| | | m_jobDataS.update(pJobDataS); |
| | | } |
| | | |
| | | CJobDataS* CGlass::getJobDataS() |
| | | { |
| | | return &m_jobDataS; |
| | | } |
| | | |
| | | BOOL CGlass::setBuddy(CGlass* pGlass) |
| | | { |
| | | if (m_pBuddy != nullptr) return FALSE; |
| | | if (pGlass->getType() == this->getType()) return FALSE; |
| | | m_pBuddy = pGlass; |
| | | m_pBuddy->addRef(); |
| | | m_strBuddyId = m_pBuddy->getID(); |
| | | |
| | | return TRUE; |
| | | } |
| | | |
| | | BOOL CGlass::forceSetBuddy(CGlass* pGlass) |
| | | { |
| | | m_pBuddy = pGlass; |
| | | m_pBuddy->addRef(); |
| | | m_strBuddyId = m_pBuddy->getID(); |
| | | |
| | | return TRUE; |
| | | } |
| | | |
| | | CGlass* CGlass::getBuddy() |
| | | { |
| | | return m_pBuddy; |
| | | } |
| | | |
| | | const std::string& CGlass::getBuddyId() const |
| | | { |
| | | return m_strBuddyId; |
| | | } |
| | | |
| | | void CGlass::setBuddyId(std::string& strId) |
| | | { |
| | | m_strBuddyId = strId; |
| | | } |
| | | |
| | | int CGlass::processEnd(unsigned int nEqId, unsigned int nUnit) |
| | | { |
| | | CPath* pPath = getPathWithEq(nEqId, nUnit); |
| | | if (pPath == nullptr) return -1; |
| | | |
| | | pPath->processEnd(); |
| | | return 0; |
| | | } |
| | | |
| | | BOOL CGlass::isProcessed(unsigned int nEqId, unsigned int nUnit) |
| | | { |
| | | CPath* pPath = getPathWithEq(nEqId, nUnit); |
| | | if (pPath == nullptr) return FALSE; |
| | | |
| | | return pPath->isProcessEnd(); |
| | | } |
| | | |
| | | int CGlass::setInspResult(unsigned int nEqId, unsigned int nUnit, InspResult result) |
| | | { |
| | | CPath* pPath = getPathWithEq(nEqId, nUnit); |
| | | if (pPath == nullptr) return -1; |
| | | |
| | | pPath->setInspResult(result); |
| | | return 0; |
| | | } |
| | | |
| | | InspResult CGlass::getInspResult(unsigned int nEqId, unsigned int nUnit) const |
| | | { |
| | | CPath* pPath = getPathWithEq(nEqId, nUnit); |
| | | if (pPath == nullptr) return InspResult::NotInspected; |
| | | |
| | | return pPath->getInspResult(); |
| | | } |
| | | |
| | | InspResult CGlass::getAOIInspResult() const |
| | | { |
| | | return getInspResult(EQ_ID_MEASUREMENT, 0); |
| | | } |
| | | |
| | | std::string CGlass::getStateText() |
| | | { |
| | | switch (m_state) |
| | | { |
| | | case SERVO::GlsState::NoState: |
| | | return "NoState"; |
| | | break; |
| | | case SERVO::GlsState::Queued: |
| | | return "Queued"; |
| | | break; |
| | | case SERVO::GlsState::InProcess: |
| | | return "InProcess"; |
| | | break; |
| | | case SERVO::GlsState::Paused: |
| | | return "Queued"; |
| | | break; |
| | | case SERVO::GlsState::Completed: |
| | | return "Completed"; |
| | | break; |
| | | case SERVO::GlsState::Aborted: |
| | | return "Aborted"; |
| | | break; |
| | | case SERVO::GlsState::Failed: |
| | | return "Failed"; |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | |
| | | return ""; |
| | | } |
| | | |
| | | bool CGlass::queue() { |
| | | if (m_state != GlsState::NoState) return false; |
| | | markQueued(); |
| | | return true; |
| | | } |
| | | |
| | | bool CGlass::start() { |
| | | if (m_state != GlsState::Queued && m_state != GlsState::Paused) |
| | | return false; |
| | | if (!m_tStart.has_value()) markStart(); |
| | | m_state = GlsState::InProcess; |
| | | return true; |
| | | } |
| | | |
| | | bool CGlass::pause() { |
| | | if (m_state != GlsState::InProcess) return false; |
| | | m_state = GlsState::Paused; |
| | | return true; |
| | | } |
| | | |
| | | bool CGlass::resume() { |
| | | if (m_state != GlsState::Paused) return false; |
| | | m_state = GlsState::InProcess; |
| | | return true; |
| | | } |
| | | |
| | | bool CGlass::complete() { |
| | | if (m_state != GlsState::InProcess && m_state != GlsState::Paused) return false; |
| | | m_state = GlsState::Completed; |
| | | markEnd(); |
| | | return true; |
| | | } |
| | | |
| | | bool CGlass::abort() { |
| | | if (m_state == GlsState::Completed || m_state == GlsState::Aborted || m_state == GlsState::Failed) |
| | | return false; |
| | | m_state = GlsState::Aborted; |
| | | markEnd(); |
| | | return true; |
| | | } |
| | | |
| | | bool CGlass::fail(std::string reason) |
| | | { |
| | | m_failReason = trimCopy(reason); |
| | | clampString(m_failReason, 128); |
| | | m_state = GlsState::Failed; |
| | | markEnd(); |
| | | return true; |
| | | } |
| | | |
| | | std::string CGlass::trimCopy(std::string s) |
| | | { |
| | | auto notspace = [](int ch) { return !std::isspace(ch); }; |
| | | s.erase(s.begin(), std::find_if(s.begin(), s.end(), notspace)); |
| | | s.erase(std::find_if(s.rbegin(), s.rend(), notspace).base(), s.end()); |
| | | return s; |
| | | } |
| | | |
| | | void CGlass::clampString(std::string& s, size_t maxLen) |
| | | { |
| | | if (s.size() > maxLen) s.resize(maxLen); |
| | | } |
| | | |
| | | // —— 时间戳 & 工具 —— |
| | | void CGlass::markQueued() |
| | | { |
| | | m_state = GlsState::Queued; |
| | | m_tQueued = std::chrono::system_clock::now(); |
| | | } |
| | | |
| | | void CGlass::markStart() |
| | | { |
| | | m_state = GlsState::InProcess; |
| | | m_tStart = std::chrono::system_clock::now(); |
| | | } |
| | | |
| | | void CGlass::markEnd() |
| | | { |
| | | m_state = GlsState::Completed; |
| | | m_tEnd = std::chrono::system_clock::now(); |
| | | } |
| | | |
| | | void CGlass::addParams(std::vector<CParam>& params) |
| | | { |
| | | m_params.insert(m_params.end(), params.begin(), params.end()); |
| | | } |
| | | |
| | | std::vector<CParam>& CGlass::getParams() |
| | | { |
| | | return m_params; |
| | | } |
| | | |
| | | std::string CGlass::getParamsDescription() const |
| | | { |
| | | std::string strOut; |
| | | |
| | | char szBuffer[256]; |
| | | for (auto p : m_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 strOut; |
| | | } |
| | | } |