CarLightService 作为与 Client 与 MCU 的中间层,做氛围灯优先级仲裁的任务。
CarLightService 向 Client 提供 Java API 与 Native API。API 中需要传入的参数主要有氛围灯效果和超时时间。
Client 请求氛围灯效果后,先在 Dispatcher 根据灯的 ID 分别插入到相应的优先级队列 LightPriorityQueue 中,同时延迟发送 Message 到 TimeoutHandler 中。
每个灯优先级队列中取优先级最高的效果,填充到给 MCU 发送的数据结构中。如果 DataX 有变化,则把相应位置的请求位置为 1,以请求 MCU 更新该位置的灯的效果。
最后往 MCU 发送填充好的数据。
当 TimeoutHandler 中一个 Message 超时时,从相应的优先级队列中移除对应的请求数据。这时如果该效果恰好是该队列中最高优先级,则会取下一个优先级的请求数据下发。
Client 也可以主动取消一个请求,这时也从相应的优先级队列中移除请求数据。
1字节 | 1字节 | 12字节 | 12字节 | 12字节 | 12字节 | 12字节 | 12字节 | 12字节 | 12字节 | 12字节 |
---|---|---|---|---|---|---|---|---|---|---|
ALM编号 | ALM编号 | ALM1 数据 | ALM2 数据 | ALM3 数据 | ALM4 数据 | ALM5 数据 | ALM6 数据 | ALM7 数据 | ALM8 数据 | ALM9 数据 |
优先级队列参照,简单的基于优先级的 CPU 调度,每个优先级有一个子队列。
当需要获取一个优先级队列中的请求数据时,从高优先级子队列的队头开始找,如果当前子队列没有请求数据,则继续找下一优先级子队列。
当同一优先级的请求插入时,会插入到子队列的队头,这符合产品的「后来的请求优先于已有的同优先级请求」的设定。
当一个请求超时或 Client 主动调用取消时,从子队列中移除该请求。
优先级子队列的大小最大限制在 5。如果新请求来时,子队列满,则先移除对尾请求。
优先级队列里存的是,当前 Client 请求的所有数据,从队列移除说明 Client 不再请求。