+commit 0cd443d5e55b2c3b97ecf53389ff76bc4bc6018f
+Author: Keith Packard <keithp@keithp.com>
+Date: Sun Sep 16 12:38:33 2012 -0700
+
+ Add release notes for version 1.1.1
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit cb48dd0b03b445437f751028e8383610b65b0a68
+Author: Keith Packard <keithp@keithp.com>
+Date: Sun Sep 16 02:39:25 2012 -0700
+
+ altos: Fix telemini sdcdb init file
+
+ Set the driver source path for the debugger
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 3520bbf1ed6461d1ce7af001c529563a3cffa3c9
+Author: Keith Packard <keithp@keithp.com>
+Date: Sun Sep 16 00:58:20 2012 -0700
+
+ altosui: Gather Tm sensor data in Monitor Idle mode
+
+ Tm is pretty much the same as TM for the analog sensors, it's just
+ missing the accelerometr. Use the same code for constructing an
+ AltosRecord for it
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 31f5a02654cbf172beed25f4c518dfb7be8c714e
+Author: Keith Packard <keithp@keithp.com>
+Date: Fri Sep 14 16:56:04 2012 -0700
+
+ altos: Need to use 16-bit counts for ao_xmem functions
+
+ Trying to use 8-bit counts is a nice optimization which fails when the
+ count is larger than 255, as is the case with clearing the flash block
+ in the AT45 driver. This bug resulted in the inability to erase
+ flights on TeleMetrum v1.0 boards.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit b898cf0a2abf2b0478d5afc5aca030c6b4c8bd0b
+Author: Keith Packard <keithp@keithp.com>
+Date: Fri Sep 14 12:59:31 2012 -0700
+
+ altosui: Show over-ground-distance in Descent tab
+
+ Helps to know where the rocket might land.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit f36f73b2d02b72201683cf5795851034bbd6f28e
+Author: Keith Packard <keithp@keithp.com>
+Date: Fri Sep 14 12:58:54 2012 -0700
+
+ altosui: Remove debugging from KML export
+
+ Left in from testing the Eeprom export bug
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 97ab77d548964115e4b41ad5952194fcd1455c96
+Author: Keith Packard <keithp@keithp.com>
+Date: Fri Sep 14 11:13:02 2012 -0700
+
+ altosui: Fix Landed tab units
+
+ And clean up the whole flight value reporting code base. It would be
+ nice to create a separate class to make this easier; at present
+ there's a bunch of customization embedded in how values are presented
+ in each tab.
+
+ Reported by: Bdale Garbee <bdale@gag.com>
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 43e646657502f6162fa02f37fd2bd5aa3e29a1a8
+Author: Keith Packard <keithp@keithp.com>
+Date: Fri Sep 14 11:08:57 2012 -0700
+
+ altoslib: Update GPS seen_values in AltosEepromIterable
+
+ Otherwise, KML export won't ever get GPS data to write.
+
+ Reported by: Bob Brown <prefect@kloudbusters.org>
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 7b6dd9105ba36aa11d6d0ee6e0823965b9beffb9
+Author: Keith Packard <keithp@keithp.com>
+Date: Fri Sep 14 11:08:19 2012 -0700
+
+ altoslib: Remove duplicate seen_ values in AltosEepromIterable
+
+ These are defined in AltosRecord; duplicating them is not a good plan
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit eefcfa94f360f8c5a7233370d4178525bccbb22f
+Author: Bdale Garbee <bdale@gag.com>
+Date: Thu Sep 13 16:13:42 2012 -0600
+
+ add note about checking doc copyright date and revision history to Releasing
+
+commit 2441090f26c3df66a6ce48d64e64384ce9e5ef82
+Author: Keith Packard <keithp@keithp.com>
+Date: Thu Sep 13 15:12:33 2012 -0700
+
+ doc: Add revision history for 1.1. Update copyright date
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 320d90c376dccfe1599505e3b485df8d46e34bb3
+Merge: 9a7d643 2e6c6a6
+Author: Bdale Garbee <bdale@gag.com>
+Date: Thu Sep 13 15:36:37 2012 -0600
+
+ Merge branch 'master' of ssh://git.gag.com/scm/git/fw/altos
+
+commit 2e6c6a6c15a7cff9f20b70a4cf58697da1302f01
+Author: Keith Packard <keithp@keithp.com>
+Date: Thu Sep 13 00:35:27 2012 -0700
+
+ doc: Document imperial units and groundstation configuration
+
+ What it says on the tin.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 9a7d6431777ce3377b788ddac6cb9fadd53c039c
+Merge: 2439f53 9728b20
+Author: Bdale Garbee <bdale@gag.com>
+Date: Thu Sep 13 00:58:30 2012 -0600
+
+ Merge branch 'master' of ssh://git.gag.com/scm/git/fw/altos
+
+commit 9728b20a4ad9576ac1022dc9a5771f5a3eb92b3d
+Author: Keith Packard <keithp@keithp.com>
+Date: Wed Sep 12 23:56:18 2012 -0700
+
+ altosui: Exit with an error status when file processing fails
+
+ If the user provides any files on the command line, and if processing
+ them fails in some way, exit immediately with an error indication.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 0564f9b13d4e3050b0a45fc1c4f710ab2b1f9d81
+Author: Keith Packard <keithp@keithp.com>
+Date: Wed Sep 12 22:40:57 2012 -0700
+
+ altosui: Leave new_gps indication until gps value is used
+
+ During replay, AltosState may not see a new GPS value as soon as it
+ lands in the state field as additional records with the same timestamp
+ may come in after the GPS record.
+
+ Instead of resetting the new_gps indication when the new record is
+ created, wait until the new_gps indication is seen by the AltosState
+ update code and have that clear the new_gps indication.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 7e237920abb582d7ceb3e1925b11a848575ac68a
+Author: Keith Packard <keithp@keithp.com>
+Date: Wed Sep 12 21:32:25 2012 -0700
+
+ altosui: Stop downloading eeprom data on a block full of invalid data
+
+ When no valid records are found within an eeprom block, we assume that
+ no more data will be found within the entire storage area.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 2439f53ea21c84f7c510dc191dde025ada24281f
+Author: Bdale Garbee <bdale@gag.com>
+Date: Wed Sep 12 21:50:25 2012 -0600
+
+ document workaround for 'make fat' not building altoslib
+
+commit 07d9ba938f2742da1bce5d8df55cbc236207a981
+Author: Bdale Garbee <bdale@gag.com>
+Date: Wed Sep 12 19:50:07 2012 -0600
+
+ update Releasing for non-native versioning and builds on debian branch
+
+commit fe009534ce6846b6db96cac8f6c2d53ba8010d91
+Merge: 69d42b2 8ee29fe
+Author: Bdale Garbee <bdale@gag.com>
+Date: Wed Sep 12 19:49:51 2012 -0600
+
+ Merge branch 'master' of ssh://git.gag.com/scm/git/fw/altos
+
+commit 8ee29fe48771dd22a0c5428761ee53a728495d11
+Author: Keith Packard <keithp@keithp.com>
+Date: Wed Sep 12 16:07:41 2012 -0700
+
+ altosui: Serialize data access in TD config code
+
+ Setting the values was being done in the UI thread instead of the
+ Serial thread, which left the serial thread with uninitialized values
+ when it went to update the displayed value for the current
+ frequency. All fixed now.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 19e35de47157923670b1864ce7b04f8d82f3bdea
+Author: Keith Packard <keithp@keithp.com>
+Date: Wed Sep 12 16:06:59 2012 -0700
+
+ altosui: Lock access to preferences data
+
+ These are accessed by several different threads, so keep things sane
+ by just holding locks across all access.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 1b5340c2b75c500011355c4889da443c4b9c4891
+Author: Keith Packard <keithp@keithp.com>
+Date: Wed Sep 12 13:07:01 2012 -0700
+
+ altosui: Add multi-sized icons to all windows
+
+ This lets the window system pick a better size for presentation
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 3e4fc0b3953655eb720372d9b4274cd4bca19556
+Author: Tom Marble <tmarble@info9.net>
+Date: Wed Sep 12 10:05:42 2012 -0500
+
+ Reference specific dependent jars in the AltosUI launchers
+
+commit f0f4f907042e12815284abe1b63ae2d4a5a2d598
+Author: Keith Packard <keithp@keithp.com>
+Date: Wed Sep 12 02:30:59 2012 -0700
+
+ doc: Mention changes to flight data download UI
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 42bbe15512533f2d958b8219a02fbd256593092a
+Author: Keith Packard <keithp@keithp.com>
+Date: Wed Sep 12 02:26:32 2012 -0700
+
+ altosui: Initialize flight velocity to zero when reading eeprom files
+
+ Otherwise, the integration of velocity will start at MISSING and get
+ stranger. Fortunately, we know the initial velocity of the rocket when
+ sitting on the pad.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit b3c3c6eabd6837f0e72acee3906c8f71c6f0030e
+Author: Keith Packard <keithp@keithp.com>
+Date: Tue Sep 11 23:37:20 2012 -0700
+
+ altosui: Don't say a decimal point for distances in meters
+
+ Useful for distances in miles, but not meters.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 87f9a8923656f275f74cfb6c8c6a57bbe59e74f8
+Author: Keith Packard <keithp@keithp.com>
+Date: Tue Sep 11 23:36:26 2012 -0700
+
+ altosui: Initialize imperial units checkbox with correct value
+
+ Use imperial units preference instead of serial debug preference. Cut
+ & paste programming failure...
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 69d42b26223b45df4167aa3baafba100ad71baab
+Merge: 3e9078c 3fa5fbd
+Author: Bdale Garbee <bdale@gag.com>
+Date: Wed Sep 12 00:26:21 2012 -0600
+
+ Merge branch 'master' of ssh://git.gag.com/scm/git/fw/altos
+
+commit 3fa5fbdfd1ab257028f272fbc32759b39608ddaf
+Author: Keith Packard <keithp@keithp.com>
+Date: Tue Sep 11 23:04:19 2012 -0700
+
+ Clean up Windows event handles on com port close
+
+ This avoids having to wait for the receiver to timeout before we can
+ open the same com port again.
+
+ This patch also adds a bit more debugging -- it prints Windows error
+ messages to stdout along with the file/line where the error was generated.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 1a154ce0b9fc3ea360d6bc7e17d6debb2da94438
+Author: Keith Packard <keithp@keithp.com>
+Date: Tue Sep 11 22:03:17 2012 -0700
+
+ Include AltosLib.jar in windows install
+
+ Otherwise, altosui doesn't do much.
+
+ Signed-off-by: Keith Packard <keithp@keithp.com>
+
+commit 3e9078cb1077e7ad0d845f10c2ad0a007df76d29
+Author: Bdale Garbee <bdale@gag.com>
+Date: Tue Sep 11 22:17:22 2012 -0600
+
+ releasing 1.1
+
+commit 4563624638884b7b2f16cd4d396c00690e045999
+Merge: 11fbcf5 e5a55db
+Author: Tom Marble <tmarble@info9.net>
+Date: Tue Sep 11 22:50:18 2012 -0500
+
+ Merge branch 'master' of ssh://git.gag.com/scm/git/fw/altos
+
+commit 11fbcf5e30e0cd09f2d6b448911d2ef62b7f29c7
+Author: Tom Marble <tmarble@info9.net>
+Date: Tue Sep 11 22:48:04 2012 -0500
+
+ Added the feature to AC to default --with-android to $ANDROID_SDK (if set)
+ Fixed typos in altosui/Makefile.am (had removed JCOMMON, but it's from AC)
+ Jenkins changes:
+ - added android sdk
+ - will now record artifacts: altoslib/AltosLib.jar,altosui/altosui.jar,**/*.apk
+
commit e5a55dbf265354e7c94be3e2be53c2d5c8fba056
Author: Keith Packard <keithp@keithp.com>
Date: Tue Sep 11 15:53:36 2012 -0700
These are Bdale's notes on how to do a release.
git checkout master
+
+ - make sure there is a doc/release-notes-<version>.xsl
+ - make sure that doc/altusmetrum.xsl has the right copyright year,
+ and add release to the revision history at the front (release notes
+ will be pulled in automatically)
+
- update the version in configure.ac
git log > ChangeLog
git commit -a
git commit -n debian/changelog -m "update changelog for Debian build"
- git-buildpackage --git-no-pristine-tar
- pristine-tar commit ../build-area/altos/altos_<version>.orig.tar.gz
+ - if this is a -1 release, then
+ git-buildpackage --git-no-pristine-tar
+ pristine-tar commit \
+ ../build-area/altos/altos_<version>.orig.tar.gz \
+ branch-<version>
+ else if this is not a -1 release
+ git-buildpackage
+
git tag debian/<version>
- at this point we have packages in ~/debian/build-area/altos, now
- copy the relevant release notes file from doc/ to
/home/bdale/web/altusmetrum/AltOS/releases/<rev>
- - make sure that doc/altusmetrum.xsl has the right copyright year,
- and add release to the revision history at the front (release notes
- will be pulled in automatically)
-
- go edit ~/web/altusmetrum/AltOS/releases/<rev>.mdwn to include
release date and explicit ref to dir contents so the AltOS page
shows versioned links, commit and push
this pushes fresh documents to the web site
sudo debian/rules clean
- git push
+ git push origin master branch-1.1 debian
git push --tags
push commits and leave the build tree in an uncluttered state
public class AltosEepromIterable extends AltosRecordIterable {
- static final int seen_flight = 1;
- static final int seen_sensor = 2;
- static final int seen_temp_volt = 4;
- static final int seen_deploy = 8;
- static final int seen_gps_time = 16;
- static final int seen_gps_lat = 32;
- static final int seen_gps_lon = 64;
-
- static final int seen_basic = seen_flight|seen_sensor;
+ static final int seen_basic = AltosRecord.seen_flight|AltosRecord.seen_sensor;
boolean has_accel;
boolean has_gps;
state.tick = record.tick;
switch (record.cmd) {
case AltosLib.AO_LOG_FLIGHT:
- eeprom.seen |= seen_flight;
+ eeprom.seen |= AltosRecord.seen_flight;
state.ground_accel = record.a;
state.flight_accel = record.a;
state.flight = record.b;
state.flight_pres = (state.flight_pres * 15 + state.pres) / 16;
}
state.flight_accel = (state.flight_accel * 15 + state.accel) / 16;
- if ((eeprom.seen & seen_sensor) == 0)
+ if ((eeprom.seen & AltosRecord.seen_sensor) == 0)
eeprom.sensor_tick = record.tick - 1;
state.flight_vel += (state.accel_plus_g - state.accel) * (record.tick - eeprom.sensor_tick);
- eeprom.seen |= seen_sensor;
+ eeprom.seen |= AltosRecord.seen_sensor;
eeprom.sensor_tick = record.tick;
has_accel = true;
break;
eeprom.n_pad_samples++;
state.ground_pres = state.pres;
}
- eeprom.seen |= seen_sensor;
+ eeprom.seen |= AltosRecord.seen_sensor;
break;
case AltosLib.AO_LOG_TEMP_VOLT:
state.temp = record.a;
state.batt = record.b;
- eeprom.seen |= seen_temp_volt;
+ eeprom.seen |= AltosRecord.seen_temp_volt;
break;
case AltosLib.AO_LOG_DEPLOY:
state.drogue = record.a;
state.main = record.b;
- eeprom.seen |= seen_deploy;
+ eeprom.seen |= AltosRecord.seen_deploy;
has_ignite = true;
break;
case AltosLib.AO_LOG_STATE:
break;
case AltosLib.AO_LOG_GPS_TIME:
eeprom.gps_tick = state.tick;
+ eeprom.seen |= AltosRecord.seen_gps_time;
AltosGPS old = state.gps;
state.gps = new AltosGPS();
has_gps = true;
break;
case AltosLib.AO_LOG_GPS_LAT:
+ eeprom.seen |= AltosRecord.seen_gps_lat;
int lat32 = record.a | (record.b << 16);
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);
state.gps.lon = (double) lon32 / 1e7;
break;
return rssi;
}
+ boolean has_sensor_tm(AltosConfigData config_data) {
+ return config_data.product.startsWith("TeleMetrum") || config_data.product.startsWith("TeleMini");
+ }
+
+ boolean has_sensor_mm(AltosConfigData config_data) {
+ return config_data.product.startsWith("MegaMetrum");
+ }
+
+ boolean has_gps(AltosConfigData config_data) {
+ return config_data.product.startsWith("TeleMetrum") || config_data.product.startsWith("MegaMetrum");
+ }
+
+ AltosRecord sensor_mm(AltosConfigData config_data) throws InterruptedException, TimeoutException {
+ AltosRecordMM record_mm = new AltosRecordMM();
+ AltosSensorMM sensor = new AltosSensorMM(link);
+ AltosMs5607 ms5607 = new AltosMs5607Query(link);
+ AltosIMU imu = new AltosIMUQuery(link);
+
+ record_mm.accel_plus_g = config_data.accel_cal_plus;
+ record_mm.accel_minus_g = config_data.accel_cal_minus;
+
+ record_mm.ground_accel = sensor.accel;
+ record_mm.accel = sensor.accel;
+ record_mm.ground_pres = ms5607.pa;
+ record_mm.pres = ms5607.pa;
+ record_mm.temp = ms5607.cc;
+
+ record_mm.v_batt = sensor.v_batt;
+ record_mm.v_pyro = sensor.v_pyro;
+ record_mm.sense = sensor.sense;
+
+ record_mm.imu = imu;
+
+ return record_mm;
+ }
+
void update_state() throws InterruptedException, TimeoutException {
AltosRecord record = null;
} else
link.flush_input();
config_data = new AltosConfigData(link);
- if (config_data.product.startsWith("TeleMetrum")) {
- record = new AltosSensorTM(link, config_data);
- } else if (config_data.product.startsWith("MegaMetrum")) {
- AltosRecordMM record_mm = new AltosRecordMM();
- AltosSensorMM sensor = new AltosSensorMM(link);
- AltosMs5607 ms5607 = new AltosMs5607Query(link);
- AltosIMU imu = new AltosIMUQuery(link);
-
- record_mm.accel_plus_g = config_data.accel_cal_plus;
- record_mm.accel_minus_g = config_data.accel_cal_minus;
- record_mm.ground_accel = sensor.accel;
- record_mm.accel = sensor.accel;
- record_mm.ground_pres = ms5607.pa;
- record_mm.pres = ms5607.pa;
- record_mm.temp = ms5607.cc;
-
- record_mm.v_batt = sensor.v_batt;
- record_mm.v_pyro = sensor.v_pyro;
- record_mm.sense = sensor.sense;
-
- record_mm.imu = imu;
-
- record = record_mm;
- } else
+ if (has_sensor_tm(config_data))
+ record = new AltosSensorTM(link, config_data);
+ else if (has_sensor_mm(config_data))
+ record = sensor_mm(config_data);
+ else
record = new AltosRecord();
- gps = new AltosGPSQuery(link, config_data);
+ if (has_gps(config_data))
+ gps = new AltosGPSQuery(link, config_data);
record.version = 0;
record.callsign = config_data.callsign;
}
void show(AltosState state, int crc_errors) {}
+
+ void show(String s) {
+ show();
+ value.setText(s);
+ }
+
+ void show(AltosUnits units, double v) {
+ show(units.show(8, v));
+ }
+
+ void show(String format, double v) {
+ show(String.format(format, v));
+ }
+
void reset() {
value.setText("");
lights.set(false);
value.setVisible(true);
}
+ void show(String s) {
+ show();
+ value.setText(s);
+ }
+
+ void show(AltosUnits units, double v) {
+ show(units.show(8, v));
+ }
+
+ void show(String format, double v) {
+ show(String.format(format, v));
+ }
+
void hide() {
label.setVisible(false);
value.setVisible(false);
class Apogee extends AscentStatus {
void show (AltosState state, int crc_errors) {
- show();
- value.setText(String.format("%4.2f V", state.drogue_sense));
+ show("%4.2f V", state.drogue_sense);
lights.set(state.drogue_sense > 3.2);
}
public Apogee (GridBagLayout layout, int y) {
class Main extends AscentStatus {
void show (AltosState state, int crc_errors) {
- show();
- value.setText(String.format("%4.2f V", state.main_sense));
+ show("%4.2f V", state.main_sense);
lights.set(state.main_sense > 3.2);
}
public Main (GridBagLayout layout, int y) {
class Lat extends AscentValue {
void show (AltosState state, int crc_errors) {
- show();
if (state.gps != null)
- value.setText(pos(state.gps.lat,"N", "S"));
+ show(pos(state.gps.lat,"N", "S"));
else
- value.setText("???");
+ show("???");
}
public Lat (GridBagLayout layout, int y) {
super (layout, y, "Latitude");
class Lon extends AscentValue {
void show (AltosState state, int crc_errors) {
- show();
if (state.gps != null)
- value.setText(pos(state.gps.lon,"E", "W"));
+ show(pos(state.gps.lon,"E", "W"));
else
- value.setText("???");
+ show("???");
}
public Lon (GridBagLayout layout, int y) {
super (layout, y, "Longitude");
lights.setVisible(true);
}
+ void show(String s) {
+ show();
+ value.setText(s);
+ }
+
+ void show(String format, double value) {
+ show(String.format(format, value));
+ }
+
void hide() {
label.setVisible(false);
value.setVisible(false);
value.setVisible(false);
}
- void show(AltosUnits units, double v) {
- value.setText(units.show(8, v));
+ void show(String v) {
+ show();
+ value.setText(v);
}
- void show(String format, double v) {
- value.setText(String.format(format, v));
+ void show(AltosUnits units, double v) {
+ show(units.show(8, v));
}
- void show(String v) {
- value.setText(v);
+ void show(String format, double v) {
+ show(String.format(format, v));
}
void set_font() {
Lon lon;
+ class Distance extends DescentValue {
+ void show(AltosState state, int crc_errors) {
+ show(AltosConvert.distance, state.from_pad.distance);
+ }
+
+ public Distance (GridBagLayout layout, int x, int y) {
+ super(layout, x, y, "Ground Distance");
+ }
+ }
+
+ Distance distance;
+
+
class Apogee extends DescentStatus {
void show (AltosState state, int crc_errors) {
- show();
- value.setText(String.format("%4.2f V", state.drogue_sense));
+ show("%4.2f V", state.drogue_sense);
lights.set(state.drogue_sense > 3.2);
}
public Apogee (GridBagLayout layout, int y) {
class Main extends DescentStatus {
void show (AltosState state, int crc_errors) {
- show();
- value.setText(String.format("%4.2f V", state.main_sense));
+ show("%4.2f V", state.main_sense);
lights.set(state.main_sense > 3.2);
}
public Main (GridBagLayout layout, int y) {
speed.reset();
bearing.reset();
range.reset();
+ distance.reset();
elevation.reset();
main.reset();
apogee.reset();
speed.set_font();
bearing.set_font();
range.set_font();
+ distance.set_font();
elevation.set_font();
main.set_font();
apogee.set_font();
if (state.gps != null && state.gps.connected) {
bearing.show(state, crc_errors);
range.show(state, crc_errors);
+ distance.show(state, crc_errors);
elevation.show(state, crc_errors);
lat.show(state, crc_errors);
lon.show(state, crc_errors);
} else {
bearing.hide();
range.hide();
+ distance.hide();
elevation.hide();
lat.hide();
lon.hide();
elevation = new Elevation(layout, 0, 1);
range = new Range(layout, 2, 1);
bearing = new Bearing(layout, 0, 2);
- lat = new Lat(layout, 0, 3);
- lon = new Lon(layout, 2, 3);
+ distance = new Distance(layout, 0, 3);
+ lat = new Lat(layout, 0, 4);
+ lon = new Lon(layout, 2, 4);
- apogee = new Apogee(layout, 4);
- main = new Main(layout, 5);
+ apogee = new Apogee(layout, 5);
+ main = new Main(layout, 6);
}
}
if (gps == null)
return;
+
if ((record.seen & (AltosRecord.seen_flight)) == 0)
return;
if ((record.seen & (AltosRecord.seen_gps_lat)) == 0)
value.setVisible(true);
}
+ void show(String s) {
+ show();
+ value.setText(s);
+ }
+
+ void show(AltosUnits units, double v) {
+ show(units.show(8, v));
+ }
+
+ void show(String format, double v) {
+ show(String.format(format, v));
+ }
+
public void set_font() {
label.setFont(Altos.label_font);
value.setFont(Altos.value_font);
value.setVisible(false);
}
- void show(String format, double v) {
- show();
- value.setText(String.format(format, v));
- }
-
-
public LandedValue (GridBagLayout layout, int y, String text) {
GridBagConstraints c = new GridBagConstraints();
c.weighty = 1;
class Lat extends LandedValue {
void show (AltosState state, int crc_errors) {
- show();
if (state.gps != null && state.gps.connected)
- value.setText(pos(state.gps.lat,"N", "S"));
+ show(pos(state.gps.lat,"N", "S"));
else
- value.setText("???");
+ show("???");
}
public Lat (GridBagLayout layout, int y) {
super (layout, y, "Latitude");
void show (AltosState state, int crc_errors) {
show();
if (state.gps != null && state.gps.connected)
- value.setText(pos(state.gps.lon,"E", "W"));
+ show(pos(state.gps.lon,"E", "W"));
else
- value.setText("???");
+ show("???");
}
public Lon (GridBagLayout layout, int y) {
super (layout, y, "Longitude");
if (state.from_pad != null)
show("%3.0f°", state.from_pad.bearing);
else
- value.setText("???");
+ show("???");
}
public Bearing (GridBagLayout layout, int y) {
super (layout, y, "Bearing");
void show (AltosState state, int crc_errors) {
show();
if (state.from_pad != null)
- show("%6.0f m", state.from_pad.distance);
+ show(AltosConvert.distance, state.from_pad.distance);
else
- value.setText("???");
+ show("???");
}
public Distance (GridBagLayout layout, int y) {
super (layout, y, "Distance");
class Height extends LandedValue {
void show (AltosState state, int crc_errors) {
- show("%6.0f m", state.max_height);
+ show(AltosConvert.height, state.max_height);
}
public Height (GridBagLayout layout, int y) {
super (layout, y, "Maximum Height");
class Speed extends LandedValue {
void show (AltosState state, int crc_errors) {
- show("%6.0f m/s", state.max_speed);
+ show(AltosConvert.speed, state.max_speed);
}
public Speed (GridBagLayout layout, int y) {
super (layout, y, "Maximum Speed");
class Accel extends LandedValue {
void show (AltosState state, int crc_errors) {
- show("%6.0f m/s²", state.max_acceleration);
+ show(AltosConvert.accel, state.max_acceleration);
}
public Accel (GridBagLayout layout, int y) {
super (layout, y, "Maximum Acceleration");
AltosLights lights;
void show(AltosState state, int crc_errors) {}
+
void reset() {
value.setText("");
lights.set(false);
lights.setVisible(true);
}
+ void show(String s) {
+ show();
+ value.setText(s);
+ }
+
+ void show(String format, double value) {
+ show(String.format(format, value));
+ }
+
+ void show(String format, int value) {
+ show(String.format(format, value));
+ }
+
public void hide() {
label.setVisible(false);
value.setVisible(false);
value.setFont(Altos.value_font);
}
+ void show(String s) {
+ show();
+ value.setText(s);
+ }
+
+ void show(AltosUnits units, double v) {
+ show(units.show(8, v));
+ }
+
+ void show(String format, double v) {
+ show(String.format(format, v));
+ }
+
void reset() {
value.setText("");
}
+
public LaunchValue (GridBagLayout layout, int y, String text) {
GridBagConstraints c = new GridBagConstraints();
c.insets = new Insets(Altos.tab_elt_pad, Altos.tab_elt_pad, Altos.tab_elt_pad, Altos.tab_elt_pad);
class Battery extends LaunchStatus {
void show (AltosState state, int crc_errors) {
- value.setText(String.format("%4.2f V", state.battery));
+ show("%4.2f V", state.battery);
lights.set(state.battery > 3.7);
}
public Battery (GridBagLayout layout, int y) {
class Apogee extends LaunchStatus {
void show (AltosState state, int crc_errors) {
- show();
- value.setText(String.format("%4.2f V", state.drogue_sense));
+ show("%4.2f V", state.drogue_sense);
lights.set(state.drogue_sense > 3.2);
}
public Apogee (GridBagLayout layout, int y) {
class Main extends LaunchStatus {
void show (AltosState state, int crc_errors) {
- show();
- value.setText(String.format("%4.2f V", state.main_sense));
+ show("%4.2f V", state.main_sense);
lights.set(state.main_sense > 3.2);
}
public Main (GridBagLayout layout, int y) {
class LoggingReady extends LaunchStatus {
void show (AltosState state, int crc_errors) {
- show();
if (state.data.flight != 0) {
if (state.data.state <= Altos.ao_flight_pad)
- value.setText("Ready to record");
+ show("Ready to record");
else if (state.data.state < Altos.ao_flight_landed)
- value.setText("Recording data");
+ show("Recording data");
else
- value.setText("Recorded data");
+ show("Recorded data");
}
else
- value.setText("Storage full");
+ show("Storage full");
lights.set(state.data.flight != 0);
}
public LoggingReady (GridBagLayout layout, int y) {
class GPSLocked extends LaunchStatus {
void show (AltosState state, int crc_errors) {
- show();
- value.setText(String.format("%4d sats", state.gps.nsat));
+ show("%4d sats", state.gps.nsat);
lights.set(state.gps.locked && state.gps.nsat >= 4);
}
public GPSLocked (GridBagLayout layout, int y) {
class GPSReady extends LaunchStatus {
void show (AltosState state, int crc_errors) {
- show();
if (state.gps_ready)
- value.setText("Ready");
+ show("Ready");
else
- value.setText(String.format("Waiting %d", state.gps_waiting));
+ show("Waiting %d", state.gps_waiting);
lights.set(state.gps_ready);
}
public GPSReady (GridBagLayout layout, int y) {
class PadLat extends LaunchValue {
void show (AltosState state, int crc_errors) {
- show();
- value.setText(pos(state.pad_lat,"N", "S"));
+ show(pos(state.pad_lat,"N", "S"));
}
public PadLat (GridBagLayout layout, int y) {
super (layout, y, "Pad Latitude");
class PadLon extends LaunchValue {
void show (AltosState state, int crc_errors) {
- show();
- value.setText(pos(state.pad_lon,"E", "W"));
+ show(pos(state.pad_lon,"E", "W"));
}
public PadLon (GridBagLayout layout, int y) {
super (layout, y, "Pad Longitude");
class PadAlt extends LaunchValue {
void show (AltosState state, int crc_errors) {
- value.setText(String.format("%4.0f m", state.pad_alt));
+ show("%4.0f m", state.pad_alt);
}
public PadAlt (GridBagLayout layout, int y) {
super (layout, y, "Pad Altitude");
dnl Process this file with autoconf to create configure.
AC_PREREQ(2.57)
-AC_INIT([altos], 1.1)
+AC_INIT([altos], 1.1.1)
AC_CONFIG_SRCDIR([src/core/ao.h])
AM_INIT_AUTOMAKE([foreign dist-bzip2])
AM_MAINTAINER_MODE
release-notes-0.9.html \
release-notes-0.9.2.html \
release-notes-1.0.1.html \
+ release-notes-1.1.1.html \
release-notes-1.1.html
RELNOTES_XSL=$(RELNOTES:.html=.xsl)
</para>
</legalnotice>
<revhistory>
+ <revision>
+ <revnumber>1.1.1</revnumber>
+ <date>16 September 2012</date>
+ <revremark>
+ Updated for software version 1.1.1 Version 1.1.1 fixes a few
+ bugs found in version 1.1.
+ </revremark>
+ </revision>
<revision>
<revnumber>1.1</revnumber>
<date>13 September 2012</date>
be below 10m/s when under the main parachute in a dual-deploy flight.
</para>
<para>
- For TeleMetrum altimeters, you can locate the rocket in the sky
- using the elevation and
- bearing information to figure out where to look. Elevation is
- in degrees above the horizon. Bearing is reported in degrees
- relative to true north. Range can help figure out how big the
- rocket will appear. Note that all of these values are relative
- to the pad location. If the elevation is near 90°, the rocket
- is over the pad, not over you.
+ For TeleMetrum altimeters, you can locate the rocket in the
+ sky using the elevation and bearing information to figure
+ out where to look. Elevation is in degrees above the
+ horizon. Bearing is reported in degrees relative to true
+ north. Range can help figure out how big the rocket will
+ appear. Ground Distance shows how far it is to a point
+ directly under the rocket and can help figure out where the
+ rocket is likely to land. Note that all of these values are
+ relative to the pad location. If the elevation is near 90°,
+ the rocket is over the pad, not over you.
</para>
<para>
Finally, the igniter voltages are reported in this tab as
<appendix
xmlns:xi="http://www.w3.org/2001/XInclude">
<title>Release Notes</title>
+ <xi:include href="release-notes-1.1.1.xsl" xpointer="xpointer(/article/*)"/>
<xi:include href="release-notes-1.1.xsl" xpointer="xpointer(/article/*)"/>
<xi:include href="release-notes-1.0.1.xsl" xpointer="xpointer(/article/*)"/>
<xi:include href="release-notes-0.9.2.xsl" xpointer="xpointer(/article/*)"/>
--- /dev/null
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+"/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd">
+
+<article>
+ <para>
+ Version 1.1.1 is a bug-fix release. It fixes a couple of bugs in
+ AltosUI and one firmware bug that affects TeleMetrum version 1.0
+ boards. Thanks to Bob Brown for help diagnosing the Google Earth
+ file export issue, and for suggesting the addition of the Ground
+ Distance value in the Descent tab.
+ </para>
+ <para>
+ AltOS Firmware Changes
+ <itemizedlist>
+ <listitem>
+ TeleMetrum v1.0 boards use the AT45DB081D flash memory part to
+ store flight data, which is different from later TeleMetrum
+ boards. The AltOS v1.1 driver for this chip couldn't erase
+ memory, leaving it impossible to delete flight data or update
+ configuration values. This bug doesn't affect newer TeleMetrum
+ boards, and it doesn't affect the safety of rockets flying
+ version 1.1 firmware.
+ </listitem>
+ </itemizedlist>
+ </para>
+ <para>
+ AltosUI Changes
+ <itemizedlist>
+ <listitem>
+ Creating a Google Earth file (KML) from on-board flight data
+ (EEPROM) would generate an empty file. The code responsible
+ for reading the EEPROM file wasn't ever setting the GPS valid
+ bits, and so the KML export code thought there was no GPS data
+ in the file.
+ </listitem>
+ <listitem>
+ The “Landed” tab was displaying all values in metric units,
+ even when AltosUI was configured to display imperial
+ units. Somehow I just missed this tab when doing the units stuff.
+ </listitem>
+ <listitem>
+ The “Descent” tab displays the range to the rocket, which is a
+ combination of the over-the-ground distance to the rockets
+ current latitude/longitude and the height of the rocket. As
+ such, it's useful for knowing how far away the rocket is, but
+ difficult to use when estimating where the rocket might
+ eventually land. A new “Ground Distance” field has been added
+ which displays the distance to a spot right underneath the
+ rocket.
+ </listitem>
+ <listitem>
+ Sensor data wasn't being displayed for TeleMini flight
+ computers in Monitor Idle mode, including things like battery
+ voltage. The code that picked which kinds of data to fetch
+ from the flight computer was missing a check for TeleMini when
+ deciding whether to fetch the analog sensor data.
+ </listitem>
+ </itemizedlist>
+ </para>
+</article>
/* ao_string.c */
void
-_ao_xmemcpy(__xdata void *dst, __xdata void *src, uint8_t count);
+_ao_xmemcpy(__xdata void *dst, __xdata void *src, uint16_t count);
#define ao_xmemcpy(d,s,c) _ao_xmemcpy(d,s,c)
void
-_ao_xmemset(__xdata void *dst, uint8_t value, uint8_t count);
+_ao_xmemset(__xdata void *dst, uint8_t value, uint16_t count);
#define ao_xmemset(d,v,c) _ao_xmemset(d,v,c)
int8_t
-_ao_xmemcmp(__xdata void *a, __xdata void *b, uint8_t count);
+_ao_xmemcmp(__xdata void *a, __xdata void *b, uint16_t count);
#define ao_xmemcmp(d,s,c) _ao_xmemcmp((d), (s), (c))
#include "ao.h"
void
-_ao_xmemcpy(__xdata void *dst, __xdata void *src, uint8_t count)
+_ao_xmemcpy(__xdata void *dst, __xdata void *src, uint16_t count)
{
while (count--) {
*(__xdata uint8_t *) dst = *(__xdata uint8_t *) src;
}
void
-_ao_xmemset(__xdata void *dst, uint8_t v, uint8_t count)
+_ao_xmemset(__xdata void *dst, uint8_t v, uint16_t count)
{
while (count--) {
*(__xdata uint8_t *) dst = v;
}
int8_t
-_ao_xmemcmp(__xdata void *a, __xdata void *b, uint8_t count)
+_ao_xmemcmp(__xdata void *a, __xdata void *b, uint16_t count)
{
while (count--) {
int8_t d = *(__xdata int8_t *) a - *(__xdata int8_t *) b;
---directory=..
+--directory=../cc1111:../product:../core:../drivers:.
+