diff --git a/CMakeLists.txt b/CMakeLists.txt
index 957c9c2..103c3b1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -3,16 +3,11 @@ 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 Gui Core Quick Multimedia)
+find_package(Qt6 REQUIRED COMPONENTS Quick)
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
)
@@ -21,45 +16,27 @@ qt_add_qml_module(appWaterLevelRewrite
URI WaterLevelRewrite
QML_FILES
Main.qml
- WaterTank.qml
- SettingsBarIcon.qml
- SettingsPopup.qml
- ConnectButton.qml
- SOURCES
- configinterface.h
- configinterface.cpp
- requestworker.h
- requestworker.cpp
- wifihelper.h
- wifihelper.cpp
- RESOURCES
- media.qrc
- QML_FILES CustomCheckBox.qml
- QML_FILES RequestResponsePopup.qml
- QML_FILES ColorInput.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
)
-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()
-
+# 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
- QT_ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android"
+# 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 Qt6::Multimedia Qt6::Gui Qt6::Core
+ PRIVATE Qt6::Quick
)
install(TARGETS appWaterLevelRewrite
diff --git a/ColorInput.qml b/ColorInput.qml
deleted file mode 100644
index a4cebe7..0000000
--- a/ColorInput.qml
+++ /dev/null
@@ -1,21 +0,0 @@
-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/ConnectButton.qml b/ConnectButton.qml
index dd058bc..9225e44 100644
--- a/ConnectButton.qml
+++ b/ConnectButton.qml
@@ -10,8 +10,6 @@ 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 {
@@ -22,7 +20,7 @@ Rectangle {
anchors.centerIn: parent
font.pointSize: root.font_enlarged_text_size
color: root.font_color
- text: mode ? root.text2 : root.text
+ text: root.text
horizontalAlignment: Text.AlignHCenter
}
@@ -48,16 +46,10 @@ 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/CustomCheckBox.qml b/CustomCheckBox.qml
deleted file mode 100644
index 0cdbb38..0000000
--- a/CustomCheckBox.qml
+++ /dev/null
@@ -1,17 +0,0 @@
-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 28693c5..db445e4 100644
--- a/Main.qml
+++ b/Main.qml
@@ -5,8 +5,8 @@ import QtQuick.Controls
import QtQuick.Controls.Material
Window {
- width: 960
- height: 1400
+ width: 640
+ height: 1080
visible: true
title: qsTr("Water Level Rewrite")
id: root
@@ -14,7 +14,6 @@ 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
@@ -22,38 +21,12 @@ 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 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)
@@ -65,12 +38,11 @@ Window {
}
color: "#0A0F0F0F"
SettingsBarIcon {
- id: settings_icon
height: top_bar.height - 20
- width: height
+ width: top_bar.width / 12
anchors {
top: parent.top
- right: parent.right
+ left: parent.left
bottomMargin: 5
topMargin: 5
leftMargin: 5
@@ -82,40 +54,12 @@ 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
- background_color: root.background_color
- font_enlarged_text_size: root.font_enlarged_text_size
- font_normal_text_size: root.font_normal_text_size
+ font_enlarged_text_size: 20
function setConfig(new_config: var) {
settings_popup.config.max = new_config.max
settings_popup.config.min = new_config.min
@@ -126,66 +70,32 @@ Window {
console.log("Saving config: ", config)
config_interface.saveConfig(config);
}
- onDeleteConfig: () => {
- config_interface.deleteConfig();
- }
- }
-
- Text {
- id: connection_text
- anchors {
- top: top_bar.bottom
- topMargin: 20
- horizontalCenter: parent.horizontalCenter
- }
- text: root.connection_text_string
- color: root.accent_color
- font.pointSize: root.font_normal_text_size
}
WaterTank {
id: tank
anchors {
- top: connection_text.bottom
+ top: top_bar.bottom
horizontalCenter: parent.horizontalCenter
- topMargin: 40
+ topMargin: 0
}
- height: (root_rect.height) / root.water_tank_height_factor
- width: root_rect.width / root.water_tank_width_factor
+ 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: root.water_color
+ water_level_color: "#F00F7FAF"
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
- }
-
-
- Text {
- id: alarm_status
- text: root.alarm_status_text
- visible: (root.alarm_status_text.length > 0 ) ? true : false
- anchors {
- bottom: status.top
- bottomMargin: 10
- horizontalCenter: parent.horizontalCenter
- }
- horizontalAlignment: Text.AlignHCenter
- color: root.accent_color
- font.pointSize: root.font_normal_text_size
}
Text {
id: status
text: root.status
anchors {
- bottom: button_base.top
+ bottom: connect_button.top
bottomMargin: 20
horizontalCenter: parent.horizontalCenter
}
@@ -194,77 +104,25 @@ Window {
font.pointSize: root.font_normal_text_size
}
- Rectangle {
- id: button_base
- color: "#00000000"
- width: parent.width / 1.5
+ 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: 30
+ bottomMargin: 50
}
- 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
- }
- onConnect: {
- if(connect_button.mode === 0)
- {
- requester.start();
- root.status = "Waiting to Send.";
- }
- else {
- root.status = "Stopped.";
- requester.stop();
- }
- }
+ onConnect: {
+ requester.start();
+ root.status = "Waiting to Send.";
}
-
- 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 {
@@ -272,26 +130,10 @@ Window {
onStatusChanged: () => {
root.status = requester.status;
}
- onNetworkReply: (water_level, fill_rate, expected, data) => {
+ onNetworkReply: (water_level, fill_rate, expected) => {
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: (data) => {
- status.color = root.danger_color;
- request_response_popup.request_response_string = data;
- }
-
- onConnectionText: (text, error) => {
- root.connection_text_string = text
- if(!error) {
- connection_text.color = root.accent_color
- }
- else {
- connection_text.color = root.danger_color
- }
}
}
@@ -299,86 +141,16 @@ 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.";
+ root.status = "Waiting to 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: {
- requester.stopAlarm();
- }
}
diff --git a/RequestResponsePopup.qml b/RequestResponsePopup.qml
deleted file mode 100644
index 468bcda..0000000
--- a/RequestResponsePopup.qml
+++ /dev/null
@@ -1,30 +0,0 @@
-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 35072b7..d360331 100644
--- a/SettingsBarIcon.qml
+++ b/SettingsBarIcon.qml
@@ -8,7 +8,6 @@ Rectangle {
signal open;
property color accent_color: "#00000000"
property int font_enlarged_text_size: 20
- property string text: "⚙"
Behavior on color {
ColorAnimation {
duration: 200
@@ -16,10 +15,8 @@ Rectangle {
}
Text {
id: settings_text
- text: settings_rect.text
+ 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 6a97c2b..051c306 100644
--- a/SettingsPopup.qml
+++ b/SettingsPopup.qml
@@ -6,32 +6,15 @@ 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",
- "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
+ "url": "none"
}
background: Rectangle {
@@ -40,469 +23,178 @@ Popup {
border.color: settings_popup.accent_color
border.width: 1
}
- height: Math.max(parent.height / 1.6, contentHeight)
- width: parent.width / 1.2
+ 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"
- ScrollView {
- id: rect_base_scroll_view
+ Text {
+ id: settings_label
+ text: "Settings"
+ width: parent.width
anchors {
top: parent.top
horizontalCenter: parent.horizontalCenter
- bottom: save_config.top
- bottomMargin: 10
- }
- width: parent.width
- clip: true
-
- // Use contentWidth and contentHeight to define the scrollable area
- contentWidth: availableWidth
- contentHeight: settings_column.height
-
- 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();
- }
- }
}
+ 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 {
@@ -545,43 +237,7 @@ Popup {
let alert = parseFloat(alert_thres_input.text);
let url = http_url_input.text;
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;
- 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
- }
+ var new_config = {"max": max, "min": min, "alert": alert, "url": url, "interval": interval}
settings_popup.saveConfig(new_config)
settings_popup.close();
}
@@ -589,6 +245,7 @@ Popup {
save_config.color = settings_rect_pressed_prev
}
}
+
}
}
}
\ No newline at end of file
diff --git a/WaterTank.qml b/WaterTank.qml
index 633fac8..5c1b5af 100644
--- a/WaterTank.qml
+++ b/WaterTank.qml
@@ -9,25 +9,16 @@ 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
- 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
+ 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
- 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
@@ -37,24 +28,21 @@ Item {
id: tank_lid
color: root.tank_lid_color
anchors {
- top: parent.top
+ bottom: tank_base.top
horizontalCenter: tank_base.horizontalCenter
bottomMargin: -5
}
radius: 10
- width: tank_base.width / 3
- height: tank_base.height / 15
+ width: parent.width / 4
+ height: parent.height / 15
}
Rectangle {
id: tank_base
color: root.tank_base_color
- anchors {
- top: tank_lid.bottom
- horizontalCenter: parent.horizontalCenter
- }
- width: parent.width
- height: parent.height * 0.55
+ anchors.centerIn: parent
+ width: parent.width / 2
+ height: parent.height / 2
border.color: root.tank_base_border_color
border.width: 5
radius: 4
@@ -82,102 +70,81 @@ Item {
}
}
- ScrollView {
- id: rect_base_scroll_view
+ 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
- bottom: parent.bottom
horizontalCenter: parent.horizontalCenter
}
- 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_percentage_reading
- 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
- }
- }
+ 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;
- 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) {
root.distance = distance;
- let distance_f = distance / 10;
- console.log("Distance changed to: ", distance_f);
+ 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, distance_f - 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)
@@ -188,17 +155,8 @@ 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
deleted file mode 100644
index 2598885..0000000
--- a/android/AndroidManifest.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/configinterface.cpp b/configinterface.cpp
index 8f40d45..258560f 100644
--- a/configinterface.cpp
+++ b/configinterface.cpp
@@ -2,7 +2,6 @@
#include
#include
-#include
ConfigInterface::ConfigInterface(QObject *parent)
: QObject{parent}
@@ -38,12 +37,6 @@ 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 e3cb75e..606b496 100644
--- a/configinterface.h
+++ b/configinterface.h
@@ -19,9 +19,7 @@ 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/echo.mp3 b/echo.mp3
deleted file mode 100644
index 4373d95..0000000
Binary files a/echo.mp3 and /dev/null differ
diff --git a/main.cpp b/main.cpp
index ecedbf4..c438cd2 100644
--- a/main.cpp
+++ b/main.cpp
@@ -3,11 +3,8 @@
int main(int argc, char *argv[])
{
- qputenv("QT_SCALE_FACTOR", "1.0");
- qputenv("QT_SCALE_FACTOR_ROUNDING_POLICY", "Round");
QGuiApplication app(argc, argv);
-
QQmlApplicationEngine engine;
QObject::connect(
&engine,
diff --git a/media.qrc b/media.qrc
deleted file mode 100644
index 2af454f..0000000
--- a/media.qrc
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
- echo.mp3
-
-
diff --git a/requestworker.cpp b/requestworker.cpp
index f0657ef..eff8079 100644
--- a/requestworker.cpp
+++ b/requestworker.cpp
@@ -3,22 +3,11 @@
#include
#include
#include
-#include
-#include
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)
@@ -27,13 +16,11 @@ 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()
@@ -61,130 +48,6 @@ void RequestWorker::stop()
if(timer->isActive())
timer->stop();
stop_timer = true;
- 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
- 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)
- 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;
- }
- if(audioOutput) {
- audioOutput->deleteLater();
- audioOutput->deleteLater();
- }
- 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!";
- } 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()
@@ -203,32 +66,17 @@ 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();
- 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();
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 )(prev_distance - water_level) /(float) time_in_microseconds;
+ 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 = (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(water_level <= alarm_thres) {
- playAlarm();
- }
- }
+ int expected_to_fill = (max_height - water_level) / rate_of_fill;
if(reply_number == 0) {
rate_of_fill = 0;
expected_to_fill = 0;
@@ -237,22 +85,16 @@ 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;
- 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);
+ 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: " + timestamp + "; Waiting to Send.";
+ QString status = "Got Reply on: " + QDateTime::currentDateTime().toString("hh:mm:ss") + "; Waiting to Send.";
setStatus(status);
}
@@ -268,35 +110,3 @@ void RequestWorker::setStatus(const QString &newStatus)
m_status = newStatus;
emit statusChanged();
}
-
-void RequestWorker::startAlarm()
-{
- enable_alarm = true;
-}
-
-void RequestWorker::stopAlarm()
-{
- if (!player_started)
- return;
-
- enable_alarm = false;
- player_started = false;
- if(player) {
- player->stop();
- player->deleteLater();
- player = nullptr;
- }
- if(audioOutput) {
- audioOutput->deleteLater();
- audioOutput = nullptr;
- }
-#ifdef Q_OS_ANDROID
- if (m_androidMediaPlayer && m_androidMediaPlayer->isValid()) {
- m_androidMediaPlayer->callMethod("stop");
- m_androidMediaPlayer->callMethod("release");
-
- delete m_androidMediaPlayer;
- m_androidMediaPlayer = nullptr;
- }
-#endif
-}
diff --git a/requestworker.h b/requestworker.h
index c759e44..05fbafa 100644
--- a/requestworker.h
+++ b/requestworker.h
@@ -6,15 +6,9 @@
#include
#include
#include
-#include
-#include
#include
#include
#include
-#ifdef Q_OS_ANDROID
-#include "wifihelper.h"
-#include
-#endif
class RequestWorker : public QObject
{
@@ -30,45 +24,26 @@ 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;
-#ifdef Q_OS_ANDROID
- WiFiHelper *wifi = nullptr;
- QTimer *poll_wifi = nullptr;
-#endif
std::chrono::time_point prev_time;
public:
explicit RequestWorker(QObject *parent = nullptr);
+
QString status() const;
void setStatus(const QString &newStatus);
signals:
- void requestFailed(QString request_response_string);
- void networkReply(int distance, float rate_of_fill, int expected_to_fill, QString data);
+ void networkReply(float 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();
void setConfig(QJsonObject config);
void start();
void stop();
private slots:
- QString getRequestResponseString(QNetworkReply *rep, QString rep_data = "");
- void pollWiFi();
- void gotWiFiSSID(QString ssid);
- void playAlarm();
void makeRequest();
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
deleted file mode 100644
index 835cea7..0000000
--- a/wifihelper.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-#include "wifihelper.h"
-#include
-#include
-#ifdef Q_OS_ANDROID
-#include
-#endif
-#include
-
-WiFiHelper::WiFiHelper(QObject *parent)
- : 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();
-
- // 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;
-#endif
- return "";
-}
-
-void WiFiHelper::requestPermissionsAndFetch() {
-#ifdef Q_OS_ANDROID
- 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");
- }
- });
- }
-#endif
-}
diff --git a/wifihelper.h b/wifihelper.h
deleted file mode 100644
index ab10632..0000000
--- a/wifihelper.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#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