Skip to content

Releases: danarrib/BulletGCSS

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).