Skip to content

Releases: danarrib/BulletGCSS

v1.8

12 Apr 23:05

Choose a tag to compare

Bullet GCSS v1.8 Release Notes

Firmware — Reliability & Stability

Modem Watchdog and Auto-Recovery

The ESP32 firmware now recovers from a frozen cellular modem without rebooting the entire board. If the modem stops responding (for example, due to a half-open TCP connection after a cellular NAT timeout), the firmware detects the freeze and performs a targeted recovery: it kills the modem task, performs a hardware reset of the SIM7600/SIM800 module, and restarts only the networking task. Total recovery time is typically 15–30 seconds, compared to a full ESP32 reboot in previous versions.

  • Freeze detection triggers a warning after 15 seconds of modem silence, and a full recovery after 30 seconds.
  • For SIM7600 modems, AT+CTCPKA (TCP keepalive) is now enabled to detect dead connections earlier.
  • The entire TinyGSM/MQTT networking stack was moved to a dedicated FreeRTOS task (modemTask) on Core 0, isolating it from the flight controller communication task (fcTask) on Core 1.

Thread Safety Fix

Signal strength polling (AT+CSQ) was being called from the wrong FreeRTOS task, creating a data race between the two CPU cores. This has been fixed — the modem is now accessed exclusively from modemTask, with the signal strength value shared safely via a volatile variable.

Publish Failure Counter

The MQTT publish failure counter now decays on each successful publish, preventing transient WiFi or cellular hiccups from accumulating toward an unnecessary restart threshold.

Firmware Log Improvements

All firmware serial log lines now include a seconds-since-boot timestamp, making it much easier to correlate events when debugging.

MSP Box ID Discovery

Switched from MSP_BOXNAMES to MSP_BOXIDS for flight mode discovery at startup. This is more reliable and avoids issues with long box name strings overflowing the receive buffer. The MSP_BOXNAMES buffer was also increased from 512 to 1024 bytes as a safety measure.


Multi-Aircraft Monitoring

This release adds full support for monitoring multiple aircraft simultaneously from a single browser session.

  • A secondary aircraft panel appears when a second aircraft is detected on the same MQTT broker.
  • The panel shows key telemetry: GPS coordinates, altitude, speed, battery, flight mode, and flight time.
  • Flight time increments locally in real time even between telemetry updates.
  • A "Stop Tracking" button removes the secondary aircraft from the session.
  • A confirmation dialog prevents accidental removal.

UI — Security & Commands

Private Key Export and Import

Operators can now export their Ed25519 signing key as a password-protected PEM file and import it on another device. The key is encrypted with AES-256-GCM using a PBKDF2-derived key (100,000 iterations). This makes it practical to command the same aircraft from multiple devices without regenerating the key pair and re-flashing the firmware.

Command Sequence Synchronisation

The firmware now broadcasts its last accepted command sequence number (lseq) in regular telemetry messages and in all command acknowledgements. When a second UI connects (after importing the key), it automatically synchronises its local sequence counter from the firmware, preventing replay-protection rejections.

Improved Command Modal Warnings

The "Send Command" panel now shows specific, actionable warnings for each blocking condition:

  • INAV too old — Commands require INAV 9.0.0 or newer.
  • No signing key — No key pair has been configured in the Security panel.
  • Firmware has no public key — The public key hasn't been flashed into Config.h yet.
  • Key mismatch — The UI and firmware are using different keys.
  • No command channel — The downlink MQTT topic is not active.
  • MSP RC Override not active — The flight controller is not in MSP RC Override mode.

INAV Version-Gated Commands

The "Set Altitude", "Set Course", and "Jump to WP" commands require INAV 9.0.2 or newer (extended MSP command support). These rows are now hidden entirely when connected to an older firmware version, rather than shown as permanently disabled.


UI — Mission Planner

Home Point on Planner Map

If the aircraft has reported a home point, it is now shown on the Mission Planner map as well. This gives a visual reference when placing waypoints relative to the launch/home position.

