Http Version - Added Alarm Button.
This commit is contained in:
parent
99bc9209af
commit
07bd73bb33
6 changed files with 163 additions and 25 deletions
|
|
@ -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
|
||||
|
|
|
|||
81
Main.qml
81
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,19 +107,43 @@ Window {
|
|||
font.pointSize: root.font_normal_text_size
|
||||
}
|
||||
|
||||
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
|
||||
anchors {
|
||||
horizontalCenter: parent.horizontalCenter
|
||||
bottom: parent.bottom
|
||||
bottomMargin: 50
|
||||
}
|
||||
ConnectButton {
|
||||
id: connect_button
|
||||
height: parent.height / 20
|
||||
width: parent.width / 4
|
||||
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 {
|
||||
horizontalCenter: parent.horizontalCenter
|
||||
left: parent.left
|
||||
leftMargin: 5
|
||||
bottom: parent.bottom
|
||||
bottomMargin: 50
|
||||
bottomMargin: 5
|
||||
}
|
||||
onConnect: {
|
||||
if(connect_button.mode === 0)
|
||||
|
|
@ -130,6 +157,40 @@ Window {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
BIN
echo.mp3
Normal file
BIN
echo.mp3
Normal file
Binary file not shown.
5
media.qrc
Normal file
5
media.qrc
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
<RCC>
|
||||
<qresource prefix="/sounds">
|
||||
<file>echo.mp3</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
|
@ -3,6 +3,7 @@
|
|||
#include <QJsonValue>
|
||||
#include <QJsonObject>
|
||||
#include <QJsonDocument>
|
||||
#include <QFile>
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@
|
|||
#include <QNetworkAccessManager>
|
||||
#include <QNetworkRequest>
|
||||
#include <QNetworkReply>
|
||||
#include <QMediaPlayer>
|
||||
#include <QAudioOutput>
|
||||
#include <QTimer>
|
||||
#include <QThread>
|
||||
#include <chrono>
|
||||
|
|
@ -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<std::chrono::high_resolution_clock> 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:
|
||||
|
|
|
|||
Loading…
Reference in a new issue