This commit is contained in:
Kilian Hofmann 2022-09-11 23:26:28 +02:00
parent 46a0607b55
commit 07487e9e51
17 changed files with 161 additions and 180 deletions

View File

@ -1,5 +1,3 @@
- Reverse engineer FSUIPC .NET onRunway Check - Reverse engineer FSUIPC .NET onRunway Check
- Update OSXCross Docker image to SDK 11 - Update OSXCross Docker image to SDK 11
- Implement ARM64 arch for Plugin - Implement ARM64 arch for Plugin
- Refactor SimDatabase to be a class
- Requires new Airport class

View File

@ -20,11 +20,10 @@ namespace file
std::ifstream in(XPLANE_PLUGIN_DIRECTORY CONFIG); std::ifstream in(XPLANE_PLUGIN_DIRECTORY CONFIG);
std::string line; std::string line;
while (std::getline(in, line)) { while (std::getline(in, line)) {
std::vector<std::string> fields = std::vector<std::string> fields = util::split(line, '=');
germanairlinesva::util::split(line, '=');
if (fields.size() >= 2) { if (fields.size() >= 2) {
germanairlinesva::util::trim(fields[0]); util::trim(fields[0]);
germanairlinesva::util::trim(fields[1]); util::trim(fields[1]);
if (fields[0] == "scenery") { if (fields[0] == "scenery") {
this->scenery = fields[1]; this->scenery = fields[1];
} else if (fields[0] == "user") { } else if (fields[0] == "user") {

View File

@ -7,7 +7,7 @@ namespace file
namespace simdata namespace simdata
{ {
Gate::Gate(std::string designator, Gate::Gate(std::string designator,
struct germanairlinesva::geodata::point center, struct geodata::point center,
std::uint8_t radius) std::uint8_t radius)
{ {
this->designator = designator; this->designator = designator;
@ -22,10 +22,9 @@ namespace file
write<decltype(this->radius)>(out, this->radius); write<decltype(this->radius)>(out, this->radius);
} }
bool Gate::contains(germanairlinesva::geodata::point coordinates) const bool Gate::contains(geodata::point coordinates) const
{ {
return germanairlinesva::geodata::distanceEarthP(this->center, return geodata::distanceEarthP(this->center, coordinates);
coordinates);
} }
} // namespace simdata } // namespace simdata
} // namespace file } // namespace file

View File

@ -26,14 +26,16 @@ namespace file
std::uint32_t time; std::uint32_t time;
std::uint16_t altitude = 0; std::uint16_t altitude = 0;
std::uint16_t groundSpeed = 0; std::uint16_t groundSpeed = 0;
struct germanairlinesva::geodata::point coordinates{NAN, NAN}; struct geodata::point coordinates {
NAN, NAN
};
public: public:
RecordingEntry() = default; RecordingEntry() = default;
RecordingEntry(std::uint32_t time, RecordingEntry(std::uint32_t time,
std::uint16_t altitude, std::uint16_t altitude,
std::uint16_t groundSpeed, std::uint16_t groundSpeed,
struct germanairlinesva::geodata::point coordinates); struct geodata::point coordinates);
void toFile(std::ofstream &out) const; void toFile(std::ofstream &out) const;

View File

@ -34,16 +34,16 @@ namespace file
{ {
private: private:
std::string designator; std::string designator;
struct germanairlinesva::geodata::point center; struct geodata::point center;
std::uint8_t radius; std::uint8_t radius;
public: public:
Gate(std::string designator, Gate(std::string designator,
struct germanairlinesva::geodata::point center, struct geodata::point center,
std::uint8_t radius); std::uint8_t radius);
void toFile(std::ofstream &out) const; void toFile(std::ofstream &out) const;
bool contains(germanairlinesva::geodata::point coordinates) const; bool contains(geodata::point coordinates) const;
inline const std::string to_string() const inline const std::string to_string() const
{ {

View File

@ -34,7 +34,7 @@ namespace file
{ {
private: private:
std::string designator; std::string designator;
struct germanairlinesva::geodata::box bounds; struct geodata::box bounds;
std::uint8_t width; std::uint8_t width;
std::uint16_t length; std::uint16_t length;
std::uint16_t trueHeading; std::uint16_t trueHeading;
@ -50,7 +50,7 @@ namespace file
double width); double width);
// From database // From database
Runway(std::string designator, Runway(std::string designator,
struct germanairlinesva::geodata::box bounds, struct geodata::box bounds,
std::uint8_t width, std::uint8_t width,
std::uint16_t length, std::uint16_t length,
std::uint16_t trueHeading); std::uint16_t trueHeading);

View File

@ -42,10 +42,7 @@ namespace file
class SimDatabase class SimDatabase
{ {
private: private:
std::map< std::map<std::string, std::pair<std::vector<Gate>, std::vector<Runway>>>
std::string,
std::pair<std::vector<germanairlinesva::file::simdata::Gate>,
std::vector<germanairlinesva::file::simdata::Runway>>>
airports; airports;
void fromFile(); void fromFile();
@ -64,11 +61,11 @@ namespace file
const std::vector<Runway>> const std::vector<Runway>>
operator[](std::string key) operator[](std::string key)
{ {
try { auto it = this->airports.find(key);
return this->airports.at(key); if (it != this->airports.end()) {
} catch (std::out_of_range &ex) { return this->airports[key];
return std::pair<const std::vector<Gate>, } else {
const std::vector<Runway>>(); return std::pair<std::vector<Gate>, std::vector<Runway>>();
} }
} }
}; };

View File

@ -20,15 +20,13 @@ namespace file
const std::string defaultFile, const std::string defaultFile,
const std::string sceneryPack, const std::string sceneryPack,
const std::string logFile, const std::string logFile,
std::map<std::string, std::map<std::string, std::pair<std::vector<Gate>, std::vector<Runway>>>
std::pair<std::vector<Gate>, std::vector<Runway>>>
&airports); &airports);
void makeAirport( void makeAirport(
const std::string &kind, const std::string &kind,
std::ifstream &infile, std::ifstream &infile,
std::map<std::string, std::map<std::string, std::pair<std::vector<Gate>, std::vector<Runway>>>
std::pair<std::vector<Gate>, std::vector<Runway>>>
&airports, &airports,
std::ofstream &logfile); std::ofstream &logfile);
void makeGate15(std::vector<Gate> &gates, void makeGate15(std::vector<Gate> &gates,

View File

@ -8,7 +8,7 @@ namespace file
{ {
Logbook::Logbook() Logbook::Logbook()
{ {
if (germanairlinesva::util::fileExists(XPLANE_PLUGIN_DIRECTORY LOGBOOK)) { if (util::fileExists(XPLANE_PLUGIN_DIRECTORY LOGBOOK)) {
this->fromFile(); this->fromFile();
} }
} }

View File

@ -7,11 +7,10 @@ namespace file
{ {
namespace recording namespace recording
{ {
RecordingEntry::RecordingEntry( RecordingEntry::RecordingEntry(std::uint32_t time,
std::uint32_t time,
std::uint16_t altitude, std::uint16_t altitude,
std::uint16_t groundSpeed, std::uint16_t groundSpeed,
struct germanairlinesva::geodata::point coordinates) struct geodata::point coordinates)
{ {
this->time = time; this->time = time;
this->altitude = altitude; this->altitude = altitude;

View File

@ -15,24 +15,23 @@ namespace file
{ {
this->designator = designator; this->designator = designator;
this->width = width; this->width = width;
this->length = germanairlinesva::geodata::distanceEarthD(latitudeStart, this->length = geodata::distanceEarthD(latitudeStart,
longitudeStart, longitudeStart,
latitudeEnd, latitudeEnd,
longitudeEnd); longitudeEnd);
this->trueHeading = (std::uint16_t)std::round( this->trueHeading =
germanairlinesva::geodata::bearingDD(latitudeStart, (std::uint16_t)std::round(geodata::bearingDD(latitudeStart,
longitudeStart, longitudeStart,
latitudeEnd, latitudeEnd,
longitudeEnd)); longitudeEnd));
this->bounds = germanairlinesva::geodata::calculateBoxDD( this->bounds = geodata::calculateBoxDD({latitudeStart, longitudeStart},
{latitudeStart, longitudeStart},
{latitudeEnd, longitudeEnd}, {latitudeEnd, longitudeEnd},
this->trueHeading, this->trueHeading,
this->width); this->width);
} }
Runway::Runway(std::string designator, Runway::Runway(std::string designator,
germanairlinesva::geodata::box bounds, geodata::box bounds,
std::uint8_t width, std::uint8_t width,
std::uint16_t length, std::uint16_t length,
std::uint16_t trueHeading) std::uint16_t trueHeading)

View File

@ -56,8 +56,7 @@ namespace file
std::uint16_t numGates = read<std::uint16_t>(in); std::uint16_t numGates = read<std::uint16_t>(in);
for (int j = 0; j < numGates; j++) { for (int j = 0; j < numGates; j++) {
std::string designator = readString(in); std::string designator = readString(in);
struct germanairlinesva::geodata::point center = struct geodata::point center = read<struct geodata::point>(in);
read<struct germanairlinesva::geodata::point>(in);
std::uint8_t radius = read<std::uint8_t>(in); std::uint8_t radius = read<std::uint8_t>(in);
this->airports[icao].first.emplace_back(designator, center, radius); this->airports[icao].first.emplace_back(designator, center, radius);
@ -67,8 +66,7 @@ namespace file
for (int j = 0; j < numRunways; j++) { for (int j = 0; j < numRunways; j++) {
std::string designator = readString(in); std::string designator = readString(in);
// Bounds // Bounds
struct germanairlinesva::geodata::box bounds = struct geodata::box bounds = read<struct geodata::box>(in);
read<struct germanairlinesva::geodata::box>(in);
std::uint8_t width = read<std::uint8_t>(in); std::uint8_t width = read<std::uint8_t>(in);
std::uint16_t length = read<std::uint16_t>(in); std::uint16_t length = read<std::uint16_t>(in);
std::uint16_t trueHeading = read<std::uint16_t>(in); std::uint16_t trueHeading = read<std::uint16_t>(in);

View File

@ -39,8 +39,7 @@ namespace file
std::vector<std::string> packs; std::vector<std::string> packs;
while (std::getline(custom, line)) { while (std::getline(custom, line)) {
if ((pos = line.find("SCENERY_PACK")) != std::string::npos) { if ((pos = line.find("SCENERY_PACK")) != std::string::npos) {
std::string path = std::string path = util::rtrim_copy(line.substr(pos + 13)) +
germanairlinesva::util::rtrim_copy(line.substr(pos + 13)) +
"Earth nav data/apt.dat"; "Earth nav data/apt.dat";
packs.emplace_back(path); packs.emplace_back(path);
} }
@ -84,11 +83,10 @@ namespace file
int validCount = 0; int validCount = 0;
while (std::getline(infile, line)) { while (std::getline(infile, line)) {
std::vector<std::string> fields = std::vector<std::string> fields = util::split(line, ' ');
germanairlinesva::util::split(line, ' '); fields = util::select_T<std::string>(fields, [](const std::string &s) {
fields = germanairlinesva::util::select_T<std::string>( return s.length() > 0;
fields, });
[](const std::string &s) { return s.length() > 0; });
if (fields.empty()) if (fields.empty())
continue; continue;
@ -155,7 +153,7 @@ namespace file
} }
gateName += fields.back(); gateName += fields.back();
gateName = std::regex_replace(gateName, std::regex{","}, "0"); gateName = std::regex_replace(gateName, std::regex{","}, "0");
struct germanairlinesva::geodata::point pt { struct geodata::point pt {
std::stod(fields[1]), std::stod(fields[2]) std::stod(fields[1]), std::stod(fields[2])
}; };
gates.emplace_back(gateName, pt, 40); gates.emplace_back(gateName, pt, 40);
@ -188,7 +186,7 @@ namespace file
gateName += fields.back(); gateName += fields.back();
gateName = std::regex_replace(gateName, std::regex{","}, "0"); gateName = std::regex_replace(gateName, std::regex{","}, "0");
struct germanairlinesva::geodata::point pt { struct geodata::point pt {
std::stod(fields[1]), std::stod(fields[2]) std::stod(fields[1]), std::stod(fields[2])
}; };
gates.emplace_back(gateName, pt, 40); gates.emplace_back(gateName, pt, 40);

View File

@ -3,8 +3,9 @@
#include <cstdint> #include <cstdint>
namespace germanairlinesva
namespace germanairlinesva_websocket {
namespace websocket
{ {
#pragma pack(push) /* push current alignment to stack */ #pragma pack(push) /* push current alignment to stack */
#pragma pack(1) /* set alignment to 1 byte boundary */ #pragma pack(1) /* set alignment to 1 byte boundary */
@ -44,6 +45,7 @@ namespace germanairlinesva_websocket
}; };
#pragma pack(pop) /* restore original alignment from stack */ #pragma pack(pop) /* restore original alignment from stack */
} // namespace germanairlinesva_websocket } // namespace websocket
} // namespace germanairlinesva
#endif #endif

View File

@ -18,7 +18,9 @@
#include <string> #include <string>
#include <utility> #include <utility>
namespace germanairlinesva_websocket namespace germanairlinesva
{
namespace websocket
{ {
class Websocket class Websocket
{ {
@ -38,6 +40,7 @@ namespace germanairlinesva_websocket
void onClientMessageCallback(const ix::WebSocketMessagePtr &msg); void onClientMessageCallback(const ix::WebSocketMessagePtr &msg);
void sendData(data &d); void sendData(data &d);
}; };
} // namespace germanairlinesva_websocket } // namespace websocket
} // namespace germanairlinesva
#endif #endif

View File

@ -1,6 +1,8 @@
#include "include/websocket.h" #include "include/websocket.h"
namespace germanairlinesva_websocket namespace germanairlinesva
{
namespace websocket
{ {
Websocket::Websocket(std::string host, Websocket::Websocket(std::string host,
std::string user, std::string user,
@ -86,9 +88,7 @@ void Websocket::sendData(data &d)
{ {
if (strcmp(d.path, this->lastPath) != 0) { if (strcmp(d.path, this->lastPath) != 0) {
strcpy(this->lastPath, d.path); strcpy(this->lastPath, d.path);
if (germanairlinesva::util::generateMD5(d.path, if (util::generateMD5(d.path, this->lastHash, this->toLog)) {
this->lastHash,
this->toLog)) {
strcpy(this->lastHash, "NOT SET"); strcpy(this->lastHash, "NOT SET");
} }
} }
@ -110,4 +110,5 @@ void Websocket::sendData(data &d)
this->webSocket->send(msg.str(), false); this->webSocket->send(msg.str(), false);
} }
} }
} // namespace germanairlinesva_websocket } // namespace websocket
} // namespace germanairlinesva

View File

@ -12,7 +12,7 @@ std::atomic<bool> wantsExit;
std::unique_ptr<germanairlinesva::file::config::Config> configuration; std::unique_ptr<germanairlinesva::file::config::Config> configuration;
std::unique_ptr<germanairlinesva::file::simdata::SimDatabase> database; std::unique_ptr<germanairlinesva::file::simdata::SimDatabase> database;
std::unique_ptr<germanairlinesva_websocket::Websocket> connector; std::unique_ptr<germanairlinesva::websocket::Websocket> connector;
int xplaneVersion; int xplaneVersion;
/* Datarefs */ /* Datarefs */
@ -43,7 +43,7 @@ XPLMDataRef pitch;
XPLMDataRef roll; XPLMDataRef roll;
XPLMDataRef quaternion; XPLMDataRef quaternion;
struct germanairlinesva_websocket::data toSend; struct germanairlinesva::websocket::data toSend;
germanairlinesva::file::recording::Recording p; germanairlinesva::file::recording::Recording p;
/* /*
@ -114,7 +114,7 @@ PLUGIN_API int XPluginStart(char *outName, char *outSig, char *outDesc)
configuration = std::make_unique<germanairlinesva::file::config::Config>(); configuration = std::make_unique<germanairlinesva::file::config::Config>();
toLog("Config loaded"); toLog("Config loaded");
connector = std::make_unique<germanairlinesva_websocket::Websocket>( connector = std::make_unique<germanairlinesva::websocket::Websocket>(
"wss://ws.hofmannnet.myhome-server.de:8000", "wss://ws.hofmannnet.myhome-server.de:8000",
configuration->getUser(), configuration->getUser(),
toLog); toLog);
@ -128,18 +128,6 @@ PLUGIN_API int XPluginStart(char *outName, char *outSig, char *outDesc)
hash, hash,
configuration, configuration,
toLog); toLog);
toLog("Readback test of sim database using EDDF");
auto ap = (*database)["EDDF"];
for (const auto &it : ap.first) {
toLog(" " + it.to_string());
}
for (const auto &it : ap.second) {
toLog(" " + it.to_string());
}
toLog("Readback test of sim database using XXXX");
auto ap2 = (*database)["XXXX"];
ap2.first.size() == 0 ? toLog(" SUCCESS") : toLog(" ERROR");
} }
// Thread for sending data to websocket // Thread for sending data to websocket
@ -219,7 +207,7 @@ float flightLoop(float elapsedMe, float elapsedSim, int counter, void *refcon)
{ {
const std::lock_guard<std::mutex> lock(mutex); const std::lock_guard<std::mutex> lock(mutex);
std::memset(&toSend, 0, sizeof(germanairlinesva_websocket::data)); std::memset(&toSend, 0, sizeof(germanairlinesva::websocket::data));
toSend.pause = XPLMGetDatai(pauseIndicator); toSend.pause = XPLMGetDatai(pauseIndicator);
toSend.pBrake = XPLMGetDataf(parkingBrake); toSend.pBrake = XPLMGetDataf(parkingBrake);
@ -260,11 +248,11 @@ void serverWorker()
germanairlinesva::util::setThreadName("GAServerWorker"); germanairlinesva::util::setThreadName("GAServerWorker");
while (!wantsExit) { while (!wantsExit) {
struct germanairlinesva_websocket::data copy; struct germanairlinesva::websocket::data copy;
{ {
const std::lock_guard<std::mutex> lock(mutex); const std::lock_guard<std::mutex> lock(mutex);
std::memcpy(&copy, &toSend, sizeof(germanairlinesva_websocket::data)); std::memcpy(&copy, &toSend, sizeof(germanairlinesva::websocket::data));
} }
connector->sendData(copy); connector->sendData(copy);
@ -283,11 +271,11 @@ void recordingWorker()
std::uint32_t segment = 0; std::uint32_t segment = 0;
while (!wantsExit) { while (!wantsExit) {
germanairlinesva_websocket::data copy; germanairlinesva::websocket::data copy;
{ {
const std::lock_guard<std::mutex> lock(mutex); const std::lock_guard<std::mutex> lock(mutex);
std::memcpy(&copy, &toSend, sizeof(germanairlinesva_websocket::data)); std::memcpy(&copy, &toSend, sizeof(germanairlinesva::websocket::data));
} }
germanairlinesva::file::recording::RecordingEntry currentPath( germanairlinesva::file::recording::RecordingEntry currentPath(