Mission Download Fix

The getmission command was dropping the last waypoint when downloading a mission from the aircraft. The off-by-one error in the firmware's buffer allocation and loop bounds has been fixed.


UI — Status Icons

Icon Info Modal

Tapping any status icon in the top bar (connection, signal, battery, GPS, command channel) now opens a small modal explaining what the icon means and what its current state indicates. This is especially useful for new users unfamiliar with the icon states.


UI — General

Tap Feedback on Buttons

Buttons and navigation menu items now show a visual highlight when tapped, providing clearer touch feedback on mobile devices.

Mission Planner Layout

The mission planner stats bar and navigation row share a single line in landscape orientation, recovering vertical screen space on phones held sideways.

v1.7

05 Apr 21:03

Choose a tag to compare

Bullet GCSS — Release Notes v1.7

Released: 2026-04-05


Overview

Version 1.7 is a major UI overhaul — a complete rebuild of the web interface on Bootstrap 5, bringing a cleaner, more consistent look and better mobile usability. Alongside the redesign, several rendering and display-quality improvements were made for high-DPI screens.

No firmware changes are required to upgrade from v1.6.


New Features

Bootstrap 5 UI Migration

The web interface has been fully rebuilt on Bootstrap 5.3.8. The page layout, navigation, and controls now use Bootstrap components throughout, replacing the bespoke CSS-panel system from earlier versions.

Layout:

  • Portrait mode: Info panel → Map → EFIS, stacked in equal thirds (in that order).
  • Landscape mode: Info panel + EFIS stacked on the left (50%), Map on the right (50%).
  • A fixed-top navbar holds the gear icon (menu toggle) and the status icon bar — always visible regardless of scroll position.

Navigation:

  • The sidebar menu is now a Bootstrap offcanvas panel that slides in from the left. Each menu item has a corresponding Bootstrap icon for quick visual identification.
  • The menu button is a gear icon (bi-gear-fill) replacing the old hamburger.

Settings:

  • Broker settings, UI settings, and Security are now full Bootstrap modals — they overlay the screen cleanly rather than sliding in as panels.

Commands:

  • The commands panel is a Bootstrap modal accessible from the sidebar menu or the CMD floating action button in the bottom-right corner.

Sessions and Monitor UAVs:

  • Both panels are now Bootstrap offcanvases that slide in from the left, matching the sidebar style.

Mission planner:

  • The full-screen mission planner now opens below the navbar (not covering it), preserving access to the status icon bar while planning.
  • The toolbar is now a CSS grid — 4 buttons per row in portrait, all 8 in a single row in landscape.
  • The connection/command channel status icons have been removed from the planner top bar (they are always visible in the navbar). Only the mission validity dot remains.

HiDPI / High-DPR Display Fixes

  • MapLibre markers and labels no longer apply manual window.devicePixelRatio multiplications. MapLibre handles DPR internally on its WebGL canvas; DOM marker sizes are now in CSS pixels only.
  • EFIS canvas rendering now uses efis.PixelRatio = 1 for all drawing coordinates, since ctx.scale(dpr, dpr) handles the physical-to-CSS pixel mapping. Only the canvas element's physical size still reads window.devicePixelRatio live on each render.

These fixes prevent doubled/over-scaled markers and EFIS elements on high-DPI devices (e.g. Retina iPhones and MacBooks).


Information Panel Font Improvements

  • Cell headers (tblDataViewCellHeader) and value cells (tblDataViewCellValue) now use viewport-relative font sizing (1.5vmax) for consistent readability across screen sizes and orientations.
  • Dynamic color changes (color-ok, color-warning, color-danger) now correctly preserve the tblDataViewCellValue class when applied at runtime, so the font size is not lost when cell colors update.

Apple / PWA Meta Tags

