From 13be8e5f3999c6168158edbbeca7cefeefab9951 Mon Sep 17 00:00:00 2001 From: Bai Date: Mon, 8 Nov 2021 18:12:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8C=89=E9=94=AE=E3=80=81led=E6=B5=8B?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- QCPShow.pro.user | 2 +- deviceservice.cpp | 109 +++++++++++++++++++++++++++++++++++++++++----- deviceservice.h | 12 ++++- main.cpp | 6 ++- mainwidget.cpp | 52 ++++++++++++++++++---- mainwidget.h | 15 ++++++- mainwidget.ui | 6 +-- 7 files changed, 175 insertions(+), 27 deletions(-) diff --git a/QCPShow.pro.user b/QCPShow.pro.user index 6fc4548..789e5c6 100644 --- a/QCPShow.pro.user +++ b/QCPShow.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/deviceservice.cpp b/deviceservice.cpp index 3d9eb7f..8e8fb4e 100644 --- a/deviceservice.cpp +++ b/deviceservice.cpp @@ -8,10 +8,13 @@ #define WIRING_PIN_LED 4 //GPIO.4 #define WIRING_PIN_KEY 3 //GPIO.3 #define Click_Overtime 50 +#define Press_Overtime 150 +#define DblClick_Difftime 800 DeviceService::DeviceService(QObject *parent) : QObject(parent) { key.flag = None; + key.lastFlag = None; key.lastState = KEY_Up; m_ledStatus = 0; m_keyStatus = 0; @@ -27,12 +30,13 @@ DeviceService::DeviceService(QObject *parent) : QObject(parent) qDebug() << "pinMode(WIRING_PIN_BTN,INPUT)"; #endif + //按键灯闪烁 timer1.setInterval(1000); - timer1.start(); - connect(&timer1,&QTimer::timeout,[=](){ - m_ledStatus ^= 1; - ledSet(m_ledStatus); - }); +// timer1.start(); +// connect(&timer1,&QTimer::timeout,[=](){ +// m_ledStatus ^= 1; +// ledSet(m_ledStatus); +// }); timer2.setInterval(50); timer2.start(); @@ -42,12 +46,16 @@ DeviceService::DeviceService(QObject *parent) : QObject(parent) // m_keyStatus = keyStatus; // qDebug() << "m_keyStatus " << m_keyStatus; // } - key.flag = (KeyFlag)keyDetection(); - if(key.flag != None){ - if(key.flag == Click){ - emit keyClicked(); - } - } + // key.flag = (KeyFlag)keyDetection(); + // if(key.flag != None){ + // if(key.flag == Click){ + // emit keyClicked(); + // } + // } + key.flag = (KeyFlag)keyDetection(); + if(key.flag != None){ + emit keyWorked(key.flag); + } }); } @@ -77,6 +85,7 @@ quint8 DeviceService::keyReadOnce() quint8 DeviceService::keyDetection() { +#if 0 key.flag = None; //清空按键标志 quint8 status = keyReadOnce(); if ((status == KEY_Down) && (key.lastState == KEY_Up)) @@ -90,4 +99,82 @@ quint8 DeviceService::keyDetection() } key.lastState = status; return key.flag; + +#else + key.flag = None; //清空按键标志(行为) + + //获取当前按键状态 + quint8 status = getbtnstatus();//获取当前按键状态********注意替换为防抖后的按键函数getbtnstatus() + + //判定标志行为 + if(status == KEY_Up) + { + if(key.lastState == KEY_Up) + { + //无意义 + }else if(key.lastState == KEY_Down) + { + int difftime = QTime::currentTime().secsTo(lastStateTime); + if(difftime >= Press_Overtime) + { + key.flag = Press; + }else if(difftime >= Click_Overtime) + { + key.flag = Click; + }else + { + //按键时间过短,无效 + } + }else + { + + } + } + + //判定组合行为 + if(key.flag != None) + { + if(key.flag == Click) + { + if(key.lastFlag == Click && (QTime::currentTime().secsTo(lastFlagTime)) >= DblClick_Difftime) + { + key.flag = Dbl_Click; + }else if(key.lastFlag == Dbl_Click && (QTime::currentTime().secsTo(lastFlagTime)) >= DblClick_Difftime) + { + key.flag = Tri_Click; + } + } + } + + if(key.flag != key.lastFlag) + { + key.lastFlag = key.flag; + lastFlagTime = QTime::currentTime(); + } + if(status != key.lastState) + { + key.lastState = status; + lastStateTime = QTime::currentTime(); + if(status == KEY_Down) + { + emit keyDown();//发送至mainwidget,用于记录按下时操作的患者是哪个 + } + } + + return key.flag; +#endif +} + +quint8 DeviceService::getbtnstatus() +{ + quint8 keyRead = keyReadOnce(); + if(keyRead == KEY_Down) + { + uint16_t i = Click_Overtime; + while(i--); + if(keyRead == keyReadOnce()) + { + return keyRead; + } + } } diff --git a/deviceservice.h b/deviceservice.h index f22a343..5765c68 100644 --- a/deviceservice.h +++ b/deviceservice.h @@ -3,6 +3,7 @@ #include #include +#include typedef enum{ GPIO_PIN_RESET = 0u, @@ -22,6 +23,7 @@ typedef enum{ typedef struct{ KeyFlag flag; + KeyFlag lastFlag; quint8 lastState; }KeyType; @@ -30,17 +32,23 @@ class DeviceService : public QObject Q_OBJECT public: explicit DeviceService(QObject *parent = 0); + int m_ledStatus,m_keyStatus; + QTimer timer1; + private: KeyType key; - int m_ledStatus,m_keyStatus; - QTimer timer1,timer2; + QTimer timer2; + QTime lastFlagTime, lastStateTime; signals: void keyClicked(); + void keyDown(); + void keyWorked(KeyFlag); public slots: void ledSet(int status); quint8 keyReadOnce(); quint8 keyDetection(); + quint8 getbtnstatus(); }; #endif // DEVICESERVICE_H diff --git a/main.cpp b/main.cpp index 4ee072a..67b6bea 100644 --- a/main.cpp +++ b/main.cpp @@ -28,7 +28,7 @@ int main(int argc, char *argv[]) DeviceService deviceService; //创建主窗体 - MainWidget w; + MainWidget w(&httpService,&websocketService,&deviceService); //绑定信号与槽 QObject::connect(&websocketService,&WebsocketService::wsConnectedStatusChanged, @@ -39,6 +39,10 @@ int main(int argc, char *argv[]) &w,&MainWidget::onPatientMergencyStatusChanged); QObject::connect(&deviceService,&DeviceService::keyClicked, &w,&MainWidget::onKeyClicked); + QObject::connect(&deviceService,&DeviceService::keyDown, + &w,&MainWidget::onKeyDown); + QObject::connect(&deviceService,&DeviceService::keyWorked, + &w,&MainWidget::onKeyWorked); QObject::connect(&w,&MainWidget::statusChanged,&httpService,&HttpService::updateStatus); QObject::connect(&w,&MainWidget::complexOneKeyStart,&httpService,&HttpService::onComplexOneKeyStart); diff --git a/mainwidget.cpp b/mainwidget.cpp index 0f7a88c..d2c64cb 100644 --- a/mainwidget.cpp +++ b/mainwidget.cpp @@ -7,7 +7,13 @@ QString namelist[] = {"传立春","传立夏","传立秋","传立冬"}; qint8 gindex = 0; -MainWidget::MainWidget(QWidget *parent) : +MainWidget::MainWidget(HttpService *httpService, + WebsocketService *websocketService, + DeviceService *deviceService, + QWidget *parent) : + m_httpService(httpService), + m_websocketService(websocketService), + m_deviceService(deviceService), QWidget(parent), ui(new Ui::MainWidget) { @@ -61,6 +67,8 @@ MainWidget::MainWidget(QWidget *parent) : m_curX = 0; connect(&m_lableScrollTimer,SIGNAL(timeout()),this,SLOT(lableScrollDisplay())); m_lableScrollTimer.start(10); + + this->setCursor(Qt::BlankCursor); } MainWidget::~MainWidget() @@ -73,16 +81,20 @@ void MainWidget::updateUi() // m_curX = 0;//内容超出显示区域时,更新患者信息显示从头开始滚动 //更新statusLabel - // ui->statusLabel->setText(QString("%1 | %2") - // .arg(m_wsConnectedStatus == 0 ? "未连接" : "已连接") - // .arg(m_patientEmergencyInfos.length()) - // ); +// ui->statusLabel->setText(QString("%1 | %2") +// .arg(m_wsConnectedStatus == 0 ? "未连接" : "已连接") +// .arg(m_patientEmergencyInfos.length()) +// ); if(m_wsConnectedStatus){ ui->LEDLabel->setStyleSheet("border-image: url(:/image/1LED_green.png);"); }else{ ui->LEDLabel->setStyleSheet("border-image: url(::/image/1LED_gray.png);"); } - ui->statusLabel->setText(QString::number(m_patientEmergencyInfos.length())); + if(m_patientEmergencyInfos.length() == 0){ + ui->statusLabel->setText(QString::number(m_patientEmergencyInfos.length())); + }else{ + ui->statusLabel->setText(QString::number(m_patientIndex+1) + "/" + QString::number(m_patientEmergencyInfos.length())); + } if(m_patientEmergencyInfos.length() == 0){ //不显示 @@ -135,8 +147,8 @@ void MainWidget::resizeEvent(QResizeEvent *event) //标题 // ui->textLabel->setGeometry(0,0,this->width(),(this->height()-30)/2); ui->countdownLabel->setGeometry(0,(this->height()-30)/2,this->width(),(this->height()-30)/2); - ui->LEDLabel->setGeometry(this->width()-120,this->height()-30,20,30); - ui->statusLabel->setGeometry(this->width()-80,this->height()-30,20,30); + ui->LEDLabel->setGeometry(this->width()-110,this->height()-30,30,30); + ui->statusLabel->setGeometry(this->width()-80,this->height()-30,55,30); } void MainWidget::lableScrollDisplay() @@ -180,6 +192,10 @@ void MainWidget::onNewPatientMergencyInfo(QString firstAidId, QString name, QStr PatientEmergencyInfo *pInfo = new PatientEmergencyInfo(firstAidId,name,content,realCountDownInSeconds); addPatientToList(pInfo); qDebug() << "MainWidget::onNewPatientMergencyInfo " << firstAidId << name << content << realCountDownInSeconds; + m_deviceService->timer1.start(); + m_deviceService->m_ledStatus ^= 1; + m_deviceService->ledSet(m_deviceService->m_ledStatus); + } void MainWidget::onPatientMergencyStatusChanged(QString firstAidId,QString time, QString status) @@ -213,6 +229,26 @@ void MainWidget::onKeyClicked() } } +void MainWidget::onKeyDown() +{ + keyDownPInfo = m_patientEmergencyInfos[m_patientIndex]; +} + +void MainWidget::onKeyWorked(KeyFlag flag) +{ + m_deviceService->timer1.stop(); + if(flag == Click){ + m_deviceService->m_ledStatus = 0; + m_deviceService->ledSet(m_deviceService->m_ledStatus); + }else if(flag == Dbl_Click){ + updateUi(); + }else if(flag == Press){ + deletePatientFromList(keyDownPInfo->id); + m_deviceService->m_ledStatus = 1; + m_deviceService->ledSet(m_deviceService->m_ledStatus); + } +} + void MainWidget::addPatientToList(PatientEmergencyInfo *info) { //1.如果有就删除,以保证同一个病人按两次应该重新开始计时 diff --git a/mainwidget.h b/mainwidget.h index c119365..7660c2d 100644 --- a/mainwidget.h +++ b/mainwidget.h @@ -5,6 +5,9 @@ #include "patientemergencyinfo.h" #include #include +#include "httpservice.h" +#include "websocketservice.h" +#include "deviceservice.h" namespace Ui { class MainWidget; @@ -15,13 +18,20 @@ class MainWidget : public QWidget Q_OBJECT public: - explicit MainWidget(QWidget *parent = 0); + explicit MainWidget(HttpService *httpService, + WebsocketService *websocketService, + DeviceService *deviceService, + QWidget *parent = 0); ~MainWidget(); void paintEvent(QPaintEvent *event); void resizeEvent(QResizeEvent *event); void mouseDoubleClickEvent(QMouseEvent *event); private: + HttpService *m_httpService; + WebsocketService *m_websocketService; + DeviceService *m_deviceService; + Ui::MainWidget *ui; QList m_patientEmergencyInfos; qint32 m_maxPatientNum,m_switchPatientInterval; @@ -33,6 +43,7 @@ private: QTimer m_lableScrollTimer; int m_width, m_height, m_curX, m_y; bool isFenzhen; + PatientEmergencyInfo *keyDownPInfo; public slots: void updateUi(); @@ -44,6 +55,8 @@ public slots: void lableScrollDisplay(); void onKeyClicked(); + void onKeyDown(); + void onKeyWorked(KeyFlag flag); signals: void statusChanged(QString firstAidId,QString status); diff --git a/mainwidget.ui b/mainwidget.ui index 28776a6..cb12e9d 100644 --- a/mainwidget.ui +++ b/mainwidget.ui @@ -48,9 +48,9 @@ - 950 + 1050 390 - 151 + 51 21 @@ -63,7 +63,7 @@ - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignCenter