#include "ChaletGui.h" #include "ui_ChaletGui.h" #include "CChalet.h" #include #include CChaletGui::CChaletGui(QWidget *parent) : QWidget(parent), ui(new Ui::CChaletGui) { ui->setupUi(this); ui->mDoHarakiriButton->setEnabled(false); ui->mLogStartDateEdit->setDate(QDate::currentDate()); mGetFimwVersionButtonColorTimer = new QTimer; mGetFimwVersionButtonColorTimer->setSingleShot(true); mGetFimwVersionButtonColorTimer->setInterval(500); mGetWifiParamsButtonColorTimer = new QTimer; mGetWifiParamsButtonColorTimer->setSingleShot(true); mGetWifiParamsButtonColorTimer->setInterval(500); connect(ui->mWiFiModuleONBtn,SIGNAL(clicked()),this,SLOT(WiFiONButtonClicked())); connect(ui->mWiFiModuleOFFBtn,SIGNAL(clicked(bool)),this,SLOT(WiFiOFFButtonClicked())); connect(ui->mInverterRelayOFFBtn,SIGNAL(clicked()),this,SLOT(InverterPowerOFFButtonClicked())); connect(ui->mInverterRelayONBtn,SIGNAL(clicked(bool)),this,SLOT(InverterPowerONButtonClicked())); connect(ui->mRebootCPUBtn,SIGNAL(clicked(bool)),this,SLOT(RebootCPUButtonClicked())); connect(ui->mDoHarakiriButton,SIGNAL(clicked(bool)),this,SLOT(DoHarakiriButtonClicked())); connect(ui->mEnableHarakiriChkBx,SIGNAL(clicked(bool)),this,SLOT(EnableHarakiriClicked(bool))); connect(ui->mGetChaletLogButton,SIGNAL(clicked(bool)),this,SLOT(GetChaletLogsBtnClicked())); connect(ui->mWiFiGetRemoteSettingsBtn,SIGNAL(clicked(bool)),this,SLOT(GetDeviceWiFiParamsButtonClicked(bool))); connect(ui->mWiFiSetRemoteSettingsBtn,SIGNAL(clicked(bool)),this,SLOT(SetDeviceWiFiParamsButtonClicked(bool))); connect(ui->mGetFirmwareVersionBtn,SIGNAL(clicked(bool)),this,SLOT(GetFirmwareVersionBtnClicked())); connect(ui->mStartSyslogShellBtn,SIGNAL(clicked(bool)),this,SLOT(StartSyslogShellBtnClicked())); connect(ui->mStartTerminalShellBtn,SIGNAL(clicked(bool)),this,SLOT(StartTerminalShellBtnClicked())); connect(mGetFimwVersionButtonColorTimer,SIGNAL(timeout()),this,SLOT(GetFirmwVersionBtnColorTimerExpired())); connect(mGetWifiParamsButtonColorTimer,SIGNAL(timeout()),this,SLOT(GetWifiParamsBtnColorTimerExpired())); connect(ui->mResetCommStatsBtn,SIGNAL(clicked(bool)),this,SLOT(ResetCommStatsBtnClicked())); connect(ui->mGetWifiStatusBtn,SIGNAL(clicked(bool)),this,SLOT(GetModuleWifiStatusBtnClicked())); mBatteryPlotWidget = new QCustomPlot(ui->mPlotWidget); mBatteryPlotWidget->resize(ui->mPlotWidget->size()); // create graph and assign data to it: mBatteryPlotWidget->addGraph(); // give the axes some labels: mBatteryPlotWidget->xAxis->setLabel("time"); mBatteryPlotWidget->yAxis->setLabel("Volts"); double now = QDateTime::currentDateTime().toSecsSinceEpoch(); QSharedPointer dateTicker(new QCPAxisTickerDateTime); dateTicker->setDateTimeFormat("hh:mm:ss\ndd MMM"); mBatteryPlotWidget->xAxis->setTicker(dateTicker); mBatteryPlotWidget->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectPlottables); QDateTime Now = QDateTime::currentDateTime().toLocalTime(); QDateTime midnight = Now; midnight.setTime(QTime(0,0,0)); QDateTime eod = Now; eod.setTime(QTime(23,59,0)); //mBatteryPlotWidget->xAxis->setRange(0/*QCPAxisTickerDateTime::dateTimeToKey(midnight)*/,QCPAxisTickerDateTime::dateTimeToKey(eod)); // mBatteryPlotWidget->xAxis->setRange(now, now+(2*3600)); mBatteryPlotWidget->xAxis->setRange(midnight.toSecsSinceEpoch(), eod.toSecsSinceEpoch()); mBatteryPlotWidget->yAxis->setRange(12,15); mBatteryPlotWidget->graph(0)->addData(now,13.5); mBatteryPlotWidget->replot(); mFirmVersionDefaultBtnPal = ui->mGetFirmwareVersionBtn->palette(); mWifiDefaultBtnPal = ui->mGetFirmwareVersionBtn->palette(); mChaletLastLostReqCount = 0; ui->mWiFiModuleStatusLabel->setText("Unknown"); ui->mInverterRlyStatusLabel->setText("Unknown"); ui->mCurrentSensorStateLbl->setText("Current Sensor: Unknown state"); ui->mBatteryVoltageLabel->setText("Battery Voltage: Unknown"); ui->mBatterySOCLabel->setText("Battery SOC: Unknown"); ui->mSolarPanelCurrentLabel->setText("Raw Solar Panel Current: Unknown"); ui->mSolarPanelCurrentCnvLbl->setText("Solar Panel Current (A): Unknown"); ui->mLostReqPercentLbl->setText("N/A"); ui->mTotalRxTxRequestsLbl->setText("Chalet Rx req: ??"); ui->mChaletTemperatureLbl->setText("Temperature: -100)"); } CChaletGui::~CChaletGui() { delete ui; delete mBatteryPlotWidget; delete mGetFimwVersionButtonColorTimer; delete mGetWifiParamsButtonColorTimer; } int CChaletGui::UpdateChaletStatus(CChaletMainStatus Status) { static bool LastToggle = false; QString text; int Delta = QDateTime::currentDateTime().toSecsSinceEpoch() - Status.mLastLoraStatus.toSecsSinceEpoch(); ui->mLasCommRequestReceivedLbl->setText(QString("Last response: %1 | %2 seconds ago...").arg(Status.mLastLoraStatus.toString("yyyy-MM-dd-hh:mm:ss")).arg(Delta)); if(Status.mIsOnline == false) { ui->mChaletOnlineStatusLbl->setText("OFFLINE"); QPalette pal = QPalette(ui->mChaletOnlineStatusLbl->palette()); pal.setColor(QPalette::WindowText,QColor(Qt::red)); ui->mChaletOnlineStatusLbl->setPalette(pal); // ui->mWiFiModuleStatusLabel->setText("Unknown"); // ui->mInverterRlyStatusLabel->setText("Unknown"); // ui->mCurrentSensorStateLbl->setText("Current Sensor: Unknown state"); // ui->mBatteryVoltageLabel->setText("Battery Voltage: Unknown"); // ui->mBatterySOCLabel->setText("Battery SOC: Unknown"); // ui->mSolarPanelCurrentLabel->setText("Raw Solar Panel Current: Unknown"); // ui->mSolarPanelCurrentCnvLbl->setText("Solar Panel Current (A): Unknown"); // ui->mLostReqPercentLbl->setText("N/A"); // ui->mTotalRxTxRequestsLbl->setText("Chalet Rx req: ??"); // ui->mChaletTemperatureLbl->setText("Temperature: -100)"); return RET_OK; } else if(ui->mChaletOnlineStatusLbl->text() == "OFFLINE") { ui->mChaletOnlineStatusLbl->setText("ONLINE"); QPalette pal = QPalette(ui->mChaletOnlineStatusLbl->palette()); pal.setColor(QPalette::WindowText,QColor(Qt::darkGreen)); ui->mChaletOnlineStatusLbl->setPalette(pal); } switch(Status.mWiFiModuleStatus) { case WIFI_CONNECTED_STATE: { text = "Connected"; break; } case WIFI_MODULE_OFF_STATE: { text = "Module OFF"; break; } case WIFI_DISCONNECTED_STATE: { text = "Disconnected"; break; } case WIFI_INIT_ERROR_STATE: { text = "Init. Error"; break; } case WIFI_UNKNOWN_STATE: default: { text = "WiFi: Unknown state"; break; } } ui->mWiFiModuleStatusLabel->setText(text); switch(Status.mInverterRelayStatus) { case CHALET_POWER_RELAY_OFF_STATE: { text = "OFF"; break; } case CHALET_POWER_RELAY_ON_STATE: { text = "ON"; break; } case CHALET_POWER_RELAY_UNKNOWN_STATE: default: { text = "Unknown"; break; } } ui->mInverterRlyStatusLabel->setText(text); switch(Status.mCurrentSensorStatus) { case CHALET_CURRENT_SENSOR_DEFECT_STATE: { text = "Current Sensor: DEFECTIVE"; break; } case CHALET_CURRENT_SENSOR_OK_STATE: { text = "Current Sensor: OK"; break; } case CHALET_CURRENT_SENSOR_UNKNOWN_STATE: default: { text = "Current Sensor: Unknown state"; break; } } ui->mCurrentSensorStateLbl->setText(text); QString Voltage = QString("Battery Voltage: %1").arg(Status.mBatteryVoltage); ui->mBatteryVoltageLabel->setText(Voltage); QString Current = QString("Raw Solar Panel Current: %1").arg(Status.mBatteryCurrent - 2); ui->mSolarPanelCurrentLabel->setText(Current); float ConvertedCurrent = (float)(Status.mBatteryCurrent - 2) * (3.3/1023); //*0.080645; // 3.3/(1023*0.04) = 0.080645; ConvertedCurrent /= 0.08; QString CnvCurrent = QString("Solar Panel Current (A): %1").arg(ConvertedCurrent); ui->mSolarPanelCurrentCnvLbl->setText(CnvCurrent); QString SOC = QString("Battery SOC: %1").arg(Status.mBatterySOC); ui->mBatterySOCLabel->setText(SOC); QString Percent = QString("Lost Requests: %1%").arg(Status.mLostRequestPercentage,0,'f',2); ui->mLostReqPercentLbl->setText(Percent); QString ChaletRxCnt = QString("Chalet Rx req: %1, Master Tx cmds: %2, Master lost reqs: %3").arg(Status.mTotalNbChaletRxCmds).arg(Status.mTotalMasterTxCmds).arg(Status.mMasterLostRequestCount); ui->mTotalRxTxRequestsLbl->setText(ChaletRxCnt); if(mChaletLastLostReqCount != Status.mMasterLostRequestCount) { QString ChaletLostReqStats = QString("Master --> Chalet: %1\nChalet --> Master: %2").arg((Status.mTotalMasterTxCmds-Status.mTotalNbChaletRxCmds)).arg(Status.mMasterLostRequestCount-(Status.mTotalMasterTxCmds-Status.mTotalNbChaletRxCmds)); ui->mLostReqsStatsLbl->setText(ChaletLostReqStats); } mChaletLastLostReqCount = Status.mMasterLostRequestCount; if(Status.mStatusToggleBit != LastToggle) { LastToggle = Status.mStatusToggleBit; if(ui->mChaletCommActivityLbl->isEnabled()) { ui->mChaletCommActivityLbl->setEnabled(false); } else { ui->mChaletCommActivityLbl->setEnabled(true); } double CurTime = QDateTime::currentDateTime().toSecsSinceEpoch(); mBatteryPlotWidget->graph(0)->addData(CurTime,Status.mBatteryVoltage); mBatteryPlotWidget->replot(); } QString Temperature = QString("Temperature: %1").arg(Status.mChaletTemperature); ui->mChaletTemperatureLbl->setText(Temperature); return RET_OK; } int CChaletGui::UpdateChaletLogPlot(QByteArray *Log) { int NbRecords; CChaletMainStatus CurData; QVector x,y; QDataStream Strm(Log,QIODevice::ReadOnly); Strm.device()->seek(0); Strm >> NbRecords; if(NbRecords > 0) { for(int i = 0; i < NbRecords; i++) { Strm >> CurData; x.append(CurData.mThisStatusDateTime.toSecsSinceEpoch()); y.append(CurData.mBatteryVoltage); } } if(x.size() == 0 || y.size() == 0) return RET_ERROR; mBatteryPlotWidget->graph(0)->data().clear(); mBatteryPlotWidget->graph(0)->setData(x,y); mBatteryPlotWidget->xAxis->setRange(x.first(),x.last()); mBatteryPlotWidget->replot(); return RET_OK; } void CChaletGui::WiFiONButtonClicked() { mProgramHandle->WiFiToggleButtonPressed(true); } void CChaletGui::WiFiOFFButtonClicked() { mProgramHandle->WiFiToggleButtonPressed(false); } void CChaletGui::InverterPowerONButtonClicked() { mProgramHandle->InverterToggleButtonPressed(true); } void CChaletGui::InverterPowerOFFButtonClicked() { mProgramHandle->InverterToggleButtonPressed(false); } void CChaletGui::DoHarakiriButtonClicked() { mProgramHandle->DoHarakiriButtonClicked(true); } void CChaletGui::RebootCPUButtonClicked() { mProgramHandle->RebootCPUButtonPressed(); } void CChaletGui::EnableHarakiriClicked(bool checked) { if(checked) { ui->mDoHarakiriButton->setEnabled(true); } else { ui->mDoHarakiriButton->setEnabled(false); } } int CChaletGui::ChaletCommActivity() { if(ui->mChaletCommActivityLbl->isEnabled()) { ui->mChaletCommActivityLbl->setEnabled(false); } else { ui->mChaletCommActivityLbl->setEnabled(true); } return RET_OK; } void CChaletGui::GetChaletLogsBtnClicked() { QDate StartDate = ui->mLogStartDateEdit->date(); if(StartDate > QDate::currentDate()) { QMessageBox::critical(this,"Error","Date is in the future!"); return; } mProgramHandle->RequestChaletLogs(StartDate); } void CChaletGui::GetDeviceWiFiParamsButtonClicked(bool state) { mProgramHandle->RequestDeviceWifiParams(); } void CChaletGui::SetDeviceWiFiParamsButtonClicked(bool state) { bool UseDHCP = ui->mDHCPEnableChkBx->isChecked(); if(mProgramHandle->SetDeviceWifiParams(ui->mWiFiIPAddressEditBx->text(),ui->mWiFiGatewayAddressEditBx->text(),UseDHCP,ui->mWifiAccessPtNameEditBx->text(),ui->mWifiPasswordEditBx->text()) == RET_ERROR) { QMessageBox::critical(this,"IP error","Invalid IP address"); } } void CChaletGui::UpdateDeviceWiFiParameters(QHostAddress IP, QHostAddress Gateway, QString APName, QString APPassword, bool UseDHCP) { ui->mWiFiIPAddressEditBx->setText(IP.toString()); ui->mWiFiGatewayAddressEditBx->setText(Gateway.toString()); ui->mWifiAccessPtNameEditBx->setText(APName); ui->mWifiPasswordEditBx->setText(APPassword); ui->mDHCPEnableChkBx->setChecked(UseDHCP); QPalette pal = ui->mWiFiGetRemoteSettingsBtn->palette(); pal.setColor(QPalette::Button, QColor(Qt::green)); ui->mWiFiGetRemoteSettingsBtn->setAutoFillBackground(true); ui->mWiFiGetRemoteSettingsBtn->setPalette(pal); ui->mWiFiGetRemoteSettingsBtn->update(); mGetWifiParamsButtonColorTimer->start(); } void CChaletGui::GetFirmwareVersionBtnClicked() { mProgramHandle->RequestFirmwareVersion(); } void CChaletGui::ResetCommStatsBtnClicked() { mChaletLastLostReqCount = 0; QString ChaletLostReqStats = QString("Master --> Chalet: 0\nChalet --> Master: 0"); ui->mLostReqsStatsLbl->setText(ChaletLostReqStats); mProgramHandle->RequestClearCommStats(); } void CChaletGui::UpdateFirmwareVersion(QByteArray Version) { QString VersionString(Version); VersionString.prepend("Firmware version: "); ui->mFirmwareVersionLabel->setText(VersionString); QPalette pal = ui->mGetFirmwareVersionBtn->palette(); pal.setColor(QPalette::Button, QColor(Qt::green)); ui->mGetFirmwareVersionBtn->setAutoFillBackground(true); ui->mGetFirmwareVersionBtn->setPalette(pal); ui->mGetFirmwareVersionBtn->update(); mGetFimwVersionButtonColorTimer->start(); } void CChaletGui::UpdateDeviceWifiStatus(char WifiState, QHostAddress IP) { QString Txt = QString("Module IP Address: %1").arg(IP.toString()); ui->mModuleIPAddressLbl->setText(Txt); mModuleIPAddress = IP; } void CChaletGui::StartSyslogShellBtnClicked() { //system("c:\\progra~1\\putty\\putty.exe -load \"0-ChaletDuino_Syslog\""); // QProcess Putty; //QProcess::startDetached("c:\\progra~1\\putty\\putty.exe -load \"0-ChaletDuino_Syslog\""); if(mModuleIPAddress.isNull() || mModuleIPAddress.isBroadcast()) { QProcess::startDetached("c:\\progra~1\\putty\\putty.exe -load \"0-ChaletDuino_Syslog\""); } else { QString Proc = QString("c:\\progra~1\\putty\\putty.exe -raw -P 87 %1").arg(mModuleIPAddress.toString()); QProcess::startDetached(Proc); } } void CChaletGui::StartTerminalShellBtnClicked() { // system("c:\\program files\\putty\\putty.exe -load \"0-ChaletDuino_Terminal\""); // QProcess::startDetached("c:\\progra~1\\putty\\putty.exe -load \"0-ChaletDuino_Terminal\""); if(mModuleIPAddress.isNull() || mModuleIPAddress.isBroadcast()) { QProcess::startDetached("c:\\progra~1\\putty\\putty.exe -load \"0-ChaletDuino_Terminal\""); } else { QString Proc = QString("c:\\progra~1\\putty\\putty.exe -raw -P 85 %1").arg(mModuleIPAddress.toString()); QProcess::startDetached(Proc); } } void CChaletGui::GetFirmwVersionBtnColorTimerExpired() { ui->mGetFirmwareVersionBtn->setAutoFillBackground(true); ui->mGetFirmwareVersionBtn->setPalette(mFirmVersionDefaultBtnPal); ui->mGetFirmwareVersionBtn->update(); } void CChaletGui::GetWifiParamsBtnColorTimerExpired() { ui->mWiFiGetRemoteSettingsBtn->setAutoFillBackground(true); ui->mWiFiGetRemoteSettingsBtn->setPalette(mFirmVersionDefaultBtnPal); ui->mWiFiGetRemoteSettingsBtn->update(); } void CChaletGui::GetModuleWifiStatusBtnClicked() { ui->mModuleIPAddressLbl->setText("Module IP Address: "); mProgramHandle->RequestWifiStatus(); }