From 6b4a630b7aa06fb4a8f52f4affea11db2a289d1f Mon Sep 17 00:00:00 2001 From: Andrej Krutak Date: Fri, 14 Aug 2015 22:39:54 +0200 Subject: [PATCH 1/4] Add orientation 'bubble' (i.e. graphics display for pitch+roll) --- .../michael/satstat/GpsSectionFragment.java | 2 +- .../satstat/widgets/GpsStatusView.java | 26 ++++++++++++++----- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/com/vonglasow/michael/satstat/GpsSectionFragment.java b/src/com/vonglasow/michael/satstat/GpsSectionFragment.java index 98df4a7..90e10ae 100644 --- a/src/com/vonglasow/michael/satstat/GpsSectionFragment.java +++ b/src/com/vonglasow/michael/satstat/GpsSectionFragment.java @@ -268,7 +268,7 @@ public void onLocationChanged(Location location) { public void onSensorChanged(SensorEvent event) { switch (event.sensor.getType()) { case Sensor.TYPE_ORIENTATION: - gpsStatusView.setYaw(event.values[0]); + gpsStatusView.setOrientation(event.values[0], event.values[1], event.values[2]); break; } } diff --git a/src/com/vonglasow/michael/satstat/widgets/GpsStatusView.java b/src/com/vonglasow/michael/satstat/widgets/GpsStatusView.java index ea00d21..d3afd00 100644 --- a/src/com/vonglasow/michael/satstat/widgets/GpsStatusView.java +++ b/src/com/vonglasow/michael/satstat/widgets/GpsStatusView.java @@ -32,7 +32,7 @@ import android.util.DisplayMetrics; public class GpsStatusView extends SquareView { - private float mYaw = 0; + private float mYaw = 0, mPitch = 0, mRoll = 0; private float mRotation = 0; private int mW = 0; private int mH = 0; @@ -44,6 +44,7 @@ public class GpsStatusView extends SquareView { private Paint gridPaint; private Paint gridBorderPaint; private Paint labelPaint; + private Paint centeringPaint; private Path northArrow = new Path(); private Path labelPathN = new Path(); private Path labelPathE = new Path(); @@ -96,7 +97,11 @@ private void doInit(Context context) { gridBorderPaint = new Paint(Paint.ANTI_ALIAS_FLAG); gridBorderPaint.setColor(Color.parseColor("#50FF9800")); // Orange 500 @ 30% gridBorderPaint.setStyle(Paint.Style.STROKE); - + + centeringPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + centeringPaint.setColor(Color.parseColor("#30FFFFFF")); + centeringPaint.setStyle(Paint.Style.FILL); + northPaint = new Paint(Paint.ANTI_ALIAS_FLAG); northPaint.setColor(Color.parseColor("#FFF44336")); // Red 500 northPaint.setStyle(Paint.Style.FILL); @@ -123,17 +128,21 @@ private void drawSat(Canvas canvas, int prn, float azimuth, float elevation, flo protected void onDraw(Canvas canvas) { int cx = mW / 2; int cy = mH / 2; + float roll = mRoll, pitch = mPitch; //Log.d("GpsStatusView", String.format("Drawing on a %dx%d canvas", w, h)); canvas.translate(cx, cy); + + canvas.drawCircle(mRoll / 90 * mW, mPitch / 180 * mW, mW * 0.05f, centeringPaint); + canvas.rotate(-mRotation); - + canvas.drawCircle(0, 0, mW * 0.37125f, gridBorderPaint); - + canvas.drawLine(-mW * 0.405f, 0, mW * 0.405f, 0, gridPaint); canvas.drawLine(0, -mH * 0.405f, 0, mH * 0.405f, gridPaint); - + canvas.drawCircle(0, 0, mW * 0.405f, gridPaint); canvas.drawCircle(0, 0, mW * 0.27f, gridPaint); canvas.drawCircle(0, 0, mW * 0.135f, gridPaint); @@ -151,7 +160,7 @@ protected void onDraw(Canvas canvas) { canvas.drawTextOnPath(((Activity) getContext()).getString(R.string.value_W), labelPathW, 0, -labelPaint.descent(), labelPaint); - + if (mSats != null) { for (GpsSatellite sat : mSats) { drawSat(canvas, sat.getPrn(), sat.getAzimuth(), sat.getElevation(), sat.getSnr(), sat.usedInFix()); @@ -201,9 +210,12 @@ public void refreshGeometries() { labelPathW.rLineTo(2 * relX, 2 * relY); } - public void setYaw(float yaw) { + public void setOrientation(float yaw, float pitch, float roll) { mYaw = yaw; mRotation = mYaw + zeroYaw[((Activity) getContext()).getWindowManager().getDefaultDisplay().getRotation()]; + + mPitch = pitch; + mRoll = roll; refreshGeometries(); invalidate(); } From 3c0db8d71f150f8957cad48e9235bd599dbf7f68 Mon Sep 17 00:00:00 2001 From: Andrej Krutak Date: Sun, 16 Aug 2015 13:56:11 +0200 Subject: [PATCH 2/4] Show satellite info while searching for GPS signal --- res/values/strings.xml | 3 +- .../satstat/PasvLocListenerService.java | 35 ++++++++++++++++--- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index d555f84..7a90efa 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -141,8 +141,7 @@ GPS search notification Notify me when an application is searching for my location Settings - Searching for location - Touch to view status + Searching for location... Notifications AGPS Data Update On WiFi connect diff --git a/src/com/vonglasow/michael/satstat/PasvLocListenerService.java b/src/com/vonglasow/michael/satstat/PasvLocListenerService.java index 457ec2a..86b7c9e 100644 --- a/src/com/vonglasow/michael/satstat/PasvLocListenerService.java +++ b/src/com/vonglasow/michael/satstat/PasvLocListenerService.java @@ -112,14 +112,15 @@ public void onDestroy() { @Override public void onGpsStatusChanged(int event) { GpsStatus status = mLocationManager.getGpsStatus(null); - int satsUsed = 0; + boolean satsUsed = false; Iterable sats = status.getSatellites(); for (GpsSatellite sat : sats) { if (sat.usedInFix()) { - satsUsed++; + satsUsed = true; + break; } } - if (satsUsed == 0) { + if (!satsUsed) { if (mStatus != GPS_INACTIVE) mStatus = GPS_SEARCH; showStatusNoLocation(); @@ -185,6 +186,13 @@ degY, getString(R.string.unit_degree), minY, secY + /*rounding*/ 0.05, ns, } String text = ""; + + if (location.hasSpeed()) { + title = title + (" | ") + String.format("%.0f%s", + (location.getSpeed() * 3.6), + getString(R.string.unit_km_h)); + } + if (location.hasAltitude()) { text = text + String.format("%.0f%s", (location.getAltitude() * (prefUnitType ? 1 : 3.28084)), @@ -200,7 +208,7 @@ degY, getString(R.string.unit_degree), minY, secY + /*rounding*/ 0.05, ns, (location.getAccuracy() * (prefUnitType ? 1 : 3.28084)), getString(((prefUnitType) ? R.string.unit_meter : R.string.unit_feet))); } - text = text + (text.equals("")?"":", ") + String.format("%d/%d", + text = text + (text.equals("")?"":", ") + String.format("SAT %d/%d", satsUsed, satsInView); text = text + (text.equals("")?"":",\n") + String.format("TTFF %d s", @@ -296,8 +304,25 @@ public void onStatusChanged(String provider, int status, Bundle extras) { public void showStatusNoLocation() { if (mNotifySearch && (mStatus != GPS_INACTIVE)) { + String text = ""; + GpsStatus status = mLocationManager.getGpsStatus(null); + int satsInView = 0; + int satsUsed = 0; + Iterable sats = status.getSatellites(); + for (GpsSatellite sat : sats) { + satsInView++; + if (sat.usedInFix()) { + satsUsed++; + } + } + + text = text + (text.equals("")?"":", ") + String.format("SAT %d/%d", + satsUsed, + satsInView); + text = text + (text.equals("")?"":", ") + String.format("TTFF %d s", + status.getTimeToFirstFix() / 1000); mBuilder.setSmallIcon(R.drawable.ic_stat_notify_nolocation); - mBuilder.setContentTitle(getString(R.string.notify_nolocation_title)); + mBuilder.setContentTitle(text); mBuilder.setContentText(getString(R.string.notify_nolocation_body)); mBuilder.setStyle(null); From cd885fd767e0506ef459ff760fe85f9a623d3431 Mon Sep 17 00:00:00 2001 From: Andrej Krutak Date: Sat, 28 May 2016 19:56:59 +0200 Subject: [PATCH 3/4] Improve the levelling tool. The circle changes size as it moves from dead-center and opacity, as it moves away from either axis. Also, now it always stays withing the compass circle. --- .../satstat/widgets/GpsStatusView.java | 56 +++++++++++++++---- 1 file changed, 44 insertions(+), 12 deletions(-) diff --git a/src/com/vonglasow/michael/satstat/widgets/GpsStatusView.java b/src/com/vonglasow/michael/satstat/widgets/GpsStatusView.java index d3afd00..5d0a6e0 100644 --- a/src/com/vonglasow/michael/satstat/widgets/GpsStatusView.java +++ b/src/com/vonglasow/michael/satstat/widgets/GpsStatusView.java @@ -44,7 +44,7 @@ public class GpsStatusView extends SquareView { private Paint gridPaint; private Paint gridBorderPaint; private Paint labelPaint; - private Paint centeringPaint; + private Paint levellingPaint; private Path northArrow = new Path(); private Path labelPathN = new Path(); private Path labelPathE = new Path(); @@ -98,9 +98,9 @@ private void doInit(Context context) { gridBorderPaint.setColor(Color.parseColor("#50FF9800")); // Orange 500 @ 30% gridBorderPaint.setStyle(Paint.Style.STROKE); - centeringPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - centeringPaint.setColor(Color.parseColor("#30FFFFFF")); - centeringPaint.setStyle(Paint.Style.FILL); + levellingPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + levellingPaint.setColor(Color.parseColor("#FFFFFF")); + levellingPaint.setStyle(Paint.Style.FILL); northPaint = new Paint(Paint.ANTI_ALIAS_FLAG); northPaint.setColor(Color.parseColor("#FFF44336")); // Red 500 @@ -126,26 +126,58 @@ private void drawSat(Canvas canvas, int prn, float azimuth, float elevation, flo @Override protected void onDraw(Canvas canvas) { + final float outerSize = 0.405f; int cx = mW / 2; int cy = mH / 2; - float roll = mRoll, pitch = mPitch; + float levelX = mRoll / 90, levelY = mPitch / 90; + float levelDistance, levelAngle; //Log.d("GpsStatusView", String.format("Drawing on a %dx%d canvas", w, h)); canvas.translate(cx, cy); - canvas.drawCircle(mRoll / 90 * mW, mPitch / 180 * mW, mW * 0.05f, centeringPaint); + // Draw levelling circle in the background + if (levelY > 1) + levelY = 2 - levelY; + if (levelY < -1) + levelY = -2 - levelY; + levelDistance = (float) Math.min(Math.sqrt(levelX * levelX + levelY * levelY), 1); + if (levelX == 0) { + // Quite improbable, but... + if (levelY > 0) + levelAngle = (float)Math.PI / 2f; + else + levelAngle = (float)Math.PI * 3f / 2f; + } else { + levelAngle = (float) Math.atan(levelY / levelX); + if (levelX < 0) + levelAngle += Math.PI; + else if (levelY < 0) + levelAngle += Math.PI * 2; + } + + levellingPaint.setAlpha( + (int)(16.0f + 80.0f * Math.pow( + Math.max(1 - levelDistance, 1 - Math.min(Math.abs(levelY), Math.abs(levelX))), 3) + ) + ); + canvas.drawCircle( + levelDistance * (float)Math.cos(levelAngle) * mW * outerSize / 6f * 5f, + levelDistance * (float)Math.sin(levelAngle) * mW * outerSize / 6f * 5f, + mW * outerSize / 3f * (0.5f + (1 - levelDistance) * 0.5f), levellingPaint + ); + // Draw the rest of the compass... canvas.rotate(-mRotation); - canvas.drawCircle(0, 0, mW * 0.37125f, gridBorderPaint); + canvas.drawCircle(0, 0, mW * outerSize / 1.091f, gridBorderPaint); - canvas.drawLine(-mW * 0.405f, 0, mW * 0.405f, 0, gridPaint); - canvas.drawLine(0, -mH * 0.405f, 0, mH * 0.405f, gridPaint); + canvas.drawLine(-mW * outerSize, 0, mW * outerSize, 0, gridPaint); + canvas.drawLine(0, -mH * outerSize, 0, mH * outerSize, gridPaint); - canvas.drawCircle(0, 0, mW * 0.405f, gridPaint); - canvas.drawCircle(0, 0, mW * 0.27f, gridPaint); - canvas.drawCircle(0, 0, mW * 0.135f, gridPaint); + canvas.drawCircle(0, 0, mW * outerSize, gridPaint); + canvas.drawCircle(0, 0, mW * outerSize / 1.5f, gridPaint); + canvas.drawCircle(0, 0, mW * outerSize / 3f, gridPaint); canvas.drawPath(northArrow, northPaint); From 074e1b1a8e8222940e4fa2790e202401f7950905 Mon Sep 17 00:00:00 2001 From: Andrej Krutak Date: Sat, 28 May 2016 20:36:50 +0200 Subject: [PATCH 4/4] Optimize formatOrientation() Rebased part of 269db3cb. --- .../michael/satstat/MainActivity.java | 30 ++++++++----------- 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/src/com/vonglasow/michael/satstat/MainActivity.java b/src/com/vonglasow/michael/satstat/MainActivity.java index 8a82581..553b809 100644 --- a/src/com/vonglasow/michael/satstat/MainActivity.java +++ b/src/com/vonglasow/michael/satstat/MainActivity.java @@ -239,24 +239,18 @@ public void onReceive(Context c, Intent intent) { * Converts a bearing (in degrees) into a directional name. */ public static String formatOrientation(Context context, float bearing) { - return - (bearing < 11.25) ? context.getString(R.string.value_N) : - (bearing < 33.75) ? context.getString(R.string.value_NNE) : - (bearing < 56.25) ? context.getString(R.string.value_NE) : - (bearing < 78.75) ? context.getString(R.string.value_ENE) : - (bearing < 101.25) ? context.getString(R.string.value_E) : - (bearing < 123.75) ? context.getString(R.string.value_ESE) : - (bearing < 146.25) ? context.getString(R.string.value_SE) : - (bearing < 168.75) ? context.getString(R.string.value_SSE) : - (bearing < 191.25) ? context.getString(R.string.value_S) : - (bearing < 213.75) ? context.getString(R.string.value_SSW) : - (bearing < 236.25) ? context.getString(R.string.value_SW) : - (bearing < 258.75) ? context.getString(R.string.value_WSW) : - (bearing < 280.25) ? context.getString(R.string.value_W) : - (bearing < 302.75) ? context.getString(R.string.value_WNW) : - (bearing < 325.25) ? context.getString(R.string.value_NW) : - (bearing < 347.75) ? context.getString(R.string.value_NNW) : - context.getString(R.string.value_N); + final int orients[] = { + R.string.value_N, R.string.value_NNE, R.string.value_NE, R.string.value_ENE, + R.string.value_E, R.string.value_ESE, R.string.value_SE, R.string.value_SSE, + R.string.value_S, R.string.value_SSW, R.string.value_SW, R.string.value_WSW, + R.string.value_W, R.string.value_WNW, R.string.value_NW, R.string.value_NNW + }; + final int nOrients = orients.length; + + bearing += 360f / nOrients / 2; + if (bearing >= 360) + bearing = 0; + return context.getString(orients[(int) (bearing / 360f * nOrients)]); }