63 lines
1.8 KiB
C++
63 lines
1.8 KiB
C++
/**
|
|
* @file display_manager.h
|
|
* @brief OLED 显示管理器 - SSD1306 128x64 I2C
|
|
*
|
|
* 4 个显示页面:
|
|
* Page 0 - 环境数据 (温湿度 + WiFi)
|
|
* Page 1 - 生命体征 (心率 + 呼吸 + 体动)
|
|
* Page 2 - 人体状态 (有人/运动/跌倒/驻留)
|
|
* Page 3 - 安全信息 (水浸 + 蜂鸣器 + 运行时间)
|
|
*/
|
|
|
|
#ifndef DISPLAY_MANAGER_H
|
|
#define DISPLAY_MANAGER_H
|
|
|
|
#include <Arduino.h>
|
|
#include <U8g2lib.h>
|
|
#include "config.h"
|
|
|
|
class DisplayManager {
|
|
public:
|
|
DisplayManager();
|
|
~DisplayManager();
|
|
|
|
/** 初始化 OLED */
|
|
bool begin();
|
|
|
|
/**
|
|
* @brief 更新显示内容 (每 5 秒调用一次即可)
|
|
* @param data 遥测数据
|
|
* @param wifiOk WiFi 是否已连接
|
|
* @param buzzerOn 蜂鸣器是否在响
|
|
* @param hasAlarm 是否有活跃报警
|
|
* @param alarmName 报警名称 (如 "跌倒"/"心率异常")
|
|
*/
|
|
void update(const TelemetryData& data, bool wifiOk, bool buzzerOn,
|
|
bool hasAlarm = false, const char* alarmName = "");
|
|
|
|
/** 切换到下一页 (0→1→2→3→0 循环) */
|
|
void nextPage();
|
|
|
|
/** 获取当前页码 */
|
|
uint8_t getPage() const { return _pageIndex; }
|
|
|
|
private:
|
|
void _drawPage0(const TelemetryData& data, bool wifiOk, bool buzzerOn, bool hasAlarm);
|
|
void _drawPage1(const TelemetryData& data, bool hasAlarm);
|
|
void _drawPage2(const TelemetryData& data, bool hasAlarm);
|
|
void _drawPage3(const TelemetryData& data, bool buzzerOn, bool wifiOk, bool hasAlarm);
|
|
void _drawAlarmBanner(const char* name);
|
|
|
|
/** 格式化秒数为 HH:MM:SS */
|
|
String _fmtUptime(uint32_t secs) const;
|
|
/** 格式化浮点数为一位小数 */
|
|
String _fmtFloat(float val) const;
|
|
|
|
U8G2_SSD1306_128X64_NONAME_F_HW_I2C _u8g2;
|
|
uint8_t _pageIndex;
|
|
uint32_t _lastDrawTime;
|
|
bool _initialized;
|
|
};
|
|
|
|
#endif // DISPLAY_MANAGER_H
|