IVGCVSW-4455 Add an Activate and Deactivate control packet to the protocol

 * Add Activate/Deactivate command handlers
 * Add IReportStructure, INotifyBackends single function interfaces
 * Add overrided mechanism to report structure in Runtime.cpp
 * Add overrided mechanism to notify backends in ProfilingService.cpp
 * Add optional IReportStructure argument to ProfilingService constructor
   for use in ActivateTimelineReportingCommandHandler
 * Refactoring and tidying up indentation
 * Removal of unused code in ProfilingUtils.cpp and ProfilingService.cpp
 * Added GatordMock end to end test
 * Fixed an issue with SendCounterPacket sending duplicate packets
 * Fixed an issue with DirectoryCaptureCommandHandler handling of Optional

Signed-off-by: Keith Davis <keith.davis@arm.com>
Signed-off-by: Finn Williams <Finn.Williams@arm.com>

Change-Id: I5ef1b74171459bfc649861dedf99921d22c9e63f
diff --git a/src/armnn/Runtime.cpp b/src/armnn/Runtime.cpp
index 26636a8..dfcbf85 100644
--- a/src/armnn/Runtime.cpp
+++ b/src/armnn/Runtime.cpp
@@ -152,11 +152,32 @@
     return nullptr;
 }
 
+void Runtime::ReportStructure() // armnn::profiling::IProfilingService& profilingService as param
+{
+    // No-op for the time being, but this may be useful in future to have the profilingService available
+    // if (profilingService.IsProfilingEnabled()){}
+
+    LoadedNetworks::iterator it = m_LoadedNetworks.begin();
+    while (it != m_LoadedNetworks.end())
+    {
+        auto& loadedNetwork = it->second;
+        loadedNetwork->SendNetworkStructure();
+        // Increment the Iterator to point to next entry
+        it++;
+    }
+}
+
 Runtime::Runtime(const CreationOptions& options)
-    : m_NetworkIdCounter(0)
+    : m_NetworkIdCounter(0),
+      m_ProfilingService(*this)
 {
     ARMNN_LOG(info) << "ArmNN v" << ARMNN_VERSION << "\n";
 
+    if ( options.m_ProfilingOptions.m_TimelineEnabled && !options.m_ProfilingOptions.m_EnableProfiling )
+    {
+        throw RuntimeException("It is not possible to enable timeline reporting without profiling being enabled");
+    }
+
     // pass configuration info to the profiling service
     m_ProfilingService.ConfigureProfilingService(options.m_ProfilingOptions);