12. Operational Model (ART 0522)
12.1 Runtime Topology
Client Browser
→ http://host:8888 (or https:// with reverse proxy)
→ WS endpoints on same host/port
MRRC Host
→ python3 server.py
→ Uvicorn on 0.0.0.0:8888 (configurable via MRRC_WEB_HOST / MRRC_WEB_PORT)
→ Backend selected by MRRC_RADIO_MODEL (ft710 / ic7300 / ic7300mk2)
→ FT-710: Serial CAT via USB Enhanced COM Port (configurable via MRRC_SERIAL_PORT)
→ IC-7300/MK2: CI-V via USB serial port (configurable via MRRC_SERIAL_PORT, backend default 115200 8N1)
→ FT-710 FT4222 SPI: internal FTDI chip (via scope_pipe subprocess)
→ IC-7300/MK2 CI-V 0x27 spectrum: on the same CI-V serial port
→ USB Audio: supported radio USB audio device (auto-detected by PyAudio)
→ PID file: .ft710-server.pid
→ Logs: stdout/stderr (redirected to logs/ by start.sh)
Yaesu FT-710
→ USB connection to host
→ Enhanced COM Port (38400 baud, 8N1)
→ Standard COM Port (115200 baud, for SCU-LAN10 scope models — optional)
→ FT4222 SPI chip (internal)
→ USB Audio interface
Icom IC-7300 / IC-7300MK2
→ USB connection to host
→ Radio menu: CI-V USB Port = Unlink from [REMOTE]
→ USB CI-V serial port (explicit 115200 baud, not Auto; IC-7300 default 0x94, MK2 default 0xB6)
→ 0x27 spectrum data on the same CI-V port (display + data-output switches ON)
→ 48kHz native USB Audio interface
12.2 Configuration
| Name |
Default |
Purpose |
MRRC_RADIO_MODEL |
ft710 |
Backend selection: ft710, ic7300, or ic7300mk2 |
IC7300_CIV_ADDR |
0x94 |
IC-7300 CI-V radio address (hex) |
IC7300MK2_CIV_ADDR |
0xB6 |
IC-7300MK2 CI-V radio address (hex) |
MRRC_SERIAL_PORT |
/dev/cu.SLAB_USBtoUART |
Radio serial port (FT-710 Enhanced COM Port or IC-7300 CI-V port) |
MRRC_BAUD_RATE |
backend default |
CAT/CI-V baud: FT-710 38400; IC-7300/MK2 115200; an explicit value overrides the backend default |
MRRC_WEB_PORT |
8888 |
Uvicorn listen port |
MRRC_WEB_PASSWORD |
changeme_please_use_strong_password! |
Web login password |
MRRC_WEB_HOST |
:: |
Bind address |
MRRC_FTDI_LIB_DIR |
(auto) |
Directory containing FTDI libraries |
MRRC_FT4222_CLK_DIV |
6 |
SPI clock divider (1=fastest, 9=slowest; CLK_DIV_64 default) |
MRRC_SCOPE_PORT |
(optional) |
Scope serial port (Standard COM Port, SCU-LAN10) |
MRRC_SCOPE_BAUD |
115200 |
Scope serial baud rate |
MRRC_MEM_FILE |
mem_channels.json |
Memory channel store (Windows launcher uses %LOCALAPPDATA%) |
MRRC_AUDIO_RX_DEVICE |
(auto) |
Audio input device — index or name substring; Windows package pre-locks USB Audio (FT-710 built-in sound card) |
MRRC_AUDIO_TX_DEVICE |
(auto) |
Audio output device — index or name substring; Windows package pre-locks USB Audio |
.ft710-server.pid |
runtime |
Process ID for start/stop scripts |
12.3 Startup Modes
| Mode |
Command |
Behavior |
| Foreground |
python server.py |
Direct console output; Ctrl-C to stop |
| Background |
./start.sh |
Starts in background, logs to logs/, writes PID file |
| Stop |
./stop.sh |
Reads PID file, sends SIGTERM, cleans up PID |
| FT-710 mode |
MRRC_RADIO_MODEL=ft710 python server.py |
Default Yaesu FT-710 backend |
| IC-7300 mode |
MRRC_RADIO_MODEL=ic7300 MRRC_SERIAL_PORT=/dev/cu.usbserial-... MRRC_BAUD_RATE=115200 python server.py |
Icom IC-7300 backend (CI-V 115200 8N1) |
| IC-7300MK2 mode |
MRRC_RADIO_MODEL=ic7300mk2 MRRC_SERIAL_PORT=/dev/cu.usbserial-... MRRC_BAUD_RATE=115200 python server.py |
Icom IC-7300MK2 backend (default CI-V address 0xB6) |
| Custom port |
MRRC_WEB_PORT=8889 python server.py |
Override listen port |
| Custom serial |
MRRC_SERIAL_PORT=/dev/ttyUSB0 python server.py |
Override serial port |
| Custom password |
MRRC_WEB_PASSWORD=mysecret python server.py |
Override login password |
12.4 Connection Matrix
| Source |
Target |
Protocol |
Port/Path |
Description |
| Browser |
Server |
HTTP |
$MRRC_WEB_PORT |
Static UI |
| Browser |
Server |
WS |
/WSradio |
Control (JSON) |
| Browser |
Server |
WS |
/WSaudioRX |
RX audio (binary tagged) |
| Browser |
Server |
WS |
/WSaudioTX |
TX mic uplink (binary tagged + text) |
| Browser |
Server |
WS |
/WSspectrum |
Spectrum waterfall (binary) |
| Browser |
Server |
HTTP |
/api/status |
Full radio state |
| Browser |
Server |
HTTP |
/api/mem_channels |
Memory channels |
| Browser |
Server |
HTTP |
/api/auth/login |
Login |
| Browser |
Server |
HTTP |
/api/auth/logout |
Logout |
| Server |
FT-710 |
Serial |
USB Enhanced COM |
CAT commands |
| Server |
FT-710 |
SPI |
Internal FT4222 |
Scope data |
| Server |
IC-7300/MK2 |
Serial |
USB CI-V port |
CI-V commands (115200 8N1) |
| Server |
IC-7300/MK2 |
Serial |
Same CI-V port |
0x27 spectrum data |
| FT-710 |
Server |
USB Audio |
USB Audio IN |
RX audio |
| Server |
FT-710 |
USB Audio |
USB Audio OUT |
TX audio |
| IC-7300/MK2 |
Server |
USB Audio |
USB Audio IN |
48kHz RX audio |
| Server |
IC-7300/MK2 |
USB Audio |
USB Audio OUT |
48kHz TX audio |
12.5 Operational Procedures
| Procedure |
Steps |
| Start service |
./start.sh; check logs/ for startup messages |
| Stop service |
./stop.sh |
| Verify radio connection |
Server log shows backend-specific connect message (FT-710 ID or IC-7300 CI-V ID) |
| Verify scope |
FT-710: “scope_pipe: first frame received — spectrum active”; IC-7300: first confirm Unlink from [REMOTE] + explicit 115200, then check “CI-V scope: first complete waveform — spectrum active”; real frames broadcast at up to 30 Hz without duplicates |
| Verify RX audio |
Open browser; listen for radio audio; check “RX …K” and startup log fields host, default, actual, channels (IC-7300/MK2: actual=48000Hz) |
| Verify TX audio |
Key PTT; speak; confirm on monitoring receiver and check TX open log (actual=48000Hz on IC-7300/MK2) |
| Verify PTT safety |
Release PTT; confirm radio returns to RX; check log for backend-specific unkey command |
| Change backend |
MRRC_RADIO_MODEL=ic7300 python server.py |
| Change IC-7300 CI-V address |
IC7300_CIV_ADDR=0x94 python server.py |
| Change password |
MRRC_WEB_PASSWORD=newpass python server.py |
| Change serial port |
MRRC_SERIAL_PORT=/dev/ttyUSB0 ./start.sh |
| View server status |
curl http://localhost:8888/api/status (with auth cookie) |
12.6 Logs and Artifacts
| Artifact |
Purpose |
logs/ directory |
Server stdout/stderr when background-started |
.ft710-server.pid |
Running process PID |
mem_channels.json |
Persisted memory channels |
config.py |
Protocol-neutral constants + shared UI mode tables |
backends/ft710/config_ft710.py |
FT-710-specific mode/band/filter/S-meter calibration tables |
backends/ic7300/config_ic7300.py |
IC-7300/MK2-specific mode/band/filter/tables |
lib/ |
FTDI libraries (libft4222.dylib, libftd2xx.dylib, ftd2xx.cfg) — used only by FT-710 backend |
12.7 Operational Risks
| Risk |
Mitigation |
| Wrong serial port |
Server logs warning; check ls /dev/cu.* or ls /dev/ttyUSB* |
| FT4222 not working (FT-710) |
Falls back to S-meter synthetic spectrum; check D2XX config |
| CI-V 0x27 not arriving (IC-7300) |
Verify CI-V USB Port = Unlink from [REMOTE], explicit 115200 (not Auto), and the model-specific CI-V address; run _diag_ic7300_scope.py; initialization enables both 27 10 display and 27 11 data output; the bounded queue drops oldest data rather than replaying stale frames |
| Audio not working |
Check PyAudio device list in logs; verify the selected radio’s USB audio appears |
| Port already in use |
./stop.sh first; check for stale processes |
| Stale JS cached |
Service worker bypasses JS/HTML; version query strings |
| Stuck TX |
Multiple safety layers (see Ch. 15); server forces RX on WS disconnect |