|
3 | 3 | #include <mutex> |
4 | 4 | #include <infinite_sense.h> |
5 | 5 | #include <map> |
| 6 | + |
6 | 7 | namespace infinite_sense { |
| 8 | + |
| 9 | +/** |
| 10 | + * @brief 宏定义:设置所有设备的最新触发状态。 |
| 11 | + * |
| 12 | + * @param timestamp 触发时间戳。 |
| 13 | + * @param status 触发状态位掩码(每一位对应一个设备)。 |
| 14 | + */ |
7 | 15 | #define SET_LAST_TRIGGER_STATUS(timestamp, status) TriggerManger::GetInstance().SetLastTriggerStatus(timestamp, status) |
| 16 | + |
| 17 | +/** |
| 18 | + * @brief 宏定义:获取指定设备的最新触发状态时间。 |
| 19 | + * |
| 20 | + * @param device 要查询的设备。 |
| 21 | + * @param timestamp 返回设备的最后触发时间戳。 |
| 22 | + */ |
8 | 23 | #define GET_LAST_TRIGGER_STATUS(device, timestamp) TriggerManger::GetInstance().GetLastTriggerStatus(device, timestamp) |
| 24 | + |
| 25 | +/** |
| 26 | + * @class TriggerManger |
| 27 | + * @brief 管理各传感器或设备的触发状态,并通过消息机制发布状态信息。 |
| 28 | + * |
| 29 | + * 使用单例模式管理系统中所有的触发设备。支持位掩码形式更新所有设备的状态, |
| 30 | + * 并可查询特定设备的最后一次有效触发时间。 |
| 31 | + */ |
9 | 32 | class TriggerManger { |
10 | 33 | public: |
| 34 | + /** |
| 35 | + * @brief 获取 TriggerManger 单例对象。 |
| 36 | + * @return TriggerManger& 单例引用。 |
| 37 | + */ |
11 | 38 | static TriggerManger &GetInstance() { |
12 | 39 | static TriggerManger instance; |
13 | 40 | return instance; |
14 | 41 | } |
| 42 | + |
| 43 | + // 删除拷贝构造函数和赋值运算符,确保单例语义。 |
15 | 44 | TriggerManger(const TriggerManger &) = delete; |
16 | 45 | TriggerManger &operator=(const TriggerManger &) = delete; |
17 | | - void SetLastTriggerStatus(const uint64_t &, const uint8_t &); |
18 | | - bool GetLastTriggerStatus(TriggerDevice, uint64_t &); |
| 46 | + |
| 47 | + /** |
| 48 | + * @brief 设置所有设备的最新触发状态。 |
| 49 | + * |
| 50 | + * @param time 当前触发的时间戳。 |
| 51 | + * @param status 状态掩码,每一位表示一个设备是否触发。 |
| 52 | + */ |
| 53 | + void SetLastTriggerStatus(const uint64_t &time, const uint8_t &status); |
| 54 | + |
| 55 | + /** |
| 56 | + * @brief 获取指定设备的最后一次触发状态及时间。 |
| 57 | + * |
| 58 | + * @param dev 设备枚举。 |
| 59 | + * @param time 返回该设备最后一次触发的时间戳。 |
| 60 | + * @return true 如果该设备有有效的触发状态。 |
| 61 | + * @return false 如果该设备无记录。 |
| 62 | + */ |
| 63 | + bool GetLastTriggerStatus(TriggerDevice dev, uint64_t &time); |
| 64 | + |
19 | 65 | private: |
| 66 | + /** |
| 67 | + * @brief 从位掩码中获取对应设备的状态。 |
| 68 | + * |
| 69 | + * @param data 状态字节。 |
| 70 | + * @param index 目标设备在位掩码中的索引。 |
| 71 | + * @return true 对应位置为1,表示已触发。 |
| 72 | + * @return false 对应位置为0,表示未触发。 |
| 73 | + */ |
20 | 74 | static bool GetBool(const uint8_t data, const int index) { return (data >> index) & 1; } |
| 75 | + |
| 76 | + /** |
| 77 | + * @brief 更新设备状态,并发布触发信息。 |
| 78 | + * |
| 79 | + * @param dev 目标设备。 |
| 80 | + * @param bit_index 设备对应的位掩码索引。 |
| 81 | + * @param time 触发时间戳。 |
| 82 | + */ |
21 | 83 | void UpdateAndPublishDevice(TriggerDevice dev, int bit_index, uint64_t time); |
| 84 | + |
| 85 | + /** |
| 86 | + * @brief 发布指定设备的状态信息。 |
| 87 | + * |
| 88 | + * @param dev 目标设备。 |
| 89 | + * @param time 触发时间戳。 |
| 90 | + * @param status 当前触发状态。 |
| 91 | + */ |
22 | 92 | void PublishDeviceStatus(TriggerDevice dev, uint64_t time, bool status); |
23 | 93 | TriggerManger(); |
24 | 94 | ~TriggerManger() = default; |
25 | 95 | uint8_t status_{0}; |
26 | 96 | std::mutex lock_{}; |
27 | 97 | std::map<TriggerDevice, std::tuple<bool, uint64_t>> status_map_{}; |
28 | | - std::map<TriggerDevice, std::string> device_topics_; // 设备-topic映射 |
| 98 | + std::map<TriggerDevice, std::string> device_topics_; |
29 | 99 | }; |
| 100 | + |
30 | 101 | } // namespace infinite_sense |
0 commit comments