All Apple-specific meta tags and splash screen links from the old UI are now present in the new basicui.html:

  • apple-mobile-web-app-capable, apple-mobile-web-app-title, apple-mobile-web-app-status-bar-style
  • All apple-touch-icon sizes (120×120 through 1024×1024)
  • Portrait and landscape splash screens for all supported iPhone and iPad sizes
  • OG/Twitter social meta tags and favicon

UI / UX Improvements

  • Ubuntu font loaded via Google Fonts CDN — consistent typography on all devices including iOS, which does not bundle Ubuntu.
  • Portrait panel order corrected: Info → Map → EFIS (was Info → EFIS → Map before the fix).
  • Sessions and Monitor UAVs offcanvases now open from the left side (matching the main menu), not the right.
  • Secondary aircraft labels and waypoint info labels display correctly on the new page — required CSS classes were added to the inline stylesheet.

Breaking Changes

None. All changes are UI-only. The firmware, MQTT protocol, and localStorage data formats are unchanged.


Upgrade Notes

  • No firmware re-flash required.
  • The Ed25519 key pair from v1.6 remains valid.
  • Browser localStorage settings (broker, units, map style, monitored topics, saved missions) are preserved automatically.
  • The old UI is still accessible at oldui.html for reference during the transition period.

Screenshots

readme_userinterface01 mqtt_settings mp_workflow

v1.6

01 Apr 02:52

Choose a tag to compare

Bullet GCSS — Release Notes v1.6

Released: 2026-03-31


Overview

Version 1.6 is a major feature release focused on two long-planned capabilities: multi-aircraft monitoring and a full waypoint mission planner. Both features are fully functional end-to-end, from the web UI through the encrypted command channel to the ESP32 firmware and INAV flight controller.


New Features

Multi-Aircraft Monitoring (F1)

The UI can now subscribe to additional MQTT telemetry topics and display secondary aircraft on the same map alongside the primary aircraft.

  • Each secondary aircraft is shown with a colour-coded icon (distinct hue per aircraft, using CSS filter colorisation) that rotates to match the GPS ground course.
  • A two-line label shows callsign, altitude, vertical speed indicator (↑/↓), and ground speed — all respecting the user's unit settings (m/ft, km/h/mph/kt/m/s).
  • A course line extends forward from each aircraft, showing one minute of projected travel at current speed.
  • A flight path is drawn as a coloured line connecting all recorded positions.
  • Aircraft that have not sent a message in more than 10 seconds are dimmed to 50% opacity to signal a stale connection.
  • Tapping a secondary aircraft marker opens a popup showing last-seen time, Plus Code location (tap to copy), and a Stop tracking button.
  • The monitored topic list is persisted to localStorage and automatically restored on reconnect.
  • The "Monitor other UAVs" input field is pre-filled with the primary topic prefix (e.g. bulletgcss/telem/) for fast entry.
  • No firmware changes required — secondary aircraft are read-only.

Waypoint Mission Planner (F2)

A full-screen mission planning tool is now accessible from the sidebar menu.

Planning

  • Tap the map to place waypoints. Each waypoint opens a parameter modal immediately.
  • Drag markers to reposition — the route line updates in real time.
  • Waypoint modal supports: Action (Waypoint / Loiter / RTH / Land), Altitude (m above home), Speed (m/s), and Loiter time (seconds).
  • Terrain elevation is queried automatically from the configured provider when a waypoint is placed or a mission is loaded, showing ground elevation and estimated above-terrain clearance in the modal — updated live as the altitude input changes.
  • RTH constraint enforced: RTH must be the last waypoint. Adding waypoints after an RTH is prevented. Changing a mid-mission waypoint to RTH prompts to delete subsequent waypoints.
  • Mission validity dot in the top bar mirrors the wpv telemetry field — green when the FC reports the loaded mission as valid, red otherwise.
  • Waypoint count limit enforced from the FC-reported maxWaypoints value (supports up to 254 waypoints on INAV).

File Management

  • Save / Load missions to browser localStorage with custom names.
  • Export missions as INAV-compatible JSON files (same format as INAV Configurator).
  • Import INAV JSON mission files from device storage.

