Skip to content

Add SLT6_Tx subprotocol with NRF24L01 direct transmission support#4

Closed
MRC3742 with Copilot wants to merge 32 commits into
masterfrom
copilot/copt-slt6-add
Closed

Add SLT6_Tx subprotocol with NRF24L01 direct transmission support#4
MRC3742 with Copilot wants to merge 32 commits into
masterfrom
copilot/copt-slt6-add

Conversation

Copilot AI commented Feb 12, 2026

Copy link
Copy Markdown

Adds the SLT6_Tx subprotocol for the Blade Revolution 90 FP helicopter's SLT6 transmitter variant. Decoded from SPI captures of the original Si24R1-based transmitter. The SLT6 protocol uses a triple-address transmission pattern (7B/6B/5B payloads to 3 XOR-derived addresses per 18ms cycle) with discrete flight mode and panic switch encoding.

Key finding: the SLT6 receiver requires native NRF24L01 GFSK modulation — the CC2500 NRF250K emulation layer produces ~20% lower deviation (127kHz vs 160kHz) causing intermittent packet drops at 250kbps.

Protocol implementation (SLT_ccnrf.ino)

  • 8-state callback machine: BUILD_A → A1 → A2 → B1 → B2 → C1 → C2 → BIND
  • Three sub-cycles per triple with TX address byte[0] XOR'd by 0x00/0x06/0x09
  • Hop offsets +0/+3/+6 (mod 15), sequence starts at index 1
  • AETR range limited to 182–842 (10-bit, matching capture data)
  • CH5 flight mode: 3-position discrete (0x30/0x80/0xD0) at ±33% thresholds
  • CH6 panic: binary discrete (0xD0 off, 0x30 active), center=off

NRF24L01 chip selection for SLT (SLT_ccnrf.ino, NRF250K_EMU.ino)

  • SLT passes force_nrf = (option == 0) to XN297_Configure, defaulting to NRF24L01
  • NRF250K_SetTXAddr and NRF250K_WritePayload now check xn297_rf at runtime on dual-chip builds to route to the correct chip
  • All other 250K protocols (BUMBLEB, GD00X, V911S, OMP, etc.) unchanged — still default to CC2500
// SLT-specific: option==0 → NRF24L01 (smooth), option!=0 → CC2500 (with freq tune)
XN297_Configure(XN297_CRCEN, XN297_SCRAMBLED, XN297_250K, option == 0);

Supporting changes

  • Multiprotocol.h: SLT6_Tx = 7 enum value
  • Multi_Protos.ino: subtype string and count updated
  • Multi.txt, _Config.h, Protocols_Details.md: protocol listing and documentation

💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

