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
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:69
GenericHubComponentImpl.hpp
U8
uint8_t U8
8-bit unsigned integer
Definition: BasicTypes.hpp:73
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
Fw::Buffer::getSerializeRepr
SerializeBufferBase & getSerializeRepr()
Definition: Buffer.cpp:99
FwBuffSizeType
#define FwBuffSizeType
Type representation for storing a buffer or string size.
Definition: FpConfig.hpp:79
Fw::SerializeBufferBase::getBuffAddr
virtual U8 * getBuffAddr(void)=0
gets buffer address for data filling
Svc::GenericHubComponentImpl::~GenericHubComponentImpl
~GenericHubComponentImpl()
Definition: GenericHubComponentImpl.cpp:33
Svc::GenericHubComponentImpl::HUB_TYPE_BUFFER
@ HUB_TYPE_BUFFER
Buffer type transmission.
Definition: GenericHubComponentImpl.hpp:29
NATIVE_INT_TYPE
int NATIVE_INT_TYPE
native integer type declaration
Definition: BasicTypes.hpp:27
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:611
Svc::GenericHubComponentImpl::HubType
HubType
Definition: GenericHubComponentImpl.hpp:27
Fw::SerializeBufferBase::getBuffLength
NATIVE_UINT_TYPE getBuffLength() const
returns current buffer size
Definition: Serializable.cpp:594
Fw::ExternalSerializeBuffer
Definition: Serializable.hpp:153
FW_ASSERT
#define FW_ASSERT(...)
Definition: Assert.hpp:9
Fw::SerializeBufferBase::deserialize
SerializeStatus deserialize(U8 &val)
deserialize 8-bit unsigned int
Definition: Serializable.cpp:294
Svc::GenericHubComponentImpl::HUB_TYPE_MAX
@ HUB_TYPE_MAX
Definition: GenericHubComponentImpl.hpp:30
Svc
Definition: ActiveRateGroupCfg.hpp:18
Svc::GenericHubComponentImpl::HUB_TYPE_PORT
@ HUB_TYPE_PORT
Port type transmission.
Definition: GenericHubComponentImpl.hpp:28
Svc::GenericHubComponentImpl::GenericHubComponentImpl
GenericHubComponentImpl(const char *const compName)
Definition: GenericHubComponentImpl.cpp:27
Fw::FW_SERIALIZE_OK
@ FW_SERIALIZE_OK
Serialization/Deserialization operation was successful.
Definition: Serializable.hpp:15
Logger.hpp
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:127