481 lines
16 KiB
C++
481 lines
16 KiB
C++
#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);
|
||
}*/
|