version 1.0.0-rc.26

This commit is contained in:
2024-11-26 16:04:38 +01:00
parent 9ab5206c12
commit b3e745a8dd
203 changed files with 2969 additions and 1509 deletions

View File

@@ -4,10 +4,10 @@
#include "ModuleSummation.h"
#include "JFJochException.h"
ModuleSummation::ModuleSummation(bool in_pixel_signed,uint32_t in_fpga_depth_bytes) {
ModuleSummation::ModuleSummation(bool in_pixel_signed, uint32_t in_fpga_depth_bytes) {
pixel_signed = in_pixel_signed;
first = true;
empty = false;
is_empty = false;
output_depth_bytes = 4;
fpga_depth_bytes = in_fpga_depth_bytes;
@@ -20,17 +20,17 @@ ModuleSummation::ModuleSummation(bool in_pixel_signed,uint32_t in_fpga_depth_byt
memset(output.get(), 0, sizeof(DeviceOutput));
}
ModuleSummation::ModuleSummation(const DiffractionExperiment &experiment) :
ModuleSummation(experiment.IsPixelSigned(), experiment.GetByteDepthFPGA()) {
ModuleSummation::ModuleSummation(const DiffractionExperiment &experiment) : ModuleSummation(
experiment.IsPixelSigned(), experiment.GetByteDepthFPGA()) {
if (!experiment.IsCPUSummation())
throw JFJochException(JFJochExceptionCategory::InputParameterInvalid,
"CPU summation not turned on");
"CPU summation not turned on");
if (experiment.GetByteDepthImage() != 4)
throw JFJochException(JFJochExceptionCategory::InputParameterInvalid,
"CPU summation works only for 32-bit output");
"CPU summation works only for 32-bit output");
}
const DeviceOutput& ModuleSummation::GetOutput() const {
const DeviceOutput &ModuleSummation::GetOutput() const {
return *output;
}
@@ -38,8 +38,8 @@ DeviceOutput &ModuleSummation::GetOutput() {
return *output;
}
template <class Tdst, class Tsrc>
void Add(DeviceOutput& output, const DeviceOutput& input) {
template<class Tdst, class Tsrc>
void Add(DeviceOutput &output, const DeviceOutput &input) {
auto in_pixel = reinterpret_cast<const Tsrc *>(input.pixels);
auto out_pixel = reinterpret_cast<Tdst *>(output.pixels);
@@ -50,16 +50,18 @@ void Add(DeviceOutput& output, const DeviceOutput& input) {
if ((in_pixel[i] == err_val_src) || (out_pixel[i] == err_val_dst))
out_pixel[i] = err_val_dst;
else if ((in_pixel[i] == std::numeric_limits<Tsrc>::max())
|| (out_pixel[i] == std::numeric_limits<Tdst>::max())
|| (static_cast<int64_t>(out_pixel[i]) + static_cast<int64_t>(in_pixel[i]) >= std::numeric_limits<Tdst>::max()))
|| (out_pixel[i] == std::numeric_limits<Tdst>::max())
|| (static_cast<int64_t>(out_pixel[i]) + static_cast<int64_t>(in_pixel[i]) >= std::numeric_limits<
Tdst>::max()))
out_pixel[i] = std::numeric_limits<Tdst>::max();
else
out_pixel[i] = out_pixel[i] + in_pixel[i];
}
}
void ModuleSummation::AddFPGAOutput(const DeviceOutput &input) {
void ModuleSummation::AddFPGAOutput(const DeviceOutput &input, const std::optional<uint32_t> &in_fpga_depth_bytes) {
std::unique_lock ul(module_summation_mutex);
if (first) {
output->module_statistics = input.module_statistics;
first = false;
@@ -70,24 +72,30 @@ void ModuleSummation::AddFPGAOutput(const DeviceOutput &input) {
}
// The only function not handled is spot finding
if (fpga_depth_bytes == 2) {
if (pixel_signed)
Add<int32_t, int16_t>(*output, input);
else
Add<uint32_t, uint16_t>(*output, input);
} else if (fpga_depth_bytes == 4) {
if (pixel_signed)
Add<int32_t, int32_t>(*output, input);
else
Add<uint32_t, uint32_t>(*output, input);
} else if (fpga_depth_bytes == 1) {
if (pixel_signed)
Add<int32_t, int8_t>(*output, input);
else
Add<uint32_t, uint8_t>(*output, input);
switch (in_fpga_depth_bytes.value_or(fpga_depth_bytes)) {
case 2:
if (pixel_signed)
Add<int32_t, int16_t>(*output, input);
else
Add<uint32_t, uint16_t>(*output, input);
break;
case 4:
if (pixel_signed)
Add<int32_t, int32_t>(*output, input);
else
Add<uint32_t, uint32_t>(*output, input);
break;
case 1:
if (pixel_signed)
Add<int32_t, int8_t>(*output, input);
else
Add<uint32_t, uint8_t>(*output, input);
break;
default:
throw JFJochException(JFJochExceptionCategory::InputParameterInvalid,
"Unknown bit depth");
}
for (int i = 0; i < FPGA_INTEGRATION_BIN_COUNT; i++) {
output->integration_result[i].count += input.integration_result[i].count;
output->integration_result[i].sum += input.integration_result[i].sum;
@@ -108,11 +116,9 @@ void ModuleSummation::AddFPGAOutput(const DeviceOutput &input) {
}
void ModuleSummation::AddEmptyOutput() {
empty = true;
is_empty = true;
}
bool ModuleSummation::IsEmpty() const {
return empty;
bool ModuleSummation::empty() const {
return is_empty;
}