send aircraft reports
This commit is contained in:
103
src/PlugIn.cpp
103
src/PlugIn.cpp
@@ -15,9 +15,12 @@
|
|||||||
#include <Shlwapi.h>
|
#include <Shlwapi.h>
|
||||||
#include <Windows.h>
|
#include <Windows.h>
|
||||||
|
|
||||||
|
#include <aman/com/AircraftReporter.h>
|
||||||
#include <aman/config/CommunicationFileFormat.h>
|
#include <aman/config/CommunicationFileFormat.h>
|
||||||
#include <aman/config/IdentifierFileFormat.h>
|
#include <aman/config/IdentifierFileFormat.h>
|
||||||
|
|
||||||
|
#include <protobuf/AircraftReport.pb.h>
|
||||||
|
|
||||||
#include "PlugIn.h"
|
#include "PlugIn.h"
|
||||||
|
|
||||||
EXTERN_C IMAGE_DOS_HEADER __ImageBase;
|
EXTERN_C IMAGE_DOS_HEADER __ImageBase;
|
||||||
@@ -31,6 +34,8 @@ PlugIn::PlugIn() :
|
|||||||
PLUGIN_DEVELOPER,
|
PLUGIN_DEVELOPER,
|
||||||
PLUGIN_COPYRIGHT),
|
PLUGIN_COPYRIGHT),
|
||||||
m_configuration() {
|
m_configuration() {
|
||||||
|
GOOGLE_PROTOBUF_VERIFY_VERSION;
|
||||||
|
|
||||||
this->DisplayUserMessage(PLUGIN_NAME, "INFO", (std::string("Loaded ") + PLUGIN_NAME + " " + PLUGIN_VERSION).c_str(), true, true, false, false, false);
|
this->DisplayUserMessage(PLUGIN_NAME, "INFO", (std::string("Loaded ") + PLUGIN_NAME + " " + PLUGIN_VERSION).c_str(), true, true, false, false, false);
|
||||||
|
|
||||||
/* get the dll-path */
|
/* get the dll-path */
|
||||||
@@ -53,9 +58,17 @@ PlugIn::PlugIn() :
|
|||||||
this->DisplayUserMessage(PLUGIN_NAME, "ERROR", ("AmanIdentity.txt:" + std::to_string(identFormat.errorLine()) + " - " + identFormat.errorMessage()).c_str(), true, true, true, true, true);
|
this->DisplayUserMessage(PLUGIN_NAME, "ERROR", ("AmanIdentity.txt:" + std::to_string(identFormat.errorLine()) + " - " + identFormat.errorMessage()).c_str(), true, true, true, true, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (false == AircraftReporter::instance().initialize(this->m_configuration)) {
|
||||||
|
this->DisplayUserMessage(PLUGIN_NAME, "ERROR", "Unable to initialize the reporter-connection to the backend", true, true, true, true, true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PlugIn::~PlugIn() noexcept { }
|
PlugIn::~PlugIn() noexcept {
|
||||||
|
AircraftReporter::instance().deinitialize();
|
||||||
|
google::protobuf::ShutdownProtobufLibrary();
|
||||||
|
}
|
||||||
|
|
||||||
EuroScopePlugIn::CRadarScreen* PlugIn::OnRadarScreenCreated(const char* displayName, bool needsRadarContent, bool geoReferenced,
|
EuroScopePlugIn::CRadarScreen* PlugIn::OnRadarScreenCreated(const char* displayName, bool needsRadarContent, bool geoReferenced,
|
||||||
bool canBeSaved, bool canBeCreated) {
|
bool canBeSaved, bool canBeCreated) {
|
||||||
@@ -71,6 +84,42 @@ EuroScopePlugIn::CRadarScreen* PlugIn::OnRadarScreenCreated(const char* displayN
|
|||||||
return this->m_screen.get();
|
return this->m_screen.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
aman::Aircraft* PlugIn::generateAircraftMessage(const EuroScopePlugIn::CRadarTarget& target) {
|
||||||
|
if (false == target.IsValid() || false == target.GetCorrelatedFlightPlan().IsValid())
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
auto flightPlan = target.GetCorrelatedFlightPlan();
|
||||||
|
std::string callsign(target.GetCallsign());
|
||||||
|
aman::Aircraft* retval = new aman::Aircraft();
|
||||||
|
|
||||||
|
/* fill all available information */
|
||||||
|
retval->set_callsign(callsign);
|
||||||
|
if (3 <= callsign.length())
|
||||||
|
retval->set_airline(callsign.substr(0, 3));
|
||||||
|
retval->set_type(flightPlan.GetFlightPlanData().GetAircraftFPType());
|
||||||
|
retval->set_wtc(std::to_string(flightPlan.GetFlightPlanData().GetAircraftWtc()));
|
||||||
|
/* TODO get recat */
|
||||||
|
retval->set_enginecount(flightPlan.GetFlightPlanData().GetEngineNumber());
|
||||||
|
|
||||||
|
switch (flightPlan.GetFlightPlanData().GetEngineType()) {
|
||||||
|
case 'P':
|
||||||
|
case 'T':
|
||||||
|
retval->set_enginetype(aman::Aircraft_EngineType::Aircraft_EngineType_TURBOPROB);
|
||||||
|
break;
|
||||||
|
case 'E':
|
||||||
|
retval->set_enginetype(aman::Aircraft_EngineType::Aircraft_EngineType_ELECTRIC);
|
||||||
|
break;
|
||||||
|
case 'J':
|
||||||
|
retval->set_enginetype(aman::Aircraft_EngineType::Aircraft_EngineType_JET);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
retval->set_enginetype(aman::Aircraft_EngineType::Aircraft_EngineType_UNKNOWN);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
void PlugIn::OnRadarTargetPositionUpdate(EuroScopePlugIn::CRadarTarget radarTarget) {
|
void PlugIn::OnRadarTargetPositionUpdate(EuroScopePlugIn::CRadarTarget radarTarget) {
|
||||||
/* ignore invalid targets */
|
/* ignore invalid targets */
|
||||||
if (false == radarTarget.IsValid())
|
if (false == radarTarget.IsValid())
|
||||||
@@ -90,15 +139,61 @@ void PlugIn::OnRadarTargetPositionUpdate(EuroScopePlugIn::CRadarTarget radarTarg
|
|||||||
if (nullptr == flightPlan.GetFlightPlanData().GetPlanType() || 'I' != *flightPlan.GetFlightPlanData().GetPlanType())
|
if (nullptr == flightPlan.GetFlightPlanData().GetPlanType() || 'I' != *flightPlan.GetFlightPlanData().GetPlanType())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/* filter invalid destinations */
|
||||||
|
auto destination = std::string_view(flightPlan.GetFlightPlanData().GetDestination());
|
||||||
|
if (4 != destination.length())
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* TODO temporary filter */
|
||||||
|
if ("EDDB" != destination)
|
||||||
|
return;
|
||||||
|
|
||||||
/* filter by distance to destination */
|
/* filter by distance to destination */
|
||||||
double distanceNM = flightPlan.GetDistanceToDestination();
|
double distanceNM = flightPlan.GetDistanceToDestination();
|
||||||
if (250.0 < distanceNM)
|
if (5.0 > distanceNM || 250.0 < distanceNM)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* filter by airborne identifier (assume a GS>50kn and a big distance to the origin) */
|
/* filter by airborne identifier (assume a GS>50kn and a big distance to the origin) */
|
||||||
if (50 > radarTarget.GetGS() || 10.0 > flightPlan.GetDistanceFromOrigin())
|
if (50 > radarTarget.GetGS() || 10.0 > flightPlan.GetDistanceFromOrigin())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* TODO generate protobuf message */
|
/* generate protobuf message */
|
||||||
/* TODO send aircraft update */
|
aman::Aircraft* aircraft = this->generateAircraftMessage(radarTarget);
|
||||||
|
if (nullptr == aircraft)
|
||||||
|
return;
|
||||||
|
aman::Dynamics* dynamics = new aman::Dynamics();
|
||||||
|
dynamics->set_altitude(radarTarget.GetPosition().GetFlightLevel());
|
||||||
|
dynamics->set_groundspeed(radarTarget.GetGS());
|
||||||
|
dynamics->set_verticalspeed(radarTarget.GetVerticalSpeed());
|
||||||
|
aman::Coordinate* coordinate = new aman::Coordinate();
|
||||||
|
coordinate->set_latitude(radarTarget.GetPosition().GetPosition().m_Latitude);
|
||||||
|
coordinate->set_longitude(radarTarget.GetPosition().GetPosition().m_Longitude);
|
||||||
|
|
||||||
|
/* create the report */
|
||||||
|
aman::AircraftReport report;
|
||||||
|
if (2 <= flightPlan.GetExtractedRoute().GetPointsNumber()) {
|
||||||
|
int lastIdx = flightPlan.GetExtractedRoute().GetPointsNumber() - 2;
|
||||||
|
|
||||||
|
auto timeAtIAF = std::chrono::utc_clock::now();
|
||||||
|
timeAtIAF += std::chrono::minutes(flightPlan.GetExtractedRoute().GetPointDistanceInMinutes(lastIdx));
|
||||||
|
|
||||||
|
std::stringstream stream;
|
||||||
|
stream << std::format("{0:%y%m%d%H%M}", timeAtIAF);
|
||||||
|
report.set_timeatiaf(stream.str());
|
||||||
|
|
||||||
|
report.set_initialapproachfix(std::string(flightPlan.GetExtractedRoute().GetPointName(lastIdx)));
|
||||||
|
}
|
||||||
|
report.set_destination(std::string(destination));
|
||||||
|
report.set_allocated_aircraft(aircraft);
|
||||||
|
report.set_allocated_dynamics(dynamics);
|
||||||
|
report.set_allocated_position(coordinate);
|
||||||
|
|
||||||
|
/* serialize the report */
|
||||||
|
std::string serialized = report.SerializeAsString();
|
||||||
|
zmq::message_t message(serialized.size());
|
||||||
|
std::memcpy(message.data(), serialized.c_str(), serialized.size());
|
||||||
|
|
||||||
|
/* send the report */
|
||||||
|
if (false == AircraftReporter::instance().send(message))
|
||||||
|
this->DisplayUserMessage(PLUGIN_NAME, "ERROR", ("Unable to send a report for " + aircraft->callsign()).c_str(), true, true, true, true, true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
#pragma warning(pop)
|
#pragma warning(pop)
|
||||||
|
|
||||||
#include <aman/types/Communication.h>
|
#include <aman/types/Communication.h>
|
||||||
|
#include <protobuf/AircraftReport.pb.h>
|
||||||
|
|
||||||
#include "RadarScreen.h"
|
#include "RadarScreen.h"
|
||||||
|
|
||||||
@@ -35,6 +36,8 @@ namespace aman {
|
|||||||
enum class TagItemElement {
|
enum class TagItemElement {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
aman::Aircraft* generateAircraftMessage(const EuroScopePlugIn::CRadarTarget& target);
|
||||||
|
|
||||||
Communication m_configuration;
|
Communication m_configuration;
|
||||||
std::shared_ptr<RadarScreen> m_screen;
|
std::shared_ptr<RadarScreen> m_screen;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user