57 container.deserializeHeader();
62 if (prm_chunk_size > container.getDataSize()) {
63 prm_chunk_size = container.getDataSize();
65 const FwSizeType max_chunk_size = prm_chunk_size;
66 FW_ASSERT(max_chunk_size <= std::numeric_limits<FwSizeStoreType>::max(),
67 static_cast<FwAssertArgType>(max_chunk_size));
68 if (max_chunk_size <= 0) {
77 auto data_deser = data_buffer.getDeserializer();
78 auto data_reser = data_buffer.getSerializer();
113 U8* uncompressed_head =
nullptr;
116 while (data_deser.getDeserializeSizeLeft() > 0) {
118 const FwSizeType chunk_size_tmp = (data_deser.getDeserializeSizeLeft() < max_chunk_size)
119 ? static_cast<FwSizeType>(data_deser.getDeserializeSizeLeft())
123 FW_ASSERT(chunk_size_tmp > 0, static_cast<FwAssertArgType>(chunk_size_tmp));
124 FW_ASSERT(chunk_size_tmp <= std::numeric_limits<FwSizeStoreType>::max(),
125 static_cast<FwAssertArgType>(chunk_size_tmp));
128 U8* data_offset = data_buffer.getData() + (data_buffer.getSize() - data_deser.getDeserializeSizeLeft());
130 Fw::Buffer compression_buffer(data_offset, chunk_size);
133 ser_stat = data_deser.deserializeSkip(chunk_size);
144 if (chunk_size > 4 * compression_header_size) {
151 min_compression = chunk_size - 2 * compression_header_size;
155 compression_offset = compression_header_size;
162 min_compression = chunk_size - 3 * compression_header_size;
166 compression_offset = 2 * compression_header_size;
168 case LAST_UNCOMPRESSED:
169 case LAST_COMPRESSED:
177 min_compression = chunk_size - (2 * compression_header_size);
180 compression_offset = compression_header_size;
187 if (min_compression > chunk_size - compression_offset) {
188 min_compression = chunk_size - compression_offset;
191 FW_ASSERT(min_compression <= chunk_size, static_cast<FwAssertArgType>(min_compression),
192 static_cast<FwAssertArgType>(chunk_size));
194 FW_ASSERT(compression_offset <= chunk_size, static_cast<FwAssertArgType>(compression_offset),
195 static_cast<FwAssertArgType>(chunk_size));
197 alg =
compressChunk_out(0, compression_buffer, min_compression, compression_offset);
200 FW_ASSERT(compression_buffer.getSize() <= min_compression);
207 U8*
const comp_data_ptr = compression_buffer.getData() + compression_offset;
210 static_cast<FwSizeType>(compression_buffer.getSize()) - static_cast<FwSizeType>(compression_offset);
211 FW_ASSERT(compressed_size_tmp <= std::numeric_limits<FwSizeStoreType>::max());
212 FW_ASSERT(compressed_size_tmp < chunk_size);
219 state = LAST_COMPRESSED;
222 const FwSizeType deser_loc = data_deser.getSize() - data_deser.getDeserializeSizeLeft();
236 static_cast<FwAssertArgType>(deser_loc), uncompressed_size,
238 std::memmove(data_buffer.getData() + compression_header_size, data_buffer.getData(),
242 serializeCompressionHeader(data_reser, uncompressed_size,
246 ser_stat = data_reser.serializeSkip(uncompressed_size);
249 serializeCompressionHeader(data_reser, compressed_size, CompressionMetadata(alg));
254 case LAST_COMPRESSED:
258 serializeCompressionHeader(data_reser, compressed_size, CompressionMetadata(alg));
263 case LAST_UNCOMPRESSED:
270 serializeCompressionHeader(data_reser, uncompressed_size,
278 serializeCompressionHeader(data_reser, compressed_size, CompressionMetadata(alg));
289 uncompressed_size = 0;
290 uncompressed_head =
nullptr;
291 state = LAST_COMPRESSED;
308 case LAST_COMPRESSED:
312 uncompressed_head = compression_buffer.getData();
314 state = LAST_UNCOMPRESSED;
316 case LAST_UNCOMPRESSED:
319 state = LAST_UNCOMPRESSED;
325 uncompressed_size =
static_cast<FwSizeStoreType>(uncompressed_size + chunk_size);
329 const FwSizeType ser_loc = data_reser.getSize();
330 const FwSizeType deser_loc =
static_cast<uintptr_t
>(data_deser.getBuffAddrLeft() - data_buffer.getData());
331 FW_ASSERT(ser_loc <= deser_loc, static_cast<FwAssertArgType>(ser_loc), static_cast<FwAssertArgType>(deser_loc));
340 case LAST_UNCOMPRESSED:
345 serializeCompressionHeader(data_reser, uncompressed_size,
353 case LAST_COMPRESSED:
358 FwSizeType comp_data_size = data_reser.getSize();
361 container.setDataSize(comp_data_size);
362 container.serializeHeader();
Serialization/Deserialization operation was successful.
A data product Container.
SerializeStatus serializeFrom(U8 val, Endianness mode=Endianness::BIG) override
Serialize an 8-bit unsigned integer value.
FwIdType getIdBase() const
PlatformSizeType FwSizeType
static constexpr FwSizeType MIN_PACKET_SIZE
bool isConnected_compressChunk_OutputPort(FwIndexType portNum) const
SerializeStatus
forward declaration for string
void log_ACTIVITY_LO_DidNotCompress(FwDpIdType dp_id, FwSizeType data_size)
Log event DidNotCompress.
U16 FwSizeStoreType
The type used to serialize a size value.
Auto-generated base for DpCompressProc component.
Omit length from serialization.
~DpCompressProc()
Destroy DpCompressProc object.
Svc::CompressionAlgorithm compressChunk_out(FwIndexType portNum, Fw::Buffer &buffer, FwSizeType min_compression, FwSizeType write_offset) const
Invoke output port compressChunk.
void log_DIAGNOSTIC_CompressionComplete(FwDpIdType dp_id, FwSizeType initial_size, FwSizeType final_size) const
Log event CompressionComplete.
Enabled and disabled states.
static constexpr FwSizeType DATA_OFFSET
The data offset.
uint8_t U8
8-bit unsigned integer
FwSizeType getSize() const
FwIdType FwDpIdType
The type of a data product identifier.
FwSizeStoreType paramGet_CHUNK_SIZE(Fw::ParamValid &valid)
DpCompressProc(const char *const compName)
Construct DpCompressProc object.
PlatformIndexType FwIndexType
RateGroupDivider component implementation.
Enum representing parameter validity.
Fw::Enabled paramGet_ENABLE(Fw::ParamValid &valid)
PlatformAssertArgType FwAssertArgType
The type of arguments to assert functions.