17 #include "Fw/Types/BasicTypes.hpp"
28 "poll buffer size must be greater than zero"
32 "ring buffer size must be greater than zero"
40 DeframerComponentBase(compName),
43 m_inRing(m_ringBuffer, sizeof m_ringBuffer)
45 (void) memset(m_pollBuffer, 0,
sizeof m_pollBuffer);
49 DeframerComponentBase::init(instance);
58 m_protocol = &protocol;
61 protocol.
setup(*
this);
68 void Deframer ::cmdResponseIn_handler(
72 const Fw::CmdResponse& response
77 void Deframer ::framedIn_handler(
80 const Drv::RecvStatus& recvStatus
83 if (recvStatus.e == Drv::RecvStatus::RECV_OK) {
85 processBuffer(recvBuffer);
88 framedDeallocate_out(0, recvBuffer);
91 void Deframer ::schedIn_handler(
96 Fw::Buffer buffer(m_pollBuffer,
sizeof(m_pollBuffer));
97 const Drv::PollStatus status = framedPoll_out(0, buffer);
98 if (status.e == Drv::PollStatus::POLL_OK) {
100 processBuffer(buffer);
108 Fw::Buffer Deframer ::allocate(
const U32 size) {
109 return bufferAllocate_out(0, size);
112 void Deframer ::route(
Fw::Buffer& packetBuffer) {
125 bool deallocate =
true;
129 U8 *
const packetData = packetBuffer.
getData();
130 const U32 packetSize = packetBuffer.
getSize();
131 switch (packetType) {
137 status = com.
setBuff(packetData, packetSize);
140 comOut_out(0, com, 0);
144 "[ERROR] Serializing com buffer failed with status %d\n",
154 if (isConnected_bufferOut_OutputPort(0)) {
158 packetBuffer.
setData(packetData +
sizeof(packetType));
159 packetBuffer.
setSize(packetSize -
sizeof(packetType));
161 bufferOut_out(0, packetBuffer);
174 "[ERROR] Deserializing packet type failed with status %d\n",
181 bufferDeallocate_out(0, packetBuffer);
190 void Deframer ::processBuffer(
Fw::Buffer& buffer) {
192 const U32 bufferSize = buffer.
getSize();
197 U32 remaining = bufferSize;
199 for (U32 i = 0; i < bufferSize; ++i) {
201 if (remaining == 0) {
210 m_inRing.
serialize(&bufferData[offset], serSize);
217 remaining -= serSize;
227 void Deframer ::processRing() {
240 for (U32 i = 0; i < ringCapacity; i++) {
244 if (remaining == 0) {
252 status = m_protocol->
deframe(m_inRing, needed);
264 FW_ASSERT(needed <= remaining, needed, remaining);
277 FW_ASSERT(needed > remaining, needed, remaining);