// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #pragma once #include #include #include #include "../common/DetectorSetup.h" #include "../common/DiffractionExperiment.h" struct SimplonConfig { nlohmann::json min; nlohmann::json max; nlohmann::json val; std::vector allowed_values; std::string unit; }; enum class SimplonState {Na, Ready, Initialize, Configure, Acquire, Idle, Test, Error}; enum class SimplonDetectorCommand {Initialize, Arm, Disarm, Trigger, Cancel}; std::string to_string(SimplonState state); namespace httplib { class Client; } class DectrisSimplonClient { std::string hostname; uint16_t port; // Two connections, each kept alive and reused: one for commands and configuration, which can take // minutes (initialize, disarm, threshold change), and one for reading status and configuration, // so that status polls are never stuck behind a long command. httplib::Client cannot run requests // from several threads at once (status polling, cancel and the HTTP status endpoint can overlap), // so each request holds the mutex of its connection. std::mutex cmd_mutex; std::unique_ptr cmd_http; std::mutex status_mutex; std::unique_ptr status_http; enum class SimplonModule {Detector, Stream, Filewriter, Monitor}; enum class SimplonTask {Config, Command, Status}; constexpr static const std::string_view api_version = "1.8.0"; static std::string GenAddr(SimplonModule element, SimplonTask task, const std::string& key); SimplonConfig GetDetCfg(const std::string& key); SimplonConfig GetConfig(SimplonModule element, SimplonTask task, const std::string &key); SimplonConfig GetConfig(SimplonModule element, const std::string &key); nlohmann::json GetStatus(SimplonModule element, const std::string &key); void SetConfig(SimplonModule element, const std::string &key, const nlohmann::json &value); void SetConfigIfDifferent(SimplonModule element, const std::string &key, float value, float tolerance); void SetConfigIfDifferent(SimplonModule element, const std::string &key, int64_t value); void SendDetectorCommand(SimplonDetectorCommand cmd); public: explicit DectrisSimplonClient(const std::string& hostname, uint16_t port = 80); ~DectrisSimplonClient(); void ReadDetectorConfig(DetectorSetup &setup); void ConfigureDetector(const DiffractionExperiment& experiment); void StartAcquisition(const DiffractionExperiment& experiment); void EndAcquisitionFinished(); void CancelAcquisition(); void TriggerAcquisition(); void InitializeDetector(DetectorSetup& setup); SimplonState GetState(); std::string GetErrorStatus(); float GetHumidity(); float GetTemperature(); std::vector GetPixelMask(); };