std::string_view 的使用

This commit is contained in:
2026-06-29 09:40:55 +08:00
parent cd446b7ca8
commit 8daf67aa5d
52 changed files with 1420 additions and 1367 deletions
+27 -25
View File
@@ -2,7 +2,8 @@
#include <codecvt>
#include "../server/Global.h"
#include "Database.h"
Psc::serial::Serial* create_serial(const std::string& serial_name,
#include <string_view>
Psc::serial::Serial* create_serial(std::string_view serial_name,
Baud_Rate_Type baud_rate) {
auto serial = new Psc::serial::Serial;
serial->set_serial_name(serial_name);
@@ -13,7 +14,7 @@ Psc::serial::Serial* create_serial(const std::string& serial_name,
serial->set_flow_control(Psc::serial::FlowControl::HardwareControl);
serial->set_buffer_byte_size(10 * 1024);
if (!serial->open()) {
std::cerr << "createSerial " + serial_name + ":" +
std::cerr << "createSerial " + std::string(serial_name) + ":" +
std::to_string(baud_rate) + " 打开串口失败!\n";
Psc::fail_fast();
return nullptr;
@@ -82,14 +83,15 @@ void File_Data_Source::before_handle_msg(std::shared_ptr<SSR::Mode_Msg>& msg) {
}
}
}
std::vector<std::string> readLines(const std::string& path) {
std::vector<std::string> readLines(std::string_view path) {
std::vector<std::string> lines;
auto path_string = std::string(path);
std::filesystem::path p =
std::filesystem::path((const char8_t*)path.c_str());
std::filesystem::path((const char8_t*)path_string.c_str());
// std::filesystem::path p = std::filesystem::u8path(path);
std::ifstream istream(p);
if (!istream) {
std::cerr << "读取模拟数据源 readLines 无法打开文件:" << path << std::endl;
std::cerr << "读取模拟数据源 readLines 无法打开文件:" << path_string << std::endl;
Psc::fail_fast();
}
// 将整个文件读入一个字符串
@@ -131,23 +133,23 @@ std::vector<std::string> readLines(const std::string& path) {
lines.push_back(line);
}
std::ostringstream oss;
oss << path + " 总行数:" + std::to_string(lines.size()) + " 有效行数:" +
oss << path_string + " 总行数:" + std::to_string(lines.size()) + " 有效行数:" +
std::to_string(lines.size()) + "\n"
<< std::flush;
std::cout << oss.str() << std::flush;
return lines;
}
std::string extractID(const std::string& logLine) {
std::string extractID(std::string_view logLine) {
size_t lastSpacePos = logLine.rfind(" "); // 查找最后一个空格
if (lastSpacePos != std::string::npos) {
return logLine.substr(lastSpacePos + 1); // 从最后一个空格之后提取字符串
return std::string(logLine.substr(lastSpacePos + 1)); // 从最后一个空格之后提取字符串
}
return logLine;
return std::string(logLine);
}
time_t convert_to_timestamp(const std::string& str) {
time_t convert_to_timestamp(std::string_view str) {
// 创建一个结构体 tm 来存储解析后的时间
std::tm timeStruct = {};
std::istringstream ss(str);
std::istringstream ss{std::string(str)};
ss >> std::get_time(&timeStruct, "%Y-%m-%d %H:%M:%S");
if (ss.fail()) {
std::cerr << "Failed to parse time" << std::endl;
@@ -161,18 +163,18 @@ time_t convert_to_timestamp(const std::string& str) {
}
return timestamp;
}
std::tuple<std::string, time_t> extractID2(const std::string& logLine) {
std::tuple<std::string, time_t> extractID2(std::string_view logLine) {
size_t lastSpacePos = logLine.rfind(" "); // 查找最后一个空格
time_t t = convert_to_timestamp(logLine.substr(0, 19));
if (lastSpacePos != std::string::npos) {
return {
logLine.substr(lastSpacePos + 1),
std::string(logLine.substr(lastSpacePos + 1)),
t
}; // 从最后一个空格之后提取字符串
}
return {logLine, t};
return {std::string(logLine), t};
}
std::string bin_format(const std::string& hex, time_t t) {
std::string bin_format(std::string_view hex, time_t t) {
std::tm *currentTime = std::localtime(&t);
auto sec = currentTime->tm_hour * 3600 + currentTime->tm_min * 60 +
currentTime->tm_sec;
@@ -208,11 +210,11 @@ std::optional<std::string> File_Data_Source::get_raw_line(int& ret_index) {
}
// 1A 33 1A 1A F1 FB 87 73 7E 7F a8001d81a87543b0a80000
std::string get_true_from_raw_line(Data_Source *ds, File_Data_Type data_type,
int index, const std::string& log_info) {
int index, std::string_view log_info) {
std::string ret;
// 2025-01-06 07:20:17 [info] dc2541e65001401a3119b2dd1c7af67132201
if (data_type == File_Data_Type::BIN) {
return log_info;
return std::string(log_info);
}
else if (data_type == File_Data_Type::BIN_Text) {
auto info = extractID(log_info);
@@ -226,7 +228,7 @@ std::string get_true_from_raw_line(Data_Source *ds, File_Data_Type data_type,
// 10 01 AA 14 61 7E 5E 02 E6 0F 38 7D 87 08 1A 32 10 01 AD B5 64 F7 63 5D 78
// 0F 9D BA 93 BA
else if (data_type == File_Data_Type::BIN_Blank_Text) {
std::string info = log_info;
std::string info(log_info);
std::string result = ds->last_char;
ds->last_char = "";
for (char c : info) {
@@ -254,25 +256,25 @@ std::string get_true_from_raw_line(Data_Source *ds, File_Data_Type data_type,
ret = hex2mem(result);
}
else if (data_type == File_Data_Type::BIN_Blank_One_Line_With_Escape) {
auto size = log_info.size();
auto size = log_info.size();
if (size % 2 != 0) {
return hex2mem(log_info.substr(0, size - 1));
return hex2mem(std::string(log_info.substr(0, size - 1)));
}
return hex2mem(log_info);
return hex2mem(std::string(log_info));
}
else if (data_type == File_Data_Type::BIN_Blank_One_Line_No_Escape) {
auto size = log_info.size();
std::string data;
if (size % 2 != 0) {
data = log_info.substr(0, size - 1);
data = std::string(log_info.substr(0, size - 1));
}
else {
data = log_info;
data = std::string(log_info);
}
return SSR::packet_to_escape_format(hex2mem(data));
}
else if (data_type == File_Data_Type::SIMPLE_BIN_Blank) {
std::string info = log_info;
std::string info(log_info);
std::string result;
for (char c : info) {
if (c != ' ') {
@@ -334,7 +336,7 @@ asio::awaitable<void> File_Data_Source::_open() {
state = "已加载" + to_string(part_infos.size()) + "长度数据!";
co_return;
}
std::vector<std::string> File_Data_Source::readBinaryFileAsString(const std::string& filepath,
std::vector<std::string> File_Data_Source::readBinaryFileAsString(std::string_view filepath,
size_t part_size) {
// 打开文件(以二进制模式)
std::ifstream file(filepath, std::ios::binary);
@@ -1,4 +1,5 @@
#pragma once
#include <string_view>
#include "Data_Source_Handler.h"
namespace Psc {
class SM_RingBuffer;
@@ -263,7 +264,7 @@ public:
}
asio::awaitable<void> _close() override;
asio::awaitable<void> _open() override;
std::vector<std::string> readBinaryFileAsString(const std::string& filepath,
std::vector<std::string> readBinaryFileAsString(std::string_view filepath,
size_t part_size);
void from_json(const Psc::JSON* that_json) override {
Data_Source::from_json(that_json);
@@ -370,7 +371,7 @@ protected:
std::unique_ptr<Psc::SM_RingBuffer> sm;
};
inline std::shared_ptr<Data_Source>
create_data_source_from_type(const std::string& t) {
create_data_source_from_type(std::string_view t) {
std::shared_ptr<Data_Source> ret{};
if (t == "Serial_Data_Source")
ret = std::make_shared<Serial_Data_Source>();
@@ -384,7 +385,7 @@ create_data_source_from_type(const std::string& t) {
ret = std::make_shared<Shared_Memory_Data_Source>();
else {
std::cout << "未知?Data_Source type类型!" << std::endl;
throw std::invalid_argument("unknown Data_Source type: " + t);
throw std::invalid_argument("unknown Data_Source type: " + std::string(t));
}
return ret;
}
@@ -1,29 +1,28 @@
#include "Data_Source_Handler.h"
#include "Data_Source.h"
#include "Local_Server/server/Global.h"
#include <string_view>
using namespace Psc;
std::shared_ptr<Data_Source> ds(Data_Source_Handler* dsh) {
std::shared_ptr<Data_Source> ds(Data_Source_Handler *dsh) {
return dynamic_cast<Data_Source*>(dsh)->that();
}
std::shared_ptr<SSR::Msg> Data_Source_Handler::create_msg(const std::string& packet) {
std::shared_ptr<SSR::Msg> Data_Source_Handler::create_msg(std::string_view packet) {
auto source = ds(this);
if (packet[0] != 0x1a) {
std::cout << "first:" << mem2hex(packet) << std::endl;
std::cout << "first:" << mem2hex(std::string(packet)) << std::endl;
return nullptr;
}
std::string error_len = source->key + " " + LOG_POS_SIMPLE +
std::string(" ") + "mode_s_error_length";
if (packet.size() < 2)
return nullptr;
if (packet.size() < 2) return nullptr;
auto mt = packet[1];
if (mt == SSR::Msg::AC) {
if (packet.size() != SSR::Msg::AC_len) {
auto packet_hex = mem2hex(std::string(packet));
SSR::mode_s_logger->c_debug(
error_len, {},
std::to_string(mt) + " size:" + std::to_string(packet.size()) +
" hex:" + mem2hex(packet) +
" hex:" + packet_hex +
" should:" + std::to_string(SSR::Msg::AC_len));
mode_ac_statistic.add_length_error();
return nullptr;
@@ -33,10 +32,11 @@ std::shared_ptr<SSR::Msg> Data_Source_Handler::create_msg(const std::string& pac
}
if (mt == SSR::Msg::S7) {
if (packet.size() != SSR::Mode_S_Msg::S7_len) {
auto packet_hex = mem2hex(std::string(packet));
SSR::mode_s_logger->c_debug(
error_len, {},
std::to_string(mt) + " size:" + std::to_string(packet.size()) +
" hex:" + mem2hex(packet) +
" hex:" + packet_hex +
" should:" + std::to_string(SSR::Msg::S7_len));
mode_s_statistic.add_length_error(
"[length error] Msg::S7 handle_mode_s_source");
@@ -46,10 +46,11 @@ std::shared_ptr<SSR::Msg> Data_Source_Handler::create_msg(const std::string& pac
}
if (mt == SSR::Msg::S14) {
if (packet.size() != SSR::Msg::S14_len) {
auto packet_hex = mem2hex(std::string(packet));
SSR::mode_s_logger->c_debug(
error_len, {},
std::to_string(mt) + " size:" + std::to_string(packet.size()) +
" hex:" + mem2hex(packet) +
" hex:" + packet_hex +
" should:" + std::to_string(SSR::Msg::S14_len));
mode_s_statistic.add_length_error(
"[length error] Msg::S14 handle_mode_s_source");
@@ -60,10 +61,11 @@ std::shared_ptr<SSR::Msg> Data_Source_Handler::create_msg(const std::string& pac
if (mt == SSR::Msg::Radarcape_status) {
return nullptr; // 不知道如何解析跳过
if (packet.size() != SSR::Msg::Radarcape_status_len) {
auto packet_hex = mem2hex(std::string(packet));
SSR::mode_s_logger->c_debug(
error_len, {},
std::to_string(mt) + " size:" + std::to_string(packet.size()) +
" hex:" + mem2hex(packet) +
" hex:" + packet_hex +
" should:" + std::to_string(SSR::Msg::Radarcape_status_len));
mode_s_statistic.add_length_error(
"[length error] Msg::Radarcape_status_len handle_mode_s_source");
@@ -73,24 +75,24 @@ std::shared_ptr<SSR::Msg> Data_Source_Handler::create_msg(const std::string& pac
}
if (mt == SSR::Msg::HULC_Status) {
if (packet.size() != SSR::Msg::HULC_len) {
auto packet_hex = mem2hex(std::string(packet));
// 找不到协议 size:23 hex:1A34195F0000001500B502FF06F423CE50000090000000
// should:5
SSR::mode_s_logger->c_debug(
error_len, {},
Psc::to_string(source->type) + " HULC size:" +
std::to_string(packet.size()) + " hex:" + mem2hex(packet));
std::to_string(packet.size()) + " hex:" + packet_hex);
return nullptr;
}
return std::make_shared<SSR::Msg>(source, packet);
}
// std::cout << "unknown_type:" << memory2hex(packet);
rotating_log("unknown_type", mem2hex(packet));
rotating_log("unknown_type", mem2hex(std::string(packet)));
return nullptr;
}
size_t Data_Source_Handler::process_mode_acs_data(const std::string& origin_data) {
size_t Data_Source_Handler::process_mode_acs_data(std::string_view origin_data) {
// 先读取原始数据 注意多复制了一遍
auto mode_data = origin_data;
std::string mode_data(origin_data);
origin_data_transform_mode_data(mode_data);
size_t ret = 0;
if (mode_data.empty()) {
@@ -115,8 +117,7 @@ size_t Data_Source_Handler::process_mode_acs_data(const std::string& origin_data
source->buffer, mode_data, [this, source, &ret](std::string& packet) {
ret++;
auto msg = create_msg(packet);
if (!msg)
return;
if (!msg) return;
source->push_to_feed(msg);
auto mt = msg->type;
bool mode_s = mt == SSR::Msg::S7 || mt == SSR::Msg::S14;
@@ -136,7 +137,6 @@ size_t Data_Source_Handler::process_mode_acs_data(const std::string& origin_data
});
return ret;
}
void Data_Source_Handler::handle_mode_s(std::shared_ptr<SSR::Mode_S_Msg> mode_s_msg) {
auto source = ds(this);
std::string t = mode_s_msg->mlat_timestamp.to_memory() +
@@ -219,16 +219,15 @@ void Data_Source_Handler::handle_mode_s(std::shared_ptr<SSR::Mode_S_Msg> mode_s_
}
}
}
void Data_Source_Handler::handle_HULC(const std::string& packet) {
void Data_Source_Handler::handle_HULC(std::string_view packet) {
std::uint8_t len = SSR::get_len(packet);
std::uint8_t id = SSR::get_id(packet);
auto msg = mem2hex(packet);
auto msg = mem2hex(std::string(packet));
if (len != packet.size() - 4) {
SSR::mode_s_logger->debug("HULC/error_length", {},
"需要: " + std::to_string(len) +
" 当前: " + std::to_string(packet.size()) +
" hex: " + mem2hex(packet));
" hex: " + mem2hex(std::string(packet)));
return;
}
if (id == 1) {
@@ -239,7 +238,7 @@ void Data_Source_Handler::handle_HULC(const std::string& packet) {
if (gps_ok) {}
auto g = Global::instance();
base_station.set_msg(status_msg);
Log_Type type({}, {{"msg", msg}});
Log_Type type({}, {{"msg", std::string(msg)}});
SSR::mode_s_logger->debug("HULC/status", type,
status_msg.toJson().to_json_string());
if (gps_ok) {}
@@ -251,14 +250,12 @@ 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->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) << "
@@ -330,8 +327,7 @@ void Data_Source_Handler::refresh_data_feed_key_list() {
}
}
}
std::optional<std::string> convert_to_send_format(Data_Source_Handler* ds,
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;
@@ -349,8 +345,7 @@ std::optional<std::string> convert_to_send_format(Data_Source_Handler* ds,
// 计算出是否输出消息
std::optional<std::string> send_msg = std::nullopt;
if (type == SSR::Msg::HULC_Status) {
if (!use_status)
return std::nullopt;
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) {
@@ -365,8 +360,7 @@ std::optional<std::string> convert_to_send_format(Data_Source_Handler* ds,
}
}
else if (type == SSR::Msg::AC) {
if (!use_mode_ac)
return std::nullopt;
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;
@@ -417,12 +411,10 @@ std::optional<std::string> convert_to_send_format(Data_Source_Handler* ds,
sbs_out_put = true;
}
}
if (!sbs_out_put)
return std::nullopt;
if (!sbs_out_put) return std::nullopt;
send_msg = "";
SSR::SBS_MSG msg_base;
if (!aircraft)
return std::nullopt;
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");
@@ -438,8 +430,7 @@ std::optional<std::string> convert_to_send_format(Data_Source_Handler* ds,
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::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;
@@ -472,7 +463,6 @@ std::optional<std::string> convert_to_send_format(Data_Source_Handler* ds,
}
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();
@@ -489,8 +479,7 @@ void Data_Source_Handler::push_to_feed(const std::shared_ptr<SSR::Msg>& msg) {
break;
}
std::shared_ptr<Data_Feed>& feed = opt_feed.value();
if (!feed->enable)
continue;
if (!feed->enable) continue;
if (msg->type == SSR::Mode_Msg::T::S7 ||
msg->type == SSR::Mode_Msg::T::S14) {
// static Frequency_Limit fl;
@@ -521,7 +510,6 @@ void Data_Source_Handler::push_to_feed(const std::shared_ptr<SSR::Msg>& msg) {
}
}
}
Psc::JSON Data_Source_Handler::get_all_connect_feed_status() {
Psc::JSON ret = Psc::JSON::object();
std::vector<Cached_Source_Info> list;
@@ -543,7 +531,6 @@ Psc::JSON Data_Source_Handler::get_all_connect_feed_status() {
}
return ret;
}
Psc::JSON Data_Source_Handler::get_all_connect_feed() {
Psc::JSON ret = Psc::JSON::array();
std::vector<Cached_Source_Info> list;
@@ -1,4 +1,5 @@
#pragma once
#include <string_view>
#include <utility>
#include "Core/Base/SM_RingBuffer.h"
#include "Core/Serial/Serial_Coro.h"
@@ -12,12 +13,12 @@
// 这个函数专门装cpu密集函数 放到线程池去处理
class Data_Source_Handler : public DataBase {
public:
std::shared_ptr<SSR::Msg> create_msg(const std::string& packet);
std::shared_ptr<SSR::Msg> create_msg(std::string_view packet);
virtual void origin_data_transform_mode_data(std::string& origin_data) {};
virtual void before_handle_msg(std::shared_ptr<SSR::Mode_Msg>& msg) {};
virtual void handle_mode_s(std::shared_ptr<SSR::Mode_S_Msg> msg);
void handle_HULC(const std::string& packet);
size_t process_mode_acs_data(const std::string& mode_data);
void handle_HULC(std::string_view packet);
size_t process_mode_acs_data(std::string_view mode_data);
Mode_AC_Statistic_Data mode_ac_statistic;
Mode_S_Statistic_Data mode_s_statistic;
Psc::Speed_Statistics read_speed;
+10 -9
View File
@@ -5,8 +5,9 @@
#include <chrono>
#include <functional>
#include <map>
#include <string_view>
Aircraft::Aircraft(const std::string &icao) : Aircraft_Info(icao) {
Aircraft::Aircraft(std::string_view icao) : Aircraft_Info(icao) {
auto size = Global::instance()->mode_acs.max_track_point_size.load();
air_pos_track_list.init(size);
surface_pos_track_list.init(size);
@@ -32,13 +33,13 @@ void Aircraft::refresh_external_database_info() {
}
std::shared_ptr<SSR::Aircraft_Info>
DataBase::get_aircraft(const std::string &icao) {
return aircraft_map.get(icao);
DataBase::get_aircraft(std::string_view icao) {
return aircraft_map.get(std::string(icao));
}
std::shared_ptr<SSR::Aircraft_Info>
DataBase::create_aircraft(const std::string &icao) {
auto ret = aircraft_map.create(icao);
DataBase::create_aircraft(std::string_view icao) {
auto ret = aircraft_map.create(std::string(icao));
ret->refresh_external_database_info();
return ret;
}
@@ -298,8 +299,8 @@ void database_server(Global *g) {
static std::string output;
static void log_i(const std::string &label, const std::string &value,
const std::string &unit = "") {
static void log_i(std::string_view label, std::string_view value,
std::string_view unit = "") {
std::ostringstream oss;
// Format the label and value
oss << std::left << std::setw(30) << label << ": " << value;
@@ -313,7 +314,7 @@ static void log_i(const std::string &label, const std::string &value,
output += oss.str();
}
static void log_i(const std::string &label, double value,
const std::string &unit = "") {
static void log_i(std::string_view label, double value,
std::string_view unit = "") {
log_i(label, std::to_string(value), unit);
}
+3 -2
View File
@@ -1,4 +1,5 @@
#pragma once
#include <string_view>
#include "../Aircraft/Aircraft.h"
#include "../Aircraft/Flight_VTO.h"
#include "../External_Database/export.h"
@@ -148,8 +149,8 @@ protected:
};
class DataBase : public SSR::Data_Source_Interface, public With_Loop_Coro {
public:
std::shared_ptr<SSR::Aircraft_Info> get_aircraft(const std::string& icao) override;
std::shared_ptr<SSR::Aircraft_Info> create_aircraft(const std::string& icao) override;
std::shared_ptr<SSR::Aircraft_Info> get_aircraft(std::string_view icao) override;
std::shared_ptr<SSR::Aircraft_Info> create_aircraft(std::string_view icao) override;
Psc::JSON get_aircraftlist();
Psc::JSON get_aircraftlist(int limit_msg_num);
BaseStation base_station;