Push-to-Talk

Control radio keying and channel access

Push-to-talk (PTT) configuration tells graywolf how to key your radio for transmission. Each radio channel has its own PTT configuration. If a channel has no output device or PTT method set to none, it operates in receive-only mode.

PTT Configuration page showing a Serial RTS PTT on /dev/cu.usbserial
PTT configuration showing a serial RTS setup for the VHF APRS channel

PTT Methods

MethodDescriptionTypical Hardware
none No PTT control (receive only)
serial_rts Assert RTS pin on a serial port USB-to-serial adapter, Digirig
serial_dtr Assert DTR pin on a serial port USB-to-serial adapter
gpio Linux GPIO pin (sysfs or libgpiod) Raspberry Pi GPIO header
cm108 USB HID GPIO on CM108/CM119 audio codec USB sound cards with built-in PTT

PTT Settings

FieldDefaultDescription
method none PTT control method (see table above)
device Serial device path (e.g., /dev/ttyUSB0) or GPIO device
gpio_pin GPIO pin number (for gpio and cm108 methods)
invert false Reverse PTT polarity (for backwards-wired rigs)

Serial PTT

Serial RTS or DTR is the most common PTT method. The modem asserts the chosen pin when transmitting and de-asserts it when done. Most USB sound card interfaces (Digirig, SignaLink USB) use this approach.

# Find your serial device
ls /dev/ttyUSB* /dev/ttyACM*

The graywolf user must have permission to access the serial device. Adding the user to the dialout group (Linux) handles this. The systemd service file includes this group by default.

GPIO PTT (Raspberry Pi)

For Raspberry Pi setups, you can key the radio directly from a GPIO pin. Specify the gpio method with the pin number. The modem uses Linux’s GPIO character device interface.

GPIO pins output 3.3V. If your radio requires a different voltage or current, use a transistor or optocoupler circuit to interface the GPIO pin with your radio’s PTT line.

CM108 PTT (USB HID GPIO)

CM108-family USB audio codecs (C-Media CM108, CM108AH, CM108B, CM109, CM119) expose a HID interface alongside audio that can toggle GPIO pins for PTT. This is the method used by Digirig, AIOC, and many homebrew adapters that combine a USB sound card with PTT on a single device.

Select the cm108 method and choose the detected hidraw device. The default GPIO pin is 3, which is correct for nearly all commercial and homebrew designs.

Supported Devices
DeviceVID:PIDNotes
CM108 / CM108AH / CM108B0d8c:*Generic C-Media, Digirig
CM109 / CM119 / CM119A0d8c:*Extended GPIO (1–8)
AIOC (All-In-One-Cable)1209:7388STM32-based CM108 emulation

Linux permissions: The /dev/hidraw* devices are typically root-only. Graywolf ships a udev rule (99-graywolf-cm108.rules) that grants access to the plugdev group for CM108-compatible devices. The systemd service includes this group by default. If you installed manually, add your user to the plugdev group and reload udev rules:

sudo usermod -aG plugdev $USER
sudo udevadm control --reload-rules
sudo udevadm trigger

USB audio latency: USB sound cards add audio latency (typically 5–20 ms). If the beginning of your transmissions is clipped, increase TX Delay to compensate.

macOS: CM108 HID GPIO PTT is supported on macOS via the IOKit HID interface. Device enumeration and GPIO control work the same as on Linux and Windows. Unlike Linux, there is no automatic audio–HID correlation — select the correct device from the list manually.

CSMA Channel Access

CSMA (Carrier Sense Multiple Access) prevents graywolf from transmitting while another station is on the air. The TX governor checks the DCD (Data Carrier Detect) state before keying.

CSMA Parameters
FieldDefaultDescription
slot_time_ms 10 Time slot duration for p-persistence algorithm
persist 63 Persistence value (0–255). Higher = more aggressive
dwait_ms 0 Dwell/backoff time after DCD clears

The p-persistence algorithm works as follows: when the channel is clear (DCD inactive), graywolf generates a random number 0–255. If it’s less than persist, it transmits immediately. Otherwise, it waits one slot_time_ms and tries again.

TX Rate Limiting

The TX governor enforces per-channel rate limits to prevent excessive transmissions. Configure these through the TX timing API:

rate_1min Maximum packets per minute (0 = unlimited)
rate_5min Maximum packets per 5 minutes (0 = unlimited)
full_dup Skip CSMA entirely (for full-duplex setups)

API Reference

MethodEndpointDescription
GET/api/ptt/{channel_id}Get PTT config for a channel
POST/api/ptt/{channel_id}Create or update PTT config
DELETE/api/ptt/{channel_id}Delete PTT config (receive only)
GET/api/tx-timing/{channel_id}Get CSMA parameters
POST/api/tx-timing/{channel_id}Create or update CSMA parameters