summaryrefslogtreecommitdiff
path: root/altoslib
diff options
context:
space:
mode:
Diffstat (limited to 'altoslib')
-rw-r--r--altoslib/AltosAccel.java2
-rw-r--r--altoslib/AltosCRCException.java2
-rw-r--r--altoslib/AltosCSV.java141
-rw-r--r--altoslib/AltosCompanion.java2
-rw-r--r--altoslib/AltosConfigData.java55
-rw-r--r--altoslib/AltosConfigDataException.java2
-rw-r--r--altoslib/AltosConfigValues.java12
-rw-r--r--altoslib/AltosConvert.java2
-rw-r--r--altoslib/AltosDebug.java12
-rw-r--r--altoslib/AltosDistance.java2
-rw-r--r--altoslib/AltosEeprom.java2
-rw-r--r--altoslib/AltosEepromChunk.java2
-rw-r--r--altoslib/AltosEepromDownload.java2
-rw-r--r--altoslib/AltosEepromFile.java2
-rw-r--r--altoslib/AltosEepromGPS.java33
-rw-r--r--altoslib/AltosEepromHeader.java37
-rw-r--r--altoslib/AltosEepromIterable.java2
-rw-r--r--altoslib/AltosEepromList.java2
-rw-r--r--altoslib/AltosEepromLog.java2
-rw-r--r--altoslib/AltosEepromMega.java28
-rw-r--r--altoslib/AltosEepromMetrum2.java12
-rw-r--r--altoslib/AltosEepromMini.java2
-rw-r--r--altoslib/AltosEepromMonitor.java2
-rw-r--r--altoslib/AltosEepromTM.java2
-rw-r--r--altoslib/AltosEepromTm.java2
-rw-r--r--altoslib/AltosFile.java2
-rw-r--r--altoslib/AltosFlash.java20
-rw-r--r--altoslib/AltosFlashListener.java2
-rw-r--r--altoslib/AltosFlightReader.java16
-rw-r--r--altoslib/AltosFlightStats.java2
-rw-r--r--altoslib/AltosFrequency.java4
-rw-r--r--altoslib/AltosGPS.java38
-rw-r--r--altoslib/AltosGPSSat.java2
-rw-r--r--altoslib/AltosGreatCircle.java2
-rw-r--r--altoslib/AltosHeight.java2
-rw-r--r--altoslib/AltosHexfile.java2
-rw-r--r--altoslib/AltosHexsym.java2
-rw-r--r--altoslib/AltosIMU.java2
-rw-r--r--altoslib/AltosIdle.java2
-rw-r--r--altoslib/AltosIdleFetch.java6
-rw-r--r--altoslib/AltosIdleMonitor.java2
-rw-r--r--altoslib/AltosIdleMonitorListener.java2
-rw-r--r--altoslib/AltosIgnite.java2
-rw-r--r--altoslib/AltosKML.java32
-rw-r--r--altoslib/AltosLatitude.java2
-rw-r--r--altoslib/AltosLib.java71
-rw-r--r--altoslib/AltosLine.java2
-rw-r--r--altoslib/AltosLink.java44
-rw-r--r--altoslib/AltosListenerState.java2
-rw-r--r--altoslib/AltosLocation.java2
-rw-r--r--altoslib/AltosLog.java3
-rw-r--r--altoslib/AltosLongitude.java2
-rw-r--r--altoslib/AltosMag.java2
-rw-r--r--altoslib/AltosMma655x.java24
-rw-r--r--altoslib/AltosMs5607.java2
-rw-r--r--altoslib/AltosNoSymbol.java2
-rw-r--r--altoslib/AltosOrient.java2
-rw-r--r--altoslib/AltosParse.java2
-rw-r--r--altoslib/AltosPreferences.java83
-rw-r--r--altoslib/AltosPreferencesBackend.java2
-rw-r--r--altoslib/AltosProgrammer.java2
-rw-r--r--altoslib/AltosPyro.java2
-rw-r--r--altoslib/AltosReplayReader.java13
-rw-r--r--altoslib/AltosRomconfig.java2
-rw-r--r--altoslib/AltosSelfFlash.java2
-rw-r--r--altoslib/AltosSensorEMini.java2
-rw-r--r--altoslib/AltosSensorMM.java2
-rw-r--r--altoslib/AltosSensorMega.java2
-rw-r--r--altoslib/AltosSensorMetrum.java2
-rw-r--r--altoslib/AltosSensorTM.java2
-rw-r--r--altoslib/AltosSensorTMini.java2
-rw-r--r--altoslib/AltosSpeed.java2
-rw-r--r--altoslib/AltosState.java54
-rw-r--r--altoslib/AltosStateIterable.java16
-rw-r--r--altoslib/AltosStateUpdate.java2
-rw-r--r--altoslib/AltosTelemetry.java25
-rw-r--r--altoslib/AltosTelemetryConfiguration.java2
-rw-r--r--altoslib/AltosTelemetryFile.java2
-rw-r--r--altoslib/AltosTelemetryIterable.java2
-rw-r--r--altoslib/AltosTelemetryLegacy.java4
-rw-r--r--altoslib/AltosTelemetryLocation.java15
-rw-r--r--altoslib/AltosTelemetryMap.java2
-rw-r--r--altoslib/AltosTelemetryMegaData.java19
-rw-r--r--altoslib/AltosTelemetryMegaSensor.java2
-rw-r--r--altoslib/AltosTelemetryMetrumData.java2
-rw-r--r--altoslib/AltosTelemetryMetrumSensor.java9
-rw-r--r--altoslib/AltosTelemetryMini.java2
-rw-r--r--altoslib/AltosTelemetryRaw.java2
-rw-r--r--altoslib/AltosTelemetryReader.java65
-rw-r--r--altoslib/AltosTelemetrySatellite.java2
-rw-r--r--altoslib/AltosTelemetrySensor.java2
-rw-r--r--altoslib/AltosTelemetryStandard.java2
-rw-r--r--altoslib/AltosTemperature.java2
-rw-r--r--altoslib/AltosUnits.java2
-rw-r--r--altoslib/AltosUnitsListener.java2
-rw-r--r--altoslib/AltosVoltage.java2
-rw-r--r--altoslib/AltosWriter.java4
-rw-r--r--altoslib/Makefile.am2
98 files changed, 812 insertions, 221 deletions
diff --git a/altoslib/AltosAccel.java b/altoslib/AltosAccel.java
index 3d340e5d..d91da4da 100644
--- a/altoslib/AltosAccel.java
+++ b/altoslib/AltosAccel.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_4;
+package org.altusmetrum.altoslib_5;
public class AltosAccel extends AltosUnits {
diff --git a/altoslib/AltosCRCException.java b/altoslib/AltosCRCException.java
index 253ca435..507c446b 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_4;
+package org.altusmetrum.altoslib_5;
public class AltosCRCException extends Exception {
public int rssi;
diff --git a/altoslib/AltosCSV.java b/altoslib/AltosCSV.java
index 27e1fade..4a9278d9 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.*;
import java.util.*;
@@ -29,6 +29,14 @@ public class AltosCSV implements AltosWriter {
LinkedList<AltosState> pad_states;
AltosState state;
+ static boolean has_basic;
+ static boolean has_battery;
+ static boolean has_flight_state;
+ static boolean has_advanced;
+ static boolean has_gps;
+ static boolean has_gps_sat;
+ static boolean has_companion;
+
static final int ALTOS_CSV_VERSION = 5;
/* Version 4 format:
@@ -55,10 +63,12 @@ public class AltosCSV implements AltosWriter {
* accelerometer speed (m/s)
* barometer speed (m/s)
* temp (°C)
- * battery (V)
* drogue (V)
* main (V)
*
+ * Battery
+ * battery (V)
+ *
* Advanced sensors (if available)
* accel_x (m/s²)
* accel_y (m/s²)
@@ -87,7 +97,9 @@ public class AltosCSV implements AltosWriter {
* from_pad_azimuth (deg true)
* from_pad_range (m)
* from_pad_elevation (deg from horizon)
+ * pdop
* hdop
+ * vdop
*
* GPS Sat data
* C/N0 data for all 32 valid SDIDs
@@ -107,7 +119,7 @@ public class AltosCSV implements AltosWriter {
void write_general(AltosState state) {
out.printf("%s, %d, %d, %s, %8.2f, %8.2f, %4d, %3d",
ALTOS_CSV_VERSION, state.serial, state.flight, state.callsign,
- (double) state.time, (double) state.tick / 100.0,
+ (double) state.time_since_boost(), (double) state.tick / 100.0,
state.rssi,
state.status & 0x7f);
}
@@ -121,11 +133,11 @@ public class AltosCSV implements AltosWriter {
}
void write_basic_header() {
- out.printf("acceleration,pressure,altitude,height,accel_speed,baro_speed,temperature,battery_voltage,drogue_voltage,main_voltage");
+ out.printf("acceleration,pressure,altitude,height,accel_speed,baro_speed,temperature,drogue_voltage,main_voltage");
}
void write_basic(AltosState state) {
- out.printf("%8.2f,%10.2f,%8.2f,%8.2f,%8.2f,%8.2f,%5.1f,%5.2f,%5.2f,%5.2f",
+ out.printf("%8.2f,%10.2f,%8.2f,%8.2f,%8.2f,%8.2f,%5.1f,%5.2f,%5.2f",
state.acceleration(),
state.pressure(),
state.altitude(),
@@ -133,11 +145,18 @@ public class AltosCSV implements AltosWriter {
state.speed(),
state.speed(),
state.temperature,
- state.battery_voltage,
state.apogee_voltage,
state.main_voltage);
}
+ void write_battery_header() {
+ out.printf("battery_voltage");
+ }
+
+ void write_battery(AltosState state) {
+ out.printf("%5.2f", state.battery_voltage);
+ }
+
void write_advanced_header() {
out.printf("accel_x,accel_y,accel_z,gyro_x,gyro_y,gyro_z");
}
@@ -150,14 +169,14 @@ public class AltosCSV implements AltosWriter {
imu = new AltosIMU();
if (mag == null)
mag = new AltosMag();
- out.printf("%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d",
+ out.printf("%7.2f,%7.2f,%7.2f,%7.2f,%7.2f,%7.2f,%7.2f,%7.2f,%7.2f",
imu.accel_x, imu.accel_y, imu.accel_z,
imu.gyro_x, imu.gyro_y, imu.gyro_z,
mag.x, mag.y, mag.z);
}
void write_gps_header() {
- out.printf("connected,locked,nsat,latitude,longitude,altitude,year,month,day,hour,minute,second,pad_dist,pad_range,pad_az,pad_el,hdop");
+ out.printf("connected,locked,nsat,latitude,longitude,altitude,year,month,day,hour,minute,second,pad_dist,pad_range,pad_az,pad_el,pdop,hdop,vdop");
}
void write_gps(AltosState state) {
@@ -169,7 +188,7 @@ public class AltosCSV implements AltosWriter {
if (from_pad == null)
from_pad = new AltosGreatCircle();
- out.printf("%2d,%2d,%3d,%12.7f,%12.7f,%8.1f,%5d,%3d,%3d,%3d,%3d,%3d,%9.0f,%9.0f,%4.0f,%4.0f,%6.1f",
+ out.printf("%2d,%2d,%3d,%12.7f,%12.7f,%8.1f,%5d,%3d,%3d,%3d,%3d,%3d,%9.0f,%9.0f,%4.0f,%4.0f,%6.1f,%6.1f,%6.1f",
gps.connected?1:0,
gps.locked?1:0,
gps.nsat,
@@ -186,7 +205,9 @@ public class AltosCSV implements AltosWriter {
state.range,
from_pad.bearing,
state.elevation,
- gps.hdop);
+ gps.pdop,
+ gps.hdop,
+ gps.vdop);
}
void write_gps_sat_header() {
@@ -239,52 +260,83 @@ public class AltosCSV implements AltosWriter {
out.printf(",0");
}
- void write_header(boolean advanced, boolean gps, boolean companion) {
+ void write_header() {
out.printf("#"); write_general_header();
- out.printf(","); write_flight_header();
- out.printf(","); write_basic_header();
- if (advanced)
- out.printf(","); write_advanced_header();
- if (gps) {
- out.printf(","); write_gps_header();
- out.printf(","); write_gps_sat_header();
+ if (has_flight_state) {
+ out.printf(",");
+ write_flight_header();
}
- if (companion) {
- out.printf(","); write_companion_header();
+ if (has_basic) {
+ out.printf(",");
+ write_basic_header();
+ }
+ if (has_battery) {
+ out.printf(",");
+ write_battery_header();
+ }
+ if (has_advanced) {
+ out.printf(",");
+ write_advanced_header();
+ }
+ if (has_gps) {
+ out.printf(",");
+ write_gps_header();
+ }
+ if (has_gps_sat) {
+ out.printf(",");
+ write_gps_sat_header();
+ }
+ if (has_companion) {
+ out.printf(",");
+ write_companion_header();
}
out.printf ("\n");
}
void write_one(AltosState state) {
- write_general(state); out.printf(",");
- write_flight(state); out.printf(",");
- write_basic(state); out.printf(",");
- if (state.imu != null || state.mag != null)
+ write_general(state);
+ if (has_flight_state) {
+ out.printf(",");
+ write_flight(state);
+ }
+ if (has_basic) {
+ out.printf(",");
+ write_basic(state);
+ }
+ if (has_battery) {
+ out.printf(",");
+ write_battery(state);
+ }
+ if (has_advanced) {
+ out.printf(",");
write_advanced(state);
- if (state.gps != null) {
+ }
+ if (has_gps) {
+ out.printf(",");
+ write_gps(state);
+ }
+ if (has_gps_sat) {
out.printf(",");
- write_gps(state); out.printf(",");
write_gps_sat(state);
}
- if (state.companion != null) {
+ if (has_companion) {
out.printf(",");
write_companion(state);
}
out.printf ("\n");
}
- void flush_pad() {
+ private void flush_pad() {
while (!pad_states.isEmpty()) {
write_one (pad_states.remove());
}
}
- public void write(AltosState state) {
+ private void write(AltosState state) {
if (state.state == AltosLib.ao_flight_startup)
return;
if (!header_written) {
- write_header(state.imu != null || state.mag != null,
- state.gps != null, state.companion != null);
+ write_header();
header_written = true;
}
if (!seen_boost) {
@@ -300,7 +352,7 @@ public class AltosCSV implements AltosWriter {
pad_states.add(state);
}
- public PrintStream out() {
+ private PrintStream out() {
return out;
}
@@ -314,6 +366,31 @@ public class AltosCSV implements AltosWriter {
public void write(AltosStateIterable states) {
states.write_comments(out());
+
+ has_flight_state = false;
+ has_basic = false;
+ has_battery = false;
+ has_advanced = false;
+ has_gps = false;
+ has_gps_sat = false;
+ has_companion = false;
+ for (AltosState state : states) {
+ if (state.state != AltosLib.ao_flight_stateless && state.state != AltosLib.ao_flight_invalid && state.state != AltosLib.ao_flight_startup)
+ has_flight_state = true;
+ if (state.acceleration() != AltosLib.MISSING || state.pressure() != AltosLib.MISSING)
+ has_basic = true;
+ if (state.battery_voltage != AltosLib.MISSING)
+ has_battery = true;
+ if (state.imu != null || state.mag != null)
+ has_advanced = true;
+ if (state.gps != null) {
+ has_gps = true;
+ if (state.gps.cc_gps_sat != null)
+ has_gps_sat = true;
+ }
+ if (state.companion != null)
+ has_companion = true;
+ }
for (AltosState state : states)
write(state);
}
diff --git a/altoslib/AltosCompanion.java b/altoslib/AltosCompanion.java
index 09bfe9f3..47deb2a3 100644
--- a/altoslib/AltosCompanion.java
+++ b/altoslib/AltosCompanion.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_4;
+package org.altusmetrum.altoslib_5;
public class AltosCompanion {
public final static int board_id_telescience = 0x0a;
diff --git a/altoslib/AltosConfigData.java b/altoslib/AltosConfigData.java
index e1043958..fc1f2442 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_4;
+package org.altusmetrum.altoslib_5;
import java.util.*;
import java.text.*;
@@ -31,6 +31,7 @@ public class AltosConfigData implements Iterable<String> {
public int log_format;
public int log_space;
public String version;
+ public int altitude_32;
/* Strings returned */
public LinkedList<String> lines;
@@ -46,6 +47,7 @@ public class AltosConfigData implements Iterable<String> {
public String callsign;
public int radio_enable;
public int radio_calibration;
+ public int telemetry_rate;
/* Old HAS_RADIO values */
public int radio_channel;
public int radio_setting;
@@ -56,6 +58,7 @@ public class AltosConfigData implements Iterable<String> {
/* HAS_LOG */
public int flight_log_max;
+ public int log_fixed;
/* HAS_IGNITE */
public int ignite_mode;
@@ -71,6 +74,7 @@ public class AltosConfigData implements Iterable<String> {
/* HAS_APRS */
public int aprs_interval;
+ public int aprs_ssid;
/* HAS_BEEP */
public int beep;
@@ -234,12 +238,14 @@ public class AltosConfigData implements Iterable<String> {
radio_calibration = -1;
radio_channel = -1;
radio_setting = -1;
+ telemetry_rate = -1;
accel_cal_plus = -1;
accel_cal_minus = -1;
pad_orientation = -1;
flight_log_max = -1;
+ log_fixed = -1;
ignite_mode = -1;
aes_key = "";
@@ -250,6 +256,7 @@ public class AltosConfigData implements Iterable<String> {
pyro_firing_time = -1;
aprs_interval = -1;
+ aprs_ssid = -1;
beep = -1;
@@ -270,6 +277,7 @@ public class AltosConfigData implements Iterable<String> {
try { flight = get_int(line, "current-flight"); } catch (Exception e) {}
try { log_format = get_int(line, "log-format"); } catch (Exception e) {}
try { log_space = get_int(line, "log-space"); } catch (Exception e) {}
+ try { altitude_32 = get_int(line, "altitude-32"); } catch (Exception e) {}
try { version = get_string(line, "software-version"); } catch (Exception e) {}
/* Version also contains MS5607 info, which we ignore here */
@@ -290,6 +298,7 @@ public class AltosConfigData implements Iterable<String> {
try { callsign = get_string(line, "Callsign:"); } catch (Exception e) {}
try { radio_enable = get_int(line, "Radio enable:"); } catch (Exception e) {}
try { radio_calibration = get_int(line, "Radio cal:"); } catch (Exception e) {}
+ try { telemetry_rate = get_int(line, "Telemetry rate:"); } catch (Exception e) {}
/* Old HAS_RADIO values */
try { radio_channel = get_int(line, "Radio channel:"); } catch (Exception e) {}
@@ -309,6 +318,7 @@ public class AltosConfigData implements Iterable<String> {
/* HAS_LOG */
try { flight_log_max = get_int(line, "Max flight log:"); } catch (Exception e) {}
+ try { log_fixed = get_int(line, "Log fixed:"); } catch (Exception e) {}
/* HAS_IGNITE */
try { ignite_mode = get_int(line, "Ignite mode:"); } catch (Exception e) {}
@@ -333,6 +343,7 @@ public class AltosConfigData implements Iterable<String> {
/* HAS_APRS */
try { aprs_interval = get_int(line, "APRS interval:"); } catch (Exception e) {}
+ try { aprs_ssid = get_int(line, "APRS SSID:"); } catch (Exception e) {}
/* HAS_BEEP */
try { beep = get_int(line, "Beeper setting:"); } catch (Exception e) {}
@@ -375,6 +386,10 @@ public class AltosConfigData implements Iterable<String> {
return radio_frequency >= 0 || radio_setting >= 0 || radio_channel >= 0;
}
+ public boolean has_telemetry_rate() {
+ return telemetry_rate >= 0;
+ }
+
public void set_frequency(double freq) {
int frequency = radio_frequency;
int setting = radio_setting;
@@ -414,6 +429,8 @@ public class AltosConfigData implements Iterable<String> {
return false;
if (product.startsWith("TeleMetrum-v2"))
return false;
+ if (product.startsWith("EasyMega"))
+ return false;
return true;
}
@@ -437,6 +454,8 @@ public class AltosConfigData implements Iterable<String> {
callsign = source.callsign();
if (radio_calibration >= 0)
radio_calibration = source.radio_calibration();
+ if (telemetry_rate >= 0)
+ telemetry_rate = source.telemetry_rate();
/* HAS_ACCEL */
if (pad_orientation >= 0)
@@ -459,6 +478,8 @@ public class AltosConfigData implements Iterable<String> {
/* HAS_APRS */
if (aprs_interval >= 0)
aprs_interval = source.aprs_interval();
+ if (aprs_ssid >= 0)
+ aprs_ssid = source.aprs_ssid();
/* HAS_BEEP */
if (beep >= 0)
@@ -474,16 +495,21 @@ public class AltosConfigData implements Iterable<String> {
dest.set_serial(serial);
dest.set_product(product);
dest.set_version(version);
+ dest.set_altitude_32(altitude_32);
dest.set_main_deploy(main_deploy);
dest.set_apogee_delay(apogee_delay);
dest.set_apogee_lockout(apogee_lockout);
dest.set_radio_calibration(radio_calibration);
dest.set_radio_frequency(frequency());
+ dest.set_telemetry_rate(telemetry_rate);
boolean max_enabled = true;
if (log_space() == 0)
max_enabled = false;
+ if (log_fixed > 0)
+ max_enabled = false;
+
switch (log_format) {
case AltosLib.AO_LOG_FORMAT_TINY:
max_enabled = false;
@@ -507,6 +533,7 @@ public class AltosConfigData implements Iterable<String> {
dest.set_pyros(null);
dest.set_pyro_firing_time(pyro_firing_time);
dest.set_aprs_interval(aprs_interval);
+ dest.set_aprs_ssid(aprs_ssid);
dest.set_beep(beep);
dest.set_tracker_motion(tracker_motion);
dest.set_tracker_interval(tracker_interval);
@@ -537,14 +564,36 @@ public class AltosConfigData implements Iterable<String> {
radio_calibration);
/* When remote, reset the dongle frequency at the same time */
if (remote) {
+ link.flush_output();
link.stop_remote();
link.set_radio_frequency(frequency);
+ link.flush_output();
link.start_remote();
}
}
- if (callsign != null)
+ if (telemetry_rate >= 0) {
+ link.printf("c T %d\n", telemetry_rate);
+ if (remote) {
+ link.flush_output();
+ link.stop_remote();
+ link.set_telemetry_rate(telemetry_rate);
+ link.flush_output();
+ link.start_remote();
+ }
+ }
+
+ if (callsign != null) {
link.printf("c c %s\n", callsign);
+ if (remote) {
+ link.flush_output();
+ link.stop_remote();
+ link.set_callsign(callsign);
+ link.flush_output();
+ link.start_remote();
+ }
+ }
+
if (radio_enable >= 0)
link.printf("c e %d\n", radio_enable);
@@ -577,6 +626,8 @@ public class AltosConfigData implements Iterable<String> {
/* HAS_APRS */
if (aprs_interval >= 0)
link.printf("c A %d\n", aprs_interval);
+ if (aprs_ssid >= 0)
+ link.printf("c S %d\n", aprs_ssid);
/* HAS_BEEP */
if (beep >= 0)
diff --git a/altoslib/AltosConfigDataException.java b/altoslib/AltosConfigDataException.java
index ae5621cc..a932d3e3 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_4;
+package org.altusmetrum.altoslib_5;
public class AltosConfigDataException extends Exception {
diff --git a/altoslib/AltosConfigValues.java b/altoslib/AltosConfigValues.java
index 724ba7dc..3f0a7075 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_4;
+package org.altusmetrum.altoslib_5;
public interface AltosConfigValues {
/* set and get all of the dialog values */
@@ -25,6 +25,8 @@ public interface AltosConfigValues {
public abstract void set_serial(int serial);
+ public abstract void set_altitude_32(int altitude_32);
+
public abstract void set_main_deploy(int new_main_deploy);
public abstract int main_deploy() throws AltosConfigDataException;
@@ -53,6 +55,10 @@ public interface AltosConfigValues {
public abstract String callsign();
+ public abstract void set_telemetry_rate(int new_telemetry_rate);
+
+ public abstract int telemetry_rate() throws AltosConfigDataException;
+
public abstract void set_flight_log_max(int new_flight_log_max);
public abstract void set_flight_log_max_enabled(boolean enable);
@@ -81,6 +87,10 @@ public interface AltosConfigValues {
public abstract void set_aprs_interval(int new_aprs_interval);
+ public abstract int aprs_ssid() throws AltosConfigDataException;
+
+ public abstract void set_aprs_ssid(int new_aprs_ssid);
+
public abstract int beep() throws AltosConfigDataException;
public abstract void set_beep(int new_beep);
diff --git a/altoslib/AltosConvert.java b/altoslib/AltosConvert.java
index dc0fbb62..18878c02 100644
--- a/altoslib/AltosConvert.java
+++ b/altoslib/AltosConvert.java
@@ -18,7 +18,7 @@
/*
* Sensor data conversion functions
*/
-package org.altusmetrum.altoslib_4;
+package org.altusmetrum.altoslib_5;
public class AltosConvert {
/*
diff --git a/altoslib/AltosDebug.java b/altoslib/AltosDebug.java
index b0e52fc1..e58fbaf2 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.*;
@@ -52,7 +52,7 @@ public class AltosDebug {
public static final byte GET_CHIP_ID = 0x68;
- AltosLink link;
+ private AltosLink link;
boolean debug_mode;
@@ -112,7 +112,11 @@ public class AltosDebug {
int i = 0;
int start = 0;
while (i < length) {
- String line = link.get_reply().trim();
+ String line = link.get_reply();
+ if (line == null)
+ throw new IOException("No reply");
+
+ line = line.trim();
if (!AltosLib.ishex(line) || line.length() % 2 != 0)
throw new IOException(
String.format
@@ -277,4 +281,4 @@ public class AltosDebug {
public AltosDebug (AltosLink link) {
this.link = link;
}
-} \ No newline at end of file
+}
diff --git a/altoslib/AltosDistance.java b/altoslib/AltosDistance.java
index 76ca20c0..67bb58e9 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_4;
+package org.altusmetrum.altoslib_5;
public class AltosDistance extends AltosUnits {
diff --git a/altoslib/AltosEeprom.java b/altoslib/AltosEeprom.java
index 020590eb..532c9f1d 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.*;
import java.util.*;
diff --git a/altoslib/AltosEepromChunk.java b/altoslib/AltosEepromChunk.java
index 91eebc5a..4d12f564 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_4;
+package org.altusmetrum.altoslib_5;
import java.text.*;
import java.util.concurrent.*;
diff --git a/altoslib/AltosEepromDownload.java b/altoslib/AltosEepromDownload.java
index a2dfc438..a448ee64 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.*;
import java.util.*;
diff --git a/altoslib/AltosEepromFile.java b/altoslib/AltosEepromFile.java
index b7e446ce..a1579b55 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.*;
import java.util.*;
diff --git a/altoslib/AltosEepromGPS.java b/altoslib/AltosEepromGPS.java
index 3c1852c0..8c991a6e 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.*;
import java.util.*;
@@ -37,7 +37,7 @@ public class AltosEepromGPS extends AltosEeprom {
/* AO_LOG_GPS_TIME elements */
public int latitude() { return data32(0); }
public int longitude() { return data32(4); }
- public int altitude() { return data16(8); }
+ public int altitude_low() { return data16(8); }
public int hour() { return data8(10); }
public int minute() { return data8(11); }
public int second() { return data8(12); }
@@ -52,6 +52,7 @@ public class AltosEepromGPS extends AltosEeprom {
public int hdop() { return data8(23); }
public int vdop() { return data8(24); }
public int mode() { return data8(25); }
+ public int altitude_high() { return data16(26); }
public boolean has_seconds() { return cmd == AltosLib.AO_LOG_GPS_TIME; }
@@ -90,8 +91,10 @@ public class AltosEepromGPS extends AltosEeprom {
switch (cmd) {
case AltosLib.AO_LOG_FLIGHT:
- state.set_boost_tick(tick);
- state.set_flight(flight());
+ if (state.flight == AltosLib.MISSING) {
+ state.set_boost_tick(tick);
+ state.set_flight(flight());
+ }
/* no place to log start lat/lon yet */
break;
case AltosLib.AO_LOG_GPS_TIME:
@@ -99,7 +102,10 @@ public class AltosEepromGPS extends AltosEeprom {
gps = state.make_temp_gps(false);
gps.lat = latitude() / 1e7;
gps.lon = longitude() / 1e7;
- gps.alt = altitude();
+ if (state.altitude_32())
+ gps.alt = (altitude_low() & 0xffff) | (altitude_high() << 16);
+ else
+ gps.alt = altitude_low();
gps.hour = hour();
gps.minute = minute();
@@ -118,8 +124,21 @@ public class AltosEepromGPS extends AltosEeprom {
gps.ground_speed = ground_speed() * 1.0e-2;
gps.course = course() * 2;
gps.climb_rate = climb_rate() * 1.0e-2;
- gps.hdop = hdop();
- gps.vdop = vdop();
+ if (state.compare_version("1.4.9") >= 0) {
+ gps.pdop = pdop() / 10.0;
+ gps.hdop = hdop() / 10.0;
+ gps.vdop = vdop() / 10.0;
+ } else {
+ gps.pdop = pdop() / 100.0;
+ if (gps.pdop < 0.8)
+ gps.pdop += 2.56;
+ gps.hdop = hdop() / 100.0;
+ if (gps.hdop < 0.8)
+ gps.hdop += 2.56;
+ gps.vdop = vdop() / 100.0;
+ if (gps.vdop < 0.8)
+ gps.vdop += 2.56;
+ }
break;
}
}
diff --git a/altoslib/AltosEepromHeader.java b/altoslib/AltosEepromHeader.java
index 839aa06e..71030655 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.*;
import java.util.*;
@@ -96,6 +96,22 @@ public class AltosEepromHeader extends AltosEeprom {
case AltosLib.AO_LOG_SOFTWARE_VERSION:
state.set_firmware_version(data);
break;
+ case AltosLib.AO_LOG_FREQUENCY:
+ case AltosLib.AO_LOG_APOGEE_LOCKOUT:
+ case AltosLib.AO_LOG_RADIO_RATE:
+ case AltosLib.AO_LOG_IGNITE_MODE:
+ case AltosLib.AO_LOG_PAD_ORIENTATION:
+ case AltosLib.AO_LOG_RADIO_ENABLE:
+ case AltosLib.AO_LOG_AES_KEY:
+ case AltosLib.AO_LOG_APRS:
+ case AltosLib.AO_LOG_BEEP_SETTING:
+ case AltosLib.AO_LOG_TRACKER_SETTING:
+ case AltosLib.AO_LOG_PYRO_TIME:
+ case AltosLib.AO_LOG_APRS_ID:
+ break;
+ case AltosLib.AO_LOG_ALTITUDE_32:
+ state.set_altitude_32(config_a);
+ break;
}
}
@@ -161,6 +177,22 @@ public class AltosEepromHeader extends AltosEeprom {
case AltosLib.AO_LOG_BARO_CRC:
out.printf ("# Baro crc: %d\n", config_a);
break;
+ case AltosLib.AO_LOG_FREQUENCY:
+ case AltosLib.AO_LOG_APOGEE_LOCKOUT:
+ case AltosLib.AO_LOG_RADIO_RATE:
+ case AltosLib.AO_LOG_IGNITE_MODE:
+ case AltosLib.AO_LOG_PAD_ORIENTATION:
+ case AltosLib.AO_LOG_RADIO_ENABLE:
+ case AltosLib.AO_LOG_AES_KEY:
+ case AltosLib.AO_LOG_APRS:
+ case AltosLib.AO_LOG_BEEP_SETTING:
+ case AltosLib.AO_LOG_TRACKER_SETTING:
+ case AltosLib.AO_LOG_PYRO_TIME:
+ case AltosLib.AO_LOG_APRS_ID:
+ break;
+ case AltosLib.AO_LOG_ALTITUDE_32:
+ out.printf("# Altitude-32: %d\n", config_a);
+ break;
}
}
@@ -205,6 +237,9 @@ public class AltosEepromHeader extends AltosEeprom {
} else if (tokens[0].equals("log-format")) {
cmd = AltosLib.AO_LOG_LOG_FORMAT;
config_a = Integer.parseInt(tokens[1]);
+ } else if (tokens[0].equals("altitude-32")) {
+ cmd = AltosLib.AO_LOG_ALTITUDE_32;
+ config_a = Integer.parseInt(tokens[1]);
} else if (tokens[0].equals("software-version")) {
cmd = AltosLib.AO_LOG_SOFTWARE_VERSION;
data = tokens[1];
diff --git a/altoslib/AltosEepromIterable.java b/altoslib/AltosEepromIterable.java
index d6832c1b..dd0afd9f 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.*;
import java.util.*;
diff --git a/altoslib/AltosEepromList.java b/altoslib/AltosEepromList.java
index ab853a88..740499d3 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.*;
import java.util.*;
diff --git a/altoslib/AltosEepromLog.java b/altoslib/AltosEepromLog.java
index 1a430c03..5a11fa54 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_4;
+package org.altusmetrum.altoslib_5;
import java.text.*;
import java.util.concurrent.*;
diff --git a/altoslib/AltosEepromMega.java b/altoslib/AltosEepromMega.java
index 71719a26..adaa7f31 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.*;
import java.util.*;
@@ -67,7 +67,7 @@ public class AltosEepromMega extends AltosEeprom {
/* AO_LOG_GPS_TIME elements */
public int latitude() { return data32(0); }
public int longitude() { return data32(4); }
- public int altitude() { return data16(8); }
+ public int altitude_low() { return data16(8); }
public int hour() { return data8(10); }
public int minute() { return data8(11); }
public int second() { return data8(12); }
@@ -82,6 +82,7 @@ public class AltosEepromMega extends AltosEeprom {
public int hdop() { return data8(23); }
public int vdop() { return data8(24); }
public int mode() { return data8(25); }
+ public int altitude_high() { return data16(26); }
/* AO_LOG_GPS_SAT elements */
public int nsat() { return data16(0); }
@@ -168,7 +169,11 @@ public class AltosEepromMega extends AltosEeprom {
gps = state.make_temp_gps(false);
gps.lat = latitude() / 1e7;
gps.lon = longitude() / 1e7;
- gps.alt = altitude();
+
+ if (state.altitude_32())
+ gps.alt = (altitude_low() & 0xffff) | (altitude_high() << 16);
+ else
+ gps.alt = altitude_low();
gps.hour = hour();
gps.minute = minute();
@@ -187,8 +192,21 @@ public class AltosEepromMega extends AltosEeprom {
gps.ground_speed = ground_speed() * 1.0e-2;
gps.course = course() * 2;
gps.climb_rate = climb_rate() * 1.0e-2;
- gps.hdop = hdop();
- gps.vdop = vdop();
+ if (state.compare_version("1.4.9") >= 0) {
+ gps.pdop = pdop() / 10.0;
+ gps.hdop = hdop() / 10.0;
+ gps.vdop = vdop() / 10.0;
+ } else {
+ gps.pdop = pdop() / 100.0;
+ if (gps.pdop < 0.8)
+ gps.pdop += 2.56;
+ gps.hdop = hdop() / 100.0;
+ if (gps.hdop < 0.8)
+ gps.hdop += 2.56;
+ gps.vdop = vdop() / 100.0;
+ if (gps.vdop < 0.8)
+ gps.vdop += 2.56;
+ }
break;
case AltosLib.AO_LOG_GPS_SAT:
state.set_tick(tick);
diff --git a/altoslib/AltosEepromMetrum2.java b/altoslib/AltosEepromMetrum2.java
index d137614a..d9a65989 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.*;
import java.util.*;
@@ -49,7 +49,8 @@ public class AltosEepromMetrum2 extends AltosEeprom {
/* AO_LOG_GPS_POS elements */
public int latitude() { return data32(0); }
public int longitude() { return data32(4); }
- public int altitude() { return data16(8); }
+ public int altitude_low() { return data16(8); }
+ public int altitude_high() { return data16(10); }
/* AO_LOG_GPS_TIME elements */
public int hour() { return data8(0); }
@@ -59,6 +60,7 @@ public class AltosEepromMetrum2 extends AltosEeprom {
public int year() { return data8(4); }
public int month() { return data8(5); }
public int day() { return data8(6); }
+ public int pdop() { return data8(7); }
/* AO_LOG_GPS_SAT elements */
public int nsat() { return data8(0); }
@@ -117,7 +119,10 @@ public class AltosEepromMetrum2 extends AltosEeprom {
gps = state.make_temp_gps(false);
gps.lat = latitude() / 1e7;
gps.lon = longitude() / 1e7;
- gps.alt = altitude();
+ if (state.altitude_32())
+ gps.alt = (altitude_low() & 0xffff) | (altitude_high() << 16);
+ else
+ gps.alt = altitude_low();
break;
case AltosLib.AO_LOG_GPS_TIME:
gps = state.make_temp_gps(false);
@@ -136,6 +141,7 @@ public class AltosEepromMetrum2 extends AltosEeprom {
gps.year = 2000 + year();
gps.month = month();
gps.day = day();
+ gps.pdop = pdop() / 10.0;
break;
case AltosLib.AO_LOG_GPS_SAT:
gps = state.make_temp_gps(true);
diff --git a/altoslib/AltosEepromMini.java b/altoslib/AltosEepromMini.java
index 32985639..f197539e 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.*;
import java.util.*;
diff --git a/altoslib/AltosEepromMonitor.java b/altoslib/AltosEepromMonitor.java
index b97287c3..173a2cd8 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_4;
+package org.altusmetrum.altoslib_5;
public interface AltosEepromMonitor {
diff --git a/altoslib/AltosEepromTM.java b/altoslib/AltosEepromTM.java
index 77fe20c5..6d36cf47 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.*;
import java.util.*;
diff --git a/altoslib/AltosEepromTm.java b/altoslib/AltosEepromTm.java
index 6cbb7253..81b42f21 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.*;
import java.util.*;
diff --git a/altoslib/AltosFile.java b/altoslib/AltosFile.java
index 2a738996..ba639a04 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.File;
import java.util.*;
diff --git a/altoslib/AltosFlash.java b/altoslib/AltosFlash.java
index 8e8722c2..a8519550 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.*;
@@ -345,9 +345,23 @@ public class AltosFlash extends AltosProgrammer {
debug = new AltosDebug(link);
input = new FileInputStream(file);
image = new AltosHexfile(input);
- if (debug != null && !debug.check_connection()) {
+
+ boolean connection_ok = true;
+
+ if (debug != null) {
+ try {
+ connection_ok = debug.check_connection();
+ } catch (IOException ie) {
+ debug.close();
+ throw ie;
+ } catch (InterruptedException ie) {
+ debug.close();
+ throw ie;
+ }
+ }
+ if (!connection_ok) {
debug.close();
throw new IOException("Debug port not connected");
}
}
-} \ No newline at end of file
+}
diff --git a/altoslib/AltosFlashListener.java b/altoslib/AltosFlashListener.java
index 8bb86bba..7a51c330 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_4;
+package org.altusmetrum.altoslib_5;
public interface AltosFlashListener {
public void position(String label, int percent);
diff --git a/altoslib/AltosFlightReader.java b/altoslib/AltosFlightReader.java
index 2fcd556e..be103838 100644
--- a/altoslib/AltosFlightReader.java
+++ b/altoslib/AltosFlightReader.java
@@ -15,22 +15,22 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_4;
+package org.altusmetrum.altoslib_5;
import java.text.*;
import java.io.*;
import java.util.concurrent.*;
-public class AltosFlightReader {
+public abstract class AltosFlightReader {
public String name;
public int serial;
- public void init() { }
+ public void init() {}
- public AltosState read() throws InterruptedException, ParseException, AltosCRCException, IOException { return null; }
+ public abstract AltosState read() throws InterruptedException, ParseException, AltosCRCException, IOException;
- public void close(boolean interrupted) { }
+ public abstract void close(boolean interrupted);
public void set_frequency(double frequency) throws InterruptedException, TimeoutException { }
@@ -38,12 +38,18 @@ public class AltosFlightReader {
public void set_telemetry(int telemetry) { }
+ public void set_telemetry_rate(int telemetry_rate) throws InterruptedException, TimeoutException { }
+
public void save_telemetry() { }
+ public void save_telemetry_rate() { }
+
public void update(AltosState state) throws InterruptedException { }
public boolean supports_telemetry(int telemetry) { return false; }
+ public boolean supports_telemetry_rate(int telemetry_rate) { return false; }
+
public File backing_file() { return null; }
public boolean has_monitor_battery() throws InterruptedException { return false; }
diff --git a/altoslib/AltosFlightStats.java b/altoslib/AltosFlightStats.java
index 56feb848..1b88cb9f 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.*;
diff --git a/altoslib/AltosFrequency.java b/altoslib/AltosFrequency.java
index 7c291ea9..6093df49 100644
--- a/altoslib/AltosFrequency.java
+++ b/altoslib/AltosFrequency.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_4;
+package org.altusmetrum.altoslib_5;
public class AltosFrequency {
public double frequency;
@@ -41,4 +41,4 @@ public class AltosFrequency {
frequency = f;
description = d;
}
-} \ No newline at end of file
+}
diff --git a/altoslib/AltosGPS.java b/altoslib/AltosGPS.java
index 2708d026..0154e95d 100644
--- a/altoslib/AltosGPS.java
+++ b/altoslib/AltosGPS.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_4;
+package org.altusmetrum.altoslib_5;
import java.text.*;
import java.util.concurrent.*;
@@ -40,10 +40,11 @@ public class AltosGPS implements Cloneable {
public double ground_speed; /* m/s */
public int course; /* degrees */
public double climb_rate; /* m/s */
+ public double pdop; /* unitless */
public double hdop; /* unitless */
public double vdop; /* unitless */
- public int h_error; /* m */
- public int v_error; /* m */
+ public double h_error; /* m */
+ public double v_error; /* m */
public AltosGPSSat[] cc_gps_sat; /* tracking data */
@@ -95,6 +96,7 @@ public class AltosGPS implements Cloneable {
AltosLib.MISSING, 1/100.0);
course = map.get_int(AltosTelemetryLegacy.AO_TELEM_GPS_COURSE,
AltosLib.MISSING);
+ pdop = map.get_double(AltosTelemetryLegacy.AO_TELEM_GPS_PDOP, MISSING, 1.0);
hdop = map.get_double(AltosTelemetryLegacy.AO_TELEM_GPS_HDOP, MISSING, 1.0);
vdop = map.get_double(AltosTelemetryLegacy.AO_TELEM_GPS_VDOP, MISSING, 1.0);
h_error = map.get_int(AltosTelemetryLegacy.AO_TELEM_GPS_HERROR, MISSING);
@@ -268,14 +270,26 @@ public class AltosGPS implements Cloneable {
cc_gps_sat[cc_gps_sat.length - 1] = sat;
}
- public AltosGPS() {
+ private void init() {
lat = AltosLib.MISSING;
lon = AltosLib.MISSING;
alt = AltosLib.MISSING;
+ ground_speed = AltosLib.MISSING;
+ course = AltosLib.MISSING;
+ climb_rate = AltosLib.MISSING;
+ pdop = AltosLib.MISSING;
+ hdop = AltosLib.MISSING;
+ vdop = AltosLib.MISSING;
+ h_error = AltosLib.MISSING;
+ v_error = AltosLib.MISSING;
ClearGPSTime();
cc_gps_sat = null;
}
+ public AltosGPS() {
+ init();
+ }
+
public AltosGPS clone() {
AltosGPS g = new AltosGPS();
@@ -295,7 +309,9 @@ public class AltosGPS implements Cloneable {
g.ground_speed = ground_speed; /* m/s */
g.course = course; /* degrees */
g.climb_rate = climb_rate; /* m/s */
- g.hdop = hdop; /* unitless? */
+ g.pdop = pdop; /* unitless */
+ g.hdop = hdop; /* unitless */
+ g.vdop = vdop; /* unitless */
g.h_error = h_error; /* m */
g.v_error = v_error; /* m */
@@ -327,9 +343,11 @@ public class AltosGPS implements Cloneable {
ground_speed = old.ground_speed; /* m/s */
course = old.course; /* degrees */
climb_rate = old.climb_rate; /* m/s */
+ pdop = old.pdop; /* unitless? */
hdop = old.hdop; /* unitless? */
- h_error = old.h_error; /* m */
- v_error = old.v_error; /* m */
+ vdop = old.vdop; /* unitless? */
+ h_error = old.h_error; /* m */
+ v_error = old.v_error; /* m */
if (old.cc_gps_sat != null) {
cc_gps_sat = new AltosGPSSat[old.cc_gps_sat.length];
@@ -340,11 +358,7 @@ public class AltosGPS implements Cloneable {
}
}
} else {
- lat = AltosLib.MISSING;
- lon = AltosLib.MISSING;
- alt = AltosLib.MISSING;
- ClearGPSTime();
- cc_gps_sat = null;
+ init();
}
}
diff --git a/altoslib/AltosGPSSat.java b/altoslib/AltosGPSSat.java
index ef24d497..adbcbe61 100644
--- a/altoslib/AltosGPSSat.java
+++ b/altoslib/AltosGPSSat.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_4;
+package org.altusmetrum.altoslib_5;
public class AltosGPSSat {
public int svid;
diff --git a/altoslib/AltosGreatCircle.java b/altoslib/AltosGreatCircle.java
index 4782c34d..716eeef9 100644
--- a/altoslib/AltosGreatCircle.java
+++ b/altoslib/AltosGreatCircle.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_4;
+package org.altusmetrum.altoslib_5;
import java.lang.Math;
diff --git a/altoslib/AltosHeight.java b/altoslib/AltosHeight.java
index 84981032..8c67e043 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_4;
+package org.altusmetrum.altoslib_5;
public class AltosHeight extends AltosUnits {
diff --git a/altoslib/AltosHexfile.java b/altoslib/AltosHexfile.java
index d5fa8f5f..9ee64bdc 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.*;
import java.util.LinkedList;
diff --git a/altoslib/AltosHexsym.java b/altoslib/AltosHexsym.java
index 403b5644..52eb81db 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_4;
+package org.altusmetrum.altoslib_5;
public class AltosHexsym {
String name;
diff --git a/altoslib/AltosIMU.java b/altoslib/AltosIMU.java
index a22b3fed..89d7def4 100644
--- a/altoslib/AltosIMU.java
+++ b/altoslib/AltosIMU.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_4;
+package org.altusmetrum.altoslib_5;
import java.util.concurrent.*;
diff --git a/altoslib/AltosIdle.java b/altoslib/AltosIdle.java
index 55f6f5c9..0f723d14 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.*;
import java.util.*;
diff --git a/altoslib/AltosIdleFetch.java b/altoslib/AltosIdleFetch.java
index 5cd8bf36..50745d97 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.*;
import java.util.*;
@@ -118,6 +118,10 @@ public class AltosIdleFetch implements AltosStateUpdate {
AltosIdler.idle_ms5607, AltosIdler.idle_mma655x,
AltosIdler.idle_imu, AltosIdler.idle_mag,
AltosIdler.idle_sensor_mega),
+ new AltosIdler("EasyMega",
+ AltosIdler.idle_ms5607, AltosIdler.idle_mma655x,
+ AltosIdler.idle_imu, AltosIdler.idle_mag,
+ AltosIdler.idle_sensor_mega),
};
AltosLink link;
diff --git a/altoslib/AltosIdleMonitor.java b/altoslib/AltosIdleMonitor.java
index f81abdff..85bcff10 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.*;
import java.util.concurrent.*;
diff --git a/altoslib/AltosIdleMonitorListener.java b/altoslib/AltosIdleMonitorListener.java
index 6a9abea2..4382430c 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_4;
+package org.altusmetrum.altoslib_5;
public interface AltosIdleMonitorListener {
public void update(AltosState state, AltosListenerState listener_state);
diff --git a/altoslib/AltosIgnite.java b/altoslib/AltosIgnite.java
index c21f17ac..b458911e 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_4;
+package org.altusmetrum.altoslib_5;
import java.util.*;
import java.io.*;
diff --git a/altoslib/AltosKML.java b/altoslib/AltosKML.java
index d55da9ef..e701fda3 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.*;
@@ -28,18 +28,25 @@ public class AltosKML implements AltosWriter {
double gps_start_altitude;
static final String[] kml_state_colors = {
- "FF000000",
- "FF000000",
- "FF000000",
- "FF0000FF",
- "FF4080FF",
- "FF00FFFF",
- "FFFF0000",
- "FF00FF00",
- "FF000000",
- "FFFFFFFF"
+ "FF000000", // startup
+ "FF000000", // idle
+ "FF000000", // pad
+ "FF0000FF", // boost
+ "FF4080FF", // fast
+ "FF00FFFF", // coast
+ "FFFF0000", // drogue
+ "FF00FF00", // main
+ "FF000000", // landed
+ "FFFFFFFF", // invalid
+ "FFFF0000", // stateless
};
+ static String state_color(int state) {
+ if (state < 0 || kml_state_colors.length <= state)
+ return kml_state_colors[AltosLib.ao_flight_invalid];
+ return kml_state_colors[state];
+ }
+
static final String kml_header_start =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<kml xmlns=\"http://www.opengis.net/kml/2.2\">\n" +
@@ -95,7 +102,8 @@ public class AltosKML implements AltosWriter {
void state_start(AltosState state) {
String state_name = AltosLib.state_name(state.state);
- out.printf(kml_style_start, state_name, kml_state_colors[state.state]);
+ String state_color = state_color(state.state);
+ out.printf(kml_style_start, state_name, state_color);
out.printf("\tState: %s\n", state_name);
out.printf("%s", kml_style_end);
out.printf(kml_placemark_start, state_name, state_name);
diff --git a/altoslib/AltosLatitude.java b/altoslib/AltosLatitude.java
index 6156d6dc..2b507173 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_4;
+package org.altusmetrum.altoslib_5;
public class AltosLatitude extends AltosLocation {
public String pos() { return "N"; }
diff --git a/altoslib/AltosLib.java b/altoslib/AltosLib.java
index 69c6d604..2e9dc648 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_4;
+package org.altusmetrum.altoslib_5;
import java.util.*;
import java.io.*;
@@ -51,6 +51,20 @@ public class AltosLib {
public static final int AO_LOG_SERIAL_NUMBER = 2002;
public static final int AO_LOG_LOG_FORMAT = 2003;
+ public static final int AO_LOG_FREQUENCY = 2004;
+ public static final int AO_LOG_APOGEE_LOCKOUT = 2005;
+ public static final int AO_LOG_RADIO_RATE = 2006;
+ public static final int AO_LOG_IGNITE_MODE = 2007;
+ public static final int AO_LOG_PAD_ORIENTATION = 2008;
+ public static final int AO_LOG_RADIO_ENABLE = 2009;
+ public static final int AO_LOG_AES_KEY = 2010;
+ public static final int AO_LOG_APRS = 2011;
+ public static final int AO_LOG_BEEP_SETTING = 2012;
+ public static final int AO_LOG_TRACKER_SETTING = 2013;
+ public static final int AO_LOG_PYRO_TIME = 2014;
+ public static final int AO_LOG_APRS_ID = 2015;
+ public static final int AO_LOG_ALTITUDE_32 = 2016;
+
/* Added for header fields in telemega files */
public static final int AO_LOG_BARO_RESERVED = 3000;
public static final int AO_LOG_BARO_SENS = 3001;
@@ -98,6 +112,7 @@ public class AltosLib {
public final static int product_telegps = 0x0025;
public final static int product_easymini = 0x0026;
public final static int product_telemini = 0x0027;
+ public final static int product_easymega = 0x0028;
public final static int product_altusmetrum_min = 0x000a;
public final static int product_altusmetrum_max = 0x002c;
@@ -129,7 +144,8 @@ public class AltosLib {
new Product("megadongle", product_megadongle),
new Product("telegps", product_telegps),
new Product("easymini", product_easymini),
- new Product("telemini", product_telemini)
+ new Product("telemini", product_telemini),
+ new Product("easymega", product_easymega)
};
public static int name_to_product(String name) {
@@ -161,6 +177,15 @@ public class AltosLib {
"Off", "Standard Telemetry", "TeleMetrum v0.9", "TeleMetrum v0.8"
};
+ public static final int ao_telemetry_rate_38400 = 0;
+ public static final int ao_telemetry_rate_9600 = 1;
+ public static final int ao_telemetry_rate_2400 = 2;
+ public static final int ao_telemetry_rate_max = 2;
+
+ public static final Integer[] ao_telemetry_rate_values = {
+ 38400, 9600, 2400
+ };
+
public static final String launch_sites_url = "http://www.altusmetrum.org/AltOS/launch-sites.txt";
public static final int ao_telemetry_standard_len = 32;
@@ -206,6 +231,31 @@ public class AltosLib {
telemetry));
}
+ private static int[] split_version(String version) {
+ String[] tokens = version.split("\\.");
+ int[] ret = new int[tokens.length];
+ for (int i = 0; i < tokens.length; i++)
+ ret[i] = Integer.parseInt(tokens[i]);
+ return ret;
+ }
+
+ public static int compare_version(String version_a, String version_b) {
+ int[] a = split_version(version_a);
+ int[] b = split_version(version_b);
+
+ for (int i = 0; i < Math.min(a.length, b.length); i++) {
+ if (a[i] < b[i])
+ return -1;
+ if (a[i] > b[i])
+ return 1;
+ }
+ if (a.length < b.length)
+ return -1;
+ if (a.length > b.length)
+ return 1;
+ return 0;
+ }
+
private static String[] state_to_string = {
"startup",
"idle",
@@ -281,7 +331,7 @@ public class AltosLib {
return false;
}
- public static boolean ishex(int c) {
+ public static final boolean ishex(int c) {
if ('0' <= c && c <= '9')
return true;
if ('a' <= c && c <= 'f')
@@ -291,7 +341,7 @@ public class AltosLib {
return false;
}
- public static boolean ishex(String s) {
+ public static final boolean ishex(String s) {
for (int i = 0; i < s.length(); i++)
if (!ishex(s.charAt(i)))
return false;
@@ -415,10 +465,17 @@ public class AltosLib {
if ((s.length() & 1) != 0)
throw new NumberFormatException(String.format("invalid line \"%s\"", s));
- n = s.length() / 2;
+ byte[] bytes = s.getBytes(unicode_set);
+ n = bytes.length / 2;
r = new int[n];
- for (i = 0; i < n; i++)
- r[i] = hexbyte(s, i * 2);
+ for (i = 0; i < n; i++) {
+ int h = fromhex(bytes[(i << 1)]);
+ int l = fromhex(bytes[(i << 1) + 1]);
+ if (h < 0 || l < 0)
+ throw new NumberFormatException(String.format("invalid hex \"%c%c\"",
+ bytes[(i<<1)], bytes[(i<<1) + 1]));
+ r[i] = (h << 4) + l;
+ }
return r;
}
diff --git a/altoslib/AltosLine.java b/altoslib/AltosLine.java
index f9c712a3..f56938c6 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_4;
+package org.altusmetrum.altoslib_5;
public class AltosLine {
public String line;
diff --git a/altoslib/AltosLink.java b/altoslib/AltosLink.java
index 7f434a06..62bd82b9 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.*;
import java.util.concurrent.*;
@@ -163,8 +163,21 @@ public abstract class AltosLink implements Runnable {
if (!can_cancel && remote)
System.out.printf("Uh-oh, reading remote serial device from swing thread\n");
- if (remote && can_cancel)
+ if (remote && can_cancel) {
timeout = 500;
+ switch (telemetry_rate) {
+ case AltosLib.ao_telemetry_rate_38400:
+ default:
+ timeout = 500;
+ break;
+ case AltosLib.ao_telemetry_rate_9600:
+ timeout = 2000;
+ break;
+ case AltosLib.ao_telemetry_rate_2400:
+ timeout = 8000;
+ break;
+ }
+ }
try {
++in_reply;
@@ -274,6 +287,8 @@ public abstract class AltosLink implements Runnable {
}
public void flush_output() {
+ if (pending_output == null)
+ return;
for (String s : pending_output)
System.out.print(s);
pending_output.clear();
@@ -305,6 +320,7 @@ public abstract class AltosLink implements Runnable {
*/
public boolean monitor_mode = false;
public int telemetry = AltosLib.ao_telemetry_standard;
+ public int telemetry_rate = -1;
public double frequency;
public String callsign;
AltosConfigData config_data;
@@ -356,6 +372,15 @@ public abstract class AltosLink implements Runnable {
flush_output();
}
+ public void set_telemetry_rate(int in_telemetry_rate) {
+ telemetry_rate = in_telemetry_rate;
+ if (monitor_mode)
+ printf("m 0\nc T %d\nm %x\n", telemetry_rate, telemetry_len());
+ else
+ printf("c T %d\n", telemetry_rate);
+ flush_output();
+ }
+
public void set_monitor(boolean monitor) {
monitor_mode = monitor;
if (monitor)
@@ -383,10 +408,14 @@ public abstract class AltosLink implements Runnable {
flush_output();
}
- public AltosConfigData config_data() throws InterruptedException, TimeoutException {
+ public AltosConfigData config_data() throws InterruptedException, TimeoutException {
synchronized(config_data_lock) {
- if (config_data == null)
+ if (config_data == null) {
+ printf("m 0\n");
config_data = new AltosConfigData(this);
+ if (monitor_mode)
+ set_monitor(true);
+ }
return config_data;
}
}
@@ -430,7 +459,12 @@ public abstract class AltosLink implements Runnable {
if (debug)
System.out.printf("start remote %7.3f\n", frequency);
set_radio_frequency(frequency);
- set_callsign(AltosPreferences.callsign());
+ if (telemetry_rate < 0)
+ telemetry_rate = AltosPreferences.telemetry_rate(serial);
+ set_telemetry_rate(telemetry_rate);
+ if (callsign.equals(""))
+ callsign = AltosPreferences.callsign();
+ set_callsign(callsign);
printf("p\nE 0\n");
flush_input();
remote = true;
diff --git a/altoslib/AltosListenerState.java b/altoslib/AltosListenerState.java
index 5bf761b0..054ff1d0 100644
--- a/altoslib/AltosListenerState.java
+++ b/altoslib/AltosListenerState.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_4;
+package org.altusmetrum.altoslib_5;
public class AltosListenerState {
public int crc_errors;
diff --git a/altoslib/AltosLocation.java b/altoslib/AltosLocation.java
index 725a02ba..9bbbb899 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_4;
+package org.altusmetrum.altoslib_5;
public abstract class AltosLocation extends AltosUnits {
diff --git a/altoslib/AltosLog.java b/altoslib/AltosLog.java
index c4e9e425..28116e3d 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.*;
import java.text.*;
@@ -72,6 +72,7 @@ public class AltosLog implements Runnable {
}
log_file.flush();
file = a;
+ AltosPreferences.set_logfile(link.serial, file);
}
return log_file != null;
}
diff --git a/altoslib/AltosLongitude.java b/altoslib/AltosLongitude.java
index 29a5dcd4..dbcd6bf0 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_4;
+package org.altusmetrum.altoslib_5;
public class AltosLongitude extends AltosLocation {
public String pos() { return "E"; }
diff --git a/altoslib/AltosMag.java b/altoslib/AltosMag.java
index 9262de2d..690241f1 100644
--- a/altoslib/AltosMag.java
+++ b/altoslib/AltosMag.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_4;
+package org.altusmetrum.altoslib_5;
import java.util.concurrent.*;
diff --git a/altoslib/AltosMma655x.java b/altoslib/AltosMma655x.java
index cb2e63d4..7f0dab98 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_4;
+package org.altusmetrum.altoslib_5;
import java.util.concurrent.*;
@@ -23,14 +23,15 @@ public class AltosMma655x implements Cloneable {
int accel;
- public boolean parse_line(String line) {
- String[] items = line.split("\\s+");
- if (line.startsWith("MMA655X value:")) {
- if (items.length >= 3)
- accel = Integer.parseInt(items[1]);
- } else
- return false;
- return true;
+ public boolean parse_line(String line) throws NumberFormatException {
+ if (line.startsWith("MMA655X value")) {
+ String[] items = line.split("\\s+");
+ if (items.length >= 3) {
+ accel = Integer.parseInt(items[2]);
+ return true;
+ }
+ }
+ return false;
}
public AltosMma655x() {
@@ -51,17 +52,18 @@ public class AltosMma655x implements Cloneable {
if (mma655x != null)
state.set_accel(mma655x.accel);
} catch (TimeoutException te) {
+ } catch (NumberFormatException ne) {
}
}
- public AltosMma655x(AltosLink link) throws InterruptedException, TimeoutException {
+ public AltosMma655x(AltosLink link) throws InterruptedException, TimeoutException, NumberFormatException {
this();
link.printf("A\n");
for (;;) {
String line = link.get_reply_no_dialog(5000);
if (line == null)
throw new TimeoutException();
- if (!parse_line(line))
+ if (parse_line(line))
break;
}
}
diff --git a/altoslib/AltosMs5607.java b/altoslib/AltosMs5607.java
index 5aa3a7ec..81e0641c 100644
--- a/altoslib/AltosMs5607.java
+++ b/altoslib/AltosMs5607.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_4;
+package org.altusmetrum.altoslib_5;
import java.util.concurrent.*;
diff --git a/altoslib/AltosNoSymbol.java b/altoslib/AltosNoSymbol.java
index f5e53b8c..d436c3f1 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_4;
+package org.altusmetrum.altoslib_5;
public class AltosNoSymbol extends Exception {
public AltosNoSymbol(String name) {
diff --git a/altoslib/AltosOrient.java b/altoslib/AltosOrient.java
index 5fcbe28d..348c6844 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_4;
+package org.altusmetrum.altoslib_5;
public class AltosOrient extends AltosUnits {
diff --git a/altoslib/AltosParse.java b/altoslib/AltosParse.java
index 1bff7682..9cb99a0d 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_4;
+package org.altusmetrum.altoslib_5;
import java.text.*;
diff --git a/altoslib/AltosPreferences.java b/altoslib/AltosPreferences.java
index d299f27b..dba57dcb 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.*;
import java.util.*;
@@ -35,6 +35,12 @@ public class AltosPreferences {
/* telemetry format preference name */
public final static String telemetryPreferenceFormat = "TELEMETRY-%d";
+ /* telemetry rate format preference name */
+ public final static String telemetryRatePreferenceFormat = "RATE-%d";
+
+ /* log file format preference name */
+ public final static String logfilePreferenceFormat = "LOGFILE-%d";
+
/* voice preference name */
public final static String voicePreference = "VOICE";
@@ -50,6 +56,9 @@ public class AltosPreferences {
/* scanning telemetry preferences name */
public final static String scanningTelemetryPreference = "SCANNING-TELEMETRY";
+ /* scanning telemetry rate preferences name */
+ public final static String scanningTelemetryRatePreference = "SCANNING-RATE";
+
/* Launcher serial preference name */
public final static String launcherSerialPreference = "LAUNCHER-SERIAL";
@@ -74,6 +83,12 @@ public class AltosPreferences {
/* Telemetry (map serial to telemetry format) */
public static Hashtable<Integer, Integer> telemetries;
+ /* Telemetry rate (map serial to telemetry format) */
+ public static Hashtable<Integer, Integer> telemetry_rates;
+
+ /* Log file (map serial to logfile name) */
+ public static Hashtable<Integer, File> logfiles;
+
/* Voice preference */
public static boolean voice;
@@ -86,6 +101,8 @@ public class AltosPreferences {
/* Scanning telemetry */
public static int scanning_telemetry;
+ public static int scanning_telemetry_rate;
+
/* List of frequencies */
public final static String common_frequencies_node_name = "COMMON-FREQUENCIES";
public static AltosFrequency[] common_frequencies;
@@ -140,6 +157,10 @@ public class AltosPreferences {
public static int launcher_channel;
public static void init(AltosPreferencesBackend in_backend) {
+
+ if (backend != null)
+ return;
+
backend = in_backend;
/* Initialize logdir from preferences */
@@ -159,12 +180,18 @@ public class AltosPreferences {
telemetries = new Hashtable<Integer,Integer>();
+ telemetry_rates = new Hashtable<Integer,Integer>();
+
+ logfiles = new Hashtable<Integer,File>();
+
voice = backend.getBoolean(voicePreference, true);
callsign = backend.getString(callsignPreference,"N0CALL");
scanning_telemetry = backend.getInt(scanningTelemetryPreference,(1 << AltosLib.ao_telemetry_standard));
+ scanning_telemetry_rate = backend.getInt(scanningTelemetryRatePreference,(1 << AltosLib.ao_telemetry_rate_38400));
+
launcher_serial = backend.getInt(launcherSerialPreference, 0);
launcher_channel = backend.getInt(launcherChannelPreference, 0);
@@ -266,6 +293,46 @@ public class AltosPreferences {
}
}
+ public static void set_telemetry_rate(int serial, int new_telemetry_rate) {
+ synchronized (backend) {
+ telemetry_rates.put(serial, new_telemetry_rate);
+ backend.putInt(String.format(telemetryRatePreferenceFormat, serial), new_telemetry_rate);
+ flush_preferences();
+ }
+ }
+
+ public static int telemetry_rate(int serial) {
+ synchronized (backend) {
+ if (telemetry_rates.containsKey(serial))
+ return telemetry_rates.get(serial);
+ int telemetry_rate = backend.getInt(String.format(telemetryRatePreferenceFormat, serial),
+ AltosLib.ao_telemetry_rate_38400);
+ telemetry_rates.put(serial, telemetry_rate);
+ return telemetry_rate;
+ }
+ }
+
+ public static void set_logfile(int serial, File new_logfile) {
+ synchronized(backend) {
+ logfiles.put(serial, new_logfile);
+ backend.putString(String.format(logfilePreferenceFormat, serial), new_logfile.getPath());
+ flush_preferences();
+ }
+ }
+
+ public static File logfile(int serial) {
+ synchronized(backend) {
+ if (logfiles.containsKey(serial))
+ return logfiles.get(serial);
+ String logfile_string = backend.getString(String.format(logfilePreferenceFormat, serial), null);
+ if (logfile_string == null)
+ return null;
+ File logfile = new File(logfile_string);
+ logfiles.put(serial, logfile);
+ return logfile;
+ }
+ }
+
public static void set_scanning_telemetry(int new_scanning_telemetry) {
synchronized (backend) {
scanning_telemetry = new_scanning_telemetry;
@@ -280,6 +347,20 @@ public class AltosPreferences {
}
}
+ public static void set_scanning_telemetry_rate(int new_scanning_telemetry_rate) {
+ synchronized (backend) {
+ scanning_telemetry_rate = new_scanning_telemetry_rate;
+ backend.putInt(scanningTelemetryRatePreference, scanning_telemetry_rate);
+ flush_preferences();
+ }
+ }
+
+ public static int scanning_telemetry_rate() {
+ synchronized(backend) {
+ return scanning_telemetry_rate;
+ }
+ }
+
public static void set_voice(boolean new_voice) {
synchronized (backend) {
voice = new_voice;
diff --git a/altoslib/AltosPreferencesBackend.java b/altoslib/AltosPreferencesBackend.java
index 461b5c80..76a99acb 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.File;
diff --git a/altoslib/AltosProgrammer.java b/altoslib/AltosProgrammer.java
index c96f04ca..443082d5 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.*;
diff --git a/altoslib/AltosPyro.java b/altoslib/AltosPyro.java
index 9e47bc80..60b8fe52 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_4;
+package org.altusmetrum.altoslib_5;
import java.util.*;
import java.text.*;
diff --git a/altoslib/AltosReplayReader.java b/altoslib/AltosReplayReader.java
index bf7e0e5b..2864e02a 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.*;
import java.util.*;
@@ -27,6 +27,7 @@ import java.util.*;
public class AltosReplayReader extends AltosFlightReader {
Iterator<AltosState> iterator;
File file;
+ boolean real_time;
public AltosState read() {
if (iterator.hasNext())
@@ -39,16 +40,22 @@ public class AltosReplayReader extends AltosFlightReader {
public void update(AltosState state) throws InterruptedException {
/* Make it run in realtime after the rocket leaves the pad */
- if (state.state > AltosLib.ao_flight_pad && state.time_change > 0)
+ if (real_time && state.state > AltosLib.ao_flight_pad && state.time_change > 0)
Thread.sleep((int) (Math.min(state.time_change,10) * 1000));
state.set_received_time(System.currentTimeMillis());
}
public File backing_file() { return file; }
- public AltosReplayReader(Iterator<AltosState> in_iterator, File in_file) {
+ public AltosReplayReader(Iterator<AltosState> in_iterator, File in_file,
+ boolean in_real_time) {
iterator = in_iterator;
file = in_file;
+ real_time = in_real_time;
name = file.getName();
}
+
+ public AltosReplayReader(Iterator<AltosState> in_iterator, File in_file) {
+ this(in_iterator, in_file, false);
+ }
}
diff --git a/altoslib/AltosRomconfig.java b/altoslib/AltosRomconfig.java
index 10df11af..d0de5492 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.*;
diff --git a/altoslib/AltosSelfFlash.java b/altoslib/AltosSelfFlash.java
index 502c6d65..3ec69213 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.*;
diff --git a/altoslib/AltosSensorEMini.java b/altoslib/AltosSensorEMini.java
index ee0238f9..53a8e998 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_4;
+package org.altusmetrum.altoslib_5;
import java.util.concurrent.TimeoutException;
diff --git a/altoslib/AltosSensorMM.java b/altoslib/AltosSensorMM.java
index e34e71b7..cdc2ac42 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_4;
+package org.altusmetrum.altoslib_5;
import java.util.concurrent.TimeoutException;
diff --git a/altoslib/AltosSensorMega.java b/altoslib/AltosSensorMega.java
index 02f3a256..3c7213eb 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_4;
+package org.altusmetrum.altoslib_5;
import java.util.concurrent.TimeoutException;
diff --git a/altoslib/AltosSensorMetrum.java b/altoslib/AltosSensorMetrum.java
index e5421ef5..d977e886 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_4;
+package org.altusmetrum.altoslib_5;
import java.util.concurrent.TimeoutException;
diff --git a/altoslib/AltosSensorTM.java b/altoslib/AltosSensorTM.java
index 2d60d8cf..344e7449 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_4;
+package org.altusmetrum.altoslib_5;
import java.util.concurrent.TimeoutException;
diff --git a/altoslib/AltosSensorTMini.java b/altoslib/AltosSensorTMini.java
index b9eeca0c..edd76da2 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_4;
+package org.altusmetrum.altoslib_5;
import java.util.concurrent.TimeoutException;
diff --git a/altoslib/AltosSpeed.java b/altoslib/AltosSpeed.java
index 9134f5f4..d2f86214 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_4;
+package org.altusmetrum.altoslib_5;
public class AltosSpeed extends AltosUnits {
diff --git a/altoslib/AltosState.java b/altoslib/AltosState.java
index b05cd358..5fce15c4 100644
--- a/altoslib/AltosState.java
+++ b/altoslib/AltosState.java
@@ -19,7 +19,7 @@
* Track flight state from telemetry or eeprom data stream
*/
-package org.altusmetrum.altoslib_4;
+package org.altusmetrum.altoslib_5;
public class AltosState implements Cloneable {
@@ -271,6 +271,7 @@ public class AltosState implements Cloneable {
public int state;
public int flight;
public int serial;
+ public int altitude_32;
public int receiver_serial;
public boolean landed;
public boolean ascent; /* going up? */
@@ -472,15 +473,23 @@ public class AltosState implements Cloneable {
pressure.set(p, time);
}
+ public double baro_height() {
+ double a = altitude();
+ double g = ground_altitude();
+ if (a != AltosLib.MISSING && g != AltosLib.MISSING)
+ return a - g;
+ return AltosLib.MISSING;
+ }
+
public double height() {
double k = kalman_height.value();
if (k != AltosLib.MISSING)
return k;
- double a = altitude();
- double g = ground_altitude();
- if (a != AltosLib.MISSING && g != AltosLib.MISSING)
- return a - g;
+ double b = baro_height();
+ if (b != AltosLib.MISSING)
+ return b;
+
return gps_height();
}
@@ -762,6 +771,7 @@ public class AltosState implements Cloneable {
product = null;
serial = AltosLib.MISSING;
receiver_serial = AltosLib.MISSING;
+ altitude_32 = AltosLib.MISSING;
baro = null;
companion = null;
@@ -899,6 +909,7 @@ public class AltosState implements Cloneable {
product = old.product;
serial = old.serial;
receiver_serial = old.receiver_serial;
+ altitude_32 = old.altitude_32;
baro = old.baro;
companion = old.companion;
@@ -1024,15 +1035,27 @@ public class AltosState implements Cloneable {
firmware_version = version;
}
+ public int compare_version(String other_version) {
+ if (firmware_version == null)
+ return AltosLib.MISSING;
+ return AltosLib.compare_version(firmware_version, other_version);
+ }
+
+ private void re_init() {
+ int bt = boost_tick;
+ int rs = receiver_serial;
+ init();
+ boost_tick = bt;
+ receiver_serial = rs;
+ }
+
public void set_flight(int flight) {
/* When the flight changes, reset the state */
- if (flight != AltosLib.MISSING && flight != 0) {
+ if (flight != AltosLib.MISSING) {
if (this.flight != AltosLib.MISSING &&
this.flight != flight) {
- int bt = boost_tick;
- init();
- boost_tick = bt;
+ re_init();
}
this.flight = flight;
}
@@ -1043,9 +1066,7 @@ public class AltosState implements Cloneable {
if (serial != AltosLib.MISSING) {
if (this.serial != AltosLib.MISSING &&
this.serial != serial) {
- int bt = boost_tick;
- init();
- boost_tick = bt;
+ re_init();
}
this.serial = serial;
}
@@ -1056,6 +1077,15 @@ public class AltosState implements Cloneable {
receiver_serial = serial;
}
+ public boolean altitude_32() {
+ return altitude_32 == 1;
+ }
+
+ public void set_altitude_32(int altitude_32) {
+ if (altitude_32 != AltosLib.MISSING)
+ this.altitude_32 = altitude_32;
+ }
+
public int rssi() {
if (rssi == AltosLib.MISSING)
return 0;
diff --git a/altoslib/AltosStateIterable.java b/altoslib/AltosStateIterable.java
index be812095..4154b71c 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.*;
import java.util.*;
@@ -26,4 +26,18 @@ public abstract class AltosStateIterable implements Iterable<AltosState> {
}
public abstract void write(PrintStream out);
+
+ public static AltosStateIterable iterable(File file) {
+ FileInputStream in;
+ 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"))
+ return new AltosTelemetryFile(in);
+ else
+ return new AltosEepromFile(in);
+ }
}
diff --git a/altoslib/AltosStateUpdate.java b/altoslib/AltosStateUpdate.java
index ac4e963e..70530f75 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_4;
+package org.altusmetrum.altoslib_5;
public interface AltosStateUpdate {
public void update_state(AltosState state) throws InterruptedException;
diff --git a/altoslib/AltosTelemetry.java b/altoslib/AltosTelemetry.java
index 8182ec6b..a123d752 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_4;
+package org.altusmetrum.altoslib_5;
import java.text.*;
@@ -114,6 +114,29 @@ public abstract class AltosTelemetry implements AltosStateUpdate {
return telem;
}
+ public static int extend_height(AltosState state, int height_16) {
+ double compare_height;
+ int height = height_16;
+
+ if (state.gps != null && state.gps.alt != AltosLib.MISSING) {
+ compare_height = state.gps_height();
+ } else {
+ compare_height = state.height();
+ }
+
+ if (compare_height != AltosLib.MISSING) {
+ int high_bits = (int) Math.floor (compare_height / 65536.0);
+
+ height = (high_bits << 16) | (height_16 & 0xffff);
+
+ if (Math.abs(height + 65536 - compare_height) < Math.abs(height - compare_height))
+ height += 65536;
+ else if (Math.abs(height - 65536 - compare_height) < Math.abs(height - compare_height))
+ height -= 65536;
+ }
+ return height;
+ }
+
public static AltosTelemetry parse(String line) throws ParseException, AltosCRCException {
String[] word = line.split("\\s+");
int i =0;
diff --git a/altoslib/AltosTelemetryConfiguration.java b/altoslib/AltosTelemetryConfiguration.java
index e3884051..f578e6ad 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_4;
+package org.altusmetrum.altoslib_5;
public class AltosTelemetryConfiguration extends AltosTelemetryStandard {
diff --git a/altoslib/AltosTelemetryFile.java b/altoslib/AltosTelemetryFile.java
index 3d3fa407..15344b8d 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.*;
import java.util.*;
diff --git a/altoslib/AltosTelemetryIterable.java b/altoslib/AltosTelemetryIterable.java
index cba97ddc..ac42597d 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_4;
+package org.altusmetrum.altoslib_5;
import java.io.*;
import java.util.*;
diff --git a/altoslib/AltosTelemetryLegacy.java b/altoslib/AltosTelemetryLegacy.java
index 3367ece7..72a8bc4a 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_4;
+package org.altusmetrum.altoslib_5;
import java.text.*;
@@ -186,6 +186,7 @@ public class AltosTelemetryLegacy extends AltosTelemetry {
* g_v GPS vertical speed (integer, cm/sec)
* g_s GPS horizontal speed (integer, cm/sec)
* g_c GPS course (integer, 0-359)
+ * g_pd GPS pdop (integer * 10)
* g_hd GPS hdop (integer * 10)
* g_vd GPS vdop (integer * 10)
* g_he GPS h error (integer)
@@ -209,6 +210,7 @@ public class AltosTelemetryLegacy extends AltosTelemetry {
final static String AO_TELEM_GPS_VERTICAL_SPEED = "g_v";
final static String AO_TELEM_GPS_HORIZONTAL_SPEED = "g_g";
final static String AO_TELEM_GPS_COURSE = "g_c";
+ final static String AO_TELEM_GPS_PDOP = "g_pd";
final static String AO_TELEM_GPS_HDOP = "g_hd";
final static String AO_TELEM_GPS_VDOP = "g_vd";
final static String AO_TELEM_GPS_HERROR = "g_he";
diff --git a/altoslib/AltosTelemetryLocation.java b/altoslib/AltosTelemetryLocation.java
index 8368188f..427ae16e 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_4;
+package org.altusmetrum.altoslib_5;
public class AltosTelemetryLocation extends AltosTelemetryStandard {
@@ -37,11 +37,12 @@ public class AltosTelemetryLocation extends AltosTelemetryStandard {
int climb_rate;
int course;
+ public static final int AO_GPS_MODE_ALTITUDE_24 = (1 << 0); /* Reports 24-bits of altitude */
+
public AltosTelemetryLocation(int[] bytes) {
super(bytes);
flags = uint8(5);
- altitude = int16(6);
latitude = uint32(8);
longitude = uint32(12);
year = uint8(16);
@@ -57,6 +58,11 @@ public class AltosTelemetryLocation extends AltosTelemetryStandard {
ground_speed = uint16(26);
climb_rate = int16(28);
course = uint8(30);
+
+ if ((mode & AO_GPS_MODE_ALTITUDE_24) != 0) {
+ altitude = (int8(31) << 16) | uint16(6);
+ } else
+ altitude = int16(6);
}
public void update_state(AltosState state) {
@@ -80,8 +86,9 @@ public class AltosTelemetryLocation extends AltosTelemetryStandard {
gps.ground_speed = ground_speed * 1.0e-2;
gps.course = course * 2;
gps.climb_rate = climb_rate * 1.0e-2;
- gps.hdop = hdop;
- gps.vdop = vdop;
+ gps.pdop = pdop / 10.0;
+ gps.hdop = hdop / 10.0;
+ gps.vdop = vdop / 10.0;
}
state.set_temp_gps();
}
diff --git a/altoslib/AltosTelemetryMap.java b/altoslib/AltosTelemetryMap.java
index 8d0de355..758311eb 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_4;
+package org.altusmetrum.altoslib_5;
import java.text.*;
import java.util.HashMap;
diff --git a/altoslib/AltosTelemetryMegaData.java b/altoslib/AltosTelemetryMegaData.java
index fac5695f..d949c02f 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_4;
+package org.altusmetrum.altoslib_5;
public class AltosTelemetryMegaData extends AltosTelemetryStandard {
int state;
@@ -31,12 +31,12 @@ public class AltosTelemetryMegaData extends AltosTelemetryStandard {
int acceleration;
int speed;
- int height;
+ int height_16;
public AltosTelemetryMegaData(int[] bytes) {
super(bytes);
- state = int8(5);
+ state = uint8(5);
v_batt = int16(6);
v_pyro = int16(8);
@@ -44,7 +44,7 @@ public class AltosTelemetryMegaData extends AltosTelemetryStandard {
sense = new int[6];
for (int i = 0; i < 6; i++) {
- sense[i] = int8(10 + i) << 4;
+ sense[i] = uint8(10 + i) << 4;
sense[i] |= sense[i] >> 8;
}
@@ -55,7 +55,8 @@ public class AltosTelemetryMegaData extends AltosTelemetryStandard {
acceleration = int16(26);
speed = int16(28);
- height = int16(30);
+
+ height_16 = int16(30);
}
public void update_state(AltosState state) {
@@ -79,7 +80,13 @@ public class AltosTelemetryMegaData extends AltosTelemetryStandard {
state.set_ground_pressure(ground_pres);
state.set_accel_g(accel_plus_g, accel_minus_g);
- state.set_kalman(height, speed/16.0, acceleration / 16.0);
+ /* Fill in the high bits of height from recent GPS
+ * data if available, otherwise guess using the
+ * previous kalman height
+ */
+
+ state.set_kalman(extend_height(state, height_16),
+ speed/16.0, acceleration / 16.0);
}
}
diff --git a/altoslib/AltosTelemetryMegaSensor.java b/altoslib/AltosTelemetryMegaSensor.java
index 9e73bc4e..1b568c88 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_4;
+package org.altusmetrum.altoslib_5;
public class AltosTelemetryMegaSensor extends AltosTelemetryStandard {
int accel;
diff --git a/altoslib/AltosTelemetryMetrumData.java b/altoslib/AltosTelemetryMetrumData.java
index 96617306..3377d969 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_4;
+package org.altusmetrum.altoslib_5;
public class AltosTelemetryMetrumData extends AltosTelemetryStandard {
diff --git a/altoslib/AltosTelemetryMetrumSensor.java b/altoslib/AltosTelemetryMetrumSensor.java
index e7055404..beab6da9 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_4;
+package org.altusmetrum.altoslib_5;
public class AltosTelemetryMetrumSensor extends AltosTelemetryStandard {
@@ -27,7 +27,7 @@ public class AltosTelemetryMetrumSensor extends AltosTelemetryStandard {
int acceleration;
int speed;
- int height;
+ int height_16;
int v_batt;
int sense_a;
@@ -43,7 +43,7 @@ public class AltosTelemetryMetrumSensor extends AltosTelemetryStandard {
acceleration = int16(14);
speed = int16(16);
- height = int16(18);
+ height_16 = int16(18);
v_batt = int16(20);
sense_a = int16(22);
@@ -59,7 +59,8 @@ public class AltosTelemetryMetrumSensor extends AltosTelemetryStandard {
state.set_pressure(pres);
state.set_temperature(temp/100.0);
- state.set_kalman(height, speed/16.0, acceleration/16.0);
+ state.set_kalman(extend_height(state, height_16),
+ speed/16.0, acceleration/16.0);
state.set_battery_voltage(AltosConvert.mega_battery_voltage(v_batt));
diff --git a/altoslib/AltosTelemetryMini.java b/altoslib/AltosTelemetryMini.java
index fbfaff8e..221bb67c 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_4;
+package org.altusmetrum.altoslib_5;
public class AltosTelemetryMini extends AltosTelemetryStandard {
diff --git a/altoslib/AltosTelemetryRaw.java b/altoslib/AltosTelemetryRaw.java
index 0dca62aa..2a535e84 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_4;
+package org.altusmetrum.altoslib_5;
public class AltosTelemetryRaw extends AltosTelemetryStandard {
public AltosTelemetryRaw(int[] bytes) {
diff --git a/altoslib/AltosTelemetryReader.java b/altoslib/AltosTelemetryReader.java
index 3dff661a..7539452d 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_4;
+package org.altusmetrum.altoslib_5;
import java.text.*;
import java.io.*;
@@ -26,11 +26,19 @@ public class AltosTelemetryReader extends AltosFlightReader {
AltosLog log;
double frequency;
int telemetry;
+ int telemetry_rate;
AltosState state = null;
+ AltosFlightReader stacked;
LinkedBlockingQueue<AltosLine> telem;
public AltosState read() throws InterruptedException, ParseException, AltosCRCException, IOException {
+ if (stacked != null) {
+ state = stacked.read();
+ if (state != null)
+ return state;
+ stacked = null;
+ }
AltosLine l = telem.take();
if (l.line == null)
throw new IOException("IO error");
@@ -52,6 +60,12 @@ public class AltosTelemetryReader extends AltosFlightReader {
}
public void close(boolean interrupted) {
+
+ if (stacked != null) {
+ stacked.close(interrupted);
+ stacked = null;
+ }
+
link.remove_monitor(telem);
log.close();
try {
@@ -92,6 +106,23 @@ public class AltosTelemetryReader extends AltosFlightReader {
}
}
+ public boolean supports_telemetry_rate(int telemetry_rate) {
+ try {
+ /* Version 1.4.1.1 supports all rates, older versions don't */
+ if (link.config_data().compare_version("1.4.1.1") >= 0)
+ return true;
+
+ if (telemetry_rate == AltosLib.ao_telemetry_rate_38400)
+ return true;
+ else
+ return false;
+ } catch (InterruptedException ie) {
+ return false;
+ } catch (TimeoutException te) {
+ return true;
+ }
+ }
+
public void save_frequency() {
AltosPreferences.set_frequency(link.serial, frequency);
}
@@ -105,6 +136,15 @@ public class AltosTelemetryReader extends AltosFlightReader {
AltosPreferences.set_telemetry(link.serial, telemetry);
}
+ public void set_telemetry_rate(int in_telemetry_rate) {
+ telemetry_rate = in_telemetry_rate;
+ link.set_telemetry_rate(telemetry_rate);
+ }
+
+ public void save_telemetry_rate() {
+ AltosPreferences.set_telemetry_rate(link.serial, telemetry_rate);
+ }
+
public void set_monitor(boolean monitor) {
link.set_monitor(monitor);
}
@@ -121,9 +161,10 @@ public class AltosTelemetryReader extends AltosFlightReader {
return link.monitor_battery();
}
- public AltosTelemetryReader (AltosLink in_link)
+ public AltosTelemetryReader (AltosLink in_link, AltosFlightReader in_stacked)
throws IOException, InterruptedException, TimeoutException {
link = in_link;
+ stacked = in_stacked;
boolean success = false;
try {
log = new AltosLog(link);
@@ -133,6 +174,8 @@ public class AltosTelemetryReader extends AltosFlightReader {
set_frequency(frequency);
telemetry = AltosPreferences.telemetry(link.serial);
set_telemetry(telemetry);
+ telemetry_rate = AltosPreferences.telemetry_rate(link.serial);
+ set_telemetry_rate(telemetry_rate);
link.add_monitor(telem);
success = true;
} finally {
@@ -140,4 +183,22 @@ public class AltosTelemetryReader extends AltosFlightReader {
close(true);
}
}
+
+ private static AltosFlightReader existing_data(AltosLink link) {
+ if (link == null)
+ return null;
+
+ File file = AltosPreferences.logfile(link.serial);
+ if (file != null) {
+ AltosStateIterable iterable = AltosStateIterable.iterable(file);
+ if (iterable != null)
+ return new AltosReplayReader(iterable.iterator(), file, false);
+ }
+ return null;
+ }
+
+ public AltosTelemetryReader(AltosLink link)
+ throws IOException, InterruptedException, TimeoutException {
+ this(link, existing_data(link));
+ }
}
diff --git a/altoslib/AltosTelemetrySatellite.java b/altoslib/AltosTelemetrySatellite.java
index d611e88c..d1cdaf6d 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_4;
+package org.altusmetrum.altoslib_5;
public class AltosTelemetrySatellite extends AltosTelemetryStandard {
int channels;
diff --git a/altoslib/AltosTelemetrySensor.java b/altoslib/AltosTelemetrySensor.java
index ad4d9283..fc3fe858 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_4;
+package org.altusmetrum.altoslib_5;
public class AltosTelemetrySensor extends AltosTelemetryStandard {
diff --git a/altoslib/AltosTelemetryStandard.java b/altoslib/AltosTelemetryStandard.java
index 23ae9d21..f4dfd8e9 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_4;
+package org.altusmetrum.altoslib_5;
public abstract class AltosTelemetryStandard extends AltosTelemetry {
int[] bytes;
diff --git a/altoslib/AltosTemperature.java b/altoslib/AltosTemperature.java
index 5fa71b86..e654fada 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_4;
+package org.altusmetrum.altoslib_5;
public class AltosTemperature extends AltosUnits {
diff --git a/altoslib/AltosUnits.java b/altoslib/AltosUnits.java
index d29cfae7..dbdb7882 100644
--- a/altoslib/AltosUnits.java
+++ b/altoslib/AltosUnits.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_4;
+package org.altusmetrum.altoslib_5;
public abstract class AltosUnits {
diff --git a/altoslib/AltosUnitsListener.java b/altoslib/AltosUnitsListener.java
index ca6faafd..664aed67 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_4;
+package org.altusmetrum.altoslib_5;
public interface AltosUnitsListener {
public void units_changed(boolean imperial_units);
diff --git a/altoslib/AltosVoltage.java b/altoslib/AltosVoltage.java
index 351bf115..22bd1aee 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_4;
+package org.altusmetrum.altoslib_5;
public class AltosVoltage extends AltosUnits {
diff --git a/altoslib/AltosWriter.java b/altoslib/AltosWriter.java
index c3479a93..fb208b02 100644
--- a/altoslib/AltosWriter.java
+++ b/altoslib/AltosWriter.java
@@ -15,12 +15,10 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_4;
+package org.altusmetrum.altoslib_5;
public interface AltosWriter {
- public void write(AltosState state);
-
public void write(AltosStateIterable states);
public void close();
diff --git a/altoslib/Makefile.am b/altoslib/Makefile.am
index e81418bb..0ad9b7da 100644
--- a/altoslib/Makefile.am
+++ b/altoslib/Makefile.am
@@ -131,7 +131,7 @@ JAR=altoslib_$(ALTOSLIB_VERSION).jar
all-local: $(JAR)
clean-local:
- -rm -rf bin $(JAR)
+ -rm -rf $(JAVAROOT) altoslib_*.jar
install-altoslibJAVA: $(JAR)
@$(NORMAL_INSTALL)