Merge branch 'master' of ssh://git.gag.com/scm/git/fw/altos
authorBdale Garbee <bdale@gag.com>
Wed, 25 Jun 2014 03:17:53 +0000 (21:17 -0600)
committerBdale Garbee <bdale@gag.com>
Wed, 25 Jun 2014 03:17:53 +0000 (21:17 -0600)
300 files changed:
Makefile.am
altosdroid/src/org/altusmetrum/AltosDroid/AltosBluetooth.java
altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java
altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferences.java
altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java
altosdroid/src/org/altusmetrum/AltosDroid/AltosVoice.java
altosdroid/src/org/altusmetrum/AltosDroid/TabAscent.java
altosdroid/src/org/altusmetrum/AltosDroid/TabDescent.java
altosdroid/src/org/altusmetrum/AltosDroid/TabLanded.java
altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java
altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java
altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java
altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java
altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java
altoslib/AltosAccel.java
altoslib/AltosCRCException.java
altoslib/AltosCSV.java
altoslib/AltosCompanion.java
altoslib/AltosConfigData.java
altoslib/AltosConfigDataException.java
altoslib/AltosConfigValues.java
altoslib/AltosConvert.java
altoslib/AltosDebug.java
altoslib/AltosDistance.java
altoslib/AltosEeprom.java
altoslib/AltosEepromChunk.java
altoslib/AltosEepromDownload.java
altoslib/AltosEepromFile.java
altoslib/AltosEepromGPS.java
altoslib/AltosEepromHeader.java
altoslib/AltosEepromIterable.java
altoslib/AltosEepromList.java
altoslib/AltosEepromLog.java
altoslib/AltosEepromMega.java
altoslib/AltosEepromMetrum2.java
altoslib/AltosEepromMini.java
altoslib/AltosEepromMonitor.java
altoslib/AltosEepromTM.java
altoslib/AltosEepromTm.java
altoslib/AltosFile.java
altoslib/AltosFlash.java
altoslib/AltosFlashListener.java
altoslib/AltosFlightReader.java
altoslib/AltosFlightStats.java
altoslib/AltosFrequency.java
altoslib/AltosGPS.java
altoslib/AltosGPSSat.java
altoslib/AltosGreatCircle.java
altoslib/AltosHeight.java
altoslib/AltosHexfile.java
altoslib/AltosHexsym.java
altoslib/AltosIMU.java
altoslib/AltosIdle.java
altoslib/AltosIdleFetch.java
altoslib/AltosIdleMonitor.java
altoslib/AltosIdleMonitorListener.java
altoslib/AltosIgnite.java
altoslib/AltosKML.java
altoslib/AltosLatitude.java
altoslib/AltosLib.java
altoslib/AltosLine.java
altoslib/AltosLink.java
altoslib/AltosListenerState.java
altoslib/AltosLocation.java
altoslib/AltosLog.java
altoslib/AltosLongitude.java
altoslib/AltosMag.java
altoslib/AltosMma655x.java
altoslib/AltosMs5607.java
altoslib/AltosNoSymbol.java
altoslib/AltosOrient.java
altoslib/AltosParse.java
altoslib/AltosPreferences.java
altoslib/AltosPreferencesBackend.java
altoslib/AltosProgrammer.java
altoslib/AltosPyro.java
altoslib/AltosReplayReader.java
altoslib/AltosRomconfig.java
altoslib/AltosSelfFlash.java
altoslib/AltosSensorEMini.java
altoslib/AltosSensorMM.java
altoslib/AltosSensorMega.java
altoslib/AltosSensorMetrum.java
altoslib/AltosSensorTM.java
altoslib/AltosSensorTMini.java
altoslib/AltosSpeed.java
altoslib/AltosState.java
altoslib/AltosStateIterable.java
altoslib/AltosStateUpdate.java
altoslib/AltosTelemetry.java
altoslib/AltosTelemetryConfiguration.java
altoslib/AltosTelemetryFile.java
altoslib/AltosTelemetryIterable.java
altoslib/AltosTelemetryLegacy.java
altoslib/AltosTelemetryLocation.java
altoslib/AltosTelemetryMap.java
altoslib/AltosTelemetryMegaData.java
altoslib/AltosTelemetryMegaSensor.java
altoslib/AltosTelemetryMetrumData.java
altoslib/AltosTelemetryMetrumSensor.java
altoslib/AltosTelemetryMini.java
altoslib/AltosTelemetryRaw.java
altoslib/AltosTelemetryReader.java
altoslib/AltosTelemetrySatellite.java
altoslib/AltosTelemetrySensor.java
altoslib/AltosTelemetryStandard.java
altoslib/AltosTemperature.java
altoslib/AltosUnits.java
altoslib/AltosUnitsListener.java
altoslib/AltosVoltage.java
altoslib/AltosWriter.java
altosui/.gitignore
altosui/Altos.java
altosui/AltosAscent.java
altosui/AltosCompanionInfo.java
altosui/AltosConfig.java
altosui/AltosConfigPyroUI.java
altosui/AltosConfigTD.java
altosui/AltosConfigTDUI.java
altosui/AltosConfigUI.java
altosui/AltosConfigureUI.java
altosui/AltosDescent.java
altosui/AltosFlightStatus.java
altosui/AltosFlightStatusTableModel.java
altosui/AltosFlightStatusUpdate.java
altosui/AltosFlightUI.java
altosui/AltosGraphUI.java
altosui/AltosIdleMonitorUI.java
altosui/AltosIgniteUI.java
altosui/AltosIgnitor.java
altosui/AltosLanded.java
altosui/AltosLaunch.java
altosui/AltosLaunchUI.java
altosui/AltosPad.java
altosui/AltosUI.java
altosui/AltosUIPreferencesBackend.java
altosui/Info.plist.in
altosui/Instdrv/NSIS/Includes/java.nsh [new file with mode: 0644]
altosui/Instdrv/NSIS/Includes/refresh-sh.nsh [new file with mode: 0644]
altosui/Makefile.am
altosui/altos-windows.nsi.in
altosui/altos.desktop.in [deleted file]
altosui/altusmetrum-altosui.desktop.in [new file with mode: 0644]
altosuilib/AltosBTDevice.java
altosuilib/AltosBTDeviceIterator.java
altosuilib/AltosBTKnown.java
altosuilib/AltosBTManage.java
altosuilib/AltosCSVUI.java
altosuilib/AltosConfigFreqUI.java
altosuilib/AltosDataChooser.java
altosuilib/AltosDevice.java
altosuilib/AltosDeviceDialog.java
altosuilib/AltosDeviceUIDialog.java
altosuilib/AltosDisplayThread.java
altosuilib/AltosEepromDelete.java
altosuilib/AltosEepromManage.java
altosuilib/AltosEepromMonitor.java
altosuilib/AltosEepromMonitorUI.java
altosuilib/AltosEepromSelect.java
altosuilib/AltosFlashUI.java
altosuilib/AltosFlightDisplay.java
altosuilib/AltosFlightInfoTableModel.java
altosuilib/AltosFlightStatsTable.java
altosuilib/AltosFontListener.java
altosuilib/AltosFreqList.java
altosuilib/AltosGraph.java
altosuilib/AltosGraphDataPoint.java
altosuilib/AltosGraphDataSet.java
altosuilib/AltosInfoTable.java
altosuilib/AltosLed.java
altosuilib/AltosLights.java
altosuilib/AltosPositionListener.java
altosuilib/AltosRomconfigUI.java
altosuilib/AltosScanUI.java
altosuilib/AltosSerial.java
altosuilib/AltosSerialInUseException.java
altosuilib/AltosUIAxis.java
altosuilib/AltosUIConfigure.java
altosuilib/AltosUIDataMissing.java
altosuilib/AltosUIDataPoint.java
altosuilib/AltosUIDataSet.java
altosuilib/AltosUIDialog.java
altosuilib/AltosUIEnable.java
altosuilib/AltosUIFlightTab.java
altosuilib/AltosUIFrame.java
altosuilib/AltosUIGraph.java
altosuilib/AltosUIGrapher.java
altosuilib/AltosUIIndicator.java
altosuilib/AltosUILatLon.java
altosuilib/AltosUILib.java
altosuilib/AltosUIListener.java
altosuilib/AltosUIMap.java
altosuilib/AltosUIMapCache.java
altosuilib/AltosUIMapCacheListener.java [new file with mode: 0644]
altosuilib/AltosUIMapImage.java
altosuilib/AltosUIMapLine.java
altosuilib/AltosUIMapMark.java
altosuilib/AltosUIMapPath.java
altosuilib/AltosUIMapPreload.java
altosuilib/AltosUIMapRectangle.java
altosuilib/AltosUIMapStore.java
altosuilib/AltosUIMapStoreListener.java
altosuilib/AltosUIMapTile.java
altosuilib/AltosUIMapTileListener.java
altosuilib/AltosUIMapTransform.java
altosuilib/AltosUIMapView.java
altosuilib/AltosUIMapZoomListener.java
altosuilib/AltosUIMarker.java
altosuilib/AltosUIPreferences.java
altosuilib/AltosUIPreferencesBackend.java
altosuilib/AltosUISeries.java
altosuilib/AltosUITelemetryMenu.java [new file with mode: 0644]
altosuilib/AltosUIUnitsIndicator.java
altosuilib/AltosUIVersion.java.in
altosuilib/AltosUIVoltageIndicator.java
altosuilib/AltosUSBDevice.java
altosuilib/AltosVoice.java
altosuilib/GrabNDrag.java
altosuilib/Makefile.am
altosuilib/OSXAdapter.java [new file with mode: 0755]
altusmetrum.cat
ao-bringup/test-easymini
ao-tools/Makefile.am
ao-tools/ao-test-baro/.gitignore [new file with mode: 0644]
ao-tools/ao-test-baro/Makefile.am [new file with mode: 0644]
ao-tools/ao-test-baro/ao-test-baro.1 [new file with mode: 0644]
ao-tools/ao-test-baro/ao-test-baro.c [new file with mode: 0644]
ao-tools/ao-test-flash/.gitignore [new file with mode: 0644]
ao-tools/ao-test-flash/Makefile.am [new file with mode: 0644]
ao-tools/ao-test-flash/ao-test-flash.1 [new file with mode: 0644]
ao-tools/ao-test-flash/ao-test-flash.c [new file with mode: 0644]
ao-tools/ao-test-igniter/.gitignore [new file with mode: 0644]
ao-tools/ao-test-igniter/Makefile.am [new file with mode: 0644]
ao-tools/ao-test-igniter/ao-test-igniter.1 [new file with mode: 0644]
ao-tools/ao-test-igniter/ao-test-igniter.c [new file with mode: 0644]
configure.ac
doc/altusmetrum.xsl
icon/.gitignore
icon/Makefile.am
icon/altusmetrum-altosui.svg [new file with mode: 0644]
icon/altusmetrum-micropeak.svg [new file with mode: 0644]
icon/altusmetrum-telegps.svg [new file with mode: 0644]
icon/altusmetrum.svg [deleted file]
icon/application-vnd.altusmetrum.eeprom.svg [new file with mode: 0644]
icon/application-vnd.altusmetrum.micropeak.svg [new symlink]
icon/application-vnd.altusmetrum.telemetry.svg [new file with mode: 0644]
icon/creating-linux-icons [new file with mode: 0644]
icon/micropeak.svg [deleted file]
icon/org-altusmetrum-mimetypes.xml [new file with mode: 0644]
icon/telegps.svg [deleted file]
icon/windows-stub.c [new file with mode: 0644]
micropeak/.gitignore
micropeak/Info.plist.in
micropeak/Makefile.am
micropeak/MicroData.java
micropeak/MicroDataPoint.java
micropeak/MicroDeviceDialog.java
micropeak/MicroDownload.java
micropeak/MicroExport.java
micropeak/MicroFile.java
micropeak/MicroFileChooser.java
micropeak/MicroFrame.java
micropeak/MicroGraph.java
micropeak/MicroPeak.app/Contents/Resources/MicroPeak.icns [deleted file]
micropeak/MicroPeak.java
micropeak/MicroRaw.java
micropeak/MicroSave.java
micropeak/MicroSerial.java
micropeak/MicroSerialLog.java
micropeak/MicroStats.java
micropeak/MicroStatsTable.java
micropeak/MicroUSB.java
micropeak/altusmetrum-micropeak.desktop.in [new file with mode: 0644]
micropeak/micropeak-windows.nsi.in
micropeak/micropeak.desktop.in [deleted file]
signing-driver
src/drivers/ao_aprs.c
src/kernel/ao_config.c
src/kernel/ao_config.h
src/kernel/ao_pyro.c
src/micropeak/Makefile
src/micropeak/micropeak-load.tmpl [new file with mode: 0644]
src/test/ao_aprs_test.c
src/test/ao_flight_test.c
telegps/.gitignore
telegps/Info.plist.in
telegps/Makefile.am
telegps/TeleGPS.java
telegps/TeleGPSConfig.java
telegps/TeleGPSConfigUI.java
telegps/TeleGPSDisplayThread.java
telegps/TeleGPSGraphUI.java
telegps/TeleGPSInfo.java
telegps/TeleGPSPreferences.java
telegps/TeleGPSState.java
telegps/TeleGPSStatus.java
telegps/TeleGPSStatusUpdate.java
telegps/altusmetrum-telegps.desktop.in [new file with mode: 0644]
telegps/telegps-windows.nsi.in
telegps/telegps.desktop.in [deleted file]

index 15d2c82da0c1263f4a6cc68e120b08efd090b086..2f8a5ee182d1e63c5e5da951cacf73f3a702c636 100644 (file)
@@ -18,6 +18,7 @@ fat:
        cd libaltos && $(MAKE) all
        cd altoslib && $(MAKE) all
        cd altosuilib && $(MAKE) all
+       cd icon && $(MAKE) fat
        cd altosui && $(MAKE) fat
        cd micropeak && $(MAKE) fat
        cd telegps && $(MAKE) fat
index 1b4d45ed3e66536eabac8b1ca25633fa6d1a4be3..a599698faaeb3f37604e23591957e9ab559f675f 100644 (file)
@@ -31,7 +31,7 @@ import android.os.Handler;
 //import android.os.Message;
 import android.util.Log;
 
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public class AltosBluetooth extends AltosLink {
 
index f61baf1e411a933518bc1cf245f20ddd8673511d..1b49ba953de7450f4ce6cf60f6a0f458a62c8d5f 100644 (file)
@@ -49,7 +49,7 @@ import android.widget.Toast;
 import android.app.AlertDialog;
 import android.location.Location;
 
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public class AltosDroid extends FragmentActivity {
        // Debugging
index f6e6881de3df550b08eb29832541af0ae8fc37e0..70d7def828706a972211872d4f82cb80e6d20cc9 100644 (file)
@@ -23,7 +23,7 @@ import android.content.Context;
 import android.content.SharedPreferences;
 import android.os.Environment;
 
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public class AltosDroidPreferences implements AltosPreferencesBackend {
        public final static String        NAME    = "org.altusmetrum.AltosDroid";
index fac4b8d4530027de625ccd39430828b6d940d1ab..20593bd550996d4467ea0e45d36fd723d0cff5d8 100644 (file)
@@ -17,7 +17,7 @@
 
 package org.altusmetrum.AltosDroid;
 
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 import android.location.Location;
 
 public interface AltosDroidTab {
index 5e8515cb35d8a06e753e6fdb210809e73199a2de..147405f6affd58fb23091181844dda6ec3373044 100644 (file)
@@ -21,7 +21,7 @@ package org.altusmetrum.AltosDroid;
 import android.speech.tts.TextToSpeech;
 import android.speech.tts.TextToSpeech.OnInitListener;
 
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public class AltosVoice {
 
index e4a815eb6f929f57b218a2988da17fe25dc76215..cb9fd5c8dfb27bd484cc8f80499065dcff93ec5f 100644 (file)
@@ -17,7 +17,7 @@
 
 package org.altusmetrum.AltosDroid;
 
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 import android.app.Activity;
 import android.os.Bundle;
index cbbe4d4473ab9bc62f09c201d0248e008def6737..2171afa461cc62f310b2531a1c387a891b873b94 100644 (file)
@@ -17,7 +17,7 @@
 
 package org.altusmetrum.AltosDroid;
 
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 import android.app.Activity;
 import android.os.Bundle;
index b2e6fd2016a87877cca3d12fa973804239f7f8d8..47e41d5981350e5bc2c940803eeb27e0568d9a76 100644 (file)
@@ -17,7 +17,7 @@
 
 package org.altusmetrum.AltosDroid;
 
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 import android.app.Activity;
 import android.os.Bundle;
index 38922771f73f097e4938ccbddca1423ceca4a2a8..15dc8bf7de029f9437720807fc53ea580a570c23 100644 (file)
@@ -19,7 +19,7 @@ package org.altusmetrum.AltosDroid;
 
 import java.util.Arrays;
 
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 import com.google.android.gms.maps.CameraUpdateFactory;
 import com.google.android.gms.maps.GoogleMap;
index 2d88974d3d787f516c15ea352b6e3936a5cfae84..175a41de107ef5abd4716f3622a1c157e1d17ff9 100644 (file)
@@ -17,7 +17,7 @@
 
 package org.altusmetrum.AltosDroid;
 
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 import android.app.Activity;
 import android.os.Bundle;
index 4215a3303df0d757a8b14ca80ee016f6654a2094..49bcfb884d6fc94792b44746a8d48aae0cf81095 100644 (file)
@@ -1,6 +1,6 @@
 package org.altusmetrum.AltosDroid;
 
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 import android.content.BroadcastReceiver;
 import android.content.Context;
index 5bc4b90dd9e417ec4901611e9b2b0b10ea968ac4..3ba5afa9a25aa0b3055b2bca87c0224e75952df2 100644 (file)
@@ -25,7 +25,7 @@ import java.util.concurrent.*;
 import android.util.Log;
 import android.os.Handler;
 
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 
 public class TelemetryReader extends Thread {
index da5e044f0abc5b122416b996c4c81149ccb07c11..f06ed213984a2413e65febb35ab96f93a1ff3b10 100644 (file)
@@ -44,7 +44,7 @@ import android.location.LocationManager;
 import android.location.LocationListener;
 import android.location.Criteria;
 
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 
 public class TelemetryService extends Service implements LocationListener {
index 3d340e5d2c32f7d31e1a11535cf9cdef0133f4be..d91da4dab0235ec35742e142ad2b60dec8cb8165 100644 (file)
@@ -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 {
 
index 253ca435dc83753330397a623639133ace8401b3..507c446bdbe05a6c550b2cfd56f8747dfd7c492d 100644 (file)
@@ -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;
index 27e1fade54c76bdb54b4cae8a3b16a6c66369edc..7e3d6d07c98436d76aec5b1c3f3b1a5bb5ea1221 100644 (file)
@@ -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.*;
index 09bfe9f3c7482e3a5238b27e7340be074ee1de63..47deb2a3dd1be6bb0212eb5ce767bd7d931ed8d2 100644 (file)
@@ -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;
index e104395803c7dd2cc3ba63b36fe8d8081d99c350..3bf8ea43d2ad4b0601fa975612947f0ea2ac5006 100644 (file)
@@ -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.*;
@@ -71,6 +71,7 @@ public class AltosConfigData implements Iterable<String> {
 
        /* HAS_APRS */
        public int              aprs_interval;
+       public int              aprs_ssid;
 
        /* HAS_BEEP */
        public int              beep;
@@ -250,6 +251,7 @@ public class AltosConfigData implements Iterable<String> {
                pyro_firing_time = -1;
 
                aprs_interval = -1;
+               aprs_ssid = -1;
 
                beep = -1;
 
@@ -333,6 +335,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) {}
@@ -459,6 +462,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)
@@ -507,6 +512,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);
@@ -577,6 +583,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)
index ae5621ccd59c9d2e3f20d1b102010aafd4243f4f..a932d3e38e6adf79be9c9b444279c652f0469e82 100644 (file)
@@ -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 {
 
index 724ba7dc4bc91e3dc8e7aa282074b0b3fc34d23f..b0c49e98fe0af83bf23a02c8a5c5acf2821ab971 100644 (file)
@@ -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 */
@@ -81,6 +81,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);
index dc0fbb6253608529b0e6e6fb33ec02be7687f21d..18878c026dd01115501e87f8880a9bcb613feea6 100644 (file)
@@ -18,7 +18,7 @@
 /*
  * Sensor data conversion functions
  */
-package org.altusmetrum.altoslib_4;
+package org.altusmetrum.altoslib_5;
 
 public class AltosConvert {
        /*
index b0e52fc1c5855abfd1b41e9bd4209b6980dce92a..6784f60abb3793c4de9df2aa07b2b89e3df12058 100644 (file)
@@ -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.*;
 
index 76ca20c07521995323dc31690763956f052e2ced..67bb58e9e65f5717a82f56b1ca0c3cca8a55a7ff 100644 (file)
@@ -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 {
 
index 020590ebfc0a9f667d82c67fbbfe906ea0a954d5..532c9f1d9c64f03a8c32391607edb77ab9b1ab7d 100644 (file)
@@ -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.*;
index 91eebc5ab18edee44feb72586b2a994febc51813..4d12f564057bc92e35ed21ec712269e6bb18f55c 100644 (file)
@@ -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.*;
index a2dfc438afcf76838b9c212a3c4ad34e48297124..a448ee645270ce6283ca743f0e3ce5bfaac03631 100644 (file)
@@ -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.*;
index b7e446ce6a1627fbdd8b6d4637176bfe1f4351a6..a1579b550d86a0e0ce3c925cff7815d3505d7eaa 100644 (file)
@@ -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.*;
index 3c1852c0350258a1ce34830ea28895ed26e9ee53..2514b4fcd2a2abeb5441f74008c1a50828d1fded 100644 (file)
@@ -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.*;
index 839aa06e0fbdac648bb1de80ab60ac24d17f8078..47e9ecebad9bfd981fb61081c226a9fa4766fa02 100644 (file)
@@ -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.*;
index d6832c1b91bbd30e539591fffa54c9544cb60a67..dd0afd9f1501bd347683f5cd10871e78a12669f8 100644 (file)
@@ -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.*;
index ab853a884a89d000faafc41103720a23ad480970..740499d302139f7c353110e8006291815ca52e5e 100644 (file)
@@ -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.*;
index 1a430c03dd2273f3eb25af49055b7f7198453a4d..5a11fa5441196d1a409eeb278d1e20586fc00424 100644 (file)
@@ -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.*;
index 71719a26477eb47db8a103790abe6f314ac2cfe8..5d5f3fef20d6af91fa8f83085a8c9366d0a1da8d 100644 (file)
@@ -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.*;
index d137614a8949a30069d771d50260b7d8d921d6a1..2427711898e4cc0b6ec2589307c1d2782ad863e9 100644 (file)
@@ -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.*;
index 32985639e52b73729ce021c897f29029dfc874d9..f197539eb5c6bf0d66775c217a6a072adff2e5fd 100644 (file)
@@ -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.*;
index b97287c3b1801a1d69ce911f528c3f3b4e86e43d..173a2cd82f680dca096838f710328d28ec18f14f 100644 (file)
@@ -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 {
 
index 77fe20c5789d31eb99a5ce57d617b74a5e5f11ff..6d36cf47a9e1ed87169c71641e9d19c1106bb6d0 100644 (file)
@@ -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.*;
index 6cbb72535740d74a6fa31d573f5bb84a4f539402..81b42f21eb74e0de9eb2f7721eafa7b08113cf38 100644 (file)
@@ -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.*;
index 2a7389960b08bb8604fabe0c4beb3e5ea3f347d9..ba639a046fd95516983a104624fb58c5676255ca 100644 (file)
@@ -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.*;
index 8e8722c2727dec1b343b5127fbb28ab57183c632..bd4fb6d09d4658a6c23dd283ff94b4d38ac3c991 100644 (file)
@@ -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.*;
 
index 8bb86bba1c42aaf0a9d69c11f94503d51cca0f7b..7a51c3305c2c7ef6ed210d3ad90cad72f8142474 100644 (file)
@@ -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);
index 2fcd556ea6c5ad0e607b3a58df9d22390cb73c88..ac151396e7bc2706495d21b0fca1d4cb5f8ba566 100644 (file)
@@ -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.*;
index 56feb848c3bf62d1613f0a94944b1f2dbc3c1041..1b88cb9fc7e56e7b8b2abf7ae308571837c862ad 100644 (file)
@@ -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.*;
 
index 7c291ea9036b29f0169730c5bbb39525ec0b9adb..6093df495700498ce8646795b545a277c4552001 100644 (file)
@@ -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
+}
index 2708d026e840184a0013c8b632a26a1ffe7780db..aabcfc5b8288fa28bfd0b0a5f6ac1c423421468c 100644 (file)
@@ -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.*;
index ef24d4974f844f0a055bf5d354a2dec6e293a30e..adbcbe61ad2bfbec023fad34b721fd948414ff46 100644 (file)
@@ -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;
index 4782c34d34d858ed6fd361594ae69befb1853120..716eeef98396c61ad3ec3d6f063143ad4cfe1d8e 100644 (file)
@@ -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;
 
index 84981032a76e909e6af429b7ff32f72c72db6fdc..8c67e043960ecbb7cb37463a3d758714aa05452c 100644 (file)
@@ -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 {
 
index d5fa8f5fe1c08b86e99649e09bec6895f5129dcf..9ee64bdc72e585871bbeabc63e63c0a5e96229f6 100644 (file)
@@ -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;
index 403b5644b50d3bdb524a59cccefff2b286304448..52eb81db0354e1a0cea00dd4ba627277f7b67853 100644 (file)
@@ -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;
index a22b3fed29290ca6e59f765734c581f388d1e55c..89d7def4a3bb2066b5ff1adbdd364107dd575ad3 100644 (file)
@@ -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.*;
 
index 55f6f5c9d834e5cfa5fa6a009da66c568060cf73..0f723d142293e299e1d1ccf7fdd84b4a04132efa 100644 (file)
@@ -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.*;
index 5cd8bf367944907ebec648aa6dc3e99c35f4e582..1cb43d6dd55b9df2437474f8b71f2788de3a30a0 100644 (file)
@@ -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.*;
index f81abdff0baac58d40094beb566b1a5a4ee23461..85bcff10d295e3a7920ba511b29b72727858123b 100644 (file)
@@ -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.*;
index 6a9abea24dea350540620a9160473f5eb49829f7..4382430c667634acb9995078e0d5ec009e7cdee5 100644 (file)
@@ -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);
index c21f17ac2234da61d93ad414494180747aa4ea27..b458911ec61884d4bd144a5b50d934d8fd2fc454 100644 (file)
@@ -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.*;
index d55da9ef2d9474276178a4999d69dea1ad73b46f..e31ddfba19a3c4fa6eed978e2f2930a482b226ae 100644 (file)
@@ -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.*;
 
index 6156d6dc79f9899fcd609ce09c1da0107ee2a86f..2b5071734bcd618f700e5158e9abcfbe30728f18 100644 (file)
@@ -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"; }
index 69c6d604003d7ff39bacba50b7affb14270c1d73..ec32fffc3fcb6b8a8b07269eaced0db4e406a139 100644 (file)
@@ -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.*;
index f9c712a327597ecdac8010da611affc5c50d6a80..f56938c6a116201c5035e7c820874aef1300215b 100644 (file)
@@ -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;
index 7f434a064200921d881eaf5051a580d6d1258ac8..08bca5fc9e864291b31557f26608e30ea7a29af3 100644 (file)
@@ -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.*;
index 5bf761b0a5fa035d0a01b91952b48ecba0daf33b..054ff1d06431d12bab7eb88bbc02c4012be94c9b 100644 (file)
@@ -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;
index 725a02ba6a0a7f8492c5f8c7ee376bb2b8b4ca23..9bbbb8990c2ae948d542e194a483595ac46a5589 100644 (file)
@@ -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 {
 
index c4e9e4257a1f318dbf7a90bfe00fd85bf2d1918e..1cac6b5205a1b6c731b42447a2ef132919114018 100644 (file)
@@ -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.*;
index 29a5dcd46374949afae6e3239c1e616340a0f020..dbcd6bf026cf9afa6b447e95ec8539f3c8df9674 100644 (file)
@@ -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"; }
index 9262de2d3e8e6f06fc1892cb22bbc3cff3af8618..690241f13e53c98ed97da0a8a76a0ef2c51aaaf6 100644 (file)
@@ -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.*;
 
index cb2e63d4269cb9de38004377cf4f2471a19bae3e..ea47cc9b0ada7c936bf7d5cafd3afc7c7ac0d32a 100644 (file)
@@ -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.*;
 
index 5aa3a7ec6bf8bb0f673a8308ea9b0b818f458390..81e0641c2d9a8f42301dffbfba4fb29483ca8e49 100644 (file)
@@ -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.*;
 
index f5e53b8cb032e663e4ad1a290022e833f0b3109d..d436c3f1a78d577abe5d03f035c31c640b44d5dd 100644 (file)
@@ -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) {
index 5fcbe28dd16b5fb38b80daeaf339ceae6c6c1e92..348c6844a6d5894bd50dbe24c77890443eea0eaa 100644 (file)
@@ -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 {
 
index 1bff76823f0d7d1d2d69c85404815c7d52ca4b1e..9cb99a0d452e3689270f4432247fe798d3e0257d 100644 (file)
@@ -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.*;
 
index d299f27b02ddd865e23f8e4e05c8a06ce3361ed5..159951e46f83ffd501f94ee46989acdd275536ef 100644 (file)
@@ -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.*;
index 461b5c80ec1d409f61917068484dae4788bd9ebe..76a99acbb1ef82187d034d34885e457c37649a5f 100644 (file)
@@ -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;
 
index c96f04ca47da88eb0a16d76169fa3f57e0948c23..443082d50b08f01a8e5c7a450faadbb6c9a24535 100644 (file)
@@ -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.*;
 
index 9e47bc804282f9b6319e1a2b151b81ab03bf5784..60b8fe5242648c14eaccf96fe7133d1fab80a3f8 100644 (file)
@@ -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.*;
index bf7e0e5b0b36dce0a52ce526b84ec042e66aa466..15093af18410a1180e4c8c3bf8a66dee5718ba4d 100644 (file)
@@ -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.*;
index 10df11afd6cc7c9277dcd63d1475588e7a43fcf8..d0de5492752e9de6ee3f8417d047f764dc4135c4 100644 (file)
@@ -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.*;
 
index 502c6d65ba5fd426a71b0c5b0085dfa4581b0bfb..3ec692132ebfc1999674f5001d841696454baed5 100644 (file)
@@ -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.*;
 
index ee0238f965f8a2b6c68d9ebca523ec35ffc494ef..53a8e998845aab74ccbc70c058ae769dceb5e59d 100644 (file)
@@ -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;
 
index e34e71b7f599a4b363a7b18a027134f8dd901bbb..cdc2ac42ace48eef971dd55ff6ed372f91220f5e 100644 (file)
@@ -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;
 
index 02f3a25622e596ff2749315b05921b2dbbed128a..3c7213eb370b0e40c0e62847ce2b0495dd0d6085 100644 (file)
@@ -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;
 
index e5421ef53d1a79dadade3a63f1954879e92836cf..d977e886c7d762717719b95f241ba2725153e818 100644 (file)
@@ -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;
 
index 2d60d8cfbaf9e33ee3a73807ba1e09c448e4d6ef..344e7449d6ce909abe4666d731f0432af2aa24af 100644 (file)
@@ -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;
 
index b9eeca0cc1d803403d09b5e6283d7a30e5c2ee80..edd76da2e00dcd5c50d3562953f62b7fd772dab5 100644 (file)
@@ -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;
 
index 9134f5f4a59c60c729f1835ccadd10de4eb17502..d2f86214f228b9206ada035f9193d9a60dc10e53 100644 (file)
@@ -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 {
 
index b05cd3586061ad111d99084733f84865c360339e..e0c00602c7cdb4827571f4a7df326c59b720a00b 100644 (file)
@@ -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 {
 
index be812095342988dc6f2f889f74d4f2bda5a9cff1..f7cd424d554a82422b8f403775f178ad717e3b84 100644 (file)
@@ -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.*;
index ac4e963e6de6750b21150684745bfc37bd51337f..70530f756623e201c46dfe0bd4dcd3a6ba455bed 100644 (file)
@@ -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;
index 8182ec6bb67fe9eaefa016b1337a6f9c9bba5d16..4d50a05933100b0a7552eb89dca2a0d4fbc0d3e4 100644 (file)
@@ -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.*;
 
index e38840519c3f20276c8c9834e0e5fa5cd9a78a61..f578e6adc5404f8e5ce2f99a0ae363a174b6fd9e 100644 (file)
@@ -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 {
index 3d3fa407085c641dda785a5ee8235e99b31d9033..15344b8dba5f06464f482b13aee3817fc3125990 100644 (file)
@@ -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.*;
index cba97ddc01309ddf9637d6b4ca53f1de4ec6ad4d..ac42597d5935e7a7da957b95a7ef68883828d8ae 100644 (file)
@@ -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.*;
index 3367ece78bc2a50145b3aa84df36c9aae4e24357..b7aae3c477e4f7bc2d8dd92d501a0943634dfcc9 100644 (file)
@@ -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.*;
 
index 8368188f895492d42b83385babb524836e1a0b68..32ca76087153c7ffe39a09d0b7e88406af8313b1 100644 (file)
@@ -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 {
index 8d0de355f195346df58079a2849f48cd315eaa87..758311eb21560e0c3affd41416c52d0bb6177139 100644 (file)
@@ -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;
 
index fac5695f27fbf6048a5f5d7b994f1e0ffe3ea529..93610118311cf841b68bebe6026dc9e2fc14c933 100644 (file)
@@ -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;
index 9e73bc4e2c6b53114b9b43bf7fcaad7a6c801c44..1b568c88cea80b47ca45bc6edc5d63559b32514d 100644 (file)
@@ -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;
index 966173069e81a8bbe320adc3b5ff69fe7a7e98f8..3377d969b972034fc6e4390cb3544b14cf27ade8 100644 (file)
@@ -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 {
index e7055404b24fe5b1f6c36309d3ca0e32355f0525..3e0abedc086c9eec6634c7b5e8b01879d104b3b0 100644 (file)
@@ -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 {
index fbfaff8e2cc406ce52397f37670bbbfd87a5664c..221bb67c5fea9535c1808a881f2d888a4dfa0f16 100644 (file)
@@ -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 {
index 0dca62aa62abf988c0552279732bf04598cd52d0..2a535e84e1de290655e3364f8128f4a1dcdc10d4 100644 (file)
@@ -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) {
index 3dff661a3e3a91ed876166d32a59b334c17f4cd2..589f57f25f6ac5e200d1f2cc81f892d33c18945e 100644 (file)
@@ -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.*;
index d611e88c004b371b26630beb018aabd8b88c0d69..d1cdaf6de12a54755be85e283c97b2b18d11bd64 100644 (file)
@@ -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;
index ad4d92837a955c2ab80019e3bf5e2862f2559f7e..fc3fe8589040c6af8d25a02b3495b451ef3b8061 100644 (file)
@@ -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 {
index 23ae9d21fc05894fc76ef14ac29b1493ddbc32a8..f4dfd8e9665953dc58987c972022e313bc176e27 100644 (file)
@@ -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;
index 5fa71b8683b48cd9f710f6d4a5c4368a4f107e7a..e654fada4c2b235f51ae49388838fb5b0c4c4115 100644 (file)
@@ -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 {
 
index d29cfae7450825f7bea624759b1a4c578dfe06ab..dbdb788248ee150826ea272732e72ddb4d693da3 100644 (file)
@@ -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 {
 
index ca6faafd34166edf90e192b2a856c15384f46817..664aed67cf77a571c65fc310f53bf5472826f838 100644 (file)
@@ -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);
index 351bf11575296d6dd50acb4c7152153cda46c210..22bd1aeec201a235353448302e3f47209dba29a1 100644 (file)
@@ -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 {
 
index c3479a93dfd2bf18e4709ce643610a3f7eb261a1..9df52250a254afe8cd634009596344c5c4e2eacf 100644 (file)
@@ -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 AltosWriter {
 
index 10b600e441ca086d4da85f5c90ea13e01e4cf1f9..b0c8264b67a48ac29cddd49180f507d24b769fe1 100644 (file)
@@ -17,7 +17,7 @@ Altos-Linux-*.tar.bz2
 Altos-Linux-*.sh
 Altos-Mac-*.zip
 Altos-Windows-*.exe
-altos.desktop
+altusmetrum-altosui.desktop
 *.dll
 *.dylib
 *.so
index 28038ad687653e5829c756b848103eb8cf18f1b2..74b45f1c97027ac32e1263cb1311798856750303 100644 (file)
@@ -20,8 +20,8 @@ package altosui;
 import java.awt.*;
 import libaltosJNI.*;
 
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class Altos extends AltosUILib {
 
index 3bc804068fef165716cb60686fd70dc5df0deebf..24fc362fb424e2abd6d0d91ba388930a84928b7e 100644 (file)
@@ -21,8 +21,8 @@ import java.util.*;
 import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class AltosAscent extends AltosUIFlightTab {
        JLabel  cur, max;
index e7b335ac7f6fcc32168e3c0c7cedb08b5928d674..7ac53dd8ca9418ceb56cb184ffff4cbdca4e4c59 100644 (file)
@@ -19,8 +19,8 @@ package altosui;
 
 import java.awt.*;
 import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class AltosCompanionInfo extends JTable implements AltosFlightDisplay {
        private AltosFlightInfoTableModel model;
index 6eb7d40cb34ea88e7a0d60469ed9a179094bbd6a..40f7ebecb4c4635809dfdec7ebc9d068edca3af5 100644 (file)
@@ -22,8 +22,8 @@ import javax.swing.*;
 import java.io.*;
 import java.util.concurrent.*;
 import java.text.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class AltosConfig implements ActionListener {
 
index f0b4f0f998a2cb31de3bc668a81aa5fdd10b52fb..dd4fb5055a92f353ae321e1b51928803f253f426 100644 (file)
@@ -21,8 +21,8 @@ import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
 import javax.swing.event.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class AltosConfigPyroUI
        extends AltosUIDialog
index bfbd2c7710ef296118724e50a85cce9c625be561..2976657c356be2743c356c1bb2b8956f0bd5da4d 100644 (file)
@@ -21,8 +21,8 @@ import java.awt.event.*;
 import javax.swing.*;
 import java.io.*;
 import java.util.concurrent.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class AltosConfigTD implements ActionListener {
 
index 22b3384d6a995e7a341c6eac16a1f6c4c8f17121..ca3657183e037f339cd46ed8e1a69cebc29484c0 100644 (file)
@@ -21,8 +21,8 @@ import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
 import javax.swing.event.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class AltosConfigTDUI
        extends AltosUIDialog
@@ -44,6 +44,7 @@ public class AltosConfigTDUI
        JLabel          product_value;
        JLabel          version_value;
        JLabel          serial_value;
+       JMenuBar        radio_frequency_menu_bar;
        AltosFreqList   radio_frequency_value;
        JLabel          radio_calibration_value;
 
@@ -166,9 +167,11 @@ public class AltosConfigTDUI
                c.anchor = GridBagConstraints.LINE_START;
                c.insets = ir;
                c.ipady = 5;
-               radio_frequency_value = new AltosFreqList();
+               radio_frequency_value = new AltosFreqList(false);
                radio_frequency_value.addItemListener(this);
-               pane.add(radio_frequency_value, c);
+               radio_frequency_menu_bar = new JMenuBar();
+               radio_frequency_menu_bar.add(radio_frequency_value);
+               pane.add(radio_frequency_menu_bar, c);
                radio_frequency_value.setToolTipText("Telemetry, RDF and packet frequency");
 
                /* Radio Calibration */
@@ -308,28 +311,7 @@ public class AltosConfigTDUI
        }
 
        public void set_radio_frequency(double new_radio_frequency) {
-               int i;
-               for (i = 0; i < radio_frequency_value.getItemCount(); i++) {
-                       AltosFrequency  f = (AltosFrequency) radio_frequency_value.getItemAt(i);
-
-                       if (f.close(new_radio_frequency)) {
-                               radio_frequency_value.setSelectedIndex(i);
-                               return;
-                       }
-               }
-               for (i = 0; i < radio_frequency_value.getItemCount(); i++) {
-                       AltosFrequency  f = (AltosFrequency) radio_frequency_value.getItemAt(i);
-
-                       if (new_radio_frequency < f.frequency)
-                               break;
-               }
-               String  description = String.format("%s serial %s",
-                                                   product_value.getText(),
-                                                   serial_value.getText());
-               AltosFrequency  new_frequency = new AltosFrequency(new_radio_frequency, description);
-               AltosPreferences.add_common_frequency(new_frequency);
-               radio_frequency_value.insertItemAt(new_frequency, i);
-               radio_frequency_value.setSelectedIndex(i);
+               radio_frequency_value.set_frequency(new_radio_frequency);
        }
 
        public double radio_frequency() {
index 1b5ff9881b0c2ee28458e9ff8772d778fcf3bf5e..6e1b47c21260abebfbc1dd5ed2f566d684ab630b 100644 (file)
@@ -21,8 +21,8 @@ import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
 import javax.swing.event.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class AltosConfigUI
        extends AltosUIDialog
@@ -41,6 +41,7 @@ public class AltosConfigUI
        JLabel                  radio_frequency_label;
        JLabel                  radio_enable_label;
        JLabel                  aprs_interval_label;
+       JLabel                  aprs_ssid_label;
        JLabel                  flight_log_max_label;
        JLabel                  ignite_mode_label;
        JLabel                  pad_orientation_label;
@@ -62,6 +63,7 @@ public class AltosConfigUI
        JTextField              radio_calibration_value;
        JRadioButton            radio_enable_value;
        JComboBox<String>       aprs_interval_value;
+       JComboBox<Integer>      aprs_ssid_value;
        JComboBox<String>       flight_log_max_value;
        JComboBox<String>       ignite_mode_value;
        JComboBox<String>       pad_orientation_value;
@@ -113,6 +115,10 @@ public class AltosConfigUI
                "10"
        };
 
+       static Integer[]        aprs_ssid_values = {
+               0, 1, 2 ,3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
+       };
+
        static String[]         beep_values = {
                "3750",
                "4000",
@@ -201,6 +207,15 @@ public class AltosConfigUI
                        aprs_interval_value.setToolTipText("Hardware doesn't support APRS");
        }
 
+       void set_aprs_ssid_tool_tip() {
+               if (aprs_ssid_value.isEnabled())
+                       aprs_interval_value.setToolTipText("Set the APRS SSID (secondary station identifier)");
+               else if (aprs_interval_value.isEnabled())
+                       aprs_interval_value.setToolTipText("Software version doesn't support setting the APRS SSID");
+               else
+                       aprs_interval_value.setToolTipText("Hardware doesn't support APRS");
+       }
+
        void set_flight_log_max_tool_tip() {
                if (flight_log_max_value.isEnabled())
                        flight_log_max_value.setToolTipText("Size reserved for each flight log (in kB)");
@@ -419,7 +434,10 @@ public class AltosConfigUI
                c.ipady = 5;
                radio_frequency_value = new AltosFreqList();
                radio_frequency_value.addItemListener(this);
-               pane.add(radio_frequency_value, c);
+
+               JMenuBar menu_bar = new JMenuBar();
+               menu_bar.add(radio_frequency_value);
+               pane.add(menu_bar, c);
                radio_frequency_value.setToolTipText("Telemetry, RDF and packet frequency");
                row++;
 
@@ -501,6 +519,33 @@ public class AltosConfigUI
                set_aprs_interval_tool_tip();
                row++;
 
+               /* APRS SSID */
+               c = new GridBagConstraints();
+               c.gridx = 0; c.gridy = row;
+               c.gridwidth = 4;
+               c.fill = GridBagConstraints.NONE;
+               c.anchor = GridBagConstraints.LINE_START;
+               c.insets = il;
+               c.ipady = 5;
+               aprs_ssid_label = new JLabel("APRS SSID:");
+               pane.add(aprs_ssid_label, c);
+
+               c = new GridBagConstraints();
+               c.gridx = 4; c.gridy = row;
+               c.gridwidth = 4;
+               c.fill = GridBagConstraints.HORIZONTAL;
+               c.weightx = 1;
+               c.anchor = GridBagConstraints.LINE_START;
+               c.insets = ir;
+               c.ipady = 5;
+               aprs_ssid_value = new JComboBox<Integer>(aprs_ssid_values);
+               aprs_ssid_value.setEditable(false);
+               aprs_ssid_value.addItemListener(this);
+               aprs_ssid_value.setMaximumRowCount(aprs_ssid_values.length);
+               pane.add(aprs_ssid_value, c);
+               set_aprs_ssid_tool_tip();
+               row++;
+
                /* Callsign */
                c = new GridBagConstraints();
                c.gridx = 0; c.gridy = row;
@@ -1177,4 +1222,15 @@ public class AltosConfigUI
                        return 0;
                return parse_int("aprs interval", s, false);
        }
+
+       public void set_aprs_ssid(int new_aprs_ssid) {
+               aprs_ssid_value.setSelectedItem(Math.max(0,new_aprs_ssid));
+               aprs_ssid_value.setVisible(new_aprs_ssid >= 0);
+               set_aprs_ssid_tool_tip();
+       }
+
+       public int aprs_ssid() throws AltosConfigDataException {
+               Integer i = (Integer) aprs_ssid_value.getSelectedItem();
+               return i;
+       }
 }
index e61a4a5b191200115596d4c10c5b8090aa86cf84..80d6d341315e112fcc78884039976c2f07ddedb6 100644 (file)
@@ -22,7 +22,7 @@ import java.awt.event.*;
 import java.beans.*;
 import javax.swing.*;
 import javax.swing.event.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class AltosConfigureUI
        extends AltosUIConfigure
index 36fc16138c2b81c4c285eb842d4e32c571707c65..e38b35edf305b60d79e1e996238774a2c55fb80d 100644 (file)
@@ -21,8 +21,8 @@ import java.util.*;
 import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class AltosDescent extends AltosUIFlightTab {
 
index 46c0b38736d5c9d4c53bf1c1519634ebee9765b4..7e7efa64d91a96621b7256c6905e6c676eb00085 100644 (file)
@@ -19,8 +19,8 @@ package altosui;
 
 import java.awt.*;
 import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class AltosFlightStatus extends JComponent implements AltosFlightDisplay {
        GridBagLayout   layout;
index b33f40a4a9cbe760ea1ccc724c7c4782bc7dd290..336b44aa691737ef1eb6e9060212624aa5bde3fd 100644 (file)
@@ -27,7 +27,7 @@ import java.util.*;
 import java.text.*;
 import java.util.prefs.*;
 import java.util.concurrent.LinkedBlockingQueue;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public class AltosFlightStatusTableModel extends AbstractTableModel {
        private String[] columnNames = {
index 0daec04e87d7c4ac7e952fc463f347f96162bcfa..3ba78c19f8e18460e35abca368002a07118b54ed 100644 (file)
@@ -18,7 +18,7 @@
 package altosui;
 
 import java.awt.event.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public class AltosFlightStatusUpdate implements ActionListener {
 
index 43deb631705f86abc30dd5f072570daeb6e3a7ba..5aff1817144ee993b08167baa64c1f4c313679f0 100644 (file)
@@ -22,8 +22,8 @@ import java.awt.event.*;
 import javax.swing.*;
 import java.util.*;
 import java.util.concurrent.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class AltosFlightUI extends AltosUIFrame implements AltosFlightDisplay {
        AltosVoice              voice;
@@ -170,13 +170,17 @@ public class AltosFlightUI extends AltosUIFrame implements AltosFlightDisplay {
        }
 
        Container       bag;
-       AltosFreqList   frequencies;
-       JComboBox<String>       telemetries;
-       JLabel          telemetry;
+
+       JMenuBar                menu_bar;
+       AltosFreqList           frequencies;
+       AltosUITelemetryMenu    telemetries;
+       JLabel                  telemetry;
 
        ActionListener  show_timer;
 
        public AltosFlightUI(AltosVoice in_voice, AltosFlightReader in_reader, final int serial) {
+               super();
+
                AltosUIPreferences.set_component(this);
 
                displays = new LinkedList<AltosFlightDisplay>();
@@ -193,6 +197,10 @@ public class AltosFlightUI extends AltosUIFrame implements AltosFlightDisplay {
 
                /* Stick channel selector at top of table for telemetry monitoring */
                if (serial >= 0) {
+
+                       menu_bar = new JMenuBar();
+                       setJMenuBar(menu_bar);
+
                        // Channel menu
                        frequencies = new AltosFreqList(AltosUIPreferences.frequency(serial));
                        frequencies.set_product("Monitor");
@@ -208,43 +216,19 @@ public class AltosFlightUI extends AltosUIFrame implements AltosFlightDisplay {
                                                reader.save_frequency();
                                        }
                        });
-                       c.gridx = 0;
-                       c.gridy = 0;
-                       c.weightx = 0;
-                       c.weighty = 0;
-                       c.insets = new Insets(3, 3, 3, 3);
-                       c.fill = GridBagConstraints.NONE;
-                       c.anchor = GridBagConstraints.WEST;
-                       bag.add (frequencies, c);
+                       menu_bar.add (frequencies);
 
                        // Telemetry format menu
-                       if (reader.supports_telemetry(Altos.ao_telemetry_standard)) {
-                               telemetries = new JComboBox<String>();
-                               for (int i = 1; i <= Altos.ao_telemetry_max; i++)
-                                       telemetries.addItem(Altos.telemetry_name(i));
-                               int telemetry = AltosPreferences.telemetry(serial);
-                               if (telemetry <= Altos.ao_telemetry_off ||
-                                   telemetry > Altos.ao_telemetry_max)
-                                       telemetry = Altos.ao_telemetry_standard;
-                               telemetries.setSelectedIndex(telemetry - 1);
-                               telemetries.setMaximumRowCount(Altos.ao_telemetry_max);
-                               telemetries.setPreferredSize(null);
-                               telemetries.revalidate();
+                       if (reader.supports_telemetry(AltosLib.ao_telemetry_standard)) {
+                               telemetries = new AltosUITelemetryMenu(serial);
                                telemetries.addActionListener(new ActionListener() {
                                                public void actionPerformed(ActionEvent e) {
-                                                       int telemetry = telemetries.getSelectedIndex() + 1;
+                                                       int telemetry = telemetries.get_selected();
                                                        reader.set_telemetry(telemetry);
                                                        reader.save_telemetry();
                                                }
                                        });
-                               c.gridx = 1;
-                               c.gridy = 0;
-                               c.weightx = 0;
-                               c.weighty = 0;
-                               c.fill = GridBagConstraints.NONE;
-                               c.anchor = GridBagConstraints.WEST;
-                               bag.add (telemetries, c);
-                               c.insets = new Insets(0, 0, 0, 0);
+                               menu_bar.add(telemetries);
                        } else {
                                String  version;
 
@@ -256,14 +240,7 @@ public class AltosFlightUI extends AltosUIFrame implements AltosFlightDisplay {
                                        version = "Telemetry: None";
 
                                telemetry = new JLabel(version);
-                               c.gridx = 1;
-                               c.gridy = 0;
-                               c.weightx = 0;
-                               c.weighty = 0;
-                               c.fill = GridBagConstraints.NONE;
-                               c.anchor = GridBagConstraints.WEST;
-                               bag.add (telemetry, c);
-                               c.insets = new Insets(0, 0, 0, 0);
+                               menu_bar.add(telemetry);
                        }
                }
 
index 07fe93176c33dd68d71bfec4f47e7ff8a9222c6a..ddd281a6d41813453cedb2a932211eb99d7d88c9 100644 (file)
@@ -23,8 +23,8 @@ import java.util.ArrayList;
 import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 import org.jfree.chart.ChartPanel;
 import org.jfree.chart.JFreeChart;
index 042111ec44347c5eb7803aa5fd477ffc6db41c4a..63d862918ae8cc467eafadfe4d7d586d71d65af0 100644 (file)
@@ -24,8 +24,8 @@ import javax.swing.event.*;
 import java.io.*;
 import java.util.concurrent.*;
 import java.util.Arrays;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class AltosIdleMonitorUI extends AltosUIFrame implements AltosFlightDisplay, AltosIdleMonitorListener, DocumentListener {
        AltosDevice             device;
@@ -33,9 +33,11 @@ public class AltosIdleMonitorUI extends AltosUIFrame implements AltosFlightDispl
        AltosPad                pad;
        AltosInfoTable          flightInfo;
        AltosFlightStatus       flightStatus;
+       AltosIgnitor            ignitor;
        AltosIdleMonitor        thread;
        int                     serial;
        boolean                 remote;
+       boolean                 has_ignitor;
 
        void stop_display() {
                if (thread != null) {
@@ -70,10 +72,22 @@ public class AltosIdleMonitorUI extends AltosUIFrame implements AltosFlightDispl
 
        public void show(AltosState state, AltosListenerState listener_state) {
                status_update.saved_state = state;
+               if (ignitor.should_show(state)) {
+                       if (!has_ignitor) {
+                               pane.add("Ignitor", ignitor);
+                               has_ignitor = true;
+                       }
+               } else {
+                       if (has_ignitor) {
+                               pane.remove(ignitor);
+                               has_ignitor = false;
+                       }
+               }
 //             try {
                        pad.show(state, listener_state);
                        flightStatus.show(state, listener_state);
                        flightInfo.show(state, listener_state);
+                       ignitor.show(state, listener_state);
 //             } catch (Exception e) {
 //                     System.out.print("Show exception " + e);
 //             }
@@ -222,6 +236,8 @@ public class AltosIdleMonitorUI extends AltosUIFrame implements AltosFlightDispl
                flightInfo = new AltosInfoTable();
                pane.add("Table", new JScrollPane(flightInfo));
 
+               ignitor = new AltosIgnitor();
+
                /* Make the tabbed pane use the rest of the window space */
                bag.add(pane, constraints(0, 3, GridBagConstraints.BOTH));
 
index c251bbe219e90a92d7fbaf378c8c4e4ad9a677ac..15a81e57e37a5fd604142123d776e378aed3c1f1 100644 (file)
@@ -24,8 +24,8 @@ import java.io.*;
 import java.text.*;
 import java.util.*;
 import java.util.concurrent.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class AltosIgniteUI
        extends AltosUIDialog
index 990a87e681775710eb66ceaa13d261e1c24d5ba6..117def093981154c6daaf35baddebafadffefbfd 100644 (file)
@@ -20,8 +20,8 @@ package altosui;
 import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class AltosIgnitor extends AltosUIFlightTab {
 
index dd5cf9ab827842aae003d620eeadadb944f6436c..50c1ea31fe9e3105b8134fdd8ba1d01404f71084 100644 (file)
@@ -21,8 +21,8 @@ import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
 import java.io.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class AltosLanded extends AltosUIFlightTab implements ActionListener {
 
index 9ac1e44c3a11b0fd1c88a6a03f244a56982a7048..1717861698f4c1bbb36a28cb99787cd998e6c612 100644 (file)
@@ -20,7 +20,7 @@ package altosui;
 import java.io.*;
 import java.util.concurrent.*;
 import java.awt.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class AltosLaunch {
        AltosDevice     device;
index cc082542b6f853543e998d20b68258b1171634fd..3320e6751c9207ed725575e460bdea80dbe31d9b 100644 (file)
@@ -23,7 +23,7 @@ import javax.swing.*;
 import java.io.*;
 import java.text.*;
 import java.util.concurrent.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altosuilib_3.*;
 
 class FireButton extends JButton {
        protected void processMouseEvent(MouseEvent e) {
index 6b5fd1500618edf63a4f8fc818bd90b11b1db57a..5c33fd16630fc03578c51e809345b93d7672e132 100644 (file)
@@ -18,8 +18,8 @@
 package altosui;
 
 import java.util.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class AltosPad extends AltosUIFlightTab {
 
index 6137487c418cb0bf8fc414c292a00b2e77516dde..0aa5d03ce142ef1a420b2c45d4d581b9654ac829 100644 (file)
@@ -22,8 +22,8 @@ import java.awt.event.*;
 import javax.swing.*;
 import java.io.*;
 import java.util.concurrent.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class AltosUI extends AltosUIFrame {
        public AltosVoice voice = new AltosVoice();
@@ -99,10 +99,25 @@ public class AltosUI extends AltosUIFrame {
                return b;
        }
 
+       /* OSXAdapter interfaces */
+       public void macosx_file_handler(String path) {
+               process_graph(new File(path));
+       }
+
+       public void macosx_quit_handler() {
+               System.exit(0);
+       }
+
+       public void macosx_preferences_handler() {
+               ConfigureAltosUI();
+       }
+
        public AltosUI() {
 
                load_library(null);
 
+               register_for_macosx_events();
+
                AltosUIPreferences.set_component(this);
 
                pane = getContentPane();
index 280470866a4f22df99e45ca6de87158be04991ff..b229d7b2bb7aa0e253668e91acb7072981f410f1 100644 (file)
@@ -19,7 +19,7 @@ package altosui;
 
 import java.io.File;
 import java.util.prefs.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 import javax.swing.filechooser.FileSystemView;
 
 public class AltosUIPreferencesBackend implements AltosPreferencesBackend {
index 46dea171b85cbfefca3a628476a0ef12e2b79603..8dc797d6f92c97e0297d56d17f6f8da995fd7fc2 100644 (file)
        <key>CFBundleInfoDictionaryVersion</key>
        <string>6.0</string>
        <key>CFBundleIconFile</key>
-       <string>AltosUIIcon.icns</string>
+       <string>altusmetrum-altosui.icns</string>
+       <key>CFBundleDocumentTypes</key>
+       <array>
+         <dict>
+           <key>CFBundleTypeName</key>
+           <string>Telemetry</string>
+           <key>CFBundleTypeIconFile</key>
+           <string>application-vnd.altusmetrum.telemetry.icns</string>
+           <key>CFBundleTypeExtensions</key>
+           <array>
+             <string>telem</string>
+           </array>
+           <key>CFBundleTypeRole</key>
+           <string>Editor</string>
+         </dict>
+         <dict>
+           <key>CFBundleTypeName</key>
+           <string>Eeprom</string>
+           <key>CFBundleTypeIconFile</key>
+           <string>application-vnd.altusmetrum.eeprom.icns</string>
+           <key>CFBundleTypeExtensions</key>
+           <array>
+             <string>eeprom</string>
+           </array>
+           <key>CFBundleTypeRole</key>
+           <string>Editor</string>
+         </dict>
+       </array>
        <key>Java</key>
        <dict>
                <key>MainClass</key>
diff --git a/altosui/Instdrv/NSIS/Includes/java.nsh b/altosui/Instdrv/NSIS/Includes/java.nsh
new file mode 100644 (file)
index 0000000..ebf1c5b
--- /dev/null
@@ -0,0 +1,50 @@
+!include WordFunc.nsh
+
+; Definitions for Java Detection
+
+!define JRE_VERSION "1.6"
+!define JRE32_URL "http://javadl.sun.com/webapps/download/AutoDL?BundleId=52247&/jre-6u27-windows-i586.exe"
+!define JRE64_URL "http://javadl.sun.com/webapps/download/AutoDL?BundleId=52249&/jre-6u27-windows-x64.exe"
+
+Var JavaDownload
+Var JavaBits
+
+Function GetJRE
+       ${If} ${RunningX64}
+          StrCpy $JavaDownload ${JRE64_URL}
+          StrCpy $JavaBits "64"
+       ${Else}
+          StrCpy $JavaDownload ${JRE32_URL}
+          StrCpy $JavaBits "32"
+       ${EndIf}
+
+        MessageBox MB_OK "This product uses Java ${JRE_VERSION}, \
+                       $JavaBits bits, it will now \
+                        be downloaded and installed"
+
+        StrCpy $2 "$TEMP\Java Runtime Environment.exe"
+        nsisdl::download /TIMEOUT=30000 $JavaDownload $2
+        Pop $R0 ;Get the return value
+                StrCmp $R0 "success" +3
+                MessageBox MB_OK "Download failed: $R0"
+                Quit
+        ExecWait $2
+        Delete $2
+FunctionEnd
+
+Function DetectJRE
+  ReadRegStr $2 HKLM "SOFTWARE\JavaSoft\Java Runtime Environment" \
+             "CurrentVersion"
+
+  DetailPrint "Desired Java version ${JRE_VERSION}"
+  DetailPrint "Actual Java version $2"
+
+  ${VersionCompare} $2 ${JRE_VERSION} $3
+
+  IntCmp $3 1 done done
+
+  Call GetJRE
+
+done:
+
+FunctionEnd
diff --git a/altosui/Instdrv/NSIS/Includes/refresh-sh.nsh b/altosui/Instdrv/NSIS/Includes/refresh-sh.nsh
new file mode 100644 (file)
index 0000000..23d8e5e
--- /dev/null
@@ -0,0 +1,14 @@
+!define SHCNE_ASSOCCHANGED 0x08000000
+!define SHCNF_IDLIST 0
+Function RefreshShellIcons
+  ; By jerome tremblay - april 2003
+  ${DisableX64FSRedirection}
+  System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (${SHCNE_ASSOCCHANGED}, ${SHCNF_IDLIST}, 0, 0)'
+FunctionEnd
+
+Function un.RefreshShellIcons
+  ; By jerome tremblay - april 2003
+  ${DisableX64FSRedirection}
+  System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (${SHCNE_ASSOCCHANGED}, ${SHCNF_IDLIST}, 0, 0)'
+FunctionEnd
index 98a5e193ba900c69d7ae9329efd2535d39567ed4..45d75699bc63cf619debc957c759e0825424464b 100644 (file)
@@ -64,7 +64,7 @@ LIBALTOS= \
        altos.dll
 
 desktopdir = $(datadir)/applications
-desktop_file = altos.desktop
+desktop_file = altusmetrum-altosui.desktop
 desktop_SCRIPTS = $(desktop_file)
 
 JAR=altosui.jar
@@ -72,26 +72,37 @@ JAR=altosui.jar
 FATJAR=altosui-fat.jar
 
 # Icons
-ICONDIR=$(top_srcdir)/icon
+ICONDIR=../icon
 
 JAVA_ICONS=\
-       $(ICONDIR)/altus-metrum-16.png \
-       $(ICONDIR)/altus-metrum-32.png \
-       $(ICONDIR)/altus-metrum-48.png \
-       $(ICONDIR)/altus-metrum-64.png \
-       $(ICONDIR)/altus-metrum-128.png \
-       $(ICONDIR)/altus-metrum-256.png
+       $(ICONDIR)/altusmetrum-altosui-16.png \
+       $(ICONDIR)/altusmetrum-altosui-32.png \
+       $(ICONDIR)/altusmetrum-altosui-48.png \
+       $(ICONDIR)/altusmetrum-altosui-64.png \
+       $(ICONDIR)/altusmetrum-altosui-128.png\
+       $(ICONDIR)/altusmetrum-altosui-256.png
 
 # icon base names for jar
-ICONJAR= -C $(ICONDIR) altus-metrum-16.png \
-       -C $(ICONDIR) altus-metrum-32.png \
-       -C $(ICONDIR) altus-metrum-48.png \
-       -C $(ICONDIR) altus-metrum-64.png \
-       -C $(ICONDIR) altus-metrum-128.png \
-       -C $(ICONDIR) altus-metrum-256.png
-
-WINDOWS_ICON=$(ICONDIR)/altus-metrum.ico
-MACOSX_ICON=$(ICONDIR)/AltosUIIcon.icns
+ICONJAR= \
+       -C $(ICONDIR) altusmetrum-altosui-16.png \
+       -C $(ICONDIR) altusmetrum-altosui-32.png \
+       -C $(ICONDIR) altusmetrum-altosui-48.png \
+       -C $(ICONDIR) altusmetrum-altosui-64.png \
+       -C $(ICONDIR) altusmetrum-altosui-128.png\
+       -C $(ICONDIR) altusmetrum-altosui-256.png
+
+WINDOWS_ICONS  =\
+       $(ICONDIR)/altusmetrum-altosui.ico \
+       $(ICONDIR)/altusmetrum-altosui.exe
+       $(ICONDIR)/application-vnd.altusmetrum.eeprom.ico \
+       $(ICONDIR)/application-vnd.altusmetrum.eeprom.exe \
+       $(ICONDIR)/application-vnd.altusmetrum.telemetry.ico \
+       $(ICONDIR)/application-vnd.altusmetrum.telemetry.exe
+
+MACOSX_ICONS   =\
+       $(ICONDIR)/altusmetrum-altosui.icns \
+       $(ICONDIR)/application-vnd.altusmetrum.eeprom.icns \
+       $(ICONDIR)/application-vnd.altusmetrum.telemetry.icns
 
 # Firmware
 FIRMWARE_TD_0_2=$(top_srcdir)/src/teledongle-v0.2/teledongle-v0.2-$(VERSION).ihx
@@ -100,7 +111,8 @@ FIRMWARE_TD=$(FIRMWARE_TD_0_2)
 FIRMWARE_TM_1_0=$(top_srcdir)/src/telemetrum-v1.0/telemetrum-v1.0-$(VERSION).ihx
 FIRMWARE_TM_1_1=$(top_srcdir)/src/telemetrum-v1.1/telemetrum-v1.1-$(VERSION).ihx
 FIRMWARE_TM_1_2=$(top_srcdir)/src/telemetrum-v1.2/telemetrum-v1.2-$(VERSION).ihx
-FIRMWARE_TM=$(FIRMWARE_TM_1_0) $(FIRMWARE_TM_1_1) $(FIRMWARE_TM_1_2)
+FIRMWARE_TM_2_0=$(top_srcdir)/src/telemetrum-v2.0/telemetrum-v2.0-$(VERSION).ihx
+FIRMWARE_TM=$(FIRMWARE_TM_1_0) $(FIRMWARE_TM_1_1) $(FIRMWARE_TM_1_2) $(FIRMWARE_TM_2_0)
 
 FIRMWARE_TELEMINI_1_0=$(top_srcdir)/src/telemini-v1.0/telemini-v1.0-$(VERSION).ihx
 FIRMWARE_TELEMINI=$(FIRMWARE_TELEMINI_1_0)
@@ -140,14 +152,14 @@ FAT_FILES=$(FATJAR) $(ALTOSLIB_CLASS) $(ALTOSUILIB_CLASS) $(FREETTS_CLASS) $(JFR
 
 LINUX_LIBS=libaltos32.so libaltos64.so
 
-LINUX_FILES=$(FAT_FILES) $(LINUX_LIBS) $(FIRMWARE) $(DOC) altos.desktop.in ../icon/altusmetrum.svg
+LINUX_FILES=$(FAT_FILES) $(LINUX_LIBS) $(FIRMWARE) $(DOC) $(desktop_file).in $(ICONDIR)/altusmetrum-altosui.svg
 LINUX_EXTRA=altosui-fat
 
 MACOSX_INFO_PLIST=Info.plist
-MACOSX_FILES=$(FAT_FILES) libaltos.dylib $(MACOSX_INFO_PLIST) $(DOC) ReadMe-Mac.rtf $(MACOSX_ICON)
+MACOSX_FILES=$(FAT_FILES) libaltos.dylib $(MACOSX_INFO_PLIST) $(DOC) ReadMe-Mac.rtf $(MACOSX_ICONS)
 MACOSX_EXTRA=$(FIRMWARE)
 
-WINDOWS_FILES=$(FAT_FILES) $(FIRMWARE) altos.dll altos64.dll $(top_srcdir)/altusmetrum.inf $(top_srcdir)/altusmetrum.cat $(WINDOWS_ICON)
+WINDOWS_FILES=$(FAT_FILES) $(FIRMWARE) altos.dll altos64.dll $(top_srcdir)/altusmetrum.inf $(top_srcdir)/altusmetrum.cat $(WINDOWS_ICONS)
 
 all-local: classes/altosui $(JAR) altosui altosui-test altosui-jdb
 
@@ -160,7 +172,7 @@ clean-local:
 EXTRA_DIST = $(desktop_file).in
 
 $(desktop_file): $(desktop_file).in
-       sed -e 's#%bindir%#@bindir@#' -e 's#%icondir%#$(datadir)/icons/hicolor/scalable/apps#' ${srcdir}/altos.desktop.in > $@
+       sed -e 's#%bindir%#@bindir@#' -e 's#%icondir%#$(datadir)/icons/hicolor/scalable/apps#' ${srcdir}/$(desktop_file).in > $@
        chmod +x $@
 
 if FATINSTALL
@@ -194,7 +206,6 @@ else
 fat: $(LINUX_DIST) $(LINUX_SH) $(MACOSX_DIST) $(WINDOWS_DIST)
 endif
 
-
 altosuidir=$(datadir)/java
 
 install-altosuiJAVA: altosui.jar
@@ -324,7 +335,7 @@ $(MACOSX_DIST): $(MACOSX_FILES) $(MACOSX_EXTRA) Makefile
        cp -a $(DOC) macosx/Doc
        cp -p Info.plist macosx/AltosUI.app/Contents
        mkdir -p macosx/AltOS-$(VERSION) macosx/AltosUI.app/Contents/Resources/Java
-       cp -p $(MACOSX_ICON) macosx/AltosUI.app/Contents/Resources
+       cp -p $(MACOSX_ICONS) macosx/AltosUI.app/Contents/Resources
        cp -p $(FATJAR) macosx/AltosUI.app/Contents/Resources/Java/altosui.jar
        cp -p libaltos.dylib macosx/AltosUI.app/Contents/Resources/Java
        cp -p $(ALTOSLIB_CLASS) macosx/AltosUI.app/Contents/Resources/Java
index b72772e290b786fd1777c6e609504f91bfb8852e..07de5b13094b78760a679f13b0c7ae75cfb6d405 100644 (file)
@@ -1,19 +1,25 @@
 !addplugindir Instdrv/NSIS/Plugins
+!addincludedir Instdrv/NSIS/Includes
 !include x64.nsh
-; Definitions for Java 1.7 Detection
-!define JRE_VERSION "1.7"
-!define JRE_ALTERNATE "1.6"
-!define JRE32_URL "http://javadl.sun.com/webapps/download/AutoDL?BundleId=83383&/jre-7u51-windows-i586.exe"
-!define JRE64_URL "http://javadl.sun.com/webapps/download/AutoDL?BundleId=83385&/jre-7u51-windows-x64.exe"
-!define PRODUCT_NAME "Altus Metrum Windows Software"
+!include java.nsh
+!include refresh-sh.nsh
 
-Name "Altus Metrum Installer"
+!define REG_NAME       "Altus Metrum"
+!define PROG_ID_TELEM  "altusmetrum.altosui.telem.1"
+!define PROG_ID_EEPROM "altusmetrum.altosui.eeprom.1"
+!define FAT_NAME       "altosui-fat.jar"
+!define WIN_APP_ICON   "altusmetrum-altosui.ico"
+!define WIN_APP_EXE    "altusmetrum-altosui.exe"
+!define WIN_TELEM_EXE  "application-vnd.altusmetrum.telemetry.exe"
+!define WIN_EEPROM_EXE "application-vnd.altusmetrum.eeprom.exe"
+
+Name "${REG_NAME} Installer"
 
 ; Default install directory
 InstallDir "$PROGRAMFILES\AltusMetrum"
 
 ; Tell the installer where to re-install a new version
-InstallDirRegKey HKLM "Software\AltusMetrum" "Install_Dir"
+InstallDirRegKey HKLM "Software\${REG_NAME}" "Install_Dir"
 
 LicenseText "GNU General Public License Version 2"
 LicenseData "../COPYING"
@@ -23,7 +29,7 @@ RequestExecutionLevel admin
 
 ShowInstDetails Show
 
-ComponentText "Altus Metrum Software and Driver Installer"
+ComponentText "${REG_NAME} Software and Driver Installer"
 
 Function .onInit
        DetailPrint "Checking host operating system"
@@ -35,43 +41,14 @@ Function .onInit
        ${EndIf}
 FunctionEnd
 
-Var JavaDownload
-Var JavaBits
-
-Function GetJRE
+Function un.onInit
+       DetailPrint "Checking host operating system"
        ${If} ${RunningX64}
-          StrCpy $JavaDownload ${JRE64_URL}
-          StrCpy $JavaBits "64"
-       ${Else}
-          StrCpy $JavaDownload ${JRE32_URL}
-          StrCpy $JavaBits "32"
+               DetailPrint "Installer running on 64-bit host"
+               SetRegView 64
+               StrCpy $INSTDIR "$PROGRAMFILES64\AltusMetrum"
+               ${DisableX64FSRedirection}
        ${EndIf}
-
-        MessageBox MB_OK "${PRODUCT_NAME} uses Java ${JRE_VERSION}, \
-                       $JavaBits bits, it will now \
-                        be downloaded and installed"
-
-        StrCpy $2 "$TEMP\Java Runtime Environment.exe"
-        nsisdl::download /TIMEOUT=30000 $JavaDownload $2
-        Pop $R0 ;Get the return value
-                StrCmp $R0 "success" +3
-                MessageBox MB_OK "Download failed: $R0"
-                Quit
-        ExecWait $2
-        Delete $2
-FunctionEnd
-
-Function DetectJRE
-  ReadRegStr $2 HKLM "SOFTWARE\JavaSoft\Java Runtime Environment" \
-             "CurrentVersion"
-
-  StrCmp $2 ${JRE_VERSION} done
-
-  StrCmp $2 ${JRE_ALTERNATE} done
-
-  Call GetJRE
-
-  done:
 FunctionEnd
 
 ; Pages to present
@@ -109,12 +86,12 @@ done:
 
 SectionEnd
 
-Section "AltosUI Application"
+Section "${REG_NAME} Application"
        Call DetectJRE
 
        SetOutPath $INSTDIR
 
-       File "altosui-fat.jar"
+       File "${FAT_NAME}"
        File "altoslib_@ALTOSLIB_VERSION@.jar"
        File "altosuilib_@ALTOSUILIB_VERSION@.jar"
        File "cmudict04.jar"
@@ -129,13 +106,13 @@ Section "AltosUI Application"
 
        File "*.dll"
 
-       File "../icon/*.ico"
+       File "../icon/${WIN_APP_ICON}"
 
-       CreateShortCut "$SMPROGRAMS\AltusMetrum.lnk" "$SYSDIR\javaw.exe" "-jar altosui-fat.jar" "$INSTDIR\altus-metrum.ico"
+       CreateShortCut "$SMPROGRAMS\${REG_NAME}.lnk" "$SYSDIR\javaw.exe" "-jar ${FAT_NAME}" "$INSTDIR\${WIN_APP_ICON}"
 SectionEnd
 
-Section "AltosUI Desktop Shortcut"
-       CreateShortCut "$DESKTOP\AltusMetrum.lnk" "$INSTDIR\altosui-fat.jar"  "" "$INSTDIR\altus-metrum.ico"
+Section "${REG_NAME} Desktop Shortcut"
+       CreateShortCut "$DESKTOP\${REG_NAME}.lnk" "$INSTDIR\${FAT_NAME}"  "" "$INSTDIR\${WIN_APP_ICON}"
 SectionEnd
 
 Section "TeleMetrum, TeleDongle and TeleBT Firmware"
@@ -145,6 +122,7 @@ Section "TeleMetrum, TeleDongle and TeleBT Firmware"
        File "../src/telemetrum-v1.0/telemetrum-v1.0-${VERSION}.ihx"
        File "../src/telemetrum-v1.1/telemetrum-v1.1-${VERSION}.ihx"
        File "../src/telemetrum-v1.2/telemetrum-v1.2-${VERSION}.ihx"
+       File "../src/telemetrum-v2.0/telemetrum-v2.0-${VERSION}.ihx"
        File "../src/telemini-v1.0/telemini-v1.0-${VERSION}.ihx"
        File "../src/telegps-v1.0/telegps-v1.0-${VERSION}.ihx"
        File "../src/teledongle-v0.2/teledongle-v0.2-${VERSION}.ihx"
@@ -167,38 +145,105 @@ Section "Documentation"
        File "../doc/telemini.pdf"
 SectionEnd
 
+Section "File Associations"
+
+       ${DisableX64FSRedirection}
+
+       SetOutPath $INSTDIR
+
+       File "../icon/${WIN_APP_EXE}"
+       File "../icon/${WIN_TELEM_EXE}"
+       File "../icon/${WIN_EEPROM_EXE}"
+
+       DeleteRegKey HKCR "${PROG_ID_TELEM}"
+       DeleteRegKey HKCR "${PROG_ID_EEPROM}"
+
+       DeleteRegKey   HKCR ".eeprom\${PROG_ID_EEPROM}"
+       DeleteRegValue HKCR ".eeprom\OpenWithProgids" "${PROG_ID_EEPROM}"
+       DeleteRegKey   HKCR ".telem\${PROG_ID_EEPROM}"
+       DeleteRegValue HKCR ".telem\OpenWithProgids" "${PROG_ID_EEPROM}"
+
+       ; .eeprom elements
+
+       WriteRegStr HKCR "${PROG_ID_EEPROM}"            ""                              "Altus Metrum Log File"
+       WriteRegStr HKCR "${PROG_ID_EEPROM}"            "FriendlyTypeName"              "Altus Metrum Log File"
+       WriteRegStr HKCR "${PROG_ID_EEPROM}\CurVer"     ""                              "${PROG_ID_EEPROM}"
+       WriteRegStr HKCR "${PROG_ID_EEPROM}\DefaultIcon" ""                             '"$INSTDIR\${WIN_EEPROM_EXE}",-101'
+  WriteRegExpandStr HKCR "${PROG_ID_EEPROM}\shell\open\command" ""                     '"%SYSTEMROOT%\System32\javaw.exe" -Djava.library.path="$INSTDIR" -jar "$INSTDIR\${FAT_NAME}" "%1"'
+
+       WriteRegStr HKCR ".eeprom"                      ""                              "${PROG_ID_EEPROM}"
+       WriteRegStr HKCR ".eeprom"                      "PerceivedType"                 "Altus Metrum Log File"
+       WriteRegStr HKCR ".eeprom"                      "Content Type"                  "application/vnd.altusmetrum.eeprom"
+
+       WriteRegStr HKCR ".eeprom\OpenWithProgids"      "${PROG_ID_EEPROM}"             ""
+       WriteRegStr HKCR ".eeprom\${PROG_ID_EEPROM}"    ""                              "${REG_NAME}"
+       
+       ; .telem elements
+       
+       WriteRegStr HKCR "${PROG_ID_TELEM}"             ""                              "Altus Metrum Telemetry File"
+       WriteRegStr HKCR "${PROG_ID_TELEM}"             "FriendlyTypeName"              "Altus Metrum Telemetry File"
+       WriteRegStr HKCR "${PROG_ID_TELEM}\CurVer"      ""                              "${PROG_ID_TELEM}"
+       WriteRegStr HKCR "${PROG_ID_TELEM}\DefaultIcon" ""                              '"$INSTDIR\${WIN_TELEM_EXE}",-101'
+  WriteRegExpandStr HKCR "${PROG_ID_TELEM}\shell\open\command" ""                      '"%SYSTEMROOT%\System32\javaw.exe" -Djava.library.path="$INSTDIR" -jar "$INSTDIR\${FAT_NAME}" "%1"'
+
+       WriteRegStr HKCR ".telem"                       ""                              "${PROG_ID_TELEM}"
+       WriteRegStr HKCR ".telem"                       "PerceivedType"                 "Altus Metrum Telemetry File"
+       WriteRegStr HKCR ".telem"                       "Content Type"                  "application/vnd.altusmetrum.telemetry"
+
+       WriteRegStr HKCR ".telem\OpenWithProgids"       "${PROG_ID_TELEM}"              ""
+       WriteRegStr HKCR ".telem\${PROG_ID_TELEM}"      ""                              "${REG_NAME}"
+
+       Call RefreshShellIcons
+SectionEnd
+       
 Section "Uninstaller"
 
        ; Deal with the uninstaller
 
+       ${DisableX64FSRedirection}
        SetOutPath $INSTDIR
 
        ; Write the install path to the registry
-       WriteRegStr HKLM SOFTWARE\AltusMetrum "Install_Dir" "$INSTDIR"
+       WriteRegStr HKLM "SOFTWARE\${REG_NAME}" "Install_Dir" "$INSTDIR"
 
        ; Write the uninstall keys for windows
-       WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\AltusMetrum" "DisplayName" "Altus Metrum"
-       WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\AltusMetrum" "UninstallString" '"$INSTDIR\uninstall.exe"'
-       WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\AltusMetrum" "NoModify" "1"
-       WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\AltusMetrum" "NoRepair" "1"
+       WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${REG_NAME}" "DisplayName" "${REG_NAME}"
+       WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${REG_NAME}" "UninstallString" '"$INSTDIR\uninstall-${REG_NAME}.exe"'
+       WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${REG_NAME}" "NoModify" "1"
+       WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${REG_NAME}" "NoRepair" "1"
 
-       WriteUninstaller "uninstall.exe"
+       WriteUninstaller "uninstall-${REG_NAME}.exe"
 SectionEnd
 
 Section "Uninstall"
-       DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\AltusMetrum"
-       DeleteRegKey HKLM "Software\AltusMetrum"
 
-       Delete "$INSTDIR\*.*"
-       RMDir "$INSTDIR"
+       ${DisableX64FSRedirection}
 
-       ; Remove devices
-       InstDrv::InitDriverSetup /NOUNLOAD {4D36E96D-E325-11CE-BFC1-08002BE10318} AltusMetrumSerial
-       InstDrv::DeleteOemInfFiles /NOUNLOAD
-       InstDrv::RemoveAllDevices
+       DeleteRegKey   HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${REG_NAME}"
+       DeleteRegKey   HKLM "SOFTWARE\${REG_NAME}"
+
+       DetailPrint "Delete uninstall reg entries"
+
+       DeleteRegKey   HKCR "${PROG_ID_EEPROM}"
+       DeleteRegKey   HKCR "${PROG_ID_TELEM}"
+
+       DeleteRegKey   HKCR ".eeprom\${PROG_ID_EEPROM}"
+       DeleteRegValue HKCR ".eeprom\OpenWithProgids" "${PROG_ID_EEPROM}"
+
+       DeleteRegKey   HKCR ".telem\${PROG_ID_TELEM}"
+       DeleteRegValue HKCR ".telem\OpenWithProgids" "${PROG_ID_TELEM}"
+
+       DetailPrint "Delete file association reg entries"
+
+       Delete "$INSTDIR\${FAT_NAME}"
+       Delete "$INSTDIR\uninstall-${REG_NAME}.exe"
+
+       Delete "$INSTDIR\${WIN_APP_ICON}"
+       Delete "$INSTDIR\${WIN_APP_EXE}"
 
        ; Remove shortcuts, if any
-       Delete "$SMPROGRAMS\AltusMetrum.lnk"
-       Delete "$DESKTOP\AltusMetrum.lnk"
+       Delete "$SMPROGRAMS\${REG_NAME}.lnk"
+       Delete "$DESKTOP\${REG_NAME}.lnk"
        
+       Call un.RefreshShellIcons
 SectionEnd
diff --git a/altosui/altos.desktop.in b/altosui/altos.desktop.in
deleted file mode 100644 (file)
index 6611434..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-[Desktop Entry]
-Type=Application
-Name=AltOS UI
-GenericName=Altus Metrum Ground Station
-Comment=View and log downlink data from Altus Metrum products
-Icon=%icondir%/altusmetrum.svg
-Exec=%bindir%/altosui %f
-Terminal=false
-MimeType=text/plain;
-Categories=Education;Electronics;Science;
diff --git a/altosui/altusmetrum-altosui.desktop.in b/altosui/altusmetrum-altosui.desktop.in
new file mode 100644 (file)
index 0000000..10fd9e9
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Type=Application
+Version=1.0
+Name=AltOS UI
+GenericName=Altus Metrum Ground Station
+Comment=View and log downlink data from Altus Metrum products
+Icon=%icondir%/altusmetrum-altosui.svg
+Exec=%bindir%/altosui %f
+Terminal=false
+MimeType=application/vnd.altusmetrum.telemetry;application/vnd.altusmetrum.eeprom
+Categories=Education;Electronics;Science;
index beefa532b0affc86c0194a816b1e7d101738a853..2c0850213627a6083751d984e493ec807d2c68c1 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import libaltosJNI.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public class AltosBTDevice extends altos_bt_device implements AltosDevice {
 
index cad60ffba5216f48f63d1452c47561cf4c106327..c99b27f94e8d0c3b0d309c994960e7405408cbd7 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.util.*;
 import libaltosJNI.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public class AltosBTDeviceIterator implements Iterator<AltosBTDevice> {
        AltosBTDevice   current;
index 02883c759dbe4203b6c4c63b4fde4a1e796afec1..c526269d12ef871b4549b46d14669b285e48e3c1 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.util.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public class AltosBTKnown implements Iterable<AltosBTDevice> {
        LinkedList<AltosBTDevice>       devices = new LinkedList<AltosBTDevice>();
index 6da0a3ebcc22199b14b721506c48d9957913ceba..b953ca923d484f1f6ba4b72b88510443121457ab 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.awt.*;
 import java.awt.event.*;
@@ -23,7 +23,7 @@ import javax.swing.*;
 import javax.swing.plaf.basic.*;
 import java.util.*;
 import java.util.concurrent.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public class AltosBTManage extends AltosUIDialog implements ActionListener, Iterable<AltosBTDevice> {
        LinkedBlockingQueue<AltosBTDevice> found_devices;
index 0a5e4fa28d606bf43b3f242a19d7db65692197e4..6328d37dea1bd67d0934dea8941fdc755840b471 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
 import java.io.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public class AltosCSVUI
        extends AltosUIDialog
index 6dcd63b8dcb35624634814897e4b7c1fa2c8e161..a0525a00886eb7697575680a57032b752c956e56 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
 import java.util.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 class AltosEditFreqUI extends AltosUIDialog implements ActionListener {
        Frame           frame;
index 59891c4a8cecc90226c8ee9a582ab47e36b48651..1990faf1f4d73c2e2af315fcded7691d733a1a73 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import javax.swing.*;
 import javax.swing.filechooser.FileNameExtensionFilter;
 import java.io.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public class AltosDataChooser extends JFileChooser {
        JFrame  frame;
index 251ae994cb21087c417ebd31ae8e96061289bb8e..1f5536ffe4fea88a324494ae1043aec05a83ac00 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import libaltosJNI.*;
 
index 0bedea97b75019ea597cf160a493491fb8ffae7f..0875bea7301a85ee6aee7a7df1ad67ad7e8b6dfb 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import javax.swing.*;
 import java.awt.*;
index 3013612ab9199f5c641f1edc039ac4d91b6645b6..80a76d6d6c2d532abb061cdd0d17b8cb215eb77a 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import javax.swing.*;
 import java.awt.*;
index 06bc68a912003f41e58bc79c4bec53d6c9bbe126..6b6e03e7372baa86c778f52e7946ee54ef914dca 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.awt.*;
 import javax.swing.*;
 import java.io.*;
 import java.text.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public class AltosDisplayThread extends Thread {
 
index 981daddfa708ff01269c9b57cf27879e8a346740..39585dad3793aef24bdc01c7fb56e09f8fc5c06f 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.awt.event.*;
 import javax.swing.*;
 import java.io.*;
 import java.util.concurrent.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public class AltosEepromDelete implements Runnable {
        AltosEepromList         flights;
index 2b967339ad4bb0d8019df44ae118caea23212fe1..81dd3d13e4eb50a01bb50a6d0408f91f741cc1fc 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.awt.event.*;
 import javax.swing.*;
 import java.io.*;
 import java.util.concurrent.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public class AltosEepromManage implements ActionListener {
 
index b1e85622cdd690faee717cc0ede6a6abcfe16947..060d0474f888b872b64c3eceb185d921a67621f0 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.awt.*;
 import java.awt.event.*;
index 02c71cd97ccf424d6a3b140cf283c1d24f0c2dea..11dd4adb3f51c062f000a6d9ff8fbb3328eb9d15 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public class AltosEepromMonitorUI extends AltosUIDialog implements AltosEepromMonitor {
        JFrame          owner;
index 293d3045831a4e2ac0ab4028ec61ba00db1ae268..1adfdab57256df407ff6fbc9e9ec93e22332a888 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import javax.swing.*;
 import javax.swing.border.*;
 import java.awt.*;
 import java.awt.event.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 class AltosEepromItem implements ActionListener {
        AltosEepromLog  log;
index 3f1206170f170deafcece0f0eed349b685139ff1..0ed4e75df4616c90fff87de9cbe12ecb6b2adf61 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.awt.*;
 import java.awt.event.*;
@@ -23,7 +23,7 @@ import javax.swing.*;
 import javax.swing.filechooser.FileNameExtensionFilter;
 import java.io.*;
 import java.util.concurrent.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public class AltosFlashUI
        extends AltosUIDialog
index 55b74034b7255b9bd11e2aafa0bf892cc3ea6ad5..d0f20bb49d2dd08c86f9499dd7aec473609f41e2 100644 (file)
@@ -15,9 +15,9 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public interface AltosFlightDisplay extends AltosUnitsListener, AltosFontListener {
        void reset();
index 3995efb3125232b6e36cb9b883ed1108bf292f5f..0bc4f847ca1fef7a2c403bf4980dfa744750ecd4 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import javax.swing.table.*;
 
index 703dfb9d46b44c85980731620c6b0c47103e94bb..1ec4a03e5030615a42a2652ef4112b1505b02af3 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.awt.*;
 import javax.swing.*;
 import java.util.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public class AltosFlightStatsTable extends JComponent implements AltosFontListener {
        GridBagLayout   layout;
index a98cc13179c1122f7bfd0ab0a9f7d121172d6b3d..a1b2170bff2561d3057830ebd5014f32cfcd4d24 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 public interface AltosFontListener {
        void font_size_changed(int font_size);
index e1299aaebe89401c5dd3b7898bbb85bafb72007f..293ce0329aabce6116735a71d0cf3a1c80a5d9ef 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
+import java.util.*;
 import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
+import java.awt.event.*;
+import org.altusmetrum.altoslib_5.*;
 
-public class AltosFreqList extends JComboBox<AltosFrequency> {
+class FreqEntry extends JMenuItem {
+       AltosFrequency  frequency;
+
+       public FreqEntry(AltosFrequency frequency) {
+               super(frequency.toShortString());
+               this.frequency = frequency;
+       }
+}
+
+public class AltosFreqList extends JMenu implements ActionListener {
 
        String  product;
        int     serial;
        int     calibrate;
 
+       AltosFrequency[]        frequencies = new AltosFrequency[0];
+
+       int     selected = -1;
+
+       LinkedList<ActionListener> action_listeners = new LinkedList<ActionListener>();
+
+       public void addActionListener(ActionListener listener) {
+               action_listeners.add(listener);
+       }
+
+       public void removeActionListener(ActionListener listener) {
+               action_listeners.remove(listener);
+       }
+
+       public void actionPerformed(ActionEvent ev) {
+               FreqEntry e = (FreqEntry) ev.getSource();
+               set_selected(e.frequency);
+               ActionEvent event = new ActionEvent(e.frequency, 0, "selected");
+               for (ActionListener l : action_listeners)
+                       l.actionPerformed(event);
+       }
+
+       boolean label = true;
+
+       public void set_label(boolean label) {
+               this.label = label;
+               set_label();
+       }
+
+       private void set_label() {
+               String  new_text = "";
+               if (0 <= selected && selected < frequencies.length) {
+                       AltosFrequency  frequency = frequencies[selected];
+                       new_text = String.format("%s%7.3f MHz (%s) â–¾",
+                                                label ? "Frequency: " : "",
+                                                frequency.frequency,
+                                                frequency.description);
+               }
+               setText(new_text);
+       }
+
+       private void set_selected(AltosFrequency frequency) {
+               for (int i = 0; i < frequencies.length; i++) {
+                       if (frequencies[i].frequency == frequency.frequency) {
+                               selected = i;
+                               set_label();
+                       }
+               }
+       }
+
+       private AltosFrequency get_selected() {
+               if (0 <= selected && selected < frequencies.length)
+                       return frequencies[selected];
+               return null;
+       }
+
+       private void add(AltosFrequency add) {
+               int insert;
+
+               for (insert = 0; insert < frequencies.length; insert++) {
+                       if (frequencies[insert].frequency == add.frequency)
+                               return;
+                       if (add.frequency < frequencies[insert].frequency)
+                               break;
+               }
+
+               AltosFrequency[]        new_frequencies = new AltosFrequency[frequencies.length + 1];
+
+               for (int before = 0; before < insert; before++)
+                       new_frequencies[before] = frequencies[before];
+               new_frequencies[insert] = add;
+
+               for (int after = insert; after < frequencies.length; after++)
+                       new_frequencies[after+1] = frequencies[after];
+
+               frequencies = new_frequencies;
+
+               FreqEntry       e = new FreqEntry(add);
+               add(e, insert);
+               e.addActionListener(this);
+       }
+
+       private void remove(AltosFrequency remove) {
+               int delete;
+               for (delete = 0; delete < frequencies.length; delete++) {
+                       if (frequencies[delete].frequency == remove.frequency)
+                               break;
+                       if (remove.frequency < frequencies[delete].frequency)
+                               return;
+               }
+
+               remove(delete);
+
+               AltosFrequency[]        new_frequencies = new AltosFrequency[frequencies.length - 1];
+
+               for (int before = 0; before < delete; before++)
+                       new_frequencies[before] = frequencies[before];
+
+               for (int after = delete + 1; after < frequencies.length; after++)
+                       new_frequencies[after-1] = frequencies[after];
+               frequencies = new_frequencies;
+       }
+
        public void set_frequency(double new_frequency) {
                int i;
 
@@ -34,25 +148,21 @@ public class AltosFreqList extends JComboBox<AltosFrequency> {
                        return;
                }
 
-               for (i = 0; i < getItemCount(); i++) {
-                       AltosFrequency  f = (AltosFrequency) getItemAt(i);
+               for (i = 0; i < frequencies.length; i++) {
+                       AltosFrequency  f = frequencies[i];
 
                        if (f.close(new_frequency)) {
-                               setSelectedIndex(i);
+                               set_selected(f);
                                return;
                        }
                }
-               for (i = 0; i < getItemCount(); i++) {
-                       AltosFrequency  f = (AltosFrequency) getItemAt(i);
 
-                       if (new_frequency < f.frequency)
-                               break;
-               }
                String  description = String.format("%s serial %d", product, serial);
                AltosFrequency  frequency = new AltosFrequency(new_frequency, description);
                AltosUIPreferences.add_common_frequency(frequency);
-               insertItemAt(frequency, i);
-               setMaximumRowCount(getItemCount());
+
+               add(frequency);
+               set_selected(frequency);
        }
 
        public void set_product(String new_product) {
@@ -64,22 +174,33 @@ public class AltosFreqList extends JComboBox<AltosFrequency> {
        }
 
        public double frequency() {
-               AltosFrequency  f = (AltosFrequency) getSelectedItem();
+               AltosFrequency  f = get_selected();
                if (f != null)
                        return f.frequency;
                return 434.550;
        }
 
-       public AltosFreqList () {
-               super(AltosUIPreferences.common_frequencies());
-               setMaximumRowCount(getItemCount());
-               setEditable(false);
+       public AltosFreqList(double in_frequency, boolean label) {
+               super();
+               this.label = label;
+
+               for (AltosFrequency frequency: AltosUIPreferences.common_frequencies())
+                       add(frequency);
                product = "Unknown";
                serial = 0;
-       }
 
+               if (in_frequency != 0)
+                       set_frequency(in_frequency);
+       }
        public AltosFreqList(double in_frequency) {
-               this();
-               set_frequency(in_frequency);
+               this(in_frequency, true);
+       }
+
+       public AltosFreqList (boolean label) {
+               this(0, label);
+       }
+
+       public AltosFreqList () {
+               this(0, true);
        }
 }
index f8c8b27b762e7b506332b5bd426c6734c9078a7b..292437de9879f52076742f0ff42cc77d1de9bb66 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.io.*;
 import java.util.ArrayList;
 
 import java.awt.*;
 import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 import org.jfree.ui.*;
 import org.jfree.chart.*;
index 3aff1e826b488d7e83306ed628fa0153ae193b7e..14486abfa7b1d76f5027bd61a50db61dc59df650 100644 (file)
@@ -15,9 +15,9 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public class AltosGraphDataPoint implements AltosUIDataPoint {
 
index 36933e9bf09288f03b69e63baa4e7cea403bfef3..0845f20ecbf87fcc59a8de6d0f83e8fff0efc555 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.lang.*;
 import java.io.*;
 import java.util.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 class AltosGraphIterator implements Iterator<AltosUIDataPoint> {
        AltosGraphDataSet       dataSet;
index 23ae4ae507ce5fd795540abd4971e2dfc74aeeb8..ce986ac598b0097d2582a989388a898c20eaa7d9 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
 import javax.swing.table.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public class AltosInfoTable extends JTable implements AltosFlightDisplay, HierarchyListener {
        private AltosFlightInfoTableModel model;
index 2debb62a40f6eddd3e06a596a193fb2999afa984..0dd5740cae3e5ad2e080d0ee4afb58ac98d2e8f6 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import javax.swing.*;
 
index c91b70e9348f65be17e7f475049484594fd37334..30934d96ad84104977c156c574b691ad4776ffac 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.awt.*;
 import javax.swing.*;
index 34cf1650179cb3e95aad061fb56d0679fa06f6ab..dfc3c649c2adf4defc07572b33bb42e11ed239ae 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 public interface AltosPositionListener {
        public void position_changed(int position);
index 8f002c4a2a4b3ff96e47e5342c38d6ce92c88ed5..481ce6565087d8b018d70ab8db062b81c499cd53 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public class AltosRomconfigUI
        extends AltosUIDialog
index b0cde0591c1ab28ba8b78465871da01ffe40a9a0..7e1c7a9705bfb4642b534b573e0f5680b209f858 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.awt.*;
 import java.awt.event.*;
@@ -25,7 +25,7 @@ import java.io.*;
 import java.util.*;
 import java.text.*;
 import java.util.concurrent.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 class AltosScanResult {
        String          callsign;
index 60e15bdb094c9b0d664ef8940f587090e34062e1..0eba55fd36f7078d763ef7e7ae9ada1c96686a94 100644 (file)
  * Deal with TeleDongle on a serial port
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.io.*;
 import java.util.*;
 import java.awt.*;
 import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 import libaltosJNI.*;
 
 /*
index 1e8207d1b0daff086cf26ceb97f023498d0285c2..cd19b101105ce3dccdb61a6022356a8c004e07b1 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 public class AltosSerialInUseException extends Exception {
        public AltosDevice      device;
index 74561673fde97f92cb53eee15353d3765259b5a3..1b5b92053cace56d7d0e9e34431e28c7fc7fec2e 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.io.*;
 import java.util.ArrayList;
 
 import java.awt.*;
 import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 import org.jfree.ui.*;
 import org.jfree.chart.*;
index 920ed8e287a10c126c930cc3f41a2ac3376e1e9e..5648d1dfd5f78811c0b9981e3f5437e258133fc1 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.awt.*;
 import java.awt.event.*;
@@ -223,6 +223,31 @@ public class AltosUIConfigure
                row++;
        }
 
+       static final Integer map_caches[] = { 9, 25, 100 };
+
+       public void add_map_cache() {
+               pane.add(new JLabel("Map Cache Size"), constraints(0, 1));
+
+               final JComboBox<Integer> map_cache = new JComboBox<Integer>(map_caches);
+
+               map_cache.setEditable(true);
+               map_cache.addActionListener(new ActionListener() {
+                               public void actionPerformed(ActionEvent e) {
+                                       try {
+                                               int     size = (Integer) (map_cache.getSelectedItem());
+
+                                               AltosUIPreferences.set_map_cache(size);
+                                       } catch (ClassCastException ce) {
+                                               map_cache.setSelectedItem(new Integer(AltosUIPreferences.map_cache()));
+                                       }
+                               }
+                       });
+
+               map_cache.setSelectedItem (new Integer(AltosUIPreferences.map_cache()));
+               pane.add(map_cache, constraints(1, 2, GridBagConstraints.BOTH));
+               row++;
+       }
+
        public void add_bluetooth() {
        }
 
@@ -243,7 +268,9 @@ public class AltosUIConfigure
                         constraints(0, 3));
                row++;
 
-               pane.add(new JLabel (String.format("AltOS version %s", AltosUIVersion.version)),
+               pane.add(new JLabel (String.format("AltOS version %s (%smaps key)",
+                                                  AltosUIVersion.version,
+                                                  AltosUIVersion.has_google_maps_api_key() ? "" : "no ")),
                         constraints(0, 3));
                row++;
 
@@ -255,6 +282,7 @@ public class AltosUIConfigure
                add_font_size();
                add_look_and_feel();
                add_position();
+               add_map_cache();
                add_bluetooth();
                add_frequencies();
 
index 353ff30ff308b4b33117a37ad4234099c6614ff3..9a810a41de670e849af16af74d858c70eed13d2b 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 public class AltosUIDataMissing extends Exception {
        public int      id;
index 3f16500e1d17ce5d619ca1225b702ff7e437f859..f72bbcd5e92da902a6f6f3e9677e6ad320e3034b 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 public interface AltosUIDataPoint {
        public abstract double x() throws AltosUIDataMissing;
index ee70a3fd6a57ac52f013bc47c51dcff00e30280c..9e048587c3861799f472dd37d052e03b1827c02a 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 public interface AltosUIDataSet {
        public abstract String name();
index dc737414532718a14c236925f0ce442be200ed2c..9fc5283efebeca4a1c8c5b2ebf6b57ca38aa5a63 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.awt.*;
 import java.awt.event.*;
index da98797a7cfd7ae54f78cc6fe0fa5941bb5c6eab..e227d2b774e283d6a9690f7b7ef614e0437f3672 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.awt.*;
 import java.awt.event.*;
@@ -23,7 +23,7 @@ import javax.swing.*;
 import java.io.*;
 import java.util.concurrent.*;
 import java.util.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 import org.jfree.ui.*;
 import org.jfree.chart.*;
index 039d83e09d9c0600be32403d17efb50a86ea9441..74161634193d58b509e11675fa411f28b80d67bd 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.util.*;
 import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public abstract class AltosUIFlightTab extends JComponent implements AltosFlightDisplay, HierarchyListener {
        public GridBagLayout    layout;
index 6e62c762948d83578814c5b26d4534a0c92ff352..5b915e85aba3c5ec4c059a3e7fb8554c7187abd9 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.awt.*;
 import java.awt.event.*;
@@ -157,11 +157,72 @@ public class AltosUIFrame extends JFrame implements AltosUIListener, AltosPositi
                }
        }
 
+       static boolean global_settings_done;
+
+       public String getName() {
+               return "Altus Metrum";
+       }
+
+       public void macosx_quit_handler() {
+               System.out.printf("Got quit handler\n");
+       }
+
+       public void macosx_about_handler() {
+               System.out.printf("Got about handler\n");
+       }
+
+       public void macosx_preferences_handler() {
+               System.out.printf("Got preferences handler\n");
+       }
+
+       public void macosx_file_handler(String path) {
+               System.out.printf("Got file handler with \"%s\"\n", path);
+       }
+
+       /* Check that we are on Mac OS X.  This is crucial to loading and using the OSXAdapter class.
+        */
+       public static boolean MAC_OS_X = (System.getProperty("os.name").toLowerCase().startsWith("mac os x"));
+
+       private static boolean registered_for_macosx_events;
+
+       /* Generic registration with the Mac OS X application menu
+        * Checks the platform, then attempts to register with the Apple EAWT
+        * See OSXAdapter.java to see how this is done without directly referencing any Apple APIs
+        */
+       public synchronized void register_for_macosx_events() {
+               if (registered_for_macosx_events)
+                       return;
+               registered_for_macosx_events = true;
+               if (MAC_OS_X) {
+                       try {
+                               // Generate and register the OSXAdapter, passing it a hash of all the methods we wish to
+                               // use as delegates for various com.apple.eawt.ApplicationListener methods
+                               OSXAdapter.setQuitHandler(this, getClass().getDeclaredMethod("macosx_quit_handler", (Class[])null));
+//                             OSXAdapter.setAboutHandler(this, getClass().getDeclaredMethod("macosx_about_handler", (Class[])null));
+                               OSXAdapter.setPreferencesHandler(this, getClass().getDeclaredMethod("macosx_preferences_handler", (Class[])null));
+                               OSXAdapter.setFileHandler(this, getClass().getDeclaredMethod("macosx_file_handler", new Class[] { String.class }));
+                       } catch (Exception e) {
+                               System.err.println("Error while loading the OSXAdapter:");
+                               e.printStackTrace();
+                       }
+               }
+       }
        void init() {
                AltosUIPreferences.register_ui_listener(this);
                AltosUIPreferences.register_position_listener(this);
                position = AltosUIPreferences.position();
                addWindowListener(new AltosUIFrameListener());
+
+               /* Try to make menus live in the menu bar like regular Mac apps */
+               if (!global_settings_done) {
+                       try {
+                               global_settings_done = true;
+                               System.setProperty("com.apple.mrj.application.apple.menu.about.name", getName());
+                               System.setProperty("com.apple.macos.useScreenMenuBar", "true");
+                               System.setProperty("apple.laf.useScreenMenuBar", "true" ); // for older versions of Java
+                       } catch (Exception e) {
+                       }
+               }
                set_icon();
        }
 
index 9cca088de48cfd38d23262f3e26d36618ee90522..870c4e9356de5fd82d468ba2b0e6b4f200900424 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.io.*;
 import java.util.ArrayList;
 
 import java.awt.*;
 import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 import org.jfree.ui.*;
 import org.jfree.chart.*;
index 724fac18de3a9ef39bfb89b8920c81e039fe3e9d..39accab44405b208da65268d651e936665204c3e 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.io.*;
 import java.util.ArrayList;
 
 import java.awt.*;
 import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 import org.jfree.ui.*;
 import org.jfree.chart.*;
index b1626cba8ea29517098529554a297f745c96e8a5..d17078e781b17c1d3f55119796d4311d660d33b2 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.awt.*;
 import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public abstract class AltosUIIndicator implements AltosFontListener, AltosUnitsListener {
        JLabel          label;
index 688dd58bdf87ac074b6a6125827eeff07d81b2f5..a15bf19fec5c59f0f9437eb0829e8172c337327b 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.awt.*;
 import java.awt.event.*;
@@ -25,7 +25,7 @@ import java.lang.Math;
 import java.awt.geom.*;
 import java.util.*;
 import java.util.concurrent.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public class AltosUILatLon {
        public double   lat;
index b51c5963314a41dc57d794a86e99b66d26d905c2..0050f12c24e9471c871e459cfb13693540daa051 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.awt.*;
 import libaltosJNI.*;
 
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public class AltosUILib extends AltosLib {
 
index 75a0ad949cc7e6b1555acae2874777f7792d29e6..a32d310c4b9c0ec2726009f01776d652c916d423 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 public interface AltosUIListener {
        public void ui_changed(String look_and_feel);
index aaa68f238c893549641585858a12dc291bff6ce0..c22801f8bea098bc022a504c8a9d67022b264c95 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.awt.*;
 import java.awt.event.*;
@@ -25,7 +25,7 @@ import java.lang.Math;
 import java.awt.geom.*;
 import java.util.*;
 import java.util.concurrent.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public class AltosUIMap extends JComponent implements AltosFlightDisplay, AltosUIMapZoomListener {
 
index 55311d8c8ad5ecf29051c0af530ab65ef3a9586e..9cc32e24d4adec1544f1d69c8eba6e915c63932c 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import javax.swing.*;
 import javax.imageio.ImageIO;
@@ -24,33 +24,36 @@ import java.awt.*;
 import java.io.*;
 import java.net.*;
 
-public class AltosUIMapCache {
+public class AltosUIMapCache implements AltosUIMapCacheListener {
        static final int        success = 0;
        static final int        loading = 1;
        static final int        failed = 2;
        static final int        bad_request = 3;
        static final int        forbidden = 4;
 
-       static final int        min_cache_size = 9;
-       static final int        max_cache_size = 24;
+       int                     min_cache_size;         /* configured minimum cache size */
+       int                     cache_size;             /* current cache size */
+       int                     requested_cache_size;   /* cache size computed by application */
 
        private Object          fetch_lock = new Object();
        private Object          cache_lock = new Object();
 
-       int                     cache_size = min_cache_size;
-
        AltosUIMapImage[]       images = new AltosUIMapImage[cache_size];
 
        long                    used;
 
        public void set_cache_size(int new_size) {
+
+               requested_cache_size = new_size;
+
                if (new_size < min_cache_size)
                        new_size = min_cache_size;
-               if (new_size > max_cache_size)
-                       new_size = max_cache_size;
+
                if (new_size == cache_size)
                        return;
 
+               System.out.printf("cache size now %d\n", new_size);
+
                synchronized(cache_lock) {
                        AltosUIMapImage[]       new_images = new AltosUIMapImage[new_size];
 
@@ -91,8 +94,12 @@ public class AltosUIMapCache {
                        try {
                                image = new AltosUIMapImage(tile, store);
                                image.used = used++;
-                               if (images[oldest] != null)
+                               if (images[oldest] != null) {
+                                       System.out.printf("drop %s\n", images[oldest].store.file.toString());
                                        images[oldest].flush();
+                               }
+
+                               System.out.printf("load %s\n", store.file.toString());
 
                                images[oldest] = image;
 
@@ -109,6 +116,28 @@ public class AltosUIMapCache {
                }
        }
 
+       public void map_cache_changed(int map_cache) {
+               min_cache_size = map_cache;
+
+               set_cache_size(requested_cache_size);
+       }
+
+       public void dispose() {
+               AltosUIPreferences.unregister_map_cache_listener(this);
+
+               for (int i = 0; i < cache_size; i++) {
+                       AltosUIMapImage image = images[i];
+
+                       if (image != null)
+                           image.flush();
+               }
+       }
+
        public AltosUIMapCache() {
+               min_cache_size = AltosUIPreferences.map_cache();
+
+               set_cache_size(0);
+
+               AltosUIPreferences.register_map_cache_listener(this);
        }
 }
diff --git a/altosuilib/AltosUIMapCacheListener.java b/altosuilib/AltosUIMapCacheListener.java
new file mode 100644 (file)
index 0000000..680d123
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Copyright Â© 2014 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+package org.altusmetrum.altosuilib_3;
+
+public interface AltosUIMapCacheListener {
+       public void map_cache_changed(int map_cache);
+}
index 3819d0790939369fd2ac6cbc9eb0bad0e351371e..77cd4299b3c5fdc0bf60d08c693f6ae1ae15f4ca 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import javax.swing.*;
 import javax.imageio.ImageIO;
index e09a2d9f09eb037db57e8af8f4b43aeaabb06712..32437d4ec513ad7c301784dfeed72ee782e64699 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.awt.*;
 import java.awt.event.*;
@@ -25,12 +25,13 @@ import java.lang.Math;
 import java.awt.geom.*;
 import java.util.*;
 import java.util.concurrent.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public class AltosUIMapLine {
        AltosUILatLon   start, end;
 
        private Font    font = null;
+       static public int stroke_width = 6;
 
        public void set_font(Font font) {
                this.font = font;
@@ -87,19 +88,24 @@ public class AltosUIMapLine {
        }
 
        public void paint(Graphics2D g, AltosUIMapTransform t) {
-               g.setColor(Color.BLUE);
 
                if (start == null || end == null)
                        return;
 
+               g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
+
                Line2D.Double line = new Line2D.Double(t.screen(start),
                                                       t.screen(end));
 
+               g.setColor(Color.WHITE);
+               g.setStroke(new BasicStroke(stroke_width+4, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
+               g.draw(line);
+
+               g.setColor(Color.BLUE);
+               g.setStroke(new BasicStroke(stroke_width, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
                g.draw(line);
 
                String  message = line_dist();
-               g.setFont(font);
-               g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
                Rectangle2D     bounds;
                bounds = font.getStringBounds(message, g.getFontRenderContext());
 
@@ -111,6 +117,13 @@ public class AltosUIMapLine {
                } else {
                        x += 2.0f;
                }
+
+               g.setFont(font);
+               g.setColor(Color.WHITE);
+               for (int dy = -2; dy <= 2; dy += 2)
+                       for (int dx = -2; dx <= 2; dx += 2)
+                               g.drawString(message, x + dx, y + dy);
+               g.setColor(Color.BLUE);
                g.drawString(message, x, y);
        }
 }
index 8c640e5fa6223cf7f3b22a0801facd21badb29f5..47fc4d5e28ab54e6f5be959a7b277eb794f3fe43 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.awt.*;
 import java.awt.event.*;
@@ -25,7 +25,7 @@ import java.lang.Math;
 import java.awt.geom.*;
 import java.util.*;
 import java.util.concurrent.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public class AltosUIMapMark {
 
index ff17be6735604a0c65fe56ee02aa4caf2c2dc14f..705f4b6a8b2c6f2e95c632a1084461f4cf3338d0 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.awt.*;
 import java.awt.event.*;
@@ -25,7 +25,7 @@ import java.lang.Math;
 import java.awt.geom.*;
 import java.util.*;
 import java.util.concurrent.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 class PathPoint {
        AltosUILatLon   lat_lon;
index 56066d70b25764a3ad0fb661112172123c82caa9..1c088a497cf202bbcd031687ed59c0093c2d9359 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.awt.*;
 import java.awt.event.*;
@@ -26,7 +26,7 @@ import java.text.*;
 import java.lang.Math;
 import java.net.URL;
 import java.net.URLConnection;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 class AltosUIMapPos extends Box {
        AltosUIFrame    owner;
index 8a5b16e15313635e6e5dc1feb08271ac4993c05a..463ef3f21de7c6d05950b0db4a5ef1ddedbba306 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 public class AltosUIMapRectangle {
        AltosUILatLon   ul, lr;
index 4cecb54f319cbb42b04491ec657f854ae27e1ab9..dd8ace32c7c0800768a19becbb0ebcde4c072b65 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.io.*;
 import java.net.*;
index 91aff00cd5b19cc33a13594d0240bfc32b17fe24..0bbd2bc93c6bebfac7fb1d048c2850be45a7fa28 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 public interface AltosUIMapStoreListener {
        abstract void notify_store(AltosUIMapStore store, int status);
index 7c82318302370320d36a0f1d5203ffd8d5ed6731..8b6a8f0a3862a3f49f0946fc6382fe0daae1822e 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.awt.*;
 import java.awt.image.*;
@@ -25,7 +25,7 @@ import java.awt.geom.*;
 import java.io.*;
 import java.util.*;
 import java.awt.RenderingHints.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public class AltosUIMapTile {
        AltosUIMapTileListener  listener;
index 4ca135392c1864cb5aec2ec7b463f56fae9c3855..f58f55e0defb8662803e5778503118aeb5e071fe 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 public interface AltosUIMapTileListener {
        abstract public void notify_tile(AltosUIMapTile tile, int status);
index e6f1ffe32b1e891b41cc5d4a02182fee331257f2..89a3e9f682b95f6ba88e7848795b92fdbc3e40fe 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.awt.*;
 import java.awt.event.*;
@@ -25,7 +25,7 @@ import java.lang.Math;
 import java.awt.geom.*;
 import java.util.*;
 import java.util.concurrent.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public class AltosUIMapTransform {
 
index a14fde6583e42cb64b938a49168dce22c751897f..70b8e2e92c8fb7772e387ce9d209df809a472145 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.awt.*;
 import java.awt.event.*;
@@ -26,7 +26,7 @@ import java.lang.*;
 import java.awt.geom.*;
 import java.util.*;
 import java.util.concurrent.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public class AltosUIMapView extends Component implements MouseMotionListener, MouseListener, MouseWheelListener, ComponentListener, AltosUIMapTileListener, AltosUIMapStoreListener {
 
@@ -67,7 +67,7 @@ public class AltosUIMapView extends Component implements MouseMotionListener, Mo
        AltosUILatLon           centre;
 
        public void set_font() {
-               line.set_font(AltosUILib.value_font);
+               line.set_font(AltosUILib.status_font);
                for (AltosUIMapTile tile : tiles.values())
                        tile.set_font(AltosUILib.value_font);
                repaint();
@@ -370,7 +370,7 @@ public class AltosUIMapView extends Component implements MouseMotionListener, Mo
                for (Point point : to_remove)
                        tiles.remove(point);
 
-               cache.set_cache_size(((lower_right.y - upper_left.y) / px_size + 1) * ((lower_right.x - upper_left.x) / px_size + 1));
+               cache.set_cache_size((getWidth() / px_size + 2) * (getHeight() / px_size + 2));
                for (int y = upper_left.y; y <= lower_right.y; y += px_size) {
                        for (int x = upper_left.x; x <= lower_right.x; x += px_size) {
                                Point point = new Point(x, y);
index 02e8bb5118a4f5a00da344759b8c53a83efcda56..23498c89c7d41a781f880bad4f6e30917edde7d6 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 public interface AltosUIMapZoomListener {
        abstract public void zoom_changed(int zoom);
index cd6fa589a90dbc33593f4a92347c972f2168aa0e..5e9809ee07660149c6e58fb02e7dcc574cbd8fb6 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.io.*;
 import java.util.ArrayList;
 
 import java.awt.*;
 import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 import org.jfree.ui.*;
 import org.jfree.chart.*;
index 7a582a7d5d3d25bb84f77dd3159a1402378aaabf..ecab20d4ee7e54846660002fe4a5775dad110b5d 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.io.*;
 import java.util.*;
 import java.awt.Component;
 import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public class AltosUIPreferences extends AltosPreferences {
 
@@ -34,6 +34,9 @@ public class AltosUIPreferences extends AltosPreferences {
        /* Window position preference name */
        final static String positionPreference = "POSITION";
 
+       /* Maps cache size preference name */
+       final static String mapCachePreference = "MAP-CACHE";
+
        /* UI Component to pop dialogs up */
        static Component component;
 
@@ -52,6 +55,10 @@ public class AltosUIPreferences extends AltosPreferences {
 
        public static int position = AltosUILib.position_top_left;
 
+       static LinkedList<AltosUIMapCacheListener> map_cache_listeners;
+
+       public static int map_cache = 9;
+
        public static void init() {
                AltosPreferences.init(new AltosUIPreferencesBackend());
 
@@ -68,6 +75,9 @@ public class AltosUIPreferences extends AltosPreferences {
 
                position = backend.getInt(positionPreference, AltosUILib.position_top_left);
                position_listeners = new LinkedList<AltosPositionListener>();
+
+               map_cache = backend.getInt(mapCachePreference, 9);
+               map_cache_listeners = new LinkedList<AltosUIMapCacheListener>();
        }
 
        static { init(); }
@@ -215,4 +225,32 @@ public class AltosUIPreferences extends AltosPreferences {
                        return position;
                }
        }
+
+       public static void register_map_cache_listener(AltosUIMapCacheListener l) {
+               synchronized(backend) {
+                       map_cache_listeners.add(l);
+               }
+       }
+
+       public static void unregister_map_cache_listener(AltosUIMapCacheListener l) {
+               synchronized (backend) {
+                       map_cache_listeners.remove(l);
+               }
+       }
+
+       public static void set_map_cache(int new_map_cache) {
+               synchronized(backend) {
+                       map_cache = new_map_cache;
+                       backend.putInt(mapCachePreference, map_cache);
+                       flush_preferences();
+                       for (AltosUIMapCacheListener l: map_cache_listeners)
+                               l.map_cache_changed(map_cache);
+               }
+       }
+
+       public static int map_cache() {
+               synchronized(backend) {
+                       return map_cache;
+               }
+       }
 }
index da29253dc9e57149eb8c6da774f18df865c70f64..4048fd83b99f4a52b0018c829cb69e8df48d0140 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.io.File;
 import java.util.prefs.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 import javax.swing.filechooser.FileSystemView;
 
 public class AltosUIPreferencesBackend implements AltosPreferencesBackend {
index b0632d18937bb2840efbb2cc7fd2c522e59f4f7c..809020c49e79c25d31dc2394dadfdee610490915 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.io.*;
 import java.util.ArrayList;
 
 import java.awt.*;
 import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 import org.jfree.ui.*;
 import org.jfree.chart.*;
diff --git a/altosuilib/AltosUITelemetryMenu.java b/altosuilib/AltosUITelemetryMenu.java
new file mode 100644 (file)
index 0000000..893c3c4
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * Copyright Â© 2014 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+package org.altusmetrum.altosuilib_3;
+
+import java.util.*;
+import javax.swing.*;
+import java.awt.event.*;
+import org.altusmetrum.altoslib_5.*;
+
+class TelemetryMenuItem extends JMenuItem {
+       public int      telemetry;
+
+       public TelemetryMenuItem (int telemetry) {
+               super(AltosLib.telemetry_name(telemetry));
+               this.telemetry = telemetry;
+       }
+}
+
+public class AltosUITelemetryMenu extends JMenu implements ActionListener {
+       TelemetryMenuItem       selected = null;
+
+       public int get_selected() {
+               if (selected == null)
+                       return AltosLib.ao_telemetry_off;
+               return selected.telemetry;
+       }
+
+       public void set_selected(int telemetry) {
+               for (int i = 0; i < getItemCount(); i++) {
+                       TelemetryMenuItem       item = (TelemetryMenuItem) getItem(i);
+                       if (item.telemetry == telemetry) {
+                               selected = item;
+                               String new_text = String.format("Format: %s â–¾", AltosLib.telemetry_name(telemetry));
+                               setText(new_text);
+                               break;
+                       }
+               }
+       }
+
+       private LinkedList<ActionListener> action_listeners = new LinkedList<ActionListener>();
+
+       public void addActionListener(ActionListener l) {
+               action_listeners.add(l);
+       }
+
+       public void removeActionListener(ActionListener l) {
+               action_listeners.remove(l);
+       }
+
+       public void actionPerformed(ActionEvent e) {
+               TelemetryMenuItem item = (TelemetryMenuItem) e.getSource();
+               set_selected(item.telemetry);
+               ActionEvent my_e = new ActionEvent(selected, 0, "selected");
+               for (ActionListener l : action_listeners)
+                       l.actionPerformed(my_e);
+       }
+
+       public AltosUITelemetryMenu(int serial) {
+               super();
+               for (int i = AltosLib.ao_telemetry_min; i <= AltosLib.ao_telemetry_max; i++) {
+                       TelemetryMenuItem       item = new TelemetryMenuItem(i);
+
+                       item.addActionListener(this);
+                       add(item);
+               }
+
+               int telemetry = AltosPreferences.telemetry(serial);
+               if (telemetry < AltosLib.ao_telemetry_min || AltosLib.ao_telemetry_max < telemetry)
+                       telemetry = AltosLib.ao_telemetry_standard;
+               set_selected(telemetry);
+       }
+}
+
index 2285b6fc046af8f5b8ac3fb6cf8f5b1b712738a0..50c30851fea62ac52e895b403407e7e6a68b51f1 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.awt.*;
 import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public abstract class AltosUIUnitsIndicator extends AltosUIIndicator {
 
index 0edb5c04b3ae2fd7d58fea4452a23bf57e7a1ced..9fd5757b76753d021e2875d699f937844843c183 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 public class AltosUIVersion {
        public final static String version = "@VERSION@";
index 3ff17213c8cdb975118634110427eaa27a97174c..8e99185678e971860c53ed831b48c5f0605eb833 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.awt.*;
 import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public abstract class AltosUIVoltageIndicator extends AltosUIUnitsIndicator {
 
index b70b5e83bd18911da0862c79c97df48dba93f53f..a8323704943e04e76929f177a1ecef959844ab7c 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.util.*;
 import libaltosJNI.*;
index a3995f680eb52c373ec8d871cd5f2bdef42c0acb..e02730bac7399a357ed662a7479168fac53e0d63 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import com.sun.speech.freetts.Voice;
 import com.sun.speech.freetts.VoiceManager;
index 4426f7a3de35fe436ae2d9211c4af350ed4c6ebe..9bccb808d8e9743222f677a1046b885483bd6072 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
 
 import java.awt.*;
 import java.awt.event.*;
index e08fbe7443e74acbb04814ae03b4ed077607e91f..56b01ec53fbf182c78739a6bf888d2eec1708221 100644 (file)
@@ -68,6 +68,7 @@ altosuilib_JAVA = \
        AltosUIMapPath.java \
        AltosUIMapTile.java \
        AltosUIMapCache.java \
+       AltosUIMapCacheListener.java \
        AltosUIMapImage.java \
        AltosUIMapTransform.java \
        AltosUIMapRectangle.java \
@@ -80,7 +81,9 @@ altosuilib_JAVA = \
        AltosUIFlightTab.java \
        AltosUIIndicator.java \
        AltosUIUnitsIndicator.java \
-       AltosUIVoltageIndicator.java
+       AltosUIVoltageIndicator.java \
+       AltosUITelemetryMenu.java \
+       OSXAdapter.java
 
 JAR=altosuilib_$(ALTOSUILIB_VERSION).jar
 
diff --git a/altosuilib/OSXAdapter.java b/altosuilib/OSXAdapter.java
new file mode 100755 (executable)
index 0000000..23aacd7
--- /dev/null
@@ -0,0 +1,206 @@
+/*
+
+File: OSXAdapter.java
+
+Abstract: Hooks existing preferences/about/quit functionality from an
+    existing Java app into handlers for the Mac OS X application menu.
+    Uses a Proxy object to dynamically implement the
+    com.apple.eawt.ApplicationListener interface and register it with the
+    com.apple.eawt.Application object.  This allows the complete project
+    to be both built and run on any platform without any stubs or
+    placeholders. Useful for developers looking to implement Mac OS X
+    features while supporting multiple platforms with minimal impact.
+
+Version: 2.0
+
+Disclaimer: IMPORTANT:  This Apple software is supplied to you by
+Apple Inc. ("Apple") in consideration of your agreement to the
+following terms, and your use, installation, modification or
+redistribution of this Apple software constitutes acceptance of these
+terms.  If you do not agree with these terms, please do not use,
+install, modify or redistribute this Apple software.
+
+In consideration of your agreement to abide by the following terms, and
+subject to these terms, Apple grants you a personal, non-exclusive
+license, under Apple's copyrights in this original Apple software (the
+"Apple Software"), to use, reproduce, modify and redistribute the Apple
+Software, with or without modifications, in source and/or binary forms;
+provided that if you redistribute the Apple Software in its entirety and
+without modifications, you must retain this notice and the following
+text and disclaimers in all such redistributions of the Apple Software.
+Neither the name, trademarks, service marks or logos of Apple Inc.
+may be used to endorse or promote products derived from the Apple
+Software without specific prior written permission from Apple.  Except
+as expressly stated in this notice, no other rights or licenses, express
+or implied, are granted by Apple herein, including but not limited to
+any patent rights that may be infringed by your derivative works or by
+other works in which the Apple Software may be incorporated.
+
+The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
+MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
+THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
+OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
+OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION,
+MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED
+AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
+STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+Copyright Â© 2003-2007 Apple, Inc., All Rights Reserved
+
+*/
+
+package org.altusmetrum.altosuilib_3;
+
+import java.lang.reflect.*;
+import java.util.HashMap;
+
+
+public class OSXAdapter implements InvocationHandler {
+
+    protected Object targetObject;
+    protected Method targetMethod;
+    protected String proxySignature;
+
+    static Object macOSXApplication;
+
+    // Pass this method an Object and Method equipped to perform application shutdown logic
+    // The method passed should return a boolean stating whether or not the quit should occur
+    public static void setQuitHandler(Object target, Method quitHandler) {
+        setHandler(new OSXAdapter("handleQuit", target, quitHandler));
+    }
+
+    // Pass this method an Object and Method equipped to display application info
+    // They will be called when the About menu item is selected from the application menu
+    public static void setAboutHandler(Object target, Method aboutHandler) {
+        boolean enableAboutMenu = (target != null && aboutHandler != null);
+        if (enableAboutMenu) {
+            setHandler(new OSXAdapter("handleAbout", target, aboutHandler));
+        }
+        // If we're setting a handler, enable the About menu item by calling
+        // com.apple.eawt.Application reflectively
+        try {
+            Method enableAboutMethod = macOSXApplication.getClass().getDeclaredMethod("setEnabledAboutMenu", new Class[] { boolean.class });
+            enableAboutMethod.invoke(macOSXApplication, new Object[] { Boolean.valueOf(enableAboutMenu) });
+        } catch (Exception ex) {
+            System.err.println("OSXAdapter could not access the About Menu");
+            ex.printStackTrace();
+        }
+    }
+
+    // Pass this method an Object and a Method equipped to display application options
+    // They will be called when the Preferences menu item is selected from the application menu
+    public static void setPreferencesHandler(Object target, Method prefsHandler) {
+        boolean enablePrefsMenu = (target != null && prefsHandler != null);
+        if (enablePrefsMenu) {
+            setHandler(new OSXAdapter("handlePreferences", target, prefsHandler));
+        }
+        // If we're setting a handler, enable the Preferences menu item by calling
+        // com.apple.eawt.Application reflectively
+        try {
+            Method enablePrefsMethod = macOSXApplication.getClass().getDeclaredMethod("setEnabledPreferencesMenu", new Class[] { boolean.class });
+            enablePrefsMethod.invoke(macOSXApplication, new Object[] { Boolean.valueOf(enablePrefsMenu) });
+        } catch (Exception ex) {
+            System.err.println("OSXAdapter could not access the About Menu");
+            ex.printStackTrace();
+        }
+    }
+
+    // Pass this method an Object and a Method equipped to handle document events from the Finder
+    // Documents are registered with the Finder via the CFBundleDocumentTypes dictionary in the
+    // application bundle's Info.plist
+    public static void setFileHandler(Object target, Method fileHandler) {
+        setHandler(new OSXAdapter("handleOpenFile", target, fileHandler) {
+            // Override OSXAdapter.callTarget to send information on the
+            // file to be opened
+            public boolean callTarget(Object appleEvent) {
+                if (appleEvent != null) {
+                    try {
+                        Method getFilenameMethod = appleEvent.getClass().getDeclaredMethod("getFilename", (Class[])null);
+                        String filename = (String) getFilenameMethod.invoke(appleEvent, (Object[])null);
+                        this.targetMethod.invoke(this.targetObject, new Object[] { filename });
+                    } catch (Exception ex) {
+
+                    }
+                }
+                return true;
+            }
+        });
+    }
+
+    // setHandler creates a Proxy object from the passed OSXAdapter and adds it as an ApplicationListener
+    public static void setHandler(OSXAdapter adapter) {
+        try {
+            Class applicationClass = Class.forName("com.apple.eawt.Application");
+            if (macOSXApplication == null) {
+                macOSXApplication = applicationClass.getConstructor((Class[])null).newInstance((Object[])null);
+            }
+            Class applicationListenerClass = Class.forName("com.apple.eawt.ApplicationListener");
+            Method addListenerMethod = applicationClass.getDeclaredMethod("addApplicationListener", new Class[] { applicationListenerClass });
+            // Create a proxy object around this handler that can be reflectively added as an Apple ApplicationListener
+            Object osxAdapterProxy = Proxy.newProxyInstance(OSXAdapter.class.getClassLoader(), new Class[] { applicationListenerClass }, adapter);
+            addListenerMethod.invoke(macOSXApplication, new Object[] { osxAdapterProxy });
+        } catch (ClassNotFoundException cnfe) {
+            System.err.println("This version of Mac OS X does not support the Apple EAWT.  ApplicationEvent handling has been disabled (" + cnfe + ")");
+        } catch (Exception ex) {  // Likely a NoSuchMethodException or an IllegalAccessException loading/invoking eawt.Application methods
+            System.err.println("Mac OS X Adapter could not talk to EAWT:");
+            ex.printStackTrace();
+        }
+    }
+
+    // Each OSXAdapter has the name of the EAWT method it intends to listen for (handleAbout, for example),
+    // the Object that will ultimately perform the task, and the Method to be called on that Object
+    protected OSXAdapter(String proxySignature, Object target, Method handler) {
+        this.proxySignature = proxySignature;
+        this.targetObject = target;
+        this.targetMethod = handler;
+    }
+
+    // Override this method to perform any operations on the event
+    // that comes with the various callbacks
+    // See setFileHandler above for an example
+    public boolean callTarget(Object appleEvent) throws InvocationTargetException, IllegalAccessException {
+        Object result = targetMethod.invoke(targetObject, (Object[])null);
+        if (result == null) {
+            return true;
+        }
+        return Boolean.valueOf(result.toString()).booleanValue();
+    }
+
+    // InvocationHandler implementation
+    // This is the entry point for our proxy object; it is called every time an ApplicationListener method is invoked
+    public Object invoke (Object proxy, Method method, Object[] args) throws Throwable {
+        if (isCorrectMethod(method, args)) {
+            boolean handled = callTarget(args[0]);
+            setApplicationEventHandled(args[0], handled);
+        }
+        // All of the ApplicationListener methods are void; return null regardless of what happens
+        return null;
+    }
+
+    // Compare the method that was called to the intended method when the OSXAdapter instance was created
+    // (e.g. handleAbout, handleQuit, handleOpenFile, etc.)
+    protected boolean isCorrectMethod(Method method, Object[] args) {
+        return (targetMethod != null && proxySignature.equals(method.getName()) && args.length == 1);
+    }
+
+    // It is important to mark the ApplicationEvent as handled and cancel the default behavior
+    // This method checks for a boolean result from the proxy method and sets the event accordingly
+    protected void setApplicationEventHandled(Object event, boolean handled) {
+        if (event != null) {
+            try {
+                Method setHandledMethod = event.getClass().getDeclaredMethod("setHandled", new Class[] { boolean.class });
+                // If the target method returns a boolean, use that as a hint
+                setHandledMethod.invoke(event, new Object[] { Boolean.valueOf(handled) });
+            } catch (Exception ex) {
+                System.err.println("OSXAdapter was unable to handle an ApplicationEvent: " + event);
+                ex.printStackTrace();
+            }
+        }
+    }
+}
index 2d7e8b26526d58c7b687a0fbb864aaad7f00b170..eb5dff987d770fdfd35fa566161e2ce7e83d7069 100644 (file)
Binary files a/altusmetrum.cat and b/altusmetrum.cat differ
index 291393856c567096ed25440fbbe7cc22a31cbed1..17e0095526e3270e735eaccfc28f3445e42ac8aa 100755 (executable)
@@ -19,7 +19,7 @@ ao-list | while read product serial dev; do
            echo "Testing $product $serial $dev"
 
            echo "Testing igniters. Both should flash"
-           ./test-igniter "$dev" drogue main
+           ../ao-tools/ao-test-igniter/ao-test-igniter --tty="$dev" drogue main
 
            case $? in
                0)
@@ -30,7 +30,7 @@ ao-list | while read product serial dev; do
            esac
 
            echo "Testing baro sensor"
-           ./test-baro "$dev"
+           ../ao-tools/ao-test-baro/ao-test-baro --tty="$dev"
 
            case $? in
                0)
@@ -43,7 +43,7 @@ ao-list | while read product serial dev; do
            FLASHSIZE=1048576
 
            echo "Testing flash"
-           ./test-flash "$dev" "$FLASHSIZE"
+           ../ao-tools/ao-test-flash/ao-test-flash --tty="$dev" "$FLASHSIZE"
 
            case $? in
                0)
index a42988d6c22f57a45ded73084b1cf8f59f60c9c8..4526f5145c4d089c6de0ae3f0af749d449acf2a7 100644 (file)
@@ -1,7 +1,8 @@
 SUBDIRS=lib ao-rawload ao-dbg ao-bitbang ao-eeprom ao-list \
        ao-load ao-telem ao-send-telem ao-sky-flash \
        ao-dumpflash ao-edit-telem ao-dump-up ao-elftohex \
-       ao-flash ao-usbload
+       ao-flash ao-usbload ao-test-igniter ao-test-baro \
+       ao-test-flash
 if LIBSTLINK
 SUBDIRS += ao-stmload
 endif
diff --git a/ao-tools/ao-test-baro/.gitignore b/ao-tools/ao-test-baro/.gitignore
new file mode 100644 (file)
index 0000000..f5fb64d
--- /dev/null
@@ -0,0 +1 @@
+ao-test-baro
diff --git a/ao-tools/ao-test-baro/Makefile.am b/ao-tools/ao-test-baro/Makefile.am
new file mode 100644 (file)
index 0000000..69e4752
--- /dev/null
@@ -0,0 +1,11 @@
+bin_PROGRAMS=ao-test-baro
+
+AM_CFLAGS=-I$(top_srcdir)/ao-tools/lib $(LIBUSB_CFLAGS)
+
+ao_test_baro_DEPENDENCIES = $(top_builddir)/ao-tools/lib/libao-tools.a
+
+ao_test_baro_LDADD=$(top_builddir)/ao-tools/lib/libao-tools.a $(LIBUSB_LIBS)
+
+ao_test_baro_SOURCES=ao-test-baro.c
+
+man_MANS = ao-test-baro.1
diff --git a/ao-tools/ao-test-baro/ao-test-baro.1 b/ao-tools/ao-test-baro/ao-test-baro.1
new file mode 100644 (file)
index 0000000..0004dba
--- /dev/null
@@ -0,0 +1,56 @@
+.\"
+.\" Copyright Â© 2009 Keith Packard <keithp@keithp.com>
+.\"
+.\" This program is free software; you can redistribute it and/or modify
+.\" it under the terms of the GNU General Public License as published by
+.\" the Free Software Foundation; either version 2 of the License, or
+.\" (at your option) any later version.
+.\"
+.\" This program is distributed in the hope that it will be useful, but
+.\" WITHOUT ANY WARRANTY; without even the implied warranty of
+.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+.\" General Public License for more details.
+.\"
+.\" You should have received a copy of the GNU General Public License along
+.\" with this program; if not, write to the Free Software Foundation, Inc.,
+.\" 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+.\"
+.\"
+.TH AO-LOAD 1 "ao-test-baro" ""
+.SH NAME
+ao-test-baro \- test AltOS flight computer barometric sensor
+.SH SYNOPSIS
+.B "ao-test-baro"
+[\-T \fItty-device\fP]
+[\--tty \fItty-device\fP]
+[\-D \fIaltos-device\fP]
+[\--device \fIaltos-device\fP]
+\fIbaro-name...\fP
+.SH DESCRIPTION
+.I ao-test-baro
+makes sure the altitude is between -50m and 3000m and temperature is
+between 20°C and 30°C.
+.SH OPTIONS
+.TP
+\-T tty-device | --tty tty-device
+This selects which tty device the debugger uses to communicate with
+the target device.
+.TP
+\-D AltOS-device | --device AltOS-device
+Search for a connected device. This requires an argument of one of the
+following forms:
+.IP
+TeleMega:2
+.br
+TeleMega
+.br
+2
+.IP
+Leaving out the product name will cause the tool to select a suitable
+product, leaving out the serial number will cause the tool to match
+one of the available devices.
+.SH USAGE
+.I ao-test-baro
+opens the target device and queries the current barometric data.
+.SH AUTHOR
+Keith Packard
diff --git a/ao-tools/ao-test-baro/ao-test-baro.c b/ao-tools/ao-test-baro/ao-test-baro.c
new file mode 100644 (file)
index 0000000..e883de4
--- /dev/null
@@ -0,0 +1,238 @@
+/*
+ * Copyright Â© 2014 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include <err.h>
+#include <fcntl.h>
+#include <gelf.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <sysexits.h>
+#include <unistd.h>
+#include <getopt.h>
+#include <string.h>
+#include <stdbool.h>
+#include "ao-elf.h"
+#include "ccdbg.h"
+#include "cc-usb.h"
+#include "cc.h"
+#include "ao-verbose.h"
+
+static const struct option options[] = {
+       { .name = "tty", .has_arg = 1, .val = 'T' },
+       { .name = "device", .has_arg = 1, .val = 'D' },
+       { .name = "raw", .has_arg = 0, .val = 'r' },
+       { .name = "verbose", .has_arg = 1, .val = 'v' },
+       { 0, 0, 0, 0},
+};
+
+static void usage(char *program)
+{
+       fprintf(stderr, "usage: %s [--verbose=<verbose>] [--device=<device>] [-tty=<tty>] main|drogue\n", program);
+       exit(1);
+}
+
+void
+done(struct cc_usb *cc, int code)
+{
+/*     cc_usb_printf(cc, "a\n"); */
+       cc_usb_close(cc);
+       exit (code);
+}
+
+static int
+ends_with(char *whole, char *suffix)
+{
+       int whole_len = strlen(whole);
+       int suffix_len = strlen(suffix);
+
+       if (suffix_len > whole_len)
+               return 0;
+       return strcmp(whole + whole_len - suffix_len, suffix) == 0;
+}
+
+static int
+starts_with(char *whole, char *prefix)
+{
+       int whole_len = strlen(whole);
+       int prefix_len = strlen(prefix);
+
+       if (prefix_len > whole_len)
+               return 0;
+       return strncmp(whole, prefix, prefix_len) == 0;
+}
+
+static char **
+tok(char *line) {
+       char    **strs = malloc (sizeof (char *)), *str;
+       int     n = 0;
+
+       while ((str = strtok(line, " \t"))) {
+               line = NULL;
+               strs = realloc(strs, (n + 2) * sizeof (char *));
+               strs[n] = strdup(str);
+               n++;
+       }
+       strs[n] = '\0';
+       return strs;
+}
+
+static void
+free_strs(char **strs) {
+       char    *str;
+       int     i;
+
+       for (i = 0; (str = strs[i]) != NULL; i++)
+               free(str);
+       free(strs);
+}
+
+struct baro {
+       struct baro     *next;
+       char            **strs;
+};
+
+static struct baro *
+baro(struct cc_usb *usb)
+{
+       struct baro     *head = NULL, **tail = &head;
+       cc_usb_printf(usb, "B\n");
+       for (;;) {
+               char    line[512];
+               struct baro     *b;
+
+               cc_usb_getline(usb, line, sizeof (line));
+               b = malloc (sizeof (struct baro));
+               b->strs = tok(line);
+               b->next = NULL;
+               *tail = b;
+               tail = &b->next;
+               if (strstr(line, "Altitude:"))
+                       break;
+       }
+       return head;
+}
+
+static void
+free_baro(struct baro *b) {
+       struct baro *n;
+
+       while (b) {
+               n = b->next;
+               free_strs(b->strs);
+               free(b);
+               b = n;
+       }
+}
+
+char **
+find_baro(struct baro *b, char *word0) {
+       int i;
+       for (;b; b = b->next)
+               if (b->strs[0] && !strcmp(b->strs[0], word0))
+                       return b->strs;
+       return NULL;
+}
+
+int
+do_baro(struct cc_usb *usb) {
+       struct baro *b = baro(usb);
+       char **temp = find_baro(b, "Temperature:");
+       char **alt = find_baro(b, "Altitude:");
+
+       if (!temp || !alt) {
+               printf("no response\n");
+               free_baro(b);
+               return 0;
+       }
+
+       double temperature = strtod(temp[2], NULL) / 100.0;
+       double altitude = strtod(alt[1], NULL);
+
+       if (altitude < -50 || 3000 < altitude) {
+               printf ("weird altitude %f\n", altitude);
+               free_baro(b);
+               return 0;
+       }
+
+       if (temperature < 20 || 35 < temperature) {
+               printf ("weird temperature %f\n", temperature);
+               free_baro(b);
+               return 0;
+       }
+
+       printf ("altitude %f temperature %f\n", altitude, temperature);
+
+       return 1;
+}
+
+int
+main (int argc, char **argv)
+{
+       char                    *device = NULL;
+       char                    *filename;
+       Elf                     *e;
+       unsigned int            s;
+       int                     i;
+       int                     c;
+       int                     tries;
+       struct cc_usb           *cc = NULL;
+       char                    *tty = NULL;
+       int                     success;
+       int                     verbose = 0;
+       int                     ret = 0;
+
+       while ((c = getopt_long(argc, argv, "rT:D:c:s:v:", options, NULL)) != -1) {
+               switch (c) {
+               case 'T':
+                       tty = optarg;
+                       break;
+               case 'D':
+                       device = optarg;
+                       break;
+               case 'v':
+                       verbose++;
+                       break;
+               default:
+                       usage(argv[0]);
+                       break;
+               }
+       }
+
+       ao_verbose = verbose;
+
+       if (verbose > 1)
+               ccdbg_add_debug(CC_DEBUG_BITBANG);
+
+       if (!tty)
+               tty = cc_usbdevs_find_by_arg(device, "AltosFlash");
+       if (!tty)
+               tty = cc_usbdevs_find_by_arg(device, "TeleMega");
+       if (!tty)
+               tty = getenv("ALTOS_TTY");
+       if (!tty)
+               tty="/dev/ttyACM0";
+
+       cc = cc_usb_open(tty);
+
+       if (!cc)
+               exit(1);
+
+       if (!do_baro(cc))
+               ret = 1;
+       done(cc, ret);
+}
diff --git a/ao-tools/ao-test-flash/.gitignore b/ao-tools/ao-test-flash/.gitignore
new file mode 100644 (file)
index 0000000..40ab1ef
--- /dev/null
@@ -0,0 +1 @@
+ao-test-flash
diff --git a/ao-tools/ao-test-flash/Makefile.am b/ao-tools/ao-test-flash/Makefile.am
new file mode 100644 (file)
index 0000000..0323c28
--- /dev/null
@@ -0,0 +1,11 @@
+bin_PROGRAMS=ao-test-flash
+
+AM_CFLAGS=-I$(top_srcdir)/ao-tools/lib $(LIBUSB_CFLAGS)
+
+ao_test_flash_DEPENDENCIES = $(top_builddir)/ao-tools/lib/libao-tools.a
+
+ao_test_flash_LDADD=$(top_builddir)/ao-tools/lib/libao-tools.a $(LIBUSB_LIBS)
+
+ao_test_flash_SOURCES=ao-test-flash.c
+
+man_MANS = ao-test-flash.1
diff --git a/ao-tools/ao-test-flash/ao-test-flash.1 b/ao-tools/ao-test-flash/ao-test-flash.1
new file mode 100644 (file)
index 0000000..155bd1b
--- /dev/null
@@ -0,0 +1,59 @@
+.\"
+.\" Copyright Â© 2009 Keith Packard <keithp@keithp.com>
+.\"
+.\" This program is free software; you can redistribute it and/or modify
+.\" it under the terms of the GNU General Public License as published by
+.\" the Free Software Foundation; either version 2 of the License, or
+.\" (at your option) any later version.
+.\"
+.\" This program is distributed in the hope that it will be useful, but
+.\" WITHOUT ANY WARRANTY; without even the implied warranty of
+.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+.\" General Public License for more details.
+.\"
+.\" You should have received a copy of the GNU General Public License along
+.\" with this program; if not, write to the Free Software Foundation, Inc.,
+.\" 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+.\"
+.\"
+.TH AO-LOAD 1 "ao-test-igniter" ""
+.SH NAME
+ao-test-igniter \- test AltOS flight computer igniters
+.SH SYNOPSIS
+.B "ao-test-igniter"
+[\-T \fItty-device\fP]
+[\--tty \fItty-device\fP]
+[\-D \fIaltos-device\fP]
+[\--device \fIaltos-device\fP]
+\fIigniter-name...\fP
+.SH DESCRIPTION
+.I ao-test-igniter
+test the status and then fires the specified igniters on the target device
+.SH OPTIONS
+.TP
+\-T tty-device | --tty tty-device
+This selects which tty device the debugger uses to communicate with
+the target device. The special name 'BITBANG' directs ao-dbg to use
+the cp2103 connection, otherwise this should be a usb serial port
+connected to a suitable cc1111 debug node.
+.TP
+\-D AltOS-device | --device AltOS-device
+Search for a connected device. This requires an argument of one of the
+following forms:
+.IP
+TeleMega:2
+.br
+TeleMega
+.br
+2
+.IP
+Leaving out the product name will cause the tool to select a suitable
+product, leaving out the serial number will cause the tool to match
+one of the available devices.
+.SH USAGE
+.I ao-test-igniter
+opens the target device, lists the available igniter and then fires
+the specified ones. And error occurrs if any of the specified igniters
+is not present or not ready.
+.SH AUTHOR
+Keith Packard
diff --git a/ao-tools/ao-test-flash/ao-test-flash.c b/ao-tools/ao-test-flash/ao-test-flash.c
new file mode 100644 (file)
index 0000000..cf44ae6
--- /dev/null
@@ -0,0 +1,245 @@
+/*
+ * Copyright Â© 2014 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include <err.h>
+#include <fcntl.h>
+#include <gelf.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <sysexits.h>
+#include <unistd.h>
+#include <getopt.h>
+#include <string.h>
+#include <stdbool.h>
+#include "ao-elf.h"
+#include "ccdbg.h"
+#include "cc-usb.h"
+#include "cc.h"
+#include "ao-verbose.h"
+
+static const struct option options[] = {
+       { .name = "tty", .has_arg = 1, .val = 'T' },
+       { .name = "device", .has_arg = 1, .val = 'D' },
+       { .name = "raw", .has_arg = 0, .val = 'r' },
+       { .name = "verbose", .has_arg = 1, .val = 'v' },
+       { 0, 0, 0, 0},
+};
+
+static void usage(char *program)
+{
+       fprintf(stderr, "usage: %s [--verbose=<verbose>] [--device=<device>] [-tty=<tty>] <expected-size>\n", program);
+       exit(1);
+}
+
+void
+done(struct cc_usb *cc, int code)
+{
+       cc_usb_close(cc);
+       exit (code);
+}
+
+static int
+ends_with(char *whole, char *suffix)
+{
+       int whole_len = strlen(whole);
+       int suffix_len = strlen(suffix);
+
+       if (suffix_len > whole_len)
+               return 0;
+       return strcmp(whole + whole_len - suffix_len, suffix) == 0;
+}
+
+static int
+starts_with(char *whole, char *prefix)
+{
+       int whole_len = strlen(whole);
+       int prefix_len = strlen(prefix);
+
+       if (prefix_len > whole_len)
+               return 0;
+       return strncmp(whole, prefix, prefix_len) == 0;
+}
+
+static char **
+tok(char *line) {
+       char    **strs = malloc (sizeof (char *)), *str;
+       int     n = 0;
+
+       while ((str = strtok(line, " \t"))) {
+               line = NULL;
+               strs = realloc(strs, (n + 2) * sizeof (char *));
+               strs[n] = strdup(str);
+               n++;
+       }
+       strs[n] = '\0';
+       return strs;
+}
+
+static void
+free_strs(char **strs) {
+       char    *str;
+       int     i;
+
+       for (i = 0; (str = strs[i]) != NULL; i++)
+               free(str);
+       free(strs);
+}
+
+struct flash {
+       struct flash    *next;
+       char            line[512];
+       char            **strs;
+};
+
+static struct flash *
+flash(struct cc_usb *usb)
+{
+       struct flash    *head = NULL, **tail = &head;
+       cc_usb_printf(usb, "f\nv\n");
+       for (;;) {
+               char    line[512];
+               struct flash    *b;
+
+               cc_usb_getline(usb, line, sizeof (line));
+               b = malloc (sizeof (struct flash));
+               strcpy(b->line, line);
+               b->strs = tok(line);
+               b->next = NULL;
+               *tail = b;
+               tail = &b->next;
+               if (strstr(line, "software-version"))
+                       break;
+       }
+       return head;
+}
+
+static void
+free_flash(struct flash *b) {
+       struct flash *n;
+
+       while (b) {
+               n = b->next;
+               free_strs(b->strs);
+               free(b);
+               b = n;
+       }
+}
+
+char **
+find_flash(struct flash *b, char *word0) {
+       int i;
+       for (;b; b = b->next) {
+               if (strstr(b->line, word0))
+                       return b->strs;
+       }
+       return NULL;
+}
+
+int
+do_flash(struct cc_usb *usb, int expected_size) {
+       struct flash *b = flash(usb);
+       char **size = find_flash(b, "Storage size:");
+       char **erase = find_flash(b, "Storage erase unit:");
+
+       if (!size || !erase) {
+               printf("no response\n");
+               free_flash(b);
+               return 0;
+       }
+
+       int actual_size = atoi(size[2]);
+
+       if (actual_size != expected_size) {
+               printf ("weird flash size %d != %d\n", actual_size, expected_size);
+               free_flash(b);
+               return 0;
+       }
+
+       int actual_erase = atoi(erase[3]);
+
+       if (actual_erase != 65536) {
+               printf ("weird erase size %d\n", actual_erase);
+               free_flash(b);
+               return 0;
+       }
+
+       printf ("flash size %d erase block %d\n", actual_size, actual_erase);
+
+       return 1;
+}
+
+int
+main (int argc, char **argv)
+{
+       char                    *device = NULL;
+       char                    *filename;
+       Elf                     *e;
+       unsigned int            s;
+       int                     i;
+       int                     c;
+       int                     tries;
+       struct cc_usb           *cc = NULL;
+       char                    *tty = NULL;
+       int                     success;
+       int                     verbose = 0;
+       int                     ret = 0;
+       int                     expected_size;
+
+       while ((c = getopt_long(argc, argv, "rT:D:c:s:v:", options, NULL)) != -1) {
+               switch (c) {
+               case 'T':
+                       tty = optarg;
+                       break;
+               case 'D':
+                       device = optarg;
+                       break;
+               case 'v':
+                       verbose++;
+                       break;
+               default:
+                       usage(argv[0]);
+                       break;
+               }
+       }
+
+       if (!argv[optind])
+               usage(argv[0]);
+
+       ao_verbose = verbose;
+
+       if (verbose > 1)
+               ccdbg_add_debug(CC_DEBUG_BITBANG);
+
+       if (!tty)
+               tty = cc_usbdevs_find_by_arg(device, "AltosFlash");
+       if (!tty)
+               tty = cc_usbdevs_find_by_arg(device, "TeleMega");
+       if (!tty)
+               tty = getenv("ALTOS_TTY");
+       if (!tty)
+               tty="/dev/ttyACM0";
+
+       cc = cc_usb_open(tty);
+
+       if (!cc)
+               exit(1);
+
+       if (!do_flash(cc, atoi(argv[optind])))
+               ret = 1;
+       done(cc, ret);
+}
diff --git a/ao-tools/ao-test-igniter/.gitignore b/ao-tools/ao-test-igniter/.gitignore
new file mode 100644 (file)
index 0000000..deee445
--- /dev/null
@@ -0,0 +1 @@
+ao-test-igniter
diff --git a/ao-tools/ao-test-igniter/Makefile.am b/ao-tools/ao-test-igniter/Makefile.am
new file mode 100644 (file)
index 0000000..e24ed46
--- /dev/null
@@ -0,0 +1,11 @@
+bin_PROGRAMS=ao-test-igniter
+
+AM_CFLAGS=-I$(top_srcdir)/ao-tools/lib $(LIBUSB_CFLAGS)
+
+ao_test_igniter_DEPENDENCIES = $(top_builddir)/ao-tools/lib/libao-tools.a
+
+ao_test_igniter_LDADD=$(top_builddir)/ao-tools/lib/libao-tools.a $(LIBUSB_LIBS)
+
+ao_test_igniter_SOURCES=ao-test-igniter.c
+
+man_MANS = ao-test-igniter.1
diff --git a/ao-tools/ao-test-igniter/ao-test-igniter.1 b/ao-tools/ao-test-igniter/ao-test-igniter.1
new file mode 100644 (file)
index 0000000..155bd1b
--- /dev/null
@@ -0,0 +1,59 @@
+.\"
+.\" Copyright Â© 2009 Keith Packard <keithp@keithp.com>
+.\"
+.\" This program is free software; you can redistribute it and/or modify
+.\" it under the terms of the GNU General Public License as published by
+.\" the Free Software Foundation; either version 2 of the License, or
+.\" (at your option) any later version.
+.\"
+.\" This program is distributed in the hope that it will be useful, but
+.\" WITHOUT ANY WARRANTY; without even the implied warranty of
+.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+.\" General Public License for more details.
+.\"
+.\" You should have received a copy of the GNU General Public License along
+.\" with this program; if not, write to the Free Software Foundation, Inc.,
+.\" 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+.\"
+.\"
+.TH AO-LOAD 1 "ao-test-igniter" ""
+.SH NAME
+ao-test-igniter \- test AltOS flight computer igniters
+.SH SYNOPSIS
+.B "ao-test-igniter"
+[\-T \fItty-device\fP]
+[\--tty \fItty-device\fP]
+[\-D \fIaltos-device\fP]
+[\--device \fIaltos-device\fP]
+\fIigniter-name...\fP
+.SH DESCRIPTION
+.I ao-test-igniter
+test the status and then fires the specified igniters on the target device
+.SH OPTIONS
+.TP
+\-T tty-device | --tty tty-device
+This selects which tty device the debugger uses to communicate with
+the target device. The special name 'BITBANG' directs ao-dbg to use
+the cp2103 connection, otherwise this should be a usb serial port
+connected to a suitable cc1111 debug node.
+.TP
+\-D AltOS-device | --device AltOS-device
+Search for a connected device. This requires an argument of one of the
+following forms:
+.IP
+TeleMega:2
+.br
+TeleMega
+.br
+2
+.IP
+Leaving out the product name will cause the tool to select a suitable
+product, leaving out the serial number will cause the tool to match
+one of the available devices.
+.SH USAGE
+.I ao-test-igniter
+opens the target device, lists the available igniter and then fires
+the specified ones. And error occurrs if any of the specified igniters
+is not present or not ready.
+.SH AUTHOR
+Keith Packard
diff --git a/ao-tools/ao-test-igniter/ao-test-igniter.c b/ao-tools/ao-test-igniter/ao-test-igniter.c
new file mode 100644 (file)
index 0000000..6a699fe
--- /dev/null
@@ -0,0 +1,223 @@
+/*
+ * Copyright Â© 2014 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include <err.h>
+#include <fcntl.h>
+#include <gelf.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <sysexits.h>
+#include <unistd.h>
+#include <getopt.h>
+#include <string.h>
+#include <stdbool.h>
+#include "ao-elf.h"
+#include "ccdbg.h"
+#include "cc-usb.h"
+#include "cc.h"
+#include "ao-verbose.h"
+
+static const struct option options[] = {
+       { .name = "tty", .has_arg = 1, .val = 'T' },
+       { .name = "device", .has_arg = 1, .val = 'D' },
+       { .name = "raw", .has_arg = 0, .val = 'r' },
+       { .name = "verbose", .has_arg = 1, .val = 'v' },
+       { 0, 0, 0, 0},
+};
+
+static void usage(char *program)
+{
+       fprintf(stderr, "usage: %s [--verbose=<verbose>] [--device=<device>] [-tty=<tty>] main|drogue\n", program);
+       exit(1);
+}
+
+void
+done(struct cc_usb *cc, int code)
+{
+/*     cc_usb_printf(cc, "a\n"); */
+       cc_usb_close(cc);
+       exit (code);
+}
+
+static int
+ends_with(char *whole, char *suffix)
+{
+       int whole_len = strlen(whole);
+       int suffix_len = strlen(suffix);
+
+       if (suffix_len > whole_len)
+               return 0;
+       return strcmp(whole + whole_len - suffix_len, suffix) == 0;
+}
+
+static int
+starts_with(char *whole, char *prefix)
+{
+       int whole_len = strlen(whole);
+       int prefix_len = strlen(prefix);
+
+       if (prefix_len > whole_len)
+               return 0;
+       return strncmp(whole, prefix, prefix_len) == 0;
+}
+
+struct igniter {
+       struct igniter  *next;
+       char            name[512];
+       char            status[512];
+};
+
+static struct igniter *
+igniters(struct cc_usb *usb)
+{
+       struct igniter  *head = NULL, **tail = &head;
+       cc_usb_printf(usb, "t\nv\n");
+       for (;;) {
+               char    line[512];
+               char    name[512];
+               char    status[512];
+
+               cc_usb_getline(usb, line, sizeof (line));
+               if (strstr(line, "software-version"))
+                       break;
+               if (sscanf(line, "Igniter: %s Status: %s", &name, &status) == 2) {
+                       struct igniter  *i = malloc (sizeof (struct igniter));
+                       strcpy(i->name, name);
+                       strcpy(i->status, status);
+                       i->next = NULL;
+                       *tail = i;
+                       tail = &i->next;
+               }
+       }
+       return head;
+}
+
+static void
+free_igniters(struct igniter *i) {
+       struct igniter *n;
+
+       while (i) {
+               n = i->next;
+               free(i);
+               i = n;
+       }
+}
+
+static struct igniter *
+find_igniter(struct igniter *i, char *name)
+{
+       for (; i; i = i->next)
+               if (strcmp(i->name, name) == 0)
+                       return i;
+}
+
+static int
+do_igniter(struct cc_usb *usb, char *name)
+{
+       struct igniter  *all = igniters(usb);
+       struct igniter  *this = find_igniter(all, name);
+       if (!this) {
+               struct igniter  *i;
+               printf("no igniter %s found in");
+               for (i = all; i; i = i->next)
+                       printf(" %s", i->name);
+               printf("\n");
+               free_igniters(all);
+               return 0;
+       }
+       if (strcmp(this->status, "ready") != 0) {
+               printf("igniter %s status is %s\n", this->name, this->status);
+               free_igniters(all);
+               return 0;
+       }
+       cc_usb_printf(usb, "i DoIt %s\n", this->name);
+       cc_usb_sync(usb);
+       free_igniters(all);
+       usleep(200000);
+       return 1;
+}
+
+int
+main (int argc, char **argv)
+{
+       char                    *device = NULL;
+       char                    *filename;
+       Elf                     *e;
+       unsigned int            s;
+       int                     i;
+       int                     c;
+       int                     tries;
+       struct cc_usb           *cc = NULL;
+       char                    *tty = NULL;
+       int                     success;
+       int                     verbose = 0;
+       int                     ret = 0;
+
+       while ((c = getopt_long(argc, argv, "rT:D:c:s:v:", options, NULL)) != -1) {
+               switch (c) {
+               case 'T':
+                       tty = optarg;
+                       break;
+               case 'D':
+                       device = optarg;
+                       break;
+               case 'v':
+                       verbose++;
+                       break;
+               default:
+                       usage(argv[0]);
+                       break;
+               }
+       }
+
+       ao_verbose = verbose;
+
+       if (verbose > 1)
+               ccdbg_add_debug(CC_DEBUG_BITBANG);
+
+       printf ("device %s\n", device);
+       if (!tty)
+               tty = cc_usbdevs_find_by_arg(device, "TeleMega-v1.0");
+       if (!tty)
+               tty = cc_usbdevs_find_by_arg(device, "TeleMetrum-v2.0");
+       if (!tty)
+               tty = cc_usbdevs_find_by_arg(device, "TeleMini-v2.0");
+       if (!tty)
+               tty = cc_usbdevs_find_by_arg(device, "EasyMega-v1.0");
+       if (!tty)
+               tty = cc_usbdevs_find_by_arg(device, "EasyMetrum-v1.0");
+       if (!tty)
+               tty = cc_usbdevs_find_by_arg(device, "EasyMini-v1.0");
+       if (!tty)
+               tty = getenv("ALTOS_TTY");
+       if (!tty)
+               tty="/dev/ttyACM0";
+
+       cc = cc_usb_open(tty);
+
+       if (!cc)
+               exit(1);
+
+       for (i = optind; i < argc; i++) {
+               char    *name = argv[i];
+
+               if (!do_igniter(cc, name))
+                       ret++;
+       }
+       done(cc, ret);
+}
index 23dc9d822b20530358a8a9c757b73d3221eb6308..89994ccb37e77568ef2c1be189afc69e7b163b43 100644 (file)
@@ -18,7 +18,7 @@ dnl
 dnl Process this file with autoconf to create configure.
 
 AC_PREREQ(2.57)
-AC_INIT([altos], 1.4)
+AC_INIT([altos], 1.4.1.1)
 AC_CONFIG_SRCDIR([src/kernel/ao.h])
 AM_INIT_AUTOMAKE([foreign dist-bzip2])
 AM_MAINTAINER_MODE
@@ -29,8 +29,8 @@ AC_SUBST(VERSION_DASH)
 dnl ==========================================================================
 dnl Java library versions
 
-ALTOSUILIB_VERSION=2
-ALTOSLIB_VERSION=4
+ALTOSUILIB_VERSION=3
+ALTOSLIB_VERSION=5
 
 AC_SUBST(ALTOSLIB_VERSION)
 AC_DEFINE(ALTOSLIB_VERSION,$ALTOSLIB_VERSION,[Version of the AltosLib package])
@@ -534,6 +534,9 @@ ao-tools/ao-dump-up/Makefile
 ao-tools/ao-elftohex/Makefile
 ao-tools/ao-usbload/Makefile
 ao-tools/ao-flash/Makefile
+ao-tools/ao-test-igniter/Makefile
+ao-tools/ao-test-baro/Makefile
+ao-tools/ao-test-flash/Makefile
 ao-utils/Makefile
 src/Version
 ])
index 5ccbee9f0c0ce10517ce2b65786f55ad9f46c375..fb8fe7e191edc0811293e07f79f5f6bdef73555a 100644 (file)
@@ -4347,6 +4347,50 @@ NAR #88757, TRA #12200
            </listitem>
          </varlistentry>
        </variablelist>
+       <para>
+         Once you've located the right pins:
+       </para>
+       <orderedlist inheritnum='inherit' numeration='arabic'>
+         <listitem>
+           <para>
+             Turn the altimeter power off.
+           </para>
+         </listitem>
+         <listitem>
+           <para>
+             Connect a battery.
+           </para>
+         </listitem>
+         <listitem>
+           <para>
+             Connect the indicated terminals together with a short
+             piece of wire. Take care not to accidentally connect
+             anything else.
+           </para>
+         </listitem>
+         <listitem>
+           <para>
+             Connect USB
+           </para>
+         </listitem>
+         <listitem>
+           <para>
+             Turn the board power on.
+           </para>
+         </listitem>
+         <listitem>
+           <para>
+             The board should now be visible over USB as 'AltosFlash'
+             and be ready to receive firmware.
+           </para>
+         </listitem>
+         <listitem>
+           <para>
+             Once the board has been powered up, you can remove the
+             piece of wire.
+           </para>
+         </listitem>
+       </orderedlist>
       </section>
     </section>
     <section>
index e89555dee5d4001ebeb60d607bc2e4f0b59da69c..94c7c70cffbeff4ec6ab32b2efacf621d9b9f6ba 100644 (file)
@@ -1,6 +1,7 @@
-altus-metrum-*.png
-micropeak-*.png
-telegps-*.png
+application-*.png
+altusmetrum-*.png
+*.rc
 *.ico
 *.icns
 *.build
+*.exe
index b1c00f4b4e50415ee3b466d431f1ef8f6a05226e..bf147ad37fd33ff12081c42c7a4afe6649a3eb95 100644 (file)
@@ -3,71 +3,157 @@ MAC_RES=16 32 128 256 512
 WIN_RES=16 24 32 48 64 72 96 128 180 256
 RES=$(shell echo $(JAVA_RES) $(MAC_RES) $(WIN_RES) | awk '{ for (i = 1; i <= NF; i++) printf("%s\n", $$i); }' | sort -n -u)
 
-AM_FILES=$(shell for i in $(RES); do echo altus-metrum-$$i.png; done)
-MP_FILES=$(shell for i in $(RES); do echo micropeak-$$i.png; done)
-TG_FILES=$(shell for i in $(RES); do echo telegps-$$i.png; done)
+# Application icon base names
 
-MAC_TG_FILES=$(shell for i in $(MAC_RES); do echo telegps-$$i.png; done)
-MAC_MP_FILES=$(shell for i in $(MAC_RES); do echo micropeak-$$i.png; done)
-MAC_AM_FILES=$(shell for i in $(MAC_RES); do echo altus-metrum-$$i.png; done)
+AM_NAME                = altusmetrum-altosui
+MP_NAME                = altusmetrum-micropeak
+TG_NAME                = altusmetrum-telegps
 
-WIN_TG_FILES=$(shell for i in $(WIN_RES); do echo telegps-$$i.png; done)
-WIN_MP_FILES=$(shell for i in $(WIN_RES); do echo micropeak-$$i.png; done)
-WIN_AM_FILES=$(shell for i in $(WIN_RES); do echo altus-metrum-$$i.png; done)
+# File icon base names
 
-ICO_FILES=altus-metrum.ico micro-peak.ico telegps.ico
-ICNS_FILES=AltosUIIcon.icns TeleGPS.icns MicroPeak.icns
+EEPROM_NAME    = application-vnd.altusmetrum.eeprom
+TELEM_NAME     = application-vnd.altusmetrum.telemetry
+MPD_NAME       = application-vnd.altusmetrum.micropeak
 
-icondir = $(datadir)/icons/hicolor/scalable/apps
+# Application icons
 
-AM_ICON = altusmetrum.svg
-MP_ICON = micropeak.svg
-TG_ICON = telegps.svg
+AM_ICON                = $(AM_NAME).svg
+MP_ICON                = $(MP_NAME).svg
+TG_ICON                = $(TG_NAME).svg
 
-icon_DATA = $(AM_ICON) $(MP_ICON) $(TG_ICON)
+# File icons (note that MicroPeak uses the application icon for files)
 
-EXTRA_DIST = $(icon_DATA) $(AM_FILES) $(MP_FILES) $(TG_FILES)
+EEPROM_ICON    = $(EEPROM_NAME).svg
+TELEM_ICON     = $(TELEM_NAME).svg
+MPD_ICON       = $(MPD_NAME).svg
+
+# Files needed for Mac OSX icons
+
+MAC_AM_FILES   = $(shell for i in $(MAC_RES); do echo $(AM_NAME)-$$i.png; done)
+MAC_MP_FILES   = $(shell for i in $(MAC_RES); do echo $(MP_NAME)-$$i.png; done)
+MAC_TG_FILES   = $(shell for i in $(MAC_RES); do echo $(TG_NAME)-$$i.png; done)
+MAC_EEPROM_FILES= $(shell for i in $(MAC_RES); do echo $(EEPROM_NAME)-$$i.png; done)
+MAC_TELEM_FILES        = $(shell for i in $(MAC_RES); do echo $(TELEM_NAME)-$$i.png; done)
+MAC_MPD_FILES  = $(shell for i in $(MAC_RES); do echo $(MPD_NAME)-$$i.png; done)
+
+ICNS_FILES     = $(AM_NAME).icns $(MP_NAME).icns $(TG_NAME).icns \
+                 $(EEPROM_NAME).icns $(TELEM_NAME).icns $(MPD_NAME).icns
+
+# Files needed for Windows icons
+
+WIN_AM_FILES   = $(shell for i in $(WIN_RES); do echo $(AM_NAME)-$$i.png; done)
+WIN_MP_FILES   = $(shell for i in $(WIN_RES); do echo $(MP_NAME)-$$i.png; done)
+WIN_TG_FILES   = $(shell for i in $(WIN_RES); do echo $(TG_NAME)-$$i.png; done)
+WIN_EEPROM_FILES= $(shell for i in $(WIN_RES); do echo $(EEPROM_NAME)-$$i.png; done)
+WIN_TELEM_FILES        = $(shell for i in $(WIN_RES); do echo $(TELEM_NAME)-$$i.png; done)
+WIN_MPD_FILES  = $(shell for i in $(WIN_RES); do echo $(MPD_NAME)-$$i.png; done)
+
+ICO_FILES      = $(AM_NAME).ico $(MP_NAME).ico $(TG_NAME).ico \
+                 $(EEPROM_NAME).ico $(TELEM_NAME).ico $(MPD_NAME).ico
+
+EXE_FILES      = $(AM_NAME).exe $(MP_NAME).exe $(TG_NAME).exe \
+                 $(EEPROM_NAME).exe $(TELEM_NAME).exe $(MPD_NAME).exe
+
+# Files needed for Java internal icons
+
+JAVA_AM_FILES  = $(shell for i in $(JAVA_RES); do echo $(AM_NAME)-$$i.png; done)
+JAVA_MP_FILES  = $(shell for i in $(JAVA_RES); do echo $(MP_NAME)-$$i.png; done)
+JAVA_TG_FILES  = $(shell for i in $(JAVA_RES); do echo $(TG_NAME)-$$i.png; done)
+
+JAVA_FILES     = $(JAVA_AM_FILES) $(JAVA_MP_FILES) $(JAVA_TG_FILES)
+
+# PNG files needed by anyone
+
+AM_FILES       = $(shell for i in $(RES); do echo $(AM_NAME)-$$i.png; done)
+MP_FILES       = $(shell for i in $(RES); do echo $(MP_NAME)-$$i.png; done)
+TG_FILES       = $(shell for i in $(RES); do echo $(TG_NAME)-$$i.png; done)
+EEPROM_FILES   = $(shell for i in $(RES); do echo $(EEPROM_NAME)-$$i.png; done)
+TELEM_FILES    = $(shell for i in $(RES); do echo $(TELEM_NAME)-$$i.png; done)
+IN_MPD_FILES   = $(shell for i in $(RES); do echo $(MPD_NAME)-$$i.png; done)
+
+# XPM file needed by debian
+
+AM_XPM = altusmetrum.xpm
+
+ICON_THEME=$(datadir)/icons/hicolor
+
+appicondir = $(ICON_THEME)/scalable/apps
+appicon_DATA = $(AM_ICON) $(MP_ICON) $(TG_ICON)
+
+MIME_ICONS = $(EEPROM_ICON) $(TELEM_ICON) $(MPD_ICON)
+
+mimeicondir = $(ICON_THEME)/scalable/mimetypes
+mimeicon_DATA = $(MIME_ICONS)
+
+mimedir = $(datadir)/mime/packages
+mime_DATA = org-altusmetrum-mimetypes.xml
+
+pixmapdir = $(datadir)/pixmaps
+pixmap_DATA = altusmetrum.xpm
+
+EXTRA_DIST = $(appicon_DATA) $(mimeicon_DATA) $(mime_DATA) windows-stub.c
 
 res:
        echo $(RES)
 
-all-local: $(ICO_FILES) $(ICNS_FILES)
+java-altosui:
+       @echo $(JAVA_AM_FILES)
+
+java-micropeak:
+       @echo $(JAVA_MP_FILES)
+
+java-telegps:
+       @echo $(JAVA_TG_FILES)
+
+fat: all $(ICO_FILES) $(ICNS_FILES) $(EXE_FILES)
+
+all-local: $(JAVA_FILES) $(AM_XPM)
 
 clean-local:
-       $(RM) altus-metrum-*.png telegps-*.png micropeak-*.png *.build *.ico *.icns
+       $(RM) $(AM_NAME)-*.png $(TG_NAME)-*.png $(MP_NAME)-*.png
+       $(RM) altus-metrum-*.png micropeak-*.png telegps-*.png
+       $(RM) $(EEPROM_NAME)-*.png $(TELEM_NAME)-*.png $(MPD_NAME)-*.png
+       $(RM) *.build *.ico *.rc *.icns *.o *.exe $(MPD_ICON)
+       $(RM) altusmetrum.xpm
+
+install-data-hook:
+       update-mime-database $(datadir)/mime
+       update-icon-caches $(ICON_THEME)
 
-$(AM_FILES): altusmetrum.build
+$(MPD_ICON): $(MP_ICON)
+       $(LN_S) $(MP_ICON) $@
 
-altusmetrum.build: altusmetrum.svg
-       for i in $(RES); do rsvg-convert -w $$i -h $$i -o altus-metrum-$$i.png altusmetrum.svg; done && touch $@
+XPM_SRC=altusmetrum-altosui-32.png
 
-$(TG_FILES): telegps.build
+altusmetrum.xpm: $(XPM_SRC)
+       pngtopnm -alpha $(XPM_SRC) > mask-$@ && \
+               pngtopnm $(XPM_SRC) | \
+               ppmtoxpm -alphamask=mask-$@ > $@ && rm mask-$@
 
-telegps.build: telegps.svg
-       for i in $(RES); do rsvg-convert -w $$i -h $$i -o telegps-$$i.png telegps.svg; done && touch $@
+$(AM_FILES): $(AM_NAME).build
+$(MP_FILES): $(MP_NAME).build
+$(TG_FILES): $(TG_NAME).build
 
-$(MP_FILES): micropeak.build
+SUFFIXES=.svg .build .icns .ico .rc .o .exe
 
-micropeak.build: micropeak.svg
-       for i in $(RES); do rsvg-convert -w $$i -h $$i -o micropeak-$$i.png micropeak.svg; done && touch $@
+.svg.build:
+       for i in $(RES); do rsvg-convert -w $$i -h $$i -o $*-$$i.png $*.svg; done && touch $@
 
-#clean-local:
-#      $(RM) -f $(ICO_FILES)
+.build.icns:
+       png2icns $@ $(shell for i in $(MAC_RES); do echo $*-$$i.png; done)
 
-altus-metrum.ico: $(WIN_AM_FILES)
-       icotool -c -o $@ $(WIN_AM_FILES)
+.build.ico:
+       icotool -c -o $@ $(shell for i in $(WIN_RES); do echo $*-$$i.png; done)
 
-micro-peak.ico: $(WIN_MP_FILES)
-       icotool -c -o $@ $(WIN_MP_FILES)
+.ico.rc:
+       echo '101 ICON "$*.ico"' > $@
 
-telegps.ico: $(WIN_TG_FILES)
-       icotool -c -o $@ $(WIN_TG_FILES)
 
-AltosUIIcon.icns: $(MAC_AM_FILES)
-       png2icns $@ $(MAC_AM_FILES)
+MINGCC32=i686-w64-mingw32-gcc
+MINGWINDRES=i686-w64-mingw32-windres
 
-TeleGPS.icns: $(MAC_TG_FILES)
-       png2icns $@ $(MAC_TG_FILES)
+.rc.o:
+       $(MINGWINDRES) $*.rc $@
 
-MicroPeak.icns: $(MAC_MP_FILES)
-       png2icns $@ $(MAC_MP_FILES)
+.o.exe:
+       $(MINGCC32) -o $@ windows-stub.c $*.o
diff --git a/icon/altusmetrum-altosui.svg b/icon/altusmetrum-altosui.svg
new file mode 100644 (file)
index 0000000..e8935a6
--- /dev/null
@@ -0,0 +1,250 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="svg2"
+   width="214.27165"
+   height="266.00192"
+   version="1.0"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="altusmetrum.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   inkscape:export-filename="/home/keithp/src/cc1111/altus-logo/bottom.png"
+   inkscape:export-xdpi="119.89881"
+   inkscape:export-ydpi="119.89881">
+  <metadata
+     id="metadata14">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs12">
+    <linearGradient
+       id="linearGradient3165">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3167" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop3169" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3177">
+      <stop
+         style="stop-color:#da7000;stop-opacity:1;"
+         offset="0"
+         id="stop3179" />
+      <stop
+         id="stop3447"
+         offset="0.24528302"
+         style="stop-color:#a63852;stop-opacity:1;" />
+      <stop
+         style="stop-color:#7200a4;stop-opacity:1;"
+         offset="1"
+         id="stop3181" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3169">
+      <stop
+         style="stop-color:#ff8a00;stop-opacity:1;"
+         offset="0"
+         id="stop3171" />
+      <stop
+         id="stop3445"
+         offset="0.71698111"
+         style="stop-color:#c24573;stop-opacity:0.98039216;" />
+      <stop
+         style="stop-color:#8500e7;stop-opacity:0.96078432;"
+         offset="1"
+         id="stop3173" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 121 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="191 : 121 : 1"
+       inkscape:persp3d-origin="95.5 : 80.666667 : 1"
+       id="perspective16" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3169"
+       id="radialGradient3175"
+       cx="951.68713"
+       cy="2305.2668"
+       fx="951.68713"
+       fy="2305.2668"
+       r="951.68701"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3165"
+       id="radialGradient3171"
+       cx="951.68713"
+       cy="1205.2668"
+       fx="951.68713"
+       fy="1205.2668"
+       r="951.68701"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3169"
+       id="radialGradient3020"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       cx="951.68713"
+       cy="2305.2668"
+       fx="951.68713"
+       fy="2305.2668"
+       r="951.68701" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3165"
+       id="radialGradient3022"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       cx="951.68713"
+       cy="1205.2668"
+       fx="951.68713"
+       fy="1205.2668"
+       r="951.68701" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3169"
+       id="radialGradient3024"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       cx="951.68713"
+       cy="2305.2668"
+       fx="951.68713"
+       fy="2305.2668"
+       r="951.68701" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3165"
+       id="radialGradient3026"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       cx="951.68713"
+       cy="1205.2668"
+       fx="951.68713"
+       fy="1205.2668"
+       r="951.68701" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3169"
+       id="radialGradient3028"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       cx="951.68713"
+       cy="2305.2668"
+       fx="951.68713"
+       fy="2305.2668"
+       r="951.68701" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3165"
+       id="radialGradient3030"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       cx="951.68713"
+       cy="1205.2668"
+       fx="951.68713"
+       fy="1205.2668"
+       r="951.68701" />
+    <filter
+       id="filter3005"
+       inkscape:label="Drop Shadow"
+       color-interpolation-filters="sRGB">
+      <feFlood
+         id="feFlood3007"
+         flood-opacity="0.604"
+         flood-color="rgb(0,0,0)"
+         result="flood" />
+      <feComposite
+         id="feComposite3009"
+         in2="SourceGraphic"
+         in="flood"
+         operator="in"
+         result="composite1" />
+      <feGaussianBlur
+         id="feGaussianBlur3011"
+         stdDeviation="80"
+         result="blur" />
+      <feOffset
+         id="feOffset3013"
+         dx="100"
+         dy="100"
+         result="offset" />
+      <feComposite
+         id="feComposite3015"
+         in2="offset"
+         in="SourceGraphic"
+         operator="over"
+         result="composite2" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     inkscape:cy="128.91168"
+     inkscape:cx="271.89232"
+     inkscape:zoom="2.4559706"
+     inkscape:window-height="1177"
+     inkscape:window-width="1462"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     guidetolerance="10.0"
+     gridtolerance="10.0"
+     objecttolerance="10.0"
+     borderopacity="1.0"
+     bordercolor="#666666"
+     pagecolor="#ffffff"
+     id="base"
+     showgrid="false"
+     inkscape:window-x="266"
+     inkscape:window-y="43"
+     inkscape:current-layer="svg2"
+     inkscape:window-maximized="0"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="20"
+     fit-margin-bottom="20" />
+  <g
+     transform="matrix(0.1,0,0,0.1,1.967113,2.4742836)"
+     id="g3"
+     style="fill:url(#radialGradient3175);fill-opacity:1;stroke:url(#radialGradient3171);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;filter:url(#filter3005)">
+    <g
+       transform="translate(20.61545,-27.69425)"
+       style="fill:url(#radialGradient3028);fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient3030);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none"
+       id="g5">
+      <path
+         d="m 931.07168,1164.597 248.86992,-331.80265 416.1687,1338.32935 286.6484,267.1042 -520.4224,0 -270.2797,-262.2181 0,-1033.0627 -160.98492,106.6818 -160.98492,-106.6818 0,1033.0627 -270.2797,262.2181 -520.4224,0 286.6484,-267.1042 416.1687,-1338.32935 248.86992,331.80265 z"
+         id="path7"
+         style="fill:url(#radialGradient3020);fill-opacity:1;stroke:url(#radialGradient3022);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 931.07168,27.69425 224.03682,720.46517 -63.341,76.00913 L 931.07168,486.3269 770.37586,824.16855 707.03486,748.15942 931.07168,27.69425 z"
+         id="path9"
+         style="fill:url(#radialGradient3024);fill-opacity:1;stroke:url(#radialGradient3026);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none"
+         inkscape:connector-curvature="0" />
+    </g>
+  </g>
+</svg>
diff --git a/icon/altusmetrum-micropeak.svg b/icon/altusmetrum-micropeak.svg
new file mode 100644 (file)
index 0000000..d37130f
--- /dev/null
@@ -0,0 +1,219 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="49.03825"
+   height="43.606411"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="micropeak.svg">
+  <defs
+     id="defs4">
+    <linearGradient
+       id="linearGradient5343">
+      <stop
+         style="stop-color:#7200a4;stop-opacity:1;"
+         offset="0"
+         id="stop5345" />
+      <stop
+         style="stop-color:#da7000;stop-opacity:1;"
+         offset="1"
+         id="stop5347" />
+    </linearGradient>
+    <marker
+       inkscape:stockid="Arrow2Send"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Send"
+       style="overflow:visible">
+      <path
+         id="path3798"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-0.3,0,0,-0.3,0.69,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Send"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Send"
+       style="overflow:visible">
+      <path
+         id="path3780"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Mend"
+       style="overflow:visible">
+      <path
+         id="path3792"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="scale(-0.6,-0.6)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible">
+      <path
+         id="path3768"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow2Lend"
+       style="overflow:visible">
+      <path
+         id="path3786"
+         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5343"
+       id="linearGradient5349"
+       x1="255.48561"
+       y1="275.90405"
+       x2="280.61411"
+       y2="275.90405"
+       gradientUnits="userSpaceOnUse" />
+    <filter
+       id="filter3027"
+       inkscape:label="Drop Shadow"
+       color-interpolation-filters="sRGB">
+      <feFlood
+         id="feFlood3029"
+         flood-opacity="0.604"
+         flood-color="rgb(0,0,0)"
+         result="flood" />
+      <feComposite
+         id="feComposite3031"
+         in2="SourceGraphic"
+         in="flood"
+         operator="in"
+         result="composite1" />
+      <feGaussianBlur
+         id="feGaussianBlur3033"
+         stdDeviation="1.6"
+         result="blur" />
+      <feOffset
+         id="feOffset3035"
+         dx="2"
+         dy="2"
+         result="offset" />
+      <feComposite
+         id="feComposite3037"
+         in2="offset"
+         in="SourceGraphic"
+         operator="over"
+         result="composite2" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="8.160856"
+     inkscape:cx="33.152671"
+     inkscape:cy="27.859227"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1277"
+     inkscape:window-height="894"
+     inkscape:window-x="543"
+     inkscape:window-y="242"
+     inkscape:window-maximized="0"
+     fit-margin-top="-3"
+     fit-margin-left="-4"
+     fit-margin-right="-1"
+     fit-margin-bottom="0" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-241.43522,-252.43073)">
+    <g
+       id="g3000"
+       style="filter:url(#filter3027)">
+      <g
+         id="text2985"
+         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#7200a4;fill-opacity:1;stroke:none;font-family:Minion Pro;-inkscape-font-specification:Minion Pro">
+        <path
+           inkscape:connector-curvature="0"
+           id="path3003"
+           style="font-size:36px;font-weight:500;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#7200a4;font-family:ITC Benguiat Gothic Std;-inkscape-font-specification:ITC Benguiat Gothic Std Medium"
+           d="m 257.20241,268.30647 c 0,-1.07999 -0.396,-1.872 -1.584,-1.872 -1.188,0 -1.584,0.79201 -1.584,1.872 l 0,8.676 c 0,2.88 -2.052,5.112 -4.824,5.112 -3.06,0 -4.104,-1.872 -4.104,-5.076 l 0,-8.712 c 0,-1.07999 -0.396,-1.872 -1.584,-1.872 -1.188,0 -1.584,0.79201 -1.584,1.872 l 0,21.924 c 0,1.08 0.396,1.872 1.584,1.872 1.188,0 1.584,-0.792 1.584,-1.872 l 0,-6.156 c 0.792,0.612 2.088,0.972 3.564,0.972 2.304,0 4.428,-0.792 5.652,-2.988 l 0.072,0.072 0,1.26 c 0,0.864 0.54,1.44 1.404,1.44 0.864,0 1.404,-0.576 1.404,-1.44 l 0,-15.084" />
+      </g>
+      <path
+         sodipodi:nodetypes="cssc"
+         inkscape:connector-curvature="0"
+         id="path2991"
+         d="m 256.93561,290.70327 c 3.04022,-0.24413 4.30317,-2.66932 5.38268,-5.56604 1.68059,-4.50963 3.67214,-15.86904 8.62227,-20.55527 4.0668,-3.85 8.22354,-3.46656 8.22354,-3.46656"
+         style="fill:none;stroke:url(#linearGradient5349);stroke-width:2.9000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:none" />
+      <path
+         inkscape:transform-center-y="-0.40889198"
+         inkscape:transform-center-x="-0.29194889"
+         d="m 282.7522,267.42614 -3.93403,-2.77705 -4.51792,1.66641 1.42544,-4.59964 -2.98096,-3.78185 4.815,-0.0657 2.67559,-4.00372 1.55039,4.55904 4.63457,1.30742 -3.85681,2.88333 z"
+         inkscape:randomized="0"
+         inkscape:rounded="0"
+         inkscape:flatsided="false"
+         sodipodi:arg2="1.7014539"
+         sodipodi:arg1="1.0731354"
+         sodipodi:r2="3.6257365"
+         sodipodi:r1="7.2514729"
+         sodipodi:cy="261.05426"
+         sodipodi:cx="279.29056"
+         sodipodi:sides="5"
+         id="path5341"
+         style="fill:none;stroke:#da7000;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         sodipodi:type="star" />
+    </g>
+  </g>
+</svg>
diff --git a/icon/altusmetrum-telegps.svg b/icon/altusmetrum-telegps.svg
new file mode 100644 (file)
index 0000000..1e390f3
--- /dev/null
@@ -0,0 +1,324 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="151.43401"
+   height="144.50209"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="telegps.svg">
+  <defs
+     id="defs4">
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3169"
+       id="radialGradient3175"
+       cx="951.68713"
+       cy="2305.2668"
+       fx="951.68713"
+       fy="2305.2668"
+       r="951.68701"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient3169">
+      <stop
+         style="stop-color:#ff8a00;stop-opacity:1;"
+         offset="0"
+         id="stop3171" />
+      <stop
+         id="stop3445"
+         offset="0.71698111"
+         style="stop-color:#c24573;stop-opacity:0.98039216;" />
+      <stop
+         style="stop-color:#8500e7;stop-opacity:0.96078432;"
+         offset="1"
+         id="stop3173" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3165"
+       id="radialGradient3171"
+       cx="951.68713"
+       cy="1205.2668"
+       fx="951.68713"
+       fy="1205.2668"
+       r="951.68701"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient3165">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3167" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop3169" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3169"
+       id="radialGradient2838"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       cx="951.68713"
+       cy="2305.2668"
+       fx="951.68713"
+       fy="2305.2668"
+       r="951.68701" />
+    <linearGradient
+       id="linearGradient3181">
+      <stop
+         style="stop-color:#ff8a00;stop-opacity:1;"
+         offset="0"
+         id="stop3183" />
+      <stop
+         id="stop3185"
+         offset="0.71698111"
+         style="stop-color:#c24573;stop-opacity:0.98039216;" />
+      <stop
+         style="stop-color:#8500e7;stop-opacity:0.96078432;"
+         offset="1"
+         id="stop3187" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3165"
+       id="radialGradient2840"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       cx="951.68713"
+       cy="1205.2668"
+       fx="951.68713"
+       fy="1205.2668"
+       r="951.68701" />
+    <linearGradient
+       id="linearGradient3190">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3192" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop3194" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3169"
+       id="radialGradient2830"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       cx="951.68713"
+       cy="2305.2668"
+       fx="951.68713"
+       fy="2305.2668"
+       r="951.68701" />
+    <linearGradient
+       id="linearGradient3197">
+      <stop
+         style="stop-color:#ff8a00;stop-opacity:1;"
+         offset="0"
+         id="stop3199" />
+      <stop
+         id="stop3201"
+         offset="0.71698111"
+         style="stop-color:#c24573;stop-opacity:0.98039216;" />
+      <stop
+         style="stop-color:#8500e7;stop-opacity:0.96078432;"
+         offset="1"
+         id="stop3203" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3165"
+       id="radialGradient2832"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       cx="951.68713"
+       cy="1205.2668"
+       fx="951.68713"
+       fy="1205.2668"
+       r="951.68701" />
+    <linearGradient
+       id="linearGradient3206">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3208" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop3210" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3169"
+       id="radialGradient2834"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       cx="951.68713"
+       cy="2305.2668"
+       fx="951.68713"
+       fy="2305.2668"
+       r="951.68701" />
+    <linearGradient
+       id="linearGradient3213">
+      <stop
+         style="stop-color:#ff8a00;stop-opacity:1;"
+         offset="0"
+         id="stop3215" />
+      <stop
+         id="stop3217"
+         offset="0.71698111"
+         style="stop-color:#c24573;stop-opacity:0.98039216;" />
+      <stop
+         style="stop-color:#8500e7;stop-opacity:0.96078432;"
+         offset="1"
+         id="stop3219" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3165"
+       id="radialGradient2836"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       cx="951.68713"
+       cy="1205.2668"
+       fx="951.68713"
+       fy="1205.2668"
+       r="951.68701" />
+    <linearGradient
+       id="linearGradient3222">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3224" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop3226" />
+    </linearGradient>
+    <radialGradient
+       r="951.68701"
+       fy="2305.2668"
+       fx="951.68713"
+       cy="2305.2668"
+       cx="951.68713"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient3232"
+       xlink:href="#linearGradient3169"
+       inkscape:collect="always" />
+    <radialGradient
+       r="951.68701"
+       fy="1205.2668"
+       fx="951.68713"
+       cy="1205.2668"
+       cx="951.68713"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient3234"
+       xlink:href="#linearGradient3165"
+       inkscape:collect="always" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3169"
+       id="radialGradient4101"
+       cx="194.54575"
+       cy="361.16367"
+       fx="194.54575"
+       fy="361.16367"
+       r="70.597672"
+       gradientTransform="matrix(1,0,0,0.95908583,137.14286,74.776711)"
+       gradientUnits="userSpaceOnUse" />
+    <filter
+       id="filter3238"
+       inkscape:label="Drop Shadow"
+       color-interpolation-filters="sRGB">
+      <feFlood
+         id="feFlood3240"
+         flood-opacity="0.604"
+         flood-color="rgb(0,0,0)"
+         result="flood" />
+      <feComposite
+         id="feComposite3242"
+         in2="SourceGraphic"
+         in="flood"
+         operator="in"
+         result="composite1" />
+      <feGaussianBlur
+         id="feGaussianBlur3244"
+         stdDeviation="4"
+         result="blur" />
+      <feOffset
+         id="feOffset3246"
+         dx="5"
+         dy="5"
+         result="offset" />
+      <feComposite
+         id="feComposite3248"
+         in2="offset"
+         in="SourceGraphic"
+         operator="over"
+         result="composite2" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="3.959798"
+     inkscape:cx="91.754359"
+     inkscape:cy="68.172898"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     fit-margin-top="-12"
+     fit-margin-left="-12"
+     fit-margin-right="-6"
+     fit-margin-bottom="-6"
+     inkscape:window-width="996"
+     inkscape:window-height="970"
+     inkscape:window-x="930"
+     inkscape:window-y="553"
+     inkscape:window-maximized="0" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-258.97144,-351.91262)">
+    <path
+       style="fill:url(#radialGradient4101);fill-opacity:1;filter:url(#filter3238)"
+       d="m 261.09094,466.61035 1.9122,-1.69399 39.0721,-36.4688 20.74158,22.05252 -40.71991,38.37279 z m 36.24983,1.34654 -14.08636,-15.38433 -15.33887,14.40857 14.50759,15.23741 z m 18.98704,-17.58715 -14.47613,-15.53942 -14.95191,14.42099 14.19976,15.37575 z m 43.2565,3.24033 -5.69326,-6.00917 -2.76929,1.85727 c -5.01515,3.36349 -10.61773,4.75193 -13.55344,3.35884 -0.90785,-0.4308 -11.20677,-10.85557 -16.46128,-16.61505 -6.3177,-6.92484 -17.77225,-18.68338 -18.08204,-21.53696 l -0.25491,-2.34789 -6.68224,-3.00173 -6.68224,-3.00173 -0.12416,-2.54849 c -0.24316,-4.99109 2.61694,-11.66135 7.10652,-16.57368 6.51922,-7.13306 14.23173,-10.81215 21.4071,-10.21178 l 2.49577,0.20881 2.34108,7.3087 2.34109,7.3087 2.0542,0.21626 c 1.12981,0.11895 2.29245,0.36702 2.58364,0.55127 0.29119,0.18424 11.17756,11.55849 16.63562,17.46044 5.67391,6.13537 16.35301,17.71615 16.74619,18.65715 1.36492,3.26672 -0.56522,9.34479 -4.44838,14.00803 -0.92939,1.1161 -1.6875,2.14976 -1.6847,2.29703 0.003,0.14726 2.44601,2.88431 5.42933,6.08233 2.98332,3.19801 5.42421,6.02814 5.42421,6.28919 0,0.66794 -0.91528,1.72591 -1.73982,2.01104 -0.50334,0.17406 -2.27007,-1.42112 -6.38899,-5.76858 z m -13.8944,-6.52384 c 0.96195,-0.49074 2.46683,-1.3673 3.34417,-1.94791 l 1.59519,-1.05564 -1.69025,-1.72225 c -1.71532,-1.74777 -2.09589,-2.99732 -1.1891,-3.90412 0.98407,-0.98406 2.33559,-0.53387 3.9423,1.31314 l 1.57825,1.81431 1.43638,-1.7099 c 1.7115,-2.03742 3.3933,-5.47555 3.39008,-6.9304 -0.0104,-4.68327 -7.01613,-2.68794 -13.36898,3.80766 -4.26282,4.35861 -6.32786,9.57528 -4.26584,10.77629 1.19252,0.69458 3.36009,0.51166 5.2278,-0.44118 z m -37.53066,-44.39022 c 2.23934,-2.70633 7.29399,-6.99375 10.13666,-8.59806 1.69887,-0.95877 2.21231,-1.46174 2.04152,-1.99985 -0.1255,-0.3954 -1.05734,-3.0661 -2.07077,-5.93487 l -1.84259,-5.21596 -1.60649,0.12825 c -4.1301,0.32972 -9.06228,2.86043 -13.29918,6.82384 -4.03277,3.77245 -7.7843,10.20829 -7.89014,13.53572 l -0.0463,1.4539 5.4085,2.47197 5.4085,2.47197 1.02919,-1.54008 c 0.56606,-0.84704 1.79503,-2.46562 2.73105,-3.59683 z m 32.91039,-10.47213 40.55794,-38.76942 c 7.09795,7.71166 14.5366,15.63755 20.65837,22.2503 l -40.53088,38.2414 z m 35.73645,1.02093 -14.2595,-15.3791 -15.29495,14.35785 14.65467,15.14661 z m 18.6801,-17.55816 -14.10162,-15.40128 -15.32812,14.3973 14.52992,15.24342 z"
+       id="path3063"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccccccccccscssascccssscccscasscsssssccssscssssscssscssccccsccccccccccccccccc" />
+  </g>
+</svg>
diff --git a/icon/altusmetrum.svg b/icon/altusmetrum.svg
deleted file mode 100644 (file)
index e8935a6..0000000
+++ /dev/null
@@ -1,250 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   id="svg2"
-   width="214.27165"
-   height="266.00192"
-   version="1.0"
-   sodipodi:version="0.32"
-   inkscape:version="0.48.4 r9939"
-   sodipodi:docname="altusmetrum.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape"
-   inkscape:export-filename="/home/keithp/src/cc1111/altus-logo/bottom.png"
-   inkscape:export-xdpi="119.89881"
-   inkscape:export-ydpi="119.89881">
-  <metadata
-     id="metadata14">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <defs
-     id="defs12">
-    <linearGradient
-       id="linearGradient3165">
-      <stop
-         style="stop-color:#000000;stop-opacity:1;"
-         offset="0"
-         id="stop3167" />
-      <stop
-         style="stop-color:#000000;stop-opacity:0;"
-         offset="1"
-         id="stop3169" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3177">
-      <stop
-         style="stop-color:#da7000;stop-opacity:1;"
-         offset="0"
-         id="stop3179" />
-      <stop
-         id="stop3447"
-         offset="0.24528302"
-         style="stop-color:#a63852;stop-opacity:1;" />
-      <stop
-         style="stop-color:#7200a4;stop-opacity:1;"
-         offset="1"
-         id="stop3181" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3169">
-      <stop
-         style="stop-color:#ff8a00;stop-opacity:1;"
-         offset="0"
-         id="stop3171" />
-      <stop
-         id="stop3445"
-         offset="0.71698111"
-         style="stop-color:#c24573;stop-opacity:0.98039216;" />
-      <stop
-         style="stop-color:#8500e7;stop-opacity:0.96078432;"
-         offset="1"
-         id="stop3173" />
-    </linearGradient>
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 121 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="191 : 121 : 1"
-       inkscape:persp3d-origin="95.5 : 80.666667 : 1"
-       id="perspective16" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3169"
-       id="radialGradient3175"
-       cx="951.68713"
-       cy="2305.2668"
-       fx="951.68713"
-       fy="2305.2668"
-       r="951.68701"
-       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
-       gradientUnits="userSpaceOnUse" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3165"
-       id="radialGradient3171"
-       cx="951.68713"
-       cy="1205.2668"
-       fx="951.68713"
-       fy="1205.2668"
-       r="951.68701"
-       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
-       gradientUnits="userSpaceOnUse" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3169"
-       id="radialGradient3020"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
-       cx="951.68713"
-       cy="2305.2668"
-       fx="951.68713"
-       fy="2305.2668"
-       r="951.68701" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3165"
-       id="radialGradient3022"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
-       cx="951.68713"
-       cy="1205.2668"
-       fx="951.68713"
-       fy="1205.2668"
-       r="951.68701" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3169"
-       id="radialGradient3024"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
-       cx="951.68713"
-       cy="2305.2668"
-       fx="951.68713"
-       fy="2305.2668"
-       r="951.68701" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3165"
-       id="radialGradient3026"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
-       cx="951.68713"
-       cy="1205.2668"
-       fx="951.68713"
-       fy="1205.2668"
-       r="951.68701" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3169"
-       id="radialGradient3028"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
-       cx="951.68713"
-       cy="2305.2668"
-       fx="951.68713"
-       fy="2305.2668"
-       r="951.68701" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3165"
-       id="radialGradient3030"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
-       cx="951.68713"
-       cy="1205.2668"
-       fx="951.68713"
-       fy="1205.2668"
-       r="951.68701" />
-    <filter
-       id="filter3005"
-       inkscape:label="Drop Shadow"
-       color-interpolation-filters="sRGB">
-      <feFlood
-         id="feFlood3007"
-         flood-opacity="0.604"
-         flood-color="rgb(0,0,0)"
-         result="flood" />
-      <feComposite
-         id="feComposite3009"
-         in2="SourceGraphic"
-         in="flood"
-         operator="in"
-         result="composite1" />
-      <feGaussianBlur
-         id="feGaussianBlur3011"
-         stdDeviation="80"
-         result="blur" />
-      <feOffset
-         id="feOffset3013"
-         dx="100"
-         dy="100"
-         result="offset" />
-      <feComposite
-         id="feComposite3015"
-         in2="offset"
-         in="SourceGraphic"
-         operator="over"
-         result="composite2" />
-    </filter>
-  </defs>
-  <sodipodi:namedview
-     inkscape:cy="128.91168"
-     inkscape:cx="271.89232"
-     inkscape:zoom="2.4559706"
-     inkscape:window-height="1177"
-     inkscape:window-width="1462"
-     inkscape:pageshadow="2"
-     inkscape:pageopacity="0.0"
-     guidetolerance="10.0"
-     gridtolerance="10.0"
-     objecttolerance="10.0"
-     borderopacity="1.0"
-     bordercolor="#666666"
-     pagecolor="#ffffff"
-     id="base"
-     showgrid="false"
-     inkscape:window-x="266"
-     inkscape:window-y="43"
-     inkscape:current-layer="svg2"
-     inkscape:window-maximized="0"
-     fit-margin-top="0"
-     fit-margin-left="0"
-     fit-margin-right="20"
-     fit-margin-bottom="20" />
-  <g
-     transform="matrix(0.1,0,0,0.1,1.967113,2.4742836)"
-     id="g3"
-     style="fill:url(#radialGradient3175);fill-opacity:1;stroke:url(#radialGradient3171);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;filter:url(#filter3005)">
-    <g
-       transform="translate(20.61545,-27.69425)"
-       style="fill:url(#radialGradient3028);fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient3030);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none"
-       id="g5">
-      <path
-         d="m 931.07168,1164.597 248.86992,-331.80265 416.1687,1338.32935 286.6484,267.1042 -520.4224,0 -270.2797,-262.2181 0,-1033.0627 -160.98492,106.6818 -160.98492,-106.6818 0,1033.0627 -270.2797,262.2181 -520.4224,0 286.6484,-267.1042 416.1687,-1338.32935 248.86992,331.80265 z"
-         id="path7"
-         style="fill:url(#radialGradient3020);fill-opacity:1;stroke:url(#radialGradient3022);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none"
-         inkscape:connector-curvature="0" />
-      <path
-         d="m 931.07168,27.69425 224.03682,720.46517 -63.341,76.00913 L 931.07168,486.3269 770.37586,824.16855 707.03486,748.15942 931.07168,27.69425 z"
-         id="path9"
-         style="fill:url(#radialGradient3024);fill-opacity:1;stroke:url(#radialGradient3026);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none"
-         inkscape:connector-curvature="0" />
-    </g>
-  </g>
-</svg>
diff --git a/icon/application-vnd.altusmetrum.eeprom.svg b/icon/application-vnd.altusmetrum.eeprom.svg
new file mode 100644 (file)
index 0000000..7b481cd
--- /dev/null
@@ -0,0 +1,397 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="svg2"
+   width="214.27165"
+   height="266.00192"
+   version="1.0"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="application-vnd-altusmetrum-eeprom.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   inkscape:export-filename="/home/keithp/src/cc1111/altus-logo/bottom.png"
+   inkscape:export-xdpi="119.89881"
+   inkscape:export-ydpi="119.89881">
+  <metadata
+     id="metadata14">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs12">
+    <linearGradient
+       id="linearGradient3165">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3167" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop3169" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3177">
+      <stop
+         style="stop-color:#da7000;stop-opacity:1;"
+         offset="0"
+         id="stop3179" />
+      <stop
+         id="stop3447"
+         offset="0.24528302"
+         style="stop-color:#a63852;stop-opacity:1;" />
+      <stop
+         style="stop-color:#7200a4;stop-opacity:1;"
+         offset="1"
+         id="stop3181" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3169">
+      <stop
+         style="stop-color:#ff8a00;stop-opacity:1;"
+         offset="0"
+         id="stop3171" />
+      <stop
+         id="stop3445"
+         offset="0.71698111"
+         style="stop-color:#c24573;stop-opacity:0.98039216;" />
+      <stop
+         style="stop-color:#8500e7;stop-opacity:0.96078432;"
+         offset="1"
+         id="stop3173" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 121 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="191 : 121 : 1"
+       inkscape:persp3d-origin="95.5 : 80.666667 : 1"
+       id="perspective16" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3169"
+       id="radialGradient3175"
+       cx="951.68713"
+       cy="2305.2668"
+       fx="951.68713"
+       fy="2305.2668"
+       r="951.68701"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3165"
+       id="radialGradient3171"
+       cx="951.68713"
+       cy="1205.2668"
+       fx="951.68713"
+       fy="1205.2668"
+       r="951.68701"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3169"
+       id="radialGradient3020"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       cx="951.68713"
+       cy="2305.2668"
+       fx="951.68713"
+       fy="2305.2668"
+       r="951.68701" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3165"
+       id="radialGradient3022"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       cx="951.68713"
+       cy="1205.2668"
+       fx="951.68713"
+       fy="1205.2668"
+       r="951.68701" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3169"
+       id="radialGradient3024"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       cx="951.68713"
+       cy="2305.2668"
+       fx="951.68713"
+       fy="2305.2668"
+       r="951.68701" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3165"
+       id="radialGradient3026"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       cx="951.68713"
+       cy="1205.2668"
+       fx="951.68713"
+       fy="1205.2668"
+       r="951.68701" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3169"
+       id="radialGradient3028"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       cx="951.68713"
+       cy="2305.2668"
+       fx="951.68713"
+       fy="2305.2668"
+       r="951.68701" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3165"
+       id="radialGradient3030"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       cx="951.68713"
+       cy="1205.2668"
+       fx="951.68713"
+       fy="1205.2668"
+       r="951.68701" />
+    <filter
+       id="filter3005"
+       inkscape:label="Drop Shadow"
+       color-interpolation-filters="sRGB">
+      <feFlood
+         id="feFlood3007"
+         flood-opacity="0.604"
+         flood-color="rgb(0,0,0)"
+         result="flood" />
+      <feComposite
+         id="feComposite3009"
+         in2="SourceGraphic"
+         in="flood"
+         operator="in"
+         result="composite1" />
+      <feGaussianBlur
+         id="feGaussianBlur3011"
+         stdDeviation="80"
+         result="blur" />
+      <feOffset
+         id="feOffset3013"
+         dx="100"
+         dy="100"
+         result="offset" />
+      <feComposite
+         id="feComposite3015"
+         in2="offset"
+         in="SourceGraphic"
+         operator="over"
+         result="composite2" />
+    </filter>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3169"
+       id="radialGradient4415"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       cx="951.68713"
+       cy="2305.2668"
+       fx="951.68713"
+       fy="2305.2668"
+       r="951.68701" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3165"
+       id="radialGradient4417"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       cx="951.68713"
+       cy="1205.2668"
+       fx="951.68713"
+       fy="1205.2668"
+       r="951.68701" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3169"
+       id="radialGradient4419"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       cx="951.68713"
+       cy="2305.2668"
+       fx="951.68713"
+       fy="2305.2668"
+       r="951.68701" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3165"
+       id="radialGradient4421"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       cx="951.68713"
+       cy="1205.2668"
+       fx="951.68713"
+       fy="1205.2668"
+       r="951.68701" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3169"
+       id="radialGradient4423"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       cx="951.68713"
+       cy="2305.2668"
+       fx="951.68713"
+       fy="2305.2668"
+       r="951.68701" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3165"
+       id="radialGradient4425"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       cx="951.68713"
+       cy="1205.2668"
+       fx="951.68713"
+       fy="1205.2668"
+       r="951.68701" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3169"
+       id="radialGradient4427"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       cx="951.68713"
+       cy="2305.2668"
+       fx="951.68713"
+       fy="2305.2668"
+       r="951.68701" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3165"
+       id="radialGradient4429"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       cx="951.68713"
+       cy="1205.2668"
+       fx="951.68713"
+       fy="1205.2668"
+       r="951.68701" />
+    <filter
+       id="filter4485"
+       style="color-interpolation-filters:sRGB;"
+       inkscape:label="Drop Shadow">
+      <feFlood
+         id="feFlood4487"
+         flood-opacity="0.604"
+         flood-color="rgb(0,0,0)"
+         result="flood" />
+      <feComposite
+         id="feComposite4489"
+         in2="SourceGraphic"
+         in="flood"
+         operator="in"
+         result="composite1" />
+      <feGaussianBlur
+         id="feGaussianBlur4491"
+         in="composite"
+         stdDeviation="8"
+         result="blur" />
+      <feOffset
+         id="feOffset4493"
+         dx="10"
+         dy="10"
+         result="offset" />
+      <feComposite
+         id="feComposite4495"
+         in2="offset"
+         in="SourceGraphic"
+         operator="over"
+         result="composite2" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     inkscape:cy="128.91168"
+     inkscape:cx="213.59793"
+     inkscape:zoom="2.4559706"
+     inkscape:window-height="1177"
+     inkscape:window-width="1462"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     guidetolerance="10.0"
+     gridtolerance="10.0"
+     objecttolerance="10.0"
+     borderopacity="1.0"
+     bordercolor="#666666"
+     pagecolor="#ffffff"
+     id="base"
+     showgrid="false"
+     inkscape:window-x="899"
+     inkscape:window-y="94"
+     inkscape:current-layer="svg2"
+     inkscape:window-maximized="0"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="20"
+     fit-margin-bottom="20" />
+  <g
+     id="g4439"
+     style="filter:url(#filter4485)">
+    <g
+       style="fill:url(#radialGradient4427);fill-opacity:1;stroke:url(#radialGradient4429);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;"
+       id="g3"
+       transform="matrix(0.1,0,0,0.1,1.967113,2.4742836)">
+      <g
+         id="g5"
+         style="fill:url(#radialGradient4423);fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient4425);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;"
+         transform="translate(20.61545,-27.69425)">
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:url(#radialGradient4415);fill-opacity:1;stroke:url(#radialGradient4417);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;"
+           id="path7"
+           d="m 931.07168,1164.597 248.86992,-331.80265 416.1687,1338.32935 286.6484,267.1042 -520.4224,0 -270.2797,-262.2181 0,-1033.0627 -160.98492,106.6818 -160.98492,-106.6818 0,1033.0627 -270.2797,262.2181 -520.4224,0 286.6484,-267.1042 416.1687,-1338.32935 248.86992,331.80265 z" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:url(#radialGradient4419);fill-opacity:1;stroke:url(#radialGradient4421);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;"
+           id="path9"
+           d="m 931.07168,27.69425 224.03682,720.46517 -63.341,76.00913 L 931.07168,486.3269 770.37586,824.16855 707.03486,748.15942 931.07168,27.69425 z" />
+      </g>
+    </g>
+    <g
+       transform="matrix(2.8009121,0,0,2.8009121,97.173402,128.84062)"
+       id="g4373"
+       style="fill-rule:evenodd">
+      <path
+         id="rect3922"
+         d="m 30.19825,5.3569063 c 0.5796,0 1.046698,0.6864133 1.046698,1.5381453 l 0,25.8484734 c 0,0.851692 -0.467114,1.538145 -1.046698,1.538145 l -29.0366268,0 c -0.57960004,0 -1.04669856,-0.686421 -1.04669856,-1.538145 0,0 0.002884,-25.8275138 2.6458e-4,-25.8479191 0,-0.8516925 0.46711441,-1.5381453 1.04669858,-1.5381453 l 29.0366272,0 z"
+         inkscape:connector-curvature="0"
+         style="fill:#333333;stroke:#000000;stroke-width:0.22984983"
+         sodipodi:nodetypes="cssssccscc" />
+      <path
+         style="fill:#999999;stroke:#000000;stroke-width:0.26240885"
+         id="path4952"
+         d="m 4.3596675,0.13120443 0,0.7176181 -1.2452482,3.12200877 0,1.4500325 5.4990161,0 0,-1.4500325 -1.2406962,-3.12200877 0,-0.7176181 -3.0131735,0 z m 6.6261025,0 0,0.7176181 -1.2452487,3.12200877 0,1.4500325 5.4990167,0 0,-1.4500325 -1.240696,-3.12200877 0,-0.7176181 -3.013174,0 z m 6.621594,0 0,0.7176181 -1.240696,3.12200877 0,1.4500325 5.499015,0 0,-1.4500325 -1.240696,-3.12200877 0,-0.7176181 -3.017682,0 z m 6.626102,0 0,0.7176181 -1.240696,3.12200877 0,1.4500325 5.499015,0 0,-1.4500325 -1.240696,-3.12200877 0,-0.7176181 -3.017682,0 z"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccccc" />
+      <path
+         style="fill:#999999;stroke:#000000;stroke-width:0.26240885"
+         id="path4974"
+         d="m 3.1147829,34.371248 0,1.450032 1.2452481,3.122009 0,0.717618 3.0131736,0 0,-0.717618 1.2406961,-3.122009 0,-1.450032 -5.499016,0 z m 6.626102,0 0,1.450032 1.2452481,3.122009 0,0.717618 3.013173,0 0,-0.717618 1.240697,-3.122009 0,-1.450032 -5.4990163,0 z m 6.6261021,0 0,1.450032 1.240696,3.122009 0,0.717618 3.017683,0 0,-0.717618 1.240696,-3.122009 0,-1.450032 -5.499017,0 z m 6.626102,0 0,1.450032 1.240696,3.122009 0,0.717618 3.017683,0 0,-0.717618 1.240696,-3.122009 0,-1.450032 -5.499017,0 z"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccccc" />
+    </g>
+  </g>
+</svg>
diff --git a/icon/application-vnd.altusmetrum.micropeak.svg b/icon/application-vnd.altusmetrum.micropeak.svg
new file mode 120000 (symlink)
index 0000000..6efd320
--- /dev/null
@@ -0,0 +1 @@
+altusmetrum-micropeak.svg
\ No newline at end of file
diff --git a/icon/application-vnd.altusmetrum.telemetry.svg b/icon/application-vnd.altusmetrum.telemetry.svg
new file mode 100644 (file)
index 0000000..4bcc085
--- /dev/null
@@ -0,0 +1,397 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="svg2"
+   width="214.27165"
+   height="266.00192"
+   version="1.0"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="application-vnd.altusmetrum.telemetry.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   inkscape:export-filename="/home/keithp/src/cc1111/altus-logo/bottom.png"
+   inkscape:export-xdpi="119.89881"
+   inkscape:export-ydpi="119.89881">
+  <metadata
+     id="metadata14">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs12">
+    <linearGradient
+       id="linearGradient3165">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3167" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop3169" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3177">
+      <stop
+         style="stop-color:#da7000;stop-opacity:1;"
+         offset="0"
+         id="stop3179" />
+      <stop
+         id="stop3447"
+         offset="0.24528302"
+         style="stop-color:#a63852;stop-opacity:1;" />
+      <stop
+         style="stop-color:#7200a4;stop-opacity:1;"
+         offset="1"
+         id="stop3181" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3169">
+      <stop
+         style="stop-color:#ff8a00;stop-opacity:1;"
+         offset="0"
+         id="stop3171" />
+      <stop
+         id="stop3445"
+         offset="0.71698111"
+         style="stop-color:#c24573;stop-opacity:0.98039216;" />
+      <stop
+         style="stop-color:#8500e7;stop-opacity:0.96078432;"
+         offset="1"
+         id="stop3173" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 121 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="191 : 121 : 1"
+       inkscape:persp3d-origin="95.5 : 80.666667 : 1"
+       id="perspective16" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3169"
+       id="radialGradient3175"
+       cx="951.68713"
+       cy="2305.2668"
+       fx="951.68713"
+       fy="2305.2668"
+       r="951.68701"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3165"
+       id="radialGradient3171"
+       cx="951.68713"
+       cy="1205.2668"
+       fx="951.68713"
+       fy="1205.2668"
+       r="951.68701"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3169"
+       id="radialGradient3020"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       cx="951.68713"
+       cy="2305.2668"
+       fx="951.68713"
+       fy="2305.2668"
+       r="951.68701" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3165"
+       id="radialGradient3022"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       cx="951.68713"
+       cy="1205.2668"
+       fx="951.68713"
+       fy="1205.2668"
+       r="951.68701" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3169"
+       id="radialGradient3024"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       cx="951.68713"
+       cy="2305.2668"
+       fx="951.68713"
+       fy="2305.2668"
+       r="951.68701" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3165"
+       id="radialGradient3026"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       cx="951.68713"
+       cy="1205.2668"
+       fx="951.68713"
+       fy="1205.2668"
+       r="951.68701" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3169"
+       id="radialGradient3028"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       cx="951.68713"
+       cy="2305.2668"
+       fx="951.68713"
+       fy="2305.2668"
+       r="951.68701" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3165"
+       id="radialGradient3030"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
+       cx="951.68713"
+       cy="1205.2668"
+       fx="951.68713"
+       fy="1205.2668"
+       r="951.68701" />
+    <filter
+       id="filter3005"
+       inkscape:label="Drop Shadow"
+       color-interpolation-filters="sRGB">
+      <feFlood
+         id="feFlood3007"
+         flood-opacity="0.604"
+         flood-color="rgb(0,0,0)"
+         result="flood" />
+      <feComposite
+         id="feComposite3009"
+         in2="SourceGraphic"
+         in="flood"
+         operator="in"
+         result="composite1" />
+      <feGaussianBlur
+         id="feGaussianBlur3011"
+         stdDeviation="80"
+         result="blur" />
+      <feOffset
+         id="feOffset3013"
+         dx="100"
+         dy="100"
+         result="offset" />
+      <feComposite
+         id="feComposite3015"
+         in2="offset"
+         in="SourceGraphic"
+         operator="over"
+         result="composite2" />
+    </filter>
+    <filter
+       id="filter4113"
+       style="color-interpolation-filters:sRGB;"
+       inkscape:label="Drop Shadow">
+      <feFlood
+         id="feFlood4115"
+         flood-opacity="0.604"
+         flood-color="rgb(0,0,0)"
+         result="flood" />
+      <feComposite
+         id="feComposite4117"
+         in2="SourceGraphic"
+         in="flood"
+         operator="in"
+         result="composite1" />
+      <feGaussianBlur
+         id="feGaussianBlur4119"
+         in="composite"
+         stdDeviation="6"
+         result="blur" />
+      <feOffset
+         id="feOffset4121"
+         dx="7.5"
+         dy="7.5"
+         result="offset" />
+      <feComposite
+         id="feComposite4123"
+         in2="offset"
+         in="SourceGraphic"
+         operator="over"
+         result="composite2" />
+    </filter>
+    <filter
+       id="filter4125"
+       style="color-interpolation-filters:sRGB;"
+       inkscape:label="Drop Shadow">
+      <feFlood
+         id="feFlood4127"
+         flood-opacity="0.604"
+         flood-color="rgb(0,0,0)"
+         result="flood" />
+      <feComposite
+         id="feComposite4129"
+         in2="SourceGraphic"
+         in="flood"
+         operator="in"
+         result="composite1" />
+      <feGaussianBlur
+         id="feGaussianBlur4131"
+         in="composite"
+         stdDeviation="6"
+         result="blur" />
+      <feOffset
+         id="feOffset4133"
+         dx="7.5"
+         dy="7.5"
+         result="offset" />
+      <feComposite
+         id="feComposite4135"
+         in2="offset"
+         in="SourceGraphic"
+         operator="over"
+         result="composite2" />
+    </filter>
+    <filter
+       id="filter3082"
+       style="color-interpolation-filters:sRGB;"
+       inkscape:label="Drop Shadow">
+      <feFlood
+         id="feFlood3084"
+         flood-opacity="0.604"
+         flood-color="rgb(0,0,0)"
+         result="flood" />
+      <feComposite
+         id="feComposite3086"
+         in2="SourceGraphic"
+         in="flood"
+         operator="in"
+         result="composite1" />
+      <feGaussianBlur
+         id="feGaussianBlur3088"
+         in="composite"
+         stdDeviation="6"
+         result="blur" />
+      <feOffset
+         id="feOffset3090"
+         dx="7.5"
+         dy="7.5"
+         result="offset" />
+      <feComposite
+         id="feComposite3092"
+         in2="offset"
+         in="SourceGraphic"
+         operator="over"
+         result="composite2" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     inkscape:cy="184.51843"
+     inkscape:cx="98.017058"
+     inkscape:zoom="1.7366335"
+     inkscape:window-height="1177"
+     inkscape:window-width="1462"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     guidetolerance="10.0"
+     gridtolerance="10.0"
+     objecttolerance="10.0"
+     borderopacity="1.0"
+     bordercolor="#666666"
+     pagecolor="#ffffff"
+     id="base"
+     showgrid="false"
+     inkscape:window-x="225"
+     inkscape:window-y="54"
+     inkscape:current-layer="svg2"
+     inkscape:window-maximized="0"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="20"
+     fit-margin-bottom="20" />
+  <path
+     sodipodi:type="arc"
+     style="opacity:0.98999999000000005;fill:none;fill-opacity:1;stroke:#8a08e8;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0;stroke-dasharray:none;stroke-dashoffset:0"
+     id="path3011"
+     sodipodi:cx="328.79059"
+     sodipodi:cy="127.97095"
+     sodipodi:rx="40.106342"
+     sodipodi:ry="37.459732"
+     d="m 368.89693,127.97095 a 40.106342,37.459732 0 1 1 -80.21268,0 40.106342,37.459732 0 1 1 80.21268,0 z" />
+  <g
+     id="g3032"
+     style="filter:url(#filter3082)">
+    <g
+       style="fill:url(#radialGradient3175);fill-opacity:1;stroke:url(#radialGradient3171);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;"
+       id="g3"
+       transform="matrix(0.1,0,0,0.1,1.967113,2.4742836)">
+      <g
+         id="g5"
+         style="fill:url(#radialGradient3028);fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient3030);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;"
+         transform="translate(20.61545,-27.69425)">
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:url(#radialGradient3020);fill-opacity:1;stroke:url(#radialGradient3022);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;"
+           id="path7"
+           d="m 931.07168,1164.597 248.86992,-331.80265 416.1687,1338.32935 286.6484,267.1042 -520.4224,0 -270.2797,-262.2181 0,-1033.0627 -160.98492,106.6818 -160.98492,-106.6818 0,1033.0627 -270.2797,262.2181 -520.4224,0 286.6484,-267.1042 416.1687,-1338.32935 248.86992,331.80265 z" />
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:url(#radialGradient3024);fill-opacity:1;stroke:url(#radialGradient3026);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;"
+           id="path9"
+           d="m 931.07168,27.69425 224.03682,720.46517 -63.341,76.00913 L 931.07168,486.3269 770.37586,824.16855 707.03486,748.15942 931.07168,27.69425 z" />
+      </g>
+    </g>
+    <g
+       transform="translate(16.698976,134.16763)"
+       id="g3916">
+      <path
+         style="fill:#8a0ae8;fill-opacity:1;fill-rule:evenodd;stroke:#8a0ae8;stroke-width:8.48192120000000038;stroke-linecap:round;stroke-opacity:1;"
+         inkscape:connector-curvature="0"
+         d="m 117.80725,-96.247891 c 0,0 5.41921,5.552354 5.41921,16.111148 m -5.41921,16.044574 c 0,0 5.41921,-5.552354 5.41921,-16.111149"
+         id="path14345" />
+      <path
+         style="fill:#8a0ae8;fill-opacity:1;fill-rule:evenodd;stroke:#8a0ae8;stroke-width:8.48192120000000038;stroke-linecap:round;stroke-opacity:1;"
+         inkscape:connector-curvature="0"
+         d="m 136.30179,-112.33241 c 0,0 10.83841,11.11802 10.83841,32.235612 m -10.83841,32.089148 c 0,0 10.83841,-11.104709 10.83841,-32.222298"
+         id="path14347" />
+      <path
+         style="fill:#8a0ae8;fill-opacity:1;fill-rule:evenodd;stroke:#8a0ae8;stroke-width:8.48192120000000038;stroke-linecap:round;stroke-opacity:1;"
+         inkscape:connector-curvature="0"
+         d="m 156.46069,-128.40361 c 0,0 16.27093,16.65706 16.27093,48.333442 m -16.27093,48.147037 c 0,0 16.27093,-16.670379 16.27093,-48.346762"
+         id="path14349" />
+    </g>
+    <g
+       transform="translate(-17.850629,134.16763)"
+       id="g3911">
+      <path
+         style="fill:#8a0ae8;fill-opacity:1;fill-rule:evenodd;stroke:#8a0ae8;stroke-width:8.48192120000000038;stroke-linecap:round;stroke-opacity:1;"
+         inkscape:connector-curvature="0"
+         d="m 77.476121,-96.247891 c 0,0 -5.419205,5.552354 -5.419205,16.111148 m 5.419205,16.044574 c 0,0 -5.419205,-5.552354 -5.419205,-16.111149"
+         id="path14351" />
+      <path
+         style="fill:#8a0ae8;fill-opacity:1;fill-rule:evenodd;stroke:#8a0ae8;stroke-width:8.48192120000000038;stroke-linecap:round;stroke-opacity:1;"
+         inkscape:connector-curvature="0"
+         d="m 59.554132,-112.33241 c 0,0 -10.851724,11.11802 -10.851724,32.235612 m 10.851724,32.089148 c 0,0 -10.851724,-11.104709 -10.851724,-32.222298"
+         id="path14353" />
+      <path
+         style="fill:#8a0ae8;fill-opacity:1;fill-rule:evenodd;stroke:#8a0ae8;stroke-width:8.48192120000000038;stroke-linecap:round;stroke-opacity:1;"
+         inkscape:connector-curvature="0"
+         d="m 39.381908,-128.40361 c 0,0 -16.257613,16.65706 -16.257613,48.333442 m 16.257613,48.147037 c 0,0 -16.257613,-16.670379 -16.257613,-48.346762"
+         id="path14355" />
+    </g>
+  </g>
+</svg>
diff --git a/icon/creating-linux-icons b/icon/creating-linux-icons
new file mode 100644 (file)
index 0000000..5b034c0
--- /dev/null
@@ -0,0 +1,29 @@
+# To create linux icons and file associations
+
+1) Create mime type and install
+
+       http://www.freedesktop.org/wiki/Specifications/AddingMIMETutor/
+
+       # xdg-mime install --mode system org-altusmetrum-mimetypes.xml
+       # update-mime-database /usr/local/share/mime
+
+       On debian, 
+
+2) Create icons and install
+
+       For mime type   application/vnd.altusmetrum.telemetry
+       icon name       application-vnd.altusmetrum.telemetry.svg
+
+       All mime icons go in
+
+       /usr/share/icons/hicolor/scalable/mimetypes
+
+       Update the icon database
+
+       # update-icon-caches /usr/share/icons/hicolor
+
+3) Create .desktop file and install
+
+       # xdg-desktop-menu install --mode system altusmetrum-altosui.desktop
+
+       # update-desktop-database
diff --git a/icon/micropeak.svg b/icon/micropeak.svg
deleted file mode 100644 (file)
index d37130f..0000000
+++ /dev/null
@@ -1,219 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="49.03825"
-   height="43.606411"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.48.4 r9939"
-   sodipodi:docname="micropeak.svg">
-  <defs
-     id="defs4">
-    <linearGradient
-       id="linearGradient5343">
-      <stop
-         style="stop-color:#7200a4;stop-opacity:1;"
-         offset="0"
-         id="stop5345" />
-      <stop
-         style="stop-color:#da7000;stop-opacity:1;"
-         offset="1"
-         id="stop5347" />
-    </linearGradient>
-    <marker
-       inkscape:stockid="Arrow2Send"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Send"
-       style="overflow:visible">
-      <path
-         id="path3798"
-         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="matrix(-0.3,0,0,-0.3,0.69,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Send"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Send"
-       style="overflow:visible">
-      <path
-         id="path3780"
-         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
-         transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Mend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Mend"
-       style="overflow:visible">
-      <path
-         id="path3792"
-         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="scale(-0.6,-0.6)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow1Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow1Lend"
-       style="overflow:visible">
-      <path
-         id="path3768"
-         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
-         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
-         transform="matrix(-0.8,0,0,-0.8,-10,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <marker
-       inkscape:stockid="Arrow2Lend"
-       orient="auto"
-       refY="0"
-       refX="0"
-       id="Arrow2Lend"
-       style="overflow:visible">
-      <path
-         id="path3786"
-         style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
-         d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
-         transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
-         inkscape:connector-curvature="0" />
-    </marker>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient5343"
-       id="linearGradient5349"
-       x1="255.48561"
-       y1="275.90405"
-       x2="280.61411"
-       y2="275.90405"
-       gradientUnits="userSpaceOnUse" />
-    <filter
-       id="filter3027"
-       inkscape:label="Drop Shadow"
-       color-interpolation-filters="sRGB">
-      <feFlood
-         id="feFlood3029"
-         flood-opacity="0.604"
-         flood-color="rgb(0,0,0)"
-         result="flood" />
-      <feComposite
-         id="feComposite3031"
-         in2="SourceGraphic"
-         in="flood"
-         operator="in"
-         result="composite1" />
-      <feGaussianBlur
-         id="feGaussianBlur3033"
-         stdDeviation="1.6"
-         result="blur" />
-      <feOffset
-         id="feOffset3035"
-         dx="2"
-         dy="2"
-         result="offset" />
-      <feComposite
-         id="feComposite3037"
-         in2="offset"
-         in="SourceGraphic"
-         operator="over"
-         result="composite2" />
-    </filter>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="8.160856"
-     inkscape:cx="33.152671"
-     inkscape:cy="27.859227"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     inkscape:window-width="1277"
-     inkscape:window-height="894"
-     inkscape:window-x="543"
-     inkscape:window-y="242"
-     inkscape:window-maximized="0"
-     fit-margin-top="-3"
-     fit-margin-left="-4"
-     fit-margin-right="-1"
-     fit-margin-bottom="0" />
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-241.43522,-252.43073)">
-    <g
-       id="g3000"
-       style="filter:url(#filter3027)">
-      <g
-         id="text2985"
-         style="font-size:16px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#7200a4;fill-opacity:1;stroke:none;font-family:Minion Pro;-inkscape-font-specification:Minion Pro">
-        <path
-           inkscape:connector-curvature="0"
-           id="path3003"
-           style="font-size:36px;font-weight:500;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#7200a4;font-family:ITC Benguiat Gothic Std;-inkscape-font-specification:ITC Benguiat Gothic Std Medium"
-           d="m 257.20241,268.30647 c 0,-1.07999 -0.396,-1.872 -1.584,-1.872 -1.188,0 -1.584,0.79201 -1.584,1.872 l 0,8.676 c 0,2.88 -2.052,5.112 -4.824,5.112 -3.06,0 -4.104,-1.872 -4.104,-5.076 l 0,-8.712 c 0,-1.07999 -0.396,-1.872 -1.584,-1.872 -1.188,0 -1.584,0.79201 -1.584,1.872 l 0,21.924 c 0,1.08 0.396,1.872 1.584,1.872 1.188,0 1.584,-0.792 1.584,-1.872 l 0,-6.156 c 0.792,0.612 2.088,0.972 3.564,0.972 2.304,0 4.428,-0.792 5.652,-2.988 l 0.072,0.072 0,1.26 c 0,0.864 0.54,1.44 1.404,1.44 0.864,0 1.404,-0.576 1.404,-1.44 l 0,-15.084" />
-      </g>
-      <path
-         sodipodi:nodetypes="cssc"
-         inkscape:connector-curvature="0"
-         id="path2991"
-         d="m 256.93561,290.70327 c 3.04022,-0.24413 4.30317,-2.66932 5.38268,-5.56604 1.68059,-4.50963 3.67214,-15.86904 8.62227,-20.55527 4.0668,-3.85 8.22354,-3.46656 8.22354,-3.46656"
-         style="fill:none;stroke:url(#linearGradient5349);stroke-width:2.9000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:none" />
-      <path
-         inkscape:transform-center-y="-0.40889198"
-         inkscape:transform-center-x="-0.29194889"
-         d="m 282.7522,267.42614 -3.93403,-2.77705 -4.51792,1.66641 1.42544,-4.59964 -2.98096,-3.78185 4.815,-0.0657 2.67559,-4.00372 1.55039,4.55904 4.63457,1.30742 -3.85681,2.88333 z"
-         inkscape:randomized="0"
-         inkscape:rounded="0"
-         inkscape:flatsided="false"
-         sodipodi:arg2="1.7014539"
-         sodipodi:arg1="1.0731354"
-         sodipodi:r2="3.6257365"
-         sodipodi:r1="7.2514729"
-         sodipodi:cy="261.05426"
-         sodipodi:cx="279.29056"
-         sodipodi:sides="5"
-         id="path5341"
-         style="fill:none;stroke:#da7000;stroke-width:1.10000002;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-         sodipodi:type="star" />
-    </g>
-  </g>
-</svg>
diff --git a/icon/org-altusmetrum-mimetypes.xml b/icon/org-altusmetrum-mimetypes.xml
new file mode 100644 (file)
index 0000000..e8103c0
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<mime-info
+    xmlns="http://www.freedesktop.org/standards/shared-mime-info">
+  <mime-type type="application/vnd.altusmetrum.telemetry">
+    <comment>Altus Metrum Telemetry File</comment>
+    <glob pattern="*.telem"/>
+  </mime-type>
+  <mime-type type="application/vnd.altusmetrum.eeprom">
+    <comment>Altus Metrum Eeprom Log File</comment>
+    <glob pattern="*.eeprom"/>
+  </mime-type>
+  <mime-type type="application/vnd.altusmetrum.micropeak">
+    <comment>Altus Metrum MicroPeak Log File</comment>
+    <glob pattern="*.mpd"/>
+  </mime-type>
+</mime-info>
diff --git a/icon/telegps.svg b/icon/telegps.svg
deleted file mode 100644 (file)
index 1e390f3..0000000
+++ /dev/null
@@ -1,324 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="151.43401"
-   height="144.50209"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.48.4 r9939"
-   sodipodi:docname="telegps.svg">
-  <defs
-     id="defs4">
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3169"
-       id="radialGradient3175"
-       cx="951.68713"
-       cy="2305.2668"
-       fx="951.68713"
-       fy="2305.2668"
-       r="951.68701"
-       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       id="linearGradient3169">
-      <stop
-         style="stop-color:#ff8a00;stop-opacity:1;"
-         offset="0"
-         id="stop3171" />
-      <stop
-         id="stop3445"
-         offset="0.71698111"
-         style="stop-color:#c24573;stop-opacity:0.98039216;" />
-      <stop
-         style="stop-color:#8500e7;stop-opacity:0.96078432;"
-         offset="1"
-         id="stop3173" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3165"
-       id="radialGradient3171"
-       cx="951.68713"
-       cy="1205.2668"
-       fx="951.68713"
-       fy="1205.2668"
-       r="951.68701"
-       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       id="linearGradient3165">
-      <stop
-         style="stop-color:#000000;stop-opacity:1;"
-         offset="0"
-         id="stop3167" />
-      <stop
-         style="stop-color:#000000;stop-opacity:0;"
-         offset="1"
-         id="stop3169" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3169"
-       id="radialGradient2838"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
-       cx="951.68713"
-       cy="2305.2668"
-       fx="951.68713"
-       fy="2305.2668"
-       r="951.68701" />
-    <linearGradient
-       id="linearGradient3181">
-      <stop
-         style="stop-color:#ff8a00;stop-opacity:1;"
-         offset="0"
-         id="stop3183" />
-      <stop
-         id="stop3185"
-         offset="0.71698111"
-         style="stop-color:#c24573;stop-opacity:0.98039216;" />
-      <stop
-         style="stop-color:#8500e7;stop-opacity:0.96078432;"
-         offset="1"
-         id="stop3187" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3165"
-       id="radialGradient2840"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
-       cx="951.68713"
-       cy="1205.2668"
-       fx="951.68713"
-       fy="1205.2668"
-       r="951.68701" />
-    <linearGradient
-       id="linearGradient3190">
-      <stop
-         style="stop-color:#000000;stop-opacity:1;"
-         offset="0"
-         id="stop3192" />
-      <stop
-         style="stop-color:#000000;stop-opacity:0;"
-         offset="1"
-         id="stop3194" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3169"
-       id="radialGradient2830"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
-       cx="951.68713"
-       cy="2305.2668"
-       fx="951.68713"
-       fy="2305.2668"
-       r="951.68701" />
-    <linearGradient
-       id="linearGradient3197">
-      <stop
-         style="stop-color:#ff8a00;stop-opacity:1;"
-         offset="0"
-         id="stop3199" />
-      <stop
-         id="stop3201"
-         offset="0.71698111"
-         style="stop-color:#c24573;stop-opacity:0.98039216;" />
-      <stop
-         style="stop-color:#8500e7;stop-opacity:0.96078432;"
-         offset="1"
-         id="stop3203" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3165"
-       id="radialGradient2832"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
-       cx="951.68713"
-       cy="1205.2668"
-       fx="951.68713"
-       fy="1205.2668"
-       r="951.68701" />
-    <linearGradient
-       id="linearGradient3206">
-      <stop
-         style="stop-color:#000000;stop-opacity:1;"
-         offset="0"
-         id="stop3208" />
-      <stop
-         style="stop-color:#000000;stop-opacity:0;"
-         offset="1"
-         id="stop3210" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3169"
-       id="radialGradient2834"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
-       cx="951.68713"
-       cy="2305.2668"
-       fx="951.68713"
-       fy="2305.2668"
-       r="951.68701" />
-    <linearGradient
-       id="linearGradient3213">
-      <stop
-         style="stop-color:#ff8a00;stop-opacity:1;"
-         offset="0"
-         id="stop3215" />
-      <stop
-         id="stop3217"
-         offset="0.71698111"
-         style="stop-color:#c24573;stop-opacity:0.98039216;" />
-      <stop
-         style="stop-color:#8500e7;stop-opacity:0.96078432;"
-         offset="1"
-         id="stop3219" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3165"
-       id="radialGradient2836"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
-       cx="951.68713"
-       cy="1205.2668"
-       fx="951.68713"
-       fy="1205.2668"
-       r="951.68701" />
-    <linearGradient
-       id="linearGradient3222">
-      <stop
-         style="stop-color:#000000;stop-opacity:1;"
-         offset="0"
-         id="stop3224" />
-      <stop
-         style="stop-color:#000000;stop-opacity:0;"
-         offset="1"
-         id="stop3226" />
-    </linearGradient>
-    <radialGradient
-       r="951.68701"
-       fy="2305.2668"
-       fx="951.68713"
-       cy="2305.2668"
-       cx="951.68713"
-       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
-       gradientUnits="userSpaceOnUse"
-       id="radialGradient3232"
-       xlink:href="#linearGradient3169"
-       inkscape:collect="always" />
-    <radialGradient
-       r="951.68701"
-       fy="1205.2668"
-       fx="951.68713"
-       cy="1205.2668"
-       cx="951.68713"
-       gradientTransform="matrix(1,0,0,1.2664529,0,-321.14689)"
-       gradientUnits="userSpaceOnUse"
-       id="radialGradient3234"
-       xlink:href="#linearGradient3165"
-       inkscape:collect="always" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3169"
-       id="radialGradient4101"
-       cx="194.54575"
-       cy="361.16367"
-       fx="194.54575"
-       fy="361.16367"
-       r="70.597672"
-       gradientTransform="matrix(1,0,0,0.95908583,137.14286,74.776711)"
-       gradientUnits="userSpaceOnUse" />
-    <filter
-       id="filter3238"
-       inkscape:label="Drop Shadow"
-       color-interpolation-filters="sRGB">
-      <feFlood
-         id="feFlood3240"
-         flood-opacity="0.604"
-         flood-color="rgb(0,0,0)"
-         result="flood" />
-      <feComposite
-         id="feComposite3242"
-         in2="SourceGraphic"
-         in="flood"
-         operator="in"
-         result="composite1" />
-      <feGaussianBlur
-         id="feGaussianBlur3244"
-         stdDeviation="4"
-         result="blur" />
-      <feOffset
-         id="feOffset3246"
-         dx="5"
-         dy="5"
-         result="offset" />
-      <feComposite
-         id="feComposite3248"
-         in2="offset"
-         in="SourceGraphic"
-         operator="over"
-         result="composite2" />
-    </filter>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="3.959798"
-     inkscape:cx="91.754359"
-     inkscape:cy="68.172898"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     fit-margin-top="-12"
-     fit-margin-left="-12"
-     fit-margin-right="-6"
-     fit-margin-bottom="-6"
-     inkscape:window-width="996"
-     inkscape:window-height="970"
-     inkscape:window-x="930"
-     inkscape:window-y="553"
-     inkscape:window-maximized="0" />
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(-258.97144,-351.91262)">
-    <path
-       style="fill:url(#radialGradient4101);fill-opacity:1;filter:url(#filter3238)"
-       d="m 261.09094,466.61035 1.9122,-1.69399 39.0721,-36.4688 20.74158,22.05252 -40.71991,38.37279 z m 36.24983,1.34654 -14.08636,-15.38433 -15.33887,14.40857 14.50759,15.23741 z m 18.98704,-17.58715 -14.47613,-15.53942 -14.95191,14.42099 14.19976,15.37575 z m 43.2565,3.24033 -5.69326,-6.00917 -2.76929,1.85727 c -5.01515,3.36349 -10.61773,4.75193 -13.55344,3.35884 -0.90785,-0.4308 -11.20677,-10.85557 -16.46128,-16.61505 -6.3177,-6.92484 -17.77225,-18.68338 -18.08204,-21.53696 l -0.25491,-2.34789 -6.68224,-3.00173 -6.68224,-3.00173 -0.12416,-2.54849 c -0.24316,-4.99109 2.61694,-11.66135 7.10652,-16.57368 6.51922,-7.13306 14.23173,-10.81215 21.4071,-10.21178 l 2.49577,0.20881 2.34108,7.3087 2.34109,7.3087 2.0542,0.21626 c 1.12981,0.11895 2.29245,0.36702 2.58364,0.55127 0.29119,0.18424 11.17756,11.55849 16.63562,17.46044 5.67391,6.13537 16.35301,17.71615 16.74619,18.65715 1.36492,3.26672 -0.56522,9.34479 -4.44838,14.00803 -0.92939,1.1161 -1.6875,2.14976 -1.6847,2.29703 0.003,0.14726 2.44601,2.88431 5.42933,6.08233 2.98332,3.19801 5.42421,6.02814 5.42421,6.28919 0,0.66794 -0.91528,1.72591 -1.73982,2.01104 -0.50334,0.17406 -2.27007,-1.42112 -6.38899,-5.76858 z m -13.8944,-6.52384 c 0.96195,-0.49074 2.46683,-1.3673 3.34417,-1.94791 l 1.59519,-1.05564 -1.69025,-1.72225 c -1.71532,-1.74777 -2.09589,-2.99732 -1.1891,-3.90412 0.98407,-0.98406 2.33559,-0.53387 3.9423,1.31314 l 1.57825,1.81431 1.43638,-1.7099 c 1.7115,-2.03742 3.3933,-5.47555 3.39008,-6.9304 -0.0104,-4.68327 -7.01613,-2.68794 -13.36898,3.80766 -4.26282,4.35861 -6.32786,9.57528 -4.26584,10.77629 1.19252,0.69458 3.36009,0.51166 5.2278,-0.44118 z m -37.53066,-44.39022 c 2.23934,-2.70633 7.29399,-6.99375 10.13666,-8.59806 1.69887,-0.95877 2.21231,-1.46174 2.04152,-1.99985 -0.1255,-0.3954 -1.05734,-3.0661 -2.07077,-5.93487 l -1.84259,-5.21596 -1.60649,0.12825 c -4.1301,0.32972 -9.06228,2.86043 -13.29918,6.82384 -4.03277,3.77245 -7.7843,10.20829 -7.89014,13.53572 l -0.0463,1.4539 5.4085,2.47197 5.4085,2.47197 1.02919,-1.54008 c 0.56606,-0.84704 1.79503,-2.46562 2.73105,-3.59683 z m 32.91039,-10.47213 40.55794,-38.76942 c 7.09795,7.71166 14.5366,15.63755 20.65837,22.2503 l -40.53088,38.2414 z m 35.73645,1.02093 -14.2595,-15.3791 -15.29495,14.35785 14.65467,15.14661 z m 18.6801,-17.55816 -14.10162,-15.40128 -15.32812,14.3973 14.52992,15.24342 z"
-       id="path3063"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccccccccccscssascccssscccscasscsssssccssscssssscssscssccccsccccccccccccccccc" />
-  </g>
-</svg>
diff --git a/icon/windows-stub.c b/icon/windows-stub.c
new file mode 100644 (file)
index 0000000..8df3e0a
--- /dev/null
@@ -0,0 +1,2 @@
+__stdcall
+WinMain(int a, int b, int c, int d) { return 0; }
index f9a61359672ef4d4ce7f1730d8afe76e8a693893..81dd0749e57a7b0b00a114c893f9e0412c0c6cf4 100644 (file)
@@ -11,7 +11,7 @@ micropeak-windows.nsi
 MicroPeak-Linux-*
 MicroPeak-Mac-*
 MicroPeak-Windows-*
-micropeak.desktop
+altusmetrum-micropeak.desktop
 *.dll
 *.dylib
 *.so
index 40984c5aa7b887d2aa17c1eee695d719a644a37e..b1dc6cea439768d733c02baa9246a83e58ad043d 100644 (file)
        <key>CFBundleInfoDictionaryVersion</key>
        <string>6.0</string>
        <key>CFBundleIconFile</key>
-       <string>MicroPeak.icns</string>
+       <string>altusmetrum-micropeak.icns</string>
+       <key>CFBundleDocumentTypes</key>
+       <array>
+         <dict>
+           <key>CFBundleTypeName</key>
+           <string>MicroPeak data file</string>
+           <key>CFBundleTypeIconFile</key>
+           <string>application-vnd.altusmetrum.micropeak.icns</string>
+           <key>CFBundleTypeExtensions</key>
+           <array>
+             <string>mpd</string>
+           </array>
+           <key>CFBundleTypeRole</key>
+           <string>Editor</string>
+         </dict>
+       </array>
        <key>Java</key>
        <dict>
                <key>MainClass</key>
index 216874dfb362c5fe0d518a85fd191bfaacdd991f..6270fd746b3a41ab261a413250402720e39c97c8 100644 (file)
@@ -56,26 +56,34 @@ ALTOSUILIB_CLASS=\
 ICONDIR=$(top_srcdir)/icon
 
 JAVA_ICONS=\
-       $(ICONDIR)/micropeak-16.png \
-       $(ICONDIR)/micropeak-32.png \
-       $(ICONDIR)/micropeak-48.png \
-       $(ICONDIR)/micropeak-64.png \
-       $(ICONDIR)/micropeak-128.png \
-       $(ICONDIR)/micropeak-256.png
+       $(ICONDIR)/altusmetrum-micropeak-16.png \
+       $(ICONDIR)/altusmetrum-micropeak-32.png \
+       $(ICONDIR)/altusmetrum-micropeak-48.png \
+       $(ICONDIR)/altusmetrum-micropeak-64.png \
+       $(ICONDIR)/altusmetrum-micropeak-128.png\
+       $(ICONDIR)/altusmetrum-micropeak-256.png
 
 # icon base names for jar
-ICONJAR= -C $(ICONDIR) micropeak-16.png \
-       -C $(ICONDIR) micropeak-32.png \
-       -C $(ICONDIR) micropeak-48.png \
-       -C $(ICONDIR) micropeak-64.png \
-       -C $(ICONDIR) micropeak-128.png \
-       -C $(ICONDIR) micropeak-256.png
-
-WINDOWS_ICON=$(ICONDIR)/micro-peak.ico
-MACOSX_ICON=$(ICONDIR)/MicroPeak.icns
+ICONJAR= \
+       -C $(ICONDIR) altusmetrum-micropeak-16.png \
+       -C $(ICONDIR) altusmetrum-micropeak-32.png \
+       -C $(ICONDIR) altusmetrum-micropeak-48.png \
+       -C $(ICONDIR) altusmetrum-micropeak-64.png \
+       -C $(ICONDIR) altusmetrum-micropeak-128.png\
+       -C $(ICONDIR) altusmetrum-micropeak-256.png
+
+WINDOWS_ICONS  =\
+       ../icon/altusmetrum-micropeak.ico \
+       ../icon/altusmetrum-micropeak.exe
+       ../icon/application-vnd.altusmetrum.micropeak.ico \
+       ../icon/application-vnd.altusmetrum.micropeak.ico
+
+MACOSX_ICONS   =\
+       ../icon/altusmetrum-micropeak.icns \
+       ../icon/application-vnd.altusmetrum.micropeak.icns
 
 desktopdir = $(datadir)/applications
-desktop_file = micropeak.desktop
+desktop_file = altusmetrum-micropeak.desktop
 desktop_SCRIPTS = $(desktop_file)
 
 all-local: micropeak-test micropeak-jdb $(JAR)
@@ -92,7 +100,7 @@ clean-local:
 EXTRA_DIST = $(desktop_file).in
 
 $(desktop_file): $(desktop_file).in
-       sed -e 's#%bindir%#@bindir@#' -e 's#%icondir%#$(datadir)/icons/hicolor/scalable/apps#' ${srcdir}/micropeak.desktop.in > $@
+       sed -e 's#%bindir%#@bindir@#' -e 's#%icondir%#$(datadir)/icons/hicolor/scalable/apps#' ${srcdir}/$(desktop_file).in > $@
        chmod +x $@
 
 LINUX_DIST=MicroPeak-Linux-$(VERSION).tar.bz2
@@ -106,14 +114,14 @@ DOC=$(MICROPEAK_DOC)
 
 FAT_FILES=$(FATJAR) $(ALTOSLIB_CLASS) $(ALTOSUILIB_CLASS) $(FREETTS_CLASS) $(JFREECHART_CLASS) $(JCOMMON_CLASS)
 
-LINUX_FILES=$(FAT_FILES) libaltos.so $(FIRMWARE) $(DOC) micropeak.desktop.in ../icon/micropeak.svg
-LINUX_EXTRA=micropeak-fat micropeak.desktop.in
+LINUX_FILES=$(FAT_FILES) libaltos.so $(FIRMWARE) $(DOC) $(desktop_file).in ../icon/altusmetrum-micropeak.svg
+LINUX_EXTRA=micropeak-fat $(desktop_file).in
 
 MACOSX_DRIVER_URL=http://www.ftdichip.com/Drivers/VCP/MacOSX/FTDIUSBSerialDriver_v2_2_18.dmg
 MACOSX_DRIVER=FTDIUSBSerialDriver_v2_2_18.dmg
 MACOSX_INFO_PLIST=Info.plist
 MACOSX_README=ReadMe-Mac.rtf
-MACOSX_FILES=$(FAT_FILES) libaltos.dylib $(MACOSX_INFO_PLIST) $(MACOSX_DRIVER) $(MACOSX_README) $(DOC) $(MACOSX_ICON)
+MACOSX_FILES=$(FAT_FILES) libaltos.dylib $(MACOSX_INFO_PLIST) $(MACOSX_DRIVER) $(MACOSX_README) $(DOC) $(MACOSX_ICONS)
 
 $(MACOSX_DRIVER):
        wget $(MACOSX_DRIVER_URL)
@@ -124,7 +132,7 @@ WINDOWS_DRIVER=CDM20824_Setup.exe
 $(WINDOWS_DRIVER):
        wget $(WINDOWS_DRIVER_URL)
 
-WINDOWS_FILES=$(FAT_FILES) altos.dll altos64.dll $(DOC) $(WINDOWS_ICON) $(WINDOWS_DRIVER)
+WINDOWS_FILES=$(FAT_FILES) altos.dll altos64.dll $(DOC) $(WINDOWS_ICONS) $(WINDOWS_DRIVER)
 
 if FATINSTALL
 
@@ -261,7 +269,7 @@ $(MACOSX_DIST): $(MACOSX_FILES)
        cp -p Info.plist macosx/MicroPeak.app/Contents
        cp -p $(MACOSX_DRIVER) macosx
        mkdir -p macosx/MicroPeak.app/Contents/Resources/Java
-       cp -p $(MACOSX_ICON) macosx/MicroPeak.app/Contents/Resources
+       cp -p $(MACOSX_ICONS) macosx/MicroPeak.app/Contents/Resources
        cp -p $(FATJAR) macosx/MicroPeak.app/Contents/Resources/Java/micropeak.jar
        cp -p libaltos.dylib macosx/MicroPeak.app/Contents/Resources/Java
        cp -p $(ALTOSLIB_CLASS) macosx/MicroPeak.app/Contents/Resources/Java
@@ -272,7 +280,7 @@ $(MACOSX_DIST): $(MACOSX_FILES)
 
 $(WINDOWS_DIST): $(WINDOWS_FILES) micropeak-windows.nsi
        -rm -f $@
-       makensis -Omicropeak-windows.log "-XOutFile $@" "-DVERSION=$(VERSION)" micropeak-windows.nsi
+       makensis -Omicropeak-windows.log "-XOutFile $@" "-DVERSION=$(VERSION)" micropeak-windows.nsi || (cat micropeak-windows.log && exit 1)
 
 Manifest.txt: Makefile
        echo 'Main-Class: org.altusmetrum.micropeak.MicroPeak' > $@
index ca211f16ee33553edfc102a71741582d817ee226..6c9447aa6d9ee79cf2ae24ec2e530050a282031d 100644 (file)
@@ -20,8 +20,8 @@ package org.altusmetrum.micropeak;
 import java.lang.*;
 import java.io.*;
 import java.util.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 class MicroIterator implements Iterator<MicroDataPoint> {
        int             i;
index 5a5e8c372c2d6788cad7be180e784ab0f984fd50..849ae5365abca7cedcda0b5c41c58ef4603a7da6 100644 (file)
@@ -17,7 +17,7 @@
 
 package org.altusmetrum.micropeak;
 
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class MicroDataPoint implements AltosUIDataPoint {
        public double           time;
index 305421a7b377ac45f2833ba11216baf1c3f95db9..304eac7df05318e4c6c3cb68b7a19c43f907020a 100644 (file)
@@ -21,7 +21,7 @@ import javax.swing.*;
 import java.awt.*;
 import java.awt.event.*;
 import java.util.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class MicroDeviceDialog extends AltosDeviceDialog {
 
index 1c70e1d1515da21cc94aa9bc951ea9cc123cde94..32dd04508d20e50c0e8cbdc1d7c02eb3b47d29c4 100644 (file)
@@ -23,8 +23,8 @@ import javax.swing.*;
 import java.io.*;
 import java.util.concurrent.*;
 import java.util.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class MicroDownload extends AltosUIDialog implements Runnable, ActionListener, MicroSerialLog, WindowListener {
        MicroPeak       owner;
index 87d5499b70417d5e91c6cc906a856f3705698250..8d62ace680d3c4899ae6e277437b49f134b08af3 100644 (file)
@@ -23,8 +23,8 @@ import java.util.ArrayList;
 import java.awt.*;
 import javax.swing.*;
 import javax.swing.filechooser.FileNameExtensionFilter;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class MicroExport extends JFileChooser {
 
index 019346aef29637baaafec278776bfc3a8aa55f84..d6abfcb717869ee3ec7421f4b37aab24fc4d421d 100644 (file)
@@ -19,8 +19,8 @@ package org.altusmetrum.micropeak;
 
 import java.io.*;
 import java.util.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class MicroFile {
 
index 00b6690a37858de5f231315a906667375666c2ac..371c22d0eb9a9a68a0d4e18eedb9faf99181b8b6 100644 (file)
@@ -20,8 +20,8 @@ package org.altusmetrum.micropeak;
 import javax.swing.*;
 import javax.swing.filechooser.FileNameExtensionFilter;
 import java.io.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class MicroFileChooser extends JFileChooser {
        JFrame  frame;
index 5bfe5bf7bd18e30851b01153568909bfeced6231..f82d1c5e9c739b361608369844e6f9321bd5f632 100644 (file)
@@ -21,7 +21,7 @@ import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
 import java.util.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class MicroFrame extends AltosUIFrame {
        static String[] micro_icon_names = {
index f99689197ffa649ba95f70395965eddad149b8f0..811b1e7c14984c6511e46611285371f9c6a4538a 100644 (file)
@@ -22,8 +22,8 @@ import java.util.ArrayList;
 
 import java.awt.*;
 import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 import org.jfree.ui.*;
 import org.jfree.chart.*;
diff --git a/micropeak/MicroPeak.app/Contents/Resources/MicroPeak.icns b/micropeak/MicroPeak.app/Contents/Resources/MicroPeak.icns
deleted file mode 100644 (file)
index 9ba83bf..0000000
Binary files a/micropeak/MicroPeak.app/Contents/Resources/MicroPeak.icns and /dev/null differ
index 19e91660d6226017cddef42640a748108d2e60e4..8bdf4b775fc0d08b457348053e775267f777a984 100644 (file)
@@ -23,8 +23,8 @@ import javax.swing.*;
 import java.io.*;
 import java.util.concurrent.*;
 import java.util.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class MicroPeak extends MicroFrame implements ActionListener, ItemListener {
 
@@ -190,10 +190,25 @@ public class MicroPeak extends MicroFrame implements ActionListener, ItemListene
        public void itemStateChanged(ItemEvent e) {
        }
 
+       /* OSXAdapter interfaces */
+       public void macosx_file_handler(String path) {
+               CommandGraph(new File(path));
+       }
+
+       public void macosx_quit_handler() {
+               System.exit(0);
+       }
+
+       public void macosx_preferences_handler() {
+               Preferences();
+       }
+
        public MicroPeak() {
 
                ++number_of_windows;
 
+               register_for_macosx_events();
+
                AltosUIPreferences.set_component(this);
 
                container = getContentPane();
index 26d62012982f097df604e45a93a0249edc0f402d..7a225dcbcc39933c7e557a292516753548889a9c 100644 (file)
@@ -20,8 +20,8 @@ package org.altusmetrum.micropeak;
 import java.awt.*;
 import java.io.*;
 import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class MicroRaw extends JTextArea {
 
index 7c5d6abe99dcfb093d848d7e266237fe90126707..9497fb33544c8a02c38292c808431e1180074a1e 100644 (file)
@@ -24,8 +24,8 @@ import javax.swing.filechooser.FileNameExtensionFilter;
 import java.io.*;
 import java.util.concurrent.*;
 import java.util.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class MicroSave extends JFileChooser {
 
index 37b68636b73dd639d3e57445b6e4bf6b6fcd5859..f5108c22dee8e5a9a53903b288754d06e426d502 100644 (file)
@@ -20,7 +20,7 @@ package org.altusmetrum.micropeak;
 import java.util.*;
 import java.io.*;
 import libaltosJNI.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class MicroSerial extends InputStream {
        SWIGTYPE_p_altos_file   file;
index 7300f06d33856e8b47a3d43528303a837c29bb96..c49b69ab8130f2b87e58e3cb608c60f3dc58acc3 100644 (file)
@@ -20,7 +20,7 @@ package org.altusmetrum.micropeak;
 import java.util.*;
 import java.io.*;
 import libaltosJNI.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public interface MicroSerialLog {
 
index 45c9f225131b5babf3212622a7d85e4d20984e53..3fc05bd6cc85aa2c5c388627dfd779afdca021fb 100644 (file)
@@ -18,8 +18,8 @@
 package org.altusmetrum.micropeak;
 
 import java.io.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class MicroStats {
        double          coast_height;
index 3b17e731fff1112e1ff093b21e5d0df0d4a946eb..d6265fe8c70a7873361e8d8fcf29bfc7de9eece6 100644 (file)
@@ -19,8 +19,8 @@ package org.altusmetrum.micropeak;
 
 import java.awt.*;
 import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class MicroStatsTable extends JComponent implements AltosFontListener {
        GridBagLayout   layout;
index 437fa0bcde45c54374d2591814d0fca144b47460..24f6722b79a9b69d9e47a2d6ebe9fe210fd17395 100644 (file)
@@ -19,7 +19,7 @@ package org.altusmetrum.micropeak;
 
 import java.util.*;
 import libaltosJNI.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class MicroUSB extends altos_device implements AltosDevice {
 
diff --git a/micropeak/altusmetrum-micropeak.desktop.in b/micropeak/altusmetrum-micropeak.desktop.in
new file mode 100644 (file)
index 0000000..782b470
--- /dev/null
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Type=Application
+Name=MicroPeak
+GenericName=MicroPeak Download and Analysis
+Comment=View and log data from MicroPeak altimeters
+Icon=%icondir%/altusmetrum-micropeak.svg
+Exec=%bindir%/micropeak %f
+Terminal=false
+MimeType=application/vnd.altusmetrum.micropeak
+Categories=Education;Electronics;Science;
index 6dc9d8c15ebedd739ed59cd6a7e4359f62c69cd6..848523b03d79fc34d6b9f5e58a0c202be43235c5 100644 (file)
@@ -1,19 +1,24 @@
-!addplugindir Instdrv/NSIS/Plugins
+!addplugindir ../altosui/Instdrv/NSIS/Plugins
+!addincludedir ../altosui/Instdrv/NSIS/Includes
 !include x64.nsh
-; Definitions for Java 1.7 Detection
-!define JRE_VERSION "1.7"
-!define JRE_ALTERNATE "1.6"
-!define JRE32_URL "http://javadl.sun.com/webapps/download/AutoDL?BundleId=83383&/jre-7u51-windows-i586.exe"
-!define JRE64_URL "http://javadl.sun.com/webapps/download/AutoDL?BundleId=83385&/jre-7u51-windows-x64.exe"
-!define PRODUCT_NAME "Altus Metrum Windows Software"
+!include java.nsh
+!include refresh-sh.nsh
 
-Name "Altus Metrum MicroPeak Installer"
+!define REG_NAME       "MicroPeak"
+!define PROG_ID                "org.altusmetrum.micropeak.1"
+!define PROG_ID_MPD    "org.altusmetrum.micropeak.mpd.1"
+!define FAT_NAME       "micropeak-fat.jar"
+!define WIN_APP_ICON   "altusmetrum-micropeak.ico"
+!define WIN_APP_EXE    "altusmetrum-micropeak.exe"
+!define WIN_MPD_EXE    "application-vnd.altusmetrum.micropeak.exe"
+
+Name "${REG_NAME} Installer"
 
 ; Default install directory
 InstallDir "$PROGRAMFILES\AltusMetrum"
 
 ; Tell the installer where to re-install a new version
-InstallDirRegKey HKLM "Software\AltusMetrum" "Install_Dir"
+InstallDirRegKey HKLM "Software\${REG_NAME}" "Install_Dir"
 
 LicenseText "GNU General Public License Version 2"
 LicenseData "../COPYING"
@@ -23,7 +28,7 @@ RequestExecutionLevel admin
 
 ShowInstDetails Show
 
-ComponentText "Altus Metrum MicroPeak Software Installer"
+ComponentText "${REG_NAME} Software and Driver Installer"
 
 Function .onInit
        DetailPrint "Checking host operating system"
@@ -35,42 +40,14 @@ Function .onInit
        ${EndIf}
 FunctionEnd
 
-Var JavaDownload
-Var JavaBits
-
-Function GetJRE
+Function un.onInit
+       DetailPrint "Checking host operating system"
        ${If} ${RunningX64}
-          StrCpy $JavaDownload ${JRE64_URL}
-          StrCpy $JavaBits "64"
-       ${Else}
-          StrCpy $JavaDownload ${JRE32_URL}
-          StrCpy $JavaBits "32"
+               DetailPrint "Installer running on 64-bit host"
+               SetRegView 64
+               StrCpy $INSTDIR "$PROGRAMFILES64\AltusMetrum"
+               ${DisableX64FSRedirection}
        ${EndIf}
-
-        MessageBox MB_OK "${PRODUCT_NAME} uses Java ${JRE_VERSION}, \
-                       $JavaBits bits, it will now \
-                        be downloaded and installed"
-
-        StrCpy $2 "$TEMP\Java Runtime Environment.exe"
-        nsisdl::download /TIMEOUT=30000 $JavaDownload $2
-        Pop $R0 ;Get the return value
-                StrCmp $R0 "success" +3
-                MessageBox MB_OK "Download failed: $R0"
-                Quit
-        ExecWait $2
-        Delete $2
-FunctionEnd
-
-Function DetectJRE
-  ReadRegStr $2 HKLM "SOFTWARE\JavaSoft\Java Runtime Environment" \
-             "CurrentVersion"
-  StrCmp $2 ${JRE_VERSION} done
-
-  StrCmp $2 ${JRE_ALTERNATE} done
-
-  Call GetJRE
-
-  done:
 FunctionEnd
 
 ; Pages to present
@@ -85,12 +62,21 @@ UninstPage instfiles
 
 ; And the stuff to install
 
-Section "MicroPeak Application"
+Section "FTDI USB Driver"
+       SetOutPath $INSTDIR
+
+       File "CDM20824_Setup.exe"
+
+       StrCpy $2 "$INSTDIR\CDM20824_Setup.exe"
+       ExecWait $2
+SectionEnd
+
+Section "${REG_NAME} Application"
        Call DetectJRE
 
        SetOutPath $INSTDIR
 
-       File "micropeak-fat.jar"
+       File "${FAT_NAME}"
        File "altoslib_@ALTOSLIB_VERSION@.jar"
        File "altosuilib_@ALTOSUILIB_VERSION@.jar"
        File "jfreechart.jar"
@@ -98,22 +84,13 @@ Section "MicroPeak Application"
 
        File "*.dll"
 
-       File "../icon/*.ico"
+       File "../icon/${WIN_APP_ICON}"
 
-       CreateShortCut "$SMPROGRAMS\MicroPeak.lnk" "$SYSDIR\javaw.exe" "-jar micropeak-fat.jar" "$INSTDIR\micro-peak.ico"
+       CreateShortCut "$SMPROGRAMS\${REG_NAME}.lnk" "$SYSDIR\javaw.exe" "-jar ${FAT_NAME}" "$INSTDIR\${WIN_APP_ICON}"
 SectionEnd
 
-Section "FTDI USB Driver"
-       SetOutPath $INSTDIR
-
-       File "CDM20824_Setup.exe"
-
-       StrCpy $2 "$INSTDIR\CDM20824_Setup.exe"
-       ExecWait $2
-SectionEnd
-
-Section "MicroPeak Desktop Shortcut"
-       CreateShortCut "$DESKTOP\MicroPeak.lnk" "$INSTDIR\micropeak-fat.jar"  "" "$INSTDIR\micro-peak.ico"
+Section "${REG_NAME} Desktop Shortcut"
+       CreateShortCut "$DESKTOP\${REG_NAME}.lnk" "$INSTDIR\${FAT_NAME}"  "" "$INSTDIR\${WIN_APP_ICON}"
 SectionEnd
 
 Section "Documentation"
@@ -123,33 +100,79 @@ Section "Documentation"
        File "../doc/micropeak.pdf"
 SectionEnd
 
+Section "File Associations"
+
+       SetOutPath $INSTDIR
+
+       File "../icon/${WIN_APP_EXE}"
+       File "../icon/${WIN_MPD_EXE}"
+
+       ; application elements
+       
+       DeleteRegKey HKCR "${PROG_ID}"
+       DeleteRegKey HKCR "${PROG_ID_MPD}"
+
+       WriteRegStr HKCR "${PROG_ID_MPD}"               ""                              "MicroPeak Data File"
+       WriteRegStr HKCR "${PROG_ID_MPD}"               "FriendlyTypeName"              "MicroPeak Data File"
+       WriteRegStr HKCR "${PROG_ID_MPD}\CurVer"        ""                              "${PROG_ID_MPD}"
+       WriteRegStr HKCR "${PROG_ID_MPD}\DefaultIcon"   ""                              '"$INSTDIR\${WIN_MPD_EXE}",-101'
+  WriteRegExpandStr HKCR "${PROG_ID_MPD}\shell\play\command" ""                                '"%SYSTEMROOT%\System32\javaw.exe" -Djava.library.path="$INSTDIR" -jar "$INSTDIR\${FAT_NAME}" "%1"'
+
+       ; .mpd elements
+
+       WriteRegStr HKCR ".mpd"                         ""                              "${PROG_ID_MPD}"
+       WriteRegStr HKCR ".mpd"                         "PerceivedType"                 "MicroPeak Data File"
+       WriteRegStr HKCR ".mpd"                         "Content Type"                  "application/vnd.altusmetrum.micropeak"
+
+       WriteRegStr HKCR ".mpd\OpenWithProgids"         "${PROG_ID_MPD}"                        ""
+       WriteRegStr HKCR ".mpd\${PROG_ID_MPD}"          ""                              "${REG_NAME}"
+
+       Call RefreshShellIcons
+SectionEnd
+       
 Section "Uninstaller"
 
        ; Deal with the uninstaller
 
+       ${DisableX64FSRedirection}
        SetOutPath $INSTDIR
 
        ; Write the install path to the registry
-       WriteRegStr HKLM SOFTWARE\AltusMetrum "Install_Dir" "$INSTDIR"
+       WriteRegStr HKLM "SOFTWARE\${REG_NAME}" "Install_Dir" "$INSTDIR"
 
        ; Write the uninstall keys for windows
-       WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\AltusMetrum" "DisplayName" "Altus Metrum"
-       WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\AltusMetrum" "UninstallString" '"$INSTDIR\uninstall.exe"'
-       WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\AltusMetrum" "NoModify" "1"
-       WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\AltusMetrum" "NoRepair" "1"
+       WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${REG_NAME}" "DisplayName" "${REG_NAME}"
+       WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${REG_NAME}" "UninstallString" '"$INSTDIR\uninstall-${REG_NAME}.exe"'
+       WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${REG_NAME}" "NoModify" "1"
+       WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${REG_NAME}" "NoRepair" "1"
 
-       WriteUninstaller "uninstall.exe"
+       WriteUninstaller "uninstall-${REG_NAME}.exe"
 SectionEnd
 
 Section "Uninstall"
-       DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\AltusMetrum"
-       DeleteRegKey HKLM "Software\AltusMetrum"
 
-       Delete "$INSTDIR\*.*"
-       RMDir "$INSTDIR"
+       ${DisableX64FSRedirection}
+
+       DeleteRegKey   HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${REG_NAME}"
+       DeleteRegKey   HKLM "SOFTWARE\${REG_NAME}"
+
+       DetailPrint "Delete uninstall reg entries"
+
+       DeleteRegKey   HKCR "${PROG_ID}"
+       DeleteRegKey   HKCR "${PROG_ID_MPD}"
+
+       DeleteRegKey   HKCR ".mpd\${PROG_ID_MPD}"
+       DeleteRegValue HKCR ".mpd\OpenWithProgids" "${PROG_ID_MPD}"
+
+       Delete "$INSTDIR\${FAT_NAME}"
+       Delete "$INSTDIR\uninstall-${REG_NAME}.exe"
+
+       Delete "$INSTDIR\${WIN_APP_ICON}"
+       Delete "$INSTDIR\${WIN_APP_EXE}"
 
        ; Remove shortcuts, if any
-       Delete "$SMPROGRAMS\MicroPeak.lnk"
-       Delete "$DESKTOP\MicroPeak.lnk"
+       Delete "$SMPROGRAMS\${REG_NAME}.lnk"
+       Delete "$DESKTOP\${REG_NAME}.lnk"
        
+       Call un.RefreshShellIcons
 SectionEnd
diff --git a/micropeak/micropeak.desktop.in b/micropeak/micropeak.desktop.in
deleted file mode 100644 (file)
index abdf286..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-[Desktop Entry]
-Type=Application
-Name=MicroPeak
-GenericName=MicroPeak download and analysis
-Comment=View and log data from MicroPeak altimeters
-Icon=%icondir%/micropeak.svg
-Exec=%bindir%/micropeak %f
-Terminal=false
-MimeType=text/plain;
-Categories=Education;Electronics;Science;
index 177c5079cfa2959d33423a729638557c8d4a91d4..240609c43f372dea6494b40a5f9e64ad99424a67 100644 (file)
@@ -2,19 +2,25 @@ Notes on getting a signing key for driver signing
 
 http://technet.microsoft.com/en-us/library/dd919238%28v=ws.10%29.aspx
 
-# use MMC to add the certificates snap-in for ComputerAccount on Local computer
+Start MMC as administrator (start a console as administrator, launch
+mmc from there).
 
-Run console as Administrator:
+Use MMC to add the certificates snap-in for ComputerAccount on Local computer
 
-makecert -r -n "CN=AltusMetrum" -ss AltusMetrumCertStore -sr LocalMachine
+Create a key store for our keys called AltusMetrumCertStore
+
+Add our key from ~/altusmetrumllc/altusmetrum-key.p12
+
+# Our cert is now called "Altus Metrum, LLC"
+
+Create a new directory with a simple path. Copy altusmetrum.inf to
+that directory
 
 # <path> contains the altusmetrum.inf file we ship. Make sure <path>
 # is otherwise empty or inf2cat will get confused
 
 inf2cat /driver:<path> /os:7_X86,7_X64,8_X86,8_X64
 
-signtool sign /s AltusMetrumCertStore /n â€œAltusMetrum"
+signtool sign /s AltusMetrumCertStore /n â€œAltus Metrum, LLC"
          /t http://timestamp.verisign.com/scripts/timestamp.dll
          altusmetrum.cat
-
-pnputil -i -a altusmetrum.inf
index 8a1b6a4df2763e1e74ec9f61a082dc012f0da082..a9047149d981c3c0af7343bbaeab018fe14f80c7 100644 (file)
@@ -1,11 +1,11 @@
-/** 
+/**
  * http://ad7zj.net/kd7lmo/aprsbeacon_code.html
  *
  * @mainpage Pico Beacon
  *
  * @section overview_sec Overview
  *
- * The Pico Beacon is an APRS based tracking beacon that operates in the UHF 420-450MHz band.  The device utilizes a 
+ * The Pico Beacon is an APRS based tracking beacon that operates in the UHF 420-450MHz band.  The device utilizes a
  * Microchip PIC 18F2525 embedded controller, Motorola M12+ GPS engine, and Analog Devices AD9954 DDS.  The device is capable
  * of generating a 1200bps A-FSK and 9600 bps FSK AX.25 compliant APRS (Automatic Position Reporting System) message.
 
@@ -24,7 +24,7 @@
  *                                     (4) corrected size of LOG_COORD block when searching for end of log.
  *
  * @subsection v303 V3.03
- * 15 Sep 2005, Change include; (1) removed AD9954 setting SDIO as input pin, 
+ * 15 Sep 2005, Change include; (1) removed AD9954 setting SDIO as input pin,
  *                                     (2) additional comments and Doxygen tags,
  *                                     (3) integration and test code calculates DDS FTW,
  *                                     (4) swapped bus and reference analog input ports (hardware change),
@@ -38,7 +38,7 @@
  *                                    (2) Doxygen documentation clean up and additions, and
  *                                    (3) added integration and test code to baseline.
  *
- * 
+ *
  * @subsection v301 V3.01
  * 13 Jan 2005, Renamed project and files to Pico Beacon.
  *
  *                                     (8) added flight data recorder, and
  *                                     (9) added diagnostics terminal mode.
  *
- * 
+ *
  * @subsection v201 V2.01
- * 30 Jan 2004, Change include; (1) General clean up of in-line documentation, and 
+ * 30 Jan 2004, Change include; (1) General clean up of in-line documentation, and
  *                                     (2) changed temperature resolution to 0.1 degrees F.
  *
- * 
+ *
  * @subsection v200 V2.00
  * 26 Oct 2002, Change include; (1) Micro Beacon II hardware changes including PIC18F252 processor,
- *                                     (2) serial EEPROM, 
- *                                     (3) GPS power control, 
- *                                     (4) additional ADC input, and 
- *                                     (5) LM60 temperature sensor.                            
+ *                                     (2) serial EEPROM,
+ *                                     (3) GPS power control,
+ *                                     (4) additional ADC input, and
+ *                                     (5) LM60 temperature sensor.
  *
  *
  * @subsection v101 V1.01
- * 5 Dec 2001, Change include; (1) Changed startup message, and 
+ * 5 Dec 2001, Change include; (1) Changed startup message, and
  *                                    (2) applied SEPARATE pragma to several methods for memory usage.
  *
  *
  * @subsection v100 V1.00
  * 25 Sep 2001, Initial release.  Flew ANSR-3 and ANSR-4.
- * 
+ *
 
 
  *
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *  
+ *
 
 
- * 
- * 
+ *
+ *
  * @section design Design Details
  *
  * Provides design details on a variety of the components that make up the Pico Beacon.
  *  @page power Power Consumption
  *
  *  Measured DC power consumption.
- * 
- *  3VDC prime power current 
+ *
+ *  3VDC prime power current
 
  *
- *    7mA Held in reset 
+ *    7mA Held in reset
 
- *   18mA Processor running, all I/O off 
+ *   18mA Processor running, all I/O off
 
- *  110mA GPS running 
+ *  110mA GPS running
 
- *  120mA GPS running w/antenna 
+ *  120mA GPS running w/antenna
 
- *  250mA DDS running and GPS w/antenna 
+ *  250mA DDS running and GPS w/antenna
 
- *  420mA DDS running, GPS w/antenna, and PA chain on with no RF 
+ *  420mA DDS running, GPS w/antenna, and PA chain on with no RF
 
- *  900mA Transmit 
+ *  900mA Transmit
 
  *
  */
 
 #ifndef AO_APRS_TEST
 #include <ao.h>
+
+#if !HAS_APRS
+#error HAS_APRS not set
+#endif
 #endif
 
 #include <ao_aprs.h>
@@ -176,11 +180,11 @@ static uint16_t sysCRC16(const uint8_t *buffer, uint8_t length, uint16_t crc)
 {
     uint8_t i, bit, value;
 
-    for (i = 0; i < length; ++i) 
+    for (i = 0; i < length; ++i)
     {
         value = buffer[i];
 
-        for (bit = 0; bit < 8; ++bit) 
+        for (bit = 0; bit < 8; ++bit)
         {
             crc ^= (value & 0x01);
             crc = ( crc & 0x01 ) ? ( crc >> 1 ) ^ 0x8408 : ( crc >> 1 );
@@ -253,7 +257,7 @@ typedef enum
 
 /// AX.25 compliant packet header that contains destination, station call sign, and path.
 /// 0x76 for SSID-11, 0x78 for SSID-12
-static uint8_t TNC_AX25_HEADER[] = { 
+static uint8_t TNC_AX25_HEADER[] = {
     'A' << 1, 'P' << 1, 'A' << 1, 'M' << 1, ' ' << 1, ' ' << 1, 0x60,
     'N' << 1, '0' << 1, 'C' << 1, 'A' << 1, 'L' << 1, 'L' << 1, 0x78,
     'W' << 1, 'I' << 1, 'D' << 1, 'E' << 1, '2' << 1, ' ' << 1, 0x65,
@@ -261,6 +265,7 @@ static uint8_t TNC_AX25_HEADER[] = {
 
 #define TNC_CALLSIGN_OFF       7
 #define TNC_CALLSIGN_LEN       6
+#define TNC_SSID_OFF           13
 
 static void
 tncSetCallsign(void)
@@ -275,6 +280,9 @@ tncSetCallsign(void)
        }
        for (; i < TNC_CALLSIGN_LEN; i++)
                TNC_AX25_HEADER[TNC_CALLSIGN_OFF + i] = ' ' << 1;
+
+       /* Fill in the SSID with the low digit of the serial number */
+       TNC_AX25_HEADER[TNC_SSID_OFF] = 0x60 | ((ao_config.aprs_ssid & 0xf) << 1);
 #endif
 }
 
@@ -302,7 +310,7 @@ static uint8_t tncBitStuff;
 /// Buffer to hold the message portion of the AX.25 packet as we prepare it.
 static uint8_t tncBuffer[TNC_BUFFER_SIZE];
 
-/** 
+/**
  *   Initialize the TNC internal variables.
  */
 static void tncInit()
@@ -323,7 +331,7 @@ static void tnc1200TimerTick()
     else
         timeNCOFreq = 0x3aab;
 
-    switch (tncMode) 
+    switch (tncMode)
     {
         case TNC_TX_READY:
             // Generate a test signal alteranting between high and low tones.
@@ -339,16 +347,16 @@ static void tnc1200TimerTick()
                 else
                     tncTxBit = 0;
            }
-                    
+
             // When the flag is done, determine if we need to send more or data.
-            if (++tncBitCount == 8) 
+            if (++tncBitCount == 8)
             {
                 tncBitCount = 0;
                 tncShift = 0x7e;
 
                 // Once we transmit x mS of flags, send the data.
                 // txDelay bytes * 8 bits/byte * 833uS/bit = x mS
-                if (++tncIndex == TNC_TX_DELAY) 
+                if (++tncIndex == TNC_TX_DELAY)
                 {
                     tncIndex = 0;
                     tncShift = TNC_AX25_HEADER[0];
@@ -361,7 +369,7 @@ static void tnc1200TimerTick()
 
         case TNC_TX_HEADER:
             // Determine if we have sent 5 ones in a row, if we have send a zero.
-            if (tncBitStuff == 0x1f) 
+            if (tncBitStuff == 0x1f)
             {
                 if (tncTxBit == 0)
                     tncTxBit = 1;
@@ -381,17 +389,17 @@ static void tnc1200TimerTick()
                     tncTxBit = 0;
            }
 
-            // Save the data stream so we can determine if bit stuffing is 
+            // Save the data stream so we can determine if bit stuffing is
             // required on the next bit time.
             tncBitStuff = ((tncBitStuff << 1) | (tncShift & 0x01)) & 0x1f;
 
             // If all the bits were shifted, get the next byte.
-            if (++tncBitCount == 8) 
+            if (++tncBitCount == 8)
             {
                 tncBitCount = 0;
 
                 // After the header is sent, then send the data.
-                if (++tncIndex == sizeof(TNC_AX25_HEADER)) 
+                if (++tncIndex == sizeof(TNC_AX25_HEADER))
                 {
                     tncIndex = 0;
                     tncShift = tncBuffer[0];
@@ -406,7 +414,7 @@ static void tnc1200TimerTick()
 
         case TNC_TX_DATA:
             // Determine if we have sent 5 ones in a row, if we have send a zero.
-            if (tncBitStuff == 0x1f) 
+            if (tncBitStuff == 0x1f)
             {
                 if (tncTxBit == 0)
                     tncTxBit = 1;
@@ -426,17 +434,17 @@ static void tnc1200TimerTick()
                     tncTxBit = 0;
            }
 
-            // Save the data stream so we can determine if bit stuffing is 
+            // Save the data stream so we can determine if bit stuffing is
             // required on the next bit time.
             tncBitStuff = ((tncBitStuff << 1) | (tncShift & 0x01)) & 0x1f;
 
             // If all the bits were shifted, get the next byte.
-            if (++tncBitCount == 8) 
+            if (++tncBitCount == 8)
             {
                 tncBitCount = 0;
 
                 // If everything was sent, transmit closing flags.
-                if (++tncIndex == tncLength) 
+                if (++tncIndex == tncLength)
                 {
                     tncIndex = 0;
                     tncShift = 0x7e;
@@ -451,7 +459,7 @@ static void tnc1200TimerTick()
 
         case TNC_TX_END:
             // The variable tncShift contains the lastest data byte.
-            // NRZI enocde the data stream. 
+            // NRZI enocde the data stream.
             if ((tncShift & 0x01) == 0x00) {
                 if (tncTxBit == 0)
                     tncTxBit = 1;
@@ -460,13 +468,13 @@ static void tnc1200TimerTick()
            }
 
             // If all the bits were shifted, get the next one.
-            if (++tncBitCount == 8) 
+            if (++tncBitCount == 8)
             {
                 tncBitCount = 0;
                 tncShift = 0x7e;
-    
+
                 // Transmit two closing flags.
-                if (++tncIndex == 2) 
+                if (++tncIndex == 2)
                 {
                     tncMode = TNC_TX_READY;
 
@@ -530,6 +538,7 @@ static int tncComment(uint8_t *buf)
 #ifdef AO_SENSE_MAIN
                       " M%d.%d"
 #endif
+                      " %d"
                       , ao_gps_locked(),
                       ao_num_sats(),
                       battery/10,
@@ -542,6 +551,7 @@ static int tncComment(uint8_t *buf)
                       , main/10,
                       main%10
 #endif
+                      , ao_serial_number
                );
 #else
        return sprintf((char *) buf,
@@ -759,7 +769,7 @@ tncFill(uint8_t *buf, int16_t len)
     return l;
 }
 
-/** 
+/**
  *    Prepare an AX.25 data packet.  Each time this method is called, it automatically
  *    rotates through 1 of 3 messages.
  *
index 71445335a7a39901c98b91c4346f1cbd1e6686e1..58fa735438c31439b25558369dd6e62c84f6cdd3 100644 (file)
@@ -61,6 +61,7 @@ __xdata uint8_t ao_config_mutex;
 #define AO_CONFIG_DEFAULT_RADIO_POWER          0x60
 #endif
 #define AO_CONFIG_DEFAULT_RADIO_AMP            0
+#define AO_CONFIG_DEFAULT_APRS_SSID            (ao_serial_number % 10)
 
 #if HAS_EEPROM
 static void
@@ -191,6 +192,10 @@ _ao_config_get(void)
 #if AO_PYRO_NUM
                if (minor < 18)
                        ao_config.pyro_time = AO_CONFIG_DEFAULT_PYRO_TIME;
+#endif
+#if HAS_APRS
+               if (minor < 19)
+                       ao_config.aprs_ssid = AO_CONFIG_DEFAULT_APRS_SSID;
 #endif
                ao_config.minor = AO_CONFIG_MINOR;
                ao_config_dirty = 1;
@@ -283,6 +288,7 @@ ao_config_frequency_set(void) __reentrant
        ao_radio_recv_abort();
 #endif
 }
+
 #endif
 
 #if HAS_FLIGHT
@@ -737,6 +743,30 @@ ao_config_pyro_time_set(void)
 }
 #endif
 
+#if HAS_APRS
+void
+ao_config_aprs_ssid_show(void)
+{
+       printf ("APRS SSID: %d\n",
+               ao_config.aprs_ssid);
+}
+
+void
+ao_config_aprs_ssid_set(void)
+{
+       ao_cmd_decimal();
+       if (ao_cmd_status != ao_cmd_success)
+               return;
+       if (15 < ao_cmd_lex_i) {
+               ao_cmd_status = ao_cmd_lex_error;
+               return;
+       }
+       _ao_config_edit_start();
+       ao_config.aprs_ssid = ao_cmd_lex_i;
+       _ao_config_edit_finish();
+}
+#endif /* HAS_APRS */
+
 struct ao_config_var {
        __code char     *str;
        void            (*set)(void) __reentrant;
@@ -816,6 +846,10 @@ __code struct ao_config_var ao_config_vars[] = {
 #if HAS_TRACKER
        { "t <motion> <interval>\0Tracker configuration",
          ao_config_tracker_set, ao_config_tracker_show },
+#endif
+#if HAS_APRS
+       { "S <ssid>\0Set APRS SSID (0-15)",
+         ao_config_aprs_ssid_set, ao_config_aprs_ssid_show },
 #endif
        { "s\0Show",
          ao_config_show,               0 },
index 2b5cd352300fed22d9c89ceb7fb0b4dbdeb73aee..70f9f33bdbc6104e60e95a4470ecf35d1f509927 100644 (file)
@@ -53,7 +53,7 @@
 #endif
 
 #define AO_CONFIG_MAJOR        1
-#define AO_CONFIG_MINOR        18
+#define AO_CONFIG_MINOR        19
 
 #define AO_AES_LEN 16
 
@@ -102,6 +102,9 @@ struct ao_config {
 #if AO_PYRO_NUM
        uint16_t        pyro_time;              /* minor version 18 */
 #endif
+#if HAS_APRS
+       uint8_t         aprs_ssid;              /* minor version 19 */
+#endif
 };
 
 #define AO_IGNITE_MODE_DUAL            0
index 85d88d98962006c5f78425d5ab8a0334f8faad19..0b286466fa3a7495d91406bedb91c1ebbe6cd3e9 100644 (file)
@@ -69,6 +69,16 @@ ao_pyro_print_status(void)
 
 uint16_t       ao_pyro_fired;
 
+#ifndef PYRO_DBG
+#define PYRO_DBG       0
+#endif
+
+#if PYRO_DBG
+#define DBG(...)       do { printf("\t%d: ", (int) (pyro - ao_config.pyro)); printf(__VA_ARGS__); } while (0)
+#else
+#define DBG(...)
+#endif
+
 /*
  * Given a pyro structure, figure out
  * if the current flight state satisfies all
@@ -88,63 +98,73 @@ ao_pyro_ready(struct ao_pyro *pyro)
                case ao_pyro_accel_less:
                        if (ao_accel <= pyro->accel_less)
                                continue;
+                       DBG("accel %d > %d\n", ao_accel, pyro->accel_less);
                        break;
                case ao_pyro_accel_greater:
                        if (ao_accel >= pyro->accel_greater)
                                continue;
+                       DBG("accel %d < %d\n", ao_accel, pyro->accel_greater);
                        break;
-
-
                case ao_pyro_speed_less:
                        if (ao_speed <= pyro->speed_less)
                                continue;
+                       DBG("speed %d > %d\n", ao_speed, pyro->speed_less);
                        break;
                case ao_pyro_speed_greater:
                        if (ao_speed >= pyro->speed_greater)
                                continue;
+                       DBG("speed %d < %d\n", ao_speed, pyro->speed_greater);
                        break;
-
                case ao_pyro_height_less:
                        if (ao_height <= pyro->height_less)
                                continue;
+                       DBG("height %d > %d\n", ao_height, pyro->height_less);
                        break;
                case ao_pyro_height_greater:
                        if (ao_height >= pyro->height_greater)
                                continue;
+                       DBG("height %d < %d\n", ao_height, pyro->height_greater);
                        break;
 
 #if HAS_GYRO
                case ao_pyro_orient_less:
                        if (ao_sample_orient <= pyro->orient_less)
                                continue;
+                       DBG("orient %d > %d\n", ao_sample_orient, pyro->orient_less);
                        break;
                case ao_pyro_orient_greater:
                        if (ao_sample_orient >= pyro->orient_greater)
                                continue;
+                       DBG("orient %d < %d\n", ao_sample_orient, pyro->orient_greater);
                        break;
 #endif
 
                case ao_pyro_time_less:
                        if ((int16_t) (ao_time() - ao_boost_tick) <= pyro->time_less)
                                continue;
+                       DBG("time %d > %d\n", (int16_t)(ao_time() - ao_boost_tick), pyro->time_less);
                        break;
                case ao_pyro_time_greater:
                        if ((int16_t) (ao_time() - ao_boost_tick) >= pyro->time_greater)
                                continue;
+                       DBG("time %d < %d\n", (int16_t)(ao_time() - ao_boost_tick), pyro->time_greater);
                        break;
 
                case ao_pyro_ascending:
                        if (ao_speed > 0)
                                continue;
+                       DBG("not ascending speed %d\n", ao_speed);
                        break;
                case ao_pyro_descending:
                        if (ao_speed < 0)
                                continue;
+                       DBG("not descending speed %d\n", ao_speed);
                        break;
 
                case ao_pyro_after_motor:
                        if (ao_motor_number == pyro->motor)
                                continue;
+                       DBG("motor %d != %d\n", ao_motor_number, pyro->motor);
                        break;
 
                case ao_pyro_delay:
@@ -154,10 +174,12 @@ ao_pyro_ready(struct ao_pyro *pyro)
                case ao_pyro_state_less:
                        if (ao_flight_state < pyro->state_less)
                                continue;
+                       DBG("state %d >= %d\n", ao_flight_state, pyro->state_less);
                        break;
                case ao_pyro_state_greater_or_equal:
                        if (ao_flight_state >= pyro->state_greater_or_equal)
                                continue;
+                       DBG("state %d >= %d\n", ao_flight_state, pyro->state_less);
                        break;
 
                default:
index 6ae3d0be2acb08611b2119bfe611d3b7d659f02d..ac00f635e77d5d23a581b520a207a0ef4b024a4d 100644 (file)
@@ -8,8 +8,15 @@ vpath make-altitude-pa ../util
 
 include ../avr/Makefile.defs
 
+PROGNAME=micropeak-v0.1
+PROG=$(PROGNAME)-$(VERSION).elf
+HEX=$(PROGNAME)-$(VERSION).ihx
+
+SCRIPT=micropeak-load
+
 PUBLISH_DIR=$(HOME)/altusmetrumllc/Binaries
-PUBLISH_FILE=$(PUBLISH_DIR)/$(PROG)-$(VERSION).hex
+PUBLISH_HEX=$(PUBLISH_DIR)/$(HEX)
+PUBLISH_SCRIPT=$(PUBLISH_DIR)/$(SCRIPT)
 
 MCU=attiny85
 DUDECPUTYPE=t85
@@ -55,8 +62,6 @@ CFLAGS += -g -mmcu=$(MCU) -Wall -Wstrict-prototypes -O2 -mcall-prologues -DATTIN
 
 NICKLE=nickle
 
-PROG=micropeak-v0.1
-
 SRC=$(ALTOS_SRC)
 OBJ=$(SRC:.c=.o)
 
@@ -68,7 +73,7 @@ endif
 # Otherwise, print the full command line.
 quiet ?= $($1)
 
-all: $(PROG) $(PROG).hex
+all: $(PROG) $(HEX) micropeak-load
 
 CHECK=sh ../util/check-avr-mem
 
@@ -76,16 +81,16 @@ $(PROG): Makefile $(OBJ)
        $(call quiet,CC) $(LDFLAGS) $(CFLAGS) -o $(PROG) $(OBJ)
        $(call quiet,CHECK) $(PROG) || ($(RM) -f $(PROG); exit 1)
 
-$(PROG).hex: $(PROG)
+$(HEX): $(PROG)
        avr-size $(PROG)
        $(OBJCOPY) -R .eeprom -O ihex $(PROG) $@
 
 
-load: $(PROG).hex
-       $(LOADCMD) $(LOADARG)$(PROG).hex
+load: $(HEX)
+       $(LOADCMD) $(LOADARG)$(HEX)
 
-load-slow: $(PROG).hex
-       $(LOADCMD) $(LOADSLOW) $(LOADARG)$(PROG).hex
+load-slow: $(HEX)
+       $(LOADCMD) $(LOADSLOW) $(LOADARG)$(HEX)
 
 ao_product.h: ao-make-product.5c ../Version
        $(call quiet,NICKLE,$<) $< -m altusmetrum.org -i $(IDPRODUCT) -p $(PRODUCT) -v $(VERSION) > $@
@@ -98,22 +103,30 @@ ao_product.o: ao_product.c ao_product.h
 distclean:     clean
 
 clean:
-       rm -f *.o $(PROG) $(PROG).hex
+       rm -f *.o $(PROG) $(HEX) $(SCRIPT)
        rm -f ao_product.h
 
+publish: $(PUBLISH_HEX) $(PUBLISH_SCRIPT)
 
-publish: $(PROG).hex
-       cp -a $(PROG).hex $(PUBLISH_FILE)
+$(PUBLISH_HEX): $(HEX)
+       cp -a $(HEX) $@
+
+$(PUBLISH_SCRIPT): $(SCRIPT)
+       cp -a $(SCRIPT) $@
 
 load-product:
-       $(LOADCMD) $(LOADARG)$(PUBLISH_FILE)
+       ./$(SCRIPT) fast
 
 load-product-slow:
-       $(LOADCMD) $(LOADSLOW) $(LOADARG)$(PUBLISH_FILE)
+       ./$(SCRIPT) slow
 
 ../altitude-pa.h: make-altitude-pa
        nickle $< > $@
 
+$(SCRIPT): $(SCRIPT).tmpl Makefile ../Version
+       sed -e 's/%HEX%/$(HEX)/' -e 's/%LOADCMD%/$(LOADCMD)/' -e 's/%LOADARG%/$(LOADARG)/' -e 's/%LOADSLOW%/$(LOADSLOW)/' $(SCRIPT).tmpl > $@ || (rm $@ && exit 1)
+       chmod +x $@
+
 install:
 
 uninstall:
diff --git a/src/micropeak/micropeak-load.tmpl b/src/micropeak/micropeak-load.tmpl
new file mode 100644 (file)
index 0000000..08236a1
--- /dev/null
@@ -0,0 +1,20 @@
+#!/bin/sh
+dir=`dirname $0`
+
+HEX="$dir"/"%HEX%"
+LOADCMD="%LOADCMD%"
+LOADARG="%LOADARG%"
+LOADSLOW="%LOADSLOW%"
+LOADFAST=""
+
+case "$1" in
+fast)
+       LOADSPEED="$LOADFAST"
+       ;;
+*)
+       LOADSPEED="$LOADSLOW"
+       ;;
+esac
+
+echo ${LOADCMD} ${LOADSPEED} ${LOADARG}${HEX}
+${LOADCMD} ${LOADSPEED} ${LOADARG}${HEX}
index 86cf527ae2f4c7219e376135b357aad327a6f14d..573b5cb22a1ed6e3386867b9f10c0f11bb019a84 100644 (file)
@@ -97,36 +97,12 @@ audio_gap(int secs)
 #endif
 }
 
-#include <math.h>
-
-int
-ao_aprs_encode_altitude_expensive(int meters)
-{
-       double  feet = meters / 0.3048;
-
-       double  encode = log(feet) / log(1.002);
-       return floor(encode + 0.5);
-}
-
 // This is where we go after reset.
 int main(int argc, char **argv)
 {
        int     e, x;
        int     a;
 
-       for (a = 1; a < 100000; a++) {
-               e = ao_aprs_encode_altitude(a);
-               x = ao_aprs_encode_altitude_expensive(a);
-
-               if (e != x) {
-                       double  back_feet, back_meters;
-                       back_feet = pow(1.002, e);
-                       back_meters = back_feet * 0.3048;
-                       fprintf (stderr, "APRS altitude encoding failure: altitude %d actual %d expected %d actual meters %f\n",
-                                a, e, x, back_meters);
-               }
-       }
-
     audio_gap(1);
 
     ao_gps_data.latitude = (45.0 + 28.25 / 60.0) * 10000000;
index 0647fc6c3e97206381af8c6814484216706bd052..1ab22e5b6acf4cd5af37d4e98b513b61b68fbb0f 100644 (file)
@@ -50,6 +50,7 @@ int ao_gps_new;
 #define HAS_MMA655X            1
 #define HAS_HMC5883            1
 #define HAS_BEEP               1
+#define AO_CONFIG_MAX_SIZE     1024
 
 struct ao_adc {
        int16_t                 sense[AO_ADC_NUM_SENSE];
@@ -795,6 +796,7 @@ ao_sleep(void *wchan)
                                        pyro->flags |= ao_pyro_values[j].flag;
                                        if (ao_pyro_values[j].offset != NO_VALUE && i + 1 < nword) {
                                                int16_t val = strtoul(words[++i], NULL, 10);
+                                               printf("pyro %d condition %s value %d\n", p, words[i-1], val);
                                                *((int16_t *) ((char *) pyro + ao_pyro_values[j].offset)) = val;
                                        }
                                }
index edb509f20418f39f6c96a7dc28fcd307a9f63dc3..37e46ad12153bf8dcd54cc339b96e61a2b49092c 100644 (file)
@@ -17,7 +17,7 @@ TeleGPS-Linux-*.tar.bz2
 TeleGPS-Linux-*.sh
 TeleGPS-Mac-*.zip
 TeleGPS-Windows-*.exe
-telegps.desktop
+altusmetrum-telegps.desktop
 telegps-windows.log
 *.dll
 *.dylib
index df05bb6e27fe1c714f6d44674c2cdf2f7f67dfde..89870a8c65db1de604da262113d9a7668ed24610 100644 (file)
        <key>CFBundleInfoDictionaryVersion</key>
        <string>6.0</string>
        <key>CFBundleIconFile</key>
-       <string>TeleGPS.icns</string>
+       <string>altusmetrum-telegps.icns</string>
+       <key>CFBundleDocumentTypes</key>
+       <array>
+         <dict>
+           <key>CFBundleTypeName</key>
+           <string>Telemetry</string>
+           <key>CFBundleTypeIconFile</key>
+           <string>application-vnd.altusmetrum.telemetry.icns</string>
+           <key>CFBundleTypeExtensions</key>
+           <array>
+             <string>telem</string>
+           </array>
+           <key>CFBundleTypeRole</key>
+           <string>Editor</string>
+         </dict>
+         <dict>
+           <key>CFBundleTypeName</key>
+           <string>Eeprom</string>
+           <key>CFBundleTypeIconFile</key>
+           <string>application-vnd.altusmetrum.eeprom.icns</string>
+           <key>CFBundleTypeExtensions</key>
+           <array>
+             <string>eeprom</string>
+           </array>
+           <key>CFBundleTypeRole</key>
+           <string>Editor</string>
+         </dict>
+       </array>
        <key>Java</key>
        <dict>
                <key>MainClass</key>
index 7b550e9eccd00573c9b53be1d8d78045944c2080..3f53b949bb94eb55a540d971c2e214c77e8e8c83 100644 (file)
@@ -58,23 +58,34 @@ ALTOSUILIB_CLASS=\
 ICONDIR=$(top_srcdir)/icon
 
 JAVA_ICONS=\
-       $(ICONDIR)/telegps-16.png \
-       $(ICONDIR)/telegps-32.png \
-       $(ICONDIR)/telegps-48.png \
-       $(ICONDIR)/telegps-64.png \
-       $(ICONDIR)/telegps-128.png \
-       $(ICONDIR)/telegps-256.png
+       $(ICONDIR)/altusmetrum-telegps-16.png \
+       $(ICONDIR)/altusmetrum-telegps-32.png \
+       $(ICONDIR)/altusmetrum-telegps-48.png \
+       $(ICONDIR)/altusmetrum-telegps-64.png \
+       $(ICONDIR)/altusmetrum-telegps-128.png\
+       $(ICONDIR)/altusmetrum-telegps-256.png
 
 # icon base names for jar
-ICONJAR= -C $(ICONDIR) telegps-16.png \
-       -C $(ICONDIR) telegps-32.png \
-       -C $(ICONDIR) telegps-48.png \
-       -C $(ICONDIR) telegps-64.png \
-       -C $(ICONDIR) telegps-128.png \
-       -C $(ICONDIR) telegps-256.png
-
-WINDOWS_ICON=$(ICONDIR)/telegps.ico
-MACOSX_ICON=$(ICONDIR)/TeleGPS.icns
+ICONJAR= \
+       -C $(ICONDIR) altusmetrum-telegps-16.png \
+       -C $(ICONDIR) altusmetrum-telegps-32.png \
+       -C $(ICONDIR) altusmetrum-telegps-48.png \
+       -C $(ICONDIR) altusmetrum-telegps-64.png \
+       -C $(ICONDIR) altusmetrum-telegps-128.png\
+       -C $(ICONDIR) altusmetrum-telegps-256.png
+
+WINDOWS_ICONS  =\
+       ../icon/altusmetrum-telegps.ico \
+       ../icon/altusmetrum-telegps.exe
+       ../icon/application-vnd.altusmetrum.eeprom.ico \
+       ../icon/application-vnd.altusmetrum.eeprom.exe \
+       ../icon/application-vnd.altusmetrum.telemetry.ico \
+       ../icon/application-vnd.altusmetrum.telemetry.exe
+
+MACOSX_ICONS   =\
+       ../icon/altusmetrum-telegps.icns \
+       ../icon/application-vnd.altusmetrum.eeprom.icns \
+       ../icon/application-vnd.altusmetrum.telemetry.icns
 
 # Firmware
 FIRMWARE_TD_0_2=$(top_srcdir)/src/teledongle-v0.2/teledongle-v0.2-$(VERSION).ihx
@@ -89,7 +100,7 @@ FIRMWARE_TG=$(FIRMWARE_TG_1_0)
 FIRMWARE=$(FIRMWARE_TG) $(FIRMWARE_TD) $(FIRMWARE_TBT)
 
 desktopdir = $(datadir)/applications
-desktop_file = telegps.desktop
+desktop_file = altusmetrum-telegps.desktop
 desktop_SCRIPTS = $(desktop_file)
 
 all-local: telegps-test telegps-jdb $(JAR)
@@ -106,7 +117,7 @@ clean-local:
 EXTRA_DIST = $(desktop_file).in
 
 $(desktop_file): $(desktop_file).in
-       sed -e 's#%bindir%#@bindir@#' -e 's#%icondir%#$(datadir)/icons/hicolor/scalable/apps#' ${srcdir}/telegps.desktop.in > $@
+       sed -e 's#%bindir%#@bindir@#' -e 's#%icondir%#$(datadir)/icons/hicolor/scalable/apps#' ${srcdir}/$(desktop_file).in > $@
        chmod +x $@
 
 LINUX_DIST=TeleGPS-Linux-$(VERSION).tar.bz2
@@ -120,15 +131,15 @@ DOC=$(TELEGPS_DOC)
 
 FAT_FILES=$(FATJAR) $(ALTOSLIB_CLASS) $(ALTOSUILIB_CLASS) $(FREETTS_CLASS) $(JFREECHART_CLASS) $(JCOMMON_CLASS)
 
-LINUX_FILES=$(FAT_FILES) libaltos.so $(FIRMWARE) $(DOC) telegps.desktop.in ../icon/telegps.svg
-LINUX_EXTRA=telegps-fat telegps.desktop.in
+LINUX_FILES=$(FAT_FILES) libaltos.so $(FIRMWARE) $(DOC) $(desktop_file).in ../icon/altusmetrum-telegps.svg
+LINUX_EXTRA=telegps-fat $(desktop_file).in
 
 MACOSX_INFO_PLIST=Info.plist
 MACOSX_README=ReadMe-Mac.rtf
-MACOSX_FILES=$(FAT_FILES) libaltos.dylib $(MACOSX_INFO_PLIST) $(MACOSX_README) $(DOC) $(MACOSX_ICON)
+MACOSX_FILES=$(FAT_FILES) libaltos.dylib $(MACOSX_INFO_PLIST) $(MACOSX_README) $(DOC) $(MACOSX_ICONS)
 MACOSX_EXTRA=$(FIRMWARE)
 
-WINDOWS_FILES=$(FAT_FILES) altos.dll altos64.dll $(top_srcdir)/altusmetrum.inf $(top_srcdir)/altusmetrum.cat $(DOC) $(WINDOWS_ICON)
+WINDOWS_FILES=$(FAT_FILES) altos.dll altos64.dll $(top_srcdir)/altusmetrum.inf $(top_srcdir)/altusmetrum.cat $(DOC) $(WINDOWS_ICONS)
 
 if FATINSTALL
 
@@ -194,8 +205,6 @@ $(FATJAR): classtelegps.stamp Manifest-fat.txt $(ALTOSLIB_CLASS) $(ALTOSUILIB_CL
                -C classes org \
                -C ../libaltos libaltosJNI
 
-classaltosui.stamp: $(ALTOSLIB_CLASS) $(ALTOSUILIB_CLASS)
-
 libaltos.so: build-libaltos
        -rm -f "$@"
        $(LN_S) ../libaltos/.libs/"$@" .
@@ -269,7 +278,7 @@ $(MACOSX_DIST): $(MACOSX_FILES) $(MACOSX_EXTRA) Makefile
        cp -a $(DOC) macosx/Doc
        cp -p Info.plist macosx/TeleGPS.app/Contents
        mkdir -p macosx/AltOS-$(VERSION) macosx/TeleGPS.app/Contents/Resources/Java
-       cp -p $(MACOSX_ICON) macosx/TeleGPS.app/Contents/Resources
+       cp -p $(MACOSX_ICONS) macosx/TeleGPS.app/Contents/Resources
        cp -p $(FATJAR) macosx/TeleGPS.app/Contents/Resources/Java/telegps.jar
        cp -p libaltos.dylib macosx/TeleGPS.app/Contents/Resources/Java
        cp -p $(ALTOSLIB_CLASS) macosx/TeleGPS.app/Contents/Resources/Java
index 6e68dd30e5087451d69702a656bddeb2e25bc955..e78c2124ab5142102b7a6da44fc55e49b720dc19 100644 (file)
@@ -23,8 +23,8 @@ import javax.swing.*;
 import java.io.*;
 import java.util.concurrent.*;
 import java.util.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class TeleGPS
        extends AltosUIFrame
@@ -351,17 +351,18 @@ public class TeleGPS
                frequencies.set_product("Monitor");
                frequencies.set_serial(serial);
                frequencies.set_frequency(AltosUIPreferences.frequency(serial));
-               frequencies.setEnabled(true);
 
+               menu_bar.add(frequencies);
+               menu_bar.repaint();
        }
 
        void disable_frequency_menu() {
-               if (frequency_listener != null) {
-                       frequencies.removeActionListener(frequency_listener);
-                       frequencies.setEnabled(false);
-                       frequency_listener = null;
-               }
-
+               if (frequency_listener == null)
+                       return;
+               frequencies.removeActionListener(frequency_listener);
+               menu_bar.remove(frequencies);
+               menu_bar.repaint();
+               frequency_listener = null;
        }
 
        public void set_reader(AltosFlightReader reader, AltosDevice device) {
@@ -409,16 +410,38 @@ public class TeleGPS
 
        private JMenu make_menu(String label, String[][] items) {
                JMenu   menu = new JMenu(label);
-               for (int i = 0; i < items.length; i++)
+               for (int i = 0; i < items.length; i++) {
+                       if (MAC_OS_X) {
+                               if (items[i][1].equals("exit"))
+                                       continue;
+                               if (items[i][1].equals("preferences"))
+                                       continue;
+                       }
                        add_menu(menu, items[i][0], items[i][1]);
+               }
                menu_bar.add(menu);
                return menu;
        }
 
+       /* OSXAdapter interfaces */
+       public void macosx_file_handler(String path) {
+               process_graph(new File(path));
+       }
+
+       public void macosx_quit_handler() {
+               System.exit(0);
+       }
+
+       public void macosx_preferences_handler() {
+               preferences();
+       }
+
        public TeleGPS() {
 
                AltosUIPreferences.set_component(this);
 
+               register_for_macosx_events();
+
                reader = null;
 
                bag = getContentPane();
@@ -435,8 +458,6 @@ public class TeleGPS
                monitor_menu = make_menu("Monitor", monitor_menu_entries);
                device_menu = make_menu("Device", device_menu_entries);
                frequencies = new AltosFreqList();
-               frequencies.setEnabled(false);
-               menu_bar.add(frequencies);
 
                displays = new LinkedList<AltosFlightDisplay>();
 
index 3505b0bb643ba186cb51cdbdf9b568ccfa817970..e607a5a5510f0c52e173ca2fa9756c55d5fd7729 100644 (file)
@@ -22,8 +22,8 @@ import javax.swing.*;
 import java.io.*;
 import java.util.concurrent.*;
 import java.text.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class TeleGPSConfig implements ActionListener {
 
index 5f269fd30e2e126ea85a8c2677da0d67a3af6101..1fdfd70cdfc3978238401295fd8f9eac7bf21bbe 100644 (file)
@@ -21,8 +21,8 @@ import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
 import javax.swing.event.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class TeleGPSConfigUI
        extends AltosUIDialog
@@ -38,6 +38,7 @@ public class TeleGPSConfigUI
        JLabel                  radio_frequency_label;
        JLabel                  radio_enable_label;
        JLabel                  aprs_interval_label;
+       JLabel                  aprs_ssid_label;
        JLabel                  flight_log_max_label;
        JLabel                  callsign_label;
        JLabel                  tracker_motion_label;
@@ -53,6 +54,7 @@ public class TeleGPSConfigUI
        JTextField              radio_calibration_value;
        JRadioButton            radio_enable_value;
        JComboBox<String>       aprs_interval_value;
+       JComboBox<Integer>      aprs_ssid_value;
        JComboBox<String>       flight_log_max_value;
        JTextField              callsign_value;
        JComboBox<String>       tracker_motion_value;
@@ -72,6 +74,10 @@ public class TeleGPSConfigUI
                "10"
        };
 
+       static Integer[]        aprs_ssid_values = {
+               0, 1, 2 ,3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
+       };
+
        static String[]         tracker_motion_values_m = {
                "2",
                "5",
@@ -148,6 +154,15 @@ public class TeleGPSConfigUI
                        aprs_interval_value.setToolTipText("Hardware doesn't support APRS");
        }
 
+       void set_aprs_ssid_tool_tip() {
+               if (aprs_ssid_value.isEnabled())
+                       aprs_interval_value.setToolTipText("Set the APRS SSID (secondary station identifier)");
+               else if (aprs_interval_value.isEnabled())
+                       aprs_interval_value.setToolTipText("Software version doesn't support setting the APRS SSID");
+               else
+                       aprs_interval_value.setToolTipText("Hardware doesn't support APRS");
+       }
+
        void set_flight_log_max_tool_tip() {
                if (flight_log_max_value.isEnabled())
                        flight_log_max_value.setToolTipText("Size reserved for each flight log (in kB)");
@@ -257,7 +272,11 @@ public class TeleGPSConfigUI
                c.ipady = 5;
                radio_frequency_value = new AltosFreqList();
                radio_frequency_value.addItemListener(this);
-               pane.add(radio_frequency_value, c);
+
+               JMenuBar menu_bar = new JMenuBar();
+               menu_bar.add(radio_frequency_value);
+
+               pane.add(menu_bar, c);
                radio_frequency_value.setToolTipText("Telemetry, RDF and packet frequency");
                row++;
 
@@ -337,6 +356,33 @@ public class TeleGPSConfigUI
                set_aprs_interval_tool_tip();
                row++;
 
+               /* APRS SSID */
+               c = new GridBagConstraints();
+               c.gridx = 0; c.gridy = row;
+               c.gridwidth = 4;
+               c.fill = GridBagConstraints.NONE;
+               c.anchor = GridBagConstraints.LINE_START;
+               c.insets = il;
+               c.ipady = 5;
+               aprs_ssid_label = new JLabel("APRS SSID:");
+               pane.add(aprs_ssid_label, c);
+
+               c = new GridBagConstraints();
+               c.gridx = 4; c.gridy = row;
+               c.gridwidth = 4;
+               c.fill = GridBagConstraints.HORIZONTAL;
+               c.weightx = 1;
+               c.anchor = GridBagConstraints.LINE_START;
+               c.insets = ir;
+               c.ipady = 5;
+               aprs_ssid_value = new JComboBox<Integer>(aprs_ssid_values);
+               aprs_ssid_value.setEditable(false);
+               aprs_ssid_value.addItemListener(this);
+               aprs_ssid_value.setMaximumRowCount(aprs_ssid_values.length);
+               pane.add(aprs_ssid_value, c);
+               set_aprs_ssid_tool_tip();
+               row++;
+
                /* Callsign */
                c = new GridBagConstraints();
                c.gridx = 0; c.gridy = row;
@@ -782,4 +828,15 @@ public class TeleGPSConfigUI
                        return 0;
                return parse_int("aprs interval", s, false);
        }
+
+       public void set_aprs_ssid(int new_aprs_ssid) {
+               aprs_ssid_value.setSelectedItem(Math.max(0,new_aprs_ssid));
+               aprs_ssid_value.setVisible(new_aprs_ssid >= 0);
+               set_aprs_ssid_tool_tip();
+       }
+
+       public int aprs_ssid() throws AltosConfigDataException {
+               Integer i = (Integer) aprs_ssid_value.getSelectedItem();
+               return i;
+       }
 }
index a3d4ea079caedbbadcf8c0cc4c620533dcb3ec0e..18b8d9fcd7fe29d0bd086756da27b8277286b07c 100644 (file)
@@ -21,8 +21,8 @@ import java.awt.*;
 import javax.swing.*;
 import java.io.*;
 import java.text.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class TeleGPSDisplayThread extends Thread {
 
index 244eb7b9e11fee7112ffa78a030f7fac3cb17c79..b59b122cd4faa11d377e78c9cfec3787082c7247 100644 (file)
@@ -26,8 +26,8 @@ import javax.swing.*;
 import java.io.*;
 import java.util.concurrent.*;
 import java.util.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 import org.jfree.chart.ChartPanel;
 import org.jfree.chart.JFreeChart;
index e87fea90317a2f7a91f3568a66b65888feba2602..1b4751b924c35dba49ecb491471473ce0fecd1ba 100644 (file)
@@ -21,8 +21,8 @@ import java.util.*;
 import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class TeleGPSInfo extends AltosUIFlightTab {
 
index 8bd371f4b86eb589955ead56ce9180fb220375d5..2738ceea687084ebffb7d1337026866b94f3a609 100644 (file)
@@ -22,7 +22,7 @@ import java.awt.event.*;
 import java.beans.*;
 import javax.swing.*;
 import javax.swing.event.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class TeleGPSPreferences
        extends AltosUIConfigure
index a76182ed0e74c07bedcf9752822f11cf2c84b443..27321c73b3566ebe7428d040ac025baa24ae9f24 100644 (file)
@@ -21,8 +21,8 @@ import java.util.*;
 import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class TeleGPSState extends AltosUIFlightTab {
 
index f3951a37544dbc80d900024f3d78adb87adf49df..1d4415d6064d400444891ea769c3a0643a3ac0ea 100644 (file)
@@ -19,8 +19,8 @@ package org.altusmetrum.telegps;
 
 import java.awt.*;
 import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
 
 public class TeleGPSStatus extends JComponent implements AltosFlightDisplay {
        GridBagLayout   layout;
index e7684d88f86c46eea427070014ee6e58a1576bca..3d2b7f348670f30cbdad7caff44432936d9b12f4 100644 (file)
@@ -18,7 +18,7 @@
 package org.altusmetrum.telegps;
 
 import java.awt.event.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
 
 public class TeleGPSStatusUpdate implements ActionListener {
 
diff --git a/telegps/altusmetrum-telegps.desktop.in b/telegps/altusmetrum-telegps.desktop.in
new file mode 100644 (file)
index 0000000..7a1b353
--- /dev/null
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Type=Application
+Name=TeleGPS
+GenericName=TeleGPS monitor, download and analysis
+Comment=View and log data from TeleGPS tracking devices
+Icon=%icondir%/altusmetrum-telegps.svg
+Exec=%bindir%/telegps %f
+Terminal=false
+MimeType=application/vnd.altusmetrum.telemetry;application/vnd.altusmetrum.eeprom
+Categories=Education;Electronics;Science;
index e6798c46783cba7cd9fe6bbc311e28c33df5e169..603d4971faf6ca5e93d2a01340790c665367092a 100644 (file)
@@ -1,19 +1,25 @@
 !addplugindir ../altosui/Instdrv/NSIS/Plugins
+!addincludedir ../altosui/Instdrv/NSIS/Includes
 !include x64.nsh
-; Definitions for Java 1.7 Detection
-!define JRE_VERSION "1.7"
-!define JRE_ALTERNATE "1.6"
-!define JRE32_URL "http://javadl.sun.com/webapps/download/AutoDL?BundleId=83383&/jre-7u51-windows-i586.exe"
-!define JRE64_URL "http://javadl.sun.com/webapps/download/AutoDL?BundleId=83385&/jre-7u51-windows-x64.exe"
-!define PRODUCT_NAME "TeleGPS Windows Software"
+!include java.nsh
+!include refresh-sh.nsh
 
-Name "TeleGPS Installer"
+!define REG_NAME       "TeleGPS"
+!define PROG_ID_TELEM  "altusmetrum.telegps.telem.1"
+!define PROG_ID_EEPROM "altusmetrum.telegps.eeprom.1"
+!define FAT_NAME       "telegps-fat.jar"
+!define WIN_APP_ICON   "altusmetrum-telegps.ico"
+!define WIN_APP_EXE    "altusmetrum-telegps.exe"
+!define WIN_TELEM_EXE  "application-vnd.altusmetrum.telemetry.exe"
+!define WIN_EEPROM_EXE "application-vnd.altusmetrum.eeprom.exe"
+
+Name "${REG_NAME} Installer"
 
 ; Default install directory
 InstallDir "$PROGRAMFILES\AltusMetrum"
 
 ; Tell the installer where to re-install a new version
-InstallDirRegKey HKLM "Software\AltusMetrum" "Install_Dir"
+InstallDirRegKey HKLM "Software\${REG_NAME}" "Install_Dir"
 
 LicenseText "GNU General Public License Version 2"
 LicenseData "../COPYING"
@@ -23,7 +29,7 @@ RequestExecutionLevel admin
 
 ShowInstDetails Show
 
-ComponentText "TeleGPS Software Installer"
+ComponentText "${REG_NAME} Software and Driver Installer"
 
 Function .onInit
        DetailPrint "Checking host operating system"
@@ -35,43 +41,14 @@ Function .onInit
        ${EndIf}
 FunctionEnd
 
-Var JavaDownload
-Var JavaBits
-
-Function GetJRE
+Function un.onInit
+       DetailPrint "Checking host operating system"
        ${If} ${RunningX64}
-          StrCpy $JavaDownload ${JRE64_URL}
-          StrCpy $JavaBits "64"
-       ${Else}
-          StrCpy $JavaDownload ${JRE32_URL}
-          StrCpy $JavaBits "32"
+               DetailPrint "Installer running on 64-bit host"
+               SetRegView 64
+               StrCpy $INSTDIR "$PROGRAMFILES64\AltusMetrum"
+               ${DisableX64FSRedirection}
        ${EndIf}
-
-        MessageBox MB_OK "${PRODUCT_NAME} uses Java ${JRE_VERSION}, \
-                       $JavaBits bits, it will now \
-                        be downloaded and installed"
-
-        StrCpy $2 "$TEMP\Java Runtime Environment.exe"
-        nsisdl::download /TIMEOUT=30000 $JavaDownload $2
-        Pop $R0 ;Get the return value
-                StrCmp $R0 "success" +3
-                MessageBox MB_OK "Download failed: $R0"
-                Quit
-        ExecWait $2
-        Delete $2
-FunctionEnd
-
-Function DetectJRE
-  ReadRegStr $2 HKLM "SOFTWARE\JavaSoft\Java Runtime Environment" \
-             "CurrentVersion"
-
-  StrCmp $2 ${JRE_VERSION} done
-
-  StrCmp $2 ${JRE_ALTERNATE} done
-
-  Call GetJRE
-
-  done:
 FunctionEnd
 
 ; Pages to present
@@ -109,12 +86,12 @@ done:
 
 SectionEnd
 
-Section "TeleGPS Application"
+Section "${REG_NAME} Application"
        Call DetectJRE
 
        SetOutPath $INSTDIR
 
-       File "telegps-fat.jar"
+       File "${FAT_NAME}"
        File "altoslib_@ALTOSLIB_VERSION@.jar"
        File "altosuilib_@ALTOSUILIB_VERSION@.jar"
        File "cmudict04.jar"
@@ -129,13 +106,13 @@ Section "TeleGPS Application"
 
        File "*.dll"
 
-       File "../icon/*.ico"
+       File "../icon/${WIN_APP_ICON}"
 
-       CreateShortCut "$SMPROGRAMS\TeleGPS.lnk" "$SYSDIR\javaw.exe" "-jar telegps-fat.jar" "$INSTDIR\telegps.ico"
+       CreateShortCut "$SMPROGRAMS\${REG_NAME}.lnk" "$SYSDIR\javaw.exe" "-jar ${FAT_NAME}" "$INSTDIR\${WIN_APP_ICON}"
 SectionEnd
 
-Section "TeleGPS Desktop Shortcut"
-       CreateShortCut "$DESKTOP\TeleGPS.lnk" "$INSTDIR\telegps-fat.jar"  "" "$INSTDIR\telegps.ico"
+Section "${REG_NAME} Desktop Shortcut"
+       CreateShortCut "$DESKTOP\${REG_NAME}.lnk" "$INSTDIR\${FAT_NAME}"  "" "$INSTDIR\${WIN_APP_ICON}"
 SectionEnd
 
 Section "TeleGPS, TeleDongle and TeleBT Firmware"
@@ -157,38 +134,105 @@ Section "Documentation"
        File "../doc/telemetry.pdf"
 SectionEnd
 
+Section "File Associations"
+
+       ${DisableX64FSRedirection}
+
+       SetOutPath $INSTDIR
+
+       File "../icon/${WIN_APP_EXE}"
+       File "../icon/${WIN_TELEM_EXE}"
+       File "../icon/${WIN_EEPROM_EXE}"
+
+       DeleteRegKey HKCR "${PROG_ID_TELEM}"
+       DeleteRegKey HKCR "${PROG_ID_EEPROM}"
+
+       DeleteRegKey   HKCR ".eeprom\${PROG_ID_EEPROM}"
+       DeleteRegValue HKCR ".eeprom\OpenWithProgids" "${PROG_ID_EEPROM}"
+       DeleteRegKey   HKCR ".telem\${PROG_ID_EEPROM}"
+       DeleteRegValue HKCR ".telem\OpenWithProgids" "${PROG_ID_EEPROM}"
+
+       ; .eeprom elements
+
+       WriteRegStr HKCR "${PROG_ID_EEPROM}"            ""                              "Altus Metrum Log File"
+       WriteRegStr HKCR "${PROG_ID_EEPROM}"            "FriendlyTypeName"              "Altus Metrum Log File"
+       WriteRegStr HKCR "${PROG_ID_EEPROM}\CurVer"     ""                              "${PROG_ID_EEPROM}"
+       WriteRegStr HKCR "${PROG_ID_EEPROM}\DefaultIcon" ""                             '"$INSTDIR\${WIN_EEPROM_EXE}",-101'
+  WriteRegExpandStr HKCR "${PROG_ID_EEPROM}\shell\open\command" ""                     '"%SYSTEMROOT%\System32\javaw.exe" -Djava.library.path="$INSTDIR" -jar "$INSTDIR\${FAT_NAME}" "%1"'
+
+       WriteRegStr HKCR ".eeprom"                      ""                              "${PROG_ID_EEPROM}"
+       WriteRegStr HKCR ".eeprom"                      "PerceivedType"                 "Altus Metrum Log File"
+       WriteRegStr HKCR ".eeprom"                      "Content Type"                  "application/vnd.altusmetrum.eeprom"
+
+       WriteRegStr HKCR ".eeprom\OpenWithProgids"      "${PROG_ID_EEPROM}"             ""
+       WriteRegStr HKCR ".eeprom\${PROG_ID_EEPROM}"    ""                              "${REG_NAME}"
+       
+       ; .telem elements
+       
+       WriteRegStr HKCR "${PROG_ID_TELEM}"             ""                              "Altus Metrum Telemetry File"
+       WriteRegStr HKCR "${PROG_ID_TELEM}"             "FriendlyTypeName"              "Altus Metrum Telemetry File"
+       WriteRegStr HKCR "${PROG_ID_TELEM}\CurVer"      ""                              "${PROG_ID_TELEM}"
+       WriteRegStr HKCR "${PROG_ID_TELEM}\DefaultIcon" ""                              '"$INSTDIR\${WIN_TELEM_EXE}",-101'
+  WriteRegExpandStr HKCR "${PROG_ID_TELEM}\shell\open\command" ""                      '"%SYSTEMROOT%\System32\javaw.exe" -Djava.library.path="$INSTDIR" -jar "$INSTDIR\${FAT_NAME}" "%1"'
+
+       WriteRegStr HKCR ".telem"                       ""                              "${PROG_ID_TELEM}"
+       WriteRegStr HKCR ".telem"                       "PerceivedType"                 "Altus Metrum Telemetry File"
+       WriteRegStr HKCR ".telem"                       "Content Type"                  "application/vnd.altusmetrum.telemetry"
+
+       WriteRegStr HKCR ".telem\OpenWithProgids"       "${PROG_ID_TELEM}"              ""
+       WriteRegStr HKCR ".telem\${PROG_ID_TELEM}"      ""                              "${REG_NAME}"
+
+       Call RefreshShellIcons
+SectionEnd
+       
 Section "Uninstaller"
 
        ; Deal with the uninstaller
 
+       ${DisableX64FSRedirection}
        SetOutPath $INSTDIR
 
        ; Write the install path to the registry
-       WriteRegStr HKLM SOFTWARE\AltusMetrum "Install_Dir" "$INSTDIR"
+       WriteRegStr HKLM "SOFTWARE\${REG_NAME}" "Install_Dir" "$INSTDIR"
 
        ; Write the uninstall keys for windows
-       WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\AltusMetrum" "DisplayName" "Altus Metrum"
-       WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\AltusMetrum" "UninstallString" '"$INSTDIR\uninstall.exe"'
-       WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\AltusMetrum" "NoModify" "1"
-       WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\AltusMetrum" "NoRepair" "1"
+       WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${REG_NAME}" "DisplayName" "${REG_NAME}"
+       WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${REG_NAME}" "UninstallString" '"$INSTDIR\uninstall-${REG_NAME}.exe"'
+       WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${REG_NAME}" "NoModify" "1"
+       WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${REG_NAME}" "NoRepair" "1"
 
-       WriteUninstaller "uninstall.exe"
+       WriteUninstaller "uninstall-${REG_NAME}.exe"
 SectionEnd
 
 Section "Uninstall"
-       DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\AltusMetrum"
-       DeleteRegKey HKLM "Software\AltusMetrum"
 
-       Delete "$INSTDIR\*.*"
-       RMDir "$INSTDIR"
+       ${DisableX64FSRedirection}
 
-       ; Remove devices
-       InstDrv::InitDriverSetup /NOUNLOAD {4D36E96D-E325-11CE-BFC1-08002BE10318} AltusMetrumSerial
-       InstDrv::DeleteOemInfFiles /NOUNLOAD
-       InstDrv::RemoveAllDevices
+       DeleteRegKey   HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${REG_NAME}"
+       DeleteRegKey   HKLM "SOFTWARE\${REG_NAME}"
+
+       DetailPrint "Delete uninstall reg entries"
+
+       DeleteRegKey   HKCR "${PROG_ID_EEPROM}"
+       DeleteRegKey   HKCR "${PROG_ID_TELEM}"
+
+       DeleteRegKey   HKCR ".eeprom\${PROG_ID_EEPROM}"
+       DeleteRegValue HKCR ".eeprom\OpenWithProgids" "${PROG_ID_EEPROM}"
+
+       DeleteRegKey   HKCR ".telem\${PROG_ID_TELEM}"
+       DeleteRegValue HKCR ".telem\OpenWithProgids" "${PROG_ID_TELEM}"
+
+       DetailPrint "Delete file association reg entries"
+
+       Delete "$INSTDIR\${FAT_NAME}"
+       Delete "$INSTDIR\uninstall-${REG_NAME}.exe"
+
+       Delete "$INSTDIR\${WIN_APP_ICON}"
+       Delete "$INSTDIR\${WIN_APP_EXE}"
 
        ; Remove shortcuts, if any
-       Delete "$SMPROGRAMS\TeleGPS.lnk"
-       Delete "$DESKTOP\TeleGPS.lnk"
+       Delete "$SMPROGRAMS\${REG_NAME}.lnk"
+       Delete "$DESKTOP\${REG_NAME}.lnk"
        
+       Call un.RefreshShellIcons
 SectionEnd
diff --git a/telegps/telegps.desktop.in b/telegps/telegps.desktop.in
deleted file mode 100644 (file)
index 3d249d8..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-[Desktop Entry]
-Type=Application
-Name=TeleGPS
-GenericName=TeleGPS monitor, download and analysis
-Comment=View and log data from TeleGPS tracking devices
-Icon=%icondir%/telegps.svg
-Exec=%bindir%/telegps %f
-Terminal=false
-MimeType=text/plain;
-Categories=Education;Electronics;Science;