Fixes for thread-safety and logic issues
This commit is contained in:
@@ -31,9 +31,7 @@ void AcquisitionCounters::Reset(const DiffractionExperiment &experiment, uint16_
|
||||
curr_frame_number[i] = 0;
|
||||
|
||||
handle_for_frame = std::vector<uint64_t>(expected_frames * nmodules, HandleNotFound);
|
||||
handle_for_pedestal = std::vector<uint64_t>(nmodules * 16, HandleNotFound); // 16 = storage cells
|
||||
packets_collected = std::vector<uint16_t>(expected_frames * nmodules);
|
||||
saved_completions = std::vector<Completion>(expected_frames * nmodules);
|
||||
packets_per_module = std::vector<uint64_t>(nmodules);
|
||||
total_packets = 0;
|
||||
expected_packets_per_module = 512 * experiment.GetFPGASummation();
|
||||
@@ -76,7 +74,6 @@ void AcquisitionCounters::UpdateCounters(const Completion *c) {
|
||||
|
||||
packets_collected.at(c->frame_number * nmodules + c->module_number) = c->packet_count;
|
||||
handle_for_frame.at(c->frame_number * nmodules + c->module_number) = c->handle;
|
||||
saved_completions.at(c->frame_number * nmodules + c->module_number) = *c;
|
||||
|
||||
total_packets += c->packet_count;
|
||||
packets_per_module[c->module_number] += c->packet_count;
|
||||
@@ -91,6 +88,7 @@ void AcquisitionCounters::SetAcquisitionFinished() {
|
||||
}
|
||||
|
||||
uint64_t AcquisitionCounters::GetBufferHandle(size_t frame, uint16_t module_number) const {
|
||||
std::shared_lock sl(m);
|
||||
if (frame >= expected_frames)
|
||||
throw JFJochException(JFJochExceptionCategory::ArrayOutOfBounds,
|
||||
"GetBufferHandle Wrong frame number: " + std::to_string(frame));
|
||||
@@ -115,18 +113,6 @@ uint64_t AcquisitionCounters::GetBufferHandleAndClear(size_t frame, uint16_t mod
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
uint64_t AcquisitionCounters::GetPedestalBufferHandle(size_t storage_cell, uint16_t module_number) const {
|
||||
std::unique_lock ul(m);
|
||||
if (storage_cell >= 16)
|
||||
throw JFJochException(JFJochExceptionCategory::ArrayOutOfBounds,
|
||||
"GetBufferHandleAndClear Wrong frame number: " + std::to_string(storage_cell));
|
||||
if (module_number >= nmodules)
|
||||
throw JFJochException(JFJochExceptionCategory::ArrayOutOfBounds,
|
||||
"GetBufferHandleAndClear Wrong module number: " + std::to_string(module_number)
|
||||
+ " for SC " + std::to_string(storage_cell));
|
||||
return handle_for_pedestal.at(storage_cell * nmodules + module_number);
|
||||
}
|
||||
|
||||
uint64_t AcquisitionCounters::GetCurrFrameNumber(uint16_t module_number) const {
|
||||
if (module_number >= max_modules)
|
||||
throw JFJochException(JFJochExceptionCategory::ArrayOutOfBounds,
|
||||
@@ -207,7 +193,7 @@ uint64_t AcquisitionCounters::GetTotalPackets() const {
|
||||
}
|
||||
|
||||
uint64_t AcquisitionCounters::GetTotalPackets(uint16_t module_number) const {
|
||||
std::unique_lock ul(m);
|
||||
std::shared_lock sl(m);
|
||||
|
||||
if (module_number >= nmodules)
|
||||
throw JFJochException(JFJochExceptionCategory::ArrayOutOfBounds,
|
||||
|
||||
@@ -22,11 +22,8 @@ class AcquisitionCounters {
|
||||
mutable std::condition_variable_any data_updated;
|
||||
|
||||
std::vector<uint64_t> handle_for_frame;
|
||||
std::vector<uint64_t> handle_for_pedestal;
|
||||
std::vector<uint16_t> packets_collected;
|
||||
|
||||
std::vector<Completion> saved_completions;
|
||||
|
||||
uint64_t total_packets;
|
||||
std::vector<uint64_t> packets_per_module;
|
||||
|
||||
@@ -56,7 +53,6 @@ public:
|
||||
void WaitForFrame(size_t curr_frame, uint16_t module_number = UINT16_MAX) const;
|
||||
int64_t CalculateDelay(size_t curr_frame, uint16_t module_number = UINT16_MAX) const; // mutex acquired indirectly
|
||||
uint64_t GetBufferHandle(size_t frame, uint16_t module_number) const;
|
||||
uint64_t GetPedestalBufferHandle(size_t storage_cell, uint16_t module_number) const;
|
||||
bool IsFullModuleCollected(size_t frame, uint16_t module_number) const;
|
||||
bool IsAnyPacketCollected(size_t frame, uint16_t module_number) const;
|
||||
bool IsAcquisitionFinished() const;
|
||||
|
||||
@@ -294,8 +294,8 @@ DeviceStatus AcquisitionDevice::GetDeviceStatus() const {
|
||||
AcquisitionDeviceStatistics AcquisitionDevice::GetStatistics() const {
|
||||
AcquisitionDeviceStatistics ret{};
|
||||
ret.bytes_received = GetBytesReceived();
|
||||
ret.start_timestamp = start_time.time_since_epoch().count();
|
||||
ret.end_timestamp = end_time.time_since_epoch().count();
|
||||
ret.start_timestamp = std::chrono::system_clock::to_time_t(start_time);
|
||||
ret.end_timestamp = std::chrono::system_clock::to_time_t(end_time);
|
||||
ret.packets_expected = counters.GetTotalExpectedPackets();
|
||||
ret.good_packets = counters.GetTotalPackets();
|
||||
|
||||
|
||||
@@ -123,7 +123,7 @@ void FPGAAcquisitionDevice::InitializeIntegrationMap(const uint16_t *map, const
|
||||
}
|
||||
|
||||
void FPGAAcquisitionDevice::SetInternalGeneratorFrame(const uint16_t *input, size_t module_number) {
|
||||
memcpy(buffer_device[0], input, RAW_MODULE_SIZE * sizeof(uint16_t));
|
||||
memcpy(buffer_device[0]->pixels, input, RAW_MODULE_SIZE * sizeof(uint16_t));
|
||||
buffer_device[0]->module_statistics.module_number = module_number;
|
||||
buffer_device[0]->module_statistics.load_calibration_destination = LOAD_CALIBRATION_DEST_FRAME_GEN;
|
||||
LoadCalibration(0);
|
||||
|
||||
Reference in New Issue
Block a user