F´ Flight Software - C/C++ Documentation NASA-v1.6.0
A framework for building embedded system applications to NASA flight quality standards.
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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
26void BufferRepeater ::init(const NATIVE_INT_TYPE instance) {
28}
29
30BufferRepeater ::~BufferRepeater() {}
31
32void BufferRepeater ::configure(BufferRepeater::BufferRepeaterFailureOption allocation_failure_response) {
33 this->m_allocation_failure_response = allocation_failure_response;
34}
35
36bool BufferRepeater ::check_allocation(FwIndexType index,
37 const Fw::Buffer& new_allocation,
38 const Fw::Buffer& incoming_buffer) {
39 FW_ASSERT(index < NUM_PORTOUT_OUTPUT_PORTS, index);
40 bool is_valid = (new_allocation.getData() != nullptr) && (new_allocation.getSize() >= incoming_buffer.getSize());
41
42 // Respond to invalid buffer allocation
43 if (!is_valid) {
44 switch (this->m_allocation_failure_response) {
45 case NO_RESPONSE_ON_OUT_OF_MEMORY:
46 // No response intended
47 break;
48 case WARNING_ON_OUT_OF_MEMORY:
49 this->log_WARNING_HI_AllocationSoftFailure(index, incoming_buffer.getSize());
50 break;
51 case FATAL_ON_OUT_OF_MEMORY:
52 this->log_FATAL_AllocationHardFailure(index, incoming_buffer.getSize());
53 break;
54 default:
55 FW_ASSERT(0);
56 break;
57 }
58 }
59 return is_valid;
60}
61
62// ----------------------------------------------------------------------
63// Handler implementations for user-defined serial input ports
64// ----------------------------------------------------------------------
65
66void BufferRepeater ::portIn_handler(NATIVE_INT_TYPE portNum,
67 Fw::Buffer& buffer
68) {
69 FW_ASSERT(this->m_allocation_failure_response < NUM_BUFFER_REPEATER_FAILURE_OPTIONS);
70 for (FwIndexType i = 0; i < NUM_PORTOUT_OUTPUT_PORTS; i++) {
71 if (isConnected_portOut_OutputPort(i)) {
72 Fw::Buffer new_allocation = this->allocate_out(0, buffer.getSize());
73 if (this->check_allocation(i, new_allocation, buffer)) {
74 // Clone the data and send it
75 ::memcpy(new_allocation.getData(), buffer.getData(), buffer.getSize());
76 new_allocation.setSize(buffer.getSize());
77 this->portOut_out(i, new_allocation);
78 }
79 }
80 }
81 this->deallocate_out(0, buffer);
82}
83} // end namespace Svc
#define FW_ASSERT(...)
Definition Assert.hpp:7
PlatformIntType NATIVE_INT_TYPE
Definition BasicTypes.h:51
PlatformIndexType FwIndexType
Definition FpConfig.h:15
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
void init()
Object initializer.
Definition ObjBase.cpp:27
Auto-generated base for BufferRepeater component.