ui improvements

This commit is contained in:
Hendrik Schutter 2022-04-25 22:55:07 +02:00
parent 316fbb4fdb
commit 2bf18064f7
4 changed files with 137 additions and 23 deletions

View File

@ -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<Byte> 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) {

View File

@ -17,6 +17,7 @@ public class NMEAParser {
private double longitude;
private boolean fix;
private int satCount;
private int sentenceCounter;
private BlockingQueue<Byte> 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<Byte> 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);
}

View File

@ -28,6 +28,8 @@ public class SerialUSB implements SerialInputOutputManager.Listener{
private UsbPermission usbPermission = UsbPermission.Unknown;
private BlockingQueue<Byte> dataBytesQueue = null;
private boolean connected = false;
private int deviceVendorId;
private int productID;
public SerialUSB(MainActivity mainActivity, BlockingQueue<Byte> 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");

View File

@ -284,4 +284,16 @@
tools:ignore="SpeakableTextPresentCheck,TouchTargetSizeCheck"
tools:text="no signal" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/floatingActionButtonExternGnssInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="23dp"
android:layout_marginBottom="45dp"
android:clickable="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:srcCompat="@android:drawable/ic_dialog_info"
tools:ignore="SpeakableTextPresentCheck" />
</androidx.constraintlayout.widget.ConstraintLayout>