Upload to Aircraft

  • Sends the planned mission waypoint-by-waypoint over the encrypted Ed25519 command channel.
  • The firmware buffers the entire mission in a heap-allocated staging buffer before touching the FC — the flight controller's mission is only updated once all waypoints are received and validated.
  • Upload is blocked if WP Mission mode or MSP RC Override mode is active on the aircraft.
  • A confirmation dialog is shown if the aircraft is armed (mid-flight upload).
  • Progress is shown per waypoint; upload can be cancelled at any time.

Download from Aircraft

  • A new getmission command fetches the mission currently stored on the FC.
  • The firmware sends each waypoint as a dlwp: telemetry message; the UI reassembles them into the planner.
  • Download is blocked if WP Mission mode or MSP RC Override mode is active.
  • A confirmation dialog is shown if the aircraft is armed.

Firmware Changes (ESP32-Modem)

  • cmd:setwp handler — receives waypoints one by one, buffers them in a heap-allocated staging array (sized to FC-reported maxWaypoints, supports up to 254 WPs), validates the full mission, then forwards to the FC via MSP_SET_WP. Checks that WP Mission mode is not active before forwarding.
  • cmd:getmission handler — reads the current mission from the FC and publishes each waypoint as a dlwp: telemetry message. Uses heap allocation to avoid stack overflow on large missions.
  • wpmax telemetry field — publishes the FC-reported maximum waypoint count at startup.
  • wpv telemetry field — publishes the FC mission validity flag.
  • dlwp: message type — new telemetry message type for mission download, distinct from the existing wpno: waypoint telemetry.

UI / UX Improvements

  • Menu cleanup — removed trailing ... from all menu items; renamed "Send command" → "Send command to UAV"; renamed "Sessions" → "Flight Sessions".
  • Mission planner map — no zoom buttons, no attribution overlay (cleaner appearance on mobile).
  • Close button — removed the ✕ character from the Close button label in the mission planner.
  • Status icons — connection and command channel icons are mirrored in the mission planner top bar so connectivity is visible without leaving the planner.

Protocol Changes

  • New downlink command: cmd:setwp — uploads a single waypoint (fields: wpno, la, lo, al, ac, p1, p2, p3, f).
  • New downlink command: cmd:getmission — requests a full mission download from the aircraft.
  • New telemetry message type: dlwp: — carries one waypoint per message during mission download.
  • New telemetry fields: wpmax (max waypoint count), wpv (mission validity).

See BulletGCSS_protocol.md for full field reference.


Documentation

  • User-Interface.md — full Mission Planner section, Monitor Other UAVs section, updated sidebar menu reference, new screenshots.
  • BulletGCSS_protocol.mdsetwp/getmission command reference, dlwp: message type and field reference, Mission Upload and Mission Download protocol descriptions.
  • TODO.md — F1 and F2 marked completed; F2 planning notes updated to reflect heap allocation and all implemented guards.

Upgrade Notes

  • Firmware re-flash required for mission planner and download features (cmd:setwp, cmd:getmission, dlwp: support).
  • No Config.h changes required unless updating MQTT topics or adding a new key pair.
  • The Ed25519 key pair from v1.5 remains valid — no need to regenerate.
  • INAV 9 or newer required (unchanged from v1.5).

v1.5

29 Mar 20:15

Choose a tag to compare

Bullet GCSS v1.5 — Release Notes

Overview

v1.5 is a significant feature release focused on remote command capability, map interactivity, and firmware reliability. It introduces three new inflight commands (Set Altitude, Set Course, Jump to Waypoint), a reworked interactive map with a modern vector renderer, and several firmware fixes that improve connectivity stability in real-world deployments.


New Features

Remote Flight Commands

Three new commands are now available in the Commands panel, enabling more capable remote control of the UAV during flight:

  • Set Altitude — Sends a target altitude (in cm, relative to home) to the flight controller via MSP. Only enabled when Altitude Hold mode is active on the FC.
  • Set Course — Sets the cruise/course-hold heading in centidegrees. Only enabled when Cruise mode is active on the FC.
  • Jump to Waypoint — Commands the flight controller to jump to a specific waypoint number in the loaded mission. Only enabled when WP Mission mode is active on the FC.

These commands require INAV firmware version 9.0.2 or later (the minimum version that supports the underlying MSP write commands). The UI automatically detects the FC firmware version via telemetry and enables or disables these buttons accordingly.

Click-to-Jump on Map

When WP Mission mode is active, clicking any waypoint marker on the map now opens a confirmation prompt and sends a Jump to Waypoint command for that waypoint. This makes mission management during flight much more intuitive — no need to manually type waypoint numbers.

Flight Mode State Telemetry

The firmware now reports whether each commandable flight mode is actually active on the flight controller, regardless of the source (manual switch, RC override, or GCS command). Three new telemetry fields — fmcrs, fmalt, and fmwp — allow the UI to accurately gate command availability based on real FC state rather than just what was last commanded.

FC Firmware Version Telemetry

The firmware version of the flight controller is now read at startup via MSP_FC_VERSION and reported to the UI as a low-priority telemetry field (fcver:M.m.p). This allows the UI to conditionally enable features based on FC capability without requiring manual configuration.

Map Overhaul (MapLibre GL JS)

The map engine has been completely replaced, switching from OpenLayers to MapLibre GL JS with vector tile rendering. Key improvements:

  • Smooth, GPU-accelerated vector map rendering
  • Two map styles selectable from the Settings panel: CARTO Dark Matter (default) and OpenFreeMap Liberty
  • Aircraft marker scaled correctly for HiDPI/Retina displays
  • All EFIS canvas elements and line widths also scaled by devicePixelRatio
  • New center-on-aircraft button to snap the map view back to the UAV
  • Compass button resized for comfortable touch use on mobile screens

Command Channel Status Improvements

The command status icon in the top bar now has three distinct states — error, warning, and ok — reflecting both the MQTT downlink connection and the MSP RC Override flight mode state on the FC. This gives operators a clearer picture of whether remote commands will actually reach the aircraft.

Developer Console Override

The internal telemetry data object is now exposed as window._gcssData in the browser console. This allows developers and advanced users to inspect live data or override values (e.g., simulating extended command support) without modifying source files.


Firmware Fixes

GPRS Reconnect Reliability

A significant reliability issue was fixed where the firmware would stall for up to 2 minutes after a mid-flight TCP disconnect. The root cause was that any network failure triggered a full cold-start sequence (modem restart + 600-second network wait), blocking all MQTT publishing and telemetry.

The reconnect logic has been reworked:

  • Cold-start (first boot) and mid-flight reconnect are now separate code paths.
  • On TCP disconnect, the firmware attempts a fast reconnect without restarting the modem.
  • After 5 consecutive failures, a soft modem restart is attempted.
  • After 15 failures, the ESP32 performs a full restart as a last resort.

SIM7600 Power-On Sequence

The SIM7600 4G modem power-on sequence has been corrected. The MODEM_POWER_ON pin is now asserted high before the PWKEY pulse, giving the power rail time to stabilize before the modem begins its startup sequence. This resolves initialization failures reported on some hardware configurations.


UI Improvements

  • Input validation on Set Altitude, Set Course, and Jump to Waypoint fields — invalid or out-of-range values are rejected with a visual error state before sending.
  • WP Mission ON button is now gated on a valid loaded mission being present on the FC (isWaypointMissionValid). The button is disabled if no mission is loaded, preventing accidental activation.
  • OFF buttons for flight mode commands are only enabled once the firmware confirms the mode is actually active, avoiding race conditions between command and telemetry.
  • Jump to WP input maximum is updated dynamically to match the number of waypoints in the loaded mission.
  • Command panel layout reordered for a more logical flow: RTH → Altitude Hold → Set Altitude → Cruise → Set Course → WP Mission → Jump to WP → Beeper → Ping.
  • User location compass heading accuracy fix.
  • Sidebar z-index fix (sidebar was appearing behind map elements on some browsers).
  • Map and data state now reset correctly when a new session begins.

