Files
QT_wuhan_YT/app/global.h
T
2026-10-14 18:22:41 +08:00

205 lines
8.8 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 GLOBAL_H
#define GLOBAL_H
#include <QString>
#include <QStringList>
#include <QVector>
#include <QWidget>
#include <QTimer>
#include <QVariant>
#include <QColor>
class QApplication;
// ===================== 画布与全局常量 =====================
// 屏幕分辨率(1920×1200);窗口按此固定尺寸,页面布局靠 layout 自适应,
// 富余的垂直空间由各页的 addStretch 分配(控件像素尺寸与字号不随屏幕缩放)
static const int SCREEN_W = 1920;
static const int SCREEN_H = 1200;
// ===================== 工业风格配色体系(QSS 十六进制) =====================
namespace C {
const QString BG = "#161C23"; // 主背景:窗口画布底色
const QString PANEL = "#242E3A"; // 面板背景:卡片/弹窗/顶条/底条
const QString PANEL_HI = "#2D3947"; // 面板亮色:按钮常态、表头、进度条底
const QString BORDER = "#3D4A59"; // 分割线:边框、表格线
const QString TEXT = "#E6EDF3"; // 主文字:标题、正文、数值
const QString TEXT_SUB = "#9AA7B4"; // 次文字:说明、单位、标签
const QString PRIMARY = "#3D8BFD"; // 强调主色:主按钮、选中、焦点、进度条
const QString SUCCESS = "#36C75A"; // 成功/运行:运行、开启、到位
const QString WARNING = "#F5A623"; // 警告:提醒、待确认
const QString DANGER = "#E5484D"; // 危险/故障:急停、故障、警示
const QString DISABLED = "#56636F"; // 禁用:不可操作控件底色
const QString DISABLED_T = "#6B7A88"; // 禁用文字
}
// ===================== 操作模式 =====================
// 面板机械旋钮切换:行车模式 / 机械臂模式
enum class Mode { Drive = 0, Arm = 1 };
// ===================== 页面枚举(QStackedWidget 索引) =====================
enum PageId {
PageBoot = 0, // ③ 开机密码
PageWarning, // 密码警告
PageMgmtLogin, // 密码管理登录
PageMgmt, // 密码管理
PageReset, // 密码重置
PageSelfCheck, // ④ 自检
PageHome, // ⑤ 系统首页面(自检完成后进入)
PageJob, // ⑥ 作业选择
PageChassis, // ⑦ 机器人底盘
PageArm, // ⑧ 机械臂
PageGas, // ⑨ 气体检测仪
PageClean, // ⑩ 消除作业
PageDisinfect, // ⑪ 消毒作业
PageDebug, // ⑫ 调试维护
PageFault, // ⑬ 故障查询
PageCount
};
// ===================== 遥测数据(车载端 → UI) =====================
// 由通信层解析车端反馈报文后填充,页面刷新时读取
struct Telemetry {
// 底盘
int soc = 85; // 电量 %
double volt = 360.0; // 电压 V
double speed = 3.45; // 车速 km/h
bool handbrake = true; // 手刹
int driveMode = 0; // 行车/机械臂模式:0=行车 1=机械臂(遥控器拨钮→串口→底盘报文 mode)
int rdyStatus = 0; // 底盘 ready:0=初始 1=高压上电完成 2=准备就绪
int gearPos = 0; // 挡位:0=N 1=D 2=R
int parking = 0; // 驻车:0=未驻车 1=左电机 2=右电机 3=完全驻车
int awdMode = 0; // 四驱模式:0=二驱 1=四驱 2=四驱锁定
double steerAngle = 0.0; // 方向盘角度
QStringList chassisFaults; // 底盘故障(多条 2s 轮换)
// 机械臂
QVector<double> js{30, 20, 0, 90, 45, 0}; // 关节角 J1~J6(°)
QString pos = "--"; // 末端位置 XYZ
QString pose = "--"; // 姿态 RX/RY/RZ
double vel = 0.0; // 末端速度
QString returnState = "idle";// 回位状态 idle/returning/done/fault
bool armHomed = false; // 是否已回位(用于底盘“机械臂未回位”告警)
// 洗消
QString washMode = "--"; // 手动消除 / 手动消毒
bool washStart = false; // 洗消启停反馈
double flowA = 0.0; // A 药剂流量 L/min
double flowB = 0.0; // B 药剂流量 L/min
double gasFlow = 0.0; // 气体流量 L/min
double press = 0.0; // 管路压力 MPa
double airPress = 0.0; // 空压机压力 MPa
double foam = 0.0; // 发泡倍数
double flowPlungerFb = 0.0; // 柱塞泵流量反馈 L/min
double flowAirFb = 0.0; // 空压机流量反馈 L/min
double flowVaneFb = 0.0; // 叶片泵流量反馈 L/min
QStringList washFaults; // 洗消故障代码
// 液位
double levelA = 100.0; // 清水/药剂液位 L
double levelFoam = 30.0; // 泡沫液位 L
// 气体检测仪
QString gasHost = "standby"; // 主机状态 standby/detecting/fault
QString gasType = "--"; // 有毒物种类
QString gasLevel = "--"; // 有毒物等级
double gasConc = 0.0; // 有毒物浓度 ppb
// 球阀 D1/D2
bool d1open = false; // D1 开启到位
bool d1close = true; // D1 关闭到位
bool d2open = false; // D2 开启到位
bool d2close = true; // D2 关闭到位
QString valveFault; // 球阀故障码
// 泵
bool plunger = false; // 柱塞泵上电
bool air = false; // 空压机上电
bool leaf = false; // 叶片泵上电
QStringList pumpFaults; // 泵故障代码
// 遥控器(24 字节二进制帧,见 comm/uart.h)
bool rcLinkOk = false; // 遥控器链路是否在线
int rcBattery = 0; // 遥控器电量 %
bool rcDriveMode = false; // bit0 行车模式
bool rcArmMode = false; // bit1 机械臂模式
bool rcArmEnabled = false; // bit2 机械臂使能
bool rcChassisEnabled = false;// bit3 底盘使能
bool rcEstop = false; // bit4 急停
int rcGear = 2048; // 整车档位(底盘 Y)0~4096,中位 2048
int rcSteer = 2048; // 整车转向(底盘 X)
int rcPosZ = 2048; // 末端位置上下
int rcPosX = 2048; // 末端位置左右
int rcPosY = 2048; // 末端位置前后
int rcRoll = 2048; // 末端姿态横滚
int rcPitch = 2048; // 末端姿态俯仰
int rcYaw = 2048; // 末端姿态偏航
// 全局
bool commOk = true; // 通信状态
bool estop = false; // 急停触发
};
// ===================== 工具函数 =====================
// 启动 500ms 闪烁:每 500ms 切换一次 QSS 动态属性(40% ↔ 100% 透明度由 QSS 规则体现)
QTimer* startBlink(QWidget* w, const char* prop = "blink");
// 关闭闪烁定时器并复位属性
void stopBlink(QWidget* w, const char* prop = "blink");
// 退出/取消按钮预设样式:被选中(悬停/按下/焦点)时红底白字
QString cancelButtonStyle(int fontPx = 60);
// ===================== 本机按键 =====================
// 面板只提供 5 个键:Tab、Shift+Tab、空格、方向上、方向下。
// 新增按键或调整键位只改这一处。
namespace Keys {
inline bool tab(int k) { return k == Qt::Key_Tab; }
inline bool backtab(int k) { return k == Qt::Key_Backtab; } // Shift+Tab
inline bool shifted(int mods) { return (mods & Qt::ShiftModifier) != 0; }
inline bool space(int k) { return k == Qt::Key_Space; }
inline bool up(int k) { return k == Qt::Key_Up; }
inline bool down(int k) { return k == Qt::Key_Down; }
}
// ===================== 按钮焦点(选中)光圈 =====================
// 全局事件过滤器:任意 QPushButton 获得焦点时,在其四周加一圈发光;
// 同时把"触摸/点击"与"Tab"归一到同一个焦点,并清除触摸残留在按钮上的悬停态,
// 保证任意时刻只有一个按钮呈选中样式(新的操作覆盖原来的)。
class ButtonFocusGlow : public QObject
{
Q_OBJECT
public:
explicit ButtonFocusGlow(const QColor& glow = QColor("#3D8BFD"), QObject* parent = nullptr);
protected:
bool eventFilter(QObject* obj, QEvent* ev) override;
private:
QColor m_glow;
};
// 为整个应用安装按钮焦点光圈
void installButtonFocusGlow(QApplication* app);
// ===================== 方向键(旋钮)隔离 =====================
// 上/下方向键在本机是"旋钮"键位,只由 ParamControl 用来调值。
// 这个全局过滤器把"焦点在按钮上时"的方向键吞掉,方向键只做调值、换焦只走 Tab。
class ArrowKeyGuard : public QObject
{
Q_OBJECT
public:
explicit ArrowKeyGuard(QObject* parent = nullptr);
protected:
bool eventFilter(QObject* obj, QEvent* ev) override;
};
// 为整个应用安装方向键隔离
void installArrowKeyGuard(QApplication* app);
// 全局 QSS 样式表
QString appStyleSheet();
#endif // GLOBAL_H