Refactor how frames are sent from receiver
This commit is contained in:
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user