From 59613133edee3940af53f89bf17811f7ae418c53 Mon Sep 17 00:00:00 2001 From: sh123 Date: Sat, 23 Jul 2022 18:17:09 +0300 Subject: [PATCH] Added maidenhead locator field into the position --- .../java/com/radio/codec2talkie/app/AppWorker.java | 8 ++++---- .../protocol/aprs/AprsDataPositionReport.java | 2 ++ .../protocol/aprs/AprsDataPositionReportMicE.java | 1 + .../codec2talkie/protocol/position/Position.java | 4 ++++ .../java/com/radio/codec2talkie/tools/UnitTools.java | 12 ++++++++++++ 5 files changed, 23 insertions(+), 4 deletions(-) diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/app/AppWorker.java b/codec2talkie/src/main/java/com/radio/codec2talkie/app/AppWorker.java index 46c021d..3b61d9f 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/app/AppWorker.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/app/AppWorker.java @@ -173,8 +173,8 @@ public class AppWorker extends Thread { Message msg = new Message(); msg.what = AppMessage.CMD_SEND_LOCATION_TO_TNC.toInt(); msg.obj = position; - Log.i(TAG, String.format("Position sent: lat: %f, lon: %f, course: %f, speed: %f, alt: %f", - position.latitude, position.longitude, + Log.i(TAG, String.format("Position sent: %s, lat: %f, lon: %f, course: %f, speed: %f, alt: %f", + position.maidenHead, position.latitude, position.longitude, position.bearingDegrees, position.speedMetersPerSecond, position.altitudeMeters)); _onMessageReceived.sendMessage(msg); } @@ -232,8 +232,8 @@ public class AppWorker extends Thread { private final ProtocolCallback _protocolCallback = new ProtocolCallback() { @Override protected void onReceivePosition(Position position) { - Log.i(TAG, String.format("Position received: lat: %f, lon: %f, course: %f, speed: %f, alt: %f, sym: %s, status: %s, comment: %s", - position.latitude, position.longitude, + Log.i(TAG, String.format("Position received: %s, lat: %f, lon: %f, course: %f, speed: %f, alt: %f, sym: %s, status: %s, comment: %s", + position.maidenHead, position.latitude, position.longitude, position.bearingDegrees, position.speedMetersPerSecond, position.altitudeMeters, position.symbolCode, position.status, position.comment)); // TODO, store to database diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/aprs/AprsDataPositionReport.java b/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/aprs/AprsDataPositionReport.java index 7fcaa5f..9c72c75 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/aprs/AprsDataPositionReport.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/aprs/AprsDataPositionReport.java @@ -59,6 +59,8 @@ public class AprsDataPositionReport implements AprsData { _position.isCompressed = false; _isValid = true; } + if (_isValid) + _position.maidenHead = UnitTools.decimalToMaidenhead(_position.latitude, _position.longitude); } @Override diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/aprs/AprsDataPositionReportMicE.java b/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/aprs/AprsDataPositionReportMicE.java index ea30ce0..c0dc7a6 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/aprs/AprsDataPositionReportMicE.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/aprs/AprsDataPositionReportMicE.java @@ -208,6 +208,7 @@ public class AprsDataPositionReportMicE implements AprsData { // read comment until the end _position.comment = new String(Arrays.copyOfRange(infoData, 8, infoData.length)); + _position.maidenHead = UnitTools.decimalToMaidenhead(_position.latitude, _position.longitude); _isValid = true; } diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/position/Position.java b/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/position/Position.java index 2ac4f3b..c7b2b43 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/position/Position.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/position/Position.java @@ -2,12 +2,15 @@ package com.radio.codec2talkie.protocol.position; import android.location.Location; +import com.radio.codec2talkie.tools.UnitTools; + public class Position { public long timestampEpochMs; public String srcCallsign; public String dstCallsign; public double latitude; public double longitude; + public String maidenHead; public double altitudeMeters; public double bearingDegrees; public double speedMetersPerSecond; @@ -34,6 +37,7 @@ public class Position { position.hasBearing = location.hasBearing(); position.hasAltitude = location.hasAltitude(); position.hasSpeed = location.hasSpeed(); + position.maidenHead = UnitTools.decimalToMaidenhead(position.latitude, position.longitude); return position; } diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/tools/UnitTools.java b/codec2talkie/src/main/java/com/radio/codec2talkie/tools/UnitTools.java index f06127b..391e5a8 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/tools/UnitTools.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/tools/UnitTools.java @@ -28,6 +28,18 @@ public class UnitTools { return v; } + public static String decimalToMaidenhead(double latitude, double longitude) { + double lat = latitude + 90.0; + double lon = longitude + 180.0; + return String.format("%c%c%c%c%c%c", + (char)('A' + (char)(lon / 20.0)), + (char)('A' + (char)(lat / 10.0)), + (char)('0' + (char)((lon % 20) / 2.0)), + (char)('0' + (char)(lat % 10)), + (char)('A' + (char)((lon - ((int)(lon / 2.0) * 2)) / (5.0 / 60.0))), + (char)('A' + (char)((lat - ((int)(lat / 1.0) * 1)) / (2.5 / 60.0)))); + } + public static String decimalToDecimalNmea(double degrees, boolean isLatitude) { String value = decimalToNmea(degrees, isLatitude); return value.substring(0, isLatitude ? 4 : 5) +