F´ Flight Software - C/C++ Documentation  NASA-v1.6.0
A framework for building embedded system applications to NASA flight quality standards.
GenericHubComponentImpl.cpp
Go to the documentation of this file.
1 // ======================================================================
2 // \title GenericHubComponentImpl.cpp
3 // \author mstarch
4 // \brief cpp file for GenericHub 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 
14 #include "Fw/Logger/Logger.hpp"
15 #include "Fw/Types/Assert.hpp"
16 #include "Fw/Types/BasicTypes.hpp"
17 
18 // Required port serialization or the hub cannot work
19 static_assert(FW_PORT_SERIALIZATION, "FW_PORT_SERIALIZATION must be enabled to use GenericHub");
20 
21 namespace Svc {
22 
23 // ----------------------------------------------------------------------
24 // Construction, initialization, and destruction
25 // ----------------------------------------------------------------------
26 
27 GenericHubComponentImpl ::GenericHubComponentImpl(const char* const compName) : GenericHubComponentBase(compName) {}
28 
30  GenericHubComponentBase::init(instance);
31 }
32 
34 
35 void GenericHubComponentImpl ::send_data(const HubType type,
36  const NATIVE_INT_TYPE port,
37  const U8* data,
38  const U32 size) {
39  FW_ASSERT(data != nullptr);
40  Fw::SerializeStatus status;
41  // Buffer to send and a buffer used to write to it
42  Fw::Buffer outgoing = dataOutAllocate_out(0, size + sizeof(U32) + sizeof(U32) + sizeof(FwBuffSizeType));
43  Fw::SerializeBufferBase& serialize = outgoing.getSerializeRepr();
44  // Write data to our buffer
45  status = serialize.serialize(static_cast<U32>(type));
46  FW_ASSERT(status == Fw::FW_SERIALIZE_OK, static_cast<NATIVE_INT_TYPE>(status));
47  status = serialize.serialize(static_cast<U32>(port));
48  FW_ASSERT(status == Fw::FW_SERIALIZE_OK, static_cast<NATIVE_INT_TYPE>(status));
49  status = serialize.serialize(data, size);
50  FW_ASSERT(status == Fw::FW_SERIALIZE_OK, static_cast<NATIVE_INT_TYPE>(status));
51  outgoing.setSize(serialize.getBuffLength());
52  dataOut_out(0, outgoing);
53 
54 }
55 
56 // ----------------------------------------------------------------------
57 // Handler implementations for user-defined typed input ports
58 // ----------------------------------------------------------------------
59 
60 void GenericHubComponentImpl ::buffersIn_handler(const NATIVE_INT_TYPE portNum, Fw::Buffer& fwBuffer) {
61  send_data(HUB_TYPE_BUFFER, portNum, fwBuffer.getData(), fwBuffer.getSize());
62  bufferDeallocate_out(0, fwBuffer);
63 }
64 
65 void GenericHubComponentImpl ::dataIn_handler(const NATIVE_INT_TYPE portNum,
66  Fw::Buffer& fwBuffer) {
67  HubType type = HUB_TYPE_MAX;
68  U32 type_in = 0;
69  U32 port = 0;
70  FwBuffSizeType size = 0;
72 
73  // Representation of incoming data prepped for serialization
74  Fw::SerializeBufferBase& incoming = fwBuffer.getSerializeRepr();
75  FW_ASSERT(incoming.setBuffLen(fwBuffer.getSize()) == Fw::FW_SERIALIZE_OK);
76 
77  // Must inform buffer that there is *real* data in the buffer
78  status = incoming.setBuffLen(fwBuffer.getSize());
79  FW_ASSERT(status == Fw::FW_SERIALIZE_OK, static_cast<NATIVE_INT_TYPE>(status));
80  status = incoming.deserialize(type_in);
81  FW_ASSERT(status == Fw::FW_SERIALIZE_OK, static_cast<NATIVE_INT_TYPE>(status));
82  type = static_cast<HubType>(type_in);
83  FW_ASSERT(type < HUB_TYPE_MAX, type);
84  status = incoming.deserialize(port);
85  FW_ASSERT(status == Fw::FW_SERIALIZE_OK, static_cast<NATIVE_INT_TYPE>(status));
86  status = incoming.deserialize(size);
87  FW_ASSERT(status == Fw::FW_SERIALIZE_OK, static_cast<NATIVE_INT_TYPE>(status));
88 
89  // invokeSerial deserializes arguments before calling a normal invoke, this will return ownership immediately
90  U8* rawData = fwBuffer.getData() + sizeof(U32) + sizeof(U32) + sizeof(FwBuffSizeType);
91  U32 rawSize = fwBuffer.getSize() - sizeof(U32) - sizeof(U32) - sizeof(FwBuffSizeType);
92  FW_ASSERT(rawSize == static_cast<U32>(size));
93  if (type == HUB_TYPE_PORT) {
94  // Com buffer representations should be copied before the call returns, so we need not "allocate" new data
95  Fw::ExternalSerializeBuffer wrapper(rawData, rawSize);
96  status = wrapper.setBuffLen(rawSize);
97  FW_ASSERT(status == Fw::FW_SERIALIZE_OK, static_cast<NATIVE_INT_TYPE>(status));
98  portOut_out(port, wrapper);
99  dataInDeallocate_out(0, fwBuffer);
100  } else if (type == HUB_TYPE_BUFFER) {
101  fwBuffer.set(rawData, rawSize, fwBuffer.getContext());
102  buffersOut_out(port, fwBuffer);
103  }
104 }
105 
106 // ----------------------------------------------------------------------
107 // Handler implementations for user-defined serial input ports
108 // ----------------------------------------------------------------------
109 
110 void GenericHubComponentImpl ::portIn_handler(NATIVE_INT_TYPE portNum,
111  Fw::SerializeBufferBase& Buffer
112 ) {
113  send_data(HUB_TYPE_PORT, portNum, Buffer.getBuffAddr(), Buffer.getBuffLength());
114 }
115 
116 } // end namespace Svc
Fw::SerializeBufferBase
Definition: Serializable.hpp:43
Fw::SerializeStatus
SerializeStatus
forward declaration for string
Definition: Serializable.hpp:14
Fw::Buffer::getData
U8 * getData() const
Definition: Buffer.cpp:60
Fw::SerializeBufferBase::serialize
SerializeStatus serialize(U8 val)
serialize 8-bit unsigned int
Definition: Serializable.cpp:67
GenericHubComponentImpl.hpp
U8
uint8_t U8
8-bit unsigned integer
Definition: BasicTypes.hpp:76
Fw::Buffer::getContext
U32 getContext() const
Definition: Buffer.cpp:68
Svc::GenericHubComponentImpl::init
void init(const NATIVE_INT_TYPE instance=0)
Definition: GenericHubComponentImpl.cpp:29
Fw::Buffer
Definition: Buffer.hpp:43
Assert.hpp
Fw::FW_SERIALIZE_OK
@ FW_SERIALIZE_OK
Serialization/Deserialization operation was successful.
Definition: Serializable.hpp:15
Fw::Buffer::getSerializeRepr
SerializeBufferBase & getSerializeRepr()
Definition: Buffer.cpp:99
Svc::GenericHubComponentImpl::~GenericHubComponentImpl
~GenericHubComponentImpl()
Definition: GenericHubComponentImpl.cpp:33
Svc::GenericHubComponentImpl::HUB_TYPE_BUFFER
@ HUB_TYPE_BUFFER
Buffer type transmission.
Definition: GenericHubComponentImpl.hpp:29
Fw::Buffer::getSize
U32 getSize() const
Definition: Buffer.cpp:64
Fw::Buffer::setSize
void setSize(U32 size)
Definition: Buffer.cpp:79
Fw::Buffer::set
void set(U8 *data, U32 size, U32 context=NO_CONTEXT)
Definition: Buffer.cpp:90
Fw::SerializeBufferBase::setBuffLen
SerializeStatus setBuffLen(NATIVE_UINT_TYPE length)
sets buffer length manually after filling with data
Definition: Serializable.cpp:608
Svc::GenericHubComponentImpl::HubType
HubType
Definition: GenericHubComponentImpl.hpp:27
FW_ASSERT
#define FW_ASSERT(...)
Definition: Assert.hpp:8
Fw::SerializeBufferBase::getBuffLength
NATIVE_UINT_TYPE getBuffLength() const
returns current buffer size
Definition: Serializable.cpp:591
Fw::ExternalSerializeBuffer
Definition: Serializable.hpp:156
Fw::SerializeBufferBase::deserialize
SerializeStatus deserialize(U8 &val)
deserialize 8-bit unsigned int
Definition: Serializable.cpp:290
Svc::GenericHubComponentImpl::HUB_TYPE_MAX
@ HUB_TYPE_MAX
Definition: GenericHubComponentImpl.hpp:30
FW_PORT_SERIALIZATION
#define FW_PORT_SERIALIZATION
Indicates whether there is code in ports to serialize the call (more code, but ability to serialize c...
Definition: FpConfig.hpp:135
Svc
Definition: ActiveRateGroupImplCfg.hpp:18
Fw::SerializeBufferBase::getBuffAddr
virtual U8 * getBuffAddr()=0
gets buffer address for data filling
Svc::GenericHubComponentImpl::HUB_TYPE_PORT
@ HUB_TYPE_PORT
Port type transmission.
Definition: GenericHubComponentImpl.hpp:28
BasicTypes.hpp
Declares ISF basic types.
Svc::GenericHubComponentImpl::GenericHubComponentImpl
GenericHubComponentImpl(const char *const compName)
Definition: GenericHubComponentImpl.cpp:27
FwBuffSizeType
#define FwBuffSizeType
Type representation for storing a buffer or string size.
Definition: FpConfig.hpp:79
NATIVE_INT_TYPE
int NATIVE_INT_TYPE
native integer type declaration
Definition: BasicTypes.hpp:29
Logger.hpp