mirror of
https://github.com/DSheirer/sdrtrunk.git
synced 2026-11-14 09:37:36 -05:00
#1118 LRRP Latitude Hemisphere parsing. Updates parser to treat latitude value as a 1-bit hemisphere flag followed by a 31-bit integer. Previously, this field was parsed as a 32-bit two's complement field. (#1119)
There may be two separate formats that are used for LRRP position fields where one treats the value as a two's complement field and the other as a 1-bit hemisphere indicator followed by a 31-bit positive integer. If so, we'll need to expose a user-selectable flag to toggle one format or the other. For now, this change won't impact any Northern hemisphere users. Co-authored-by: Dennis Sheirer <dsheirer@github.com>
This commit is contained in:
@@ -31,7 +31,8 @@ import java.text.DecimalFormat;
|
|||||||
*/
|
*/
|
||||||
public class Point2d extends Token
|
public class Point2d extends Token
|
||||||
{
|
{
|
||||||
private static final int[] LATITUDE = new int[]{8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
|
private static final int LATITUDE_HEMISPHERE_FLAG = 8;
|
||||||
|
private static final int[] LATITUDE = new int[]{9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
|
||||||
25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39};
|
25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39};
|
||||||
private static final int[] LONGITUDE = new int[]{40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
|
private static final int[] LONGITUDE = new int[]{40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
|
||||||
57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71};
|
57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71};
|
||||||
@@ -74,30 +75,32 @@ public class Point2d extends Token
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Latitude in degrees decimal
|
* Latitude in degrees decimal
|
||||||
|
*
|
||||||
|
* Note: latitude field is parsed as a leading hemisphere indicator followed by a positive 31-bit integer.
|
||||||
*/
|
*/
|
||||||
public double getLatitude()
|
public double getLatitude()
|
||||||
{
|
{
|
||||||
return getMessage().getInt(LATITUDE, getOffset()) * LATITUDE_MULTIPLIER;// * (getMessage().get(LATITUDE_HEMISPHERE_FLAG) ? -1 : 1);
|
return getMessage().getInt(LATITUDE, getOffset()) * LATITUDE_MULTIPLIER *
|
||||||
|
(getMessage().get(getOffset() + LATITUDE_HEMISPHERE_FLAG) ? -1 : 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Longitude in degrees decimal
|
* Longitude in degrees decimal
|
||||||
|
*
|
||||||
|
* Note: longitude field is parsed as a two's complement 32-bit integer.
|
||||||
*/
|
*/
|
||||||
public double getLongitude()
|
public double getLongitude()
|
||||||
{
|
{
|
||||||
return getMessage().getInt(LONGITUDE, getOffset()) * LONGITUDE_MULTIPLIER;// * (getMessage().get(LONGITUDE_HEMISPHERE_FLAG) ? -1 : 1);
|
//Note: in testing against US data (positive lat, negative long), parsing the lat and long values as
|
||||||
}
|
// two's complement values produced correct results. However, testing against AUS data (negative lat,
|
||||||
|
// positive long), the latitude hemisphere is incorrect. So, I updated the code to treat latitude as a 31-bit
|
||||||
|
// positive integer with a leading hemisphere flag bit and left the longitude parsing as two's complement.
|
||||||
|
//
|
||||||
|
// This same formula can't be applied against the longitude values, or they will be incorrect for US locations.
|
||||||
|
// This may be a radio system configuration item that we have to expose in the future as a switch. Will wait
|
||||||
|
// until users report incorrect latitude parsing before we make any more changes.
|
||||||
|
|
||||||
/**
|
return getMessage().getInt(LONGITUDE, getOffset()) * LONGITUDE_MULTIPLIER;
|
||||||
* Calculates the floating point value specified by the message index arrays.
|
|
||||||
* @param whole units indexes
|
|
||||||
* @param fractional one-hundredth units indexes
|
|
||||||
* @return full value
|
|
||||||
*/
|
|
||||||
protected float getFloat(int[] whole, int[] fractional)
|
|
||||||
{
|
|
||||||
return getMessage().getInt(whole, getOffset()) +
|
|
||||||
(getMessage().getInt(fractional, getOffset()) * HUNDREDTHS_MULTIPLIER);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user