mirror of
https://github.com/paulscherrerinstitute/sf_daq_buffer.git
synced 2026-04-22 02:14:34 +02:00
101 lines
3.2 KiB
C++
101 lines
3.2 KiB
C++
#include <iostream>
|
|
#include <sstream>
|
|
#include <stdexcept>
|
|
#include <unistd.h>
|
|
#include <string>
|
|
|
|
#include "H5Writer.hpp"
|
|
|
|
using namespace std;
|
|
using namespace std::chrono;
|
|
|
|
void write_frame(H5Writer& writer, size_t index, char* buffer, size_t buffer_length,
|
|
char* metadata_buffer, size_t metadata_buffer_length, size_t n_metadata, size_t n_modules) {
|
|
|
|
writer.write_data("data",
|
|
index,
|
|
buffer,
|
|
{n_modules * 512, 1024},
|
|
buffer_length,
|
|
"uint16",
|
|
"little");
|
|
|
|
for (size_t meta_index=0; meta_index < n_metadata; meta_index++) {
|
|
|
|
writer.write_data(to_string(meta_index),
|
|
index,
|
|
metadata_buffer,
|
|
{n_modules},
|
|
metadata_buffer_length,
|
|
"uint64",
|
|
"little");
|
|
}
|
|
}
|
|
|
|
int main (int argc, char *argv[])
|
|
{
|
|
if (argc != 6) {
|
|
cout << endl;
|
|
cout << "Usage: h5_write_perf [output_file] [n_frames] [n_modules] [frame_rate] [n_metadata]" << endl;
|
|
cout << "\toutput_file: Name of the output file." << endl;
|
|
cout << "\tn_frames: Number of images to write." << endl;
|
|
cout << "\tn_modules: Numbers of 512*1024 modules." << endl;
|
|
cout << "\tframe_rate: Frame rate in Hz." << endl;
|
|
cout << "\tn_metadata: Number of metadata datasets to be written." << endl;
|
|
cout << endl;
|
|
|
|
exit(-1);
|
|
}
|
|
|
|
string output_file = string(argv[1]);
|
|
int n_frames = atoi(argv[2]);
|
|
int n_modules = atoi(argv[3]);
|
|
int frame_rate = atoi(argv[4]);
|
|
int n_metadata = atoi(argv[5]);
|
|
|
|
size_t buffer_length = n_modules * 512 * 1024 * sizeof(u_int16_t);
|
|
char* buffer = new char[buffer_length];
|
|
|
|
size_t metadata_buffer_length = 4 * n_modules;
|
|
char* metadata_buffer = new char[metadata_buffer_length];
|
|
|
|
H5Writer writer(output_file, n_frames, n_frames, n_frames);
|
|
|
|
// Initialize all datasets;
|
|
write_frame(writer, 0, buffer, buffer_length, metadata_buffer, metadata_buffer_length, n_metadata, n_modules);
|
|
|
|
auto total_sleep_time = 0.0;
|
|
auto total_write_time = 0.0;
|
|
auto missed_frames = 0;
|
|
|
|
auto start_time_frame = std::chrono::system_clock::now();
|
|
|
|
for (int index=0; index<n_frames; index++) {
|
|
|
|
write_frame(writer, index, buffer, buffer_length, metadata_buffer, metadata_buffer_length, n_metadata, n_modules);
|
|
|
|
auto time_diff = duration<float, milli>(std::chrono::system_clock::now() - start_time_frame).count();
|
|
auto sleep_time = (1.0/frame_rate*1000) - time_diff;
|
|
|
|
if (sleep_time < 0) {
|
|
cout << "Not in time for frame " << index << endl;
|
|
sleep_time = 0;
|
|
missed_frames++;
|
|
}
|
|
|
|
usleep(sleep_time*1000);
|
|
|
|
total_sleep_time += sleep_time;
|
|
total_write_time += time_diff;
|
|
|
|
start_time_frame = std::chrono::system_clock::now();
|
|
}
|
|
|
|
writer.close_file();
|
|
|
|
cout << "total sleep: " << total_sleep_time/1000 << " total write: " << total_write_time/1000;
|
|
cout << " missed frames: " << missed_frames/float(n_frames)*100 << "%" <<endl;
|
|
|
|
return 0;
|
|
}
|