配置生成逻辑优化

This commit is contained in:
2026-08-21 18:13:43 +08:00
parent ff487be64e
commit e79bbfb99c
18 changed files with 500 additions and 311 deletions
@@ -0,0 +1,36 @@
#include "Config_Default.h"
Default_Config_File make_default_config_file(Config_Section section, const std::filesystem::path& directory) {
switch (section) {
case Config_Section::version:
return make_default_version_config(directory);
case Config_Section::dsp:
return make_default_dsp_config(directory);
case Config_Section::drogon:
return make_default_drogon_config(directory);
case Config_Section::http_monitor:
return make_default_http_monitor_config(directory);
case Config_Section::mlat:
return make_default_mlat_config(directory);
case Config_Section::web_server:
return make_default_web_server_config(directory);
case Config_Section::map_resources:
return make_default_map_resources_config(directory);
case Config_Section::map_view:
return make_default_map_view_config(directory);
case Config_Section::map_models:
return make_default_map_models_config(directory);
case Config_Section::mode_acs:
return make_default_mode_acs_config(directory);
case Config_Section::log:
return make_default_log_config(directory);
case Config_Section::console:
return make_default_console_config(directory);
case Config_Section::external_database:
return make_default_external_database_config(directory);
case Config_Section::cesium_graphics:
return make_default_cesium_graphics_config(directory);
case Config_Section::count:
std::terminate();
}
std::terminate();
}
@@ -0,0 +1,23 @@
#pragma once
#include <filesystem>
#include "../Config.h"
struct Default_Config_File {
Config_Section section;
std::filesystem::path path;
Psc::JSON value;
};
Default_Config_File make_default_config_file(Config_Section section, const std::filesystem::path& directory);
Default_Config_File make_default_version_config(const std::filesystem::path& directory);
Default_Config_File make_default_dsp_config(const std::filesystem::path& directory);
Default_Config_File make_default_drogon_config(const std::filesystem::path& directory);
Default_Config_File make_default_http_monitor_config(const std::filesystem::path& directory);
Default_Config_File make_default_mlat_config(const std::filesystem::path& directory);
Default_Config_File make_default_web_server_config(const std::filesystem::path& directory);
Default_Config_File make_default_map_resources_config(const std::filesystem::path& directory);
Default_Config_File make_default_map_view_config(const std::filesystem::path& directory);
Default_Config_File make_default_map_models_config(const std::filesystem::path& directory);
Default_Config_File make_default_mode_acs_config(const std::filesystem::path& directory);
Default_Config_File make_default_log_config(const std::filesystem::path& directory);
Default_Config_File make_default_console_config(const std::filesystem::path& directory);
Default_Config_File make_default_external_database_config(const std::filesystem::path& directory);
Default_Config_File make_default_cesium_graphics_config(const std::filesystem::path& directory);
@@ -0,0 +1,19 @@
#include "Config_Default.h"
Default_Config_File make_default_cesium_graphics_config(const std::filesystem::path& directory) {
Cesium_Graphics_Config config;
config.settings.write([](auto& value) {
value.resolution_scale = 1.0;
value.fxaa = true;
value.shadows = true;
value.enable_lighting = true;
value.solar_lighting = true;
value.terrain_enabled_in_3d = true;
value.terrain_exaggeration = 5.0;
value.surface_navigation_reference_visible = true;
value.view_axes_visible = true;
value.view_axes_panel_x = 3.0;
value.view_axes_panel_y = 337.0;
value.view_axes_panel_size = 184.0;
});
return {Config_Section::cesium_graphics, directory / "cesium_graphics.json", config.to_base_json()};
}
@@ -0,0 +1,7 @@
#include "Config_Default.h"
Default_Config_File make_default_console_config(const std::filesystem::path& directory) {
Console_Config config{};
config.record_playback = false;
config.mode_s_console = false;
return {Config_Section::console, directory / "console.json", config.to_base_json()};
}
@@ -0,0 +1,6 @@
#include "Config_Default.h"
Default_Config_File make_default_drogon_config(const std::filesystem::path& directory) {
auto app = Psc::JSON::object(
{{"threads_num", 0}, {"client_max_body_size", "1000M"}, {"client_max_memory_body_size", "1000M"}});
return {Config_Section::drogon, directory / "drogon.json", Psc::JSON::object({{"app", app}})};
}
@@ -0,0 +1,14 @@
#include "Config_Default.h"
Default_Config_File make_default_dsp_config(const std::filesystem::path& directory) {
DSP_Config config;
config.library_path = ECAP_DEFAULT_DSP_LIBRARY_PATH;
config.center_freq = 16000000;
config.band_width = 6000;
config.sample_rate = 60000;
config.fft_point_number = 2048;
config.fft_period_ms = 50;
config.fft_win_type = UHD_FFTWin::blkmc;
config.frame_rate = 60;
config.debug = false;
return {Config_Section::dsp, directory / "dsp.json", config.to_base_json()};
}
@@ -0,0 +1,57 @@
#include "Config_Default.h"
namespace {
Psc::JSON make_resource(std::string name, std::string download_url, std::string description,
std::uint64_t update_interval_seconds, std::time_t last_updated_at) {
External_Resources_Data resource;
resource.name = std::move(name);
resource.download_url = std::move(download_url);
resource.description = std::move(description);
resource.update_interval_seconds = update_interval_seconds;
resource.last_updated_at = last_updated_at;
return resource.to_base_json();
}
} // namespace
Default_Config_File make_default_external_database_config(const std::filesystem::path& directory) {
External_Resources_Manager config;
config.ecap_sqlite_path = ECAP_DEFAULT_SQLITE_PATH;
auto value = Psc::JSON::object();
value.append({"ecap_sqlite_path", config.ecap_sqlite_path});
auto resources = Psc::JSON::array();
resources.append(make_resource(
"tar1090_db_aircraft", "https://raw.githubusercontent.com/wiedehopf/tar1090-db/refs/heads/csv/aircraft.csv.gz",
"wiedehopf/tar1090-db 发布的轻量 ICAO24 飞机静态库,提供注册号、机型、年份和运营方备注。", 604800, 1780388281));
resources.append(
make_resource("wiedehopf_tar1090_db_aircraft",
"https://raw.githubusercontent.com/wiedehopf/tar1090-db/refs/heads/csv/aircraft.csv.gz",
"wiedehopf/tar1090-db 项目发布的飞机静态数据库镜像,供 tar1090 本地识别飞机。", 604800, 1780381804));
resources.append(make_resource(
"mictronics_aircraft_database",
"https://raw.githubusercontent.com/wiedehopf/tar1090-db/refs/heads/csv/aircraft.csv.gz",
"Mictronics 社区飞机数据库的 tar1090 汇总镜像,可按 ICAO24 查询注册号、机型和运营方。", 604800, 1780381804));
resources.append(
make_resource("opensky_aircraft_database", "https://opensky-network.org/datasets/metadata/aircraftDatabase.csv",
"OpenSky Network 飞机元数据 CSV,包含制造商、型号、注册号和运营方等字段。", 604800, 1780381804));
resources.append(make_resource("faa_aircraft_registry", "https://registry.faa.gov/database/ReleasableAircraft.zip",
"FAA 官方可公开下载的美国飞机注册库,MASTER.txt 包含 Mode-S Hex 注册信息。", 86400,
1780381804));
resources.append(make_resource(
"icao_doc_8643_aircraft_type_designators", "",
"ICAO Doc 8643 机型代码表,用于将 A320、B738 等 designator 映射为制造商、型号和类别。", 2419200, 1780381804));
resources.append(make_resource("vrs_routes", "https://vrs-standing-data.adsb.lol/routes.csv",
"VRS 航线表,以 callsign 查询机场代码序列,用于推断起飞机场、经停机场和目的机场。",
3600, 1780381804));
resources.append(make_resource("vrs_airports", "https://vrs-standing-data.adsb.lol/airports.csv",
"VRS 机场字典,提供机场代码、名称、国家、经纬度和高度。", 3600, 1780381804));
resources.append(make_resource("adsblol_vrs_standing_data_routes", "https://vrs-standing-data.adsb.lol/routes.csv",
"ADSB.lol 发布的 VRS standing-data 航线镜像,以 callsign 查询机场代码序列。", 3600,
1780381804));
resources.append(make_resource(
"vradarserver_standing_data_routes", "https://vrs-standing-data.adsb.lol/routes.csv",
"Virtual Radar Server standing-data 的航线适配表;当前在线更新使用 ADSB.lol 公共镜像。", 3600, 1780381804));
resources.append(make_resource("opensky_flightdata_api_cache", "",
"OpenSky FlightData API 查询缓存,按 ICAO24 和时间范围保存历史航班起降机场结果。", 0,
1780381804));
value.append({"list", resources});
config.from_json(&value);
return {Config_Section::external_database, directory / "external_database.json", config.to_base_json()};
}
@@ -0,0 +1,8 @@
#include "Config_Default.h"
Default_Config_File make_default_http_monitor_config(const std::filesystem::path& directory) {
Http_Monitor_Config config;
config.access_log = false;
config.slow_request_threshold_ms = 3000;
config.slow_scope_threshold_ms = 1000;
return {Config_Section::http_monitor, directory / "http_monitor.json", config.to_base_json()};
}
@@ -0,0 +1,8 @@
#include "Config_Default.h"
Default_Config_File make_default_log_config(const std::filesystem::path& directory) {
Log_Config config;
config.open_mode = Log_Config::Open_Mode::Delete;
config.piece_num = 10;
config.size_MB = 10;
return {Config_Section::log, directory / "log.json", config.to_base_json()};
}
@@ -0,0 +1,5 @@
#include "Config_Default.h"
Default_Config_File make_default_map_models_config(const std::filesystem::path& directory) {
Map_Model_Config config;
return {Config_Section::map_models, directory / "map_models.json", config.to_base_json()};
}
@@ -0,0 +1,60 @@
#include "Config_Default.h"
namespace {
Map_Tile_Source_Config make_local_tile_source(std::string key, std::string name, Map_Tile_Type tile_type,
std::vector<std::string> files,
std::optional<Map_Tile_Encoding> encoding = std::nullopt) {
Map_Tile_Source_Config source;
source.key = std::move(key);
source.name = std::move(name);
source.tile_type = tile_type;
source.resource.file_format = Map_Tile_File_Format::mbtiles;
source.resource.files = std::move(files);
source.resource.y_axis = Map_Tile_Y_Axis::tms;
source.resource.extension = ".png";
source.resource.tile_size = 256;
source.resource.maximum_level = 11;
source.resource.encoding = encoding;
return source;
}
Map_Tile_Source_Config make_online_tile_source(std::string key, std::string name, std::string url,
std::uint32_t maximum_level) {
Map_Tile_Source_Config source;
source.key = std::move(key);
source.name = std::move(name);
source.url = std::move(url);
source.resource.file_format = Map_Tile_File_Format::online;
source.resource.extension = ".png";
source.resource.tile_size = 256;
source.resource.maximum_level = maximum_level;
return source;
}
} // namespace
Default_Config_File make_default_map_resources_config(const std::filesystem::path& directory) {
Map_Resources_Config config;
config.current_imagery_key = "mixed_imagery";
const auto tile_directory = std::string(ECAP_DEFAULT_TILE_DIRECTORY);
config.tile_sources = {
make_local_tile_source("mixed_imagery", "本地混合图", Map_Tile_Type::imagery,
{tile_directory + "/混合图-世界-0-8.mbtiles", tile_directory + "/混合图-中国-9-10.mbtiles",
tile_directory + "/混合图-中国-11.mbtiles"}),
make_local_tile_source("height_terrain", "本地高程", Map_Tile_Type::terrain,
{tile_directory + "/高程-世界-0-8.mbtiles", tile_directory + "/高程-中国-9-10.mbtiles",
tile_directory + "/高程-中国-11.mbtiles"},
Map_Tile_Encoding::terrarium),
make_online_tile_source("osm_online", "OpenStreetMap在线", "https://tile.openstreetmap.org/{z}/{x}/{y}.png", 19),
make_online_tile_source("osm_hot_online", "OpenStreetMap HOT在线",
"https://a.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png", 19),
make_online_tile_source("cyclosm_online", "CyclOSM在线",
"https://a.tile-cyclosm.openstreetmap.fr/cyclosm/{z}/{x}/{y}.png", 20),
make_online_tile_source("carto_light_online", "Carto Light在线",
"https://a.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png", 20),
make_online_tile_source("carto_dark_online", "Carto Dark在线",
"https://a.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png", 20),
make_online_tile_source("carto_voyager_online", "Carto Voyager在线",
"https://a.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png", 20),
make_online_tile_source("carto_dark_nolabels_online", "Carto Dark无标注在线",
"https://a.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}.png", 20),
make_online_tile_source("opentopomap_online", "OpenTopoMap在线", "https://a.tile.opentopomap.org/{z}/{x}/{y}.png",
17)};
return {Config_Section::map_resources, directory / "map_resources.json", config.to_base_json()};
}
@@ -0,0 +1,18 @@
#include "Config_Default.h"
Default_Config_File make_default_map_view_config(const std::filesystem::path& directory) {
Map_View_Config config;
config.scene_mode = Map_Scene_Mode::map_3d;
config.map2d.current_imagery_key = "mixed_imagery";
config.map2d.current_terrain_key = "terrain";
config.map2d.tile_display_maximum_level = 8;
config.map3d.current_imagery_key = "mixed_imagery";
config.map3d.current_terrain_key = "terrain";
config.map3d.tile_display_maximum_level = 19;
config.camera.longitude = 122.014707;
config.camera.latitude = 35.714108;
config.camera.height = 241660.03182;
config.camera.heading = 347.582854;
config.camera.pitch = -54.917211;
config.camera.roll = 359.999884;
return {Config_Section::map_view, directory / "map_view.json", config.to_base_json()};
}
@@ -0,0 +1,6 @@
#include "Config_Default.h"
Default_Config_File make_default_mlat_config(const std::filesystem::path& directory) {
MLAT_Config config;
config.settings.write([](auto& value) { value.merge = false; });
return {Config_Section::mlat, directory / "mlat.json", config.to_base_json()};
}
@@ -0,0 +1,131 @@
#include "Config_Default.h"
namespace {
void configure_source_display(Data_Source_Map_Display_Data& display, std::string color,
std::uint32_t aircraft_pixel_size, std::uint32_t base_station_pixel_size,
double aircraft_scale, bool show_call_sign, bool show_fly_status) {
display.color = std::move(color);
display.aircraft_pixel_size = aircraft_pixel_size;
display.base_station_pixel_size = base_station_pixel_size;
display.aircraft_scale = aircraft_scale;
display.base_station_scale = 0.44;
display.show_call_sign = show_call_sign;
display.show_fly_status = show_fly_status;
}
std::shared_ptr<Dll_Data_Source> make_dll_source() {
auto source = std::make_shared<Dll_Data_Source>();
source->key = "lzy_dll";
source->set_enabled(true);
source->settings.write([](auto& value) {
value.base_station_has_valid_position = true;
configure_source_display(value.map_display.map2d, "#454641", 34, 30, 2.0, false, false);
configure_source_display(value.map_display.map3d, "#454641", 50, 100, 1.0, false, false);
value.lat = 37.433547;
value.lon = 121.40873;
value.alt = 2300.0;
value.ignore_msg_time = true;
});
source->specific.write([](auto& value) {
value.library_path = ECAP_DEFAULT_DSP_LIBRARY_PATH;
value.function_name = "adsb_read";
value.data_type = File_Data_Type::BIN_Blank_Text;
value.buffer_size = 200000;
});
return source;
}
#if ECAP_DEFAULT_FILE_SOURCE
std::shared_ptr<File_Data_Source> make_file_source() {
auto source = std::make_shared<File_Data_Source>();
source->key = "aaaa";
source->set_enabled(false);
source->settings.write([](auto& value) {
configure_source_display(value.map_display.map2d, "#d1a54c", 50, 100, 2.0, true, true);
configure_source_display(value.map_display.map3d, "#d1a54c", 50, 100, 2.0, true, true);
value.lat = 37.0;
value.lon = 121.0;
value.alt = 1000.0;
value.ignore_msg_time = true;
});
source->specific.write([](auto& value) {
value.file_path = ECAP_DEFAULT_FILE_SOURCE_PATH;
value.data_type = File_Data_Type::BIN_Blank_Text;
value.play_mode = Play_Mode::loop;
});
return source;
}
#endif
void configure_feed(Data_Feed& feed, std::string type, std::string key, bool enabled, Output_Data_Format format,
bool use_status, Mode_S_Output_Type mode_s_output_type, bool use_mode_ac, bool sbs_only_pos) {
feed.type = std::move(type);
feed.key = std::move(key);
feed.set_enabled(enabled);
feed.source_key = "lzy_dll";
feed.output_format.write([&](auto& value) {
value.type = format;
value.use_status = use_status;
value.mode_s_output_type = mode_s_output_type;
value.use_mode_ac = use_mode_ac;
value.sbs_only_pos = sbs_only_pos;
});
}
std::shared_ptr<Data_Feed_TCP_Server> make_tcp_server_feed(std::string key, bool enabled, Output_Data_Format format,
bool use_status, Mode_S_Output_Type mode_s_output_type,
bool use_mode_ac, bool sbs_only_pos, std::uint16_t port,
std::size_t user_buffer_size,
std::size_t system_buffer_size) {
auto feed = std::make_shared<Data_Feed_TCP_Server>();
configure_feed(*feed, "Data_Feed_TCP_Server", std::move(key), enabled, format, use_status, mode_s_output_type,
use_mode_ac, sbs_only_pos);
feed->specific.write([&](auto& value) {
value.port = port;
value.connect_user_buffer_size = user_buffer_size;
value.connect_system_buffer_size = system_buffer_size;
});
return feed;
}
} // namespace
Default_Config_File make_default_mode_acs_config(const std::filesystem::path& directory) {
Mode_ACS_Config config;
config.settings.write([](auto& value) {
value.timeout_seconds = 160;
value.max_speed_m_s = 1000;
value.wait_process_msg = true;
value.time_space_filter = true;
value.speed_filter = true;
value.max_track_point_size = 20000;
value.mode_s_max_num = 700000;
value.mode_other_max_num = 10000;
value.report_data_feed_msg_mum = 10000;
value.default_min_aircraft_list_num = 10;
});
config.data_source_config.map.push_back(make_dll_source());
#if ECAP_DEFAULT_FILE_SOURCE
config.data_source_config.map.push_back(make_file_source());
#endif
config.data_feed_config.map.push_back(make_tcp_server_feed("Port_10003", true, Output_Data_Format::BIN, true,
Mode_S_Output_Type::ALL_Mode_S, true, true, 10003,
409600, 409600));
auto udp_server = std::make_shared<Data_Feed_UDP_Server>();
configure_feed(*udp_server, "Data_Feed_UDP_Server", "22333", false, Output_Data_Format::BIN, false,
Mode_S_Output_Type::ALL_Mode_S, false, false);
udp_server->specific.write([](auto& value) { value.port = 50001; });
config.data_feed_config.map.push_back(udp_server);
auto udp_client = std::make_shared<Data_Feed_UDP_Client>();
configure_feed(*udp_client, "Data_Feed_UDP_Client", "Port_10004", false, Output_Data_Format::AVR, false,
Mode_S_Output_Type::DF_11_17_18, false, true);
udp_client->specific.write([](auto& value) {
value.port = 30004;
value.url = "192.168.1.75";
});
config.data_feed_config.map.push_back(udp_client);
auto tcp_client = std::make_shared<Data_Feed_TCP_Client>();
configure_feed(*tcp_client, "Data_Feed_TCP_Client", "Port_10005", false, Output_Data_Format::BIN, true,
Mode_S_Output_Type::NO_POS_Mode_S, true, true);
tcp_client->specific.write([](auto& value) {
value.url = "192.168.1.167";
value.port = 10005;
});
config.data_feed_config.map.push_back(tcp_client);
config.data_feed_config.map.push_back(make_tcp_server_feed(
"Port_30003", false, Output_Data_Format::SBS, false, Mode_S_Output_Type::ALL_Mode_S, true, true, 30003, 0, 0));
return {Config_Section::mode_acs, directory / "mode_acs.json", config.to_base_json()};
}
@@ -0,0 +1,4 @@
#include "Config_Default.h"
Default_Config_File make_default_version_config(const std::filesystem::path& directory) {
return {Config_Section::version, directory / "version.json", Psc::JSON("v1.0.5")};
}
@@ -0,0 +1,7 @@
#include "Config_Default.h"
Default_Config_File make_default_web_server_config(const std::filesystem::path& directory) {
Web_Server_Config config;
config.webapp = ECAP_DEFAULT_WEBAPP_PATH;
config.listen_port = 9081;
return {Config_Section::web_server, directory / "web_server.json", config.to_base_json()};
}