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);