GlideAngle / flare-timing

Scoring for free flight competitions.
Mozilla Public License 2.0
11 stars 2 forks source link
ghcjs gps haskell-application haversines igc kml reflex-frp servant shortest-path utm vincenty wgs84

Flare Timing

stack cabal pier docs

[!IMPORTANT] This project depends on uom-plugin-0.3.0.0 that was constrained to use ghc <= 8.2. A new version, uom-plugin-0.4.0.0, has been released that works with ghc >= 9 so this project could now be upgraded.

Flare Timing is a reference implementation of GAP scoring for cross country hang gliding and paragliding racing.

Its command line console apps, one for each step in scoring, write down their workings along with their outputs. With these workings we can trace how a pilot's score has been calculated. There's no visual competition editor. The one file that defines a competition can be generated from an FS database, the *.fsdb file. It includes a web app that can be hosted locally for visual checks and comparisons with expected or official results. It is possible to publish the data alongside this web app standalone as done at flaretiming, the web site.

Installation

Download the source, build and install the command line apps with stack or with ghc and cabal that can be installed with ghcup:

> git clone https://github.com/BlockScope/flare-timing.git --recursive
> cd flare-timing/lang-haskell

# with stack
> stack install

# with cabal supplying options --installdir and --overwrite-policy
> cabal v2-install all:exes

There's more in the building guide. There's a guide for testing too.

Usage

Let's get the inputs and outputs from FS, do the scoring and host the comp locally.

Start by preparing the FS comp file, the *.fsdb. This will often contain sensitive personal information such as birthdays, phone numbers and notes that we'll want to avoid publishing. We'll also want some output data for making comparisons between flare-timing and FS.

  1. Clean out the sensitive pilot personal stuff we don't need with fs-clean.
  2. Trim away data we don't need with fs-trim.
  3. Grab the optimal route around the tasks found by FS with fs-route.
  4. Grab the arrival times and positions from FS with fs-arrival.
  5. Grab the landouts from FS with fs-effort.
  6. Grab the scores from FS with fs-score.

That's the *.fsdb file done with. From here on, flare-timing deals with the trimmed XML, the *.trim-fsdb.xml. If we have the track logs we can score the tasks:

  1. Extract the inputs with ft-extract-input.
  2. Trace the shortest path to fly a task with ft-task-length.
  3. Find flying times with ft-fly-time.
  4. Find pairs of fixes crossing over zones with ft-cross-zone.
  5. Interpolate between crossing fixes for the time and place where a track tags a zone with ft-tag-zone.
  6. Unpack the *.igc or *.kml tracklogs with ft-unpack-track.
  7. Peg the timing window to a reference frame with ft-peg-frame.
  8. Index fixes from the time of first crossing with ft-align-time.
  9. Discard fixes that get further from goal and note leading area with ft-discard-further.
  10. Draw out leading areas ft-lead-area.
  11. Mask a task over its tracklogs with the following, run in any order:
  12. Group and count land outs with ft-land-out.
  13. Group and count far outs with ft-far-out.
  14. Score the competition with ft-gap-point.

To get the backend server for hosting the comp data running locally:

Start the server with ft-comp-serve.

To host the frontend web app for the comp locally:

  1. Change directory: > cd lang-haskell
  2. Open a try-reflex shell with: > reflex-platform/try-reflex
  3. Build the frontend and start its webpack dev server with: > ../stack-shake-build.sh view-start-ghcjs
  4. Open a browser at the hosted URL, usually http://localhost:9000/app.html.

Documentation is available online at flare-timing.readthedocs.io and there's a worked example too.

What's Included

The GAP rules have changed over the years. Here are the features that flare-timing includes or not.

License

Copyright © Phil de Joux 2017-2020
Copyright © Block Scope Limited 2017-2020

This software is subject to the terms of the Mozilla Public License, v2.0. If a copy of the MPL was not distributed with this file, you can obtain one at http://mozilla.org/MPL/2.0/.