郭健忠,杜新寶,謝 斌,閔 銳,胡文龍,許小偉
(1.武漢科技大學 汽車與交通工程學院,湖北 武漢 430065;2.武漢保華顯示科技有限公司,湖北 武漢 430082)
汽車儀表的信息顯示界面,實現了車輛內部信息與用戶的交流。儀表屏幕的字體信息作為重要的載體,傳遞了車輛的實時狀態信息[1-2]。隨著顯示技術的革新和計算機輔助軟件的應用,多界面切換的設計,使得儀表界面融入更多的設計元素,共同的特點是不同界面信息的呈現都包含字符元素設計[3-4]。目前字符信息顯示主要有兩種方式,一種是依靠字庫讀取點陣數據,另一種是制作字符圖片資源植入圖形庫的方式。然而實際開發中,在液晶屏不同的布局方式下,以上兩種方式顯示字符信息時,均存在適用性差、開發過程繁雜的問題[5-8]。因此,鑒于液晶儀表字符顯示系統出現的不足,有必要設計一種靈活高效的字符信息顯示方案。
針對汽車行業中主流的液晶儀表顯示功能進行分析,涉及字符信息顯示的場景[5-7],主要分為以下四類:(1)實時行車信息,即小計里程、行駛里程、續航里程等。(2)多媒體信息,即歌曲歌詞、通話管理等。(3)故障診斷查詢信息,即故障彈窗信息提示、故障描述信息查詢等。(4)菜單設置信息,即儀表各模式下有關屬性設置。以上應用場景中,字符信息顯示在儀表UI設計中是必要的設計環節,一套完整的字符顯示方案可以應用于多種場景的顯示。
根據字符顯示設計方案的不同,大致可以分為兩類。
一類是按照功能規范要求設計含有字符顯示信息的UI圖片資源,借助工具進行壓縮,通過燒錄的方式燒寫到開發板的外部FLASH(存儲器)中。調用圖片顯示時,根據燒錄時自動生成的圖片地址信息資源文件,找到對應圖片信息并傳入圖形控制模塊提供的顯示接口函數進行實現。該方法在圖片資源較少的開發前提下,可以滿足大多數需求。但實際開發中存在以下問題:
一是針對大量字符信息顯示需求(如故障報警描述信息),該方法適用性差,不具備批量處理生成的便捷設計功能,降低了開發效率。
二是由于不同的圖片資源會包含相同的字符,在一定程度上耗費存儲資源。同時,大量的圖片未實現調取的一致對應關系,造成程序設計結構繁瑣。
另一類是根據常用的字符編碼(ASCII、Unicode、GB2312)規則與字庫芯片數據地址關聯的設計形式,采用SPI的通訊方式調取內部的點陣信息數據。只有少數字符情況下,還可能借助字模軟件取模的形式,將字體的點陣數據寫入程序當中進行調用。實際應用當中,發現點陣字庫具有一定程度的局限性。主要包含以下幾點:
一是點陣字庫其固定分辨率、尺寸、字符變換以及放大縮小后,會出現鋸齒和失真的情況,不能滿足液晶儀表清晰、美觀的設計需求,影響實際顯示效果。
二是液晶屏的布局主要是水平橫置顯示和豎直擺放顯示兩種形式。處于豎直擺放時,采用點陣信息顯示會發生字體對齊困難以及界面字符布局的復雜問題。
三是點陣字庫的使用完全依賴于字庫芯片,缺乏一定的靈活性。由于大部分汽車液晶儀表顯示系統具備圖形處理控制單元,然而在字體顯示功能上可能會存在模塊支持性問題。
根據以上兩類顯示方法的具體分析,可以看出實際開發中傳統顯示方法在不同的設計需求方面存在的問題。融合兩種顯示方法的特點,借助Qt設計出一套完整的字符信息顯示設計方案。
字符信息顯示系統的設計分為硬件環境搭建和軟件功能實現。硬件環境搭建以某商用汽車儀表為例進行搭建;軟件設計部分以字符信息顯示的字庫設計為核心功能進行實現,字符顯示調用程序僅做基本實現。
字庫部分設計選用Qt平臺開發環境。Qt是跨平臺C++圖形用戶界面開發框架,具有豐富的API和開源框架,且可跨主流的操作系統[9-10]。Qt的項目界面以可視化設計方式呈現,通過打開Qt Creator中集成的Qt Designer(UI設計器),利用平臺提供的功能進行設計。主要包含組件面板,待設計窗體、屬性編輯器、對象瀏覽器。Qt強大的界面設計功能和控件,具備整個字庫功能實現所需的開發環境[11-14]。

圖1 硬件結構框圖
字符顯示調用部分開發環境采用NXP公司推出的S32DS編譯軟件。主控芯片選用S32K144系列芯片,該芯片支持多種通訊方式(I2C、UART、SPI、CAN)。圖形顯示方面選用YAMAHA公司提供的YGV642圖形控制器芯片。選用信利ZSX-50001QGQ型號的5英寸TFT真彩色液晶屏,分辨率為800*480,每個像素點支持的色彩深度為24 bit,RGB接口支持RGB888格式通訊。選用非易失性存儲器型號為S25FL128SAIF00,其容量大小為16 M。系統硬件主體框圖設計,如圖1所示。
整個系統的軟件架構分為Qt平臺的字庫設計以及S32DS平臺的字符顯示調用設計,如圖2所示。

圖2 系統軟件設計框圖
結合以上兩類設計方法的顯示特點,基于Qt平臺對字符顯示所需的字庫進行設計,轉變單純調用點陣字庫或植入圖形庫的設計思路,提出單字符圖片化的設計方法。此外,通過把字庫放置在外部FLASH,具有較好的通用性和靈活性[15]。由Qt進行設計的字庫生成工具,將包含字符信息的輸入文件導入,經字庫工具處理后輸出字符圖片資源,供壓縮和燒寫工具使用。同時,資源壓縮時形成的地址訪問資源文件(mapData.h、sequenceData.c)和字符信息資源文件可作為后續程序設計當中的調用文件。即mapData.h主要包含每張字符圖片枚舉成員名以及每張圖片在FLASH內部的地址信息。sequenceData.c則是記錄內部資源起始地址的文件。
S32DS平臺中,FontDisplayApp代表字符顯示的應用層程序,且提供調用接口。圖形顯示控制器(GDC)主要包含三個模塊,即CPU interface連接外圍主機的接口、Pattern memory interface可用于讀取外部FLASH、Pixel Data Ctr用于控制圖片數據向液晶屏傳輸。由應用層編寫的字符顯示模塊,通過調取驅動層提供的接口,實現數據的內部處理和傳輸,最終實現液晶儀表界面字符信息的顯示功能。
字庫各部分設計均在Qt平臺進行,整體設計思路分為三個部分:(1)根據輸入文件內字符信息,進行去重和編碼,建立專用字符集索引文件。(2)依據索引文件編碼生成單個字符的圖片資源。(3)利用編碼映射關系將輸入文件的字符和字庫編碼對應,實現字符信息輸入文件內容的自動解析并生成相應的解析資源文件。
從降低程序設計的復雜度出發,利用模塊化程序設計思想。各模塊之間結構關系,如圖3所示。
設計過程中,編寫去重和編碼功能模塊生成字符索引文件(.txt)。在此基礎上,一方面使用Qt提供的類庫編寫字符圖片化功能模塊。另一方面,編寫待顯示文件內部字符的文件資源解析模塊。

圖3 Qt字庫設計軟件模塊示意圖
利用Qt Designer 設計UI界面,如圖4所示。圈1表示索引時文件導入區,可實現生成并保存的功能;圈2表示打開并讀入索引文件到繪圖設備;圈3表示字符圖片化屬性設置區;圈4表示資源文件生成的相關設置。通過在界面上不同控件的內部實現相應的信號和槽函數的功能。軟件功能實現之后,打包將整個軟件封裝成字庫設計的輔助工具。
3.1.1 字符集索引文件生成
依據國際范圍內不同字符編碼格式使用率的統計數據,選用廣泛采用的UTF-8格式編碼[16],使用C語言編寫模塊程序。字符索引文件的設計主要包含兩個特征,一是單個字符的唯一性,二是單個字符的編碼。整個字符索引文件內字符編碼總數,取決于開發過程中所需導入的字符文件,其包含字符數量具有不定性。因此,考慮到鏈表的動態內存分配特性,選用鏈表的數據結構實現該數據類型的結構表示,如下所示:
typedef struct One_chara_node{
int chara_code_id;//字符編碼id值
uint8_t chara_info[MAX_LENGTH];//單個字符代表的UTF-8值
struct One_chara_node* next;//指向下一節點指針
}CharacterInfo_Type;//結構體別名

圖4 字庫生成工具UI界面
字符索引程序設計流程,如圖5所示。通過文件流操作導入文件,依據UTF-8編碼規則讀取單個字符第一字節信息,獲取單個字符所占總字節數,確保讀取時區分每個字符并保存完整編碼值。申請動態內存空間后,將隨后放入的字符與已經存在于鏈表的字符對比,排除重復字符,實現去重和唯一編碼的特點。如此循環讀取,直到文件結束。將鏈表內包含的字符輸出到文件內,得到專用字符集索引文件,便于后續進行字符匹配操作。

