version 1.0.0-rc.26
This commit is contained in:
@@ -123,6 +123,34 @@ namespace {
|
||||
return ret;
|
||||
}
|
||||
|
||||
UnitCell ProcessUnitCellElement(CborValue &value) {
|
||||
UnitCell unit_cell{};
|
||||
|
||||
CborValue map_value;
|
||||
cborErr(cbor_value_enter_container(&value, &map_value));
|
||||
while (!cbor_value_at_end(&map_value)) {
|
||||
auto key = GetCBORString(map_value);
|
||||
|
||||
if (key == "a")
|
||||
unit_cell.a = GetCBORFloat(map_value);
|
||||
else if (key == "b")
|
||||
unit_cell.b = GetCBORFloat(map_value);
|
||||
else if (key == "c")
|
||||
unit_cell.c = GetCBORFloat(map_value);
|
||||
else if (key == "alpha")
|
||||
unit_cell.alpha = GetCBORFloat(map_value);
|
||||
else if (key == "beta")
|
||||
unit_cell.beta = GetCBORFloat(map_value);
|
||||
else if (key == "gamma")
|
||||
unit_cell.gamma = GetCBORFloat(map_value);
|
||||
else
|
||||
cbor_value_advance(&map_value);
|
||||
}
|
||||
cborErr(cbor_value_leave_container(&value, &map_value));
|
||||
|
||||
return unit_cell;
|
||||
}
|
||||
|
||||
std::pair<uint64_t, uint64_t> GetCBORDimension2DArray(CborValue &value) {
|
||||
std::pair<uint64_t, uint64_t> ret;
|
||||
|
||||
@@ -336,7 +364,7 @@ namespace {
|
||||
|
||||
// Data message
|
||||
SpotToSave GetSpot(CborValue &value) {
|
||||
SpotToSave s;
|
||||
SpotToSave s{};
|
||||
CborValue map_value;
|
||||
|
||||
cborErr(cbor_value_enter_container(&value, &map_value));
|
||||
@@ -370,9 +398,8 @@ namespace {
|
||||
CBORImageType DecodeType(CborValue &value) {
|
||||
if (cbor_value_at_end(&value))
|
||||
throw JFJochException(JFJochExceptionCategory::CBORError, "Message empty");
|
||||
auto key = GetCBORString(value);
|
||||
|
||||
if (key != "type")
|
||||
if (GetCBORString(value) != "type")
|
||||
throw JFJochException(JFJochExceptionCategory::CBORError, "First CBOR entry must by type");
|
||||
|
||||
if (cbor_value_at_end(&value))
|
||||
@@ -381,14 +408,15 @@ namespace {
|
||||
auto type_str = GetCBORString(value);
|
||||
if (type_str == "start")
|
||||
return CBORImageType::START;
|
||||
else if (type_str == "end")
|
||||
if (type_str == "end")
|
||||
return CBORImageType::END;
|
||||
else if (type_str == "image")
|
||||
if (type_str == "image")
|
||||
return CBORImageType::IMAGE;
|
||||
else if (type_str == "calibration")
|
||||
if (type_str == "calibration")
|
||||
return CBORImageType::CALIBRATION;
|
||||
else
|
||||
throw JFJochException(JFJochExceptionCategory::CBORError, "Unknown message type");
|
||||
if (type_str == "metadata")
|
||||
return CBORImageType::METADATA;
|
||||
throw JFJochException(JFJochExceptionCategory::CBORError, "Unknown message type");
|
||||
}
|
||||
|
||||
// Data message
|
||||
@@ -432,97 +460,132 @@ namespace {
|
||||
bool ProcessDataMessageElement(DataMessage &message, CborValue &value) {
|
||||
if (cbor_value_at_end(&value))
|
||||
return false;
|
||||
else {
|
||||
auto key = GetCBORString(value);
|
||||
try {
|
||||
if (key == "image_id")
|
||||
message.number = GetCBORInt(value);
|
||||
else if (key == "original_image_id")
|
||||
message.original_number = GetCBORInt(value);
|
||||
else if (key == "data")
|
||||
ProcessImageData(value, message.image);
|
||||
else if (key == "series_unique_id")
|
||||
message.run_name = GetCBORString(value);
|
||||
else if (key == "series_id")
|
||||
message.run_number = GetCBORUInt(value);
|
||||
else if (key == "real_time") {
|
||||
auto r = GetRational(value);
|
||||
message.exptime = r.first;
|
||||
message.exptime_base = r.second;
|
||||
} else if (key == "start_time") {
|
||||
auto r = GetRational(value);
|
||||
message.timestamp = r.first;
|
||||
message.timestamp_base = r.second;
|
||||
} else if (key == "user_data") {
|
||||
const std::string s = GetCBORString(value);
|
||||
try {
|
||||
message.user_data = nlohmann::json::parse(s);
|
||||
} catch (...) {
|
||||
message.user_data = s;
|
||||
}
|
||||
} else if (key == "spots")
|
||||
GetCBORSpots(message, value);
|
||||
else if (key == "spot_count_in_rings")
|
||||
message.spot_count_in_rings = GetCBORUInt(value);
|
||||
else if (key == "az_int_profile")
|
||||
GetCBORFloatArray(value, message.az_int_profile);
|
||||
else if (key == "indexing_result")
|
||||
message.indexing_result = GetCBORBool(value);
|
||||
else if (key == "indexing_lattice")
|
||||
GetCBORFloatArray(value, message.indexing_lattice);
|
||||
else if (key == "jf_info")
|
||||
message.jf_info = GetCBORUInt(value) & UINT32_MAX;
|
||||
else if (key == "receiver_aq_dev_delay")
|
||||
message.receiver_aq_dev_delay = GetCBORInt(value);
|
||||
else if (key == "receiver_free_send_buf")
|
||||
message.receiver_free_send_buf = GetCBORInt(value);
|
||||
else if (key == "storage_cell")
|
||||
message.storage_cell = GetCBORUInt(value) & UINT32_MAX;
|
||||
else if (key == "xfel_pulse_id")
|
||||
message.xfel_pulse_id = GetCBORUInt(value);
|
||||
else if (key == "xfel_event_code")
|
||||
message.xfel_event_code = GetCBORUInt(value);
|
||||
else if (key == "saturated_pixel_count")
|
||||
message.saturated_pixel_count = GetCBORUInt(value);
|
||||
else if (key == "error_pixel_count")
|
||||
message.error_pixel_count = GetCBORUInt(value);
|
||||
else if (key == "strong_pixel_count")
|
||||
message.strong_pixel_count = GetCBORUInt(value);
|
||||
else if (key == "data_collection_efficiency")
|
||||
message.image_collection_efficiency = GetCBORFloat(value);
|
||||
else if (key == "bkg_estimate")
|
||||
message.bkg_estimate = GetCBORFloat(value);
|
||||
else if (key == "adu_histogram")
|
||||
GetCBORUInt64Array(value, message.adu_histogram);
|
||||
else if (key == "roi_integrals")
|
||||
ProcessROIElementMap(message, value);
|
||||
else {
|
||||
if (cbor_value_is_tag(&value))
|
||||
cbor_value_advance(&value);
|
||||
cbor_value_advance(&value);
|
||||
|
||||
const auto key = GetCBORString(value);
|
||||
try {
|
||||
if (key == "image_id")
|
||||
message.number = GetCBORInt(value);
|
||||
else if (key == "original_image_id")
|
||||
message.original_number = GetCBORInt(value);
|
||||
else if (key == "data")
|
||||
ProcessImageData(value, message.image);
|
||||
else if (key == "series_unique_id")
|
||||
message.run_name = GetCBORString(value);
|
||||
else if (key == "series_id")
|
||||
message.run_number = GetCBORUInt(value);
|
||||
else if (key == "real_time") {
|
||||
auto r = GetRational(value);
|
||||
message.exptime = r.first;
|
||||
message.exptime_base = r.second;
|
||||
} else if (key == "start_time") {
|
||||
auto r = GetRational(value);
|
||||
message.timestamp = r.first;
|
||||
message.timestamp_base = r.second;
|
||||
} else if (key == "user_data") {
|
||||
const std::string s = GetCBORString(value);
|
||||
try {
|
||||
message.user_data = nlohmann::json::parse(s);
|
||||
} catch (...) {
|
||||
message.user_data = s;
|
||||
}
|
||||
return true;
|
||||
} catch (const JFJochException &e) {
|
||||
throw JFJochException(JFJochExceptionCategory::CBORError,
|
||||
"Error processing image message, key " + key + ":" + e.what());
|
||||
} else if (key == "spots")
|
||||
GetCBORSpots(message, value);
|
||||
else if (key == "spot_count_in_rings")
|
||||
message.spot_count_in_rings = GetCBORUInt(value);
|
||||
else if (key == "az_int_profile")
|
||||
GetCBORFloatArray(value, message.az_int_profile);
|
||||
else if (key == "indexing_result")
|
||||
message.indexing_result = GetCBORBool(value);
|
||||
else if (key == "indexing_lattice")
|
||||
GetCBORFloatArray(value, message.indexing_lattice);
|
||||
else if (key == "indexing_unit_cell")
|
||||
message.indexing_unit_cell = ProcessUnitCellElement(value);
|
||||
else if (key == "jf_info")
|
||||
message.jf_info = GetCBORUInt(value) & UINT32_MAX;
|
||||
else if (key == "receiver_aq_dev_delay")
|
||||
message.receiver_aq_dev_delay = GetCBORInt(value);
|
||||
else if (key == "receiver_free_send_buf")
|
||||
message.receiver_free_send_buf = GetCBORInt(value);
|
||||
else if (key == "storage_cell")
|
||||
message.storage_cell = GetCBORUInt(value) & UINT32_MAX;
|
||||
else if (key == "xfel_pulse_id")
|
||||
message.xfel_pulse_id = GetCBORUInt(value);
|
||||
else if (key == "xfel_event_code")
|
||||
message.xfel_event_code = GetCBORUInt(value);
|
||||
else if (key == "saturated_pixel_count")
|
||||
message.saturated_pixel_count = GetCBORUInt(value);
|
||||
else if (key == "error_pixel_count")
|
||||
message.error_pixel_count = GetCBORUInt(value);
|
||||
else if (key == "strong_pixel_count")
|
||||
message.strong_pixel_count = GetCBORUInt(value);
|
||||
else if (key == "data_collection_efficiency")
|
||||
message.image_collection_efficiency = GetCBORFloat(value);
|
||||
else if (key == "bkg_estimate")
|
||||
message.bkg_estimate = GetCBORFloat(value);
|
||||
else if (key == "adu_histogram")
|
||||
GetCBORUInt64Array(value, message.adu_histogram);
|
||||
else if (key == "roi_integrals")
|
||||
ProcessROIElementMap(message, value);
|
||||
else {
|
||||
if (cbor_value_is_tag(&value))
|
||||
cbor_value_advance(&value);
|
||||
cbor_value_advance(&value);
|
||||
}
|
||||
return true;
|
||||
} catch (const JFJochException &e) {
|
||||
throw JFJochException(JFJochExceptionCategory::CBORError,
|
||||
"Error processing image message, key " + key + ":" + e.what());
|
||||
}
|
||||
}
|
||||
|
||||
bool ProcessMetadataImagesElement(MetadataMessage &metadata, CborValue &value) {
|
||||
if (cbor_value_at_end(&value))
|
||||
return false;
|
||||
if (!cbor_value_is_map(&value))
|
||||
throw JFJochException(JFJochExceptionCategory::CBORError, "images@metadata must be map");
|
||||
|
||||
CborValue map_value;
|
||||
cborErr(cbor_value_enter_container(&value, &map_value));
|
||||
|
||||
DataMessage message{};
|
||||
while (ProcessDataMessageElement(message, map_value)) {}
|
||||
metadata.images.push_back(std::move(message));
|
||||
cborErr(cbor_value_leave_container(&value, &map_value));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ProcessMetadataMessageElement(MetadataMessage &metadata, CborValue &value) {
|
||||
if (cbor_value_at_end(&value))
|
||||
return false;
|
||||
|
||||
const auto key = GetCBORString(value);
|
||||
try {
|
||||
if (key == "series_unique_id")
|
||||
metadata.run_name = GetCBORString(value);
|
||||
else if (key == "series_id")
|
||||
metadata.run_number = GetCBORUInt(value);
|
||||
else if (key == "images") {
|
||||
if (!cbor_value_is_array(&value))
|
||||
throw JFJochException(JFJochExceptionCategory::CBORError, "images@metadata must be array");
|
||||
|
||||
CborValue array_value;
|
||||
cborErr(cbor_value_enter_container(&value, &array_value));
|
||||
while (ProcessMetadataImagesElement(metadata, array_value)) {}
|
||||
cborErr(cbor_value_leave_container(&value, &array_value));
|
||||
} else {
|
||||
if (cbor_value_is_tag(&value))
|
||||
cbor_value_advance(&value);
|
||||
cbor_value_advance(&value);
|
||||
}
|
||||
return true;
|
||||
} catch (const JFJochException &e) {
|
||||
throw JFJochException(JFJochExceptionCategory::CBORError,
|
||||
"Error processing image message, key " + key + ":" + e.what());
|
||||
}
|
||||
}
|
||||
|
||||
// Start message
|
||||
void ProcessChannels(StartMessage &message, CborValue &value) {
|
||||
if (!cbor_value_is_array(&value))
|
||||
throw JFJochException(JFJochExceptionCategory::CBORError, "Array expected");
|
||||
CborValue array_value;
|
||||
cborErr(cbor_value_enter_container(&value, &array_value));
|
||||
while (!cbor_value_at_end(&array_value)) {
|
||||
const std::string s = GetCBORString(array_value);
|
||||
message.channels.push_back(s);
|
||||
}
|
||||
cborErr(cbor_value_leave_container(&value, &array_value));
|
||||
}
|
||||
|
||||
|
||||
void ProcessAxis(CborValue &value, float v[3]) {
|
||||
if (GetCBORArrayLen(value) != 3)
|
||||
throw JFJochException(JFJochExceptionCategory::CBORError, "Array with 3 floats expected");
|
||||
@@ -535,7 +598,7 @@ namespace {
|
||||
}
|
||||
|
||||
GoniometerAxis ProcessGoniometerOmega(std::string &name, CborValue &value) {
|
||||
GoniometerAxis ret;
|
||||
GoniometerAxis ret{};
|
||||
ret.name = name;
|
||||
|
||||
CborValue map_value;
|
||||
@@ -585,34 +648,6 @@ namespace {
|
||||
cborErr(cbor_value_leave_container(&value, &map_value));
|
||||
}
|
||||
|
||||
void ProcessUnitCellElement(StartMessage &message, CborValue &value) {
|
||||
UnitCell unit_cell{};
|
||||
|
||||
CborValue map_value;
|
||||
cborErr(cbor_value_enter_container(&value, &map_value));
|
||||
while (!cbor_value_at_end(&map_value)) {
|
||||
auto key = GetCBORString(map_value);
|
||||
|
||||
if (key == "a")
|
||||
unit_cell.a = GetCBORFloat(map_value);
|
||||
else if (key == "b")
|
||||
unit_cell.b = GetCBORFloat(map_value);
|
||||
else if (key == "c")
|
||||
unit_cell.c = GetCBORFloat(map_value);
|
||||
else if (key == "alpha")
|
||||
unit_cell.alpha = GetCBORFloat(map_value);
|
||||
else if (key == "beta")
|
||||
unit_cell.beta = GetCBORFloat(map_value);
|
||||
else if (key == "gamma")
|
||||
unit_cell.gamma = GetCBORFloat(map_value);
|
||||
else
|
||||
cbor_value_advance(&map_value);
|
||||
}
|
||||
cborErr(cbor_value_leave_container(&value, &map_value));
|
||||
|
||||
message.unit_cell = unit_cell;
|
||||
}
|
||||
|
||||
void ProcessStartUserData(StartMessage &message, CborValue &value) {
|
||||
try {
|
||||
const std::string s = GetCBORString(value);
|
||||
@@ -671,120 +706,118 @@ namespace {
|
||||
bool ProcessStartMessageElement(StartMessage &message, CborValue &value) {
|
||||
if (cbor_value_at_end(&value))
|
||||
return false;
|
||||
else {
|
||||
auto key = GetCBORString(value);
|
||||
try {
|
||||
if (key == "magic_number")
|
||||
CheckMagicNumber(value);
|
||||
else if (key == "beam_center_x")
|
||||
message.beam_center_x = GetCBORFloat(value);
|
||||
else if (key == "beam_center_y")
|
||||
message.beam_center_y = GetCBORFloat(value);
|
||||
else if (key == "detector_distance")
|
||||
message.detector_distance = GetCBORFloat(value);
|
||||
else if (key == "number_of_images")
|
||||
message.number_of_images = GetCBORUInt(value);
|
||||
else if (key == "countrate_correction_enabled")
|
||||
message.countrate_correction_enabled = GetCBORBool(value);
|
||||
else if (key == "flatfield_enabled")
|
||||
message.flatfield_enabled = GetCBORBool(value);
|
||||
else if (key == "image_size_x")
|
||||
message.image_size_x = GetCBORUInt(value);
|
||||
else if (key == "image_size_y")
|
||||
message.image_size_y = GetCBORUInt(value);
|
||||
else if (key == "incident_energy")
|
||||
message.incident_energy = GetCBORFloat(value);
|
||||
else if (key == "incident_wavelength")
|
||||
message.incident_wavelength = GetCBORFloat(value);
|
||||
else if (key == "frame_time")
|
||||
message.frame_time = GetCBORFloat(value);
|
||||
else if (key == "count_time")
|
||||
message.count_time = GetCBORFloat(value);
|
||||
else if (key == "saturation_value")
|
||||
message.saturation_value = GetCBORInt(value);
|
||||
else if (key == "error_value")
|
||||
message.error_value = GetCBORInt(value);
|
||||
else if (key == "pixel_size_x")
|
||||
message.pixel_size_x = GetCBORFloat(value);
|
||||
else if (key == "pixel_size_y")
|
||||
message.pixel_size_y = GetCBORFloat(value);
|
||||
else if (key == "sensor_thickness")
|
||||
message.sensor_thickness = GetCBORFloat(value);
|
||||
else if (key == "sensor_material")
|
||||
message.sensor_material = GetCBORString(value);
|
||||
else if (key == "detector_description")
|
||||
message.detector_description = GetCBORString(value);
|
||||
else if (key == "detector_serial_number")
|
||||
message.detector_serial_number = GetCBORString(value);
|
||||
else if (key == "series_unique_id")
|
||||
message.run_name = GetCBORString(value);
|
||||
else if (key == "series_id")
|
||||
message.run_number = GetCBORUInt(value);
|
||||
else if (key == "pixel_mask")
|
||||
ProcessPixelMaskElement(message, value);
|
||||
else if (key == "channels")
|
||||
GetCBORStringArray(value, message.channels);
|
||||
else if (key == "detector_translation")
|
||||
ProcessAxis(value, message.detector_translation);
|
||||
else if (key == "goniometer")
|
||||
ProcessGoniometerMap(message, value);
|
||||
else if (key == "pixel_mask_enabled")
|
||||
message.pixel_mask_enabled = GetCBORBool(value);
|
||||
else if (key == "jungfrau_conversion_enabled")
|
||||
message.jungfrau_conversion_enabled = GetCBORBool(value);
|
||||
else if (key == "geometry_transformation_enabled")
|
||||
message.geometry_transformation_enabled = GetCBORBool(value);
|
||||
else if (key == "jungfrau_conversion_factor")
|
||||
message.jungfrau_conversion_factor = GetCBORFloat(value);
|
||||
else if (key == "arm_date")
|
||||
message.arm_date = GetCBORDateTime(value);
|
||||
else if (key == "user_data")
|
||||
ProcessStartUserData(message, value);
|
||||
else if (key == "unit_cell")
|
||||
ProcessUnitCellElement(message, value);
|
||||
else if (key == "max_spot_count")
|
||||
message.max_spot_count = GetCBORUInt(value);
|
||||
else if (key == "image_dtype") {
|
||||
auto val = GetCBORString(value);
|
||||
if (val == "uint8") {
|
||||
message.pixel_signed = false;
|
||||
message.bit_depth_image = 8;
|
||||
} else if (val == "int8") {
|
||||
message.pixel_signed = true;
|
||||
message.bit_depth_image = 8;
|
||||
} else if (val == "uint16") {
|
||||
message.pixel_signed = false;
|
||||
message.bit_depth_image = 16;
|
||||
} else if (val == "int16") {
|
||||
message.pixel_signed = true;
|
||||
message.bit_depth_image = 16;
|
||||
} else if (val == "uint32") {
|
||||
message.pixel_signed = false;
|
||||
message.bit_depth_image = 32;
|
||||
} else if (val == "int32") {
|
||||
message.pixel_signed = true;
|
||||
message.bit_depth_image = 32;
|
||||
}
|
||||
} else if (key == "az_int_bin_number")
|
||||
message.az_int_bin_number = GetCBORInt(value);
|
||||
else if (key == "az_int_bin_to_q")
|
||||
GetCBORFloatArray(value, message.az_int_bin_to_q);
|
||||
else if (key == "summation")
|
||||
message.summation = GetCBORUInt(value);
|
||||
else if (key == "storage_cell_number")
|
||||
message.storage_cell_number = GetCBORUInt(value);
|
||||
else if (key == "storage_cell_delay")
|
||||
message.storage_cell_delay_ns = GetRational(value).first;
|
||||
else {
|
||||
if (cbor_value_is_tag(&value))
|
||||
cbor_value_advance(&value);
|
||||
cbor_value_advance(&value);
|
||||
const auto key = GetCBORString(value);
|
||||
try {
|
||||
if (key == "magic_number")
|
||||
CheckMagicNumber(value);
|
||||
else if (key == "beam_center_x")
|
||||
message.beam_center_x = GetCBORFloat(value);
|
||||
else if (key == "beam_center_y")
|
||||
message.beam_center_y = GetCBORFloat(value);
|
||||
else if (key == "detector_distance")
|
||||
message.detector_distance = GetCBORFloat(value);
|
||||
else if (key == "number_of_images")
|
||||
message.number_of_images = GetCBORUInt(value);
|
||||
else if (key == "countrate_correction_enabled")
|
||||
message.countrate_correction_enabled = GetCBORBool(value);
|
||||
else if (key == "flatfield_enabled")
|
||||
message.flatfield_enabled = GetCBORBool(value);
|
||||
else if (key == "image_size_x")
|
||||
message.image_size_x = GetCBORUInt(value);
|
||||
else if (key == "image_size_y")
|
||||
message.image_size_y = GetCBORUInt(value);
|
||||
else if (key == "incident_energy")
|
||||
message.incident_energy = GetCBORFloat(value);
|
||||
else if (key == "incident_wavelength")
|
||||
message.incident_wavelength = GetCBORFloat(value);
|
||||
else if (key == "frame_time")
|
||||
message.frame_time = GetCBORFloat(value);
|
||||
else if (key == "count_time")
|
||||
message.count_time = GetCBORFloat(value);
|
||||
else if (key == "saturation_value")
|
||||
message.saturation_value = GetCBORInt(value);
|
||||
else if (key == "error_value")
|
||||
message.error_value = GetCBORInt(value);
|
||||
else if (key == "pixel_size_x")
|
||||
message.pixel_size_x = GetCBORFloat(value);
|
||||
else if (key == "pixel_size_y")
|
||||
message.pixel_size_y = GetCBORFloat(value);
|
||||
else if (key == "sensor_thickness")
|
||||
message.sensor_thickness = GetCBORFloat(value);
|
||||
else if (key == "sensor_material")
|
||||
message.sensor_material = GetCBORString(value);
|
||||
else if (key == "detector_description")
|
||||
message.detector_description = GetCBORString(value);
|
||||
else if (key == "detector_serial_number")
|
||||
message.detector_serial_number = GetCBORString(value);
|
||||
else if (key == "series_unique_id")
|
||||
message.run_name = GetCBORString(value);
|
||||
else if (key == "series_id")
|
||||
message.run_number = GetCBORUInt(value);
|
||||
else if (key == "pixel_mask")
|
||||
ProcessPixelMaskElement(message, value);
|
||||
else if (key == "channels")
|
||||
GetCBORStringArray(value, message.channels);
|
||||
else if (key == "detector_translation")
|
||||
ProcessAxis(value, message.detector_translation);
|
||||
else if (key == "goniometer")
|
||||
ProcessGoniometerMap(message, value);
|
||||
else if (key == "pixel_mask_enabled")
|
||||
message.pixel_mask_enabled = GetCBORBool(value);
|
||||
else if (key == "jungfrau_conversion_enabled")
|
||||
message.jungfrau_conversion_enabled = GetCBORBool(value);
|
||||
else if (key == "geometry_transformation_enabled")
|
||||
message.geometry_transformation_enabled = GetCBORBool(value);
|
||||
else if (key == "jungfrau_conversion_factor")
|
||||
message.jungfrau_conversion_factor = GetCBORFloat(value);
|
||||
else if (key == "arm_date")
|
||||
message.arm_date = GetCBORDateTime(value);
|
||||
else if (key == "user_data")
|
||||
ProcessStartUserData(message, value);
|
||||
else if (key == "unit_cell")
|
||||
message.unit_cell = ProcessUnitCellElement(value);
|
||||
else if (key == "max_spot_count")
|
||||
message.max_spot_count = GetCBORUInt(value);
|
||||
else if (key == "image_dtype") {
|
||||
auto val = GetCBORString(value);
|
||||
if (val == "uint8") {
|
||||
message.pixel_signed = false;
|
||||
message.bit_depth_image = 8;
|
||||
} else if (val == "int8") {
|
||||
message.pixel_signed = true;
|
||||
message.bit_depth_image = 8;
|
||||
} else if (val == "uint16") {
|
||||
message.pixel_signed = false;
|
||||
message.bit_depth_image = 16;
|
||||
} else if (val == "int16") {
|
||||
message.pixel_signed = true;
|
||||
message.bit_depth_image = 16;
|
||||
} else if (val == "uint32") {
|
||||
message.pixel_signed = false;
|
||||
message.bit_depth_image = 32;
|
||||
} else if (val == "int32") {
|
||||
message.pixel_signed = true;
|
||||
message.bit_depth_image = 32;
|
||||
}
|
||||
return true;
|
||||
} catch (const JFJochException &e) {
|
||||
throw JFJochException(JFJochExceptionCategory::CBORError,
|
||||
"Error processing start message, key " + key + ":" + e.what());
|
||||
} else if (key == "az_int_bin_number")
|
||||
message.az_int_bin_number = GetCBORInt(value);
|
||||
else if (key == "az_int_bin_to_q")
|
||||
GetCBORFloatArray(value, message.az_int_bin_to_q);
|
||||
else if (key == "summation")
|
||||
message.summation = GetCBORUInt(value);
|
||||
else if (key == "storage_cell_number")
|
||||
message.storage_cell_number = GetCBORUInt(value);
|
||||
else if (key == "storage_cell_delay")
|
||||
message.storage_cell_delay_ns = GetRational(value).first;
|
||||
else {
|
||||
if (cbor_value_is_tag(&value))
|
||||
cbor_value_advance(&value);
|
||||
cbor_value_advance(&value);
|
||||
}
|
||||
return true;
|
||||
} catch (const JFJochException &e) {
|
||||
throw JFJochException(JFJochExceptionCategory::CBORError,
|
||||
"Error processing start message, key " + key + ":" + e.what());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -839,38 +872,41 @@ namespace {
|
||||
bool ProcessEndMessageElement(EndMessage &message, CborValue &value) {
|
||||
if (cbor_value_at_end(&value))
|
||||
return false;
|
||||
else {
|
||||
auto key = GetCBORString(value);
|
||||
try {
|
||||
if (key == "end_date")
|
||||
message.end_date = GetCBORString(value);
|
||||
else if (key == "series_unique_id")
|
||||
message.run_name = GetCBORString(value);
|
||||
else if (key == "series_id")
|
||||
message.run_number = GetCBORUInt(value);
|
||||
else if (key == "max_image_number")
|
||||
message.max_image_number = GetCBORUInt(value);
|
||||
else if (key == "images_collected")
|
||||
message.images_collected_count = GetCBORUInt(value);
|
||||
else if (key == "images_sent_to_write")
|
||||
message.images_sent_to_write_count = GetCBORUInt(value);
|
||||
else if (key == "max_receiver_delay")
|
||||
message.max_receiver_delay = GetCBORUInt(value);
|
||||
else if (key == "data_collection_efficiency")
|
||||
message.efficiency = GetCBORFloat(value);
|
||||
else if (key == "az_int_result")
|
||||
ProcessRadIntResultElement(message, value);
|
||||
else if (key == "adu_histogram")
|
||||
ProcessADUHistogramElement(message, value);
|
||||
else if (key == "adu_histogram_bin_width")
|
||||
message.adu_histogram_bin_width = GetCBORUInt(value);
|
||||
else
|
||||
cbor_value_advance(&value);
|
||||
return true;
|
||||
} catch (const JFJochException &e) {
|
||||
throw JFJochException(JFJochExceptionCategory::CBORError,
|
||||
"Error processing end message, key " + key + ":" + e.what());
|
||||
}
|
||||
|
||||
auto key = GetCBORString(value);
|
||||
try {
|
||||
if (key == "end_date")
|
||||
message.end_date = GetCBORString(value);
|
||||
else if (key == "series_unique_id")
|
||||
message.run_name = GetCBORString(value);
|
||||
else if (key == "series_id")
|
||||
message.run_number = GetCBORUInt(value);
|
||||
else if (key == "max_image_number")
|
||||
message.max_image_number = GetCBORUInt(value);
|
||||
else if (key == "images_collected")
|
||||
message.images_collected_count = GetCBORUInt(value);
|
||||
else if (key == "images_sent_to_write")
|
||||
message.images_sent_to_write_count = GetCBORUInt(value);
|
||||
else if (key == "max_receiver_delay")
|
||||
message.max_receiver_delay = GetCBORUInt(value);
|
||||
else if (key == "data_collection_efficiency")
|
||||
message.efficiency = GetCBORFloat(value);
|
||||
else if (key == "az_int_result")
|
||||
ProcessRadIntResultElement(message, value);
|
||||
else if (key == "adu_histogram")
|
||||
ProcessADUHistogramElement(message, value);
|
||||
else if (key == "adu_histogram_bin_width")
|
||||
message.adu_histogram_bin_width = GetCBORUInt(value);
|
||||
else if (key == "bkg_estimate")
|
||||
message.bkg_estimate = GetCBORFloat(value);
|
||||
else if (key == "indexing_rate")
|
||||
message.indexing_rate = GetCBORFloat(value);
|
||||
else
|
||||
cbor_value_advance(&value);
|
||||
return true;
|
||||
} catch (const JFJochException &e) {
|
||||
throw JFJochException(JFJochExceptionCategory::CBORError,
|
||||
"Error processing end message, key " + key + ":" + e.what());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -895,21 +931,25 @@ std::shared_ptr<CBORStream2DeserializerOutput> CBORStream2Deserialize(const uint
|
||||
switch (ret->msg_type) {
|
||||
case CBORImageType::IMAGE:
|
||||
ret->data_message = DataMessage();
|
||||
while (ProcessDataMessageElement(*ret->data_message, map_value));
|
||||
while (ProcessDataMessageElement(*ret->data_message, map_value)) {}
|
||||
break;
|
||||
case CBORImageType::CALIBRATION: {
|
||||
ret->calibration = CompressedImage();
|
||||
while (ProcessCalibration(*ret->calibration, map_value));
|
||||
while (ProcessCalibration(*ret->calibration, map_value)) {}
|
||||
break;
|
||||
}
|
||||
case CBORImageType::START: {
|
||||
ret->start_message = StartMessage();
|
||||
while (ProcessStartMessageElement(*ret->start_message, map_value));
|
||||
while (ProcessStartMessageElement(*ret->start_message, map_value)) {}
|
||||
break;
|
||||
}
|
||||
case CBORImageType::END:
|
||||
ret->end_message = EndMessage();
|
||||
while (ProcessEndMessageElement(*ret->end_message, map_value));
|
||||
while (ProcessEndMessageElement(*ret->end_message, map_value)) {}
|
||||
break;
|
||||
case CBORImageType::METADATA:
|
||||
ret->metadata = MetadataMessage();
|
||||
while (ProcessMetadataMessageElement(*ret->metadata, map_value)) {}
|
||||
break;
|
||||
case CBORImageType::NONE:
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user