110 lines
3.9 KiB
C++
110 lines
3.9 KiB
C++
// Copyright (2019-2023) Paul Scherrer Institute
|
|
|
|
#ifndef JUNGFRAUJOCH_JFJOCHSTATEMACHINE_H
|
|
#define JUNGFRAUJOCH_JFJOCHSTATEMACHINE_H
|
|
|
|
#include <string>
|
|
#include <mutex>
|
|
#include <future>
|
|
#include <optional>
|
|
|
|
#include <jfjoch.pb.h>
|
|
|
|
#include "../common/DiffractionExperiment.h"
|
|
#include "../jungfrau/JFCalibration.h"
|
|
#include "../common/Logger.h"
|
|
|
|
#include "JFJochServices.h"
|
|
|
|
enum class JFJochState {Inactive, Idle, Measuring, Error, Busy, Pedestal};
|
|
|
|
void LoadDatasetSettings(DiffractionExperiment& experiment, const JFJochProtoBuf::DatasetSettings &settings);
|
|
|
|
class JFJochStateMachine {
|
|
Logger &logger;
|
|
JFJochServices &services;
|
|
|
|
mutable std::mutex m;
|
|
std::condition_variable c;
|
|
|
|
// mutex m is protecting:
|
|
DiffractionExperiment experiment;
|
|
volatile JFJochState state = JFJochState::Inactive;
|
|
volatile bool cancel_sequence = false;
|
|
std::unique_ptr<JFCalibration> calibration;
|
|
std::vector<JFModuleGainCalibration> gain_calibration;
|
|
std::vector<DetectorSetup> detector_setup;
|
|
int64_t current_detector_setup;
|
|
|
|
std::future<void> measurement;
|
|
|
|
mutable std::mutex calibration_statistics_mutex;
|
|
std::vector<JFCalibrationModuleStatistics> calibration_statistics;
|
|
|
|
mutable std::mutex last_receiver_output_mutex;
|
|
std::optional<JFJochProtoBuf::MeasurementStatistics> measurement_statistics;
|
|
void SetFullMeasurementOutput(const JFJochServicesOutput &output);
|
|
void ClearMeasurementStatistics();
|
|
void ClearAndSetMeasurementStatistics();
|
|
|
|
mutable std::mutex data_processing_settings_mutex;
|
|
DataProcessingSettings data_processing_settings;
|
|
|
|
// Private functions assume that lock m is acquired
|
|
void SetDatasetDefaults(JFJochProtoBuf::DatasetSettings& settings);
|
|
void WaitTillMeasurementDone();
|
|
void ImportPedestal(const JFJochReceiverOutput &receiver_output, size_t gain_level, size_t storage_cell = 0);
|
|
void ImportPedestalG0(const JFJochReceiverOutput &receiver_output);
|
|
|
|
void TakePedestalInternalAll(std::unique_lock<std::mutex> &ul);
|
|
void TakePedestalInternalG0(std::unique_lock<std::mutex> &ul);
|
|
void TakePedestalInternalG1(std::unique_lock<std::mutex> &ul, int32_t storage_cell = 0);
|
|
void TakePedestalInternalG2(std::unique_lock<std::mutex> &ul, int32_t storage_cell = 0);
|
|
public:
|
|
JFJochStateMachine(JFJochServices &in_services, Logger &logger);
|
|
~JFJochStateMachine();
|
|
|
|
void Initialize();
|
|
void Pedestal();
|
|
void Deactivate();
|
|
void Start(const JFJochProtoBuf::DatasetSettings& settings);
|
|
void Stop();
|
|
void Trigger();
|
|
|
|
void Abort();
|
|
void Cancel();
|
|
|
|
void LoadMask(const std::vector<uint32_t> &vec, uint32_t bit);
|
|
void SetCalibrationStatistics(const std::vector<JFCalibrationModuleStatistics> &input);
|
|
|
|
JFJochProtoBuf::DetectorSettings GetDetectorSettings() const;
|
|
void SetDetectorSettings(const JFJochProtoBuf::DetectorSettings& settings);
|
|
|
|
// return by value to ensure thread safety
|
|
std::optional<JFJochProtoBuf::MeasurementStatistics> GetMeasurementStatistics() const;
|
|
std::vector<JFCalibrationModuleStatistics> GetCalibrationStatistics() const;
|
|
|
|
JFJochProtoBuf::BrokerStatus GetStatus() const;
|
|
Plot GetPlots(const PlotRequest &request) const;
|
|
RadialIntegrationProfiles GetRadialIntegrationProfiles() const;
|
|
|
|
void SetDataProcessingSettings(const DataProcessingSettings& settings);
|
|
DataProcessingSettings GetDataProcessingSettings() const;
|
|
DataProcessingSettings GetDataAnalysisSettings() const;
|
|
|
|
JFJochState GetState() const;
|
|
|
|
// Not thread safe - only for configuration in serial context
|
|
DiffractionExperiment& NotThreadSafe_Experiment();
|
|
|
|
// Function for debug only - UNSAFE for real operation
|
|
void DebugOnly_SetState(JFJochState state);
|
|
|
|
void AddDetectorSetup(const DetectorSetup& setup);
|
|
JFJochProtoBuf::DetectorList GetDetectorsList();
|
|
void SelectDetector(int64_t id);
|
|
};
|
|
|
|
|
|
#endif //JUNGFRAUJOCH_JFJOCHSTATEMACHINE_H
|