From 0f550fb4282d23eefbba19d3a336620fb5960416 Mon Sep 17 00:00:00 2001 From: Janez T Date: Mon, 2 Mar 2026 08:38:39 +0100 Subject: [PATCH] Update README feature list --- README.md | 154 ++++++++++++++++-------------------------------------- 1 file changed, 44 insertions(+), 110 deletions(-) diff --git a/README.md b/README.md index b874b9d..1f7c8f6 100644 --- a/README.md +++ b/README.md @@ -2,130 +2,64 @@ Flutter app for Search and Rescue operations over a [MeshCore](https://github.com/meshcore-dev) mesh radio network via Bluetooth Low Energy. -## Features +## What It Does -- **Messaging** — send/receive messages to contacts and channels -- **Voice messages** — push-to-talk voice over the mesh using [Codec2](https://github.com/drowe67/codec2) ultra-low-bitrate speech compression (700–3200 bps); fragments are streamed on demand via direct BLE links without requiring firmware changes -- **Image messages** — send photos over the mesh as AVIF-compressed fragments; images are fetched on demand when the recipient taps the placeholder; configurable resolution (64 / 128 / 256 px), compression level, and colour/grayscale mode -- **Contacts** — track team members, repeaters, and rooms with live telemetry -- **SAR Markers** — drop emoji-coded location pins (person found, fire, staging area) via chat messages -- **Map** — view team positions and markers on OpenStreetMap / topo / satellite; tiles cached for offline use -- **Location tracking** — periodic GPS updates broadcast to the mesh -- **Packet log** — inspect raw BLE frames for debugging +MeshCore SAR helps teams coordinate in low-connectivity or no-connectivity environments using mesh radio + BLE. -## BLE Protocol +- Send text messages to contacts, rooms, and channels +- Share voice clips and field images +- Track team movement and location updates +- Work with offline maps and field overlays +- Mark and share SAR points of interest -MeshCore SAR is powered by the `meshcore_client` package: -**[github.com/dz0ny/meshcore_client](https://github.com/dz0ny/meshcore_client)** +## Core Features -The client handles BLE connection management, command queueing, and binary frame parsing/building, and is extracted so you can build custom tools, integrations, and apps on top of MeshCore. +### Messaging -## Requirements +- Direct and group chat over mesh +- Contact and room awareness from live mesh telemetry +- Message overlays integrated with map and tactical tools -- Flutter 3.19+ / Dart 3.3+ -- Physical device with Bluetooth (BLE does not work on simulators) -- iOS 13+ or Android SDK 21+ +### Voice -## Build +- Push-to-talk voice clips optimized for low bandwidth +- Voice is fetched on demand when someone presses play +- Automatic playback when fetch completes +- Works well for short field updates where text is too slow -```bash -flutter pub get -flutter run # debug -flutter build apk --release # Android -flutter build ios --release # iOS -``` +### Images -## GitHub Actions artifacts +- Capture from camera or pick from gallery +- Automatic compression before sending (optimized for mesh transport) +- Receiver sees a placeholder and taps to load the image +- Full-screen image viewer for quick field inspection -Every push runs the `Build And Upload Release Assets` workflow and uploads build artifacts for: +### Maps & Navigation -- Android (`.apk`) -- Linux (`.tar.gz`) -- macOS (`.dmg`) -- Windows (`.zip`) +- Multiple base maps (street, topo, satellite, terrain) +- Offline tile download for selected areas +- Optional MBTiles import for custom/offline map packages +- Team member markers with freshness indicators +- SAR markers (person found, fire, staging, custom object markers) +- Compass-assisted orientation and target direction UI -How to download them: +### Tracking & Trails -1. Open the repository on GitHub. -2. Go to **Actions**. -3. Open a workflow run named `Build And Upload Release Assets`. -4. In the run summary, scroll to **Artifacts**. -5. Download the artifact you need (`release-android`, `release-linux`, `release-macos`, `release-windows`). +- Continuous GPS tracking with configurable update thresholds +- Personal trail recording with distance and duration stats +- Contact trail visibility controls +- GPX export/import for trail sharing and reuse -For published releases, the same files are also attached to the GitHub Release page. +### Tactical Drawing -### iOS signing +- Draw lines/rectangles directly on map +- Distance measurement mode +- Share drawings to channel/room +- Toggle received drawings and SAR marker visibility -```bash -open ios/Runner.xcworkspace -# Select team in Signing & Capabilities, then run from Xcode -``` +## Permissions (App Use) -### Clean rebuild - -```bash -flutter clean && flutter pub get -cd ios && pod deintegrate && pod install && cd .. -``` - -## Permissions - -| Platform | Permissions | -|----------|-------------| -| iOS | Bluetooth, Location (when in use), Microphone (voice), Photo Library / Camera (images) | -| Android | `BLUETOOTH_SCAN`, `BLUETOOTH_CONNECT`, `ACCESS_FINE_LOCATION`, `INTERNET`, `RECORD_AUDIO`, `READ_MEDIA_IMAGES` | - -## Wire protocols - -### SAR Marker - -``` -S::, -``` - -Examples: `S:🧑:46.0569,14.5058` · `S:🔥:46.057,14.506` · `S:🏕️:46.0571,14.506` - -### Voice messages (on-demand, direct contacts only) - -Control plane (text): - -``` -VE1:{sid}:{mode}:{total}:{durationMs}:{senderKey6}:{ts}:{ver} ← envelope -VR1:{sid}:a:{requesterKey6}:{ts}:{ver} ← fetch request -``` - -Data plane (binary via `cmdSendRawData` / `pushRawData`, ≤160 bytes/packet): - -``` -[0x56 'V'][sessionId:4B][mode:1B][idx:1B][total:1B][Codec2 frame...] -``` - -Codec2 modes: 700C / 1200 / 1300 / 1400 / 1600 / 2400 / 3200 bps. - -### Image messages (on-demand, direct contacts only) - -Control plane (text): - -``` -IE1:{sid}:{fmt}:{total}:{w}:{h}:{bytes}:{senderKey6}:{ts}:{ver} ← envelope -IR1:{sid}:a:{requesterKey6}:{ts}:{ver} ← fetch request -``` - -Data plane (binary via `cmdSendRawData` / `pushRawData`, ≤160 bytes/packet): - -``` -[0x49 'I'][sessionId:4B][fmt:1B][idx:1B][total:1B][AVIF fragment...] -``` - -Images are compressed to AVIF (configurable up to 256×256, grayscale by default). At 152 bytes of payload per fragment a typical image takes 7–20 fragments — comparable to a short voice clip. - -## Architecture - -``` -lib/ -├── models/ — data types (re-exported from meshcore_client) -├── providers/ — state management (Provider pattern) -├── screens/ — top-level pages -├── services/ — location tracking, SSE bridge, tile cache -└── widgets/ — reusable UI components -``` +- Bluetooth: mesh device communication +- Location: team tracking and map position updates +- Microphone: voice clip recording +- Camera / Photos: image messaging