Documentation

  • Protocol reference (docs/BulletGCSS_protocol.md) updated with all new telemetry fields, the three extended commands, command channel state semantics, and the FC version capability detection mechanism.
  • User interface documentation updated to describe the new command icon states.
  • MQTT broker settings documentation revised.

INAV Contribution

The three extended commands (Set Altitude, Set Course, Jump to Waypoint) are backed by three new MSP write commands contributed to the INAV project:

Command MSP Code Description
MSP2_INAV_SET_WP_INDEX 0x2221 Jump to waypoint N during active mission
MSP2_INAV_SET_ALT_TARGET 0x2222 Set target altitude (cm, relative to home)
MSP2_INAV_SET_CRUISE_HEADING 0x2223 Set cruise/course-hold heading (centidegrees)

These commands are available in INAV 9.0.2 and later.


Upgrade Notes

  • No configuration file changes are required for existing deployments.
  • The extended commands (Set Altitude, Set Course, Jump to Waypoint) require INAV 9.0.2+ on the flight controller. On older firmware, these buttons remain disabled automatically.
  • If deploying with a SIM7600 modem, reflashing the firmware is recommended to benefit from the improved power-on sequence and reconnect reliability fixes.

v1.4

27 Mar 02:05

Choose a tag to compare

Bullet GCSS v1.4 — Release Notes

What's New

Version 1.4 is a major release bringing the first real flight controller command capability to Bullet GCSS. From your phone, you can now toggle flight modes on the aircraft over a fully authenticated, bi-directional link — no extra hardware, no new wiring, just a firmware update and a key paste.


Flight Controller Commands

The headline feature of v1.4. You can now send the following commands to the aircraft directly from the UI:

Command What it does
Return to Home (RTH) Activates or deactivates INAV's RTH mode
Altitude Hold Activates or deactivates altitude hold
Cruise Mode Activates or deactivates cruise mode
Waypoint Mission Starts or stops the loaded waypoint mission
Angle Mode Activates or deactivates angle (self-leveling) mode
Beeper Arms or disarms the aircraft beeper

Each command has an ON and OFF button in the UI. The buttons reflect the real FC state from telemetry — green border when the mode is confirmed active, dimmed when confirmed inactive.

How it works

Commands work by overriding RC channel values on the flight controller via MSP_SET_RAW_RC. The firmware discovers which RC channel controls each flight mode at startup by querying MSP_MODE_RANGES, then automatically configures the msp_override_channels bitmask in INAV RAM so no manual Configurator steps are needed.

A gap-finding algorithm ensures that deactivating one mode on a shared RC channel never accidentally activates another mode that uses the same channel. The algorithm scans the full PWM range [900–2100], finds the largest gap not covered by any other mode assignment on that channel, and sends the midpoint as the safe "off" value.

Requirements

  • The MSP RC OVERRIDE flight mode must be assigned to an RC channel switch in INAV Configurator (Modes tab) and the switch must be in the active position.
  • The operator must generate an Ed25519 key pair in the Security panel, paste the public key into Config.h, and re-flash the firmware. This was already required for the Ping command (v1.3).

Signed Command Security

All commands — including the new flight mode toggles — are authenticated with Ed25519 digital signatures using the key pair set up in the Security panel. The firmware verifies every command before acting on it and rejects:

  • Commands with an invalid or missing signature
  • Commands with a sequence number ≤ the last accepted (replay protection)
  • Commands sent while no public key is configured

The last accepted sequence number is persisted to ESP32 NVS flash so replay protection survives firmware reboots.


UI Improvements

Commands Panel Redesign

The Commands panel now has a clean grid layout: one row per command, with the command name on the left and ON/OFF buttons on the right. Button state is visually indicated — no guessing whether the mode is active.

