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