预处理移动到 process_mode_acs_data 线程
This commit is contained in:
@@ -94,7 +94,15 @@ std::shared_ptr<SSR::Msg> Data_Source_Handler::create_msg(
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void Data_Source_Handler::process_mode_acs_data(const std::string& mode_data) {
|
||||
void Data_Source_Handler::process_mode_acs_data(const std::string& origin_data) {
|
||||
// 先读取原始数据 注意多复制了一遍
|
||||
auto mode_data = origin_data;
|
||||
origin_data_transform_mode_data(mode_data);
|
||||
|
||||
if (mode_data.empty()) {
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(10));
|
||||
}
|
||||
|
||||
auto source = ds(this);
|
||||
auto size = mode_data.size();
|
||||
read_speed.update(size);
|
||||
@@ -262,3 +270,286 @@ void Data_Source_Handler::handle_HULC(const std::string& packet) {
|
||||
SSR::mode_s_logger->debug("HULC/unknown_id", {}, msg);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Data_Source_Handler::refresh_data_feed_key_list() {
|
||||
//std::cout << key << " refresh_data_feed_key_list" << std::endl;
|
||||
std::vector<std::string> tmp;
|
||||
for (auto& relation : Global::instance()->mode_acs.source_feed_relation_config.map.list()) {
|
||||
if (!relation->enable) continue;
|
||||
if (relation->type == "One_to_One_Relation") {
|
||||
auto t = dynamic_cast<One_to_One_Relation*>(relation.get());
|
||||
|
||||
//std::cout << VAR_STR_2(t->source_key, this->key) << " refresh_data_feed_key_list" << std::endl;
|
||||
if (t->source_key == this->key) {
|
||||
tmp.push_back(t->feed_key);
|
||||
}
|
||||
} else if (relation->type == "First_Source_To_All_Feed_Relation") {
|
||||
auto t = dynamic_cast<First_Source_To_All_Feed_Relation*>(relation.get());
|
||||
std::shared_ptr<Data_Source> first = nullptr;
|
||||
for (const auto& ds : Global::instance()->mode_acs.data_source_config.map.list()) {
|
||||
if (ds->enable) {
|
||||
first = ds;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (first->key == key) {
|
||||
for (const auto& df : Global::instance()->mode_acs.data_feed_config.map.list()) {
|
||||
if (df->enable) {
|
||||
tmp.push_back(df->key);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::sort(tmp.begin(), tmp.end());
|
||||
// 去重
|
||||
auto last = std::unique(tmp.begin(), tmp.end());
|
||||
tmp.erase(last, tmp.end());
|
||||
|
||||
|
||||
|
||||
{
|
||||
std::vector<Cached_Source_Info> tmp_info;
|
||||
|
||||
// 创建 tmp_info 向量,将 tmp 的内容转化为 Cached_Source_Info 对象
|
||||
for (const auto& key : tmp) {
|
||||
tmp_info.push_back({key});
|
||||
}
|
||||
|
||||
{
|
||||
// 进入临界区,锁住 mutex,确保线程安全
|
||||
std::lock_guard<std::mutex> lock(cdf_mtx);
|
||||
|
||||
// 1. 删除 tmp 中没有的 cached_data_feed_key_list 元素
|
||||
auto it = cached_data_feed_key_list.begin();
|
||||
while (it != cached_data_feed_key_list.end()) {
|
||||
if (std::find_if(tmp_info.begin(), tmp_info.end(),
|
||||
[&](const Cached_Source_Info& info) {
|
||||
return info.key == it->key;
|
||||
}) == tmp_info.end()) {
|
||||
// 如果当前元素在 tmp 中找不到,删除它
|
||||
it = cached_data_feed_key_list.erase(it);
|
||||
} else {
|
||||
++it;
|
||||
}
|
||||
}
|
||||
|
||||
// 2. 创建 tmp 中有但 cached_data_feed_key_list 没有的元素
|
||||
for (const auto& tmp_item : tmp_info) {
|
||||
auto found = std::find_if(cached_data_feed_key_list.begin(), cached_data_feed_key_list.end(),
|
||||
[&](const Cached_Source_Info& cached_item) {
|
||||
return cached_item.key == tmp_item.key;
|
||||
});
|
||||
if (found == cached_data_feed_key_list.end()) {
|
||||
// 如果 tmp_item 不在 cached_data_feed_key_list 中,添加它
|
||||
cached_data_feed_key_list.push_back(tmp_item);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::optional<std::string> convert_to_send_format(Data_Source_Handler* ds, const std::shared_ptr<Data_Feed>& feed, const std::shared_ptr<SSR::Msg>& msg)
|
||||
{
|
||||
auto& type = msg->type;
|
||||
auto fs = dynamic_cast<File_Data_Source*>(msg->source.get());
|
||||
if (fs) {
|
||||
if (fs->play_mode == Play_Mode::analysis) {
|
||||
//std::cout << fs->key << " analysis i ==" << i << std::endl;
|
||||
}
|
||||
}
|
||||
// 出口输出的条件
|
||||
auto& output_format = feed->output_format.type;
|
||||
auto& use_mode_ac = feed->output_format.use_mode_ac;
|
||||
auto& use_status = feed->output_format.use_status;
|
||||
auto& mode_s_output_type = feed->output_format.mode_s_output_type;
|
||||
// 计算出是否输出消息
|
||||
std::optional<std::string> send_msg = std::nullopt;
|
||||
if (type == SSR::Msg::HULC_Status) {
|
||||
if (!use_status) return std::nullopt;
|
||||
auto data = static_cast<SSR::Msg*>(msg.get());
|
||||
if (output_format == Output_Data_Format::BIN || output_format == Output_Data_Format::BIN_ID) {
|
||||
send_msg = SSR::packet_to_escape_format(data->packet);
|
||||
}
|
||||
} else if (type == SSR::Msg::Radarcape_status) {
|
||||
auto data = static_cast<SSR::Msg*>(msg.get());
|
||||
if (output_format == Output_Data_Format::BIN || output_format == Output_Data_Format::BIN_ID) {
|
||||
send_msg = SSR::packet_to_escape_format(data->packet);
|
||||
}
|
||||
} else if (type == SSR::Msg::AC) {
|
||||
if (!use_mode_ac) return std::nullopt;
|
||||
auto data = static_cast<SSR::Mode_AC_Msg*>(msg.get());
|
||||
std::string& msg_hex = data->msg_hex;
|
||||
char signal_level = data->signal_level;
|
||||
SSR::MLAT_timestamp& mlat_timestamp = data->mlat_timestamp;
|
||||
if (output_format == Output_Data_Format::BIN) {
|
||||
//send_msg = create_Binary_Format_memory(msg_hex, signal_level, &mlat_timestamp);
|
||||
send_msg = SSR::packet_to_escape_format(msg->packet);
|
||||
} else if (output_format == Output_Data_Format::BIN_ID) {
|
||||
// std::uint32_t id;
|
||||
// {
|
||||
// id = Global::instance()->mlat_server.id;
|
||||
// }
|
||||
// auto bin_id_packet = mode_s_msg_packet_to_server_packet(id, data->packet);
|
||||
// send_msg = packet_to_escape_format(bin_id_packet);
|
||||
} else if (output_format == Output_Data_Format::AVR) {
|
||||
send_msg = SSR::create_AVR_format(msg_hex);
|
||||
} else if (output_format == Output_Data_Format::AVR_MLAT) {
|
||||
send_msg = create_MLAT_AVR_format(msg_hex, &mlat_timestamp);
|
||||
}
|
||||
} else if (type == SSR::Msg::S7 || type == SSR::Msg::S14) {
|
||||
auto s_msg = static_cast<SSR::Mode_S_Msg*>(msg.get());
|
||||
std::string& icao = s_msg->icao;
|
||||
SSR::Downlink_Format& df = s_msg->df;
|
||||
std::string& msg_hex = s_msg->msg_hex;
|
||||
auto& signal_level = s_msg->signal_level;
|
||||
SSR::MLAT_timestamp& mlat_timestamp = s_msg->mlat_timestamp;
|
||||
auto aircraft = ds->get_aircraft(s_msg->icao);
|
||||
|
||||
if (output_format == Output_Data_Format::SBS) {
|
||||
bool sbs_out_put = false;
|
||||
if (feed->output_format.sbs_only_pos) {
|
||||
auto s = ds->get_aircraft(s_msg->icao);
|
||||
if (s) {
|
||||
auto pos = s->pos();
|
||||
if (pos.has_value()) {
|
||||
if (feed->sbs_flm.test(s_msg->icao)) {
|
||||
sbs_out_put = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (feed->sbs_flm.test(s_msg->icao)) {
|
||||
sbs_out_put = true;
|
||||
}
|
||||
}
|
||||
if (!sbs_out_put) return std::nullopt;
|
||||
|
||||
send_msg = "";
|
||||
SSR::SBS_MSG msg_base;
|
||||
if (!aircraft) return std::nullopt;
|
||||
msg_base.set(aircraft.get());
|
||||
for (int msg_t = 1; msg_t <= 8; ++msg_t) {
|
||||
send_msg->append(msg_base.to_msg(msg_t) + "\n");
|
||||
}
|
||||
send_msg->append(msg_base.to_ID() + "\n");
|
||||
send_msg->append(msg_base.to_AIR() + "\n");
|
||||
send_msg->append(msg_base.to_CLK() + "\n");
|
||||
send_msg->append(msg_base.to_SEL() + "\n");
|
||||
send_msg->append(msg_base.to_STA() + "\n");
|
||||
return send_msg;
|
||||
}
|
||||
|
||||
bool DF_11_17_18 = df == SSR::Downlink_Format::All_Call_Reply_11 || df == SSR::Downlink_Format::Extended_Squitter_17 || df ==
|
||||
SSR::Downlink_Format::Extended_Squitter_Non_Transponder_18;
|
||||
if (mode_s_output_type == Mode_S_Output_Type::DF_11_17_18 && !DF_11_17_18) return std::nullopt;
|
||||
if (mode_s_output_type == Mode_S_Output_Type::NO_POS_Mode_S) {
|
||||
if (aircraft && aircraft->pos().has_value()) {
|
||||
return std::nullopt;
|
||||
}
|
||||
}
|
||||
|
||||
if (output_format == Output_Data_Format::BIN) {
|
||||
send_msg = SSR::packet_to_escape_format(s_msg->packet);
|
||||
//send_msg = create_Binary_Format_memory(msg_hex, signal_level, &mlat_timestamp);
|
||||
} else if (output_format == Output_Data_Format::BIN_ID) {
|
||||
// std::uint32_t id;
|
||||
// {
|
||||
// id = Global::instance()->mlat_server.id;
|
||||
// }
|
||||
// auto bin_id_packet = mode_s_msg_packet_to_server_packet(id, data->packet);
|
||||
// send_msg = packet_to_escape_format(bin_id_packet);
|
||||
} else if (output_format == Output_Data_Format::AVR) {
|
||||
send_msg = SSR::create_AVR_format(msg_hex);
|
||||
} else if (output_format == Output_Data_Format::AVR_MLAT) {
|
||||
send_msg = create_MLAT_AVR_format(msg_hex, &mlat_timestamp);
|
||||
} else {
|
||||
std::cerr << "Unknown output format " << VAR_STR_1(output_format) << std::endl;
|
||||
return std::nullopt;
|
||||
}
|
||||
}
|
||||
return send_msg;
|
||||
}
|
||||
|
||||
|
||||
void Data_Source_Handler::push_to_feed(const std::shared_ptr<SSR::Msg>& msg) {
|
||||
if (need_refresh_data_feed_key_list) {
|
||||
refresh_data_feed_key_list();
|
||||
need_refresh_data_feed_key_list = false;
|
||||
}
|
||||
auto& other_size = Global::instance()->mode_acs.mode_other_max_num;
|
||||
auto& s_size = Global::instance()->mode_acs.mode_other_max_num;
|
||||
std::vector<std::string> list;
|
||||
|
||||
|
||||
|
||||
for (const auto& item : cached_data_feed_key_list) {
|
||||
auto& key = item.key;
|
||||
auto opt_feed = Global::instance()->mode_acs.data_feed_config.map.get(key);
|
||||
if (!opt_feed.has_value()) {
|
||||
std::cout << "wrong data feed: " << key << std::endl;
|
||||
break;
|
||||
}
|
||||
std::shared_ptr<Data_Feed>& feed = opt_feed.value();
|
||||
if (!feed->enable) continue;
|
||||
|
||||
|
||||
if (msg->type == SSR::Mode_Msg::T::S7 || msg->type == SSR::Mode_Msg::T::S14) {
|
||||
if (feed->msg_buffer.mode_s_msg_num > s_size) {
|
||||
continue;
|
||||
} else {
|
||||
++feed->msg_buffer.mode_s_msg_num;
|
||||
}
|
||||
} else {
|
||||
if (feed->msg_buffer.mode_other_msg_num > other_size) {
|
||||
continue;
|
||||
} else {
|
||||
++feed->msg_buffer.mode_other_msg_num;
|
||||
}
|
||||
}
|
||||
std::optional<std::string> binary = convert_to_send_format(this, feed, msg);
|
||||
if (binary.has_value()) {
|
||||
feed->msg_buffer.push(binary.value());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Psc::JSON Data_Source_Handler::get_all_connect_feed_status() {
|
||||
Psc::JSON ret = Psc::JSON::object();
|
||||
std::vector<Cached_Source_Info> list;
|
||||
{
|
||||
std::lock_guard g(cdf_mtx);
|
||||
list = cached_data_feed_key_list;
|
||||
}
|
||||
for (auto& i : list) {
|
||||
Psc::JSON cur = Psc::JSON::object();
|
||||
auto odf = Global::instance()->mode_acs.data_feed_config.map.get(i.key);
|
||||
if (odf.has_value()) {
|
||||
const auto& df = odf.value();
|
||||
i.mode_s_cache_num.update(df->msg_buffer.mode_s_msg_num);
|
||||
i.mode_other_cache_num.update(df->msg_buffer.mode_other_msg_num);
|
||||
cur.append({"mode_s_msg_num", i.mode_s_cache_num.to_json()});
|
||||
cur.append({"mode_other_msg_num", i.mode_other_cache_num.to_json()});
|
||||
}
|
||||
ret.append({i.key, cur});
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
Psc::JSON Data_Source_Handler::get_all_connect_feed() {
|
||||
Psc::JSON ret = Psc::JSON::array();
|
||||
std::vector<Cached_Source_Info> list;
|
||||
{
|
||||
std::lock_guard g(cdf_mtx);
|
||||
list = cached_data_feed_key_list;
|
||||
}
|
||||
for (auto& i : list) {
|
||||
Psc::JSON cur = Psc::JSON::object();
|
||||
cur.append({"key", i.key});
|
||||
ret.append(cur);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
Reference in New Issue
Block a user