qt/LedOK/deviceitem.cpp
2023-05-11 11:47:00 +08:00

441 lines
18 KiB
C++
Raw 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 "deviceitem.h"
#include "base/waitingdlg.h"
#include "gutil/qgui.h"
#include <QMessageBox>
#include <QJsonArray>
#include <QJsonDocument>
#include <QPainter>
#include <globaldefine.h>
#include <QSettings>
#include <cfg.h>
#include <QHttpMultiPart>
#include <QUuid>
#include <QBuffer>
#include <QThread>
#include <QTcpSocket>
#include <QHostAddress>
#include <QInputDialog>
DeviceItem::DeviceItem(LedCard *pLedCard, LoQTreeWidget *parent) : QObject(parent), QTreeWidgetItem(UserType), m_parent(parent) {
mCard = pLedCard;
pHpptClient = new HpptClient(this);
setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
setCheckState(0, Qt::Unchecked);
m_parent->addTopLevelItem(this);
m_bnCardDetailInfo = new QPushButton();
m_bnCardDetailInfo->setToolTip(tr("GetScreenDetailInfo"));
m_bnCardDetailInfo->setCursor(QCursor(Qt::PointingHandCursor));
m_bnCardDetailInfo->setStyleSheet(R"rrr(
QPushButton {
border-radius: 4px;
image: url(:/res/device/bnDetail.png);
}
QPushButton:hover{background-color: #ccc;}
)rrr");
connect(m_bnCardDetailInfo, &QPushButton::clicked, this, [this]{
QString strTip="";
strTip.append(tr("cur brightness:")).append(QString::number(mCard->bright)).append("\r\n");
//strTip.append("cardsystem apk version:"+QString::number(m_LedCard.iCardSystemVersion)+"\r\n");
//strTip.append("device apk:"+m_LedCard.starterversionName+"\r\n");
strTip.append(tr("android version:")).append(mCard->androidVersion).append("\r\n");
//strTip.append(tr("android width:")+QString::number(m_LedCard.androidWidth)+"\r\n");
//strTip.append(tr("android height:")+QString::number(m_LedCard.androidHeight)+"\r\n");
strTip.append(tr("IMEI:")).append(mCard->strIMEI).append("\r\n");
strTip.append(tr("HardWard Version:")).append(mCard->HardVersion).append("\r\n");
strTip.append(tr("MAX Brightness level:")).append(QString::number(mCard->BrightnessLevel)).append("\r\n");
strTip.append(tr("Android OS Resolution:")).append(mCard->ScreenResolution).append("\r\n");
strTip.append(tr("Firmware Version:")).append(mCard->FirmwareVersion).append("\r\n");
strTip.append(tr("Player Version:")).append(mCard->strXixunplayerVersion).append("\r\n");
QMessageBox::information(treeWidget(), tr("Detail Info"), strTip);
});
m_bnReadbackPic = new QPushButton();
m_bnReadbackPic->setToolTip(tr("ReadbackPic"));
m_bnReadbackPic->setCursor(QCursor(Qt::PointingHandCursor));
m_bnReadbackPic->setStyleSheet(R"rrr(
QPushButton {
border-radius: 4px;
image: url(:/res/device/deviceReadbackPic.png);
}
QPushButton:hover{background-color: #ccc;}
)rrr");
connect(m_bnReadbackPic, &QPushButton::clicked, this, [this] {
QJsonObject json;
json.insert("_id", "GetScreenshotFull");
json.insert("_type", "GetScreenshotFull");
auto waitingDlg = new WaitingDlg(treeWidget(), tr("GetScreenshotFull")+" ...");
waitingDlg->show();
auto reply = NetReq("http://"+mCard->m_strCardIp+":2016/settings").timeout(120000).post(json);
waitingDlg->connAbort(reply);
connect(reply, &QNetworkReply::finished, this, [=] {
waitingDlg->close();
QJsonDocument json;
QString err = checkReplyForJson(reply, &json);
if(! err.isEmpty()) {
QMessageBox::critical(treeWidget(), tr("Error"), err);
return;
}
ImgDlg dlg(QByteArray::fromBase64(json["data"].toString().toLatin1()), treeWidget());
dlg.exec();
});
});
m_ImageOnline = new QLabel();
mCard->m_bOnLine=true;
m_ImageOnline->setPixmap(QPixmap(":/res/device/O_Online.png"));
setData(DeviceTable_ID, 0, mCard->m_strCardId);
setData(DeviceTable_IP, 0, mCard->m_strCardIp);
setData(DeviceTable_ScreenSize, 0, QString("%1 x %2").arg(mCard->m_iWidth).arg(mCard->m_iHeight));
m_parent->setItemWidget(this, DeviceTable_Info, m_bnCardDetailInfo);
m_parent->setItemWidget(this, DeviceTable_Screenshot, m_bnReadbackPic);
m_parent->setItemWidget(this, DeviceTable_Online, m_ImageOnline);
m_ImageOnline->setAlignment(Qt::AlignCenter);
btnUnlock = new QPushButton;
btnUnlock->setMaximumHeight(40);
if(mCard->bPassword) btnUnlock->setIcon(QIcon(mCard->m_bLockStatus ? ":/res/device/Lock.png" : ":/res/device/UnLock.png"));
else btnUnlock->hide();
connect(btnUnlock, &QPushButton::clicked, this, [this] {
if(! mCard->m_bLockStatus) return;
bool ok;
auto pwd = QInputDialog::getText(treeWidget(), tr("Input password"), tr("Input password"), QLineEdit::Password, QString(), &ok);
if(! ok) return;
QJsonObject json;
json.insert("_id", "VerifyPassword");
json.insert("_type", "VerifyPassword");
json.insert("pwd", pwd);
auto waitingDlg = new WaitingDlg(treeWidget(), tr("VerifyPassword")+" ...");
waitingDlg->show();
auto reply = NetReq("http://"+mCard->m_strCardIp+":2016/settings").timeout(60000).post(json);
waitingDlg->connAbort(reply);
connect(reply, &QNetworkReply::finished, this, [=] {
QJsonDocument json;
QString err = checkReplyForJson(reply, &json);
if(! err.isEmpty()) {
waitingDlg->close();
QMessageBox::critical(treeWidget(), tr("Error"), err);
return;
}
if(! json["result"].toBool()) {
waitingDlg->close();
QMessageBox::critical(treeWidget(), tr("Tip Info"), tr("password is wrong"));
return;
}
waitingDlg->success();
mCard->m_bLockStatus = false;
btnUnlock->setIcon(QIcon(":/res/device/UnLock.png"));
});
});
auto wgt = new QWidget;
auto hBox = new HBox(wgt);
hBox->setContentsMargins(0,0,0,0);
hBox->addWidget(btnUnlock);
m_parent->setItemWidget(this, DeviceTable_Password, wgt);
for(int i=1; i<DeviceTable_Screenshot; i++) setTextAlignment(i, Qt::AlignCenter);
//启动心跳监测设备在线和下线3次超时表示下线
DeviceItemHttpPost();
connect(&mHeartbeatTimer, &QTimer::timeout, this, [this] {
m_HeartbeatCount++;
QJsonObject json4;
json4.insert("_id", getRandomString(10));
json4.insert("_type", "GetCardName");
HttpPostByTypeJsonObject(json4);
if(m_HeartbeatCount>10) {
//下线
mCard->m_bOnLine=false;
m_ImageOnline->setPixmap(QPixmap(":/res/device/O_Offline.png"));
} else {
//在线
mCard->m_bOnLine=true;
m_ImageOnline->setPixmap(QPixmap(":/res/device/O_Online.png"));
}
});
mHeartbeatTimer.start(60000);
m_pGetAskTimer=new QTimer(this);
connect(pHpptClient,SIGNAL(httpPostRspReady(QString , QString , QByteArray)),this,SLOT(OnProHttpResponse(QString , QString , QByteArray)));
//连接item的响应信号到信息输出框的显示槽函数
connect(this,SIGNAL(sigOutputInfo(QString)),parent->parent(),SLOT(OnOutputInfo(QString)));
}
DeviceItem::~DeviceItem() {
mHeartbeatTimer.stop();
if(pHpptClient) {
delete pHpptClient;
pHpptClient=nullptr;
}
}
void DeviceItem::SetMainTabWidgetIndex(int index){
m_intIndexFlagOfInfoOrControl=index;
DeviceItemHttpPost();
}
//针对这个ITEM通过POST获取控制卡的信息两种情况下会调用创建该Item初始化后二、手动刷新
void DeviceItem::DeviceItemHttpPost() {
if(m_intIndexFlagOfInfoOrControl!=MainPage_DeviceManager) return;
QJsonObject json;
json.insert("_id", getRandomString(10));
json.insert("_type", "GetScreenSize");
HttpPostByTypeJsonObject(json);
QJsonObject json1;
json1.insert("_id", getRandomString(10));
json1.insert("_type", "GetBrightness");
HttpPostByTypeJsonObject(json1);
QJsonObject json2;
json2.insert("_id", getRandomString(10));
json2.insert("_type", "IsScreenOn");
HttpPostByTypeJsonObject(json2);
QJsonObject json4;
json4.insert("_id", getRandomString(10));
json4.insert("_type", "GetBuildInformation");
HttpPostByTypeJsonObject(json4);
QJsonObject json5;
json5.insert("_id", getRandomString(10));
json5.insert("_type", "CheckSoftVersions");
HttpPostByTypeJsonObject(json5);
QJsonObject json8;
json8.insert("_id", getRandomString(10));
json8.insert("_type", "GetCardAlias");
HttpPostByTypeJsonObject(json8);
{
QJsonObject json;
json.insert("_id", "HasControllerPassword");
json.insert("_type", "HasControllerPassword");
auto reply = NetReq("http://"+mCard->m_strCardIp+":2016/settings").timeout(120000).post(json);
connect(reply, &QNetworkReply::finished, mCard, [=] {
QJsonDocument json;
QString err = checkReplyForJson(reply, &json);
if(! err.isEmpty()) return;
mCard->bPassword = json["result"].toBool();
if(mCard->bPassword) {//加过密
btnUnlock->show();
btnUnlock->setIcon(QIcon(mCard->m_bLockStatus ? ":/res/device/Lock.png" : ":/res/device/UnLock.png"));
} else btnUnlock->hide();
});
}
}
void DeviceItem::OnControlTcpSend(int iProgramIndex) {
QTcpSocket *send = new QTcpSocket();
connect(send, SIGNAL(connected()), this, SLOT(connect_sucessful()));
connect(send, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(show_error(QAbstractSocket::SocketError)));
send->connectToHost(QHostAddress(mCard->m_strCardIp),31299);
ST_ANSY_PROGRAM_PACKET tempStreadPakcet;
tempStreadPakcet.SyncHead[0]=0x7e;
tempStreadPakcet.SyncHead[1]=0x7e;
tempStreadPakcet.SyncHead[2]=0x55;
tempStreadPakcet.ucCommType=0x97;
tempStreadPakcet.iBaoLiu=0;
tempStreadPakcet.iLength=4;
unsigned char uctemp[4]={0};
uctemp[0]=iProgramIndex;
memcpy(tempStreadPakcet.pDataBuffer,uctemp,4);
tempStreadPakcet.pDataBuffer[tempStreadPakcet.iLength]=GetCheckCodeIn8(&tempStreadPakcet.ucCommType,tempStreadPakcet.iLength+sizeof(tempStreadPakcet.iBaoLiu)+sizeof(tempStreadPakcet.ucCommType)+sizeof(tempStreadPakcet.iLength));
int iLenPacket=3*sizeof(unsigned char)+sizeof(char)+sizeof(int)+sizeof(int)+tempStreadPakcet.iLength+sizeof(char);/////除正文外的协议结构大小;
QByteArray databuf = QByteArray(reinterpret_cast<char*>(&tempStreadPakcet), iLenPacket);
if(!send->waitForConnected(10000)) //等待连接返回
{
qDebug()<<mCard->m_strCardIp<<"Connect timeout ";
emit sigOutputInfo(mCard->m_strCardId+":"+tr("receive")+"<-"+tr("Connect")+":"+tr("timeout"));
send->close();
delete send;
return ;
}
send->write(databuf);
if(send->waitForBytesWritten(3000))
{
send->read(send->bytesAvailable());
qDebug()<<"recv anycast success ack";
emit sigOutputInfo(mCard->m_strCardId+":"+tr("receive")+"<-"+tr("Anycast")+":"+tr("success"));
}
send->close();
delete send;
}
void DeviceItem::HttpPostByTypeJsonObject(QJsonObject json)
{
QJsonDocument doc;
doc.setObject(json);
QByteArray post_loginArray = doc.toJson(QJsonDocument::Compact);
m_strUrl="http://"+mCard->m_strCardIp+":2016/settings";
if(mCard->m_strCardId.left(2)!="M8" && mCard->m_strCardId.left(2)!="m8")
{
if(json["_type"]!="GetAllScreenSizeM80") pHpptClient->httpPost(m_strUrl,post_loginArray);
}
else pHpptClient->httpPost(m_strUrl,post_loginArray);
}
void DeviceItem::HttpGetLedCardWidthHeight()
{
QJsonObject json;
json.insert("_id", getRandomString(10));
json.insert("_type", "GetScreenSize");
HttpPostByTypeJsonObject(json);
}
void DeviceItem::HttpGetLedCardRemarkName(){
QJsonObject json;
json.insert("_id", getRandomString(10));
json.insert("_type", "GetCardAlias");
HttpPostByTypeJsonObject(json);
}
void DeviceItem::refreshLable(){
if(mCard->m_bPowerStatus){
this->setForeground(DeviceTable_Power, Qt::green);
setData(DeviceTable_Power, 0, tr("on"));
} else {
this->setForeground(DeviceTable_Power, Qt::red);
setData(DeviceTable_Power, 0, tr("off"));
}
}
//获取到httpPost的应答如果参数变化需要出发修改控件item的内容
void DeviceItem::OnProHttpResponse(QString url, QString postMD5, QByteArray data) {
Q_UNUSED(postMD5)
//qDebug()<< url + "\r\n"+m_strUrl;
if(url == m_strUrl)
{
QJsonParseError parseJsonErr;
QJsonDocument document = QJsonDocument::fromJson(data,&parseJsonErr);
if(!(parseJsonErr.error == QJsonParseError::NoError))
{
if(data.size()==0)
qDebug()<<"json is empty";
else
qDebug()<<"DeviceItem OnProHttpResponse 解析json文件错误";
return;
}
QJsonObject jsonObject = document.object();
QString strType=jsonObject["_type"].toString();
if(jsonObject["success"].toBool()==true)
{
if(strType=="GetScreenSize" )
{
if(mCard->m_iWidth!=jsonObject["width"].toInt()||mCard->m_iHeight!=jsonObject["height"].toInt())
{
mCard->m_iWidth=jsonObject["width"].toInt();
mCard->m_iHeight=jsonObject["height"].toInt();
}
setData(DeviceTable_ScreenSize, 0, QString("%1 x %2").arg(mCard->m_iWidth).arg(mCard->m_iHeight));
}
else if(strType=="GetCardAlias" )
{
mCard->m_strCardRemarkName = QString::fromUtf8(QByteArray::fromBase64(jsonObject["alias"].toString().toLatin1()));
setData(DeviceTable_Remark,0,mCard->m_strCardRemarkName);
}
else if(strType=="GetCardName")
{
m_HeartbeatCount=0;
mCard->m_bOnLine=true;
m_ImageOnline->setPixmap(QPixmap(":/res/device/O_Online.png"));
}
else if(strType=="GetBuildInformation" )
{
mCard->strIMEI=jsonObject["IMEI"].toString();
mCard->HardVersion=jsonObject["HardVersion"].toString();
mCard->BrightnessLevel=jsonObject["BrightnessLevel"].toInt();
mCard->ScreenResolution=jsonObject["ScreenResolution"].toString();
mCard->FirmwareVersion=jsonObject["FirmwareVersion"].toString();
}
else if(strType=="CheckSoftVersions")
{
foreach(QJsonValue value, jsonObject["apps"].toArray()) {
QJsonObject oApp = value.toObject();
if(oApp["packageName"].toString().contains("xixunplayer"))
{
mCard->strXixunplayerVersion=oApp["versionName"].toString();
mCard->strXixunplayerVersionCode=oApp["versionCode"].toInt();
}
}
}
else if(strType == "AliIotSetting")
{
emit sigOutputInfo(mCard->m_strCardId+":"+tr("receive")+"<-"+tr("AliIotSetting")+":"+tr("success"));
}
else if(strType == "IsScreenOn")
{
{
mCard->m_bPowerStatus=jsonObject["on"].toBool();
if(mCard->m_bPowerStatus) {
this->setForeground(DeviceTable_Power, Qt::green);
setData(DeviceTable_Power, 0, tr("on"));
emit sigOutputInfo(mCard->m_strCardId+":"+tr("receive")+"<-"+tr("GetScreenStatus")+tr("success")+","+tr("Status")+":"+tr("on"));
} else {
this->setForeground(DeviceTable_Power, Qt::red);
setData(DeviceTable_Power, 0, tr("off"));
emit sigOutputInfo(mCard->m_strCardId+":"+tr("receive")+"<-"+tr("GetScreenStatus")+tr("success")+","+tr("Status")+":"+tr("off"));
}
}
} else if(strType == "GetBrightness") {
mCard->bright = jsonObject["brightnessPercentage"].toInt(-1);
if(mCard->bright==-1) mCard->bright = qRound(jsonObject["brightness"].toInt() * 100.0 / mCard->BrightnessLevel);
QString bright = QString::number(mCard->bright);
setData(DeviceTable_Brightness, 0, QString::number(mCard->bright)+"%");
emit sigOutputInfo(mCard->m_strCardId+":"+tr("receive")+"<-"+tr("GetBrightness")+tr("success")+","+tr("brightness")+"="+bright+"%");
}
else if(strType == "SetAutoBrightnessTask")
{
emit sigOutputInfo(mCard->m_strCardId+":"+tr("receive")+"<-"+tr("SetAutoBrightnessTask")+":"+tr("success"));
}
else if(strType == "SetAutoVolumeTask")
{
emit sigOutputInfo(mCard->m_strCardId+":"+tr("receive")+"<-"+tr("SetAutoVolumeTask")+":"+tr("success"));
}
else if(strType == "SetTimingScreenTask")
{
emit sigOutputInfo(mCard->m_strCardId+":"+tr("receive")+"<-"+tr("SetTimingScreenTask")+":"+tr("success"));
}
else if(strType == "TestScreen")
{
emit sigOutputInfo(mCard->m_strCardId+":"+tr("receive")+"<-"+tr("TestScreen")+":"+tr("success"));
}
}
}
}
QPixmap DeviceItem::Base64_To_Image(QByteArray bytearray,QString SavePath)
{
QByteArray Ret_bytearray;
Ret_bytearray = QByteArray::fromBase64(bytearray);
QBuffer buffer(&Ret_bytearray);
buffer.open(QIODevice::WriteOnly);
QPixmap imageresult;
imageresult.loadFromData(Ret_bytearray);
if(SavePath != "")
{
qDebug() <<"save" ;
imageresult.save(SavePath);
}
return imageresult;
}
void DeviceItem::DeletePostingDlg()
{
if(m_PostingDlg!=nullptr)
{
delete m_PostingDlg;
m_PostingDlg=nullptr;
}
}
ImgDlg::ImgDlg(const QByteArray &data, QWidget *parent) : QDialog(parent) {
setWindowFlag(Qt::WindowContextHelpButtonHint, 0);
setWindowTitle(tr("Screenshot"));
mImg.loadFromData(data);
auto www = mImg.width();
auto hhh = mImg.height();
if(www <= 1600 && hhh <= 900) resize(www, hhh);
else if(www > hhh) resize(900 * www / hhh, 900);
else resize(1600, 1600 * hhh / www);
}
void ImgDlg::paintEvent(QPaintEvent *) {
QPainter painter(this);
painter.drawImage(rect(), mImg);
}