Files
gcs-nf/Plugins/IPlugin.h
T
hm e7cf44504c 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 正常退出,无崩溃
2026-06-01 09:46:36 +08:00

182 lines
6.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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(接收 PluginContextVS 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 &params) {}
// ==========================================================
// 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 &params);
// 请求主界面提供数据
// ==========================================================
// 辅助:通过 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