Files
ECAP_Server/module/Local_Server/Aircraft/Aircraft.h
T
2026-07-06 09:30:04 +08:00

83 lines
2.8 KiB
C++

#pragma once
#include <string_view>
#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(std::string_view 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(std::string_view resource_name) const {
auto key = std::string(resource_name);
const auto callsign_iter =
callsign_external_database_info.find(key);
if (callsign_iter != callsign_external_database_info.end()) {
return callsign_iter->second;
}
const auto iter = external_database_info.find(key);
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
};