本次項(xiàng)目開(kāi)發(fā)環(huán)境:gec6818,QT5.14.2,SecureCRT。
所使用的相關(guān)技術(shù):c/s架構(gòu),STL庫(kù),C++封裝,標(biāo)準(zhǔn)化代碼編寫
實(shí)現(xiàn)的功能:用戶登錄頁(yè)面,食品分區(qū)在不同頁(yè)面,用戶點(diǎn)餐頁(yè)面,用戶買單頁(yè)面,數(shù)據(jù)整合并發(fā)送至后臺(tái),后臺(tái)成功接受數(shù)據(jù),返回主頁(yè)面。
1、gec6818開(kāi)發(fā)板的特點(diǎn)(性能強(qiáng)大):
? ? ? ? a:GEC6818開(kāi)發(fā)平臺(tái),核心板采用10層板工藝設(shè)計(jì),確保穩(wěn)定可靠。
? ? ? ? b:該平臺(tái)搭載三星Cortex-A53系列高性能八核處理器S5P6818,最高主頻高達(dá)1.4GHz。
? ? ? ? c:開(kāi)發(fā)板留有豐富的外設(shè),支持千兆以太網(wǎng)、板載LVDS接口、MIPI接口、USB接口等。
? ? ? ? d:可應(yīng)用于嵌入式Linux和Android等操作系統(tǒng)的驅(qū)動(dòng)、應(yīng)用開(kāi)發(fā)。
? ? ? ? c:搭載7.0英寸LCD屏支持32位真彩色,觸摸屏使用電容屏觸點(diǎn)多達(dá)1,536,000個(gè)以上。
2、連接電源,串口和網(wǎng)絡(luò)接口,通過(guò)SecureCRT來(lái)設(shè)置開(kāi)發(fā)板。
3、編寫代碼:
? ? ? ? 思路:初始化顯示屏和觸摸屏,生成自定義坐標(biāo)X軸Y軸,根據(jù)觸摸坐標(biāo)發(fā)出的信號(hào)來(lái)響應(yīng)事件。通過(guò)STL庫(kù)中的正向迭代器使文件中的圖片按順序輸出,在通過(guò)TCP通信發(fā)送整合的數(shù)據(jù)到服務(wù)器。為防止項(xiàng)目代碼又長(zhǎng)又丑,采用分文件編寫,精簡(jiǎn),直觀也方便查詢。
? ? ? ? 注意:本次項(xiàng)目只展現(xiàn)部分重要代碼
main.cpp
#include <iostream>
using namespace std;
#include "application.h"
int main()
{
Application a1; //自定義開(kāi)始狀態(tài)
a1.exec(); //只做一個(gè)項(xiàng)目入口
return 0;
}
application.cpp
#include "application.h"
Application::Application()
{
m_state = E_APP_STATE_START; //初始化狀態(tài),使其固定在開(kāi)始狀態(tài)
}
//這里設(shè)計(jì)的是按流程一步步往下走
int Application::exec()
{
while(1)
{
switch (m_state) {
case E_APP_STATE_NONE:
break;
case E_APP_STATE_START://進(jìn)入開(kāi)始畫面的狀態(tài)
{
staticInterface s1;
s1.show();
}
m_state = E_APP_STATE_LOGIN;
break;
case E_APP_STATE_LOGIN://進(jìn)入登錄界面的狀態(tài)
{
LoginInterface l1;
l1.show();
}
m_state = E_APP_STATE_MAIN;
break;
case E_APP_STATE_MAIN://進(jìn)入主界面的狀態(tài)
{
MainWidget m1;
m1.show();
}
m_state = E_APP_STATE_LOGIN;
break;
}
}
}
??staticInterface.cpp
#include "staticinterface.h"
在.h文件中類私有成員里面定義的容器
//std::list<std::string> m_bmpList; //定義容器
staticInterface::staticInterface()
{
//初始化容器,將staticBmp文件夾里面的圖片按順序放入容器中
m_bmpList = Dir::entryList("./bmp/staticBmp");
}
void staticInterface::show()
{
Bmp b1;
//使用常量正向迭代器
for(std::list<std::string>::iterator it = m_bmpList.begin() ; it!=m_bmpList.end(); it++)
{
b1.setFileName(*it);
b1.show(); //將容器中的圖片一個(gè)個(gè)顯示,1秒的間隔,形成一個(gè)簡(jiǎn)單的開(kāi)始動(dòng)畫動(dòng)圖效果
sleep(1);
}
}
?登錄頁(yè)面代碼過(guò)長(zhǎng)切基本上重復(fù)代碼,不做演示,其原理是固定x軸和y軸的大小,當(dāng)點(diǎn)擊時(shí)觸發(fā)信號(hào),顯示數(shù)字并記錄在類內(nèi)中,同時(shí)設(shè)置9個(gè)數(shù)字也就是9個(gè)x軸和y軸的大小,點(diǎn)擊設(shè)置好的確定按鈕區(qū),即可進(jìn)入下一個(gè)頁(yè)面。
maininterface.cpp
void MainWidget::show()
{
//顯示主界面圖片
Bmp b1("./bmp/main.bmp");
b1.show();
//顯示菜單界面圖片
m_menuWidget->show();
SendData s1;
while(1){
int x,y;
//等待觸摸屏 觸摸
TouchSreen touch;
touch.waitTouch(x,y);
if(x>=0 && x<800 && y>=0 && y<480) //點(diǎn)擊到了 菜單界面區(qū)域
{
std::cout<<"點(diǎn)擊到了菜單界面區(qū)域...."<<std::endl;
//判斷當(dāng)前點(diǎn)擊的是 哪個(gè) 菜單界面的按鈕,然后切換不同的 頁(yè)面
//這里采用了枚舉
m_menuWidget->setPageWidget(x,y);
}
}
}
menuinterface.cpp
int MenuInterface::setPageWidget(int x, int y)
{
int m_page;
bool isExit = false;
//根據(jù)點(diǎn)擊的不同 坐標(biāo) ,判斷點(diǎn)擊的是哪個(gè)按鈕,然后進(jìn)行 換頁(yè)
if(x>=0 && x<=120 && y>=0 && y<100) //第一頁(yè) --縮略圖
{
std::cout<<"肉太特么香了"<<std::endl;
m_page = E_MENU_PAGE1;
}
else if(x>=0 && x<=120 && y>=100 && y<200)//第二頁(yè)
{
std::cout<<"蔬菜太特么健康了"<<std::endl;
m_page = E_MENU_PAGE2;
}
else if(x>=0 && x<=120 && y>=200 && y<300)//第3頁(yè)
{
std::cout<<"水果太特么好看了"<<std::endl;
m_page = E_MENU_PAGE3;
}
else if(x>=0 && x<=120 && y>=300 && y<400)//第4頁(yè)
{
std::cout<<"飲料太特么爽了"<<std::endl;
m_page = E_MENU_PAGE4;
}
else if(x>=740 && x<800 && y>=420 && y<480)//結(jié)算頁(yè)面
{
std::cout<<"結(jié)算中......."<<std::endl;
m_page = E_MENU_PAGE5;
}
}
//后面有做一個(gè)圖片縮略圖,就不展示了
只展示一個(gè),展示肉區(qū)
page1interface.cpp
void Page1Interface::show()
{
//在 界面的右邊 120 ~800 這個(gè)區(qū)域顯示 四張 縮小后的圖片
int startX = 200;
int startY = 50;
int i=0;
//使用stl庫(kù)的正向迭代器順序輸出圖片
for(std::list<std::string>::iterator it=m_bmpList.begin(); it!=m_bmpList.end(); it++,i++)
{
Bmp b1(it->data());
switch (i%4) {
case 0:
b1.scaleShow(startX,startY);
break;
case 1:
b1.scaleShow(startX+200+100,startY);
break;
case 2:
b1.scaleShow(startX,startY+120+80);
break;
case 3:
b1.scaleShow(startX+200+100,startY+120+80);
break;
}
}
}
//設(shè)置加菜減菜圖片設(shè)計(jì)
void Page1Interface::addShow()
{
Bmp b1("./bmp/jian.bmp"); //60*60
b1.show(200,178);
Bmp b2("./bmp/jia.bmp"); //60*60
b2.show(340,178);
Bmp b3("./bmp/jian.bmp");
b3.show(500,178);
Bmp b4("./bmp/jia.bmp");
b4.show(640,178);
Bmp b5("./bmp/jian.bmp");
b5.show(200,(178+120+16+60));
Bmp b6("./bmp/jia.bmp");
b6.show(340,(178+120+16+60));
Bmp b7("./bmp/jian.bmp");
b7.show(500,(178+120+16+60));
Bmp b8("./bmp/jia.bmp");
b8.show(640,(178+120+16+60));
}
?然后就是計(jì)算肉區(qū)點(diǎn)餐的數(shù)量,設(shè)置每個(gè)菜的價(jià)格,同一保存至一個(gè)類中,由于代碼過(guò)長(zhǎng)且重復(fù),暫不予展示。其他菜區(qū)也是同樣的操作不展示。
初始化TCP通信,發(fā)送數(shù)據(jù)
//創(chuàng)建接口
t1.applyInterface(); //封裝成函數(shù)
ssize_t wr_size;
wr_size = write(t1.return_skt_fd(), buffer, strlen(buffer));//接受數(shù)據(jù),擁有阻塞,如果沒(méi)有數(shù)據(jù)將會(huì)阻塞在這里
if(wr_size == -1)//出錯(cuò)了
{
perror("讀取出錯(cuò),那他走\(yùn)n");
return -1;
}
//關(guān)閉接口
t1.closeCustomer();
此時(shí)后臺(tái)成功接受數(shù)據(jù)
最后一步,將代碼燒寫進(jìn)開(kāi)發(fā)板
? ? ? ? 通過(guò)SecureCRT串口連接開(kāi)發(fā)板,傳輸編譯好的arm文件(arm-linux-g++),再將項(xiàng)目所需圖片下載進(jìn)開(kāi)發(fā)板,運(yùn)行,實(shí)驗(yàn),無(wú)BUG,數(shù)據(jù)接受完整,ok交差。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-521091.html
項(xiàng)目視頻演示連接:https://live.csdn.net/v/287185文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-521091.html
到了這里,關(guān)于基于GEC6818的智能火鍋點(diǎn)餐系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!