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

Detect Devices

Click Detect Devices at the top of the page and graywolf scans your hardware: USB audio adapters with CM108 PTT, /dev/gpiochip* nodes on Linux, USB-serial ports, and so on. Two lists come back:

Detection is the fastest way to set up PTT correctly. Use Add PTT manually if your hardware doesn’t enumerate the way you expected.

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 via gpiochip character device Raspberry Pi GPIO header
cm108 USB HID GPIO on CM108/CM119 audio codec USB sound cards with built-in PTT
rigctld Hamlib rigctld over TCP (CAT control) Any rig supported by hamlib

PTT Settings

FieldDefaultDescription
method none PTT control method (see table above)
device Serial device path (e.g., /dev/ttyUSB0), CM108 hidraw node, or gpiochip device (e.g., /dev/gpiochip0)
gpio_line 0 GPIO line offset on the selected gpiochip for the gpio method. 0-indexed, matches the kernel’s line numbering shown by gpioinfo.
gpio_pin 3 CM108 HID GPIO pin number for the cm108 method. 1-indexed (1–4 on CM108/CM108B, 1–8 on CM119). Not used by the gpio method.
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)

GPIO PTT is Linux-only. It targets single-board computers with exposed GPIO headers — Raspberry Pi, BeagleBone, and similar — where you can wire a GPIO line directly to your radio’s PTT input. On non-Linux hosts the gpio method is hidden from the method dropdown and the backend returns gpio ptt is only supported on Linux if forced via API.

Graywolf uses the chardev v2 API (/dev/gpiochipN). The legacy sysfs interface (/sys/class/gpio) is deprecated and not supported.

In the PTT dialog, select gpio, then pick the gpiochip device from the auto-detected list (typically /dev/gpiochip0 on a Pi). The UI then calls /api/ptt/gpio-lines and populates a line selector with the lines reported by the chip. Each entry shows the offset and the kernel’s line name (for example, Line 14 — TXD1). Lines already claimed by another kernel driver — SPI, I2C, UART, and so on — are annotated [in use: <consumer>] in the label and are rejected by the form before submit with a message like Line 2 is claimed by i2c-bcm2835. Pick another line.

When GPIO PTT is active, the consumer label graywolf-ptt shows up in gpioinfo output so you can confirm which process is holding the line. Graywolf drives the line low before releasing it, so the PTT input is left inactive when graywolf stops or the channel is reconfigured.

If you run graywolf on a Linux host where no gpiochip devices are available — for example, inside a container without a bind mount for /dev/gpiochip*, or as a user without read/write access — the GPIO method stays visible in the dropdown but the line selector reports No GPIO chips detected. Check that you have access to /dev/gpiochip* (typically the ‘gpio’ group on Raspberry Pi OS).

Linux permissions: the graywolf user must have read/write access to /dev/gpiochipN — typically the gpio group on Raspberry Pi OS, or plugdev on other distros. If a line open fails with permission denied, add the user to the appropriate group and re-login (or reboot):

sudo usermod -aG gpio $USER

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 GPIO pin selector is annotated for you: pin 3 (the default) is the most common, pin 2 is unavailable on CM108AH/B, and pins 5–8 only exist on CM109/CM119.

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)