From 9ccb8aaa3a9de4556117b7fcd77fc790ef9556b1 Mon Sep 17 00:00:00 2001
From: wyc <1104749580@qq.com>
Date: Tue, 14 Jul 2026 10:35:04 +0800
Subject: [PATCH] =?UTF-8?q?=E5=8D=8F=E7=A8=8B=E5=AF=B9=E5=A4=96=E6=8A=9B?=
=?UTF-8?q?=E5=BC=82=E5=B8=B8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.clang-format | 57 +++++
.xml | 42 ++++
module/Local_Server/server/With_Loop_Coro.cpp | 213 ++++++++++--------
module/Local_Server/server/With_Loop_Coro.h | 55 ++---
module/Local_Server/server/io_coro.cpp | 1 +
module/Local_Server/server/io_coro.h | 9 +
module/dll_source/main.cpp | 45 +---
7 files changed, 269 insertions(+), 153 deletions(-)
create mode 100644 .clang-format
create mode 100644 .xml
diff --git a/.clang-format b/.clang-format
new file mode 100644
index 0000000..ffec9d2
--- /dev/null
+++ b/.clang-format
@@ -0,0 +1,57 @@
+# Generated from CLion C/C++ Code Style settings
+---
+Language: Cpp
+BasedOnStyle: LLVM
+AccessModifierOffset: -4
+AlignConsecutiveAssignments: false
+AlignConsecutiveDeclarations: false
+AlignOperands: false
+AlignTrailingComments: false
+AllowShortBlocksOnASingleLine: false
+AllowShortFunctionsOnASingleLine: None
+AlwaysBreakTemplateDeclarations: Yes
+BraceWrapping:
+ AfterCaseLabel: false
+ AfterClass: false
+ AfterControlStatement: false
+ AfterEnum: false
+ AfterFunction: false
+ AfterNamespace: false
+ AfterStruct: false
+ AfterUnion: false
+ AfterExternBlock: false
+ BeforeCatch: true
+ BeforeElse: true
+ BeforeLambdaBody: false
+ BeforeWhile: true
+ SplitEmptyFunction: false
+ SplitEmptyRecord: false
+ SplitEmptyNamespace: false
+BreakBeforeBraces: Custom
+BreakConstructorInitializers: AfterColon
+BreakConstructorInitializersBeforeComma: false
+ColumnLimit: 120
+ConstructorInitializerAllOnOneLineOrOnePerLine: false
+ContinuationIndentWidth: 0
+EmptyLineBeforeAccessModifier: Never
+IncludeCategories:
+ - Regex: '^<.*'
+ Priority: 1
+ - Regex: '^".*'
+ Priority: 2
+ - Regex: '.*'
+ Priority: 3
+IncludeIsMainRegex: '([-_](test|unittest))?$'
+IndentWidth: 4
+InsertNewlineAtEOF: true
+MacroBlockBegin: ''
+MacroBlockEnd: ''
+MaxEmptyLinesToKeep: 0
+PointerAlignment: Left
+SpaceInEmptyParentheses: false
+SpacesInAngles: false
+SpacesInConditionalStatement: false
+SpacesInCStyleCastParentheses: false
+SpacesInParentheses: false
+TabWidth: 4
+...
diff --git a/.xml b/.xml
new file mode 100644
index 0000000..b36b442
--- /dev/null
+++ b/.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/module/Local_Server/server/With_Loop_Coro.cpp b/module/Local_Server/server/With_Loop_Coro.cpp
index 5b81ec6..13b56b9 100644
--- a/module/Local_Server/server/With_Loop_Coro.cpp
+++ b/module/Local_Server/server/With_Loop_Coro.cpp
@@ -1,105 +1,140 @@
#include "With_Loop_Coro.h"
#include "io_coro.h"
#include
-
With_Loop_Coro::~With_Loop_Coro() = default;
-
void With_Loop_Coro::async_stop() {
- std::string name = type + ":" + key;
- set_state(State::Force_Quit, std::format("任务正常收到请求,等待退出 {}!\n", name).c_str());
- loop_running = false;
+ std::string name = type + ":" + key;
+ set_state(State::Force_Quit, std::format("任务正常收到请求,等待退出 {}!\n", name).c_str());
+ loop_running = false;
}
-
void With_Loop_Coro::sync_wait() {
- std::string name = type + ":" + key;
- if (!loop_task) {
- std::cout << std::format("{}退出成功! loop_task 未启动 \n", name);
- return;
- }
- while (loop_task->wait_for(std::chrono::milliseconds(0)) != std::future_status::ready) {
- std::cout << std::format("{}等待退出 当前状态为{} \n", name, Psc::to_string(this->state));
- std::this_thread::sleep_for(std::chrono::milliseconds(1000));
- }
- std::cout << std::format("{}退出成功! \n", name);
+ std::string name = type + ":" + key;
+ if (!loop_task) {
+ std::cout << std::format("{}退出成功! loop_task 未启动 \n", name);
+ return;
+ }
+ while (loop_task->wait_for(std::chrono::milliseconds(0)) != std::future_status::ready) {
+ std::cout << std::format("{}等待退出 当前状态为{} \n", name, Psc::to_string(this->state));
+ std::this_thread::sleep_for(std::chrono::milliseconds(1000));
+ }
+ std::cout << std::format("{}退出成功! \n", name);
}
-
bool With_Loop_Coro::running() const {
- return loop_running;
+ return loop_running.load();
}
-
void With_Loop_Coro::set_state(State state, std::string_view action) {
- if (!action.empty()) {
- std::string name = type + "_" + key;
- std::cout << std::format("协程状态机 {} {} {} ==> {} \n", name, action, Psc::to_string(this->state),
- Psc::to_string(state));
- }
- this->state = state;
+ if (!action.empty()) {
+ std::string name = type + "_" + key;
+ std::cout << std::format("协程状态机 {} {} {} ==> {} \n", name, action, Psc::to_string(this->state),
+ Psc::to_string(state));
+ }
+ this->state = state;
}
-
-With_Loop_Coro::With_Loop_Coro() : stop(0.1) {
-}
-
+With_Loop_Coro::With_Loop_Coro() : stop(0.1) {}
asio::awaitable With_Loop_Coro::run_loop_coro() {
- loop_running.store(true, std::memory_order_release);
- try {
- co_await loop_coro();
- loop_running.store(false, std::memory_order_release);
- co_return;
- } catch (...) {
- loop_running.store(false, std::memory_order_release);
- throw;
- }
+ loop_running.store(true, std::memory_order_release);
+ try {
+ co_await loop_coro();
+ loop_running.store(false, std::memory_order_release);
+ co_return;
+ }
+ catch (const std::exception& e) {
+ //loop_running.store(false, std::memory_order_release);
+ auto str = std::format("{} loop_coro 异常退出: {}\n", key, e.what());
+ std::cerr << str;
+ set_state(State::Loop_Exception, str);
+ throw;
+ }
+ catch (...) {
+ //loop_running.store(false, std::memory_order_release);
+ std::cerr << "loop_coro 未知异常退出\n";
+ throw;
+ }
}
-
asio::awaitable With_Loop_Coro::tick() {
- std::string name = type + ":" + key;
- if (state == State::Force_Quit) {
- static Frequency_Limit_Multi flm;
- if (flm.test(name)) {
- std::cout << std::format("{} 正在强制退出!\n", name);
- }
- }
- if (state == State::Start) {
- if (enable) {
- set_state(State::Before_Request_Start_Loop);
- }
- } else if (state == State::Before_Request_Start_Loop) {
- co_await this->_open();
- loop_running = enable;
- loop_task = Coro::instance()->spawn(run_loop_coro());
- set_state(State::Waiting_Loop_Start, "开始启动任务");
- } else if (state == State::Waiting_Loop_Start) {
- if (running()) {
- set_state(State::Loop_Running, "启动任务成功!");
- }
- } else if (state == State::Loop_Running) {
- if (enable && !running()) {
- std::cout << std::format("任务未知原因已经退出 {}!\n", name);
- try {
- loop_task->get();
- } catch (const std::exception &e) {
- std::cout << std::format("任务异常退出 {}! {}\n", name, e.what());
- loop_running = false;
- } catch (...) {
- std::cout << std::format("任务未知异常退出 {}!\n", name);
- loop_running = false;
- }
- loop_task.reset();
- co_await _close();
- co_return;
- }
- if (!enable) {
- set_state(State::Before_Request_Stop_Loop, std::format("{} 检测到 enable变化 异步退出开始!", name));
- }
- } else if (state == State::Before_Request_Stop_Loop) {
- loop_running = false;
- set_state(State::Waiting_Stop_Loop, "退出变量已设置 等待退出");
- } else if (state == State::Waiting_Stop_Loop) {
- if (!running()) {
- loop_task.reset();
- co_await this->_close();
- set_state(State::Start, "任务正常退出");
- }
- }
- co_return;
+ std::string name = type + ":" + key;
+ if (state == State::Force_Quit) {
+ static Frequency_Limit_Multi flm;
+ if (flm.test(name)) {
+ std::cout << std::format("{} 正在强制退出!\n", name);
+ }
+ }
+ if (state == State::Start) {
+ if (enable) {
+ set_state(State::Before_Request_Start_Loop);
+ }
+ }
+ else if (state == State::Before_Request_Start_Loop) {
+ co_await this->_open();
+ loop_running = enable;
+ auto future = asio::co_spawn(Coro::instance()->io, run_loop_coro(), asio::use_future);
+ loop_task = std::make_shared>(std::move(future));
+ //loop_task = Coro::instance()->spawn(run_loop_coro());
+ // loop_task = asio::co_spawn(Coro::instance()->io, run_loop_coro(), [](std::exception_ptr exception) {
+ // if (exception) {
+ // std::cout << " 发生了异常!" << std::endl;
+ // std::rethrow_exception(exception);
+ // }
+ // });
+ set_state(State::Waiting_Loop_Start, "开始启动任务");
+ }
+ else if (state == State::Waiting_Loop_Start) {
+ if (running()) {
+ set_state(State::Loop_Running, "启动任务成功!");
+ }
+ }
+ else if (state == State::Loop_Running) {
+ if (!enable) {
+ set_state(State::Before_Request_Stop_Loop, std::format("{} 检测到 enable变化 异步退出开始!", name));
+ }
+ }
+ else if (state == State::Loop_Exception) {
+ bool catch_exception = false;
+ if (!catch_exception) {
+ loop_task->get();
+ }
+ else {
+ std::exception_ptr task_exception;
+ try {
+ // 走到这里直接崩溃
+ loop_task->get();
+ }
+ catch (...) {
+ task_exception = std::current_exception();
+ }
+ loop_task.reset();
+ co_await _close();
+ if (task_exception) {
+ loop_running = false;
+ try {
+ std::rethrow_exception(task_exception);
+ }
+ catch (const std::exception& e) {
+ std::cout << std::format("任务异常退出 {}! {}\n", name, e.what()) << std::flush;
+ }
+ catch (...) {
+ std::cout << std::format("任务未知异常退出 {}!\n", name) << std::flush;
+ }
+ set_state(State::Start, "任务异常退出");
+ co_return;
+ }
+ else {
+ std::cout << "没有异常 状态机 紊乱" << std::endl;
+ std::terminate();
+ }
+ co_return;
+ }
+ }
+ else if (state == State::Before_Request_Stop_Loop) {
+ loop_running = false;
+ set_state(State::Waiting_Stop_Loop, "退出变量已设置 等待退出");
+ }
+ else if (state == State::Waiting_Stop_Loop) {
+ if (!running()) {
+ loop_task.reset();
+ co_await this->_close();
+ set_state(State::Start, "任务正常退出");
+ }
+ }
+ co_return;
}
diff --git a/module/Local_Server/server/With_Loop_Coro.h b/module/Local_Server/server/With_Loop_Coro.h
index 47c381e..cf9ea26 100644
--- a/module/Local_Server/server/With_Loop_Coro.h
+++ b/module/Local_Server/server/With_Loop_Coro.h
@@ -16,35 +16,36 @@
#include "Core/Statistics/Frequency_Limit.h"
class With_Loop_Coro_Data {
public:
- std::string type;
- std::string key;
- Psc::Copyable_Atomic enable{};
- PSC_USE_JSON
+ std::string type;
+ std::string key;
+ Psc::Copyable_Atomic enable{};
+ PSC_USE_JSON
};
class With_Loop_Coro : public With_Loop_Coro_Data {
public:
- virtual ~With_Loop_Coro();
- std::shared_ptr> loop_task;
- virtual asio::awaitable loop_coro() = 0;
- void async_stop();
- void sync_wait();
- bool running() const;
- asio::awaitable tick();
- virtual asio::awaitable _open() = 0;
- virtual asio::awaitable _close() = 0;
- enum class State {
- Force_Quit,
- Start,
- Before_Request_Start_Loop,
- Waiting_Loop_Start,
- Loop_Running,
- Before_Request_Stop_Loop,
- Waiting_Stop_Loop
- } state = State::Start;
- void set_state(State state, std::string_view action = "");
- With_Loop_Coro();
+ virtual ~With_Loop_Coro();
+ std::shared_ptr> loop_task;
+ virtual asio::awaitable loop_coro() = 0;
+ void async_stop();
+ void sync_wait();
+ bool running() const;
+ asio::awaitable tick();
+ virtual asio::awaitable _open() = 0;
+ virtual asio::awaitable _close() = 0;
+ enum class State {
+ Force_Quit,
+ Start,
+ Before_Request_Start_Loop,
+ Waiting_Loop_Start,
+ Loop_Running,
+ Loop_Exception,
+ Before_Request_Stop_Loop,
+ Waiting_Stop_Loop
+ } state = State::Start;
+ void set_state(State state, std::string_view action = "");
+ With_Loop_Coro();
protected:
- Psc::Copyable_Atomic loop_running{};
- asio::awaitable run_loop_coro();
- Frequency_Limit_Multi stop;
+ Psc::Copyable_Atomic loop_running{};
+ asio::awaitable run_loop_coro();
+ Frequency_Limit_Multi stop;
};
diff --git a/module/Local_Server/server/io_coro.cpp b/module/Local_Server/server/io_coro.cpp
index f5e80c4..325ae05 100644
--- a/module/Local_Server/server/io_coro.cpp
+++ b/module/Local_Server/server/io_coro.cpp
@@ -82,6 +82,7 @@ void Coro::start() {
auto promise = std::make_shared >();
loop_task = std::make_unique >(promise->get_future());
asio::co_spawn(io, coro_thread(), [promise](std::exception_ptr ep) {
+ std::cout << "发生了异常" << std::endl;
if (ep) {
promise->set_exception(ep);
std::rethrow_exception(ep);
diff --git a/module/Local_Server/server/io_coro.h b/module/Local_Server/server/io_coro.h
index 61875f2..ac65954 100644
--- a/module/Local_Server/server/io_coro.h
+++ b/module/Local_Server/server/io_coro.h
@@ -31,6 +31,15 @@ public:
return std::make_shared >(std::move(future));
}
+ // template
+ // void spawn(Awaitable &&awaitable) {
+ // asio::co_spawn(io, std::forward(awaitable), [](std::exception_ptr exception) {
+ // if (exception) {
+ // std::rethrow_exception(exception);
+ // }
+ // });
+ // }
+
private:
asio::awaitable coro_thread();
diff --git a/module/dll_source/main.cpp b/module/dll_source/main.cpp
index c705ff4..3e31011 100644
--- a/module/dll_source/main.cpp
+++ b/module/dll_source/main.cpp
@@ -18,12 +18,9 @@
#include "Core/Shared_Memory/Shared_Memory.h"
#include "Core/system/export.h"
#include "Core/spdlog/export.h"
-
#include "Core/Base/SM_RingBuffer.h"
#include "Dll_Global.h"
#include
-
-
std::vector ddd = {
"1A 33 1A 1A F1 DA 08 2A 73 60 8D 78 12 0A EA 28 88 64 25 3C 08 33 22 41",
"1A 33 1A 1A F1 D9 13 EA E7 11 8D 78 1D 40 58 BF 41 E2 45 49 09 7B C8 24",
@@ -41,8 +38,6 @@ std::vector ddd = {
"1A 33 1A 1A F1 DF AF 71 5F 6C A0 00 0E 3E A8 7A 23 26 E1 0C 22 4E D9 88",
"1A 33 1A 1A F1 E2 0A DD 76 2A A0 00 11 B1 B5 E8 00 30 AA 00 00 D5 D0 A3",
};
-
-
std::string get_absb() {
static size_t index = 0; // 静态变量用于保存当前读取位置
index++;
@@ -51,89 +46,74 @@ std::string get_absb() {
}
return ddd[index];
}
-
class TextLineReader {
public:
explicit TextLineReader(std::string_view file_path) {
load(file_path);
}
-
// 每调用一次,返回一行
// 返回 true 表示成功取到一行
// 返回 false 表示已经没有更多行
- bool get(std::string &ret_line) {
+ bool get(std::string& ret_line) {
if (index_ >= lines_.size()) {
return false;
}
-
ret_line = lines_[index_];
++index_;
return true;
}
-
// 重新从第一行开始读
void reset() {
index_ = 0;
}
-
// 总行数
std::size_t size() const {
return lines_.size();
}
-
// 是否已经读完
bool empty() const {
return lines_.empty();
}
-
private:
void load(std::string_view file_path) {
std::ifstream file{std::string(file_path)};
+ // std::cout << "抛出异常" << std::endl;
+ // throw std::runtime_error("222");
if (!file.is_open()) {
auto err = "Failed to open file: " + std::string(file_path);
std::cout << err << std::endl;
std::exit(895);
throw std::runtime_error(err);
}
-
std::string line;
while (std::getline(file, line)) {
lines_.push_back(line);
}
-
index_ = 0;
}
-
private:
std::vector lines_;
std::size_t index_ = 0;
};
-
-
-std::size_t adsb_read(char *buf, std::size_t len) {
+std::size_t adsb_read(char* buf, std::size_t len) {
static TextLineReader reader(get_exe_dir() + "/ADS-B_195_0205.txt");
std::string line;
reader.get(line);
auto l = line.size();
std::memcpy(buf, line.c_str(), l);
-
/*static Frequency_Limit fl;
if (fl.test()) {
std::cout << "adsb_read" << VAR_STR_2(l, len) << std::endl;
}*/
return l;
}
-
-int adsb_set_iq_cbk(iq_cbk_t recv_cbk, void *pusr) {
+int adsb_set_iq_cbk(iq_cbk_t recv_cbk, void* pusr) {
auto dg = Dll_Global::instance();
dg->recv_cbk = recv_cbk;
dg->puser = pusr;
-
-
dg->init_when_dll();
return 0;
}
-
int adsb_set_less_30Mhz_ddc_param(uint64_t cf_hz, uint64_t sf_hz, uint64_t bw_hz, int8_t sw) {
auto dg = Dll_Global::instance();
dg->center_freq = cf_hz;
@@ -141,41 +121,33 @@ int adsb_set_less_30Mhz_ddc_param(uint64_t cf_hz, uint64_t sf_hz, uint64_t bw_hz
dg->band_width = bw_hz;
return 0;
}
-
int adsb_set_less_30Mhz_fft_param(uint64_t fftWin, uint64_t fftLen, int fftPeriod_ms, int8_t sw) {
auto dg = Dll_Global::instance();
dg->fft_point_number = fftLen;
dg->fft_period_ms = fftPeriod_ms;
- dg->fft_win_type = (UHD_FFTWin) fftWin;
+ dg->fft_win_type = (UHD_FFTWin)fftWin;
return 0;
}
-
-
int main() {
init_signal_config();
auto dg = Dll_Global::instance();
-
-
dg->init_when_exe();
bool debug = false;
-
auto mb = get_system_memory() / (1024 * 1024);
auto gb = mb / (1024);
std::cout << "当前系统的物理内存大小" << mb << " MB" << std::endl;
std::cout << "当前系统的物理内存大小" << gb << " GB" << std::endl;
-
- dg->dtm.test_and_start_thread("dsp共享内存数据推送", [dg](std::atomic &running) {
+ dg->dtm.test_and_start_thread("dsp共享内存数据推送", [dg](std::atomic& running) {
bool debug = true;
while (running) {
auto list = dg->iq_memory_buffer.get_all();
// 释放内存池
Pool_Guard pg(&dg->iq_memory_buffer.pool, list);
-
if (debug && list.size() > 1000) {
static Frequency_Limit fl(1.0 / 60.0);
std::ostringstream oss;
oss << get_current_millisecond_timestamp() << " 警告: dsp共享内存数据推送数据过多 当前数据队列长度:" << list.size() <<
- std::endl;
+ std::endl;
if (fl.test()) {
std::cout << oss.str() << std::endl;
}
@@ -189,7 +161,6 @@ int main() {
if (fl.test()) {
std::cout << dg->rb->state_str() << " dsp数据推送" << frame_number << "条" << std::endl;
}
-
for (int i = 0; i < frame_number; i++) {
auto buf = list[i];
dg->handle_2112(buf->data());