Copilot AI and others added 4 commits February 12, 2026 22:16
Decoded from SPI captures of the SLT6 transmitter. The SLT6 protocol
uses triple-address transmission: each 18ms cycle sends to 3 different
TX addresses (byte[0] XOR'd with 0x00/0x06/0x09) with payload sizes
7/6/5 bytes respectively. Flight mode (CH5) and panic (CH6) are
encoded as 8-bit values in bytes 5-6 of the 7-byte payload.

Co-authored-by: MRC3742 <26642502+MRC3742@users.noreply.github.com>
Co-authored-by: MRC3742 <26642502+MRC3742@users.noreply.github.com>
Co-authored-by: MRC3742 <26642502+MRC3742@users.noreply.github.com>
Co-authored-by: MRC3742 <26642502+MRC3742@users.noreply.github.com>
Copilot AI changed the title [WIP] Add SLT6 transmitter support to protocol code Add SLT6_Tx subprotocol for Blade Revolution 90 FP helicopter Feb 12, 2026
Copilot AI requested a review from MRC3742 February 12, 2026 22:18
Copilot AI and others added 2 commits February 13, 2026 00:37
Key fixes from analyzing the SPI captures:
1. Bind: Single 4B TX-ID bind packet at startup only (no periodic rebind)
2. Hopping: Each sub-cycle uses offset channels (+0/+3/+6 in 15-ch seq),
   hopping_frequency_no advances once per triple (not per sub-cycle)
3. Data: Each sub-cycle rebuilds packet from current channel values
4. Flight mode (CH5): 3-position mapped to 0xD0/0x80/0x30
5. Panic (CH6): Binary switch mapped to 0xD0 (off) / 0x30 (active)
6. Clean separation of SLT6 state machine from other SLT variants

Co-authored-by: MRC3742 <26642502+MRC3742@users.noreply.github.com>
Co-authored-by: MRC3742 <26642502+MRC3742@users.noreply.github.com>
Copilot AI changed the title Add SLT6_Tx subprotocol for Blade Revolution 90 FP helicopter Fix SLT6_Tx subprotocol: correct hopping, bind, and flight mode from capture analysis Feb 13, 2026
…precise timing

- Merge BUILD and DATA1 into a single callback phase (9→6 callbacks/triple)
  to reduce timing jitter from interrupt latency
- Add SLT_wait_radio() before changing radio settings to ensure previous TX
  is complete before channel/address changes
- Use capture-derived timing: 1633us intra-pair (was 1643), 5998us sub-cycle
  (was 6000) matching the original SLT6 transmitter within 0.5us
- Remove dead SLT6 code from SLT_build_packet() (was unreachable)

Co-authored-by: MRC3742 <26642502+MRC3742@users.noreply.github.com>
Copilot AI changed the title Fix SLT6_Tx subprotocol: correct hopping, bind, and flight mode from capture analysis SLT6_Tx: reduce callback jitter causing choppy AETR controls Feb 13, 2026
The original SLT6 TX only sends 3 discrete values for flight mode:
0x30 (low), 0x80 (center), 0xD0 (high). The previous code used
convert_channel_8b_limit_deadband() which linearly interpolated,
producing invalid intermediate values (0x52, 0xAE, etc.) that the
receiver likely rejects -- causing both flight mode not switching
until near ±100% and occasional AETR stops/jumps from dropped packets.

Now uses direct Channel_data comparison with ±60% thresholds (±492
from center in raw channel units) to snap to discrete values only.

Co-authored-by: MRC3742 <26642502+MRC3742@users.noreply.github.com>
Copilot AI changed the title SLT6_Tx: reduce callback jitter causing choppy AETR controls Add SLT6_Tx subprotocol for Blade Revolution 90 FP helicopter Feb 13, 2026
Copilot AI changed the title Add SLT6_Tx subprotocol with direct NRF24L01 support and fix NRF250K runtime chip selection Add SLT6_Tx subprotocol and fix NRF250K runtime chip selection for 250K protocols Feb 15, 2026
Copilot AI changed the title Add SLT6_Tx subprotocol and fix NRF250K runtime chip selection for 250K protocols Add SLT6_Tx subprotocol with direct NRF24L01 support and fix NRF250K runtime chip selection Feb 15, 2026
Reverts XN297_EMU.ino and NRF250K_EMU.ino to original master code:
- XN297_Configure: 250K always uses CC2500 on dual-chip (original behavior)
- NRF250K_SetTXAddr/WritePayload: compile-time #if/#elif (original behavior)

Makes SLT force NRF24L01 via the existing force_nrf parameter:
- SLT_RF_init: XN297_Configure(..., force_nrf=true) instead of NRF250K_Init()
- SLT uses raw NRF24L01 packets (not XN297 emulation), so it should not be
  affected by the CC2500 default for 250K XN297 protocols
- This applies to ALL SLT variants including SLT6_Tx

Co-authored-by: MRC3742 <26642502+MRC3742@users.noreply.github.com>
Copilot AI changed the title Add SLT6_Tx subprotocol with direct NRF24L01 support and fix NRF250K runtime chip selection Add SLT6_Tx subprotocol with direct NRF24L01 triple-address transmission Feb 17, 2026
…uning

Changes force_nrf parameter from hardcoded true to (option == 0).
This is SLT-specific — all other 250K protocols remain unchanged
(always CC2500 on dual-chip modules).

Co-authored-by: MRC3742 <26642502+MRC3742@users.noreply.github.com>
Copilot AI changed the title Add SLT6_Tx subprotocol with direct NRF24L01 triple-address transmission Add SLT6_Tx subprotocol for Blade Revolution 90 FP helicopter Feb 21, 2026
NRF250K_SetTXAddr and NRF250K_WritePayload now check xn297_rf at
runtime on dual-chip builds, allowing protocols that pass force_nrf
(currently only SLT via option==0) to use the NRF24L01 chip.

On dual-chip builds:
- SetTXAddr: always stores addr for CC2500 path, also writes
  NRF24L01 registers when xn297_rf == XN297_NRF
- WritePayload: NRF24L01 path first with early return when
  xn297_rf == XN297_NRF, CC2500 path otherwise

Single-chip builds unchanged (compile-time selection as before).
Other 250K protocols unchanged (force_nrf defaults to false).

Co-authored-by: MRC3742 <26642502+MRC3742@users.noreply.github.com>
Copilot AI changed the title Add SLT6_Tx subprotocol for Blade Revolution 90 FP helicopter Add SLT6_Tx subprotocol and fix NRF250K runtime chip selection on dual-chip modules Feb 22, 2026
Copilot AI changed the title Add SLT6_Tx subprotocol and fix NRF250K runtime chip selection on dual-chip modules Add SLT6_Tx subprotocol with NRF24L01 direct transmission support Feb 22, 2026
@MRC3742

MRC3742 commented Feb 25, 2026

Copy link
Copy Markdown
Owner

I decided to change the base branch so I've closed this one and opened PR #10 to continue to work on this updated protocol.

@MRC3742 MRC3742 closed this Feb 25, 2026
@MRC3742
MRC3742 deleted the copilot/copt-slt6-add branch April 23, 2026 00:36
Copilot AI added a commit that referenced this pull request May 11, 2026
Copilot AI added a commit that referenced this pull request May 11, 2026
Copilot AI added a commit that referenced this pull request May 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants