smart-greenhouse/widget.cpp
2022-01-20 16:13:58 +08:00

481 lines
16 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "widget.h"
#include "ui_widget.h"
#include <QMenu>
#include <QtGui>
#include <QtNetwork/QTcpSocket>
#include <QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//窗口名字
this->setWindowTitle("智能家居控制平台");
//开关窗口背景
//设置托盘
setWindowIcon(QIcon(":/picture/traycon.png"));
trayIcon = new QSystemTrayIcon(QIcon(":/picture/traycon.png"), this);
//设置系统托盘图标
trayIcon->setToolTip("智能家居控制平台");
QMenu * menu = new QMenu;
menu->addAction(tr("退出"), qApp, SLOT(quit()));
trayIcon->setContextMenu(menu);
//创建套接字,和A9服务器取得连接
parentSocket = new QTcpSocket(this);
parentSocket->connectToHost("192.168.200.105", 7777);
QByteArray ThisIsWidget;
ThisIsWidget.append("ThisIsWidget");
qDebug() << "ThisIsWidget " << ThisIsWidget;
this->parentSocket->write(ThisIsWidget);
//电灯图标
lightPix.load(":/picture/light.png");
ui->lightPictureLabel->setPixmap(lightPix);
ui->lightPictureLabel->setScaledContents(true);
//空调图标
airconditionPix.load(":/picture/airconditioner.png");
ui->airconditionPicyureLabel->setPixmap(airconditionPix);
ui->airconditionPicyureLabel->setScaledContents(true);
//摄像头图标
cameraPix = new QPixmap();
cameraPix->load(":/picture/camera.png");
ui->cameraPictureLabel->setPixmap(*cameraPix);
ui->cameraPictureLabel->setScaledContents(true);
//温度符号图标
temperatureSymbol.load(":/picture/temperatureSymbol.png");
ui->temperationSymbolLabel->setPixmap(temperatureSymbol);
ui->temperationSymbolLabel->setScaledContents(true);
//湿度符号图标
humiditySymbol.load(":/picture/humiditySymbol.png");
ui->humiditySymbolLabel->setPixmap(humiditySymbol);
ui->humiditySymbolLabel->setScaledContents(true);
//设置电灯打开图标
lightONPix.load(":/picture/lightON.png");
//设置电灯关闭图标
lightOFFPix.load(":/picture/lightOFF.png");
//设置空调打开图标
airconditionONPix.load(":/picture/airconditionerON.png");
//设置空调关闭图标
airconditionOFFPix.load(":/picture/airconditionerOFF.png");
//摄像头配置
cameraPix = new QPixmap();
this->childSocket = NULL;
ui->cameraStartBtn->setEnabled(true);//开启视频按钮的初值给true
ui->cameraStopBtn->setEnabled(false);//关闭视频按钮的初值给false
ui->cameraPage->setMinimumSize(640,480);
ui->cameraPage->setMaximumSize(640,480);
ui->cameraShowPageLabel->setMinimumSize(480,320);
ui->cameraShowPageLabel->setMaximumSize(480,320);
//接收到设置安全阈值页面发来的信号,并把页面从安全阈值设置页面切换成主页面
connect(&setValue, SIGNAL(setSecureValueToWidgetSignal()), this, SLOT(setSecureValueTurnWidgetSlot()));
//接收到历史数据页面发来的信号,并把页面从历史数据页面切换成主页面
connect(&historyData, SIGNAL(historyDataToWidgetSignal()), this, SLOT(historyDataTurnWidgetSlot()));
//接收来自服务器的信息
connect(parentSocket, SIGNAL(readyRead()), this, SLOT(recvServerDataSlot()));
}
Widget::~Widget()
{
delete ui;
parentSocket->close();
parentSocket = NULL;
}
void Widget::on_livingLightONOFFBtn_clicked()
{
if(ui->livingLightONOFFBtn->text() == "客厅灯 ON")
{
//显示电灯打开的图标
ui->livingLightONOFFPictureLabel->setPixmap(lightONPix);
ui->livingLightONOFFPictureLabel->setScaledContents(true);
//改变电灯开关上的文本
ui->livingLightONOFFBtn->setText("客厅灯 OFF");
//发送命令给A9服务器,打开客厅灯
QByteArray openlivingroomLight;
openlivingroomLight.append("Livingroom:ON");
qDebug() << "openlivingroomLight " << openlivingroomLight;
this->parentSocket->write(openlivingroomLight);
}
else if(ui->livingLightONOFFBtn->text() == "客厅灯 OFF")
{
//显示电灯关闭图标
ui->livingLightONOFFPictureLabel->setPixmap(lightOFFPix);
ui->livingLightONOFFPictureLabel->setScaledContents(true);
//改变电灯开关上的文本
ui->livingLightONOFFBtn->setText("客厅灯 ON");
//发送命令给A9服务器,关闭客厅灯
QByteArray closelivingroomLight;
closelivingroomLight.append("Livingroom:OFF");
qDebug() << "closelivingroomLight " << closelivingroomLight;
this->parentSocket->write(closelivingroomLight);
}
}
void Widget::on_bedroomLightONOFFBtn_clicked()
{
if(ui->bedroomLightONOFFBtn->text() == "卧室灯 ON")
{
//显示电灯打开的图标
ui->bedroomLightONOFFPictureLabel->setPixmap(lightONPix);
ui->bedroomLightONOFFPictureLabel->setScaledContents(true);
//改变电灯开关上的文本
ui->bedroomLightONOFFBtn->setText("卧室灯 OFF");
//发送命令给A9服务器,打开卧室灯
QByteArray openBedroomLight;
openBedroomLight.append("Bedroom:ON");
qDebug() << "openBedroomLight " << openBedroomLight;
this->parentSocket->write(openBedroomLight);
}
else if(ui->bedroomLightONOFFBtn->text() == "卧室灯 OFF")
{
//显示电灯关闭图标
ui->bedroomLightONOFFPictureLabel->setPixmap(lightOFFPix);
ui->bedroomLightONOFFPictureLabel->setScaledContents(true);
//改变电灯开关上的文本
ui->bedroomLightONOFFBtn->setText("卧室灯 ON");
//发送命令给A9服务器,关闭卧室灯
QByteArray closeBedroomLight;
closeBedroomLight.append("Bedroom:OFF");
qDebug() << "closeBedroomLight " << closeBedroomLight;
this->parentSocket->write(closeBedroomLight);
}
}
void Widget::on_lightBtn_clicked()
{
ui->stackedWidget->setCurrentWidget(ui->lightPage);
//按下灯光按钮后让灯光按钮变成不可选状态,空调和摄像头按钮变为可选状态
ui->lightBtn->setEnabled(false);
ui->airconditionBtn->setEnabled(true);
ui->cameraBtn->setEnabled(true);
}
void Widget::on_airconditionBtn_clicked()
{
ui->stackedWidget->setCurrentWidget(ui->airconditionPage);
//按下空调按钮后让空调按钮变成不可选状态,灯光按钮和摄像头按钮变为可选状态
ui->airconditionBtn->setEnabled(false);
ui->lightBtn->setEnabled(true);
ui->cameraBtn->setEnabled(true);
}
void Widget::on_cameraBtn_clicked()
{
ui->stackedWidget->setCurrentWidget(ui->cameraPage);
//按下摄像头按钮后摄像头按钮变为不可选状态,灯光和空调按钮变为可选状态
ui->cameraBtn->setEnabled(false);
ui->lightBtn->setEnabled(true);
ui->airconditionBtn->setEnabled(true);
}
void Widget::on_airconditionONOFFBtn_clicked()
{
if(ui->airconditionONOFFBtn->text() == "空调 ON")
{
//显示空调开的图标
ui->airconditionONOFFPictureLabel->setPixmap(airconditionONPix);
ui->airconditionONOFFPictureLabel->setScaledContents(true);
//改变按钮上的文本为空调关闭
ui->airconditionONOFFBtn->setText("空调 OFF");
//发送命令给A9服务器,打开空调
QByteArray openAirconditionLight;
openAirconditionLight.append("Aircondition:ON");
qDebug() << "openAirconditionLight " << openAirconditionLight;
this->parentSocket->write(openAirconditionLight);
}
else if(ui->airconditionONOFFBtn->text() == "空调 OFF")
{
//显示空调关闭的图标
ui->airconditionONOFFPictureLabel->setPixmap(airconditionOFFPix);
ui->airconditionONOFFPictureLabel->setScaledContents(true);
//改变按钮上的字
ui->airconditionONOFFBtn->setText("空调 ON");
//发送命令给A9服务器,打开空调
QByteArray closeAirconditionLight;
closeAirconditionLight.append("Aircondition:OFF");
qDebug() << "closeAirconditionLight " << closeAirconditionLight;
this->parentSocket->write(closeAirconditionLight);
}
}
//摄像头页面开始按钮
void Widget::on_cameraStartBtn_clicked()
{
if(NULL == this->childSocket)
{
this->childSocket = new QTcpSocket();
this->childSocket->connectToHost("192.168.200.105",8888);
//发送信号者为socket这个实例,发送的信号是connected(),接收者为Form,槽函数为msconnected()
connect(this->childSocket,SIGNAL(connected()),this,SLOT(msconnected()));
connect(this->childSocket,SIGNAL(disconnected()),this,SLOT(msdisconnected()));
ui->cameraStartBtn->setEnabled(false);//开启视频后让此按钮不可选择
ui->cameraStopBtn->setEnabled(true);//已经开启视频后让关闭视频按钮可选择(true)
}
else
{
ui->cameraStartBtn->setEnabled(false);
ui->cameraStopBtn->setEnabled(true);
timer->start(100);
}
}
void Widget::msconnected()
{
qDebug() << "connected";
timer = new QTimer(this);
connect(timer,SIGNAL(timeout()),this,SLOT(updatepic()));
timer->start(100);
}
//发送不连接请求
void Widget::msdisconnected()
{
if(timer->isActive())
timer->stop();
ui->cameraStartBtn->setEnabled(true);//按下关闭视频按钮后让开启视频按钮可选择(true)
ui->cameraStopBtn->setEnabled(false);//按下关闭视频按钮后让关闭按钮不可选择(false)
this->childSocket->close();
this->childSocket = NULL;
}
//连续读取视频信息
void Widget::updatepic()
{
unsigned int ret;
const char *request = "pic"; //请求命令
char response[20]; //服务器发给QT的回复
char *len; //
unsigned int piclen; //图片长度
char picbuf[1024 * 1024]; //存放图片
ret = this->childSocket->write(request, strlen(request)); //发送请求图片命令
if (ret != strlen(request)) {
qDebug() << "send request failed";
timer->stop();
this->childSocket->close();
}
this->childSocket->flush(); //刷新socket
this->childSocket->waitForReadyRead(30000);
memset(response, 0, sizeof(response));
ret = this->childSocket->read(response, sizeof(response));
if (ret != sizeof(response)) {
qDebug() << "recv response failed";
timer->stop();
this->childSocket->close();
this->childSocket = NULL;
}
len = strstr(response, "len");
if (len == NULL) {
qDebug() << "response header is error";
timer->stop();
this->childSocket->close();
this->childSocket = NULL;
}
*len = '\0';
//从response中读取图片长度
piclen = atoi(response);
unsigned int total = 0;
//循环读取pic信息
while (total < piclen) {
ret = this->childSocket->read(picbuf+total, piclen-total);
if (ret < 0) {
qDebug() << "recv pic failed" << ret;
timer->stop();
this->childSocket->close();
this->childSocket = NULL;
return;
} else if (ret == 0) {
this->childSocket->waitForReadyRead(30000);
continue;
} else
total += ret;
}
cameraPix->loadFromData((const uchar *)picbuf,piclen,"JPEG");
ui->cameraShowPageLabel->setPixmap(*cameraPix);
}
//暂停显示图像
void Widget::on_cameraStopBtn_clicked()
{
qDebug() << "total:----11--------------- ";
if(timer->isActive())
timer->stop();
qDebug() << "total:------------------- ";
ui->cameraStartBtn->setEnabled(true);//按下关闭视频按钮后让开启视频按钮变黑(true)
ui->cameraStopBtn->setEnabled(false);//按下关闭视频按钮后让关闭按钮变灰(false)
}
//接收到设置安全阈值页面发来的信号,并把页面从安全阈值设置页面切换成主页面
void Widget::setSecureValueTurnWidgetSlot()
{
//隐藏设置安全阈值界面,显示主页面
this->show();
setValue.hide();
}
//设置安全阈值按钮,切换界面到设置安全阈值界面
void Widget::on_setSecureValueBtn_clicked()
{
//隐藏主页面,显示设置安全阈值界面
this->hide();
setValue.show();
}
//历史数据按钮,切换界面到历史数据界面
void Widget::on_historyDataBtn_clicked()
{
//隐藏主界面,显示历史数据界面
this->hide();
historyData.show();
}
//接收到历史数据页面发来的信号,并把页面从历史数据页面切换成主页面
void Widget::historyDataTurnWidgetSlot()
{
//隐藏历史数据页面,显示主页面
this->show();
historyData.hide();
}
//接收来自服务器的信息
void Widget::recvServerDataSlot()
{
int i = 0;
QByteArray arr = parentSocket->readAll();
qDebug() << "widget recv = " << arr;
for(i = 0; i < 11; i++)
{
if(i == 0)
{
if((int)arr[i] == 1)
{
//显示电灯打开的图标
ui->livingLightONOFFPictureLabel->setPixmap(lightONPix);
ui->livingLightONOFFPictureLabel->setScaledContents(true);
//改变电灯开关上的文本
ui->livingLightONOFFBtn->setText("客厅灯 OFF");
}
else if((int)arr[i] == 0)
{
//显示电灯关闭图标
ui->livingLightONOFFPictureLabel->setPixmap(lightOFFPix);
ui->livingLightONOFFPictureLabel->setScaledContents(true);
//改变电灯开关上的文本
ui->livingLightONOFFBtn->setText("客厅灯 ON");
}
}
else if(i == 1)
{
if((int)arr[i] == 1)
{
//显示电灯打开的图标
ui->bedroomLightONOFFPictureLabel->setPixmap(lightONPix);
ui->bedroomLightONOFFPictureLabel->setScaledContents(true);
//改变电灯开关上的文本
ui->bedroomLightONOFFBtn->setText("卧室灯 OFF");
}
else if((int)arr[i] == 0)
{
//显示电灯关闭图标
ui->bedroomLightONOFFPictureLabel->setPixmap(lightOFFPix);
ui->bedroomLightONOFFPictureLabel->setScaledContents(true);
//改变电灯开关上的文本
ui->bedroomLightONOFFBtn->setText("卧室灯 ON");
}
}
else if(i == 2)
{
if((int)arr[i] == 1)
{
//显示空调开的图标
ui->airconditionONOFFPictureLabel->setPixmap(airconditionONPix);
ui->airconditionONOFFPictureLabel->setScaledContents(true);
//改变按钮上的文本为空调关闭
ui->airconditionONOFFBtn->setText("空调 OFF");
}
else if((int)arr[i] == 0)
{
//显示空调关闭的图标
ui->airconditionONOFFPictureLabel->setPixmap(airconditionOFFPix);
ui->airconditionONOFFPictureLabel->setScaledContents(true);
//改变按钮上的字
ui->airconditionONOFFBtn->setText("空调 ON");
}
}
else if(i == 3)
{
ui->TemDisplayLabel->setText(tr("%1").arg((float)(((int)arr[i] * 10 + (int)arr[i + 1]) / 10)));
}
else if(i == 5)
{
ui->humidityDisplayLabel->setText(tr("%1").arg((float)(((int)arr[i] * 10 + (int)arr[i + 1]) / 10)));
}
else if(i == 7)
{
ui->lightIntensityDisplayLabel->setText(tr("%1").arg((int)(((int)arr[i + 3] << 24) + ((int)arr[i + 2]) << 16) + ((int)arr[i + 1] << 8) + (int)arr[i]));
}
}
}
/*void Widget::on_realtimeDataBtn_clicked()
{
//给服务器发命令,显示告诉这是主页面,然后显示实时数据
QByteArray ThisIsWidget;
ThisIsWidget.append("ThisIsWidget");
qDebug() << "ThisIsWidget " << ThisIsWidget;
this->parentSocket->write(ThisIsWidget);
}*/