| | |
| | | #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"; |
| | |
| | | |
| | | return strOut; |
| | | } |
| | | |
| | | // ========== SV数据管理接口实现 ========== |
| | | |
| | | void CGlass::addSVData(int machineId, const std::string& dataType, const SVDataItem& dataItem) { |
| | | m_svDatas[machineId][dataType].push_back(dataItem); |
| | | } |
| | | |
| | | void CGlass::addSVData(int machineId, const std::string& dataType, double value) { |
| | | auto now = std::chrono::system_clock::now(); |
| | | m_svDatas[machineId][dataType].emplace_back(now, value); |
| | | } |
| | | |
| | | 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) |
| | | }; |
| | | m_svDatas[machineId][dataType].emplace_back(timePoint, value); |
| | | } |
| | | |
| | | 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()); |
| | | } |
| | | |
| | | 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; |
| | | } |
| | | } |