ExternGnss/app/src/main/java/hendrikschutter/com/externgnss/MainActivity.java

198 lines
8.6 KiB
Java

package hendrikschutter.com.externgnss;
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Context;
import android.location.LocationListener;
import android.location.LocationManager;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import pub.devrel.easypermissions.AfterPermissionGranted;
import pub.devrel.easypermissions.EasyPermissions;
import static java.lang.Thread.sleep;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
public class MainActivity extends AppCompatActivity {
private TextView output;
private LocationManager locationManager= null;
private SerialUSB serialUSB = null;
private NMEAParser nmeaParser = null;
private boolean doRun = true;
private final Context cntxToastInternGNSSUpdate = this;
final String[] perms = {Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.INTERNET,};
private static final String INTENT_ACTION_GRANT_USB = BuildConfig.APPLICATION_ID + ".GRANT_USB";
private boolean bChange = true;
private BlockingQueue<Byte> rawSerialByteDataQueue = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// start intern GNSS and display stats on UI
startInternGNSS();
// start extern GNSS and display stats on UI
startExternGNSS();
}
// From https://github.com/googlesamples/easypermissions
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
// Forward results to EasyPermissions
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}
private void startExternGNSS(){
rawSerialByteDataQueue = new LinkedBlockingQueue<>();
serialUSB = new SerialUSB(this, rawSerialByteDataQueue);
if(serialUSB.findSerialDevice()){
serialUSB.connect(9600, 0);
if (serialUSB.isConnected()){
nmeaParser = new NMEAParser();
nmeaParser.setReceiveByteStream(rawSerialByteDataQueue);
}
}
}
@AfterPermissionGranted(123)
private void startInternGNSS() {
if (EasyPermissions.hasPermissions(this, perms)) {
// Already have permission, do the thing
Toast.makeText(cntxToastInternGNSSUpdate, "Permission granted!", Toast.LENGTH_SHORT).show();
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
} else {
// Do not have permissions, request them now
EasyPermissions.requestPermissions(this, "We require location access!",
123, perms);
}
}
private void setEditTextLabel(final EditText v, final String str) {
Runnable myRun = new Runnable() {
public void run() {
v.setText(str);
}
};
runOnUiThread(myRun);
}
@SuppressLint("MissingPermission")
@Override
protected void onResume() {
super.onResume();
if (!EasyPermissions.hasPermissions(this, perms)) {
// Dummy thread ...
new Thread(new Runnable() {
@Override
public void run() {
while (doRun) {
Log.i("HAG", "Just do nothing ...");
try {
sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
} else {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
// Worker-Thread
new Thread(
new Runnable() {
@Override
public void run() {
while (doRun) {
if (locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER) != null) {
setEditTextLabel((EditText) findViewById(R.id.interngnssLatNumber), String.format( "%.6f", locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER).getLatitude()));
setEditTextLabel((EditText) findViewById(R.id.interngnssLongNumber), String.format( "%.6f", locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER).getLongitude()));
setEditTextLabel((EditText) findViewById(R.id.interngnssAltitudeNumber), String.format( "%.2f", locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER).getAltitude()) + " m");
setEditTextLabel((EditText) findViewById(R.id.interngnssAccuracyNumber), String.format( "%.2f", locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER).getAccuracy()) + " m");
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");
}
if(serialUSB != null){
if(serialUSB.isConnected()){
nmeaParser.handleReceiveByteStream();
if (nmeaParser.checkFix() == true) {
//System.out.println(parser.getLatitude() + " " + parser.getLongitude());
//System.out.println(parser.calcDistance(fixedPosLat, fixedPosLng));
//nmeaParser.getLatitude();
//nmeaParser.getLongitude();
Log.i("ExternGNSS", "Fix! Lat: " + String.valueOf(nmeaParser.getLatitude()) + " Lon: " + String.valueOf(nmeaParser.getLongitude()));
// distance.add(nmeaParser.calcDistance(fixedPosLat, fixedPosLng));
// satCount.add(nmeaParser.getSatCount());
}
}
}
runOnUiThread(new Runnable() {
@Override
public void run() {
//Update
}
});
try {
sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
}
/**
* Stop the updates when Activity is paused
*/
@Override
protected void onPause() {
super.onPause();
doRun = false;
}
LocationListener locationListener = new LocationListener() {
@Override
public void onLocationChanged(android.location.Location location) {
Toast.makeText(cntxToastInternGNSSUpdate, "Internal GNSS updated", Toast.LENGTH_LONG).show();
}
@Override
// This callback will never be invoked on Android Q and above.
public void onStatusChanged(String provider, int status, Bundle extras) {
// Toast.makeText(mContext, "Status Changed", Toast.LENGTH_LONG).show();
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
};
}