Skip to content

Release v2.1 — ATAK-Plugin-ERT

Latest

Choose a tag to compare

@Hellikandra Hellikandra released this 16 Sep 20:26
· 1 commit to main since this release
2b246e0

What changed

v2.0 shipped with this in its own list of known issues:

Hand-off is manual and unacknowledged. Nothing confirms the responder received it or accepted the job, and there is no shared view of who has taken what.

That is what v2.1 is. The assignment now goes out, the responder is asked rather than expected to notice, and the answer comes back and moves the coordinator's board. Both devices are looking at the same picture of the same tasking, which is the thing the plugin exists to do and the thing it could not previously do.

Everything in v2.0 still works the way it did. Nothing in the coordinator's workflow has moved: set an incident, pick responders, press EXECUTE.

The dispatch loop closes

  • The responder is asked. EXECUTE puts a prompt on the responder's device naming who is sending them and where. Accept, Decline or Later.
  • The answer comes back. The coordinator's row moves on the answer — accepted, declined, on hold — with a notification saying who said what. No refreshing, no asking on the radio whether the route arrived.
  • A responder reports progress. ON SITE and FINISH from their own row. Setting off is observed from their position rather than claimed, so a responder who simply drives shows as under way without touching anything.
  • Being called off. The coordinator can cancel a tasking; the responder is told, and the job is filed as called off rather than completed.
  • Re-offering. A declined job can be sent again, and a responder already committed elsewhere can be re-targeted, both without inventing a second row.

Three boards instead of one

Tab Holds
TRACKING The jobs actually being worked. One per responder.
ROUTES The backlog: dispatched and unanswered, paused, or refused and waiting on you.
DONE The record of the shift — what finished and what was called off, with the timeline behind each one.

A refusal does not vanish off the screen of the person who has to act on it, and a finished job does not sit in the way of the next one.

Also new since v2.0

  • Settings, in ATAK's own settings screen: off-route distance, re-plan interval, ETA smoothing, how routes travel (data package or CoT), and whether EXECUTE sends the route automatically.
  • Routes travel as a data package or as a single CoT event, your choice. A package is ATAK's own transfer; a CoT event is one small message that gets through where a package does not.
  • A dispatch says how long it has been quiet. A job nobody has answered counts up, and past two minutes the row says so in amber — unless the responder is visibly moving, which answers the question better than a button would.
  • Persistence that means it. The assignment book, every answer, the routes and the record all survive closing ATAK, a crash or the plugin being replaced. A restart does not re-ask a question this device has already answered.
  • A route is owned by a pairing, not by a responder, so somebody holding two jobs has two roads and each row acts on its own.
  • Street addresses on the list you choose from, not only after you have chosen.

Fixed

Three rounds of audit against the running plugin on three devices, 27 findings fixed. The ones most likely to have been seen:

  • Acknowledgements were sent with an internal type that the receiving ATAK had no importer for, so an unpredictable share of every answer ERT has ever sent was silently dropped.
  • PLAN, SEND and the colour swatch appeared on backlog rows whose route had already been deleted, and did nothing.
  • The coordinator's own route was planned, sent and then hidden until the responder accepted — reported as the route being slow to appear.
  • A responder in ROUTE mode whose route never arrived was shown nothing at all rather than the bearing line.
  • An answer carried every job the device had ever been handed, so a stale refusal could arrive alongside a fresh acceptance.
  • A responder with no position fix was being routed from the Gulf of Guinea.
  • Standing down erased the record of the shift.
  • A finished job could come back to life and block the next one.
  • Every route ERT drew shared one map UID.

The full record, with the log extract behind each one, is in docs/audit/index.html.

What is in this release

Source archives, not APKs. Each zip is the tree the TAK Product Center pipeline builds with ./gradlew assembleCivRelease. There is no binary here on purpose: the pipeline compiles and signs with its own key, so an APK shipped alongside would be a different artefact from the one anybody installs, and publishing its checksum would imply otherwise.

ATAK-CIV Version Source archive
5.6 ert-tpp-20260916-atak5.6.0.zip
5.7 ert-tpp-20260916-atak5.7.0.zip
5.8 ert-tpp-20260916-atak5.8.0.zip

Each archive has a single root folder ert/ holding the Gradle wrapper, build.gradle, settings.gradle, gradle.properties, app/build.gradle, the ProGuard rules and all of app/src — including the 467 unit tests. It contains no build output, no local.properties, no keystore and no APK.

The three differ in exactly one line: the default ATAK_VERSION in app/build.gradle, which is what the plugin declares as its plugin-api. ATAK only offers a plugin whose declared API matches the running ATAK exactly, so build the archive that matches the device.

SDK: minSdk 24, targetSdk 34, compileSdk 35. Gradle 8.13 via the bundled wrapper, AGP 8.8.2, Java 17.

Both ends need v2.1. The assignment round trip is between two copies of the plugin. A v2.0 responder receives nothing it can answer with, and a v2.1 coordinator will show their job as dispatched and unanswered for ever.

Build provenance. Only the ATAK-CIV 5.6.0 SDK is vendored in the development tree, so the 5.7 and 5.8 archives were verified here against 5.6.0 and declare the newer API. Built by the pipeline against the matching SDK this resolves itself; built any other way, an ATAK API that changed between 5.6 and 5.8 fails when that call is reached rather than at load.

Building it

From the extracted ert/ folder, with local.properties naming your SDK:

./gradlew assembleCivRelease

The APK lands in app/build/outputs/apk/civ/release/. After installing, ATAK prompts "Load plugin: Emergency Response Time" — choose OK. The panel opens from the bottom of the ATAK Tools list, after the built-in tools.

SHA-256 Checksums

Of the archives, as shipped:

69b7df96489bd9c1f4a8ac7e3113222f17c525654975e50e37862faf0db40e08  ert-tpp-20260916-atak5.6.0.zip
994ea338296faa769c974e74f37ac7e20ed5608cd3908d9a0d062fba8d09c15e  ert-tpp-20260916-atak5.7.0.zip
57d2c163268101e17ce16245f69130a166eb5ab97042817b8179a404d28d133b  ert-tpp-20260916-atak5.8.0.zip

Known Issues

  • ETA steps rather than glides. Recalculated from measured speed, so it stays blank until the responder has been moving, blanks again when they stop, and jumps between values. Read the trend, not a single number.
  • Road routing needs routable offline map data. Without a cached basemap carrying roads, a route never finishes computing and you get a straight line — the same picture as R&B.
  • A route can fail to arrive without either end knowing why. Delivery is ATAK's, and a route that does not turn up is not something ERT can retry from the coordinator's side. The responder now says so after thirty seconds and shows the bearing line instead, but the road has to be sent again by hand.
  • Navigation is device-wide. ATAK navigates one route at a time, so turn-by-turn starts per route and only on your own device. Routes for others are sent to them and started at their end; ATAK has no API to start navigation remotely.
  • A responder with no device cannot be tracked live. Markers stand in for them, but a marker only moves when somebody moves it, and a marker cannot answer an assignment.
  • Setting off is inferred, not reported. A responder is treated as under way once they have moved 250 m from where they were when the job was accepted. Somebody who accepts a job at the scene will not show as under way.
  • Loading and unloading ERT within one ATAK session can leave two ERT entries in the radial menu. Restart ATAK to clear it.
  • Signing. Built from this source outside the pipeline, the APK is signed with the ATAK SDK development keystore rather than a production key — fine for sideloading and evaluation, and not a key anybody should trust. The pipeline signs with its own.

Support: GitHub Issues