F´ Flight Software - C/C++ Documentation
A framework for building embedded system applications to NASA flight quality standards.
Loading...
Searching...
No Matches
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
16namespace Svc {
17
18// ----------------------------------------------------------------------
19// Construction, initialization, and destruction
20// ----------------------------------------------------------------------
21
22BufferRepeater ::BufferRepeater(const char* const compName)
24 m_allocation_failure_response(BufferRepeater::NUM_BUFFER_REPEATER_FAILURE_OPTIONS) {}
25
26BufferRepeater ::~BufferRepeater() {}
27
28void BufferRepeater ::configure(BufferRepeater::BufferRepeaterFailureOption allocation_failure_response) {
29 this->m_allocation_failure_response = allocation_failure_response;
30}
31
32bool 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) {
41 case NO_RESPONSE_ON_OUT_OF_MEMORY:
42 // No response intended
43 break;
44 case WARNING_ON_OUT_OF_MEMORY:
45 this->log_WARNING_HI_AllocationSoftFailure(index, incoming_buffer.getSize());
46 break;
47 case FATAL_ON_OUT_OF_MEMORY:
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
62void 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++) {
67 if (isConnected_portOut_OutputPort(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.