F´ Flight Software - C/C++ Documentation  devel
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 <FpConfig.hpp>
15 
16 namespace Svc {
17 
18 // ----------------------------------------------------------------------
19 // Construction, initialization, and destruction
20 // ----------------------------------------------------------------------
21 
22 BufferRepeater ::BufferRepeater(const char* const compName)
23  : BufferRepeaterComponentBase(compName),
24  m_allocation_failure_response(BufferRepeater::NUM_BUFFER_REPEATER_FAILURE_OPTIONS) {}
25 
27 
29  this->m_allocation_failure_response = allocation_failure_response;
30 }
31 
32 bool BufferRepeater ::check_allocation(FwIndexType index,
33  const Fw::Buffer& new_allocation,
34  const Fw::Buffer& incoming_buffer) {
35  FW_ASSERT(index < NUM_PORTOUT_OUTPUT_PORTS, index);
36  bool is_valid = (new_allocation.getData() != nullptr) && (new_allocation.getSize() >= incoming_buffer.getSize());
37 
38  // Respond to invalid buffer allocation
39  if (!is_valid) {
40  switch (this->m_allocation_failure_response) {
42  // No response intended
43  break;
45  this->log_WARNING_HI_AllocationSoftFailure(index, incoming_buffer.getSize());
46  break;
48  this->log_FATAL_AllocationHardFailure(index, incoming_buffer.getSize());
49  break;
50  default:
51  FW_ASSERT(0);
52  break;
53  }
54  }
55  return is_valid;
56 }
57 
58 // ----------------------------------------------------------------------
59 // Handler implementations for user-defined serial input ports
60 // ----------------------------------------------------------------------
61 
62 void BufferRepeater ::portIn_handler(NATIVE_INT_TYPE portNum,
63  Fw::Buffer& buffer
64 ) {
65  FW_ASSERT(this->m_allocation_failure_response < NUM_BUFFER_REPEATER_FAILURE_OPTIONS);
66  for (FwIndexType i = 0; i < NUM_PORTOUT_OUTPUT_PORTS; i++) {
68  Fw::Buffer new_allocation = this->allocate_out(0, buffer.getSize());
69  if (this->check_allocation(i, new_allocation, buffer)) {
70  // Clone the data and send it
71  ::memcpy(new_allocation.getData(), buffer.getData(), buffer.getSize());
72  new_allocation.setSize(buffer.getSize());
73  this->portOut_out(i, new_allocation);
74  }
75  }
76  }
77  this->deallocate_out(0, buffer);
78 }
79 } // end namespace Svc
#define FW_ASSERT(...)
Definition: Assert.hpp:14
PlatformIntType NATIVE_INT_TYPE
Definition: BasicTypes.h:55
PlatformIndexType FwIndexType
Definition: FpConfig.h:25
C++-compatible configuration header for fprime configuration.
U8 * getData() const
Definition: Buffer.cpp:68
U32 getSize() const
Definition: Buffer.cpp:72
void setSize(U32 size)
Definition: Buffer.cpp:87
Auto-generated base for BufferRepeater component.
void log_WARNING_HI_AllocationSoftFailure(I32 port, U32 size)
Fw::Buffer allocate_out(FwIndexType portNum, U32 size)
Invoke output port allocate.
bool isConnected_portOut_OutputPort(FwIndexType portNum)
void log_FATAL_AllocationHardFailure(I32 port, U32 size)
void deallocate_out(FwIndexType portNum, Fw::Buffer &fwBuffer)
Invoke output port deallocate.
void portOut_out(FwIndexType portNum, Fw::Buffer &fwBuffer)
Invoke output port portOut.
void configure(BufferRepeaterFailureOption allocation_failure_response)
BufferRepeater(const char *const compName)