F´ Flight Software - C/C++ Documentation
A framework for building embedded system applications to NASA flight quality standards.
BufferRepeater.cpp
Go to the documentation of this file.
1 // ======================================================================
2 // \title BufferRepeater.cpp
3 // \author lestarch
4 // \brief cpp file for GenericRepeater component implementation class
5 //
6 // \copyright
7 // Copyright 2009-2015, by the California Institute of Technology.
8 // ALL RIGHTS RESERVED. United States Government Sponsorship
9 // acknowledged.
10 //
11 // ======================================================================
12 
13 #include <Fw/FPrimeBasicTypes.hpp>
15 #include <cstring>
16 
17 namespace Svc {
18 
19 // ----------------------------------------------------------------------
20 // Construction, initialization, and destruction
21 // ----------------------------------------------------------------------
22 
23 BufferRepeater ::BufferRepeater(const char* const compName)
24  : BufferRepeaterComponentBase(compName),
25  m_allocation_failure_response(BufferRepeater::NUM_BUFFER_REPEATER_FAILURE_OPTIONS) {}
26 
28 
30  this->m_allocation_failure_response = allocation_failure_response;
31 }
32 
33 bool BufferRepeater ::check_allocation(FwIndexType index,
34  const Fw::Buffer& new_allocation,
35  const Fw::Buffer& incoming_buffer) {
36  FW_ASSERT(index < NUM_PORTOUT_OUTPUT_PORTS, static_cast<FwAssertArgType>(index));
37  bool is_valid = (new_allocation.getData() != nullptr) && (new_allocation.getSize() >= incoming_buffer.getSize());
38 
39  // Respond to invalid buffer allocation
40  if (!is_valid) {
41  switch (this->m_allocation_failure_response) {
43  // No response intended
44  break;
46  this->log_WARNING_HI_AllocationSoftFailure(index, incoming_buffer.getSize());
47  break;
49  this->log_FATAL_AllocationHardFailure(index, incoming_buffer.getSize());
50  break;
51  default:
52  FW_ASSERT(0);
53  break;
54  }
55  }
56  return is_valid;
57 }
58 
59 // ----------------------------------------------------------------------
60 // Handler implementations for user-defined serial input ports
61 // ----------------------------------------------------------------------
62 
63 void BufferRepeater ::portIn_handler(FwIndexType portNum,
64  Fw::Buffer& buffer
65 ) {
66  FW_ASSERT(this->m_allocation_failure_response < NUM_BUFFER_REPEATER_FAILURE_OPTIONS);
67  for (FwIndexType i = 0; i < NUM_PORTOUT_OUTPUT_PORTS; i++) {
69  Fw::Buffer new_allocation = this->allocate_out(0, buffer.getSize());
70  if (this->check_allocation(i, new_allocation, buffer)) {
71  // Clone the data and send it
72  FW_ASSERT_NO_OVERFLOW(buffer.getSize(), size_t);
73  ::memcpy(new_allocation.getData(), buffer.getData(), static_cast<size_t>(buffer.getSize()));
74  new_allocation.setSize(buffer.getSize());
75  this->portOut_out(i, new_allocation);
76  }
77  }
78  }
79  this->deallocate_out(0, buffer);
80 }
81 } // end namespace Svc
void setSize(FwSizeType size)
Definition: Buffer.cpp:75
U8 * getData() const
Definition: Buffer.cpp:56
void portOut_out(FwIndexType portNum, Fw::Buffer &fwBuffer)
Invoke output port portOut.
void log_WARNING_HI_AllocationSoftFailure(I32 port, FwSizeType size) const
BufferRepeater(const char *const compName)
bool isConnected_portOut_OutputPort(FwIndexType portNum)
FwSizeType getSize() const
Definition: Buffer.cpp:60
void log_FATAL_AllocationHardFailure(I32 port, FwSizeType size) const
PlatformIndexType FwIndexType
#define FW_ASSERT_NO_OVERFLOW(value, T)
Definition: Assert.hpp:49
void configure(BufferRepeaterFailureOption allocation_failure_response)
RateGroupDivider component implementation.
Auto-generated base for BufferRepeater component.
#define FW_ASSERT(...)
Definition: Assert.hpp:14
Fw::Buffer allocate_out(FwIndexType portNum, FwSizeType size)
Invoke output port allocate.
void deallocate_out(FwIndexType portNum, Fw::Buffer &fwBuffer)
Invoke output port deallocate.