CppGenerate/src/main.cpp

266 lines
9.4 KiB
C++
Raw Normal View History

2026-04-17 09:17:56 +00:00
#include "app.hpp"
#include <iostream>
#include <string>
#include <thread>
#include <chrono>
#include <cstdlib>
#include <csignal>
#include <iomanip>
// 全局变量用于信号处理
static bool g_interrupted = false;
/**
* @brief
*/
void signalHandler(int signal) {
if (signal == SIGINT || signal == SIGTERM) {
std::cout << "\n接收到终止信号,正在停止系统..." << std::endl;
g_interrupted = true;
}
}
/**
* @brief
*/
void showHelp() {
std::cout << "高度测量系统 (Height Measurement System) - 命令行界面\n\n";
std::cout << "使用方法:\n";
std::cout << " hsm_main [选项]\n\n";
std::cout << "选项:\n";
std::cout << " --help 显示此帮助信息\n";
std::cout << " --simulate 运行模拟模式(持续测量)\n";
std::cout << " --threshold <上限> <下限> 设置预警阈值(单位:米)\n";
std::cout << " --calibrate <气压> 校准海平面气压值单位hPa\n";
std::cout << " --export <文件名> 导出历史数据到指定文件\n";
std::cout << " --status 显示系统状态\n";
std::cout << " --reset-zero 执行零点归位\n";
std::cout << " --sim-height <变化量> 模拟高度变化(单位:米)\n";
std::cout << " --sensor-fault 模拟传感器故障\n";
std::cout << " --sensor-normal 恢复传感器正常状态\n";
std::cout << " --acknowledge 确认所有预警\n";
std::cout << "\n示例:\n";
std::cout << " hsm_main --simulate # 运行模拟模式\n";
std::cout << " hsm_main --threshold 100 -50 # 设置预警阈值\n";
std::cout << " hsm_main --calibrate 1013.25 # 校准海平面气压\n";
std::cout << " hsm_main --export data.csv # 导出数据到CSV\n";
std::cout << " hsm_main --status # 显示系统状态\n";
}
/**
* @brief
*/
bool parseArguments(int argc, char* argv[], HeightMeasurementApp& app) {
for (int i = 1; i < argc; ++i) {
std::string arg = argv[i];
if (arg == "--help") {
showHelp();
return false; // 不继续执行主程序
} else if (arg == "--simulate") {
// 模拟模式在main函数中处理
continue;
} else if (arg == "--threshold" && i + 2 < argc) {
try {
float upper = std::stof(argv[++i]);
float lower = std::stof(argv[++i]);
app.setAlertThresholds(upper, lower);
} catch (...) {
std::cerr << "错误:无效的阈值参数" << std::endl;
return false;
}
} else if (arg == "--calibrate" && i + 1 < argc) {
try {
float pressure = std::stof(argv[++i]);
app.calibrateSeaLevelPressure(pressure);
} catch (...) {
std::cerr << "错误:无效的气压值参数" << std::endl;
return false;
}
} else if (arg == "--export" && i + 1 < argc) {
std::string filename = argv[++i];
if (app.exportHistoryData(filename)) {
std::cout << "数据导出成功: " << filename << std::endl;
} else {
std::cerr << "数据导出失败" << std::endl;
}
} else if (arg == "--status") {
std::cout << app.getStatus() << std::endl;
return false; // 显示状态后退出
} else if (arg == "--reset-zero") {
if (app.performZeroReset()) {
std::cout << "零点归位成功" << std::endl;
} else {
std::cerr << "零点归位失败" << std::endl;
}
} else if (arg == "--sim-height" && i + 1 < argc) {
try {
float delta = std::stof(argv[++i]);
// 注意:这里需要访问传感器模拟器,但为了接口简洁,暂时不实现
std::cout << "模拟高度变化功能需要在app中实现" << std::endl;
} catch (...) {
std::cerr << "错误:无效的高度变化参数" << std::endl;
return false;
}
} else if (arg == "--sensor-fault") {
app.getAlertManager().triggerSensorFailure(
static_cast<uint32_t>(std::time(nullptr)));
std::cout << "已触发传感器故障预警" << std::endl;
} else if (arg == "--sensor-normal") {
// 这里需要访问传感器模拟器,暂时不实现
std::cout << "恢复传感器正常功能需要在app中实现" << std::endl;
} else if (arg == "--acknowledge") {
app.getAlertManager().acknowledgeAllAlerts(
static_cast<uint32_t>(std::time(nullptr)));
std::cout << "已确认所有预警" << std::endl;
} else {
std::cerr << "未知参数: " << arg << std::endl;
std::cerr << "使用 --help 查看帮助信息" << std::endl;
return false;
}
}
return true;
}
/**
* @brief
*/
void runSimulationMode(HeightMeasurementApp& app) {
std::cout << "=== 高度测量系统模拟模式 ===\n";
std::cout << "系统正在运行,按 Ctrl+C 停止\n\n";
// 显示初始状态
std::cout << app.getStatus() << std::endl;
// 主循环
int cycle_count = 0;
const int STATUS_UPDATE_INTERVAL = 20; // 每20次测量更新一次状态显示
while (!g_interrupted) {
// 执行一次测量循环
if (!app.measureCycle()) {
std::cerr << "测量循环失败" << std::endl;
break;
}
// 定期更新状态显示
if (++cycle_count % STATUS_UPDATE_INTERVAL == 0) {
std::cout << "\n=== 系统状态更新 ===\n";
float altitude = app.getCurrentAltitude();
float relative = app.getRelativeHeight();
std::cout << std::fixed << std::setprecision(2);
std::cout << "测量次数: " << cycle_count << "\n";
std::cout << "当前高度: " << altitude << "\n";
std::cout << "相对高度: " << relative << "\n";
// 检查预警状态
if (app.getAlertManager().hasActiveAlerts()) {
std::cout << "预警状态: " << app.getAlertManager().getStatusDescription() << "\n";
}
// 数据记录状态
auto& logger = app.getDataLogger();
std::cout << "数据记录: " << logger.getRecordCount() << "\n";
std::cout << "========================\n";
}
// 等待1秒模拟1秒采样间隔
std::this_thread::sleep_for(std::chrono::seconds(1));
// 每100次测量模拟一次传感器故障测试用
if (cycle_count % 100 == 0 && cycle_count > 0) {
std::cout << "\n[测试] 模拟传感器故障..." << std::endl;
app.getAlertManager().triggerSensorFailure(
static_cast<uint32_t>(std::time(nullptr)));
}
// 每150次测量恢复传感器正常测试用
if (cycle_count % 150 == 0 && cycle_count > 0) {
std::cout << "\n[测试] 恢复传感器正常..." << std::endl;
// 这里需要实际恢复传感器状态,暂时只输出信息
}
}
// 显示最终状态
std::cout << "\n=== 模拟结束 ===\n";
std::cout << "总测量次数: " << cycle_count << "\n";
std::cout << "最终系统状态:\n";
std::cout << app.getStatus() << std::endl;
}
/**
* @brief
*/
int main(int argc, char* argv[]) {
// 设置信号处理
std::signal(SIGINT, signalHandler);
std::signal(SIGTERM, signalHandler);
std::cout << "高度测量系统 v1.0.0 启动..." << std::endl;
// 创建应用实例
HeightMeasurementApp app;
// 初始化系统
if (!app.initialize()) {
std::cerr << "系统初始化失败!" << std::endl;
return EXIT_FAILURE;
}
// 解析命令行参数
if (!parseArguments(argc, argv, app)) {
// 如果只是显示帮助或状态,正常退出
return EXIT_SUCCESS;
}
// 检查是否要运行模拟模式
bool run_simulation = false;
for (int i = 1; i < argc; ++i) {
if (std::string(argv[i]) == "--simulate") {
run_simulation = true;
break;
}
}
if (run_simulation) {
// 启动系统
app.start();
// 运行模拟模式
runSimulationMode(app);
// 停止系统
app.stop();
} else if (argc == 1) {
// 没有参数时,显示帮助信息
showHelp();
}
// 导出最终数据(如果运行了模拟模式)
if (run_simulation) {
std::string filename = "hsm_data_" +
std::to_string(std::time(nullptr)) + ".csv";
if (app.exportHistoryData(filename)) {
std::cout << "数据已自动导出到: " << filename << std::endl;
}
}
std::cout << "程序正常结束。" << std::endl;
return EXIT_SUCCESS;
}