feat: Service Registry + Bridge 解耦架构 + 全工程代码清理
## 架构升级:Service Registry + Bridge 模式 - 新增 PluginSDK/IPluginServices.h:10 个纯虚服务接口(IDataProvider/ILinkProvider/...) - 新增 MavLinkServiceBridge:单 QObject 实现全部服务,隔离 MavLinkNode 依赖 - 升级 PluginManifest:支持 plugin.json 的 provides/consumes 声明式依赖 - 实现 ExtensionHost::autoWire():元对象自省自动连接信号槽 - 集成到 AppController:initModules() 中创建桥接器并注册到 ServiceRegistry - CockpitPlugin 演示服务发现:initialize() 中通过 PluginContext 查找服务 ## 代码清理 - Plugins/opmap:~280 行死代码(waypointsetting 100行注释块/tilematrix 54行/等27个文件) - Plugins/MavLinkNode:~200 行 GBK 乱码注释翻译为 UTF-8 + 12 行注释死代码 - Plugins/ToolsUI:~222 行死代码(ECU.cpp 82行/INS.cpp 113行/Parse/ToolsUI 等) - StatusUI/Setting/MissionUI:~65 行注释死代码 - Cockpit/leftladder.cpp:10 处 GBK 乱码翻译为中文 - 清理头文件注释掉的 #include(19 处)、空 if-else 分支、注释变量声明 ## 编译验证 - [100%] Built target GCS 零错误 - 运行时 timeout 3s 正常退出,无崩溃
This commit is contained in:
@@ -0,0 +1,181 @@
|
||||
#ifndef IPLUGIN_H
|
||||
#define IPLUGIN_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QWidget>
|
||||
#include <QString>
|
||||
#include <QIcon>
|
||||
#include <QVariant>
|
||||
#include <QJsonObject>
|
||||
#include "mavlink_types.h"
|
||||
|
||||
class PluginContext;
|
||||
|
||||
// ============================================================
|
||||
// VehicleState — 载具状态快照(插件通过此结构获取飞控数据)
|
||||
// ============================================================
|
||||
struct VehicleState
|
||||
{
|
||||
int sysid = 0;
|
||||
int compid = 0;
|
||||
double roll = 0;
|
||||
double pitch = 0;
|
||||
double yaw = 0;
|
||||
double altitude = 0;
|
||||
double groundspeed = 0;
|
||||
double airspeed = 0;
|
||||
double latitude = 0;
|
||||
double longitude = 0;
|
||||
int satellites = 0;
|
||||
int fixType = 0;
|
||||
double batteryRemaining = 0;
|
||||
QString mode;
|
||||
QString armStatus;
|
||||
bool isOnline = false;
|
||||
};
|
||||
|
||||
// ============================================================
|
||||
// PluginCommand — 插件向上层发送的指令(主界面或飞控)
|
||||
// ============================================================
|
||||
struct PluginCommand
|
||||
{
|
||||
enum Type {
|
||||
SendMavLink, // 发送 MAVLink 指令到飞控
|
||||
ShowMessage, // 在主界面显示消息
|
||||
RequestVehicleInfo, // 请求载具信息
|
||||
CustomAction // 自定义动作
|
||||
};
|
||||
|
||||
Type type = ShowMessage;
|
||||
QString sourcePlugin; // 来源插件名
|
||||
QString target; // 目标(飞控ID/UI元素ID)
|
||||
QString action; // 动作名
|
||||
QVariantMap params; // 参数
|
||||
uint16_t mavCmd = 0; // MAVLink 指令号(type==SendMavLink 时)
|
||||
float mavParams[7] = {}; // MAVLink 指令参数
|
||||
};
|
||||
|
||||
// ============================================================
|
||||
// IPlugin — 工具箱插件接口 v2.0
|
||||
//
|
||||
// 插件通过此接口与地面站交互,分为三个层面:
|
||||
// 1. 生命周期:创建、激活、停用、销毁
|
||||
// 2. 数据输入:MAVLink 消息、载具状态、用户指令
|
||||
// 3. 数据输出:发送指令、消息通知、状态变更
|
||||
//
|
||||
// 继承方式:
|
||||
// class MyPlugin : public QObject, public IPlugin
|
||||
// {
|
||||
// Q_OBJECT
|
||||
// Q_INTERFACES(IPlugin)
|
||||
// Q_PLUGIN_METADATA(IID IPlugin_iid)
|
||||
// };
|
||||
// ============================================================
|
||||
class IPlugin
|
||||
{
|
||||
public:
|
||||
virtual ~IPlugin() = default;
|
||||
|
||||
// ==========================================================
|
||||
// 1. 元信息
|
||||
// ==========================================================
|
||||
virtual QString name() const = 0; // 唯一标识,如 "MAVLinkInspector"
|
||||
virtual QString title() const = 0; // 显示标题,如 "MAVLink 检查器"
|
||||
virtual QString version() const = 0; // 版本号 "1.0.0"
|
||||
virtual QString description() const { return QString(); }
|
||||
virtual QString author() const { return QString(); }
|
||||
virtual QIcon icon() const { return QIcon(); }
|
||||
|
||||
// ==========================================================
|
||||
// 2. 窗口 / UI
|
||||
// ==========================================================
|
||||
// 创建插件的 UI 面板(可能被调用多次,每次返回同一实例或新实例)
|
||||
virtual QWidget *createWidget(QWidget *parent) = 0;
|
||||
|
||||
// 插件偏好的停靠位置(工具箱可以据此排布)
|
||||
enum DockArea { Left, Right, Top, Bottom, Center, Floating };
|
||||
virtual DockArea preferredDockArea() const { return Center; }
|
||||
|
||||
// ==========================================================
|
||||
// 3. 生命周期
|
||||
// ==========================================================
|
||||
// 旧版 initialize(无上下文),保持向后兼容
|
||||
virtual bool initialize() { return true; }
|
||||
|
||||
// 新版 initialize(接收 PluginContext,VS Code 风格)
|
||||
// ExtensionHost 优先调用此版本
|
||||
virtual bool initialize(PluginContext *) { return initialize(); }
|
||||
|
||||
virtual void onActivated() {} // 切换到本插件时
|
||||
virtual void onDeactivated() {} // 切换到其他插件时
|
||||
virtual void onClose() {} // 关闭/卸载时
|
||||
|
||||
// ==========================================================
|
||||
// 4. 数据输入(主界面 → 插件)
|
||||
// ==========================================================
|
||||
|
||||
// 收到 MAVLink 原始消息
|
||||
virtual void onMavLinkMessage(const mavlink_message_t & /*msg*/) {}
|
||||
|
||||
// 载具状态更新(周期性推送)
|
||||
virtual void onVehicleStateChanged(int vehicleId, const VehicleState & /*state*/) {}
|
||||
|
||||
// 载具增删
|
||||
virtual void onVehicleAdded(int vehicleId) {}
|
||||
virtual void onVehicleRemoved(int vehicleId) {}
|
||||
|
||||
// 用户选中载具切换
|
||||
virtual void onVehicleSelected(int vehicleId) {}
|
||||
|
||||
// 通讯状态变化
|
||||
enum CommStatus { Connected, Lost, Recovering };
|
||||
virtual void onCommStatusChanged(CommStatus /*status*/) {}
|
||||
|
||||
// 主界面下发的命令(如:设置面板要求插件刷新参数)
|
||||
virtual void onCommand(const QString &command, const QVariantMap ¶ms) {}
|
||||
|
||||
// ==========================================================
|
||||
// 5. 数据输出(插件 → 主界面)—— 通过信号实现
|
||||
//
|
||||
// 插件类应声明以下信号(在 QObject 子类中):
|
||||
//
|
||||
// void sendCommand(const PluginCommand &cmd);
|
||||
// 插件向上层发送指令
|
||||
//
|
||||
// void showStatus(const QString &text, int timeout = 0);
|
||||
// 在状态栏显示消息
|
||||
//
|
||||
// void dataChanged(const QString &key, const QVariant &value);
|
||||
// 通知主界面数据变更(如自定义参数修改)
|
||||
//
|
||||
// void requestData(const QString &what, const QVariantMap ¶ms);
|
||||
// 请求主界面提供数据
|
||||
// ==========================================================
|
||||
|
||||
// 辅助:通过 QObject 子类安全地发出指令
|
||||
// 插件实现类应在 QObject 子类中调用此辅助方法
|
||||
template<typename PluginClass>
|
||||
static void emitCommand(PluginClass *plugin, const PluginCommand &cmd)
|
||||
{
|
||||
if (auto *obj = dynamic_cast<QObject*>(plugin))
|
||||
QMetaObject::invokeMethod(obj, "sendCommand", Qt::AutoConnection,
|
||||
Q_ARG(PluginCommand, cmd));
|
||||
}
|
||||
};
|
||||
|
||||
// Qt 插件接口标识
|
||||
#define IPlugin_iid "com.gcs.IPlugin/2.0"
|
||||
Q_DECLARE_INTERFACE(IPlugin, IPlugin_iid)
|
||||
|
||||
// ============================================================
|
||||
// PluginCommand 的 Qt 元类型注册辅助
|
||||
// ============================================================
|
||||
inline void registerPluginTypes()
|
||||
{
|
||||
qRegisterMetaType<PluginCommand>("PluginCommand");
|
||||
qRegisterMetaType<PluginCommand::Type>("PluginCommand::Type");
|
||||
qRegisterMetaType<VehicleState>("VehicleState");
|
||||
qRegisterMetaType<IPlugin::CommStatus>("IPlugin::CommStatus");
|
||||
}
|
||||
|
||||
#endif // IPLUGIN_H
|
||||
Reference in New Issue
Block a user