diff --git a/broker/JFJochStateMachine.cpp b/broker/JFJochStateMachine.cpp index 3ea47a2b..171beac6 100644 --- a/broker/JFJochStateMachine.cpp +++ b/broker/JFJochStateMachine.cpp @@ -97,6 +97,103 @@ inline JFJochProtoBuf::JFCalibrationStatistics Convert(const std::vector 0) + experiment.FrameTime(std::chrono::microseconds(settings.frame_time_us()), + std::chrono::microseconds(settings.count_time_us())); + else + experiment.FrameTime(std::chrono::microseconds(settings.frame_time_us())); + + experiment.StorageCells(settings.storage_cell_count()); + experiment.UseInternalPacketGenerator(settings.use_internal_packet_generator()); + + if (settings.collect_raw_data()) + experiment.Mode(DetectorMode::Raw); + else + experiment.Mode(DetectorMode::Conversion); + + experiment.PedestalG0Frames(settings.pedestal_g0_frames()); + experiment.PedestalG1Frames(settings.pedestal_g1_frames()); + experiment.PedestalG2Frames(settings.pedestal_g2_frames()); + if (settings.storage_cell_delay_ns() > 0) + experiment.StorageCellDelay(std::chrono::nanoseconds(settings.storage_cell_delay_ns())); + } catch (...) { + experiment = tmp; + throw; + } +} + JFJochStateMachine::JFJochStateMachine(JFJochServices &in_services, Logger &in_logger) : services(in_services), logger(in_logger), data_processing_settings(DiffractionExperiment::DefaultDataProcessingSettings()) { @@ -274,7 +371,7 @@ void JFJochStateMachine::Start(const JFJochProtoBuf::DatasetSettings& settings) auto mod_settings = settings; SetDatasetDefaults(mod_settings); - experiment.LoadDatasetSettings(mod_settings); + LoadDatasetSettings(experiment, mod_settings); ClearAndSetMeasurementStatistics(); @@ -454,9 +551,20 @@ void JFJochStateMachine::SetCalibrationStatistics(const JFJochProtoBuf::JFCalibr calibration_statistics = input; } + JFJochProtoBuf::DetectorSettings JFJochStateMachine::GetDetectorSettings() const { std::unique_lock ul(m); - return experiment.GetDetectorSettings(); + JFJochProtoBuf::DetectorSettings ret; + ret.set_frame_time_us(experiment.GetFrameTime().count()); + ret.set_count_time_us(experiment.GetFrameCountTime().count()); + ret.set_collect_raw_data(experiment.GetDetectorMode() != DetectorMode::Conversion); + ret.set_use_internal_packet_generator(experiment.IsUsingInternalPacketGen()); + ret.set_storage_cell_count(experiment.GetStorageCellNumber()); + ret.set_pedestal_g0_frames(experiment.GetPedestalG0Frames()); + ret.set_pedestal_g1_frames(experiment.GetPedestalG1Frames()); + ret.set_pedestal_g2_frames(experiment.GetPedestalG2Frames()); + ret.set_storage_cell_delay_ns(experiment.GetStorageCellDelay().count()); + return ret; } void JFJochStateMachine::SetDetectorSettings(const JFJochProtoBuf::DetectorSettings &settings) { @@ -464,10 +572,10 @@ void JFJochStateMachine::SetDetectorSettings(const JFJochProtoBuf::DetectorSetti switch (state) { case JFJochState::Inactive: case JFJochState::Error: - experiment.LoadDetectorSettings(settings); + LoadDetectorSettings(experiment, settings); break; case JFJochState::Idle: - experiment.LoadDetectorSettings(settings); + LoadDetectorSettings(experiment, settings); TakePedestalInternalAll(ul); break; case JFJochState::Measuring: diff --git a/broker/JFJochStateMachine.h b/broker/JFJochStateMachine.h index cade25ce..88fa358d 100644 --- a/broker/JFJochStateMachine.h +++ b/broker/JFJochStateMachine.h @@ -16,6 +16,8 @@ enum class JFJochState {Inactive, Idle, Measuring, Error, Busy, Pedestal}; +void LoadDatasetSettings(DiffractionExperiment& experiment, const JFJochProtoBuf::DatasetSettings &settings); + class JFJochStateMachine { Logger &logger; JFJochServices &services; diff --git a/common/DiffractionExperiment.cpp b/common/DiffractionExperiment.cpp index b8f71b53..f47ecd7b 100644 --- a/common/DiffractionExperiment.cpp +++ b/common/DiffractionExperiment.cpp @@ -777,119 +777,6 @@ JFJochProtoBuf::DetectorConfig DiffractionExperiment::DetectorConfig(const std:: return ret; } -void DiffractionExperiment::LoadDatasetSettings(const JFJochProtoBuf::DatasetSettings &settings) { - // TODO Fix - // Save DatasetSettings - if something goes wrong, restore old settings - auto tmp = dataset; - - try { - // dataset = JFJochProtoBuf::DatasetSettings(); - ImagesPerTrigger(settings.images_per_trigger()); - NumTriggers(settings.ntrigger()); - BeamX_pxl(settings.beam_x_pxl()); - BeamY_pxl(settings.beam_y_pxl()); - DetectorDistance_mm(settings.detector_distance_mm()); - PhotonEnergy_keV(settings.photon_energy_kev()); - FilePrefix(settings.file_prefix()); - DataFileCount(settings.data_file_count()); - if (settings.has_unit_cell()) - SetUnitCell(UnitCell(settings.unit_cell().a(), - settings.unit_cell().b(), - settings.unit_cell().c(), - settings.unit_cell().alpha(), - settings.unit_cell().beta(), - settings.unit_cell().gamma())); - else - SetUnitCell(); - SpaceGroupNumber(settings.space_group_number()); - SampleName(settings.sample_name()); - switch (settings.compression()) { - case JFJochProtoBuf::BSHUF_LZ4: - Compression(CompressionAlgorithm::BSHUF_LZ4); - break; - case JFJochProtoBuf::BSHUF_ZSTD: - Compression(CompressionAlgorithm::BSHUF_ZSTD); - break; - case JFJochProtoBuf::BSHUF_ZSTD_RLE: - Compression(CompressionAlgorithm::BSHUF_ZSTD_RLE); - break; - default: - case JFJochProtoBuf::NO_COMPRESSION: - Compression(CompressionAlgorithm::NO_COMPRESSION); - break; - } - SaveCalibration(settings.save_calibration()); - if (settings.summation() == 0) - Summation(1); - else - Summation(settings.summation()); - switch (settings.fpga_pixel_output()) { - default: - case JFJochProtoBuf::AUTO: - FPGAOutputMode(FPGAPixelOutput::Auto); - break; - case JFJochProtoBuf::INT16: - FPGAOutputMode(FPGAPixelOutput::Int16); - break; - case JFJochProtoBuf::UINT16: - FPGAOutputMode(FPGAPixelOutput::Uint16); - break; - case JFJochProtoBuf::INT32: - FPGAOutputMode(FPGAPixelOutput::Int32); - break; - case JFJochProtoBuf::UINT32: - FPGAOutputMode(FPGAPixelOutput::Uint32); - break; - } - } catch (...) { - dataset = tmp; - throw; - } -} - -void DiffractionExperiment::LoadDetectorSettings(const JFJochProtoBuf::DetectorSettings &settings) { - // TODO: Fix!!! - //auto tmp = internal; - try { - if (settings.count_time_us() > 0) - FrameTime(std::chrono::microseconds(settings.frame_time_us()), - std::chrono::microseconds(settings.count_time_us())); - else - FrameTime(std::chrono::microseconds(settings.frame_time_us())); - - StorageCells(settings.storage_cell_count()); - UseInternalPacketGenerator(settings.use_internal_packet_generator()); - - if (settings.collect_raw_data()) - Mode(DetectorMode::Raw); - else - Mode(DetectorMode::Conversion); - - PedestalG0Frames(settings.pedestal_g0_frames()); - PedestalG1Frames(settings.pedestal_g1_frames()); - PedestalG2Frames(settings.pedestal_g2_frames()); - if (settings.storage_cell_delay_ns() > 0) - StorageCellDelay(std::chrono::nanoseconds(settings.storage_cell_delay_ns())); - } catch (...) { - // internal = tmp; - throw; - } -} - -JFJochProtoBuf::DetectorSettings DiffractionExperiment::GetDetectorSettings() const { - JFJochProtoBuf::DetectorSettings ret; - ret.set_frame_time_us(GetFrameTime().count()); - ret.set_count_time_us(GetFrameCountTime().count()); - ret.set_collect_raw_data(GetDetectorMode() != DetectorMode::Conversion); - ret.set_use_internal_packet_generator(IsUsingInternalPacketGen()); - ret.set_storage_cell_count(GetStorageCellNumber()); - ret.set_pedestal_g0_frames(GetPedestalG0Frames()); - ret.set_pedestal_g1_frames(GetPedestalG1Frames()); - ret.set_pedestal_g2_frames(GetPedestalG2Frames()); - ret.set_storage_cell_delay_ns(GetStorageCellDelay().count()); - return ret; -} - void DiffractionExperiment::CheckDataProcessingSettings(const DataProcessingSettings &settings) { check_min("Signal to noise threshold", settings.signal_to_noise_threshold, 1); check_min("Photon count threshold", settings.photon_count_threshold, 0); diff --git a/common/DiffractionExperiment.h b/common/DiffractionExperiment.h index 7604e07c..10427bce 100644 --- a/common/DiffractionExperiment.h +++ b/common/DiffractionExperiment.h @@ -162,9 +162,6 @@ public: operator JFJochProtoBuf::DetectorInput() const; JFJochProtoBuf::DetectorConfig DetectorConfig(const std::vector& net_config) const; - void LoadDatasetSettings(const JFJochProtoBuf::DatasetSettings &settings); - void LoadDetectorSettings(const JFJochProtoBuf::DetectorSettings &settings); - JFJochProtoBuf::DetectorSettings GetDetectorSettings() const; static void CheckDataProcessingSettings(const DataProcessingSettings& settings); static DataProcessingSettings DefaultDataProcessingSettings(); diff --git a/tests/DiffractionExperimentTest.cpp b/tests/DiffractionExperimentTest.cpp index 59155d1f..27227c48 100644 --- a/tests/DiffractionExperimentTest.cpp +++ b/tests/DiffractionExperimentTest.cpp @@ -637,139 +637,6 @@ TEST_CASE("DiffractionExperiment_DetectorInput_StorageCell","[DiffractionExperim REQUIRE(ret.storage_cell_start() == x.GetStorageCellStart()); } -TEST_CASE("DiffractionExperiment_LoadDatasetSettings", "[DiffractionExperiment]") { - DiffractionExperiment x; - x.ImagesPerTrigger(567).BeamY_pxl(324).Compression(CompressionAlgorithm::BSHUF_ZSTD); - JFJochProtoBuf::DatasetSettings settings; - settings.set_images_per_trigger(234); - settings.set_ntrigger(56); - settings.set_beam_x_pxl(23.4); - settings.set_beam_y_pxl(123.4); - settings.set_photon_energy_kev(WVL_1A_IN_KEV); - settings.set_detector_distance_mm(57.6); - settings.set_data_file_count(5); - settings.set_space_group_number(45); - settings.set_sample_name("lyso1"); - settings.set_summation(36); - settings.set_fpga_pixel_output(JFJochProtoBuf::INT16); - REQUIRE_NOTHROW(x.LoadDatasetSettings(settings)); - - REQUIRE(x.GetImageNumPerTrigger() == 234); - REQUIRE(x.GetBeamX_pxl() == Approx(23.4)); - REQUIRE(x.GetBeamY_pxl() == Approx(123.4)); - REQUIRE(x.GetSpaceGroupNumber() == 45); - REQUIRE(x.GetCompressionAlgorithm() == CompressionAlgorithm::BSHUF_LZ4); - REQUIRE(x.GetSampleName() == "lyso1"); - REQUIRE(x.GetDataFileCount() == 5); - REQUIRE(x.GetDetectorDistance_mm() == Approx(57.6)); - REQUIRE(x.GetSummation() == 36); - REQUIRE(x.GetFPGAOutputMode() == FPGAPixelOutput::Int16); -} - -TEST_CASE("DiffractionExperiment_LoadDatasetSettings_Invalid", "[DiffractionExperiment]") { - DiffractionExperiment x; - x.ImagesPerTrigger(567).BeamY_pxl(324).Compression(CompressionAlgorithm::BSHUF_ZSTD); - JFJochProtoBuf::DatasetSettings settings; - settings.set_images_per_trigger(-1); - settings.set_ntrigger(56); - settings.set_beam_x_pxl(23.4); - settings.set_beam_y_pxl(123.4); - settings.set_photon_energy_kev(WVL_1A_IN_KEV); - settings.set_detector_distance_mm(57.6); - settings.set_data_file_count(5); - settings.set_space_group_number(45); - settings.set_sample_name("lyso1"); - - REQUIRE_THROWS(x.LoadDatasetSettings(settings)); - - REQUIRE(x.GetImageNumPerTrigger() == 567); - REQUIRE(x.GetBeamY_pxl() == Approx(324)); - REQUIRE(x.GetSpaceGroupNumber() == 0); -} - -TEST_CASE("DiffractionExperiment_LoadDetectorSettings", "[DiffractionExperiment]") { - DiffractionExperiment x; - x.PedestalG0Frames(456).PedestalG1Frames(1234).PedestalG2Frames(123).StorageCellDelay(2500ns); - - JFJochProtoBuf::DetectorSettings settings; - settings.set_frame_time_us(600); - settings.set_count_time_us(400); - settings.set_storage_cell_count(8); - settings.set_use_internal_packet_generator(true); - settings.set_collect_raw_data(true); - settings.set_pedestal_g0_frames(5000); - settings.set_pedestal_g1_frames(100); - settings.set_pedestal_g2_frames(150); - - REQUIRE_NOTHROW(x.LoadDetectorSettings(settings)); - - REQUIRE(x.GetFrameTime().count() == 600); - REQUIRE(x.GetFrameCountTime().count() == 400); - REQUIRE(x.IsUsingInternalPacketGen()); - REQUIRE(x.GetStorageCellNumber() == 8); - REQUIRE(x.GetDetectorMode() == DetectorMode::Raw); - REQUIRE(x.GetPedestalG0Frames() == 5000); - REQUIRE(x.GetPedestalG1Frames() == 100); - REQUIRE(x.GetPedestalG2Frames() == 150); - REQUIRE(x.GetStorageCellDelay().count() == 2500); -} - -TEST_CASE("DiffractionExperiment_LoadDetectorSettings_StorageCellDelay", "[DiffractionExperiment]") { - DiffractionExperiment x; - x.PedestalG0Frames(456).PedestalG1Frames(1234).PedestalG2Frames(123).StorageCellDelay(5000ns); - - JFJochProtoBuf::DetectorSettings settings; - settings.set_frame_time_us(600); - settings.set_count_time_us(400); - settings.set_storage_cell_count(8); - settings.set_use_internal_packet_generator(true); - settings.set_collect_raw_data(true); - settings.set_storage_cell_delay_ns(7000); - REQUIRE_NOTHROW(x.LoadDetectorSettings(settings)); - REQUIRE(x.GetStorageCellDelay().count() == 7000); -} - -TEST_CASE("DiffractionExperiment_LoadDetectorSettings_invalid", "[DiffractionExperiment]") { - DiffractionExperiment x; - x.PedestalG0Frames(456).PedestalG1Frames(1234).PedestalG2Frames(123); - x.FrameTime(525us).Mode(DetectorMode::Conversion); - JFJochProtoBuf::DetectorSettings settings; - settings.set_frame_time_us(600); - settings.set_count_time_us(800); - settings.set_storage_cell_count(16); - settings.set_use_internal_packet_generator(true); - settings.set_collect_raw_data(true); - settings.set_pedestal_g0_frames(5000); - settings.set_pedestal_g1_frames(100); - settings.set_pedestal_g2_frames(150); - REQUIRE_THROWS(x.LoadDetectorSettings(settings)); - - REQUIRE(x.GetFrameTime().count() == 525); - REQUIRE(x.GetFrameCountTime().count() == 525 - READOUT_TIME_IN_US); - REQUIRE(!x.IsUsingInternalPacketGen()); - REQUIRE(x.GetStorageCellNumber() == 1); - REQUIRE(x.GetDetectorMode() == DetectorMode::Conversion); - REQUIRE(x.GetPedestalG0Frames() == 456); - REQUIRE(x.GetPedestalG1Frames() == 1234); - REQUIRE(x.GetPedestalG2Frames() == 123); -} - -TEST_CASE("DiffractionExperiment_LoadDetectorSettings_inferred", "[DiffractionExperiment]") { - DiffractionExperiment x; - x.PedestalG0Frames(456).PedestalG1Frames(1234).PedestalG2Frames(123); - - JFJochProtoBuf::DetectorSettings settings; - settings.set_frame_time_us(600); - settings.set_storage_cell_count(1); - REQUIRE_NOTHROW(x.LoadDetectorSettings(settings)); - - REQUIRE(x.GetFrameTime().count() == 600); - REQUIRE(x.GetFrameCountTime().count() == 600 - READOUT_TIME_IN_US); - REQUIRE(!x.IsUsingInternalPacketGen()); - REQUIRE(x.GetStorageCellNumber() == 1); - REQUIRE(x.GetDetectorMode() == DetectorMode::Conversion); -} - TEST_CASE("DiffractionExperiment_DefaultDataProcessingSettings","[DiffractionExperiment]") { REQUIRE_NOTHROW(DiffractionExperiment::CheckDataProcessingSettings( DiffractionExperiment::DefaultDataProcessingSettings())); diff --git a/tests/JFJochBrokerTest.cpp b/tests/JFJochBrokerTest.cpp index 11184430..5edda9a3 100644 --- a/tests/JFJochBrokerTest.cpp +++ b/tests/JFJochBrokerTest.cpp @@ -4,6 +4,8 @@ #include "../broker/JFJochStateMachine.h" #include "../broker/JFJochBroker.h" +using namespace std::literals::chrono_literals; + TEST_CASE("JFJochStateMachine_States") { Logger logger("JFJochStateMachine_States"); JFJochServices services(logger); @@ -251,3 +253,149 @@ TEST_CASE("JFJochBroker") { REQUIRE(broker.Stop(nullptr, nullptr, nullptr).ok()); REQUIRE(broker.Deactivate(nullptr, nullptr, nullptr).ok()); } + +TEST_CASE("FJochStateMachine_LoadDatasetSettings", "[DiffractionExperiment]") { + DiffractionExperiment x; + x.ImagesPerTrigger(567).BeamY_pxl(324).Compression(CompressionAlgorithm::BSHUF_ZSTD); + JFJochProtoBuf::DatasetSettings settings; + settings.set_images_per_trigger(234); + settings.set_ntrigger(56); + settings.set_beam_x_pxl(23.4); + settings.set_beam_y_pxl(123.4); + settings.set_photon_energy_kev(WVL_1A_IN_KEV); + settings.set_detector_distance_mm(57.6); + settings.set_data_file_count(5); + settings.set_space_group_number(45); + settings.set_sample_name("lyso1"); + settings.set_summation(36); + settings.set_fpga_pixel_output(JFJochProtoBuf::INT16); + REQUIRE_NOTHROW(LoadDatasetSettings(x,settings)); + + REQUIRE(x.GetImageNumPerTrigger() == 234); + REQUIRE(x.GetBeamX_pxl() == Approx(23.4)); + REQUIRE(x.GetBeamY_pxl() == Approx(123.4)); + REQUIRE(x.GetSpaceGroupNumber() == 45); + REQUIRE(x.GetCompressionAlgorithm() == CompressionAlgorithm::BSHUF_LZ4); + REQUIRE(x.GetSampleName() == "lyso1"); + REQUIRE(x.GetDataFileCount() == 5); + REQUIRE(x.GetDetectorDistance_mm() == Approx(57.6)); + REQUIRE(x.GetSummation() == 36); + REQUIRE(x.GetFPGAOutputMode() == FPGAPixelOutput::Int16); +} + +TEST_CASE("JFJochStateMachine_LoadDatasetSettings_Invalid", "[DiffractionExperiment]") { + DiffractionExperiment x; + x.ImagesPerTrigger(567).BeamY_pxl(324).Compression(CompressionAlgorithm::BSHUF_ZSTD); + JFJochProtoBuf::DatasetSettings settings; + settings.set_images_per_trigger(-1); + settings.set_ntrigger(56); + settings.set_beam_x_pxl(23.4); + settings.set_beam_y_pxl(123.4); + settings.set_photon_energy_kev(WVL_1A_IN_KEV); + settings.set_detector_distance_mm(57.6); + settings.set_data_file_count(5); + settings.set_space_group_number(45); + settings.set_sample_name("lyso1"); + + REQUIRE_THROWS(LoadDatasetSettings(x, settings)); + + REQUIRE(x.GetImageNumPerTrigger() == 567); + REQUIRE(x.GetBeamY_pxl() == Approx(324)); + REQUIRE(x.GetSpaceGroupNumber() == 0); +} + +TEST_CASE("JFJochStateMachine_SetDetectorSettings", "[DiffractionExperiment]") { + Logger logger("JFJochStateMachine_SetDetectorSettings"); + JFJochServices services(logger); + JFJochStateMachine state_machine(services, logger); + + state_machine.NotThreadSafe_Experiment().PedestalG0Frames(456).PedestalG1Frames(1234).PedestalG2Frames(123).StorageCellDelay(2500ns); + + JFJochProtoBuf::DetectorSettings settings; + settings.set_frame_time_us(600); + settings.set_count_time_us(400); + settings.set_storage_cell_count(8); + settings.set_use_internal_packet_generator(true); + settings.set_collect_raw_data(true); + settings.set_pedestal_g0_frames(5000); + settings.set_pedestal_g1_frames(100); + settings.set_pedestal_g2_frames(150); + + REQUIRE_NOTHROW(state_machine.SetDetectorSettings(settings)); + + REQUIRE(state_machine.NotThreadSafe_Experiment().GetFrameTime().count() == 600); + REQUIRE(state_machine.NotThreadSafe_Experiment().GetFrameCountTime().count() == 400); + REQUIRE(state_machine.NotThreadSafe_Experiment().IsUsingInternalPacketGen()); + REQUIRE(state_machine.NotThreadSafe_Experiment().GetStorageCellNumber() == 8); + REQUIRE(state_machine.NotThreadSafe_Experiment().GetDetectorMode() == DetectorMode::Raw); + REQUIRE(state_machine.NotThreadSafe_Experiment().GetPedestalG0Frames() == 5000); + REQUIRE(state_machine.NotThreadSafe_Experiment().GetPedestalG1Frames() == 100); + REQUIRE(state_machine.NotThreadSafe_Experiment().GetPedestalG2Frames() == 150); + REQUIRE(state_machine.NotThreadSafe_Experiment().GetStorageCellDelay().count() == 2500); +} + +TEST_CASE("JFJochStateMachine_SetDetectorSettings_StorageCellDelay", "[DiffractionExperiment]") { + Logger logger("JFJochStateMachine_SetDetectorSettings_StorageCellDelay"); + JFJochServices services(logger); + JFJochStateMachine state_machine(services, logger); + + state_machine.NotThreadSafe_Experiment().PedestalG0Frames(456).PedestalG1Frames(1234).PedestalG2Frames(123).StorageCellDelay(5000ns); + + JFJochProtoBuf::DetectorSettings settings; + settings.set_frame_time_us(600); + settings.set_count_time_us(400); + settings.set_storage_cell_count(8); + settings.set_use_internal_packet_generator(true); + settings.set_collect_raw_data(true); + settings.set_storage_cell_delay_ns(7000); + REQUIRE_NOTHROW(state_machine.SetDetectorSettings(settings)); + REQUIRE(state_machine.NotThreadSafe_Experiment().GetStorageCellDelay().count() == 7000); +} + +TEST_CASE("JFJochStateMachine_SetDetectorSettings_invalid", "[DiffractionExperiment]") { + Logger logger("JFJochStateMachine_SetDetectorSettings_invalid"); + JFJochServices services(logger); + JFJochStateMachine state_machine(services, logger); + + state_machine.NotThreadSafe_Experiment().PedestalG0Frames(456).PedestalG1Frames(1234).PedestalG2Frames(123) + .FrameTime(525us).Mode(DetectorMode::Conversion); + + JFJochProtoBuf::DetectorSettings settings; + settings.set_frame_time_us(600); + settings.set_count_time_us(800); + settings.set_storage_cell_count(16); + settings.set_use_internal_packet_generator(true); + settings.set_collect_raw_data(true); + settings.set_pedestal_g0_frames(5000); + settings.set_pedestal_g1_frames(100); + settings.set_pedestal_g2_frames(150); + REQUIRE_THROWS(state_machine.SetDetectorSettings(settings)); + + REQUIRE(state_machine.NotThreadSafe_Experiment().GetFrameTime().count() == 525); + REQUIRE(state_machine.NotThreadSafe_Experiment().GetFrameCountTime().count() == 525 - READOUT_TIME_IN_US); + REQUIRE(!state_machine.NotThreadSafe_Experiment().IsUsingInternalPacketGen()); + REQUIRE(state_machine.NotThreadSafe_Experiment().GetStorageCellNumber() == 1); + REQUIRE(state_machine.NotThreadSafe_Experiment().GetDetectorMode() == DetectorMode::Conversion); + REQUIRE(state_machine.NotThreadSafe_Experiment().GetPedestalG0Frames() == 456); + REQUIRE(state_machine.NotThreadSafe_Experiment().GetPedestalG1Frames() == 1234); + REQUIRE(state_machine.NotThreadSafe_Experiment().GetPedestalG2Frames() == 123); +} + +TEST_CASE("JFJochStateMachine_SetDetectorSettings_inferred", "[DiffractionExperiment]") { + Logger logger("JFJochStateMachine_SetDetectorSettings_inferred"); + JFJochServices services(logger); + JFJochStateMachine state_machine(services, logger); + + state_machine.NotThreadSafe_Experiment().PedestalG0Frames(456).PedestalG1Frames(1234).PedestalG2Frames(123); + + JFJochProtoBuf::DetectorSettings settings; + settings.set_frame_time_us(600); + settings.set_storage_cell_count(1); + REQUIRE_NOTHROW(state_machine.SetDetectorSettings(settings)); + + REQUIRE(state_machine.NotThreadSafe_Experiment().GetFrameTime().count() == 600); + REQUIRE(state_machine.NotThreadSafe_Experiment().GetFrameCountTime().count() == 600 - READOUT_TIME_IN_US); + REQUIRE(!state_machine.NotThreadSafe_Experiment().IsUsingInternalPacketGen()); + REQUIRE(state_machine.NotThreadSafe_Experiment().GetStorageCellNumber() == 1); + REQUIRE(state_machine.NotThreadSafe_Experiment().GetDetectorMode() == DetectorMode::Conversion); +} \ No newline at end of file