#ifndef OpenTestSystem_DiagConfiguration_OtxDiagApi_IBusMonitoring_H
#define OpenTestSystem_DiagConfiguration_OtxDiagApi_IBusMonitoring_H

#include "ApiDefs.h"
#include "TypeDefs.h"
#include "OtxDataTypes/AllClasses.h"
#include "OtxDataTypes/OtxBusMonitorMode.h"
#include <string>
#include <vector>
#include <memory>
#include <functional>

namespace OpenTestSystem { namespace OtxDiagManager { namespace OtxDiagApi {
	/// <summary>
	/// @snippetdoc DocSnippets.txt OtxDiagApiClassComment
	/// </summary>
	class API_EXPORTS IBusMonitoring
	{
	protected:
		inline IBusMonitoring() {}
	public:
		inline virtual ~IBusMonitoring() {}
		/// <summary>
		/// @snippetdoc DocSnippets.txt OtxDiagApiMethodComment
		/// </summary>
		virtual void SetMonitoringFramesReadyHandler(std::function<void(const OpenTestSystem::OtxDiagManager::OtxDiagApi::OtxDataTypes::IOtxBusMonitor & busMonitor)>) = 0;
		/// <summary>
		/// @snippetdoc DocSnippets.txt OtxDiagApiMethodComment
		/// </summary>
		virtual void StartBusMonitoring(std::shared_ptr<OpenTestSystem::OtxDiagManager::OtxDiagApi::OtxDataTypes::IOtxBusMonitor> & busMonitor, std::shared_ptr<OpenTestSystem::OtxDiagManager::OtxDiagApi::OtxDataTypes::IOtxComInterface> comInterface, std::string * interfaceResource, std::vector<int64> * addresses, OpenTestSystem::OtxDiagManager::OtxDiagApi::OtxDataTypes::OtxBusMonitorModes * mode, std::string * target) = 0;
		/// <summary>
		/// @snippetdoc DocSnippets.txt OtxDiagApiMethodComment
		/// </summary>
		virtual void StopBusMonitoring(std::shared_ptr<OpenTestSystem::OtxDiagManager::OtxDiagApi::OtxDataTypes::IOtxBusMonitor> & busMonitor) = 0;
		/// <summary>
		/// @snippetdoc DocSnippets.txt OtxDiagApiMethodComment
		/// </summary>
		virtual std::vector<std::shared_ptr<OpenTestSystem::OtxDiagManager::OtxDiagApi::OtxDataTypes::IOtxBusFrame>> FetchBusMonitorBusFrames(std::shared_ptr<OpenTestSystem::OtxDiagManager::OtxDiagApi::OtxDataTypes::IOtxBusMonitor> busMonitor) = 0;
		/// <summary>
		/// @snippetdoc DocSnippets.txt OtxDiagApiMethodComment
		/// </summary>
		virtual int64 GetBusFrameAddress(std::shared_ptr<OpenTestSystem::OtxDiagManager::OtxDiagApi::OtxDataTypes::IOtxBusFrame> busFrame) = 0;
		/// <summary>
		/// @snippetdoc DocSnippets.txt OtxDiagApiMethodComment
		/// </summary>
		virtual std::string GetBusFrameAsString(std::shared_ptr<OpenTestSystem::OtxDiagManager::OtxDiagApi::OtxDataTypes::IOtxBusFrame> busFrame) = 0;
		/// <summary>
		/// @snippetdoc DocSnippets.txt OtxDiagApiMethodComment
		/// </summary>
		virtual std::string GetBusFrameData(std::shared_ptr<OpenTestSystem::OtxDiagManager::OtxDiagApi::OtxDataTypes::IOtxBusFrame> busFrame) = 0;
		/// <summary>
		/// @snippetdoc DocSnippets.txt OtxDiagApiMethodComment
		/// </summary>
		virtual int64 GetBusFrameTimestamp(std::shared_ptr<OpenTestSystem::OtxDiagManager::OtxDiagApi::OtxDataTypes::IOtxBusFrame> busFrame) = 0;
		/// <summary>
		/// @snippetdoc DocSnippets.txt OtxDiagApiMethodComment
		/// </summary>
		virtual std::string GetBusFrameType(std::shared_ptr<OpenTestSystem::OtxDiagManager::OtxDiagApi::OtxDataTypes::IOtxBusFrame> busFrame) = 0;
	};
}}}
#endif // OpenTestSystem_DiagConfiguration_OtxDiagApi_IBusMonitoring_H