diff --git a/app/src/main/java/hendrikschutter/com/externgnss/MainActivity.java b/app/src/main/java/hendrikschutter/com/externgnss/MainActivity.java index 9d6db7d..050681e 100644 --- a/app/src/main/java/hendrikschutter/com/externgnss/MainActivity.java +++ b/app/src/main/java/hendrikschutter/com/externgnss/MainActivity.java @@ -2,7 +2,10 @@ package hendrikschutter.com.externgnss; import android.Manifest; import android.annotation.SuppressLint; +import android.app.AlertDialog; import android.content.Context; +import android.content.DialogInterface; +import android.graphics.Color; import android.location.LocationListener; import android.location.LocationManager; @@ -10,6 +13,7 @@ import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; +import android.view.View; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; @@ -19,6 +23,8 @@ import pub.devrel.easypermissions.EasyPermissions; import static java.lang.Thread.sleep; +import com.google.android.material.floatingactionbutton.FloatingActionButton; + import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; @@ -34,7 +40,7 @@ public class MainActivity extends AppCompatActivity { private boolean bChange = true; private BlockingQueue rawSerialByteDataQueue = null; private double lastInternFixLat, lastInternFixLon; - + private MainActivity activity = this; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -45,17 +51,6 @@ public class MainActivity extends AppCompatActivity { // start extern GNSS and display stats on UI startExternGNSS(); - - setEditTextLabel((EditText) findViewById(R.id.interngnssLatNumber), "no signal"); - setEditTextLabel((EditText) findViewById(R.id.interngnssLongNumber), "no signal"); - setEditTextLabel((EditText) findViewById(R.id.interngnssAltitudeNumber), "no signal"); - setEditTextLabel((EditText) findViewById(R.id.interngnssAccuracyNumber), "no signal"); - setEditTextLabel((EditText) findViewById(R.id.interngnssSatCountNumber), "no signal"); - - setEditTextLabel((EditText) findViewById(R.id.externgnssLatNumber), "no signal"); - setEditTextLabel((EditText) findViewById(R.id.externgnssLongNumber), "no signal"); - setEditTextLabel((EditText) findViewById(R.id.externgnssSatCountNumber), "no signal"); - setEditTextLabel((EditText) findViewById(R.id.diffGNSSDistanceNumber), "no signal"); } // From https://github.com/googlesamples/easypermissions @@ -70,12 +65,29 @@ public class MainActivity extends AppCompatActivity { private void startExternGNSS() { rawSerialByteDataQueue = new LinkedBlockingQueue<>(); serialUSB = new SerialUSB(this, rawSerialByteDataQueue); + nmeaParser = new NMEAParser(); if (serialUSB.findSerialDevice()) { serialUSB.connect(9600, 0); if (serialUSB.isConnected()) { - nmeaParser = new NMEAParser(); nmeaParser.setReceiveByteStream(rawSerialByteDataQueue); + + ((FloatingActionButton)findViewById(R.id.floatingActionButtonExternGnssInfo)).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String otgInfo = "OTG-Info:\n Vendor: " + serialUSB.getUsbDeviceVendorId()+ "" + + "\n Device: " + serialUSB.getDeviceId() + + "\n Baudrate: " + String.valueOf(serialUSB.getBaudRate() + + "\n\nNMEA:\n Sentences: " + String.valueOf(nmeaParser.getSentenceCounter())); + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setMessage(otgInfo) + .setPositiveButton("Close", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + } + }); + builder.create().show(); + } + }); } } } @@ -103,10 +115,26 @@ public class MainActivity extends AppCompatActivity { runOnUiThread(myRun); } + private void setTextViewLabel(final TextView v, final String str) { + Runnable myRun = new Runnable() { + public void run() { + v.setText(str); + } + }; + runOnUiThread(myRun); + } + + + @SuppressLint("MissingPermission") @Override protected void onResume() { super.onResume(); + setInternGnssUiNoSignal(); + setExternGnssUiNoSignal(); + setInternGnssUiColor(Color.GRAY); + setExternGnssUiColor(Color.GRAY); + if (!EasyPermissions.hasPermissions(this, perms)) { // Dummy thread ... new Thread(new Runnable() { @@ -131,6 +159,7 @@ public class MainActivity extends AppCompatActivity { public void run() { while (doRun) { if (locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER) != null) { + setInternGnssUiColor(Color.BLACK); lastInternFixLat = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER).getLatitude(); lastInternFixLon = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER).getLongitude(); setEditTextLabel((EditText) findViewById(R.id.interngnssLatNumber), String.format("%.6f", lastInternFixLat)); @@ -140,26 +169,27 @@ public class MainActivity extends AppCompatActivity { setEditTextLabel((EditText) findViewById(R.id.interngnssSatCountNumber), Integer.toString(locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER).getExtras().getInt("satellites"))); } else { - setEditTextLabel((EditText) findViewById(R.id.interngnssLatNumber), "no signal"); - setEditTextLabel((EditText) findViewById(R.id.interngnssLongNumber), "no signal"); - setEditTextLabel((EditText) findViewById(R.id.interngnssAltitudeNumber), "no signal"); - setEditTextLabel((EditText) findViewById(R.id.interngnssAccuracyNumber), "no signal"); - setEditTextLabel((EditText) findViewById(R.id.interngnssSatCountNumber), "no signal"); + setInternGnssUiColor(Color.GRAY); + setInternGnssUiNoSignal(); + setEditTextLabel((EditText) findViewById(R.id.diffGNSSDistanceNumber), "no data"); } if ((serialUSB != null) && (nmeaParser != null)) { if (serialUSB.isConnected()) { + setTextViewLabel((TextView) findViewById(R.id.externgnssNameTextView), "Extern GNSS receiver"); nmeaParser.handleReceiveByteStream(); if (nmeaParser.checkFix() == true) { + setExternGnssUiColor(Color.BLACK); //Log.i("ExternGNSS", "Fix! Lat: " + String.valueOf(nmeaParser.getLatitude()) + " Lon: " + String.valueOf(nmeaParser.getLongitude())); setEditTextLabel((EditText) findViewById(R.id.externgnssLatNumber), String.format("%.6f", nmeaParser.getLatitude())); setEditTextLabel((EditText) findViewById(R.id.externgnssLongNumber), String.format("%.6f", nmeaParser.getLongitude())); setEditTextLabel((EditText) findViewById(R.id.externgnssSatCountNumber), Integer.toString(nmeaParser.getSatCount())); } } else { - setEditTextLabel((EditText) findViewById(R.id.externgnssLatNumber), "no signal"); - setEditTextLabel((EditText) findViewById(R.id.externgnssLongNumber), "no signal"); - setEditTextLabel((EditText) findViewById(R.id.externgnssSatCountNumber), "no signal"); + setTextViewLabel((TextView) findViewById(R.id.externgnssNameTextView), "Extern GNSS receiver (offline)"); + setExternGnssUiColor(Color.GRAY); + setExternGnssUiNoSignal(); + setEditTextLabel((EditText) findViewById(R.id.diffGNSSDistanceNumber), "no data"); } if ((locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER) != null) && (serialUSB != null) && (nmeaParser != null)) { @@ -171,7 +201,7 @@ public class MainActivity extends AppCompatActivity { } } try { - sleep(10000); + sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } @@ -190,6 +220,45 @@ public class MainActivity extends AppCompatActivity { doRun = false; } + private void setInternGnssUiColor(int color){ + ((TextView) findViewById(R.id.interngnssLatTextView)).setTextColor(color); + ((TextView) findViewById(R.id.interngnssLongTextView)).setTextColor(color); + ((TextView) findViewById(R.id.interngnssAccuracyTextView)).setTextColor(color); + ((TextView) findViewById(R.id.interngnssAltitudeTextView)).setTextColor(color); + ((TextView) findViewById(R.id.interngnssSatCountTextView)).setTextColor(color); + + ((EditText) findViewById(R.id.interngnssLatNumber)).setTextColor(color); + ((EditText) findViewById(R.id.interngnssLongNumber)).setTextColor(color); + ((EditText) findViewById(R.id.interngnssAccuracyNumber)).setTextColor(color); + ((EditText) findViewById(R.id.interngnssAltitudeNumber)).setTextColor(color); + ((EditText) findViewById(R.id.interngnssSatCountNumber)).setTextColor(color); + } + + private void setExternGnssUiColor(int color){ + ((TextView) findViewById(R.id.externgnssLatTextView)).setTextColor(color); + ((TextView) findViewById(R.id.externgnssLongTextView)).setTextColor(color); + ((TextView) findViewById(R.id.externgnssSatCountTextView)).setTextColor(color); + + ((EditText) findViewById(R.id.externgnssLatNumber)).setTextColor(color); + ((EditText) findViewById(R.id.externgnssLongNumber)).setTextColor(color); + ((EditText) findViewById(R.id.externgnssSatCountNumber)).setTextColor(color); + } + + private void setInternGnssUiNoSignal(){ + setEditTextLabel((EditText) findViewById(R.id.interngnssLatNumber), "no signal"); + setEditTextLabel((EditText) findViewById(R.id.interngnssLongNumber), "no signal"); + setEditTextLabel((EditText) findViewById(R.id.interngnssAltitudeNumber), "no signal"); + setEditTextLabel((EditText) findViewById(R.id.interngnssAccuracyNumber), "no signal"); + setEditTextLabel((EditText) findViewById(R.id.interngnssSatCountNumber), "no signal"); + } + + private void setExternGnssUiNoSignal(){ + setEditTextLabel((EditText) findViewById(R.id.externgnssLatNumber), "no signal"); + setEditTextLabel((EditText) findViewById(R.id.externgnssLongNumber), "no signal"); + setEditTextLabel((EditText) findViewById(R.id.externgnssSatCountNumber), "no signal"); + setEditTextLabel((EditText) findViewById(R.id.diffGNSSDistanceNumber), "no signal"); + } + LocationListener locationListener = new LocationListener() { @Override public void onLocationChanged(android.location.Location location) { diff --git a/app/src/main/java/hendrikschutter/com/externgnss/NMEAParser.java b/app/src/main/java/hendrikschutter/com/externgnss/NMEAParser.java index a98311f..e65492c 100644 --- a/app/src/main/java/hendrikschutter/com/externgnss/NMEAParser.java +++ b/app/src/main/java/hendrikschutter/com/externgnss/NMEAParser.java @@ -17,6 +17,7 @@ public class NMEAParser { private double longitude; private boolean fix; private int satCount; + private int sentenceCounter; private BlockingQueue rawByteData = null; public NMEAParser() { @@ -24,6 +25,7 @@ public class NMEAParser { this.satCount = 0; this.latitude = 0; this.longitude = 0; + this.sentenceCounter = 0; } public void setReceiveByteStream(BlockingQueue rawData) { @@ -60,7 +62,12 @@ public class NMEAParser { } } + public int getSentenceCounter(){ + return this.sentenceCounter; + } + public void parseSentence(String sentence) { + this.sentenceCounter++; if (sentence.startsWith("$GNGLL")) { parseGNGLL(sentence); } diff --git a/app/src/main/java/hendrikschutter/com/externgnss/SerialUSB.java b/app/src/main/java/hendrikschutter/com/externgnss/SerialUSB.java index 733dd7c..a69fbe1 100644 --- a/app/src/main/java/hendrikschutter/com/externgnss/SerialUSB.java +++ b/app/src/main/java/hendrikschutter/com/externgnss/SerialUSB.java @@ -28,6 +28,8 @@ public class SerialUSB implements SerialInputOutputManager.Listener{ private UsbPermission usbPermission = UsbPermission.Unknown; private BlockingQueue dataBytesQueue = null; private boolean connected = false; + private int deviceVendorId; + private int productID; public SerialUSB(MainActivity mainActivity, BlockingQueue dataBytesQueue){ this.mainActivity = mainActivity; @@ -38,6 +40,18 @@ public class SerialUSB implements SerialInputOutputManager.Listener{ return connected; } + public int getDeviceId(){ + return this.deviceId; + } + + public int getBaudRate(){ + return this.baudRate; + } + + public int getUsbDeviceVendorId(){ + return this.deviceVendorId; + } + public boolean findSerialDevice(){ // Find all available drivers from attached devices. UsbManager usbManager = (UsbManager) this.mainActivity.getSystemService(Context.USB_SERVICE); @@ -55,6 +69,7 @@ public class SerialUSB implements SerialInputOutputManager.Listener{ if(driver != null) { Log.i("SerialUSB", "ExternGNSS: device/driver found!"); this.deviceId = device.getDeviceId(); + this.deviceVendorId = device.getVendorId(); deviceFound = true; } } else @@ -88,13 +103,24 @@ public class SerialUSB implements SerialInputOutputManager.Listener{ return; } usbSerialPort = driver.getPorts().get(portNum); - UsbDeviceConnection usbConnection = usbManager.openDevice(driver.getDevice()); + UsbDeviceConnection usbConnection = null; + + try { + usbConnection = usbManager.openDevice(driver.getDevice()); + } catch (Exception e){ + usbPermission = UsbPermission.Requested; + PendingIntent usbPermissionIntent = PendingIntent.getBroadcast(this.mainActivity, 0, new Intent(INTENT_ACTION_GRANT_USB), 0); + usbManager.requestPermission(driver.getDevice(), usbPermissionIntent); + } + + usbConnection = usbManager.openDevice(driver.getDevice()); if(usbConnection == null && usbPermission == UsbPermission.Unknown && !usbManager.hasPermission(driver.getDevice())) { usbPermission = UsbPermission.Requested; PendingIntent usbPermissionIntent = PendingIntent.getBroadcast(this.mainActivity, 0, new Intent(INTENT_ACTION_GRANT_USB), 0); usbManager.requestPermission(driver.getDevice(), usbPermissionIntent); return; } + if(usbConnection == null) { if (!usbManager.hasPermission(driver.getDevice())) Log.i("connect", "connection failed: permission denied"); diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 3987326..0613a94 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -284,4 +284,16 @@ tools:ignore="SpeakableTextPresentCheck,TouchTargetSizeCheck" tools:text="no signal" /> + + \ No newline at end of file