From f2d269033dbdc02960465790d37e7e1d53b91d93 Mon Sep 17 00:00:00 2001 From: Szybet <53944559+Szybet@users.noreply.github.com> Date: Mon, 15 Aug 2022 21:10:32 +0200 Subject: [PATCH] purging old cold, some new --- src/apps/userapps.cpp | 2 +- src/eink.qrc | 2 + src/functions.h | 144 +++++++--------- src/homeWidget/mainwindow.cpp | 127 +++----------- src/homeWidget/mainwindow.h | 10 +- src/main.cpp | 6 +- src/resources/refresh.png | Bin 0 -> 13021 bytes src/resources/stop.png | Bin 0 -> 11604 bytes src/resources/wifi-standby.png | Bin 3559 -> 15784 bytes src/settings/settings.cpp | 2 +- src/widgets/dialogs/generaldialog.cpp | 16 +- src/widgets/dialogs/generaldialog.h | 1 - src/widgets/dialogs/wifi/wifidialog.cpp | 219 +++++++++++++----------- src/widgets/dialogs/wifi/wifidialog.h | 12 -- src/widgets/dialogs/wifi/wifidialog.ui | 187 ++++++++++++++------ src/widgets/interfaceWidgets/toast.cpp | 37 +--- src/widgets/interfaceWidgets/toast.h | 3 - 17 files changed, 357 insertions(+), 411 deletions(-) create mode 100644 src/resources/refresh.png create mode 100644 src/resources/stop.png diff --git a/src/apps/userapps.cpp b/src/apps/userapps.cpp index 1517aa2..29c156b 100644 --- a/src/apps/userapps.cpp +++ b/src/apps/userapps.cpp @@ -185,7 +185,7 @@ bool userapps::manageRequiredFeatures() if(featureId == 0) { // Double 'if' conditions to avoid launching unnecesery testPing() in emu if(global::deviceID != "emu\n") { - if(testPing(true) != 0) { + if(testPing() != 0) { global::userApps::appCompatibilityText = "This app needs a Wi-Fi connection, continue anyway?"; launchDialog = true; } diff --git a/src/eink.qrc b/src/eink.qrc index ab45a56..2cac456 100644 --- a/src/eink.qrc +++ b/src/eink.qrc @@ -84,5 +84,7 @@ resources/highlight.png resources/unhighlight.png resources/view-highlights.png + resources/stop.png + resources/refresh.png diff --git a/src/functions.h b/src/functions.h index 7c9c4b5..e28eeb6 100644 --- a/src/functions.h +++ b/src/functions.h @@ -92,7 +92,6 @@ namespace global { } namespace toast { inline QString message; - inline bool wifiToast; inline bool modalToast; inline bool indefiniteToast; inline int delay; @@ -100,9 +99,6 @@ namespace global { namespace device { inline bool isWifiAble; } - namespace network { - inline bool isConnected; - } namespace otaUpdate { inline bool isUpdateOta; inline bool downloadOta; @@ -169,6 +165,17 @@ namespace global { namespace highlightsListDialog { inline QString bookPath; } + namespace wifi { + // This is the correct way to do this. + enum class WifiState + { + Configured, + Enabled, + Disabled, + Unknown, // to not confuse lastWifiState + }; + inline bool isConnected; + } inline QString systemInfoText; inline bool forbidOpenSearchDialog; inline bool isN705 = false; @@ -780,41 +787,6 @@ namespace { } } } - bool connectToNetwork(QString essid, QString passphrase) { - log("Connecting to network '" + essid + "'", "functions"); - std::string essid_str = essid.toStdString(); - std::string passphrase_str = passphrase.toStdString(); - string_writeconfig("/run/wifi_network_essid", essid_str); - string_writeconfig("/run/wifi_network_passphrase", passphrase_str); - string_writeconfig("/opt/ibxd", "connect_to_wifi_network\n"); - - int connectionSuccessful = 0; - - while(connectionSuccessful == 0) { - if(QFile::exists("/run/wifi_connected_successfully")) { - if(checkconfig("/run/wifi_connected_successfully") == true) { - QFile::remove("/run/wifi_connected_successfully"); - connectionSuccessful = 1; - global::network::isConnected = true; - setDefaultWorkDir(); - string_writeconfig(".config/17-wifi_connection_information/essid", essid_str); - string_writeconfig(".config/17-wifi_connection_information/passphrase", passphrase_str); - QString function = __func__; log(function + ": Connection successful", "functions"); - return true; - } - else { - QFile::remove("/run/wifi_connected_successfully"); - connectionSuccessful = 0; - global::network::isConnected = false; - QString function = __func__; log(function + ": Connection failed", "functions"); - return false; - } - } - else { - QThread::msleep(100); - } - } - } int get_warmth() { QString sysfsWarmthPath; if(global::deviceID == "n873\n") { @@ -866,51 +838,6 @@ namespace { return !!ptr; } } - int testPing(bool blocking) { - QProcess *pingProcess = new QProcess(); - if(blocking == true) { - QString pingProg = "ping"; - QStringList pingArgs; - pingArgs << "-c" << "1" << "1.1.1.1"; - pingProcess->start(pingProg, pingArgs); - pingProcess->waitForFinished(); - int exitCode = pingProcess->exitCode(); - pingProcess->deleteLater(); - if(exitCode == 0) { - global::network::isConnected = true; - } - else { - global::network::isConnected = false; - } - return exitCode; - } - /* For some reason, implementing a non-blocking version of this functions triggers a "terminate called without an active exception" error with a platform plugin compiled with a newer GCC 11 toolchain. The problem has been solved by transplanting this function into the related area which uses it. - else { - QString pingProg = "sh"; - QStringList pingArgs; - pingArgs << "/mnt/onboard/.adds/inkbox/test_ping.sh"; - pingProcess->startDetached(pingProg, pingArgs); - } - */ - pingProcess->deleteLater(); - } - bool getTestPingResults() { - // To be used when the testPing() function is used in non-blocking mode. - if(QFile::exists("/run/test_ping_status")) { - if(checkconfig("/run/test_ping_status") == true) { - global::network::isConnected = true; - return true; - } - else { - global::network::isConnected = false; - return false; - } - } - else { - global::network::isConnected = false; - return false; - } - } void updateUserAppsMainJsonFile() { QDirIterator appsDir("/mnt/onboard/onboard/.apps", QDirIterator::NoIteratorFlags); QFile newJsonFile = QFile{"/mnt/onboard/onboard/.apps/apps.json"}; @@ -1135,6 +1062,55 @@ namespace { return 2; } } + global::wifi::WifiState checkWifiState() { + QProcess *wifiStateProcess = new QProcess(); + // Important to remember thats its in chroot... + QString path = "/external_root/usr/local/bin/wifi/wifi_status.sh"; + QStringList args; + wifiStateProcess->start(path, args); + wifiStateProcess->waitForFinished(); + wifiStateProcess->deleteLater(); + QString currentWifiState; + if(QFile("/run/wifi_status").exists() == true) { + currentWifiState = readFile("/run/wifi_status"); + } else { + log("/run/wifi_status doesnt exist"); + } + if (currentWifiState.contains("configured") == true) { + global::wifi::isConnected = true; + return global::wifi::WifiState::Configured; + } + else if (currentWifiState.contains("enabled") == true) { + global::wifi::isConnected = false; + return global::wifi::WifiState::Enabled; + } + else if (currentWifiState.contains("disabled") == true) { + global::wifi::isConnected = false; + return global::wifi::WifiState::Disabled; + } else { + global::wifi::isConnected = false; + log("Critical error, checkWifiState()", "functions.h"); + return global::wifi::WifiState::Unknown; + } + } + int testPing() { + // For some reason, implementing a non-blocking version of this functions triggers a "terminate called without an active exception" error with a platform plugin compiled with a newer GCC 11 toolchain. The problem has been solved by transplanting this function into the related area which uses it. + QProcess *pingProcess = new QProcess(); + QString pingProg = "ping"; + QStringList pingArgs; + pingArgs << "-c" << "1" << "1.1.1.1"; + pingProcess->start(pingProg, pingArgs); + pingProcess->waitForFinished(); + int exitCode = pingProcess->exitCode(); + pingProcess->deleteLater(); + if(exitCode == 0) { + global::wifi::isConnected = true; + } + else { + global::wifi::isConnected = false; + } + return exitCode; + } } #endif // FUNCTIONS_H diff --git a/src/homeWidget/mainwindow.cpp b/src/homeWidget/mainwindow.cpp index e2e9cef..d7d4d56 100644 --- a/src/homeWidget/mainwindow.cpp +++ b/src/homeWidget/mainwindow.cpp @@ -65,8 +65,6 @@ MainWindow::MainWindow(QWidget *parent) global::usbms::koboxExportExtensions = false; global::mainwindow::tabSwitcher::repaint = true; resetFullWindowException = false; - wifiIconClickedWhileReconnecting = false; - lastWifiState = 0; // Getting the screen's size sW = QGuiApplication::screens()[0]->size().width(); @@ -134,9 +132,13 @@ MainWindow::MainWindow(QWidget *parent) ui->brightnessBtn->setIcon(QIcon(":/resources/frontlight.png")); ui->brightnessBtn->setIconSize(QSize(brightnessIconWidth, brightnessIconHeight)); - setWifiIcon(); + updateWifiState(); if(global::device::isWifiAble == true) { - updateWifiIcon(0); + // Start wifi updater + QTimer *wifiIconTimer = new QTimer(this); + wifiIconTimer->setInterval(5000); + connect(wifiIconTimer, SIGNAL(timeout()), this, SLOT(updateWifiState())); + wifiIconTimer->start(); } setBatteryIcon(); @@ -749,90 +751,34 @@ void MainWindow::setupSearchDialog() { } } -void MainWindow::updateWifiIcon(int mode) { +void MainWindow::updateWifiIcon(global::wifi::WifiState mode) { /* Usage: - * mode 0: auto - * mode 1: off - * mode 2: standby - * mode 3: connected + * mode 0 is handled in mainwindow() */ - if(mode == 0) { - lastWifiState = 0; - QTimer *wifiIconTimer = new QTimer(this); - wifiIconTimer->setInterval(10000); - connect(wifiIconTimer, SIGNAL(timeout()), this, SLOT(setWifiIcon())); - wifiIconTimer->start(); - } - if(mode == 1) { - lastWifiState = 1; + if(mode == global::wifi::WifiState::Disabled) { + lastWifiState = global::wifi::WifiState::Disabled; ui->wifiBtn->setIcon(QIcon(":/resources/wifi-off.png")); ui->wifiBtn->setIconSize(QSize(wifiIconWidth, wifiIconHeight)); } - if(mode == 2) { - lastWifiState = 2; + if(mode == global::wifi::WifiState::Enabled) { + lastWifiState = global::wifi::WifiState::Enabled; ui->wifiBtn->setIcon(QIcon(":/resources/wifi-standby.png")); ui->wifiBtn->setIconSize(QSize(wifiIconWidth, wifiIconHeight)); } - if(mode == 3) { - lastWifiState = 3; + if(mode == global::wifi::WifiState::Configured) { + lastWifiState = global::wifi::WifiState::Configured; ui->wifiBtn->setIcon(QIcon(":/resources/wifi-connected.png")); ui->wifiBtn->setIconSize(QSize(wifiIconWidth, wifiIconHeight)); } } -bool MainWindow::checkWifiState() { - /* Return value: - * true: interface UP - * false: interface DOWN - */ - if(global::deviceID == "n437\n") { - string_checkconfig_ro("/sys/class/net/wlan0/operstate"); - } - else { - string_checkconfig_ro("/sys/class/net/eth0/operstate"); - } - - if(checkconfig_str_val == "up\n") { - return true; - } - else { - return false; - } -} - -void MainWindow::setWifiIcon() { +void MainWindow::updateWifiState() { if(global::device::isWifiAble == true) { - if(checkWifiState() == true) { - // testPing() the non-blocking way - QProcess * pingProcess = new QProcess(); - QString pingProg = "sh"; - QStringList pingArgs; - pingArgs << "/mnt/onboard/.adds/inkbox/test_ping.sh"; - pingProcess->startDetached(pingProg, pingArgs); - pingProcess->deleteLater(); - - getTestPingResults(); - if(global::network::isConnected == true) { - if(lastWifiState != 3) { - lastWifiState = 3; - ui->wifiBtn->setIcon(QIcon(":/resources/wifi-connected.png")); - ui->wifiBtn->setIconSize(QSize(wifiIconWidth, wifiIconHeight)); - } - } - else { - if(lastWifiState != 2) { - lastWifiState = 2; - ui->wifiBtn->setIcon(QIcon(":/resources/wifi-standby.png")); - ui->wifiBtn->setIconSize(QSize(wifiIconWidth, wifiIconHeight)); - } - } - } - else { - if(lastWifiState != 1) { - lastWifiState = 1; - ui->wifiBtn->setIcon(QIcon(":/resources/wifi-off.png")); - ui->wifiBtn->setIconSize(QSize(wifiIconWidth, wifiIconHeight)); - } + global::wifi::WifiState currentWifiState = checkWifiState(); + if(lastWifiState != currentWifiState) { + // This is handled by updateWifiIcon() + //lastWifiState = currentWifiState; + updateWifiIcon(currentWifiState); } } else { @@ -841,31 +787,10 @@ void MainWindow::setWifiIcon() { } } -void MainWindow::openWifiDialog() { - log("Opening Wi-Fi connection interface", className); - if(checkconfig("/external_root/run/was_connected_to_wifi") == true and wifiIconClickedWhileReconnecting == false) { - showToast("Reconnection in progress\nTap again to cancel"); - wifiIconClickedWhileReconnecting = true; - QTimer::singleShot(10000, this, SLOT(resetWifiIconClickedWhileReconnecting())); - } - else { - if(wifiIconClickedWhileReconnecting == true) { - string_writeconfig("/opt/ibxd", "stop_wifi_reconnection\n"); - while(true) { - if(QFile::exists("/run/stop_wifi_reconnection_done")) { - QFile::remove("/run/stop_wifi_reconnection_done"); - break; - } - } - } - global::toast::wifiToast = true; - showToast("Searching for networks"); - } -} - void MainWindow::on_wifiBtn_clicked() { - openWifiDialog(); + wifiDialog* newWIfiDialog = new wifiDialog(); + newWIfiDialog->exec(); } void MainWindow::showToast(QString messageToDisplay) { @@ -963,7 +888,7 @@ void MainWindow::openEncfsRepackDialog() { void MainWindow::on_libraryButton_clicked() { log("Launching Online Library", className); - if(testPing(true) == 0 or global::deviceID == "emu\n") { + if(testPing() == 0 or global::deviceID == "emu\n") { resetFullWindowException = true; resetWindow(false); if(global::mainwindow::tabSwitcher::libraryWidgetSelected != true) { @@ -1000,7 +925,7 @@ void MainWindow::resetFullWindow() { } void MainWindow::checkForOtaUpdate() { - if(global::network::isConnected == true) { + if(global::wifi::isConnected == true) { string_checkconfig_ro("/external_root/opt/storage/update/last_sync"); if(!checkconfig_str_val.isEmpty()) { unsigned long currentEpoch = QDateTime::currentSecsSinceEpoch(); @@ -1016,10 +941,6 @@ void MainWindow::checkForOtaUpdate() { } } -void MainWindow::resetWifiIconClickedWhileReconnecting() { - wifiIconClickedWhileReconnecting = false; -} - void MainWindow::setupLocalLibraryWidget() { localLibraryWidgetWindow = new localLibraryWidget(this); QObject::connect(localLibraryWidgetWindow, &localLibraryWidget::openBookSignal, this, &MainWindow::openBookFile); diff --git a/src/homeWidget/mainwindow.h b/src/homeWidget/mainwindow.h index 9cebc0c..fc76401 100644 --- a/src/homeWidget/mainwindow.h +++ b/src/homeWidget/mainwindow.h @@ -51,8 +51,7 @@ public: bool existing_recent_books = false; bool reboot_after_update = false; bool resetFullWindowException; - bool wifiIconClickedWhileReconnecting; - int lastWifiState; + global::wifi::WifiState lastWifiState = global::wifi::WifiState::Unknown; int timerTime = 0; QString relative_path; QString usbmsStatus; @@ -62,7 +61,6 @@ public: void openUsbmsDialog(); void resetIcons(); void setBatteryIcon(); - bool checkWifiState(); public slots: @@ -74,14 +72,13 @@ private slots: void on_quitBtn_clicked(); void on_brightnessBtn_clicked(); void openUpdateDialog(); - void openWifiDialog(); void setInitialBrightness(); void on_homeBtn_clicked(); void refreshScreen(); void setupSearchDialog(); - void setWifiIcon(); + void updateWifiState(); void on_wifiBtn_clicked(); - void updateWifiIcon(int mode); + void updateWifiIcon(global::wifi::WifiState mode); void hello(int testNumber); void showToast(QString messageToDisplay); void closeIndefiniteToast(); @@ -95,7 +92,6 @@ private slots: void on_libraryButton_clicked(); void resetWindow(bool resetStackedWidget); void resetFullWindow(); - void resetWifiIconClickedWhileReconnecting(); void setupLocalLibraryWidget(); void setupHomePageWidget(); diff --git a/src/main.cpp b/src/main.cpp index 6fc6653..a924a69 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -41,6 +41,9 @@ int main(int argc, char *argv[]) global::logger::status = true; } } + // Szybet testing + global::logger::status = true; + global::deviceID = readFile("/opt/inkbox_device"); log("Running on device " + global::deviceID, "main", true); @@ -226,7 +229,8 @@ int main(int argc, char *argv[]) } const QScreen * screen = qApp->primaryScreen(); - w.setGeometry(QRect(QPoint(0,0), screen->geometry ().size())); + w.setGeometry(QRect(QPoint(0,0), screen->geometry().size())); + w.setFixedSize(QSize(screen->geometry().height(), screen->geometry().width())); w.show(); return a.exec(); } diff --git a/src/resources/refresh.png b/src/resources/refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..6f07016a5014a83d051d467cd5b30c01ff8f93c7 GIT binary patch literal 13021 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 rQk^^@VK6v1QvQzv9)qhm0 literal 0 HcmV?d00001 diff --git a/src/resources/stop.png b/src/resources/stop.png new file mode 100644 index 0000000000000000000000000000000000000000..b813bb05b43a84babbbafddbf7d61084f0601b9a GIT binary patch literal 11604 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 literal 0 HcmV?d00001 diff --git a/src/resources/wifi-standby.png b/src/resources/wifi-standby.png index 5fa26f2985c2504edd114e132f33eef64d59f120..de669fbe7e6c4bf9436c7f2b547d98a01a0d09cc 100644 GIT binary patch literal 15784 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 NOi@FjLe4zoe*x;fBIE!7 literal 3559 zcmdUxd010d7QoMYSp~A7fFNKJ&;b=SRE1cO1fmtn)U_&%3jvFkRtbu-2!RJdUv{pwEZPM05}2ui&p{QNX3E8MB;Va-9Z2>EkZ6|5g?ZfqjoB{L~IKOaNV!k zzsSF4h1K5WtB*U)=Jp8N_Z7bz%(vcgccxXb-%0D=>=wuWSuj7sf7J#DMsuoKnze>C zdFw{U4GdoctG2N*;P#UDFVCHEKC|yihwAItn{C=5C=L$)>fSu=$CtKmSry=(7h)|x z%NC`&;+gdg?{rO@!D$`5bi(IU1^wpB-k~z5PpZRYvT29I(<3G+`OB3Lm`_#hwzF=` z>|5BEA24}ZQs<@iKKrM?yMf=#F1X*|y(2rwZTGo5btT(Asa;*WW6cjULaxV`>}+W- zS@XO^wS4qSly69I*SlvzztLn)_vaTE<(Qq)>@V8rQs49F{zk(dzW9~_M`*i8K}Ki5NX z$jI6i@WB$+6BcI@E@_f?L;#p~1}ygdFz!LmW8X;oz=^Q(+oH|U_xmqQW^Rj{zVf5M zjn=(qSo!X23ha(bM;}E}FZh2LWb)Oe@ae_Y-m0~x)_8{uEsjIbKz^k^l%G!~hWrpfe$Ujl2tT7CfG`Ded?+9pCip*t8Xo)K0HTH`r1Oyy(3EKQiKFuu zVu}f&ZHhVWc{rI`?N|LMERsPmQjez;T>Z5R_ zz-ppWRN?C;KuwyO7n3(K9V~cUscx&W0K{(TbWLlwC#DcvFceSk$K#~X7D(=S8iQEc zdz%(>ROJfZyK)^g&OQE^J~ZJjp^6CU!b!O?6Z5*u{hUE$Jim<_f3KQi4!QT_jPA7+ z3#?%3iDNunxpBK2c)yn+&?NM<1VJ3Zl`41-Yl^|3cSw@4bvMp|;rh6C8)=$xtr^jM z<60}S#Zj6ex+2lrHkUze>g{>c=kLu2ugda{YsU<(&^_GJB;Zv$gJvvYD0$f6m<;7b zv8=1SM{O)VradH1x<#e$+2f2p^==cEChOglE%>$rC45ip=3#J50?S(!q7K$ml-HD& zMRroRYXTYl^^1CwXdy~?QS9ccysIb_u1%PiWSb);*v}pp_Q|8hLou}j*Bz3f;=PwzwTf1B-uqo>Wm-jkp#*B$eNU*b@4yY)Wo=vDPAXHksOVEI z$Rxdq!TQf;zaqtEXbt`%UVaiB&C9>m+Ld0m}v7aeo9R`cfP^8l4Ib= z&K-1fb%=@195~&y#sl0O-Rz>xp4jJEKp-Ql)nvVmF2w#=z4fmiCCNK^Nr77wsk!1XaQ>k9i`LeQV(;#$d|Zn{*|}A&jk1JBJ(XKWnw=jJilK)|MW;T zC$|j~$yB-8_K}8}$x$_73YmrCtoDVr;og{@SrbL@$Sb!CGPG@Wi94W9-3f}$WeEMGJ)4Kx=uCF0dxW|(4S z=)%yZ2Gj%muDo-lyTFT1Fw&l=gXd?l!JL)FEQ|241e@$Se9OHOCvcl|gWgd3oizjr z53=&Z%iKUCb~6(ZQ@x0t&@xhxGT zu@wf?V_bC8agv;}RaLKsAr=X%kG*3dlzf!RkgTEh%4OK;$$D32h;ir@Lo3lZ2 z;8>E)Idt#SnQob*hMes6)@0{xjf8 z{r(CJ7B_omWTkz5QyGZz~9WsdFwiy2~=r}gN~nEov4_jZ0cnOXPnx< zUgJ-wj>ezV?D2Y_rsYT}f61s2*T*EhvIO=9It1mQe+r7T00J##0Kzy+P}t#Y0Q6wU zQ&yt1ro!7taEa@;Bz>AjV;hHN+4F(CnlXBNY*Q$;DxEs%P}NE+0>Hz|6fzJ^T?oi@ zRtO(i97ZyHXztLeOr#H=uYVc)TFX-67!>bSexES8g|V*lERZ{^hPOUDOD$rJV06P? zxSSJSH@&1%=a|%6mr(5qde5XpXS7iX$K=z|Cat5Ah4w|Osqb?@dogC@gQmXzoXa9Q zq#Z0j-s2d*lnw0JO7n;7UmoNGfBhqy3+0`&MIbzXarURZ-zWHiY+J@J^v(1o;NOqZkuUnb+6gT0IpCi^E!@$tO%JL)*%y$ ziINS;rqgCHst=U^cQW>_EcK@UBt+v={6wgq12~D$^$)%Be>sly*}uHRx@kImvx@qR NfF;Wom-;DE{{lkv$f5uM diff --git a/src/settings/settings.cpp b/src/settings/settings.cpp index a0a85ff..8a626d6 100644 --- a/src/settings/settings.cpp +++ b/src/settings/settings.cpp @@ -846,7 +846,7 @@ void settings::on_globalReadingSettingsCheckBox_toggled(bool checked) void settings::on_checkOtaUpdateBtn_clicked() { log("'Check for OTA update' button clicked", className); - if(testPing(true) == 0 or global::deviceID == "emu\n") { + if(testPing() == 0 or global::deviceID == "emu\n") { launchOtaUpdater(); } else { diff --git a/src/widgets/dialogs/generaldialog.cpp b/src/widgets/dialogs/generaldialog.cpp index 0a8cd1c..997dab6 100644 --- a/src/widgets/dialogs/generaldialog.cpp +++ b/src/widgets/dialogs/generaldialog.cpp @@ -419,7 +419,7 @@ void generalDialog::on_okBtn_clicked() } } else if(ui->searchComboBox->currentText() == "Online library") { - if(testPing(true) == 0 or global::deviceID == "emu\n") { + if(testPing() == 0 or global::deviceID == "emu\n") { string_writeconfig("/inkbox/searchComboBoxFunction", "Online library"); log("Searching online library for '" + global::keyboard::keyboardText + "'", className); @@ -648,20 +648,6 @@ void generalDialog::startVNC(QString server, QString password, QString port) { qApp->quit(); } -void generalDialog::connectToNetworkSlot() { - if(connectToNetwork(wifiEssid, wifiPassphrase) == true) { - emit updateWifiIcon(3); - emit closeIndefiniteToast(); - emit showToast("Connection successful"); - } - else { - emit updateWifiIcon(2); - emit closeIndefiniteToast(); - emit showToast("Connection failed"); - } - generalDialog::close(); -} - void generalDialog::startOtaUpdate(bool wasDownloadSuccessful) { emit closeIndefiniteToast(); if(wasDownloadSuccessful == true) { diff --git a/src/widgets/dialogs/generaldialog.h b/src/widgets/dialogs/generaldialog.h index 08d1001..a1e742c 100644 --- a/src/widgets/dialogs/generaldialog.h +++ b/src/widgets/dialogs/generaldialog.h @@ -63,7 +63,6 @@ private slots: void adjust_size(); void restartSearchDialog(); void refreshScreenNative(); - void connectToNetworkSlot(); void startOtaUpdate(bool wasDownloadSuccessful); void openBookFileNative(QString book, bool relativePath); void showToastNative(QString messageToDisplay); diff --git a/src/widgets/dialogs/wifi/wifidialog.cpp b/src/widgets/dialogs/wifi/wifidialog.cpp index 34e3f6c..9fec05c 100644 --- a/src/widgets/dialogs/wifi/wifidialog.cpp +++ b/src/widgets/dialogs/wifi/wifidialog.cpp @@ -14,7 +14,6 @@ wifiDialog::wifiDialog(QWidget *parent) : ui(new Ui::wifiDialog) { ui->setupUi(this); - wifiListTimer = new QTimer(this); // Stylesheet, style & misc. QFile stylesheetFile("/mnt/onboard/.adds/inkbox/eink.qss"); @@ -23,15 +22,34 @@ wifiDialog::wifiDialog(QWidget *parent) : stylesheetFile.close(); this->setModal(true); - ui->cancelBtn->setProperty("type", "borderless"); - ui->connectBtn->setProperty("type", "borderless"); - ui->cancelBtn->setStyleSheet("font-size: 9pt; padding: 10px; font-weight: bold; background: lightGrey"); - ui->connectBtn->setStyleSheet("font-size: 9pt; padding: 10px; font-weight: bold; background: lightGrey"); - ui->mainLabel->setStyleSheet("padding-left: 125px; padding-right: 125px"); - ui->networksListWidget->setFont(QFont("u001")); - ui->networksListWidget->setStyleSheet("font-size: 9pt"); + ui->stopBtn->setIcon(QIcon(":/resources/stop.png")); + ui->logBtn->setIcon(QIcon(":/resources/file-text.png")); + ui->refreshBtn->setIcon(QIcon(":/resources/refresh.png")); + + ui->Wificheckbox->setStyleSheet("QCheckBox::indicator { width:50px; height: 50px; }"); + + // Size + QRect screenGeometry = QGuiApplication::screens()[0]->geometry(); + this->setFixedWidth(screenGeometry.width()); + + int halfOfHalfHeight = ((screenGeometry.height() / 2) / 2) / 2; + int finalHeight = screenGeometry.height() - halfOfHalfHeight * 2; + + this->setFixedHeight(finalHeight); + this->move(0, halfOfHalfHeight); + + // Button sizes + ui->stopBtn->setFixedWidth(screenGeometry.width() / 8); + ui->logBtn->setFixedWidth(screenGeometry.width() / 8); + ui->refreshBtn->setFixedWidth(screenGeometry.width() / 8); + + int heighIncrease = 20; + ui->stopBtn->setFixedHeight(ui->stopBtn->height() + heighIncrease); + ui->logBtn->setFixedHeight(ui->logBtn->height() + heighIncrease); + ui->refreshBtn->setFixedHeight(ui->refreshBtn->height() + heighIncrease); + + //ui->cancelBtn->setProperty("type", "borderless"); - checkWifiNetworks(); } wifiDialog::~wifiDialog() @@ -39,93 +57,6 @@ wifiDialog::~wifiDialog() delete ui; } -void wifiDialog::checkWifiNetworks() { - string_writeconfig("/opt/ibxd", "list_wifi_networks\n"); - wifiListTimer->setInterval(100); - connect(wifiListTimer, &QTimer::timeout, [&]() { - if(QFile::exists("/run/wifi_networks_list")) { - printWifiNetworks(); - wifiListTimer->stop(); - } - } ); - wifiListTimer->start(); -} - -void wifiDialog::printWifiNetworks() { - if(readFile("/run/wifi_networks_list").isEmpty()) { - log("Wi-Fi networks list empty", className); - QFile::remove("/run/wifi_networks_list"); - emit quit(1); - wifiDialog::close(); - } - else { - log("Parsing Wi-Fi networks list", className); - QFile wifiNetworksListFile("/run/wifi_networks_list"); - wifiNetworksListFile.open(QIODevice::ReadWrite); - QTextStream in (&wifiNetworksListFile); - wifiNetworksList = in.readAll(); - wifiNetworksListFile.close(); - QFile::remove("/run/wifi_networks_list"); - - QStringListModel* model = new QStringListModel(this); - QStringList list = wifiNetworksList.split("\n", QString::SkipEmptyParts); - model->setStringList(list); - ui->networksListWidget->setModel(model); - ui->networksListWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); - - emit wifiNetworksListReady(1); - } -} - -void wifiDialog::centerDialog() { - // Centering dialog - // Get current screen size - QRect rec = QGuiApplication::screenAt(this->pos())->geometry(); - // Using minimum size of window - QSize size = this->minimumSize(); - // Set top left point - QPoint topLeft = QPoint((rec.width() / 2) - (size.width() / 2), (rec.height() / 2) - (size.height() / 2)); - // set window position - setGeometry(QRect(topLeft, size)); -} - -void wifiDialog::on_cancelBtn_clicked() -{ - string_writeconfig("/opt/ibxd", "toggle_wifi_off\n"); - while(true) { - if(QFile::exists("/run/toggle_wifi_off_done")) { - QFile::remove("/run/toggle_wifi_off_done"); - break; - } - } - emit quit(0); - wifiDialog::close(); -} - -void wifiDialog::on_connectBtn_clicked() -{ - index = ui->networksListWidget->currentIndex(); - itemText = index.data(Qt::DisplayRole).toString(); - if(itemText.isEmpty()) { - showToast("You must select a network"); - } - else { - this->hide(); - global::keyboard::keyboardDialog = true; - global::keyboard::wifiPassphraseDialog = true; - global::keyboard::keyboardText = ""; - generalDialogWindow = new generalDialog(); - generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose); - generalDialogWindow->wifiEssid = itemText; - connect(generalDialogWindow, SIGNAL(refreshScreen()), SLOT(refreshScreenNative())); - connect(generalDialogWindow, SIGNAL(updateWifiIcon(int)), SLOT(updateWifiIcon(int))); - connect(generalDialogWindow, SIGNAL(showToast(QString)), SLOT(showToastNative(QString))); - connect(generalDialogWindow, SIGNAL(closeIndefiniteToast()), SLOT(closeIndefiniteToastNative())); - connect(generalDialogWindow, SIGNAL(destroyed(QObject*)), SLOT(close())); - generalDialogWindow->show(); - } -} - void wifiDialog::refreshScreenNative() { emit refreshScreen(); } @@ -141,3 +72,99 @@ void wifiDialog::showToastNative(QString messageToDisplay) { void wifiDialog::closeIndefiniteToastNative() { emit closeIndefiniteToast(); } + +/* + + this->hide(); + global::keyboard::keyboardDialog = true; + global::keyboard::wifiPassphraseDialog = true; + global::keyboard::keyboardText = ""; + generalDialogWindow = new generalDialog(); + generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose); + generalDialogWindow->wifiEssid = itemText; + connect(generalDialogWindow, SIGNAL(refreshScreen()), SLOT(refreshScreenNative())); + connect(generalDialogWindow, SIGNAL(updateWifiIcon(int)), SLOT(updateWifiIcon(int))); + connect(generalDialogWindow, SIGNAL(showToast(QString)), SLOT(showToastNative(QString))); + connect(generalDialogWindow, SIGNAL(closeIndefiniteToast()), SLOT(closeIndefiniteToastNative())); + connect(generalDialogWindow, SIGNAL(destroyed(QObject*)), SLOT(close())); + generalDialogWindow->show(); + +*/ + +/* + bool connectToNetwork(QString essid, QString passphrase) { + log("Connecting to network '" + essid + "'", "functions"); + std::string essid_str = essid.toStdString(); + std::string passphrase_str = passphrase.toStdString(); + string_writeconfig("/run/wifi_network_essid", essid_str); + string_writeconfig("/run/wifi_network_passphrase", passphrase_str); + string_writeconfig("/opt/ibxd", "connect_to_wifi_network\n"); + + int connectionSuccessful = 0; + + while(connectionSuccessful == 0) { + if(QFile::exists("/run/wifi_connected_successfully")) { + if(checkconfig("/run/wifi_connected_successfully") == true) { + QFile::remove("/run/wifi_connected_successfully"); + connectionSuccessful = 1; + global::network::isConnected = true; + setDefaultWorkDir(); + string_writeconfig(".config/17-wifi_connection_information/essid", essid_str); + string_writeconfig(".config/17-wifi_connection_information/passphrase", passphrase_str); + QString function = __func__; log(function + ": Connection successful", "functions"); + return true; + } + else { + QFile::remove("/run/wifi_connected_successfully"); + connectionSuccessful = 0; + global::network::isConnected = false; + QString function = __func__; log(function + ": Connection failed", "functions"); + return false; + } + } + else { + QThread::msleep(100); + } + } + } +*/ +/* + int testPing(bool blocking) { + QProcess *pingProcess = new QProcess(); + if(blocking == true) { + QString pingProg = "ping"; + QStringList pingArgs; + pingArgs << "-c" << "1" << "1.1.1.1"; + pingProcess->start(pingProg, pingArgs); + pingProcess->waitForFinished(); + int exitCode = pingProcess->exitCode(); + pingProcess->deleteLater(); + if(exitCode == 0) { + global::network::isConnected = true; + } + else { + global::network::isConnected = false; + } + return exitCode; + } + // For some reason, implementing a non-blocking version of this functions triggers a "terminate called without an active exception" error with a platform plugin compiled with a newer GCC 11 toolchain. The problem has been solved by transplanting this function into the related area which uses it. + pingProcess->deleteLater(); + } + bool getTestPingResults() { + // To be used when the testPing() function is used in non-blocking mode. + if(QFile::exists("/run/test_ping_status")) { + if(checkconfig("/run/test_ping_status") == true) { + global::network::isConnected = true; + return true; + } + else { + global::network::isConnected = false; + return false; + } + } + else { + global::network::isConnected = false; + return false; + } + } +*/ diff --git a/src/widgets/dialogs/wifi/wifidialog.h b/src/widgets/dialogs/wifi/wifidialog.h index cd98c92..78173ee 100644 --- a/src/widgets/dialogs/wifi/wifidialog.h +++ b/src/widgets/dialogs/wifi/wifidialog.h @@ -18,29 +18,17 @@ public: QString className = this->metaObject()->className(); explicit wifiDialog(QWidget *parent = nullptr); ~wifiDialog(); - QString wifiNetworksList; - QString itemText; - QModelIndex index; - void checkWifiNetworks(); - void printWifiNetworks(); - void centerDialog(); private: Ui::wifiDialog *ui; - QTimer * wifiListTimer; - generalDialog * generalDialogWindow; signals: - void wifiNetworksListReady(int networksFound); - void quit(int exitCode); void refreshScreen(); void updateWifiIconSig(int mode); void showToast(QString messageToDisplay); void closeIndefiniteToast(); private slots: - void on_cancelBtn_clicked(); - void on_connectBtn_clicked(); void refreshScreenNative(); void updateWifiIcon(int mode); void showToastNative(QString messageToDisplay); diff --git a/src/widgets/dialogs/wifi/wifidialog.ui b/src/widgets/dialogs/wifi/wifidialog.ui index 10409eb..94702a2 100644 --- a/src/widgets/dialogs/wifi/wifidialog.ui +++ b/src/widgets/dialogs/wifi/wifidialog.ui @@ -6,8 +6,8 @@ 0 0 - 400 - 300 + 783 + 679 @@ -15,83 +15,162 @@ - - - - - 0 + + + QLayout::SetFixedSize + + + + + QLayout::SetMaximumSize - + - - 0 - - - 0 - - - 0 - - - 0 + + 2 - - - + + + - + 0 0 + + + - - + + + + + 0 + 0 + + + + + + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + - 75 - true + 9 - Select a network - - - Qt::AlignCenter + Wifi status - - - - 0 - - - - - Connect - - - - - - - Cancel - - - - - - - + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Wifi + + + + + + + + + + + + + + + QFrame::Box + + + QFrame::Plain + + + 3 + + + Qt::ScrollBarAlwaysOff + + + true + + + + + 0 + 0 + 759 + 570 + + + + + + + + + + + 0 + 0 + + + + Return + + + diff --git a/src/widgets/interfaceWidgets/toast.cpp b/src/widgets/interfaceWidgets/toast.cpp index 305d4f8..c89a439 100644 --- a/src/widgets/interfaceWidgets/toast.cpp +++ b/src/widgets/interfaceWidgets/toast.cpp @@ -27,27 +27,12 @@ toast::toast(QWidget *parent) : global::toast::delay = 5000; } } - if(global::toast::wifiToast == true) { - global::toast::wifiToast = false; - this->setModal(true); - wifiDialogWindow = new wifiDialog(this); - wifiDialogWindow->setAttribute(Qt::WA_DeleteOnClose); - connect(wifiDialogWindow, SIGNAL(wifiNetworksListReady(int)), SLOT(showWifiDialog(int))); - connect(wifiDialogWindow, SIGNAL(quit(int)), SLOT(exitSlot(int))); - connect(wifiDialogWindow, SIGNAL(refreshScreen()), SLOT(refreshScreenNative())); - connect(wifiDialogWindow, SIGNAL(updateWifiIconSig(int)), SLOT(updateWifiIcon(int))); - connect(wifiDialogWindow, SIGNAL(showToast(QString)), SLOT(showToastNative(QString))); - connect(wifiDialogWindow, SIGNAL(closeIndefiniteToast()), SLOT(closeIndefiniteToastNative())); - connect(wifiDialogWindow, SIGNAL(destroyed(QObject*)), SLOT(close())); + if(global::toast::indefiniteToast == false) { + QTimer::singleShot(global::toast::delay, this, SLOT(close())); + global::toast::delay = 0; } else { - if(global::toast::indefiniteToast == false) { - QTimer::singleShot(global::toast::delay, this, SLOT(close())); - global::toast::delay = 0; - } - else { - global::toast::indefiniteToast = false; - } + global::toast::indefiniteToast = false; } } @@ -56,16 +41,6 @@ toast::~toast() delete ui; } -void toast::showWifiDialog(int networksFound) { - if(networksFound == 1) { - emit updateWifiIconSig(2); - this->hide(); - wifiDialogWindow->show(); - wifiDialogWindow->adjustSize(); - wifiDialogWindow->centerDialog(); - } -} - void toast::centerToast() { // Centering toast (https://stackoverflow.com/a/58682351) // Get current screen size @@ -91,10 +66,6 @@ void toast::refreshScreenNative() { emit refreshScreen(); } -void toast::updateWifiIcon(int mode) { - emit updateWifiIconSig(mode); -} - void toast::showToastNative(QString messageToDisplay) { emit showToast(messageToDisplay); } diff --git a/src/widgets/interfaceWidgets/toast.h b/src/widgets/interfaceWidgets/toast.h index fa1cac8..5b4b427 100644 --- a/src/widgets/interfaceWidgets/toast.h +++ b/src/widgets/interfaceWidgets/toast.h @@ -21,13 +21,10 @@ public: private: Ui::toast *ui; - wifiDialog *wifiDialogWindow; private slots: - void showWifiDialog(int networksFound); void exitSlot(int exitCode); void refreshScreenNative(); - void updateWifiIcon(int mode); void showToastNative(QString messageToDisplay); void closeIndefiniteToastNative();