mirror of
https://github.com/paulscherrerinstitute/sf_daq_buffer.git
synced 2026-05-07 16:42:04 +02:00
Add a dummy writter for writing to /dev/null
This commit is contained in:
+32
-1
@@ -12,6 +12,16 @@ extern "C"
|
||||
|
||||
using namespace std;
|
||||
|
||||
std::unique_ptr<H5Writer> get_h5_writer(const string& filename, hsize_t frames_per_file,
|
||||
hsize_t initial_dataset_size, hsize_t dataset_increase_step)
|
||||
{
|
||||
if (filename == "/dev/null") {
|
||||
return unique_ptr<H5Writer>(new DummyH5Writer());
|
||||
} else {
|
||||
return unique_ptr<H5Writer>(new H5Writer(filename, frames_per_file, initial_dataset_size, dataset_increase_step));
|
||||
}
|
||||
}
|
||||
|
||||
H5Writer::H5Writer(const std::string& filename, hsize_t frames_per_file, hsize_t initial_dataset_size, hsize_t dataset_increase_step) :
|
||||
filename(filename), frames_per_file(frames_per_file),
|
||||
initial_dataset_size(initial_dataset_size), dataset_increase_step(dataset_increase_step)
|
||||
@@ -272,4 +282,25 @@ hsize_t H5Writer::prepare_storage_for_data(const string& dataset_name, const siz
|
||||
H5::H5File& H5Writer::get_h5_file()
|
||||
{
|
||||
return file;
|
||||
}
|
||||
}
|
||||
|
||||
DummyH5Writer::DummyH5Writer() : H5Writer("/dev/null", 0, 0, 0){}
|
||||
|
||||
void DummyH5Writer::close_file(){}
|
||||
|
||||
void DummyH5Writer::write_data(const string& dataset_name, const size_t data_index, const char* data, const std::vector<size_t>& data_shape,
|
||||
const size_t data_bytes_size, const string& data_type, const string& endianness){};
|
||||
|
||||
bool DummyH5Writer::is_file_open() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
H5::H5File& DummyH5Writer::get_h5_file(){
|
||||
stringstream error_message;
|
||||
using namespace date;
|
||||
error_message << "[" << std::chrono::system_clock::now() << "]";
|
||||
error_message << "Cannot get the H5 file with the dummy writer." << endl;
|
||||
|
||||
throw runtime_error(error_message.str());
|
||||
};
|
||||
@@ -35,6 +35,17 @@ class H5Writer
|
||||
public:
|
||||
H5Writer(const std::string& filename, hsize_t frames_per_file=0, hsize_t initial_dataset_size=1000, hsize_t dataset_increase_step=1000);
|
||||
virtual ~H5Writer();
|
||||
virtual bool is_file_open() const;
|
||||
virtual void close_file();
|
||||
virtual void write_data(const std::string& dataset_name, const size_t data_index, const char* data, const std::vector<size_t>& data_shape,
|
||||
const size_t data_bytes_size, const std::string& data_type, const std::string& endianness);
|
||||
virtual H5::H5File& get_h5_file();
|
||||
};
|
||||
|
||||
class DummyH5Writer : public H5Writer
|
||||
{
|
||||
public:
|
||||
DummyH5Writer();
|
||||
bool is_file_open() const;
|
||||
void close_file();
|
||||
void write_data(const std::string& dataset_name, const size_t data_index, const char* data, const std::vector<size_t>& data_shape,
|
||||
@@ -42,4 +53,7 @@ class H5Writer
|
||||
H5::H5File& get_h5_file();
|
||||
};
|
||||
|
||||
std::unique_ptr<H5Writer> get_h5_writer(const std::string& filename, hsize_t frames_per_file=0,
|
||||
hsize_t initial_dataset_size=1000, hsize_t dataset_increase_step=1000);
|
||||
|
||||
#endif
|
||||
+12
-12
@@ -148,7 +148,7 @@ void ProcessManager::receive_zmq(WriterManager& manager, RingBuffer& ring_buffer
|
||||
void ProcessManager::write_h5(WriterManager& manager, const H5Format& format, RingBuffer& ring_buffer,
|
||||
const shared_ptr<unordered_map<string, HeaderDataType>> header_values_type, const string& bsread_rest_address)
|
||||
{
|
||||
H5Writer writer(manager.get_output_file(), 0, config::initial_dataset_size, config::dataset_increase_step);
|
||||
auto writer = get_h5_writer(manager.get_output_file(), 0, config::initial_dataset_size, config::dataset_increase_step);
|
||||
auto raw_frames_dataset_name = config::raw_image_dataset_name;
|
||||
|
||||
uint64_t last_pulse_id = 0;
|
||||
@@ -174,13 +174,13 @@ void ProcessManager::write_h5(WriterManager& manager, const H5Format& format, Ri
|
||||
#endif
|
||||
|
||||
// Write image data.
|
||||
writer.write_data(raw_frames_dataset_name,
|
||||
received_data.first->frame_index,
|
||||
received_data.second,
|
||||
received_data.first->frame_shape,
|
||||
received_data.first->frame_bytes_size,
|
||||
received_data.first->type,
|
||||
received_data.first->endianness);
|
||||
writer->write_data(raw_frames_dataset_name,
|
||||
received_data.first->frame_index,
|
||||
received_data.second,
|
||||
received_data.first->frame_shape,
|
||||
received_data.first->frame_bytes_size,
|
||||
received_data.first->type,
|
||||
received_data.first->endianness);
|
||||
|
||||
#ifdef PERF_OUTPUT
|
||||
using namespace date;
|
||||
@@ -224,7 +224,7 @@ void ProcessManager::write_h5(WriterManager& manager, const H5Format& format, Ri
|
||||
// Header data are fixed to scalars in little endian.
|
||||
vector<size_t> value_shape = {header_data_type.value_shape};
|
||||
|
||||
writer.write_data(name,
|
||||
writer->write_data(name,
|
||||
received_data.first->frame_index,
|
||||
value.get(),
|
||||
value_shape,
|
||||
@@ -254,7 +254,7 @@ void ProcessManager::write_h5(WriterManager& manager, const H5Format& format, Ri
|
||||
notify_last_pulse_id(bsread_rest_address, last_pulse_id);
|
||||
}
|
||||
|
||||
if (writer.is_file_open()) {
|
||||
if (writer->is_file_open()) {
|
||||
#ifdef DEBUG_OUTPUT
|
||||
using namespace date;
|
||||
cout << "[" << std::chrono::system_clock::now() << "]";
|
||||
@@ -272,7 +272,7 @@ void ProcessManager::write_h5(WriterManager& manager, const H5Format& format, Ri
|
||||
|
||||
// Even if we can't write the format, lets try to preserve the data.
|
||||
try {
|
||||
H5FormatUtils::write_format(writer.get_h5_file(), format, parameters);
|
||||
H5FormatUtils::write_format(writer->get_h5_file(), format, parameters);
|
||||
} catch (const runtime_error& ex) {
|
||||
using namespace date;
|
||||
std::cout << "[" << std::chrono::system_clock::now() << "]";
|
||||
@@ -287,7 +287,7 @@ void ProcessManager::write_h5(WriterManager& manager, const H5Format& format, Ri
|
||||
cout << "[ProcessManager::write] Closing file " << manager.get_output_file() << endl;
|
||||
#endif
|
||||
|
||||
writer.close_file();
|
||||
writer->close_file();
|
||||
|
||||
#ifdef DEBUG_OUTPUT
|
||||
using namespace date;
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
|
||||
#include "../src/H5Writer.hpp"
|
||||
using namespace std;
|
||||
|
||||
TEST(H5Writer, get_h5_writer)
|
||||
{
|
||||
auto dummy_writer = get_h5_writer("/dev/null");
|
||||
EXPECT_TRUE(dynamic_cast<DummyH5Writer*>(dummy_writer.get()));
|
||||
|
||||
auto real_writer = get_h5_writer("real_file.h5");
|
||||
EXPECT_FALSE(dynamic_cast<DummyH5Writer*>(real_writer.get()));
|
||||
}
|
||||
@@ -1,5 +1,4 @@
|
||||
#include "../src/ZmqReceiver.hpp"
|
||||
#include "../src/ZmqReceiver.hpp"
|
||||
|
||||
using namespace std;
|
||||
namespace pt = boost::property_tree;
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#include "gtest/gtest.h"
|
||||
#include "test_ZmqReceiver.cpp"
|
||||
#include "test_H5Writer.cpp"
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user