00001 #ifndef artdaq_demo_Generators_ToyHardwareInterface_ToyHardwareInterface_hh
00002 #define artdaq_demo_Generators_ToyHardwareInterface_ToyHardwareInterface_hh
00003
00004 #include "artdaq-core-demo/Overlays/FragmentType.hh"
00005
00006 #include "fhiclcpp/fwd.h"
00007
00008 #include <random>
00009 #include <chrono>
00010
00021 class ToyHardwareInterface
00022 {
00023 public:
00024
00025 typedef uint16_t data_t;
00026
00031 explicit ToyHardwareInterface(fhicl::ParameterSet const& ps);
00032
00038 void StartDatataking();
00039
00043 void StopDatataking();
00044
00050 void FillBuffer(char* buffer, size_t* bytes_read);
00051
00056 void AllocateReadoutBuffer(char** buffer);
00057
00062 void FreeReadoutBuffer(char* buffer);
00063
00068 int SerialNumber() const;
00069
00074 int NumADCBits() const;
00075
00080 int BoardType() const;
00081
00085 enum class DistributionType
00086 {
00087 uniform,
00088 gaussian,
00089 monotonic,
00090 uninitialized,
00091 uninit2
00092 };
00093
00094 private:
00095
00096 bool taking_data_;
00097
00098 std::size_t nADCcounts_;
00099 std::size_t maxADCcounts_;
00100 std::size_t change_after_N_seconds_;
00101 int nADCcounts_after_N_seconds_;
00102 bool exception_after_N_seconds_;
00103 bool exit_after_N_seconds_;
00104 bool abort_after_N_seconds_;
00105 demo::FragmentType fragment_type_;
00106 std::size_t maxADCvalue_;
00107 std::size_t throttle_usecs_;
00108 std::size_t usecs_between_sends_;
00109 DistributionType distribution_type_;
00110
00111 using time_type = decltype(std::chrono::steady_clock::now());
00112
00113 const time_type fake_time_ = std::numeric_limits<time_type>::max();
00114
00115
00116
00117 std::mt19937 engine_;
00118 std::unique_ptr<std::uniform_int_distribution<data_t>> uniform_distn_;
00119 std::unique_ptr<std::normal_distribution<double>> gaussian_distn_;
00120
00121 time_type start_time_;
00122 int send_calls_;
00123 int serial_number_;
00124 };
00125
00126
00127 #endif