Skip to content
This repository has been archived by the owner on Mar 4, 2019. It is now read-only.

Levelling tool v2. #75

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -141,8 +141,7 @@
<string name="pref_search">GPS search notification</string>
<string name="pref_search_summary">Notify me when an application is searching for my location</string>
<string name="title_activity_settings">Settings</string>
<string name="notify_nolocation_title">Searching for location</string>
<string name="notify_nolocation_body">Touch to view status</string>
<string name="notify_nolocation_body">Searching for location...</string>
<string name="pref_notifications">Notifications</string>
<string name="pref_agps">AGPS Data Update</string>
<string name="pref_wifi">On WiFi connect</string>
Expand Down
2 changes: 1 addition & 1 deletion src/com/vonglasow/michael/satstat/GpsSectionFragment.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
Expand Down
30 changes: 12 additions & 18 deletions src/com/vonglasow/michael/satstat/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -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)]);
}


Expand Down
35 changes: 30 additions & 5 deletions src/com/vonglasow/michael/satstat/PasvLocListenerService.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<GpsSatellite> 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();
Expand Down Expand Up @@ -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)),
Expand All @@ -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",
Expand Down Expand Up @@ -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<GpsSatellite> 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);

Expand Down
70 changes: 57 additions & 13 deletions src/com/vonglasow/michael/satstat/widgets/GpsStatusView.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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();
Expand Down Expand Up @@ -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);
Expand All @@ -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);

Expand All @@ -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());
Expand Down Expand Up @@ -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();
}
Expand Down