1. 程式人生 > >CSR8670 — 如何實現兩種指示狀態共存的效果

CSR8670 — 如何實現兩種指示狀態共存的效果

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

XX  作       者:ZHS(文化人)

XX  聯絡方式:文章末尾Chat快問

XX  要說的話:作者水平有限,難免有不足之處,懇請指正!

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

寫在前面:玩過CSR平臺的都知道,ConfigurationTool裡可以針對不同的狀態和事件配置不同的LED指示,非常方便,但是程式碼裡同時只支援一種狀態,如果客戶有兩種同時指示的需求,怎麼做呢?且聽我慢慢道來~

通過對CSR8670的ADK學習,有以下發現:

1、處在某種狀態時,可以觸發事件的指示,事件指示結束後會繼續狀態,此時會重新整理狀態,出現短暫顯示異常,如下圖;(這種情況可以實現短暫的兩種指示狀態共存的效果,但可能還是滿足不了客戶的需求)

2、處在某種事件時,gCurrentlyIndicatingEvent會使狀態和事件都不能觸發;如下圖:

3、處在某種狀態時,可使用timer維持事件repeat,達到兩種共存的效果,需要結束時,直接reset指示;(其實就是在某種狀態時維護一個事件持續指示,達到兩種狀態共存的效果)

那怎麼修改程式碼呢?繼續往下看

首先,不管是狀態還是事件,最終的處理都會呼叫ledsIndicateLedsPattern介面,裡面會呼叫LedsIndicateNoState清除當前的狀態指示,然後指示新的狀態或者事件;

那麼如果要做到兩種同時指示,就不能清除當前的狀態指示,所以這裡判斷如果是我們需要的事件,就不清除狀態指示,如下圖:

然後,在main.c中EventSysLEDEventComplete指示事件結束後,如果是我們需要的事件也不重新整理狀態;如下圖

接著,在我們需要事件的位置,通過timer維持事件repeat,如下圖

最後一步,當需要結束時,呼叫LedManagerResetLEDIndications()介面重新整理狀態指示即可,如下圖

另外configurationTool工具的配置如下圖: