gr-apollo/grc/apollo_usb_uplink_receiver.block.yml
Ryan Malloy 0e77373ea4 Add uplink chain: DSKY command encoder to RF and back
Uplink word codec (uplink_word_codec.py):
- UplinkSerializerEngine: (channel, value) pairs to 15-bit NRZ bit stream
  with configurable inter-word gap for UPRUPT timing
- UplinkDeserializerEngine: two-phase state machine (acquisition + fixed
  framing) recovers words from NRZ bits, handles leading-zero data words
- GR wrappers: uplink_word_serializer (sync_block source) and
  uplink_word_deserializer (basic_block sink with message output)

TX source (usb_uplink_source.py):
- hier_block2 wiring: word_serializer -> nrz_encoder -> FM mod (4 kHz dev)
  -> 70 kHz upconvert -> complex_to_real -> PM mod (1.0 rad) -> [AWGN]
- Message input "words" forwards PDUs from uplink_encoder

RX receiver (usb_uplink_receiver.py):
- hier_block2 wiring: PM demod -> subcarrier_extract (70 kHz, 20 kHz BW)
  -> quadrature_demod -> matched filter -> decimate -> slicer -> deserializer
- Message output "commands" emits recovered (channel, value) PDUs

GRC block definitions for both source and receiver.

Loopback demo (uplink_loopback_demo.py):
- Encodes V16N36E, serializes with pure-Python engine, runs through GR RF
  chain (FM + PM + noise + demod), deserializes, compares TX vs RX words
2026-02-24 14:17:58 -07:00

58 lines
1.4 KiB
YAML

id: apollo_usb_uplink_receiver
label: Apollo USB Uplink Receiver
category: '[Apollo USB]'
flags: [python]
parameters:
- id: sample_rate
label: Sample Rate (Hz)
dtype: float
default: '5120000'
- id: bit_rate
label: Uplink Bit Rate
dtype: int
default: '2000'
- id: carrier_pll_bw
label: Carrier PLL Bandwidth
dtype: float
default: '0.02'
- id: subcarrier_bw
label: Subcarrier Bandwidth (Hz)
dtype: float
default: '20000'
inputs:
- label: in
domain: stream
dtype: complex
outputs:
- label: commands
domain: message
templates:
imports: from apollo.usb_uplink_receiver import usb_uplink_receiver
make: >-
apollo.usb_uplink_receiver.usb_uplink_receiver(
sample_rate=${sample_rate},
bit_rate=${bit_rate},
carrier_pll_bw=${carrier_pll_bw},
subcarrier_bw=${subcarrier_bw})
documentation: |-
Apollo USB Uplink Receiver -- spacecraft command receiver.
Demodulates uplink commands from complex baseband:
PM demod -> 70 kHz subcarrier extract -> FM demod -> bit recovery -> word assembly
Message output:
commands -- decoded (channel, value) PDUs for AGC bridge
Parameters:
sample_rate: Input sample rate (default 5.12 MHz)
bit_rate: Expected uplink data rate (default 2000 bps)
carrier_pll_bw: PM carrier recovery loop bandwidth (default 0.02)
subcarrier_bw: 70 kHz subcarrier filter bandwidth (default 20 kHz)
file_format: 1