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/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/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)]);
}
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);
diff --git a/src/com/vonglasow/michael/satstat/widgets/GpsStatusView.java b/src/com/vonglasow/michael/satstat/widgets/GpsStatusView.java
index ea00d21..5d0a6e0 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 levellingPaint;
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);
-
+
+ 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
northPaint.setStyle(Paint.Style.FILL);
@@ -121,22 +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 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);
+
+ // 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.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);
+
+ canvas.drawCircle(0, 0, mW * outerSize / 1.091f, gridBorderPaint);
+
+ canvas.drawLine(-mW * outerSize, 0, mW * outerSize, 0, gridPaint);
+ canvas.drawLine(0, -mH * outerSize, 0, mH * outerSize, 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);
@@ -151,7 +192,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 +242,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();
}