Tilman Sauerbeck [Sun, 19 Jan 2020 11:16:48 +0000 (12:16 +0100)]
application: Show distance travelled while recording.
Tilman Sauerbeck [Sun, 19 Jan 2020 18:57:42 +0000 (19:57 +0100)]
common: Implement TimeAndPos::distance_cm().
Calculates the distance between two points in cm.
Tilman Sauerbeck [Sun, 19 Jan 2020 11:20:16 +0000 (12:20 +0100)]
common: Store GPS coordinates in radians, too.
Use the Q15.49 fixed point format to store those values.
Tilman Sauerbeck [Sun, 19 Jan 2020 11:24:07 +0000 (12:24 +0100)]
common: Add the fixed15_49 module.
Implements Q15.49 fixed point math.
Tilman Sauerbeck [Sat, 18 Jan 2020 18:51:02 +0000 (19:51 +0100)]
test: Order arguments to assert_eq!() consistently.
The expected value comes first.
Tilman Sauerbeck [Mon, 13 Jan 2020 07:27:02 +0000 (08:27 +0100)]
common: Include the recordings' size in the listing.
The size is only approximate (i.e. multiples of sectors used).
Tilman Sauerbeck [Sun, 12 Jan 2020 11:56:56 +0000 (12:56 +0100)]
common: Avoid duplicated recordings shown in Logger::list_recordings().
This is achieved by simplifying the way we sort our sector indices,
which unfortunately also comes with a performance hit.
Tilman Sauerbeck [Sun, 12 Jan 2020 09:41:40 +0000 (10:41 +0100)]
common: Use slice.swap() to clean up SectorHeaderIter::sort().
Tilman Sauerbeck [Sun, 12 Jan 2020 09:28:58 +0000 (10:28 +0100)]
common: Factor out the SectorHeaderIter::sort() method.
Tilman Sauerbeck [Sat, 11 Jan 2020 13:18:53 +0000 (14:18 +0100)]
test: Verify Logger::list_recordings()'s behavior with empty storage.
We expect no output in that case.
Tilman Sauerbeck [Sat, 11 Jan 2020 10:33:22 +0000 (11:33 +0100)]
test: Make Logger test's pipe non-blocking.
There are cases where we need to verify that the pipe is empty.
Tilman Sauerbeck [Sat, 11 Jan 2020 09:43:51 +0000 (10:43 +0100)]
test: Add a first test for Logger::list_recordings().
Tilman Sauerbeck [Fri, 10 Jan 2020 10:31:34 +0000 (11:31 +0100)]
tools: Import the gpxify program.
gpxify takes as input an recording retrieved from the GPS watch
and converts it to GPX format.
Tilman Sauerbeck [Fri, 10 Jan 2020 09:11:51 +0000 (10:11 +0100)]
tools: Add license header to update-firmware.
Tilman Sauerbeck [Thu, 9 Jan 2020 22:40:50 +0000 (23:40 +0100)]
common: Implement the "ls" shell command.
Shows a listing of the stored recordings.
Tilman Sauerbeck [Thu, 9 Jan 2020 22:40:23 +0000 (23:40 +0100)]
common: Implement Logger::list_recordings().
Tilman Sauerbeck [Fri, 10 Jan 2020 22:17:27 +0000 (23:17 +0100)]
common: Make Logger::read_sector_header() read the start_time field.
This is necessary so that we can show the date and time when a
recording was done.
Tilman Sauerbeck [Fri, 10 Jan 2020 22:20:28 +0000 (23:20 +0100)]
test: Use a pipe to back the write buffer for the Logger test.
Tilman Sauerbeck [Thu, 9 Jan 2020 20:19:57 +0000 (21:19 +0100)]
common: Silence compiler warnings about ignored Result return values.
Note that we still don't handle potential errors from Storage::write().
Tilman Sauerbeck [Thu, 9 Jan 2020 14:18:25 +0000 (15:18 +0100)]
common: Implement the "get" shell command.
Retrieves a recording in yenc format.
Tilman Sauerbeck [Thu, 9 Jan 2020 14:14:40 +0000 (15:14 +0100)]
application: Start and stop recordings by pressing the play button.
Tilman Sauerbeck [Thu, 9 Jan 2020 14:14:13 +0000 (15:14 +0100)]
common: Implement Logger::has_recording().
Tilman Sauerbeck [Thu, 9 Jan 2020 13:25:12 +0000 (14:25 +0100)]
contrib: Add udev rules file.
Tilman Sauerbeck [Thu, 9 Jan 2020 11:42:53 +0000 (12:42 +0100)]
common: Add missing Write Enable command to Mx25L::program_page().
Without a write enable, the flash memory doesn't take our data.
Tilman Sauerbeck [Thu, 9 Jan 2020 11:05:07 +0000 (12:05 +0100)]
application: Set up a Logger instance.
This also passes a mutable Logger reference to Shell::update()
since we no longer can pass another mutable Storage reference to it:
doing so would break the requirement of only having one
mutable reference to any instance at any time, and Logger requires
a mutable storage reference, too.
Tilman Sauerbeck [Thu, 9 Jan 2020 11:03:07 +0000 (12:03 +0100)]
common: Make Logger::storage public.
This is required to avoid some multiple mutable borrow issues
in the upcoming changesets.
Tilman Sauerbeck [Thu, 9 Jan 2020 10:39:54 +0000 (11:39 +0100)]
common: Implement Logger::get_recording().
Tilman Sauerbeck [Thu, 9 Jan 2020 10:02:21 +0000 (11:02 +0100)]
common: Synchronize sector headers after a recording is finished.
This is necessary to be able to retrieve the recording without
restarting the device.
Tilman Sauerbeck [Thu, 9 Jan 2020 10:00:28 +0000 (11:00 +0100)]
common: Factor out Logger::read_sector_header().
Tilman Sauerbeck [Wed, 8 Jan 2020 21:13:48 +0000 (22:13 +0100)]
test: Add tests for the logger module.
Tilman Sauerbeck [Sun, 5 Jan 2020 21:22:41 +0000 (22:22 +0100)]
common: Add the logger module.
Tilman Sauerbeck [Wed, 8 Jan 2020 17:36:47 +0000 (18:36 +0100)]
test: Add tests for the gps module.
Tilman Sauerbeck [Wed, 8 Jan 2020 17:30:19 +0000 (18:30 +0100)]
common: Make Gps::update() access UART0's receive buffer via a closure.
This will allow us to write tests for Gps without providing a fake
implementation of the UART reader function in the test.
Tilman Sauerbeck [Wed, 8 Jan 2020 16:40:32 +0000 (17:40 +0100)]
build: Add infrastructure for building automated tests.
Tilman Sauerbeck [Wed, 8 Jan 2020 13:32:29 +0000 (14:32 +0100)]
build: Split SConscript.libcommon in two.
Split it in SConscript.libcommon.c, dealing with the C code
that's used to build libcommon.a, and SConscript.libcommon.rs,
used to build libcommon.rlib.
This will be useful for native builds used for testing in the future.
Tilman Sauerbeck [Wed, 8 Jan 2020 11:44:09 +0000 (12:44 +0100)]
common: Implement the "dump_storage" shell command.
Lists the mx25l flash's contents in the yencode format.
Tilman Sauerbeck [Wed, 8 Jan 2020 11:43:14 +0000 (12:43 +0100)]
common: Implement Storage::size() in Mx25l.
Tilman Sauerbeck [Wed, 8 Jan 2020 10:52:36 +0000 (11:52 +0100)]
common: Implement the "clear_storage" shell command.
Erases all of the mx25l flash's contents.
Tilman Sauerbeck [Wed, 8 Jan 2020 10:50:50 +0000 (11:50 +0100)]
application: Integrate flash storage via Mx25l.
Tilman Sauerbeck [Wed, 8 Jan 2020 10:45:29 +0000 (11:45 +0100)]
common: Implement Storage::clear() in Mx25l.
Tilman Sauerbeck [Wed, 8 Jan 2020 10:20:32 +0000 (11:20 +0100)]
application: Integrate the shell.
Tilman Sauerbeck [Wed, 8 Jan 2020 09:40:49 +0000 (10:40 +0100)]
common: Implement Mx25l::erase_all().
Tilman Sauerbeck [Wed, 8 Jan 2020 09:48:31 +0000 (10:48 +0100)]
common: Implement Storage::write() in Mx25l.
Tilman Sauerbeck [Wed, 8 Jan 2020 09:46:18 +0000 (10:46 +0100)]
common: Implement Mx25l::program_page().
Tilman Sauerbeck [Wed, 8 Jan 2020 09:45:03 +0000 (10:45 +0100)]
common: Implement Mx25l::erase_sector().
Tilman Sauerbeck [Wed, 8 Jan 2020 11:05:50 +0000 (12:05 +0100)]
common: Add the varint module.
Tilman Sauerbeck [Sun, 5 Jan 2020 14:49:55 +0000 (15:49 +0100)]
common: Add the yencode module.
Tilman Sauerbeck [Sun, 5 Jan 2020 21:28:07 +0000 (22:28 +0100)]
common: Implement Time::fmt_date().
Tilman Sauerbeck [Wed, 8 Jan 2020 10:09:36 +0000 (11:09 +0100)]
common: Add the shell module.
It implements no useful functionality yet.
Tilman Sauerbeck [Sun, 5 Jan 2020 18:51:22 +0000 (19:51 +0100)]
bootloader: Stay in bootloader when the middle left push button is held.
Tilman Sauerbeck [Sun, 5 Jan 2020 18:48:54 +0000 (19:48 +0100)]
application: Make system reset less likely do be run by accident.
System reset is now triggered by holding the upper left and the
lower right push button at the same time.
Tilman Sauerbeck [Sun, 5 Jan 2020 18:46:08 +0000 (19:46 +0100)]
application: Configure the remaining push buttons.
Tilman Sauerbeck [Sun, 5 Jan 2020 18:33:32 +0000 (19:33 +0100)]
application: Factor out the configure_push_buttons() function.
Tilman Sauerbeck [Sun, 5 Jan 2020 18:23:39 +0000 (19:23 +0100)]
application: Factor out the reset_requested() function.
No change in behavior.
Tilman Sauerbeck [Sun, 5 Jan 2020 18:18:26 +0000 (19:18 +0100)]
application: Set up pins for the MX25L flash memory.
This configures SPI0 as well as the GPIO used as the flash's
chip select line.
Tilman Sauerbeck [Sun, 5 Jan 2020 17:53:58 +0000 (18:53 +0100)]
common: Implement Storage::read() in Mx25l.
Tilman Sauerbeck [Mon, 6 Jan 2020 09:44:21 +0000 (10:44 +0100)]
common: Add the storage module.
Tilman Sauerbeck [Sat, 4 Jan 2020 18:29:57 +0000 (19:29 +0100)]
application: Perform system reset from panic handler if requested.
This is untested; I'm not sure if it would work at all.
Tilman Sauerbeck [Sat, 4 Jan 2020 18:19:02 +0000 (19:19 +0100)]
common: Add the mx25l module.
Provides access to the status register and device ID only for now.
Tilman Sauerbeck [Sat, 4 Jan 2020 18:15:08 +0000 (19:15 +0100)]
common: Accept DGPS fix information.
We used to reject differential GPS (DGPS) fixes as invalid, but they
are actually more accurate than standard GPS fixes.
Tilman Sauerbeck [Sat, 4 Jan 2020 17:24:44 +0000 (18:24 +0100)]
common: Increase size of the UART receive ringbuffer.
The GPS module sends about ~380 bytes per second, which led to
overflows of our 256 byte sized ringbuffer.
Tilman Sauerbeck [Sat, 4 Jan 2020 11:00:25 +0000 (12:00 +0100)]
common: Add the spi module.
Tilman Sauerbeck [Fri, 3 Jan 2020 20:42:24 +0000 (21:42 +0100)]
common: Restart NMEA message parsing when a '$' character is seen.
The GPS module sometimes sends incomplete NMEA messages such as this:
$GP$GGA...*
This changeset makes it so we'd only parse the second, complete message
in that example.
Tilman Sauerbeck [Fri, 3 Jan 2020 15:33:15 +0000 (16:33 +0100)]
tools: Pad final chunks with 0xff if necessary.
The bootloader only accepts chunks whose size is a multiple of four.
Tilman Sauerbeck [Fri, 3 Jan 2020 15:09:53 +0000 (16:09 +0100)]
common: Move panic handler out of libcommon.
This allows us to do a native build of libcommon which is useful for
unit testing.
Tilman Sauerbeck [Tue, 31 Dec 2019 12:32:48 +0000 (13:32 +0100)]
application: Show current time on the display if we have a GPS fix.
Tilman Sauerbeck [Thu, 2 Jan 2020 12:32:26 +0000 (13:32 +0100)]
common: Implement Time::fmt_time().
Formats time as HH:MM:SS.
Tilman Sauerbeck [Thu, 2 Jan 2020 12:28:59 +0000 (13:28 +0100)]
common: Add the time module.
This currently only contains the equivalent of gmtime(), which was
adapted from Rich Felker's musl.
Tilman Sauerbeck [Tue, 31 Dec 2019 12:35:35 +0000 (13:35 +0100)]
common: Add the fmt module.
Tilman Sauerbeck [Mon, 30 Dec 2019 18:51:46 +0000 (19:51 +0100)]
common: Implement screen::clear() and screen::draw_text().
This also imports (a subset of) Frederic Cambus' spleen font,
used by screen::draw_text().
Tilman Sauerbeck [Mon, 30 Dec 2019 17:18:08 +0000 (18:18 +0100)]
common: Tweak bit order of screen data.
The left-most pixel is now defined by the most significant bit.
This is a more intuitive representation than what we had before.
Tilman Sauerbeck [Tue, 31 Dec 2019 11:03:50 +0000 (12:03 +0100)]
application: Visualize GPS fix state using the satellite icons.
As long as we are waiting for a GPS fix, we animate the satellite
icons.
Tilman Sauerbeck [Tue, 31 Dec 2019 10:28:58 +0000 (11:28 +0100)]
application: Manage whether or not we have valid GPS fix information.
Expire such information after about 1.5s.
Tilman Sauerbeck [Tue, 31 Dec 2019 09:51:45 +0000 (10:51 +0100)]
application: Blink heart icon to indicate liveness.
Tilman Sauerbeck [Tue, 31 Dec 2019 08:17:08 +0000 (09:17 +0100)]
common: Implement display::show_icon() and display::hide_icon().
This only supports the alarm, heart and satellite icons for now,
but not the battery meter icon.
Tilman Sauerbeck [Mon, 30 Dec 2019 10:39:26 +0000 (11:39 +0100)]
application: Extract time and position from GPS NMEA messages.
Tilman Sauerbeck [Mon, 30 Dec 2019 09:41:00 +0000 (10:41 +0100)]
common: Add the gps module.
Tilman Sauerbeck [Mon, 30 Dec 2019 10:42:42 +0000 (11:42 +0100)]
application: Set up pins for the GPS.
This configures UART0 as well as the GPS' reset line.
Tilman Sauerbeck [Sun, 29 Dec 2019 00:31:08 +0000 (01:31 +0100)]
application: Define UART0_IRQHandler().
Writes received data to the global uart0_rx_buf ringbuffer.
Tilman Sauerbeck [Sat, 28 Dec 2019 22:11:09 +0000 (23:11 +0100)]
common: Add Rust glue for the ringbuf module.
For now this only allows us to access a ringbuffer from Rust
after it has been defined in C code.
Tilman Sauerbeck [Sat, 28 Dec 2019 18:54:46 +0000 (19:54 +0100)]
common: Add the uart module.
Tilman Sauerbeck [Mon, 30 Dec 2019 10:42:18 +0000 (11:42 +0100)]
application: Enable OSC0.
Needed for UART0.
Tilman Sauerbeck [Sat, 28 Dec 2019 18:49:02 +0000 (19:49 +0100)]
common: Implement clock::enable_osc0().
Tilman Sauerbeck [Sun, 29 Dec 2019 11:55:24 +0000 (12:55 +0100)]
build: Use rustc to link the binaries instead of gcc.
This simplifies the build system by removing the need for
libapplication.a, libbootloader.a and the two start.c copies.
Tilman Sauerbeck [Sun, 29 Dec 2019 11:51:25 +0000 (12:51 +0100)]
bootloader: Mark jump_to_application() as noreturn.
Tilman Sauerbeck [Sun, 29 Dec 2019 11:16:49 +0000 (12:16 +0100)]
build: Link libgcc from the command line instead of the linker script.
Pulling it in via the linker script will only work if we use our
C toolchain's linker and would fail if we used the Rust linker.
Tilman Sauerbeck [Sun, 29 Dec 2019 09:56:06 +0000 (10:56 +0100)]
build: Don't link libraries we don't need.
Tilman Sauerbeck [Fri, 20 Dec 2019 20:10:18 +0000 (21:10 +0100)]
application: Initialize and clear the display on startup.
Tilman Sauerbeck [Fri, 20 Dec 2019 20:09:42 +0000 (21:09 +0100)]
application: Set up pins for the display.
This configures I2C0 as well as the GPIO used to control the display's
reset line.
Tilman Sauerbeck [Wed, 18 Dec 2019 08:01:56 +0000 (09:01 +0100)]
common: Add the display module.
It currently can initialize, clear and draw the main area
of the display. Drawing or clearing the icon area is not yet
supported.
Tilman Sauerbeck [Wed, 18 Dec 2019 09:00:22 +0000 (10:00 +0100)]
application: Perform a system reset if PTA12 is pressed.
Tilman Sauerbeck [Wed, 18 Dec 2019 08:59:12 +0000 (09:59 +0100)]
application: Configure PTA12 for push button use.
Tilman Sauerbeck [Wed, 18 Dec 2019 07:46:46 +0000 (08:46 +0100)]
common: Implement nvic::system_reset().
Performs a system reset.
Tilman Sauerbeck [Sun, 8 Dec 2019 17:20:04 +0000 (18:20 +0100)]
bootloader: Never auto-start the application in the intermediate bootloader.
Instead, we now always enter bootloader operation. I think this has
less potential of bricking a device in case you don't press PTE24
fast enough after installing the intermediate bootloader.
Tilman Sauerbeck [Mon, 18 Nov 2019 06:38:24 +0000 (07:38 +0100)]
common: Add the i2c module.
Tilman Sauerbeck [Sun, 17 Nov 2019 20:42:01 +0000 (21:42 +0100)]
bootloader: Call clock::reset() before jumping to the application.
By switching back to FBE clock mode there, we can unconditionally
do the switches to FBE, PBE and PEE in any of our programs.
Tilman Sauerbeck [Sun, 17 Nov 2019 20:34:38 +0000 (21:34 +0100)]
common: Implement clock::reset().
This puts the MCG back into FBE mode.
Tilman Sauerbeck [Sat, 16 Nov 2019 20:54:50 +0000 (21:54 +0100)]
common: Combine writes to SIM_CLKDIV1 in clock::configure_clkdiv().
By setting both CLKDIV1 and CLKDIV4 at the same time we avoid
running the flash at twice the intended clock rate for a couple
of cycles which has been observed to make it read bad data.
Tilman Sauerbeck [Sun, 17 Nov 2019 18:05:39 +0000 (19:05 +0100)]
bootloader: Disable the watchdog.
The watchdog gets enabled with a 1s timeout on POR, and I don't
want to deal with that.
Tilman Sauerbeck [Sat, 16 Nov 2019 18:15:51 +0000 (19:15 +0100)]
common: Add the watchdog module.
For now this only lets us disable the COP watchdog.