diff --git a/QCPShow.pro b/QCPShow.pro index b0f4a5e..387c40d 100644 --- a/QCPShow.pro +++ b/QCPShow.pro @@ -11,6 +11,13 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets CONFIG += C++11 + +win32{ + # win32 libs +}else{ + LIBS += -l wiringPi +} + TARGET = QCPShow TEMPLATE = app @@ -37,7 +44,8 @@ SOURCES += main.cpp\ httpservice.cpp \ mainconfig.cpp \ websocketservice.cpp \ - patientemergencyinfo.cpp + patientemergencyinfo.cpp \ + deviceservice.cpp HEADERS += mainwidget.h \ serial/serialport.h \ @@ -49,7 +57,8 @@ HEADERS += mainwidget.h \ httpservice.h \ mainconfig.h \ websocketservice.h \ - patientemergencyinfo.h + patientemergencyinfo.h \ + deviceservice.h FORMS += mainwidget.ui diff --git a/deviceservice.cpp b/deviceservice.cpp new file mode 100644 index 0000000..d33ad08 --- /dev/null +++ b/deviceservice.cpp @@ -0,0 +1,124 @@ +#include "deviceservice.h" +#ifdef Q_OS_LINUX +#include +#else +#include +#endif + +#define WIRING_PIN_LED 4 //GPIO.4 +#define WIRING_PIN_KEY 3 //GPIO.3 + +DeviceService::DeviceService(QObject *parent) : QObject(parent) +{ + key.flag = None; + key.lastState = None; + m_ledStatus = 0; + m_keyStatus = 0; + +#ifdef Q_OS_LINUX + wiringPiSetup(); + pinMode(WIRING_PIN_LED,OUTPUT);//LED输出模式 可选值:INPUT、OUTPUT、PWM_OUTPUT,GPIO_CLOCK + pinMode(WIRING_PIN_KEY,INPUT); //KEY输入模式 + pullUpDnControl(WIRING_PIN_KEY,PUD_UP); //KEY设置上拉 +#else + qDebug() << "wiringPiSetup()"; + qDebug() << "pinMode(WIRING_PIN_LED,OUTPUT)"; + qDebug() << "pinMode(WIRING_PIN_BTN,INPUT)"; +#endif + + timer1.setInterval(1000); + timer1.start(); + connect(&timer1,&QTimer::timeout,[=](){ + m_ledStatus ^= 1; + ledSet(m_ledStatus); + }); + + timer2.setInterval(10); + timer2.start(); + connect(&timer2,&QTimer::timeout,[=](){ + quint8 keyStatus = keyReadOnce(); + if(keyStatus != m_keyStatus){ + m_keyStatus = keyStatus; + qDebug() << "m_keyStatus " << m_keyStatus; + } + }); +} + +void DeviceService::ledSet(int status) +{ +#ifdef Q_OS_LINUX + digitalWrite(WIRING_PIN_LED,status == 1 ? LOW : HIGH);//'HIGH'代表高电平,’LOW‘则为低电平 +#else + qDebug() << "LED set: " << status; +#endif +} + +quint8 DeviceService::keyReadOnce() +{ +#ifdef Q_OS_LINUX + return digitalRead(WIRING_PIN_KEY); +#else + qDebug() << "keyReadOnce()"; + return 0; +#endif +} + +//quint8 DeviceService::keyDetection() +//{ +// key.flag = None; //清空按键标志 +// if ((keyReadOnce() == KEY_Up) && (key.lastState == KEY_Down)) +// { +// uint16_t i = Click_Overtime; +// uint16_t j = Press_Overtime; +// key.flag = Click; //先确定按键标志为单击 +// key.lastState = KEY_Up; +// //判断是否为长按 +// while ((tls_gpio_read(gpio_pin) == KEY_Up)&&(j--)) +// { +// //printf("j = %d\r\n", j); +// if (j == 1) +// { +// KEY3.KEY_Flag = Press; //按键标志为长按 +// KEY3.KEY_LastState = KEY_Up; +// break; +// } +// delay_ms(50); +// } +// //在确定标志已经为单击的前提下,判断是否为双击 +// if (KEY3.KEY_Flag == Click) +// { +// while (i--) +// { +// if ((tls_gpio_read(gpio_pin) == KEY_Up)) +// { +// KEY3.KEY_Flag = Dbl_Click; +// KEY3.KEY_LastState = KEY_Up; +// while (tls_gpio_read(gpio_pin) == KEY_Up); +// break; +// } +// delay_ms(50); +// } +// } +// //在确定标志为已经为双击的前提下,判断是否为三击 +// if (KEY3.KEY_Flag == Dbl_Click) +// { +// while (i--) +// { +// if (tls_gpio_read(gpio_pin) == KEY_Up) +// { +// KEY3.KEY_Flag = Tri_Click; +// KEY3.KEY_LastState = KEY_Up; +// while (tls_gpio_read(gpio_pin) == KEY_Up); +// break; +// } +// delay_ms(50); +// } +// } +// } +// //将按键置为松开状态,以供下一次检测 +// if (tls_gpio_read(gpio_pin) == KEY_Down) +// { +// KEY3.KEY_LastState = KEY_Down; +// } +// return KEY3.KEY_Flag; +//} diff --git a/deviceservice.h b/deviceservice.h new file mode 100644 index 0000000..309e6c1 --- /dev/null +++ b/deviceservice.h @@ -0,0 +1,45 @@ +#ifndef DEVICESERVICE_H +#define DEVICESERVICE_H + +#include +#include + +typedef enum{ + GPIO_PIN_RESET = 0u, + GPIO_PIN_SET +} GPIO_PinState; + +typedef enum{ + None = (uint8_t)0, + Click = (uint8_t)1, + Dbl_Click = (uint8_t)2, + Tri_Click = (uint8_t)3, + Press = (uint8_t)4, +}KeyFlag; + +#define KEY_Up GPIO_PIN_SET +#define KEY_Down GPIO_PIN_RESET + +typedef struct{ + KeyFlag flag; + quint8 lastState; +}KeyType; + +class DeviceService : public QObject +{ + Q_OBJECT +public: + explicit DeviceService(QObject *parent = 0); +private: + KeyType key; + int m_ledStatus,m_keyStatus; + QTimer timer1,timer2; +signals: + +public slots: + void ledSet(int status); + quint8 keyReadOnce(); + //quint8 keyDetection(); +}; + +#endif // DEVICESERVICE_H diff --git a/main.cpp b/main.cpp index d5f10a2..7b9b052 100644 --- a/main.cpp +++ b/main.cpp @@ -4,6 +4,7 @@ #include "httpservice.h" #include "websocketservice.h" #include "patientemergencyinfo.h" +#include "deviceservice.h" int main(int argc, char *argv[]) { @@ -20,6 +21,9 @@ int main(int argc, char *argv[]) WebsocketService websocketService; websocketService.connectToServer(MainConfig::wsUrl); + //初始化DeviceInfo,并自动初始化IO配置 + DeviceService deviceService; + //创建主窗体 MainWidget w; @@ -33,8 +37,8 @@ int main(int argc, char *argv[]) QObject::connect(&w,&MainWidget::statusChanged,&httpService,&HttpService::updateStatus); -// w.show(); - w.showFullScreen(); + w.show(); +// w.showFullScreen(); return a.exec(); } diff --git a/setting.ini b/setting.ini new file mode 100644 index 0000000..9bdbde9 --- /dev/null +++ b/setting.ini @@ -0,0 +1,27 @@ +[MAIN] +;最大患者数量 +maxPatientNum = 5 +;切换病人时间(s) +switchPatientInterval = 5 + +[USER] +;登录用户名 +username = shoufeichu +;登录密码 +password = 123456 + +[HTTP] +;登录请求URL +loginUrl = http://test.tall.wiki/gateway/tall3/v3.0/users/signin +;发送身份证信息URL +sendUserInfoUrl = https://test.tall.wiki/gateway/qcp/v3.0/button/idCardDiscern +;一键启动URL +oneKeyStartUrl = https://test.tall.wiki/gateway/qcp/v3.0/button/buttonStart +;服务状态改变URL(rgb) +serviceStatusChangedUrl = https://test.tall.wiki/gateway/qcp/v3.0/button/updateStatus + +[WEBSOCKET] +;Websocket URL +wsUrl = wss://test.tall.wiki/websocket/message/v4.0/ws +;Websocket心跳间隔(s) +wsHeartInterval = 10 diff --git a/websocketservice.cpp b/websocketservice.cpp index a6b9a83..918b687 100644 --- a/websocketservice.cpp +++ b/websocketservice.cpp @@ -43,7 +43,7 @@ void WebsocketService::wsSendAuthMsg() QString rawJson = "{\"toDomain\":\"Server\",\"data\":\"{\\\"type\\\":\\\"Auth\\\",\\\"data\\\":{\\\"token\\\":\\\"%1\\\"}}\"}"; QString json = rawJson.arg(MainConfig::token); m_webSocket.sendTextMessage(json); - qDebug() << QDateTime::currentDateTime().toString("hh:mm:ss") << "wsSendAuthMsg: " << json; + //qDebug() << QDateTime::currentDateTime().toString("hh:mm:ss") << "wsSendAuthMsg: " << json; } void WebsocketService::wsSendPingMsg() @@ -56,7 +56,7 @@ void WebsocketService::wsSendPingMsg() QString rawJson = "{\"toDomain\":\"Server\",\"data\":\"{\\\"type\\\":\\\"Ping\\\"}\"}"; QString json = rawJson; m_webSocket.sendTextMessage(json); - qDebug() << QDateTime::currentDateTime().toString("hh:mm:ss") << "wsSendPingMsg: " << json; + //qDebug() << QDateTime::currentDateTime().toString("hh:mm:ss") << "wsSendPingMsg: " << json; } void WebsocketService::sendWsAckMessage(QString ackId) @@ -65,12 +65,13 @@ void WebsocketService::sendWsAckMessage(QString ackId) QString rawJson = "{\"toDomain\":\"Server\",\"data\":\"{\\\"type\\\":\\\"Ack\\\",\\\"data\\\":{\\\"ackId\\\":\\\"%1\\\"}}\"}"; QString json = rawJson.arg(ackId); m_webSocket.sendTextMessage(json); + //qDebug() << QDateTime::currentDateTime().toString("hh:mm:ss") << "sendWsAckMessage: " << json; } void WebsocketService::onTextMessageReceived(const QString &message) { - qDebug() << QDateTime::currentDateTime().toString("hh:mm:ss") << "wsRecvMsg: " << message.toUtf8(); + //qDebug() << QDateTime::currentDateTime().toString("hh:mm:ss") << "wsRecvMsg: " << message.toUtf8(); //解析响应中的data字段,data又是一个json字符串 QJsonParseError jerror; QJsonDocument jdoc; @@ -109,7 +110,7 @@ void WebsocketService::onTextMessageReceived(const QString &message) }else if(notifyType == "Pong"){ qDebug() << "Pong Message"; }else if(notifyType == "ChannelStatus"){ - qDebug() << "Auth Message"; + //qDebug() << "Auth Message"; } }