基于QTE的嵌入式Linux下可視化打印設(shè)計
關(guān)鍵詞:Qt/Embedded;嵌入式Linux;圖像采集;打印機(jī)
1引言
隨著計算機(jī)與信息技術(shù)迅猛發(fā)展,嵌入式系統(tǒng)產(chǎn)品已經(jīng)成為現(xiàn)在市場的熱點(diǎn)。而在嵌入式操作系統(tǒng)方面,Linux同目前廣泛的嵌入式系統(tǒng)如Vxwork、UC/OS、Palm OS和Windows CE等相比,具有可移植性好、網(wǎng)絡(luò)性強(qiáng)、編譯工具多、開放源碼等優(yōu)點(diǎn),逐漸成為嵌入式系統(tǒng)的研究熱點(diǎn)和廣泛使用的平臺。
Qt/Embedded 是著名的Qt 庫開發(fā)商 Trolltech公司開發(fā)的面向嵌入式系統(tǒng)的Qt 版本,開發(fā)人員多為K D E 項目的核心開發(fā)人員。許多基于Qt 的X Window 程序可以非常方便地移植到Qt/Embedded 上,延續(xù)了在X 上的強(qiáng)大功能,在底層摒棄了X lib而采用了framebuffer 作為底層圖形接口。Qt/Embedded 類庫完全采用C++ 封裝。豐富的控件資源和良好的可移植性是Qt/Embedded的優(yōu)勢,使用X 下的開發(fā)工具Qt Designer可以直接開發(fā)基于Qt/Embedded 的UI(用戶操作接口)界面。本文便是在嵌入式Linux系統(tǒng)的s3c2410平臺上,主要是基于QTE而通過控制USB設(shè)備,實現(xiàn)可視化圖像圖片處理和打印。
2 可視化打印的硬件系統(tǒng)
硬件結(jié)構(gòu)原理圖如圖1所示:
圖1硬件結(jié)構(gòu)原理圖
本系統(tǒng)采用的嵌入式微處理器是Samsung公司的S3C2410是一種集成了ARM公司ARM920T處理器核的16/32位微控制器。Flash存儲器采用Samsung公司的K9F1208U0M Nand Flash存儲器,存儲容量為64MB;SDRAM存儲器采用HY57V561620CT,大小為32MB;USB集線器芯片采用ALCOR MICRO公司AU9254A21型號的USB集線器芯片;觸摸屏采用Sharp公司的3.5寸LCD液晶屏, 320×240的分辨率。
3 可視化打印的具體實現(xiàn)
3.1 可視化打印的圖像采集實現(xiàn)
在可視化視頻采集QTE編程中,需要對內(nèi)存進(jìn)行讀寫,過程如下:首先打開視頻設(shè)備,攝像頭在系統(tǒng)中對應(yīng)的設(shè)備文件為/dev/video0,采用系統(tǒng)調(diào)用函數(shù)video_fd =open("/dev/ov51l/video0", O_RDWR),video_fd是設(shè)備打開后返回的文件描述符(打開錯誤返回-1),以后的系統(tǒng)調(diào)用函數(shù)就可使用它來對設(shè)備文件進(jìn)行操作了。利用ioctl (video_fd, VIDIOCGMBUF, &vid_buf)函數(shù)讀取有關(guān)攝像頭的信息,該函數(shù)成功返回后,這些信息從內(nèi)核空間拷貝到用戶程序空間vid_buf各成員分量中。在這里我們采用mmap()系統(tǒng)調(diào)用使得進(jìn)程之間通過映射同一文件實現(xiàn)共享內(nèi)存,各進(jìn)程可以像訪問普通內(nèi)存一樣對文件進(jìn)行訪問,訪問時只需要使用指針而不用調(diào)用文件操作函數(shù)。最后通過使用QTE的時間函數(shù)QTimerEvent()和點(diǎn)操作函數(shù)QPoint()來進(jìn)行實時顯示,相關(guān)代碼如下:
Void Video::timerEvent( QTimerEvent * ){
. . . . . . . . . . .
int X_off;//定義屏幕上的橫坐標(biāo)
int Y_off;//定義屏幕上的縱坐標(biāo)
FrameBuffer *fb;Video *v;QFrame frame;//定義需要的參數(shù)
QPoint p = frame->mapToGlobal(QPoint(X_off, Y_off));//找到屏幕的相應(yīng)點(diǎn)
unsigned char *Map = v->Getmap24(width, height); //獲得視頻信息
fb->Drawmap(Map, p.x(), p.y(), width, height);//視頻顯示
. . . . . . . . . . .}
打印請求 |
3.2 可視化的打印實現(xiàn)
首先給出控制打印機(jī)的流程圖,如圖2所示框圖這里我們使用的是HP Deskjet系列噴墨打印機(jī),此打印機(jī)驅(qū)動程序具有良好的通用性和可移植性,源代碼可從惠普公司官方網(wǎng)站獲得,我們選用的是GNU Ghostscript7.05版本,與打印相關(guān)的具體實現(xiàn)可參見我們前期的工作[1]。
判斷文件格式 |
Void Widget::PictureAndPrint(){
圖2打印任務(wù)管理程序流圖[1]
|
int w,h;//定義圖片的長和高
QDir dir;//定義文件位置
QString string1;//保存文件位置
QString string2;//定義文件名
QPixmap Picture1=QPixmap(“圖片位置”);//取圖片
w= Picture1.width();//獲取寬度
h= Picture1.height();//獲取長度
string1=dir.currentDirPath ();//獲取圖片地址
string2=fn;
. . . . . . . .
char m11[8];//存放傳送所需要的參數(shù)
char *can="W";
setenv(can,m11,2);//把參數(shù)傳給環(huán)境變量
. . . . . . . .
system("./print.sh");} //執(zhí)行打印命令腳本
紙張的大小系統(tǒng)默認(rèn)是A4,但可由用戶直接在下面開發(fā)的圖形界面里進(jìn)行可視化調(diào)整,比如選擇圖片,對圖片放大縮小,確定打印位置等等。
3.3 可視化打印的QTE圖形界面開發(fā)和移植
上面已經(jīng)給出了底層可視化打印的構(gòu)建,而這時就需要一個統(tǒng)一的可視化圖形界面能夠提供給用戶方便,靈活,快捷的操作,起到對整個系統(tǒng)的統(tǒng)一調(diào)度和協(xié)調(diào),使得對圖片和打印的處理更加得心應(yīng)手。這里為了方便開發(fā),需要建立兩套環(huán)境系統(tǒng),一套在PC主機(jī)上,我們稱之為宿主機(jī),而另一套在開發(fā)板(S3C2410)上,稱之為目標(biāo)機(jī)。我們要做的就是先要在宿主機(jī)上開發(fā)出理想中的界面,再通過交叉編譯生成在目標(biāo)機(jī)上可執(zhí)行的二進(jìn)制代碼,然后移植到目標(biāo)機(jī)上進(jìn)行調(diào)試,直到滿意為止。而宿主機(jī)和目標(biāo)機(jī)都已安裝了Linux操作系統(tǒng),在宿主機(jī)上建立開發(fā)環(huán)境這里不細(xì)談,下面只說說圖形界面的開發(fā)過程和移植。
我們用qtdesigner設(shè)計器來設(shè)計完整的圖形界面,qtdesigner是嵌入式公司Trolltech的Qt軟件包的一個組成部分。如果用戶使用的是KDE桌面,那么Qt已經(jīng)自動安裝上了,Qt Designer也很有可能已經(jīng)被安裝好。如果用戶的系統(tǒng)沒有安裝,那么針對不同的版本,可以很方便地找到KDE Development Tools,并安裝之。以Red Hat 9.0為例,用戶可以從主選單→系統(tǒng)設(shè)置→添加/刪除應(yīng)用程序中選擇KDE軟件開發(fā),即可完成Qt Designer的安裝。
而詳細(xì)的功能設(shè)計要在設(shè)計器所生成的.cpp文件里改,改的時候可以用Linux自身帶的vi編輯器,也可以用Qt公司提供的自身帶的編輯器。在設(shè)計過程中,我們的開發(fā)主要是用QWidget()類作為程序的主類,而用QApplication()類和、QPixmap()類和其它的類作為配套,進(jìn)行圖形的窗口、按鈕和輸入對話框設(shè)計,當(dāng)然這些圖形的選擇可以直接在qtdesigner中拖拽,界面的顏色和圖標(biāo)也可以直接在里面加上,但是一些特殊功能的實現(xiàn)還是要在編輯其中改的。界面實現(xiàn)的主要功能是攝像頭實時顯示背景、對圖片進(jìn)行處理(包括放大、縮小等)、打印定位、圖片選擇和編輯,攝像頭和打印機(jī)的配置等。最后,我們在做一個上層和底層的接口程序,要求這個接口程序能夠把打印機(jī)和攝像頭與上層的可視化界面連接起來,形成真正意義上的“無縫”連接。
低版本只能生成.ui文件,我們還需要進(jìn)行一下轉(zhuǎn)化。用交叉編譯好的工具uic來進(jìn)行轉(zhuǎn)化,具體的轉(zhuǎn)化形式是(假設(shè)生成的文件為1.ui)uic –o 1.h 1.ui;uic –o 1.cpp –impl 1.h 1.ui;以上兩句語句就會生成1.h和1.cpp兩個文件,當(dāng)1.cpp生成以后,就可以直接把上面已經(jīng)寫好的關(guān)于攝像頭和打印機(jī)的程序直接加到里面去,書寫規(guī)則與c++相同?,F(xiàn)在還需要main.cpp和1.pro文件,main.cpp文件格式比較固定,例如:
#include <QApplication.h>
#include <1.h>
//主程序開始
int main(int argc, char *argv[]){
QApplication app(argc, argv);
Form1 w;//Form1是主程序的名字
w.show();
return app.exec();}
然后,我們用qmake的功能來自動生成.pro文件,命令如下:qmake –project,生成一個.pro文件,我們用vi編譯器來修改它,加入CONFIG +=qt warn_on release,為的是讓qt編譯器認(rèn)識這些文件。 接下來用qmake生成Makefile文件,最后再make一下,這樣便在宿主機(jī)上生成了可執(zhí)行文件。
然后我們可以在pc主機(jī)進(jìn)行試驗和修改,再移植到目標(biāo)機(jī)上。而只需要修改Makefile文件里的環(huán)境變量,讓其進(jìn)行交叉編譯,生成arm下可執(zhí)行文件,最后燒到板子上就可以了。
4.結(jié)束語
當(dāng)前嵌入式產(chǎn)品正向著功能強(qiáng)的,操作簡單,體積小等方向發(fā)展,隨著功能的不斷強(qiáng)大,提供一體化服務(wù)成為一種必然和需求。本文設(shè)計了通過S3C2410來實現(xiàn)基于QTE的嵌入式Linux的可視化打印設(shè)備,脫離了龐大的PC機(jī)的預(yù)覽、控制、使得可視化打印更加方便、快捷,具有很高的靈活性,這樣既獲得了優(yōu)越的性能又節(jié)省了開支,具有比較高的實用價值。
本文作者創(chuàng)新點(diǎn):可視化打印往往需要pc機(jī)的支持,這給用戶造成了很大的不便。本文設(shè)計的可視化打印系統(tǒng),使得可視化打印機(jī)完全脫離了pc機(jī)工作,且自帶液晶顯示屏,可以預(yù)覽文本,處理圖像圖片,而且可外接各種存儲設(shè)備,增大了存儲容量,使打印機(jī)具有了獨(dú)立性和便攜性。而它可驅(qū)動不同型號的打印機(jī),故能夠節(jié)省了開支。
參考文獻(xiàn):
[1] 王乾,基于嵌入式Linux的打印控制系統(tǒng)的設(shè)計與實現(xiàn),微計算機(jī)信息,2007,第1期
[2] TROLLECH主頁:http://www.trolltech.com/
[3] Xteam(中國)軟件技術(shù)有限公司 著,Qt程序設(shè)計,清華大學(xué)出版社,2005
[4] Alessandro Rubini等著,魏永明等譯,Linux設(shè)備驅(qū)動程序(第二版),中國電力出版2002