F´ Flight Software - C/C++ Documentation
A framework for building embedded system applications to NASA flight quality standards.
GenericHub.cpp
Go to the documentation of this file.
1 // ======================================================================
2 // \title GenericHub.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 
13 #include <Fw/FPrimeBasicTypes.hpp>
15 #include "Fw/Logger/Logger.hpp"
16 #include "Fw/Types/Assert.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 GenericHub::GenericHub(const char* const compName) : GenericHubComponentBase(compName) {}
28 
30 
31 void GenericHub::send_data(const HubType type, const FwIndexType port, const U8* data, const FwSizeType size) {
32  FW_ASSERT(data != nullptr);
33  Fw::SerializeStatus status;
34  // Buffer to send and a buffer used to write to it
35  Fw::Buffer outgoing = allocate_out(0, static_cast<U32>(size + sizeof(U32) + sizeof(U32) + sizeof(FwBuffSizeType)));
36  auto serialize = outgoing.getSerializer();
37  // Write data to our buffer
38  status = serialize.serializeFrom(static_cast<U32>(type));
39  FW_ASSERT(status == Fw::FW_SERIALIZE_OK, static_cast<FwAssertArgType>(status));
40  status = serialize.serializeFrom(static_cast<U32>(port));
41  FW_ASSERT(status == Fw::FW_SERIALIZE_OK, static_cast<FwAssertArgType>(status));
42  status = serialize.serializeFrom(data, size);
43  FW_ASSERT(status == Fw::FW_SERIALIZE_OK, static_cast<FwAssertArgType>(status));
44  outgoing.setSize(static_cast<U32>(serialize.getSize()));
45  toBufferDriver_out(0, outgoing);
46 }
47 
48 // ----------------------------------------------------------------------
49 // Handler implementations for user-defined typed input ports
50 // ----------------------------------------------------------------------
51 
52 void GenericHub::bufferIn_handler(const FwIndexType portNum, Fw::Buffer& fwBuffer) {
53  send_data(HUB_TYPE_BUFFER, portNum, fwBuffer.getData(), fwBuffer.getSize());
54  bufferInReturn_out(portNum, fwBuffer);
55 }
56 
57 void GenericHub::bufferOutReturn_handler(FwIndexType portNum, Fw::Buffer& fwBuffer) {
58  // Return the buffer
59  fromBufferDriverReturn_out(0, fwBuffer);
60 }
61 
62 void GenericHub::fromBufferDriver_handler(const FwIndexType portNum, Fw::Buffer& fwBuffer) {
63  HubType type = HUB_TYPE_MAX;
64  U32 type_in = 0;
65  U32 port = 0;
66  FwBuffSizeType size = 0;
68 
69  // Representation of incoming data prepped for serialization
70  auto incoming = fwBuffer.getDeserializer();
71  status = incoming.deserializeTo(type_in);
72  FW_ASSERT(status == Fw::FW_SERIALIZE_OK, static_cast<FwAssertArgType>(status));
73  type = static_cast<HubType>(type_in);
74  FW_ASSERT(type < HUB_TYPE_MAX, type);
75  status = incoming.deserializeTo(port);
76  FW_ASSERT(status == Fw::FW_SERIALIZE_OK, static_cast<FwAssertArgType>(status));
77  status = incoming.deserializeTo(size);
78  FW_ASSERT(status == Fw::FW_SERIALIZE_OK, static_cast<FwAssertArgType>(status));
79 
80  // invokeSerial deserializes arguments before calling a normal invoke, this will return ownership immediately
81  U8* rawData = fwBuffer.getData() + sizeof(U32) + sizeof(U32) + sizeof(FwBuffSizeType);
82  U32 rawSize = static_cast<U32>(fwBuffer.getSize() - sizeof(U32) - sizeof(U32) - sizeof(FwBuffSizeType));
83  FW_ASSERT(rawSize == static_cast<U32>(size));
84  if (type == HUB_TYPE_PORT) {
85  // Com buffer representations should be copied before the call returns, so we need not "allocate" new data
86  Fw::ExternalSerializeBuffer wrapper(rawData, rawSize);
87  status = wrapper.setBuffLen(rawSize);
88  FW_ASSERT(status == Fw::FW_SERIALIZE_OK, static_cast<FwAssertArgType>(status));
89  serialOut_out(static_cast<FwIndexType>(port), wrapper);
90  // Deallocate the existing buffer
91  fromBufferDriverReturn_out(0, fwBuffer);
92  } else if (type == HUB_TYPE_BUFFER) {
93  // Fw::Buffers can reuse the existing data buffer as the storage type! No deallocation done.
94  fwBuffer.set(rawData, rawSize, fwBuffer.getContext());
95  bufferOut_out(static_cast<FwIndexType>(port), fwBuffer);
96  } else if (type == HUB_TYPE_EVENT) {
97  FwEventIdType id;
98  Fw::Time timeTag;
99  Fw::LogSeverity severity;
100  Fw::LogBuffer args;
101 
102  // Deserialize tokens for events
103  status = incoming.deserializeTo(id);
104  FW_ASSERT(status == Fw::FW_SERIALIZE_OK, static_cast<FwAssertArgType>(status));
105  status = incoming.deserializeTo(timeTag);
106  FW_ASSERT(status == Fw::FW_SERIALIZE_OK, static_cast<FwAssertArgType>(status));
107  status = incoming.deserializeTo(severity);
108  FW_ASSERT(status == Fw::FW_SERIALIZE_OK, static_cast<FwAssertArgType>(status));
109  status = incoming.deserializeTo(args);
110  FW_ASSERT(status == Fw::FW_SERIALIZE_OK, static_cast<FwAssertArgType>(status));
111 
112  // Send it!
113  this->eventOut_out(static_cast<FwIndexType>(port), id, timeTag, severity, args);
114 
115  // Deallocate the existing buffer
116  fromBufferDriverReturn_out(0, fwBuffer);
117  } else if (type == HUB_TYPE_CHANNEL) {
118  FwChanIdType id;
119  Fw::Time timeTag;
120  Fw::TlmBuffer val;
121 
122  // Deserialize tokens for channels
123  status = incoming.deserializeTo(id);
124  FW_ASSERT(status == Fw::FW_SERIALIZE_OK, static_cast<FwAssertArgType>(status));
125  status = incoming.deserializeTo(timeTag);
126  FW_ASSERT(status == Fw::FW_SERIALIZE_OK, static_cast<FwAssertArgType>(status));
127  status = incoming.deserializeTo(val);
128  FW_ASSERT(status == Fw::FW_SERIALIZE_OK, static_cast<FwAssertArgType>(status));
129 
130  // Send it!
131  this->tlmOut_out(static_cast<FwIndexType>(port), id, timeTag, val);
132 
133  // Return the received buffer
134  fromBufferDriverReturn_out(0, fwBuffer);
135  }
136 }
137 
138 void GenericHub::toBufferDriverReturn_handler(FwIndexType portNum, Fw::Buffer& fwBuffer) {
139  // Deallocate the existing buffer
140  deallocate_out(portNum, fwBuffer);
141 }
142 
143 void GenericHub::eventIn_handler(const FwIndexType portNum,
144  FwEventIdType id,
145  Fw::Time& timeTag,
146  const Fw::LogSeverity& severity,
147  Fw::LogBuffer& args) {
151  Fw::ExternalSerializeBuffer serializer(buffer, sizeof(buffer));
152  serializer.resetSer();
153  status = serializer.serializeFrom(id);
155  status = serializer.serializeFrom(timeTag);
157  status = serializer.serializeFrom(severity);
159  status = serializer.serializeFrom(args);
161  FwSizeType size = serializer.getSize();
162  this->send_data(HubType::HUB_TYPE_EVENT, portNum, buffer, size);
163 }
164 
165 void GenericHub::tlmIn_handler(const FwIndexType portNum, FwChanIdType id, Fw::Time& timeTag, Fw::TlmBuffer& val) {
168  Fw::ExternalSerializeBuffer serializer(buffer, sizeof(buffer));
169  serializer.resetSer();
170  status = serializer.serializeFrom(id);
172  status = serializer.serializeFrom(timeTag);
174  status = serializer.serializeFrom(val);
176  FwSizeType size = serializer.getSize();
177  this->send_data(HubType::HUB_TYPE_CHANNEL, portNum, buffer, size);
178 }
179 
180 // ----------------------------------------------------------------------
181 // Handler implementations for user-defined serial input ports
182 // ----------------------------------------------------------------------
183 
184 void GenericHub::serialIn_handler(FwIndexType portNum,
185  Fw::SerializeBufferBase& Buffer
186 ) {
187  send_data(HUB_TYPE_PORT, portNum, Buffer.getBuffAddr(), Buffer.getSize());
188 }
189 
190 } // end namespace Svc
Serialization/Deserialization operation was successful.
SerializeStatus serializeFrom(U8 val, Endianness mode=Endianness::BIG) override
Serialize an 8-bit unsigned integer value.
void set(U8 *data, FwSizeType size, U32 context=NO_CONTEXT)
Definition: Buffer.cpp:86
PlatformSizeType FwSizeType
void setSize(FwSizeType size)
Definition: Buffer.cpp:75
Serializable::SizeType getSize() const override
Get current buffer size.
U32 getContext() const
Definition: Buffer.cpp:64
virtual U8 * getBuffAddr()=0
Get buffer address for data filling (non-const version)
U8 * getData() const
Definition: Buffer.cpp:56
FwSizeStoreType FwBuffSizeType
The size of the serial representation.
SerializeStatus
forward declaration for string
ExternalSerializeBufferWithMemberCopy getDeserializer()
Definition: Buffer.cpp:105
FwIdType FwEventIdType
The type of an event identifier.
Buffer type transmission.
Definition: GenericHub.hpp:29
External serialize buffer with no copy semantics.
FwIdType FwChanIdType
The type of a telemetry channel identifier.
Enum representing event severity.
uint8_t U8
8-bit unsigned integer
Definition: BasicTypes.h:53
FwSizeType getSize() const
Definition: Buffer.cpp:60
PlatformIndexType FwIndexType
Telemetry channel type.
Definition: GenericHub.hpp:31
Port type transmission.
Definition: GenericHub.hpp:28
RateGroupDivider component implementation.
SerializeStatus deserializeTo(U8 &val, Endianness mode=Endianness::BIG) override
Deserialize an 8-bit unsigned integer value.
GenericHub(const char *const compName)
Definition: GenericHub.cpp:27
Event transmission.
Definition: GenericHub.hpp:30
ExternalSerializeBufferWithMemberCopy getSerializer()
Definition: Buffer.cpp:95
#define FW_ASSERT(...)
Definition: Assert.hpp:14
#define FW_PORT_SERIALIZATION
calls for multi-note systems)
Definition: FpConfig.h:77