146 lines
4.2 KiB
C++
146 lines
4.2 KiB
C++
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
Module: FGUDPOutputSocket.cpp
|
|
Author: David Culp
|
|
Date started: 03/31/15
|
|
Purpose: Manage output of property values to a UDP socket
|
|
Called by: FGOutput
|
|
|
|
------------- Copyright (C) 2015 David Culp ----------------
|
|
|
|
This program is free software; you can redistribute it and/or modify it under
|
|
the terms of the GNU Lesser General Public License as published by the Free Software
|
|
Foundation; either version 2 of the License, or (at your option) any later
|
|
version.
|
|
|
|
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
|
|
details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public License along with
|
|
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
|
Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
Further information about the GNU Lesser General Public License can also be found on
|
|
the world wide web at http://www.gnu.org.
|
|
|
|
FUNCTIONAL DESCRIPTION
|
|
--------------------------------------------------------------------------------
|
|
This class sends comma-separated strings over a UDP socket. The format is that required
|
|
by the QtJSBSim application.
|
|
|
|
HISTORY
|
|
--------------------------------------------------------------------------------
|
|
03/31/15 DC Created
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
INCLUDES
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
|
|
|
#include <cstring>
|
|
#include <cstdlib>
|
|
|
|
#include "FGUDPOutputSocket.h"
|
|
#include "FGFDMExec.h"
|
|
#include "input_output/FGPropertyManager.h"
|
|
#include "input_output/FGXMLElement.h"
|
|
|
|
using namespace std;
|
|
|
|
namespace JSBSim {
|
|
|
|
IDENT(IdSrc,"$Id: FGUDPOutputSocket.cpp,v 1.2 2015/08/16 13:19:52 bcoconni Exp $");
|
|
IDENT(IdHdr,ID_UDPOUTPUTSOCKET);
|
|
|
|
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
CLASS IMPLEMENTATION
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
|
|
|
FGUDPOutputSocket::FGUDPOutputSocket(FGFDMExec* fdmex) :
|
|
FGOutputType(fdmex),
|
|
socket(0)
|
|
{
|
|
FDMExec = fdmex;
|
|
PropertyManager = fdmex->GetPropertyManager();
|
|
root = PropertyManager->GetNode();
|
|
root->SetDouble("simulation/null", 0.0);
|
|
SockName = "localhost";
|
|
SockPort = 5138;
|
|
}
|
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
FGUDPOutputSocket::~FGUDPOutputSocket()
|
|
{
|
|
delete socket;
|
|
}
|
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
bool FGUDPOutputSocket::Load(Element* el)
|
|
{
|
|
|
|
Element *property_element = el->FindElement("property");
|
|
|
|
while (property_element) {
|
|
string property_str = property_element->GetDataLine();
|
|
FGPropertyNode* node = PropertyManager->GetNode(property_str);
|
|
if (!node) {
|
|
node = PropertyManager->GetNode("simulation/null");
|
|
}
|
|
OutputProperties.push_back(node);
|
|
property_element = el->FindNextElement("property");
|
|
}
|
|
|
|
double outRate = 1.0;
|
|
if (!el->GetAttributeValue("rate").empty()) {
|
|
outRate = el->GetAttributeValueAsNumber("rate");
|
|
}
|
|
SetRateHz(outRate);
|
|
|
|
SockPort = atoi(el->GetAttributeValue("port").c_str());
|
|
if (SockPort == 0) {
|
|
cerr << endl << "No port assigned for output." << endl;
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
bool FGUDPOutputSocket::InitModel(void)
|
|
{
|
|
if (FGOutputType::InitModel()) {
|
|
delete socket;
|
|
socket = new FGfdmSocket(SockName, SockPort, FGfdmSocket::ptUDP);
|
|
|
|
if (socket == 0) return false;
|
|
if (!socket->GetConnectStatus()) return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
void FGUDPOutputSocket::Print(void)
|
|
{
|
|
|
|
if (socket == 0) return;
|
|
if (!socket->GetConnectStatus()) return;
|
|
|
|
socket->Clear();
|
|
socket->Append(FDMExec->GetSimTime());
|
|
|
|
for (unsigned int i=0;i<OutputProperties.size();i++) {
|
|
socket->Append(OutputProperties[i]->getDoubleValue());
|
|
}
|
|
|
|
socket->Send();
|
|
}
|
|
|
|
}
|