12 #include <sys/socket.h> 13 #include <netinet/in.h> 14 #include <arpa/inet.h> 15 #include "LibCyberRadio/NDR651/PacketTypes.h" 16 #include "LibCyberRadio/NDR651/UdpStatusReceiver.h" 17 #include <sys/types.h> 18 #include <sys/ioctl.h> 38 _freeSpaceMax(MAX_RADIO_BUFFSIZE - RADIO_BUFFER_RESERVE),
42 bzero(&_rxbuff, MAX_RX_SIZE);
49 this->
debug(
"Interrupting\n");
54 this->_fcMutex.lock();
55 this->_selMutex.lock();
57 this->
debug(
"Closing socket\n");
61 this->
debug(
"Goodbye!\n");
64 bool UdpStatusReceiver::_makeSocket(
void) {
66 struct sockaddr_in serveraddr;
67 char ip_addr_string[INET_ADDRSTRLEN];
76 if ((_sockfd<0)&&(_port>0)) {
77 _sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
79 std::cerr <<
"Error opening socket" << std::endl;
84 setsockopt(_sockfd, SOL_SOCKET, SO_REUSEADDR,
85 (
const void *)&optval ,
sizeof(
int));
94 memset((
char *) &serveraddr, 0,
sizeof(serveraddr));
95 serveraddr.sin_family = AF_INET;
96 serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
97 inet_ntop(AF_INET, &(serveraddr.sin_addr), ip_addr_string, INET_ADDRSTRLEN);
98 serveraddr.sin_port = htons((
unsigned short)_port);
102 if (bind(_sockfd, (
struct sockaddr *) &serveraddr,
sizeof(serveraddr)) < 0) {
103 std::cerr <<
"ERROR on binding socket" << std::endl;
107 std::cerr <<
"Status socket bound" << std::endl;
110 FD_SET(_sockfd, &
set);
122 if (makeSocketFlag) {
123 return _makeSocket();
136 if (makeSocketFlag) {
137 return _makeSocket();
143 bool UdpStatusReceiver::setUpdatePE(
bool updatePE) {
144 std::cerr << std::endl << std::endl <<
"setUpdatePE(" << updatePE <<
")" << std::endl << std::endl;
147 _updatePE = updatePE;
150 return _updatePE==updatePE;
153 int UdpStatusReceiver::setMaxFreeSpace(
float fs,
float maxLatency) {
154 int maxSamplesLatency = (int)std::floor(maxLatency*fs);
157 _freeSpaceMax = std::min( MAX_RADIO_BUFFSIZE-RADIO_BUFFER_RESERVE, maxSamplesLatency );
159 return _freeSpaceMax;
163 std::cout <<
"UdpStatusReceiver::run() " << _651freeSpace << std::endl;
164 struct timespec spec;
166 struct sockaddr_in clientaddr;
167 socklen_t clientlen =
sizeof(clientaddr);
170 long int oldFreeSpace = 0;
171 while(this->
isRunning() && (!_shutdown)) {
172 tout.tv_sec = (
long int) 0;
173 tout.tv_usec = (
long int) 500000;
175 FD_SET(_sockfd, &
set);
177 if (select(FD_SETSIZE, &
set, NULL, NULL, &tout)>0) {
179 numBytesRx = recvfrom(_sockfd, _rxbuff, MAX_RX_SIZE, 0, (
struct sockaddr *) &clientaddr, &clientlen);
184 oldFreeSpace = _651freeSpace;
188 std::cout << std::endl;
192 std::cout <<
"Free space = " << oldFreeSpace <<
"->" << _651freeSpace <<
"?" << status->
status.
spaceAvailable <<
" [" << _freeSpaceMax <<
"]";
222 std::cerr <<
"> " << std::endl;
240 bool UdpStatusReceiver::_setFreeSpace(
int updateFromRadio,
bool flagPP,
bool flagPE,
bool flagPF) {
241 bool updated =
false;
243 if (((!_updatePE)&&flagPP)||(_updatePE&&flagPE)) {
244 _651freeSpace = std::min( _freeSpaceMax, updateFromRadio - RADIO_BUFFER_RESERVE );
253 bool ok = _651freeSpace>=numSamples;
254 if (!(ok&&lockIfOk)) {
263 boost::mutex::scoped_lock lock(_fcMutex);
264 return _651freeSpace;
271 _651freeSpace -= samplesSent;
273 return _651freeSpace>0;
uint32_t emptyFlag
Empty flag.
virtual bool isRunning() const
Determines if the thread is running or not.
uint32_t underrunCount
Underrun count.
bool okToSend(long int pendingSamples, bool lockIfOk)
Determines if it is OK to send data.
bool sentNSamples(long int samplesSent)
Updates status based on the number of samples sent.
virtual void interrupt()
Interrupts (stops) the thread.
uint32_t packetLossCount
Packet loss count.
uint32_t overrunFlag
Overrun flag.
uint32_t underrunFlag
Underrun flag.
bool setStatusInterface(std::string ifname)
Sets the interface name.
Class that supports debug output.
virtual ~UdpStatusReceiver()
Destroys a UdpStatusReceiver object.
uint32_t overrunCount
Overrun count.
virtual void run()
Executes the main processing loop for the thread.
long int getFreeSpace(void)
Gets the amount of free space available.
UdpStatusReceiver(std::string ifname, unsigned int port, bool debug, bool updatePE)
Constructs a UdpStatusReceiver object.
uint32_t packetLossFlag
Packet loss flag.
uint32_t spaceAvailable
Space available.
struct Vita49Header v49
VITA 49 frame header.
virtual int debug(const char *format,...)
Outputs debug information.
Defines functionality for LibCyberRadio applications.
Transmit status frame information.
uint32_t PE
Emptying trigger.
bool setStatusPort(unsigned int port)
Sets the UDP port.
Base class for a thread object, based on Boost Threads.
virtual void sleep(double secs)
Pauses thread execution for a given time, checking for user interrupts during that time...
uint32_t PF
Filling trigger.
struct TxStatusPayload status
Transmit status information.
uint32_t PP
Periodic notification.