F´ Flight Software - C/C++ Documentation  devel
A framework for building embedded system applications to NASA flight quality standards.
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
TcpClientComponentImpl.cpp
Go to the documentation of this file.
1 // ======================================================================
2 // \title TcpClientComponentImpl.cpp
3 // \author mstarch
4 // \brief cpp file for TcpClientComponentImpl 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 <FpConfig.hpp>
16 #include "Fw/Types/Assert.hpp"
17 
18 
19 namespace Drv {
20 
21 // ----------------------------------------------------------------------
22 // Construction, initialization, and destruction
23 // ----------------------------------------------------------------------
24 
26  : TcpClientComponentBase(compName) {}
27 
29  const U16 port,
30  const U32 send_timeout_seconds,
31  const U32 send_timeout_microseconds,
32  FwSizeType buffer_size) {
33 
34  // Check that ensures the configured buffer size fits within the limits fixed-width type, U32
35  FW_ASSERT(buffer_size <= std::numeric_limits<U32>::max(), static_cast<FwAssertArgType>(buffer_size));
36  m_allocation_size = buffer_size; // Store the buffer size
37  return m_socket.configure(hostname, port, send_timeout_seconds, send_timeout_microseconds);
38 }
39 
41 
42 // ----------------------------------------------------------------------
43 // Implementations for socket read task virtual methods
44 // ----------------------------------------------------------------------
45 
47  return m_socket;
48 }
49 
51  return allocate_out(0, static_cast<U32>(m_allocation_size));
52 }
53 
56  if (status == SOCK_SUCCESS) {
57  recvStatus = RecvStatus::RECV_OK;
58  }
59  else if (status == SOCK_NO_DATA_AVAILABLE) {
60  recvStatus = RecvStatus::RECV_NO_DATA;
61  }
62  else {
63  recvStatus = RecvStatus::RECV_ERROR;
64  }
65  this->recv_out(0, buffer, recvStatus);
66 }
67 
70  this->ready_out(0);
71  }
72 
73 }
74 
75 // ----------------------------------------------------------------------
76 // Handler implementations for user-defined typed input ports
77 // ----------------------------------------------------------------------
78 
79 Drv::SendStatus TcpClientComponentImpl::send_handler(const NATIVE_INT_TYPE portNum, Fw::Buffer& fwBuffer) {
80  Drv::SocketIpStatus status = send(fwBuffer.getData(), fwBuffer.getSize());
81  // Only deallocate buffer when the caller is not asked to retry
82  if (status == SOCK_INTERRUPTED_TRY_AGAIN) {
84  } else if (status != SOCK_SUCCESS) {
85  deallocate_out(0, fwBuffer);
87  }
88  deallocate_out(0, fwBuffer);
89  return SendStatus::SEND_OK;
90 }
91 
92 } // end namespace Drv
#define FW_ASSERT(...)
Definition: Assert.hpp:14
PlatformIntType NATIVE_INT_TYPE
Definition: BasicTypes.h:55
PlatformAssertArgType FwAssertArgType
Definition: FpConfig.h:39
PlatformSizeType FwSizeType
Definition: FpConfig.h:35
C++-compatible configuration header for fprime configuration.
Helper base-class for setting up Berkeley sockets.
Definition: IpSocket.hpp:55
SocketIpStatus configure(const char *hostname, const U16 port, const U32 send_timeout_seconds, const U32 send_timeout_microseconds)
configure the ip socket with host and transmission timeouts
Definition: IpSocket.cpp:53
Status associated with the received data.
@ RECV_OK
Receive worked as expected.
@ RECV_ERROR
Receive error occurred retrying may succeed.
@ RECV_NO_DATA
Receive worked, but there was no data.
Status returned by the send call.
@ SEND_ERROR
Send error occurred retrying may succeed.
@ SEND_RETRY
Data send should be retried.
@ SEND_OK
Send worked as expected.
SocketIpStatus send(const U8 *const data, const U32 size)
send data to the IP socket from the given buffer
Auto-generated base for TcpClient component.
bool isConnected_ready_OutputPort(FwIndexType portNum)
void ready_out(FwIndexType portNum)
Invoke output port ready.
void deallocate_out(FwIndexType portNum, Fw::Buffer &fwBuffer)
Invoke output port deallocate.
void recv_out(FwIndexType portNum, Fw::Buffer &recvBuffer, const Drv::RecvStatus &recvStatus)
Invoke output port recv.
Fw::Buffer allocate_out(FwIndexType portNum, U32 size)
Invoke output port allocate.
SocketIpStatus configure(const char *hostname, const U16 port, const U32 send_timeout_seconds=SOCKET_SEND_TIMEOUT_SECONDS, const U32 send_timeout_microseconds=SOCKET_SEND_TIMEOUT_MICROSECONDS, FwSizeType buffer_size=1024)
Configures the TcpClient settings but does not open the connection.
TcpClientComponentImpl(const char *const compName)
construct the TcpClient component.
void connected()
called when the IPv4 system has been connected
void sendBuffer(Fw::Buffer buffer, SocketIpStatus status)
sends a buffer to be filled with data
IpSocket & getSocketHandler()
returns a reference to the socket handler
Fw::Buffer getBuffer()
returns a buffer to fill with data
~TcpClientComponentImpl()
Destroy the component.
U8 * getData() const
Definition: Buffer.cpp:68
U32 getSize() const
Definition: Buffer.cpp:72
SocketIpStatus
Status enumeration for socket return values.
Definition: IpSocket.hpp:29
@ SOCK_SUCCESS
Socket operation successful.
Definition: IpSocket.hpp:30
@ SOCK_INTERRUPTED_TRY_AGAIN
Interrupted status for retries.
Definition: IpSocket.hpp:36
@ SOCK_NO_DATA_AVAILABLE
No data available or read operation would block.
Definition: IpSocket.hpp:45