Files
ECAP_Server/module/Local_Server/Aircraft/Aircraft.h
T
2026-06-16 11:18:22 +08:00

80 lines
2.9 KiB
C++

#pragma once
#include "../External_Database/export.h"
#include <map>
#include <memory>
#include <optional>
#include <string>
#include "SSR/Aircraft_Info.h"
class Aircraft : public SSR::Aircraft_Info {
public:
explicit Aircraft(const std::string& icao);
// 静态信息按 ICAO24 加载一次;航线信息仅在 callsign 变化时重新加载。
// map 的键是外部数据源名称。
std::map<std::string, std::shared_ptr<External_Database_Row>> external_database_info;
std::map<std::string, std::shared_ptr<External_Database_Row>> callsign_external_database_info;
bool external_database_info_loaded{};
std::optional<std::string> last_external_database_callsign;
[[nodiscard]] std::shared_ptr<External_Database_Row> external_database_row(
const std::string& resource_name) const {
const auto callsign_iter = callsign_external_database_info.find(resource_name);
if (callsign_iter != callsign_external_database_info.end()) {
return callsign_iter->second;
}
const auto iter = external_database_info.find(resource_name);
return iter == external_database_info.end() ? nullptr : iter->second;
}
void refresh_external_database_info();
Psc::JSON toJson() {
refresh_external_database_info();
Psc::JSON ret = Psc::JSON::object();
Ret_J(icao)
ret.append({"每秒位置数", get_pest()});
ret.append({"飞机位置轨迹点数", air_pos_track_list.size()});
ret.append({"地面位置轨迹点数", surface_pos_track_list.size()});
ret.append({"信号强度", signal_level});
auto opt_pos = air_pos_track_list.last();
ret.append({"当前位置消息", opt_pos.has_value() ? opt_pos->to_json() : ""});
auto cpr_state_opt = BDS05_airborne_position.value;
ret.append({"cpr解码器状态",
cpr_state_opt.has_value()
? cpr_state_opt.value().current_state_json()
: ""});
ret.append({"时间", Psc::utc_2_local_time(timestamp)});
ret.append({"多点定位数据源", mlat});
auto external_info = Psc::JSON::object();
for (const auto& [resource_key, row] : external_database_info) {
external_info.append({resource_key, row->to_json()});
}
for (const auto& [resource_key, row] : callsign_external_database_info) {
external_info.append({resource_key, row->to_json()});
}
ret.append({"external_database_info", external_info});
push_all_bds_info(ret);
return ret;
}
#ifdef Cache_Some_Mode_S
std::list<std::shared_ptr<Mode_S_Msg>> cache;
size_t total_num = 0;
void add_msg_limit(const std::shared_ptr<Mode_S_Msg>& msg) {
if (cache.size() > Cache_Some_Mode_S_Num) {
cache.pop_front();
}
cache.emplace_back(msg);
total_num++;
}
#endif
};