基于QTE的嵌入式Linux下可視化打印設(shè)計(jì)
1 引言
本文引用地址:http://butianyuan.cn/article/82135.htm隨著計(jì)算機(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)和廣泛使用的平臺(tái)。
Qt/Embedded 是著名的Qt 庫開發(fā)商 Trolltech公司開發(fā)的面向嵌入式系統(tǒng)的Qt 版本,開發(fā)人員多為K D E 項(xiàng)目的核心開發(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平臺(tái)上,主要是基于QTE而通過控制USB設(shè)備,實(shí)現(xiàn)可視化圖像圖片處理和打印。
2 可視化打印的硬件系統(tǒng)
硬件結(jié)構(gòu)原理圖如圖1所示:
圖1硬件結(jié)構(gòu)原理圖
本系統(tǒng)采用的嵌入式微處理器是Samsung公司的S3C2410是一種集成了ARM公司ARM920T處理器核的16/32位微控制器。Flash存儲(chǔ)器采用Samsung公司的K9F1208U0M Nand Flash存儲(chǔ)器,存儲(chǔ)容量為64MB;SDRAM存儲(chǔ)器采用HY57V561620CT,大小為32MB;USB集線器芯片采用ALCOR MICRO公司AU9254A21型號(hào)的USB集線器芯片;觸摸屏采用Sharp公司的3.5寸LCD液晶屏, 320×240的分辨率。
3 可視化打印的具體實(shí)現(xiàn)
3.1 可視化打印的圖像采集實(shí)現(xiàn)
在可視化視頻采集QTE編程中,需要對(duì)內(nèi)存進(jìn)行讀寫,過程如下:首先打開視頻設(shè)備,攝像頭在系統(tǒng)中對(duì)應(yīng)的設(shè)備文件為/dev/video0,采用系統(tǒng)調(diào)用函數(shù)video_fd =open(/dev/ov51l/video0, O_RDWR),video_fd是設(shè)備打開后返回的文件描述符(打開錯(cuò)誤返回-1),以后的系統(tǒng)調(diào)用函數(shù)就可使用它來對(duì)設(shè)備文件進(jìn)行操作了。利用ioctl (video_fd, VIDIOCGMBUF, &vid_buf)函數(shù)讀取有關(guān)攝像頭的信息,該函數(shù)成功返回后,這些信息從內(nèi)核空間拷貝到用戶程序空間vid_buf各成員分量中。在這里我們采用mmap()系統(tǒng)調(diào)用使得進(jìn)程之間通過映射同一文件實(shí)現(xiàn)共享內(nèi)存,各進(jìn)程可以像訪問普通內(nèi)存一樣對(duì)文件進(jìn)行訪問,訪問時(shí)只需要使用指針而不用調(diào)用文件操作函數(shù)。最后通過使用QTE的時(shí)間函數(shù)QTimerEvent()和點(diǎn)操作函數(shù)QPoint()來進(jìn)行實(shí)時(shí)顯示,相關(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);//視頻顯示
. . . . . . . . . . .}
打印請(qǐng)求
這樣在我們的LCD顯示器的相應(yīng)位置便可以看到攝像頭的顯示了,如果想要對(duì)圖片進(jìn)行存儲(chǔ),同樣地可直接對(duì)內(nèi)存數(shù)據(jù)進(jìn)行讀取。
3.2 可視化的打印實(shí)現(xiàn)
首先給出控制打印機(jī)的流程圖,如圖2所示框圖這里我們使用的是HP Deskjet系列噴墨打印機(jī),此打印機(jī)驅(qū)動(dòng)程序具有良好的通用性和可移植性,源代碼可從惠普公司官方網(wǎng)站獲得,我們選用的是GNU Ghostscript7.05版本,與打印相關(guān)的具體實(shí)現(xiàn)可參見我們前期的工作[1]。 判斷文件格式
有了相應(yīng)的打印機(jī)系統(tǒng),下面需里主要解決的是用QTE控制并且傳遞打印的信息,即打印需要的參數(shù),主要包括圖片的寬,高,紙張大小,圖片位置和名字。用QTE直接與外面進(jìn)行傳遞比較困難,這里我們可采用環(huán)境變量的方式來進(jìn)行信息傳遞。由于在上面我們已經(jīng)獲得了想要的圖片,我們可以用QPixmap()這個(gè)類來獲取圖片的信息,用QDir()和QString()兩個(gè)類來獲得圖片位置和名字,打印機(jī)的執(zhí)行我們可以通過QTE中的系統(tǒng)執(zhí)行程序來執(zhí)行shell腳本來對(duì)打印機(jī)具體操作,相關(guān)代碼如下:
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)整,比如選擇圖片,對(duì)圖片放大縮小,確定打印位置等等。
3.3 可視化打印的QTE圖形界面開發(fā)和移植
上面已經(jīng)給出了底層可視化打印的構(gòu)建,而這時(shí)就需要一個(gè)統(tǒng)一的可視化圖形界面能夠提供給用戶方便,靈活,快捷的操作,起到對(duì)整個(gè)系統(tǒng)的統(tǒng)一調(diào)度和協(xié)調(diào),使得對(duì)圖片和打印的處理更加得心應(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è)計(jì)器來設(shè)計(jì)完整的圖形界面,qtdesigner是嵌入式公司Trolltech的Qt軟件包的一個(gè)組成部分。如果用戶使用的是KDE桌面,那么Qt已經(jīng)自動(dòng)安裝上了,Qt Designer也很有可能已經(jīng)被安裝好。如果用戶的系統(tǒng)沒有安裝,那么針對(duì)不同的版本,可以很方便地找到KDE Development Tools,并安裝之。以Red Hat 9.0為例,用戶可以從主選單→系統(tǒng)設(shè)置→添加/刪除應(yīng)用程序中選擇KDE軟件開發(fā),即可完成Qt Designer的安裝。
而詳細(xì)的功能設(shè)計(jì)要在設(shè)計(jì)器所生成的.cpp文件里改,改的時(shí)候可以用Linux自身帶的vi編輯器,也可以用Qt公司提供的自身帶的編輯器。在設(shè)計(jì)過程中,我們的開發(fā)主要是用QWidget()類作為程序的主類,而用QApplication()類和、QPixmap()類和其它的類作為配套,進(jìn)行圖形的窗口、按鈕和輸入對(duì)話框設(shè)計(jì),當(dāng)然這些圖形的選擇可以直接在qtdesigner中拖拽,界面的顏色和圖標(biāo)也可以直接在里面加上,但是一些特殊功能的實(shí)現(xiàn)還是要在編輯其中改的。界面實(shí)現(xiàn)的主要功能是攝像頭實(shí)時(shí)顯示背景、對(duì)圖片進(jìn)行處理(包括放大、縮小等)、打印定位、圖片選擇和編輯,攝像頭和打印機(jī)的配置等。最后,我們?cè)谧鲆粋€(gè)上層和底層的接口程序,要求這個(gè)接口程序能夠把打印機(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;以上兩句語句就會(huì)生成1.h和1.cpp兩個(gè)文件,當(dāng)1.cpp生成以后,就可以直接把上面已經(jīng)寫好的關(guān)于攝像頭和打印機(jī)的程序直接加到里面去,書寫規(guī)則與c++相同。現(xiàn)在還需要main.cpp和1.pro文件,main.cpp文件格式比較固定,例如:
#include
#include <1.h>
//主程序開始
int main(int argc, char *argv[]){
QApplication app(argc, argv);
Form1 w;//Form1是主程序的名字
w.show();
return app.exec();}
然后,我們用qmake的功能來自動(dòng)生成.pro文件,命令如下:qmake –project,生成一個(gè).pro文件,我們用vi編譯器來修改它,加入CONFIG +=qt warn_on release,為的是讓qt編譯器認(rèn)識(shí)這些文件。 接下來用qmake生成Makefile文件,最后再make一下,這樣便在宿主機(jī)上生成了可執(zhí)行文件。
然后我們可以在pc主機(jī)進(jìn)行試驗(yàn)和修改,再移植到目標(biāo)機(jī)上。而只需要修改Makefile文件里的環(huán)境變量,讓其進(jìn)行交叉編譯,生成arm下可執(zhí)行文件,最后燒到板子上就可以了。
4.結(jié)束語
當(dāng)前嵌入式產(chǎn)品正向著功能強(qiáng)的,操作簡單,體積小等方向發(fā)展,隨著功能的不斷強(qiáng)大,提供一體化服務(wù)成為一種必然和需求。本文設(shè)計(jì)了通過S3C2410來實(shí)現(xiàn)基于QTE的嵌入式Linux的可視化打印設(shè)備,脫離了龐大的PC機(jī)的預(yù)覽、控制、使得可視化打印更加方便、快捷,具有很高的靈活性,這樣既獲得了優(yōu)越的性能又節(jié)省了開支,具有比較高的實(shí)用價(jià)值。
評(píng)論