吳艷玲,周巖,王志剛,章良芳
(河北漢光重工有限責(zé)任公司,河北邯鄲,056017)
可編程觸摸鍵盤在多功能標(biāo)準(zhǔn)顯控臺(tái)上的應(yīng)用已經(jīng)非常普遍,且可編程觸摸鍵盤的銷售情況比較樂觀,為拓展產(chǎn)品的功能、打破產(chǎn)品中的技術(shù)壁壘,在原來型號(hào)可編程觸摸鍵盤的結(jié)構(gòu)尺寸基礎(chǔ)上,通過更換軟件運(yùn)行平臺(tái)、調(diào)整設(shè)備的通訊方式等手段滿足不同條件下用戶要求,并在一定條件下替代原來型號(hào)可編程觸摸鍵盤應(yīng)用于各標(biāo)準(zhǔn)臺(tái)上,銷售前景良好。
可編程觸摸鍵盤的組成包括結(jié)構(gòu)組件、液晶盒組件、控制板組件和接口器件等。
(1)液晶盒組件部分包含前面板、液晶屏、屏蔽絲網(wǎng)玻璃組成;
(2)控制板組件包括核心控制板卡組成;
(3)接口器件包括電源接口和信號(hào)接口插座;
(4)結(jié)構(gòu)件包含面板、后框架組成。
產(chǎn)品工作原理圖如圖2所示。
圖2 可編程觸摸鍵盤工作原理圖
圖1 可編程觸摸鍵盤分解圖
圖3 可編程觸摸鍵盤軟件工作流程
該設(shè)備具備兩組對(duì)外接口,分別為RS232串口信號(hào)及電源接口、USB調(diào)試接口。當(dāng)調(diào)試時(shí),可編程觸摸鍵盤通過USB調(diào)試接口進(jìn)行調(diào)試。當(dāng)正常工作時(shí),可編程觸摸鍵盤通過RS232通信方式控制顯示傳輸?shù)膱D形、文字或按鍵等信息。W1線纜:核心主板輸出接口XP1的LVDS信號(hào)線纜與LED顯示屏的輸入接口相連接,實(shí)現(xiàn)顯示功能;W2線纜:核心主板輸出接口XP1的供電線纜與LED顯示屏輸入接口相連接,給LED顯示屏提供電壓;W3線纜:通過對(duì)外接口的XS1外部電源與核心主板的輸入接口XP2相連接,實(shí)現(xiàn)外部供電;W4線纜:通過對(duì)外接口的XS1外部電源與電阻屏的主控板相連,實(shí)現(xiàn)外部供電;W5線纜:電阻屏主板的輸出接口與五線電阻屏輸入口相連,實(shí)現(xiàn)通信功能;W6線纜:核心主板輸出接口XP5與五線電阻屏輸入接口XP4相連接 實(shí)現(xiàn)串口通訊;W7線纜:外部主機(jī)與核心主板XP6相連,實(shí)現(xiàn)通信;W8線纜:核心主板接口XP7與對(duì)外接口的XS1相連接 ,實(shí)現(xiàn)復(fù)位。
液晶盒組件由屏蔽絲網(wǎng)和液晶原屏粘接組成,主要作用為:
(1)圖形顯示功能;
(2)屏面板加固功能;
(3)電磁屏蔽功能;
(4)減小鏡面反射率。
核心控制板主要作用如下:
(1)接收上位機(jī)發(fā)送的控制指令,解析報(bào)文并將報(bào)文中的圖形、文字等信息轉(zhuǎn)化為顯示信號(hào);
(2)接收觸摸屏指令,并判定觸摸位置是否符合要求;
(3)與上位機(jī)進(jìn)行實(shí)時(shí)交互,完成設(shè)備的在線診斷等故障診斷功能。
軟件驅(qū)動(dòng)設(shè)計(jì)支持Vxworks、道系統(tǒng)版本6.0、中標(biāo)麒麟操作系統(tǒng)4.0、Vxworks及Windows XPE操作系統(tǒng)。
可編程觸摸鍵盤可通過RS232接口與主機(jī)相連,主機(jī)通過應(yīng)用程序發(fā)送指令,指令通過可編程觸摸鍵盤的驅(qū)動(dòng)程序傳遞報(bào)文至核心控制板,核心控制板解析主機(jī)發(fā)送的報(bào)文,并將報(bào)文中的圖形與文字信息顯示在顯示屏上。
(1)可編程觸摸鍵盤底層應(yīng)用程序;
(2)設(shè)備驅(qū)動(dòng)程序;
(3)中間件程序;
(4)上位機(jī)應(yīng)用程序。
(1)以通用軟件開發(fā)規(guī)范為準(zhǔn)則;
(2)采用容錯(cuò)、冗余等措施,確保軟件的可靠性、安全性和健壯性;
(3)采用由頂向下、層次化、模塊化結(jié)構(gòu)設(shè)計(jì)方法。
應(yīng)用QT4.8.4開發(fā)平臺(tái),遵循RS232通用協(xié)議。編程語言采用C、C++語言實(shí)現(xiàn)可編程觸摸鍵盤的嵌入式應(yīng)用軟件開發(fā)。
可編程觸摸鍵盤的軟件開發(fā)采用基于優(yōu)先級(jí)的搶占式多任務(wù)調(diào)度策略;使用二進(jìn)制信號(hào)量來實(shí)現(xiàn)任務(wù)間的同步與互斥;使用消息隊(duì)列和管道來實(shí)現(xiàn)任務(wù)間的通訊;編程語言使用C/C++程序設(shè)計(jì)語言,采用雙緩存技術(shù)進(jìn)行圖形繪制、圖片處理功能的開發(fā);應(yīng)用軟件可以根據(jù)需要進(jìn)行擴(kuò)充修改。
可編程觸摸鍵盤具有強(qiáng)大的作圖和顯示功能,能夠?qū)崟r(shí)、直觀、準(zhǔn)確地獲取豐富的系統(tǒng)狀態(tài)和目標(biāo)信息;能夠?qū)崟r(shí)進(jìn)行故障定位,并向用戶實(shí)時(shí)反饋可編程觸摸鍵盤的運(yùn)行狀態(tài)。它將兼容了原有可編程觸摸鍵盤應(yīng)用軟件的所有功能。其軟件框圖如圖4所示。
圖4 可編程觸摸鍵盤軟件框圖
TPKCore:觸摸屏核心類,目前包含TPKPage類、PConnet類、Graphic類的實(shí)例,及通信線程的具體實(shí)現(xiàn);
TPKPage:頁面處理類,包含頁面的各種參數(shù),背景顏色、是否使用、是否顯示等等;實(shí)現(xiàn)其功能的部分函數(shù)定義如下所示:
private:
bool m_bIsUsed;
bool m_bIsShow;
bool m_bIsClear;
unsigned int m_unRGB;
CPTKButton m_PTKMapBtn[ARY_BTN_MAX];
public:
QImage m_image;
void SetRGB(unsigned int unColor);
unsigned int GetRGB(void);
void SetUsed(bool bUsed = TRUE);
bool GetUsed(void);
void SetShow(bool bShow);
bool GetShow(void);
void SetClear(void);
bool GetClear(void);
void SetBTN(CPTKButton PTKBtn);
void DelBTN(int &nID);
void CreateBtmp(const int &nWidth , const int&nHigh);
CPTKButton* GetBTNByID(int nID);
CPTKButton* GetBTNAdr();
CPTKPage(void);
~CPTKPage(void);
像獲取按鍵ID設(shè)置按鍵等功能的部分代碼在QT開發(fā)環(huán)境下具體實(shí)現(xiàn)如下代碼所示:
CPTKButton* CPTKPage::GetBTNByID(int nID)
{
CPTKButton tmpBtn;
if (nID < 0 || nID >= ARY_BTN_MAX)
{
return NULL;
}
else
return &m_PTKMapBtn[nID];
}
void CPTKPage::SetBTN(CPTKButton PTKBtn)
{ CPTKButton tmpBtn;
int nID = PTKBtn.GetID();
m_PTKMapBtn[nID]= PTKBtn;
}
PConnect類:通訊管理,主要包括報(bào)文的解釋;
在QT中并沒有特定的串口控制類,使用第三方寫的qextserialport類。首先設(shè)置串口參數(shù),如:波特率,數(shù)據(jù)位,奇偶校驗(yàn)位,停止位,數(shù)據(jù)控制流控制,再設(shè)置串口號(hào),打開串口等功能。實(shí)現(xiàn)其部分功能代碼如下所示:
PortSettings m_set,m_set1;
m_set.BaudRate = BAUD115200;
m_set1.BaudRate = BAUD9600;
m_set.DataBits = DATA_8;
m_set1.DataBits = DATA_8;
m_set.Parity = PAR_NONE;
m_set1.Parity = PAR_NONE;
m_set.StopBits = STOP_1;
m_set1.StopBits = STOP_1;
m_set.FlowControl = FLOW_OFF;
m_set1.FlowControl = FLOW_OFF;
m_set.Timeout_Millisec = 2;
m_set1.Timeout_Millisec = 2;
m_pPort=new QextSerialPort("\\.\com2",m_set,QextSerialPort::Polling);
m_pPort1=new QextSerialPort("\\.\com7",m_set1,QextSerialPort::Polling);
qDebug(" m_set1.Timeout_Millisec = %d ", m_set1.Timeout_Millisec);
m_pPort->open(QIODevice::ReadWrite);
m_pPort1->open(QIODevice::ReadWrite);
報(bào)文解析,例如:根據(jù)可編程觸摸鍵盤通信協(xié)議要求創(chuàng)建按鍵報(bào)文解析部分代碼如下所示:
int CPConnect::ML_SOCM_CreateCommnKey (char*pchBuf, int &nPage, CPTKButton &tpkBtn ,const int&nlen)
{ QRect rect;
nPage = pchBuf[10];
tpkBtn.SetID(pchBuf[11]);
rect.setLeft(GetInt(pchBuf+12));
rect.setTop(GetInt(pchBuf+14));
rect.setWidth(GetInt(pchBuf+16));
rect.setHeight(GetInt(pchBuf+18));
tpkBtn.SetPTKBtnRect(rect, GetRGB(pchBuf+21) ,GetRGB(pchBuf+24) , GetRGB(pchBuf+27));
tpkBtn.SetLightRGB(GetRGB(pchBuf+30));
tpkBtn.SetStrMsg(pchBuf+37,(int)pchBuf[36],GetRGB(pchBuf+33));
tpkBtn.SetKeyAttr((int)pchBuf[20]);
return N_PT_CRTBTN;
}
Graphic類:繪圖類,這些函數(shù)主要完成觸屏的圖形繪制的所有工作。
完成觸摸屏繪制工作的部分函數(shù)定義程序如下所示:例如 int is_chinese(char p)實(shí)現(xiàn)輸入的字符是否是中文;void TouchKey_CharShow(QPainter *p,CPTKButton*pPTKBtn)實(shí)現(xiàn)按鍵字符在哪個(gè)頁碼上顯示按鍵。
int is_chinese(char p);
void TouchKey_CharShow(QPainter*p,CPTKButton* pPTKBtn);
void CharPosition(short CharRows,short CharRow,short clength,CPTKButton *pPTKBtn , short&stCharX , short &stCharY);
void ShowChar(QPainter *p,short sALLlen,short clength,unsigned char *ShowCharSz,short cleft,short chigh,CPTKButton *pPTKBtn);
void InitDashVal(const int &nVal = 0);
void Int2Bin(unsigned int unValue, float fArray[]);
void DrawTransparentRect(QPainter *p , const QRect &rect , const unsigned int &color);
void DrawTransparentEllipse(QPainter *p , const QRect &rect, const unsigned int &color);
void DrawTransparentPolygon(QPainter *p ,QPointF * ptAry , const int &nLen, const unsigned int&color);
void DrawTransparentArc(QPainter *p , const QRect&rect ,const int &nStartAngle ,const int &nEndAngle,const unsigned int &color);
void DrawEllipse(QPainter *p ,const QRect &rect,const unsigned int &colorEdge ,const unsigned int&colorFill); //畫橢圓
void DrawLine(QPainter *p , const QPoint &ptA ,const QPoint &ptB , const unsigned int &color);
void DrawPolygon(QPainter *p , QPoint * ptAry ,const int &nLen, const unsigned int &colorEdge , const unsigned int &colorFill);
void DrawPie(QPainter *p, const QRect &rect , const QPoint &ptStart ,const QPoint &ptEnd, const unsigned int &colorEdge , const unsigned int &colorFill);
void DrawCommKey(QPainter *p , CPTKButton*pPTKBtn);
void DrawPicKey(QPainter *p ,CPTKButton*pPTKBtn );
void DrawUniteKey(QPainter *p ,CPTKButton*pPTKBtn );
PTKBTN類:按鍵處理類,包含按鍵的顏色、形狀、ID值和區(qū)域等屬性的設(shè)置,實(shí)現(xiàn)其功能的部分函數(shù)定義如下所示:
void SetPTKBtn(const QRect &rcBtn ,const unsigned int &unBtnRGB ,const unsigned int &unBtnLTRGB ,const unsigned int &unBtnRBRGB ,const int &nID );
void ChgPTKBtn(const int &nKeyAttr ,const unsigned int &unLightRGB ,char chBuf[], int nLen);
void SetPTKBtnRect(const QRect &rcBtn,const unsigned int &unBtnRGB ,const unsigned int&unBtnLTRGB ,const unsigned int &unBtnRBRGB);
void SetStrMsg(char chBuf[], int nLen , const unsigned int &unRGB);
void SetKeyAttr(const int &nKeyAttr);
void ChnKeyAttr(const char &chValue);
int GetKeyAttr();
void SetLightRGB(const unsigned int &unLightRGB);
unsigned int GetLightRGB();//獲取指示燈的顏色
unsigned int GetStrRGB(); //獲取字符顏色
char* GetStrPoint(); //獲取字符串指針
int GetStrLen(); //獲取字符串長度
void SetFont(const int &nSize , const int &nType);
float GetFontPound(void);
int GetFontSize(void);
int GetFontType(void);
void SetPTKPicBtn(const QRect &rcBtn ,const short &sUpPicID ,const short &sDnPicID ,const short&sInPicID);
bool GetPicFlag();
btnCLASS GetBtnClassFlag();
void SetBtnClassFlag(btnCLASS classBtn);
short GetUpPicID();
short GetDnPicID();
可編程觸摸鍵盤在日常生產(chǎn)生活中已經(jīng)推廣使用了很多年,隨著觸摸屏技術(shù)的日趨完善, 其可靠性和壽命都得到了大幅提高,在船舶自動(dòng)化領(lǐng)域中具有觸摸功能的人機(jī)界面類產(chǎn)品數(shù)量及種類也在增多。本文首先介紹了可編程觸摸鍵盤的硬件組成及工作原理,詳細(xì)講解了該模塊開發(fā)的軟件設(shè)計(jì),對(duì)軟件的設(shè)計(jì)原則、軟件環(huán)境、軟件組成和軟件功能,對(duì)每一個(gè)實(shí)現(xiàn)的類進(jìn)行一一分析研究。在原JW06105型可編程觸摸鍵盤的結(jié)構(gòu)尺寸基礎(chǔ)上,通過更換軟件運(yùn)行平臺(tái)、調(diào)整設(shè)備的通訊方式等手段滿足不同條件下用戶要求,并在一定條件下替代JW06105型可編程觸摸鍵盤應(yīng)用于各標(biāo)準(zhǔn)臺(tái)上,銷售前景良好。本文采用串口通信接口方式,在 Qt環(huán)境下實(shí)現(xiàn)了可編程觸摸鍵盤應(yīng)用程序的開發(fā)。