#ifndef GLOBAL_H #define GLOBAL_H #include #include #include #include #include #include #include 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 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