Floating Action Button (FAB)

A CMD floating button appears in the bottom-right corner of every screen. Tapping it opens the Commands panel instantly, without navigating through the sidebar menu.

Restructured Sidebar Menu

The sidebar menu has been reorganised for clarity:

  • Send command and Sessions are top-level items for quick access.
  • Keep screen awake, Refresh App, Help, and Install remain at the top level.
  • Broker settings, UI settings, Security, Mission Planner, and INAV Settings are now grouped under a Settings submenu, reducing clutter.

Sessions and Log Merged

The separate "Log" menu has been removed. The Sessions panel now includes:

  • Export session — saves the current session's messages as a TXT file (was "Save log file").
  • Import session — loads a previously exported file for replay (was "Replay log file").

This makes it clear that sessions and log files are the same thing.

Single Command Channel Status Icon

The two separate status icons (Downlink Status and MSP RC Override) have been merged into a single Command Channel icon with three states:

State Meaning
Error (red) Not connected to MQTT, or firmware not yet subscribed to command topic
Warning (amber) Subscribed, but MSP RC Override mode is not active on the FC
OK (green) Subscribed and MSP RC Override active — RC commands will work

Firmware Improvements

FreeRTOS Dual-Task Architecture

The MSP communication now runs in a dedicated FreeRTOS task (fcTask, priority 2, Core 1), separate from the MQTT publish loop (Arduino loop task). This prevents MQTT connection stalls caused by long MSP exchanges.

Optimised MSP Polling (Round-Robin, 160 ms)

Telemetry is divided into 6 round-robin groups. One group is fetched per 160 ms cycle, giving a full telemetry refresh every ~960 ms. This keeps each cycle well within the 160 ms window without overrunning.

MSP_GET_RC and MSP_SET_RAW_RC run every cycle (every 160 ms) to keep INAV's RC override freshness timer alive — INAV drops overridden channels if no MSP_SET_RAW_RC arrives within 200 ms.

Slow-Poll for Static Data

Callsign and waypoint data change rarely, so msp_get_callsign() and get_all_waypoints() now run every 10 seconds instead of every telemetry cycle, reducing MSP bus load.


Protocol Changes

One new command type is added to the downlink (UI → firmware) message format:

cmd:rth,cid:ABC123,seq:43,state:1,sig:base64...==,

The state field (1 = activate, 0 = deactivate) is informational and is not included in the signed payload — this allows the same key pair and sequence counter to cover both the on and off directions of a command without requiring separate signing paths.

Supported cmd values: ping, rth, althold, cruise, wp, angle, beeper.

See BulletGCSS_protocol.md for the full protocol reference.


