gr-apollo/grc/apollo_usb_uplink_source.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

61 lines
1.4 KiB
YAML

id: apollo_usb_uplink_source
label: Apollo USB Uplink Source
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: pm_deviation
label: PM Deviation (rad)
dtype: float
default: '1.0'
- id: snr_db
label: SNR (dB)
dtype: raw
default: 'None'
inputs:
- label: words
domain: message
optional: true
outputs:
- label: out
domain: stream
dtype: complex
templates:
imports: from apollo.usb_uplink_source import usb_uplink_source
make: >-
apollo.usb_uplink_source.usb_uplink_source(
sample_rate=${sample_rate},
bit_rate=${bit_rate},
pm_deviation=${pm_deviation},
snr_db=${snr_db})
documentation: |-
Apollo USB Uplink Source -- ground station command transmitter.
Generates a PM-modulated complex baseband signal carrying uplink commands
on a 70 kHz FM data subcarrier at 2 kbps NRZ.
This is the transmit-side counterpart to the USB Uplink Receiver.
Message input:
words -- (channel, value) PDUs from uplink_encoder
Parameters:
sample_rate: Output sample rate (default 5.12 MHz)
bit_rate: Uplink data rate (default 2000 bps)
pm_deviation: Peak PM deviation in radians (default 1.0)
snr_db: Add AWGN noise at this SNR (None = no noise)
file_format: 1