// // Copyright © 2019 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // #include "PeriodicCounterCaptureCommandHandler.hpp" #include #include #include namespace armnn { namespace gatordmock { void PeriodicCounterCaptureCommandHandler::ParseData(const arm::pipe::Packet& packet) { std::vector counterIds; std::vector counterValues; uint32_t sizeOfUint64 = armnn::numeric_cast(sizeof(uint64_t)); uint32_t sizeOfUint32 = armnn::numeric_cast(sizeof(uint32_t)); uint32_t sizeOfUint16 = armnn::numeric_cast(sizeof(uint16_t)); uint32_t offset = 0; if (packet.GetLength() >= 8) { offset = 0; uint64_t timestamp = arm::pipe::ReadUint64(reinterpret_cast(packet.GetData()), offset); if (m_FirstTimestamp == 0) // detect the first timestamp we receive. { m_FirstTimestamp = timestamp; } else { m_SecondTimestamp = timestamp; m_CurrentPeriodValue = m_SecondTimestamp - m_FirstTimestamp; m_FirstTimestamp = m_SecondTimestamp; } // Length minus timestamp and header divided by the length of an indexPair unsigned int counters = (packet.GetLength() - 8) / 6; if (counters > 0) { counterIds.reserve(counters); counterValues.reserve(counters); // Move offset over timestamp area offset += sizeOfUint64; for (unsigned int pos = 0; pos < counters; ++pos) { counterIds.emplace_back( arm::pipe::ReadUint16(reinterpret_cast(packet.GetData()), offset)); offset += sizeOfUint16; counterValues.emplace_back( arm::pipe::ReadUint32(reinterpret_cast(packet.GetData()), offset)); offset += sizeOfUint32; } } m_CounterCaptureValues.m_Timestamp = timestamp; m_CounterCaptureValues.m_Uids = counterIds; m_CounterCaptureValues.m_Values = counterValues; } } void PeriodicCounterCaptureCommandHandler::operator()(const arm::pipe::Packet& packet) { ParseData(packet); if (!m_QuietOperation) // Are we supposed to print to stdout? { std::string header, body, uidString, valueString; for (uint16_t uid : m_CounterCaptureValues.m_Uids) { uidString.append(std::to_string(uid)); uidString.append(", "); } for (uint32_t val : m_CounterCaptureValues.m_Values) { valueString.append(std::to_string(val)); valueString.append(", "); } body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_CounterCaptureValues.m_Timestamp), 10)); body.append(" | "); body.append(arm::pipe::CentreAlignFormatting(std::to_string(m_CurrentPeriodValue), 13)); body.append(" | "); body.append(arm::pipe::CentreAlignFormatting(uidString, 10)); body.append(" | "); body.append(arm::pipe::CentreAlignFormatting(valueString, 10)); body.append("\n"); if (!m_HeaderPrinted) { header.append(arm::pipe::CentreAlignFormatting(" Timestamp", 11)); header.append(" | "); header.append(arm::pipe::CentreAlignFormatting("Period (us)", 13)); header.append(" | "); header.append(arm::pipe::CentreAlignFormatting("UID's", static_cast(uidString.size()))); header.append(" | "); header.append(arm::pipe::CentreAlignFormatting("Values", 10)); header.append("\n"); std::cout << header; m_HeaderPrinted = true; } std::cout << std::string(body.size(), '-') << "\n"; std::cout << body; } } } // namespace gatordmock } // namespace armnn