圖5 字符索引程序設計流程
3.1.2 字符圖片化設計
根據各模塊功能的不同,Qt的類庫也分為不同模塊。其中Qt基本模塊提供了Qt平臺的基本功能,包含設計圖片資源用到的Qt Core(核心非圖形類)和Qt GUI(圖形界面設計基礎類)。由于其強大的繪圖功能,字符圖片化的生成可以借助Qt GUI類內提供的繪圖設備(QImage、QPainter)和字體類(QFont)進行實現。
創建QImage類的對象,設定圖像規格大小和格式。調用填充成員函數fill(),實現背景填充。添加繪圖設備QPainter對象和QFont對象,完成字體屬性設置和繪制過程。其中字體對象可實現樣式、字體顏色、大小、方向以及字體背景顏色的改變,設計樣式比較靈活。借助QImage類提供的旋轉功能和圖片保存功能,將字符索引文件中的單個字符按照索引序列統一編碼命名并批量生成字符圖片[17-18]。部分關鍵代碼如下:
QImage pix(32,32, QImage::Format_ARGB32);
pix.fill(Qt::black);//設置填充顏色
QPainter painter(&pix);
QFont font("黑體",19);//設置字體對象的字體樣式,字號大小
painter.setRenderHint(QPainter::Antialiasing, true);//開啟抗鋸齒
painter.setFont(font);
painter.setPen(Qt::white);//設置字體顏色
painter.translate(32,0);//旋轉點位置設置
painter.rotate(90);//旋轉角度設置
painter.drawText(QRect(0,0,32,32),QString("字"));//規定繪制區域和內容
pix.save("name.png","png");//命名并保存
QFont對象使用了系統平臺中的矢量字庫(.ttf)。該字庫相比于點陣字庫具有很大的優點。矢量字庫是字符比劃分解成直線和曲線然后存儲這些線的參數。顯示時,通過畫出這些線條來顯示字符。因其具有不易失真、支持形式變換的優點,保證了儀表屏幕字符顯示的效果。
3.1.3 字符資源文件生成
字符資源文件主要是對輸入文件內字符信息的解析,以便后續程序調用。字符資源文件數據結構示意圖,如圖6所示。考慮到對每個同類型數據信息進行存儲和訪問。因此,選用結構體數組的數據結構形式。代碼格式部分設計的結構體內包含了三個必要成員,分別記錄輸入文件內行信息數量、單行信息包含的字符長度以及單行信息對應到字符索引文件內的編碼所組成的數組。

圖6 字符資源文件數據結構示意圖
程序設計過程中,需實現單個文件內部多行字符信息的批處理解析。由于涉及到每行信息的字符信息數量存在不確定性,同時考慮儀表屏幕顯示最多容納的字符數。字符解析部分選用循環隊列數據結構,對單個字符返回的編碼序列依次入隊,直至檢測到隊滿的為止,之后再對隊列內的元素進行出隊。代碼框架規定的Ch_Array[]數組與出隊的元素對應。因此,某文件字符信息文件作為輸入,通過對每行字符信息進行索引和循環隊列處理,最后向文件進行數據流輸出。針對不同需求的解析,結構體允許加入新增成員,作為其他程序訪問和參考的變量。整個字符資源文件以結構體數組的形式呈現,使得后續程序調用開發過程高效、方便。
字庫字符索引文件作為字符圖片資源命名和字符資源文件共同的設計規則。一方面可以確保從字符資源文件內讀取的字符經過遍歷,返回其所在鏈表中的編碼序列。另一方面保證圖片命名的一致性。因此,在單個字符編碼和圖片化命名上具有一致對照性。

