300 lines
8.5 KiB
C++
300 lines
8.5 KiB
C++
#ifndef FZKJ_APP_HPP
|
||
#define FZKJ_APP_HPP
|
||
|
||
#include <cstdint>
|
||
#include <string>
|
||
#include <vector>
|
||
#include <chrono>
|
||
#include <memory>
|
||
#include <functional>
|
||
|
||
// ============================================================
|
||
// 常量定义
|
||
// ============================================================
|
||
namespace fzkj {
|
||
|
||
/// 事件负载固定长度(256字节)
|
||
constexpr std::size_t kEventPayloadSize = 256;
|
||
|
||
/// 最大传输单元(MTU)
|
||
constexpr std::size_t kMtuSize = 1500;
|
||
|
||
/// 数据缓存容量(1GB)
|
||
constexpr std::size_t kCacheCapacity = 1024ULL * 1024 * 1024;
|
||
|
||
/// 持久化周期(5分钟,单位:秒)
|
||
constexpr int kPersistIntervalSec = 300;
|
||
|
||
/// 事件处理延迟阈值(500ms)
|
||
constexpr std::chrono::milliseconds kEventLatencyThreshold(500);
|
||
|
||
/// 方案分发成功率目标 99.9%
|
||
constexpr double kDispatchSuccessRate = 0.999;
|
||
|
||
} // namespace fzkj
|
||
|
||
// ============================================================
|
||
// 战场事件数据包(EvtData / struct_EventPayload)
|
||
// 定长结构体 256 字节,字节对齐
|
||
// ============================================================
|
||
namespace fzkj {
|
||
|
||
#pragma pack(push, 1)
|
||
struct EventPayload {
|
||
uint8_t event_type; // 事件类型(枚举 0~255)
|
||
uint64_t timestamp_ms; // 时间戳(毫秒)
|
||
uint32_t source_id; // 来源标识
|
||
uint8_t payload_data[kEventPayloadSize - 13]; // 载荷数据
|
||
uint8_t checksum; // 校验码
|
||
};
|
||
#pragma pack(pop)
|
||
|
||
/// 事件合法性校验结果
|
||
enum class EventValidationResult {
|
||
kValid,
|
||
kInvalidType,
|
||
kInvalidChecksum,
|
||
kRedundantDuplicate
|
||
};
|
||
|
||
/// 事件处理结果
|
||
enum class EventProcessResult {
|
||
kSuccess,
|
||
kValidationFailed,
|
||
kTemplateNotFound,
|
||
kTaskGenerated
|
||
};
|
||
|
||
} // namespace fzkj
|
||
|
||
// ============================================================
|
||
// 工作模式枚举
|
||
// ============================================================
|
||
namespace fzkj {
|
||
|
||
enum class WorkMode {
|
||
kNormal, // 正常模式
|
||
kDegraded, // 降级模式
|
||
kConfigMaintain // 配置维护模式
|
||
};
|
||
|
||
/// 模式名称转字符串
|
||
inline const char* WorkModeName(WorkMode m) noexcept {
|
||
switch (m) {
|
||
case WorkMode::kNormal: return "正常模式";
|
||
case WorkMode::kDegraded: return "降级模式";
|
||
case WorkMode::kConfigMaintain: return "配置维护模式";
|
||
default: return "未知";
|
||
}
|
||
}
|
||
|
||
} // namespace fzkj
|
||
|
||
// ============================================================
|
||
// 作战任务基类
|
||
// ============================================================
|
||
namespace fzkj {
|
||
|
||
struct Task {
|
||
uint64_t task_id = 0;
|
||
uint32_t source_event_id = 0;
|
||
std::string description;
|
||
std::string priority; // "高"/"中"/"低"
|
||
std::string criticality; // "关键"/"重要"/"一般"
|
||
std::chrono::system_clock::time_point created_at;
|
||
|
||
std::string ToString() const;
|
||
};
|
||
|
||
} // namespace fzkj
|
||
|
||
// ============================================================
|
||
// 战斗方案(作战方案)
|
||
// ============================================================
|
||
namespace fzkj {
|
||
|
||
struct BattleSolution {
|
||
uint64_t solution_id = 0;
|
||
uint64_t task_id = 0;
|
||
std::string name;
|
||
std::string description;
|
||
double score = 0.0; // 方案评分
|
||
bool is_distributed = false; // 是否分布式方案
|
||
|
||
std::string ToString() const;
|
||
};
|
||
|
||
/// 方案对比结果
|
||
struct SolutionComparison {
|
||
uint64_t solution_a_id;
|
||
uint64_t solution_b_id;
|
||
double score_diff;
|
||
std::string summary;
|
||
};
|
||
|
||
} // namespace fzkj
|
||
|
||
// ============================================================
|
||
// 执行状态
|
||
// ============================================================
|
||
namespace fzkj {
|
||
|
||
enum class ExecutionStatus {
|
||
kPending,
|
||
kInProgress,
|
||
kSuccess,
|
||
kFailed,
|
||
kTimeout
|
||
};
|
||
|
||
inline const char* ExecutionStatusName(ExecutionStatus s) noexcept {
|
||
switch (s) {
|
||
case ExecutionStatus::kPending: return "待执行";
|
||
case ExecutionStatus::kInProgress: return "执行中";
|
||
case ExecutionStatus::kSuccess: return "执行成功";
|
||
case ExecutionStatus::kFailed: return "执行失败";
|
||
case ExecutionStatus::kTimeout: return "超时";
|
||
default: return "未知";
|
||
}
|
||
}
|
||
|
||
struct ExecutionUnit {
|
||
uint64_t unit_id;
|
||
std::string name;
|
||
ExecutionStatus status = ExecutionStatus::kPending;
|
||
|
||
std::string ToString() const;
|
||
};
|
||
|
||
} // namespace fzkj
|
||
|
||
// ============================================================
|
||
// 地图与态势数据
|
||
// ============================================================
|
||
namespace fzkj {
|
||
|
||
struct GeoPoint {
|
||
double latitude; // 纬度
|
||
double longitude; // 经度
|
||
double altitude; // 海拔(米)
|
||
};
|
||
|
||
struct SituationLayer {
|
||
std::string layer_name;
|
||
bool visible = true;
|
||
};
|
||
|
||
struct MapViewState {
|
||
GeoPoint center_point;
|
||
double zoom_level = 1.0;
|
||
bool grid_visible = false;
|
||
};
|
||
|
||
/// 量算结果
|
||
struct MeasureResult {
|
||
double distance_m = 0.0; // 距离(米)
|
||
double area_sqm = 0.0; // 面积(平方米)
|
||
double azimuth_deg = 0.0; // 方位角(度)
|
||
};
|
||
|
||
} // namespace fzkj
|
||
|
||
// ============================================================
|
||
// 系统配置
|
||
// ============================================================
|
||
namespace fzkj {
|
||
|
||
struct SystemConfig {
|
||
// 算法参数
|
||
std::string algorithm_name;
|
||
double algorithm_param = 1.0;
|
||
|
||
// 运行模式
|
||
WorkMode mode = WorkMode::kNormal;
|
||
|
||
// 网络配置
|
||
std::string ip_address = "192.168.1.100";
|
||
uint16_t port = 8080;
|
||
bool use_encryption = true;
|
||
|
||
// 想定参数
|
||
std::string scenario_name = "默认想定";
|
||
|
||
std::string ToString() const;
|
||
};
|
||
|
||
} // namespace fzkj
|
||
|
||
// ============================================================
|
||
// FZKJ Application 核心类
|
||
// ============================================================
|
||
namespace fzkj {
|
||
|
||
class App {
|
||
public:
|
||
App();
|
||
~App() = default;
|
||
|
||
// 禁止拷贝
|
||
App(const App&) = delete;
|
||
App& operator=(const App&) = delete;
|
||
|
||
// ======== 事件处理(SRS-FZKJ_F-001) ========
|
||
EventProcessResult ReceiveEvent(const EventPayload& evt);
|
||
EventProcessResult GenerateTaskFromTemplate(uint32_t event_type);
|
||
|
||
// ======== 方案管理(SRS-FZKJ_F-002) ========
|
||
bool AddSolution(const BattleSolution& solution);
|
||
std::vector<BattleSolution> GetSolutions() const;
|
||
void SortByPreference(const std::string& criteria);
|
||
SolutionComparison CompareSolutions(uint64_t id_a, uint64_t id_b) const;
|
||
|
||
// ======== 方案驱动与状态监控(SRS-FZKJ_F-003) ========
|
||
bool DispatchPlan(uint64_t solution_id);
|
||
ExecutionStatus MonitorExecutionStatus(uint64_t unit_id) const;
|
||
bool TriggerAlertOnFailure(uint64_t unit_id);
|
||
|
||
// ======== 共用态势与地图展示(SRS-FZKJ_F-004) ========
|
||
bool LoadGisMap(const std::string& map_path);
|
||
bool OverlaySituationLayer(const SituationLayer& layer);
|
||
MeasureResult MeasureDistance(const GeoPoint& p1, const GeoPoint& p2) const;
|
||
void ToggleGridDisplay();
|
||
|
||
// ======== 数据中转与存储管理(SRS-FZKJ_F-005) ========
|
||
bool ForwardDataToModule(const std::string& module_name, const uint8_t* data, std::size_t len);
|
||
bool PersistCacheToDb();
|
||
bool ClearScenarioCache();
|
||
|
||
// ======== 系统设置与想定切换(SRS-FZKJ_F-006) ========
|
||
void SetAlgorithmConfig(const std::string& name, double param);
|
||
bool SwitchExecutionMode(WorkMode new_mode);
|
||
bool LoadScenarioParams(const std::string& scenario_name);
|
||
bool ApplyNetworkConfiguration(const std::string& ip, uint16_t port);
|
||
|
||
// ======== 通用查询 ========
|
||
WorkMode GetCurrentMode() const noexcept { return current_mode_; }
|
||
const SystemConfig& GetConfig() const noexcept { return config_; }
|
||
|
||
// ======== 自检 ========
|
||
bool SelfTest();
|
||
|
||
private:
|
||
WorkMode current_mode_ = WorkMode::kNormal;
|
||
SystemConfig config_;
|
||
std::vector<EventPayload> event_history_;
|
||
std::vector<Task> tasks_;
|
||
std::vector<BattleSolution> solutions_;
|
||
std::vector<ExecutionUnit> exec_units_;
|
||
MapViewState map_state_;
|
||
std::vector<SituationLayer> situation_layers_;
|
||
std::size_t cache_size_ = 0;
|
||
|
||
uint64_t NextTaskId();
|
||
uint64_t NextSolutionId();
|
||
uint64_t NextUnitId();
|
||
};
|
||
|
||
} // namespace fzkj
|
||
|
||
#endif // FZKJ_APP_HPP
|