0. CarLightService 概述

CarLightService 作为与 Client 与 MCU 的中间层,做氛围灯优先级仲裁的任务。

CarLightService 向 Client 提供 Java API 与 Native API。API 中需要传入的参数主要有氛围灯效果和超时时间。

1. CarLightService 整体框架

Client 请求氛围灯效果后,先在 Dispatcher 根据灯的 ID 分别插入到相应的优先级队列 LightPriorityQueue 中,同时延迟发送 Message 到 TimeoutHandler 中。

每个灯优先级队列中取优先级最高的效果,填充到给 MCU 发送的数据结构中。如果 DataX 有变化,则把相应位置的请求位置为 1,以请求 MCU 更新该位置的灯的效果。

最后往 MCU 发送填充好的数据。

当 TimeoutHandler 中一个 Message 超时时,从相应的优先级队列中移除对应的请求数据。这时如果该效果恰好是该队列中最高优先级,则会取下一个优先级的请求数据下发。

Client 也可以主动取消一个请求,这时也从相应的优先级队列中移除请求数据。

UML diagram (3).jpg

1.1 与 MCU 通信时的数据结构

1字节 1字节 12字节 12字节 12字节 12字节 12字节 12字节 12字节 12字节 12字节
ALM编号 ALM编号 ALM1 数据 ALM2 数据 ALM3 数据 ALM4 数据 ALM5 数据 ALM6 数据 ALM7 数据 ALM8 数据 ALM9 数据

1.2 优先级队列的设计

优先级队列参照,简单的基于优先级的 CPU 调度,每个优先级有一个子队列。

当需要获取一个优先级队列中的请求数据时,从高优先级子队列的队头开始找,如果当前子队列没有请求数据,则继续找下一优先级子队列。

当同一优先级的请求插入时,会插入到子队列的队头,这符合产品的「后来的请求优先于已有的同优先级请求」的设定。

当一个请求超时或 Client 主动调用取消时,从子队列中移除该请求。

优先级子队列的大小最大限制在 5。如果新请求来时,子队列满,则先移除对尾请求。

优先级队列里存的是,当前 Client 请求的所有数据,从队列移除说明 Client 不再请求。