圖7 映射關系示意圖
在字庫字符圖片化基礎上,僅需確保字符資源文件的每個字符返回索引文件內相同字符的編碼序列。使得兩者形成一致的映射關系。以某故障信息顯示為例,要求儀表在故障報文觸發時,儀表界面提示信息“節流閥(TVA)控制器產生永久負偏差”。根據以上已實現的部分,將字符序列與圖片命名對應,如圖7所示。
利用NXP公司提供的S32DS集成開發環境,編寫字符顯示應用程序。該部分程序設計主要分為:(1)上電后相關外設模塊初始化配置。包括MCU端向圖形控制芯片端的SPI1總線通訊協議、圖形控制芯片端向外部FLASH讀取的SPI2總線以及圖形控制芯片內部驅動液晶屏幕的驅動程序[19-20],以保證系統通信過程中數據的傳輸。(2)借助字庫設計提供的資源文件,編寫對應的顯示調用程序。(3)實現字符信息顯示的邏輯和字體界面布局調整的功能。(4)根據實測效果,進行功能調試。
調取字符圖片顯示的關鍵之處在于對應的位置顯示準確的字符圖片,保證字符順序不發生錯亂,規范布局。因此,使用結構體數據類型保存字符圖片加載時的屬性信息。結構體設計如下:
typedef struct {
unsigned short Lyrid;//圖層數值設置
unsigned short I_num;//所選圖片枚舉命名
unsigned short x_Pos;//圖片顯示的X坐標
unsigned short y_Pos;// 圖片顯示的Y坐標
unsigned short mx;//mx=0,該圖片顯示,否則不顯示
}PICTURE;//圖片操作結構體
其中,字符圖片的坐標和枚舉命名十分關鍵。I_num成員由QT_CHARAFONT結構體的Array[index].CH_Array[SN_xxx_png]賦值。字符數組內的成員與底層FALSH內部字符資源相互關聯,實現字符編碼與地址讀取的一致性。通過定義PICTURE Obj對象,傳入編寫的液晶驅動函數DisplayPic()接口,將完整的字符圖片顯示到屏幕上。
實際測試中,以某汽車儀表功能規范顯示故障信息為例,如“SPI=91,FMI=3,故障描述信息:油門踏板或操縱桿位置傳感器1電路-電壓高于正常值或對高壓電源短路”等同類型故障信息。其中可疑參數編號SPN和故障模式標志FMI,作為匹配對應故障報文的參數。為了簡明直觀地調用故障描述信息,該文不再對故障報文觸發機制內容做詳細描述。采用模擬給定SPN和FMI的方式,調用對應的故障描述信息進行顯示。實測環境如圖8所示。
汽車儀表字符字庫設計當中,用到的字符基本由ASCII字符和中文漢字字符構成,滿足國內大部分車輛的字符顯示需求。考慮到漢字使用頻率和場景,選用UTF-8編碼格式將常用拉丁文字符和使用頻率達99.9%的一級漢字字庫3 755個字符,共同組成字符索引文件并進行單個字符編碼。
通過Qt字庫設計工具,字體樣式選擇Qt平臺提供的黑體,規定字符圖片大小為32*32像素。設置背景為透明圖層,保證在原有背景圖片上的不遮擋顯示效果。字符圖片格式選用png格式。考慮液晶儀表豎向放置,將圖片向左旋轉90°并統一根據索引編碼次序命名。使用圖形控制芯片平臺提供的壓縮工具,將所有字符圖片資源壓縮為二進制(.bin)文件,最終大小為800 Kb以內。通過燒錄工具,把二進制資源文件燒寫到儀表的外部FLASH內。
根據顯示調用程序設計流程,編寫具體的應用程序。模擬給定故障報文參數后,匹配結構體數組內相應的故障描述信息。通過對PICTURE Obj對象賦值,規定顯示的范圍以及字體間距布局。將已賦值的對象傳遞給液晶驅動顯示接口DisplayPic()函數。刷寫芯片程序并運行,故障描述信息準確、清晰的顯示在液晶儀表屏幕上,如圖8所示。

圖8 實測環境與故障信息顯示效果圖
實際測試時,先后進行了調用字庫芯片點陣信息進行顯示和制作UI圖片資源貼圖的實驗。測試結果對比如表1所示。
第一種調用字庫的方式,在大量字符信息需要顯示時,需要給出字符對應的Unicode編碼值,必須通過工具轉換,不具備批量操作的便捷性。同時,對于液晶屏豎直顯示時,英文字符出現部分失真、大小標準不一、行間距對齊困難的問題。
第二種制作UI圖片資源貼圖的方式,出現多條信息時,制作字符圖片工作量巨大,而且未實現一致的調用關系,調用對應圖片十分復雜。對比兩者的開發過程以及最終儀表呈現的字體效果,該文設計的方案具有較大優勢。利用Qt設計的字符圖片化工具可以生成任意形式的字庫字符圖片,一定程度上避免了傳統字符顯示開發中帶來的復雜問題。整個系統具有開發時間短,設計簡便,節省成本,顯示靈活的優點。

表1 字體信息顯示方案對比
利用Qt平臺實現字符圖片化的設計,保證字庫設計上的靈活性。字符圖片資源與字符資源文件映射關系的設計,為程序結構化設計與規范調用字符信息數據提供了參考。經過實測,液晶儀表顯示方案在字符信息顯示過程中,實現了完整、靈活、高效以及清晰的顯示效果。該系統的設計具有以下三點優勢:
(1)實現了字庫裁剪,建立了儀表專用字庫,提升了儀表存儲資源上的空間利用率。增強了儀表顯示方向和字符信息界面布局的靈活性,使得顯示效果更加清晰、完整。
(2)開發了字庫工具,可批量處理字符信息顯示文件,使得字符顯示開發操作便捷、效率得以提高,具有良好的適用性。
(3)針對不同芯片開發平臺,避免了調整字庫芯片驅動以及可能出現的不良顯示效果,擴展了一部分支持圖形控制模塊在字體顯示方面的功能。