]>
git.gag.com Git - fw/altos/log
Keith Packard [Wed, 18 Dec 2013 22:22:51 +0000 (14:22 -0800)]
micropeak: Compile for java 6
Don't a require later version as not all target OSes support it
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Wed, 18 Dec 2013 22:08:41 +0000 (14:08 -0800)]
Move pdclib build results to pdclib-root
This makes pdclib easier to manage as a submodule
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Wed, 18 Dec 2013 21:36:04 +0000 (13:36 -0800)]
altosui: Remove some debug printfs
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Wed, 18 Dec 2013 21:25:31 +0000 (13:25 -0800)]
altosdroid: Use altoslib standard voltages to control lights
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Wed, 18 Dec 2013 21:22:45 +0000 (13:22 -0800)]
altoslib: Define 3.8 as a good battery and 3.5 as a good igniter
Use defined values everywhere instead of copying. Adjust battery up to
3.8 to ensure there's enough voltage to not trip the comparators
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Wed, 18 Dec 2013 21:09:48 +0000 (13:09 -0800)]
altoslib: create eeprom download thread before telling monitor about it
Telling the monitor too early resulted in passing a null thread
handle, which meant that 'cancel' wouldn't ever work.
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Wed, 18 Dec 2013 20:40:22 +0000 (12:40 -0800)]
altoslib: Don't close telemetry reader at startup unless something fails
Was always closing the file, which led to very little telemetry being received.
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Wed, 18 Dec 2013 20:16:55 +0000 (12:16 -0800)]
libaltos: Import newly build libaltos.dylib
Keith Packard [Wed, 18 Dec 2013 20:15:54 +0000 (12:15 -0800)]
libaltos: remove usb id filtering from darwin code
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Wed, 18 Dec 2013 20:15:22 +0000 (12:15 -0800)]
libaltos: fix test harness main type
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Wed, 18 Dec 2013 19:25:05 +0000 (11:25 -0800)]
altosui: Add docs to Mac OS X dmg distribution
Signed-off-by: Keith Packard <keithp@keithp.com>
Bdale Garbee [Wed, 18 Dec 2013 19:19:31 +0000 (12:19 -0700)]
Merge branch 'master' of ssh://git.gag.com/scm/git/fw/altos
Bdale Garbee [Wed, 18 Dec 2013 19:18:30 +0000 (12:18 -0700)]
a fresher changelog entry for test builds
Bdale Garbee [Wed, 18 Dec 2013 18:08:55 +0000 (11:08 -0700)]
need to include the Cortex toolchain
Keith Packard [Wed, 18 Dec 2013 19:14:40 +0000 (11:14 -0800)]
fix git: path for pdclib
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Wed, 18 Dec 2013 19:12:44 +0000 (11:12 -0800)]
Use git: path for pdclib
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Wed, 18 Dec 2013 19:08:11 +0000 (11:08 -0800)]
Ignore .dll files in libaltos
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Wed, 18 Dec 2013 19:07:55 +0000 (11:07 -0800)]
ao-tools: complain if st-flash is not available
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Wed, 18 Dec 2013 18:55:06 +0000 (10:55 -0800)]
altos: get stm-bringup building again
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Wed, 18 Dec 2013 18:53:09 +0000 (10:53 -0800)]
Remove stale stm test apps from regular build
Keith Packard [Wed, 18 Dec 2013 18:50:45 +0000 (10:50 -0800)]
altos/stm: Update pdclib paths for flash-loader builds
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Wed, 18 Dec 2013 18:43:16 +0000 (10:43 -0800)]
altos: create target pdclib directories before building
Keith Packard [Wed, 18 Dec 2013 18:01:29 +0000 (10:01 -0800)]
altos: Build pdclib locally if necessary
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Wed, 18 Dec 2013 17:59:33 +0000 (09:59 -0800)]
include pdclib in wrong place
Keith Packard [Wed, 18 Dec 2013 10:03:15 +0000 (02:03 -0800)]
altosui: Hide non-applicable altimeter config values
This makes configuring EasyMini a lot easier...
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Wed, 18 Dec 2013 10:02:12 +0000 (02:02 -0800)]
altos/lpc: Be a bit more resistant to toolchain section name changes
Just add some wild cards on the ends of each section name in case the
toolchain changes names in the future.
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Wed, 18 Dec 2013 09:14:11 +0000 (01:14 -0800)]
altoslib: Pass InterruptedException up the stack instead of hiding it
When interrupting a thread that is talking to a serial device, it's
important not to have that thread discard the InterruptedException so
that it will actually terminate. This patch removes a bunch of places
that were discarding InterruptedExceptions and lets higher level code
see them so that they can exit cleanly.
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Wed, 18 Dec 2013 09:12:11 +0000 (01:12 -0800)]
altos: Make TeleMega v0.1 work more like TeleMega v1.0
I've still got one working v0.1 board which is useful for testing
stuff, so make it work more like the released TeleMega:
* Use E for drogue, F for main
* Use on-chip eeprom for config
* Fix ADC report printf to match
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Wed, 18 Dec 2013 07:50:54 +0000 (23:50 -0800)]
altos: Use all 16 bits of setup packet len when limiting reply len
We were only using the low 8 bits of the setup packet reply max len,
which meant that if the other side sent a weird max len (as Windows 7
does), then we'd truncate our setup reply to whatever was in the low 8
bits of that value.
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Wed, 18 Dec 2013 06:53:45 +0000 (22:53 -0800)]
altosui: Add EasyMini bits to fat distribution images. Update telemetrum.inf
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Wed, 18 Dec 2013 04:24:19 +0000 (20:24 -0800)]
doc: Publish images with HTML bits
Otherwise the html won't render right.
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Wed, 18 Dec 2013 04:23:00 +0000 (20:23 -0800)]
altos: Broke TeleMetrum GPS reporting by holding the GPS mutex too much
We can't hold the GPS mutex while waiting for the GPS receiver to load
data as it protects the GPS data with the GPS mutex.
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Wed, 18 Dec 2013 04:05:12 +0000 (20:05 -0800)]
doc: Add screen shots everywhere
This has screen shots of every dialog in altosui
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Wed, 18 Dec 2013 01:37:39 +0000 (17:37 -0800)]
Add altosui image and attempt to add launch photo to title
Bdale Garbee [Tue, 17 Dec 2013 21:53:59 +0000 (14:53 -0700)]
further documentation tweaks
Bdale Garbee [Tue, 17 Dec 2013 21:09:30 +0000 (14:09 -0700)]
Merge branch 'master' of ssh://git.gag.com/scm/git/fw/altos
Conflicts:
doc/altusmetrum.xsl
Bdale Garbee [Tue, 17 Dec 2013 21:08:12 +0000 (14:08 -0700)]
capture my changes so far
Keith Packard [Tue, 17 Dec 2013 19:38:46 +0000 (11:38 -0800)]
doc: Add product pictures to manual
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Tue, 17 Dec 2013 19:19:54 +0000 (11:19 -0800)]
Keep tables together on a page
Keith Packard [Tue, 17 Dec 2013 18:33:29 +0000 (10:33 -0800)]
doc: Convert several more itemizedlists to variablelists
When defining a term, use variablelist to pull the term out to the left.
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Tue, 17 Dec 2013 05:21:24 +0000 (21:21 -0800)]
Clean up reflashing section, include section on self-flash recovery
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Sat, 14 Dec 2013 19:47:31 +0000 (11:47 -0800)]
ao-tools: Use st-flash for STM flashing instead of openocd
st-flash, from the stlink tools, appears more reliable when flashing
STM CPUs.
Signed-off-by: Keith Packard <keithp@keithp.com>
Bdale Garbee [Sat, 14 Dec 2013 19:16:03 +0000 (12:16 -0700)]
add serial number to ao-usbload call, pass SERIAL to cal-freq
Bdale Garbee [Sat, 14 Dec 2013 01:37:29 +0000 (18:37 -0700)]
temporarily force stlink location in debian/rules to allow complete build
Keith Packard [Tue, 10 Dec 2013 08:54:32 +0000 (00:54 -0800)]
java: Missed libaltos java compile flags from previous patch
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Tue, 10 Dec 2013 08:51:01 +0000 (00:51 -0800)]
java: Add -target 1.6 to all java compiles
This makes sure the results can run with the old JVM
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Tue, 10 Dec 2013 08:39:52 +0000 (00:39 -0800)]
altos: Remove ARM .ihx files on 'make clean'
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Tue, 10 Dec 2013 08:03:20 +0000 (00:03 -0800)]
Set version to 1.3 in preparation for release
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Tue, 10 Dec 2013 08:00:31 +0000 (00:00 -0800)]
doc: More altusmetrum.xsl updates for 1.3
Spell checking even
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Tue, 10 Dec 2013 07:16:13 +0000 (23:16 -0800)]
debian: .ihx and .map files are left in subdirs now
Install them from the right place
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Tue, 10 Dec 2013 07:14:55 +0000 (23:14 -0800)]
altosui: Ship TeleMega-v1.0 firmware
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Tue, 10 Dec 2013 07:12:40 +0000 (23:12 -0800)]
ao-bringup: Add turnon_telemega script
And a few helper programs
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Tue, 10 Dec 2013 00:06:22 +0000 (16:06 -0800)]
altos: Rename telemega-v0.3 to telemega-v1.0
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Mon, 9 Dec 2013 05:08:36 +0000 (21:08 -0800)]
altos: Oops. Was only filling out part of the TeleMetrum ADC record
Because it's missing a return, we'd end up filling out one element of
the ADC record per interrupt, and rotating through which one was set,
hitting all of the even offsets within the struct. Yikes!
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Mon, 9 Dec 2013 05:07:17 +0000 (21:07 -0800)]
altosui: When flashing to TeleDongle or TeleBT, match any .ihx file
Let the user pick any .ihx file when using a device which can only be
used as a pair programmer. Note that 'telemetrum' can be either, and
we'll assume that it's a self-programmed device (v2) for now.
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Mon, 9 Dec 2013 04:34:11 +0000 (20:34 -0800)]
altosui: Match directories in hex file matcher
This makes it possible to navigate around the file system
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Mon, 9 Dec 2013 04:33:22 +0000 (20:33 -0800)]
altoslib: Don't require radio_cal or usb_descriptors in AltosRomconfig
Not all products will have these values, so allow them to be missing
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Mon, 9 Dec 2013 04:11:46 +0000 (20:11 -0800)]
Add new tools to .gitignore
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Mon, 9 Dec 2013 04:09:10 +0000 (20:09 -0800)]
altoslib: Add self-flashing code
This adds the ability to use the AltOS flash-loader on both STM and
NXP processors.
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Mon, 9 Dec 2013 04:07:23 +0000 (20:07 -0800)]
altoslib: Add AltosNoSymbol exception
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Mon, 9 Dec 2013 04:04:43 +0000 (20:04 -0800)]
altoslib: Use symbols in AltosRomconfig instead of fixed offsets
The new Hexfile symbol code automatically adds the needed romconfig
symbols for cc1111 products, and ARM-based products have symbols in
the .ihx files. This means that we can rely on using symbols when
finding config values in memory.
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Mon, 9 Dec 2013 03:59:37 +0000 (19:59 -0800)]
altosuilib: Don't match product_altusmetrum for product_basestation or product_altimeter
It's been years since we've shipped boards configured with
product_altusmetrum, but now we've repurposed that code for the flash
loader. When matching an explicit product, go ahead and also match
altusmetrum so that the flash loader will fit, but when matching
basestation or altimeter, don't as that will avoid popping up the
flight monitor UI at startup when a board is running the boot loader.
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Mon, 9 Dec 2013 03:48:27 +0000 (19:48 -0800)]
altoslib: Publish mapping from product name back to USB id
This lets us choose which device to flash based on the filename
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Mon, 9 Dec 2013 03:47:44 +0000 (19:47 -0800)]
altoslib: Create AltosProgrammer class
This provides an abstract interface to flashing boards, for
dongle-based and self-programming boards.
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Mon, 9 Dec 2013 03:46:30 +0000 (19:46 -0800)]
altoslib: Add symbols to .ihx files
Create a new 0xfe record type to hold the symbols, and append them
after the EOF record so that other tools might continue to work.
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Mon, 9 Dec 2013 03:43:13 +0000 (19:43 -0800)]
altoslib: Support binary reading/writing in AltosLink
Binary reads require an explicit length, and do not work while
telemetry is running.
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Mon, 9 Dec 2013 03:05:01 +0000 (19:05 -0800)]
altos/stm: arm-none-eabi-binutils now puts 'main' into .text.startup
Change name of .text.ram to .ramtext, then load .text* into flash and
.ramtext into ram. This ensures that 'main' and anything else in a
random .text.* segment will get loaded into flash as appropriate.
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Mon, 9 Dec 2013 03:04:11 +0000 (19:04 -0800)]
ao-tools: build ao-usbload by default
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Sun, 8 Dec 2013 19:41:09 +0000 (11:41 -0800)]
altoslib: AltosEepromMonitor had false import of altosuilib
Not needed, and breaks the build
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Sun, 8 Dec 2013 19:17:28 +0000 (11:17 -0800)]
altos: remove all versions of stm-demo executable
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Sun, 8 Dec 2013 19:15:37 +0000 (11:15 -0800)]
altos: Change flash loader name to just AltosFlash
Remove the software version string from the product name
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Sun, 8 Dec 2013 19:14:29 +0000 (11:14 -0800)]
altos: Build .ihx files for all arm projects
The .ihx version can be processed by the java loader
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Sun, 8 Dec 2013 19:11:41 +0000 (11:11 -0800)]
altos: Allow products to override default 100mA USB current
This will allow products to specify their own current limit.
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Sun, 8 Dec 2013 19:10:00 +0000 (11:10 -0800)]
ao-tools: Clean up ao-stmload and ao-usbload options. Add --raw
ao-stmload only uses stlink, ao-usbload only uses self-flashing, so
clear up the options in the two programs. The new --raw option skips
the serial and radio cal rewriting when flashing the boot loader.
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Sun, 8 Dec 2013 19:07:46 +0000 (11:07 -0800)]
ao-tools: Allow building without stlink and readline
This adds --without-stlink and --without-readline options to configure
to disable these features, and adjusts the build process and code to
handle that.
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Sun, 8 Dec 2013 07:27:30 +0000 (23:27 -0800)]
ao-tools: Add ao-flash-stm and ao-flash-lpc scripts
These use openocd to download boot loaders to the arm-based products
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Sat, 7 Dec 2013 17:54:17 +0000 (09:54 -0800)]
altosuilib: Deal with AltosUnits API change
The abstract methods in AltosUnits now pass the 'imperial_units' flag
explicitly, so deal with that in AltosUnits itself
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Sat, 7 Dec 2013 17:53:10 +0000 (09:53 -0800)]
altosui: Clean up serial close handling
Unify serial close processing in a single function (close_serial),
make everyone else call that. This avoids a couple of cases where the
device would be closed and not removed from the devices_opened list,
leading to 'device is already in use' messages.
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Sat, 7 Dec 2013 17:51:58 +0000 (09:51 -0800)]
altosui: Don't try to report bearing/elevation without GPS
If the distance from the pad cannot be computed (due to lacking GPS),
then don't try to report it.
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Sat, 7 Dec 2013 17:49:00 +0000 (09:49 -0800)]
altos: Nothing in altos uses AES decryption, so don't compile it
Saves a bit of space where AES is used, and avoids some compiler warnings.
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Sat, 7 Dec 2013 17:47:45 +0000 (09:47 -0800)]
altos/test: Compute and plot tilt based on GPS track
This lets us compare the gyro-computed tilt angle against the actual
flight path.
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Sat, 7 Dec 2013 17:40:53 +0000 (09:40 -0800)]
altos: Telemega uses eeprom, include it in main file
ao_telemega.c didn't include ao_eeprom.h leaving a function undefined
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Sat, 7 Dec 2013 17:39:41 +0000 (09:39 -0800)]
altos: Add lots more GPS data to mega log
There's plenty of space in the GPS log packets to hold course, speed,
climb and DOP values, so just stick them in.
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Sat, 7 Dec 2013 17:38:50 +0000 (09:38 -0800)]
src/cc1111: Turn off RC osc after xtal is running
There's no reason to keep running the RC oscillator after we switch to
the crystal, so turn it off.
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Thu, 28 Nov 2013 23:21:26 +0000 (15:21 -0800)]
doc: First pass for 1.3 finished; docs have most major sections updated.
Final edits and corrections still required.
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Thu, 28 Nov 2013 18:44:07 +0000 (10:44 -0800)]
ao-tools: Split out USB loader to ao-usbload
Leave ao-stmload using just stlinkv2
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Thu, 28 Nov 2013 18:31:32 +0000 (10:31 -0800)]
ao-tools: Split out altos symbol editing from ao-stmload
to be shared with ao-usbload
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Thu, 28 Nov 2013 17:52:38 +0000 (09:52 -0800)]
ao-tools: Missing ao-selfload.h
Keith Packard [Thu, 28 Nov 2013 17:52:01 +0000 (09:52 -0800)]
ao-tools: move 16/32-bit readers from ao-stmload to lib
Keith Packard [Thu, 28 Nov 2013 17:46:13 +0000 (09:46 -0800)]
ao-tools: Move ao-selfload into library
This needs to be shared between ao-stmload and ao-usbload
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Thu, 28 Nov 2013 17:31:02 +0000 (09:31 -0800)]
ao-tools: Add ao-elftohex and .ihx symbol support
ao-elftohex converts an elf file into a hex file so that we can load
it with java.
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Thu, 28 Nov 2013 17:29:52 +0000 (09:29 -0800)]
ao-tools: Add debug printf support
Keith Packard [Wed, 27 Nov 2013 21:59:06 +0000 (13:59 -0800)]
ao-tools: Create general elf and hex library routines
Pulls the elf stuff out of ao-stmload, change the hex stuff into ao_
routines.
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Mon, 25 Nov 2013 09:15:36 +0000 (01:15 -0800)]
doc: Work on AltosUI Pyro config docs a bit more.
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Mon, 25 Nov 2013 08:02:06 +0000 (00:02 -0800)]
altosui: Handle units in pyro config.
This lets you edit the pyro configuration using imperial units if
desired.
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Mon, 25 Nov 2013 08:01:20 +0000 (00:01 -0800)]
doc: Add telemetry enable and APRS interval config docs
Also starts working on the pyro channel config window docs
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Mon, 25 Nov 2013 05:55:20 +0000 (21:55 -0800)]
doc: use correct quotes in altusmetrum.xsl
Signed-off-by: Keith Packard <keithp@keithp.com>
Keith Packard [Mon, 25 Nov 2013 05:50:27 +0000 (21:50 -0800)]
doc: "rocketry electronics" instead of listing products
Keith Packard [Mon, 25 Nov 2013 05:28:26 +0000 (21:28 -0800)]
Use more 1/4 single characters
Keith Packard [Mon, 25 Nov 2013 05:25:06 +0000 (21:25 -0800)]
Remove duplicate log description. Describe pyro config.
Signed-off-by: Keith Packard <keithp@keithp.com>