服务系统
简述
Services模块提供了一套统一的传感器访问与管理机制,通过异步事件驱动方式读取各类传感器数据。
该机制在采样请求与数据上报之间采用非阻塞操作,能够有效避免阻塞主线程或影响 UI 刷新性能。
同时,系统会在传感器数据更新后自动触发回调事件,将最新测量结果分发给上层模块,实现数据的实时同步与界面的平滑刷新。
使用方法
-
服务启动
- 在系统初始化阶段调用
eos_<sensor>_service_start()启动指定传感器服务。 - 启动后,内部会创建一个
lv_timer定时器,用于周期性触发eos_sensor_read_async()。 - 每次定时器到期时,系统将自动读取一次传感器数据(如电池电量、温度、加速度等)。
- 读取结果会通过异步事件
EOS_EVENT_SENSOR_REPORT_<SENSOR>广播到上层。
eos_battery_service_start(); // 启动电池服务eos_temp_service_start(); // 启动温度服务 - 在系统初始化阶段调用
-
同步获取传感器值
- 调用
eos_<sensor>_service_get_<value>()可在任意时刻获取最近一次缓存的传感器数据。 - 该接口直接返回上一次测量结果,不会触发新的采样,适合在算法或UI刷新中快速访问。
uint8_t level = eos_battery_service_get_level();printf("Battery: %d%%\n", level); - 调用
-
UI 事件绑定(异步更新)
- 若需要在界面上实时显示传感器变化,可在控件创建时注册全局广播事件回调。
- 当底层传感器采样完成后,会通过
EOS_EVENT_SENSOR_REPORT_<SENSOR>通知所有监听者。 - 回调中可直接更新显示内容,实现传感器数据的动态刷新。
static void _on_battery_update(lv_event_t *e){eos_sensor_t *sensor = lv_event_get_param(e);lv_label_set_text_fmt(battery_label, "%d%%", sensor->data.bat.level);}// TODO 更新文档eos_event_add_cb(eos_screen_active(),_on_battery_update,EOS_EVENT_SENSOR_REPORT_BAT,NULL);
扩展说明
- 所有传感器服务(电池、温度、光线、IMU 等)均遵循相同的接口命名与行为模式。
- 对于高速或流式传感器(如 IMU),可采用独立线程或 DMA + FIFO 机制采样,上层接口仍保持一致。