diff options
Diffstat (limited to 'altoslib')
136 files changed, 2133 insertions, 344 deletions
diff --git a/altoslib/AltosAccel.java b/altoslib/AltosAccel.java index 2c563f66..c6a2da11 100644 --- a/altoslib/AltosAccel.java +++ b/altoslib/AltosAccel.java @@ -15,11 +15,11 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; -public class AltosAccel extends AltosUnits implements Serializable { +public class AltosAccel extends AltosUnits { public double value(double v, boolean imperial_units) { if (imperial_units) diff --git a/altoslib/AltosCRCException.java b/altoslib/AltosCRCException.java index 03dad137..87d84370 100644 --- a/altoslib/AltosCRCException.java +++ b/altoslib/AltosCRCException.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosCRCException extends Exception { public int rssi; diff --git a/altoslib/AltosCSV.java b/altoslib/AltosCSV.java index fa515b31..b38ed8da 100644 --- a/altoslib/AltosCSV.java +++ b/altoslib/AltosCSV.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.util.*; diff --git a/altoslib/AltosCompanion.java b/altoslib/AltosCompanion.java index dc33dacc..e228b074 100644 --- a/altoslib/AltosCompanion.java +++ b/altoslib/AltosCompanion.java @@ -15,11 +15,11 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; -public class AltosCompanion implements Serializable { +public class AltosCompanion { public final static int board_id_telescience = 0x0a; public final static int MAX_CHANNELS = 12; @@ -37,4 +37,9 @@ public class AltosCompanion implements Serializable { channels = MAX_CHANNELS; companion_data = new int[channels]; } + + public AltosCompanion() { + channels = 0; + companion_data = new int[0]; + } } diff --git a/altoslib/AltosConfigData.java b/altoslib/AltosConfigData.java index 812296f3..ce430d7a 100644 --- a/altoslib/AltosConfigData.java +++ b/altoslib/AltosConfigData.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.util.*; import java.text.*; @@ -204,7 +204,7 @@ public class AltosConfigData implements Iterable<String> { for (int i = 0; i < parts.length; i++) { try { - r[i] = AltosLib.fromdec(parts[i]); + r[i] = (int) AltosLib.fromdec(parts[i]); } catch (NumberFormatException n) { r[i] = 0; } diff --git a/altoslib/AltosConfigDataException.java b/altoslib/AltosConfigDataException.java index 75cd1695..a55f75c2 100644 --- a/altoslib/AltosConfigDataException.java +++ b/altoslib/AltosConfigDataException.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosConfigDataException extends Exception { diff --git a/altoslib/AltosConfigValues.java b/altoslib/AltosConfigValues.java index aab0892a..babd7a4d 100644 --- a/altoslib/AltosConfigValues.java +++ b/altoslib/AltosConfigValues.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public interface AltosConfigValues { /* set and get all of the dialog values */ diff --git a/altoslib/AltosConvert.java b/altoslib/AltosConvert.java index 265b5f0f..5498ae98 100644 --- a/altoslib/AltosConvert.java +++ b/altoslib/AltosConvert.java @@ -18,7 +18,7 @@ /* * Sensor data conversion functions */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosConvert { /* diff --git a/altoslib/AltosDebug.java b/altoslib/AltosDebug.java index e93c2d2d..0bb12688 100644 --- a/altoslib/AltosDebug.java +++ b/altoslib/AltosDebug.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; diff --git a/altoslib/AltosDistance.java b/altoslib/AltosDistance.java index b68a4525..1ade5abb 100644 --- a/altoslib/AltosDistance.java +++ b/altoslib/AltosDistance.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosDistance extends AltosUnits { @@ -54,4 +54,58 @@ public class AltosDistance extends AltosUnits { return 1; return 0; } -}
\ No newline at end of file + + public AltosDistance() { + range_metric = new AltosUnitsRange[2]; + + range_metric[0] = new AltosUnitsRange(0, "m", "meters") { + double value(double v) { + return v; + } + int show_fraction(int width) { + return width / 9; + } + int say_fraction() { + return 0; + } + }; + range_metric[1] = new AltosUnitsRange(2000, "km", "kilometers") { + double value(double v) { + return v / 1000; + } + int show_fraction(int width) { + return width / 5; + } + int say_fraction() { + return 1; + } + }; + + range_imperial = new AltosUnitsRange[2]; + + range_imperial[0] = new AltosUnitsRange(0, "ft", "feet") { + double value(double v) { + return AltosConvert.meters_to_feet(v); + } + int show_fraction(int width) { + return width / 9; + } + int say_fraction() { + return 0; + } + }; + + range_imperial[1] = new AltosUnitsRange(AltosConvert.feet_to_meters(1000), + "mi", "miles") { + double value(double v) { + return AltosConvert.meters_to_miles(v); + } + int show_fraction(int width) { + return width / 5; + } + int say_fraction() { + return 1; + } + }; + } +} diff --git a/altoslib/AltosEeprom.java b/altoslib/AltosEeprom.java index 5f0a349f..94009b57 100644 --- a/altoslib/AltosEeprom.java +++ b/altoslib/AltosEeprom.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.util.*; diff --git a/altoslib/AltosEepromChunk.java b/altoslib/AltosEepromChunk.java index 7a80e294..4f956636 100644 --- a/altoslib/AltosEepromChunk.java +++ b/altoslib/AltosEepromChunk.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.text.*; import java.util.concurrent.*; diff --git a/altoslib/AltosEepromDownload.java b/altoslib/AltosEepromDownload.java index 1a02cb9c..fa76574c 100644 --- a/altoslib/AltosEepromDownload.java +++ b/altoslib/AltosEepromDownload.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.util.*; diff --git a/altoslib/AltosEepromFile.java b/altoslib/AltosEepromFile.java index 000bb1be..d23116a6 100644 --- a/altoslib/AltosEepromFile.java +++ b/altoslib/AltosEepromFile.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.util.*; diff --git a/altoslib/AltosEepromGPS.java b/altoslib/AltosEepromGPS.java index a0a074ee..a6d2ef32 100644 --- a/altoslib/AltosEepromGPS.java +++ b/altoslib/AltosEepromGPS.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.util.*; diff --git a/altoslib/AltosEepromHeader.java b/altoslib/AltosEepromHeader.java index 6c8c56d4..1f94ac07 100644 --- a/altoslib/AltosEepromHeader.java +++ b/altoslib/AltosEepromHeader.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.util.*; diff --git a/altoslib/AltosEepromIterable.java b/altoslib/AltosEepromIterable.java index 97bb9285..c0311b99 100644 --- a/altoslib/AltosEepromIterable.java +++ b/altoslib/AltosEepromIterable.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.util.*; diff --git a/altoslib/AltosEepromList.java b/altoslib/AltosEepromList.java index 4d511ead..abc30a71 100644 --- a/altoslib/AltosEepromList.java +++ b/altoslib/AltosEepromList.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.util.*; diff --git a/altoslib/AltosEepromLog.java b/altoslib/AltosEepromLog.java index f0ed2db4..9eb5d230 100644 --- a/altoslib/AltosEepromLog.java +++ b/altoslib/AltosEepromLog.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.text.*; import java.util.concurrent.*; diff --git a/altoslib/AltosEepromMega.java b/altoslib/AltosEepromMega.java index 29f0aa90..09fb4288 100644 --- a/altoslib/AltosEepromMega.java +++ b/altoslib/AltosEepromMega.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.util.*; diff --git a/altoslib/AltosEepromMetrum2.java b/altoslib/AltosEepromMetrum2.java index 5662c8e5..f23bffd2 100644 --- a/altoslib/AltosEepromMetrum2.java +++ b/altoslib/AltosEepromMetrum2.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.util.*; diff --git a/altoslib/AltosEepromMini.java b/altoslib/AltosEepromMini.java index f429a0e8..b06e6c84 100644 --- a/altoslib/AltosEepromMini.java +++ b/altoslib/AltosEepromMini.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.util.*; diff --git a/altoslib/AltosEepromMonitor.java b/altoslib/AltosEepromMonitor.java index a966c631..9f6094a5 100644 --- a/altoslib/AltosEepromMonitor.java +++ b/altoslib/AltosEepromMonitor.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public interface AltosEepromMonitor { diff --git a/altoslib/AltosEepromTM.java b/altoslib/AltosEepromTM.java index 7a27a234..a65bd11e 100644 --- a/altoslib/AltosEepromTM.java +++ b/altoslib/AltosEepromTM.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.util.*; diff --git a/altoslib/AltosEepromTMini.java b/altoslib/AltosEepromTMini.java index 8f01c088..82f5aedf 100644 --- a/altoslib/AltosEepromTMini.java +++ b/altoslib/AltosEepromTMini.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.util.*; diff --git a/altoslib/AltosFile.java b/altoslib/AltosFile.java index d1d17610..dc2dba82 100644 --- a/altoslib/AltosFile.java +++ b/altoslib/AltosFile.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.File; import java.util.*; diff --git a/altoslib/AltosFlash.java b/altoslib/AltosFlash.java index d79edf68..285e31d5 100644 --- a/altoslib/AltosFlash.java +++ b/altoslib/AltosFlash.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; diff --git a/altoslib/AltosFlashListener.java b/altoslib/AltosFlashListener.java index 8d171baf..170bf0b0 100644 --- a/altoslib/AltosFlashListener.java +++ b/altoslib/AltosFlashListener.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public interface AltosFlashListener { public void position(String label, int percent); diff --git a/altoslib/AltosFlightDisplay.java b/altoslib/AltosFlightDisplay.java index 4b57526a..5a6d88d1 100644 --- a/altoslib/AltosFlightDisplay.java +++ b/altoslib/AltosFlightDisplay.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public interface AltosFlightDisplay extends AltosUnitsListener, AltosFontListener { void reset(); diff --git a/altoslib/AltosFlightReader.java b/altoslib/AltosFlightReader.java index 62f24e9f..77711a4c 100644 --- a/altoslib/AltosFlightReader.java +++ b/altoslib/AltosFlightReader.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.text.*; import java.io.*; diff --git a/altoslib/AltosFlightStats.java b/altoslib/AltosFlightStats.java index 1c7d67e0..32314b2b 100644 --- a/altoslib/AltosFlightStats.java +++ b/altoslib/AltosFlightStats.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; diff --git a/altoslib/AltosFontListener.java b/altoslib/AltosFontListener.java index 565f50e4..9a1622d9 100644 --- a/altoslib/AltosFontListener.java +++ b/altoslib/AltosFontListener.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public interface AltosFontListener { void font_size_changed(int font_size); diff --git a/altoslib/AltosFrequency.java b/altoslib/AltosFrequency.java index 9542fe33..874a9bcc 100644 --- a/altoslib/AltosFrequency.java +++ b/altoslib/AltosFrequency.java @@ -15,13 +15,13 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.util.*; import java.text.*; -public class AltosFrequency implements Serializable { +public class AltosFrequency { public double frequency; public String description; @@ -57,7 +57,6 @@ public class AltosFrequency implements Serializable { return diff < 0.010; } - public AltosFrequency(double f, String d) { frequency = f; description = d; diff --git a/altoslib/AltosGPS.java b/altoslib/AltosGPS.java index c5290a3a..d29ccdd1 100644 --- a/altoslib/AltosGPS.java +++ b/altoslib/AltosGPS.java @@ -15,13 +15,13 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.text.*; import java.util.concurrent.*; import java.io.*; -public class AltosGPS implements Cloneable, Serializable { +public class AltosGPS implements Cloneable { public final static int MISSING = AltosLib.MISSING; diff --git a/altoslib/AltosGPSSat.java b/altoslib/AltosGPSSat.java index c853b634..8b95c150 100644 --- a/altoslib/AltosGPSSat.java +++ b/altoslib/AltosGPSSat.java @@ -15,12 +15,14 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; + +import java.io.*; import java.text.*; +import java.util.*; import java.util.concurrent.*; -import java.io.*; -public class AltosGPSSat implements Serializable { +public class AltosGPSSat { public int svid; public int c_n0; diff --git a/altoslib/AltosGreatCircle.java b/altoslib/AltosGreatCircle.java index de3904bf..a2f12807 100644 --- a/altoslib/AltosGreatCircle.java +++ b/altoslib/AltosGreatCircle.java @@ -15,12 +15,12 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.lang.Math; import java.io.*; -public class AltosGreatCircle implements Cloneable, Serializable { +public class AltosGreatCircle implements Cloneable { public double distance; public double bearing; public double range; @@ -71,7 +71,10 @@ public class AltosGreatCircle implements Cloneable, Serializable { course = 2 * Math.PI-course; } distance = d * earth_radius; - bearing = course * 180/Math.PI; + if (Double.isNaN(course) || Double.isInfinite(course)) + bearing = 0; + else + bearing = course * 180/Math.PI; double height_diff = end_alt - start_alt; range = Math.sqrt(distance * distance + height_diff * height_diff); diff --git a/altoslib/AltosHeight.java b/altoslib/AltosHeight.java index 2bae2566..01bd4a6b 100644 --- a/altoslib/AltosHeight.java +++ b/altoslib/AltosHeight.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosHeight extends AltosUnits { diff --git a/altoslib/AltosHexfile.java b/altoslib/AltosHexfile.java index f72d4183..e7f900c4 100644 --- a/altoslib/AltosHexfile.java +++ b/altoslib/AltosHexfile.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.util.LinkedList; diff --git a/altoslib/AltosHexsym.java b/altoslib/AltosHexsym.java index 1d9cbb18..ab2beff5 100644 --- a/altoslib/AltosHexsym.java +++ b/altoslib/AltosHexsym.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosHexsym { String name; diff --git a/altoslib/AltosIMU.java b/altoslib/AltosIMU.java index 62539e08..dbadcf89 100644 --- a/altoslib/AltosIMU.java +++ b/altoslib/AltosIMU.java @@ -15,12 +15,12 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.util.concurrent.*; import java.io.*; -public class AltosIMU implements Cloneable, Serializable { +public class AltosIMU implements Cloneable { public int accel_along; public int accel_across; public int accel_through; @@ -29,13 +29,13 @@ public class AltosIMU implements Cloneable, Serializable { public int gyro_pitch; public int gyro_yaw; - public static double counts_per_g = 2048.0; + public static final double counts_per_g = 2048.0; public static double convert_accel(double counts) { return counts / counts_per_g * (-AltosConvert.GRAVITATIONAL_ACCELERATION); } - public static double counts_per_degsec = 16.4; + public static final double counts_per_degsec = 16.4; public static double convert_gyro(double counts) { return counts / counts_per_degsec; diff --git a/altoslib/AltosIdle.java b/altoslib/AltosIdle.java index 07a628c3..36a3ca04 100644 --- a/altoslib/AltosIdle.java +++ b/altoslib/AltosIdle.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.util.*; diff --git a/altoslib/AltosIdleFetch.java b/altoslib/AltosIdleFetch.java index 0095bb73..5102c16b 100644 --- a/altoslib/AltosIdleFetch.java +++ b/altoslib/AltosIdleFetch.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.util.*; @@ -134,9 +134,6 @@ public class AltosIdleFetch implements AltosStateUpdate { AltosLink link; - double frequency; - String callsign; - public void update_state(AltosState state) throws InterruptedException, AltosUnknownProduct { try { boolean matched = false; @@ -148,6 +145,8 @@ public class AltosIdleFetch implements AltosStateUpdate { state.set_ground_accel(config_data.accel_cal_plus); state.set_accel_g(config_data.accel_cal_plus, config_data.accel_cal_minus); state.set_product(config_data.product); + state.set_firmware_version(config_data.version); + state.set_log_space(config_data.log_space); for (AltosIdler idler : idlers) { if (idler.matches(config_data)) { idler.update_state(state, link, config_data); diff --git a/altoslib/AltosIdleMonitor.java b/altoslib/AltosIdleMonitor.java index c67b4d8a..fde8c101 100644 --- a/altoslib/AltosIdleMonitor.java +++ b/altoslib/AltosIdleMonitor.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.util.concurrent.*; diff --git a/altoslib/AltosIdleMonitorListener.java b/altoslib/AltosIdleMonitorListener.java index 36857f58..27a51466 100644 --- a/altoslib/AltosIdleMonitorListener.java +++ b/altoslib/AltosIdleMonitorListener.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public interface AltosIdleMonitorListener { public void update(AltosState state, AltosListenerState listener_state); diff --git a/altoslib/AltosIdleReader.java b/altoslib/AltosIdleReader.java new file mode 100644 index 00000000..795593f7 --- /dev/null +++ b/altoslib/AltosIdleReader.java @@ -0,0 +1,121 @@ +/* + * Copyright © 2016 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +package org.altusmetrum.altoslib_11; + +import java.text.*; +import java.io.*; +import java.util.concurrent.*; + +public class AltosIdleReader extends AltosFlightReader { + AltosLink link; + boolean remote; + AltosState state = null; + AltosIdleFetch fetch; + long next_millis; + static final long report_interval = 5 * 1000; + static final long minimum_delay = 1 * 1000; + + private void start_link() throws InterruptedException, TimeoutException { + if (remote) { + link.start_remote(); + } else + link.flush_input(); + } + + private boolean stop_link() throws InterruptedException, TimeoutException { + if (remote) + link.stop_remote(); + return link.reply_abort; + } + + public AltosState read() throws InterruptedException, ParseException, AltosCRCException, IOException { + boolean worked = false; + boolean aborted = false; + + if (state == null) + state = new AltosState(); + else + state = state.clone(); + + long delay = next_millis - System.currentTimeMillis(); + + if (delay > 0) + Thread.sleep(delay); + next_millis = System.currentTimeMillis() + report_interval; + try { + try { + start_link(); + fetch.update_state(state); + if (!link.has_error && !link.reply_abort) + worked = true; + } catch (TimeoutException te) { + } catch (AltosUnknownProduct ue) { + worked = true; + } + } finally { + try { + aborted = stop_link(); + } catch (TimeoutException te) { + aborted = true; + } + if (worked) { + if (remote) { + try { + state.set_rssi(link.rssi(), 0); + } catch (TimeoutException te) { + state.set_rssi(0, 0); + } + } + } + } + + long finish = System.currentTimeMillis(); + + if (next_millis - finish < minimum_delay) + next_millis = finish + minimum_delay; + + return state; + } + + public void close(boolean interrupted) { + try { + link.close(); + } catch (InterruptedException ie) { + } + } + + public void set_frequency(double frequency) throws InterruptedException, TimeoutException { + link.set_radio_frequency(frequency); + } + + public void save_frequency() { + AltosPreferences.set_frequency(link.serial, link.frequency); + } + + public void set_callsign(String callsign) throws InterruptedException, TimeoutException { + link.set_callsign(callsign); + } + + public AltosIdleReader (AltosLink link, boolean remote) + throws IOException, InterruptedException, TimeoutException { + this.link = link; + this.remote = remote; + this.next_millis = System.currentTimeMillis(); + fetch = new AltosIdleFetch(link); + } +} diff --git a/altoslib/AltosIgnite.java b/altoslib/AltosIgnite.java index ab9c2da6..f3c07339 100644 --- a/altoslib/AltosIgnite.java +++ b/altoslib/AltosIgnite.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.util.*; import java.io.*; diff --git a/altoslib/AltosImage.java b/altoslib/AltosImage.java index d54335c7..9a0751b6 100644 --- a/altoslib/AltosImage.java +++ b/altoslib/AltosImage.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; diff --git a/altoslib/AltosJson.java b/altoslib/AltosJson.java new file mode 100644 index 00000000..67f3a00a --- /dev/null +++ b/altoslib/AltosJson.java @@ -0,0 +1,1314 @@ +/* + * Copyright © 2016 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +package org.altusmetrum.altoslib_11; + +import java.io.*; +import java.util.*; +import java.text.*; +import java.lang.*; +import java.lang.reflect.*; + +class JsonUtil { + StringBuffer quote(StringBuffer result, String a) { + result.append("\""); + for (int i = 0; i < a.length(); i++) { + char c = a.charAt(i); + + switch (c) { + case '"': + case '\\': + result.append('\\').append(c); + break; + case '\n': + result.append("\\n"); + break; + default: + result.append(c); + break; + } + } + result.append("\""); + return result; + } + + StringBuffer append(StringBuffer result, AltosJson value, int indent, boolean pretty) { + value.append(result, indent, pretty); + return result; + } + + StringBuffer append(StringBuffer result, String string) { + result.append(string); + return result; + } + + StringBuffer indent(StringBuffer result, int indent) { + result.append("\n"); + for (int i = 0; i < indent; i++) + result.append("\t"); + return result; + } + static NumberFormat get_nf_json() { + DecimalFormat nf = (DecimalFormat) NumberFormat.getNumberInstance(Locale.ROOT); + nf.setParseIntegerOnly(false); + nf.setGroupingUsed(false); + nf.setMaximumFractionDigits(17); + nf.setMinimumFractionDigits(0); + nf.setMinimumIntegerDigits(1); + nf.setDecimalSeparatorAlwaysShown(false); + return nf; + } + + static NumberFormat nf_json = get_nf_json(); +} + +class JsonHash extends JsonUtil { + Hashtable<String,AltosJson> hash; + + void append_hash(StringBuffer result, int indent, boolean pretty) { + boolean first = true; + + result.append("{"); + + ArrayList<String> key_list = new ArrayList<String>(hash.keySet()); + + Collections.sort(key_list, new Comparator<String>() { + @Override + public int compare(String a, String b) { return a.compareTo(b); } + }); + + for (String key : key_list) { + AltosJson value = hash.get(key); + + if (!first) + result.append(","); + first = false; + if (pretty) + indent(result, indent+1); + quote(result, key); + append(result, ": "); + append(result, value, indent+1, pretty); + } + if (pretty) + indent(result, indent); + append(result, "}"); + } + + void put(String key, AltosJson value) { + hash.put(key, value); + } + + AltosJson get(String key) { + return hash.get(key); + } + + JsonHash() { + hash = new Hashtable<String,AltosJson>(); + } +} + +class JsonArray extends JsonUtil { + ArrayList<AltosJson> array; + + void append_array(StringBuffer result, int indent, boolean pretty) { + boolean first = true; + + append(result, "["); + for (int i = 0; i < array.size(); i++) { + AltosJson value = array.get(i); + + if (!first) + append(result, ","); + first = false; + if (pretty) + indent(result, indent+1); + append(result, value, indent+1, pretty); + } + if (pretty) + indent(result, indent); + append(result, "]"); + } + + void put(int index, AltosJson value) { + if (index >= array.size()) + array.add(index, value); + else + array.set(index, value); + } + + AltosJson get(int index) { + if (index < 0 || index > array.size()) + return null; + return array.get(index); + } + + int size() { + return array.size(); + } + + JsonArray() { + array = new ArrayList<AltosJson>(); + } +} + +class JsonToken { + double dval; + long lval; + String sval; + boolean bval; + int token; + + static final int _string = 0; + static final int _double = 1; + static final int _long = 2; + static final int _boolean = 3; + static final int _oc = 4; + static final int _cc = 5; + static final int _os = 6; + static final int _cs = 7; + static final int _comma = 8; + static final int _colon = 9; + static final int _end = 10; + static final int _error = 11; + + static String token_name(int token) { + switch (token) { + case _string: + return "string"; + case _double: + return "number"; + case _long: + return "number"; + case _boolean: + return "boolean"; + case _oc: + return "{"; + case _cc: + return "}"; + case _os: + return "["; + case _cs: + return "]"; + case _comma: + return ","; + case _colon: + return ":"; + case _end: + return "<EOF>"; + case _error: + return "<ERROR>"; + default: + return "<UNKNOWN>"; + } + } + + String token_name() { + return token_name(token); + } + + JsonToken(int token) { + this.token = token; + } + + JsonToken(int token, boolean bval) { + this.token = token; + this.bval = bval; + } + + JsonToken(int token, double dval) { + this.token = token; + this.dval = dval; + } + + JsonToken(int token, long lval) { + this.token = token; + this.lval = lval; + } + + JsonToken(int token, String sval) { + this.token = token; + this.sval = sval; + } + + JsonToken(int token, StringBuffer bval) { + this(token, bval.toString()); + } +} + +/* + * Lexer for json + */ +class JsonLexer extends JsonUtil { + StringReader f; + int line; + int ungot = -2; + StringBuffer pending_token; + JsonToken token; + + static class keyword { + String word; + JsonToken token; + + JsonToken match(String value) { + if (word.equals(value)) + return token; + return null; + } + + keyword(String word, JsonToken token) { + this.word = word; + this.token = token; + } + } + + /* boolean values are the only keywords in json + */ + static keyword[] keywords = { + new keyword("true", new JsonToken(JsonToken._boolean, true)), + new keyword("false", new JsonToken(JsonToken._boolean, false)), + new keyword("NegInfinity", new JsonToken(JsonToken._double, Double.NEGATIVE_INFINITY)), + new keyword("Infinity", new JsonToken(JsonToken._double, Double.POSITIVE_INFINITY)), + new keyword("NaN", new JsonToken(JsonToken._double, Double.NaN)) + }; + + static JsonToken keyword(String word) { + for (int i = 0; i < keywords.length; i++) { + JsonToken token = keywords[i].match(word); + if (token != null) + return token; + } + return null; + } + + /* Get the next char (-1 for EOF) */ + int ch() throws IOException { + int c; + if (ungot != -2) { + c = ungot; + ungot = -2; + } else + c = f.read(); + if (c != -1) + pending_token.append((char) c); + if (c == '\n') + ++line; + return c; + } + + void unch(int c) { + if (ungot != -2) + throw new IllegalArgumentException("ungot buffer full"); + pending_token.deleteCharAt( pending_token.length()-1); + if (c == '\n') + --line; + ungot = c; + } + + String last_token_string() { + if (pending_token == null) + return null; + + return pending_token.toString(); + } + + static boolean is_long_range(double d) { + return -9223372036854775808.0 <= d && d <= 9223372036854775807.0; + } + + JsonToken lex() { + pending_token = new StringBuffer(); + + try { + for (;;) { + int c = ch(); + + switch (c) { + case -1: + return new JsonToken(JsonToken._end); + case '\n': + case ' ': + case '\t': + continue; + case '{': + return new JsonToken(JsonToken._oc); + case '}': + return new JsonToken(JsonToken._cc); + case '[': + return new JsonToken(JsonToken._os); + case ']': + return new JsonToken(JsonToken._cs); + case ',': + return new JsonToken(JsonToken._comma); + case ':': + return new JsonToken(JsonToken._colon); + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + case '.': case '-': case '+': + StringBuffer dbuf = new StringBuffer(); + boolean is_double = false; + while (Character.isDigit(c) || c == '.' || c == '+' || c == '-' || c == 'e' || c == 'E') { + if (c == '.' || c == 'E') + is_double = true; + dbuf.appendCodePoint(c); + c = ch(); + } + unch(c); + String dstr = dbuf.toString(); + double dval; + try { + dval = nf_json.parse(dstr).doubleValue(); + } catch (ParseException pe) { + return new JsonToken(JsonToken._error, dstr); + } + if (is_double || !is_long_range(dval)) + return new JsonToken(JsonToken._double, dval); + else { + long lval = Long.parseLong(dstr); + return new JsonToken(JsonToken._long, lval); + } + case '"': + StringBuffer bval = new StringBuffer(); + for (;;) { + c = ch(); + if (c == '"') + break; + if (c == '\\') { + c = ch(); + switch (c) { + case 'n': + c = '\n'; + break; + case 't': + c = '\t'; + break; + default: + break; + } + } + bval.appendCodePoint(c); + } + return new JsonToken(JsonToken._string, bval); + default: + if (Character.isLetter(c)) { + StringBuffer tbuf = new StringBuffer(); + do { + tbuf.appendCodePoint(c); + c = ch(); + } while (Character.isLetter(c)); + unch(c); + JsonToken token = keyword(tbuf.toString()); + if (token != null) + return token; + } + break; + } + } + } catch (IOException ie) { + return new JsonToken(JsonToken._error, "<EIO>"); + } + } + + void next() { + token = lex(); + } + + JsonToken expect(int e) { + JsonToken t = token; + if (t.token != e) + throw new IllegalArgumentException(String.format("got \"%s\" while expecting \"%s\"", + token.token_name(), + JsonToken.token_name(e))); + next(); + return t; + } + + JsonLexer(String s) { + f = new StringReader(s); + line = 1; + token = null; + } +} + +/* + * Parse a json string into a AltosJson object + */ +class JsonParse { + JsonLexer lexer; + + void parse_error(String format, Object ... arguments) { + throw new IllegalArgumentException(String.format("line %d: JSON parse error %s\n", + lexer.line, + String.format(format, arguments))); + } + + /* Hashes are { string: value ... } */ + JsonHash hash() { + JsonHash hash = new JsonHash(); + + /* skip the open brace */ + lexer.next(); + for (;;) { + /* Allow for empty hashes */ + if (lexer.token.token == JsonToken._cc) { + lexer.next(); + return hash; + } + + /* string : value */ + String key = lexer.expect(JsonToken._string).sval; + lexer.expect(JsonToken._colon); + AltosJson value = value(); + hash.put(key, value); + + switch (lexer.token.token) { + case JsonToken._comma: + lexer.next(); + break; + case JsonToken._cc: + lexer.next(); + return hash; + default: + parse_error("got %s expect \",\" or \"}\"", lexer.token.token_name()); + return null; + } + } + } + + /* Arrays are [ value ... ] */ + JsonArray array() { + JsonArray array = new JsonArray(); + + lexer.next(); + for (int i = 0;; i++) { + /* Allow for empty arrays */ + if (lexer.token.token == JsonToken._cs) { + lexer.next(); + return array; + } + + AltosJson value = value(); + array.put(i, value); + switch (lexer.token.token) { + case JsonToken._comma: + lexer.next(); + break; + case JsonToken._cs: + lexer.next(); + return array; + default: + parse_error("got %s expect \",\" or \"]\"", lexer.token.token_name()); + return null; + } + } + } + + /* Json is a simple LL language; one token is sufficient to + * identify the next object in the input + */ + AltosJson value() { + switch (lexer.token.token) { + case JsonToken._oc: + return new AltosJson(hash()); + case JsonToken._os: + return new AltosJson(array()); + case JsonToken._double: + double dval = lexer.token.dval; + lexer.next(); + return new AltosJson(dval); + case JsonToken._long: + long lval = lexer.token.lval; + lexer.next(); + return new AltosJson(lval); + case JsonToken._string: + String sval = lexer.token.sval; + lexer.next(); + return new AltosJson(sval); + case JsonToken._boolean: + boolean bval = lexer.token.bval; + lexer.next(); + return new AltosJson(bval); + default: + parse_error("Unexpected token \"%s\"", lexer.token.token_name()); + } + return null; + } + + AltosJson parse() { + lexer.next(); + return value(); + } + + JsonParse(String s) { + lexer = new JsonLexer(s); + } +} + +public class AltosJson extends JsonUtil { + private static final int type_none = 0; + private static final int type_hash = 1; + private static final int type_array = 2; + private static final int type_double = 3; + private static final int type_long = 4; + private static final int type_string = 5; + private static final int type_boolean = 6; + + private int type; + + private JsonHash hash; + private JsonArray array; + private double d_number; + private long l_number; + private String string; + private boolean bool; + + /* Generate string representation of the value + */ + StringBuffer append(StringBuffer result, int indent, boolean pretty) { + switch (type) { + case type_hash: + hash.append_hash(result, indent, pretty); + break; + case type_array: + array.append_array(result, indent, pretty); + break; + case type_double: + if (Double.isInfinite(d_number)) { + if (d_number < 0) + result.append("NegInfinity"); + else + result.append("Infinity"); + } else if (Double.isNaN(d_number)) { + result.append("NaN"); + } else { + String dval = nf_json.format(d_number); + if (dval.equals("-0")) + dval = "0"; + result.append(dval); + } + break; + case type_long: + result.append(new Long(l_number).toString()); + break; + case type_string: + quote(result, string); + break; + case type_boolean: + result.append(bool ? "true" : "false"); + break; + } + return result; + } + + private String toString(int indent, boolean pretty) { + StringBuffer result = new StringBuffer(); + append(result, indent, pretty); + return result.toString(); + } + + public String toString() { + return toString(0, false); + } + + public String toPrettyString() { + return toString(0, true); + } + + /* Parse string representation to a value + */ + + public static AltosJson fromString(String string) { + JsonParse parse = new JsonParse(string); + try { + return parse.parse(); + } catch (IllegalArgumentException ie) { + System.out.printf("json:\n%s\n%s\n", string, ie.getMessage()); + return null; + } + } + + /* Accessor functions + */ + private boolean assert_type(boolean setting, int type, int other_type, String error) { + if (setting && this.type == type_none) { + this.type = type; + return false; + } + if (this.type != type && this.type != other_type) + throw new IllegalArgumentException(error); + return true; + } + + private boolean assert_type(boolean setting, int type, String error) { + return assert_type(setting, type, type, error); + } + + private void assert_hash(boolean setting) { + if (!assert_type(setting, type_hash, "not a hash")) + hash = new JsonHash(); + } + + private void assert_array(boolean setting) { + if (!assert_type(setting, type_array, "not an array")) + array = new JsonArray(); + } + + private void assert_number() { + assert_type(false, type_double, type_long, "not a number"); + } + + private void assert_double() { + assert_type(true, type_double, type_long, "not a number"); + } + + private void assert_long() { + assert_type(true, type_long, type_double, "not a number"); + } + + private void assert_string(boolean setting) { + assert_type(setting, type_string, "not a string"); + } + + private void assert_boolean(boolean setting) { + assert_type(setting, type_boolean, "not a boolean"); + } + + /* Primitive accessors + */ + public double number() { + assert_number(); + if (type == type_double) + return d_number; + else + return (double) l_number; + } + + public long l_number() { + assert_number(); + if (type == type_double) + return (long) d_number; + else + return l_number; + } + + public String string() { + assert_string(false); + return string; + } + + public boolean bool() { + assert_boolean(false); + return bool; + } + + public AltosJson get(int index) { + assert_array(false); + return array.get(index); + } + + public AltosJson get(String key) { + assert_hash(false); + return hash.get(key); + } + + public int size() { + assert_array(false); + return array.size(); + } + + /* Typed accessors with defaulting + */ + public double get_double(String key, double def) { + AltosJson value = get(key); + if (value != null) { + return value.number(); + } + return def; + } + + public long get_long(String key, long def) { + AltosJson value = get(key); + if (value != null) + return value.l_number(); + return def; + } + + public int get_int(String key, int def) { + AltosJson value = get(key); + if (value != null) + return (int) value.l_number(); + return def; + } + + public String get_string(String key, String def) { + AltosJson value = get(key); + if (value != null) + return value.string(); + return def; + } + + public boolean get_boolean(String key, boolean def) { + AltosJson value = get(key); + if (value != null) + return value.bool(); + return def; + } + + public double get_double(int index, double def) { + AltosJson value = get(index); + if (value != null) + return value.number(); + return def; + } + + public long get_long(int index, long def) { + AltosJson value = get(index); + if (value != null) + return value.l_number(); + return def; + } + + public int get_int(int index, int def) { + AltosJson value = get(index); + if (value != null) + return (int) value.l_number(); + return def; + } + + public String get_string(int index, String def) { + AltosJson value = get(index); + if (value != null) + return value.string(); + return def; + } + + public boolean get_boolean(int index, boolean def) { + AltosJson value = get(index); + if (value != null) + return value.bool(); + return def; + } + + public double[] get_double_array(String key, double[] def) { + AltosJson value = get(key); + if (value != null) { + double[] ret = new double[value.size()]; + for (int i = 0; i < value.size(); i++) + ret[i] = value.get_double(i, def == null ? 0 : def[i]); + return ret; + } + return def; + } + + public int[] get_int_array(String key, int[] def) { + AltosJson value = get(key); + if (value != null) { + int[] ret = new int[value.size()]; + for (int i = 0; i < value.size(); i++) + ret[i] = value.get_int(i, def == null ? 0 : def[i]); + return ret; + } + return def; + } + + /* Array setter functions + */ + public AltosJson put(int index, AltosJson value) { + assert_array(true); + array.put(index, value); + return value; + } + + public Object put(int index, Object value) { + assert_array(true); + if (value != null) + array.put(index, new AltosJson(value)); + return value; + } + + public double put(int index, double value) { + assert_array(true); + array.put(index, new AltosJson(value)); + return value; + } + + public AltosJson put(int index, double[] value) { + if (value != null) { + assert_array(true); + array.put(index, new AltosJson(value)); + } + return this; + } + + public int[] put(int index, int[] value) { + if (value != null) { + assert_array(true); + array.put(index, new AltosJson(value)); + } + return value; + } + + public String put(int index, String value) { + if (value != null) { + assert_array(true); + array.put(index, new AltosJson(value)); + } + return value; + } + + public boolean put(int index, boolean value) { + assert_array(true); + array.put(index, new AltosJson(value)); + return value; + } + + /* Hash setter functions + */ + public AltosJson put(String key, AltosJson value) { + assert_hash(true); + hash.put(key, value); + return value; + } + + public Object put(String key, Object value) { + assert_hash(true); + if (value != null) + hash.put(key, new AltosJson(value)); + return value; + } + + public double put(String key, double value) { + assert_hash(true); + hash.put(key, new AltosJson(value)); + return value; + } + + public String put(String key, String value) { + if (value != null) { + assert_hash(true); + hash.put(key, new AltosJson(value)); + } + return value; + } + + public boolean put(String key, boolean value) { + assert_hash(true); + hash.put(key, new AltosJson(value)); + return value; + } + + public AltosJson[] put(String key, AltosJson[] value) { + if (value != null) { + assert_hash(true); + hash.put(key, new AltosJson(value)); + } + return value; + } + + public double[] put(String key, double[] value) { + if (value != null) { + assert_hash(true); + hash.put(key, new AltosJson(value)); + } + return value; + } + + public int[] put(String key, int[] value) { + if (value != null) { + assert_hash(true); + hash.put(key, new AltosJson(value)); + } + return value; + } + + /* Primitive setter functions + */ + public double put(double value) { + assert_double(); + d_number = value; + return value; + } + + public byte put(byte value) { + assert_long(); + l_number = value; + return value; + } + + public char put(char value) { + assert_long(); + l_number = value; + return value; + } + + public int put(int value) { + assert_long(); + l_number = value; + return value; + } + + public long put(long value) { + assert_long(); + l_number = value; + return value; + } + + public String put(String value) { + assert_string(true); + string = value; + return value; + } + + public boolean put(boolean value) { + assert_boolean(true); + bool = value; + return value; + } + + private boolean isInnerClass(Class c) { + for (Field field : c.getDeclaredFields()) + if (field.isSynthetic()) + return true; + return false; + } + + /* Construct an object of the specified class from the JSON + * representation. + * + * This works as long as the structure is non-recursive, and + * all inner classes are only members of their immediate outer + * class + */ + private Object make(Class c, Class enclosing_class, Object enclosing_object) { + Object ret; + if (c == Boolean.TYPE) { + ret = bool(); + } else if (c == Byte.TYPE) { + ret = (Byte) (byte) l_number(); + } else if (c == Character.TYPE) { + ret = (Character) (char) l_number(); + } else if (c == Integer.TYPE) { + ret = (Integer) (int) l_number(); + } else if (c == Long.TYPE) { + ret = l_number(); + } else if (c == Double.TYPE) { + ret = number(); + } else if (c == String.class) { + ret = string(); + } else if (c.isArray()) { + assert_array(false); + + Class element_class = c.getComponentType(); + if (element_class == Boolean.TYPE) { + boolean[] array = (boolean[]) Array.newInstance(element_class, size()); + for (int i = 0; i < array.length; i++) + array[i] = (Boolean) get(i).make(element_class); + ret = array; + } else if (element_class == Byte.TYPE) { + byte[] array = (byte[]) Array.newInstance(element_class, size()); + for (int i = 0; i < array.length; i++) + array[i] = (Byte) get(i).make(element_class); + ret = array; + } else if (element_class == Character.TYPE) { + char[] array = (char[]) Array.newInstance(element_class, size()); + for (int i = 0; i < array.length; i++) + array[i] = (Character) get(i).make(element_class); + ret = array; + } else if (element_class == Integer.TYPE) { + int[] array = (int[]) Array.newInstance(element_class, size()); + for (int i = 0; i < array.length; i++) + array[i] = (Integer) get(i).make(element_class); + ret = array; + } else if (element_class == Long.TYPE) { + long[] array = (long[]) Array.newInstance(element_class, size()); + for (int i = 0; i < array.length; i++) + array[i] = (Long) get(i).make(element_class); + ret = array; + } else if (element_class == Double.TYPE) { + double[] array = (double[]) Array.newInstance(element_class, size()); + for (int i = 0; i < array.length; i++) + array[i] = (Double) get(i).make(element_class); + ret = array; + } else { + Object[] array = (Object[]) Array.newInstance(element_class, size()); + for (int i = 0; i < array.length; i++) + array[i] = get(i).make(element_class); + ret = array; + } + } else { + assert_hash(false); + Object object = null; + try { + /* Inner classes have a hidden extra parameter + * to the constructor. Assume that the enclosing object is + * of the enclosing class and construct the object + * based on that. + */ + if (enclosing_class != null && isInnerClass(c)) { + Constructor<?> ctor = ((Class<?>)c).getDeclaredConstructor((Class<?>) enclosing_class); + object = ctor.newInstance(enclosing_object); + } else { + object = c.newInstance(); + } + for (; c != Object.class; c = c.getSuperclass()) { + for (Field field : c.getDeclaredFields()) { + String fieldName = field.getName(); + Class fieldClass = field.getType(); + + if (Modifier.isStatic(field.getModifiers())) + continue; + if (field.isSynthetic()) + continue; + try { + AltosJson json = get(fieldName); + if (json != null) { + Object val = json.make(fieldClass, c, object); + field.setAccessible(true); + field.set(object, val); + } + } catch (IllegalAccessException ie) { + System.out.printf("%s:%s %s\n", + c.getName(), fieldName, ie.toString()); + } + } + } + ret = object; + } catch (InvocationTargetException ie) { + System.out.printf("%s: %s\n", + c.getName(), ie.toString()); + ret = null; + } catch (NoSuchMethodException ie) { + System.out.printf("%s: %s\n", + c.getName(), ie.toString()); + ret = null; + } catch (InstantiationException ie) { + System.out.printf("%s: %s\n", + c.getName(), ie.toString()); + ret = null; + } catch (IllegalAccessException ie) { + System.out.printf("%s: %s\n", + c.getName(), ie.toString()); + ret = null; + } + } + return ret; + } + + /* This is the public API for the + * above function which doesn't handle + * inner classes + */ + public Object make(Class c) { + return make(c, null, null); + } + + /* Constructors, one for each primitive type, String and Object */ + public AltosJson(boolean bool) { + type = type_boolean; + this.bool = bool; + } + + public AltosJson(byte number) { + type = type_long; + this.l_number = number; + } + + public AltosJson(char number) { + type = type_long; + this.l_number = number; + } + + public AltosJson(int number) { + type = type_long; + this.l_number = number; + } + + public AltosJson(long number) { + type = type_long; + this.l_number = number; + } + + public AltosJson(double number) { + type = type_double; + this.d_number = number; + } + + public AltosJson(String string) { + type = type_string; + this.string = string; + } + + public AltosJson(Object object) { + if (object instanceof Boolean) { + type = type_boolean; + bool = (Boolean) object; + } else if (object instanceof Byte) { + type = type_long; + l_number = (Byte) object; + } else if (object instanceof Character) { + type = type_long; + l_number = (Character) object; + } else if (object instanceof Integer) { + type = type_long; + l_number = (Integer) object; + } else if (object instanceof Long) { + type = type_long; + l_number = (Long) object; + } else if (object instanceof Double) { + type = type_double; + d_number = (Double) object; + } else if (object instanceof String) { + type = type_string; + string = (String) object; + } else if (object.getClass().isArray()) { + assert_array(true); + + Class component_class = object.getClass().getComponentType(); + if (component_class == Boolean.TYPE) { + boolean[] array = (boolean[]) object; + for (int i = 0; i < array.length; i++) + put(i, new AltosJson(array[i])); + } else if (component_class == Byte.TYPE) { + byte[] array = (byte[]) object; + for (int i = 0; i < array.length; i++) + put(i, new AltosJson(array[i])); + } else if (component_class == Character.TYPE) { + char[] array = (char[]) object; + for (int i = 0; i < array.length; i++) + put(i, new AltosJson(array[i])); + } else if (component_class == Integer.TYPE) { + int[] array = (int[]) object; + for (int i = 0; i < array.length; i++) + put(i, new AltosJson(array[i])); + } else if (component_class == Long.TYPE) { + long[] array = (long[]) object; + for (int i = 0; i < array.length; i++) + put(i, new AltosJson(array[i])); + } else if (component_class == Double.TYPE) { + double[] array = (double[]) object; + for (int i = 0; i < array.length; i++) + put(i, new AltosJson(array[i])); + } else { + Object[] array = (Object[]) object; + for (int i = 0; i < array.length; i++) + put(i, new AltosJson(array[i])); + } + } else { + assert_hash(true); + for (Class c = object.getClass(); c != Object.class; c = c.getSuperclass()) { + for (Field field : c.getDeclaredFields()) { + String fieldName = field.getName(); + + /* Skip static fields */ + if (Modifier.isStatic(field.getModifiers())) + continue; + + /* Skip synthetic fields. We're assuming + * those are always an inner class reference + * to the outer class object + */ + if (field.isSynthetic()) + continue; + try { + /* We may need to force the field to be accessible if + * it is private + */ + field.setAccessible(true); + Object val = field.get(object); + if (val != null) { + AltosJson json = new AltosJson(val); + put(fieldName, json); + } + } catch (IllegalAccessException ie) { + System.out.printf("%s:%s %s\n", + c.getName(), fieldName, ie.toString()); + } + } + } + } + } + + /* Array constructors, one for each primitive type, String and Object */ + public AltosJson(boolean[] bools) { + assert_array(true); + for(int i = 0; i < bools.length; i++) + put(i, new AltosJson(bools[i])); + } + + public AltosJson(byte[] numbers) { + assert_array(true); + for(int i = 0; i < numbers.length; i++) + put(i, new AltosJson(numbers[i])); + } + + public AltosJson(char[] numbers) { + assert_array(true); + for(int i = 0; i < numbers.length; i++) + put(i, new AltosJson(numbers[i])); + } + + public AltosJson(int[] numbers) { + assert_array(true); + for(int i = 0; i < numbers.length; i++) + put(i, new AltosJson(numbers[i])); + } + + public AltosJson(long[] numbers) { + assert_array(true); + for(int i = 0; i < numbers.length; i++) + put(i, new AltosJson(numbers[i])); + } + + public AltosJson(double[] numbers) { + assert_array(true); + for(int i = 0; i < numbers.length; i++) + put(i, new AltosJson(numbers[i])); + } + + public AltosJson(String[] strings) { + assert_array(true); + for(int i = 0; i < strings.length; i++) + put(i, new AltosJson(strings[i])); + } + + public AltosJson(AltosJson[] jsons) { + assert_array(true); + for (int i = 0; i < jsons.length; i++) + put(i, jsons[i]); + } + + public AltosJson(Object[] array) { + assert_array(true); + for (int i = 0; i < array.length; i++) + put(i, new AltosJson(array[i])); + } + + /* Empty constructor + */ + public AltosJson() { + type = type_none; + } + + public AltosJson(JsonHash hash) { + type = type_hash; + this.hash = hash; + } + + public AltosJson(JsonArray array) { + type = type_array; + this.array = array; + } +} diff --git a/altoslib/AltosKML.java b/altoslib/AltosKML.java index ac5e0257..ba053015 100644 --- a/altoslib/AltosKML.java +++ b/altoslib/AltosKML.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.util.*; diff --git a/altoslib/AltosLatLon.java b/altoslib/AltosLatLon.java index d39fe15f..ed1dd64e 100644 --- a/altoslib/AltosLatLon.java +++ b/altoslib/AltosLatLon.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosLatLon { public double lat; diff --git a/altoslib/AltosLatitude.java b/altoslib/AltosLatitude.java index e0deb504..04931ece 100644 --- a/altoslib/AltosLatitude.java +++ b/altoslib/AltosLatitude.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosLatitude extends AltosLocation { public String pos() { return "N"; } diff --git a/altoslib/AltosLaunchSite.java b/altoslib/AltosLaunchSite.java index ee2a60e9..831fdf64 100644 --- a/altoslib/AltosLaunchSite.java +++ b/altoslib/AltosLaunchSite.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.lang.*; diff --git a/altoslib/AltosLaunchSiteListener.java b/altoslib/AltosLaunchSiteListener.java index c77eadc5..6167b7cf 100644 --- a/altoslib/AltosLaunchSiteListener.java +++ b/altoslib/AltosLaunchSiteListener.java @@ -14,7 +14,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.lang.*; diff --git a/altoslib/AltosLaunchSites.java b/altoslib/AltosLaunchSites.java index 3ebac601..db6a1f80 100644 --- a/altoslib/AltosLaunchSites.java +++ b/altoslib/AltosLaunchSites.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.lang.*; diff --git a/altoslib/AltosLib.java b/altoslib/AltosLib.java index a73a7759..044caf8d 100644 --- a/altoslib/AltosLib.java +++ b/altoslib/AltosLib.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.util.*; import java.io.*; @@ -493,9 +493,10 @@ public class AltosLib { return r; } - public static int fromdec(String s) throws NumberFormatException { - int c, v = 0; - int sign = 1; + public static long fromdec(String s) throws NumberFormatException { + int c; + long v = 0; + long sign = 1; for (int i = 0; i < s.length(); i++) { c = s.charAt(i); if (i == 0 && c == '-') { diff --git a/altoslib/AltosLine.java b/altoslib/AltosLine.java index 876cb7df..90490192 100644 --- a/altoslib/AltosLine.java +++ b/altoslib/AltosLine.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosLine { public String line; diff --git a/altoslib/AltosLink.java b/altoslib/AltosLink.java index cd8609c0..32766674 100644 --- a/altoslib/AltosLink.java +++ b/altoslib/AltosLink.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.util.concurrent.*; diff --git a/altoslib/AltosListenerState.java b/altoslib/AltosListenerState.java index 389e392f..7d9ec2a4 100644 --- a/altoslib/AltosListenerState.java +++ b/altoslib/AltosListenerState.java @@ -15,11 +15,11 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; -public class AltosListenerState implements Serializable { +public class AltosListenerState { public int crc_errors; public double battery; public boolean running; diff --git a/altoslib/AltosLocation.java b/altoslib/AltosLocation.java index df1c9d63..2ab07ebb 100644 --- a/altoslib/AltosLocation.java +++ b/altoslib/AltosLocation.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public abstract class AltosLocation extends AltosUnits { diff --git a/altoslib/AltosLog.java b/altoslib/AltosLog.java index a6e04215..74017a29 100644 --- a/altoslib/AltosLog.java +++ b/altoslib/AltosLog.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.text.*; diff --git a/altoslib/AltosLongitude.java b/altoslib/AltosLongitude.java index 61d74afc..77fe9c9a 100644 --- a/altoslib/AltosLongitude.java +++ b/altoslib/AltosLongitude.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosLongitude extends AltosLocation { public String pos() { return "E"; } diff --git a/altoslib/AltosMag.java b/altoslib/AltosMag.java index ce5a48c3..5864529f 100644 --- a/altoslib/AltosMag.java +++ b/altoslib/AltosMag.java @@ -15,17 +15,17 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.util.concurrent.*; import java.io.*; -public class AltosMag implements Cloneable, Serializable { +public class AltosMag implements Cloneable { public int along; public int across; public int through; - public static double counts_per_gauss = 1090; + public static final double counts_per_gauss = 1090; public static double convert_gauss(double counts) { return counts / counts_per_gauss; diff --git a/altoslib/AltosMap.java b/altoslib/AltosMap.java index 1841277f..0c775f33 100644 --- a/altoslib/AltosMap.java +++ b/altoslib/AltosMap.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.lang.*; @@ -51,6 +51,7 @@ public class AltosMap implements AltosMapTileListener, AltosMapStoreListener { }; AltosMapInterface map_interface; + int scale; AltosMapCache cache; @@ -328,7 +329,8 @@ public class AltosMap implements AltosMapTileListener, AltosMapStoreListener { if (!tiles.containsKey(point)) { AltosLatLon ul = transform.lat_lon(point); AltosLatLon center = transform.lat_lon(new AltosPointDouble(x + AltosMap.px_size/2, y + AltosMap.px_size/2)); - AltosMapTile tile = map_interface.new_tile(cache, ul, center, zoom, maptype, px_size); + AltosMapTile tile = map_interface.new_tile(cache, ul, center, zoom, maptype, px_size, scale); + debug("show state %s url %s\n", AltosMapTile.status_name(tile.store.status()), tile.store.url); tile.add_listener(this); tiles.put(point, tile); } @@ -475,11 +477,16 @@ public class AltosMap implements AltosMapTileListener, AltosMapStoreListener { drag_stop(x, y); } - public AltosMap(AltosMapInterface map_interface) { + public AltosMap(AltosMapInterface map_interface, int scale) { this.map_interface = map_interface; + this.scale = scale; cache = new AltosMapCache(map_interface); line = map_interface.new_line(); path = map_interface.new_path(); set_zoom_label(); } + + public AltosMap(AltosMapInterface map_interface) { + this(map_interface, 1); + } } diff --git a/altoslib/AltosMapCache.java b/altoslib/AltosMapCache.java index 38e0f769..28f6b116 100644 --- a/altoslib/AltosMapCache.java +++ b/altoslib/AltosMapCache.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.net.*; @@ -60,7 +60,6 @@ public class AltosMapCache implements AltosMapCacheListener { public synchronized void notify_tile(AltosMapTile tile, int status) { if (status == AltosMapTile.fetched) { - System.out.printf("tile fetched, loading image\n"); load(); } } @@ -139,8 +138,6 @@ public class AltosMapCache implements AltosMapCacheListener { elements[oldest].flush(); elements[oldest] = element; - System.out.printf("AltosMapCache.get image ? %s\n", - element.image == null ? "false" : "true"); return element.image; } } diff --git a/altoslib/AltosMapCacheListener.java b/altoslib/AltosMapCacheListener.java index 4984d9e5..b010d12f 100644 --- a/altoslib/AltosMapCacheListener.java +++ b/altoslib/AltosMapCacheListener.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public interface AltosMapCacheListener { public void map_cache_changed(int map_cache); diff --git a/altoslib/AltosMapInterface.java b/altoslib/AltosMapInterface.java index 756a78f2..78cd70eb 100644 --- a/altoslib/AltosMapInterface.java +++ b/altoslib/AltosMapInterface.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.net.*; @@ -29,7 +29,7 @@ public interface AltosMapInterface { public abstract AltosMapMark new_mark(double lat, double lon, int state); - public abstract AltosMapTile new_tile(AltosMapCache cache, AltosLatLon upper_left, AltosLatLon center, int zoom, int maptype, int px_size); + public abstract AltosMapTile new_tile(AltosMapCache cache, AltosLatLon upper_left, AltosLatLon center, int zoom, int maptype, int px_size, int scale); public abstract int width(); diff --git a/altoslib/AltosMapLine.java b/altoslib/AltosMapLine.java index bd590136..187aa6d9 100644 --- a/altoslib/AltosMapLine.java +++ b/altoslib/AltosMapLine.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.lang.Math; @@ -50,7 +50,7 @@ public abstract class AltosMapLine { if (AltosConvert.imperial_units) { distance = AltosConvert.meters_to_feet(distance); - if (distance < 10000) { + if (distance < 1000) { format = "%4.0fft"; } else { distance /= 5280; @@ -64,7 +64,7 @@ public abstract class AltosMapLine { format = "%5.0fmi"; } } else { - if (distance < 10000) { + if (distance < 1000) { format = "%4.0fm"; } else { distance /= 1000; diff --git a/altoslib/AltosMapLoader.java b/altoslib/AltosMapLoader.java index 7112a1c4..d715df38 100644 --- a/altoslib/AltosMapLoader.java +++ b/altoslib/AltosMapLoader.java @@ -15,16 +15,17 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.util.*; +import java.util.concurrent.*; import java.text.*; import java.lang.Math; import java.net.URL; import java.net.URLConnection; -public class AltosMapLoader extends Thread implements AltosMapTileListener { +public class AltosMapLoader extends Thread implements AltosMapStoreListener { AltosMapLoaderListener listener; double latitude, longitude; @@ -34,6 +35,7 @@ public class AltosMapLoader extends Thread implements AltosMapTileListener { int all_types; int cur_type; double radius; + int scale; int tiles_loaded_layer; int tiles_loaded_total; @@ -42,7 +44,11 @@ public class AltosMapLoader extends Thread implements AltosMapTileListener { int layers_total; int layers_loaded; - AltosMap map; + private static final int MAX_LOADING = 200; + + private Semaphore loading = new Semaphore(MAX_LOADING); + + boolean abort; int tile_radius(int zoom) { double delta_lon = AltosMapTransform.lon_from_distance(latitude, radius); @@ -62,7 +68,7 @@ public class AltosMapLoader extends Thread implements AltosMapTileListener { return (tile_radius * 2 + 1) * (tile_radius * 2 + 1); } - public void do_load() { + private boolean do_load() { tiles_this_layer = tiles_per_layer(cur_z); tiles_loaded_layer = 0; listener.debug("tiles_this_layer %d (zoom %d)\n", tiles_this_layer, cur_z); @@ -73,8 +79,6 @@ public class AltosMapLoader extends Thread implements AltosMapTileListener { AltosLatLon load_centre = new AltosLatLon(latitude, longitude); AltosMapTransform transform = new AltosMapTransform(256, 256, zoom, load_centre); - map.centre(load_centre); - AltosPointInt upper_left; AltosPointInt lower_right; @@ -88,16 +92,25 @@ public class AltosMapLoader extends Thread implements AltosMapTileListener { for (int y = (int) upper_left.y; y <= lower_right.y; y += AltosMap.px_size) { for (int x = (int) upper_left.x; x <= lower_right.x; x += AltosMap.px_size) { + try { + loading.acquire(); + } catch (InterruptedException ie) { + return false; + } AltosPointInt point = new AltosPointInt(x, y); AltosLatLon ul = transform.lat_lon(point); AltosLatLon center = transform.lat_lon(new AltosPointDouble(x + AltosMap.px_size/2, y + AltosMap.px_size/2)); - AltosMapTile tile = map.map_interface.new_tile(null, ul, center, zoom, maptype, AltosMap.px_size); - tile.add_listener(this); + AltosMapStore store = AltosMapStore.get(center, zoom, maptype, AltosMap.px_size, scale); + listener.debug("load state %s url %s\n", AltosMapTile.status_name(store.status()), store.url); + store.add_listener(this); + if (abort) + return false; } } + return true; } - public int next_type(int start) { + private int next_type(int start) { int next_type; for (next_type = start; next_type <= AltosMap.maptype_terrain && (all_types & (1 << next_type)) == 0; @@ -106,19 +119,19 @@ public class AltosMapLoader extends Thread implements AltosMapTileListener { return next_type; } - public void next_load() { + private boolean next_load() { int next_type = next_type(cur_type + 1); if (next_type > AltosMap.maptype_terrain) { if (cur_z == max_z) { - return; + return false; } else { cur_z++; } next_type = next_type(0); } cur_type = next_type; - do_load(); + return true; } public void run() { @@ -147,15 +160,22 @@ public class AltosMapLoader extends Thread implements AltosMapTileListener { listener.debug("total tiles %d layers %d\n", tiles_total, layers_total); listener.loader_start(tiles_total); - do_load(); + do { + if (!do_load()) + break; + } while (next_load()); + if (abort) + listener.loader_done(tiles_total); } - public synchronized void notify_tile(AltosMapTile tile, int status) { + public synchronized void notify_store(AltosMapStore store, int status) { boolean do_next = false; if (status == AltosMapTile.fetching) return; - tile.remove_listener(this); + loading.release(); + + store.remove_listener(this); if (layers_loaded >= layers_total) return; @@ -163,7 +183,7 @@ public class AltosMapLoader extends Thread implements AltosMapTileListener { ++tiles_loaded_total; ++tiles_loaded_layer; - listener.debug("AltosMapLoader.notify_tile status %d total %d of %d layer %d of %d\n", + listener.debug("AltosMapLoader.notify_store status %d total %d of %d layer %d of %d\n", status, tiles_loaded_total, tiles_total, tiles_loaded_layer, tiles_this_layer); if (tiles_loaded_layer == tiles_this_layer) { @@ -174,19 +194,19 @@ public class AltosMapLoader extends Thread implements AltosMapTileListener { if (tiles_loaded_total == tiles_total) listener.loader_done(tiles_total); - else { + else listener.loader_notify(tiles_loaded_total, - tiles_total, tile.store.file.toString()); - if (do_next) - next_load(); - } + tiles_total, store.file.toString()); + } + + public void abort() { + this.abort = true; } - public AltosMapLoader(AltosMap map, AltosMapLoaderListener listener, - double latitude, double longitude, int min_z, int max_z, double radius, int all_types) { + public AltosMapLoader(AltosMapLoaderListener listener, + double latitude, double longitude, int min_z, int max_z, double radius, int all_types, int scale) { listener.debug("lat %f lon %f min_z %d max_z %d radius %f all_types %d\n", latitude, longitude, min_z, max_z, radius, all_types); - this.map = map; this.listener = listener; this.latitude = latitude; this.longitude = longitude; @@ -194,6 +214,8 @@ public class AltosMapLoader extends Thread implements AltosMapTileListener { this.max_z = max_z; this.radius = radius; this.all_types = all_types; + this.scale = scale; + this.abort = false; start(); } } diff --git a/altoslib/AltosMapLoaderListener.java b/altoslib/AltosMapLoaderListener.java index 47d7b858..97c8b7f5 100644 --- a/altoslib/AltosMapLoaderListener.java +++ b/altoslib/AltosMapLoaderListener.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public interface AltosMapLoaderListener { public abstract void loader_start(int max); diff --git a/altoslib/AltosMapMark.java b/altoslib/AltosMapMark.java index db714922..0fac5b37 100644 --- a/altoslib/AltosMapMark.java +++ b/altoslib/AltosMapMark.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.lang.Math; diff --git a/altoslib/AltosMapPath.java b/altoslib/AltosMapPath.java index 6f6db4f4..75664f83 100644 --- a/altoslib/AltosMapPath.java +++ b/altoslib/AltosMapPath.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.lang.Math; diff --git a/altoslib/AltosMapPathPoint.java b/altoslib/AltosMapPathPoint.java index 5b46cb19..89494408 100644 --- a/altoslib/AltosMapPathPoint.java +++ b/altoslib/AltosMapPathPoint.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.lang.Math; diff --git a/altoslib/AltosMapRectangle.java b/altoslib/AltosMapRectangle.java index b6294a4e..566e414f 100644 --- a/altoslib/AltosMapRectangle.java +++ b/altoslib/AltosMapRectangle.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosMapRectangle { AltosLatLon ul, lr; diff --git a/altoslib/AltosMapStore.java b/altoslib/AltosMapStore.java index aed365ca..53bfd517 100644 --- a/altoslib/AltosMapStore.java +++ b/altoslib/AltosMapStore.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.net.*; @@ -28,6 +28,45 @@ public class AltosMapStore { int status; + private static File map_file(AltosLatLon center, int zoom, int maptype, int px_size, int scale) { + double lat = center.lat; + double lon = center.lon; + char chlat = lat < 0 ? 'S' : 'N'; + char chlon = lon < 0 ? 'W' : 'E'; + + if (lat < 0) lat = -lat; + if (lon < 0) lon = -lon; + String maptype_string = String.format("%s-", AltosMap.maptype_names[maptype]); + String format_string; + if (maptype == AltosMap.maptype_hybrid || maptype == AltosMap.maptype_satellite || maptype == AltosMap.maptype_terrain) + format_string = "jpg"; + else + format_string = "png"; + return new File(AltosPreferences.mapdir(), + String.format("map-%c%.6f,%c%.6f-%s%d%s.%s", + chlat, lat, chlon, lon, maptype_string, zoom, scale == 1 ? "" : String.format("-%d", scale), format_string)); + } + + private static String map_url(AltosLatLon center, int zoom, int maptype, int px_size, int scale) { + String format_string; + int z = zoom; + + if (maptype == AltosMap.maptype_hybrid || maptype == AltosMap.maptype_satellite || maptype == AltosMap.maptype_terrain) + format_string = "jpg"; + else + format_string = "png32"; + + for (int s = 1; s < scale; s <<= 1) + z--; + + if (AltosVersion.has_google_maps_api_key()) + return String.format("http://maps.google.com/maps/api/staticmap?center=%.6f,%.6f&zoom=%d&size=%dx%d&scale=%d&sensor=false&maptype=%s&format=%s&key=%s", + center.lat, center.lon, z, px_size/scale, px_size/scale, scale, AltosMap.maptype_names[maptype], format_string, AltosVersion.google_maps_api_key); + else + return String.format("http://maps.google.com/maps/api/staticmap?center=%.6f,%.6f&zoom=%d&size=%dx%d&scale=%d&sensor=false&maptype=%s&format=%s", + center.lat, center.lon, z, px_size/scale, px_size/scale, AltosMap.maptype_names[maptype], format_string); + } + public int status() { return status; } @@ -229,16 +268,19 @@ public class AltosMapStore { static HashMap<String,AltosMapStore> stores = new HashMap<String,AltosMapStore>(); - public static AltosMapStore get(String url, File file) { + public static AltosMapStore get(AltosLatLon center, int zoom, int maptype, int px_size, int scale) { + String url = map_url(center, zoom, maptype, px_size, scale); + AltosMapStore store; synchronized(stores) { if (stores.containsKey(url)) { store = stores.get(url); } else { - store = new AltosMapStore(url, file); + store = new AltosMapStore(url, map_file(center, zoom, maptype, px_size, scale)); stores.put(url, store); } } return store; } + } diff --git a/altoslib/AltosMapStoreListener.java b/altoslib/AltosMapStoreListener.java index 65bd6ef8..bfee5f5c 100644 --- a/altoslib/AltosMapStoreListener.java +++ b/altoslib/AltosMapStoreListener.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public interface AltosMapStoreListener { abstract void notify_store(AltosMapStore store, int status); diff --git a/altoslib/AltosMapTile.java b/altoslib/AltosMapTile.java index fdc8ff65..b65f6fc1 100644 --- a/altoslib/AltosMapTile.java +++ b/altoslib/AltosMapTile.java @@ -15,12 +15,12 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.util.*; -public abstract class AltosMapTile implements AltosFontListener, AltosMapStoreListener { +public class AltosMapTile implements AltosFontListener, AltosMapStoreListener { LinkedList<AltosMapTileListener> listeners = new LinkedList<AltosMapTileListener>(); public AltosLatLon upper_left, center; public int px_size; @@ -38,43 +38,23 @@ public abstract class AltosMapTile implements AltosFontListener, AltosMapStoreLi static public final int bad_request = 4;/* downloading failed */ static public final int forbidden = 5; /* downloading failed */ - private File map_file() { - double lat = center.lat; - double lon = center.lon; - char chlat = lat < 0 ? 'S' : 'N'; - char chlon = lon < 0 ? 'W' : 'E'; - - if (lat < 0) lat = -lat; - if (lon < 0) lon = -lon; - String maptype_string = String.format("%s-", AltosMap.maptype_names[maptype]); - String format_string; - if (maptype == AltosMap.maptype_hybrid || maptype == AltosMap.maptype_satellite || maptype == AltosMap.maptype_terrain) - format_string = "jpg"; - else - format_string = "png"; - return new File(AltosPreferences.mapdir(), - String.format("map-%c%.6f,%c%.6f-%s%d%s.%s", - chlat, lat, chlon, lon, maptype_string, zoom, scale == 1 ? "" : String.format("-%d", scale), format_string)); - } - - private String map_url() { - String format_string; - int z = zoom; - - if (maptype == AltosMap.maptype_hybrid || maptype == AltosMap.maptype_satellite || maptype == AltosMap.maptype_terrain) - format_string = "jpg"; - else - format_string = "png32"; - - for (int s = 1; s < scale; s <<= 1) - z--; - - if (AltosVersion.has_google_maps_api_key()) - return String.format("http://maps.google.com/maps/api/staticmap?center=%.6f,%.6f&zoom=%d&size=%dx%d&scale=%d&sensor=false&maptype=%s&format=%s&key=%s", - center.lat, center.lon, z, px_size/scale, px_size/scale, scale, AltosMap.maptype_names[maptype], format_string, AltosVersion.google_maps_api_key); - else - return String.format("http://maps.google.com/maps/api/staticmap?center=%.6f,%.6f&zoom=%d&size=%dx%d&scale=%d&sensor=false&maptype=%s&format=%s", - center.lat, center.lon, z, px_size/scale, px_size/scale, AltosMap.maptype_names[maptype], format_string); + static public String status_name(int status) { + switch (status) { + case loaded: + return "loaded"; + case fetched: + return "fetched"; + case fetching: + return "fetching"; + case failed: + return "failed"; + case bad_request: + return "bad_request"; + case forbidden: + return "forbidden"; + default: + return "unknown"; + } } public void font_size_changed(int font_size) { @@ -87,7 +67,6 @@ public abstract class AltosMapTile implements AltosFontListener, AltosMapStoreLi } public void notify_store(AltosMapStore store, int status) { -// System.out.printf("AltosMapTile.notify_store %d\n", status); notify_listeners(status); } @@ -99,7 +78,8 @@ public abstract class AltosMapTile implements AltosFontListener, AltosMapStoreLi notify_listeners(status); } - public abstract void paint(AltosMapTransform t); + public void paint(AltosMapTransform t) { + } public AltosImage get_image() { if (cache == null) @@ -132,11 +112,7 @@ public abstract class AltosMapTile implements AltosFontListener, AltosMapStoreLi this.px_size = px_size; this.scale = scale; - store = AltosMapStore.get(map_url(), map_file()); + store = AltosMapStore.get(center, zoom, maptype, px_size, scale); store.add_listener(this); } - - public AltosMapTile(AltosMapCache cache, AltosLatLon upper_left, AltosLatLon center, int zoom, int maptype, int px_size) { - this(cache, upper_left, center, zoom, maptype, px_size, 1); - } } diff --git a/altoslib/AltosMapTileListener.java b/altoslib/AltosMapTileListener.java index 6d78b205..7939e4bd 100644 --- a/altoslib/AltosMapTileListener.java +++ b/altoslib/AltosMapTileListener.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public interface AltosMapTileListener { abstract public void notify_tile(AltosMapTile tile, int status); diff --git a/altoslib/AltosMapTransform.java b/altoslib/AltosMapTransform.java index b8901127..53f3abac 100644 --- a/altoslib/AltosMapTransform.java +++ b/altoslib/AltosMapTransform.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.lang.Math; diff --git a/altoslib/AltosMapTypeListener.java b/altoslib/AltosMapTypeListener.java index b82bda3f..20740e7d 100644 --- a/altoslib/AltosMapTypeListener.java +++ b/altoslib/AltosMapTypeListener.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public interface AltosMapTypeListener { public void map_type_changed(int map_type); diff --git a/altoslib/AltosMapZoomListener.java b/altoslib/AltosMapZoomListener.java index 51f8c3c5..59c91e8e 100644 --- a/altoslib/AltosMapZoomListener.java +++ b/altoslib/AltosMapZoomListener.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public interface AltosMapZoomListener { abstract public void zoom_changed(int zoom); diff --git a/altoslib/AltosMma655x.java b/altoslib/AltosMma655x.java index b09ec74b..57bc7b91 100644 --- a/altoslib/AltosMma655x.java +++ b/altoslib/AltosMma655x.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.util.concurrent.*; diff --git a/altoslib/AltosMs5607.java b/altoslib/AltosMs5607.java index 1277f267..e40479b1 100644 --- a/altoslib/AltosMs5607.java +++ b/altoslib/AltosMs5607.java @@ -15,12 +15,12 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.util.concurrent.*; import java.io.*; -public class AltosMs5607 implements Serializable { +public class AltosMs5607 { public int reserved; public int sens; public int off; diff --git a/altoslib/AltosNoSymbol.java b/altoslib/AltosNoSymbol.java index 5451047e..3f3cbbe7 100644 --- a/altoslib/AltosNoSymbol.java +++ b/altoslib/AltosNoSymbol.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosNoSymbol extends Exception { public AltosNoSymbol(String name) { diff --git a/altoslib/AltosOrient.java b/altoslib/AltosOrient.java index 8b22c131..edaa304c 100644 --- a/altoslib/AltosOrient.java +++ b/altoslib/AltosOrient.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosOrient extends AltosUnits { diff --git a/altoslib/AltosParse.java b/altoslib/AltosParse.java index 1cbddcf9..45ef7dac 100644 --- a/altoslib/AltosParse.java +++ b/altoslib/AltosParse.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.util.*; import java.text.*; @@ -27,6 +27,14 @@ public class AltosParse { public static int parse_int(String v) throws ParseException { try { + return (int) AltosLib.fromdec(v); + } catch (NumberFormatException e) { + throw new ParseException("error parsing int " + v, 0); + } + } + + public static long parse_long(String v) throws ParseException { + try { return AltosLib.fromdec(v); } catch (NumberFormatException e) { throw new ParseException("error parsing int " + v, 0); @@ -41,9 +49,23 @@ public class AltosParse { } } - static NumberFormat nf_locale = NumberFormat.getInstance(); + static NumberFormat get_nf_locale() { + NumberFormat nf = NumberFormat.getInstance(); + nf.setParseIntegerOnly(false); + nf.setGroupingUsed(false); + return nf; + } + + static NumberFormat nf_locale = get_nf_locale(); + + static NumberFormat get_nf_net() { + NumberFormat nf = NumberFormat.getInstance(Locale.ROOT); + nf.setParseIntegerOnly(false); + nf.setGroupingUsed(false); + return nf; + } - static NumberFormat nf_net = NumberFormat.getInstance(Locale.ROOT); + static NumberFormat nf_net = get_nf_net(); public static double parse_double_locale(String str) throws ParseException { try { @@ -53,14 +75,26 @@ public class AltosParse { } } + public static String format_double_locale(double number) { + return nf_locale.format(number); + } + public static double parse_double_net(String str) throws ParseException { try { - return nf_net.parse(str.trim()).doubleValue(); + String t = str.trim(); +// System.out.printf("Parse string \"%s\" trim \"%s\"\n", str, t); + return nf_net.parse(t).doubleValue(); } catch (ParseException pe) { throw new ParseException("error parsing double " + str, 0); } } + public static String format_double_net(double number) { + String ret = nf_net.format(number); +// System.out.printf("format double %f \"%s\"\n", number, ret); + return ret; + } + public static double parse_coord(String coord) throws ParseException { String[] dsf = coord.split("\\D+"); diff --git a/altoslib/AltosPointDouble.java b/altoslib/AltosPointDouble.java index 65bad427..b18c4b48 100644 --- a/altoslib/AltosPointDouble.java +++ b/altoslib/AltosPointDouble.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosPointDouble { public double x, y; diff --git a/altoslib/AltosPointInt.java b/altoslib/AltosPointInt.java index 34eb6fd3..14b0dabf 100644 --- a/altoslib/AltosPointInt.java +++ b/altoslib/AltosPointInt.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosPointInt { public int x, y; diff --git a/altoslib/AltosPreferences.java b/altoslib/AltosPreferences.java index fb3026a4..569aaa54 100644 --- a/altoslib/AltosPreferences.java +++ b/altoslib/AltosPreferences.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.util.*; @@ -116,7 +116,7 @@ public class AltosPreferences { public final static String frequency_count = "COUNT"; public final static String frequency_format = "FREQUENCY-%d"; public final static String description_format = "DESCRIPTION-%d"; - public final static String frequenciesPreference = "FREQUENCIES"; + public final static String frequenciesPreference = "FREQUENCIES-1"; /* Units preference */ @@ -133,24 +133,30 @@ public class AltosPreferences { static int map_type; public static AltosFrequency[] load_common_frequencies() { - AltosFrequency[] frequencies = null; - frequencies = (AltosFrequency[]) backend.getSerializable(frequenciesPreference, null); + try { + AltosJson json = AltosJson.fromString(backend.getString(frequenciesPreference, + null)); + frequencies = (AltosFrequency[]) json.make(frequencies.getClass()); + } catch (Exception e) { + } if (frequencies == null) { if (backend.nodeExists(common_frequencies_node_name)) { AltosPreferencesBackend node = backend.node(common_frequencies_node_name); int count = node.getInt(frequency_count, 0); - frequencies = new AltosFrequency[count]; - for (int i = 0; i < count; i++) { - double frequency; - String description; + if (count > 0) { + frequencies = new AltosFrequency[count]; + for (int i = 0; i < count; i++) { + double frequency; + String description; - frequency = node.getDouble(String.format(frequency_format, i), 0.0); - description = node.getString(String.format(description_format, i), null); - frequencies[i] = new AltosFrequency(frequency, description); + frequency = node.getDouble(String.format(frequency_format, i), 0.0); + description = node.getString(String.format(description_format, i), null); + frequencies[i] = new AltosFrequency(frequency, description); + } } } } @@ -165,6 +171,12 @@ public class AltosPreferences { return frequencies; } + public static void save_common_frequencies() { + AltosJson json = new AltosJson(common_frequencies); + backend.putString(frequenciesPreference, json.toString()); + flush_preferences(); + } + public static int launcher_serial; public static int launcher_channel; @@ -353,7 +365,7 @@ public class AltosPreferences { public static void set_state(AltosState state) { synchronized(backend) { - backend.putSerializable(String.format(statePreferenceFormat, state.serial), state); + backend.putJson(String.format(statePreferenceFormat, state.serial), new AltosJson(state)); backend.putInt(statePreferenceLatest, state.serial); flush_preferences(); } @@ -378,6 +390,7 @@ public class AltosPreferences { public static void remove_state(int serial) { synchronized(backend) { backend.remove(String.format(statePreferenceFormat, serial)); + flush_preferences(); } } @@ -392,10 +405,12 @@ public class AltosPreferences { public static AltosState state(int serial) { synchronized(backend) { try { - return (AltosState) backend.getSerializable(String.format(statePreferenceFormat, serial), null); + AltosJson json = backend.getJson(String.format(statePreferenceFormat, serial)); + if (json != null) + return (AltosState) (json.make(AltosState.class)); } catch (Exception e) { - return null; } + return null; } } @@ -512,8 +527,8 @@ public class AltosPreferences { public static void set_common_frequencies(AltosFrequency[] frequencies) { synchronized(backend) { common_frequencies = frequencies; - backend.putSerializable(frequenciesPreference, frequencies); - flush_preferences(); + + save_common_frequencies(); } } diff --git a/altoslib/AltosPreferencesBackend.java b/altoslib/AltosPreferencesBackend.java index 6e1124e2..0580652e 100644 --- a/altoslib/AltosPreferencesBackend.java +++ b/altoslib/AltosPreferencesBackend.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.util.*; @@ -38,40 +38,20 @@ public abstract class AltosPreferencesBackend { public abstract byte[] getBytes(String key, byte[] def); public abstract void putBytes(String key, byte[] value); - public Serializable getSerializable(String key, Serializable def) { - byte[] bytes = null; - - bytes = getBytes(key, null); - if (bytes == null) - return def; - - ByteArrayInputStream bais = new ByteArrayInputStream(bytes); + public AltosJson getJson(String key) { + String value = getString(key, null); + if (value == null) + return null; try { - ObjectInputStream ois = new ObjectInputStream(bais); - Serializable object = (Serializable) ois.readObject(); - return object; - } catch (IOException ie) { - debug("IO exception %s\n", ie.toString()); - } catch (ClassNotFoundException ce) { - debug("ClassNotFoundException %s\n", ce.toString()); + return AltosJson.fromString(value); + } catch (IllegalArgumentException ie) { + return null; } - return def; } - public void putSerializable(String key, Serializable object) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - - try { - ObjectOutputStream oos = new ObjectOutputStream(baos); - - oos.writeObject(object); - byte[] bytes = baos.toByteArray(); - - putBytes(key, bytes); - } catch (IOException ie) { - debug("set_state failed %s\n", ie.toString()); - } + public void putJson(String key, AltosJson j) { + putString(key, j.toString()); } public abstract boolean nodeExists(String key); diff --git a/altoslib/AltosProgrammer.java b/altoslib/AltosProgrammer.java index 2f8e3bd0..78be8282 100644 --- a/altoslib/AltosProgrammer.java +++ b/altoslib/AltosProgrammer.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; diff --git a/altoslib/AltosPyro.java b/altoslib/AltosPyro.java index 28e65bc2..c948ce21 100644 --- a/altoslib/AltosPyro.java +++ b/altoslib/AltosPyro.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.util.*; import java.text.*; @@ -138,7 +138,7 @@ public class AltosPyro { units = pyro_to_units.get(flag); if (units == null) return name; - return String.format ("%s (%s)", name, units.show_units()); + return String.format ("%s (%s)", name, units.parse_units()); } public static AltosUnits pyro_to_units(int flag) { @@ -277,7 +277,7 @@ public class AltosPyro { int value = 0; ++i; try { - value = AltosLib.fromdec(tokens[i]); + value = (int) AltosLib.fromdec(tokens[i]); } catch (NumberFormatException n) { throw new ParseException(String.format("Invalid pyro value \"%s\"", tokens[i]), i); diff --git a/altoslib/AltosQuaternion.java b/altoslib/AltosQuaternion.java index bc471c9c..79559429 100644 --- a/altoslib/AltosQuaternion.java +++ b/altoslib/AltosQuaternion.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosQuaternion { double r; /* real bit */ @@ -115,10 +115,17 @@ public class AltosQuaternion { } public AltosQuaternion(AltosQuaternion q) { - this.r = q.r; - this.x = q.x; - this.y = q.y; - this.z = q.z; + r = q.r; + x = q.x; + y = q.y; + z = q.z; + } + + public AltosQuaternion() { + r = 1; + x = 0; + y = 0; + z = 0; } static public AltosQuaternion vector(double x, double y, double z) { diff --git a/altoslib/AltosRectangle.java b/altoslib/AltosRectangle.java index 4757687d..e1705548 100644 --- a/altoslib/AltosRectangle.java +++ b/altoslib/AltosRectangle.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosRectangle { public int x, y, width, height; diff --git a/altoslib/AltosReplayReader.java b/altoslib/AltosReplayReader.java index 0f77c979..f420c958 100644 --- a/altoslib/AltosReplayReader.java +++ b/altoslib/AltosReplayReader.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.util.*; diff --git a/altoslib/AltosRomconfig.java b/altoslib/AltosRomconfig.java index af201939..37585879 100644 --- a/altoslib/AltosRomconfig.java +++ b/altoslib/AltosRomconfig.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; diff --git a/altoslib/AltosRotation.java b/altoslib/AltosRotation.java index e53a3a49..97cf7896 100644 --- a/altoslib/AltosRotation.java +++ b/altoslib/AltosRotation.java @@ -15,9 +15,9 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; -public class AltosRotation { +public class AltosRotation extends AltosQuaternion { private AltosQuaternion rotation; public double tilt() { @@ -47,4 +47,8 @@ public class AltosRotation { AltosQuaternion up = new AltosQuaternion(0, 0, 0, sky); rotation = up.vectors_to_rotation(orient); } + + public AltosRotation() { + rotation = new AltosQuaternion(); + } } diff --git a/altoslib/AltosSavedState.java b/altoslib/AltosSavedState.java index 3dbf59a5..f1d3e993 100644 --- a/altoslib/AltosSavedState.java +++ b/altoslib/AltosSavedState.java @@ -15,11 +15,11 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; -public class AltosSavedState implements Serializable { +public class AltosSavedState { public AltosState state; public AltosListenerState listener_state; diff --git a/altoslib/AltosSelfFlash.java b/altoslib/AltosSelfFlash.java index f996d7b1..b6056c9c 100644 --- a/altoslib/AltosSelfFlash.java +++ b/altoslib/AltosSelfFlash.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; diff --git a/altoslib/AltosSensorEMini.java b/altoslib/AltosSensorEMini.java index 884800f8..875dad0b 100644 --- a/altoslib/AltosSensorEMini.java +++ b/altoslib/AltosSensorEMini.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.util.concurrent.TimeoutException; diff --git a/altoslib/AltosSensorMM.java b/altoslib/AltosSensorMM.java index 99eca9d8..654f85bd 100644 --- a/altoslib/AltosSensorMM.java +++ b/altoslib/AltosSensorMM.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.util.concurrent.TimeoutException; diff --git a/altoslib/AltosSensorMega.java b/altoslib/AltosSensorMega.java index a4224311..18474e18 100644 --- a/altoslib/AltosSensorMega.java +++ b/altoslib/AltosSensorMega.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.util.concurrent.TimeoutException; diff --git a/altoslib/AltosSensorMetrum.java b/altoslib/AltosSensorMetrum.java index 1b09647f..5f56a899 100644 --- a/altoslib/AltosSensorMetrum.java +++ b/altoslib/AltosSensorMetrum.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.util.concurrent.TimeoutException; diff --git a/altoslib/AltosSensorTGPS.java b/altoslib/AltosSensorTGPS.java index 9f572eca..80b27824 100644 --- a/altoslib/AltosSensorTGPS.java +++ b/altoslib/AltosSensorTGPS.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.util.concurrent.TimeoutException; diff --git a/altoslib/AltosSensorTM.java b/altoslib/AltosSensorTM.java index bb842b52..e80bac6a 100644 --- a/altoslib/AltosSensorTM.java +++ b/altoslib/AltosSensorTM.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.util.concurrent.TimeoutException; diff --git a/altoslib/AltosSensorTMini.java b/altoslib/AltosSensorTMini.java index 9e01b50c..739670f5 100644 --- a/altoslib/AltosSensorTMini.java +++ b/altoslib/AltosSensorTMini.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.util.concurrent.TimeoutException; diff --git a/altoslib/AltosSpeed.java b/altoslib/AltosSpeed.java index e09bbb7a..73851979 100644 --- a/altoslib/AltosSpeed.java +++ b/altoslib/AltosSpeed.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosSpeed extends AltosUnits { diff --git a/altoslib/AltosState.java b/altoslib/AltosState.java index 7b41e98d..15cf7d64 100644 --- a/altoslib/AltosState.java +++ b/altoslib/AltosState.java @@ -19,11 +19,11 @@ * Track flight state from telemetry or eeprom data stream */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; -public class AltosState implements Cloneable, Serializable { +public class AltosState implements Cloneable { public static final int set_position = 1; public static final int set_gps = 2; @@ -46,7 +46,7 @@ public class AltosState implements Cloneable, Serializable { private int prev_tick; public int boost_tick; - class AltosValue implements Serializable{ + class AltosValue { double value; double prev_value; private double max_value; @@ -182,14 +182,19 @@ public class AltosState implements Cloneable, Serializable { prev_value = AltosLib.MISSING; max_value = AltosLib.MISSING; } + } - class AltosCValue implements Serializable { + class AltosCValue { - class AltosIValue extends AltosValue implements Serializable { + class AltosIValue extends AltosValue { boolean can_max() { return c_can_max(); } + + AltosIValue() { + super(); + } }; public AltosIValue measured; @@ -278,7 +283,7 @@ public class AltosState implements Cloneable, Serializable { computed.finish_update(); } - AltosCValue() { + public AltosCValue() { measured = new AltosIValue(); computed = new AltosIValue(); } @@ -317,7 +322,7 @@ public class AltosState implements Cloneable, Serializable { ground_altitude.set_measured(a, time); } - class AltosGpsGroundAltitude extends AltosValue implements Serializable { + class AltosGpsGroundAltitude extends AltosValue { void set(double a, double t) { super.set(a, t); pad_alt = value(); @@ -329,6 +334,10 @@ public class AltosState implements Cloneable, Serializable { pad_alt = value(); gps_altitude.set_gps_height(); } + + AltosGpsGroundAltitude() { + super(); + } } private AltosGpsGroundAltitude gps_ground_altitude; @@ -341,7 +350,7 @@ public class AltosState implements Cloneable, Serializable { gps_ground_altitude.set(a, time); } - class AltosGroundPressure extends AltosCValue implements Serializable { + class AltosGroundPressure extends AltosCValue { void set_filtered(double p, double time) { computed.set_filtered(p, time); if (!is_measured()) @@ -352,6 +361,10 @@ public class AltosState implements Cloneable, Serializable { super.set_measured(p, time); ground_altitude.set_computed(pressure_to_altitude(p), time); } + + AltosGroundPressure () { + super(); + } } private AltosGroundPressure ground_pressure; @@ -364,7 +377,7 @@ public class AltosState implements Cloneable, Serializable { ground_pressure.set_measured(pressure, time); } - class AltosAltitude extends AltosCValue implements Serializable { + class AltosAltitude extends AltosCValue { private void set_speed(AltosValue v) { if (!acceleration.is_measured() || !ascent) @@ -382,11 +395,15 @@ public class AltosState implements Cloneable, Serializable { set_speed(measured); set |= set_position; } + + AltosAltitude() { + super(); + } } private AltosAltitude altitude; - class AltosGpsAltitude extends AltosValue implements Serializable { + class AltosGpsAltitude extends AltosValue { private void set_gps_height() { double a = value(); @@ -402,6 +419,10 @@ public class AltosState implements Cloneable, Serializable { super.set(a, t); set_gps_height(); } + + AltosGpsAltitude() { + super(); + } } private AltosGpsAltitude gps_altitude; @@ -469,7 +490,7 @@ public class AltosState implements Cloneable, Serializable { return gps_speed.max(); } - class AltosPressure extends AltosValue implements Serializable { + class AltosPressure extends AltosValue { void set(double p, double time) { super.set(p, time); if (state == AltosLib.ao_flight_pad) @@ -477,6 +498,10 @@ public class AltosState implements Cloneable, Serializable { double a = pressure_to_altitude(p); altitude.set_computed(a, time); } + + AltosPressure() { + super(); + } } private AltosPressure pressure; @@ -539,7 +564,7 @@ public class AltosState implements Cloneable, Serializable { return AltosLib.MISSING; } - class AltosSpeed extends AltosCValue implements Serializable { + class AltosSpeed extends AltosCValue { boolean can_max() { return state < AltosLib.ao_flight_fast || state == AltosLib.ao_flight_stateless; @@ -563,6 +588,10 @@ public class AltosState implements Cloneable, Serializable { super.set_measured(new_value, time); set_accel(); } + + AltosSpeed() { + super(); + } } private AltosSpeed speed; @@ -593,7 +622,7 @@ public class AltosState implements Cloneable, Serializable { return AltosLib.MISSING; } - class AltosAccel extends AltosCValue implements Serializable { + class AltosAccel extends AltosCValue { boolean can_max() { return state < AltosLib.ao_flight_fast || state == AltosLib.ao_flight_stateless; @@ -604,6 +633,10 @@ public class AltosState implements Cloneable, Serializable { if (ascent) speed.set_integral(this.measured); } + + AltosAccel() { + super(); + } } AltosAccel acceleration; @@ -684,6 +717,7 @@ public class AltosState implements Cloneable, Serializable { public double ground_accel_avg; public int log_format; + public int log_space; public String product; public AltosMs5607 baro; @@ -801,6 +835,7 @@ public class AltosState implements Cloneable, Serializable { ground_accel_avg = AltosLib.MISSING; log_format = AltosLib.MISSING; + log_space = AltosLib.MISSING; product = null; serial = AltosLib.MISSING; receiver_serial = AltosLib.MISSING; @@ -960,6 +995,7 @@ public class AltosState implements Cloneable, Serializable { ground_accel_avg = old.ground_accel_avg; log_format = old.log_format; + log_space = old.log_space; product = old.product; serial = old.serial; receiver_serial = old.receiver_serial; @@ -1078,6 +1114,10 @@ public class AltosState implements Cloneable, Serializable { } } + public void set_log_space(int log_space) { + this.log_space = log_space; + } + public void set_flight_params(int apogee_delay, int main_deploy) { this.apogee_delay = apogee_delay; this.main_deploy = main_deploy; @@ -1483,6 +1523,31 @@ public class AltosState implements Cloneable, Serializable { public AltosState clone() { AltosState s = new AltosState(); s.copy(this); + + /* Code to test state save/restore. Enable only for that purpose + */ + if (false) { + AltosJson json = new AltosJson(this); + String onetrip = json.toPrettyString(); + AltosJson back = AltosJson.fromString(onetrip); + AltosState tripstate = (AltosState) back.make(this.getClass()); + AltosJson tripjson = new AltosJson(tripstate); + String twotrip = tripjson.toPrettyString(); + + if (!onetrip.equals(twotrip)) { + try { + FileWriter one_file = new FileWriter("one.json", true); + one_file.write(onetrip); + one_file.flush(); + FileWriter two_file = new FileWriter("two.json", true); + two_file.write(twotrip); + two_file.flush(); + } catch (Exception e) { + } + System.out.printf("json error\n"); + System.exit(1); + } + } return s; } diff --git a/altoslib/AltosStateIterable.java b/altoslib/AltosStateIterable.java index a7baa85e..bce2a8d9 100644 --- a/altoslib/AltosStateIterable.java +++ b/altoslib/AltosStateIterable.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.util.*; @@ -32,7 +32,6 @@ public abstract class AltosStateIterable implements Iterable<AltosState> { try { in = new FileInputStream(file); } catch (Exception e) { - System.out.printf("Failed to open file '%s'\n", file); return null; } if (file.getName().endsWith("telem")) diff --git a/altoslib/AltosStateUpdate.java b/altoslib/AltosStateUpdate.java index 12d4dd41..1209c2a0 100644 --- a/altoslib/AltosStateUpdate.java +++ b/altoslib/AltosStateUpdate.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public interface AltosStateUpdate { public void update_state(AltosState state) throws InterruptedException, AltosUnknownProduct; diff --git a/altoslib/AltosTelemetry.java b/altoslib/AltosTelemetry.java index 67caa60c..d526e6e5 100644 --- a/altoslib/AltosTelemetry.java +++ b/altoslib/AltosTelemetry.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.text.*; diff --git a/altoslib/AltosTelemetryCompanion.java b/altoslib/AltosTelemetryCompanion.java index b9d32f48..8f0d06b0 100644 --- a/altoslib/AltosTelemetryCompanion.java +++ b/altoslib/AltosTelemetryCompanion.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosTelemetryCompanion extends AltosTelemetryStandard { AltosCompanion companion; diff --git a/altoslib/AltosTelemetryConfiguration.java b/altoslib/AltosTelemetryConfiguration.java index cd2cb8ca..352f1808 100644 --- a/altoslib/AltosTelemetryConfiguration.java +++ b/altoslib/AltosTelemetryConfiguration.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosTelemetryConfiguration extends AltosTelemetryStandard { diff --git a/altoslib/AltosTelemetryFile.java b/altoslib/AltosTelemetryFile.java index b80c2dc9..5f512e14 100644 --- a/altoslib/AltosTelemetryFile.java +++ b/altoslib/AltosTelemetryFile.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.util.*; diff --git a/altoslib/AltosTelemetryIterable.java b/altoslib/AltosTelemetryIterable.java index ff395868..256626f3 100644 --- a/altoslib/AltosTelemetryIterable.java +++ b/altoslib/AltosTelemetryIterable.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.io.*; import java.util.*; diff --git a/altoslib/AltosTelemetryLegacy.java b/altoslib/AltosTelemetryLegacy.java index 6c0fcfeb..df41b7d9 100644 --- a/altoslib/AltosTelemetryLegacy.java +++ b/altoslib/AltosTelemetryLegacy.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.text.*; diff --git a/altoslib/AltosTelemetryLocation.java b/altoslib/AltosTelemetryLocation.java index 33c36449..1cff3cd4 100644 --- a/altoslib/AltosTelemetryLocation.java +++ b/altoslib/AltosTelemetryLocation.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosTelemetryLocation extends AltosTelemetryStandard { diff --git a/altoslib/AltosTelemetryMap.java b/altoslib/AltosTelemetryMap.java index 13b5dbea..8e5bcd1c 100644 --- a/altoslib/AltosTelemetryMap.java +++ b/altoslib/AltosTelemetryMap.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.text.*; import java.util.HashMap; diff --git a/altoslib/AltosTelemetryMegaData.java b/altoslib/AltosTelemetryMegaData.java index d71f2802..ed0211a9 100644 --- a/altoslib/AltosTelemetryMegaData.java +++ b/altoslib/AltosTelemetryMegaData.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosTelemetryMegaData extends AltosTelemetryStandard { int state; diff --git a/altoslib/AltosTelemetryMegaSensor.java b/altoslib/AltosTelemetryMegaSensor.java index f0d16f19..365db92d 100644 --- a/altoslib/AltosTelemetryMegaSensor.java +++ b/altoslib/AltosTelemetryMegaSensor.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosTelemetryMegaSensor extends AltosTelemetryStandard { int accel; diff --git a/altoslib/AltosTelemetryMetrumData.java b/altoslib/AltosTelemetryMetrumData.java index a4e9116f..0d943836 100644 --- a/altoslib/AltosTelemetryMetrumData.java +++ b/altoslib/AltosTelemetryMetrumData.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosTelemetryMetrumData extends AltosTelemetryStandard { diff --git a/altoslib/AltosTelemetryMetrumSensor.java b/altoslib/AltosTelemetryMetrumSensor.java index 1b405f2b..0ccc4e15 100644 --- a/altoslib/AltosTelemetryMetrumSensor.java +++ b/altoslib/AltosTelemetryMetrumSensor.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosTelemetryMetrumSensor extends AltosTelemetryStandard { diff --git a/altoslib/AltosTelemetryMini.java b/altoslib/AltosTelemetryMini.java index 8996d662..8bca55fa 100644 --- a/altoslib/AltosTelemetryMini.java +++ b/altoslib/AltosTelemetryMini.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosTelemetryMini extends AltosTelemetryStandard { diff --git a/altoslib/AltosTelemetryRaw.java b/altoslib/AltosTelemetryRaw.java index 8cf023a4..c28d04d3 100644 --- a/altoslib/AltosTelemetryRaw.java +++ b/altoslib/AltosTelemetryRaw.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosTelemetryRaw extends AltosTelemetryStandard { public AltosTelemetryRaw(int[] bytes) { diff --git a/altoslib/AltosTelemetryReader.java b/altoslib/AltosTelemetryReader.java index 2b0a443c..370610b1 100644 --- a/altoslib/AltosTelemetryReader.java +++ b/altoslib/AltosTelemetryReader.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.text.*; import java.io.*; diff --git a/altoslib/AltosTelemetrySatellite.java b/altoslib/AltosTelemetrySatellite.java index de60e63c..d88e6cac 100644 --- a/altoslib/AltosTelemetrySatellite.java +++ b/altoslib/AltosTelemetrySatellite.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosTelemetrySatellite extends AltosTelemetryStandard { int channels; diff --git a/altoslib/AltosTelemetrySensor.java b/altoslib/AltosTelemetrySensor.java index 74b61d3c..7a4a9f35 100644 --- a/altoslib/AltosTelemetrySensor.java +++ b/altoslib/AltosTelemetrySensor.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosTelemetrySensor extends AltosTelemetryStandard { diff --git a/altoslib/AltosTelemetryStandard.java b/altoslib/AltosTelemetryStandard.java index 7086abfc..dea9c29e 100644 --- a/altoslib/AltosTelemetryStandard.java +++ b/altoslib/AltosTelemetryStandard.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public abstract class AltosTelemetryStandard extends AltosTelemetry { int[] bytes; diff --git a/altoslib/AltosTemperature.java b/altoslib/AltosTemperature.java index a1e485b3..2b261b70 100644 --- a/altoslib/AltosTemperature.java +++ b/altoslib/AltosTemperature.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosTemperature extends AltosUnits { diff --git a/altoslib/AltosUnits.java b/altoslib/AltosUnits.java index 13b9dbe6..b46b30ad 100644 --- a/altoslib/AltosUnits.java +++ b/altoslib/AltosUnits.java @@ -15,12 +15,27 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; import java.text.*; public abstract class AltosUnits { + AltosUnitsRange[] range_metric, range_imperial; + + private AltosUnitsRange range(double v, boolean imperial_units) { + AltosUnitsRange[] ranges = imperial_units ? range_imperial : range_metric; + + for (int i = ranges.length - 1; i > 0; i--) + if (v >= ranges[i].lower_limit) + return ranges[i]; + return ranges[0]; + } + + private AltosUnitsRange first_range(boolean imperial_units) { + return imperial_units ? range_imperial[0] : range_metric[0]; + } + public abstract double value(double v, boolean imperial_units); public abstract double inverse(double v, boolean imperial_units); @@ -31,89 +46,168 @@ public abstract class AltosUnits { public abstract int show_fraction(int width, boolean imperial_units); - public double parse_locale(String s, boolean imperial_units) throws ParseException { - double v = AltosParse.parse_double_locale(s); - return inverse(v, imperial_units); + private double value(double v) { + return value(v, AltosConvert.imperial_units); } - public double parse_net(String s, boolean imperial_units) throws ParseException { - double v = AltosParse.parse_double_net(s); - return inverse(v, imperial_units); + private double inverse(double v) { + return inverse(v, AltosConvert.imperial_units); } - public double parse_locale(String s) throws ParseException { - return parse_locale(s, AltosConvert.imperial_units); + private String show_units() { + return show_units(AltosConvert.imperial_units); } - public double parse_net(String s) throws ParseException { - return parse_net(s, AltosConvert.imperial_units); + private String say_units() { + return say_units(AltosConvert.imperial_units); } - public double value(double v) { - return value(v, AltosConvert.imperial_units); + private int show_fraction(int width) { + return show_fraction(width, AltosConvert.imperial_units); } - public double inverse(double v) { - return inverse(v, AltosConvert.imperial_units); + private int say_fraction(boolean imperial_units) { + return 0; } - public String show_units() { - return show_units(AltosConvert.imperial_units); + private String show_format(AltosUnitsRange range, int width) { + return String.format("%%%d.%df %s", width, range.show_fraction(width), range.show_units); } - public String say_units() { - return say_units(AltosConvert.imperial_units); + private String say_format(AltosUnitsRange range) { + return String.format("%%1.%df", range.say_fraction()); } - public int show_fraction(int width) { - return show_fraction(width, AltosConvert.imperial_units); + private String say_units_format(AltosUnitsRange range) { + return String.format("%%1.%df %s", range.say_fraction(), range.say_units); } - int say_fraction(boolean imperial_units) { - return 0; + public String show(int width, double v, boolean imperial_units) { + AltosUnitsRange range = range(v, imperial_units); + + return String.format(show_format(range, width), range.value(v)); + } + + public String say(double v, boolean imperial_units) { + AltosUnitsRange range = range(v, imperial_units); + + return String.format(say_format(range), range.value(v)); + } + + public String say_units(double v, boolean imperial_units) { + AltosUnitsRange range = range(v, imperial_units); + + return String.format(say_units_format(range), range.value(v)); + } + + public String show(int width, double v) { + return show(width, v, AltosConvert.imperial_units); + } + + public String say(double v) { + return say(v, AltosConvert.imperial_units); + } + + public String say_units(double v) { + return say_units(v, AltosConvert.imperial_units); + } + + /* Parsing functions. Use the first range of the type */ + public String parse_units(boolean imperial_units) { + return first_range(imperial_units).show_units; + } + + public String parse_units() { + return parse_units(AltosConvert.imperial_units); + } + + public double parse_value(double v, boolean imperial_units) { + return first_range(imperial_units).value(v); + } + + public double parse_value(double v) { + return parse_value(v, AltosConvert.imperial_units); } - private String show_format(int width, boolean imperial_units) { - return String.format("%%%d.%df %s", width, show_fraction(width, imperial_units), show_units(imperial_units)); + /* Graphing functions. Use the first range of the type */ + public String graph_units(boolean imperial_units) { + return first_range(imperial_units).show_units; } - private String say_format(boolean imperial_units) { - return String.format("%%1.%df", say_fraction(imperial_units)); + public String graph_units() { + return graph_units(AltosConvert.imperial_units); } - private String say_units_format(boolean imperial_units) { - return String.format("%%1.%df %s", say_fraction(imperial_units), say_units(imperial_units)); + public double graph_value(double v, boolean imperial_units) { + return first_range(imperial_units).value(v); + } + + public double graph_value(double v) { + return graph_value(v, AltosConvert.imperial_units); + } + + private String graph_format(AltosUnitsRange range, int width) { + return String.format(String.format("%%%d.%df", width, range.show_fraction(width)), 0.0); } public String graph_format(int width, boolean imperial_units) { - return String.format(String.format("%%%d.%df", width, show_fraction(width, imperial_units)), 0.0); + return graph_format(first_range(imperial_units), width); } public String graph_format(int width) { return graph_format(width, AltosConvert.imperial_units); } - public String show(int width, double v, boolean imperial_units) { - return String.format(show_format(width, imperial_units), value(v, imperial_units)); + /* Parsing functions. */ + public double parse_locale(String s, boolean imperial_units) throws ParseException { + double v = AltosParse.parse_double_locale(s); + return inverse(v, imperial_units); } - public String show(int width, double v) { - return show(width, v, AltosConvert.imperial_units); + public double parse_net(String s, boolean imperial_units) throws ParseException { + double v = AltosParse.parse_double_net(s); + return inverse(v, imperial_units); } - public String say(double v, boolean imperial_units) { - return String.format(say_format(imperial_units), value(v, imperial_units)); + public double parse_locale(String s) throws ParseException { + return parse_locale(s, AltosConvert.imperial_units); } - public String say(double v) { - return say(v, AltosConvert.imperial_units); + public double parse_net(String s) throws ParseException { + return parse_net(s, AltosConvert.imperial_units); } - public String say_units(double v, boolean imperial_units) { - return String.format(say_units_format(imperial_units), value(v, imperial_units)); - } + public AltosUnits() { + range_metric = new AltosUnitsRange[1]; - public String say_units(double v) { - return say_units(v, AltosConvert.imperial_units); + range_metric[0] = new AltosUnitsRange(this, false) { + double value(double v) { + return units.value(v, false); + } + + int show_fraction(int width) { + return units.show_fraction(width, false); + } + + int say_fraction() { + return units.say_fraction(false); + } + }; + + range_imperial = new AltosUnitsRange[1]; + + range_imperial[0] = new AltosUnitsRange(this, true) { + double value(double v) { + return units.value(v, true); + } + + int show_fraction(int width) { + return units.show_fraction(width, true); + } + + int say_fraction() { + return units.say_fraction(true); + } + }; } } diff --git a/altoslib/AltosUnitsListener.java b/altoslib/AltosUnitsListener.java index bb8451b7..89dbdf77 100644 --- a/altoslib/AltosUnitsListener.java +++ b/altoslib/AltosUnitsListener.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public interface AltosUnitsListener { public void units_changed(boolean imperial_units); diff --git a/altoslib/AltosUnitsRange.java b/altoslib/AltosUnitsRange.java new file mode 100644 index 00000000..f376a463 --- /dev/null +++ b/altoslib/AltosUnitsRange.java @@ -0,0 +1,46 @@ +/* + * Copyright © 2016 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +package org.altusmetrum.altoslib_11; + +import java.text.*; + +public abstract class AltosUnitsRange { + + AltosUnits units; + + double lower_limit; + String show_units; + String say_units; + + abstract double value(double v); + abstract int show_fraction(int width); + abstract int say_fraction(); + + AltosUnitsRange(AltosUnits units, boolean imperial_units) { + this.units = units; + this.show_units = units.show_units(imperial_units); + this.say_units = units.say_units(imperial_units); + } + + AltosUnitsRange(double lower_limit, String show_units, String say_units) { + this.units = null; + this.lower_limit = lower_limit; + this.show_units = show_units; + this.say_units = say_units; + } +} diff --git a/altoslib/AltosUnknownProduct.java b/altoslib/AltosUnknownProduct.java index ff536f57..fe16f441 100644 --- a/altoslib/AltosUnknownProduct.java +++ b/altoslib/AltosUnknownProduct.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosUnknownProduct extends Exception { public String product; diff --git a/altoslib/AltosVersion.java.in b/altoslib/AltosVersion.java.in index 9ac94dcd..12fecaa0 100644 --- a/altoslib/AltosVersion.java.in +++ b/altoslib/AltosVersion.java.in @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosVersion { public final static String version = "@VERSION@"; diff --git a/altoslib/AltosVoltage.java b/altoslib/AltosVoltage.java index 1738dd86..5c9cea28 100644 --- a/altoslib/AltosVoltage.java +++ b/altoslib/AltosVoltage.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public class AltosVoltage extends AltosUnits { diff --git a/altoslib/AltosWriter.java b/altoslib/AltosWriter.java index 02b5d669..a3a394d3 100644 --- a/altoslib/AltosWriter.java +++ b/altoslib/AltosWriter.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; public interface AltosWriter { diff --git a/altoslib/Makefile.am b/altoslib/Makefile.am index dc9da8fd..2a9eb9c9 100644 --- a/altoslib/Makefile.am +++ b/altoslib/Makefile.am @@ -64,6 +64,7 @@ altoslib_JAVA = \ AltosIdleFetch.java \ AltosIdleMonitor.java \ AltosIdleMonitorListener.java \ + AltosIdleReader.java \ AltosIgnite.java \ AltosIMU.java \ AltosKML.java \ @@ -118,6 +119,7 @@ altoslib_JAVA = \ AltosIMU.java \ AltosMag.java \ AltosUnits.java \ + AltosUnitsRange.java \ AltosDistance.java \ AltosHeight.java \ AltosSpeed.java \ @@ -159,6 +161,7 @@ altoslib_JAVA = \ AltosMapLoaderListener.java \ AltosMapLoader.java \ AltosMapTypeListener.java \ + AltosJson.java \ AltosVersion.java JAR=altoslib_$(ALTOSLIB_VERSION).jar |