Upgrading from v1.3

  1. Flash the new firmware (PlatformIO — no new hardware needed).
  2. If you have not yet set up a key pair, open the UI Security panel → Generate key pair → copy the public key declaration into Config.h → re-flash.
  3. In INAV Configurator, confirm that MSP RC OVERRIDE is assigned to a switch on the Modes tab.
  4. Update your UI deployment (or use https://bulletgcss.outros.net).

v1.3

22 Mar 01:55

Choose a tag to compare

BulletGCSS v1.3 Release Notes

It has been a while since the last release, but BulletGCSS is very much alive — and this update is a big one. Version 1.3 brings security improvements, firmware reliability fixes, better tooling for developers, and a lot of new documentation. And there is plenty more coming.


What's new

🔒 Security improvements

Optional TLS encryption for the MQTT connection
The firmware can now connect to your MQTT broker over an encrypted TLS connection. Enable it with #define USE_TLS in Config.h and point your broker to port 8883. This protects your telemetry stream from passive eavesdropping on the cellular or WiFi network. TLS is optional — plain connections still work exactly as before.

Telemetry input validation
The UI now validates every field received from the MQTT broker before displaying it. Out-of-range or malformed values are silently discarded rather than displayed. GPS coordinates are validated as a pair — a single bad coordinate no longer corrupts the map position.

Elevation proxy hardened
The proxy.php used for terrain elevation data now enforces a strict domain allowlist. Previously the allowlist was disabled entirely, making it an open proxy.


🛠 Firmware fixes

  • MQTT client ID collision — Multiple aircraft connecting to the same broker could knock each other offline by sharing the hardcoded client ID "ESP32Client". Each device now identifies itself with a unique ID based on its hardware MAC address (ESP32_<MAC>).
  • MQTT connection dropping after every message — The MQTT keepalive loop (client.loop()) was never called, so the broker would close the connection after the keepalive timeout — typically 15 seconds. On brokers that require a PINGREQ/PINGRESP exchange (rather than counting any packet as activity), this caused the connection to drop on every message cycle. Fixed by calling client.loop() on every iteration of the main loop.
  • Timer overflow bug — A subtle uint32_t overflow in the telemetry loop timing would cause the firmware to stall after approximately 49 days of continuous uptime. Fixed.
  • Waypoint array — The waypoint mission buffer was one entry short (255 instead of 256), which could cause a buffer overrun on a full mission. Fixed.
  • MSP error handling — An accidentally commented-out error return in msp_library.cpp was re-enabled, making communication failures properly reported instead of silently ignored.

🧰 Developer experience

  • PlatformIO support — The firmware can now be built with PlatformIO in addition to Arduino IDE. Two ready-to-use environments are included: esp32-sim7600 (T-PCIE board) and esp32-sim800 (T-Call board). Dependencies are managed automatically — no manual library installation needed. See the new Development Setup guide.
  • GitHub Actions CI — Every push to the firmware code now automatically compiles both board variants to catch build errors early.
  • Credentials no longer in the repositoryConfig.h is now gitignored. A Config.h.example with placeholder values is provided as a starting point.
  • Third-party library cleanup — Bootstrap, jQuery, and Popper were never actually used by the UI and have been removed from the repository. The remaining libraries (OpenLayers, Paho MQTT, NoSleep, Open Location Code) are now documented with pinned versions in UI/package.json, and a download-libs.sh script makes updating them straightforward.

📖 Documentation

A lot of effort went into documentation this release:

  • Troubleshooting guide — Step-by-step help for the most common problems: firmware not connecting, no data in the UI, how to verify the ESP32 is publishing using mosquitto_sub, and more.
  • Development setup guide — Full instructions for setting up PlatformIO or Arduino IDE on Windows, macOS, and Linux.
  • Communication protocol reference — Updated with field validation bounds and a note on the QoS design decision.
  • Multi-aircraft monitoring — Documents current behaviour and the planned multi-aircraft feature.
  • All documentation has been moved into the repository itself (previously it lived on the GitHub Wiki), making it easier to keep in sync with the code.

What's coming

v1.3 is laying the groundwork for some bigger features planned for upcoming releases:

  • Uplink / command capability — Sending waypoint missions from the UI to the aircraft
  • Multi-aircraft monitoring — Multiple aircraft on a single map with a quick telemetry selector
  • Binary telemetry protocol — A compact binary format to replace the current text protocol, reducing data usage and enabling protocol versioning
  • ES Modules refactor — Modernising the UI codebase to use native JavaScript modules

Upgrading

Firmware: re-flash your ESP32 with the new firmware. If you want TLS, add #define USE_TLS to your Config.h and update your broker port to 8883.

UI: if you are self-hosting, re-deploy the UI/ folder. If you use the hosted version at bulletgcss.outros.net, it is already updated.

The new UI is fully backwards compatible with v1.0 firmware — you can update the UI without updating your firmware and everything will continue to work.

v1.0

28 Feb 21:28

Choose a tag to compare

This is the first "Usable" version of Bullet GCSS.

It doesn't has any "control" features yet. But the telemetry part is pretty much complete.
The modem firmware works both on SIM800L and SIM7600 (2G and 4G modems).