summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2013-04-15 23:14:22 -0700
committerKeith Packard <keithp@keithp.com>2013-04-15 23:14:22 -0700
commiteba3aa949decacd5592472a3cda920aa6a06d96f (patch)
treeeba2fcbb13124da1bb51c6a34acb40254b50c0ae
parent58dd4b88fe738e005a13dfd69651853ea7f79205 (diff)
altoslib: Check for null state.gps before accessing it in eeprom records
Used to be we'd set state.gps to garbage before seeing the first GPS record; now we leave it null, which will cause crashes for code that doesn't expect it. The code for reading and replaying eeprom data was not checking and was nicely crashing as a result. Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r--altoslib/AltosEepromIterable.java10
1 files changed, 10 insertions, 0 deletions
diff --git a/altoslib/AltosEepromIterable.java b/altoslib/AltosEepromIterable.java
index bc698c80..7a8bbdea 100644
--- a/altoslib/AltosEepromIterable.java
+++ b/altoslib/AltosEepromIterable.java
@@ -131,24 +131,34 @@ public class AltosEepromIterable extends AltosRecordIterable {
case AltosLib.AO_LOG_GPS_LAT:
eeprom.seen |= AltosRecord.seen_gps_lat;
int lat32 = record.a | (record.b << 16);
+ if (state.gps == null)
+ state.gps = new AltosGPS();
state.gps.lat = (double) lat32 / 1e7;
break;
case AltosLib.AO_LOG_GPS_LON:
eeprom.seen |= AltosRecord.seen_gps_lon;
int lon32 = record.a | (record.b << 16);
+ if (state.gps == null)
+ state.gps = new AltosGPS();
state.gps.lon = (double) lon32 / 1e7;
break;
case AltosLib.AO_LOG_GPS_ALT:
+ if (state.gps == null)
+ state.gps = new AltosGPS();
state.gps.alt = record.a;
break;
case AltosLib.AO_LOG_GPS_SAT:
if (state.tick == eeprom.gps_tick) {
int svid = record.a;
int c_n0 = record.b >> 8;
+ if (state.gps == null)
+ state.gps = new AltosGPS();
state.gps.add_sat(svid, c_n0);
}
break;
case AltosLib.AO_LOG_GPS_DATE:
+ if (state.gps == null)
+ state.gps = new AltosGPS();
state.gps.year = (record.a & 0xff) + 2000;
state.gps.month = record.a >> 8;
state.gps.day = record.b & 0xff;