From 9bfa1e11fe46a72b8a2a6ba8f9d9016ac113c7d7 Mon Sep 17 00:00:00 2001 From: TheUnrealDragon Date: Wed, 1 Apr 2026 18:33:19 +0530 Subject: [PATCH 01/24] first commit --- .gitignore | 82 +++ CMakeLists.txt | 97 ++++ Main.qml | 532 ++++++++++++++++++ NotificationManager.java | 14 + WaterTank1.png | Bin 0 -> 327042 bytes android/AndroidManifest.xml | 68 +++ android/build.gradle | 83 +++ android/res/drawable-hdpi/ic_launcher.png | Bin 0 -> 7299 bytes android/res/drawable-mdpi/ic_launcher.png | Bin 0 -> 4046 bytes android/res/drawable-xhdpi/ic_launcher.png | Bin 0 -> 11369 bytes android/res/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 21305 bytes android/res/drawable-xxxhdpi/ic_launcher.png | Bin 0 -> 33431 bytes .../.WaterLevelService.java.kate-swp | Bin 0 -> 370 bytes .../WaterLevelReceiver.java | 17 + .../WaterLevelService.java | 210 +++++++ .../WaterLevelServiceStarter.java | 19 + configinterface.cpp | 108 ++++ configinterface.h | 45 ++ images.qrc | 5 + main.cpp | 18 + moving_container.h | 89 +++ service.cpp | 115 ++++ service.h | 15 + servicemain.cpp | 12 + udplistener.cpp | 161 ++++++ udplistener.h | 61 ++ 26 files changed, 1751 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 Main.qml create mode 100644 NotificationManager.java create mode 100644 WaterTank1.png create mode 100644 android/AndroidManifest.xml create mode 100644 android/build.gradle create mode 100644 android/res/drawable-hdpi/ic_launcher.png create mode 100644 android/res/drawable-mdpi/ic_launcher.png create mode 100644 android/res/drawable-xhdpi/ic_launcher.png create mode 100644 android/res/drawable-xxhdpi/ic_launcher.png create mode 100644 android/res/drawable-xxxhdpi/ic_launcher.png create mode 100644 android/src/org/qtproject/example/appwaterLevelSensor/.WaterLevelService.java.kate-swp create mode 100644 android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelReceiver.java create mode 100644 android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java create mode 100644 android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelServiceStarter.java create mode 100644 configinterface.cpp create mode 100644 configinterface.h create mode 100644 images.qrc create mode 100644 main.cpp create mode 100644 moving_container.h create mode 100644 service.cpp create mode 100644 service.h create mode 100644 servicemain.cpp create mode 100644 udplistener.cpp create mode 100644 udplistener.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa3808c --- /dev/null +++ b/.gitignore @@ -0,0 +1,82 @@ +# This file is used to ignore files which are generated +# ---------------------------------------------------------------------------- + +*~ +*.autosave +*.a +*.core +*.moc +*.o +*.obj +*.orig +*.rej +*.so +*.so.* +*_pch.h.cpp +*_resource.rc +*.qm +.#* +*.*# +core +!core/ +tags +.DS_Store +.directory +*.debug +Makefile* +*.prl +*.app +moc_*.cpp +ui_*.h +qrc_*.cpp +Thumbs.db +*.res +*.rc +/.qmake.cache +/.qmake.stash + +# qtcreator generated files +*.pro.user* +*.qbs.user* +CMakeLists.txt.user* + +# xemacs temporary files +*.flc + +# Vim temporary files +.*.swp + +# Visual Studio generated files +*.ib_pdb_index +*.idb +*.ilk +*.pdb +*.sln +*.suo +*.vcproj +*vcproj.*.*.user +*.ncb +*.sdf +*.opensdf +*.vcxproj +*vcxproj.* + +# MinGW generated files +*.Debug +*.Release + +# Python byte code +*.pyc + +# Binaries +# -------- +*.dll +*.exe + +# Directories with generated files +.moc/ +.obj/ +.pch/ +.rcc/ +.uic/ +/build*/ diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..c116d03 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,97 @@ +cmake_minimum_required(VERSION 3.16) + +project(waterLevelSensor VERSION 0.1 LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_AUTORCC ON) + +find_package(Qt6 REQUIRED COMPONENTS Quick Network) + +qt_standard_project_setup(REQUIRES 6.9) + +qt_add_executable(appwaterLevelSensor + main.cpp + images.qrc +) + + +if(ANDROID) +qt_add_library(service SHARED + servicemain.cpp + service.h service.cpp +) +set_property(TARGET appwaterLevelSensor APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR + ${CMAKE_CURRENT_SOURCE_DIR}/android) +set_property(TARGET service APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR + ${CMAKE_CURRENT_SOURCE_DIR}/android) + + +target_link_libraries(service + PRIVATE + Qt::Core + Qt::CorePrivate + Qt::Network + Qt::Quick +) +qt_add_qml_module(appwaterLevelSensor + URI waterLevelSensor + QML_FILES + Main.qml + RESOURCES + RESOURCES images.qrc + SOURCES moving_container.h + SOURCES configinterface.h configinterface.cpp + SOURCES udplistener.h udplistener.cpp + SOURCES service.h +) +target_link_libraries(appwaterLevelSensor + PRIVATE Qt6::Quick Qt6::Network service +) + +qt_finalize_executable(appwaterLevelSensor) +add_dependencies(appwaterLevelSensor service) + +qt_generate_deploy_app_script( + TARGET appwaterLevelSensor + OUTPUT_SCRIPT deploy_script + NO_UNSUPPORTED_PLATFORM_ERROR +) +install(SCRIPT ${deploy_script}) + +endif() +if(NOT ANDROID) +qt_add_qml_module(appwaterLevelSensor + URI waterLevelSensor + QML_FILES + Main.qml + RESOURCES + RESOURCES images.qrc + SOURCES udplistener.h udplistener.cpp + SOURCES moving_container.h + SOURCES configinterface.h configinterface.cpp +) + +# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1. +# If you are developing for iOS or macOS you should consider setting an +# explicit, fixed bundle identifier manu ally though. +set_target_properties(appwaterLevelSensor PROPERTIES +# MACOSX_BUNDLE_GUI_IDENTIFIER com.example.appwaterLevelSensor + MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} + MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} + MACOSX_BUNDLE TRUE + WIN32_EXECUTABLE TRUE +) + +target_link_libraries(appwaterLevelSensor + PRIVATE Qt6::Quick Qt6::Network +) + +qt_finalize_executable(appwaterLevelSensor) + +include(GNUInstallDirs) +install(TARGETS appwaterLevelSensor + BUNDLE DESTINATION . + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} +) +endif() diff --git a/Main.qml b/Main.qml new file mode 100644 index 0000000..66f221e --- /dev/null +++ b/Main.qml @@ -0,0 +1,532 @@ +import QtQuick +import waterLevelSensor +import QtQuick.Effects +import QtQuick.Controls +import QtQuick.Controls.Material + +Window { + width: 640 + height: 480 + visible: true + title: qsTr("Hello World") + id: root + property color accent_color: "#F05FAF5F" + property color danger_color: "#F0AF2F1F" + property color water_color: "#F00F7FAF" + Material.accent: root.accent_color + property int font_enlarged_text_size: 20 + property int font_normal_text_size: 18 + property double distance: 0 + property int distance_count: 0 + // visibility: Window.FullScreen + Rectangle { + anchors.fill: parent + id: background + color: "#DF0F0F0F" + Rectangle { + id: top_bar + height: Math.min(root.height / 12, 100) + width: root.width + anchors { + top: parent.top + horizontalCenter: parent.horizontalCenter + topMargin: 25 + } + color: "#0A0F0F0F" + + Rectangle { + id: settings_rect + height: top_bar.height - 20 + width: top_bar.width / 12 + anchors { + top: parent.top + left: parent.left + bottomMargin: 5 + topMargin: 5 + leftMargin: 5 + } + Behavior on color { + ColorAnimation { + duration: 200 + } + } + + color: "#0A0F0F0F" + border.color: "#AF121212" + border.width: 0.5 + radius: 2 + Text { + id: settings_text + text: "⚙" + anchors.centerIn: parent + color: root.accent_color + font.pointSize: root.font_enlarged_text_size + } + + MouseArea { + id: settings_button_area + anchors.fill: parent + hoverEnabled: true + property color settings_rect_pressed_prev: "#00000000" + property color settings_rect_entered_prev: "#00000000" + onEntered: { + settings_rect_entered_prev = settings_rect.color + settings_rect.color = "#5A1F1F1F" + } + onExited: { + settings_rect.color = settings_rect_entered_prev + } + onPressed: { + settings_rect_pressed_prev = settings_rect.color + settings_rect.color = "#5A1F4F1F" + settings_popup.open() + } + onReleased: { + settings_rect.color = settings_rect_pressed_prev + } + } + } + + + + Rectangle { + property color old_color: "#0F0F0F0F" + id: status_indicator + width: 20 + height: 20 + radius: 20 + anchors { + top: parent.top + right: parent.right + topMargin: 20 + bottomMargin: 5 + leftMargin: 5 + rightMargin: 20 + } + color: "#F0AF2F1F" + layer.enabled: true + layer.effect: MultiEffect { + shadowEnabled: true + } + } + Text { + id: status_label + anchors { + top: parent.top + topMargin: 20 + right: status_indicator.left + rightMargin: 10 + } + horizontalAlignment: Text.AlignRight + width: parent.width - status_indicator.width + height: parent.height + color: root.accent_color + font.pointSize: root.font_normal_text_size + text: "Disconnected" + } + } + + Rectangle { + id: base + color: "#0A0F0F0F" + width: parent.width + height: parent.height - top_bar.height + anchors { + top: top_bar.bottom + bottom: parent.bottom + horizontalCenter: parent.horizontalCenter + } + + Popup { + id: settings_popup + background: Rectangle { + color: "#F0121212" + radius: 5 + border.color: root.accent_color + border.width: 1 + } + height: parent.height / 1.5 + width: parent.width / 1.5 + anchors.centerIn: Overlay.overlay + + + Rectangle { + id: settings_base + anchors.fill: parent + color: "#F0121212" + + Text { + id: settings_label + text: "Settings" + width: parent.width + anchors { + top: parent.top + horizontalCenter: parent.horizontalCenter + } + horizontalAlignment: Text.AlignHCenter + color: root.accent_color + font.pointSize: root.font_enlarged_text_size + } + + + Text { + id: max_thres_label + text: "Max Threshold: " + anchors { + topMargin: 20 + top: settings_label.bottom + left: parent.left + } + height: max_thres_input.height + verticalAlignment: Text.AlignVCenter + color: root.accent_color + font.pixelSize: root.font_normal_text_size + } + + TextField { + id: max_thres_input + text: config.max + anchors { + left: max_thres_label.right + leftMargin: 5 + top: settings_label.bottom + topMargin: 20 + } + color: root.accent_color + font.pixelSize: root.font_normal_text_size + } + + + Text { + id: min_thres_label + text: "Min Threshold: " + anchors { + topMargin: 20 + top: max_thres_label.bottom + left: parent.left + } + height: min_thres_input.height + verticalAlignment: Text.AlignVCenter + color: root.accent_color + font.pixelSize: root.font_normal_text_size + } + + TextField { + id: min_thres_input + text: config.min + anchors { + left: min_thres_label.right + leftMargin: 5 + top: max_thres_label.bottom + topMargin: 20 + } + color: root.accent_color + font.pixelSize: root.font_normal_text_size + } + + + Text { + id: alert_thres_label + text: "Alert Percentage: " + anchors { + topMargin: 20 + top: min_thres_label.bottom + left: parent.left + } + height: alert_thres_input.height + verticalAlignment: Text.AlignVCenter + color: root.accent_color + font.pixelSize: root.font_normal_text_size + } + + TextField { + id: alert_thres_input + text: config.alert + anchors { + left: alert_thres_label.right + leftMargin: 5 + top: min_thres_label.bottom + topMargin: 20 + } + color: root.accent_color + font.pixelSize: root.font_normal_text_size + } + + Text { + id: settings_error_label + property string settings_error_text: "" + text: "Error: " + settings_error_text + visible: settings_error_text === "" ? false : true + anchors { + topMargin: 20 + top: alert_thres_label.bottom + left: parent.left + horizontalCenter: parent.horizontalCenter + } + horizontalAlignment: Text.AlignHCenter + color: root.danger_color + font.pixelSize: root.font_normal_text_size + } + + + + Rectangle { + id: save_config + anchors { + topMargin: 10 + bottom: parent.bottom + horizontalCenter: parent.horizontalCenter + } + color: "#F0121212" + width: parent.width / 2.5 + height: 60 + border { + width: 1 + color: root.accent_color + } + radius: 3 + + Text { + anchors.centerIn: parent + text: "Save" + color: root.accent_color + font.pointSize: root.font_enlarged_text_size + } + MouseArea { + anchors.fill: parent + hoverEnabled: true + property color settings_rect_pressed_prev: "#00000000" + property color settings_rect_entered_prev: "#00000000" + onEntered: { + settings_rect_entered_prev = save_config.color + save_config.color = "#5A1F1F1F" + } + onExited: { + save_config.color = settings_rect_entered_prev + } + onPressed: { + settings_rect_pressed_prev = save_config.color + save_config.color = "#5A1F4F1F" + let max = parseFloat(min_thres_input.text); + let min = parseFloat(min_thres_input.text); + let alert = parseFloat(alert_thres_input.text); + console.log("Parsed values:", max, min, alert); + if(max < min) { + settings_error_label.settings_error_text = "Max cannot be less than min"; + return; + } + if (alert > 100 || alert < 0) { + settings_error_label.settings_error_text = "Alert must be between 0 to 100"; + return; + } + + + let current_min_reading = Math.max(0, (parseFloat(min_thres_input.text))); + let effective_max_reading = Math.max(0, (parseFloat(max_thres_input.text)) - current_min_reading); + let alert_effective_reading = (effective_max_reading * (100 - alert) / 100) + current_min_reading; + console.log("Alert effective reading is: " + alert_effective_reading + " for value: " + alert); + listener.setAlert(alert_effective_reading); + config.saveConfig(max_thres_input.text, min_thres_input.text, alert_thres_input.text); + settings_popup.close(); + } + onReleased: { + save_config.color = settings_rect_pressed_prev + } + } + } + } + } + + Rectangle { + id: tank_lid + color: "#F0121212" + anchors { + bottom: tank_base.top + horizontalCenter: tank_base.horizontalCenter + bottomMargin: -5 + } + radius: 10 + width: parent.width / 4 + height: parent.height / 15 + } + + Rectangle { + id: tank_base + color: "#0FFFFFFF" + anchors.centerIn: parent + width: parent.width / 2.5 + height: parent.height / 2 + border.color: "#F0121212" + border.width: 5 + radius: 4 + } + + Rectangle { + id: water_level + color: root.water_color + property double height_max: tank_base.height - 10 + property double current_level: 0 + property double percentage_filled: 0 + height: water_level.current_level + width: tank_base.width - 10 + anchors { + bottom: tank_base.bottom + horizontalCenter: tank_base.horizontalCenter + bottomMargin: 5 + } + Behavior on color { + ColorAnimation { + duration: 200 + } + } + Behavior on height { + NumberAnimation { + duration: 200 + } + } + } + Text { + id: info_text + text: "Current Reading: " + root.distance.toFixed(2) + " cm" + anchors { + top: tank_base.bottom + topMargin: 20 + horizontalCenter: parent.horizontalCenter + } + horizontalAlignment: Text.AlignHCenter + color: root.accent_color + font.pixelSize: root.font_normal_text_size + } + + Text { + id: info_percent_text + text: "Percentage filled: " + water_level.percentage_filled.toFixed(2) + " %" + anchors { + top: info_text.bottom + topMargin: 10 + horizontalCenter: parent.horizontalCenter + } + horizontalAlignment: Text.AlignHCenter + color: root.accent_color + font.pixelSize: root.font_normal_text_size + } + + Text { + id: error_text + property string error_string: "" + text: "Error: " + error_string + visible: error_string === "" ? false : true; + anchors { + top: info_percent_text.bottom + topMargin: 10 + horizontalCenter: parent.horizontalCenter + } + horizontalAlignment: Text.AlignHCenter + color: root.danger_color + font.pixelSize: root.font_normal_text_size + } + + + } + } + + + Timer { + id: status_indicator_timer + running: false + repeat: false + triggeredOnStart: false + interval: 300 + onTriggered: { + status_indicator.color = status_indicator.old_color; + } + } + + ConfigInterface { + id: config + onConfigData: (max, min, alert) => { + console.log("Got config data as: ", max, min, alert); + } + } + + + UDPListener { + id: listener + + onShowError: (err) => { + error_text.error_string = err; + } + + onDistanceChanged: { + console.log("Distance changed"); + root.distance = listener.distance; + error_text.error_string = ""; + console.log("Distance count: ", root.distance_count); + if(root.distance_count >= 5) { + status_label.text = "Recieving values"; + let current_min_reading = Math.max(0, (parseFloat(min_thres_input.text))); + let effective_max_reading = Math.max(0, (parseFloat(max_thres_input.text)) - current_min_reading); + let current_reading = Math.max(0, root.distance - current_min_reading); + let height_max_possible = water_level.height_max; + let percentage_filled = Math.max(0, ((effective_max_reading - current_reading) / effective_max_reading * 100)) + let normalized_height = percentage_filled * height_max_possible / 100; + let alert = parseFloat(alert_thres_input.text); + if(percentage_filled <= alert) { + console.log("Water Level is lower than alert"); + water_level.color = root.danger_color; + } + else { + water_level.color = root.water_color; + } + + console.log("Current reading is: " + current_reading) + console.log("Normalized height is: " + normalized_height) + water_level.current_level = normalized_height; + water_level.percentage_filled = percentage_filled; + } + } + onConnected: { + error_text.error_string = ""; + console.log("Connected"); + status_indicator.color = "#F05F5F0F" + status_label.text = "Waiting for more values"; + + } + onDisconnected: { + error_text.error_string = "Disconnected"; + console.log("Disconnected"); + status_indicator.color = "#F05F5F0F" + status_label.text = "Disconnected"; + } + onDistanceReceived: (distance, time) => { + if(root.distance_count >= 1) + dataBlink(); + if(root.distance_count == 0) { + let current_min_reading = Math.max(0, (parseFloat(min_thres_input.text))); + let effective_max_reading = Math.max(0, (parseFloat(max_thres_input.text)) - current_min_reading); + let alert = parseFloat(alert_thres_input.text); + let alert_effective_reading = (effective_max_reading * (100 - alert) / 100) + current_min_reading; + console.log("Alert effective reading is: " + alert_effective_reading + " for value: " + alert); + listener.setAlert(alert_effective_reading); + } + + distance_count += 1; + } + } + + onClosing:(close)=> { + if(Qt.platform.os === "android"){ + close.accepted = false + } else { + close.accepted = true + } + } + + function dataBlink() { + let old_color = status_indicator.color; + let new_color = "#F04FAF5F"; + status_indicator.color = new_color; + status_indicator.old_color = old_color; + status_indicator_timer.start(); + } +} diff --git a/NotificationManager.java b/NotificationManager.java new file mode 100644 index 0000000..5656db5 --- /dev/null +++ b/NotificationManager.java @@ -0,0 +1,14 @@ +package org.qtproject.example.androidnotifier; + +import android.app.Notification; +import android.app.NotificationManager; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Color; +import android.graphics.BitmapFactory; +import android.app.NotificationChannel; + + +public class NotificationManager { + +} diff --git a/WaterTank1.png b/WaterTank1.png new file mode 100644 index 0000000000000000000000000000000000000000..24ef3c1a53a6cee4b26cff1a872126e6a12c5fbb GIT binary patch literal 327042 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�SGv$s}dr}jVDf5m_P;eUp#x9(i~9sJh5 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⋙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�meDiGBYt_AZe9_xpKphh;aG`o) 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
cQEofq|t=WkZJWwPVuP#hz}N zbW_kUeA%CJD|>k>7G=LlAdi1yRkG#KQ7E`_eeJfO+S4n)BtE^qK0dnm@{2EttFmSo zPg^Vc*#6I_zb38ge2!#=#wMvw4}5-n(@y8tuf-rd9H7N{S9W^xtbSy;D)6~Fsxn8xCZ=Qa1_T_$`T^H@=_3Ph0 zy)`XZCU@Wb=YKEW?`yc`E@%>_y>qMT%*A(yhE^wHQ>AHHruD&0yo4@?~RamPPGNZA0Dn;eE@;({it*uK3Dhd87T>u{^)(wq1RvHXgh9N%LjRyh7P$ulCfgUT<-4naby1 zmbI%tpPsI-|1~OGKYn+wsQ=pOKkIz+&Gt+a+^}`S^z_|lE^pji;W1AMY9uVbtQ@Q8$obQIJ!rtpA=VVIP>VJLwTywwazNd$OFXeAE7U(#hCo_K` zTak@@$GbEm>F5u^XzO7Q*%51Zg`{`9ngRfn5`*i8gq;sdEYL9+2 zQ=NG|{rzqBd#fC4w@#~GnQs*Lnq$h2S;wc{`LZqS(f!NYEw_f})@^yewfploiSHja z*({sk`!tK^%c`%w?@J5sTsrw(GJ50IJ6k!!OMR}&e4SOk)$E$3sa)v(_}PJW>t7s? zcMq9=BXg~ZS*_=?%IGa!+gso7w0pkk)yMc%>&4V>9V`9#c;1cbn@9HO=6RZF&ENb> zF4VqGfq{|ZPUnGX*Z)`-E(wEqew+G-8&kgRR`*&S*}qzD_PRM$GKtKL95KzH*2KoX z5JpD-2Y)%&PnWxWe#YgEE**TJ35=-?{|`jhZcPh%RV}G7UGM|X_IKNj)*S6Cu6p}u zPfqgfI}i3h45&SQIe*57*$QjQ?9YW=j{NkoMmfKCZSS7xJrc8@Wl{_GJo%yV^TouI$JWn(iD)NhjaGaIrd5T>9Wh-W>S~WDJSIEI``UsUa_4+b!NZL-tUjU7XSK` zT0ABGO?Hkh_=rn*DfqyQW!Cwu@_RefUYwniVzMCiS1*J2b6yWgae*D`jAk3|7T;a@ z>lTaAzL{xfUfyzNyb7MgW?&H#`oJGrdq3!F^8Nl@Eva*rmTE4Gd;eSYU+^yr^;_&NTP)~(y~%>0?ge$~n;uJgm?yL(?a6YT{|7FM7*XIe{@%XUtT5nR$t7-H3?~3T31D(bl zy@^#(7M4apDF@WHvQTgQk+9LUZ&z_xjnB1-u`t6!Z=H7bYTy%d{|E#&+<#YF(`%_ta zza$>4aWq!z7`*DBTy9Y)E z?2W%c8>woq&GLHhoUnd<^jv3?WWVB1$Hh=bhY#d(9ATFa+cACR`fp|lVPa8_LMOT2 zC%Jyr&dy8}DJ-b#Cm}h5t{8xDG(OsdNPp*~!8eJ6dCa7oHxi`zdsLuCJnRq
7lvl0G!@fGJ-t>(PTsR)Z)IU+)92Y0v$ybrq0|evms>L7AOB>XR~L{&-zzsz5V}^ z_y4n6|NozIbMY4kh8CvH?12G+9%}N69FkX72xy(SP{7Dj$e=XkIg8){w=*{Lx~os; zO1?i`aomOLg;bURhsMpl_Uo4z9nNKr?b81LfAu`UtJlPtpNKK^urUT7SivyEBUz$^ zWk$oc+1eR1@5nSVCo>&jRG2b@*>Hle!In&etvuX~nhk%PAAIrd3)2wZ9M``&dh=g9fut{{MWwo zKd>jGcm5BXT@OyEt7ttCi!l#A{cp`L?Y2)B)0Y`7`Tzg_#GkGn3=B+WPQ456xiTE# zVPxoF6H%O_R=a!dhn2SyTvzVi!yA#vBzLsXQgT+}F?abBIvZQW`2_iwEKCS{GvTq^ zV#C^NP3P|~o6)oU%E9U1(_;67mdmBQ>0sXI=`neeu7UgEpKCMHr|@6ZR5|y+zfp(( z>B`Mo0Ut_~6q!3Y8Dt!k=VuENxM8=49s;@DI=W`|FZrhGx^*b62)~W-1EM$Y4RyU)&Kwh1&Ru?PE?#0t0=yG;mNcnhZPx$f_XffC#D>GS-A5CQ;gEL z2&?o--2BGceHD}L3P$rx$vdcRxlO{dIJUH)%I5lP@8_@7J~4OCXxC(x*!q^o33=H>^F`_=FF%!$kF32Dw(n`@c+N9+7^6^vrfK9Tl~g%*_!_U z*Z+x3?6JMGceZL(*1pwC|JGIBEB^og>JiIh1^@iqlqGzQCC=H{UO4?Sc+~6fu4y{? zJ6|0=&Sa`Q_qfcyEW3wp`@u5*|3y5CJ2#pC`QN>XcUaPvY3*EeC9T^=eT7Vx_;1jj z@1g@P3<6APYKLSD4mdb6?wWDH#G|B^rAa|pIfq$ZV)G189(vxuY_540bj4caKWzBK3+0U-*5Zfm~|<>{5|5nfZQQVzEs z@$=tH&f=l{S$pnG(WoL7_@r8pkic$doKCE!gtFdSj8;!s?)Z zTLRtx|9|EA;`_DruKWN0|0$B_pw}G#OJi$!kZ0WKO{Q8)7Y7`Ty%^WP$-u_Iz|$r$ zAvNKVo4_q4F=jQxl{>;>^`@0>YihZmz_ImXy?DKN>j&LQ(=_s({>1rw_T^MxRcHA> zj)9GVQ;31Vb4J}PwwS}72LhOV=Bpg_VG1~^r!o0J8Yh!e(~Op<750btDs6)&Jn`Nh zs`N`MSGjkc&Y`$j*Vbj-mv#Mow9#S0q=Of)DeeMaK4w+dtD6Ce+@~Kj6k@vngO_dh zGcdnN33;EofWb!j<)6124E&-KUDrPHIPt4DbL-@_w_IH=K9ABWRk;%Cs@#4}yJe^0 zM#n`8E(`LEBp3`Nc>lV%D2o*`@pI~YX+C3=-)+M>akA%y4A!fbcNBS>*ZkcbkSZ&n z^Q$1ind$DYyLTNnG;{|ya4@i}Sz&d1+J+Uz9EB1&aar7r>n)CPsVup?*DAq4CZY1# zIw#W=A%|l#FFb1O*{)j@@=(ZS&Qf)C>7v7*4n!6PP6&+&-M?Wv=j`>psVyslc754* z|LfQK@N>S?K;C;ZZL7!$4&kD^`{veONvM=wb9L86PnAiIhMYaMDcc*E54T<`IKWtJ zzg0rw0OzXn98AV)6;2O!xaqAju=Kld=WwL$AK!-3{6FJ>estN1NpW?XSII_Oj4sZEa) zq*(9AZ@K%OHU4Nk+wtGC5=zx}-gz6~`T2RFciGvjkhLW)4EcQv(w}>?yoj4<_f=)z zum9`+|8?8u%KAUL?v_0`hNd3{y>&yzt$ebrV*?BG5`mA_1u={rN;*5;u)IX=k6pj zXQpMVti{R~LM-CD|J0qbK9s!w=&!ryK>IZRAAZ%*;Nf-RhDXcPSNk}#SH*io$OLU( zwPj-Enrl zU%YVV^)6M@%V$y-Zb_YKmD#@XbpB`1gy5A1CF>{ob>|n5A=anAt{rgOPqC&Q>QdeDws}*myqkk*+%D77n z`}eokC!C-8>-Asz?SEga{rCU>|6AJ^%(3d-T(*cL8Bxdo zu$_sqWjXsj<^TVGU1pI{DX7b7nBa9faqUD_z4W&MTi8B2&tI@MNqE!iIje#`+)8pw z{jq!hjny3y*K}WBbb0$(=6&3mV?Ak8Umr-K$DC_@;Ccn48{8GPojb-rqs`Hv&E*i&O+W%+r{GA* z*ITOo)c-%egF2{|Nrwjharc< zRTnl!1rH(S8B!d4ooRfAZWirnj$O;1)THOGVJqxu+vFGPR+X%%+9dos$1r^H-q?^u zM?9HDL==PmPf`q;aaY7=QbpY5qm!;xJXE@sxZ3m6Pn~*OE3psN_T3GV%Xi)sQuS`v z+-tjc_O-U}YeRCDXYZR@es4+6zHQg9{{L%cy^!(hvTI6GiOXj+i!ceKSePlXb91>| zk9~ToBYB~~>$Nl4Z`M@V&MLlU+O_V{-X%OoCoKPT{=e1j?wj*J?~nh~`v3pmU9~Gp zj)sHV53e2OxQa3`m@roGGH2M$KKjaF!#d+0UACTQ<#BDDAx};`oXpwFE}n9Tf-i2wN}TUXhogl@~?Sd(s=Q`RZV*L=e?}&wg*>Do2+?n zYU$OK*zDBUx%G~}wq2}^|DW08t-#C>eagk){`n;<7zJKSHEd3Idl7MX#ocS)4p{0< zyPf!R&9XVV>5H0Hf4TLfOcE$X9?mD9}Wy|V0KWEG6&-=V+ z+xdbXF7tDz+qYahu|7Ct`n6eFt6J5rFLt%oS{`>QMe^(0wfF!3K65dwV~XZx2M-DN zZMjaX&V1=sUs2Q388vCA^pO+xxr&TxZLNuZ%f*B;>;HoGNPzm=|3krUeahOvz@@-c zz~CWg!X|kjvCwkafn$PNbG&9%&)GTE)lExs)n-ODP7bEDL~YdTe=G!K~a_I&K>4fR(_08fAoWvDn8voVm*54Y*v+`wiVge8RuI6vMCYz;y z^Ze`ZpRdEFFTEza(OYJ|+C$`}e^XcoaH9fAyFHtf$-_s~^ z#B?`*O2LVZmNS>1oX46G_ zcXmPClcP1ONq&)o0HQ-TEV^bpLI>GwbSEor-o#B@LNoZ>|k0wX-t2 zo~+;7aI^wE`!J(H#NIV9+dp}UX>#O(49zKgE}PB$Z1Wvni)g4WT=}f?6VFw-M>zs| z3>`8%j&w2|3s{!xohOy!`g`im!<=HzZG1kgcCuU}tpCbMe2L?{d~s zwYNI|u3YQ3P54B?cFR|y%BB}1FQ_k;KeR*jchw9#>peHm&GWlvHtFZAoqFFEFTOkD z{;vJC_V3TkdRoG%-m%~UWATan1-fz_ZHtUMO}^Gm*IAXu9lTYpIjxCVldI;1XGfD9Aujazf`s|0_zkhQt zS5#Db{^c2+TaJBksos@-|N8x6E7SK^`3xFgZD}-m6|K~uFyVqyjg-!1m4GA;;YCI( zl)VCUf`S!&wssk)WgWaT^WD=Uw-)wW21Xcx^3Wm%=BS{6*Zx6&oR)e?r5r8qS?X=- zlk3{>xBr!C!!*7a_WTd~_AQW&0%hyJq7DpPM$B7V_k3G^;G)K{MG8VaI*W~e{dt^s z*s8y=fpvBb2alfMTqkAb$M)Qz)$CKfC+M-9dbK>yFE(bi3C}k9!sF*vOODKbbnEI> zjwkBRIH!e7nrkJM?YWl0y4m`Ugw2sj6Sv>DiLqSd6${5E{^XyyLhznDR={?Qa& z(VyPkHETp>D4gy;(_~}OSoWNMWs!de11lqQ$H5!kVixUcis>nmmzFf$3Er7?+2_Fh zn4}4(59M9GR-l)6Jt|?L`M>hDYj15&-yWWIZEA?{%4>b=zwdv$^6US<+YK8O`WG}v zOm22M*w(I_&v4P;cCg?N_s(?5pT%NL*Et!!NiaD)JeM?Ea+X#X&&*9rSNon3zcC}~ z|HWUOXMgp~+i}r5$~1t1+0Z$|J>{0yQO5-nQk@$Q3u&C~GF*4A!eNcN?1hP-^Z&Lt zFxxAi4(@K*VE-g*tu0q)Po}56>9z(#?#av3wp?IqW#Sj#7Jr1ps97PR|IRPI7ot*rL@8WUN;$~#|E99j z;stG*g=b_oX39K#(9xf4`2XJf?@1hnPcDk7dp(&E(ZI_P(mDVC%l*;2)hf>l?B05l zxlOgm$8f;`6)wAvB@y4%&|e|u)~7cma}YB zRy|g!QeoT3pc1)dkz3v3hYS4|O>^9_HRnJ7Rc6VUE%hqUN}suTe@o{B$(L6q9AQ3_(7z~Vk%jxjirp_&a<<#=_0(0F9OSvCK&4w# z|MSv|xAf(ex|V>l(0K;7i)rC?St%?xJw;+o-=`&|p** zC}32|l~udCH4k-8fYwXi|C=cS8s7Z>oz-Mn#HSNC z8>+%i-E>gs%;3C`#x`+sFt1;Z;&}(w1_zPdA3d$7EmT$dwmRTk!53#HkHXfvaP7~G zIVbN%|L=6n2K)H`|Njl4lNek$gIo?VGsT*VUQA$F;HY&#k9lH~;vXw^-`qZX+2rFN&YhVkd+f!z_42p=ZDmxLD`zZS``YW6lA`?o zS3w@TUK?1{X6~B)|NZ~}zixwU`(rJ59uz~p49p%$LD_D(3N9zB-r94y_8y$*y!Pqp zKoOCbn!T=KmE{{uw1X5Fb$#@r%}SmJSQuCoL{@g%bzWGkkjT+0m9VXH zTEb#&qp*esp$VtI*0Xsf99+EQ(&q3_w@a69Nm$5r_RYK99*E+TBDK$&F zdP=2*wx8PTUCF%ly;H%(RXf6T|3*9)Y`OpcU-7Ndo+xv#+L`j#R$UIhpX@pJ-!0Hd z#62F-pBSEq^E_}Ap0<5u=pn{O9z`NX&)s&%wP*brWtM4_uF>@1j*P!rYs+0f?bCyTok9Emzxeb;=2^7DtECGP$Q&f3pjzj*qbJQ^A(B_j$OcA$To9?Ct z?Yeujd!c5w1v*Pbo7z}Q>E z=y1hv?waebC)s@3rTFmL>TkQB?d-n2J9pcnr|Wj?T&^a^8^XjIR(jS=uxI~U{r|Ev z!_1Z}IUdT+3+k}0>tJR}y!2Q<=v>$vE#JiDDc-)Vp=#{Ljj+50XVL^zP+^@9^60A!FS(iwpO?ck7GH1EbN~x}#15X{-tlBcm#dTRs^8ZWs z>*6o*bgzG@G9z~0-F4AcBEhWc%NFX?SKky#n07_Gm#?VonU5aF{Qv*&etGqI{_d;p zOTv@+O#5cN+@+p8u}>U%HF(p^PCwve4V<^ zWcta!b3M`@^nF=vpnqWhiSC6)JlxNozS=SW|9?UA|J`i@3``82*IYUc zQ@Fo+b*?zT$zwy`KU9={p48f4xcr#* zy`O6F%DZMReY5_#pmSbkAn!cIhI)(33wpNa%C#O8uK!C%i?6>;gM;6*jFdfL5*1+s&7X2W=qBDlQ^;W>P89@`3To@yZ?YG@_$S<0;_xp>K znsv|f1Bz|`gGx70!vFvOc;l7-|6esQFmN0I4f>>PWneD#33|;F;^VMX>TiN)ZQn{` z>$Q6W1^%hNHu)&~j^$U6CA+Zhr+q>*efr8xubQ0fIc#ivjEU>qPaVk~XJ>`W(hTzH zPcEi#6)$PgZe2flI^zCKN^oA6`6z8` z@%oE*R`r+r|NlL!gP|chgF_%%`_)`O_6!#R7LBqSh7F9}DN6$m1!&9_cI{!PSnO(a z^!TP*GbW`P20zu>-|ap#{r^ijg$WG8g}dwjJIrQa&`Dvs=GwV*@r3=3i?}Z-yegDx zP-}60AZyd%w@ZZcs*=j|2{N9G7aA)}GyW3yd!1DOG}FFt@%~9ylA34SoYdmlzuoZ# zW89b4K>yD#9vmqCt6lS`bDziF3!0pVc<(tS2>!hPzhY2XmM+v)1+)o|8^8MH2oB#h` zlk{g$*to@~SJ>LfM?fmYYx$-)Z{G;v5|)m}FHGB2`Bpto2+`__^pHt^T)4|hI{a0> zCePdx>F;V{SuUk+2zb*w#W&sT;I-L7)-1Q1SrT|^Sq}W%7ymP*AnE6;><@uWwy8 zOaGv8zTOVTpE;AWt$8_&Q;HYcy!(9nO#9}I@BcrqSP-Dikbac6)YAXY(gFrarn*+8 zzWr^LhZznkIg8&oxk2baPczT1^RJ3SVhp?^{;HKvId*`HNldjcPrBdF=;4Ye)##P$ z(x1&zSz&3rRBnE57bu3VG%yQlo_$>zw7{t~D%WOh{REBI&c3Q*6TS<)GHq0S*KGg) ztEui)UhBTSNulS<4332Eo;hjm)l3E#;k8Ns1oQR(|NsB>>N>en^Vt zj))`}Z#v@}@}iG*WjAZ7#H{SV=GpsCKb{k3q4P+!eZuoU4h`>eTlcNH zz4iCi;QIgnSO5S2|MLc?*hRBu>N8%*IOm{qs951dRKVF{l_LUk9&Qrwn9m_#BpS+4 zdcd_IJ=!|e4pnDyokjDOG&&C)bHZH+4RFxCNs{$DBGh+3wN5tEqZL#K6%~a;sqW{(pJ`Nm~n5jV_Wco z^I}eye{Z?KT6F&Z|Da3jFXdP5uhyEd*K2G^tDDaK`R~lbTUX?KGIjkD z_1tK!*a{AoGx_0vCl^ix&8YqqWnkd5F_7G~-$m#&YoMA9KaZmCjB2JJpR*yhe_75y z`pnaItm##P$}GWdA1y7m!<~Obx|u7O`IMbzlpo&U-^DS**2{lxW!A3KrE2fq*{`{I z-{B!BhF&o=duyIL9g|rQ#H#68%oV}M+OCoNb;ZFDktLn`R{YS4waraG#w5SkVGhrm zHR->+=azDo|NsBn{_k0*=NlO1=1g%?WMt-G3uK&eWm-yE;>4)OyvhA*eP#(WG@bT) z%c9oql%x=-=Hk@ltm7f?nK|1i)aQ%b{=nGRF8eZ?w6fPG?_~|ST(~Smtd~K`lXu?f z%LyAgm=zQoHu76dpP9I!L*k$i(-Aha01cj0=NAHU+qkDr;|w`+xVblU%cVm;C%vyN zZMw+K@|?XvW=)U8L+7)c?g4J8iw*U%*DCFCy_2T;TJK;MGeg=%3#+E4yu`OHUZ=OM zykVKkz?5J3<;E}0vY_zO*4-C7tS5TZnZ-K@36%f;{Uu)ZUw!UzAJ-eNoZtTiAGiHH zct-x-=PUQv>t9t9c&Y=65>WN>|M$AYO_vw!UUyDBdBw_W)_MIs&R}sk@pqC@bXscrb#_7%FI+67+4ti_zYx@sLVKFl{n+k3l5W#3^$t; z#!p6R4?r>WqJgArJMgWxfVjB;}aCQl8KnhjEE49E2B zS|7IZx-$7OF65K@xlyUf?M=srZ~K_8?KR8f+QOg9UUlhSGH)s8KlR4A_ua$)zh^#}z#y3P-gMfo2S+wm zJ+k{4b^ZVU$M@gc|NsB}f6?n-*VAV0weh-=HBDJ^*|K**J=u3c^BNAbz1Eg-+rY4f zfl+~zfyu2wZ-Zc)0iWkrfqx!~W(>Ey>$nWgNa(!qb>6rz;Bn$C)=z9lx*58egPRU2 zt&|R#_cCn$YhU#!Zik;+Pi`)Dxomf0-?YD=7@FC@E*BN@FWrHmq2rX*nKKOM*0Or; zUD?3!WkKfZ4FOE=Kki`5WaE3`yUAVVXI&}pblpx( zb27^@aC|D8{r`Va0|OI-YuBlOxFzXF6lQ33GIVf=YdOzpvEX`{t;BHrLw8u#;vEnA zIUfs$1bkp$VUzs}Go3Q2Tn@txN{S|s~%gD_1RnW<+y85q`J)1tcInVJI z?~Q)<|F5u6ic_GMm7cGFP>IQ`DYo^0yjQ-k{j>f6gND!*hoDmlWl4*lKFapx4Kj6+ z?YVSj7o+a9V}}pE|LHORe{giz-fpMo=NDhQ zas7Xa`{e)s{~FnsY;9m*X+Gclt!tfhyO2qUyh0Y^qg#7LIZPbC${llc|mW|NGjXPt4qgg;F+F4~~G zarSGiGyXoO6StlJyXwrT-Q~aX@-JtzOqj%b(~(i2*`ag7y!LGm-{>x1QSAOr>v(EX zO2+Xri@^VjUw?U~*%;iST*Ri8@&B*%#?*i-)Bk_fn!v!oz}YCcP^wn_5Z|Irs~bGi z5?E%2uHm(qW3hsdW3#GXVpHIMMKu!^@u|(r7xp^7zvGt9sef#-4#&|W58M?GMSnkj zcw7Bkb^n@|H*IR(_cv}eufO&$; zf947>WGJ%Ek@(!R;b4PgBSUAm%EuNp&4y;hInFC280v3oHZLqZlI-DdRF4aaMa*gb4reBN{Cc%B;b!0V7t8e8F8yC(TkAJD z#zy@m^ORR1cGJ0BE#J&?m+eSCVSh?Q{Qpn4Rl(OTIWRbIF-_dTAeWPTCtv*2ML&iV zgJTCXvI0Ifa<_|3eq0gYnIHOBTIT=yUvN1v$gE_p{#Wb3>vm(M?PgZ>zH~y z{HOCprmE$r#qzL9;KFlR+us?B z{a?#=^-D>To0vu6k~$UkkS|F!*3!ID{=yES`djk({Qv|qI3LbQ=qv=vtr$I3Lel*EvA6+8;* zo=!g>eY{!ovEpULu9~MOTs(q&PnIisn%kPpd-Ctt4EtL`ob?*@pfQCM2Bsr+!H;=e z-jqGRRiEV9&(rWz&-YW$#N_$vFMA!k{{R0R6Ui9lz}P8vuz6k4hG*v@OiZ2^ND20A zoy#*Z<$4l}1K)9;lMPMX8?7!q*dWySVv*I_2i^__Cyx9)^kUcaZNV=lrdF@$63bjz zv!QD8|H2>t|7`tkWESZ1@RzH;&2#=UybD+UU@2XEt>V9xUKD*qUqt0LQ&rw#f2``{ZH$ZptJhB z|F65k;Gm%5%fPg+U>3*1sZTpsT$uXe)-3lWe>l$1Rhd-(-!V~*$8c#%xv^HogdHAl zKL6-+`Tzg##ef5#QZA;2`JdhC%e7ev=7(?9CO(z!-}6%~ugcfqR>zCXRwF(p2Ejb1 zQ{MlQCT?tHRQ+yf<)YbP*e$W)t_-)<%-WumV3R4r4GnL&8=^v&1vWm=Gn#f-@z*uO zvZe;6gma<~7W776(6zUpwVh!HZ@8$@}Ne zXHTctmFkAdve>CCZ&~PVU$_4M-xvlymnH^=|7I5s&#!%-(>f{Os8E{K`Fny^_Wgfv zf3!Yu{39Eq*RS8lxI6B-noU2*z`T@q_3al-4GN56*H&#r{bSK^ZjQ@{n@mZ zXCL#9+Vk?~KF|Mub?Fg~w2-B_3~X6v*|^x1eI~AMyZ7)QJA>zAwGZ5meb>8{rqy*X ztbZ4LXq(c!O^u#2Yz2Q5e|HdQXMU_T@g@U9kDR0cD27s7S?ruWrPuc^Fin0{YwK3o zAMsn`TZ$ zKk;g-*rbFP%tu!)kl9)ADYHzZ-TjZvvYf~7!@qU%{14PnP*<&2=~?sUy!@U@-Pi4<4zn4K56{(hLS@k@1Kc^$CuOu8$NJZQyc%U+68n`MWgA0 z-0Lo`yo^e|4Z=K|lscHTqxM$0T+a&czOYrtrnFu_TtQuUfuF*ocbE8^+pRpp1L zl*_<;*e>EXZ&i*JW7JvOq{KdhpT28#zx;SSY2}7*)7<|54!9uP-MROoW$lM+8&7r? zpX;2p;NRSM@!~BPb-Xv6Hd~v&o~!tdtm*Y@W=owH&JsQL;N{nNt<@_6mqs>=3oc!F zr@gvJ$X`|D>n_DwzlGX#i@}?O)1&iK4o_i{M+s7D@Su$k}qd@PxxV!{^F2CLza`~ig)Lx zx|$?3UU^dRA^Z5>&C^&s<5VNpKl$|fos9h9*tq?FR;+hn@MvM+WnBE4L!Y@Vj6qq7 z*;#tFMXbq}r9BcNZVVcFVq1)=It?s@MJNp!w2GM<)91?6fdG{3MlY4Jd|cTbSMLPFuI?&qP}_^^~^=k{04f2SvCTJHY-zbgZShFb@N#YHdGbB88} zns7Ev+1uXAu<~81h=qgct2HiKOc7gF?XOZ0QM0taJ?*o|_444O$__K8o>ct5R)Il4 zZ9)U<@xX$eJ|AzpT-KUw!MWK^&Mvi};fQJ@3r}s%i)|c-H>4a)Pz+MB5YVsF^S`?G zPjf?t=bTi6xu=rfh#z*xBkti_*9`)cC#Irn0r?^L|yomvTSLpk_EE}i$u%n@#7^PSc)FbHmNnVg(8QKdnF;h=&@W@B?3$7G3_84pZi zj(GJ*ik#taQGTrCBIwe*NNn*!PAN9V%Z%F(NlEZ|am;T#k;8EFPLM;V<%1Rr$pZHy zYuI|2CyKG&s9+G`QoV4BF`dz=G5KLW%Z-Kwoe5QWa3Er0*{=;5WGb`k2_?k5iwy!rV+ zfPsO5!S-#=1`Y-WhRT-YbDrtVO;i*!NZCFo7oC%oC{Ai+Zi%P z>Nlr!#c*mwg~axi6uT)rJDGClO@4BPy~CEqKQYTMS;T73v`o3-RBjTv;&=x`>D9Gy z9@DS9Te=(+Ln|2ARnq+P@)}smkKc?vdxAk`>h#2&dm038w!eIAbb#Skyu+sndhtKc zf1dwbgM)=>Lx};)xLux}J10ExF$Y_8jzolsmR!7|(n1bv4W^E6?IpXHXz;l> zWV19k2?$(B5pgXNbJAK>esJYyZA%YPi^XQmZBA!Agy@{P_i3 zFZcd;TFOv<;1pwX>f325Gxywkb#T@G{eRoH%Vie)mUXDN|NdY0{p;_a+IFqDvT@yh zzuE7e>^nQZe*NFi1=sBV|Nm9HJj;%COK4H5=DfQs|Nq#F?IvMUy!2F(rJ|NlE=8v{!%6AJ^=S)=o{-HaF9 zyuS%NT;S=cz}s+c!}H7o2_Ki`nTs!&8k?jpCKo?duC!zN-!uRJ7p+oaU~o9?a3FE^ zqU(+i)Ql1~2nG1@UJa0uNsHFZYnz~dCZ$-sO?&Y~A)`f>E-$r9ifEaT|74GOmJ|!Qc}Kjhd+(`RYV*4O*R}tDJyoP#w=i(<>@VO9P|jAi zs#&?%=fq_W$;7Y!!#wBpdM`e_$kl4k91jVRv)#|NpL9%>Pw}1BIZ-bw*8dymAgr(U zPr*c=j--zXjK=BrI>Je+Xyv)3k`vfd?E|EvrzjC}uB)ns3NY>@t;1Pz~@ z;MM4nyv~rloxc~d@?uZP3)YWm-WA<|NrB7%z=S{W$gh8hF2wD+dO0|Dp}IP^H%NK zAI-qlv%a2Z>tcp>RbQ*|G)Xa{~VCg%YXI%<$(qU77d03 zg9kG%x;CV}UYHg3;-Euo+T2Mz%EpWxXHRG($XpkY)UTYxb#M3Tb92=APmA`cshxFt zA1%hUDpLRTf1e#WmJX{s%idnKSXXFPY{e=f>$%r+)-lWf|G%o7tBh0yFRV9gV1AZ- z;dS)P2X<^;_Q|e1yrTUsk24n@6rH(Z<+RRE?<&@vvdUU2pdy?ax_0Vk(f>a$umAtb z$8Pa9P+n&UZfwd>Ft8~;>CL<4`@s%L&BKiWi^{Hv9q;x}o;2g&pX~a_)z$U47Tj7W za{vGTKk5Hd_jk|e3p>A{!INc!qSJ*JsfOzgHK;UoaZLJ^*|2HttgDwC+?aHV?p0`( z`$XwPT-spO_KS0+`d9vxi}Hu0_8kB3lF4?+s$_kXUiY09f3Nx+oRpk3)nkwP(`jp8 zRQ-=D-Rb`S$@9Nvpt<_#|9>^S`N+_4sfoj3;mb`o9hAhLWIhQAO@8v}B8&28s|hWh zAL`1_g->yak2G{;{ad^D|8L%&rE_0zwg3N*#s2^QwM!2QuGW(0zm@i|frG`GX+wjU zNc_}krOyPp^tu*v$(iUnJ?q)=UCY{IX}YPg`O2WMT?MQA3U67-WNReEPYnI~&PRWN zaaYup=KtxFnTlsFujKFU++KMmvt`Zl3?<+6W%b`;g`8gY?*De~A80Ig)&GAB?0j-q z7#NZnn%ZV;wpjwoLpBV|sVRZkzM%%L$D(`_*f;gZ_D8NU4cYKXVzt2^nK(Z0Gv{Us z_tl&Z3;+J_&4gY5i~l|Uf7x|?`M=Ev453}|I7dXbeN*{|Npn?+SXT# zuf6}j(!zj6$UM=PC1SGI0k5SCyuL3tJuK_8=AL`a{-sHKKmK@>oR!XJA-3s{#00zO zJ!fuQbUXYandj-33A>knpYz1=`qoL?Hg7)0@}{zVhM{whKw@39K)!|-8%IxB)!dCQ z|GPig|6l9!jAs^yp6z@lcdGsTGwpdv|Ift#zoO}x*&`%f?$Z$Cs-E~l%W%bpV|(V^ z+;;m^!)oKsTdTBnQd_g${+8>Rzx;pO#Mroh|91suW%u!lRCs8y>2C^ZU|<$u;J$PB zNP~O3baUGg#{$I~j}`gfk10*d>Ec){l%TA_p7kkSE!$Vp_wJc@i~Ljhp33S7t(m#% z*S)Q?&i39gnRL!Tw^p@!if7{zp_XgguWN-{{0}e5mR%|;J+1EkUv2*5Q~UM*NBsVC z`v3p`->vTdw_p?cc}zs~pb75^8S#HBilw+4-fuMct>g!aAvYH0&B?yrvok;0Ec50~ zOttL0I?*UEab3f^#cx2f;9Msdzh4iqtI6hg`rp~}@P_yQKfJjA|Np-%h6AUBjsNZc zn=ksR{_skM28YJ4-3-jnv&tnD_}Eyd@bSF!GI8E>%yDrOk9!0E?FClK22vAeURx>d z?s?;{?KPLPO0n}yIQZP>?vLtUB&hmS=-ih2MU9)zv$Q0LdTLjt?OFM6-PuoB_DlbN z)1Rg0xQca$grtI&u;Z2M&(<9h zxtP1y{o2G*&n5iNUM#KtY5Md0_4}VY?a$YLUlZ#Z$^F09{4b~&-+Ar-ufww(4>m;R zHppyj5O{iAud&KPz31)6psWFv3LHlf8Ng)d7*60zP?92iij$eCi*q8Q6_UoKWUDwDc@WQlN_R9bN|I{Rz7=$|BE@upB z%e-IMe)vn9przysiKGWJCmdg%s>{xCE4f6CeNK&ojC}0$#fyyAAG8d2-aAd-lcAxO z`N*Cv`vZ5mH*?&4|6j*tjc~L3%4_d;e6c?@`)_9Lz4u{x|NoonUbCtHe*N$K`2YX^ zozDNi!dkC^L2fnT&VMvi7O8>NU*5g-RWUd!Qr#7{dS~)>!c$+3JePj78ut= zE<3$6Nl|S>@Kfu(7B=grs|9How{|S6y#3Wu!j^xp{VvO6EuW<2-LJ9;&RLlMRpr+t z-d~T8|Nn9Dr}_V@|NTMNx<~(ir9HWzK_E(b)v*RO4#gWhHv`?Kwk7Ol^Eo>uk}v9P zvPdbj!!O$kI#?+;mJ)xpwdf-B3 zCFUM8qZ14>{{HT?%483)uT^+FNzCoz#q&S^m0mPHALW0>;Bt3QBhSZgr<)%pIN1Ny zk>fvcicQV_ch;f?ldZ9D|CjUZ2y=TdSuch;)bJh)|EXw)^9NQe-@k6hj=dL@gZJc1 z#q#EUK5MHh@a(zOtoy%`WiL*x{r~T}cu+&6^11!Dzw7=_nmK!_Z)kXTSO3A!^>SRh zcYW=NjsO2Yppiq5ZQtc1*KYD)0YF_01xm_ElPaXt5Xg z@9b^GU;lsK0+Hud)n8N{47_Z&%DBk>U%mU`76#Bnj0fKyA1yz7U6w-&6*kx$Y3B9a z@MTp`6wB{>jSjDF?7fw^Pj7jTVBLZX;tD%$+kZ{;xY2M%qeO7C>(@X-Pz)6}Fta*@ zyykYPaCvGuDff91&q+pIz1*b-KF!QDY?*s*eyG6J|G)AQ#LJ_u|2cRurN_Vi_A6K4 z&+`A*B+dSOzX-IVb8QR5N+qWgyi=EYIcYpuzx?N$oVB^$nt;tnFGNk|5wXo)!)CSo&Nv-r_u%vCLRZ|yE+`6%dVZ5;4os7E7 zz!Bxmb3~e3bt0|U9sE)ng>I}_wW}vte(kmQsp)r{SzH@D`9t-$+gxtizW>(N>Drtd zOZPwXJvZ-v;QDKRj?&8`z5l=DW8ArE`by9(82`eW7#686&Jbd9)Vfwt`pVTf`}B_O zxdrOek}kFw$op)3DtaOB(urQ>0F6ea{U3kU|El?--qY0MrTPDl`Tze9cQ7=vh&yaO z7|_XZ;j-ukgNYXnwmJ(4nw+03k!0;|^hkHBPxEpIg=c54FDw47J^gM|L4olcB`!9n z`(Gs%JaziM`qxd9UXU6rY&Bb;{fa1y_P6 zu;5IPAo5Aksuy3%>c9VA>cX;U zUyA1GcZ_UB_Zb+?!gUxdBqs7R-n#sD`mswFc3}T~0_8ux@sG)i7~V!MbR* z(~kK^r8*9tV!JhMLL@)`6>cGw%lh0?4qTdf>l!GAmN781IRu=|T)^YpYQ?!`3*+qC ze&wCF7#I&vdR}hYz|{TjP`Thv1{+u23#E(hgn78Hlv7O&o0IZdXuIjP|MRcCzg6jB ze*6C4`rlPj(`Kb}9$HxUwSj@5%}eQd>Le9V0JJ337zQbPKHPIAgV9M%hvi@Vg9ubSxQbc4O$*6YS`aRx~R2Nq3+f&(rxiHnab)vZ0ou|TCM z$sy?=!^2N2CRWHXCN=Ds*w{LanQiXD!8QmC5TFtU9Dl z3oktwbkf^wnXc6CeTQ$=S~uOh*=&B2FSMZk>E9VWv0JBw&ieYtetzN~MqR5rm29=D zo2N}!ch=OTW3~FZYwsQx$@iYW@%&1gQoqe^-OEv@Rz*LZ{`&jr6{YK?r=Qj|xL3R0 z@8H~(C95}E#;(s&xmUci{(s%FeUl~~wYg)rPIb<&IqyGBn?Bj1J#oYNu!|*?-hBA7IMAng9R$Ul|4kB@PGK z#+MEEkJU|4*5cy&cc5oww}qeV`{|pngiR0T3wo(lsdYSiZASmnheF46%MHD+Zao{B z<@xma*Z+S#xfM?A6|K^LWyB{Uw6<1s(bBbIuDKUoj_9havj6^9W&Vs=^GfE%M9x|= zdEM2&IUPr18WrE@@DDgF5jMXWxxIQ){w>F$K4jU6t}wW`nc`> z`By1?|lFE?f-A}|Noy{^*}&k59bftCm-}G8U!v@&o@grcj?>I{IV~L_~e%P zK6}OyXmY7hwEnCw`(OQ(vt_q}{+_bk%rxs{jAg4o?67XP(TLtt)5VEMB(l zQur0Mv;Y5pSOy4yyNfa^&FgQ%ejoP)E|JLQCb3zIGd+N7* zEIlE^`}(8Am-3%y6w*)4{x|ur`2QcE81iahwulOOt)2bAHdQJ%g=tC8&vaj(wHpQQ zh^#L8CVS2pv}k3yhU>XXtpkfni*~5YV$TqqwD!z46Vs13E`QoR(In;BGZDtWYgL^m zu8aBh&L!CH+8Y<+`36>An|$6+yHefwaP6flQ#Y^m=$W|rqQeWlp#MLvD8>K(=^(oF zZRz59DuK39(_g2ym#oYR-@p3*zqtJWE6vQlCOHJ$n7u)OOHtwb6n_TpTDRkR?fIp8 zhwZ;asis>hZ8|yUJmdM_ufJZk3+A=|{{iI4|Ih1BUIk^^_5wkM2@eZgHOl) zQ`u}+ivZJ`{C_7`lrqo%|7k*Ppy#Bhw~lUnOQv;shHSm&A{h4W?#2KA|Fr%8ukVq| zz~ICZ?IOZn_`Zr^(K*W(vb&5Az1qE!vCVWgmx9k}nGaQWoVTo3p8x;lU%@F0I{*Ke zA@SS`)Dr*4V#C1Xq~V>_Gxbw*|ATJ|abN8ge+X<5`J^B>Te9kj87PL*8<>|yo_n3$ zy1<70mu|+>GCo;X&$YJeFMO4Mxpn$hC5L$Zx;3ibzaG3ZrEz!v+&>%sosZA(-@Nsa zz1g|t-8lzmzuIxe&1ly~!}-4X;#2Lueq4~i^!opQ_13c{k?Tv=#igzMoAW|sg6r1z zp6dVq|7`wWD8b0ea;9<146Y;R)#n6!mAUTtJL2NuvPyLgR<)_~x!!kfD4So~zw&Tp z-nu3C|Noz3`2U}+$5~Jx=Km{QPX>krjgzSoQ9ptYhdH))2bc)*`$~%IWSL(MRNwem zY5Cux5*_`SH*Jm@sr#G~IiFrTKmMC!?wq)?XV-pSKgJ_dvt(oc_kG$;QUCuoy|%lZ zw|W0%2~hk#-hZ(?gn^~WWv6nl!I`t#axT82mSw8R+`iMwW?Y;$#oz$joX`HHubk8G z7%eky-&JaPxZ_mSF54n56CZ*8ow|z`^2m#<|NpVwwJ4_3?q#Xptj+&RQu*h$AN+s$ z-=r5Ax0*O5P4-u&Bws37*K+3J#W@kDmOpK_JorgQ@@vn=)z6l%?z*~4EpL1C{`ji@ z=0$gm-(UZ^eDD9?lU&Lfn4Sh)2=)nn68+-V+|;LGy{gXf%Qx;Z44D7=Yty!6`~TmK zdG9-_is@h6W@6g;td>Hq(0FaJ&Qs@?D7 z&?*{hu9Ly~=$@t5J)K$VoXM>R-Hz5tuDEzHXxi7?>)z&mFUVf?+bZa)WRCSesTaEc zpNSbQaG!bO#0$Lz0f7Mw@_h3D|0?zFfBS#sGWm(DNy+!uHZU-(Xy_HW?z!c-j=Z!) zS2C;P%!AE`r+FN2cr4F0fm!m??TN3a@s(ZeSXS$i6d%AeeeQo#<5P#%w!UcC**_;q zv-JP3F2?!)pYg8WmYRHb-K?(D8h+pZZ~y=Q2>-t=3_KCR{u!A%85`IVa@Z%WGBHtN zFnD;_>u+$=lgqVNWegl|w8VvbJdL^+9j|b!v^)6YmEHgCi~s*OTNPA)eaWV%ipd=3 z&j0^xG<)&4veoyWN1i@*^8fz-|34`o;9a8B{O-6&#>MrACLLsYW~Y*xcFeveg3Ii~ zR?A8I+nA(EHWxQ};QK`~U#!t^HK+~sWRD^aU7 zf92**;%Rl&d;4+C!QK@sw=UUsEj6Vq^!z-p-MXp5svR23a`#`IwaZyTx&Ht8`v3ou zKD`HRNBVPj0fU%w;fdKA8Xr1jCP>7bUr_i=c!f4IOVp3rEBZSoto+~SoU6{c@5vqE zQ*Gz`n*JSEeSP=c?O&;bUPZjBtq1v@^ZY)pO35Rvc_yd*( z_W%F%+Uowo{Qt78tId+bF02C`o*H{ZVCD7Gs|p*cJS0VW7Sw*v(k^I-c6xhjOXtdu z$=2(un?+alrc9Sx^{mrPNN3S$ZuVI-J|4*w=PN$7(dZX%&s0hA|JNo?&nT zi95gl|1z3vpy9#Cc!=Q`m-yVSfU12z7q}neRBwztrnZc=>DehR@vmN84Z%!v_?ROZ z8m89Bfl9e52Ih`{v%%fD79q=j%}rdjxHr{V!!L1Nqo_c-=8}aM?oE#UT=Co{)%VF& zlbc~GT|G|!S8koUXU*@jve!Fz2_>pE|DS6T>>?8wq@S&|q;7Ni-}?W7g4&?dLH?{@ z5H|YCbU~un(&Mo>%bhaMN&os9%`-f@6@;9n+QK-r{6fCZ4-|g6re$^R}Y_1Iai|B;)OnYAzfden-H-F;8Y zWt@$xW#sNQE%*}JpQzFKL+jZx2FE0IVNf2bV_=$Oc=0#8%#7e;UcQ+Vin}CE2KK1( zeRPo2{5pNAdFCO83%+c-<}u#5oVeVTCu!0D&35vP(Y|}bxPNZ`bY1M*qDqc=AzJyD z)(V<9yKmoI82x|m-KIpw{dbPD?vUWpVl@%lR42-=cJ}wD1_l+;1f8ACj)sOA=dXS` z!`Im(XJWKRK}*nB;$hS~!wDQ7&r<{*8aqz1U%xeT{@Hoomc3ed_UHAuyT5)OcRFs+ zvv%4Q&ovw?|6dYha}Bj${Y$g0>)_!<4;Ss6`AoU)|4HG;iSy?F*~Z|=YQf2%eWbRN z^4}{rGHtvPh*!-8Zn$Ipm8)3!hm0|0zt0 z@r<_49~e0O+;tqboLp*Xl4Vm zsr_l|R@V&!9 zTm60Fo8`Zkru8$)X{}t)mO4%JZ{Mob&mJnyFf+aXZ{NOv2~)1SXRNh;KI7J;`9Ib@ z|3ClJ>g*#P5f*c=9cU<4zVIT9E$IBQ&AnlnyB5_?HhlWr%OQDj@WpBOc4Qk&+e>Au9xvdF-|^z_@GCwz9;_@ZxX z{O4}9&9iH(x3{Eja1>CusJ!jC1CxeI*@TpzZ~UxdB2-EzY_8i|l#n6%uOi~aR1x;1 zj5D>%PNy;`+phbmVjftLy!-LPslvC9b^KcYFL%=+9<~$9^OkP+n$2AMS?X;MlS=zGp zp7WfJ!UF+$TC#Ovn@EcL$A5=d4oWaX=bZChd`Q`nrPxf=h^>s%>Qp} zdT?ODhbpgkSvwa8Td%a<*KYLX|1opveGL9@Hf&&67M1OBdN=!&s7c3uFh!PbdVNiA zjntH&K+XkUG$sqF#uWBDMVz=$(KO9!DwDn4>JZDq5BX-sL1%pes&?;XG%or7H!bsH>k}xyl zDi$`GjH<;OW~g`?7Ee^1rr2W1q+@bSVVm%w2ckR9wkud}oXaJq#LjMTA%>;WqqA2q zR!MQXbD+q|T`E4s=NHUkp5iB{R5LwDHRVRf+S%$IjdrD?5?miPACO=_!(6F$V)oR| zBk!#WI{TDTy+i-MYb#C!z*l0Xpn^cwcC!miqCyTVpo`iV7&f0_X*t?ds=>lrO!J8T`%SSp`+gzx->hnza8> zSNy;I|9AiY@9x6H;FQ)Xkul+5i{tS|$C)Bb`z;cf%fuSralW2;q?WOosVcJM)?@ia zU*ns1%&>3rGAlaawuGrTVEg`6@+)R__!Q1`dLJaRZ~p%staBzZEjCS8JZ^KZ_uu|a z|Nk7ko)4OiczkF7|NjnoRV}PXuJSoVaPRT-e~@vcnv-EGgMUHNvyj(!D{je6&aT=% zX}5=skUfZ?4YxcTd_%5_30`|0{HXiC~s{GVdl8p8eu33_Kc&pC5U3&Qq=Ek@(1c=H$6dC&!n& z`^wM9PdU}nwbf-uwEL?45sMja3O(6;*?s=qnQ{wnnwQ0TmLJUYJi{T-wmmP3BSmrXuXOce z8_Y!fH?3oSp!{r3YQ6c>iN4X_OXFsx8}C2Iwf5@&i@zo=XJklI_vsK~_@LmHr@ES3 z`o(>fGYUns8y7osvgkbCw58k9Cg|_iGa0i^ly~;%2=_j2Ufh4>n9Wg>$2sSVGq!#| zzufKrj}shsu5wR)y*%|^&-eAF+N-v2|1%xbi+VLxzoW(T@fxoMOaXuD@*f&`FPQ3M zT=6%5&(euq6-KcddwQAzbD1{8%RP`fdCY14|NpnGL+r{oGS^>U&|K&l8=r8c{lLiu z3=$o}tHo5_?hweF$0WWXgV*lrC0F)yCUu|~+SI^ol@OfmAH2n(X;p73zgrJ$qyL({ z?jN~ly)JF#v$xLSzU$A|u_I<}>682X-qm?U&+E$K|K(r)|H)v=;-JNhuhw#IcQ1YW z^4zbzD{J?LCG`Ve{;KE{}_jAFeE;(bL z^UZ&E+U=f_Ci=!cwZ%GZllniNE-SNt^FObAzjV*5dUunH6<%`6J#)4H-~Zon`v3pu zo(&8JA{~`({GyK^UiK}BWc}+Gbbivj@`?To^(~_QzH^)xtesi2T+2~E0^D&+0~>EX zD=>1K{?_Nos@T~FQ|Bw$IR3x2<*uei;JtrNEbX4cVlrV5CtS))*}Eve`o%E!4I2nd#@~C%IB}nc}_j6bsOG;{RO#|9{=U;5d=-aG=AX zjg2Dd^SFiCMMDlBICP?^S4cwhZ^P-YQ#xo;=#f{3+z1RQ$E8PG8*8wI5#vKZbp}}u6=L#ooWR|;dNU3{CS1uwoT9lN{E(5djExsKeYjUk&Q_`4Qdy?F69D3 z%6O$%Bz|d6YNE8l`|}}F)VVKaDOxC=X58wr{Ya9e-|{Q3(q=?zm6g8=y?<-#{?wN$ z=bAJHL;TmA6wfXHUmsgu|2_X-S^MAk|NsA$F`8*GYEL<`!65geI)6!yi^2tl;KrUa zGpZEd%x`12-_UYGD0E3s$=5~Sc+y-hJ0-gvy4HF&{MZDSyuUMNX63%fn>F9Ha#OTQ z|Nm77y%q*FhS>D9fMV!T1JexeE1Azj?gY6>ZYxZx;JI6`?Yrf}!Aa|%F1_op!g9`; zWW|hop!sxAw*D{OAdxI|^{wQl=_?r@%{_i(5))6zGdn#F7G}l67j}hSVSj#V>(ncY zc26*h*xTpHF56?dveG5LMDEGWi7}-)M>G~qyejeQ`GVR1zq<)o9(6jWa;hXf=X(D2 z+kgN6v9*8m|JO|x4i#6AODxv8i%Xd{=sL6>;P7xeD$Q;+_jPU%Z^ZkjmfJT;Z`C~& zcjAh@>ZDmZ&lIQMogCRSeYJ3v;+x!{os&fh|3@yLY|GG)d6Zd|MPWwGzT(yYA5<_j z<{of%s$a^@lDL!YR9pZ%r(t6YOJmQv%Qt#k(we6V@0sejN|{qROmh92iNEVJw{&fD z^<4ROsd$UK_q>0L*5>sJG`)*j_~0kwBBo3U>H7aK7#cjzxo8N@G;|IS_6gCqtgux- z;J78qfMd!nr-lRC%=y78N1NTMnS#@8MK&i*3fx&%u`_MG;I<{78BQ%*@PFZs`o((T zd0YF+cXs93|M#^lpRFUjSyI~H#0{`LRA3ZupY$A$%r8f*q^5;Z0>jh@KY={EEn688_8a)kYy z!pt=78Zj-A430v!U+27z8_tW|e7o?^E7gEGHu}20YdA#Wj^7VE`(|0puaYafZ|g)?lLrH%0K=R~CxmhmlrxGB%Y02g z!(=o4g`P^w#6?E`tjr<~FvK`Hx4pW&+RNCcs?PCaLH3;~;kTx~@D_USzt;ZSB0nC^ z(`s9kl*+eq{{J7T=XLbt+@`6H3pa2GR!?O(?;|O4x`v%)FYD4tb{pHubgs%R7BM=* zes5iwwsP;j#(B@O?#jR1{OAAW|5a-y%xRXZ3h6()NXp-2SFq**o)t4AbeR}gq!_i0 zn1WtfdH-qorsZn+f^8l{)aBcMFDHBZmN88G|7UUh*Z;Bqce<{zntj^!-|Vhy%eIEi znq}-=6t}eJ7H@XYk29$fuT^R;P2!gi1}y_mJ#y-DeE8bjqCIwlP|%raT%N1Pm8ojFRwLk~q{Q->d*-Z5OH8$&`1nh`ZP;p0PFLAB z9c{BR8?WC?t-g#WHmcp=Zjq>9Q1Cg?)YI4V*RAKpnKKu9^K@=C9G|++<=1{S6IRv9 zE~!Ep2ezAG+0Wr0C z+JTpCHb3-nF-=!D+$y(}t^Dg{_ABaP61xBX&WO(Uy6&{_`Tr_Omj=V;haZEK{PX`U zn<{jPfyYyNlN&?gsYi|1SPo5?u|y&Mc`er&ua1rTdo9nj`|b37Qq@%Ce&-FhAIpB( zHs*+IjTd3dX6;z|!Zmf~%GRAT`>KAf|9@ddZI_sbl52Uke$^LF7X|}KPUP#*f$!Q$?HF_@!XFXyG^_T1LxTskN1d-kj?^p{v! zI(?!3weR!f(|PwUa`^sniD^`d!j?+ z8zb8exG6D8WJ_=ew(AO;&D}MLkw+wXvgdps?>&>fj3(#T8+dMP{3|NSmgl?TFVCFj zmC630{`I-?|8rf>Nx2;GVQzG26Jby0V4Q9EL2PmQgWCo^Ou@_tXB$@dHFGvBvg`XS z#^Rdvm(}~cl7)gBYr_MjKL<|UXRc7VI`_!Sm+X!&^Y80l{k{MD0;LTdMtnac-M<&> zMZNR9mFId(@A*5M*9))zKYzw9Hz+Wp=-Ib_bL}r*X|4aueSm?h|L*}73j^~PC1)<4 z?<-+tJkgS=ts0p0?b^)C(nbLm4?iVw$MCR76d0~_X?E*3k;#y}(%Qu!y)Y`v z`NIvt3*i-KIkr!qbS~er@@id8+tvL6`DKF4tZMhd5%=L!ulW%K% z@?+CsOI;lLeJZ-CX2R!L| z|LOmmNtJ8a{%iD}RoVL}aK`)WliQ!p*S%-xwdl~LN$*xheOB|I`?Xx~mVeFZ`s32Y zJDRw~_A2#={)$P6c64Yst|;;15yQ38f+wai$BT0geUX`%B@uPzY4xtui<-KWc^@5F;xD7$_n?l$qij?B?FG$OO-s&R zX^Nfp^R&uR)4d*Q8A~UpTnwCesilGWz{LiK8xq`x9P9?^=L}-~jZ#bvmn=8)kT5mql!>v5QuH$|Nj(h>0)3IjF@vZP2pru%R~mzDPAQ;d=lGM_e4l=u*_Gh zQIL=;P+P#Dy2wSsg@;ea{jrs#`<5GCDonwv1l}uXnRP8FV~lc2*;iLPw`cBe{{^NG zQbJNUPU!&Up{E^8vkkq1^R*B7r%BZ&W@MjTa$L;xCIjPSiN&XOU0}$X^eUpx++p+m z@&?N{XKlMKR%u<+RGOZ9`K7@Pt>)trpAM-AFU^|P7M?U&y6j!TJk6p+t;fMjOtMQg z*{-`)5B-zt?}JgxCm=tNRvxmMnL6ARTZXH}#53_6Si7#IW-7hK8^ zXmd~z;H>JYxFmRN!-4?K-yTUGy{e{30S5m~gqRuy6Aw74{z+V#!l1&?*}zxulC3t0 zqa!Bha?npBpUxAJ$qG7257f_haOn0V$;?!0JnYo?&c)0w_P$el^#8m~*USFr|E_!c z^-}%6S()2EFW>*a{YxR+x&xl4w>pY2s83{(s!UwMUAx5W++N|$;cO3ni~qYW)O2K` z-puLEQ#d*POq>wX=2_BYbXn<=N1flKU{T?Vx!x<4%e?=83H)_=ZN|QLldnv!|G#)` zZIqki5yyN`X#LOfR8d%Q@&DhH2mgOhNO{G;UXvF1E}wy=hBNZ-Ss#X8#fhnV+Zrs{ z`_w_l%dKG0VPIlNa(t%amf(;mv}}b=m1CRUp1>Q!Wi4~NgM)xXwtoeYz{!Ros9 z{K7*_X8jiz7H;4;vHWT4qj+I!&(6%>%u;DS*9$aa99Y$gU4NQVpM~-xFlqwhOJh}AF*@}%d zMjpTJ-+y$3-~SKmVn3J?P+I?Q(d4C~4_LGr7@L?%9j>Sevg;o>a0XP!&1GQTpK|>* zSMEJqHL1IaZ{_-0CkL)k+-dM#AwzTG)8FU!o{@MIOw@0ZqIOOM|9j4ya{b?vN-YM)hHq>Q z3M?VEfgc2&82A{1esGI1x;ZYA==^eJkMY4P+-&b>@0~U?W37vmVe{(O`TremJ+uG+ zp&^e!fi;4GiT%)m$T}WLmQ#y7k2i5PMs_wet-Peg$Pp@bT4F`oW)Yi}k{j-n9$|AX!bebLKy_P_R%84MaSl^p^K9=Gx?d-{v)DCz%n^5C-HZHG_z ziLKU5;rVzT6hkXon4d(Sv7VLr!Ae7mH-PmCzi7U$-^=9(nH5%UZJWES=fT7&oDa{Y zes0$Me{n-BC{BLW|NsB~$e~B^|Np;baA3Hr5V<7OSxemV+hQ?AQ-9<6;)biH2Hb9L zPF7>IUQ)}wn*G{J{j*b!6mO1~`@(##{-2%hY2EmH@2V?%DxYcps#_88%}`M5RBDg2 z&~o|p8y!SMLB}BmGcYi3QkmPPc3A3zk%Efy4U=<`@_bfoHp@zD6Y@9Jf9AH#vB~IM zG|#q|L%~5x?e{{T@4wXlJ8`%$d^d4XdA&<9J@(G#@1MVyuW*lv*k179heFbXO}m?4 z|CgIt{5Jg0|6eZ|jm$Q!&Pfn&(Pll9r+WOrIl=Z1;cu$k48LFX3f6uvQR^=CoIkQ_ z^%@NiPRaUbsn=Qle!QPo{{HQ`;&z`!65D27`~CFGwKKL?zHM74yFEYlzVZL>55KPZ zz`$Vk$XB63NoI!s1FOu2J)ugeYnW~`a(Uj;DZAC>eZaNwTXNcdgI~8cY3AwXt~y!C z>zUBSpzk8?lpW$g%eD!vl02kv)sZC}~ zlhbx=`S84-LtAN+>5XoyskvX*94LLF5cgxXN6oAcS??Dd@s0nd!fGTTIcxHS=Ps73 z)|8ruTQ3g#VpZ6`{Quu|m2V?r#9nTHf3l&mL`h`=ztObo>@pS1FD0cIZ;E!l6jxcH z_0c?qb>6+o%Qs5MXH)fwB7z6 z#~xhtJ$2jq>1Jc?lFiRon=2XlRj&O1|L=~3uP+&eR4(pSPEa!bA8C84S!zQ}s-TPe z-xt@IX1%|C#M<_QFq82t!{Zb6Cp7tPt`*U1cD2zA+1OD$>$qain&m;~=XE8OxVw~x z&8?lj{B`WLWQ|FYKb9(3v}{XX+rzfyz;}j4T^&O2g7#*1H;U}pdnfegdC7?OrIl>w z-@8WN?8}+u!scOYSO5Qu8ONF(o3wVX{dCR6ed5|x#*0FpWv7*RiiO?(6~8Q~iNltG z%{yN;DSMNah?BssT^!Xug2z5A3CYwIdAx6S&hKmY3=Gvy&6_s+l zh7~4WyI(%Ii#|^X4%{rPz+sc5Srw0dUv+)tB?$<+C;6$Q;qDtYgE>6^io)9 zI(^Q+klc@V&R?m&eoxFGhk?0p*(3$suRNtZ9X$v74nAS?waQjpz>q%C^3@eZox~Mu zF6FlW{rWvy=*eBFGrGsG1&2>kWD;6uc6i$BS&R-_TO|AT@B8oBuDC8~VVkDvtCZ7L zMt+xG?N;CR(cs|*242%k%oFa+cY4;GAa&$~g_&Bb!Hkk$(E>M%RzEF%^KpsErdK-` zIx$MFI9Rg6O@mX`p{DE6ma9>Qg50KpD^5M+bXT?Ko!;wj7Py&dk-$RB$AR z-2MN5z7P_WabRd;R4_^k;W(z%#*nf>@|m#jmJ}_4gG$R%9woB6DKRxHE)+0M2wuUf zrm#enwadu*ipZD3_PL*bA70oM$7VJ8(#g!@CLei~nEmJ2l@;vrmI1}k%LZmv$DnL} z=epPvnx}GK#h&hEwbxk^__0@EMdtD~|5O=m6_&M_SO&c;Sy`NxUJ})PXZQETyN%4( z&CT4UwQcEFQ*YP$ds#*e42}i@B`l1Q3=L~u#N1rPr>`MY`;mqH>)N^6(cuiM)=zKj zVO?=5F0sJ$+L=X)OaFg-(|7-g@qJCu{ow!q{}hIjR1R1prD{6&?P_I%qR%&0xG_F)a+oPn_N%w= zNBS8y$DsdT?p*ojBpP(Yg-P%CytCW?*69s1@|;`Mf8PJT z%+bZ$WT*HVec2D2C$n=-O8%lr^D(O|i}HMD`{^6KSG3zd>MSDbKiXSNi$nH0O=a+zO- zRLzIH6M=b00(MwlbQJjfTxBO8oBsUy&$$n%Ih|Ry(OYntN=ldLB#lLBjb9>foUEGb z8#im^+CL}f#{a+i-&V2p^8LRbvqX2_VPNn{EI+x!GDVWFx!}k2Hvw#2V4OfoWuH$dJ{{P}8c^yHu0&yEov#C2pt~xGYW?*2_U)h+U zI%7}s$7WC48QHA|yEk2#(b~MS^@i*Wsm2HazV^nF0|pE|JWV|rEIs@VEc@~-4h79O z2+x~2d1cAc#1(UlU32T+3nk3nQ~kcazBIoL978O^D^-tM@2)CvTD-F=GpRyAm0cvi z$eodu?`h_el{fT#%6}HFEB|Nyx#zve`R;%9_y0eaxFbEs>~l-$|4rfy47w8v7}$OJ z4mdi8c^irt&toj-d7*Hz<#Mag!xA1-?K5vOkL1f7yvfcf;8DGZeR6eW`DdlhSNs3} zQ{6ZHij@b?g%2!(N|)Z+&axEFFcackv)MMZQexpT-vv?ujZQ~7PR)7VC3woEQe80J zbk%i*MaKDSp~r z(M6|46Q}H+)wAS>!}YMTKJd)m|NsAg{NMli_1@!e?CtM-e*avmEoxD<`RbY5-dtHV z?aXdT21Z7ui!c60ZRE&cVPFgsQuesuaYJCswl)U~8J^gkhpkyHOfE`-V(3)^^9DV) zsg(~HoEM+;TDyip?%+)SoofXIe+p`pn>R2?lsI&(xx{!jL_t8HK_t-jmm0@7 zK>@cNr_SS-g;Kq(vpVbi?c@irn0v>V)9D43I@$}Kh%@%Vi-~RWx=3-Xw{#T{``~UwpbuZ=r zUsGxSOHHNze_KDFO@Ouej|0YMzp%^|a%^DXS{E1a%I~?rQ7t?CXjVy|{Zny6LF;(|rXpvUopQ(Sh zzvALEnejTq;eKwtYtiyD<>mh^|Ns9eW0z(BgxUZ9o)6cSKTCbM_#EE@mYNGiCR?9m zgfwfW7`0?*94ux9#n7Y%VMmYa`H2fy9G~8*db5SG=c#h|n!Vl^zD`=Pa{1h>kh3D` z>V}uj9sFJU+B@-Q+ve<3-bcCrRsQ=iL-5=8Q$puG9($>psd@ifb%15}w!5utU47GU zWv#YX5@1`k;lsy?3ePUsyb%mtP`tf(%Kz#lp7-zlHy!Oqsr{`IwfCoL{8^;^`3 zUl98H>a+c?bMDq^XWVyY{(t@d|B>&19+WgN1+JI5ry|8vaKAb5;8V9`gD2vdhl(BF z@&--v&E21QJN&6({)>Eug!T;#$3>qD9(j3%qe}d=_!qYQ?+(bs>b}~1rue2|hf4CD z>Hoj}|NmsaJ_o~L<4dvCj#s@Tmu+Y8zGIlo=@8S%I5j4?m*xK(A=z^ecg}xr*d4m3 zvr#b5{Gv`D58GbO?FLsYISy2OO$%K!=Y2@X|NoY2{_@*h(J*wkSNtPf;yts zroM{mig+Bn#@78}=#o`m+g2{yI?-?K`v40@gFj}5OE?Wgb&ZlF4epp5Fcfq2c^y*I z6Jxj;+5A96ZxYkW-jz9BwnCA02c^fNBZ#+uvh=1!RXaiRlb4L5Y%JSI0zyi{*~ zH^$WS)S_!*`AhpB{bkb6S2DDJK5_Nd`F8@7n#)dIXXxe1P!NbXR~BKsBgs}PyfRm9*Y9M0;{|70+JxTD5qP&hRi1av z|G78+|NkT0X0N!BA*v|i&cqE(FV_5;F+pj^r8&+!CNEM6tl0hGu{oRj-?*N?rJm{& zlaxVu=nw~UkH^{UwK@lEGo|+0oXYHdsA}kE>+kS|_u0&)oi_p^CT+g(PvPmAN!^ol zi&rmI`g_UX|5M3B)kZzrUYF0P@_)SPYDksT|Lm>#e^>4G-fWt3=E*6;5Q7~-_xvQ3 z|Ey(Ta`JME;9%o;dRalnY0_QaE5!~R3l&W)H(#w$+vY2nFZ5GD+Q)ZpzDV;o;MJIOs%6?VH?@MlI(3g?>z;Gi_rLp+{r`7X z@bS2wJB8YXfN15Hq2_5R+uPN)a+(pFMQNl*XLF4>E|`y@BaV)$L|2cWpRejHg7_XaWI@IW?XT& zFOV%`r3N;83tjRG3(M_6(0UqvOeG|4)iIec?MbTe&uG;IKL{~jQ%E0JIEeH&l@nmx-HW8YYQ_+I?Kxc{^0DZ||k3>O&0 z_&rjtG5az;?o*jisc`TI>%yKR3`eeqH~*S(j}}AiW9W6cuYfE z(@N}&KYYLa|Ns9__jQFewlGa+b=Vk?a%e%pi3cjDAEX>B-f>pK;gS@DfmN=&C6oSb_&U94?!=9spBVgm ze*bK3qN?yg`>YPnCo@xBTuQm?HD5?y-24AU{LdR-)?F}U*gdg9pn;*~$!)$pZ_*lm zr}1rga-QkjB?bcz+ZL^|0F}&k*_HqM>_va~+<9u-Gh0qpLg*mBkxTrMyJ6CMC;wQu z-Tv3fuE4TdTmIkwZ+{6Dkz{C4HsEErl)z}9&5|rS;e_?(om6B5t1X zI&Jg2c>kjXjEbSRm>FkJn`e@EL|sHK)3TarEw`_7%)Ck5I3;lpUkDC zXRw%WGT)cICTYG5u`eFkFaGF$rb0&dWhW!ELUWI#XG`ximQM!+nS5ul?Pj#(-uytt zYV8j>#?<*9B~N07j`s-){A&x?ImgznG-;&g?q2u8MK7!vcgG)ySecrt+@ zw(+1;bB-xPQDUOs3<1Lwg=*`Kd-f#1zn6Ya;DM+3<2a9-OST-Ywka$T=_pXVV(@oy zepshs(mS^e=4+$Mu7XOrXFbeG#wRA<$$aFe{Ie_H(@eltT>{h}QsIADx@cqDvNe_8 zwCiTY_T;a$+*|uPY|de`8Q1IYBUbZd$DC_ofFPH@0tp4`Oc}qj0CSUOV|FcX|kFJ+tUd(i0A~$>C zaxNKsjx$WuLbbXCeC}*XSH0xp&cfkpUL&_6agoXK zmDh6}7tNcH)huyNo5^LOHCAv!$&ST;Tht{Fj7M z^Mj9yiR%@oduB87ySuzDclrOH`Rt$7=kG_|=HEW!e`Fu~nLBEx!PZxeBr*;wT^4KW zNtIo+cl;C zOBN^IY(L~Ix!`;Jr+?16X8C$2rg%yI%koybH@mOqA1H<%H88tbUdq-_dSkWt6=!N| zc)!VXG5%t`5mA`=6Lx7yOHe=)h)uQ&Q5&;EJy(Qf<12&VqC(?n;t zby@v!iu}}YH*Jwt>r8QJ{{9s{EZXn>|G&g=g0Uf|)s5)^L&Ii~2b&F6FeS4H1sOaJ zXfEJkxH$PtNDmu#Ji~q z_VusZ6bUvlh4xzUVt2OsO9lYf27`$>Ni=YjUr<22H4-}mg6)~*Jow|2o)wbOGe~Ry}{cm-7=x>&c86d(T{&|>$x>MYG2>6&5{?_*O;Oxvi<)5 ze@7T3I2LZ$FwH_xDyLBLoIc-jx0nB)u}xT}xa0V8Ar;rA(&=+naW%L-?K{fVo}~EV znMcZ*oEZ5SE9>cRGvB7_Kb7I`jAC5y;m3@(XBvt(<*#(zw;oi;EoM|;P-DKZKtO`K zS+d8%S)!O>XG^5^thd4^=VUCHktevY;lR>{MvekzA2tSy0}Sjv!i`h5W-L1``h`!& zzh;hb- z?BMqOL86Qb0tyQx4m&hyuG~IbEt+q}T$`H5o$C)VxIdixAT5x4hKtlH2M5O)tgG|* z<=ijCie8Hdj9q0R=(u_7x}y7Ec@o)0U-e1u%>Og{aZ}>GS`P*W1_ANrPW9loaf}QL z0vN@5a=63OSXpPR*_B+z5O_!Cl~JgU;)LvXf?qGBp3-1d;rO7#bHzx*)r)yW{NV|n zZ_GM&D@P>fJI^bUs$=n(qyvtjm;Hxz6pnM-UDy!8GUH-tdj(%kt%T?s21bYeCtN!= zFx+-6n6~SGqo~D>o&rOa%#+4ZuF1Xoo__zR^I@aHQ9cRjq{aWAxt>oi2;T81Jb%Wd zFzbXZx}Y=J{(ZLmeeGdZ=A>Dg&C8a7kA1g4UHoTz{>&wx+7~CKYWzB&z2Y?wxUKxV z>i_?DJI~Atc1`&tDcoroI(OsLCa}!^|G)2p8Q=dY3AX=RIz&r(XAxoV>%TZKf$msu%^GoJmExg{!LC(6Q| zQ6Qv$;LwVRZ70+nOcIr&Ej_0kj1aHLdhqr{+_Q=bThrjY+HnU@y%{p&y7 z#P}(*fERSG&JqR&P7P*8GXv%Z1~oyZ9;E{ZixL-oHwgN1M`!W=cGhF<){Jx0o02C7 zEN~G~VPJ6STI?`EkR`|=$y;!Ni^V4i@LA3;7}#^teEt+Q25Hgh<}*(* zFa-)PZnj;(z$Vt^!z#{^u~+8dKD!f+#giO!SWPA>EfV5lxDb9=Z^FkH>5VSQ3tpUI z4p2;T`E+!WhQQLmPcgdEZ5@Jg;&r?KfNY0JUnb?_gK*s1yMfVI2#$`eZ9}-wt6efDIsWeXLh@3H(MRC~*>zPukBHJpN zL><>0Fk$B5J7|+($Ron==g@8fOsoLn-F5dAVg=?2l=PEA7BF+cm5xF{wtS1~A z3_6pSXUyneP;;IYD5tsRsL_jt&Px|(2z(W8jOP{(PP|h*y~VOr`I)C1s2uNK$6duNPAqEj zRJpp?_4WV%e^-^R@paGC>NT=DSgw9oD{m9SroF3IFfiK29MU{_Do*F&rW3PPCOYsv zV*2`W%FWWeEk4IIyg36WUKS~nKf3IV+e^NpF5|Aybe9Wzx@^+yS+qD5!&w>9n7ER5 zx~V6f~Z6r2FC`kj*}g;(pVLAW+prkSu0;J_bR3MPTel1$zq4o zWZX11mbRaaoVKHJbMqS}k)B;FCiB(KM;d(Tzv*#E(D9aUZQ+--Yr0FUt}hLZ-M3`Y zCAT;KzS?hJ8~^{yYpJE#|NpOA#IWw<;#CYxyP7|S9a-J16mU^-aqs$rM#tAitiNYf z^L^HD{_RIt*klU5bGr2N3VN@}`o6X+pCc4}`A?SaFHr`Db%rjJI#Rb}CR|wYpu*YgGwwzt7yQ^@d35rA<-?xFzRQ<&UJl;s{ZVGkXQ_f`%Nkube_Rq}Y&Cxg zSHiv%d`4lf109u9E`aBUG#Hv&0?%CT4Rt6uijlSA9QQ|IW!Pp2{9yxxrAn z{^#yhb6)ILovQKq^5Qu~S7QTnx7@1#{(t+kEo#%#HZZVhFsO0tib)cXY-V>;aFX@W zOB0Y>=ENTTbjFc{OopZnuF)@6ZP?nF(A|G4^M|h0if6g8Pq%G)el&gBTh)`lxxWO8 zB_7#ziQQqM!$H%ptWVdkFcjDyHQV6ccDs6SEyMGR*P3U|0?kqUdG%|HmgfWp#SDij zjro?GR*DP~6?|dZ2EW!^2si#JcxFqqiKO)XW1BX(akB04dFylI*iFsi`@Q@pZreTd zkMGLes$HA^{?7qc5#E~zH+{bvRT`D{p>qG<*_ZEH-@Cp0_v^b;`Swms+bp&H{?gq1 z3&#p)X0)APR8V9*ydbO~@nPibW9h~G61rje>vley^h{22wvSj>*W81h@~VRBDa9#C zeto+=_y2s88g!y&b)EXt(mx@6_UBllX5UtCEW2Z*@;CQZ@6AA2^~I}Xu36rV>iaqa zbl}eapTScZICgDh4rD(&&++V(t#9ryZED@OeZ}dc{9P=P1*@**a;>`HqNE`j-Mmx(g;vD`2Ify5Pk8i8HA0pg zN;ps~%4Sep%u`?z;dHfAdYdE5R&O&S)h$oVE#iU#61Vjp*E@D(U(6M`{o?NDZX20J=?Er z=BqFT_`;@gfZtrXFEqH0Gl~r1EVe0y+D;Acs?=mepFWPd*E0Ht(568aPtfZE6 zlldDDH22yS5`Sz9LC8f`yCi0i=vGbS{A8H`f4B;%c*i`)-x%|*~K#_ zE3FW4Rok>8@doFW*z?^_mY#gKU7#{(YpK_~qb;E|VWDwfH5oEiGhb``FTwQpYLC2J zqF^qw692UxmG9fN4BtJRk^KMv|0D$lhA9?{Tm^n#v|rItWigA#hRe9x=W57eNx`#c zM?AH6pT;VA4_|9)5}oqHI&cL)Uqs8*t?$&{e)n<~%J-~%aB|VY%w_YQX$8xR znOqaj|GhQlh(%Kag8>Jl24j%sf&~ha6=%c!E@&K>*sxX2hSkkpVS)XY1s8Z&CyLg) z{jEA&V#xV(=W3pRzW3Z(8P#80Ay+e7h zazVzm-B;{WoI_T8iT}hIxNDL2;*9@IjjdCz?_6=K|MpgsJFUCFyY1Z0#-^EemCb2g zkyV|{JQI%90nBkeO5b@IM7f*eJmPtR6s|pYa5?eq(qtBvNwx0sVuBL$ch)uisdLYL z_+IOh!Uq%K87p@wmLy-SZkU+cXZ4)9=1NUZ;nA?qv+weS?OAF1K*Rn|!b0K@rCi?@lQl^H)Ll}*h!ozB=lN)>cmX9_zQ&RnJ%{fT@s$S*y`Ug21a(( zOJ)sRwQi-18;{ntY}hq{chUQXUZ*&XGMDf5;tSU$dwEY&aPEI*=_t2+jkU)FUmF9y z9k&bSn=i42w?K4xg*k>evN_BE_%V&;s@ngaqOpcTOzuo`;-wg)_1_rIEezUxy zk2K6^l5yh5W@%C|d9mP$Xn(iZr#U{0JC`UYW~V7|w4J^s{U^xMYt!P%JRR+c#JJs%W_o;IC()%eZ%oJTH`PjYR@)VQLNBYFDPk}JMjBGqgiT|`WD ztK*;iihfw#Iq&6~-3NMR-O>Fnbx()0vq_0DJ(ht{p>GERN6)I$S9ti69TMIbN?LB5 zGFM4Jz~y(ZPl2stf@g`a_JM=j=9d4BiFa!%_BeGFcK@>Lx4_?X ztDK%2hKqQ;li&Zu+`)xGA@y2R24jn{c+!hS9i3g-5p(K}O?e=(_er6SO3JOjzt#q{ zeOo_c$C+iEKG~qtydC#dD6SFT!_m&SfapEu7xdI>-AJuEk2mGu1k z0?N)`{Crcd{`st-aOUXxwpD8TgceWR^)>#!=C`=h98*>@FtN36Vc_oB_+(iO4{xF6 zCk2iUF`d7~JhB$A5*?hpr1{ToS>MRYG+}8ZyVY6MgpRoUe6>&K_7~)SvR%7>`n4-g z-=fxg_BMLweVP0||JdjCnIX*8XWhkX7riO{DJ3waS?OZrq({Pv2j69T6@;?Ry*6jY z?lWtG?msvA0jhmm~1dm z{A8-N%}~JAaD|_P)vJn|A51tG{0`~=(wDpH?xA0e5=;y;bj*a>x9KjkUie<1|8!=7 zfXvcd&?Yp2X{Xoke0THT^A0u!))_n;am>=ny%XiFL4}-Q!=#1EUedOaDS=BWE*3Ah zVApBzrFS7u+y`{N-`QtR1yk&F!|Sa@7r#MDG5uRLG%m3`0q z-;+-=pWSyYOwIE5yV@kp%wrsZUzpFE=e10H+2tL$`Qj=i#;)i!=M0!`Cs>%KYD~3D zJhTv=|0mSCqfLaQsQj%@BZTdN(MXQ00?K`VXkI*nP@ zLfdx!(1_f0?3SbJs<4X7B@4NgF2yVqFgf^0nT@fj&3H41PX?#OwUqy+#cb32Th8hS zOt~T|d4|EwS#Wk{c4=?al=vC5_P6{B=?b}~R4RYuFkXW6Y6kqJBO#IlkUdibPBO`}bk~=Gdvdoj7Bax38^cV{GS$>}Xe^i6FkN1(9W$VH7 z|NkGI;K+F}wXZT}k|bM@SlG6M8(-9(v_eQj^EptWhBJNFy#yIxVJq2 z|Ns99a|WTg%V%eP+1TK~z`(4;GEGh{X_elQPX_$mb_tH`e0~lEpZOyDq=XJ6zPVRp zks_D3{@0r%4j!gSMN^p$Xn(M1)4QPl?s%#}cZqOB@a?nNjxEPdXCGM4;&!fj`TQPh zVaW^Wf6sHz{D01Q8l(Atp3wgcIyJNZF1nq&?UsCDSzZr5u9xu>`UPHjEX zkYKt@qUF|gR)ebk4*r(p%|}x~F(lc*;+z_um$-l_r1iD$nJo-GrJdP-zBL$1h-#T{ z7GP^_zHL|Y^6}39dg6V4vhz>hGgx|g`O*hZ#rvK!Pl~lZFaBp&jGVlkP5m6J*gp^d z|NkDPaVJ=1)vL;gC&sD&8q5ERbRT`%q`2~P{+|wmW$gX`pEmXfV0x-)7zRy_@q z@+?>Pu$W(=3%0V$Bo}{i(>VnK20nC@T7Bb*dV{cQhrXzTjJm;QfA{2^EW|Lpgj46k-BzjJv1 zSL^=^SAqx4{yVbN?UrCt+}68Xkc&C%aH*43f6|IprCu4YX9rd`#MRsHoN_rZ{Ya<( zkCkCRrPq9)VQco&{*&hazs*0Y{{QRWdqMSDN>{m~{@={{uS)BGgM;Oj#L3s+1eEP# zmu?el7l>FkudiG2`Prs>CERmDHqCf^Ag89Z>!6Ff_1u?>r}FOe%i1rTzU|HdV z*e13_?f?JZY&+Zz1KOF6Ztivqxl z5BxTF^b`(@&HJKlu|wzL+UMCnc7G@_|G!bAFa7_o=&Z$3$Jfry{u}*&@qf^iYzp1jpegh=$w0`w)AN%PhlLXNj<7}x_5jnRTmnZ7LVJ^b$2jj>@aM*l*_P#I z%hT@aPdU6Q&ni(nzia-xZCCysG|c?xEB^n5RR1F7|9@Y*daP2^NZAEiW3>MNa?nxE zlT!2=n7I=}U%u5_8~w*D2Fy_!t_8YwI*J$u~UmdW|yq!oEID>g3*_*AK16lQB6bi_=NX{ z6QZZZ-`!z!>{Y&DwAxdjlPdP&zm8n_bN`+C@oRTx=>K2ov52Sl|Nk%5zwH12|NB2! za&O&V`~Uy{ElT>!(0Jm8fXJ2kS*0_ygbLL+W-;!NsJJI8!E#njR{XS!`@;v1#nbfc zN*jyfBuC1bA;rs|Ns9wJpVuFe1wTRCumB&e{Hx!YT1M!d}3guRTX7B1OY;`gBaM~a3;7O0eSZ(w#yyq5VQug5<5<*(GPpq{<$-fL|G1OD?r zU)gKQ)aJXjU&y(u@P+1=iV6S493 zHZEv<@F0Dfs%E~Fa`EzI9Ns_MR|GE;GrQ+0y3Kyd;6rS4vRzvur?-mbE>$|NmdnS9AUUf4#&7 zEOxg}OjOg^7+12pN$kTZ1?I=@GE7?@uPM6ASsW6)U1M#I>;sd4%9NvjH_XVMuyTw4 zg)(2~)bw1nJ3)nwb`567DF?;Fti7UUCDO=wC_Ww86!UYU1 z>T4Vr4v9bcy*ry}X_wVRhV?>UPG|5_;%U395p!~Lu+-)BfxWCeZrtT$s@uYO*! zT7XZ(e`X`l29N*$h1i!Qu(529|O-!ojQEc~Jvn4c;OK|zirE|AQUAmjT_Rw?onNPl|uAVkO<6hX#ZvEn( zZ&vkQu9^K;R5dievYe2VUtMW&VV>jv|8KYNwKcz&9{=L*yV$?~x99)=|LfouqZQ0d z>x4KMzav^ui)u(o{txQG5{IIP5wprJ1ggtwp_ znI5V4Z5_M7-z6t6xja%3eYyXm{-=fi>;IlvT>k%`Zv#WNl%i5-^^6|fi!YTJ`UKA~ zBpB|Ra!`5krWWTmpQ*=E*cdswSb2N|EAM}JnfgpWnrF&F%NK=?mS$f}%BGpEtJM1a z>u}@S(pCwle`{SBI8WRM#ZWbaFn8j)%N{u{jwxAMiR$q^Q}KxADFOO^V=VT zC@T@0#aC_T?610Vg||vmqT|xmHru4+idCq7|Euo(w`mDK*-~RQytPyqa_5kQ%WXhd;k3P*BSRa#LZgp9CYB| z|6h7ce4kF}=I+{X(?GO~ix1Nro)CD_UM{N0a{Q7nalfJC2rg^XbesDCJZKx>{ z#w6Hc_W7z`=cHw_Ih&-)RxhO1^T12<q z*S4v>YsPY4AJ%Pxo>QLk-Vx0>8=*eKHPe%6K_0hm*WrzmF5dNyZ>#U&{-aS_|Hx_n z%P><}t)2!6R^M4dEPR$llYJ`;)N}dSBgEG(nd@|N;f};g%eSq9rU%OY?s>$ed3;8y zdGeG%&y=XtH6bcyyvh$*<^=ubbboZDJ^brDrD^}Km;VN>f%|vVfcbz__3AGj1{bsq z&M+E!*c&eCGn&e8%7%bKT5h_mLM9JOrKo7+3NcbsO@-7KlT zSt@iz(}RWS{`1Nov)}$QvHdP1+iz(Tw>8;XdJD2*wofeB?at-k_xjq2i;@HHuSobWu~2sX)v43C1+V{AwR`{n&EL!R z|E`D!D>Oe7V~BS-VIpvGqB9eR)#Sr3s!X)};g zoa*~EYp#6V^K!Mqg*Z)aqs^PFjifrN1bNSu=TE5Rm^A-GirxP&SD$c5MG7=3yt1eCm+tLlF%`4x<=(Y_S34z+#OD5^qHRZB5Nd zvikr1V(I?>|2O}?;j#9f2?K-X${N9)$`|&y2r%{V=p-9PIULXuZg%8h5Or0P+Qick zykUD`<%WtW=FiGK|4c|abya8G(QM1RUGm9Y-LKxo%&EC|ihbU_%KU$tx>*bk!nZ;q zI3>E@9Tr)q_VF!4hoYlGTIOXtkFTzO7mD*U*vacDM(*M`sqjRc<1klY%}a@n*!wHy zd|7+^VAs^=JWLI)%l{f1{z+u~v;S}T_VziTyz_7Cd4UBCOB@`S)5B&?P+;LP&^sX# zqsYq`q^71S$FQ!mL80J-<2(hw4Id)zEMbmZHmE9c)# ziEGcJADP$3Zi{Q}Xy9Pr6j^p*f+_<81G8wDajLt-@t~O!5;4a-`<~QX=I51+cof*j zdxR%0slijoE5VB^S@D6?4$chba8L{#V`w_9dH%9y?i9aPOXFhoC~lXPzFXTG49x_W zZrjPgAj28U?EhsVQ{X|tf`}Kv5iDG6H`~2<7cq05<~CMJQMnS_dP1M&f#sto5)T

aM%HWXseM2PGP4U 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 + + echo.mp3 + + diff --git a/requestworker.cpp b/requestworker.cpp index 649d515..c02ea40 100644 --- a/requestworker.cpp +++ b/requestworker.cpp @@ -3,6 +3,7 @@ #include #include #include +#include RequestWorker::RequestWorker(QObject *parent) : QObject{parent} @@ -16,11 +17,13 @@ void RequestWorker::setConfig(QJsonObject config) this->interval = config["interval"].toInt(); this->max_height = config["max"].toInt(); this->min_height = config["min"].toInt(); + this->alarm_thres = config["alert"].toInt(); qDebug() << "In cpp config values are: "; qDebug() << "Url: " << url; qDebug() << "Interval: " << interval; qDebug() << "Max Height: " << max_height; qDebug() << "Min Height: " << min_height; + qDebug() << "Alert: " << alarm_thres; } void RequestWorker::start() @@ -51,6 +54,34 @@ void RequestWorker::stop() qDebug() << "Stopping" << timer->isActive(); } +void RequestWorker::playAlarm() +{ + if(player_started) + return; + if(player) { + player->deleteLater(); + player = nullptr; + } + if(audioOutput) { + audioOutput->deleteLater(); + audioOutput->deleteLater(); + } + qDebug() << "Loading player"; + player = new QMediaPlayer(this); + audioOutput = new QAudioOutput(this); + player->setAudioOutput(audioOutput); + if (QFile::exists(":/sounds/echo.mp3")) { + qDebug() << "Resource found successfully!"; + } else { + qDebug() << "Resource not found. Check CMakeLists.txt or .pro file!"; + } + player->setSource(QUrl("qrc:/sounds/echo.mp3")); + audioOutput->setVolume(0.5); + connect(this, &RequestWorker::playMedia, player, &QMediaPlayer::play); + player_started = true; + emit playMedia(); +} + void RequestWorker::makeRequest() { if(stop_timer) @@ -85,6 +116,13 @@ void RequestWorker::requestFinished(QNetworkReply *rep) float rate_of_fill = ( float )(prev_distance - water_level) /(float) time_in_microseconds; rate_of_fill = rate_of_fill * 1'000'000; int expected_to_fill = (water_level - min_height) / rate_of_fill; + int percentage_filled = (float (max_height - water_level) / float (max_height)) *100; + if(enable_alarm) { + qDebug() << "Alarm enabled"; + if(percentage_filled >= alarm_thres) { + playAlarm(); + } + } if(reply_number == 0) { rate_of_fill = 0; expected_to_fill = 0; @@ -93,6 +131,7 @@ void RequestWorker::requestFinished(QNetworkReply *rep) qDebug() << "Got water level: " << water_level; qDebug() << "Got rate of fill: " << rate_of_fill; qDebug() << "Got expected to fill: " << expected_to_fill; + qDebug() << "Percentage filled: " << percentage_filled; qDebug() << "Time difference: " << time_in_microseconds; prev_distance = water_level; emit networkReply(data_water_level, rate_of_fill, expected_to_fill); @@ -118,3 +157,23 @@ void RequestWorker::setStatus(const QString &newStatus) m_status = newStatus; emit statusChanged(); } + +void RequestWorker::startAlarm() +{ + enable_alarm = true; +} + +void RequestWorker::stopAlarm() +{ + enable_alarm = false; + player_started = false; + if(player) { + player->stop(); + player->deleteLater(); + player = nullptr; + } + if(audioOutput) { + audioOutput->deleteLater(); + audioOutput = nullptr; + } +} diff --git a/requestworker.h b/requestworker.h index 37d0888..f78e3a6 100644 --- a/requestworker.h +++ b/requestworker.h @@ -6,6 +6,8 @@ #include #include #include +#include +#include #include #include #include @@ -24,10 +26,14 @@ class RequestWorker : public QObject int min_height = 0; bool stop_timer = false; int reply_number = 0; + int alarm_thres = 0; + bool enable_alarm = false; + bool player_started = false; + QMediaPlayer *player = nullptr; + QAudioOutput *audioOutput = nullptr; std::chrono::time_point prev_time; public: explicit RequestWorker(QObject *parent = nullptr); - QString status() const; void setStatus(const QString &newStatus); @@ -35,12 +41,15 @@ signals: void requestFailed(); void networkReply(int distance, float rate_of_fill, int expected_to_fill); void statusChanged(); - + void playMedia(); public slots: + void startAlarm(); + void stopAlarm(); void setConfig(QJsonObject config); void start(); void stop(); private slots: + void playAlarm(); void makeRequest(); void requestFinished(QNetworkReply *rep); private: From 1d999f6c33a805b7b2667e37ac82f5d8172c0656 Mon Sep 17 00:00:00 2001 From: unrealdragon Date: Wed, 12 Aug 2026 18:32:45 +0530 Subject: [PATCH 17/24] Http Version - Alarm now loops and UI status message spacing changed. --- Main.qml | 4 ++-- requestworker.cpp | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Main.qml b/Main.qml index 1b6c5fc..8c2a35f 100644 --- a/Main.qml +++ b/Main.qml @@ -99,7 +99,7 @@ Window { visible: (root.alarm_status_text.length > 0 ) ? true : false anchors { bottom: status.top - bottomMargin: 20 + bottomMargin: 10 horizontalCenter: parent.horizontalCenter } horizontalAlignment: Text.AlignHCenter @@ -128,7 +128,7 @@ Window { anchors { horizontalCenter: parent.horizontalCenter bottom: parent.bottom - bottomMargin: 50 + bottomMargin: 30 } ConnectButton { id: connect_button diff --git a/requestworker.cpp b/requestworker.cpp index c02ea40..983c554 100644 --- a/requestworker.cpp +++ b/requestworker.cpp @@ -69,6 +69,7 @@ void RequestWorker::playAlarm() qDebug() << "Loading player"; player = new QMediaPlayer(this); audioOutput = new QAudioOutput(this); + player->setLoops(QMediaPlayer::Loops::Infinite); player->setAudioOutput(audioOutput); if (QFile::exists(":/sounds/echo.mp3")) { qDebug() << "Resource found successfully!"; From ca73f70b63f8b80ffb1d3d2238ff1623d7de1f89 Mon Sep 17 00:00:00 2001 From: unrealdragon Date: Sun, 16 Aug 2026 21:39:28 +0530 Subject: [PATCH 18/24] Http Version - Alarm seems to not work on android also added env variables to disable android system scaling. --- main.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/main.cpp b/main.cpp index c438cd2..87ac2c0 100644 --- a/main.cpp +++ b/main.cpp @@ -3,8 +3,11 @@ int main(int argc, char *argv[]) { + qputenv("QT_SCALE_FACTOR", "1.0"); + qputenv("QT_SCALE_FACTOR_ROUNDING_POLICY", "Round");qputenv("QT_SCALE_FACTOR_ROUNDING_POLICY", "Round"); QGuiApplication app(argc, argv); + QQmlApplicationEngine engine; QObject::connect( &engine, From b8201398e19a8be283acb0962349406c4f617b22 Mon Sep 17 00:00:00 2001 From: unrealdragon Date: Mon, 14 Sep 2026 15:31:21 +0530 Subject: [PATCH 19/24] Added a text to display wifi status. --- CMakeLists.txt | 50 ++++++++++++++++++-------- Main.qml | 25 +++++++++++++ SettingsPopup.qml | 2 +- WaterTank.qml | 12 +++++++ android/AndroidManifest.xml | 61 ++++++++++++++++++++++++++++++++ main.cpp | 2 +- requestworker.cpp | 36 ++++++++++++++++++- requestworker.h | 10 ++++++ wifihelper.cpp | 70 +++++++++++++++++++++++++++++++++++++ wifihelper.h | 17 +++++++++ 10 files changed, 267 insertions(+), 18 deletions(-) create mode 100644 android/AndroidManifest.xml create mode 100644 wifihelper.cpp create mode 100644 wifihelper.h diff --git a/CMakeLists.txt b/CMakeLists.txt index eff65b6..55fd9f6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,38 +5,58 @@ project(WaterLevelRewrite VERSION 0.1 LANGUAGES CXX) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_AUTORCC ON) -find_package(Qt6 REQUIRED COMPONENTS Quick Multimedia) +find_package(Qt6 REQUIRED COMPONENTS Gui Core Quick Multimedia) qt_standard_project_setup(REQUIRES 6.10) +if (EXISTS "${CMAKE_CURRENT_LIST_DIR}/importedcontent/CMakeLists.txt") + add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/importedcontent) +endif() + qt_add_executable(appWaterLevelRewrite main.cpp - media.qrc ) qt_add_qml_module(appWaterLevelRewrite URI WaterLevelRewrite QML_FILES Main.qml - QML_FILES WaterTank.qml - QML_FILES SettingsBarIcon.qml - QML_FILES SettingsPopup.qml - SOURCES configinterface.h configinterface.cpp - QML_FILES ConnectButton.qml - SOURCES requestworker.h requestworker.cpp - RESOURCES media.qrc + WaterTank.qml + SettingsBarIcon.qml + SettingsPopup.qml + ConnectButton.qml + SOURCES + configinterface.h + configinterface.cpp + requestworker.h + requestworker.cpp + wifihelper.h + wifihelper.cpp + RESOURCES + media.qrc ) +if(APPLE) + set_target_properties(appWaterLevelRewrite PROPERTIES + # MACOSX_BUNDLE_GUI_IDENTIFIER com.example.appWaterLevelRewrite + MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} + MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} + MACOSX_BUNDLE TRUE + ) +endif() + +if(WIN32) + set_target_properties(appWaterLevelRewrite PROPERTIES + WIN32_EXECUTABLE TRUE + ) +endif() + set_target_properties(appWaterLevelRewrite PROPERTIES -# MACOSX_BUNDLE_GUI_IDENTIFIER com.example.appWaterLevelRewrite - MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} - MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} - MACOSX_BUNDLE TRUE - WIN32_EXECUTABLE TRUE + QT_ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android" ) target_link_libraries(appWaterLevelRewrite - PRIVATE Qt6::Quick Qt6::Multimedia + PRIVATE Qt6::Quick Qt6::Multimedia Qt6::Gui Qt6::Core ) install(TARGETS appWaterLevelRewrite diff --git a/Main.qml b/Main.qml index 8c2a35f..b3be173 100644 --- a/Main.qml +++ b/Main.qml @@ -14,6 +14,7 @@ Window { property color dark_accent_color: "#FF5F7F5F" property color danger_color: "#F0AF2F1F" property color water_color: "#F00F7FAF" + property color water_color_above_alert: "#F00FAF0F" property color background_color: "#1F1F1F" Material.accent: root.accent_color property int font_enlarged_text_size: 20 @@ -21,6 +22,7 @@ Window { property int distance_count_thres: 3 property string mode: "http" property string status: "Initializing" + property string connection_text_string: "Reading WiFi Status..." property string alarm_status_text: "" property var root_config: ({}) @@ -73,6 +75,19 @@ Window { } } + Text { + id: connection_text + anchors { + top: top_bar.bottom + topMargin: 20 + bottom: tank.top + horizontalCenter: parent.horizontalCenter + } + text: root.connection_text_string + color: root.accent_color + font.pointSize: root.font_normal_text_size + } + WaterTank { id: tank anchors { @@ -207,6 +222,16 @@ Window { onRequestFailed: () => { status.color = root.danger_color; } + + onConnectionText: (text, error) => { + root.connection_text_string = text + if(!error) { + connection_text.color = root.accent_color + } + else { + connection_text.color = root.danger_color + } + } } ConfigInterface { diff --git a/SettingsPopup.qml b/SettingsPopup.qml index 41f5cc7..b62624f 100644 --- a/SettingsPopup.qml +++ b/SettingsPopup.qml @@ -107,7 +107,7 @@ Popup { Text { id: alert_thres_label - text: "Alert Percentage: " + text: "Alert Threshold: " anchors { topMargin: 20 top: min_thres_label.bottom diff --git a/WaterTank.qml b/WaterTank.qml index dc264f1..6e20cb1 100644 --- a/WaterTank.qml +++ b/WaterTank.qml @@ -9,6 +9,7 @@ Item { property color tank_lid_color: "#F0121212" property color tank_base_color: "#00FFFFFF" property color water_level_color: "#F00F7FAF" + property color water_color_above_alert: "#F00FAF0F" property color tank_base_border_color: "#F0121212" property color text_color: "#F05FAF5F" property double height_max: tank_base.height - 10 @@ -19,6 +20,7 @@ Item { property double max_thres_input: 0 property double rate_of_fill: 0 property double expected_to_fill: 0 + property double alert_threshold: 0 Rectangle { id: base @@ -137,6 +139,7 @@ Item { function setConfig(config: var) { min_thres_input = config.min; max_thres_input = config.max; + alert_threshold = config.alert; } function setDistance(distance) { @@ -156,8 +159,17 @@ Item { console.log("Current reading is: " + current_reading) console.log("Normalized height is: " + normalized_height) console.log("Percentage filled is: " + percentage_filled) + console.log("Alert threshold is: " + root.alert_threshold) + console.log("Is level above alert threshold: " + (distance_f <= root.alert_threshold)) root.current_level = normalized_height; root.percentage_filled = percentage_filled; + + if(distance_f <= root.alert_threshold) { + water_level.color = water_color_above_alert + } + else { + water_level.color = water_level_color + } } } diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml new file mode 100644 index 0000000..2598885 --- /dev/null +++ b/android/AndroidManifest.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/main.cpp b/main.cpp index 87ac2c0..ecedbf4 100644 --- a/main.cpp +++ b/main.cpp @@ -4,7 +4,7 @@ int main(int argc, char *argv[]) { qputenv("QT_SCALE_FACTOR", "1.0"); - qputenv("QT_SCALE_FACTOR_ROUNDING_POLICY", "Round");qputenv("QT_SCALE_FACTOR_ROUNDING_POLICY", "Round"); + qputenv("QT_SCALE_FACTOR_ROUNDING_POLICY", "Round"); QGuiApplication app(argc, argv); diff --git a/requestworker.cpp b/requestworker.cpp index 983c554..c13d223 100644 --- a/requestworker.cpp +++ b/requestworker.cpp @@ -8,7 +8,16 @@ RequestWorker::RequestWorker(QObject *parent) : QObject{parent} { - +#ifdef Q_OS_ANDROID + wifi = new WiFiHelper(this); + connect(wifi, &WiFiHelper::ssidRetrieved, this, &RequestWorker::gotWiFiSSID); + poll_wifi = new QTimer(this); + poll_wifi->setInterval(3000); + poll_wifi->setSingleShot(false); + connect(poll_wifi, &QTimer::timeout, this, &RequestWorker::pollWiFi); + wifi->requestPermissionsAndFetch(); + poll_wifi->start(); +#endif } void RequestWorker::setConfig(QJsonObject config) @@ -54,6 +63,31 @@ void RequestWorker::stop() qDebug() << "Stopping" << timer->isActive(); } +void RequestWorker::pollWiFi() +{ +#ifdef Q_OS_ANDROID + if(wifi) { + wifi->requestPermissionsAndFetch(); + } +#endif +} + +void RequestWorker::gotWiFiSSID(QString ssid) +{ + if(ssid.length() > 0 && ssid != "Permission Denied" && ssid != "") { + emit connectionText("WiFi connected: " + ssid); + } + else if(ssid.length() == 0) { + emit connectionText("WiFi might not be connected", true); + } + else if(ssid != "") { + emit connectionText("Failed to query wifi info", true); + } + else { + emit connectionText("WiFi disconnected", true); + } +} + void RequestWorker::playAlarm() { if(player_started) diff --git a/requestworker.h b/requestworker.h index f78e3a6..6a87bbb 100644 --- a/requestworker.h +++ b/requestworker.h @@ -11,6 +11,9 @@ #include #include #include +#ifdef Q_OS_ANDROID +#include "wifihelper.h" +#endif class RequestWorker : public QObject { @@ -31,6 +34,10 @@ class RequestWorker : public QObject bool player_started = false; QMediaPlayer *player = nullptr; QAudioOutput *audioOutput = nullptr; +#ifdef Q_OS_ANDROID + WiFiHelper *wifi = nullptr; + QTimer *poll_wifi = nullptr; +#endif std::chrono::time_point prev_time; public: explicit RequestWorker(QObject *parent = nullptr); @@ -42,6 +49,7 @@ signals: void networkReply(int distance, float rate_of_fill, int expected_to_fill); void statusChanged(); void playMedia(); + void connectionText(QString text, bool errored = false); public slots: void startAlarm(); void stopAlarm(); @@ -49,6 +57,8 @@ public slots: void start(); void stop(); private slots: + void pollWiFi(); + void gotWiFiSSID(QString ssid); void playAlarm(); void makeRequest(); void requestFinished(QNetworkReply *rep); diff --git a/wifihelper.cpp b/wifihelper.cpp new file mode 100644 index 0000000..739a9dd --- /dev/null +++ b/wifihelper.cpp @@ -0,0 +1,70 @@ +#include "wifihelper.h" +#include +#include +#include +#include + +WiFiHelper::WiFiHelper(QObject *parent) + : QObject{parent} +{ + +} + +QString WiFiHelper::getWifiSsid() { + // Get Android application context in Qt 6 + QJniObject context = QNativeInterface::QAndroidApplication::context(); + if (!context.isValid()) return QString(); + + // Get WifiManager service + QJniObject wifiService = QJniObject::fromString("wifi"); + QJniObject wifiManager = context.callObjectMethod( + "getSystemService", + "(Ljava/lang/String;)Ljava/lang/Object;", + wifiService.object() + ); + if (!wifiManager.isValid()) return QString(); + + // Fetch WifiInfo + QJniObject wifiInfo = wifiManager.callObjectMethod( + "getConnectionInfo", + "()Landroid/net/wifi/WifiInfo;" + ); + if (!wifiInfo.isValid()) return QString(); + + // Get SSID string + QJniObject ssidJni = wifiInfo.callObjectMethod( + "getSSID", + "()Ljava/lang/String;" + ); + if (!ssidJni.isValid()) return QString(); + + QString ssid = ssidJni.toString(); + + // Android returns SSIDs wrapped in double quotes (e.g., "\"MyWiFi\"") + if (ssid.startsWith('"') && ssid.endsWith('"') && ssid.length() > 1) { + ssid = ssid.mid(1, ssid.length() - 2); + } + + return ssid; +} + +void WiFiHelper::requestPermissionsAndFetch() { + QLocationPermission locationPermission; + locationPermission.setAccuracy(QLocationPermission::Accuracy::Precise); + Qt::PermissionStatus status = qApp->checkPermission(locationPermission); + + if (status == Qt::PermissionStatus::Granted) { + emit ssidRetrieved(getWifiSsid()); + } else { + qDebug() << "Requesting permission."; + qApp->requestPermission(locationPermission, this, [this](const QPermission &permission) { + if (permission.status() == Qt::PermissionStatus::Granted) { + qDebug() << "Requested permission and got ssid"; + emit ssidRetrieved(getWifiSsid()); + } else { + qDebug() << "Failed to get WiFi SSID due to denied permission."; + emit ssidRetrieved("Permission Denied"); + } + }); + } +} diff --git a/wifihelper.h b/wifihelper.h new file mode 100644 index 0000000..ab10632 --- /dev/null +++ b/wifihelper.h @@ -0,0 +1,17 @@ +#ifndef WIFIHELPER_H +#define WIFIHELPER_H + +#include + +class WiFiHelper : public QObject +{ + Q_OBJECT +public: + explicit WiFiHelper(QObject *parent = nullptr); + Q_INVOKABLE QString getWifiSsid(); + Q_INVOKABLE void requestPermissionsAndFetch(); + +signals: + void ssidRetrieved(const QString &ssid); +}; +#endif // WIFIHELPER_H From 93995959d01d0de275a517f9c89e687ce81cef69 Mon Sep 17 00:00:00 2001 From: unrealdragon Date: Wed, 23 Sep 2026 17:36:00 +0530 Subject: [PATCH 20/24] QoL Fixes and Changes --- CMakeLists.txt | 3 + ColorInput.qml | 21 ++ CustomCheckBox.qml | 17 + Main.qml | 155 ++++++++- RequestResponsePopup.qml | 30 ++ SettingsBarIcon.qml | 5 +- SettingsPopup.qml | 660 +++++++++++++++++++++++++++++---------- WaterTank.qml | 147 +++++---- configinterface.cpp | 7 + configinterface.h | 2 + requestworker.cpp | 99 +++++- requestworker.h | 9 +- wifihelper.cpp | 7 + 13 files changed, 919 insertions(+), 243 deletions(-) create mode 100644 ColorInput.qml create mode 100644 CustomCheckBox.qml create mode 100644 RequestResponsePopup.qml diff --git a/CMakeLists.txt b/CMakeLists.txt index 55fd9f6..957c9c2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,6 +34,9 @@ qt_add_qml_module(appWaterLevelRewrite wifihelper.cpp RESOURCES media.qrc + QML_FILES CustomCheckBox.qml + QML_FILES RequestResponsePopup.qml + QML_FILES ColorInput.qml ) if(APPLE) diff --git a/ColorInput.qml b/ColorInput.qml new file mode 100644 index 0000000..a4cebe7 --- /dev/null +++ b/ColorInput.qml @@ -0,0 +1,21 @@ +import QtQuick +import QtQuick.Effects +import QtQuick.Controls +import QtQuick.Controls.Material + +TextField { + id: color_text + text: "F05FAF5F" + property alias color_text: base.color + Rectangle { + id: base + anchors { + right: parent.right + rightMargin: 10 + verticalCenter: parent.verticalCenter + } + width: 10 + height: parent.height / 2 + color: "#" + color_text.text + } +} diff --git a/CustomCheckBox.qml b/CustomCheckBox.qml new file mode 100644 index 0000000..0cdbb38 --- /dev/null +++ b/CustomCheckBox.qml @@ -0,0 +1,17 @@ +import QtQuick +import QtQuick.Controls.Basic + +CheckBox { + id: control + property color font_color: "#0000FF00" + property int font_point_size: 22 + font.pointSize: font_point_size + checked: true + contentItem: Text { + text: control.text + font: control.font + color: control.font_color + verticalAlignment: Text.AlignVCenter + leftPadding: control.indicator.width + control.spacing + } +} diff --git a/Main.qml b/Main.qml index b3be173..2cfde8a 100644 --- a/Main.qml +++ b/Main.qml @@ -5,8 +5,8 @@ import QtQuick.Controls import QtQuick.Controls.Material Window { - width: 640 - height: 1080 + width: 960 + height: 1400 visible: true title: qsTr("Water Level Rewrite") id: root @@ -24,12 +24,36 @@ Window { property string status: "Initializing" property string connection_text_string: "Reading WiFi Status..." property string alarm_status_text: "" + property double water_tank_height_factor: 1.3 + property double water_tank_width_factor: 2 property var root_config: ({}) + property var base_config: { + "max": 0, + "min": 0, + "alert": 0, + "interval": 0, + "url": "none", + "water_tank_width": 2, + "water_tank_height": 1.3, + "rate_of_fill_enable": true, + "current_reading_enable": true, + "percentage_enable": true, + "filling_status_enable": true, + "expected_to_fill_enable": true, + "accent_color": "F05FAF5F", + "dark_accent_color": "FF5F7F5F", + "danger_color": "F0AF2F1F", + "water_color": "F00F7FAF", + "water_color_above_alert": "F00FAF0F", + "background_color": "1F1F1F", + "font_normal_text_size": 16, + "font_enlarged_text_size": 20 + } Rectangle { anchors.fill: parent color: root.background_color - + id: root_rect Rectangle { id: top_bar height: Math.min(root.height / 12, 100) @@ -41,6 +65,7 @@ Window { } color: "#0A0F0F0F" SettingsBarIcon { + id: settings_icon height: top_bar.height - 20 width: height anchors { @@ -57,12 +82,40 @@ Window { settings_popup.open() } } + + SettingsBarIcon { + height: top_bar.height - 20 + width: height + anchors { + top: parent.top + left: parent.left + bottomMargin: 5 + topMargin: 10 + leftMargin: 5 + } + text: "🖹" + color: "#0A0F0F0F" + radius: 100 + accent_color: root.accent_color + onOpen: { + request_response_popup.open() + } + } + } + + RequestResponsePopup { + id: request_response_popup + accent_color: root.accent_color + font_enlarged_text_size: 20 + } SettingsPopup { id: settings_popup accent_color: root.accent_color - font_enlarged_text_size: 20 + background_color: root.background_color + font_enlarged_text_size: root.font_enlarged_text_size + font_normal_text_size: root.font_normal_text_size function setConfig(new_config: var) { settings_popup.config.max = new_config.max settings_popup.config.min = new_config.min @@ -73,6 +126,9 @@ Window { console.log("Saving config: ", config) config_interface.saveConfig(config); } + onDeleteConfig: () => { + config_interface.deleteConfig(); + } } Text { @@ -80,7 +136,6 @@ Window { anchors { top: top_bar.bottom topMargin: 20 - bottom: tank.top horizontalCenter: parent.horizontalCenter } text: root.connection_text_string @@ -91,20 +146,24 @@ Window { WaterTank { id: tank anchors { - top: top_bar.bottom + top: connection_text.bottom horizontalCenter: parent.horizontalCenter - topMargin: 100 + topMargin: 40 } - height: (parent.height - top_bar.height) / 2 - width: parent.width / 2.2 + height: (root_rect.height) / root.water_tank_height_factor + width: root_rect.width / root.water_tank_width_factor base_color: root.background_color distance: 0 tank_lid_color: "#F0121212" tank_base_color: "#0FFFFFFF" - water_level_color: "#F00F7FAF" + water_level_color: root.water_color tank_base_border_color: "#F0121212" + water_color_above_alert: root.water_color_above_alert min_thres_input: 0 max_thres_input: 0 + text_color: root.accent_color + font_normal_text_size: root.font_normal_text_size + font_enlarged_text_size: root.font_enlarged_text_size } @@ -194,7 +253,7 @@ Window { if(start_alarm.mode === 0) { requester.startAlarm(); - root.alarm_status_text = "Started Alarm; Waiting for Trigger: " + root.root_config.alert + "%" + root.alarm_status_text = "Started Alarm; Waiting for Trigger: " + root.root_config.alert } else { requester.stopAlarm(); @@ -213,14 +272,16 @@ Window { onStatusChanged: () => { root.status = requester.status; } - onNetworkReply: (water_level, fill_rate, expected) => { + onNetworkReply: (water_level, fill_rate, expected, data) => { tank.setDistance(water_level); tank.rate_of_fill = fill_rate; tank.expected_to_fill = expected; status.color = root.accent_color; + request_response_popup.request_response_string = data; } - onRequestFailed: () => { + onRequestFailed: (data) => { status.color = root.danger_color; + request_response_popup.request_response_string = data; } onConnectionText: (text, error) => { @@ -238,17 +299,83 @@ Window { id: config_interface fileName: "config.json" onConfig: (config) => { - settings_popup.config = config + settings_popup.config = config; console.log("Loading initial config"); setConfig(config); if(root.status === "Initializing") { root.status = "Press Connect."; } } + onConfigDeleted: () => { + let config = base_config; + settings_popup.config = config; + console.log("Loading initial config"); + setConfig(config); + if(root.status === "Initializing") { + root.status = "Press Connect."; + } + } + function setConfig(config) { tank.setConfig(config); requester.setConfig(config); root.root_config = config; + if(config.water_tank_height === undefined) { + config.water_tank_height = 2 + } + if(config.water_tank_width === undefined) { + config.water_tank_width = 2.2 + } + if(config.rate_of_fill_enable === undefined) { + config.rate_of_fill_enable = true + } + if(config.current_reading_enable === undefined) { + config.current_reading_enable = true + } + if(config.percentage_enable === undefined) { + config.percentage_enable = true + } + if(config.filling_status_enable === undefined) { + config.filling_status_enable = true + } + if(config.expected_to_fill_enable === undefined) { + config.expected_to_fill_enable = true + } + if(config.font_enlarged_text_size === undefined) { + config.font_enlarged_text_size = 20 + } + if(config.font_normal_text_size === undefined) { + config.font_normal_text_size = 16 + } + if(config.accent_color === undefined) { + config.accent_color = "F05FAF5F" + } + if(config.danger_color === undefined) { + config.danger_color = "F0AF2F1F" + } + if(config.dark_accent_color === undefined) { + config.dark_accent_color = "FF5F7F5F" + } + if(config.water_color === undefined) { + config.water_color = "F00F7FAF" + } + if(config.water_color_above_alert === undefined) { + config.water_color_above_alert = "F00FAF0F" + } + if(config.background_color === undefined) { + config.background_color = "1F1F1F" + } + root.water_tank_height_factor = config.water_tank_height + root.water_tank_width_factor = config.water_tank_width + root.accent_color = "#" + config.accent_color + root.danger_color = "#" + config.danger_color + root.dark_accent_color = "#" + config.dark_accent_color + root.water_color = "#" + config.water_color + root.water_color_above_alert = "#" + config.water_color_above_alert + root.background_color = "#" + config.background_color + root.font_enlarged_text_size = config.font_enlarged_text_size + root.font_normal_text_size = config.font_normal_text_size + } } onClosing: { diff --git a/RequestResponsePopup.qml b/RequestResponsePopup.qml new file mode 100644 index 0000000..468bcda --- /dev/null +++ b/RequestResponsePopup.qml @@ -0,0 +1,30 @@ +import QtQuick +import QtQuick.Effects +import QtQuick.Controls +import QtQuick.Controls.Material + +Popup { + id: request_response_popup + property color accent_color: "#00000000" + property int font_enlarged_text_size: 20 + property int font_normal_text_size: 16 + property string request_response_string: "" + background: Rectangle { + color: "#F0121212" + radius: 5 + border.color: request_response_popup.accent_color + border.width: 1 + } + height: Math.max(parent.height / 1.6, contentHeight) + width: parent.width / 1.2 + anchors.centerIn: Overlay.overlay + ScrollView { + id: view + anchors.fill: parent + TextArea { + text: request_response_string + font.pointSize: font_normal_text_size + color: request_response_popup.accent_color + } + } +} diff --git a/SettingsBarIcon.qml b/SettingsBarIcon.qml index d360331..35072b7 100644 --- a/SettingsBarIcon.qml +++ b/SettingsBarIcon.qml @@ -8,6 +8,7 @@ Rectangle { signal open; property color accent_color: "#00000000" property int font_enlarged_text_size: 20 + property string text: "⚙" Behavior on color { ColorAnimation { duration: 200 @@ -15,8 +16,10 @@ Rectangle { } Text { id: settings_text - text: "⚙" + text: settings_rect.text anchors.centerIn: parent + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter color: settings_rect.accent_color font.pointSize: settings_rect.font_enlarged_text_size } diff --git a/SettingsPopup.qml b/SettingsPopup.qml index b62624f..47d555b 100644 --- a/SettingsPopup.qml +++ b/SettingsPopup.qml @@ -6,15 +6,32 @@ import QtQuick.Controls.Material Popup { id: settings_popup signal saveConfig(config: var) + signal deleteConfig() property color accent_color: "#00000000" property int font_enlarged_text_size: 20 property int font_normal_text_size: 16 + property color background_color: "#00000000" property var config: { "max": 0, "min": 0, "alert": 0, "interval": 0, - "url": "none" + "url": "none", + "water_tank_width": 2, + "water_tank_height": 1.3, + "rate_of_fill_enable": true, + "current_reading_enable": true, + "percentage_enable": true, + "filling_status_enable": true, + "expected_to_fill_enable": true, + "accent_color": "F05FAF5F", + "dark_accent_color": "FF5F7F5F", + "danger_color": "F0AF2F1F", + "water_color": "F00F7FAF", + "water_color_above_alert": "F00FAF0F", + "background_color": "1F1F1F", + "font_normal_text_size": 16, + "font_enlarged_text_size": 20 } background: Rectangle { @@ -31,170 +48,461 @@ Popup { anchors.fill: parent color: "#F0121212" - Text { - id: settings_label - text: "Settings" - width: parent.width + ScrollView { + id: rect_base_scroll_view anchors { top: parent.top horizontalCenter: parent.horizontalCenter + bottom: save_config.top + bottomMargin: 10 } - horizontalAlignment: Text.AlignHCenter - color: settings_popup.accent_color - font.pointSize: settings_popup.font_enlarged_text_size - } + width: parent.width + clip: true + // Use contentWidth and contentHeight to define the scrollable area + contentWidth: availableWidth + contentHeight: settings_column.height - Text { - id: max_thres_label - text: "Max Threshold: " - anchors { - topMargin: 20 - top: settings_label.bottom - left: parent.left - verticalCenter: max_thres_input.verticalCenter + Column { + id: settings_column + width: rect_base_scroll_view.width + spacing: 20 + + Text { + id: settings_label + text: "Settings" + width: parent.width + horizontalAlignment: Text.AlignHCenter + color: settings_popup.accent_color + font.pointSize: settings_popup.font_enlarged_text_size + } + + // Max Threshold + Row { + width: parent.width + spacing: 10 + Text { + text: "Max Threshold: " + width: parent.width * 0.4 + verticalAlignment: Text.AlignVCenter + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + anchors { + verticalCenter: max_thres_input.verticalCenter + } + + } + TextField { + id: max_thres_input + text: config.max + width: parent.width * 0.55 + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + } + } + + // Min Threshold + Row { + width: parent.width + spacing: 10 + Text { + text: "Min Threshold: " + width: parent.width * 0.4 + verticalAlignment: Text.AlignVCenter + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + anchors { + verticalCenter: min_thres_input.verticalCenter + } + + } + TextField { + id: min_thres_input + text: config.min + width: parent.width * 0.55 + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + } + } + + // Alert Threshold + Row { + width: parent.width + spacing: 10 + Text { + text: "Alert Threshold: " + width: parent.width * 0.4 + verticalAlignment: Text.AlignVCenter + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + anchors { + verticalCenter: alert_thres_input.verticalCenter + } + + } + TextField { + id: alert_thres_input + text: config.alert + width: parent.width * 0.55 + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + } + } + + // Update Interval + Row { + width: parent.width + spacing: 10 + Text { + text: "Update Interval: " + width: parent.width * 0.4 + verticalAlignment: Text.AlignVCenter + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + anchors { + verticalCenter: interval_input.verticalCenter + } + } + TextField { + id: interval_input + text: config.interval + width: parent.width * 0.55 + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + } + } + + // URL + Row { + width: parent.width + spacing: 10 + Text { + text: "Url: " + width: parent.width * 0.4 + verticalAlignment: Text.AlignVCenter + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + anchors { + verticalCenter: http_url_input.verticalCenter + } + + } + TextField { + id: http_url_input + text: config.url + width: parent.width * 0.55 + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + cursorPosition: 0 + } + } + + // Tank Image Width + Row { + width: parent.width + spacing: 10 + Text { + text: "Tank Image Width" + width: parent.width * 0.4 + verticalAlignment: Text.AlignVCenter + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + anchors { + verticalCenter: water_tank_width_input.verticalCenter + } + + } + TextField { + id: water_tank_width_input + text: String(config.water_tank_width) + width: parent.width * 0.55 + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + cursorPosition: 0 + } + } + + // Tank Image Height + Row { + width: parent.width + spacing: 10 + Text { + text: "Tank Image Height" + width: parent.width * 0.4 + verticalAlignment: Text.AlignVCenter + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + anchors { + verticalCenter: water_tank_height_input.verticalCenter + } + } + TextField { + id: water_tank_height_input + text: String(config.water_tank_height) + width: parent.width * 0.55 + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + cursorPosition: 0 + } + } + + // Accent Color + Row { + width: parent.width + spacing: 10 + Text { + text: "Accent Color" + width: parent.width * 0.4 + verticalAlignment: Text.AlignVCenter + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + anchors { + verticalCenter: accent_color_input.verticalCenter + } + } + ColorInput { + id: accent_color_input + text: config.accent_color + width: parent.width * 0.55 + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + } + } + + // Dark Accent Color + Row { + width: parent.width + spacing: 10 + Text { + text: "Dark Accent Color" + width: parent.width * 0.4 + verticalAlignment: Text.AlignVCenter + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + anchors { + verticalCenter: dark_accent_color_input.verticalCenter + } + } + ColorInput { + id: dark_accent_color_input + text: config.dark_accent_color + width: parent.width * 0.55 + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + } + } + + // Danger Color + Row { + width: parent.width + spacing: 10 + Text { + text: "Danger Text Color" + width: parent.width * 0.4 + verticalAlignment: Text.AlignVCenter + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + anchors { + verticalCenter: danger_color_input.verticalCenter + } + } + ColorInput { + id: danger_color_input + text: config.danger_color + width: parent.width * 0.55 + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + } + } + + // Water Color + Row { + width: parent.width + spacing: 10 + Text { + text: "Water Color" + width: parent.width * 0.4 + verticalAlignment: Text.AlignVCenter + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + anchors { + verticalCenter: water_color_input.verticalCenter + } + } + ColorInput { + id: water_color_input + text: config.water_color + width: parent.width * 0.55 + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + } + } + + // Alert Water Color + Row { + width: parent.width + spacing: 10 + Text { + text: "Alert Water Color" + width: parent.width * 0.4 + verticalAlignment: Text.AlignVCenter + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + anchors { + verticalCenter: water_color_above_alert_input.verticalCenter + } + } + ColorInput { + id: water_color_above_alert_input + text: config.water_color_above_alert + width: parent.width * 0.55 + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + } + } + + // Background Color + Row { + width: parent.width + spacing: 10 + Text { + text: "Backgound Color" + width: parent.width * 0.4 + verticalAlignment: Text.AlignVCenter + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + anchors { + verticalCenter: background_color_input.verticalCenter + } + } + ColorInput { + id: background_color_input + text: config.background_color + width: parent.width * 0.55 + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + } + } + + // Normal Font Size + Row { + width: parent.width + spacing: 10 + Text { + text: "Font Size" + width: parent.width * 0.4 + verticalAlignment: Text.AlignVCenter + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + anchors { + verticalCenter: font_normal_text_size_input.verticalCenter + } + } + TextField { + id: font_normal_text_size_input + text: String(config.font_normal_text_size) + width: parent.width * 0.55 + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + cursorPosition: 0 + } + } + + // Header Font Size + Row { + width: parent.width + spacing: 10 + Text { + text: "Header Font Size" + width: parent.width * 0.4 + verticalAlignment: Text.AlignVCenter + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + anchors { + verticalCenter: font_enlarged_text_size_input.verticalCenter + } + } + TextField { + id: font_enlarged_text_size_input + text: String(config.font_enlarged_text_size) + width: parent.width * 0.55 + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + cursorPosition: 0 + } + } + + // CheckBox + CustomCheckBox { + id: current_reading_enable + checked: config.current_reading_enable + font_color: settings_popup.accent_color + font_point_size: settings_popup.font_normal_text_size + text: "Enable Current Reading" + leftPadding: 0 + } + + // CheckBox + CustomCheckBox { + id: percentage_enable + checked: config.percentage_enable + font_color: settings_popup.accent_color + font_point_size: settings_popup.font_normal_text_size + text: "Enable Percentage Reading" + leftPadding: 0 + } + + // CheckBox + CustomCheckBox { + id: filling_status_enable + checked: config.filling_status_enable + font_color: settings_popup.accent_color + font_point_size: settings_popup.font_normal_text_size + text: "Enable Filling Status" + leftPadding: 0 + } + + // CheckBox + CustomCheckBox { + id: rate_of_fill_enable + checked: config.rate_of_fill_enable + font_color: settings_popup.accent_color + font_point_size: settings_popup.font_normal_text_size + text: "Enable Text Rate of Fill" + leftPadding: 0 + } + + // CheckBox + CustomCheckBox { + id: expected_to_fill_enable + checked: config.expected_to_fill_enable + font_color: settings_popup.accent_color + font_point_size: settings_popup.font_normal_text_size + text: "Enable Expected to fill" + leftPadding: 0 + } + + ConnectButton { + id: delete_config_button + width: parent.width / 1.5 + height: 80 + anchors { + horizontalCenter: parent.horizontalCenter + } + + font_color: settings_popup.accent_color + font_enlarged_text_size: settings_popup.font_enlarged_text_size + font_normal_text_size: settings_popup.font_normal_text_size + color: settings_popup.background_color + accent_color: settings_popup.accent_color + text: "Delete/Reset Config" + text2: text + onConnect: { + settings_popup.deleteConfig(); + } + } } - height: max_thres_input.height - verticalAlignment: Text.AlignVCenter - color: settings_popup.accent_color - font.pointSize: settings_popup.font_normal_text_size } - - TextField { - id: max_thres_input - text: config.max - anchors { - right: parent.right - rightMargin: 5 - top: settings_label.bottom - topMargin: 20 - } - width: parent.width / 2 - color: settings_popup.accent_color - font.pointSize: settings_popup.font_normal_text_size - } - - - Text { - id: min_thres_label - text: "Min Threshold: " - anchors { - topMargin: 20 - top: max_thres_label.bottom - left: parent.left - verticalCenter: min_thres_input.verticalCenter - } - height: min_thres_input.height - verticalAlignment: Text.AlignVCenter - color: settings_popup.accent_color - font.pointSize: settings_popup.font_normal_text_size - } - - TextField { - id: min_thres_input - text: config.min - anchors { - right: parent.right - rightMargin: 5 - top: max_thres_label.bottom - topMargin: 20 - } - width: parent.width / 2 - color: root.accent_color - font.pointSize: root.font_normal_text_size - } - - - Text { - id: alert_thres_label - text: "Alert Threshold: " - anchors { - topMargin: 20 - top: min_thres_label.bottom - left: parent.left - verticalCenter: alert_thres_input.verticalCenter - } - height: alert_thres_input.height - verticalAlignment: Text.AlignVCenter - color: settings_popup.accent_color - font.pointSize: settings_popup.font_normal_text_size - } - - TextField { - id: alert_thres_input - text: config.alert - anchors { - right: parent.right - rightMargin: 5 - top: min_thres_label.bottom - topMargin: 20 - } - width: parent.width / 2 - color: settings_popup.accent_color - font.pointSize: settings_popup.font_normal_text_size - } - - Text { - id: interval_label - text: "Update Interval: " - anchors { - topMargin: 20 - top: alert_thres_label.bottom - left: parent.left - verticalCenter: interval_input.verticalCenter - } - height: interval_input.height - verticalAlignment: Text.AlignVCenter - color: settings_popup.accent_color - font.pointSize: settings_popup.font_normal_text_size - } - - - TextField { - id: interval_input - text: config.interval - anchors { - right: parent.right - rightMargin: 5 - top: alert_thres_input.bottom - topMargin: 20 - } - width: parent.width / 2 - color: settings_popup.accent_color - font.pointSize: settings_popup.font_normal_text_size - } - - Text { - id: http_url_label - text: "Url: " - anchors { - topMargin: 20 - top: interval_label.bottom - left: parent.left - verticalCenter: http_url_input.verticalCenter - } - height: http_url_input.height - verticalAlignment: Text.AlignVCenter - color: settings_popup.accent_color - font.pointSize: settings_popup.font_normal_text_size - } - - TextField { - id: http_url_input - text: config.url - anchors { - right: parent.right - rightMargin: 20 - leftMargin: 20 - top: interval_input.bottom - topMargin: 20 - } - width: Math.max(parent.width / 2, parent.width - http_url_label.width - anchors.leftMargin) - color: settings_popup.accent_color - font.pointSize: settings_popup.font_normal_text_size - cursorPosition: 0 - } - Rectangle { id: save_config anchors { @@ -237,7 +545,42 @@ Popup { let alert = parseFloat(alert_thres_input.text); let url = http_url_input.text; let interval = parseInt(interval_input.text); - var new_config = {"max": max, "min": min, "alert": alert, "url": url, "interval": interval} + let image_width = parseFloat(water_tank_width_input.text); + let image_height = parseFloat(water_tank_height_input.text); + let current_reading = current_reading_enable.checked; + let percentage_reading = percentage_enable.checked + let filling_status = filling_status_enable.checked; + let rate_of_fill = rate_of_fill_enable.checked; + let expected_to_fill = expected_to_fill_enable.checked; + + let normal_font_size = parseInt(font_normal_text_size_input.text); + let enlarged_font_size = parseInt(font_enlarged_text_size_input.text); + + let accent_color = accent_color_input.text; + let dark_accent_color = dark_accent_color_input.text; + let danger_color = danger_color_input.text; + let water_color = water_color_input.text; + let water_color_above_alert = water_color_above_alert_input.text; + let background_color = background_color_input.text; + + var new_config = {"max": max, "min": min, "alert": alert, "url": url, + "interval": interval, + "water_tank_height": image_height, + "water_tank_width": image_width, + "current_reading_enable": current_reading, + "percentage_enable": percentage_reading, + "filling_status_enable": filling_status, + "rate_of_fill_enable": rate_of_fill, + "expected_to_fill_enable": expected_to_fill, + "font_normal_text_size": normal_font_size, + "font_enlarged_text_size": enlarged_font_size, + "accent_color": accent_color, + "dark_accent_color": dark_accent_color, + "danger_color": danger_color, + "water_color": water_color, + "water_color_above_alert": water_color_above_alert, + "background_color": background_color + } settings_popup.saveConfig(new_config) settings_popup.close(); } @@ -245,7 +588,6 @@ Popup { save_config.color = settings_rect_pressed_prev } } - } } } \ No newline at end of file diff --git a/WaterTank.qml b/WaterTank.qml index 6e20cb1..9814428 100644 --- a/WaterTank.qml +++ b/WaterTank.qml @@ -13,6 +13,8 @@ Item { property color tank_base_border_color: "#F0121212" property color text_color: "#F05FAF5F" property double height_max: tank_base.height - 10 + property int font_normal_text_size: 0 + property int font_enlarged_text_size: 0 property double current_level: 0 property double percentage_filled: 0 property int distance: 0 @@ -21,6 +23,11 @@ Item { property double rate_of_fill: 0 property double expected_to_fill: 0 property double alert_threshold: 0 + property bool enable_current_reading: true + property bool enable_percentage_reading: true + property bool enable_filling_status: true + property bool enable_rate_of_fill: true + property bool enable_expected_to_fill: true Rectangle { id: base @@ -30,7 +37,7 @@ Item { id: tank_lid color: root.tank_lid_color anchors { - bottom: tank_base.top + top: parent.top horizontalCenter: tank_base.horizontalCenter bottomMargin: -5 } @@ -42,9 +49,12 @@ Item { Rectangle { id: tank_base color: root.tank_base_color - anchors.centerIn: parent + anchors { + top: tank_lid.bottom + horizontalCenter: parent.horizontalCenter + } width: parent.width - height: parent.height + height: parent.height * 0.55 border.color: root.tank_base_border_color border.width: 5 radius: 4 @@ -72,74 +82,93 @@ Item { } } - Text { - id: water_level_reading - text: "Current Reading: " + (root.distance / 10)+ " cm" - font.pointSize: 16 - color: root.text_color + ScrollView { + id: rect_base_scroll_view anchors { margins: 5 top: tank_base.bottom + bottom: parent.bottom horizontalCenter: parent.horizontalCenter } - horizontalAlignment: Text.AlignHCenter + width: parent.width + + contentWidth: parent.width + contentHeight: settings_column.implicitHeight + Column { + id: settings_column + spacing: 10 + width: rect_base_scroll_view.width + Text { + id: water_level_reading + text: "Current Reading: " + (root.distance / 10)+ " cm" + font.pointSize: root.font_normal_text_size + color: root.text_color + visible: enable_current_reading + anchors { + horizontalCenter: parent.horizontalCenter + } + horizontalAlignment: Text.AlignHCenter + } + + Text { + id: water_level_percentage + text: "Percentage: " + root.percentage_filled.toFixed(2) + " %" + font.pointSize: root.font_normal_text_size + visible: enable_filling_status + color: root.text_color + anchors { + horizontalCenter: parent.horizontalCenter + } + horizontalAlignment: Text.AlignHCenter + } + + Text { + id: fill_status + text: "Filling status: " + (( root.rate_of_fill > 0)? "Filling" : "Discharging") + font.pointSize: root.font_normal_text_size + color: root.text_color + visible: enable_filling_status + anchors { + horizontalCenter: parent.horizontalCenter + } + horizontalAlignment: Text.AlignHCenter + } + Text { + id: rate_of_fill_label + text: "Rate of fill: " + root.rate_of_fill + " cm/s" + font.pointSize: root.font_normal_text_size + color: root.text_color + visible: enable_rate_of_fill + anchors { + horizontalCenter: parent.horizontalCenter + } + horizontalAlignment: Text.AlignHCenter + } + Text { + id: expected_to_fill_label + text: "Expected to fill in: " + root.expected_to_fill + " s" + font.pointSize: root.font_normal_text_size + color: root.text_color + visible: (root.rate_of_fill > 0 && enable_expected_to_fill === true) ? true : false + anchors { + horizontalCenter: parent.horizontalCenter + } + horizontalAlignment: Text.AlignHCenter + } + } } - Text { - id: water_level_percentage - text: "Percentage: " + root.percentage_filled + " %" - font.pointSize: 16 - color: root.text_color - anchors { - margins: 5 - top: water_level_reading.bottom - horizontalCenter: parent.horizontalCenter - } - horizontalAlignment: Text.AlignHCenter - } - - Text { - id: fill_status - text: "Filling status: " + (( root.rate_of_fill > 0)? "Filling" : "Discharging") - font.pointSize: 16 - color: root.text_color - anchors { - margins: 5 - top: water_level_percentage.bottom - horizontalCenter: parent.horizontalCenter - } - horizontalAlignment: Text.AlignHCenter - } - Text { - id: rate_of_fill_label - text: "Rate of fill: " + root.rate_of_fill + " cm/s" - font.pointSize: 16 - color: root.text_color - anchors { - margins: 5 - top: fill_status.bottom - horizontalCenter: parent.horizontalCenter - } - horizontalAlignment: Text.AlignHCenter - } - Text { - id: expected_to_fill_label - text: "Expected to fill in: " + root.expected_to_fill + " s" - font.pointSize: 16 - color: root.text_color - visible: (root.rate_of_fill > 0) ? true : false - anchors { - margins: 5 - top: rate_of_fill_label.bottom - horizontalCenter: parent.horizontalCenter - } - horizontalAlignment: Text.AlignHCenter - } } function setConfig(config: var) { min_thres_input = config.min; max_thres_input = config.max; alert_threshold = config.alert; + enable_current_reading = config.current_reading_enable; + enable_percentage_reading = config.percentage_enable; + enable_filling_status = config.filling_status_enable; + enable_rate_of_fill = config.rate_of_fill_enable; + enable_expected_to_fill = config.expected_to_fill_enable; + } function setDistance(distance) { diff --git a/configinterface.cpp b/configinterface.cpp index 258560f..8f40d45 100644 --- a/configinterface.cpp +++ b/configinterface.cpp @@ -2,6 +2,7 @@ #include #include +#include ConfigInterface::ConfigInterface(QObject *parent) : QObject{parent} @@ -37,6 +38,12 @@ void ConfigInterface::setFileName(const QString &newFileName) emit fileNameChanged(); } +void ConfigInterface::deleteConfig() +{ + std::filesystem::remove(std::filesystem::path(m_fileName.toStdString())); + emit configDeleted(); +} + void ConfigInterface::saveConfig(QJsonObject config) { QJsonDocument doc; diff --git a/configinterface.h b/configinterface.h index 606b496..e3cb75e 100644 --- a/configinterface.h +++ b/configinterface.h @@ -19,7 +19,9 @@ public: signals: void config(QJsonObject config); void fileNameChanged(); + void configDeleted(); public slots: + void deleteConfig(); void saveConfig(QJsonObject config); private: QString m_fileName; diff --git a/requestworker.cpp b/requestworker.cpp index c13d223..308c73b 100644 --- a/requestworker.cpp +++ b/requestworker.cpp @@ -4,6 +4,7 @@ #include #include #include +#include RequestWorker::RequestWorker(QObject *parent) : QObject{parent} @@ -63,6 +64,30 @@ void RequestWorker::stop() qDebug() << "Stopping" << timer->isActive(); } +QString RequestWorker::getRequestResponseString(QNetworkReply *rep, QString rep_data) +{ + if(!rep) { + return "No Reply"; + } + QNetworkRequest req = rep->request(); + QString errorString = rep->errorString(); + QString resp = "GET " + req.url().toString() + "\n"; + for(auto &key: req.rawHeaderList()) { + QByteArray value = req.rawHeader(key); + resp += key + ": " + value + "\n"; + } + qDebug() << "Raw header list size: " << req.rawHeaderList().size(); + QString ret; + ret = "Request:\n"; + ret += resp; + ret += "Response:\n"; + if(rep_data == "") + ret += errorString; + else + ret += rep_data; + return ret; +} + void RequestWorker::pollWiFi() { #ifdef Q_OS_ANDROID @@ -90,8 +115,53 @@ void RequestWorker::gotWiFiSSID(QString ssid) void RequestWorker::playAlarm() { - if(player_started) + if (player_started) return; + + // Step 1: Copy the qrc resource to a local cache file so Android can read it +#ifdef Q_OS_ANDROID + QString qrcPath = ":/sounds/echo.mp3"; + QString cachePath = QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + "/echo.mp3"; + + if (QFile::exists(cachePath)) { + QFile::remove(cachePath); + } + + if (QFile::copy(qrcPath, cachePath)) { + qDebug() << "Successfully copied resource to cache:" << cachePath; + } else { + qDebug() << "Failed to copy resource to cache path!"; + return; + } + + // Step 2: Use Android JNI to initialize and play via android.media.MediaPlayer + QJniEnvironment env; + + // Create new android.media.MediaPlayer() + QJniObject mediaPlayer("android/media/MediaPlayer"); + if (!mediaPlayer.isValid()) { + qDebug() << "Failed to create native Android MediaPlayer!"; + return; + } + + // Set data source using the local cache file path + QJniObject jPath = QJniObject::fromString(cachePath); + mediaPlayer.callMethod("setDataSource", "(Ljava/lang/String;)V", jPath.object()); + + // Enable looping + mediaPlayer.callMethod("setLooping", "(Z)V", true); + + // Prepare and start playback + mediaPlayer.callMethod("prepare"); + mediaPlayer.callMethod("start"); + + // Store a global reference so it doesn't get garbage collected immediately + m_androidMediaPlayer = new QJniObject(mediaPlayer.object()); + + player_started = true; + qDebug() << "Native Android alarm started successfully."; + return; +#endif if(player) { player->deleteLater(); player = nullptr; @@ -122,6 +192,7 @@ void RequestWorker::makeRequest() if(stop_timer) return; QNetworkRequest req; + req.setRawHeader("Testing", "Something"); req.setUrl(this->url); disconnect(manager, nullptr, nullptr, nullptr); connect(manager, &QNetworkAccessManager::finished, this, &RequestWorker::requestFinished); @@ -133,15 +204,16 @@ void RequestWorker::makeRequest() void RequestWorker::requestFinished(QNetworkReply *rep) { QByteArray data = rep->readAll(); - rep->deleteLater(); - rep = nullptr; auto now = std::chrono::high_resolution_clock::now(); auto time_diff = std::chrono::duration_cast(now - prev_time); if(data.size() == 0) { prev_time = now; timer->start(); - emit requestFailed(); + QString request_response_string = getRequestResponseString(rep); + emit requestFailed(request_response_string); emit setStatus("Invalid Response; Resending Request"); + rep->deleteLater(); + rep = nullptr; return; } unsigned int time_in_microseconds = time_diff.count(); @@ -151,10 +223,10 @@ void RequestWorker::requestFinished(QNetworkReply *rep) float rate_of_fill = ( float )(prev_distance - water_level) /(float) time_in_microseconds; rate_of_fill = rate_of_fill * 1'000'000; int expected_to_fill = (water_level - min_height) / rate_of_fill; - int percentage_filled = (float (max_height - water_level) / float (max_height)) *100; + int percentage_filled = (float (max_height - water_level) / float (max_height)) * 100; if(enable_alarm) { qDebug() << "Alarm enabled"; - if(percentage_filled >= alarm_thres) { + if(water_level <= alarm_thres) { playAlarm(); } } @@ -169,14 +241,19 @@ void RequestWorker::requestFinished(QNetworkReply *rep) qDebug() << "Percentage filled: " << percentage_filled; qDebug() << "Time difference: " << time_in_microseconds; prev_distance = water_level; - emit networkReply(data_water_level, rate_of_fill, expected_to_fill); + QString timestamp = QDateTime::currentDateTime().toString("hh:mm:ss"); + QString request_response_string = getRequestResponseString(rep, data); + request_response_string += "Timestamp:\n" + timestamp; + rep->deleteLater(); + rep = nullptr; + emit networkReply(data_water_level, rate_of_fill, expected_to_fill, request_response_string); if(stop_timer) { setStatus("Timer stopped."); return; } prev_time = now; timer->start(); - QString status = "Got Reply on: " + QDateTime::currentDateTime().toString("hh:mm:ss") + "; Waiting to Send."; + QString status = "Got Reply on: " + timestamp + "; Waiting to Send."; setStatus(status); } @@ -211,4 +288,10 @@ void RequestWorker::stopAlarm() audioOutput->deleteLater(); audioOutput = nullptr; } +#ifdef Q_OS_ANDROID + if(m_androidMediaPlayer) { + delete m_androidMediaPlayer; + m_androidMediaPlayer = nullptr; + } +#endif } diff --git a/requestworker.h b/requestworker.h index 6a87bbb..c759e44 100644 --- a/requestworker.h +++ b/requestworker.h @@ -13,6 +13,7 @@ #include #ifdef Q_OS_ANDROID #include "wifihelper.h" +#include #endif class RequestWorker : public QObject @@ -45,8 +46,8 @@ public: void setStatus(const QString &newStatus); signals: - void requestFailed(); - void networkReply(int distance, float rate_of_fill, int expected_to_fill); + void requestFailed(QString request_response_string); + void networkReply(int distance, float rate_of_fill, int expected_to_fill, QString data); void statusChanged(); void playMedia(); void connectionText(QString text, bool errored = false); @@ -57,6 +58,7 @@ public slots: void start(); void stop(); private slots: + QString getRequestResponseString(QNetworkReply *rep, QString rep_data = ""); void pollWiFi(); void gotWiFiSSID(QString ssid); void playAlarm(); @@ -64,6 +66,9 @@ private slots: void requestFinished(QNetworkReply *rep); private: QString m_status; +#ifdef Q_OS_ANDROID + QJniObject *m_androidMediaPlayer = nullptr; +#endif }; #endif // REQUESTWORKER_H diff --git a/wifihelper.cpp b/wifihelper.cpp index 739a9dd..835cea7 100644 --- a/wifihelper.cpp +++ b/wifihelper.cpp @@ -1,7 +1,9 @@ #include "wifihelper.h" #include #include +#ifdef Q_OS_ANDROID #include +#endif #include WiFiHelper::WiFiHelper(QObject *parent) @@ -11,6 +13,7 @@ WiFiHelper::WiFiHelper(QObject *parent) } QString WiFiHelper::getWifiSsid() { +#ifdef Q_OS_ANDROID // Get Android application context in Qt 6 QJniObject context = QNativeInterface::QAndroidApplication::context(); if (!context.isValid()) return QString(); @@ -46,9 +49,12 @@ QString WiFiHelper::getWifiSsid() { } return ssid; +#endif + return ""; } void WiFiHelper::requestPermissionsAndFetch() { +#ifdef Q_OS_ANDROID QLocationPermission locationPermission; locationPermission.setAccuracy(QLocationPermission::Accuracy::Precise); Qt::PermissionStatus status = qApp->checkPermission(locationPermission); @@ -67,4 +73,5 @@ void WiFiHelper::requestPermissionsAndFetch() { } }); } +#endif } From 314b57b9c4566ba686bab739b75535ae8f8ffcbb Mon Sep 17 00:00:00 2001 From: unrealdragon Date: Wed, 23 Sep 2026 17:43:30 +0530 Subject: [PATCH 21/24] Minor fix --- requestworker.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/requestworker.cpp b/requestworker.cpp index 308c73b..7ee209b 100644 --- a/requestworker.cpp +++ b/requestworker.cpp @@ -277,6 +277,9 @@ void RequestWorker::startAlarm() void RequestWorker::stopAlarm() { + if (!player_started) + return; + enable_alarm = false; player_started = false; if(player) { @@ -289,7 +292,10 @@ void RequestWorker::stopAlarm() audioOutput = nullptr; } #ifdef Q_OS_ANDROID - if(m_androidMediaPlayer) { + if (m_androidMediaPlayer && m_androidMediaPlayer->isValid()) { + m_androidMediaPlayer->callMethod("stop"); + m_androidMediaPlayer->callMethod("release"); + delete m_androidMediaPlayer; m_androidMediaPlayer = nullptr; } From 8cb17f188002c0283b4dff749e1bd19a6007c1ac Mon Sep 17 00:00:00 2001 From: unrealdragon Date: Wed, 23 Sep 2026 17:52:39 +0530 Subject: [PATCH 22/24] Minor fix --- Main.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Main.qml b/Main.qml index 2cfde8a..28693c5 100644 --- a/Main.qml +++ b/Main.qml @@ -93,7 +93,7 @@ Window { topMargin: 10 leftMargin: 5 } - text: "🖹" + text: "⇅" color: "#0A0F0F0F" radius: 100 accent_color: root.accent_color From 26b489ae5f0aa03b0d2f9bc00654ff4dd88d8fba Mon Sep 17 00:00:00 2001 From: unrealdragon Date: Wed, 23 Sep 2026 18:00:11 +0530 Subject: [PATCH 23/24] Minor fix --- WaterTank.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WaterTank.qml b/WaterTank.qml index 9814428..633fac8 100644 --- a/WaterTank.qml +++ b/WaterTank.qml @@ -114,7 +114,7 @@ Item { id: water_level_percentage text: "Percentage: " + root.percentage_filled.toFixed(2) + " %" font.pointSize: root.font_normal_text_size - visible: enable_filling_status + visible: enable_percentage_reading color: root.text_color anchors { horizontalCenter: parent.horizontalCenter From b05724f7b550e0e33b3044be83cb85419075fa64 Mon Sep 17 00:00:00 2001 From: unrealdragon Date: Wed, 23 Sep 2026 18:06:00 +0530 Subject: [PATCH 24/24] Minor fix --- SettingsPopup.qml | 1 + requestworker.cpp | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/SettingsPopup.qml b/SettingsPopup.qml index 47d555b..6a97c2b 100644 --- a/SettingsPopup.qml +++ b/SettingsPopup.qml @@ -547,6 +547,7 @@ Popup { let interval = parseInt(interval_input.text); let image_width = parseFloat(water_tank_width_input.text); let image_height = parseFloat(water_tank_height_input.text); + let current_reading = current_reading_enable.checked; let percentage_reading = percentage_enable.checked let filling_status = filling_status_enable.checked; diff --git a/requestworker.cpp b/requestworker.cpp index 7ee209b..f0657ef 100644 --- a/requestworker.cpp +++ b/requestworker.cpp @@ -192,7 +192,6 @@ void RequestWorker::makeRequest() if(stop_timer) return; QNetworkRequest req; - req.setRawHeader("Testing", "Something"); req.setUrl(this->url); disconnect(manager, nullptr, nullptr, nullptr); connect(manager, &QNetworkAccessManager::finished, this, &RequestWorker::requestFinished);

^~NR|%8+$n~6Aa%vZIPvI0+C6;#Uf`5z(ZTqs= z6gXCPd~j`x&~5+!PlxqarZ`)|CjbBc|4ILt&GJK~*=(YUqgYb-|NsB5pKj+DKl!DX zSEMmxzePW!k^i%1{j4>D$|jQChpgTI-I>SC$iVgI#Qr6wY22K?3l20s*R7lok~&{f zn6+a;;Uh)2Pn|QKBy-H1{m4@K(KaQwQ(}S)hwe4HaA&Y@GZa&_`(DL%o`X4sT6>)F;Wn+?kyYP9559M~@|8JN*Ackv6;XC{#h8Y`OC7`X)a ziCj49GTHw2OcOUt#p5a~JA}^lvDR$F1XY5%pqq4rC4-`Xp8Q9)7`@YL-V5@Kc z_5Q5SggLt9(LZ|{7!F8eG8jdulsqXUP=oCCD{Mg_dy}8T05Itqh-g%h_fN+0M_x9% z_g2>0Z@FWXzD%2=*sMLa;Z=)XznP_k#lb_aPndEHmIN6bciE9OeIQpSWH! z;4omjQ+iUp>BrnPPfup3wWue1`gQ;Bl5KRHaH&7>4c9Mam7}v=j##(_`G1`r@T$zO z(>SeU%A(6A(}Vn;uQb2pn$G`wuk(k0r;H@hOS+Ff*%D~_yMB$w(nU7)S3`GXx`wD0 zUfOCmzdJX9!-^q?lcB03_?&gm)Qs>Ajv-Z7zB!jp)R?Hgwf_IFEoT;g+i*j!(+f0P z_gihZ%-(>P>;5<}H{{7O9x#(nVqg%^6e-{=l~B^YQ(|Pd<;WDKHbWH;Mrnou)nBTh z7)ohi4s;9$Ev∾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�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 KxvX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 0000000..ea6c193 --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,83 @@ +buildscript { + repositories { + google() + mavenCentral() + } + + dependencies { + //noinspection AndroidGradlePluginVersion + classpath 'com.android.tools.build:gradle:8.8.0' + } +} + +repositories { + google() + mavenCentral() +} + +apply plugin: qtGradlePluginType + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) + //noinspection GradleDependency + implementation 'androidx.core:core:1.16.0' +} + +android { + /******************************************************* + * The following variables: + * - androidBuildToolsVersion, + * - androidCompileSdkVersion + * - qtAndroidDir - holds the path to qt android files + * needed to build any Qt application + * on Android. + * - qtGradlePluginType - whether to build an app or a library + * + * are defined in gradle.properties file. This file is + * updated by QtCreator and androiddeployqt tools. + * Changing them manually might break the compilation! + *******************************************************/ + + namespace = androidPackageName + compileSdkVersion androidCompileSdkVersion + buildToolsVersion androidBuildToolsVersion + ndkVersion = androidNdkVersion + + sourceSets { + main { + manifest.srcFile 'AndroidManifest.xml' + java.srcDirs = [qtAndroidDir + '/src', 'src', 'java'] + aidl.srcDirs = [qtAndroidDir + '/src', 'src', 'aidl'] + res.srcDirs = [qtAndroidDir + '/res', 'res'] + resources.srcDirs = ['resources'] + renderscript.srcDirs = ['src'] + assets.srcDirs = ['assets'] + jniLibs.srcDirs = ['libs'] + } + } + + tasks.withType(JavaCompile) { + options.incremental = true + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + lintOptions { + abortOnError = false + } + + aaptOptions { + // Do not compress Qt binary resources file + noCompress 'rcc' + } + + defaultConfig { + resConfig "en" + minSdkVersion qtMinSdkVersion + targetSdkVersion qtTargetSdkVersion + ndk.abiFilters = qtTargetAbiList.split(",") + } +} diff --git a/android/res/drawable-hdpi/ic_launcher.png b/android/res/drawable-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..7d0f63098088383e6fb663f80a8f26f08527d971 GIT binary patch literal 7299 zcmeAS@N?(olHy`uVBq!ia0y~yVDJE84mJh`hS0a0-5D5UygXeTLn`9V#&AxVa&_vz z>9&hFK(;_v;w zxA*?vceUS-o7g=K*PCwqQf%4D{XfnxyeD-1jA%Ub_4nUy2D~?3aPU>q0Ut66{&aoG= zT&p9cYrQ2u{`bYjXHN#WYKR*!`5im;WYf)@bLVdDbU098G}FgyqKCwfx!$+S`s&!{ zED+{MF@C*0*V|XdbXD@NFE4N2-Ch3t+M3A2-+!6J{bfC|C0t* z|D;EL`OLpQ_Scs^+{gdzUv_r3cW$~-;LWKXKbalp3-^~_P2Dsz!$86(VQcWqkW(it zw|t0Her?f~8rhe5D^g+wv->H@X)`}Zo7ox9S;NQ^JTqpC&8$@`R@l7c|1s(5#Z6nz zZ=0Na?Ap6^tF-E$_2%CGmeiAGB6YS`-rlaYa9Y%zy6Cd`46$W5QyT@9-E?dUA064x zD4>1sqU2}xT6g7%FD7P~6xoQqK69haI#{eT#c5%{t>@fJHoeSw_F-c3bv2>b$&)*m zJiHK_!>u9FcK^Mxf#N|izr>khX?z8nn#!#vKa|&DJ7DxuK-v9IYq6}u6tAT}->(Zf z#PO>p=g8XJ+y@qiIexwsPM!FnZvOp#(-RV(pPh~7XxPScbW;^ehednMkDbrwS*ITD z61{!@e))!T@A;)`(S9nu5kF&k6TP^?>IRs95V!8bmvIroq9e)#OUUO7d-U}38kf_ zQYpSQ_HB0zUcGu6LVvP>k zXM-0Wyue~2z{1DId?>YhVe_AD=Qq^m*cR=P()c-t?}kauES6gT1rtRt@$U>Z^VVbE zz+rP{LgNwBKL;7)=X>=b-OL!ZibrI zD=`F$yn6Mj>g&|r+2=p99`cLM=H@x{hK35Zb%OSW^Ek;so_EGWD($a$6TP}Vn6qfHl zFu`}}r|S#j6eP|mY292HaDjtC z;)dOsJO2L;)u{aPUDFbGwCLQ`F4q}P&j;>XcBlK?bulj+*X!F8ds)K57kS69g-!E1 z*p!j@J#a9l;j=|_~v1|JYN!zzWv85U6KzyEV#cX zB_$S}^`FrZvCQ|+lE}8qz}`EPvp#5@E@ToY+{xx06Y_c19G#n8I!wEzD?H_=GjIwE zuI^E@=YDh`GkCdFvcF~Pj^i5ZHH@XCq(0Q?G@O#y*!PV&+3otDf@f!5+Mnm&!4g#) zb>Y#`Zuh>mYwv#fFe!EZNu^^+m&A5X?$VZ7Xfesq!G@o8+8)zLwuX?CLMoR&rkiB! z;uAD*w{*SB#M!8#cQoPY^hwUUe#s;sFfC%>7Gqo|cp>L#`m>em%sUVK_^_650a z=Zmw%I!$v0-$Yr>(Nvh>VjH+}LidsXITJKx4>L_vRy=mRp(3@jCC&Ey-tqCS=p&=4>It;E>wrZCW7A9yICptCff7`h^KX$`|RlnJJ1QtzqeRF70(c z4$Uw$oo$wPFKV8Lilw8sB6IqoqX`-tQ9s6v>fyLn45>=U4FmuoA+LXIYX~#)oQJ^oxteK-dER=DWx*@VEz~jvId=+VK2TJ0mg^{zPCc1p8^xDl zcX8T7Sr+;AmQID;(+`W3{0uIcqK6#6IS^fO*_ zUMYnujee`wthuvm=|}&ov6@U8rx^@6jT|(?E?XVFpm)^mVXw!jFQ3DX-2XmHecC+B zXvxU*{_N-s#x<*-Jc}yPl6@W$78W7;bZWQRzE6+%w>a|LXxjI6?Q6BE)7iJ@-Tim# zM2XsLZ`I%vH-{($Svd%GJczrR<`Ig6Wms_O|Ir*NYPIXoOo_BZC$KTD{7O--QnLKdn&ELCs z_p;5awb>V$dHyeuYdaad-T*=7w>k2K_D`q zZHmds@*Uw)39LbO^_D2BYC54w+OTPClW%$(O)w*b+vU|iuk1xx3 z_4ogn%qwm7TNT>UB%D!)!(O@&(Ar#)L3)!nl?7qYm-`9 z)cG!*n#%C##L>#>590USTFSAldWGKGd2vnG8W)NfES=U~Iz5NyLcYk?<1-h#^Y2gk zdTOdRJI{n~CvWHPuZ>X=y1DJ|R`V>OlRkVW7tD0|d-P<$TZwlpvWLEA^l)@?Og0nU za7iO1bHDn+x&(0-=VaCXqKP2UF9}X=fH@a~7<-rS{N^+rxAX z!>b$n8swMHOslQU<$L(_lBo8)KW7&(?t0v3EwyUZs%`)3?w(FgFbuIdt~9BsbVr8k z(L!!95r?0b`4@(lK-Ky(kk*xV*>GD$5BNGLlXF7$PQ2$V}<-wkg zusK40OE*-0UAcxuqK09z_qM1TFI$3_eyEX6)nt+5w6h9nUUgaYR_4Nw9=jAnnasPq z%$Be1E@HUn=iu_^&~v~4?WWmbdkr!su{lgu5RtC`eP~yp=9|2v`Q6)dJ&v6YxN|ko=qx(rWG3D0X)_I(>`7sh6MhmaX-l z?s&!YL*cn4h1aiKIa6Qx_kF#2Mnm4dpU+O-u*j+T*IKGP`K1ZBD_cic_vyKse4kAi zG#ffur*`Qaoilm8=E^mDKgi_2bA9$i$Zj|HN4cF=()!1o^xWPpzp|6fEjrN7T!g>1 z`{|iapFDO|-RQ8CHv6-%@PZYGn901L-ur*+YJHg)67QdF`M+tmfI^7$vsv8lyqHx^ zFI-gRzy98l#KaIS(W6W5Ig2sxe^N7{iTS2h@#OUG)e-ZH-p%m0UNU)mbl%RT`xY%qdcDhjpOIN-ZK2)_%NrfdO9N&skLlt5afJJbql!rP zoo**P?e}py-i!R=UmkzJa4E9J?!n3g_SO0Oe?^DSt-bwy-}d$-FUCVzt-n<=IgS=) zu-s@Wa@W=9(B?=nja28&J}Jq0rTJ^G(#9-#3**CFj7>$n&p0Z4)XKpS)$qQa{ZvJDDc+%sjg2{4yWr zt4BEB_ew^ZKHhj-&U&Hc_5u^zYmavr_mrEi+yC!ZRm-Qf?DjTRVzL2imYmEI@-Wwk zyvkZ5*0-w3<0aeElsP-Jj_N!*>uYJVdgZYt>MPnKB%W=xF68d@Qvbv&%*7z@Y9_Yu zQ58ee|7Fu;m^iCH|7g7Q{imnP;wysp{>^>;@9*l*&(FV?*}@tqqRf43>+`+03bvf_ zRNJM))LN{^)EVW?z~ib}f8hL8*OEF%o2378^_v$w*5%SXxrw83sbIwxXRqst*@Cb2 znY~i%yCKIiKWt7k`NV?S=&|hreIgt>@u5CqN^|RZA)Q zy4~mc=L=6R%=Qpt5s>1SvkHo~tx0+3@|jbZm#6Zyhr-ndYh}+(@nrT)o?4gr{ei5% zkIVDaFSctp_-UnHy}Hd`aAU`9j=DHb#kGc$&U;=_ZhWdHxc5hl$ zbh`iD&TP3;GFSLKBGb$ty)iuVS~zdd$75D&93CI{JzJ{m)>{@86}9HEudmF(6;~YJ zsp)4XI@#U!bl1$Wzu%qy%~d>hij0Ya%cZ$y>)jLI#{#wcP7jBxR9HhlVo)zDo9bcT9^7^22dp1*J0pD4# zG;Id215HsEVrMZ01g&{*?{H5b?$y6p#U*U-xDMT8)G9j~ly^)lBl4z?R_6Ixw!dF4 zmy0hG?R&j3e4{_#u5Y)pvjYsW@BIG9C~|Jq!HJQtpLjB~h&)y~F>9Avi$v<}>B3o? z_?Gr=nJThe-lW2J#ZiTqTNL*@daQKqSN=Nh?Wbwe7k`>|{QARH%teaF?TTMr5!DX2 zDP6kkKv4Hpb%)c__4{S4%W@v~$>#fVyDt(^T-)>NWM*ET;RO{xW7V#y9>)|e{&%sd z6Jj{Y@;lkqm0{)F@N>5_9Cv)2^2x%QTQg~X>9ffGKj$BN?>AQAcB&89v2R=5=lSLD z{uxyq?<_sC=37LM@ejW%^EA5@H%|PQ7JGK_m1c!t8|BoVccvK=*;;ce^z>g|aVYLz zBFXw~k%REV7j@TtkFK6oVjyC4>eQ(nGdJ5_OZ@-%X#D=izyDXB=5J>ah!i;V=h)iY zlxkMG~1^t)FkVi*O3ec?z>Ab)ZXD)I^#&} z>knerUPJ}GS7X)Hnq?x+8FDEm#B;&-FXmle7hV2f|3&h~^q4J0hhFY#>rlxzpyn42F^WujZ+b3e;M0OQU{4yk+8?ob2bG zLGu@y)OvS37oWY?#PX$lonP~*&AaBddQ4s> z)t(i+X{}1McM{JX%z-lvwdf8 zkBt%2J*_0ZDLOi;^8IUyWY7@TfM1{M>V}|QDX8x*5|c<|NVadUzbm&V#ar-F9(?U zZMu68=esDU-V89v*j`>D@$uY_!aqL>-}EX9hN$w*oy;lmZd>>D+&wBWT4!Fr->WLP zp6}BAY{8YQnSw59gj|o(xn#ME>%a}>&#O*(rN7%#8DIV2p6ly&o(r|#b^m?MUcbNA z(^DP{**!^ahu3zhriQdJUUj#?aE^nXRgdFk?XNqSEtPI6XXa*XSK^)mmW z<-6@i1=szs>ECqj;%1TL*M6S$rSB>~zuS}haJ4hr3wQfJ7dPks`}sD%CBZS{#J1?D z=w1t_zn#m{7+NO1zR%!rYpK^#rF-X3?7tA4={NJ!&m&Vb)8~{w&)sgyC%K^dee9nv z->#R%M8?H2a(CUD+mY}w;*Le(qMI)q4t4dheVsEsL;TkAOJYmHFWt4ca=v8BHs0LO zxWpB~{qxqGyepz3(v|16IHKq0nKP`19g7bg>HOH%w(F+1T-A%O{tOGM=UWtg`Em8Z z9Gw;=uA+(sEP5i%qFWpLHELeFwe9z9Q1O@`y=c*ihoz5}cplHnIzHzsx5yjzscWh{ zrF{PXxc&Z3WP^0dN1GLQ@7y_)7*k#xusmDM_p0kgzI!i2OywVPa<2a}DfH^wT|zVW z=ubZqn|)#D%=W?`HgP>ndPSa{cGsVZbQLU_zi1*yrV0Dwt$KfcuYb$!=433U8&lD< zC~9TW%$_~p#oPC*dQa22zw`CoY{9*oQYWss+w$V-y^DP&%>62bu}&;9lZ{OTuXe4t zvhwvsky#(-u-{*~foEa<{k0R0JAZalBa(z~VCxAL$moC}jttSvCW5d3YRo14W;NL6L{Z)Ctx7kZRJ*;&`FGs9tP4BdCW{e%X4~1-; zcl&ip)H}9CQ%v{hn}5|P(a`r?UF0`Ui?yXp#^ZwW3p6_pNe%>=Z?$!^suOAmKOKNgI!*^xzZGmT+kx!j$878gM zt2z_S{3J_m-9pWM7tP=Ay}ZxF^ZU9Pds(ge-%e~7st@c=FqpD6aMHd9e|DDJeu?M5 z+q?10jP{RCQ;w~D5G-t}7{6rApO?$$)qI-&($Pd<{?(~I5h2shEeSP#e&4{sN+~JW zSo+{+Nyho2v#q~tZ=RUE&oZT9OTFFaGscVK>rx+2-mr}O;^q#k0IhBp(cTGduCpsY z>8yO^uk!BTT-DEEv+K0Y2TyRUZ&HMBoycwbb}a(7wOuPZNu z^Z$K)70UmO)vsRHLw-8*ql>ZC-)g=$@0G8yp6J!PkmK--1KSz+Y)_whTRA7|!WUZx z(d|z}g){C?dsCMFrB+A%(38+Tjwf!3KHl_qpR(}r{^&oKeu>MA%Dw)5U*=VRcjeEn z=^Ul6Jmu?3zN~6)xBHW(bI)=jSHhy0L}LfmwA7%lt^clwnTRx47;SVF@=%>GaB11$ zG|x>E+n=}h&y8uD=U=;h-@bR#lV7Xbe%)^$ziGcc!}sY+y4N2)YA>Z-+xYyPyW(Dp z|A&>`pDq4l#Vxg@OR_#0zkKxtH z>CekKCtPRxoZIxvIU?-KgNuv5W`5B~-JP`j*1iWUZ(f?0s9Cu$-XMRh$=xv~^+SWe zDb*{}`n~kFCrGUHnYECs{YCt2t_QuHS2WpMisycKU?Ea`XjARniv>GQ%5%uFdA;wK z3H`cnvY-3`W#RVu_5XhIoj=0)F7NSceuL)HjrZ2AWp@_V@f6AU&abTAC1X*baO2jk zD8B6+{XI xy@2`Wz0;McosH+i(9FXTC{EQ(t*_IRgU&gQu&X%Q~loCIGKt1x)|| literal 0 HcmV?d00001 diff --git a/android/res/drawable-mdpi/ic_launcher.png b/android/res/drawable-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..9260e4eafbe87b766c5cd873276b1a8ea05c6530 GIT binary patch literal 4046 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 BsuKVJ literal 0 HcmV?d00001 diff --git a/android/res/drawable-xhdpi/ic_launcher.png b/android/res/drawable-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..c3e5ba961df4e13dbc985f28aee3c5e8a8a9836d GIT binary patch literal 11369 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 R<_ruB44$rjF6*2UngDhI#O?q9 literal 0 HcmV?d00001 diff --git a/android/res/drawable-xxhdpi/ic_launcher.png b/android/res/drawable-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..1257bb6fdf0fe0f17a0514e3e99ffb2aa5a94b13 GIT binary patch literal 21305 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 literal 0 HcmV?d00001 diff --git a/android/res/drawable-xxxhdpi/ic_launcher.png b/android/res/drawable-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4ed8a7523c50fffc89614d6acf024c4caa6131d5 GIT binary patch literal 33431 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 HN@xNAc=#i} literal 0 HcmV?d00001 diff --git a/android/src/org/qtproject/example/appwaterLevelSensor/.WaterLevelService.java.kate-swp b/android/src/org/qtproject/example/appwaterLevelSensor/.WaterLevelService.java.kate-swp new file mode 100644 index 0000000000000000000000000000000000000000..aac66dce72bf74a8afb56f93181d5cbe6273a476 GIT binary patch literal 370 zcmZQzU=Z?7EJ;-eE>A2_aLdd|RWQ;sU|?Vn(c2XED}>S78L0D<(FipWhN(dsFc4=CNHxe@Mqh}*Aie^~-b4gn5yXeO3nZ@u t;v>l`gZSwP^(r8KDuS;H;uj(KY9PKfg0BwZBe`CKfq{WVK|w*m6#&}8KvDnz literal 0 HcmV?d00001 diff --git a/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelReceiver.java b/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelReceiver.java new file mode 100644 index 0000000..60b004c --- /dev/null +++ b/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelReceiver.java @@ -0,0 +1,17 @@ +package org.qtproject.example.appwaterLevelSensor; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +public class WaterLevelReceiver extends BroadcastReceiver { + public native static void updateWaterLevel(byte[] data); + + @Override + public void onReceive(Context context, Intent intent) { + if ("com.example.WATER_LEVEL_UPDATE".equals(intent.getAction())) { + byte[] data = intent.getByteArrayExtra("level_data"); + updateWaterLevel(data); + } + } +} diff --git a/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java b/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java new file mode 100644 index 0000000..c868acc --- /dev/null +++ b/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java @@ -0,0 +1,210 @@ +package org.qtproject.example.appwaterLevelSensor; + +import android.app.Notification; +import android.app.NotificationManager; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Color; +import android.graphics.BitmapFactory; +import android.app.NotificationChannel; +import org.qtproject.qt.android.bindings.QtService; +import android.util.Log; +import android.content.Intent; +import java.lang.Runnable; +import java.io.IOException; +import java.net.*; +import java.nio.charset.StandardCharsets; +import java.nio.*; +import org.qtproject.qt.android.bindings.QtActivity; +import android.app.Service; +import java.time.Instant; +import java.time.Duration; + +public class WaterLevelService extends Service { + + private static float alert_thres_distance = 1000000; + + public class UDPCommandClient implements Runnable { + private DatagramSocket socket_cmd_recv; + private DatagramSocket socket_cmd_send; + @Override + public void run() { + Log.d("UDP Service", "Command thread initialising"); + try { + socket_cmd_recv = new DatagramSocket(8178, InetAddress.getByName("localhost")); + socket_cmd_send = new DatagramSocket(8179); + + Log.d("UDP Service", "Created command thread sockets"); + while (!Thread.currentThread().isInterrupted()) { + byte[] buffer = new byte[1024]; + DatagramPacket packet = new DatagramPacket(buffer, buffer.length); + socket_cmd_recv.receive(packet); + String str = new String(buffer, StandardCharsets.UTF_8); + if(str.startsWith("", ""); + alert_thres_distance = Float.parseFloat(str); + } + Log.d("UDP Service ", "Received command packet " + str); + + } + } + catch (IOException e) { + Log.e("UDP Service", "Socket Error", e); + } + } + + } + + public class UDPClient implements Runnable { + private DatagramSocket socket_recv; + private DatagramSocket socket_send; + private Instant prevAlertTimestamp; + private boolean started = false; + + @Override + public void run() { + Log.d("UDP Service", "Thread initialising"); + android.net.wifi.WifiManager wifi = (android.net.wifi.WifiManager) getSystemService(Context.WIFI_SERVICE); + android.net.wifi.WifiManager.MulticastLock multicastLock = wifi.createMulticastLock("water_level_lock"); + android.os.PowerManager pm = (android.os.PowerManager) getSystemService(Context.POWER_SERVICE); + android.os.PowerManager.WakeLock wakeLock = pm.newWakeLock(android.os.PowerManager.PARTIAL_WAKE_LOCK, "WaterLevel:WakeLock"); + + + NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + String alertChannelId = "water_alert_channel"; + NotificationChannel channel = new NotificationChannel( + alertChannelId, + "Water Level Alerts", + NotificationManager.IMPORTANCE_HIGH + ); + manager.createNotificationChannel(channel); + + try { + multicastLock.acquire(); + wakeLock.acquire(); + socket_recv = new DatagramSocket(8176); + socket_send = new DatagramSocket(8177); + socket_recv.setBroadcast(true); + Log.d("UDP Service", "Created Sockets"); + while (!Thread.currentThread().isInterrupted()) { + byte[] buffer = new byte[4]; + DatagramPacket packet = new DatagramPacket(buffer, buffer.length); + socket_recv.receive(packet); + float f = ByteBuffer.wrap(buffer).order(ByteOrder.LITTLE_ENDIAN).getFloat(); + Log.d("UDP Service ", "Received packet: " + f); + Log.d("UDP Service ", "Threshold is: " + alert_thres_distance); + boolean duration_passed = false; + if(!started) { + duration_passed = true; + prevAlertTimestamp = Instant.now(); + } + else { + Instant currentTimestamp = Instant.now(); + Duration duration = Duration.between(prevAlertTimestamp, currentTimestamp); + if(duration.toMinutes() > 30) { + duration_passed = true; + } + prevAlertTimestamp = currentTimestamp; + } + if(f > alert_thres_distance && alert_thres_distance < 999999 && duration_passed) { + Notification.Builder builder = new Notification.Builder(WaterLevelService.this, alertChannelId) + .setSmallIcon(android.R.drawable.ic_dialog_alert) + .setContentTitle("Water Level Sensor") + .setContentText("Water Level is below alert threshold") + .setPriority(Notification.PRIORITY_HIGH); + manager.notify(2, builder.build()); + Log.d("UDP Service", "Notification sent"); + } + DatagramPacket send_packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName("localhost"), 8180); + socket_send.send(send_packet); + Log.d("UDP Service ", "Sent packet"); + } + } + catch (IOException e) { + Log.e("UDP Service", "Socket Error", e); + } finally { + if (multicastLock.isHeld()) + multicastLock.release(); + if (wakeLock.isHeld()) + wakeLock.release(); + if (socket_recv != null) + socket_recv.close(); + } + } + } + + public void startWaterLevelService() { + Log.d("UDP Service", "Starting the service from Activity"); + + Intent intent = new Intent(this, WaterLevelService.class); + + startForegroundService(intent); + } + public WaterLevelService() { + super(); + Log.i("UDP Service", "Class is created"); + } + + @Override + public android.os.IBinder onBind(android.content.Intent intent) { return null; } + + @Override + public void onCreate() { + super.onCreate(); + Notification notification = createNotification(); + startForeground(1, notification); + Log.i("UDP Service", "Creating Service"); + + } + + @Override + public void onDestroy() { + super.onDestroy(); + Log.i("UDP Service", "Destroying Service"); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + Notification notification = createNotification(); + startForeground(1, notification); + + Log.d("UDP Service", "Actually starting the thread"); + + int ret = super.onStartCommand(intent, flags, startId); + + (new Thread(new UDPClient())).start(); + (new Thread(new UDPCommandClient())).start(); + + return START_STICKY; + } + + + private Notification createNotification() { + String channelId = "water_level_channel"; + + NotificationManager manager = + (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + + NotificationChannel channel = new NotificationChannel( + channelId, + "Water Level Service", + NotificationManager.IMPORTANCE_LOW + ); + manager.createNotificationChannel(channel); + + return new Notification.Builder(this, channelId) + .setContentTitle("Water Level Sensor Running") + .setContentText("Monitoring water level...") + .setSmallIcon(android.R.drawable.ic_menu_info_details) + .build(); + } + + public static void startQtAndroidService(QtActivity activity) { + Log.d("UDP Service", "Starting the service"); + Intent intent = new Intent(activity, WaterLevelService.class); + activity.startForegroundService(intent); + + } +} diff --git a/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelServiceStarter.java b/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelServiceStarter.java new file mode 100644 index 0000000..98b114c --- /dev/null +++ b/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelServiceStarter.java @@ -0,0 +1,19 @@ +package org.qtproject.example.appwaterLevelSensor; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.util.Log; +import org.qtproject.qt.android.bindings.QtActivity; + +public class WaterLevelServiceStarter { + + public static void startService(Context context) { + Log.d("UDP Service", "Starting service via QtActivity instance"); + + Intent intent = new Intent(context, WaterLevelService.class); + + context.startForegroundService(intent); + } +} diff --git a/configinterface.cpp b/configinterface.cpp new file mode 100644 index 0000000..563cf68 --- /dev/null +++ b/configinterface.cpp @@ -0,0 +1,108 @@ +#include "configinterface.h" + +ConfigInterface::ConfigInterface(QObject *parent) + : QObject{parent} +{ + auto paths = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); + qDebug() << "Got writable path as: " << paths; + std::filesystem::path dir = paths.toStdString(); + if(!QDir(dir).exists()) { + QDir().mkpath(paths); + } + std::filesystem::path path = dir / "config.json"; + QFile config(path); + if(config.exists()) { + qDebug() << "Loading config file...."; + bool ok = config.open(QFile::ReadOnly); + if(!ok) { + qDebug() << config.errorString(); + return; + } + auto data = config.readAll(); + config.close(); + QJsonObject top = QJsonDocument::fromJson(data).object(); + QString max, min, alert; + max = top["max_threshold"].toString(); + min = top["min_threshold"].toString(); + alert = top["alert_threshold"].toString(); + setMax(max); + setMin(min); + setAlert(alert); + } + else { + qDebug() << "File does not exist creating one..."; + QJsonObject top; + top["max_threshold"] = "125"; + top["min_threshold"] = "25"; + top["alert_threshold"] = "100"; + QByteArray data = QJsonDocument(top).toJson(); + bool ok = config.open(QFile::WriteOnly); + if(!ok) { + qDebug() << config.errorString(); + return; + } + config.write(data); + config.flush(); + config.close(); + } +} + +void ConfigInterface::saveConfig(QString max, QString min, QString alert) +{ + auto paths = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); + qDebug() << "Got writable path as: " << paths; + std::filesystem::path path = paths.toStdString(); + QFile config(path / "config.json"); + qDebug() << "Writing to config file..." << max << min << alert; + QJsonObject top; + top["max_threshold"] = max; + top["min_threshold"] = min; + top["alert_threshold"] = alert; + setMax(max); + setMin(min); + setAlert(alert); + QByteArray data = QJsonDocument(top).toJson(); + config.open(QIODevice::WriteOnly); + config.write(data); + config.flush(); + config.close(); +} + +QString ConfigInterface::alert() const +{ + return m_alert; +} + +void ConfigInterface::setAlert(const QString &newAlert) +{ + if (m_alert == newAlert) + return; + m_alert = newAlert; + emit alertChanged(); +} + +QString ConfigInterface::max() const +{ + return m_max; +} + +void ConfigInterface::setMax(const QString &newMax) +{ + if (m_max == newMax) + return; + m_max = newMax; + emit maxChanged(); +} + +QString ConfigInterface::min() const +{ + return m_min; +} + +void ConfigInterface::setMin(const QString &newMin) +{ + if (m_min == newMin) + return; + m_min = newMin; + emit minChanged(); +} diff --git a/configinterface.h b/configinterface.h new file mode 100644 index 0000000..edf60ee --- /dev/null +++ b/configinterface.h @@ -0,0 +1,45 @@ +#ifndef CONFIGINTERFACE_H +#define CONFIGINTERFACE_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class ConfigInterface : public QObject +{ + Q_OBJECT + QML_ELEMENT + Q_PROPERTY(QString min READ min WRITE setMin NOTIFY minChanged FINAL) + Q_PROPERTY(QString max READ max WRITE setMax NOTIFY maxChanged FINAL) + Q_PROPERTY(QString alert READ alert WRITE setAlert NOTIFY alertChanged FINAL) +public: + explicit ConfigInterface(QObject *parent = nullptr); + QString alert() const; + void setAlert(const QString &newAlert); + + QString max() const; + void setMax(const QString &newMax); + + QString min() const; + void setMin(const QString &newMin); + +signals: + void configData(QString max, QString min, QString alert); + void alertChanged(); + void maxChanged(); + void minChanged(); + +public slots: + void saveConfig(QString max, QString min, QString alert); +private: + QString m_alert; + QString m_max; + QString m_min; +}; + +#endif // CONFIGINTERFACE_H diff --git a/images.qrc b/images.qrc new file mode 100644 index 0000000..2d11999 --- /dev/null +++ b/images.qrc @@ -0,0 +1,5 @@ + + + WaterTank1.png + + diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..ffff36f --- /dev/null +++ b/main.cpp @@ -0,0 +1,18 @@ +#include +#include + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + + QQmlApplicationEngine engine; + QObject::connect( + &engine, + &QQmlApplicationEngine::objectCreationFailed, + &app, + []() { QCoreApplication::exit(-1); }, + Qt::QueuedConnection); + engine.loadFromModule("waterLevelSensor", "Main"); + + return app.exec(); +} diff --git a/moving_container.h b/moving_container.h new file mode 100644 index 0000000..89a1cf0 --- /dev/null +++ b/moving_container.h @@ -0,0 +1,89 @@ +#ifndef MOVING_CONTAINER +#define MOVING_CONTAINER + + +using ld = long double; + +template class average { + struct info { + info *next = nullptr; + T data; + }; + info *head = nullptr, *tail = nullptr, *curr = nullptr; + ld avg = 0.0; + unsigned int count = 0; + unsigned int max_size = 10; + +public: + average(int max_size = 10) { + this->max_size = max_size; + } + + ~average() { + curr = head; + while(curr != nullptr) { + info *now = curr; + curr = curr->next; + delete now; + } + } + + unsigned int size() { + return this->count; + } + + double get_average() { + return this->avg; + } + + void recalculate_average() { + curr = head; + this->avg = 0; + this->count = 0; + while(curr != nullptr) { + info *now = curr; + auto t = now->data; + curr = curr->next; + count++; + avg = ((avg) * (ld) (count - 1) / (ld )(count)) + ((ld)(t) / (ld) count); + } + } + + void push_back(T t) { + if(head == nullptr) { + auto *i = new info(); + i->next = nullptr; + i->data = t; + head = i; + tail = i; + } + else { + info *i = new info(); + if(this->count == max_size) { + T old_value; + if(head->next) { + auto *temp = head; + head = head->next; + old_value = temp->data; + delete temp; + } + recalculate_average(); + tail->next = i; + i->next = nullptr; + i->data = t; + tail = i; + } + tail->next = i; + i->next = nullptr; + i->data = t; + tail = i; + } + count++; + avg = ((avg) * (ld) (count - 1) / (ld )(count)) + ((ld)(t) / (ld) count); + } +}; + + + + +#endif diff --git a/service.cpp b/service.cpp new file mode 100644 index 0000000..6b819b0 --- /dev/null +++ b/service.cpp @@ -0,0 +1,115 @@ +#include "service.h" + +#include +#include +#include +#include +#include +#include + +// Q_DECLARE_JNI_CLASS(Intent, "android/content/Intent") +Q_DECLARE_JNI_CLASS(ComponentName, "android/content/ComponentName") +Q_DECLARE_JNI_CLASS(WaterLevelService, "org/qtproject/example/appwaterLevelSensor/WaterLevelService") + + +static volatile float level = -1; + +static void handleWaterLevelUpdate(JNIEnv *env, jobject /*obj*/, jbyteArray data) { + jbyte *bytes = env->GetByteArrayElements(data, nullptr); + jsize len = env->GetArrayLength(data); + + // Process your data here + qDebug() << "Received data from Java broadcast! Length:" << len; + + + level = *((float *) (bytes)); + + qDebug() << "Level received as: " << level; + + env->ReleaseByteArrayElements(data, bytes, JNI_ABORT); +} + + +service::service(QObject *parent) + : QObject{parent} +{ + if(QSysInfo::productType() == "android") { + qDebug() << "Running android service"; + + using namespace QtJniTypes; + using namespace QNativeInterface; + + + JNINativeMethod methods[] = { + {"updateWaterLevel", "([B)V", (void *)handleWaterLevelUpdate} + }; + + + // auto *androidApp = qGuiApp->nativeInterface(); + // Context context = androidApp->context(); + QJniObject context = QNativeInterface::QAndroidApplication::context(); + + QJniEnvironment env; + auto serviceClass = env.findClass(Traits::className()); + if (!serviceClass) { + qDebug() << "FAILED to find WaterLevelService class!"; + env->ExceptionDescribe(); // VERY important + env->ExceptionClear(); + return; + } + + jclass javaClass = env.findClass("org/qtproject/example/appwaterLevelSensor/WaterLevelReceiver"); + env->RegisterNatives(javaClass, methods, 1); + + + QJniObject::callStaticMethod( + "org/qtproject/example/appwaterLevelSensor/WaterLevelServiceStarter", + "startService", + "(Landroid/content/Context;)V", + context.object()); // pass the QtActivity instance ); + + // QJniObject activity = QNativeInterface::QAndroidApplication::context(); + // activity.callMethod("startWaterLevelService", "()V"); + // Intent serviceIntent(activity, serviceClass); + // activity.callMethod("startWaterLevelService"); + + // activity.callMethod<() + // QJniObject::callStaticMethod( + // "org/qtproject/example/appwaterLevelSensor/WaterLevelService", + // "startQtAndroidService", + // "(Landroid/content/Context;)V", + // activity.object() + // ); + + // activity.callMethod("startWaterLevelService", "()V"); // Intent serviceIntent(context, serviceClass); + // context.callMethod("startService", serviceIntent); + + // context.callMethod( + // "startForegroundService", + // serviceIntent + // ); + // QJniObject className = QJniObject::fromString( + // "org.qtproject.example.appwaterLevelSensor.WaterLevelService" + // ); + + // QJniObject serviceClassObj = QJniObject::callStaticObjectMethod( + // "java/lang/Class", + // "forName", + // "(Ljava/lang/String;)Ljava/lang/Class;", + // className.object() + // ); + + // QJniObject intent( + // "android/content/Intent", + // "(Landroid/content/Context;Ljava/lang/Class;)V", + // context.object(), + // serviceClassObj.object() + // ); + + // context.callObjectMethod( + // "startForegroundService", + // "(Landroid/content/Intent;)Landroid/content/ComponentName;", + // intent.object() + // ); // WaterLevelService::callStaticMethod("startQtAndroidService", context); + } +} diff --git a/service.h b/service.h new file mode 100644 index 0000000..5b64765 --- /dev/null +++ b/service.h @@ -0,0 +1,15 @@ +#ifndef SERVICE_H +#define SERVICE_H + +#include + +class service : public QObject +{ + Q_OBJECT +public: + explicit service(QObject *parent = nullptr); + +signals: +}; + +#endif // SERVICE_H diff --git a/servicemain.cpp b/servicemain.cpp new file mode 100644 index 0000000..e0a684e --- /dev/null +++ b/servicemain.cpp @@ -0,0 +1,12 @@ +#include +#include +#include "service.h" + +int main(int argc, char *argv[]) +{ + qWarning() << "Service starting from a separate .so file"; + QAndroidService app(argc, argv); + service service; + + return app.exec(); +} \ No newline at end of file diff --git a/udplistener.cpp b/udplistener.cpp new file mode 100644 index 0000000..4978794 --- /dev/null +++ b/udplistener.cpp @@ -0,0 +1,161 @@ +#include "udplistener.h" +#include + +#ifdef Q_OS_ANDROID +#include "service.h" +#endif + +UDPListener::UDPListener(QObject *parent) + : QObject{parent} +{ + worker = new Worker(this); + thread = new QThread(this); + worker->moveToThread(thread); + connect(worker, &Worker::datagramReceived, this, &UDPListener::datagramRecieved); + connect(worker, &Worker::socketError, this, &UDPListener::socketError); + connect(this, &UDPListener::startWorker, worker, &Worker::run); + thread->start(); + emit startWorker(); + timer = new QTimer(this); + timer->setInterval(10000); + timer->setSingleShot(false); + connect(timer, &QTimer::timeout, this, &UDPListener::connectionTimerTimedOut); + connect(qApp, &QCoreApplication::aboutToQuit, this, &UDPListener::destroy); +#ifdef Q_OS_ANDROID + qDebug() << "Running on Android"; + service service; + qDebug() << "Ran service"; +#endif +} + +double UDPListener::distance() const +{ + return m_distance; +} + +void UDPListener::setDistance(double newDistance) +{ + m_distance = newDistance; + emit distanceChanged(); +} + +void UDPListener::setAlert(float distance) +{ + if(!command_socket) { + command_socket = new QUdpSocket(this); + bool bind = command_socket->bind(8181); + if(bind) { + QNetworkDatagram data; + data.setDestination(QHostAddress::LocalHost, 8178); + QString s_data = ""; + while(s_data.toUtf8().size() != 1024) { + s_data += "="; + } + data.setData(s_data.toUtf8()); + command_socket->writeDatagram(data); + command_socket->flush(); + command_socket->close(); + } + } +} + +void UDPListener::socketError(QString err) +{ + qDebug() << "Socket error received: " << err; + if(err == "The bound address is already in use") { + err = "Port already in use."; + } + emit showError(err); +} + +void UDPListener::startService() +{ + +} + +void UDPListener::datagramRecieved(float distance) +{ + qDebug() << "Data received in main class: " << distance; + averages.push_back(distance); + prev_time_point = std::chrono::high_resolution_clock::now(); + emit distanceReceived(distance, QDateTime::currentDateTime().toString("dd/mm/yyyy hh:mm:ss.z ap")); + if(averages.size() >= 5) { + this->m_distance = averages.get_average(); + emit distanceChanged(); + } + if(averages.size() == 1) + emit connected(); + +} + +void UDPListener::destroy() +{ + qDebug() << "Destroying UDP Listener"; + timer->stop(); + thread->exit(0); + thread->deleteLater(); + worker->deleteLater(); + timer->deleteLater(); + qDebug() << "Deinitialized UDP Listener"; +} + +void UDPListener::connectionTimerTimedOut() +{ + using namespace std::chrono_literals; + auto current_time_point = std::chrono::high_resolution_clock::now(); + if((current_time_point - prev_time_point) > 10s) { + qDebug() << "Disconnected::" << current_time_point.time_since_epoch() << " " << prev_time_point.time_since_epoch(); + } + else { + qDebug() << "All fine"; + } +} + +Worker::Worker(QObject *parent) +{ + +} + +void Worker::run() +{ + using namespace std::chrono_literals; + socket = new QUdpSocket(this); +#ifdef Q_OS_ANDROID + bool bind = socket->bind(QHostAddress::Any, 8180); +#else + bool bind = socket->bind(QHostAddress("192.168.1.255"), 8176); +#endif + if(!bind) + { + qDebug() << "UI Worker socket bind failed" << bind << socket->errorString(); + emit socketError(socket->errorString()); + } + + connect(socket, &QUdpSocket::readyRead, this, &Worker::socketDataReceived); +} + +void Worker::socketDataReceived() +{ + if(socket->hasPendingDatagrams()) { + qDebug() << "Socket has pending data: " << socket->pendingDatagramSize(); + char buff[4] = {0x00, 0x00, 0x00, 0x00}; + socket->readDatagram(buff, 4); + auto data= QByteArray(buff,4); + char ch[4]; + for(int i=0;i<4;i++) { + ch[i] = buff[3-i]; + } + auto data2 = QByteArray(ch,4); +#ifdef Q_OS_ANDROID + std::string correct_order = "0x" + data2.toHex().toStdString(); +#else + std::string correct_order = "0x" + data2.toHex().toStdString(); +#endif + qDebug() << "Distance received: " << correct_order; + uint32_t num; + sscanf(correct_order.c_str(), "%x", &num); + float dist = *((float*)&num); + qDebug() << "Float is: " << dist; + emit datagramReceived(dist); + } +} diff --git a/udplistener.h b/udplistener.h new file mode 100644 index 0000000..0eefa61 --- /dev/null +++ b/udplistener.h @@ -0,0 +1,61 @@ +#ifndef UDPLISTENER_H +#define UDPLISTENER_H + +#include +#include +#include +#include +#include +#include +#include +#include "moving_container.h" + +class Worker: public QObject { + Q_OBJECT + QUdpSocket *socket = nullptr; +public: + explicit Worker(QObject *parent = nullptr); +signals: + void socketError(QString error); + void datagramReceived(float distance); +public slots: + void run(); +private slots: + void socketDataReceived(); +}; + +class UDPListener : public QObject +{ + Q_OBJECT + QML_ELEMENT + Q_PROPERTY(double distance READ distance WRITE setDistance NOTIFY distanceChanged FINAL) +public: + explicit UDPListener(QObject *parent = nullptr); + double distance() const; + void setDistance(double newDistance); +signals: + void showError(QString err); + void distanceChanged(); + void startWorker(); + void connected(); + void disconnected(); + void distanceReceived(double dist, QString timestamp); +public slots: + void setAlert(float distance); + void socketError(QString err); + void startService(); + void datagramRecieved(float distance); +private slots: + void destroy(); + void connectionTimerTimedOut(); +private: + QUdpSocket *command_socket = nullptr; + std::chrono::time_point prev_time_point; + average averages; + double m_distance; + Worker *worker = nullptr; + QThread *thread = nullptr; + QTimer *timer = nullptr; +}; + +#endif // UDPLISTENER_H From ea1704ca693208addd2afe9074bd3f553193f630 Mon Sep 17 00:00:00 2001 From: TheUnrealDragon Date: Wed, 1 Apr 2026 18:37:49 +0530 Subject: [PATCH 02/24] v0.0.1 --- CMakeLists.txt | 1 + README.md | 8 ++++++++ 2 files changed, 9 insertions(+) create mode 100644 README.md diff --git a/CMakeLists.txt b/CMakeLists.txt index c116d03..45891ca 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,6 +43,7 @@ qt_add_qml_module(appwaterLevelSensor SOURCES configinterface.h configinterface.cpp SOURCES udplistener.h udplistener.cpp SOURCES service.h + RESOURCES README.md ) target_link_libraries(appwaterLevelSensor PRIVATE Qt6::Quick Qt6::Network service diff --git a/README.md b/README.md new file mode 100644 index 0000000..1c024c9 --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +# Water Level Sensor + +Builds using QtCreator, use Qt Version 6.9. +Builds for android and desktop. +On Android Creates a service from service.cpp and android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java +Changes in AndroidManifest.xml are important. +On Desktop just waits for values from a UDP Broadcast on local network with port 8176 and shows those values. +On Android the service does that, and creates an alert notification if the value in broadcast is less than alert threshold. \ No newline at end of file From 2b4f09bb49efdd91f33537da15b7db5e4d69238a Mon Sep 17 00:00:00 2001 From: TheUnrealDragon Date: Wed, 1 Apr 2026 18:39:00 +0530 Subject: [PATCH 03/24] v0.0.2 --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 1c024c9..96a9151 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # Water Level Sensor -Builds using QtCreator, use Qt Version 6.9. -Builds for android and desktop. -On Android Creates a service from service.cpp and android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java -Changes in AndroidManifest.xml are important. -On Desktop just waits for values from a UDP Broadcast on local network with port 8176 and shows those values. -On Android the service does that, and creates an alert notification if the value in broadcast is less than alert threshold. \ No newline at end of file +Builds using QtCreator, use Qt Version 6.9.
+Builds for android and desktop.
+On Android Creates a service from service.cpp and android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java.
+Changes in AndroidManifest.xml are important.
+On Desktop just waits for values from a UDP Broadcast on local network with port 8176 and shows those values.
+On Android the service does that, and creates an alert notification if the value in broadcast is less than alert threshold.
\ No newline at end of file From a934520cd95dfb557044b23c3542f86ec4906b77 Mon Sep 17 00:00:00 2001 From: TheUnrealDragon Date: Fri, 3 Apr 2026 18:46:34 +0530 Subject: [PATCH 04/24] v0.0.3 --- Main.qml | 98 ++++++++++++++++++++++++++++++++++++++------- configinterface.cpp | 19 ++++++++- configinterface.h | 11 ++++- moving_container.h | 23 ++++++++++- udplistener.cpp | 55 ++++++++++++++++++------- udplistener.h | 10 +++-- 6 files changed, 180 insertions(+), 36 deletions(-) diff --git a/Main.qml b/Main.qml index 66f221e..f5dba7a 100644 --- a/Main.qml +++ b/Main.qml @@ -15,7 +15,7 @@ Window { property color water_color: "#F00F7FAF" Material.accent: root.accent_color property int font_enlarged_text_size: 20 - property int font_normal_text_size: 18 + property int font_normal_text_size: 16 property double distance: 0 property int distance_count: 0 // visibility: Window.FullScreen @@ -180,7 +180,7 @@ Window { height: max_thres_input.height verticalAlignment: Text.AlignVCenter color: root.accent_color - font.pixelSize: root.font_normal_text_size + font.pointSize: root.font_normal_text_size } TextField { @@ -192,8 +192,9 @@ Window { top: settings_label.bottom topMargin: 20 } + width: parent.width / 2 color: root.accent_color - font.pixelSize: root.font_normal_text_size + font.pointSize: root.font_normal_text_size } @@ -208,7 +209,7 @@ Window { height: min_thres_input.height verticalAlignment: Text.AlignVCenter color: root.accent_color - font.pixelSize: root.font_normal_text_size + font.pointSize: root.font_normal_text_size } TextField { @@ -220,8 +221,9 @@ Window { top: max_thres_label.bottom topMargin: 20 } + width: parent.width / 2 color: root.accent_color - font.pixelSize: root.font_normal_text_size + font.pointSize: root.font_normal_text_size } @@ -236,7 +238,7 @@ Window { height: alert_thres_input.height verticalAlignment: Text.AlignVCenter color: root.accent_color - font.pixelSize: root.font_normal_text_size + font.pointSize: root.font_normal_text_size } TextField { @@ -248,9 +250,29 @@ Window { top: min_thres_label.bottom topMargin: 20 } + width: parent.width / 2 color: root.accent_color - font.pixelSize: root.font_normal_text_size + font.pointSize: root.font_normal_text_size } + CheckBox { + id: flip_bits_box + text: "Flip Bits" + checked: config.flipBits + anchors { + topMargin: 20 + top: alert_thres_label.bottom + left: parent.left + } + width: parent.width - 20 + contentItem: Text { + text: flip_bits_box.text + font.pointSize: root.font_normal_text_size + color: root.accent_color + leftPadding: flip_bits_box.indicator.width + flip_bits_box.spacing + } + } + + Text { id: settings_error_label @@ -259,7 +281,9 @@ Window { visible: settings_error_text === "" ? false : true anchors { topMargin: 20 - top: alert_thres_label.bottom + top: flip_bits_box.bottom + bottom: flip_bits_box.top + bottomMargin: 10 left: parent.left horizontalCenter: parent.horizontalCenter } @@ -268,7 +292,52 @@ Window { font.pixelSize: root.font_normal_text_size } + Rectangle { + id: reset_averages + anchors { + topMargin: 10 + bottom: save_config.top + horizontalCenter: parent.horizontalCenter + } + color: "#F0121212" + width: parent.width / 2.5 + height: 60 + border { + width: 1 + color: root.accent_color + } + radius: 3 + Text { + anchors.centerIn: parent + text: "Reset Averages" + color: root.accent_color + font.pointSize: root.font_enlarged_text_size + } + MouseArea { + anchors.fill: parent + hoverEnabled: true + property color settings_rect_pressed_prev: "#00000000" + property color settings_rect_entered_prev: "#00000000" + onEntered: { + settings_rect_entered_prev = save_config.color + save_config.color = "#5A1F1F1F" + } + onExited: { + save_config.color = settings_rect_entered_prev + } + onPressed: { + settings_rect_pressed_prev = save_config.color + save_config.color = "#5A1F4F1F" + settings_popup.close(); + listener.resetAverages(); + } + onReleased: { + save_config.color = settings_rect_pressed_prev + } + } + + } Rectangle { id: save_config @@ -310,7 +379,8 @@ Window { let max = parseFloat(min_thres_input.text); let min = parseFloat(min_thres_input.text); let alert = parseFloat(alert_thres_input.text); - console.log("Parsed values:", max, min, alert); + let flipBits = flip_bits_box.checked; + console.log("Parsed values:", max, min, alert, flip_bits_box.checked); if(max < min) { settings_error_label.settings_error_text = "Max cannot be less than min"; return; @@ -319,20 +389,19 @@ Window { settings_error_label.settings_error_text = "Alert must be between 0 to 100"; return; } - - let current_min_reading = Math.max(0, (parseFloat(min_thres_input.text))); let effective_max_reading = Math.max(0, (parseFloat(max_thres_input.text)) - current_min_reading); let alert_effective_reading = (effective_max_reading * (100 - alert) / 100) + current_min_reading; console.log("Alert effective reading is: " + alert_effective_reading + " for value: " + alert); - listener.setAlert(alert_effective_reading); - config.saveConfig(max_thres_input.text, min_thres_input.text, alert_thres_input.text); + listener.setConfig(alert_effective_reading, flipBits); + config.saveConfig(max_thres_input.text, min_thres_input.text, alert_thres_input.text, flip_bits_box.checked); settings_popup.close(); } onReleased: { save_config.color = settings_rect_pressed_prev } } + } } } @@ -507,7 +576,8 @@ Window { let alert = parseFloat(alert_thres_input.text); let alert_effective_reading = (effective_max_reading * (100 - alert) / 100) + current_min_reading; console.log("Alert effective reading is: " + alert_effective_reading + " for value: " + alert); - listener.setAlert(alert_effective_reading); + + listener.setConfig(alert_effective_reading, flip_bits_box.checked); } distance_count += 1; diff --git a/configinterface.cpp b/configinterface.cpp index 563cf68..549b9f5 100644 --- a/configinterface.cpp +++ b/configinterface.cpp @@ -22,12 +22,15 @@ ConfigInterface::ConfigInterface(QObject *parent) config.close(); QJsonObject top = QJsonDocument::fromJson(data).object(); QString max, min, alert; + bool flipbits; max = top["max_threshold"].toString(); min = top["min_threshold"].toString(); alert = top["alert_threshold"].toString(); + flipbits = top["flip_bits"].toBool(); setMax(max); setMin(min); setAlert(alert); + setFlipBits(flipbits); } else { qDebug() << "File does not exist creating one..."; @@ -47,7 +50,7 @@ ConfigInterface::ConfigInterface(QObject *parent) } } -void ConfigInterface::saveConfig(QString max, QString min, QString alert) +void ConfigInterface::saveConfig(QString max, QString min, QString alert, bool flipbits) { auto paths = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); qDebug() << "Got writable path as: " << paths; @@ -58,6 +61,7 @@ void ConfigInterface::saveConfig(QString max, QString min, QString alert) top["max_threshold"] = max; top["min_threshold"] = min; top["alert_threshold"] = alert; + top["flip_bits"] = flipbits; setMax(max); setMin(min); setAlert(alert); @@ -106,3 +110,16 @@ void ConfigInterface::setMin(const QString &newMin) m_min = newMin; emit minChanged(); } + +bool ConfigInterface::flipBits() const +{ + return m_flipBits; +} + +void ConfigInterface::setFlipBits(bool newFlipBits) +{ + if (m_flipBits == newFlipBits) + return; + m_flipBits = newFlipBits; + emit flipBitsChanged(); +} diff --git a/configinterface.h b/configinterface.h index edf60ee..3cada7a 100644 --- a/configinterface.h +++ b/configinterface.h @@ -17,6 +17,7 @@ class ConfigInterface : public QObject Q_PROPERTY(QString min READ min WRITE setMin NOTIFY minChanged FINAL) Q_PROPERTY(QString max READ max WRITE setMax NOTIFY maxChanged FINAL) Q_PROPERTY(QString alert READ alert WRITE setAlert NOTIFY alertChanged FINAL) + Q_PROPERTY(bool flipBits READ flipBits WRITE setFlipBits NOTIFY flipBitsChanged FINAL) public: explicit ConfigInterface(QObject *parent = nullptr); QString alert() const; @@ -28,18 +29,24 @@ public: QString min() const; void setMin(const QString &newMin); + bool flipBits() const; + void setFlipBits(bool newFlipBits); + signals: - void configData(QString max, QString min, QString alert); + void configData(QString max, QString min, QString alert, bool flipbits); void alertChanged(); void maxChanged(); void minChanged(); + void flipBitsChanged(); + public slots: - void saveConfig(QString max, QString min, QString alert); + void saveConfig(QString max, QString min, QString alert, bool flipbits); private: QString m_alert; QString m_max; QString m_min; + bool m_flipBits; }; #endif // CONFIGINTERFACE_H diff --git a/moving_container.h b/moving_container.h index 89a1cf0..f02c38f 100644 --- a/moving_container.h +++ b/moving_container.h @@ -1,7 +1,7 @@ #ifndef MOVING_CONTAINER #define MOVING_CONTAINER - +#include using ld = long double; template class average { @@ -21,11 +21,16 @@ public: ~average() { curr = head; + if(!curr) + return; while(curr != nullptr) { info *now = curr; curr = curr->next; delete now; } + curr = nullptr; + head = nullptr; + tail = nullptr; } unsigned int size() { @@ -36,6 +41,22 @@ public: return this->avg; } + void clear() { + curr = head; + if(!curr) + return; + while(curr != nullptr) { + info *now = curr; + curr = curr->next; + delete now; + } + qDebug() << "Clearing"; + curr = nullptr; + head = nullptr; + tail = nullptr; + count = 0; + } + void recalculate_average() { curr = head; this->avg = 0; diff --git a/udplistener.cpp b/udplistener.cpp index 4978794..7323bef 100644 --- a/udplistener.cpp +++ b/udplistener.cpp @@ -39,8 +39,19 @@ void UDPListener::setDistance(double newDistance) emit distanceChanged(); } -void UDPListener::setAlert(float distance) +void UDPListener::resetAverages() { + averages.clear(); +} + +void UDPListener::setFlipBits(bool flip_bits) +{ + m_flip_bits = flip_bits; +} + +void UDPListener::setConfig(float distance, bool flip_bits) +{ + setFlipBits(flip_bits); if(!command_socket) { command_socket = new QUdpSocket(this); bool bind = command_socket->bind(8181); @@ -57,6 +68,7 @@ void UDPListener::setAlert(float distance) command_socket->close(); } } + averages.clear(); } void UDPListener::socketError(QString err) @@ -73,12 +85,25 @@ void UDPListener::startService() } -void UDPListener::datagramRecieved(float distance) +void UDPListener::datagramRecieved(QByteArray data1, QByteArray data2) { - qDebug() << "Data received in main class: " << distance; - averages.push_back(distance); + std::string correct_order = ""; +#ifdef Q_OS_ANDROID + if(!m_flip_bits) + correct_order = "0x" + data2.toHex().toStdString(); + else + correct_order = "0x" + data1.toHex().toStdString(); +#else + if(!m_flip_bits) + correct_order = "0x" + data1.toHex().toStdString(); + else + correct_order = "0x" + data2.toHex().toStdString(); +#endif + float data = convertToFloat(correct_order); + qDebug() << "Data received in main class: " << data; + averages.push_back(data); prev_time_point = std::chrono::high_resolution_clock::now(); - emit distanceReceived(distance, QDateTime::currentDateTime().toString("dd/mm/yyyy hh:mm:ss.z ap")); + emit distanceReceived(data, QDateTime::currentDateTime().toString("dd/mm/yyyy hh:mm:ss.z ap")); if(averages.size() >= 5) { this->m_distance = averages.get_average(); emit distanceChanged(); @@ -111,6 +136,14 @@ void UDPListener::connectionTimerTimedOut() } } +float UDPListener::convertToFloat(std::string hex) +{ + uint32_t num; + sscanf(hex.c_str(), "%x", &num); + float dist = *((float*)&num); + return dist; +} + Worker::Worker(QObject *parent) { @@ -146,16 +179,8 @@ void Worker::socketDataReceived() ch[i] = buff[3-i]; } auto data2 = QByteArray(ch,4); -#ifdef Q_OS_ANDROID - std::string correct_order = "0x" + data2.toHex().toStdString(); -#else - std::string correct_order = "0x" + data2.toHex().toStdString(); -#endif + std::string correct_order = ""; qDebug() << "Distance received: " << correct_order; - uint32_t num; - sscanf(correct_order.c_str(), "%x", &num); - float dist = *((float*)&num); - qDebug() << "Float is: " << dist; - emit datagramReceived(dist); + emit datagramReceived(data, data2); } } diff --git a/udplistener.h b/udplistener.h index 0eefa61..5a4858d 100644 --- a/udplistener.h +++ b/udplistener.h @@ -17,7 +17,7 @@ public: explicit Worker(QObject *parent = nullptr); signals: void socketError(QString error); - void datagramReceived(float distance); + void datagramReceived(QByteArray data, QByteArray data2); public slots: void run(); private slots: @@ -41,13 +41,16 @@ signals: void disconnected(); void distanceReceived(double dist, QString timestamp); public slots: - void setAlert(float distance); + void resetAverages(); + void setFlipBits(bool flip_bits); + void setConfig(float distance, bool flip_bits); void socketError(QString err); void startService(); - void datagramRecieved(float distance); + void datagramRecieved(QByteArray data, QByteArray data2); private slots: void destroy(); void connectionTimerTimedOut(); + float convertToFloat(std::string hex); private: QUdpSocket *command_socket = nullptr; std::chrono::time_point prev_time_point; @@ -56,6 +59,7 @@ private: Worker *worker = nullptr; QThread *thread = nullptr; QTimer *timer = nullptr; + bool m_flip_bits; }; #endif // UDPLISTENER_H From aaccb27f225d5701c8fff13af2c46f418961b545 Mon Sep 17 00:00:00 2001 From: TheUnrealDragon Date: Sat, 4 Apr 2026 12:24:03 +0530 Subject: [PATCH 05/24] v0.0.4 --- Main.qml | 50 +++++++++++-------- .../WaterLevelService.java | 7 ++- moving_container.h | 1 - 3 files changed, 35 insertions(+), 23 deletions(-) diff --git a/Main.qml b/Main.qml index f5dba7a..414d6cb 100644 --- a/Main.qml +++ b/Main.qml @@ -6,7 +6,7 @@ import QtQuick.Controls.Material Window { width: 640 - height: 480 + height: 1080 visible: true title: qsTr("Hello World") id: root @@ -19,6 +19,11 @@ Window { property double distance: 0 property int distance_count: 0 // visibility: Window.FullScreen + Component.onCompleted: { + if(Qt.platform.os !== "android") { + } + } + Rectangle { anchors.fill: parent id: background @@ -176,6 +181,7 @@ Window { topMargin: 20 top: settings_label.bottom left: parent.left + verticalCenter: max_thres_input.verticalCenter } height: max_thres_input.height verticalAlignment: Text.AlignVCenter @@ -187,8 +193,8 @@ Window { id: max_thres_input text: config.max anchors { - left: max_thres_label.right - leftMargin: 5 + right: parent.right + rightMargin: 5 top: settings_label.bottom topMargin: 20 } @@ -205,6 +211,7 @@ Window { topMargin: 20 top: max_thres_label.bottom left: parent.left + verticalCenter: min_thres_input.verticalCenter } height: min_thres_input.height verticalAlignment: Text.AlignVCenter @@ -216,8 +223,8 @@ Window { id: min_thres_input text: config.min anchors { - left: min_thres_label.right - leftMargin: 5 + right: parent.right + rightMargin: 5 top: max_thres_label.bottom topMargin: 20 } @@ -234,6 +241,7 @@ Window { topMargin: 20 top: min_thres_label.bottom left: parent.left + verticalCenter: alert_thres_input.verticalCenter } height: alert_thres_input.height verticalAlignment: Text.AlignVCenter @@ -245,8 +253,8 @@ Window { id: alert_thres_input text: config.alert anchors { - left: alert_thres_label.right - leftMargin: 5 + right: parent.right + rightMargin: 5 top: min_thres_label.bottom topMargin: 20 } @@ -261,9 +269,8 @@ Window { anchors { topMargin: 20 top: alert_thres_label.bottom - left: parent.left + horizontalCenter: parent.horizontalCenter } - width: parent.width - 20 contentItem: Text { text: flip_bits_box.text font.pointSize: root.font_normal_text_size @@ -297,10 +304,11 @@ Window { anchors { topMargin: 10 bottom: save_config.top + bottomMargin: 10 horizontalCenter: parent.horizontalCenter } color: "#F0121212" - width: parent.width / 2.5 + width: parent.width / 1.3 height: 60 border { width: 1 @@ -320,20 +328,19 @@ Window { property color settings_rect_pressed_prev: "#00000000" property color settings_rect_entered_prev: "#00000000" onEntered: { - settings_rect_entered_prev = save_config.color - save_config.color = "#5A1F1F1F" + settings_rect_entered_prev = reset_averages.color + reset_averages.color = "#5A1F1F1F" } onExited: { - save_config.color = settings_rect_entered_prev + reset_averages.color = settings_rect_entered_prev } onPressed: { - settings_rect_pressed_prev = save_config.color - save_config.color = "#5A1F4F1F" - settings_popup.close(); + settings_rect_pressed_prev = reset_averages.color + reset_averages.color = "#5A1F4F1F" listener.resetAverages(); } onReleased: { - save_config.color = settings_rect_pressed_prev + reset_averages.color = settings_rect_pressed_prev } } @@ -347,7 +354,7 @@ Window { horizontalCenter: parent.horizontalCenter } color: "#F0121212" - width: parent.width / 2.5 + width: parent.width / 1.3 height: 60 border { width: 1 @@ -423,7 +430,7 @@ Window { id: tank_base color: "#0FFFFFFF" anchors.centerIn: parent - width: parent.width / 2.5 + width: parent.width / 2 height: parent.height / 2 border.color: "#F0121212" border.width: 5 @@ -593,7 +600,10 @@ Window { } function dataBlink() { - let old_color = status_indicator.color; + if(status_indicator_timer.running) { + status_indicator_timer.stop(); + } + let old_color = "#F05F5F0F"; let new_color = "#F04FAF5F"; status_indicator.color = new_color; status_indicator.old_color = old_color; diff --git a/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java b/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java index c868acc..9f43a9a 100644 --- a/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java +++ b/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java @@ -103,7 +103,7 @@ public class WaterLevelService extends Service { else { Instant currentTimestamp = Instant.now(); Duration duration = Duration.between(prevAlertTimestamp, currentTimestamp); - if(duration.toMinutes() > 30) { + if(duration.toMinutes() > 60) { duration_passed = true; } prevAlertTimestamp = currentTimestamp; @@ -113,9 +113,12 @@ public class WaterLevelService extends Service { .setSmallIcon(android.R.drawable.ic_dialog_alert) .setContentTitle("Water Level Sensor") .setContentText("Water Level is below alert threshold") - .setPriority(Notification.PRIORITY_HIGH); + .setPriority(Notification.PRIORITY_LOW); manager.notify(2, builder.build()); Log.d("UDP Service", "Notification sent"); + if(!started) { + started = true; + } } DatagramPacket send_packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName("localhost"), 8180); socket_send.send(send_packet); diff --git a/moving_container.h b/moving_container.h index f02c38f..966bce8 100644 --- a/moving_container.h +++ b/moving_container.h @@ -50,7 +50,6 @@ public: curr = curr->next; delete now; } - qDebug() << "Clearing"; curr = nullptr; head = nullptr; tail = nullptr; From a784bd6549e2a89585cfaaa357e14867265bb6a0 Mon Sep 17 00:00:00 2001 From: TheUnrealDragon Date: Thu, 9 Apr 2026 13:03:24 +0530 Subject: [PATCH 06/24] v0.0.5 --- android/AndroidManifest.xml | 8 +++--- .../WaterLevelService.java | 23 ++++++++++++--- udplistener.cpp | 28 ++++++++++++++++++- udplistener.h | 5 ++++ 4 files changed, 55 insertions(+), 9 deletions(-) diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index d31ff4c..7c065f1 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -11,7 +11,7 @@ - + - + diff --git a/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java b/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java index 9f43a9a..641d174 100644 --- a/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java +++ b/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java @@ -65,9 +65,10 @@ public class WaterLevelService extends Service { @Override public void run() { - Log.d("UDP Service", "Thread initialising"); + Log.d("UDP Service", "Client Thread initialising"); android.net.wifi.WifiManager wifi = (android.net.wifi.WifiManager) getSystemService(Context.WIFI_SERVICE); android.net.wifi.WifiManager.MulticastLock multicastLock = wifi.createMulticastLock("water_level_lock"); + android.net.wifi.WifiManager.WifiLock wifiLock = wifi.createWifiLock(android.net.wifi.WifiManager.WIFI_MODE_FULL_HIGH_PERF, "WaterLevel:WifiLock"); android.os.PowerManager pm = (android.os.PowerManager) getSystemService(Context.POWER_SERVICE); android.os.PowerManager.WakeLock wakeLock = pm.newWakeLock(android.os.PowerManager.PARTIAL_WAKE_LOCK, "WaterLevel:WakeLock"); @@ -84,14 +85,26 @@ public class WaterLevelService extends Service { try { multicastLock.acquire(); wakeLock.acquire(); - socket_recv = new DatagramSocket(8176); + wifiLock.acquire(); + socket_recv = new DatagramSocket(8176, InetAddress.getByName("0.0.0.0")); socket_send = new DatagramSocket(8177); socket_recv.setBroadcast(true); + socket_recv.setSoTimeout(4000); Log.d("UDP Service", "Created Sockets"); + int count = 0; while (!Thread.currentThread().isInterrupted()) { + count++; + if(count == 3) { + Log.i("UDP Service", "Thread is running"); + count = 0; + } byte[] buffer = new byte[4]; - DatagramPacket packet = new DatagramPacket(buffer, buffer.length); - socket_recv.receive(packet); + try { + DatagramPacket packet = new DatagramPacket(buffer, buffer.length); + socket_recv.receive(packet); + } catch(java.net.SocketTimeoutException e) { + continue; + } float f = ByteBuffer.wrap(buffer).order(ByteOrder.LITTLE_ENDIAN).getFloat(); Log.d("UDP Service ", "Received packet: " + f); Log.d("UDP Service ", "Threshold is: " + alert_thres_distance); @@ -128,6 +141,8 @@ public class WaterLevelService extends Service { catch (IOException e) { Log.e("UDP Service", "Socket Error", e); } finally { + if (wifiLock.isHeld()) + wifiLock.release(); if (multicastLock.isHeld()) multicastLock.release(); if (wakeLock.isHeld()) diff --git a/udplistener.cpp b/udplistener.cpp index 7323bef..1668465 100644 --- a/udplistener.cpp +++ b/udplistener.cpp @@ -39,6 +39,11 @@ void UDPListener::setDistance(double newDistance) emit distanceChanged(); } +void UDPListener::continueDestruction() +{ + destroyed = true; +} + void UDPListener::resetAverages() { averages.clear(); @@ -117,10 +122,24 @@ void UDPListener::destroy() { qDebug() << "Destroying UDP Listener"; timer->stop(); + connect(this, &UDPListener::stopWorker, worker, &Worker::stop); + connect(worker, &Worker::stopped, this, &UDPListener::continueDestruction); + emit stopWorker(); + while(!destroyed) { + QCoreApplication::processEvents(); + } thread->exit(0); - thread->deleteLater(); + QCoreApplication::processEvents(); + QCoreApplication::processEvents(); worker->deleteLater(); + QCoreApplication::processEvents(); + QCoreApplication::processEvents(); + thread->deleteLater(); + QCoreApplication::processEvents(); + QCoreApplication::processEvents(); timer->deleteLater(); + QCoreApplication::processEvents(); + QCoreApplication::processEvents(); qDebug() << "Deinitialized UDP Listener"; } @@ -149,6 +168,13 @@ Worker::Worker(QObject *parent) } +void Worker::stop() +{ + disconnect(socket, nullptr, nullptr, nullptr); + delete socket; + emit stopped(); +} + void Worker::run() { using namespace std::chrono_literals; diff --git a/udplistener.h b/udplistener.h index 5a4858d..b6cebd9 100644 --- a/udplistener.h +++ b/udplistener.h @@ -16,9 +16,11 @@ class Worker: public QObject { public: explicit Worker(QObject *parent = nullptr); signals: + void stopped(); void socketError(QString error); void datagramReceived(QByteArray data, QByteArray data2); public slots: + void stop(); void run(); private slots: void socketDataReceived(); @@ -29,11 +31,13 @@ class UDPListener : public QObject Q_OBJECT QML_ELEMENT Q_PROPERTY(double distance READ distance WRITE setDistance NOTIFY distanceChanged FINAL) + bool destroyed = false; public: explicit UDPListener(QObject *parent = nullptr); double distance() const; void setDistance(double newDistance); signals: + void stopWorker(); void showError(QString err); void distanceChanged(); void startWorker(); @@ -41,6 +45,7 @@ signals: void disconnected(); void distanceReceived(double dist, QString timestamp); public slots: + void continueDestruction(); void resetAverages(); void setFlipBits(bool flip_bits); void setConfig(float distance, bool flip_bits); From 26d3fce10a661c1aa827eb85229a850235b46b87 Mon Sep 17 00:00:00 2001 From: TheUnrealDragon Date: Thu, 9 Apr 2026 14:26:21 +0530 Subject: [PATCH 07/24] v0.0.6 --- Main.qml | 4 +++- .../WaterLevelService.java | 23 +++++++++++++++++-- udplistener.cpp | 19 +++++++++++---- 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/Main.qml b/Main.qml index 414d6cb..3c6831a 100644 --- a/Main.qml +++ b/Main.qml @@ -554,7 +554,9 @@ Window { else { water_level.color = root.water_color; } - + if(root.distance_count > 1000) { + root.distance_count = 5; + } console.log("Current reading is: " + current_reading) console.log("Normalized height is: " + normalized_height) water_level.current_level = normalized_height; diff --git a/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java b/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java index 641d174..8d2c64e 100644 --- a/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java +++ b/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java @@ -23,6 +23,7 @@ import java.time.Duration; public class WaterLevelService extends Service { private static float alert_thres_distance = 1000000; + private boolean bits_flipped = false; public class UDPCommandClient implements Runnable { private DatagramSocket socket_cmd_recv; @@ -40,13 +41,25 @@ public class WaterLevelService extends Service { DatagramPacket packet = new DatagramPacket(buffer, buffer.length); socket_cmd_recv.receive(packet); String str = new String(buffer, StandardCharsets.UTF_8); + Log.d("UDP Service ", "Received command packet " + str); if(str.startsWith("", ""); alert_thres_distance = Float.parseFloat(str); } - Log.d("UDP Service ", "Received command packet " + str); + else if(str.startsWith("", ""); + Log.d("UDP Service ", "Flipping " + str); + if(str.toLowerCase() == "false") { + bits_flipped = false; + } + else if(str.toLowerCase() == "true") { + bits_flipped = true; + } + } } } @@ -105,7 +118,13 @@ public class WaterLevelService extends Service { } catch(java.net.SocketTimeoutException e) { continue; } - float f = ByteBuffer.wrap(buffer).order(ByteOrder.LITTLE_ENDIAN).getFloat(); + float f; + if(bits_flipped) { + f = ByteBuffer.wrap(buffer).order(ByteOrder.LITTLE_ENDIAN).getFloat(); + } + else { + f = ByteBuffer.wrap(buffer).order(ByteOrder.BIG_ENDIAN).getFloat(); + } Log.d("UDP Service ", "Received packet: " + f); Log.d("UDP Service ", "Threshold is: " + alert_thres_distance); boolean duration_passed = false; diff --git a/udplistener.cpp b/udplistener.cpp index 1668465..bbf4927 100644 --- a/udplistener.cpp +++ b/udplistener.cpp @@ -61,16 +61,27 @@ void UDPListener::setConfig(float distance, bool flip_bits) command_socket = new QUdpSocket(this); bool bind = command_socket->bind(8181); if(bind) { - QNetworkDatagram data; - data.setDestination(QHostAddress::LocalHost, 8178); + QNetworkDatagram data1, data2; + data1.setDestination(QHostAddress::LocalHost, 8178); + data2.setDestination(QHostAddress::LocalHost, 8178); + QString s_data = ""; while(s_data.toUtf8().size() != 1024) { s_data += "="; } - data.setData(s_data.toUtf8()); - command_socket->writeDatagram(data); + data1.setData(s_data.toUtf8()); + command_socket->writeDatagram(data1); + command_socket->flush(); + QString b_data = ""; + while(b_data.toUtf8().size() != 1024) { + b_data += "="; + } + data2.setData(b_data.toUtf8()); + command_socket->writeDatagram(data2); command_socket->flush(); command_socket->close(); + command_socket->deleteLater(); + command_socket = nullptr; } } averages.clear(); From 984c5acaccf6235308c54fb0ca811232425d8bae Mon Sep 17 00:00:00 2001 From: TheUnrealDragon Date: Mon, 13 Apr 2026 17:49:08 +0530 Subject: [PATCH 08/24] v0.0.7 --- CMakeLists.txt | 13 ++ Main.qml | 130 ++++++++++++++++-- .../WaterLevelService.java | 79 ++++++++++- configinterface.cpp | 47 ++++++- configinterface.h | 17 ++- udplistener.cpp | 111 +++++++++++++-- udplistener.h | 16 ++- 7 files changed, 376 insertions(+), 37 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 45891ca..ddebcab 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,10 +16,22 @@ qt_add_executable(appwaterLevelSensor if(ANDROID) + +include(FetchContent) +FetchContent_Declare( + android_openssl + DOWNLOAD_EXTRACT_TIMESTAMP true + URL https://github.com/KDAB/android_openssl/archive/refs/heads/master.zip +) +FetchContent_MakeAvailable(android_openssl) +include(${android_openssl_SOURCE_DIR}/android_openssl.cmake) + qt_add_library(service SHARED servicemain.cpp service.h service.cpp ) + + set_property(TARGET appwaterLevelSensor APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/android) set_property(TARGET service APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR @@ -45,6 +57,7 @@ qt_add_qml_module(appwaterLevelSensor SOURCES service.h RESOURCES README.md ) +add_android_openssl_libraries(service appwaterLevelSensor) target_link_libraries(appwaterLevelSensor PRIVATE Qt6::Quick Qt6::Network service ) diff --git a/Main.qml b/Main.qml index 3c6831a..e66168e 100644 --- a/Main.qml +++ b/Main.qml @@ -11,6 +11,7 @@ Window { title: qsTr("Hello World") id: root property color accent_color: "#F05FAF5F" + property color dark_accent_color: "#FF5F7F5F" property color danger_color: "#F0AF2F1F" property color water_color: "#F00F7FAF" Material.accent: root.accent_color @@ -18,6 +19,7 @@ Window { property int font_normal_text_size: 16 property double distance: 0 property int distance_count: 0 + property string mode: "http" // visibility: Window.FullScreen Component.onCompleted: { if(Qt.platform.os !== "android") { @@ -150,8 +152,8 @@ Window { border.color: root.accent_color border.width: 1 } - height: parent.height / 1.5 - width: parent.width / 1.5 + height: parent.height / 1.2 + width: parent.width / 1.1 anchors.centerIn: Overlay.overlay @@ -279,7 +281,95 @@ Window { } } + Text { + id: settings_mode_text + anchors { + topMargin: 20 + top: flip_bits_box.bottom + left: parent.left + } + font.pointSize: root.font_normal_text_size + color: root.accent_color + text: "Mode: " + } + Row { + id: mode_row + anchors { + left: settings_mode_text.right + right: parent.right + verticalCenter: settings_mode_text.verticalCenter + leftMargin: 10 + } + RadioButton { + id: udp_radio_button + checked: config.mode === "udp" ? true : false + text: "UDP" + font.pointSize: root.font_normal_text_size + contentItem: Text { + text: udp_radio_button.text + font: udp_radio_button.font + opacity: enabled ? 1.0 : 0.3 + color: udp_radio_button.down ? root.dark_accent_color : root.accent_color + verticalAlignment: Text.AlignVCenter + leftPadding: udp_radio_button.indicator.width + udp_radio_button.spacing + } + onCheckedChanged: { + if(checked) { + root.mode = "udp"; + } + } + } + RadioButton { + id: http_radio_button + checked: config.mode === "http" ? true : false + text: "HTTP" + font.pointSize: root.font_normal_text_size + contentItem: Text { + text: http_radio_button.text + font: http_radio_button.font + opacity: enabled ? 1.0 : 0.3 + color: http_radio_button.down ? root.dark_accent_color : root.accent_color + verticalAlignment: Text.AlignVCenter + leftPadding: http_radio_button.indicator.width + http_radio_button.spacing + } + onCheckedChanged: { + if(checked) { + root.mode = "http"; + } + } + } + } + Text { + id: http_url_label + text: "Url: " + anchors { + topMargin: 20 + top: settings_mode_text.bottom + left: parent.left + verticalCenter: http_url_input.verticalCenter + } + height: http_url_input.height + verticalAlignment: Text.AlignVCenter + color: root.accent_color + font.pointSize: root.font_normal_text_size + } + TextField { + id: http_url_input + text: config.url + anchors { + right: parent.right + rightMargin: 20 + leftMargin: 20 + top: mode_row.bottom + topMargin: 20 + } + enabled: root.mode === "http" ? true : false + width: Math.max(parent.width / 2, parent.width - http_url_label.width - anchors.leftMargin) + color: root.accent_color + font.pointSize: root.font_normal_text_size + cursorPosition: 0 + } Text { id: settings_error_label @@ -288,8 +378,8 @@ Window { visible: settings_error_text === "" ? false : true anchors { topMargin: 20 - top: flip_bits_box.bottom - bottom: flip_bits_box.top + top: http_url_label.bottom + bottom: reset_averages.top bottomMargin: 10 left: parent.left horizontalCenter: parent.horizontalCenter @@ -387,6 +477,8 @@ Window { let min = parseFloat(min_thres_input.text); let alert = parseFloat(alert_thres_input.text); let flipBits = flip_bits_box.checked; + let mode = root.mode; + let url = http_url_input.text; console.log("Parsed values:", max, min, alert, flip_bits_box.checked); if(max < min) { settings_error_label.settings_error_text = "Max cannot be less than min"; @@ -400,8 +492,8 @@ Window { let effective_max_reading = Math.max(0, (parseFloat(max_thres_input.text)) - current_min_reading); let alert_effective_reading = (effective_max_reading * (100 - alert) / 100) + current_min_reading; console.log("Alert effective reading is: " + alert_effective_reading + " for value: " + alert); - listener.setConfig(alert_effective_reading, flipBits); - config.saveConfig(max_thres_input.text, min_thres_input.text, alert_thres_input.text, flip_bits_box.checked); + listener.setConfig(alert_effective_reading, flipBits, mode, url); + config.saveConfig(max_thres_input.text, min_thres_input.text, alert_thres_input.text, flip_bits_box.checked, mode, url); settings_popup.close(); } onReleased: { @@ -520,11 +612,30 @@ Window { ConfigInterface { id: config - onConfigData: (max, min, alert) => { - console.log("Got config data as: ", max, min, alert); + onConfigData: (max, min, alert, mode, url) => { + console.log("Got config data as: ", max, min, alert, mode, url); + } + onModeChanged: { + root.mode = mode; } } + Timer { + id: init_timer + running: true + repeat: false + interval: 1000 + onTriggered: { + console.log("Timer triggered saving config, hope everything is loaded by now"); + let current_min_reading = Math.max(0, (parseFloat(min_thres_input.text))); + let effective_max_reading = Math.max(0, (parseFloat(max_thres_input.text)) - current_min_reading); + let alert = parseFloat(alert_thres_input.text); + let alert_effective_reading = (effective_max_reading * (100 - alert) / 100) + current_min_reading; + console.log("Setting initial configs: ", alert_effective_reading, config.flipBits , config.mode, config.url); + listener.setConfig(alert_effective_reading, config.flipBits , config.mode, config.url); + http_url_input.cursorPosition = 0; + } + } UDPListener { id: listener @@ -585,8 +696,7 @@ Window { let alert = parseFloat(alert_thres_input.text); let alert_effective_reading = (effective_max_reading * (100 - alert) / 100) + current_min_reading; console.log("Alert effective reading is: " + alert_effective_reading + " for value: " + alert); - - listener.setConfig(alert_effective_reading, flip_bits_box.checked); + listener.setConfig(alert_effective_reading, flip_bits_box.checked, root.mode, http_url_input.text); } distance_count += 1; diff --git a/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java b/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java index 8d2c64e..a1becb2 100644 --- a/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java +++ b/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java @@ -19,11 +19,18 @@ import org.qtproject.qt.android.bindings.QtActivity; import android.app.Service; import java.time.Instant; import java.time.Duration; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import org.json.JSONException; +import org.json.JSONObject; +import org.json.JSONArray; public class WaterLevelService extends Service { private static float alert_thres_distance = 1000000; private boolean bits_flipped = false; + private String mode = ""; + private String url = ""; public class UDPCommandClient implements Runnable { private DatagramSocket socket_cmd_recv; @@ -60,7 +67,20 @@ public class WaterLevelService extends Service { bits_flipped = true; } } - + else if(str.startsWith("", ""); + Log.d("UDP Service ", "Mode " + str); + mode = str.toLowerCase(); + } + else if(str.startsWith("", ""); + Log.d("UDP Service ", "Url " + str); + url = str.toLowerCase(); + } } } catch (IOException e) { @@ -108,14 +128,59 @@ public class WaterLevelService extends Service { while (!Thread.currentThread().isInterrupted()) { count++; if(count == 3) { - Log.i("UDP Service", "Thread is running"); + Log.i("UDP Service", "Thread is running with mode: " + mode); count = 0; } - byte[] buffer = new byte[4]; - try { - DatagramPacket packet = new DatagramPacket(buffer, buffer.length); - socket_recv.receive(packet); - } catch(java.net.SocketTimeoutException e) { + byte[] buffer = null; + if(mode.equals("udp")) { + try { + buffer = new byte[4]; + DatagramPacket packet = new DatagramPacket(buffer, buffer.length); + socket_recv.receive(packet); + } catch(java.net.SocketTimeoutException e) { + continue; + } + } + else if(mode.equals("http")) { + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + continue; + } + Log.d("UDP Service", "Http String Url: " + url); + URL t_url = new URL(url); + HttpURLConnection con = (HttpURLConnection) t_url.openConnection(); + con.setRequestMethod("GET"); + con.setConnectTimeout(5000); + con.setReadTimeout(5000); + con.setInstanceFollowRedirects(true); + int status = con.getResponseCode(); + Log.d("UDP Service", "Got status from http: " + status); + if(status == 200) { + BufferedReader streamReader = new BufferedReader(new InputStreamReader(con.getInputStream())); + String data = streamReader.readLine(); + try { + JSONObject obj = new JSONObject(data); + JSONArray arr = obj.getJSONArray("water_level"); + float f = (float ) arr.getDouble(0); + buffer = ByteBuffer.allocate(4).putFloat(f).array(); + Log.d("UDP Service", "Got value from http: " + f); + } catch (JSONException e) { + Log.e("UDP Service", "Invalid Json"); + } + } + else { + InputStreamReader streamReader = new InputStreamReader(con.getErrorStream()); + continue; + } + } + else { + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + continue; + } + Log.d("UDP Service", "Invalid mode: " + mode); continue; } float f; diff --git a/configinterface.cpp b/configinterface.cpp index 549b9f5..dcadda1 100644 --- a/configinterface.cpp +++ b/configinterface.cpp @@ -21,16 +21,20 @@ ConfigInterface::ConfigInterface(QObject *parent) auto data = config.readAll(); config.close(); QJsonObject top = QJsonDocument::fromJson(data).object(); - QString max, min, alert; + QString max, min, alert, mode, url; bool flipbits; max = top["max_threshold"].toString(); min = top["min_threshold"].toString(); alert = top["alert_threshold"].toString(); flipbits = top["flip_bits"].toBool(); + mode = top["mode"].toString(); + url = top["url"].toString(); setMax(max); setMin(min); setAlert(alert); setFlipBits(flipbits); + setMode(mode); + setUrl(url); } else { qDebug() << "File does not exist creating one..."; @@ -38,6 +42,9 @@ ConfigInterface::ConfigInterface(QObject *parent) top["max_threshold"] = "125"; top["min_threshold"] = "25"; top["alert_threshold"] = "100"; + top["flip_bits"] = true; + top["mode"] = "http"; + top["url"] = "https://unrealdragon.in/server/waterlevel"; QByteArray data = QJsonDocument(top).toJson(); bool ok = config.open(QFile::WriteOnly); if(!ok) { @@ -47,10 +54,17 @@ ConfigInterface::ConfigInterface(QObject *parent) config.write(data); config.flush(); config.close(); + setMax("125"); + setMin("25"); + setAlert("100"); + setFlipBits(true); + setMode("http"); + setUrl("https://unrealdragon.in/server/waterlevel"); + qDebug() << "Config set initial values completed"; } } -void ConfigInterface::saveConfig(QString max, QString min, QString alert, bool flipbits) +void ConfigInterface::saveConfig(QString max, QString min, QString alert, bool flipbits, QString mode, QString url) { auto paths = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); qDebug() << "Got writable path as: " << paths; @@ -62,9 +76,12 @@ void ConfigInterface::saveConfig(QString max, QString min, QString alert, bool f top["min_threshold"] = min; top["alert_threshold"] = alert; top["flip_bits"] = flipbits; + top["mode"] = mode; + top["url"] = url; setMax(max); setMin(min); setAlert(alert); + setMode(mode); QByteArray data = QJsonDocument(top).toJson(); config.open(QIODevice::WriteOnly); config.write(data); @@ -123,3 +140,29 @@ void ConfigInterface::setFlipBits(bool newFlipBits) m_flipBits = newFlipBits; emit flipBitsChanged(); } + +QString ConfigInterface::mode() const +{ + return m_mode; +} + +void ConfigInterface::setMode(const QString &newMode) +{ + if (m_mode == newMode) + return; + m_mode = newMode; + emit modeChanged(); +} + +QString ConfigInterface::url() const +{ + return m_url; +} + +void ConfigInterface::setUrl(const QString &newUrl) +{ + if (m_url == newUrl) + return; + m_url = newUrl; + emit urlChanged(); +} diff --git a/configinterface.h b/configinterface.h index 3cada7a..840cc2c 100644 --- a/configinterface.h +++ b/configinterface.h @@ -17,6 +17,8 @@ class ConfigInterface : public QObject Q_PROPERTY(QString min READ min WRITE setMin NOTIFY minChanged FINAL) Q_PROPERTY(QString max READ max WRITE setMax NOTIFY maxChanged FINAL) Q_PROPERTY(QString alert READ alert WRITE setAlert NOTIFY alertChanged FINAL) + Q_PROPERTY(QString mode READ mode WRITE setMode NOTIFY modeChanged FINAL) + Q_PROPERTY(QString url READ url WRITE setUrl NOTIFY urlChanged FINAL) Q_PROPERTY(bool flipBits READ flipBits WRITE setFlipBits NOTIFY flipBitsChanged FINAL) public: explicit ConfigInterface(QObject *parent = nullptr); @@ -32,21 +34,30 @@ public: bool flipBits() const; void setFlipBits(bool newFlipBits); + QString mode() const; + void setMode(const QString &newMode); + + QString url() const; + void setUrl(const QString &newUrl); + signals: - void configData(QString max, QString min, QString alert, bool flipbits); + void configData(QString max, QString min, QString alert, bool flipbits, QString mode, QString url); void alertChanged(); void maxChanged(); void minChanged(); - void flipBitsChanged(); + void modeChanged(); + void urlChanged(); public slots: - void saveConfig(QString max, QString min, QString alert, bool flipbits); + void saveConfig(QString max, QString min, QString alert, bool flipbits, QString mode, QString url); private: QString m_alert; QString m_max; QString m_min; bool m_flipBits; + QString m_mode; + QString m_url; }; #endif // CONFIGINTERFACE_H diff --git a/udplistener.cpp b/udplistener.cpp index bbf4927..5eb7f3a 100644 --- a/udplistener.cpp +++ b/udplistener.cpp @@ -14,6 +14,7 @@ UDPListener::UDPListener(QObject *parent) connect(worker, &Worker::datagramReceived, this, &UDPListener::datagramRecieved); connect(worker, &Worker::socketError, this, &UDPListener::socketError); connect(this, &UDPListener::startWorker, worker, &Worker::run); + connect(this, &UDPListener::changeWorkerMode, worker, &Worker::changeMode); thread->start(); emit startWorker(); timer = new QTimer(this); @@ -54,16 +55,18 @@ void UDPListener::setFlipBits(bool flip_bits) m_flip_bits = flip_bits; } -void UDPListener::setConfig(float distance, bool flip_bits) +void UDPListener::setConfig(float distance, bool flip_bits, QString mode, QString url) { setFlipBits(flip_bits); if(!command_socket) { command_socket = new QUdpSocket(this); bool bind = command_socket->bind(8181); if(bind) { - QNetworkDatagram data1, data2; + QNetworkDatagram data1, data2, data3, data4; data1.setDestination(QHostAddress::LocalHost, 8178); data2.setDestination(QHostAddress::LocalHost, 8178); + data3.setDestination(QHostAddress::LocalHost, 8178); + data4.setDestination(QHostAddress::LocalHost, 8178); QString s_data = ""; while(s_data.toUtf8().size() != 1024) { @@ -72,6 +75,7 @@ void UDPListener::setConfig(float distance, bool flip_bits) data1.setData(s_data.toUtf8()); command_socket->writeDatagram(data1); command_socket->flush(); + QString b_data = ""; while(b_data.toUtf8().size() != 1024) { b_data += "="; @@ -79,9 +83,28 @@ void UDPListener::setConfig(float distance, bool flip_bits) data2.setData(b_data.toUtf8()); command_socket->writeDatagram(data2); command_socket->flush(); + + QString m_data = ""; + while(m_data.toUtf8().size() != 1024) { + m_data += "="; + } + data3.setData(m_data.toUtf8()); + command_socket->writeDatagram(data3); + command_socket->flush(); + + QString u_data = ""; + while(u_data.toUtf8().size() != 1024) { + u_data += "="; + } + data4.setData(u_data.toUtf8()); + command_socket->writeDatagram(data4); + command_socket->flush(); + command_socket->close(); command_socket->deleteLater(); command_socket = nullptr; + + emit changeWorkerMode(mode, url); } } averages.clear(); @@ -179,10 +202,45 @@ Worker::Worker(QObject *parent) } +void Worker::gotHttpReply(QNetworkReply *rep) +{ + QByteArray m_data = rep->readAll(); + rep->deleteLater(); + QJsonObject top = QJsonDocument::fromJson(m_data).object(); + float distance = top["water_level"].toArray()[0].toDouble(); + QByteArray data, data2; + data = QByteArray::fromRawData((char *)&distance, sizeof(float)); + char *buff = new char[4]; + char *reader = (char *) &distance; + for(int i=0;i< sizeof(float) ;i++) { + buff[i] = reader[sizeof(float) - 1 - i]; + } + data2 = QByteArray::fromRawData(buff, sizeof(float)); + emit datagramReceived(data, data2); + +} + +void Worker::httpTimerTimeout() +{ + QNetworkRequest req; + req.setUrl(QUrl("https://unrealdragon.in/server/waterlevel")); + disconnect(manager, nullptr, nullptr, nullptr); + connect(manager, &QNetworkAccessManager::finished, this, &Worker::gotHttpReply); + manager->get(req); +} + void Worker::stop() { disconnect(socket, nullptr, nullptr, nullptr); delete socket; + if(httpTimer) { + disconnect(httpTimer, nullptr, nullptr, nullptr); + delete httpTimer; + } + if(manager) { + disconnect(manager, nullptr, nullptr, nullptr); + delete manager; + } emit stopped(); } @@ -190,9 +248,13 @@ void Worker::run() { using namespace std::chrono_literals; socket = new QUdpSocket(this); + httpTimer = new QTimer(this); + manager = new QNetworkAccessManager(this); #ifdef Q_OS_ANDROID + // If it is android use it as a command socket; bool bind = socket->bind(QHostAddress::Any, 8180); #else + // Else use it as a receiver; bool bind = socket->bind(QHostAddress("192.168.1.255"), 8176); #endif if(!bind) @@ -200,24 +262,45 @@ void Worker::run() qDebug() << "UI Worker socket bind failed" << bind << socket->errorString(); emit socketError(socket->errorString()); } - + connect(httpTimer, &QTimer::timeout, this, &Worker::httpTimerTimeout); connect(socket, &QUdpSocket::readyRead, this, &Worker::socketDataReceived); } +void Worker::changeMode(QString mode, QString url) +{ + qDebug() << "Worker changing mode: " << mode << url; + this->mode = mode; + this->url = url; + if(mode == "http") { + httpTimer->setInterval(2000); + httpTimer->setSingleShot(false); + httpTimer->start(); + } + else if(mode == "udp") { + httpTimer->stop(); + socketDataReceived(); + } +} + void Worker::socketDataReceived() { if(socket->hasPendingDatagrams()) { - qDebug() << "Socket has pending data: " << socket->pendingDatagramSize(); - char buff[4] = {0x00, 0x00, 0x00, 0x00}; - socket->readDatagram(buff, 4); - auto data= QByteArray(buff,4); - char ch[4]; - for(int i=0;i<4;i++) { - ch[i] = buff[3-i]; + if(mode == "udp") { + qDebug() << "Socket has pending data: " << socket->pendingDatagramSize(); + char buff[4] = {0x00, 0x00, 0x00, 0x00}; + socket->readDatagram(buff, 4); + auto data= QByteArray(buff,4); + char ch[4]; + for(int i=0;i<4;i++) { + ch[i] = buff[3-i]; + } + auto data2 = QByteArray(ch,4); + std::string correct_order = ""; + qDebug() << "Distance received: " << correct_order; + emit datagramReceived(data, data2); + } + else if(mode == "http") { + qDebug() << "Socket data received in http mode ignoring it."; } - auto data2 = QByteArray(ch,4); - std::string correct_order = ""; - qDebug() << "Distance received: " << correct_order; - emit datagramReceived(data, data2); } } diff --git a/udplistener.h b/udplistener.h index b6cebd9..71f9f79 100644 --- a/udplistener.h +++ b/udplistener.h @@ -8,11 +8,21 @@ #include #include #include +#include +#include +#include +#include +#include +#include #include "moving_container.h" class Worker: public QObject { Q_OBJECT QUdpSocket *socket = nullptr; + QString mode = ""; + QString url = ""; + QNetworkAccessManager *manager = nullptr; + QTimer *httpTimer = nullptr; public: explicit Worker(QObject *parent = nullptr); signals: @@ -20,8 +30,11 @@ signals: void socketError(QString error); void datagramReceived(QByteArray data, QByteArray data2); public slots: + void gotHttpReply(QNetworkReply *rep); + void httpTimerTimeout(); void stop(); void run(); + void changeMode(QString mode, QString url); private slots: void socketDataReceived(); }; @@ -44,11 +57,12 @@ signals: void connected(); void disconnected(); void distanceReceived(double dist, QString timestamp); + void changeWorkerMode(QString mode, QString url); public slots: void continueDestruction(); void resetAverages(); void setFlipBits(bool flip_bits); - void setConfig(float distance, bool flip_bits); + void setConfig(float distance, bool flip_bits, QString mode, QString url); void socketError(QString err); void startService(); void datagramRecieved(QByteArray data, QByteArray data2); From ab69505b8071a292c5dc408e21d5edf7a697ede0 Mon Sep 17 00:00:00 2001 From: TheUnrealDragon Date: Mon, 13 Apr 2026 17:57:36 +0530 Subject: [PATCH 09/24] v0.0.7a minor change --- Main.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Main.qml b/Main.qml index e66168e..b2886d5 100644 --- a/Main.qml +++ b/Main.qml @@ -152,7 +152,7 @@ Window { border.color: root.accent_color border.width: 1 } - height: parent.height / 1.2 + height: Math.max(parent.height / 1.2, contentHeight) width: parent.width / 1.1 anchors.centerIn: Overlay.overlay From f59704545b20fed38f3c87c3035cedbb2516d6cf Mon Sep 17 00:00:00 2001 From: TheUnrealDragon Date: Mon, 13 Apr 2026 19:34:36 +0530 Subject: [PATCH 10/24] v0.0.8 --- Main.qml | 21 ++++++++- .../WaterLevelService.java | 30 ++++++++++-- configinterface.cpp | 12 ++--- udplistener.cpp | 46 +++++++++++++++++-- udplistener.h | 5 ++ 5 files changed, 98 insertions(+), 16 deletions(-) diff --git a/Main.qml b/Main.qml index b2886d5..0f60281 100644 --- a/Main.qml +++ b/Main.qml @@ -578,6 +578,20 @@ Window { color: root.accent_color font.pixelSize: root.font_normal_text_size } + Text { + id: last_updated_text + property string last_updated: "" + text: "Last Updated On Server On: " + last_updated + anchors { + top: info_percent_text.bottom + topMargin: 10 + horizontalCenter: parent.horizontalCenter + } + horizontalAlignment: Text.AlignHCenter + color: root.accent_color + font.pixelSize: root.font_normal_text_size + visible: config.mode === "http" ? true : false + } Text { id: error_text @@ -585,7 +599,7 @@ Window { text: "Error: " + error_string visible: error_string === "" ? false : true; anchors { - top: info_percent_text.bottom + top: last_updated_text.bottom topMargin: 10 horizontalCenter: parent.horizontalCenter } @@ -644,6 +658,11 @@ Window { error_text.error_string = err; } + onLastUpdatedChanged: (update) => { + console.log("QML Last Updated: ", update); + last_updated_text.last_updated = update; + } + onDistanceChanged: { console.log("Distance changed"); root.distance = listener.distance; diff --git a/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java b/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java index a1becb2..79c4728 100644 --- a/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java +++ b/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java @@ -24,6 +24,7 @@ import java.io.InputStreamReader; import org.json.JSONException; import org.json.JSONObject; import org.json.JSONArray; +import android.widget.Toast; public class WaterLevelService extends Service { @@ -84,7 +85,8 @@ public class WaterLevelService extends Service { } } catch (IOException e) { - Log.e("UDP Service", "Socket Error", e); + // showToast("IOException: " + e); + Log.e("UDP Service", "IOException Error" + e); } } @@ -132,12 +134,14 @@ public class WaterLevelService extends Service { count = 0; } byte[] buffer = null; + String updated = ""; if(mode.equals("udp")) { try { buffer = new byte[4]; DatagramPacket packet = new DatagramPacket(buffer, buffer.length); socket_recv.receive(packet); } catch(java.net.SocketTimeoutException e) { + // showToast("Socket Timeout: " + e); continue; } } @@ -163,24 +167,30 @@ public class WaterLevelService extends Service { JSONObject obj = new JSONObject(data); JSONArray arr = obj.getJSONArray("water_level"); float f = (float ) arr.getDouble(0); + updated = obj.getString("updated_on"); buffer = ByteBuffer.allocate(4).putFloat(f).array(); Log.d("UDP Service", "Got value from http: " + f); + Log.d("UDP Service", "Last updated on: " + updated); } catch (JSONException e) { Log.e("UDP Service", "Invalid Json"); + // showToast("Invalid Json" + e); + continue; } } else { + // showToast("Bad Response From Server: " + status); InputStreamReader streamReader = new InputStreamReader(con.getErrorStream()); continue; } } else { + Log.d("UDP Service", "Invalid mode: " + mode); + // showToast("Invalid mode: " + mode); try { Thread.sleep(3000); } catch (InterruptedException e) { continue; } - Log.d("UDP Service", "Invalid mode: " + mode); continue; } float f; @@ -220,10 +230,17 @@ public class WaterLevelService extends Service { DatagramPacket send_packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName("localhost"), 8180); socket_send.send(send_packet); Log.d("UDP Service ", "Sent packet"); - } + if(mode.equals("http")) { + byte[] buff2 = updated.getBytes(StandardCharsets.UTF_8); + DatagramPacket send_packet_2 = new DatagramPacket(buff2, buff2.length, InetAddress.getByName("localhost"), 8185); + socket_send.send(send_packet_2); + Log.d("UDP Service ", "Sent last updated packet"); + } + } } catch (IOException e) { - Log.e("UDP Service", "Socket Error", e); + // showToast("IOException: " + e); + Log.e("UDP Service", "IOException Error" + e); } finally { if (wifiLock.isHeld()) wifiLock.release(); @@ -282,6 +299,11 @@ public class WaterLevelService extends Service { return START_STICKY; } + public void showToast(String str) { + int duration = Toast.LENGTH_SHORT; + Toast toast = Toast.makeText(this, str, duration); + toast.show(); + } private Notification createNotification() { String channelId = "water_level_channel"; diff --git a/configinterface.cpp b/configinterface.cpp index dcadda1..ab97ecb 100644 --- a/configinterface.cpp +++ b/configinterface.cpp @@ -23,12 +23,12 @@ ConfigInterface::ConfigInterface(QObject *parent) QJsonObject top = QJsonDocument::fromJson(data).object(); QString max, min, alert, mode, url; bool flipbits; - max = top["max_threshold"].toString(); - min = top["min_threshold"].toString(); - alert = top["alert_threshold"].toString(); - flipbits = top["flip_bits"].toBool(); - mode = top["mode"].toString(); - url = top["url"].toString(); + max = top["max_threshold"].toString("100"); + min = top["min_threshold"].toString("20"); + alert = top["alert_threshold"].toString("60"); + flipbits = top["flip_bits"].toBool(true); + mode = top["mode"].toString("http"); + url = top["url"].toString("https://unrealdragon.in/server/waterlevel"); setMax(max); setMin(min); setAlert(alert); diff --git a/udplistener.cpp b/udplistener.cpp index 5eb7f3a..52aaa8d 100644 --- a/udplistener.cpp +++ b/udplistener.cpp @@ -11,6 +11,7 @@ UDPListener::UDPListener(QObject *parent) worker = new Worker(this); thread = new QThread(this); worker->moveToThread(thread); + connect(worker, &Worker::lastUpdateddatagramReceived, this, &UDPListener::lastUpdateddatagramReceived); connect(worker, &Worker::datagramReceived, this, &UDPListener::datagramRecieved); connect(worker, &Worker::socketError, this, &UDPListener::socketError); connect(this, &UDPListener::startWorker, worker, &Worker::run); @@ -40,6 +41,13 @@ void UDPListener::setDistance(double newDistance) emit distanceChanged(); } +void UDPListener::lastUpdateddatagramReceived(QByteArray data) +{ + QString s_data = QString::fromUtf8(data); + qDebug() << "Main Class last updated on: " << s_data; + emit lastUpdatedChanged(s_data); +} + void UDPListener::continueDestruction() { destroyed = true; @@ -206,18 +214,22 @@ void Worker::gotHttpReply(QNetworkReply *rep) { QByteArray m_data = rep->readAll(); rep->deleteLater(); + qDebug() << "Got reply from http server"; QJsonObject top = QJsonDocument::fromJson(m_data).object(); - float distance = top["water_level"].toArray()[0].toDouble(); + float distance = (float ) top["water_level"].toArray()[0].toDouble(); QByteArray data, data2; + qDebug() << "Updated on: " << top["updated_on"].toString(); data = QByteArray::fromRawData((char *)&distance, sizeof(float)); char *buff = new char[4]; char *reader = (char *) &distance; for(int i=0;i< sizeof(float) ;i++) { + qDebug() << i << "vs" << sizeof(float) - 1 - i; buff[i] = reader[sizeof(float) - 1 - i]; } + delete[] buff; data2 = QByteArray::fromRawData(buff, sizeof(float)); emit datagramReceived(data, data2); - + emit lastUpdateddatagramReceived(top["updated_on"].toString().toUtf8()); } void Worker::httpTimerTimeout() @@ -248,22 +260,28 @@ void Worker::run() { using namespace std::chrono_literals; socket = new QUdpSocket(this); + socket_2 = new QUdpSocket(this); httpTimer = new QTimer(this); manager = new QNetworkAccessManager(this); #ifdef Q_OS_ANDROID // If it is android use it as a command socket; bool bind = socket->bind(QHostAddress::Any, 8180); + bool bind2 = socket_2->bind(QHostAddress::Any, 8185); #else // Else use it as a receiver; bool bind = socket->bind(QHostAddress("192.168.1.255"), 8176); + bool bind2 = true; #endif - if(!bind) + if(!bind || !bind2) { qDebug() << "UI Worker socket bind failed" << bind << socket->errorString(); emit socketError(socket->errorString()); + emit socketError(socket_2->errorString()); } connect(httpTimer, &QTimer::timeout, this, &Worker::httpTimerTimeout); connect(socket, &QUdpSocket::readyRead, this, &Worker::socketDataReceived); + connect(socket_2, &QUdpSocket::readyRead, this, &Worker::socket2DataReceived); + } void Worker::changeMode(QString mode, QString url) @@ -271,7 +289,7 @@ void Worker::changeMode(QString mode, QString url) qDebug() << "Worker changing mode: " << mode << url; this->mode = mode; this->url = url; - if(mode == "http") { + if(mode == "http" && QSysInfo::productType() != "android") { httpTimer->setInterval(2000); httpTimer->setSingleShot(false); httpTimer->start(); @@ -282,10 +300,28 @@ void Worker::changeMode(QString mode, QString url) } } +void Worker::socket2DataReceived() +{ + if(socket_2->hasPendingDatagrams()) { + if(mode == "http") { + size_t data_size = socket_2->pendingDatagramSize(); + qDebug() << "Socket 2 has pending data: " << data_size; + char buff[data_size]; + socket_2->readDatagram(buff, data_size); + QByteArray data = QByteArray::fromRawData(buff, data_size); + emit lastUpdateddatagramReceived(data); + } + else if(mode == "udp") { + qDebug() << "Last Updated on Socket data received in udp mode ignoring it."; + } + } + +} + void Worker::socketDataReceived() { if(socket->hasPendingDatagrams()) { - if(mode == "udp") { + if(mode == "udp" || (mode == "http" && QSysInfo::productType() == "android")) { qDebug() << "Socket has pending data: " << socket->pendingDatagramSize(); char buff[4] = {0x00, 0x00, 0x00, 0x00}; socket->readDatagram(buff, 4); diff --git a/udplistener.h b/udplistener.h index 71f9f79..0a950e5 100644 --- a/udplistener.h +++ b/udplistener.h @@ -19,6 +19,7 @@ class Worker: public QObject { Q_OBJECT QUdpSocket *socket = nullptr; + QUdpSocket *socket_2 = nullptr; QString mode = ""; QString url = ""; QNetworkAccessManager *manager = nullptr; @@ -28,6 +29,7 @@ public: signals: void stopped(); void socketError(QString error); + void lastUpdateddatagramReceived(QByteArray data); void datagramReceived(QByteArray data, QByteArray data2); public slots: void gotHttpReply(QNetworkReply *rep); @@ -36,6 +38,7 @@ public slots: void run(); void changeMode(QString mode, QString url); private slots: + void socket2DataReceived(); void socketDataReceived(); }; @@ -50,6 +53,7 @@ public: double distance() const; void setDistance(double newDistance); signals: + void lastUpdatedChanged(QString last_updated); void stopWorker(); void showError(QString err); void distanceChanged(); @@ -59,6 +63,7 @@ signals: void distanceReceived(double dist, QString timestamp); void changeWorkerMode(QString mode, QString url); public slots: + void lastUpdateddatagramReceived(QByteArray data); void continueDestruction(); void resetAverages(); void setFlipBits(bool flip_bits); From 69086d80934596aca355d172c4465e64f9cd1361 Mon Sep 17 00:00:00 2001 From: TheUnrealDragon Date: Thu, 16 Apr 2026 17:18:02 +0530 Subject: [PATCH 11/24] v0.0.9 --- CMakeLists.txt | 6 +- Main.qml | 48 ++++-- android/AndroidManifest.xml | 4 +- .../WaterLevelService.java | 136 ++++++++++++++-- .../WaterLevelServiceStarter.java | 47 +++++- configinterface.cpp | 18 +-- service.cpp | 151 +++++++++--------- service.h | 2 + udplistener.cpp | 83 +++++++--- udplistener.h | 11 +- 10 files changed, 371 insertions(+), 135 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ddebcab..2b80b0d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,9 +5,9 @@ project(waterLevelSensor VERSION 0.1 LANGUAGES CXX) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_AUTORCC ON) -find_package(Qt6 REQUIRED COMPONENTS Quick Network) +find_package(Qt6 REQUIRED COMPONENTS Quick Network CorePrivate) -qt_standard_project_setup(REQUIRES 6.9) +qt_standard_project_setup(REQUIRES 6.11) qt_add_executable(appwaterLevelSensor main.cpp @@ -41,8 +41,8 @@ set_property(TARGET service APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR target_link_libraries(service PRIVATE Qt::Core - Qt::CorePrivate Qt::Network + Qt::CorePrivate Qt::Quick ) qt_add_qml_module(appwaterLevelSensor diff --git a/Main.qml b/Main.qml index 0f60281..7a705dd 100644 --- a/Main.qml +++ b/Main.qml @@ -634,19 +634,29 @@ Window { } } Timer { + property int count: 0 id: init_timer running: true - repeat: false + repeat: true interval: 1000 onTriggered: { - console.log("Timer triggered saving config, hope everything is loaded by now"); - let current_min_reading = Math.max(0, (parseFloat(min_thres_input.text))); - let effective_max_reading = Math.max(0, (parseFloat(max_thres_input.text)) - current_min_reading); - let alert = parseFloat(alert_thres_input.text); - let alert_effective_reading = (effective_max_reading * (100 - alert) / 100) + current_min_reading; - console.log("Setting initial configs: ", alert_effective_reading, config.flipBits , config.mode, config.url); - listener.setConfig(alert_effective_reading, config.flipBits , config.mode, config.url); - http_url_input.cursorPosition = 0; + if(count === 0) { + listener.startService(); + count++; + return; + } + else { + console.log("Timer triggered saving config, hope everything is loaded by now"); + let current_min_reading = Math.max(0, (parseFloat(min_thres_input.text))); + let effective_max_reading = Math.max(0, (parseFloat(max_thres_input.text)) - current_min_reading); + let alert = parseFloat(alert_thres_input.text); + let alert_effective_reading = (effective_max_reading * (100 - alert) / 100) + current_min_reading; + console.log("Setting initial configs: ", alert_effective_reading, config.flipBits , config.mode, config.url); + listener.setConfig(alert_effective_reading, config.flipBits , config.mode, config.url); + http_url_input.cursorPosition = 0; + init_timer.repeat = false; + init_timer.stop(); + } } } @@ -658,9 +668,18 @@ Window { error_text.error_string = err; } - onLastUpdatedChanged: (update) => { + onLastUpdatedChanged: (update, warn) => { console.log("QML Last Updated: ", update); - last_updated_text.last_updated = update; + if(!warn) + { + last_updated_text.last_updated = update; + last_updated_text.color = root.accent_color; + } + else + { + last_updated_text.last_updated = update; + last_updated_text.color = root.danger_color; + } } onDistanceChanged: { @@ -722,9 +741,12 @@ Window { } } - onClosing:(close)=> { + onClosing: (close)=> { if(Qt.platform.os === "android"){ - close.accepted = false + // close.accepted = false + // listener.moveAppToBackground(); + // console.log("Moving to backgound"); + close.accepted = true; } else { close.accepted = true } diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index 7c065f1..ead6548 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -29,7 +29,9 @@ + android:exported="true" + android:process=":water_service" + android:stopWithTask="false"> diff --git a/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java b/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java index 79c4728..2d3709f 100644 --- a/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java +++ b/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java @@ -32,22 +32,49 @@ public class WaterLevelService extends Service { private boolean bits_flipped = false; private String mode = ""; private String url = ""; + private Thread udpThread; + private Thread cmdThread; + private boolean resetBinds = false; + + public synchronized boolean checkBound() { + return resetBinds; + } + + public synchronized void setBound(boolean value) { + resetBinds = value; + } public class UDPCommandClient implements Runnable { private DatagramSocket socket_cmd_recv; private DatagramSocket socket_cmd_send; + private boolean received_cmd_first = false; + @Override public void run() { Log.d("UDP Service", "Command thread initialising"); try { - socket_cmd_recv = new DatagramSocket(8178, InetAddress.getByName("localhost")); - socket_cmd_send = new DatagramSocket(8179); - + socket_cmd_recv = new DatagramSocket(null); + socket_cmd_send = new DatagramSocket(null); + socket_cmd_recv.setSoTimeout(4000); + socket_cmd_recv.setReuseAddress(true); + socket_cmd_send.setReuseAddress(true); + socket_cmd_recv.bind(new InetSocketAddress(8178)); + socket_cmd_send.bind(new InetSocketAddress(8179)); Log.d("UDP Service", "Created command thread sockets"); while (!Thread.currentThread().isInterrupted()) { + if(socket_cmd_recv.isClosed()) { + socket_cmd_recv.bind(new InetSocketAddress(8178)); + } + if(socket_cmd_send.isClosed()) { + socket_cmd_send.bind(new InetSocketAddress(8179)); + } byte[] buffer = new byte[1024]; DatagramPacket packet = new DatagramPacket(buffer, buffer.length); - socket_cmd_recv.receive(packet); + try { + socket_cmd_recv.receive(packet); + } catch(java.net.SocketTimeoutException e) { + continue; + } String str = new String(buffer, StandardCharsets.UTF_8); Log.d("UDP Service ", "Received command packet " + str); if(str.startsWith("", ""); alert_thres_distance = Float.parseFloat(str); + { + if(!checkBound()) + { + setBound(true); + Log.d("UDP Service ", "Set Bound to True"); + } + else { + Log.d("UDP Service ", "Set Bound is False"); + } + + } } else if(str.startsWith(" serviceClass, Context context) { + ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); + for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { + if (serviceClass.getName().equals(service.service.getClassName())) { + return true; + } + } + return false; + } + + private static int getServicePid(Class serviceClass, Context context) { + ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); + for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { + if (serviceClass.getName().equals(service.service.getClassName())) { + return service.pid; + } + } + return 0; + } + public static void startService(Context context) { - Log.d("UDP Service", "Starting service via QtActivity instance"); + // Log.d("UDP Service", "Starting service via QtActivity instance"); - Intent intent = new Intent(context, WaterLevelService.class); + // if(!isMyServiceRunning(WaterLevelService.class, context)) { + // Intent intent = new Intent(context, WaterLevelService.class); + // context.startForegroundService(intent); + // } - context.startForegroundService(intent); + new Handler(Looper.getMainLooper()).post(new Runnable() { + @Override + public void run() { + if (!isMyServiceRunning(WaterLevelService.class, context)) { + Log.d("UDP Service", "Starting service safely on Main Looper"); + Intent intent = new Intent(context, WaterLevelService.class); + context.startForegroundService(intent); + } + else { + Log.d("UDP Service", "Service already running"); + } + Log.d("UDP Service", "Background service running with pid: " + getServicePid(WaterLevelService.class, context)); + } + }); } } diff --git a/configinterface.cpp b/configinterface.cpp index ab97ecb..73ae20a 100644 --- a/configinterface.cpp +++ b/configinterface.cpp @@ -23,9 +23,9 @@ ConfigInterface::ConfigInterface(QObject *parent) QJsonObject top = QJsonDocument::fromJson(data).object(); QString max, min, alert, mode, url; bool flipbits; - max = top["max_threshold"].toString("100"); - min = top["min_threshold"].toString("20"); - alert = top["alert_threshold"].toString("60"); + max = top["max_threshold"].toString("110"); + min = top["min_threshold"].toString("10"); + alert = top["alert_threshold"].toString("30"); flipbits = top["flip_bits"].toBool(true); mode = top["mode"].toString("http"); url = top["url"].toString("https://unrealdragon.in/server/waterlevel"); @@ -39,9 +39,9 @@ ConfigInterface::ConfigInterface(QObject *parent) else { qDebug() << "File does not exist creating one..."; QJsonObject top; - top["max_threshold"] = "125"; - top["min_threshold"] = "25"; - top["alert_threshold"] = "100"; + top["max_threshold"] = "110"; + top["min_threshold"] = "10"; + top["alert_threshold"] = "30"; top["flip_bits"] = true; top["mode"] = "http"; top["url"] = "https://unrealdragon.in/server/waterlevel"; @@ -54,9 +54,9 @@ ConfigInterface::ConfigInterface(QObject *parent) config.write(data); config.flush(); config.close(); - setMax("125"); - setMin("25"); - setAlert("100"); + setMax("110"); + setMin("10"); + setAlert("30"); setFlipBits(true); setMode("http"); setUrl("https://unrealdragon.in/server/waterlevel"); diff --git a/service.cpp b/service.cpp index 6b819b0..f48e455 100644 --- a/service.cpp +++ b/service.cpp @@ -11,7 +11,6 @@ Q_DECLARE_JNI_CLASS(ComponentName, "android/content/ComponentName") Q_DECLARE_JNI_CLASS(WaterLevelService, "org/qtproject/example/appwaterLevelSensor/WaterLevelService") - static volatile float level = -1; static void handleWaterLevelUpdate(JNIEnv *env, jobject /*obj*/, jbyteArray data) { @@ -29,87 +28,95 @@ static void handleWaterLevelUpdate(JNIEnv *env, jobject /*obj*/, jbyteArray data env->ReleaseByteArrayElements(data, bytes, JNI_ABORT); } +extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) { + JNIEnv* env; + if (vm->GetEnv(reinterpret_cast(&env), JNI_VERSION_1_6) != JNI_OK) { + return JNI_ERR; + } + + // Register your native method ONCE when the library loads + jclass javaClass = env->FindClass("org/qtproject/example/appwaterLevelSensor/WaterLevelReceiver"); + if (javaClass) { + static JNINativeMethod methods[] = { + {"updateWaterLevel", "([B)V", (void *)handleWaterLevelUpdate} + }; + env->RegisterNatives(javaClass, methods, 1); + } + + return JNI_VERSION_1_6; +} + + service::service(QObject *parent) : QObject{parent} { if(QSysInfo::productType() == "android") { qDebug() << "Running android service"; + // QJniEnvironment env; + // // if (env->ExceptionCheck()) env->ExceptionClear(); + // // static bool nativesRegistered = false; - using namespace QtJniTypes; - using namespace QNativeInterface; + // // if(!nativesRegistered) { + // // // jclass javaClass = env.findClass("org/qtproject/example/appwaterLevelSensor/WaterLevelReceiver"); + // // // if (javaClass) { + // // // JNINativeMethod methods[] = {{"updateWaterLevel", "([B)V", (void *)handleWaterLevelUpdate}}; + // // // if (env->RegisterNatives(javaClass, methods, 1) < 0) { + // // // qDebug() << "RegisterNatives failed!"; + // // // } else { + // // // nativesRegistered = true; + // // // } + // // // } else { + // // // qDebug() << "Could not find WaterLevelReceiver class"; + // // // } + // // // if (env->ExceptionCheck()) env->ExceptionClear(); + // // } + // using namespace QtJniTypes; + // using namespace QNativeInterface; - JNINativeMethod methods[] = { - {"updateWaterLevel", "([B)V", (void *)handleWaterLevelUpdate} - }; - // auto *androidApp = qGuiApp->nativeInterface(); - // Context context = androidApp->context(); - QJniObject context = QNativeInterface::QAndroidApplication::context(); - - QJniEnvironment env; - auto serviceClass = env.findClass(Traits::className()); - if (!serviceClass) { - qDebug() << "FAILED to find WaterLevelService class!"; - env->ExceptionDescribe(); // VERY important - env->ExceptionClear(); - return; - } - - jclass javaClass = env.findClass("org/qtproject/example/appwaterLevelSensor/WaterLevelReceiver"); - env->RegisterNatives(javaClass, methods, 1); - - - QJniObject::callStaticMethod( - "org/qtproject/example/appwaterLevelSensor/WaterLevelServiceStarter", - "startService", - "(Landroid/content/Context;)V", - context.object()); // pass the QtActivity instance ); - - // QJniObject activity = QNativeInterface::QAndroidApplication::context(); - // activity.callMethod("startWaterLevelService", "()V"); - // Intent serviceIntent(activity, serviceClass); - // activity.callMethod("startWaterLevelService"); - - // activity.callMethod<() - // QJniObject::callStaticMethod( - // "org/qtproject/example/appwaterLevelSensor/WaterLevelService", - // "startQtAndroidService", - // "(Landroid/content/Context;)V", - // activity.object() - // ); - - // activity.callMethod("startWaterLevelService", "()V"); // Intent serviceIntent(context, serviceClass); - // context.callMethod("startService", serviceIntent); - - // context.callMethod( - // "startForegroundService", - // serviceIntent - // ); - // QJniObject className = QJniObject::fromString( - // "org.qtproject.example.appwaterLevelSensor.WaterLevelService" - // ); - - // QJniObject serviceClassObj = QJniObject::callStaticObjectMethod( - // "java/lang/Class", - // "forName", - // "(Ljava/lang/String;)Ljava/lang/Class;", - // className.object() - // ); - - // QJniObject intent( - // "android/content/Intent", - // "(Landroid/content/Context;Ljava/lang/Class;)V", - // context.object(), - // serviceClassObj.object() - // ); - - // context.callObjectMethod( - // "startForegroundService", - // "(Landroid/content/Intent;)Landroid/content/ComponentName;", - // intent.object() - // ); // WaterLevelService::callStaticMethod("startQtAndroidService", context); + // // Context context = androidApp->context(); + // QJniObject context = QNativeInterface::QAndroidApplication::context(); + // auto serviceClass = env.findClass(Traits::className()); + // if (!serviceClass) { + // qDebug() << "FAILED to find WaterLevelService class!"; + // env->ExceptionDescribe(); // VERY important + // env->ExceptionClear(); + // return; + // } + // if (context.isValid()) { + // QJniObject::callStaticMethod< + // void>( + // "org/qtproject/example/appwaterLevelSensor/WaterLevelServiceStarter", + // "startService", + // "(Landroid/content/Context;)V", + // context.object()); + // } } } + +void service::moveAppToBackground() +{ + QJniObject activity = QNativeInterface::QAndroidApplication::context(); + if (activity.isValid()) { + qDebug() << "Moved app to background"; + activity.callMethod("moveTaskToBack", "(Z)Z", true); + } + qDebug() << "Closing"; +} + +void service::begin() { + + + // Only call this once the UI is visible + QJniObject context = QNativeInterface::QAndroidApplication::context(); + QJniObject::callStaticMethod( + "org/qtproject/example/appwaterLevelSensor/WaterLevelServiceStarter", + "startService", + "(Landroid/content/Context;)V", + context.object() + ); +} + diff --git a/service.h b/service.h index 5b64765..1ba18a1 100644 --- a/service.h +++ b/service.h @@ -8,6 +8,8 @@ class service : public QObject Q_OBJECT public: explicit service(QObject *parent = nullptr); + void moveAppToBackground(); + void begin(); signals: }; diff --git a/udplistener.cpp b/udplistener.cpp index 52aaa8d..e44a9eb 100644 --- a/udplistener.cpp +++ b/udplistener.cpp @@ -1,15 +1,12 @@ #include "udplistener.h" #include -#ifdef Q_OS_ANDROID -#include "service.h" -#endif UDPListener::UDPListener(QObject *parent) : QObject{parent} { - worker = new Worker(this); - thread = new QThread(this); + worker = new Worker(); + thread = new QThread(); worker->moveToThread(thread); connect(worker, &Worker::lastUpdateddatagramReceived, this, &UDPListener::lastUpdateddatagramReceived); connect(worker, &Worker::datagramReceived, this, &UDPListener::datagramRecieved); @@ -23,11 +20,6 @@ UDPListener::UDPListener(QObject *parent) timer->setSingleShot(false); connect(timer, &QTimer::timeout, this, &UDPListener::connectionTimerTimedOut); connect(qApp, &QCoreApplication::aboutToQuit, this, &UDPListener::destroy); -#ifdef Q_OS_ANDROID - qDebug() << "Running on Android"; - service service; - qDebug() << "Ran service"; -#endif } double UDPListener::distance() const @@ -41,11 +33,29 @@ void UDPListener::setDistance(double newDistance) emit distanceChanged(); } +void UDPListener::moveAppToBackground() +{ +#ifdef Q_OS_ANDROID + service->moveAppToBackground(); +#endif +} + void UDPListener::lastUpdateddatagramReceived(QByteArray data) { QString s_data = QString::fromUtf8(data); qDebug() << "Main Class last updated on: " << s_data; - emit lastUpdatedChanged(s_data); + QDateTime time = QDateTime::fromString(s_data, "dd/MM/yy hh:mm:ss"); + QDateTime thres_time = QDateTime::currentDateTime().addSecs(-1800); + if(time.isValid() && time < thres_time) + { + emit lastUpdatedChanged(s_data, false); + } + else if(time > thres_time && time.isValid()) { + emit lastUpdatedChanged(s_data, true); + } + else if(!time.isValid()) { + emit lastUpdatedChanged("Invalid Date", true); + } } void UDPListener::continueDestruction() @@ -114,6 +124,9 @@ void UDPListener::setConfig(float distance, bool flip_bits, QString mode, QStrin emit changeWorkerMode(mode, url); } + else { + showError("Command Socket Bind Failed"); + } } averages.clear(); } @@ -129,6 +142,12 @@ void UDPListener::socketError(QString err) void UDPListener::startService() { +#ifdef Q_OS_ANDROID + qDebug() << "Running on Android"; + service = new class service(); + qDebug() << "Ran service"; + service->begin(); +#endif } @@ -163,25 +182,31 @@ void UDPListener::datagramRecieved(QByteArray data1, QByteArray data2) void UDPListener::destroy() { qDebug() << "Destroying UDP Listener"; + +#ifdef Q_OS_ANDROID + delete service; +#endif + disconnect(timer, nullptr, nullptr, nullptr); timer->stop(); + QCoreApplication::processEvents(QEventLoop::AllEvents, 2000); connect(this, &UDPListener::stopWorker, worker, &Worker::stop); connect(worker, &Worker::stopped, this, &UDPListener::continueDestruction); emit stopWorker(); while(!destroyed) { - QCoreApplication::processEvents(); + QCoreApplication::processEvents(QEventLoop::AllEvents, 2000); } thread->exit(0); - QCoreApplication::processEvents(); - QCoreApplication::processEvents(); + QCoreApplication::processEvents(QEventLoop::AllEvents, 2000); worker->deleteLater(); - QCoreApplication::processEvents(); - QCoreApplication::processEvents(); + QCoreApplication::processEvents(QEventLoop::AllEvents, 2000); + while(thread->isRunning()) { + qDebug() << "The thread is still running."; + QCoreApplication::processEvents(QEventLoop::AllEvents, 2000); + } thread->deleteLater(); - QCoreApplication::processEvents(); - QCoreApplication::processEvents(); + QCoreApplication::processEvents(QEventLoop::AllEvents, 2000); timer->deleteLater(); - QCoreApplication::processEvents(); - QCoreApplication::processEvents(); + QCoreApplication::processEvents(QEventLoop::AllEvents, 2000); qDebug() << "Deinitialized UDP Listener"; } @@ -234,6 +259,7 @@ void Worker::gotHttpReply(QNetworkReply *rep) void Worker::httpTimerTimeout() { + qDebug() << "Worker httpTimer Timeout"; QNetworkRequest req; req.setUrl(QUrl("https://unrealdragon.in/server/waterlevel")); disconnect(manager, nullptr, nullptr, nullptr); @@ -243,8 +269,16 @@ void Worker::httpTimerTimeout() void Worker::stop() { - disconnect(socket, nullptr, nullptr, nullptr); - delete socket; + if(socket_2) { + disconnect(socket_2, nullptr, nullptr, nullptr); + socket_2->close(); + delete socket_2; + } + if(socket) { + disconnect(socket, nullptr, nullptr, nullptr); + socket->close(); + delete socket; + } if(httpTimer) { disconnect(httpTimer, nullptr, nullptr, nullptr); delete httpTimer; @@ -265,8 +299,8 @@ void Worker::run() manager = new QNetworkAccessManager(this); #ifdef Q_OS_ANDROID // If it is android use it as a command socket; - bool bind = socket->bind(QHostAddress::Any, 8180); - bool bind2 = socket_2->bind(QHostAddress::Any, 8185); + bool bind = socket->bind(QHostAddress::Any, 8180, QUdpSocket::ReuseAddressHint); + bool bind2 = socket_2->bind(QHostAddress::Any, 8185, QUdpSocket::ReuseAddressHint); #else // Else use it as a receiver; bool bind = socket->bind(QHostAddress("192.168.1.255"), 8176); @@ -277,6 +311,7 @@ void Worker::run() qDebug() << "UI Worker socket bind failed" << bind << socket->errorString(); emit socketError(socket->errorString()); emit socketError(socket_2->errorString()); + qApp->exit(-1); } connect(httpTimer, &QTimer::timeout, this, &Worker::httpTimerTimeout); connect(socket, &QUdpSocket::readyRead, this, &Worker::socketDataReceived); diff --git a/udplistener.h b/udplistener.h index 0a950e5..8c123c8 100644 --- a/udplistener.h +++ b/udplistener.h @@ -16,6 +16,11 @@ #include #include "moving_container.h" +#ifdef Q_OS_ANDROID +#include "service.h" +#endif + + class Worker: public QObject { Q_OBJECT QUdpSocket *socket = nullptr; @@ -48,12 +53,15 @@ class UDPListener : public QObject QML_ELEMENT Q_PROPERTY(double distance READ distance WRITE setDistance NOTIFY distanceChanged FINAL) bool destroyed = false; +#ifdef Q_OS_ANDROID + service *service = nullptr; +#endif public: explicit UDPListener(QObject *parent = nullptr); double distance() const; void setDistance(double newDistance); signals: - void lastUpdatedChanged(QString last_updated); + void lastUpdatedChanged(QString last_updated, bool warn); void stopWorker(); void showError(QString err); void distanceChanged(); @@ -63,6 +71,7 @@ signals: void distanceReceived(double dist, QString timestamp); void changeWorkerMode(QString mode, QString url); public slots: + void moveAppToBackground(); void lastUpdateddatagramReceived(QByteArray data); void continueDestruction(); void resetAverages(); From e6d5589cadf003b8a0809a6f2589699c23839f7d Mon Sep 17 00:00:00 2001 From: TheUnrealDragon Date: Fri, 17 Apr 2026 15:43:25 +0530 Subject: [PATCH 12/24] v0.1.0 --- Main.qml | 45 ++++- README.md | 11 +- .../WaterLevelService.java | 182 ++++++++++++----- .../WaterLevelServiceStarter.java | 68 ++++++- udplistener.cpp | 190 +++++++++++++----- udplistener.h | 18 ++ 6 files changed, 410 insertions(+), 104 deletions(-) diff --git a/Main.qml b/Main.qml index 7a705dd..e7844b9 100644 --- a/Main.qml +++ b/Main.qml @@ -19,11 +19,47 @@ Window { property int font_normal_text_size: 16 property double distance: 0 property int distance_count: 0 + property int distance_count_thres: 3 property string mode: "http" // visibility: Window.FullScreen Component.onCompleted: { - if(Qt.platform.os !== "android") { + loading_popup.open(); + } + + + Popup { + id: loading_popup + background: Rectangle { + color: "#B0121212" + radius: 5 + border.color: root.accent_color + border.width: 1 } + height: parent.height / 10 + width: parent.width / 1.1 + anchors.centerIn: Overlay.overlay + closePolicy: Popup.NoAutoClose + BusyIndicator { + id: loading_indicator + running: true + anchors { + left: parent.left + verticalCenter: parent.verticalCenter + } + } + Text { + id: loading_text + text: "Loading..." + anchors { + leftMargin: 20 + left: loading_indicator.right + verticalCenter: parent.verticalCenter + } + verticalAlignment: Text.AlignVCenter + color: root.accent_color + font.pointSize: root.font_enlarged_text_size + } + } Rectangle { @@ -687,7 +723,10 @@ Window { root.distance = listener.distance; error_text.error_string = ""; console.log("Distance count: ", root.distance_count); - if(root.distance_count >= 5) { + if(root.distance_count >= root.distance_count_thres) { + if(loading_popup.opened) { + loading_popup.close(); + } status_label.text = "Recieving values"; let current_min_reading = Math.max(0, (parseFloat(min_thres_input.text))); let effective_max_reading = Math.max(0, (parseFloat(max_thres_input.text)) - current_min_reading); @@ -704,7 +743,7 @@ Window { water_level.color = root.water_color; } if(root.distance_count > 1000) { - root.distance_count = 5; + root.distance_count = root.distance_count_thres; } console.log("Current reading is: " + current_reading) console.log("Normalized height is: " + normalized_height) diff --git a/README.md b/README.md index 96a9151..7198d51 100644 --- a/README.md +++ b/README.md @@ -5,4 +5,13 @@ Builds for android and desktop.
On Android Creates a service from service.cpp and android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java.
Changes in AndroidManifest.xml are important.
On Desktop just waits for values from a UDP Broadcast on local network with port 8176 and shows those values.
-On Android the service does that, and creates an alert notification if the value in broadcast is less than alert threshold.
\ No newline at end of file +On Android the service does that, and creates an alert notification if the value in broadcast is less than alert threshold.
+ + +
+Create a new socket in Worker that will instantly start listening.
+In the service launch the threads and immediately send client hello to the worker socket.
+On client hello send command data to the android service.
+On quit send server bye to android service.
+On server bye deinit the sockets that send data to cpp server.
+On next launch, the command and client threads can be reinitialized from the StartService java class.
\ No newline at end of file diff --git a/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java b/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java index 2d3709f..cc765d0 100644 --- a/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java +++ b/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelService.java @@ -25,25 +25,87 @@ import org.json.JSONException; import org.json.JSONObject; import org.json.JSONArray; import android.widget.Toast; +import android.os.IBinder; +import android.os.Handler; +import android.os.Message; +import android.os.Messenger; public class WaterLevelService extends Service { private static float alert_thres_distance = 1000000; - private boolean bits_flipped = false; - private String mode = ""; - private String url = ""; - private Thread udpThread; - private Thread cmdThread; - private boolean resetBinds = false; + private static boolean bits_flipped = false; + private static String mode = ""; + private static String url = ""; + private static Thread udpThread; + private static Thread cmdThread; + private static boolean resetBinds = false; + private final IBinder binder = new LocalBinder(); + final Messenger mMessenger = new Messenger(new IncomingHandler()); + public static final int MSG_RESTART_THREADS = 1; - public synchronized boolean checkBound() { + + class IncomingHandler extends Handler { + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case MSG_RESTART_THREADS: + Log.d("UDP Service MainThread", "Received IPC request to restart threads"); + restartThreads(); + break; + default: + super.handleMessage(msg); + } + } + } + + + public synchronized void restartThreads() { + Log.d("UDP Service MainThread", "In synchronized thread stopper."); + udpThread.interrupt(); + cmdThread.interrupt(); + try { + udpThread.join(); + cmdThread.join(); + } catch (InterruptedException e) { + Log.d("UDP Service MainThread", "Thread joining was interrupted because of: " + e); + } + + new Thread(new + Runnable() { + @Override + public void run() { + try { + // Move your socket and thread starting logic here + if (udpThread == null || !udpThread.isAlive()) { + udpThread = new Thread(new UDPClient()); + udpThread.start(); + } + if (cmdThread == null || !cmdThread.isAlive()) { + cmdThread = new Thread(new UDPCommandClient()); + cmdThread.start(); + } + } catch (Exception e) { + Log.e("UDP Service MainThread", "Restarting the threads", e); + } + } + }).start(); + Log.d("UDP Service MainThread", "Actually restarting the thread"); + } + + public static synchronized boolean checkBound() { return resetBinds; } - public synchronized void setBound(boolean value) { + public static synchronized void setBound(boolean value) { resetBinds = value; } + public class LocalBinder extends android.os.Binder { + WaterLevelService getService() { + return WaterLevelService.this; + } + } + public class UDPCommandClient implements Runnable { private DatagramSocket socket_cmd_recv; private DatagramSocket socket_cmd_send; @@ -51,7 +113,7 @@ public class WaterLevelService extends Service { @Override public void run() { - Log.d("UDP Service", "Command thread initialising"); + Log.d("UDP Service CommandThread", "Command thread initialising"); try { socket_cmd_recv = new DatagramSocket(null); socket_cmd_send = new DatagramSocket(null); @@ -59,15 +121,30 @@ public class WaterLevelService extends Service { socket_cmd_recv.setReuseAddress(true); socket_cmd_send.setReuseAddress(true); socket_cmd_recv.bind(new InetSocketAddress(8178)); - socket_cmd_send.bind(new InetSocketAddress(8179)); - Log.d("UDP Service", "Created command thread sockets"); + socket_cmd_send.bind(new InetSocketAddress(8187)); + boolean not_send_set = true; + Log.d("UDP Service CommandThread", "Created command thread sockets"); while (!Thread.currentThread().isInterrupted()) { if(socket_cmd_recv.isClosed()) { socket_cmd_recv.bind(new InetSocketAddress(8178)); } if(socket_cmd_send.isClosed()) { - socket_cmd_send.bind(new InetSocketAddress(8179)); + socket_cmd_send.bind(new InetSocketAddress(8187)); } + + if(not_send_set) { + String s_data = new String(""); + byte[] buff_s = s_data.getBytes(StandardCharsets.UTF_8); + DatagramPacket packet = new DatagramPacket(buff_s, buff_s.length, InetAddress.getByName("127.0.0.1"), 8186); + try { + socket_cmd_send.connect(InetAddress.getByName("127.0.0.1"), 8186); + socket_cmd_send.send(packet); + } catch(Exception e) { + Log.d("UDP Service CommandThread", "Failed to send data to client due to: " + e); + } + Log.d("UDP Service CommandThread", "Sent set message to client"); + } + byte[] buffer = new byte[1024]; DatagramPacket packet = new DatagramPacket(buffer, buffer.length); try { @@ -76,7 +153,8 @@ public class WaterLevelService extends Service { continue; } String str = new String(buffer, StandardCharsets.UTF_8); - Log.d("UDP Service ", "Received command packet " + str); + Log.d("UDP Service CommandThread", "Received command packet " + str); + not_send_set = false; if(str.startsWith("", ""); - Log.d("UDP Service ", "Flipping " + str); + Log.d("UDP Service CommandThread", "Flipping " + str); if(str.toLowerCase() == "false") { bits_flipped = false; } @@ -110,21 +188,21 @@ public class WaterLevelService extends Service { str = str.replace("", ""); - Log.d("UDP Service ", "Mode " + str); + Log.d("UDP Service CommandThread", "Mode " + str); mode = str.toLowerCase(); } else if(str.startsWith("", ""); - Log.d("UDP Service ", "Url " + str); + Log.d("UDP Service CommandThread", "Url " + str); url = str.toLowerCase(); } } } catch (IOException e) { // showToast("IOException: " + e); - Log.e("UDP Service", "IOException Error" + e); + Log.e("UDP Service CommandThread", "IOException Error" + e); } } @@ -134,11 +212,12 @@ public class WaterLevelService extends Service { private DatagramSocket socket_recv; private DatagramSocket socket_send; private Instant prevAlertTimestamp; + private InetAddress address; private boolean started = false; @Override public void run() { - Log.d("UDP Service", "Client Thread initialising"); + Log.d("UDP Service ClientThread", "Client Thread initialising"); android.net.wifi.WifiManager wifi = (android.net.wifi.WifiManager) getSystemService(Context.WIFI_SERVICE); android.net.wifi.WifiManager.MulticastLock multicastLock = wifi.createMulticastLock("water_level_lock"); android.net.wifi.WifiManager.WifiLock wifiLock = wifi.createWifiLock(android.net.wifi.WifiManager.WIFI_MODE_FULL_HIGH_PERF, "WaterLevel:WifiLock"); @@ -167,16 +246,19 @@ public class WaterLevelService extends Service { socket_send.setReuseAddress(true); socket_send.bind(new InetSocketAddress(8177)); socket_recv.bind(new InetSocketAddress(8176)); - Log.d("UDP Service", "Created Sockets"); + Log.d("UDP Service ClientThread", "Created Sockets"); int count = 0; while (!Thread.currentThread().isInterrupted()) { count++; if(count == 3) { - Log.i("UDP Service", "Thread is running with mode: " + mode); + Log.i("UDP Service ClientThread", "Thread is running with mode: " + mode); count = 0; } if(checkBound()) { - Log.i("UDP Service", "Reconnecting sockets"); + Log.i("UDP Service ClientThread", "Reconnecting sockets"); + this.address = InetAddress.getByName("127.0.0.1"); + socket_recv.disconnect(); + socket_send.disconnect(); socket_recv.close(); socket_send.close(); socket_recv = null; @@ -190,7 +272,7 @@ public class WaterLevelService extends Service { socket_send.bind(new InetSocketAddress(8177)); socket_recv.bind(new InetSocketAddress(8176)); setBound(false); - Log.i("UDP Service", "Reconnected sockets"); + Log.i("UDP Service ClientThread", "Reconnected sockets"); } // if(checkBound()) { // Log.i("UDP Service", "Reset socket binds: " + mode); @@ -238,9 +320,10 @@ public class WaterLevelService extends Service { try { Thread.sleep(2000); } catch (InterruptedException e) { - continue; + Log.d("UDP Service ClientThread", "Thread exiting due to interrupt."); + return; } - Log.d("UDP Service", "Http String Url: " + url); + Log.d("UDP Service ClientThread", "Http String Url: " + url); URL t_url = new URL(url); HttpURLConnection con = (HttpURLConnection) t_url.openConnection(); con.setRequestMethod("GET"); @@ -248,7 +331,7 @@ public class WaterLevelService extends Service { con.setReadTimeout(5000); con.setInstanceFollowRedirects(true); int status = con.getResponseCode(); - Log.d("UDP Service", "Got status from http: " + status); + Log.d("UDP Service ClientThread", "Got status from http: " + status); if(status == 200) { BufferedReader streamReader = new BufferedReader(new InputStreamReader(con.getInputStream())); String data = streamReader.readLine(); @@ -258,10 +341,10 @@ public class WaterLevelService extends Service { float f = (float ) arr.getDouble(0); updated = obj.getString("updated_on"); buffer = ByteBuffer.allocate(4).putFloat(f).array(); - Log.d("UDP Service", "Got value from http: " + f); - Log.d("UDP Service", "Last updated on: " + updated); + Log.d("UDP Service ClientThread", "Got value from http: " + f); + Log.d("UDP Service ClientThread", "Last updated on: " + updated); } catch (JSONException e) { - Log.e("UDP Service", "Invalid Json"); + Log.e("UDP Service ClientThread", "Invalid Json"); // showToast("Invalid Json" + e); continue; } @@ -273,12 +356,13 @@ public class WaterLevelService extends Service { } } else { - Log.d("UDP Service", "Invalid mode: " + mode); + Log.d("UDP Service ClientThread", "Invalid mode: " + mode); // showToast("Invalid mode: " + mode); try { Thread.sleep(3000); } catch (InterruptedException e) { - continue; + Log.d("UDP Service ClientThread", "Thread exiting due to interrupt."); + return; } continue; } @@ -289,8 +373,8 @@ public class WaterLevelService extends Service { else { f = ByteBuffer.wrap(buffer).order(ByteOrder.BIG_ENDIAN).getFloat(); } - Log.d("UDP Service ", "Received packet: " + f); - Log.d("UDP Service ", "Threshold is: " + alert_thres_distance); + Log.d("UDP Service ClientThread", "Received packet: " + f); + Log.d("UDP Service ClientThread", "Threshold is: " + alert_thres_distance); boolean duration_passed = false; if(!started) { duration_passed = true; @@ -311,7 +395,7 @@ public class WaterLevelService extends Service { .setContentText("Water Level is below alert threshold") .setPriority(Notification.PRIORITY_LOW); manager.notify(2, builder.build()); - Log.d("UDP Service", "Notification sent"); + Log.d("UDP Service ClientThread", "Notification sent"); if(!started) { started = true; } @@ -319,20 +403,20 @@ public class WaterLevelService extends Service { if(socket_send.isClosed()) { socket_send.bind(new InetSocketAddress(8177)); } - DatagramPacket send_packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName("localhost"), 8180); + DatagramPacket send_packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName("127.0.0.1"), 8180); socket_send.send(send_packet); - Log.d("UDP Service ", "Sent packet"); + Log.d("UDP Service ClientThread", "Sent packet"); if(mode.equals("http")) { byte[] buff2 = updated.getBytes(StandardCharsets.UTF_8); - DatagramPacket send_packet_2 = new DatagramPacket(buff2, buff2.length, InetAddress.getByName("localhost"), 8185); + DatagramPacket send_packet_2 = new DatagramPacket(buff2, buff2.length, InetAddress.getByName("127.0.0.1"), 8185); socket_send.send(send_packet_2); - Log.d("UDP Service ", "Sent last updated packet"); + Log.d("UDP Service ClientThread", "Sent last updated packet"); } } } catch (IOException e) { // showToast("IOException: " + e); - Log.e("UDP Service", "IOException Error" + e); + Log.e("UDP Service ClientThread", "IOException Error" + e); } finally { if (wifiLock.isHeld()) wifiLock.release(); @@ -347,7 +431,7 @@ public class WaterLevelService extends Service { } public void startWaterLevelService() { - Log.d("UDP Service", "Starting the service from Activity"); + Log.d("UDP Service MainThread", "Starting the service from Activity"); Intent intent = new Intent(this, WaterLevelService.class); @@ -355,25 +439,25 @@ public class WaterLevelService extends Service { } public WaterLevelService() { super(); - Log.i("UDP Service", "Class is created"); + Log.i("UDP Service MainThread", "Class is created"); } @Override - public android.os.IBinder onBind(android.content.Intent intent) { return null; } + public android.os.IBinder onBind(android.content.Intent intent) { return mMessenger.getBinder(); } @Override public void onCreate() { super.onCreate(); Notification notification = createNotification(); startForeground(1, notification); - Log.i("UDP Service", "Creating Service"); + Log.i("UDP Service MainThread", "Creating Service"); } @Override public void onDestroy() { super.onDestroy(); - Log.i("UDP Service", "Destroying Service"); + Log.i("UDP Service MainThread", "Destroying Service"); } @Override @@ -383,7 +467,7 @@ public class WaterLevelService extends Service { if (intent == null) { - Log.w("UDP Service", "Service restarted with null intent. Stopping to avoid crash."); + Log.w("UDP Service MainThread", "Service restarted with null intent. Stopping to avoid crash."); stopSelf(); return START_NOT_STICKY; } @@ -402,12 +486,12 @@ public class WaterLevelService extends Service { cmdThread.start(); } } catch (Exception e) { - Log.e("UDP Service", "Error starting threads", e); + Log.e("UDP Service MainThread", "Error starting threads", e); } } }).start(); - Log.d("UDP Service", "Actually starting the thread"); + Log.d("UDP Service MainThread", "Actually starting the thread"); int ret = super.onStartCommand(intent, flags, startId); @@ -444,7 +528,7 @@ public class WaterLevelService extends Service { } public static void startQtAndroidService(QtActivity activity) { - Log.d("UDP Service", "Starting the service"); + Log.d("UDP Service MainThread", "Starting the service"); Intent intent = new Intent(activity, WaterLevelService.class); activity.startForegroundService(intent); diff --git a/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelServiceStarter.java b/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelServiceStarter.java index 84a36f6..9dccce9 100644 --- a/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelServiceStarter.java +++ b/android/src/org/qtproject/example/appwaterLevelSensor/WaterLevelServiceStarter.java @@ -10,9 +10,51 @@ import android.app.ActivityManager.RunningServiceInfo; import org.qtproject.qt.android.bindings.QtActivity; import android.os.Handler; import android.os.Looper; +import android.content.ServiceConnection; +import android.content.ComponentName; +import android.os.IBinder; +import android.os.Message; +import android.os.Messenger; +import android.os.RemoteException; public class WaterLevelServiceStarter { + private static Messenger mServiceMessenger = null; + private static boolean mBound = false; + private static boolean restart_bind = false; + private static ServiceConnection connection = new ServiceConnection() { + + @Override + public void onServiceConnected(ComponentName className, IBinder service) { + mServiceMessenger = new Messenger(service); + mBound = true; + Log.d("UDP Service StarterThread", "Connected to Service object reference"); + if(restart_bind) + { + sendRestartMessage(); + Log.d("UDP Service StarterThread", "Restart Threads in Service."); + } + restart_bind = false; + } + + @Override + public void onServiceDisconnected(ComponentName arg0) { + mServiceMessenger = null; + mBound = false; + } + }; + + public static void startAndBindService(Context context) { + Intent intent = new Intent(context, WaterLevelService.class); + context.startForegroundService(intent); + context.bindService(intent, connection, Context.BIND_AUTO_CREATE); + } + + public static void bindService(Context context) { + restart_bind = true; + Intent intent = new Intent(context, WaterLevelService.class); + context.bindService(intent, connection, Context.BIND_AUTO_CREATE); + } private static boolean isMyServiceRunning(Class serviceClass, Context context) { ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); @@ -24,6 +66,7 @@ public class WaterLevelServiceStarter { return false; } + private static int getServicePid(Class serviceClass, Context context) { ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { @@ -34,6 +77,20 @@ public class WaterLevelServiceStarter { return 0; } + + public static void sendRestartMessage() { + if (!mBound || mServiceMessenger == null) { + Log.d("UDP Service StarterThread", "Service is not running."); + } + try { + Message msg = Message.obtain(null, WaterLevelService.MSG_RESTART_THREADS); + mServiceMessenger.send(msg); + Log.d("UDP Service StarterThread", "Sent restart signal to remote process"); + } catch (RemoteException e) { + Log.e("UDP Service StarterThread", "Failed to send message", e); + } + } + public static void startService(Context context) { // Log.d("UDP Service", "Starting service via QtActivity instance"); @@ -45,15 +102,16 @@ public class WaterLevelServiceStarter { new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { + if (!isMyServiceRunning(WaterLevelService.class, context)) { - Log.d("UDP Service", "Starting service safely on Main Looper"); - Intent intent = new Intent(context, WaterLevelService.class); - context.startForegroundService(intent); + Log.d("UDP Service StarterThread", "Starting service safely on Main Looper"); + startAndBindService(context); } else { - Log.d("UDP Service", "Service already running"); + Log.d("UDP Service StarterThread", "Service already running, so restarting the threads."); + bindService(context); } - Log.d("UDP Service", "Background service running with pid: " + getServicePid(WaterLevelService.class, context)); + Log.d("UDP Service StarterThread", "Background service running with pid: " + getServicePid(WaterLevelService.class, context)); } }); } diff --git a/udplistener.cpp b/udplistener.cpp index e44a9eb..155df4e 100644 --- a/udplistener.cpp +++ b/udplistener.cpp @@ -11,6 +11,7 @@ UDPListener::UDPListener(QObject *parent) connect(worker, &Worker::lastUpdateddatagramReceived, this, &UDPListener::lastUpdateddatagramReceived); connect(worker, &Worker::datagramReceived, this, &UDPListener::datagramRecieved); connect(worker, &Worker::socketError, this, &UDPListener::socketError); + connect(worker, &Worker::sendConfig, this, &UDPListener::sendConfigOnSet); connect(this, &UDPListener::startWorker, worker, &Worker::run); connect(this, &UDPListener::changeWorkerMode, worker, &Worker::changeMode); thread->start(); @@ -33,52 +34,15 @@ void UDPListener::setDistance(double newDistance) emit distanceChanged(); } -void UDPListener::moveAppToBackground() +void UDPListener::sendConfigOnSet() { -#ifdef Q_OS_ANDROID - service->moveAppToBackground(); -#endif -} - -void UDPListener::lastUpdateddatagramReceived(QByteArray data) -{ - QString s_data = QString::fromUtf8(data); - qDebug() << "Main Class last updated on: " << s_data; - QDateTime time = QDateTime::fromString(s_data, "dd/MM/yy hh:mm:ss"); - QDateTime thres_time = QDateTime::currentDateTime().addSecs(-1800); - if(time.isValid() && time < thres_time) - { - emit lastUpdatedChanged(s_data, false); - } - else if(time > thres_time && time.isValid()) { - emit lastUpdatedChanged(s_data, true); - } - else if(!time.isValid()) { - emit lastUpdatedChanged("Invalid Date", true); - } -} - -void UDPListener::continueDestruction() -{ - destroyed = true; -} - -void UDPListener::resetAverages() -{ - averages.clear(); -} - -void UDPListener::setFlipBits(bool flip_bits) -{ - m_flip_bits = flip_bits; -} - -void UDPListener::setConfig(float distance, bool flip_bits, QString mode, QString url) -{ - setFlipBits(flip_bits); + bool flip_bits = m_flip_bits; + QString url = m_url; + QString mode = m_mode; + float distance = m_distance; if(!command_socket) { command_socket = new QUdpSocket(this); - bool bind = command_socket->bind(8181); + bool bind = command_socket->bind(QHostAddress::Any, 0); if(bind) { QNetworkDatagram data1, data2, data3, data4; data1.setDestination(QHostAddress::LocalHost, 8178); @@ -122,12 +86,63 @@ void UDPListener::setConfig(float distance, bool flip_bits, QString mode, QStrin command_socket->deleteLater(); command_socket = nullptr; + qDebug() << "Sent all Command Statements."; emit changeWorkerMode(mode, url); } else { showError("Command Socket Bind Failed"); } } +} + +void UDPListener::moveAppToBackground() +{ +#ifdef Q_OS_ANDROID + service->moveAppToBackground(); +#endif +} + +void UDPListener::lastUpdateddatagramReceived(QByteArray data) +{ + QString s_data = QString::fromUtf8(data); + qDebug() << "Main Class last updated on: " << s_data; + QDateTime time = QDateTime::fromString(s_data, "dd/MM/yy hh:mm:ss").addYears(100); + QDateTime thres_time = QDateTime::currentDateTime().addSecs(-1800); + if(time.isValid() && thres_time < time) + { + emit lastUpdatedChanged(s_data, false); + } + else if(thres_time > time && time.isValid()) { + emit lastUpdatedChanged(s_data, true); + } + else if(!time.isValid()) { + emit lastUpdatedChanged("Invalid Date", true); + } +} + +void UDPListener::continueDestruction() +{ + destroyed = true; +} + +void UDPListener::resetAverages() +{ + averages.clear(); +} + +void UDPListener::setFlipBits(bool flip_bits) +{ + m_flip_bits = flip_bits; +} + +void UDPListener::setConfig(float distance, bool flip_bits, QString mode, QString url) +{ + setFlipBits(flip_bits); + setDistance(distance); + setMode(mode); + setUrl(url); + emit changeWorkerMode(mode, url); + qDebug() << "Setting config from UI completed." << flip_bits << distance << mode << url; averages.clear(); } @@ -279,6 +294,11 @@ void Worker::stop() socket->close(); delete socket; } + if(socket_3) { + disconnect(socket_3, nullptr, nullptr, nullptr); + socket_3->close(); + delete socket_3; + } if(httpTimer) { disconnect(httpTimer, nullptr, nullptr, nullptr); delete httpTimer; @@ -295,27 +315,36 @@ void Worker::run() using namespace std::chrono_literals; socket = new QUdpSocket(this); socket_2 = new QUdpSocket(this); + socket_3 = new QUdpSocket(this); httpTimer = new QTimer(this); manager = new QNetworkAccessManager(this); #ifdef Q_OS_ANDROID // If it is android use it as a command socket; - bool bind = socket->bind(QHostAddress::Any, 8180, QUdpSocket::ReuseAddressHint); - bool bind2 = socket_2->bind(QHostAddress::Any, 8185, QUdpSocket::ReuseAddressHint); + bool bind = socket->bind(QHostAddress::LocalHost, 8180, QUdpSocket::ReuseAddressHint | QUdpSocket::ShareAddress); + bool bind2 = socket_2->bind(QHostAddress::LocalHost, 8185, QUdpSocket::ReuseAddressHint | QUdpSocket::ShareAddress); + bool bind3 = socket_3->bind(QHostAddress::LocalHost, 8186, QUdpSocket::ReuseAddressHint | QUdpSocket::ShareAddress); #else // Else use it as a receiver; bool bind = socket->bind(QHostAddress("192.168.1.255"), 8176); bool bind2 = true; #endif - if(!bind || !bind2) + if(!bind || !bind2 || !bind3) { qDebug() << "UI Worker socket bind failed" << bind << socket->errorString(); + qDebug() << "UI Worker socket bind failed" << bind2 << socket_2->errorString(); + qDebug() << "UI Worker socket bind failed" << bind3 << socket_3->errorString(); emit socketError(socket->errorString()); emit socketError(socket_2->errorString()); + emit socketError(socket_3->errorString()); qApp->exit(-1); } connect(httpTimer, &QTimer::timeout, this, &Worker::httpTimerTimeout); connect(socket, &QUdpSocket::readyRead, this, &Worker::socketDataReceived); connect(socket_2, &QUdpSocket::readyRead, this, &Worker::socket2DataReceived); + connect(socket_3, &QUdpSocket::readyRead, this, &Worker::socket3DataReceived); +#ifdef Q_OS_ANDROID + qDebug() << "Waiting for message from service."; +#endif } @@ -333,6 +362,43 @@ void Worker::changeMode(QString mode, QString url) httpTimer->stop(); socketDataReceived(); } + if(socket) { + if(socket->hasPendingDatagrams()) { + socketDataReceived(); + } + } + if(socket_2) { + if(socket_2->hasPendingDatagrams()) { + socket2DataReceived(); + } + } + if(socket_3) { + if(socket_3->hasPendingDatagrams()) { + socket3DataReceived(); + } + } + +} + +void Worker::socket3DataReceived() +{ + if(socket_3->hasPendingDatagrams()) { + while(this->mode == "" && this->url == "") { + QCoreApplication::processEvents(); + // qDebug() << "Worker is waiting for mode to be set."; + } + size_t data_size = socket_3->pendingDatagramSize(); + qDebug() << "Socket 3 has pending data: " << data_size; + if(data_size < 100000) { + char buff[data_size]; + socket_3->readDatagram(buff, data_size); + QByteArray data = QByteArray::fromRawData(buff, data_size); + if(QString::fromUtf8(data) == "") { + qDebug() << "Data Received from Service Threads."; + emit sendConfig(); + } + } + } } void Worker::socket2DataReceived() @@ -349,6 +415,9 @@ void Worker::socket2DataReceived() else if(mode == "udp") { qDebug() << "Last Updated on Socket data received in udp mode ignoring it."; } + else { + qDebug() << "Mode is not set in socket 2"; + } } } @@ -373,5 +442,34 @@ void Worker::socketDataReceived() else if(mode == "http") { qDebug() << "Socket data received in http mode ignoring it."; } + else { + qDebug() << "Mode is not set in socket."; + } } } + +QString UDPListener::mode() const +{ + return m_mode; +} + +void UDPListener::setMode(const QString &newMode) +{ + if (m_mode == newMode) + return; + m_mode = newMode; + emit modeChanged(); +} + +QString UDPListener::url() const +{ + return m_url; +} + +void UDPListener::setUrl(const QString &newUrl) +{ + if (m_url == newUrl) + return; + m_url = newUrl; + emit urlChanged(); +} diff --git a/udplistener.h b/udplistener.h index 8c123c8..079dd35 100644 --- a/udplistener.h +++ b/udplistener.h @@ -25,6 +25,7 @@ class Worker: public QObject { Q_OBJECT QUdpSocket *socket = nullptr; QUdpSocket *socket_2 = nullptr; + QUdpSocket *socket_3 = nullptr; QString mode = ""; QString url = ""; QNetworkAccessManager *manager = nullptr; @@ -32,6 +33,7 @@ class Worker: public QObject { public: explicit Worker(QObject *parent = nullptr); signals: + void sendConfig(); void stopped(); void socketError(QString error); void lastUpdateddatagramReceived(QByteArray data); @@ -43,6 +45,7 @@ public slots: void run(); void changeMode(QString mode, QString url); private slots: + void socket3DataReceived(); void socket2DataReceived(); void socketDataReceived(); }; @@ -52,6 +55,8 @@ class UDPListener : public QObject Q_OBJECT QML_ELEMENT Q_PROPERTY(double distance READ distance WRITE setDistance NOTIFY distanceChanged FINAL) + Q_PROPERTY(QString mode READ mode WRITE setMode NOTIFY modeChanged FINAL) + Q_PROPERTY(QString url READ url WRITE setUrl NOTIFY urlChanged FINAL) bool destroyed = false; #ifdef Q_OS_ANDROID service *service = nullptr; @@ -60,6 +65,12 @@ public: explicit UDPListener(QObject *parent = nullptr); double distance() const; void setDistance(double newDistance); + QString mode() const; + void setMode(const QString &newMode); + + QString url() const; + void setUrl(const QString &newUrl); + signals: void lastUpdatedChanged(QString last_updated, bool warn); void stopWorker(); @@ -70,7 +81,12 @@ signals: void disconnected(); void distanceReceived(double dist, QString timestamp); void changeWorkerMode(QString mode, QString url); + void modeChanged(); + void initLoadFinished(); + void urlChanged(); + public slots: + void sendConfigOnSet(); void moveAppToBackground(); void lastUpdateddatagramReceived(QByteArray data); void continueDestruction(); @@ -93,6 +109,8 @@ private: QThread *thread = nullptr; QTimer *timer = nullptr; bool m_flip_bits; + QString m_mode; + QString m_url; }; #endif // UDPLISTENER_H From 026ea972841109f1e324073b536de5971e9b7cf2 Mon Sep 17 00:00:00 2001 From: unrealdragon Date: Tue, 4 Aug 2026 21:31:40 +0530 Subject: [PATCH 13/24] Http Version - Initial Commit --- .gitignore | 2 + CMakeLists.txt | 46 ++++++++ ConnectButton.qml | 55 ++++++++++ Main.qml | 156 +++++++++++++++++++++++++++ SettingsBarIcon.qml | 46 ++++++++ SettingsPopup.qml | 251 ++++++++++++++++++++++++++++++++++++++++++++ WaterTank.qml | 162 ++++++++++++++++++++++++++++ configinterface.cpp | 53 ++++++++++ configinterface.h | 28 +++++ main.cpp | 18 ++++ requestworker.cpp | 112 ++++++++++++++++++++ requestworker.h | 49 +++++++++ 12 files changed, 978 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 ConnectButton.qml create mode 100644 Main.qml create mode 100644 SettingsBarIcon.qml create mode 100644 SettingsPopup.qml create mode 100644 WaterTank.qml create mode 100644 configinterface.cpp create mode 100644 configinterface.h create mode 100644 main.cpp create mode 100644 requestworker.cpp create mode 100644 requestworker.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c9e89eb --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +build/* +.qtcreator/* diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..103c3b1 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,46 @@ +cmake_minimum_required(VERSION 3.16) + +project(WaterLevelRewrite VERSION 0.1 LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +find_package(Qt6 REQUIRED COMPONENTS Quick) + +qt_standard_project_setup(REQUIRES 6.10) + +qt_add_executable(appWaterLevelRewrite + main.cpp +) + +qt_add_qml_module(appWaterLevelRewrite + URI WaterLevelRewrite + QML_FILES + Main.qml + QML_FILES WaterTank.qml + QML_FILES SettingsBarIcon.qml + QML_FILES SettingsPopup.qml + SOURCES configinterface.h configinterface.cpp + QML_FILES ConnectButton.qml + SOURCES requestworker.h requestworker.cpp +) + +# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1. +# If you are developing for iOS or macOS you should consider setting an +# explicit, fixed bundle identifier manually though. +set_target_properties(appWaterLevelRewrite PROPERTIES +# MACOSX_BUNDLE_GUI_IDENTIFIER com.example.appWaterLevelRewrite + MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} + MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} + MACOSX_BUNDLE TRUE + WIN32_EXECUTABLE TRUE +) + +target_link_libraries(appWaterLevelRewrite + PRIVATE Qt6::Quick +) + +install(TARGETS appWaterLevelRewrite + BUNDLE DESTINATION . + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} +) diff --git a/ConnectButton.qml b/ConnectButton.qml new file mode 100644 index 0000000..9225e44 --- /dev/null +++ b/ConnectButton.qml @@ -0,0 +1,55 @@ +import QtQuick +import QtQuick.Effects +import QtQuick.Controls +import QtQuick.Controls.Material + +Rectangle { + id: root + property color accent_color: "#00000000" + property color font_color: "#00000000" + property int font_enlarged_text_size: 20 + property int font_normal_text_size: 16 + property string text: "Connect" + signal connect; + layer.enabled: true + layer.effect: MultiEffect { + shadowEnabled: true + } + + Text { + anchors.centerIn: parent + font.pointSize: root.font_enlarged_text_size + color: root.font_color + text: root.text + horizontalAlignment: Text.AlignHCenter + } + + radius: 5 + border { + color: root.accent_color + width: 0.5 + } + MouseArea { + id: settings_button_area + anchors.fill: parent + hoverEnabled: true + property color settings_rect_pressed_prev: "#00000000" + property color settings_rect_entered_prev: "#00000000" + onEntered: { + settings_rect_entered_prev = root.color + root.color = "#5A1F1F1F" + } + onExited: { + root.color = settings_rect_entered_prev + } + onPressed: { + settings_rect_pressed_prev = root.color + root.color = "#5A1F4F1F" + root.connect(); + } + onReleased: { + root.color = settings_rect_pressed_prev + } + } + +} diff --git a/Main.qml b/Main.qml new file mode 100644 index 0000000..db445e4 --- /dev/null +++ b/Main.qml @@ -0,0 +1,156 @@ +import QtQuick +import WaterLevelRewrite +import QtQuick.Effects +import QtQuick.Controls +import QtQuick.Controls.Material + +Window { + width: 640 + height: 1080 + visible: true + title: qsTr("Water Level Rewrite") + id: root + property color accent_color: "#F05FAF5F" + property color dark_accent_color: "#FF5F7F5F" + property color danger_color: "#F0AF2F1F" + property color water_color: "#F00F7FAF" + property color background_color: "#1F1F1F" + Material.accent: root.accent_color + property int font_enlarged_text_size: 20 + property int font_normal_text_size: 16 + property int distance_count_thres: 3 + property string mode: "http" + property string status: "Initializing" + + + Rectangle { + anchors.fill: parent + color: root.background_color + + Rectangle { + id: top_bar + height: Math.min(root.height / 12, 100) + width: root.width + anchors { + top: parent.top + horizontalCenter: parent.horizontalCenter + topMargin: 25 + } + color: "#0A0F0F0F" + SettingsBarIcon { + height: top_bar.height - 20 + width: top_bar.width / 12 + anchors { + top: parent.top + left: parent.left + bottomMargin: 5 + topMargin: 5 + leftMargin: 5 + } + color: "#0A0F0F0F" + radius: 100 + accent_color: root.accent_color + onOpen: { + settings_popup.open() + } + } + } + + SettingsPopup { + id: settings_popup + accent_color: root.accent_color + font_enlarged_text_size: 20 + function setConfig(new_config: var) { + settings_popup.config.max = new_config.max + settings_popup.config.min = new_config.min + settings_popup.config.alert = new_config.alert + settings_popup.config.url = new_config.url + } + onSaveConfig: (config) => { + console.log("Saving config: ", config) + config_interface.saveConfig(config); + } + } + + WaterTank { + id: tank + anchors { + top: top_bar.bottom + horizontalCenter: parent.horizontalCenter + topMargin: 0 + } + height: (parent.height - top_bar.height) / 1.2 + width: parent.width / 1.2 + base_color: root.background_color + distance: 0 + tank_lid_color: "#F0121212" + tank_base_color: "#0FFFFFFF" + water_level_color: "#F00F7FAF" + tank_base_border_color: "#F0121212" + min_thres_input: 0 + max_thres_input: 0 + } + + Text { + id: status + text: root.status + anchors { + bottom: connect_button.top + bottomMargin: 20 + horizontalCenter: parent.horizontalCenter + } + horizontalAlignment: Text.AlignHCenter + color: root.accent_color + font.pointSize: root.font_normal_text_size + } + + ConnectButton { + id: connect_button + height: parent.height / 20 + width: parent.width / 4 + font_color: root.accent_color + font_enlarged_text_size: root.font_enlarged_text_size + font_normal_text_size: root.font_normal_text_size + color: root.background_color + accent_color: root.accent_color + anchors { + horizontalCenter: parent.horizontalCenter + bottom: parent.bottom + bottomMargin: 50 + } + onConnect: { + requester.start(); + root.status = "Waiting to Send."; + } + } + } + + RequestWorker { + id: requester + onStatusChanged: () => { + root.status = requester.status; + } + onNetworkReply: (water_level, fill_rate, expected) => { + tank.setDistance(water_level); + tank.rate_of_fill = fill_rate; + tank.expected_to_fill = expected; + } + } + + ConfigInterface { + id: config_interface + fileName: "config.json" + onConfig: (config) => { + settings_popup.config = config + console.log("Loading initial config"); + setConfig(config); + if(root.status === "Initializing") { + root.status = "Waiting to connect."; + } + } + function setConfig(config) { + tank.setConfig(config); + requester.setConfig(config); + } + } +} diff --git a/SettingsBarIcon.qml b/SettingsBarIcon.qml new file mode 100644 index 0000000..d360331 --- /dev/null +++ b/SettingsBarIcon.qml @@ -0,0 +1,46 @@ +import QtQuick +import QtQuick.Effects +import QtQuick.Controls +import QtQuick.Controls.Material + +Rectangle { + id: settings_rect + signal open; + property color accent_color: "#00000000" + property int font_enlarged_text_size: 20 + Behavior on color { + ColorAnimation { + duration: 200 + } + } + Text { + id: settings_text + text: "⚙" + anchors.centerIn: parent + color: settings_rect.accent_color + font.pointSize: settings_rect.font_enlarged_text_size + } + + MouseArea { + id: settings_button_area + anchors.fill: parent + hoverEnabled: true + property color settings_rect_pressed_prev: "#00000000" + property color settings_rect_entered_prev: "#00000000" + onEntered: { + settings_rect_entered_prev = settings_rect.color + settings_rect.color = "#5A1F1F1F" + } + onExited: { + settings_rect.color = settings_rect_entered_prev + } + onPressed: { + settings_rect_pressed_prev = settings_rect.color + settings_rect.color = "#5A1F4F1F" + settings_rect.open(); + } + onReleased: { + settings_rect.color = settings_rect_pressed_prev + } + } +} diff --git a/SettingsPopup.qml b/SettingsPopup.qml new file mode 100644 index 0000000..051c306 --- /dev/null +++ b/SettingsPopup.qml @@ -0,0 +1,251 @@ +import QtQuick +import QtQuick.Effects +import QtQuick.Controls +import QtQuick.Controls.Material + +Popup { + id: settings_popup + signal saveConfig(config: var) + property color accent_color: "#00000000" + property int font_enlarged_text_size: 20 + property int font_normal_text_size: 16 + property var config: { + "max": 0, + "min": 0, + "alert": 0, + "interval": 0, + "url": "none" + } + + background: Rectangle { + color: "#F0121212" + radius: 5 + border.color: settings_popup.accent_color + border.width: 1 + } + height: Math.max(parent.height / 1.2, contentHeight) + width: parent.width / 1.1 + anchors.centerIn: Overlay.overlay + Rectangle { + id: settings_base + anchors.fill: parent + color: "#F0121212" + + Text { + id: settings_label + text: "Settings" + width: parent.width + anchors { + top: parent.top + horizontalCenter: parent.horizontalCenter + } + horizontalAlignment: Text.AlignHCenter + color: settings_popup.accent_color + font.pointSize: settings_popup.font_enlarged_text_size + } + + + Text { + id: max_thres_label + text: "Max Threshold: " + anchors { + topMargin: 20 + top: settings_label.bottom + left: parent.left + verticalCenter: max_thres_input.verticalCenter + } + height: max_thres_input.height + verticalAlignment: Text.AlignVCenter + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + } + + TextField { + id: max_thres_input + text: config.max + anchors { + right: parent.right + rightMargin: 5 + top: settings_label.bottom + topMargin: 20 + } + width: parent.width / 2 + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + } + + + Text { + id: min_thres_label + text: "Min Threshold: " + anchors { + topMargin: 20 + top: max_thres_label.bottom + left: parent.left + verticalCenter: min_thres_input.verticalCenter + } + height: min_thres_input.height + verticalAlignment: Text.AlignVCenter + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + } + + TextField { + id: min_thres_input + text: config.min + anchors { + right: parent.right + rightMargin: 5 + top: max_thres_label.bottom + topMargin: 20 + } + width: parent.width / 2 + color: root.accent_color + font.pointSize: root.font_normal_text_size + } + + + Text { + id: alert_thres_label + text: "Alert Percentage: " + anchors { + topMargin: 20 + top: min_thres_label.bottom + left: parent.left + verticalCenter: alert_thres_input.verticalCenter + } + height: alert_thres_input.height + verticalAlignment: Text.AlignVCenter + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + } + + TextField { + id: alert_thres_input + text: config.alert + anchors { + right: parent.right + rightMargin: 5 + top: min_thres_label.bottom + topMargin: 20 + } + width: parent.width / 2 + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + } + + Text { + id: interval_label + text: "Update Interval: " + anchors { + topMargin: 20 + top: alert_thres_label.bottom + left: parent.left + verticalCenter: interval_input.verticalCenter + } + height: interval_input.height + verticalAlignment: Text.AlignVCenter + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + } + + + TextField { + id: interval_input + text: config.interval + anchors { + right: parent.right + rightMargin: 5 + top: alert_thres_input.bottom + topMargin: 20 + } + width: parent.width / 2 + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + } + + Text { + id: http_url_label + text: "Url: " + anchors { + topMargin: 20 + top: interval_label.bottom + left: parent.left + verticalCenter: http_url_input.verticalCenter + } + height: http_url_input.height + verticalAlignment: Text.AlignVCenter + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + } + + TextField { + id: http_url_input + text: config.url + anchors { + right: parent.right + rightMargin: 20 + leftMargin: 20 + top: interval_input.bottom + topMargin: 20 + } + width: Math.max(parent.width / 2, parent.width - http_url_label.width - anchors.leftMargin) + color: settings_popup.accent_color + font.pointSize: settings_popup.font_normal_text_size + cursorPosition: 0 + } + + Rectangle { + id: save_config + anchors { + topMargin: 10 + bottom: parent.bottom + horizontalCenter: parent.horizontalCenter + } + color: "#F0121212" + width: parent.width / 1.3 + height: 60 + border { + width: 1 + color: settings_popup.accent_color + } + radius: 3 + + Text { + anchors.centerIn: parent + text: "Save" + color: settings_popup.accent_color + font.pointSize: settings_popup.font_enlarged_text_size + } + MouseArea { + anchors.fill: parent + hoverEnabled: true + property color settings_rect_pressed_prev: "#00000000" + property color settings_rect_entered_prev: "#00000000" + onEntered: { + settings_rect_entered_prev = save_config.color + save_config.color = "#5A1F1F1F" + } + onExited: { + save_config.color = settings_rect_entered_prev + } + onPressed: { + settings_rect_pressed_prev = save_config.color + save_config.color = "#5A1F4F1F" + let max = parseFloat(max_thres_input.text); + let min = parseFloat(min_thres_input.text); + let alert = parseFloat(alert_thres_input.text); + let url = http_url_input.text; + let interval = parseInt(interval_input.text); + var new_config = {"max": max, "min": min, "alert": alert, "url": url, "interval": interval} + settings_popup.saveConfig(new_config) + settings_popup.close(); + } + onReleased: { + save_config.color = settings_rect_pressed_prev + } + } + + } + } +} \ No newline at end of file diff --git a/WaterTank.qml b/WaterTank.qml new file mode 100644 index 0000000..5c1b5af --- /dev/null +++ b/WaterTank.qml @@ -0,0 +1,162 @@ +import QtQuick +import QtQuick.Effects +import QtQuick.Controls +import QtQuick.Controls.Material + +Item { + id: root + property color base_color: "#000F0F0F" + property color tank_lid_color: "#F0121212" + property color tank_base_color: "#00FFFFFF" + property color water_level_color: "#F00F7FAF" + property color tank_base_border_color: "#F0121212" + property color text_color: "#F05FAF5F" + property double height_max: tank_base.height - 10 + property double current_level: 0 + property double percentage_filled: 0 + property double distance: 0 + property double min_thres_input: 0 + property double max_thres_input: 0 + property double rate_of_fill: 0 + property double expected_to_fill: 0 + + Rectangle { + id: base + color: root.base_color + anchors.fill: parent + Rectangle { + id: tank_lid + color: root.tank_lid_color + anchors { + bottom: tank_base.top + horizontalCenter: tank_base.horizontalCenter + bottomMargin: -5 + } + radius: 10 + width: parent.width / 4 + height: parent.height / 15 + } + + Rectangle { + id: tank_base + color: root.tank_base_color + anchors.centerIn: parent + width: parent.width / 2 + height: parent.height / 2 + border.color: root.tank_base_border_color + border.width: 5 + radius: 4 + } + + Rectangle { + id: water_level + color: root.water_level_color + height: root.current_level + width: tank_base.width - 10 + anchors { + bottom: tank_base.bottom + horizontalCenter: tank_base.horizontalCenter + bottomMargin: 5 + } + Behavior on color { + ColorAnimation { + duration: 200 + } + } + Behavior on height { + NumberAnimation { + duration: 200 + } + } + } + + Text { + id: water_level_reading + text: "Current Reading: " + root.distance + " cm" + font.pointSize: 16 + color: root.text_color + anchors { + margins: 5 + top: tank_base.bottom + horizontalCenter: parent.horizontalCenter + } + horizontalAlignment: Text.AlignHCenter + } + + Text { + id: water_level_percentage + text: "Percentage: " + root.percentage_filled + " %" + font.pointSize: 16 + color: root.text_color + anchors { + margins: 5 + top: water_level_reading.bottom + horizontalCenter: parent.horizontalCenter + } + horizontalAlignment: Text.AlignHCenter + } + + Text { + id: fill_status + text: "Filling status: " + (( root.rate_of_fill > 0)? "Filling" : "Discharging") + font.pointSize: 16 + color: root.text_color + anchors { + margins: 5 + top: water_level_percentage.bottom + horizontalCenter: parent.horizontalCenter + } + horizontalAlignment: Text.AlignHCenter + } + Text { + id: rate_of_fill_label + text: "Rate of fill: " + root.rate_of_fill + " cm/s" + font.pointSize: 16 + color: root.text_color + anchors { + margins: 5 + top: fill_status.bottom + horizontalCenter: parent.horizontalCenter + } + horizontalAlignment: Text.AlignHCenter + } + Text { + id: expected_to_fill_label + text: "Expected to fill in: " + root.expected_to_fill + " s" + font.pointSize: 16 + color: root.text_color + visible: (root.rate_of_fill > 1) ? true : false + anchors { + margins: 5 + top: rate_of_fill_label.bottom + horizontalCenter: parent.horizontalCenter + } + horizontalAlignment: Text.AlignHCenter + } + } + function setConfig(config: var) { + min_thres_input = config.min; + max_thres_input = config.max; + } + + function setDistance(distance) { + root.distance = distance; + console.log("Distance changed to: ", distance); + let current_min_reading = Math.max(0, min_thres_input); + let effective_max_reading = Math.max(0, max_thres_input) - current_min_reading; + let current_reading = Math.max(0, root.distance - current_min_reading); + console.log("Current reading is: " + current_reading) + console.log("Current min reading is: " + current_min_reading) + console.log("Effective max reading is: " + effective_max_reading) + + let height_max_possible = root.height_max; + let percentage_filled = Math.max(0, ((effective_max_reading - current_reading) / effective_max_reading * 100)) + let normalized_height = percentage_filled * height_max_possible / 100; + console.log("Current reading is: " + current_reading) + console.log("Normalized height is: " + normalized_height) + console.log("Percentage filled is: " + percentage_filled) + root.current_level = normalized_height; + root.percentage_filled = percentage_filled; + } +} + diff --git a/configinterface.cpp b/configinterface.cpp new file mode 100644 index 0000000..258560f --- /dev/null +++ b/configinterface.cpp @@ -0,0 +1,53 @@ +#include "configinterface.h" + +#include +#include + +ConfigInterface::ConfigInterface(QObject *parent) + : QObject{parent} +{ +} + +QString ConfigInterface::fileName() const +{ + return m_fileName; +} + +void ConfigInterface::setFileName(const QString &newFileName) +{ + if (m_fileName == newFileName) + return; + m_fileName = newFileName; + std::fstream input(newFileName.toStdString(), std::fstream::in); + if(!input.is_open()) { + return; + } + std::string data; + std::string temp; + while(std::getline(input, temp)) { + data += temp; + } + input.flush(); + input.close(); + QByteArray arr_data(data); + QJsonDocument doc = QJsonDocument::fromJson(arr_data); + // The following works even the qml part is not initailzed/connected + // do not change back to just emit config() + QMetaObject::invokeMethod(this, &ConfigInterface::config, Qt::QueuedConnection, doc.object()); + emit fileNameChanged(); +} + +void ConfigInterface::saveConfig(QJsonObject config) +{ + QJsonDocument doc; + doc.setObject(config); + std::string data = doc.toJson().toStdString(); + std::fstream output(m_fileName.toStdString(), std::fstream::out); + if(!output.is_open()) { + return; + } + output << data; + output.flush(); + output.close(); + QMetaObject::invokeMethod(this, &ConfigInterface::config, Qt::QueuedConnection, doc.object()); +} diff --git a/configinterface.h b/configinterface.h new file mode 100644 index 0000000..606b496 --- /dev/null +++ b/configinterface.h @@ -0,0 +1,28 @@ +#ifndef CONFIGINTERFACE_H +#define CONFIGINTERFACE_H + +#include +#include +#include +#include +#include + +class ConfigInterface : public QObject +{ + Q_OBJECT + QML_ELEMENT + Q_PROPERTY(QString fileName READ fileName WRITE setFileName NOTIFY fileNameChanged FINAL) +public: + explicit ConfigInterface(QObject *parent = nullptr); + QString fileName() const; + void setFileName(const QString &newFileName); +signals: + void config(QJsonObject config); + void fileNameChanged(); +public slots: + void saveConfig(QJsonObject config); +private: + QString m_fileName; +}; + +#endif // CONFIGINTERFACE_H diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..c438cd2 --- /dev/null +++ b/main.cpp @@ -0,0 +1,18 @@ +#include +#include + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + + QQmlApplicationEngine engine; + QObject::connect( + &engine, + &QQmlApplicationEngine::objectCreationFailed, + &app, + []() { QCoreApplication::exit(-1); }, + Qt::QueuedConnection); + engine.loadFromModule("WaterLevelRewrite", "Main"); + + return QCoreApplication::exec(); +} diff --git a/requestworker.cpp b/requestworker.cpp new file mode 100644 index 0000000..eff8079 --- /dev/null +++ b/requestworker.cpp @@ -0,0 +1,112 @@ +#include "requestworker.h" +#include +#include +#include +#include + +RequestWorker::RequestWorker(QObject *parent) + : QObject{parent} +{ + +} + +void RequestWorker::setConfig(QJsonObject config) +{ + this->url = config["url"].toString(); + this->interval = config["interval"].toInt(); + this->max_height = config["max"].toInt(); + this->min_height = config["min"].toInt(); + qDebug() << "In cpp config values are: "; + qDebug() << "Url: " << url; + qDebug() << "Interval: " << interval; + qDebug() << "Max Height: " << max_height; + qDebug() << "Min Height: " << min_height; +} + +void RequestWorker::start() +{ + if(manager) { + manager->deleteLater(); + manager = nullptr; + } + manager = new QNetworkAccessManager(); + if(timer) { + timer->deleteLater(); + timer = nullptr; + } + timer = new QTimer(this); + timer->setInterval(interval); + timer->setSingleShot(true); + connect(timer, &QTimer::timeout, this, &RequestWorker::makeRequest); + timer->start(); + stop_timer = false; + setStatus("Waiting to send."); +} + +void RequestWorker::stop() +{ + if(timer->isActive()) + timer->stop(); + stop_timer = true; +} + +void RequestWorker::makeRequest() +{ + if(stop_timer) + return; + QNetworkRequest req; + req.setUrl(this->url); + disconnect(manager, nullptr, nullptr, nullptr); + connect(manager, &QNetworkAccessManager::finished, this, &RequestWorker::requestFinished); + manager->setTransferTimeout(15000); + manager->get(req); + setStatus("Request sent; Waiting for Reply."); +} + +void RequestWorker::requestFinished(QNetworkReply *rep) +{ + QByteArray data = rep->readAll(); + rep->deleteLater(); + rep = nullptr; + auto now = std::chrono::high_resolution_clock::now(); + auto time_diff = std::chrono::duration_cast(now - prev_time); + unsigned int time_in_microseconds = time_diff.count(); + QJsonObject jdata = QJsonDocument::fromJson(data).object(); + auto data_water_level = jdata["water_level"].toInt(); + float water_level = (float) ((float) (data_water_level) / 10.0); + float rate_of_fill = ( float )(water_level - prev_distance) /(float) time_in_microseconds; + rate_of_fill = rate_of_fill * 1'000'000; + int expected_to_fill = (max_height - water_level) / rate_of_fill; + if(reply_number == 0) { + rate_of_fill = 0; + expected_to_fill = 0; + } + reply_number = 1; + qDebug() << "Got water level: " << water_level; + qDebug() << "Got rate of fill: " << rate_of_fill; + qDebug() << "Got expected to fill: " << expected_to_fill; + qDebug() << "Time difference: " << time_in_microseconds; + prev_distance = water_level; + emit networkReply(water_level, rate_of_fill, expected_to_fill); + if(stop_timer) { + setStatus("Timer stopped."); + return; + } + prev_time = now; + timer->start(); + QString status = "Got Reply on: " + QDateTime::currentDateTime().toString("hh:mm:ss") + "; Waiting to Send."; + setStatus(status); +} + +QString RequestWorker::status() const +{ + return m_status; +} + +void RequestWorker::setStatus(const QString &newStatus) +{ + if (m_status == newStatus) + return; + m_status = newStatus; + emit statusChanged(); +} diff --git a/requestworker.h b/requestworker.h new file mode 100644 index 0000000..05fbafa --- /dev/null +++ b/requestworker.h @@ -0,0 +1,49 @@ +#ifndef REQUESTWORKER_H +#define REQUESTWORKER_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class RequestWorker : public QObject +{ + Q_OBJECT + QML_ELEMENT + Q_PROPERTY(QString status READ status WRITE setStatus NOTIFY statusChanged FINAL) + QNetworkAccessManager *manager = nullptr; + QTimer *timer = nullptr; + QString url; + int interval; + float prev_distance = 0; + int max_height = 0; + int min_height = 0; + bool stop_timer = false; + int reply_number = 0; + std::chrono::time_point prev_time; +public: + explicit RequestWorker(QObject *parent = nullptr); + + QString status() const; + void setStatus(const QString &newStatus); + +signals: + void networkReply(float distance, float rate_of_fill, int expected_to_fill); + void statusChanged(); + +public slots: + void setConfig(QJsonObject config); + void start(); + void stop(); +private slots: + void makeRequest(); + void requestFinished(QNetworkReply *rep); +private: + QString m_status; +}; + +#endif // REQUESTWORKER_H From e1d57eae3288f7d980041724e13538d4e0718c12 Mon Sep 17 00:00:00 2001 From: unrealdragon Date: Wed, 12 Aug 2026 14:32:54 +0530 Subject: [PATCH 14/24] Http Version - Fix to show error when requests fail, and changed display type of distance in UI from float to Int --- ConnectButton.qml | 12 ++++++++++-- Main.qml | 27 +++++++++++++++++++-------- SettingsPopup.qml | 4 ++-- WaterTank.qml | 19 ++++++++++--------- requestworker.cpp | 12 ++++++++++-- requestworker.h | 3 ++- 6 files changed, 53 insertions(+), 24 deletions(-) diff --git a/ConnectButton.qml b/ConnectButton.qml index 9225e44..dd058bc 100644 --- a/ConnectButton.qml +++ b/ConnectButton.qml @@ -10,6 +10,8 @@ Rectangle { property int font_enlarged_text_size: 20 property int font_normal_text_size: 16 property string text: "Connect" + property string text2: "Stop" + property int mode: 0 signal connect; layer.enabled: true layer.effect: MultiEffect { @@ -20,7 +22,7 @@ Rectangle { anchors.centerIn: parent font.pointSize: root.font_enlarged_text_size color: root.font_color - text: root.text + text: mode ? root.text2 : root.text horizontalAlignment: Text.AlignHCenter } @@ -46,10 +48,16 @@ Rectangle { settings_rect_pressed_prev = root.color root.color = "#5A1F4F1F" root.connect(); + switchMode(); } onReleased: { root.color = settings_rect_pressed_prev } } - + function switchMode() { + if(root.mode === 0) + root.mode = 1 + else + root.mode = 0; + } } diff --git a/Main.qml b/Main.qml index db445e4..950a2b9 100644 --- a/Main.qml +++ b/Main.qml @@ -39,10 +39,10 @@ Window { color: "#0A0F0F0F" SettingsBarIcon { height: top_bar.height - 20 - width: top_bar.width / 12 + width: height anchors { top: parent.top - left: parent.left + right: parent.right bottomMargin: 5 topMargin: 5 leftMargin: 5 @@ -77,10 +77,10 @@ Window { anchors { top: top_bar.bottom horizontalCenter: parent.horizontalCenter - topMargin: 0 + topMargin: 100 } - height: (parent.height - top_bar.height) / 1.2 - width: parent.width / 1.2 + height: (parent.height - top_bar.height) / 2 + width: parent.width / 2.2 base_color: root.background_color distance: 0 tank_lid_color: "#F0121212" @@ -119,8 +119,15 @@ Window { bottomMargin: 50 } onConnect: { - requester.start(); - root.status = "Waiting to Send."; + if(connect_button.mode === 0) + { + requester.start(); + root.status = "Waiting to Send."; + } + else { + root.status = "Stopped."; + requester.stop(); + } } } } @@ -134,6 +141,10 @@ Window { tank.setDistance(water_level); tank.rate_of_fill = fill_rate; tank.expected_to_fill = expected; + status.color = root.accent_color; + } + onRequestFailed: () => { + status.color = root.danger_color; } } @@ -145,7 +156,7 @@ Window { console.log("Loading initial config"); setConfig(config); if(root.status === "Initializing") { - root.status = "Waiting to connect."; + root.status = "Press Connect."; } } function setConfig(config) { diff --git a/SettingsPopup.qml b/SettingsPopup.qml index 051c306..41f5cc7 100644 --- a/SettingsPopup.qml +++ b/SettingsPopup.qml @@ -23,8 +23,8 @@ Popup { border.color: settings_popup.accent_color border.width: 1 } - height: Math.max(parent.height / 1.2, contentHeight) - width: parent.width / 1.1 + height: Math.max(parent.height / 1.6, contentHeight) + width: parent.width / 1.2 anchors.centerIn: Overlay.overlay Rectangle { id: settings_base diff --git a/WaterTank.qml b/WaterTank.qml index 5c1b5af..dc264f1 100644 --- a/WaterTank.qml +++ b/WaterTank.qml @@ -14,7 +14,7 @@ Item { property double height_max: tank_base.height - 10 property double current_level: 0 property double percentage_filled: 0 - property double distance: 0 + property int distance: 0 property double min_thres_input: 0 property double max_thres_input: 0 property double rate_of_fill: 0 @@ -33,16 +33,16 @@ Item { bottomMargin: -5 } radius: 10 - width: parent.width / 4 - height: parent.height / 15 + width: tank_base.width / 3 + height: tank_base.height / 15 } Rectangle { id: tank_base color: root.tank_base_color anchors.centerIn: parent - width: parent.width / 2 - height: parent.height / 2 + width: parent.width + height: parent.height border.color: root.tank_base_border_color border.width: 5 radius: 4 @@ -72,7 +72,7 @@ Item { Text { id: water_level_reading - text: "Current Reading: " + root.distance + " cm" + text: "Current Reading: " + (root.distance / 10)+ " cm" font.pointSize: 16 color: root.text_color anchors { @@ -125,7 +125,7 @@ Item { text: "Expected to fill in: " + root.expected_to_fill + " s" font.pointSize: 16 color: root.text_color - visible: (root.rate_of_fill > 1) ? true : false + visible: (root.rate_of_fill > 0) ? true : false anchors { margins: 5 top: rate_of_fill_label.bottom @@ -141,10 +141,11 @@ Item { function setDistance(distance) { root.distance = distance; - console.log("Distance changed to: ", distance); + let distance_f = distance / 10; + console.log("Distance changed to: ", distance_f); let current_min_reading = Math.max(0, min_thres_input); let effective_max_reading = Math.max(0, max_thres_input) - current_min_reading; - let current_reading = Math.max(0, root.distance - current_min_reading); + let current_reading = Math.max(0, distance_f - current_min_reading); console.log("Current reading is: " + current_reading) console.log("Current min reading is: " + current_min_reading) console.log("Effective max reading is: " + effective_max_reading) diff --git a/requestworker.cpp b/requestworker.cpp index eff8079..be64b2f 100644 --- a/requestworker.cpp +++ b/requestworker.cpp @@ -48,6 +48,7 @@ void RequestWorker::stop() if(timer->isActive()) timer->stop(); stop_timer = true; + qDebug() << "Stopping" << timer->isActive(); } void RequestWorker::makeRequest() @@ -70,11 +71,18 @@ void RequestWorker::requestFinished(QNetworkReply *rep) rep = nullptr; auto now = std::chrono::high_resolution_clock::now(); auto time_diff = std::chrono::duration_cast(now - prev_time); + if(data.size() == 0) { + prev_time = now; + timer->start(); + emit requestFailed(); + emit setStatus("Invalid Response; Resending Request"); + return; + } unsigned int time_in_microseconds = time_diff.count(); QJsonObject jdata = QJsonDocument::fromJson(data).object(); auto data_water_level = jdata["water_level"].toInt(); float water_level = (float) ((float) (data_water_level) / 10.0); - float rate_of_fill = ( float )(water_level - prev_distance) /(float) time_in_microseconds; + float rate_of_fill = ( float )(prev_distance - water_level) /(float) time_in_microseconds; rate_of_fill = rate_of_fill * 1'000'000; int expected_to_fill = (max_height - water_level) / rate_of_fill; if(reply_number == 0) { @@ -87,7 +95,7 @@ void RequestWorker::requestFinished(QNetworkReply *rep) qDebug() << "Got expected to fill: " << expected_to_fill; qDebug() << "Time difference: " << time_in_microseconds; prev_distance = water_level; - emit networkReply(water_level, rate_of_fill, expected_to_fill); + emit networkReply(data_water_level, rate_of_fill, expected_to_fill); if(stop_timer) { setStatus("Timer stopped."); return; diff --git a/requestworker.h b/requestworker.h index 05fbafa..37d0888 100644 --- a/requestworker.h +++ b/requestworker.h @@ -32,7 +32,8 @@ public: void setStatus(const QString &newStatus); signals: - void networkReply(float distance, float rate_of_fill, int expected_to_fill); + void requestFailed(); + void networkReply(int distance, float rate_of_fill, int expected_to_fill); void statusChanged(); public slots: From 99bc9209af266aab2af1652a5360e1ada3d0b0af Mon Sep 17 00:00:00 2001 From: unrealdragon Date: Wed, 12 Aug 2026 14:58:48 +0530 Subject: [PATCH 15/24] Http Version - Fix to calculate the fill rate. --- requestworker.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requestworker.cpp b/requestworker.cpp index be64b2f..649d515 100644 --- a/requestworker.cpp +++ b/requestworker.cpp @@ -84,7 +84,7 @@ void RequestWorker::requestFinished(QNetworkReply *rep) float water_level = (float) ((float) (data_water_level) / 10.0); float rate_of_fill = ( float )(prev_distance - water_level) /(float) time_in_microseconds; rate_of_fill = rate_of_fill * 1'000'000; - int expected_to_fill = (max_height - water_level) / rate_of_fill; + int expected_to_fill = (water_level - min_height) / rate_of_fill; if(reply_number == 0) { rate_of_fill = 0; expected_to_fill = 0; From 07bd73bb334b5bfdb3dc639d5cf11a86bd0f0c60 Mon Sep 17 00:00:00 2001 From: unrealdragon Date: Wed, 12 Aug 2026 18:22:15 +0530 Subject: [PATCH 16/24] Http Version - Added Alarm Button. --- CMakeLists.txt | 10 ++--- Main.qml | 105 +++++++++++++++++++++++++++++++++++++--------- echo.mp3 | Bin 0 -> 260014 bytes media.qrc | 5 +++ requestworker.cpp | 59 ++++++++++++++++++++++++++ requestworker.h | 13 +++++- 6 files changed, 165 insertions(+), 27 deletions(-) create mode 100644 echo.mp3 create mode 100644 media.qrc diff --git a/CMakeLists.txt b/CMakeLists.txt index 103c3b1..eff65b6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,13 +3,15 @@ cmake_minimum_required(VERSION 3.16) project(WaterLevelRewrite VERSION 0.1 LANGUAGES CXX) set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_AUTORCC ON) -find_package(Qt6 REQUIRED COMPONENTS Quick) +find_package(Qt6 REQUIRED COMPONENTS Quick Multimedia) qt_standard_project_setup(REQUIRES 6.10) qt_add_executable(appWaterLevelRewrite main.cpp + media.qrc ) qt_add_qml_module(appWaterLevelRewrite @@ -22,11 +24,9 @@ qt_add_qml_module(appWaterLevelRewrite SOURCES configinterface.h configinterface.cpp QML_FILES ConnectButton.qml SOURCES requestworker.h requestworker.cpp + RESOURCES media.qrc ) -# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1. -# If you are developing for iOS or macOS you should consider setting an -# explicit, fixed bundle identifier manually though. set_target_properties(appWaterLevelRewrite PROPERTIES # MACOSX_BUNDLE_GUI_IDENTIFIER com.example.appWaterLevelRewrite MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} @@ -36,7 +36,7 @@ set_target_properties(appWaterLevelRewrite PROPERTIES ) target_link_libraries(appWaterLevelRewrite - PRIVATE Qt6::Quick + PRIVATE Qt6::Quick Qt6::Multimedia ) install(TARGETS appWaterLevelRewrite diff --git a/Main.qml b/Main.qml index 950a2b9..1b6c5fc 100644 --- a/Main.qml +++ b/Main.qml @@ -21,7 +21,8 @@ Window { property int distance_count_thres: 3 property string mode: "http" property string status: "Initializing" - + property string alarm_status_text: "" + property var root_config: ({}) Rectangle { anchors.fill: parent @@ -91,11 +92,13 @@ Window { max_thres_input: 0 } + Text { - id: status - text: root.status + id: alarm_status + text: root.alarm_status_text + visible: (root.alarm_status_text.length > 0 ) ? true : false anchors { - bottom: connect_button.top + bottom: status.top bottomMargin: 20 horizontalCenter: parent.horizontalCenter } @@ -104,32 +107,90 @@ Window { font.pointSize: root.font_normal_text_size } - ConnectButton { - id: connect_button + Text { + id: status + text: root.status + anchors { + bottom: button_base.top + bottomMargin: 20 + horizontalCenter: parent.horizontalCenter + } + horizontalAlignment: Text.AlignHCenter + color: root.accent_color + font.pointSize: root.font_normal_text_size + } + + Rectangle { + id: button_base + color: "#00000000" + width: parent.width / 1.5 height: parent.height / 20 - width: parent.width / 4 - font_color: root.accent_color - font_enlarged_text_size: root.font_enlarged_text_size - font_normal_text_size: root.font_normal_text_size - color: root.background_color - accent_color: root.accent_color anchors { horizontalCenter: parent.horizontalCenter bottom: parent.bottom bottomMargin: 50 } - onConnect: { - if(connect_button.mode === 0) - { - requester.start(); - root.status = "Waiting to Send."; + ConnectButton { + id: connect_button + width: parent.width / 2.1 + height: parent.height + font_color: root.accent_color + font_enlarged_text_size: root.font_enlarged_text_size + font_normal_text_size: root.font_normal_text_size + color: root.background_color + accent_color: root.accent_color + anchors { + left: parent.left + leftMargin: 5 + bottom: parent.bottom + bottomMargin: 5 } - else { - root.status = "Stopped."; - requester.stop(); + onConnect: { + if(connect_button.mode === 0) + { + requester.start(); + root.status = "Waiting to Send."; + } + else { + root.status = "Stopped."; + requester.stop(); + } } } + + ConnectButton { + id: start_alarm + width: parent.width / 2.1 + height: parent.height + font_color: root.accent_color + font_enlarged_text_size: root.font_enlarged_text_size + font_normal_text_size: root.font_normal_text_size + color: root.background_color + accent_color: root.accent_color + text: "Start Alarm" + text2: "Stop Alarm" + anchors { + left: connect_button.right + leftMargin: 10 + bottom: parent.bottom + bottomMargin: 5 + } + onConnect: { + if(start_alarm.mode === 0) + { + requester.startAlarm(); + root.alarm_status_text = "Started Alarm; Waiting for Trigger: " + root.root_config.alert + "%" + } + else { + requester.stopAlarm(); + root.alarm_status_text = ""; + } + } + } + } + + } RequestWorker { @@ -162,6 +223,10 @@ Window { function setConfig(config) { tank.setConfig(config); requester.setConfig(config); + root.root_config = config; } } + onClosing: { + requester.stopAlarm(); + } } diff --git a/echo.mp3 b/echo.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..4373d95b8e589c822768b7332ba5baa413d9f696 GIT binary patch literal 260014 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Á z_nv6Vl`_|)tHbT2N=}!WZcxFFgmzPgdymtK$|G9Mns6~ac3{qFNAEgS|LXs*4Gaxjf=#P;Z*pO7J;g5( zbM!#hRc^Pp%}tB^I~JbWEhe_VN}-}zCAQ_;-npk-T2}wO*m;`CNN~d)r9WL01NV2v z|Nkpmr5^45FG%qIT8+QFzAe7Gcq%clq|EVdZ)9Z@^zVL-)>3`w^ zZH!d#ao8Xs6<{)#In5}5cfn`oD^^(=N?fbrIwe|qB0w>;wShS@Wok z7Bm464hDC?-=7_NU{~5ZF4b;j3-|(|y&K(8@ z4kjmtNH49&N;7+d*;0jOLi8f-8QP{(^%d5j>xzL85^N-YyNM*O~dOJaA&xYGol>z5;cJ2`3g|uw{ zKaKwXKlFc)>i_@$pZ~vpfFZKMT*+fj?K+7B2`PyhkJJ3pX`dE-Y!(ikKf@~{EzRBa z3ESk}%AylV$6vP{w-@K!|4V_tbxy?p&mwp8a(knd?_N22Jr4_rEe^eEfbSJWg_WUJdB9)HQ51_@v(9xxGeu^3u|KPRI85rc}wy2#I^XU;=2azgOVV!RR2r zl<5T%owfJG#C#W#={zqVy`ST6=KKHu9p=pc|Nry;m(~u)8hq{EWjcMC_{OkcqCcDW zzj-rUSR(ds5xDt&)yJLFRUBsASg)&|QM>=&AEmR>KE2^itPKghm4_cax1KO{+2wf} ze#HwKB_1AhTn_4X{44*P)xf~uA;OY#<(KN?Nl7ejib@Ou4EGs&L^T>FJLDJfhcNS4 z2No^(9n*bT^F+*wo6l3dr`{57I@3D+tBFh7jkW*s`YoUJyEG*&44HDpJ!+TrUA}YH zTfTg$e={{=dNAMrFLQSXgLQl}yj9_0*+YzaOb*@*stughC9JYar}>sHyJBi; z9$ET1^>cK0(YgS8_6suWU;SLSa^?Cp?tw+>|8id!TX8GTn$flW|9+n}ZN`f8|L110 zvfJPP|2O_yfh{e(e4~M6$+7%+^ut@yV`=2!;%qNALy{rSj_)ghUzvTb-m7c~~d$U&lzxw`y zKsV3dv`(MB&vV_sUTt7Fk&rxzWplyoh0Vv(9BikYvKjyXp5XGKfjK(bFS|1E zK;j9>H@T@bJTuuHefIhbPE<&XJhJu1;U1=x(2KllF0ILXYqf7}=FjJf@19HK-mHDI z^Hkjtev=NlP`$*$@>e#@v)_8%WMJXRZMc$f{PH|C7KUin*USsIb!OT8dgICI;Fxx4 zq3)S__VvBLHM(3*)&KtwD%Hd9umAu5imIgX|NsAPFf?j2J5;S))YyK*q%v(xsMb9bfnC zorCn|f3w|myk{ExDE?@;{<@?A!%Bk{o|9WNznx-|FJirNx$~+NOOpJL8T(X1ZXP}q z9sJMm;B!zh{Pq9;|35T%rFiEhFes!7yh@cbsk&5``^BxM<6o*EPr|{d$49a$8XvYwr@VB_PZ_pLWcK7YGA z>dd;{#bTR$UEOxQj1}0k({as)O9l)|5!e5}xm)+;{{R2%R~jxGzh)FuV6P0F$mQF+ z{akBpSwU9dr*73*_cyCeef~N)Bwbi(7UP!>|Nnpf|NnpP|7z_iXE&|7yRzD2tx;%E zQ!=9x!)@-B%Qri#HTifOnM(XQdGl~d+k|D?xOPia1k^fs8f zqr(2{hQ3=Hg*!v$Upex~|G-vd@il(w`C4=Cat8Q)S>K~~KKK6Yx1MfWb_pymQ4&~g z$W{60e3<2Go$vQ=R_Pv_qTv$r{OYuOYx>?Z{B3Z4XwA2iUE*Z6uSX;2lv?+bP6GcY zFa;_$|96*Rys_N2Zpl7Z@kws;vs)*ZGP3;r|No_3`v3a>|1Z3L&hWS>e$Nt?u1RK3 zCT^JGaalMw{9yF4ig)IrK@Rx_&gmx=R^3@N;ac0AiyOnalz+PH=2UpW_-$Fwy%YTt z{cMf2=P%DYby`{YX|5ti#g>Jq7e!{2wyusgy#k7%*DWmCQOBD%+b(eIkXmc=bn5wu z?0WAK)*fV9u&i^@+?S#vCVw=p2W_{D)jO9`v27E(U|U3>*D}q&h2M1oRxmW))Q$@5 z%e%U&YwI;M1%TN@Z07#4Q0oDVr2Bg1MC zIpvKqv)v{>0S1E|8Z2y5g^C(0I1Pfngm5t_SghBzeR0%uUHr1AZHk4l-0pS`=u2^EQ-z*E^}*E z3zQII^t&M%@$#jfS;^L2r`}&$Zor|Ie89Wv-rb*%7c}gA`SbA2lNGyk6_V7LTlp@1 z0L9RY29`+2E7|-mH4ZPNYHgV+dFQh0`#J1zc)MVg$yYAcR6D@EAZFVp5k{US zo|7?~GZ~#(?Kg9>Y__v9e0=$q7!R*OgY&~PQb$YzIcwsS-QGnUI^`9^VaKa6RcgjP&6V>sB4>oj zNQk6MHgq(!Iy%N2;!Qbd$ilP6Wa^Z|Vnu!5H?HJjyz83zenm->+$$e5Kb=JfF8nAy z?XN1fSLvd-&;!MmniU6p+dOWvgJS3{4+~S2JNKT2A6zvoopP6#@iVe3`Mq;L@MXcW zuWL9~cxr2AM@`v%J^25vRTs*mepg-DH*NR3O`noAB6PW~%#!^7-~P-05C)d6Mx_LA zk%juaDU;{l_@&D-X?H;2EvbF6J~CO^vZwZiOnWK+zF6kvjWbgp-E}{zeBt^3DZ2gt zRsZ`;vj3*Y<@nWC;U1lOz2MO%E6qE-&rK zJY-N~F2?x4;lH5aG|0v78^%yL|ZWad8$) z?_c*lv^;dH{l4ATgETk2(BHrG^?z3*U-vohclF=?d*6eBfsHLdn}M_SS)6g60r!WC zom`z#YyzC37g$9u#57NlFqxC%C(5jeKg*f-%s&9yZ`%>1V=*??l`T_208<1yyD z3qLp>-kFuHrN!^bE@OJLfsvcF4EqY0)l;|w7wLH16@L3gX#e`$M znz?_7O2|B%vznp6y_T=wY4@d_Srdt~e{r@S8=a!$#dR*TBUwNc)(YwAQ z%iY!(Snw(>P+~Y%G-)XlJ6FugB5B4xm$qp&6C}M3T8Z3DzV-h{k23S2TJO(iPxwyg z>e83C%Kv5juLBfAuN&B>r$ywYtFZVS{`K~(O~V;a<;=gW42()kGXHN{z%aM||F8ev z_4DJyP3!;r|K;ec|F>(ofr$cRuEIrzo0VnZ0+)T*T{eYG)3MQ7o3wq6yR6vyziLc7 z?5bZeMON)m>iy@^wfz`lNcT6@KZlc*SM*!|Hvj+g{(t}f|BU$W_5V1)_y4b?_Wm7S zNp36*4Gg@G7;muoO}cn~Wn!mjtbnh&fq})X+4uGf?J}6RqfR#FK&i%-T3c6Lh5*U^ zf9-3nw*UYCZ~p&v_y2#W|6x-8zp>TbB3Nc$r=Y@<&P;_xT<1)lGU{+e-0kL?`%cG4 zz~VY*|2cKzratj~F)l|J_Xb_O@Mx0yjM}??bv9 z<+n?nX)&t*r~7|}?EnA&zhpWvG^i~)<704oLiq)^tPc|owy=6UR8U_c!nJo}*@uey zDN?8XMgLE-xLEP|&K7yOj~1WSp5xZ_d?wI&bYJv4Hxui65u4$h=If(y~=Bu#l z_5X|i?qik9>x-YeIMll2zxVrdZeG^Km;WDCI9t~~f%W|V@1OR6-g;GmfrVk!cYOv1 zrUkmvnmX%Qrf4iaaiUQp%E=qQ`ZGe?X8(V->e9c3+vdvuUwNGW-E$?AFV37bw_hB4Q~&>; z&MWU9KcsyA|6lz#_A0{yv25i_TNs3yb02K$TP!n|VUo)G15Il_{rtu1HbqT!6&riu zM!q`L^SW-!?jPEJ`K$E)_y7Ox|F67$|Nq7H&tw}cL^uQ;?w*(bI~@G>gfuifkK$hahH%a_iq3%mbch*Gir@0Os} zGvDHAAyZwDPn~;)hX&_A%|EKT{8nk+zj@QSG^Wp-xjt@>X58ku<9mNiSoH3F&%fA1 z>*LStOz)ED=nP(@ut;%gY(dBTX~_HcC*!$HG_BR=y_vwReoafofJ(9f7g*OiM`Cbp}aEoq$D+1MK# z8UAV4lc`3rqL%z0T>t*s{(H&f)lnYPJ%v0~`4uPms`gCTy5NLLx6#}woA3X(h!?W? z|McOlDh38-lNs-O_Y||JHuwlCYUvpkv9#H8Z{Fv`yMv4UaAB6qie;UL3O9zm2zol{ zM$xuM>9Xd6E zfp>xIT2}FHYoCA<%uNp@TKF<@R;Y-@6c~7R*&I-0kPu6s$mDo`G}}+YbBQi>e0i3^z5_ zEnKm2X;*^CuAh0^cYS9Ia9YV-HC^MxvPn^UeqGwCpZmojXT|zAjV!_fhkq&vs7O6= zHU8IXOnSq`@@8% zrCZ8+*ceq;>IE?PxjgU||L1+ycl-6~7UP>M!an_6K9937=kYH#|*ylKVW=w?g@j_CW-cvML(2Gj=5jzkgEr+ftjCO`t<+L z{QtjFn6~|&!c@gzz|yeBL4ikujhFFRS+843lbV9%bL}1O9~qK64g|BM?eZyGb6_&> z{XZd`52pu7%*f%Jv~r^-N%+oKp zS0uo?IV&qsKW1W}s>ZpNKaJul%f4=%njp4(<0W>Mmxtb$|9_pmY^lQRpi;FhuROD& zw&ZR*nSJ$sNq}jte5l}&c$*UpJPf^4Cou4EUwFdCk=sy|!Dyh9z~E-As<5p&DO8i2 z+m_i_QAaRMxl>VtuTVyN&ib?B_PP64|G)hI7()XCGXoR%={gw(2?L#(IvP@9qLMDF zXB_`J!^f(Z;h9?FL&lB|JWS?1&LU@h?Rdl)0zYOLeGmwAn*92EanUcEts0?%0l}V^ zodPE9=@omt{B^n!&sW=QaffCf)$*Iy|6BQHOum12&6_%RjeS8c?yub~Vfx~!T}wyD z|NqNPxS8X1Ot&?ucXFvEJFZE&kt{f6&!g%2eb0Yi)tYirOBIDb*^ooZPWvG`&T{>k9;H<#V1f*z%MNs~j^ z`R3naIsa<&x)-39!gB`Z^PZ=ScQ<~p)6|mpVY<#=sj7DF#Fm4GDp_0G=j=;4U+x<& z^+VahfAOK2OHI~frWODH`Ez^LvdI5O4GjVp{lB;F##C9`4P1}8V};)=n4;yFaX0Vu zqg3a4?~aA}%r$s*(agfmVMWNrEY9s24Z^Zuut$En=|NFfAH)C)A|DQF3GyB%6 zOyNid0nUw!9;+C&EU8H5u)D-AXPV;O(HygQ)w~amlX%zNS{<}y*|+F=Vb@keQ^WKN z*0Qc@X&3HK3D0n2JX!SL>rwA}nQe#Wg&nBzSiL$uLTz)n_~nwaZLCq1QNOrfXt}== zbu)IpqLC-CQF86UZ^0f2W zWqWgB1S8{5y~d+~ts6BC?Nfg>*C@L}=>LyXpT*WKIw=vmW`l;A)mPX5|8HI_$zBm$ z|7GLW9RZHVn3&ic55=!Ibv|$z14EMHd;LNIofbZU1;z~%jyz`;DDn|8j&V@@G$H=c z;me#oXI4$qlS$@%JmsOwQuWr#%&fo^neBmssxSy3I8b_ssit{P@N;@BjS^$_M7Z5Z#}D_QcYdrG`_r z_g`Kc8kqUZ)X`LhmAiQRH^yH(4jhnA`YX`s?$`Em@5Gu*_uJ-Vta!gMZ_l5M1QzQl zk+0(BPyZ$O$bX)&{r9`u|DUTYxXmCSEWySwZI6_^#0#NW0{klv*V&VQ19g z6d=IE!`u^X#iPf?XQJYD*x`Y!>*Whuc|^EgSa6hT`x^e~mOU=f=V0XY_Qb-Ap|