* Minor improvements to the handling of landing gear by the SetGear and HandlePOSI functions * sendPOSI command change (double for lat/lon/h) (#111) * Updated POSI to use doubles for lat/lon/alt, as step size for floats was unacceptably large at high longitudes. * Updated Java library for MATLAB, updated Java project, and updated Windows plugin binaries * Rolled back Java version to 1.7 for MATLAB compatibility * Update MessageHandlers.cpp * Update DataManager.cpp * Added pause functionality for individual a/c Adds new cases such that: 0: Unpauses all a/c 1: Pauses all a/c 2: Switches case for all a/c 100:119: Pauses a/c 0:19 200:219: Unpauses a/c 0:19 Updates log messages. Keeps the 0,1,2 arguments as they previously were. * Finished individual pause functionality * Update DataManager.cpp * Updated flags to allow for individual pause commands * Individual pause command documentation * Updated flags to allow for individual pause commands * Adding individual pause to documentation * Updated flags to allow for individual pause commands * Requested changes, cleaning * Update CMakeLists.txt Include "-fno-stack-protector" for linking and compiling for systems that do not have this have this flag as a default. * Enabling AI after setting position (#118) Previously, the code enabled the AI before setting the position of a/c, which negated its purpose. * Updated XPlane SDK to version 2.1.3 * Resolve function ambiguity for std::abs on mac Fixes #126 * Update copyright notice * Update Windows binaries * Update Linux binaries * Update version numbers * fix osx abs ambiguity (#142) * fix indexing error (#143) * Runway camera location control (#144) * update ignore * basics working * set cam pos remotely * log cam position * keep default behaviour, if short view message is received Compatibility with existing software * all to tabs * rename variable * option to use camera direction fields * Added UDP multicast for plugin discovery (#153) * Added Timer * Added UDPSocket::GetAddr * Added MessageHandlers::SendBeacon() * PoC of starting a timer on PluginEnable * C++11 * Added Timer to xcode project * C++11 in cmake * added Timer to cmake * use function pointer in Timer * moved Timer to namespace + wait for thread to join when stopping the timer * Windows: changed uint to unisgned short * Windows: Added Timer.h/cpp to project * GetAddr static * Send xplane and plugin version with BECN * SendBeacon with params * fixed file copyrights * Include functional to fix Linux compile error * review fixes * Send plugin receive port in BECN * review fixes * Fixed tabs vs spaces indentations (#157) * Java client BECN implementation (#155) * Added MS Azure Dev Ops CI integration (#162) * Do not build for i386 on macOS Use ARCHS_STANDARD to avoid the error “The i386 architecture is deprecated. You should update your ARCHS build setting to remove the i386 architecture.” * Fixed missing include The Visual Studio solution was not compiling * Fixed isnan ambigious refernce Ambigious reference when compiling on travis https://stackoverflow.com/questions/33770374/why-is-isnan-ambiguous-and-how-to-avoid-it * Set MSVC warning level to 3 Too many warnings were generated when building a Release build making Travis job to fail because of too much output * Use default toolset for Visual Studio AppVeyor recommends to set the default toolset * #include <cstdint> * Use MSVC ToolsVersion="14.0" # Conflicts: # xpcPlugin/xpcPlugin/xpcPlugin.vcxproj * Removed binaries from repository # Conflicts: # xpcPlugin/XPlaneConnect/64/win.xpl # xpcPlugin/XPlaneConnect/win.xpl * Added ms azure ci xcode linux linux + macos linux + macos removed branch filter win tests win tests Test all platfroms artifacts tests * output all binaries to ‘XPlaneConnect’ All platforms produce a binary in xpcPlugin/XPlaneConnect/ xpcPlugin/XPlaneConnect/64/ * Added ms azure GH deploy deploy stage GH release test trigger tags * Clean up yml file - Added variables - Added job decriptions * Ignore script to ignore .exp files + fixed output path * Renamed ms azure GH connection * Update service connection for azure pipeline * Added Python3 compatible xpc client. (#156) * Update Azure Pipelines service connection
172 lines
4.3 KiB
C++
172 lines
4.3 KiB
C++
// Copyright (c) 2013-2018 United States Government as represented by the Administrator of the
|
|
// National Aeronautics and Space Administration. All Rights Reserved.
|
|
#include "Message.h"
|
|
#include "Log.h"
|
|
|
|
#include <cstring>
|
|
|
|
#include <iomanip>
|
|
#include <sstream>
|
|
#include <string>
|
|
|
|
namespace XPC
|
|
{
|
|
Message::Message() {}
|
|
|
|
Message Message::ReadFrom(const UDPSocket& sock)
|
|
{
|
|
Message m;
|
|
int len = sock.Read(m.buffer, bufferSize, &m.source);
|
|
m.size = len < 0 ? 0 : len;
|
|
if (len > 0)
|
|
{
|
|
Log::FormatLine(LOG_TRACE, "MESG", "Read message with length %i", len);
|
|
}
|
|
return m;
|
|
}
|
|
|
|
std::string Message::GetHead() const
|
|
{
|
|
std::string val = size < 4 ? "" : std::string((char*)buffer, 4);
|
|
return val;
|
|
}
|
|
|
|
const unsigned char* Message::GetBuffer() const
|
|
{
|
|
const unsigned char* val = size == 0 ? NULL : buffer;
|
|
return val;
|
|
}
|
|
|
|
std::size_t Message::GetSize() const
|
|
{
|
|
return size;
|
|
}
|
|
|
|
struct sockaddr Message::GetSource() const
|
|
{
|
|
return source;
|
|
}
|
|
|
|
void Message::PrintToLog() const
|
|
{
|
|
using namespace std;
|
|
stringstream ss;
|
|
|
|
// Dump raw bytes to string
|
|
ss << std::hex << setfill('0');
|
|
for (int i = 0; i < size; ++i)
|
|
{
|
|
ss << ' ' << setw(2) << static_cast<unsigned>(buffer[i]);
|
|
}
|
|
Log::WriteLine(LOG_TRACE, "DBUG", ss.str());
|
|
|
|
std::string head = GetHead();
|
|
ss.str("");
|
|
ss << "Head: " << head << std::dec << " Size: " << GetSize();
|
|
if (head == "CONN" || head == "WYPT" || head == "TEXT")
|
|
{
|
|
Log::WriteLine(LOG_DEBUG, "DBUG", ss.str());
|
|
}
|
|
else if (head == "CTRL")
|
|
{
|
|
// Parse message data
|
|
float pitch = *((float*)(buffer + 5));
|
|
float roll = *((float*)(buffer + 9));
|
|
float yaw = *((float*)(buffer + 13));
|
|
float thr = *((float*)(buffer + 17));
|
|
char gear = buffer[21];
|
|
float flaps = *((float*)(buffer + 22));
|
|
unsigned char aircraft = 0;
|
|
if (size == 27)
|
|
{
|
|
aircraft = buffer[26];
|
|
}
|
|
ss << " Attitude:(" << pitch << " " << roll << " " << yaw << ")";
|
|
ss << " Thr:" << thr << " Gear:" << (int)gear << " Flaps:" << flaps;
|
|
Log::WriteLine(LOG_DEBUG, "DBUG", ss.str());
|
|
}
|
|
else if (head == "DATA")
|
|
{
|
|
size_t numCols = (size - 5) / 36;
|
|
float values[32][9];
|
|
for (int i = 0; i < numCols; ++i)
|
|
{
|
|
values[i][0] = buffer[5 + 36 * i];
|
|
memcpy(values[i] + 1, buffer + 9 + 36 * i, 9 * sizeof(float));
|
|
}
|
|
ss << " (" << numCols << " lines)";
|
|
Log::WriteLine(LOG_DEBUG, "DBUG", ss.str());
|
|
for (int i = 0; i < numCols; ++i)
|
|
{
|
|
ss.str("");
|
|
ss << " #" << values[i][0];
|
|
for (int j = 1; j < 9; ++j)
|
|
{
|
|
ss << " " << values[i][j];
|
|
}
|
|
Log::WriteLine(LOG_DEBUG, "DBUG", ss.str());
|
|
}
|
|
}
|
|
else if (head == "DREF")
|
|
{
|
|
Log::WriteLine(LOG_DEBUG, "DBUG", ss.str());
|
|
string dref((char*)buffer + 6, buffer[5]);
|
|
Log::FormatLine(LOG_DEBUG, "DBUG", " DREF (size %i) = %s", dref.length(), dref.c_str());
|
|
ss.str("");
|
|
int values = buffer[6 + buffer[5]];
|
|
ss << " Values(size " << values << ") =";
|
|
for (int i = 0; i < values; ++i)
|
|
{
|
|
ss << " " << *((float*)(buffer + values + 1 + sizeof(float) * i));
|
|
}
|
|
Log::WriteLine(LOG_DEBUG, "DBUG", ss.str());
|
|
}
|
|
else if (head == "GETC" || head == "GETP")
|
|
{
|
|
ss << " Aircraft:" << (int)buffer[5];
|
|
Log::WriteLine(LOG_DEBUG, "DBUG", ss.str());
|
|
}
|
|
else if (head == "GETD")
|
|
{
|
|
Log::WriteLine(LOG_DEBUG, "DBUG", ss.str());
|
|
int cur = 6;
|
|
for (int i = 0; i < buffer[5]; ++i)
|
|
{
|
|
string dref((char*)buffer + cur + 1, buffer[cur]);
|
|
Log::FormatLine(LOG_DEBUG, "DBUG", " #%i/%i (size:%i) %s",
|
|
i + 1, buffer[5], dref.length(), dref.c_str());
|
|
cur += 1 + buffer[cur];
|
|
}
|
|
}
|
|
else if (head == "POSI")
|
|
{
|
|
char aircraft = buffer[5];
|
|
float gear = *((float*)(buffer + 30));
|
|
float pos[3];
|
|
float orient[3];
|
|
memcpy(pos, buffer + 6, 12);
|
|
memcpy(orient, buffer + 18, 12);
|
|
ss << " AC:" << (int)aircraft;
|
|
ss << " Pos:(" << pos[0] << ' ' << pos[1] << ' ' << pos[2] << ") Orient:(";
|
|
ss << orient[0] << ' ' << orient[1] << ' ' << orient[2] << ") Gear:";
|
|
ss << gear;
|
|
Log::WriteLine(LOG_DEBUG, "DBUG", ss.str());
|
|
}
|
|
else if (head == "SIMU")
|
|
{
|
|
ss << ' ' << (int)buffer[5];
|
|
Log::WriteLine(LOG_DEBUG, "DBUG", ss.str());
|
|
}
|
|
else if (head == "VIEW")
|
|
{
|
|
ss << "Type:" << *((unsigned long*)(buffer + 5));
|
|
Log::WriteLine(LOG_DEBUG, "DBUG", ss.str());
|
|
}
|
|
else
|
|
{
|
|
ss << " UNKNOWN HEADER ";
|
|
Log::WriteLine(LOG_DEBUG, "DBUG", ss.str());
|
|
}
|
|
}
|
|
}
|