CSVF2 - radio text/file modem      (version 1.3, 2026-09-21)
==========================================================

CSVF = client server via frequency.

Sends text or a file over a voice radio as audio tones, and receives it again.
Your callsign is spoken (NATO phonetics + numbers) at the start, at the end and often enough on
long transmissions to stay inside the 10 minute rule. audio/website.wav plays right after the
tones and before the closing callsign.

Long transmissions are sent in bursts of 2 minutes with a silent gap between them, so a radio
with a time-out timer (e.g. TYT MD-390, 180 s) un-keys and resets. Each burst starts with a
steady 400 Hz keying tone for VOX radios. Both are settings on the Transmit tab.

Quick start
  1. Install Python 3.10 or newer.
  2. pip install -r requirements.txt
  3. python radio_gui.py

radio_server.py runs a station that answers on its own: it listens all the time, and when it
hears the text "ping" it waits 30 seconds and transmits "pong" (both texts and the delay are
settings). It has the same settings as the window and remembers them.
  python radio_server.py

Transmit tab : pick Text or File, type your callsign, choose a Speed, Transmit.
Receive tab  : choose the radio's audio input, Start listening. The Sensitivity slider sets how
               weak a signal may be and still start a message (higher = weaker signals, but a
               greater chance of starting on noise). Messages appear
               in the log; when a file finishes you get a save prompt.

Files
  radio_gui.py     the window
  radio_server.py  the automatic ping/pong station
  radio_modem.py   the modem (encoder + decoder, no GUI, protocol described at the top)
  audio/           a-z (phonetic words) and 0-9 clips for the spoken callsign, and
                   website.wav (replace it with your own announcement, or delete it
                   to skip it). Keep this folder next to the .py files.

Full documentation: the CSVF2 page on the KE9GDP site.
You are responsible for operating within your licence and local rules.
