F´ Flight Software - C/C++ Documentation  NASA-v2.0.1
A framework for building embedded system applications to NASA flight quality standards.
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
UdpSenderComponentImpl.cpp
Go to the documentation of this file.
1 // ======================================================================
2 // \title UdpSenderImpl.cpp
3 // \author tcanham
4 // \brief cpp file for UdpSender 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 
15 #include "Fw/Types/BasicTypes.hpp"
16 #include <sys/types.h>
17 #include <string.h>
18 #include <errno.h>
19 #include <stdlib.h>
20 #include <unistd.h>
21 
22 //#define DEBUG_PRINT(x,...) printf(x,##__VA_ARGS__)
23 #define DEBUG_PRINT(x,...)
24 
25 namespace Svc {
26 
27  // ----------------------------------------------------------------------
28  // Construction, initialization, and destruction
29  // ----------------------------------------------------------------------
30 
33  const char *const compName
34  ) : UdpSenderComponentBase(compName),
35  m_fd(-1),
36  m_packetsSent(0),
37  m_bytesSent(0),
38  m_seq(0)
39  {
40 
41  }
42 
45  const NATIVE_INT_TYPE queueDepth,
46  const NATIVE_INT_TYPE msgSize,
47  const NATIVE_INT_TYPE instance
48  )
49  {
50  UdpSenderComponentBase::init(queueDepth, msgSize, instance);
51  }
52 
55  {
56  if (this->m_fd != -1) {
57  close(this->m_fd);
58  }
59  }
60 
62  const char* addr,
63  const char* port
64  ) {
65 
66  FW_ASSERT(addr);
67  FW_ASSERT(port);
68  // open UDP connection
69  this->m_fd = socket(AF_INET, SOCK_DGRAM, 0);
70  if (-1 == this->m_fd) {
71  Fw::LogStringArg arg(strerror(errno));
72  this->log_WARNING_HI_US_SocketError(arg);
73  return;
74  }
75 
76  /* fill in the server's address and data */
77  memset((char*)&m_servAddr, 0, sizeof(m_servAddr));
78  m_servAddr.sin_family = AF_INET;
79  m_servAddr.sin_port = htons(atoi(port));
80  inet_aton(addr , &m_servAddr.sin_addr);
81 
82  Fw::LogStringArg arg(addr);
83  this->log_ACTIVITY_HI_US_PortOpened(arg,atoi(port));
84 
85  }
86 
87 
88 
89  // ----------------------------------------------------------------------
90  // Handler implementations for user-defined typed input ports
91  // ----------------------------------------------------------------------
92 
93  void UdpSenderComponentImpl ::
94  Sched_handler(
95  const NATIVE_INT_TYPE portNum,
96  NATIVE_UINT_TYPE context
97  )
98  {
99  this->tlmWrite_US_BytesSent(this->m_bytesSent);
100  this->tlmWrite_US_PacketsSent(this->m_packetsSent);
101  }
102 
103  // ----------------------------------------------------------------------
104  // Handler implementations for user-defined serial input ports
105  // ----------------------------------------------------------------------
106 
107  void UdpSenderComponentImpl ::
108  PortsIn_handler(
109  NATIVE_INT_TYPE portNum,
110  Fw::SerializeBufferBase &Buffer
111  )
112  {
113  // return if we never successfully created the socket
114  if (-1 == this->m_fd) {
115  return;
116  }
117 
118  DEBUG_PRINT("PortsIn_handler: %d\n",portNum);
119  Fw::SerializeStatus stat;
120  m_sendBuff.resetSer();
121 
122  // serialize sequence number
123  stat = m_sendBuff.serialize(this->m_seq++);
124  FW_ASSERT(Fw::FW_SERIALIZE_OK == stat,stat);
125  // serialize port call
126  stat = m_sendBuff.serialize(static_cast<U8>(portNum));
127  FW_ASSERT(Fw::FW_SERIALIZE_OK == stat,stat);
128  // serialize port arguments buffer
129  stat = m_sendBuff.serialize(Buffer);
130  FW_ASSERT(Fw::FW_SERIALIZE_OK == stat,stat);
131  // send on UDP socket
132  DEBUG_PRINT("Sending %d bytes\n",m_sendBuff.getBuffLength());
133  ssize_t sendStat = sendto(this->m_fd,
134  m_sendBuff.getBuffAddr(),
135  m_sendBuff.getBuffLength(),
136  0,
137  (struct sockaddr *) &m_servAddr,
138  sizeof(m_servAddr));
139  if (-1 == sendStat) {
140  Fw::LogStringArg arg(strerror(errno));
141  this->log_WARNING_HI_US_SendError(arg);
142  } else {
143  FW_ASSERT((int)m_sendBuff.getBuffLength() == sendStat,(int)m_sendBuff.getBuffLength(),sendStat,portNum);
144  this->m_packetsSent++;
145  this->m_bytesSent += sendStat;
146  }
147  }
148 
149 #ifdef BUILD_UT
150  void UdpSenderComponentImpl::UdpSerialBuffer::operator=(const Svc::UdpSenderComponentImpl::UdpSerialBuffer& other) {
151  this->resetSer();
152  this->serialize(other.getBuffAddr(),other.getBuffLength(),true);
153  }
154 
155  UdpSenderComponentImpl::UdpSerialBuffer::UdpSerialBuffer(
156  const Fw::SerializeBufferBase& other) : Fw::SerializeBufferBase() {
157  FW_ASSERT(sizeof(this->m_buff)>= other.getBuffLength(),sizeof(this->m_buff),other.getBuffLength());
158  memcpy(this->m_buff,other.getBuffAddr(),other.getBuffLength());
159  this->setBuffLen(other.getBuffLength());
160  }
161 
162  UdpSenderComponentImpl::UdpSerialBuffer::UdpSerialBuffer(
163  const UdpSenderComponentImpl::UdpSerialBuffer& other) : Fw::SerializeBufferBase() {
164  FW_ASSERT(sizeof(this->m_buff)>= other.getBuffLength(),sizeof(this->m_buff),other.getBuffLength());
165  memcpy(this->m_buff,other.m_buff,other.getBuffLength());
166  this->setBuffLen(other.getBuffLength());
167  }
168 
169  UdpSenderComponentImpl::UdpSerialBuffer::UdpSerialBuffer(): Fw::SerializeBufferBase() {
170 
171  }
172 
173 #endif
174 
175 
176 } // end namespace Svc
Fw::SerializeBufferBase
Definition: Serializable.hpp:43
Fw::SerializeStatus
SerializeStatus
forward declaration for string
Definition: Serializable.hpp:14
Fw::LogStringArg
Definition: LogString.hpp:11
U8
uint8_t U8
8-bit unsigned integer
Definition: BasicTypes.hpp:76
Svc::UdpSenderComponentImpl::~UdpSenderComponentImpl
~UdpSenderComponentImpl(void)
Definition: UdpSenderComponentImpl.cpp:54
UdpSenderComponentImpl.hpp
Fw::FW_SERIALIZE_OK
@ FW_SERIALIZE_OK
Serialization/Deserialization operation was successful.
Definition: Serializable.hpp:15
Svc::UdpSenderComponentImpl::init
void init(const NATIVE_INT_TYPE queueDepth, const NATIVE_INT_TYPE msgSize, const NATIVE_INT_TYPE instance=0)
Definition: UdpSenderComponentImpl.cpp:44
Fw::SerializeBufferBase::getBuffAddr
virtual U8 * getBuffAddr(void)=0
gets buffer address for data filling
NATIVE_UINT_TYPE
unsigned int NATIVE_UINT_TYPE
native unsigned integer type declaration
Definition: BasicTypes.hpp:30
FW_ASSERT
#define FW_ASSERT(...)
Definition: Assert.hpp:9
Fw::SerializeBufferBase::getBuffLength
NATIVE_UINT_TYPE getBuffLength() const
returns current buffer size
Definition: Serializable.cpp:587
Svc::UdpSenderComponentImpl::UdpSenderComponentImpl
UdpSenderComponentImpl(const char *const compName)
Definition: UdpSenderComponentImpl.cpp:32
DEBUG_PRINT
#define DEBUG_PRINT(x,...)
Definition: UdpSenderComponentImpl.cpp:23
Svc
Definition: ActiveRateGroupImplCfg.hpp:18
BasicTypes.hpp
Declares ISF basic types.
NATIVE_INT_TYPE
int NATIVE_INT_TYPE
native integer type declaration
Definition: BasicTypes.hpp:29
Svc::UdpSenderComponentImpl::open
void open(const char *addr, const char *port)
Definition: UdpSenderComponentImpl.cpp:61
Fw
Definition: Buffer.cpp:21