| | |
| | | #include "stdafx.h" |
| | | #include "stdafx.h" |
| | | #include "CGlass.h" |
| | | #include "Log.h" |
| | | |
| | | |
| | | namespace SERVO { |
| | |
| | | |
| | | if (m_pBuddy != nullptr) { |
| | | m_pBuddy->release(); |
| | | m_pBuddy = nullptr; |
| | | } |
| | | } |
| | | |
| | |
| | | CPath* pTemp = m_pPath; |
| | | while (pTemp != nullptr) { |
| | | pTemp->getSimpleDescription(strPath); |
| | | strOut.append(strPath); |
| | | if (strPath.compare("ARM1") != 0 && strPath.compare("ARM2") != 0) { |
| | | if (!strOut.empty()) strOut.append(" -> "); |
| | | strOut.append(strPath); |
| | | } |
| | | |
| | | pTemp = pTemp->getNext(); |
| | | if (pTemp != nullptr) { |
| | | strOut.append(" -> "); |
| | | } |
| | | } |
| | | |
| | | return strOut; |
| | |
| | | return nullptr; |
| | | } |
| | | |
| | | void CGlass::addPath(unsigned int nEqId, unsigned int nUnit) |
| | | void CGlass::addPath(unsigned int nEqId, unsigned int nUnit, unsigned int slot) |
| | | { |
| | | CPath* pPath = new CPath(nEqId, nUnit); |
| | | CPath* pPath = new CPath(nEqId, nUnit, slot); |
| | | if (m_pPath == nullptr) { |
| | | m_pPath = pPath; |
| | | } |
| | |
| | | return "Queued"; |
| | | break; |
| | | case SERVO::GlsState::Completed: |
| | | return "Queued"; |
| | | return "Completed"; |
| | | break; |
| | | case SERVO::GlsState::Aborted: |
| | | return "Aborted"; |
| | |
| | | if (s.size() > maxLen) s.resize(maxLen); |
| | | } |
| | | |
| | | // —— 时间戳 & 工具 —— |
| | | // 状态时间戳:排队/开始/结束 |
| | | void CGlass::markQueued() |
| | | { |
| | | m_state = GlsState::Queued; |
| | |
| | | |
| | | return strOut; |
| | | } |
| | | |
| | | // ========== SV数据口袋 ========== |
| | | static constexpr size_t MAX_SV_DATA_KEEP = 4800; |
| | | void CGlass::addSVData(int machineId, const std::string& dataType, const SVDataItem& dataItem) { |
| | | auto& vec = m_svDatas[machineId][dataType]; |
| | | vec.push_back(dataItem); |
| | | if (vec.size() > MAX_SV_DATA_KEEP) { |
| | | vec.erase(vec.begin(), vec.begin() + (vec.size() - MAX_SV_DATA_KEEP)); |
| | | } |
| | | } |
| | | |
| | | void CGlass::addSVData(int machineId, const std::string& dataType, double value) { |
| | | auto now = std::chrono::system_clock::now(); |
| | | auto& vec = m_svDatas[machineId][dataType]; |
| | | vec.emplace_back(now, value); |
| | | if (vec.size() > MAX_SV_DATA_KEEP) { |
| | | vec.erase(vec.begin(), vec.begin() + (vec.size() - MAX_SV_DATA_KEEP)); |
| | | } |
| | | } |
| | | |
| | | void CGlass::addSVData(int machineId, const std::string& dataType, int64_t timestamp, double value) { |
| | | // int64_t时间转成system_clock::time_point |
| | | std::chrono::system_clock::time_point timePoint{ |
| | | std::chrono::milliseconds(timestamp) // timestamp精度:毫秒 |
| | | // 如果需要精度更高,可能要使用其他时间单位,如std::chrono::seconds(timestamp) |
| | | }; |
| | | auto& vec = m_svDatas[machineId][dataType]; |
| | | vec.emplace_back(timePoint, value); |
| | | if (vec.size() > MAX_SV_DATA_KEEP) { |
| | | vec.erase(vec.begin(), vec.begin() + (vec.size() - MAX_SV_DATA_KEEP)); |
| | | } |
| | | } |
| | | |
| | | void CGlass::addSVData(int machineId, const std::string& dataType, const std::vector<SVDataItem>& dataItems) { |
| | | auto& dataList = m_svDatas[machineId][dataType]; |
| | | dataList.insert(dataList.end(), dataItems.begin(), dataItems.end()); |
| | | if (dataList.size() > MAX_SV_DATA_KEEP) { |
| | | dataList.erase(dataList.begin(), dataList.begin() + (dataList.size() - MAX_SV_DATA_KEEP)); |
| | | } |
| | | } |
| | | |
| | | std::vector<SVDataItem> CGlass::getSVData(int machineId, const std::string& dataType) const { |
| | | auto machineIt = m_svDatas.find(machineId); |
| | | if (machineIt != m_svDatas.end()) { |
| | | auto dataIt = machineIt->second.find(dataType); |
| | | if (dataIt != machineIt->second.end()) { |
| | | return dataIt->second; |
| | | } |
| | | } |
| | | return std::vector<SVDataItem>(); |
| | | } |
| | | |
| | | std::vector<std::string> CGlass::getSVDataTypes(int machineId) const { |
| | | std::vector<std::string> types; |
| | | auto machineIt = m_svDatas.find(machineId); |
| | | if (machineIt != m_svDatas.end()) { |
| | | for (const auto& pair : machineIt->second) { |
| | | types.push_back(pair.first); |
| | | } |
| | | } |
| | | return types; |
| | | } |
| | | |
| | | std::unordered_map<std::string, std::vector<SVDataItem>> CGlass::getMachineSVData(int machineId) const { |
| | | auto it = m_svDatas.find(machineId); |
| | | if (it != m_svDatas.end()) { |
| | | return it->second; |
| | | } |
| | | return std::unordered_map<std::string, std::vector<SVDataItem>>(); |
| | | } |
| | | |
| | | const std::unordered_map<int, std::unordered_map<std::string, std::vector<SVDataItem>>>& CGlass::getAllSVData() const { |
| | | return m_svDatas; |
| | | } |
| | | |
| | | bool CGlass::hasSVData(int machineId, const std::string& dataType) const { |
| | | auto machineIt = m_svDatas.find(machineId); |
| | | if (machineIt != m_svDatas.end()) { |
| | | return machineIt->second.find(dataType) != machineIt->second.end(); |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | bool CGlass::hasMachineSVData(int machineId) const { |
| | | return m_svDatas.find(machineId) != m_svDatas.end(); |
| | | } |
| | | |
| | | std::vector<int> CGlass::getMachineIdsWithSVData() const { |
| | | std::vector<int> machineIds; |
| | | for (const auto& pair : m_svDatas) { |
| | | machineIds.push_back(pair.first); |
| | | } |
| | | return machineIds; |
| | | } |
| | | |
| | | void CGlass::clearSVData(int machineId, const std::string& dataType) { |
| | | auto machineIt = m_svDatas.find(machineId); |
| | | if (machineIt != m_svDatas.end()) { |
| | | machineIt->second.erase(dataType); |
| | | if (machineIt->second.empty()) { |
| | | m_svDatas.erase(machineIt); |
| | | } |
| | | } |
| | | } |
| | | |
| | | void CGlass::clearMachineSVData(int machineId) { |
| | | m_svDatas.erase(machineId); |
| | | } |
| | | |
| | | void CGlass::clearAllSVData() { |
| | | m_svDatas.clear(); |
| | | } |
| | | |
| | | size_t CGlass::getSVDataCount(int machineId, const std::string& dataType) const { |
| | | auto machineIt = m_svDatas.find(machineId); |
| | | if (machineIt != m_svDatas.end()) { |
| | | auto dataIt = machineIt->second.find(dataType); |
| | | if (dataIt != machineIt->second.end()) { |
| | | return dataIt->second.size(); |
| | | } |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | size_t CGlass::getMachineSVDataCount(int machineId) const { |
| | | size_t total = 0; |
| | | auto machineIt = m_svDatas.find(machineId); |
| | | if (machineIt != m_svDatas.end()) { |
| | | for (const auto& pair : machineIt->second) { |
| | | total += pair.second.size(); |
| | | } |
| | | } |
| | | return total; |
| | | } |
| | | |
| | | size_t CGlass::getTotalSVDataCount() const { |
| | | size_t total = 0; |
| | | for (const auto& machinePair : m_svDatas) { |
| | | for (const auto& dataPair : machinePair.second) { |
| | | total += dataPair.second.size(); |
| | | } |
| | | } |
| | | return total; |
| | | } |
| | | |
| | | std::vector<std::pair<int, SVDataItem>> CGlass::findSVDataByType(const std::string& dataType) const { |
| | | std::vector<std::pair<int, SVDataItem>> result; |
| | | for (const auto& machinePair : m_svDatas) { |
| | | auto dataIt = machinePair.second.find(dataType); |
| | | if (dataIt != machinePair.second.end()) { |
| | | for (const auto& item : dataIt->second) { |
| | | result.emplace_back(machinePair.first, item); |
| | | } |
| | | } |
| | | } |
| | | return result; |
| | | } |
| | | } |