F´ Flight Software - C/C++ Documentation
A framework for building embedded system applications to NASA flight quality standards.
UdpComponentImpl.cpp
Go to the documentation of this file.
1 // ======================================================================
2 // \title UdpComponentImpl.cpp
3 // \author mstarch
4 // \brief cpp file for UdpComponentImpl component implementation class
5 //
6 // \copyright
7 // Copyright 2009-2020, by the California Institute of Technology.
8 // ALL RIGHTS RESERVED. United States Government Sponsorship
9 // acknowledged.
10 //
11 // ======================================================================
12 
13 #include <limits>
15 #include <config/IpCfg.hpp>
16 #include <Fw/FPrimeBasicTypes.hpp>
17 #include "Fw/Types/Assert.hpp"
18 
19 
20 namespace Drv {
21 
22 // ----------------------------------------------------------------------
23 // Construction, initialization, and destruction
24 // ----------------------------------------------------------------------
25 
26 UdpComponentImpl::UdpComponentImpl(const char* const compName)
27  : UdpComponentBase(compName) {}
28 
30  const U16 port,
31  const U32 send_timeout_seconds,
32  const U32 send_timeout_microseconds) {
33  return m_socket.configureSend(hostname, port, send_timeout_seconds, send_timeout_microseconds);
34 }
35 
36 SocketIpStatus UdpComponentImpl::configureRecv(const char* hostname, const U16 port, FwSizeType buffer_size) {
37  FW_ASSERT(buffer_size <= std::numeric_limits<U32>::max(), static_cast<FwAssertArgType>(buffer_size));
38  m_allocation_size = buffer_size; // Store the buffer size
39 
40  return m_socket.configureRecv(hostname, port);
41 }
42 
44 
46  return this->m_socket.getRecvPort();
47 }
48 
49 // ----------------------------------------------------------------------
50 // Implementations for socket read task virtual methods
51 // ----------------------------------------------------------------------
52 
54  return m_socket;
55 }
56 
58  return allocate_out(0, static_cast<U32>(m_allocation_size));
59 }
60 
63  if (status == SOCK_SUCCESS) {
64  recvStatus = ByteStreamStatus::OP_OK;
65  }
66  else if (status == SOCK_NO_DATA_AVAILABLE) {
67  recvStatus = ByteStreamStatus::RECV_NO_DATA;
68  }
69  else {
70  recvStatus = ByteStreamStatus::OTHER_ERROR;
71  }
72  this->recv_out(0, buffer, recvStatus);
73 }
74 
77  this->ready_out(0);
78  }
79 }
80 
81 // ----------------------------------------------------------------------
82 // Handler implementations for user-defined typed input ports
83 // ----------------------------------------------------------------------
84 
85 void UdpComponentImpl::send_handler(const FwIndexType portNum, Fw::Buffer& fwBuffer) {
86  Drv::SocketIpStatus status = send(fwBuffer.getData(), fwBuffer.getSize());
87  Drv::ByteStreamStatus returnStatus;
88  switch (status) {
90  returnStatus = ByteStreamStatus::SEND_RETRY;
91  break;
92  case SOCK_DISCONNECTED:
93  returnStatus = ByteStreamStatus::SEND_RETRY;
94  break;
95  case SOCK_SUCCESS:
96  returnStatus = ByteStreamStatus::OP_OK;
97  break;
98  default:
99  returnStatus = ByteStreamStatus::OTHER_ERROR;
100  break;
101  }
102  // Return the buffer and status to the caller
103  this->sendReturnOut_out(0, fwBuffer, returnStatus);
104 }
105 
106 void UdpComponentImpl::recvReturnIn_handler(FwIndexType portNum, Fw::Buffer& fwBuffer) {
107  this->deallocate_out(0, fwBuffer);
108 }
109 
110 } // end namespace Drv
void recv_out(FwIndexType portNum, Fw::Buffer &buffer, const Drv::ByteStreamStatus &status)
Invoke output port recv.
U16 getRecvPort()
get the port being received on
U16 getRecvPort()
get the port being received on
Definition: UdpSocket.cpp:83
Failed to read socket with disconnect.
Definition: IpSocket.hpp:38
Interrupted status for retries.
Definition: IpSocket.hpp:36
PlatformSizeType FwSizeType
SocketIpStatus send(const U8 *const data, const U32 size)
send data to the IP socket from the given buffer
U8 * getData() const
Definition: Buffer.cpp:68
SocketIpStatus configureRecv(const char *hostname, const U16 port)
configure the udp socket for incoming transmissions
Definition: UdpSocket.cpp:75
Error occurred, retrying may succeed.
UdpComponentImpl(const char *const compName)
construct the TcpClient component.
Receive worked, but there was no data.
SocketIpStatus configureRecv(const char *hostname, const U16 port, FwSizeType buffer_size=1024)
Configures the Udp receive settings but does not open the connection.
void connected() override
called when the IPv4 system has been connected
Status returned by the send call.
Socket operation successful.
Definition: IpSocket.hpp:30
void deallocate_out(FwIndexType portNum, Fw::Buffer &fwBuffer)
Invoke output port deallocate.
Fw::Buffer getBuffer() override
returns a buffer to fill with data
SocketIpStatus configureSend(const char *hostname, const U16 port, const U32 send_timeout_seconds=SOCKET_SEND_TIMEOUT_SECONDS, const U32 send_timeout_microseconds=SOCKET_SEND_TIMEOUT_MICROSECONDS)
Configures the Udp send settings but does not open the connection.
Operation worked as expected.
bool isConnected_ready_OutputPort(FwIndexType portNum)
SocketIpStatus configureSend(const char *hostname, const U16 port, const U32 send_timeout_seconds, const U32 send_timeout_microseconds)
configure the udp socket for outgoing transmissions
Definition: UdpSocket.cpp:68
Fw::Buffer allocate_out(FwIndexType portNum, U32 size)
Invoke output port allocate.
IpSocket & getSocketHandler() override
returns a reference to the socket handler
PlatformIndexType FwIndexType
void sendBuffer(Fw::Buffer buffer, SocketIpStatus status) override
sends a buffer to be filled with data
Auto-generated base for Udp component.
SocketIpStatus
Status enumeration for socket return values.
Definition: IpSocket.hpp:29
void ready_out(FwIndexType portNum)
Invoke output port ready.
~UdpComponentImpl()
Destroy the component.
Helper base-class for setting up Berkeley sockets.
Definition: IpSocket.hpp:57
No data available or read operation would block.
Definition: IpSocket.hpp:45
SizeType getSize() const
Definition: Buffer.cpp:72
void sendReturnOut_out(FwIndexType portNum, Fw::Buffer &buffer, const Drv::ByteStreamStatus &status)
Invoke output port sendReturnOut.
#define FW_ASSERT(...)
Definition: Assert.hpp:14