You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ovdCArchwayHandler.h 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. #pragma once
  2. #ifdef MENSIA_DISTRIBUTION
  3. #include <memory>
  4. #include <vector>
  5. #include <string>
  6. #include <map>
  7. #include <functional>
  8. #include <openvibe/kernel/ovIKernelContext.h>
  9. #include <gtk/gtk.h>
  10. #include <system/ovCDynamicModule.h>
  11. namespace OpenViBE {
  12. enum class EEngineType { Local, LAN };
  13. enum class EEngineInitialisationStatus { Success, Failure, NotAvailable };
  14. struct SPipelineParameter
  15. {
  16. std::string name;
  17. std::string defaultValue;
  18. std::string value;
  19. };
  20. struct SPipeline
  21. {
  22. size_t id;
  23. std::string description;
  24. bool isConfigured;
  25. };
  26. struct SArchwayBridge
  27. {
  28. std::function<bool()> isStarted;
  29. std::function<size_t(size_t)> getAvailableValueMatrixCount;
  30. std::function<std::vector<float>(size_t)> popValueMatrix;
  31. std::function<bool()> dropBuffers;
  32. };
  33. struct SGUIBridge
  34. {
  35. std::function<void()> refreshStoppedEngine;
  36. };
  37. class CArchwayHandler final
  38. {
  39. public:
  40. explicit CArchwayHandler(const Kernel::IKernelContext& ctx) : m_DeviceURL("simulator://"), m_kernelCtx(ctx) { }
  41. ~CArchwayHandler();
  42. EEngineInitialisationStatus initialize();
  43. bool uninitialize();
  44. bool reinitializeArchway();
  45. std::vector<SPipeline> getEnginePipelines() const;
  46. std::vector<SPipelineParameter> getPipelineParameters(size_t pipelineClassID) const;
  47. bool setPipelineParameterValue(size_t pipelineClassID, std::string const& parameterName, std::string const& parameterValue);
  48. std::string getPipelineScenarioPath(size_t pipelineID) const;
  49. bool startEngineWithPipeline(size_t pipelineClassID, bool isFastForward, bool shouldAcquireImpedance);
  50. bool loopEngine();
  51. bool stopEngine();
  52. bool isEngineStarted();
  53. bool writeArchwayConfigurationFile();
  54. std::map<std::string, std::string>& getPipelineSettings(const size_t pipelineClassID) { return m_pipelineSettings[pipelineClassID]; }
  55. SArchwayBridge m_ArchwayBridge;
  56. SGUIBridge m_GUIBridge;
  57. std::string m_DeviceURL;
  58. EEngineType m_EngineType = EEngineType::Local;
  59. private:
  60. bool initializeArchway();
  61. bool uninitializeArchway();
  62. bool savePipelineConfigurations();
  63. bool loadPipelineConfigurations();
  64. std::string getArchwayErrorString() const;
  65. private:
  66. typedef void (*FPEnumerateAvailablePipelinesCallback)(size_t pipelineClassID, const char* pipelineDescription, void* userData);
  67. typedef void (*FPEnumeratePipelineParametersCallback)(size_t pipelineID, const char* parameterName, const char* parameterValue, void* userData);
  68. struct ArchwayAPI
  69. {
  70. size_t (*getLastError)();
  71. const char* (*getErrorString)(size_t errorCode);
  72. const char* (*getVersionDescription)();
  73. void (*getConfigurationParameterAsString)(const char* configurationParameter, char* outputBuffer, size_t bufferLength);
  74. bool (*getPipelineScenarioPath)(size_t pipelineID, char* messageBuffer, size_t bufferLength);
  75. bool (*initialize)(const char* login, const char* password, const char* applicationName, const char* configFilename);
  76. bool (*startAllAcquisitionDevices)();
  77. bool (*startImpedanceCheckOnAllAcquisitionDevices)();
  78. bool (*startEngine)();
  79. bool (*startEngineInFastForward)();
  80. bool (*stopEngine)();
  81. bool (*stopAllAcquisitionDevices)();
  82. bool (*uninitialize)();
  83. bool (*enumerateAvailablePipelines)(FPEnumerateAvailablePipelinesCallback callback, void* userData);
  84. size_t (*createPipeline)(size_t pipelineClassID, const char* profileName);
  85. bool (*releasePipeline)(size_t pipelineID);
  86. bool (*isPipelineRunning)(size_t pipelineID);
  87. bool (*isPipelineInErrorState)(size_t pipelineID);
  88. bool (*enumeratePipelineParameters)(size_t pipelineID, FPEnumeratePipelineParametersCallback callback, void* userData);
  89. bool (*setPipelineParameterAsString)(size_t pipelineID, const char* parameterName, const char* value);
  90. bool (*mainloop)();
  91. size_t (*getPendingValueCount)(size_t pipelineID, size_t matrixOutputIdx);
  92. size_t (*getPendingValueDimension)(size_t pipelineID, size_t matrixOutputIdx);
  93. bool (*getPendingValue)(size_t pipelineID, size_t matrixOutputIdx, float* value);
  94. size_t (*getPendingLogMessageCount)(size_t pipelineID);
  95. bool (*getPendingLogMessage)(size_t pipelineID, size_t* logLevel, char* messageBuffer, size_t bufferSize);
  96. bool (*dropPendingValues)(size_t pipelineID);
  97. bool (*dropPendingEvents)(size_t pipelineID);
  98. bool (*isInitialized)();
  99. bool (*isAcquiring)();
  100. bool (*isStarted)();
  101. };
  102. struct ArchwayAPI* m_archway = nullptr;
  103. System::CDynamicModule m_archwayModule;
  104. const Kernel::IKernelContext& m_kernelCtx;
  105. // Current Configuration
  106. std::map<size_t, std::map<std::string, std::string>> m_pipelineSettings;
  107. static const std::string ARCHWAY_CONFIG_FILE;
  108. static const std::string ARCHWAY_PIPELINES_CONFIG_FILE;
  109. size_t m_RunningPipelineId = 0;
  110. };
  111. } // namespace OpenViBE
  112. #endif