From cd6973efbb580bf86c4f22cb0af259fa0da5d1dd Mon Sep 17 00:00:00 2001 From: yasarba71520 Date: Sun, 5 Feb 2023 15:24:09 +0100 Subject: [PATCH 01/10] App: Sending data in Async Task --- .../lfrmobileapp/DataTransferAsyncTask.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 MobileApp/app/src/main/java/com/example/lfrmobileapp/DataTransferAsyncTask.java diff --git a/MobileApp/app/src/main/java/com/example/lfrmobileapp/DataTransferAsyncTask.java b/MobileApp/app/src/main/java/com/example/lfrmobileapp/DataTransferAsyncTask.java new file mode 100644 index 0000000..ffde8ab --- /dev/null +++ b/MobileApp/app/src/main/java/com/example/lfrmobileapp/DataTransferAsyncTask.java @@ -0,0 +1,33 @@ +package com.example.lfrmobileapp; + +import android.os.AsyncTask; + +import java.io.IOException; +import java.io.OutputStream; +import java.net.Socket; + +private class DataTransferAsyncTask extends AsyncTask { + private static final int sendRatePerSecond = 2; + private String hostname; + private int portNumber; + DataTransferAsyncTask(String hostname, int portNumber) { + this.hostname = hostname; + this.portNumber = portNumber; + } + @Override + protected Void doInBackground(Void... params) { + try { + Socket socket = new Socket(hostname, portNumber); + OutputStream outputStream = socket.getOutputStream(); + while (!isCancelled()) { + outputStream.write("data".getBytes()); + outputStream.flush(); + Thread.sleep(1000 / sendRatePerSecond); + } + socket.close(); + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + } + return null; + } +} From 2ee36032296ae6b64761b7f80d1319ca4d8f3ed1 Mon Sep 17 00:00:00 2001 From: yasarba71520 Date: Sun, 5 Feb 2023 15:24:43 +0100 Subject: [PATCH 02/10] App: Socket in Async Task --- .../example/lfrmobileapp/Communication.java | 34 +++------- .../lfrmobileapp/DataTransferAsyncTask.java | 52 ++++++++++----- .../ui/dashboard/DashboardFragment.java | 11 +++- .../lfrmobileapp/ui/home/HomeFragment.java | 65 +++++++++++++------ .../notifications/NotificationsFragment.java | 17 ++++- .../main/res/layout/fragment_automatik.xml | 2 +- 6 files changed, 118 insertions(+), 63 deletions(-) diff --git a/MobileApp/app/src/main/java/com/example/lfrmobileapp/Communication.java b/MobileApp/app/src/main/java/com/example/lfrmobileapp/Communication.java index a782e95..81d6990 100644 --- a/MobileApp/app/src/main/java/com/example/lfrmobileapp/Communication.java +++ b/MobileApp/app/src/main/java/com/example/lfrmobileapp/Communication.java @@ -11,53 +11,39 @@ import java.util.Iterator; import java.util.Objects; public class Communication { - public boolean sendData(String data, String ip, int port) { - try { - Socket socket = new Socket(ip, port); - DataOutputStream DOS = new DataOutputStream(socket.getOutputStream()); - DOS.writeUTF(data); - socket.close(); - } catch (Exception e) { - e.printStackTrace(); - return true; //ToDo: change to false to test connection - currently always true is delivered - } - return true; - } - public String telegram(int[] wheels, int strenght){ String tel = ""; - tel += "0;"; //Manuel mode + tel += "0"; //Manuel mode for(int i = 0; i < wheels.length; i++){ if(wheels[i] == 1){ - tel += Float.toString(((float)strenght)/100) + ";"; + tel += ";" + Float.toString(((float)strenght)/100) ; }else if(wheels[i] == -1) - tel += Float.toString(((float)-strenght)/100) + ";"; + tel += ";" + Float.toString(((float)-strenght)/100); else{ - tel += "0.00;"; + tel += ";0.00"; } } - Log.v("TAG", tel + "\n"); return tel; } public String telegram(boolean startStop, ArrayList list){ String tel = ""; - tel += "1;"; //Autonomous mode + tel += "1"; //Autonomous mode if(startStop){ - tel += "1;"; + tel += ";1"; }else{ - tel += "0;"; + tel += ";0"; } for (String i : list) { if(i.equals("Links")){ - tel += "0;"; + tel += ";0"; }else if (i.equals("Rechts")){ - tel += "1;"; + tel += ";1"; } } - Log.v("TAG", tel + "\n"); return tel; } + } \ No newline at end of file diff --git a/MobileApp/app/src/main/java/com/example/lfrmobileapp/DataTransferAsyncTask.java b/MobileApp/app/src/main/java/com/example/lfrmobileapp/DataTransferAsyncTask.java index ffde8ab..0ff684b 100644 --- a/MobileApp/app/src/main/java/com/example/lfrmobileapp/DataTransferAsyncTask.java +++ b/MobileApp/app/src/main/java/com/example/lfrmobileapp/DataTransferAsyncTask.java @@ -1,33 +1,55 @@ package com.example.lfrmobileapp; import android.os.AsyncTask; +import android.util.Log; +import java.io.DataOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; -private class DataTransferAsyncTask extends AsyncTask { - private static final int sendRatePerSecond = 2; - private String hostname; +public class DataTransferAsyncTask extends AsyncTask { + private static final int sendRatePerSecond = 4; + private String ipAdress; private int portNumber; - DataTransferAsyncTask(String hostname, int portNumber) { - this.hostname = hostname; + private String telegram; + private boolean connected; + + public DataTransferAsyncTask(String ipAdress, int portNumber) { + this.ipAdress = ipAdress; this.portNumber = portNumber; + this.telegram = ""; + this.connected = false; } + + public void writeTelegram(String telegram) { + this.telegram = telegram; + } + @Override protected Void doInBackground(Void... params) { - try { - Socket socket = new Socket(hostname, portNumber); - OutputStream outputStream = socket.getOutputStream(); - while (!isCancelled()) { - outputStream.write("data".getBytes()); - outputStream.flush(); - Thread.sleep(1000 / sendRatePerSecond); + while(!isCancelled()) { + try { + Socket socket = new Socket(ipAdress, portNumber); + DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); + connected = true; + while (!isCancelled() && telegram.length() > 0) { + Log.v("TAG", telegram + "\n"); + outputStream.writeBytes(telegram); + outputStream.flush(); + Thread.sleep(1000 / sendRatePerSecond); + } + socket.close(); + } catch (Exception e) { + e.printStackTrace(); + connected = false; } - socket.close(); - } catch (IOException | InterruptedException e) { - e.printStackTrace(); } return null; } + + + public boolean getConnectionState(){ + return connected; + } } diff --git a/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/dashboard/DashboardFragment.java b/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/dashboard/DashboardFragment.java index d8e30b4..473c4c2 100644 --- a/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/dashboard/DashboardFragment.java +++ b/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/dashboard/DashboardFragment.java @@ -18,6 +18,7 @@ import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import com.example.lfrmobileapp.Communication; +import com.example.lfrmobileapp.DataTransferAsyncTask; import com.example.lfrmobileapp.R; import com.example.lfrmobileapp.databinding.FragmentAutomatikBinding; @@ -41,6 +42,8 @@ public class DashboardFragment extends Fragment { //Keys for Shared Preferences String listKey = "listkey"; + DataTransferAsyncTask dataTransferAsyncTask; + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { DashboardViewModel dashboardViewModel = @@ -62,14 +65,17 @@ public class DashboardFragment extends Fragment { ipAddress = sharedPref.getString(ipKey, ""); port = sharedPref.getInt(portKey, -1); + dataTransferAsyncTask = new DataTransferAsyncTask(ipAddress, port); + dataTransferAsyncTask.execute(); + binding.startAutomatic.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if(isChecked){ - com.sendData(com.telegram(true, autoList), ipAddress, port); + dataTransferAsyncTask.writeTelegram(com.telegram(true, autoList)); }else{ - com.sendData(com.telegram(false, autoList), ipAddress, port); + dataTransferAsyncTask.writeTelegram(com.telegram(false, autoList)); } } }); @@ -156,6 +162,7 @@ public class DashboardFragment extends Fragment { @Override public void onDestroyView() { super.onDestroyView(); + dataTransferAsyncTask.cancel(false); binding = null; } diff --git a/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/home/HomeFragment.java b/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/home/HomeFragment.java index 0a9edaf..f746f14 100644 --- a/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/home/HomeFragment.java +++ b/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/home/HomeFragment.java @@ -1,9 +1,11 @@ package com.example.lfrmobileapp.ui.home; +import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.view.LayoutInflater; +import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.Button; @@ -15,6 +17,7 @@ import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import com.example.lfrmobileapp.Communication; +import com.example.lfrmobileapp.DataTransferAsyncTask; import com.example.lfrmobileapp.R; import com.example.lfrmobileapp.databinding.FragmentManuellBinding; import com.example.lfrmobileapp.ui.notifications.NotificationsFragment; @@ -32,6 +35,7 @@ public class HomeFragment extends Fragment { int port = 8000; Communication com = new Communication(); + DataTransferAsyncTask dataTransferAsyncTask; private FragmentManuellBinding binding; @@ -54,19 +58,41 @@ public class HomeFragment extends Fragment { final TextView textView = binding.textHome; homeViewModel.getText().observe(getViewLifecycleOwner(), textView::setText); - binding.rotateLeft.setOnClickListener(new View.OnClickListener(){ + dataTransferAsyncTask = new DataTransferAsyncTask(ipAddress, port); + dataTransferAsyncTask.execute(); + + binding.rotateLeft.setOnTouchListener(new View.OnTouchListener(){ + @SuppressLint("ClickableViewAccessibility") @Override - public void onClick(View v){ - com.sendData(com.telegram(new int[]{-1, 1, -1, 1}, 100), ipAddress, port); - }; + public boolean onTouch(View v, MotionEvent event) { + + if(event.getAction() == MotionEvent.ACTION_UP){ + binding.rotateLeft.performClick(); + dataTransferAsyncTask.writeTelegram(com.telegram(new int[]{0, 0, 0, 0}, 0)); + return true; + }else{ + dataTransferAsyncTask.writeTelegram(com.telegram(new int[]{-1, 1, -1, 1}, 100)); + } + return false; + } + }); + + binding.rotateRight.setOnTouchListener(new View.OnTouchListener(){ + @SuppressLint("ClickableViewAccessibility") + @Override + public boolean onTouch(View v, MotionEvent event) { + + if(event.getAction() == MotionEvent.ACTION_UP){ + binding.rotateRight.performClick(); + dataTransferAsyncTask.writeTelegram(com.telegram(new int[]{0, 0, 0, 0}, 0)); + return true; + }else{ + dataTransferAsyncTask.writeTelegram(com.telegram(new int[]{1, -1, 1, -1}, 100)); + } + return false; + } }); - binding.rotateRight.setOnClickListener(new View.OnClickListener(){ - @Override - public void onClick(View v){ - com.sendData(com.telegram(new int[]{1, -1, 1, -1}, 100), ipAddress, port); - }; - }); JoystickView joystick = (JoystickView) binding.joystick; joystick.setOnMoveListener(new JoystickView.OnMoveListener() { @@ -76,32 +102,32 @@ public class HomeFragment extends Fragment { //8 segments of the joystick if((angle >= 338 || angle < 22) && strength != 0){ joystick.setBackgroundResource(R.mipmap.right); - com.sendData(com.telegram(new int[]{1, -1, -1, 1}, strength), ipAddress, port); + dataTransferAsyncTask.writeTelegram(com.telegram(new int[]{1, -1, -1, 1}, strength)); }else if((angle >= 22 && angle < 67) && strength != 0){ joystick.setBackgroundResource(R.mipmap.right_forward); - com.sendData(com.telegram(new int[]{1, 0, 0, 1}, strength), ipAddress, port); + dataTransferAsyncTask.writeTelegram(com.telegram(new int[]{1, 0, 0, 1}, strength)); }else if((angle >=67 && angle < 112) && strength != 0){ joystick.setBackgroundResource(R.mipmap.forward); - com.sendData(com.telegram(new int[]{1, 1, 1, 1}, strength), ipAddress, port); + dataTransferAsyncTask.writeTelegram(com.telegram(new int[]{1, 1, 1, 1}, strength)); }else if((angle >=112 && angle < 157) && strength != 0){ joystick.setBackgroundResource(R.mipmap.left_forward); - com.sendData(com.telegram(new int[]{0, 1, 1, 0}, strength), ipAddress, port); + dataTransferAsyncTask.writeTelegram(com.telegram(new int[]{0, 1, 1, 0}, strength)); }else if((angle >=157 && angle < 202) && strength != 0){ joystick.setBackgroundResource(R.mipmap.left); - com.sendData(com.telegram(new int[]{-1, 1, 1, -1}, strength), ipAddress, port); + dataTransferAsyncTask.writeTelegram(com.telegram(new int[]{-1, 1, 1, -1}, strength)); }else if((angle >=202 && angle < 247) && strength != 0){ joystick.setBackgroundResource(R.mipmap.left_back); - com.sendData(com.telegram(new int[]{-1, 0, 0, -1}, strength), ipAddress, port); + dataTransferAsyncTask.writeTelegram(com.telegram(new int[]{-1, 0, 0, -1}, strength)); }else if((angle >=247 && angle < 292) && strength != 0){ joystick.setBackgroundResource(R.mipmap.back); - com.sendData(com.telegram(new int[]{-1, -1, -1, -1}, strength), ipAddress, port); + dataTransferAsyncTask.writeTelegram(com.telegram(new int[]{-1, -1, -1, -1}, strength)); }else if((angle >=292 && angle < 337) && strength != 0){ joystick.setBackgroundResource(R.mipmap.right_back); - com.sendData(com.telegram(new int[]{0, -1, -1, 0}, strength), ipAddress, port); + dataTransferAsyncTask.writeTelegram(com.telegram(new int[]{0, -1, -1, 0}, strength)); } else{ joystick.setBackgroundResource(R.mipmap.blank); - com.sendData(com.telegram(new int[]{0, 0, 0, 0}, strength), ipAddress, port); + dataTransferAsyncTask.writeTelegram(com.telegram(new int[]{0, 0, 0, 0}, strength)); } } }); @@ -112,6 +138,7 @@ public class HomeFragment extends Fragment { @Override public void onDestroyView() { super.onDestroyView(); + dataTransferAsyncTask.cancel(false); binding = null; } } diff --git a/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/notifications/NotificationsFragment.java b/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/notifications/NotificationsFragment.java index 8c5a9fe..8df35ee 100644 --- a/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/notifications/NotificationsFragment.java +++ b/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/notifications/NotificationsFragment.java @@ -16,12 +16,15 @@ import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import com.example.lfrmobileapp.Communication; +import com.example.lfrmobileapp.DataTransferAsyncTask; import com.example.lfrmobileapp.R; import com.example.lfrmobileapp.databinding.FragmentEinstellungenBinding; public class NotificationsFragment extends Fragment { + Boolean connected = false; + String ipKey = "ipkey"; String portKey = "portkey"; String connectionFailed = "Verbindung fehlgeschlagen."; @@ -31,6 +34,7 @@ public class NotificationsFragment extends Fragment { int port = 8000; int duration = Toast.LENGTH_LONG; + DataTransferAsyncTask dataTransferAsyncTask; private FragmentEinstellungenBinding binding; @@ -56,13 +60,21 @@ public class NotificationsFragment extends Fragment { binding.port.setText(""); } + dataTransferAsyncTask = new DataTransferAsyncTask(ipAddress, port); + + final Button button = binding.connect; button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { ipAddress = String.valueOf(binding.ipAdress.getText()); port = Integer.parseInt(String.valueOf(binding.port.getText())); - if(com.sendData("", ipAddress, port)){ + + dataTransferAsyncTask = new DataTransferAsyncTask(ipAddress, port); + dataTransferAsyncTask.writeTelegram("Verbindung aufbauen"); + dataTransferAsyncTask.execute(); + + if(dataTransferAsyncTask.getConnectionState()){ editor.putString(ipKey, ipAddress); editor.putInt(portKey, port); editor.apply(); @@ -71,17 +83,18 @@ public class NotificationsFragment extends Fragment { }else{ Toast toast = Toast.makeText(v.getContext(), connectionFailed, duration); toast.show(); + dataTransferAsyncTask.cancel(true); } } }); - return root; } @Override public void onDestroyView() { super.onDestroyView(); + dataTransferAsyncTask.cancel(true); binding = null; } } \ No newline at end of file diff --git a/MobileApp/app/src/main/res/layout/fragment_automatik.xml b/MobileApp/app/src/main/res/layout/fragment_automatik.xml index dd1c3cc..e6065ed 100644 --- a/MobileApp/app/src/main/res/layout/fragment_automatik.xml +++ b/MobileApp/app/src/main/res/layout/fragment_automatik.xml @@ -85,7 +85,7 @@ Date: Mon, 6 Feb 2023 10:53:38 +0100 Subject: [PATCH 03/10] Dont use AsyncTask --- .../notifications/NotificationsFragment.java | 54 ++++++++++++++++--- 1 file changed, 47 insertions(+), 7 deletions(-) diff --git a/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/notifications/NotificationsFragment.java b/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/notifications/NotificationsFragment.java index 8df35ee..cefde0d 100644 --- a/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/notifications/NotificationsFragment.java +++ b/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/notifications/NotificationsFragment.java @@ -1,6 +1,5 @@ package com.example.lfrmobileapp.ui.notifications; -import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; @@ -8,7 +7,6 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; -import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; @@ -17,9 +15,38 @@ import androidx.lifecycle.ViewModelProvider; import com.example.lfrmobileapp.Communication; import com.example.lfrmobileapp.DataTransferAsyncTask; -import com.example.lfrmobileapp.R; import com.example.lfrmobileapp.databinding.FragmentEinstellungenBinding; +import java.io.DataOutputStream; +import java.net.Socket; + + +/*class NetworkThread extends Thread { + String ip; + int port; + boolean connected; + + NetworkThread(String ip, int port) { + this.ip = ip; + this.port = port; + this.connected = false; + } + + public void run() { + try { + Socket socket = new Socket(ip, port); + DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); + outputStream.writeBytes("Verbindung aufbauen"); + outputStream.flush(); + socket.close(); + connected = true; + + } catch (Exception e) { + e.printStackTrace(); + connected = false; + } + } +}*/ public class NotificationsFragment extends Fragment { @@ -70,11 +97,24 @@ public class NotificationsFragment extends Fragment { ipAddress = String.valueOf(binding.ipAdress.getText()); port = Integer.parseInt(String.valueOf(binding.port.getText())); - dataTransferAsyncTask = new DataTransferAsyncTask(ipAddress, port); - dataTransferAsyncTask.writeTelegram("Verbindung aufbauen"); - dataTransferAsyncTask.execute(); + new Thread(new Runnable(){ + public void run(){ + try { + Socket socket = new Socket(ipAddress, port); + DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); + outputStream.writeBytes("Verbindung aufbauen"); + outputStream.flush(); + socket.close(); + connected = true; - if(dataTransferAsyncTask.getConnectionState()){ + } catch (Exception e) { + e.printStackTrace(); + connected = false; + } + } + }).start(); + + if(connected){ editor.putString(ipKey, ipAddress); editor.putInt(portKey, port); editor.apply(); From 8831c130cd18101491908d2f368fc8e2057809a9 Mon Sep 17 00:00:00 2001 From: Vanessa Bock Date: Tue, 7 Feb 2023 13:46:04 +0100 Subject: [PATCH 04/10] Threadsave socket --- .../src/main/java/com/example/lfrmobileapp/ExtendedSocket.java | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 MobileApp/app/src/main/java/com/example/lfrmobileapp/ExtendedSocket.java diff --git a/MobileApp/app/src/main/java/com/example/lfrmobileapp/ExtendedSocket.java b/MobileApp/app/src/main/java/com/example/lfrmobileapp/ExtendedSocket.java new file mode 100644 index 0000000..7d45ef0 --- /dev/null +++ b/MobileApp/app/src/main/java/com/example/lfrmobileapp/ExtendedSocket.java @@ -0,0 +1,2 @@ +package com.example.lfrmobileapp;public class ExtendedSocket { +} From e248dc3e0c92b6ee59953e7c97baaf2b6c61b47c Mon Sep 17 00:00:00 2001 From: Vanessa Bock Date: Tue, 7 Feb 2023 13:48:59 +0100 Subject: [PATCH 05/10] Threadsave socket --- MobileApp/.idea/misc.xml | 2 +- .../lfrmobileapp/DataTransferAsyncTask.java | 44 ++++++++----------- .../example/lfrmobileapp/ExtendedSocket.java | 25 ++++++++++- .../example/lfrmobileapp/MainActivity.java | 36 ++++++++++++++- .../ui/dashboard/DashboardFragment.java | 13 ------ .../lfrmobileapp/ui/home/HomeFragment.java | 14 ++++-- .../notifications/NotificationsFragment.java | 33 +++++--------- 7 files changed, 101 insertions(+), 66 deletions(-) diff --git a/MobileApp/.idea/misc.xml b/MobileApp/.idea/misc.xml index 5fb06df..675626e 100644 --- a/MobileApp/.idea/misc.xml +++ b/MobileApp/.idea/misc.xml @@ -25,7 +25,7 @@ - + diff --git a/MobileApp/app/src/main/java/com/example/lfrmobileapp/DataTransferAsyncTask.java b/MobileApp/app/src/main/java/com/example/lfrmobileapp/DataTransferAsyncTask.java index 0ff684b..dcf4e01 100644 --- a/MobileApp/app/src/main/java/com/example/lfrmobileapp/DataTransferAsyncTask.java +++ b/MobileApp/app/src/main/java/com/example/lfrmobileapp/DataTransferAsyncTask.java @@ -7,39 +7,38 @@ import java.io.DataOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; public class DataTransferAsyncTask extends AsyncTask { - private static final int sendRatePerSecond = 4; - private String ipAdress; - private int portNumber; - private String telegram; + private static final double sendRatePerSecond = 4.0; private boolean connected; + private final ExtendedSocket socket; + private BlockingQueue blockingQueue; - public DataTransferAsyncTask(String ipAdress, int portNumber) { - this.ipAdress = ipAdress; - this.portNumber = portNumber; - this.telegram = ""; - this.connected = false; + public DataTransferAsyncTask(ExtendedSocket socket) { + this.socket = socket; + this.connected = true; + this.blockingQueue = new LinkedBlockingQueue<>(); } public void writeTelegram(String telegram) { - this.telegram = telegram; + // Schau mal hier bei Fehler + blockingQueue.offer(telegram); } @Override protected Void doInBackground(Void... params) { - while(!isCancelled()) { + while(!isCancelled() && connected) { try { - Socket socket = new Socket(ipAdress, portNumber); - DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); - connected = true; - while (!isCancelled() && telegram.length() > 0) { - Log.v("TAG", telegram + "\n"); - outputStream.writeBytes(telegram); - outputStream.flush(); - Thread.sleep(1000 / sendRatePerSecond); + synchronized (socket) { + String message = blockingQueue.poll((long) (1000.0/sendRatePerSecond), TimeUnit.MILLISECONDS); + if(message != null){ + Log.v("TAG", message + "\n"); + socket.sendMessage(message); + } } - socket.close(); } catch (Exception e) { e.printStackTrace(); connected = false; @@ -47,9 +46,4 @@ public class DataTransferAsyncTask extends AsyncTask { } return null; } - - - public boolean getConnectionState(){ - return connected; - } } diff --git a/MobileApp/app/src/main/java/com/example/lfrmobileapp/ExtendedSocket.java b/MobileApp/app/src/main/java/com/example/lfrmobileapp/ExtendedSocket.java index 7d45ef0..6041782 100644 --- a/MobileApp/app/src/main/java/com/example/lfrmobileapp/ExtendedSocket.java +++ b/MobileApp/app/src/main/java/com/example/lfrmobileapp/ExtendedSocket.java @@ -1,2 +1,25 @@ -package com.example.lfrmobileapp;public class ExtendedSocket { +package com.example.lfrmobileapp; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.net.Socket; + +public class ExtendedSocket { + private final Socket socket; + + public ExtendedSocket(Socket socket) { + this.socket = socket; + } + + public void sendMessage(String message) throws IOException { + synchronized (socket){ + DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); + outputStream.writeBytes(message); + outputStream.flush(); + } + } + + public void closeSocket() throws IOException { + this.socket.close(); + } } diff --git a/MobileApp/app/src/main/java/com/example/lfrmobileapp/MainActivity.java b/MobileApp/app/src/main/java/com/example/lfrmobileapp/MainActivity.java index 55d2ee2..8cbf830 100644 --- a/MobileApp/app/src/main/java/com/example/lfrmobileapp/MainActivity.java +++ b/MobileApp/app/src/main/java/com/example/lfrmobileapp/MainActivity.java @@ -3,6 +3,7 @@ package com.example.lfrmobileapp; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; +import android.widget.Toast; import com.google.android.material.bottomnavigation.BottomNavigationView; @@ -14,11 +15,17 @@ import androidx.navigation.ui.NavigationUI; import com.example.lfrmobileapp.databinding.ActivityMainBinding; - +import java.io.DataOutputStream; +import java.io.IOException; +import java.net.Socket; public class MainActivity extends AppCompatActivity { private ActivityMainBinding binding; + private ExtendedSocket socket; + private DataOutputStream outputStream; + private DataTransferAsyncTask dataTransferAsyncTask; + Boolean connected = false; @Override protected void onCreate(Bundle savedInstanceState) { @@ -38,5 +45,30 @@ public class MainActivity extends AppCompatActivity { NavigationUI.setupWithNavController(binding.navView, navController); } + public boolean connectToWifi(String ipAddress, int port){ + + new Thread(new Runnable(){ + public void run(){ + try { + Socket tempSocket = new Socket(ipAddress, port); + socket = new ExtendedSocket(tempSocket); + socket.sendMessage("Verbindung aufbauen"); + connected = true; + + } catch (Exception e) { + e.printStackTrace(); + connected = false; + } + } + }).start(); + + if(connected){ + dataTransferAsyncTask = new DataTransferAsyncTask(socket); + dataTransferAsyncTask.execute(); + return true; + }else{ + return false; + } + } +} -} \ No newline at end of file diff --git a/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/dashboard/DashboardFragment.java b/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/dashboard/DashboardFragment.java index 473c4c2..d3a696d 100644 --- a/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/dashboard/DashboardFragment.java +++ b/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/dashboard/DashboardFragment.java @@ -29,13 +29,6 @@ import java.util.Arrays; import kotlin.collections.UArraySortingKt; public class DashboardFragment extends Fragment { - - String ipKey = "ipkey"; - String portKey = "portkey"; - - String ipAddress = "192.168.0.1"; - int port = 8000; - Communication com = new Communication(); private FragmentAutomatikBinding binding; @@ -62,12 +55,6 @@ public class DashboardFragment extends Fragment { //Get Arraylist from Shared Preferences String ArrayList autoList = stringToArraylist(sharedPref.getString(listKey, "")); - ipAddress = sharedPref.getString(ipKey, ""); - port = sharedPref.getInt(portKey, -1); - - dataTransferAsyncTask = new DataTransferAsyncTask(ipAddress, port); - dataTransferAsyncTask.execute(); - binding.startAutomatic.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override diff --git a/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/home/HomeFragment.java b/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/home/HomeFragment.java index f746f14..9ae6d91 100644 --- a/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/home/HomeFragment.java +++ b/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/home/HomeFragment.java @@ -18,6 +18,7 @@ import androidx.lifecycle.ViewModelProvider; import com.example.lfrmobileapp.Communication; import com.example.lfrmobileapp.DataTransferAsyncTask; +import com.example.lfrmobileapp.MainActivity; import com.example.lfrmobileapp.R; import com.example.lfrmobileapp.databinding.FragmentManuellBinding; import com.example.lfrmobileapp.ui.notifications.NotificationsFragment; @@ -34,11 +35,19 @@ public class HomeFragment extends Fragment { String ipAddress = "192.168.0.1"; int port = 8000; + MainActivity mainActivity; + Communication com = new Communication(); DataTransferAsyncTask dataTransferAsyncTask; private FragmentManuellBinding binding; + @Override + public void onAttach(Context context) { + super.onAttach(context); + mainActivity = (MainActivity) context; + } + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { HomeViewModel homeViewModel = @@ -58,8 +67,7 @@ public class HomeFragment extends Fragment { final TextView textView = binding.textHome; homeViewModel.getText().observe(getViewLifecycleOwner(), textView::setText); - dataTransferAsyncTask = new DataTransferAsyncTask(ipAddress, port); - dataTransferAsyncTask.execute(); + binding.rotateLeft.setOnTouchListener(new View.OnTouchListener(){ @SuppressLint("ClickableViewAccessibility") @@ -138,7 +146,7 @@ public class HomeFragment extends Fragment { @Override public void onDestroyView() { super.onDestroyView(); - dataTransferAsyncTask.cancel(false); + // dataTransferAsyncTask.cancel(false); binding = null; } } diff --git a/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/notifications/NotificationsFragment.java b/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/notifications/NotificationsFragment.java index cefde0d..1efa499 100644 --- a/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/notifications/NotificationsFragment.java +++ b/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/notifications/NotificationsFragment.java @@ -15,6 +15,7 @@ import androidx.lifecycle.ViewModelProvider; import com.example.lfrmobileapp.Communication; import com.example.lfrmobileapp.DataTransferAsyncTask; +import com.example.lfrmobileapp.MainActivity; import com.example.lfrmobileapp.databinding.FragmentEinstellungenBinding; import java.io.DataOutputStream; @@ -51,6 +52,7 @@ import java.net.Socket; public class NotificationsFragment extends Fragment { Boolean connected = false; + MainActivity mainActivity; String ipKey = "ipkey"; String portKey = "portkey"; @@ -65,6 +67,12 @@ public class NotificationsFragment extends Fragment { private FragmentEinstellungenBinding binding; + @Override + public void onAttach(Context context) { + super.onAttach(context); + mainActivity = (MainActivity) context; + } + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { NotificationsViewModel notificationsViewModel = @@ -87,9 +95,7 @@ public class NotificationsFragment extends Fragment { binding.port.setText(""); } - dataTransferAsyncTask = new DataTransferAsyncTask(ipAddress, port); - - + // dataTransferAsyncTask = new DataTransferAsyncTask(ipAddress, port); final Button button = binding.connect; button.setOnClickListener(new View.OnClickListener() { @@ -97,22 +103,7 @@ public class NotificationsFragment extends Fragment { ipAddress = String.valueOf(binding.ipAdress.getText()); port = Integer.parseInt(String.valueOf(binding.port.getText())); - new Thread(new Runnable(){ - public void run(){ - try { - Socket socket = new Socket(ipAddress, port); - DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); - outputStream.writeBytes("Verbindung aufbauen"); - outputStream.flush(); - socket.close(); - connected = true; - - } catch (Exception e) { - e.printStackTrace(); - connected = false; - } - } - }).start(); + connected = mainActivity.connectToWifi(ipAddress, port); if(connected){ editor.putString(ipKey, ipAddress); @@ -123,7 +114,7 @@ public class NotificationsFragment extends Fragment { }else{ Toast toast = Toast.makeText(v.getContext(), connectionFailed, duration); toast.show(); - dataTransferAsyncTask.cancel(true); + // dataTransferAsyncTask.cancel(true); } } }); @@ -134,7 +125,7 @@ public class NotificationsFragment extends Fragment { @Override public void onDestroyView() { super.onDestroyView(); - dataTransferAsyncTask.cancel(true); + // dataTransferAsyncTask.cancel(true); binding = null; } } \ No newline at end of file From ffb38996e845d88ab01533f3d9d74cc03ecf1273 Mon Sep 17 00:00:00 2001 From: TimZnr Date: Tue, 7 Feb 2023 14:56:44 +0100 Subject: [PATCH 06/10] connectToWifi in Future --- .../example/lfrmobileapp/MainActivity.java | 47 +++++++++++++------ 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/MobileApp/app/src/main/java/com/example/lfrmobileapp/MainActivity.java b/MobileApp/app/src/main/java/com/example/lfrmobileapp/MainActivity.java index 8cbf830..3db5872 100644 --- a/MobileApp/app/src/main/java/com/example/lfrmobileapp/MainActivity.java +++ b/MobileApp/app/src/main/java/com/example/lfrmobileapp/MainActivity.java @@ -17,13 +17,17 @@ import com.example.lfrmobileapp.databinding.ActivityMainBinding; import java.io.DataOutputStream; import java.io.IOException; +import java.net.InetSocketAddress; import java.net.Socket; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; public class MainActivity extends AppCompatActivity { private ActivityMainBinding binding; private ExtendedSocket socket; - private DataOutputStream outputStream; private DataTransferAsyncTask dataTransferAsyncTask; Boolean connected = false; @@ -46,21 +50,29 @@ public class MainActivity extends AppCompatActivity { } public boolean connectToWifi(String ipAddress, int port){ - - new Thread(new Runnable(){ - public void run(){ - try { - Socket tempSocket = new Socket(ipAddress, port); - socket = new ExtendedSocket(tempSocket); - socket.sendMessage("Verbindung aufbauen"); - connected = true; - - } catch (Exception e) { - e.printStackTrace(); - connected = false; - } + ExecutorService executor = Executors.newSingleThreadExecutor(); + Future future = executor.submit(() -> { + Socket tempSocket = new Socket(); + tempSocket.connect(new InetSocketAddress(ipAddress, port), 1000); + try { + socket = new ExtendedSocket(tempSocket); + socket.sendMessage("Verbindung aufbauen"); + } catch (Exception e) { + socket.closeSocket(); + return false; } - }).start(); + return true; + }); + + try { + connected = future.get(); + } catch (InterruptedException e) { + System.err.println("InterruptedException: " + e.getMessage()); + } catch (ExecutionException e) { + System.err.println("ExecutionException: " + e.getCause().getMessage()); + } + + executor.shutdown(); if(connected){ dataTransferAsyncTask = new DataTransferAsyncTask(socket); @@ -70,5 +82,10 @@ public class MainActivity extends AppCompatActivity { return false; } } + + public void sendTelegram(String telegram) + { + this.dataTransferAsyncTask.writeTelegram(telegram); + } } From a8e8ccbbe1ff2bb0aa8587bf4579f71cae75e779 Mon Sep 17 00:00:00 2001 From: TimZnr Date: Tue, 7 Feb 2023 14:57:29 +0100 Subject: [PATCH 07/10] call asynctask through mainactivity --- .../lfrmobileapp/ui/home/HomeFragment.java | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/home/HomeFragment.java b/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/home/HomeFragment.java index 9ae6d91..e8f0b8b 100644 --- a/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/home/HomeFragment.java +++ b/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/home/HomeFragment.java @@ -38,7 +38,6 @@ public class HomeFragment extends Fragment { MainActivity mainActivity; Communication com = new Communication(); - DataTransferAsyncTask dataTransferAsyncTask; private FragmentManuellBinding binding; @@ -76,10 +75,10 @@ public class HomeFragment extends Fragment { if(event.getAction() == MotionEvent.ACTION_UP){ binding.rotateLeft.performClick(); - dataTransferAsyncTask.writeTelegram(com.telegram(new int[]{0, 0, 0, 0}, 0)); + mainActivity.sendTelegram(com.telegram(new int[]{0, 0, 0, 0}, 0)); return true; }else{ - dataTransferAsyncTask.writeTelegram(com.telegram(new int[]{-1, 1, -1, 1}, 100)); + mainActivity.sendTelegram(com.telegram(new int[]{-1, 1, -1, 1}, 100)); } return false; } @@ -92,10 +91,10 @@ public class HomeFragment extends Fragment { if(event.getAction() == MotionEvent.ACTION_UP){ binding.rotateRight.performClick(); - dataTransferAsyncTask.writeTelegram(com.telegram(new int[]{0, 0, 0, 0}, 0)); + mainActivity.sendTelegram(com.telegram(new int[]{0, 0, 0, 0}, 0)); return true; }else{ - dataTransferAsyncTask.writeTelegram(com.telegram(new int[]{1, -1, 1, -1}, 100)); + mainActivity.sendTelegram(com.telegram(new int[]{1, -1, 1, -1}, 100)); } return false; } @@ -110,32 +109,32 @@ public class HomeFragment extends Fragment { //8 segments of the joystick if((angle >= 338 || angle < 22) && strength != 0){ joystick.setBackgroundResource(R.mipmap.right); - dataTransferAsyncTask.writeTelegram(com.telegram(new int[]{1, -1, -1, 1}, strength)); + mainActivity.sendTelegram(com.telegram(new int[]{1, -1, -1, 1}, strength)); }else if((angle >= 22 && angle < 67) && strength != 0){ joystick.setBackgroundResource(R.mipmap.right_forward); - dataTransferAsyncTask.writeTelegram(com.telegram(new int[]{1, 0, 0, 1}, strength)); + mainActivity.sendTelegram(com.telegram(new int[]{1, 0, 0, 1}, strength)); }else if((angle >=67 && angle < 112) && strength != 0){ joystick.setBackgroundResource(R.mipmap.forward); - dataTransferAsyncTask.writeTelegram(com.telegram(new int[]{1, 1, 1, 1}, strength)); + mainActivity.sendTelegram(com.telegram(new int[]{1, 1, 1, 1}, strength)); }else if((angle >=112 && angle < 157) && strength != 0){ joystick.setBackgroundResource(R.mipmap.left_forward); - dataTransferAsyncTask.writeTelegram(com.telegram(new int[]{0, 1, 1, 0}, strength)); + mainActivity.sendTelegram(com.telegram(new int[]{0, 1, 1, 0}, strength)); }else if((angle >=157 && angle < 202) && strength != 0){ joystick.setBackgroundResource(R.mipmap.left); - dataTransferAsyncTask.writeTelegram(com.telegram(new int[]{-1, 1, 1, -1}, strength)); + mainActivity.sendTelegram(com.telegram(new int[]{-1, 1, 1, -1}, strength)); }else if((angle >=202 && angle < 247) && strength != 0){ joystick.setBackgroundResource(R.mipmap.left_back); - dataTransferAsyncTask.writeTelegram(com.telegram(new int[]{-1, 0, 0, -1}, strength)); + mainActivity.sendTelegram(com.telegram(new int[]{-1, 0, 0, -1}, strength)); }else if((angle >=247 && angle < 292) && strength != 0){ joystick.setBackgroundResource(R.mipmap.back); - dataTransferAsyncTask.writeTelegram(com.telegram(new int[]{-1, -1, -1, -1}, strength)); + mainActivity.sendTelegram(com.telegram(new int[]{-1, -1, -1, -1}, strength)); }else if((angle >=292 && angle < 337) && strength != 0){ joystick.setBackgroundResource(R.mipmap.right_back); - dataTransferAsyncTask.writeTelegram(com.telegram(new int[]{0, -1, -1, 0}, strength)); + mainActivity.sendTelegram(com.telegram(new int[]{0, -1, -1, 0}, strength)); } else{ joystick.setBackgroundResource(R.mipmap.blank); - dataTransferAsyncTask.writeTelegram(com.telegram(new int[]{0, 0, 0, 0}, strength)); + mainActivity.sendTelegram(com.telegram(new int[]{0, 0, 0, 0}, strength)); } } }); From e9114fdfe5b148f55afdaf3f168e890a8ccf97f8 Mon Sep 17 00:00:00 2001 From: TimZnr Date: Tue, 7 Feb 2023 15:27:28 +0100 Subject: [PATCH 08/10] Wait for 250ms before sending again --- .../lfrmobileapp/ui/home/HomeFragment.java | 31 +++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/home/HomeFragment.java b/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/home/HomeFragment.java index e8f0b8b..c9a6f01 100644 --- a/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/home/HomeFragment.java +++ b/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/home/HomeFragment.java @@ -38,6 +38,8 @@ public class HomeFragment extends Fragment { MainActivity mainActivity; Communication com = new Communication(); + long lastOnMoveCall = System.currentTimeMillis(); + private FragmentManuellBinding binding; @@ -105,36 +107,47 @@ public class HomeFragment extends Fragment { joystick.setOnMoveListener(new JoystickView.OnMoveListener() { @Override public void onMove(int angle, int strength) { + boolean send = false; + if (System.currentTimeMillis() - lastOnMoveCall > 250){ + send = true; + lastOnMoveCall = System.currentTimeMillis(); + } + String telegram = ""; + homeViewModel.setText(Integer.toString(angle), Integer.toString(strength)); //8 segments of the joystick if((angle >= 338 || angle < 22) && strength != 0){ joystick.setBackgroundResource(R.mipmap.right); - mainActivity.sendTelegram(com.telegram(new int[]{1, -1, -1, 1}, strength)); + telegram = com.telegram(new int[]{1, -1, -1, 1}, strength); }else if((angle >= 22 && angle < 67) && strength != 0){ joystick.setBackgroundResource(R.mipmap.right_forward); - mainActivity.sendTelegram(com.telegram(new int[]{1, 0, 0, 1}, strength)); + telegram = com.telegram(new int[]{1, 0, 0, 1}, strength); }else if((angle >=67 && angle < 112) && strength != 0){ joystick.setBackgroundResource(R.mipmap.forward); - mainActivity.sendTelegram(com.telegram(new int[]{1, 1, 1, 1}, strength)); + telegram = com.telegram(new int[]{1, 1, 1, 1}, strength); }else if((angle >=112 && angle < 157) && strength != 0){ joystick.setBackgroundResource(R.mipmap.left_forward); - mainActivity.sendTelegram(com.telegram(new int[]{0, 1, 1, 0}, strength)); + telegram = com.telegram(new int[]{0, 1, 1, 0}, strength); }else if((angle >=157 && angle < 202) && strength != 0){ joystick.setBackgroundResource(R.mipmap.left); - mainActivity.sendTelegram(com.telegram(new int[]{-1, 1, 1, -1}, strength)); + telegram = com.telegram(new int[]{-1, 1, 1, -1}, strength); }else if((angle >=202 && angle < 247) && strength != 0){ joystick.setBackgroundResource(R.mipmap.left_back); - mainActivity.sendTelegram(com.telegram(new int[]{-1, 0, 0, -1}, strength)); + telegram = com.telegram(new int[]{-1, 0, 0, -1}, strength); }else if((angle >=247 && angle < 292) && strength != 0){ joystick.setBackgroundResource(R.mipmap.back); - mainActivity.sendTelegram(com.telegram(new int[]{-1, -1, -1, -1}, strength)); + telegram = com.telegram(new int[]{-1, -1, -1, -1}, strength); }else if((angle >=292 && angle < 337) && strength != 0){ joystick.setBackgroundResource(R.mipmap.right_back); - mainActivity.sendTelegram(com.telegram(new int[]{0, -1, -1, 0}, strength)); + telegram = com.telegram(new int[]{0, -1, -1, 0}, strength); } else{ joystick.setBackgroundResource(R.mipmap.blank); - mainActivity.sendTelegram(com.telegram(new int[]{0, 0, 0, 0}, strength)); + telegram = com.telegram(new int[]{0, 0, 0, 0}, strength); + } + if (send) + { + mainActivity.sendTelegram(telegram); } } }); From 8cda9e8c0f09d44202caf6d6b1ad42ad72a9f86b Mon Sep 17 00:00:00 2001 From: TimZnr Date: Tue, 7 Feb 2023 16:07:17 +0100 Subject: [PATCH 09/10] Add start and end signal to telegram --- .../src/main/java/com/example/lfrmobileapp/Communication.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MobileApp/app/src/main/java/com/example/lfrmobileapp/Communication.java b/MobileApp/app/src/main/java/com/example/lfrmobileapp/Communication.java index 81d6990..190edd1 100644 --- a/MobileApp/app/src/main/java/com/example/lfrmobileapp/Communication.java +++ b/MobileApp/app/src/main/java/com/example/lfrmobileapp/Communication.java @@ -12,7 +12,7 @@ import java.util.Objects; public class Communication { public String telegram(int[] wheels, int strenght){ - String tel = ""; + String tel = "aa"; tel += "0"; //Manuel mode for(int i = 0; i < wheels.length; i++){ @@ -24,6 +24,7 @@ public class Communication { tel += ";0.00"; } } + tel += "zz"; return tel; } From a34657dc1a180a57ade29df3592d0c32260d3b83 Mon Sep 17 00:00:00 2001 From: Vanessa Bock Date: Tue, 7 Feb 2023 19:54:14 +0100 Subject: [PATCH 10/10] Error handling --- MobileApp/.idea/misc.xml | 2 +- .../example/lfrmobileapp/MainActivity.java | 2 +- .../ui/dashboard/DashboardFragment.java | 21 +++++++--- .../lfrmobileapp/ui/home/HomeFragment.java | 40 +++++++++++++------ .../notifications/NotificationsFragment.java | 12 ++++-- 5 files changed, 52 insertions(+), 25 deletions(-) diff --git a/MobileApp/.idea/misc.xml b/MobileApp/.idea/misc.xml index 675626e..7b77ba6 100644 --- a/MobileApp/.idea/misc.xml +++ b/MobileApp/.idea/misc.xml @@ -25,7 +25,7 @@ - + diff --git a/MobileApp/app/src/main/java/com/example/lfrmobileapp/MainActivity.java b/MobileApp/app/src/main/java/com/example/lfrmobileapp/MainActivity.java index 3db5872..6f60d74 100644 --- a/MobileApp/app/src/main/java/com/example/lfrmobileapp/MainActivity.java +++ b/MobileApp/app/src/main/java/com/example/lfrmobileapp/MainActivity.java @@ -29,7 +29,7 @@ public class MainActivity extends AppCompatActivity { private ActivityMainBinding binding; private ExtendedSocket socket; private DataTransferAsyncTask dataTransferAsyncTask; - Boolean connected = false; + public Boolean connected = false; @Override protected void onCreate(Bundle savedInstanceState) { diff --git a/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/dashboard/DashboardFragment.java b/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/dashboard/DashboardFragment.java index d3a696d..b642cb3 100644 --- a/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/dashboard/DashboardFragment.java +++ b/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/dashboard/DashboardFragment.java @@ -19,6 +19,7 @@ import androidx.lifecycle.ViewModelProvider; import com.example.lfrmobileapp.Communication; import com.example.lfrmobileapp.DataTransferAsyncTask; +import com.example.lfrmobileapp.MainActivity; import com.example.lfrmobileapp.R; import com.example.lfrmobileapp.databinding.FragmentAutomatikBinding; @@ -28,14 +29,21 @@ import java.util.Arrays; import kotlin.collections.UArraySortingKt; +// Autonomous Mode public class DashboardFragment extends Fragment { Communication com = new Communication(); private FragmentAutomatikBinding binding; + MainActivity mainActivity; + //Keys for Shared Preferences String listKey = "listkey"; - DataTransferAsyncTask dataTransferAsyncTask; + @Override + public void onAttach(Context context) { + super.onAttach(context); + mainActivity = (MainActivity) context; + } public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -59,10 +67,12 @@ public class DashboardFragment extends Fragment { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - if(isChecked){ - dataTransferAsyncTask.writeTelegram(com.telegram(true, autoList)); - }else{ - dataTransferAsyncTask.writeTelegram(com.telegram(false, autoList)); + if (mainActivity.connected){ + if(isChecked){ + mainActivity.sendTelegram(com.telegram(true, autoList)); + }else{ + mainActivity.sendTelegram(com.telegram(false, autoList)); + } } } }); @@ -149,7 +159,6 @@ public class DashboardFragment extends Fragment { @Override public void onDestroyView() { super.onDestroyView(); - dataTransferAsyncTask.cancel(false); binding = null; } diff --git a/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/home/HomeFragment.java b/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/home/HomeFragment.java index c9a6f01..e81f938 100644 --- a/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/home/HomeFragment.java +++ b/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/home/HomeFragment.java @@ -4,6 +4,7 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; +import android.util.Log; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; @@ -74,29 +75,41 @@ public class HomeFragment extends Fragment { @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouch(View v, MotionEvent event) { - - if(event.getAction() == MotionEvent.ACTION_UP){ + boolean send = false; + if (System.currentTimeMillis() - lastOnMoveCall > 250){ + send = true; + lastOnMoveCall = System.currentTimeMillis(); + } + if (send && mainActivity.connected) { + if (event.getAction() == MotionEvent.ACTION_UP) { binding.rotateLeft.performClick(); mainActivity.sendTelegram(com.telegram(new int[]{0, 0, 0, 0}, 0)); return true; - }else{ + } else { mainActivity.sendTelegram(com.telegram(new int[]{-1, 1, -1, 1}, 100)); } - return false; } - }); + return false; + } + }); binding.rotateRight.setOnTouchListener(new View.OnTouchListener(){ @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouch(View v, MotionEvent event) { - - if(event.getAction() == MotionEvent.ACTION_UP){ - binding.rotateRight.performClick(); - mainActivity.sendTelegram(com.telegram(new int[]{0, 0, 0, 0}, 0)); - return true; - }else{ - mainActivity.sendTelegram(com.telegram(new int[]{1, -1, 1, -1}, 100)); + boolean send = false; + if (System.currentTimeMillis() - lastOnMoveCall > 250){ + send = true; + lastOnMoveCall = System.currentTimeMillis(); + } + if (send && mainActivity.connected){ + if(event.getAction() == MotionEvent.ACTION_UP){ + binding.rotateRight.performClick(); + mainActivity.sendTelegram(com.telegram(new int[]{0, 0, 0, 0}, 0)); + return true; + }else{ + mainActivity.sendTelegram(com.telegram(new int[]{1, -1, 1, -1}, 100)); + } } return false; } @@ -145,9 +158,10 @@ public class HomeFragment extends Fragment { joystick.setBackgroundResource(R.mipmap.blank); telegram = com.telegram(new int[]{0, 0, 0, 0}, strength); } - if (send) + if (send && mainActivity.connected) { mainActivity.sendTelegram(telegram); + // Log.v("TAG", telegram + "\n"); } } }); diff --git a/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/notifications/NotificationsFragment.java b/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/notifications/NotificationsFragment.java index 1efa499..9ddd199 100644 --- a/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/notifications/NotificationsFragment.java +++ b/MobileApp/app/src/main/java/com/example/lfrmobileapp/ui/notifications/NotificationsFragment.java @@ -59,8 +59,8 @@ public class NotificationsFragment extends Fragment { String connectionFailed = "Verbindung fehlgeschlagen."; String connectionSuccessful = "Verbindung erfolgreich."; - String ipAddress = "192.168.0.1"; - int port = 8000; + String ipAddress = "192.168.4.1"; + int port = 8080; int duration = Toast.LENGTH_LONG; DataTransferAsyncTask dataTransferAsyncTask; @@ -100,8 +100,12 @@ public class NotificationsFragment extends Fragment { final Button button = binding.connect; button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { - ipAddress = String.valueOf(binding.ipAdress.getText()); - port = Integer.parseInt(String.valueOf(binding.port.getText())); + try { + ipAddress = String.valueOf(binding.ipAdress.getText()); + port = Integer.parseInt(String.valueOf(binding.port.getText())); + } catch (Exception e){ + System.err.println("Parse Exception: " + e.getMessage()); + } connected = mainActivity.connectToWifi(ipAddress, port);