diff --git a/file/gate.cpp b/file/gate.cpp index 818eb6c..34fa46a 100644 --- a/file/gate.cpp +++ b/file/gate.cpp @@ -21,6 +21,12 @@ namespace file writecenter)>(out, this->center); writeradius)>(out, this->radius); } + + bool Gate::contains(germanairlinesva::geodata::point coordinates) const + { + return germanairlinesva::geodata::distanceEarthP(this->center, + coordinates); + } } // namespace simdata } // namespace file } // namespace germanairlinesva \ No newline at end of file diff --git a/file/include/recording/recordingEntry.h b/file/include/recording/recordingEntry.h index e0c2145..2fb1f5e 100644 --- a/file/include/recording/recordingEntry.h +++ b/file/include/recording/recordingEntry.h @@ -24,9 +24,9 @@ namespace file { private: std::uint32_t time; - std::uint16_t altitude; - std::uint16_t groundSpeed; - struct germanairlinesva::geodata::point coordinates; + std::uint16_t altitude = 0; + std::uint16_t groundSpeed = 0; + struct germanairlinesva::geodata::point coordinates{NAN, NAN}; public: RecordingEntry() = default; diff --git a/file/include/simdata/gate.h b/file/include/simdata/gate.h index d6034b2..a839535 100644 --- a/file/include/simdata/gate.h +++ b/file/include/simdata/gate.h @@ -43,6 +43,7 @@ namespace file std::uint8_t radius); void toFile(std::ofstream &out) const; + bool contains(germanairlinesva::geodata::point coordinates) const; inline const std::string to_string() const { diff --git a/file/include/simdata/simdataXP.h b/file/include/simdata/simdataXP.h index 5789b37..2f9fd1c 100644 --- a/file/include/simdata/simdataXP.h +++ b/file/include/simdata/simdataXP.h @@ -7,6 +7,7 @@ #include "simdata/gate.h" #include "simdata/runway.h" +#include "simdata/simDatabase.h" #include "util.hpp" namespace germanairlinesva @@ -15,20 +16,16 @@ namespace file { namespace simdata { - int scan( - const std::string defaultFile, - const std::string sceneryPack, - const std::string logFile, - std::map, std::vector>> - &airports); + int scan(const std::string defaultFile, + const std::string sceneryPack, + const std::string logFile, + SimDatabase &airports); - void makeAirport( - const std::string &kind, - std::ifstream &infile, - std::map, std::vector>> - &airports, - std::ofstream &logfile); - void makeGate15(std::vector &gates, + void makeAirport(const std::string &kind, + std::ifstream &infile, + SimDatabase &airports, + std::ofstream &logfile); + void makeGate15(std::vector &gates, const std::vector &fields); void makeRunway(std::vector &runways, const std::vector &fields); diff --git a/file/simdataXP.cpp b/file/simdataXP.cpp index dc2d0e3..ea9f5e1 100644 --- a/file/simdataXP.cpp +++ b/file/simdataXP.cpp @@ -6,12 +6,10 @@ namespace file { namespace simdata { - int scan( - const std::string defaultFile, - const std::string sceneryPack, - const std::string logFile, - std::map, std::vector>> - &airports) + int scan(const std::string defaultFile, + const std::string sceneryPack, + const std::string logFile, + SimDatabase &database) { std::ifstream base(defaultFile); if (!base.good()) { @@ -31,7 +29,7 @@ namespace file // Default logfile << " " << defaultFile << std::endl; - makeAirport("DEFAULT", base, airports, logfile); + makeAirport("DEFAULT", base, database, logfile); base.close(); std::string line; @@ -51,7 +49,7 @@ namespace file std::ifstream pack(path); if (pack.good()) { logfile << " " << path << std::endl; - makeAirport("CUSTOM", pack, airports, logfile); + makeAirport("CUSTOM", pack, database, logfile); pack.close(); } else { pack.close(); @@ -61,19 +59,18 @@ namespace file } logfile << std::endl - << " Total airports: " << airports.size() << std::endl; + << " Total airports: " << database.numAirports() + << std::endl; custom.close(); logfile.close(); return 0; } - void makeAirport( - const std::string &kind, - std::ifstream &infile, - std::map, std::vector>> - &airports, - std::ofstream &logfile) + void makeAirport(const std::string &kind, + std::ifstream &infile, + SimDatabase &database, + std::ofstream &logfile) { std::string line; std::string *currentIcao = nullptr; @@ -96,7 +93,7 @@ namespace file // Write to file if ICAO is valid, and we have gates and runways if (currentIcao != nullptr && !tmpRunways.empty() && !tmpGates.empty()) { - airports[*currentIcao] = {tmpGates, tmpRunways}; + database.addAirport(*currentIcao, tmpGates, tmpRunways); validCount += 1; logfile << "\t " << *currentIcao << " committed" << std::endl; @@ -116,7 +113,7 @@ namespace file // Write to file if ICAO is valid, and we have gates and runways if (currentIcao != nullptr && !tmpRunways.empty() && !tmpGates.empty()) { - airports[*currentIcao] = {tmpGates, tmpRunways}; + database.addAirport(*currentIcao, tmpGates, tmpRunways); validCount += 1; logfile << "\t " << *currentIcao << " committed" << std::endl; @@ -138,7 +135,7 @@ namespace file } if (currentIcao != nullptr && !tmpRunways.empty() && !tmpGates.empty()) { - airports[*currentIcao] = {tmpGates, tmpRunways}; + database.addAirport(*currentIcao, tmpGates, tmpRunways); validCount += 1; logfile << "\t " << *currentIcao << " committed" << std::endl; } diff --git a/utilities/include/geodata.hpp b/utilities/include/geodata.hpp index 4787428..a08a8e5 100644 --- a/utilities/include/geodata.hpp +++ b/utilities/include/geodata.hpp @@ -77,6 +77,19 @@ namespace geodata return 2.0 * EARTH_M * asin(sqrt(u * u + cos(lat1r) * cos(lat2r) * v * v)); } + // Input in degrees, Output in metres + static inline double distanceEarthP(point from, point to) + { + double lat1r, lon1r, lat2r, lon2r, u, v; + lat1r = toRadians(from.latitude); + lon1r = toRadians(from.longitude); + lat2r = toRadians(to.latitude); + lon2r = toRadians(to.longitude); + u = sin((lat2r - lat1r) / 2); + v = sin((lon2r - lon1r) / 2); + return 2.0 * EARTH_M * asin(sqrt(u * u + cos(lat1r) * cos(lat2r) * v * v)); + } + // Input and Output in degrees static inline struct point calculatePointDD(struct point coordinates, double bearing, diff --git a/websocket/websocket.cpp b/websocket/websocket.cpp index 31a5504..c4ad940 100644 --- a/websocket/websocket.cpp +++ b/websocket/websocket.cpp @@ -49,7 +49,7 @@ void Websocket::onClientMessageCallback(const ix::WebSocketMessagePtr &msg) this->webSocket->send("MASTER:" + user); this->toLog("Connecting as " + user); } else if (msg->type == ix::WebSocketMessageType::Close) { - if (msg->closeInfo.reason.compare("DUPLICATE")) { + if (msg->closeInfo.reason.compare("DUPLICATE") == 0) { this->webSocket->disableAutomaticReconnection(); this->toLog("Disconnected due to beeing a duplicate simualtor"); diff --git a/xplugin/main.cpp b/xplugin/main.cpp index 535e464..382b987 100644 --- a/xplugin/main.cpp +++ b/xplugin/main.cpp @@ -146,61 +146,17 @@ PLUGIN_API int XPluginStart(char *outName, char *outSig, char *outDesc) ap2.first.size() == 0 ? toLog(" SUCCESS") : toLog(" ERROR"); } - // Thread for sending data to websocket - serverThread = std::thread(&serverWorker); - recordingThread = std::thread(&recordingWorker); - toLog("Workers started"); - - toLog("Logbook Test"); - germanairlinesva::file::logbook::Logbook logbook; - logbook.addEntry("08.09.2022", - "1000", - "L049", - "D-ALFA", - "John F. Kennedy International Aiport / EDDF", - "A1", - "14L", - "Gander International Airport / CYQX", - "10", - "03", - "10:00", - "10:20", - "13:20", - "13:30", - 210.5, - 20.1, - 5012.4156, - 8.87, - 5041.3856, - 7.1, - 971.14, - 2.41, - 980.65, - -165.23, - 1, - 1.2012, - "2022-09-08_VGA1000", - 5.5, - 1); - logbook.toFile(); - - return 1; -} - -PLUGIN_API void XPluginStop(void) -{ - /* Flight Loop */ - XPLMUnregisterFlightLoopCallback(flightLoop, nullptr); - /* End threads */ - wantsExit = true; - serverThread.join(); - recordingThread.join(); + delete connector.release(); + delete database.release(); + delete configuration.release(); delete connector.release(); delete database.release(); delete configuration.release(); p.toFile("flight.rec"); + + toLog("Plugin stopped"); } PLUGIN_API void XPluginDisable(void) {} @@ -273,6 +229,8 @@ void serverWorker() std::this_thread::sleep_for(std::chrono::milliseconds(250)); } + + toLog("Server thread stopped"); } void recordingWorker() @@ -305,6 +263,8 @@ void recordingWorker() std::this_thread::sleep_for(std::chrono::milliseconds(1000)); } + + toLog("Recording thread stopped"); } void toLog(const std::string &message)