藍牙|軟體 QCC51xx系列開發之一種另類的中文日誌輸出方式的實現

本文適用範圍

    ADK23.3~


問題/功能描述

如何將中文字符直接輸出到日誌信息中?

實現方案

       默認ADK只支持ASCII字符的輸出,無法使用其他字符。雖然一般情況下這並不影響使用。但在某些情況下,直接顯示中文字符會更便於調試問題。例如在獲取歌曲信息,電話通信錄時,直接顯示解析後的中文字符會比輸出為一段十六進制數字串更直接。

       通過對ADK log模塊的實現分析,我們會發現資料非常少,幾乎沒有介紹。原廠僅僅是餵鴨式告訴客戶使用用DEBUG_LOG_xx接口可以分等級的輸出調試信息。深入底層代碼,我們也只是了解到原廠使用一塊分區循環存放log信息,然後主機上通過專門TRB接口驅動讀取分區內容並將其輸出到螢幕或者文件中。


我們決定從輸入和輸出入手,以實現所見即所得的效果,而不關心中間傳輸的黑盒過程。按照這個思路大膽嘗試,最終成功實現了中文輸出。

 

效果展示

代碼調用


終端顯示

 

日誌文件

 

你問為什麼不用中英文展示,原因首先是看不懂的文字顯得更高級.其次是為了表達採用UTF8編碼更加國際化,什麼類型文字都能輕鬆拿捏.

 

修改方案

修改分兩部分:源碼端和主機端。

源碼端

源碼又細為分兩種場景:

1.定長詞組的中文字符串

對於不需格式化的定長字符串,可以直接使用默認的debug API輸出,不做額外處理,例如

DEBUG_LOG_ALWAYS("這是簡單的中文測試")

 

2.格式化字符串

對於不定長的字符串變量的處理。

對於不定長的字符串變量,ADK標準的做法是格式化輸出強制8個字節對齊輸出為16進制字符。或者一行一個字符,為了解決問題我們使用了最低級的printf函數,它可以讓一串字符不換行的完整輸出到終端。

沒有特別需求時,當然是不推薦使用printf。原廠是有解釋的.debug空間有限,輸出太多太頻繁時,使用printf會容易溢出丟失log信息。

需要注意的是,ADK默認採用UTF編碼,但字符處理確不支持寬字符,所以直接使用printf輸出中文會報錯的。因此,我們需要先將字符轉碼為16進制字符串,後面再主機端解碼為正常字符顯示,相當於多了一套編解碼的程序。

以下是測試過程使用過的變量.好奇的可以解碼看看使用什麼文字測試。

'6d4be6b58be8af95e4b8ade69687e698bee7a4bae695b0e7bb84e5bda2e5bc8f'

附上代碼修改新輸出函數接口

 

主機端



修改也是分兩部分:窗口顯示,日誌文件寫保存操作。

吐槽ADK,為什麼不一統python,兩個版本打天下呢。國際大廠沒有國際化的覺悟,把字符處理改成utf多簡單,現在還要打工人費心修改。

這部分代碼改動不多,時間花費很多,平均時效接近 1 line/day,費效比當真恐怖如斯。別問為什麼要這麼改,問也是不知道,反正這改那改,突然她就朝我走來了。

話不多說直接上圖看修改,有顏色的比對很容易看清楚修改內容

 

 

 




擴展

       由於主要是自用,我們沒有過分的追求完美。實際上,可以在代碼端輸出那裡一樣添加上log level設定,方便調節輸出,來作為常規調試的補充。不過已經到自己加log地步大多時候就不需要屏蔽了。

 

補充

      實際測試中發現使用printf在一次列印長字符串的時候會導致死機,需要截斷分次發送。直接截取255個字節,但這樣會有切割問題,如何識別出一個完整的字節編碼是個挑戰.留給有緣人。

  

FAQ

1.怎麼使用?

   [A]在MDE裡面start debugging,然後把fw log輸出窗口顯示的命令複製到Terminal上運行即可正常顯示。

2.使用有沒有限制?

   [A]有,也是對上面問題的解釋,為什麼這麼難用。因為MDE 調試輸出窗口只支持ASCII,翻遍了也看不到那裡修改配置,列印其他字符只輸出亂碼,不過保存的log文件顯示正常。

修改只針對fw log,其他像什麼PrimHydraLog,TrapHydraLog統統不支持,我就是不想也不會改,因為我還沒找到怎麼調出這些接口。

3.用pydbg方式調試可以使用嗎?

   [A]可以,這個要把相關修改放到python3.7裡面對應位置就可以。

4.以前有使用過trb log腳本也可以這麼使用嗎?

   [A]我沒修改,布置為家庭作業自己做。不過我知道他是可以實現的也一定能實現,這個要在問題3基礎上做,請一定要相信我。

5.代碼中有什麼限制?

   [A]單獨輸出中文代碼裡面儘量少用,畢竟沒有官方背書,不保證質量。

強調  

                        修改只針對log輸出,掛屏顯示中文是需要添加GUI的支持,這不是文章的初心目標,不要理解錯誤。

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

參考來源

評論