Refactor how frames are sent from receiver

This commit is contained in:
2024-04-14 21:47:06 +02:00
parent 5a793a9260
commit 85a169ec19
85 changed files with 1385 additions and 3656 deletions

View File

@@ -309,14 +309,9 @@ void GetCBORMultidimTypedArray(CompressedImage &v, CborValue &value) {
}
bool CheckMagicNumber(CborValue &v) {
auto key = GetCBORString(v);
if (key != "magic_number") {
cbor_value_advance(&v);
return false;
} else {
return GetCBORUInt(v) == user_data_magic_number;
}
void CheckMagicNumber(CborValue &v) {
if (GetCBORUInt(v) != user_data_magic_number)
throw JFJochException(JFJochExceptionCategory::CBORError, "Inconsistency between Jungfraujoch server and writer");
}
inline SpotToSave GetSpot(CborValue& value) {
@@ -370,6 +365,8 @@ void CBORStream2Deserializer::DecodeType(CborValue &value) {
msg_type = Type::END;
else if (type_str == "image")
msg_type = Type::IMAGE;
else if (type_str == "calibration")
msg_type = Type::CALIBRATION;
else
throw JFJochException(JFJochExceptionCategory::CBORError, "Unknown message type");
}
@@ -423,7 +420,7 @@ bool CBORStream2Deserializer::ProcessImageMessageElement(CborValue &value) {
if (key == "image_id")
data_message.number = GetCBORInt(value);
else if (key == "data")
ProcessImageData(value);
ProcessImageData(value, data_message.image);
else if (key == "series_unique_id")
data_message.series_unique_id = GetCBORString(value);
else if (key == "series_id")
@@ -450,6 +447,8 @@ bool CBORStream2Deserializer::ProcessImageMessageElement(CborValue &value) {
data_message.jf_info = GetCBORUInt(value) & UINT32_MAX;
else if (key == "receiver_aq_dev_delay")
data_message.receiver_aq_dev_delay = GetCBORInt(value);
else if (key == "receiver_free_send_buf")
data_message.receiver_free_send_buf = GetCBORInt(value);
else if (key == "storage_cell")
data_message.storage_cell = GetCBORUInt(value) & UINT32_MAX;
else if (key == "xfel_pulse_id")
@@ -482,23 +481,6 @@ bool CBORStream2Deserializer::ProcessImageMessageElement(CborValue &value) {
}
}
void CBORStream2Deserializer::ProcessCalibration(CborValue &value) {
// For calibration and mask - image might be accessed later on - so it is saved in internal storage of the object
// It allows the original start message to be lost
CborValue map_value;
cborErr(cbor_value_enter_container(&value, &map_value));
while (! cbor_value_at_end(&map_value)) {
auto key = GetCBORString(map_value);
CompressedImage image;
image.channel = key;
GetCBORMultidimTypedArray(image, map_value);
image.Save();
start_message.calibration.emplace_back(std::move(image));
}
cborErr(cbor_value_leave_container(&value, &map_value));
}
void CBORStream2Deserializer::ProcessPixelMaskElement(CborValue &value) {
// For calibration and mask - image might be accessed later on - so it is saved in internal storage of the object
// It allows the original start message to be lost
@@ -509,7 +491,6 @@ void CBORStream2Deserializer::ProcessPixelMaskElement(CborValue &value) {
CompressedImage image;
image.channel = key;
GetCBORMultidimTypedArray(image, map_value);
image.Save();
start_message.pixel_mask.emplace_back(std::move(image));
}
cborErr(cbor_value_leave_container(&value, &map_value));
@@ -651,6 +632,8 @@ void CBORStream2Deserializer::ProcessStartUserData(CborValue &value) {
start_message.gain_file_names = j["gain_file_names"];
if (j.contains("roi_names"))
start_message.roi_names = j["roi_names"];
if (j.contains("write_master_file"))
start_message.write_master_file = j["write_master_file"];
} catch (const std::exception &e) {
throw JFJochException(JFJochExceptionCategory::CBORError, "Cannot parse user_data as valid JSON " + std::string(e.what()));
@@ -663,7 +646,9 @@ bool CBORStream2Deserializer::ProcessStartMessageElement(CborValue &value) {
else {
auto key = GetCBORString(value);
try {
if (key == "beam_center_x")
if (key == "magic_number")
CheckMagicNumber(value);
else if (key == "beam_center_x")
start_message.beam_center_x = GetCBORFloat(value);
else if (key == "beam_center_y")
start_message.beam_center_y = GetCBORFloat(value);
@@ -756,8 +741,6 @@ bool CBORStream2Deserializer::ProcessStartMessageElement(CborValue &value) {
start_message.storage_cell_number = GetCBORUInt(value);
else if (key == "storage_cell_delay")
start_message.storage_cell_delay_ns = GetRational(value).first;
else if (key == "calibration")
ProcessCalibration(value);
else {
if (cbor_value_is_tag(&value))
cbor_value_advance(&value);
@@ -770,6 +753,26 @@ bool CBORStream2Deserializer::ProcessStartMessageElement(CborValue &value) {
}
}
bool CBORStream2Deserializer::ProcessCalibration(CborValue &value) {
if (cbor_value_at_end(&value))
return false;
else {
auto key = GetCBORString(value);
try {
if (key == "data") {
ProcessImageData(value, calibration);
} 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 calibration message, key " + key + ":" + e.what());
}
}
}
bool CBORStream2Deserializer::ProcessEndMessageElement(CborValue &value) {
if (cbor_value_at_end(&value))
return false;
@@ -792,8 +795,6 @@ bool CBORStream2Deserializer::ProcessEndMessageElement(CborValue &value) {
end_message.max_receiver_delay = GetCBORUInt(value);
else if (key == "data_collection_efficiency")
end_message.efficiency = GetCBORFloat(value);
else if (key == "write_master_file")
end_message.write_master_file = GetCBORBool(value);
else if (key == "az_int_result")
ProcessRadIntResultElement(value);
else if (key == "adu_histogram")
@@ -809,7 +810,7 @@ bool CBORStream2Deserializer::ProcessEndMessageElement(CborValue &value) {
}
}
void CBORStream2Deserializer::ProcessImageData(CborValue &value) {
void CBORStream2Deserializer::ProcessImageData(CborValue &value, CompressedImage& image) {
if (!cbor_value_is_map(&value))
throw JFJochException(JFJochExceptionCategory::CBORError, "Map expected");
@@ -821,8 +822,8 @@ void CBORStream2Deserializer::ProcessImageData(CborValue &value) {
cborErr(cbor_value_enter_container(&value, &map_value));
data_message.image.channel = GetCBORString(map_value);
GetCBORMultidimTypedArray(data_message.image, map_value);
image.channel = GetCBORString(map_value);
GetCBORMultidimTypedArray(image, map_value);
cborErr(cbor_value_leave_container(&value, &map_value));
}
@@ -834,6 +835,7 @@ void CBORStream2Deserializer::Process(const std::vector<uint8_t> &buffer) {
void CBORStream2Deserializer::Process(const uint8_t *msg, size_t msg_size) {
std::unique_lock<std::mutex> ul(m);
data_message = DataMessage();
calibration = CompressedImage();
CborParser parser;
CborValue value;
@@ -844,7 +846,6 @@ void CBORStream2Deserializer::Process(const uint8_t *msg, size_t msg_size) {
if (GetCBORTag(value) != CborSignatureTag)
throw JFJochException(JFJochExceptionCategory::CBORError, "CBOR must start with dedicated tag");
if (cbor_value_is_map(&value)) {
CborValue map_value;
cborErr(cbor_value_enter_container(&value, &map_value));
@@ -854,6 +855,9 @@ void CBORStream2Deserializer::Process(const uint8_t *msg, size_t msg_size) {
case Type::IMAGE:
while (ProcessImageMessageElement(map_value));
break;
case Type::CALIBRATION:
while (ProcessCalibration(map_value));
break;
case Type::START:
start_message = StartMessage{};
while (ProcessStartMessageElement(map_value));
@@ -894,4 +898,9 @@ EndMessage CBORStream2Deserializer::GetEndMessage() const {
StartMessage CBORStream2Deserializer::GetStartMessage() const {
std::unique_lock<std::mutex> ul(m);
return start_message;
}
CompressedImage CBORStream2Deserializer::GetCalibrationImage() const {
std::unique_lock<std::mutex> ul(m);
return calibration;
}