1 // 2 // Copyright © 2020 Arm Ltd and Contributors. All rights reserved. 3 // SPDX-License-Identifier: MIT 4 // 5 6 #include "ActivateTimelineReportingCommandHandler.hpp" 7 #include "TimelineUtilityMethods.hpp" 8 9 #include <armnn/Exceptions.hpp> 10 #include <fmt/format.h> 11 12 namespace armnn 13 { 14 15 namespace profiling 16 { 17 operator ()(const arm::pipe::Packet & packet)18void ActivateTimelineReportingCommandHandler::operator()(const arm::pipe::Packet& packet) 19 { 20 ProfilingState currentState = m_StateMachine.GetCurrentState(); 21 22 if (!m_ReportStructure.has_value()) 23 { 24 throw armnn::Exception(std::string("Profiling Service constructor must be initialised with an " 25 "IReportStructure argument in order to run timeline reporting")); 26 } 27 28 switch ( currentState ) 29 { 30 case ProfilingState::Uninitialised: 31 case ProfilingState::NotConnected: 32 case ProfilingState::WaitingForAck: 33 throw RuntimeException(fmt::format( 34 "Activate Timeline Reporting Command Handler invoked while in a wrong state: {}", 35 GetProfilingStateName(currentState))); 36 case ProfilingState::Active: 37 if ( !( packet.GetPacketFamily() == 0u && packet.GetPacketId() == 6u )) 38 { 39 throw armnn::Exception(std::string("Expected Packet family = 0, id = 6 but received family =") 40 + std::to_string(packet.GetPacketFamily()) 41 + " id = " + std::to_string(packet.GetPacketId())); 42 } 43 44 if(!m_TimelineReporting) 45 { 46 m_SendTimelinePacket.SendTimelineMessageDirectoryPackage(); 47 48 TimelineUtilityMethods::SendWellKnownLabelsAndEventClasses(m_SendTimelinePacket); 49 50 m_TimelineReporting = true; 51 52 m_ReportStructure.value().ReportStructure(); 53 54 m_BackendNotifier.NotifyBackendsForTimelineReporting(); 55 } 56 57 break; 58 default: 59 throw RuntimeException(fmt::format("Unknown profiling service state: {}", 60 static_cast<int>(currentState))); 61 } 62 } 63 64 } // namespace profiling 65 66 } // namespace armnn