13. Feasibility Assessment (ART 0530)
13.1 Feasibility Summary
| Dimension |
Assessment |
Explanation |
| RX technical feasibility |
High |
IQ receive, demodulation, Int16 broadcast, and browser playback are implemented |
| Control feasibility |
High |
Frequency, PTT, tune, gains, filters, and DSP commands are implemented |
| Mobile feasibility |
Medium-High |
HTTPS/WSS solves the key iOS secure-context blocker; device validation remains required |
| TX voice feasibility |
High |
Mic → Hilbert SSB → 24-bit IQ → 0xFFFD path implemented and on-air verified (voice 30–40 W PEP) |
| ATR feasibility |
Medium |
Frontend hooks exist; backend endpoint/proxy work remains |
| Operational feasibility |
High |
Single-process server and restart script are simple to operate |
| Product completeness |
Medium |
RX/control baseline is strong; inherited planned menu items need implementation or pruning |
13.2 Risks
| ID |
Risk |
Probability |
Impact |
Mitigation |
| R1 |
iOS opens HTTP URL instead of HTTPS |
Medium |
High |
Use https://radio.vlsc.net:8889; server logs warn on HTTP fallback |
| R2 |
Fixed local UDP bind IP differs from deployment host |
Medium |
High |
Parameterize or update server.py network constants |
| R3 |
TX release command lost or socket half-open |
Low-Medium |
Critical |
ACK retry, backup s:, watchdog, forced backend RX handler |
| R4 |
WDSP library unavailable |
Medium |
Medium |
Optional initialization; built-in DSP path still runs |
| R5 |
TX audio not transmitted despite UI expectations |
Resolved |
High |
TXModulator consumes mic frames → Hilbert SSB → IQ; on-air verified |
| R6 |
ATR frontend connection errors confuse user |
Medium |
Medium |
Implement /WSATR1000 or hide UI until ready |
| R7 |
Memory channel manager expects missing API |
Resolved |
Low-Medium |
/api/mem_channels implemented (GET/POST + JSON persistence) |
| R10 |
Over-driving the PA (no firmware ALC) |
Low-Medium |
High |
Per-band drive caps at the factory-safe ceiling; verify with wattmeter/dummy load before sustained high power |
| R8 |
Stale frontend assets |
Low |
Medium |
Service worker bypasses JS/HTML and scripts use version query strings |
| R9 |
Certificate expiry |
Low |
High |
Use expiry check script/log and maintain backups |
13.3 Assumptions
| ID |
Assumption |
Confidence |
Validation |
| A1 |
SunSDR2 DX is reachable at 192.168.16.200 |
Medium |
Radio connect log |
| A2 |
Host owns local IP 192.168.16.100 |
Medium |
UDP bind success |
| A3 |
Browser supports WebSocket and Web Audio |
High |
Modern iOS/desktop browsers |
| A4 |
TLS certificate/key pair is valid for radio.vlsc.net |
High |
HTTPS request and browser lock |
| A5 |
Shared ../web_control modules remain available |
High in current workspace |
Import success on startup |
| A6 |
Operator reads TX forward power from the ATR-1000 tuner or a wattmeter |
High |
Device sends 0x1F00 in all modes (273 TX packets verified); on-air values confirmed |
13.4 Current Issues
| ID |
Issue |
Priority |
Status |
Resolution Path |
| I1 |
iPhone HTTP secure-context failure |
Critical |
Resolved in code |
HTTPS/WSS auto-start and frontend WSS selection |
| I2 |
TX microphone modulation missing |
High |
Resolved in code |
Server-side mic→Hilbert SSB→IQ path implemented; on-air verified |
| I3 |
/WSATR1000 missing |
Medium |
Open |
Implement backend or disable frontend hooks |
| I4 |
/api/mem_channels missing |
Medium |
Resolved in code |
GET/POST routes with JSON persistence implemented |
| I5 |
Fixed SunSDR local IPs |
Medium |
Open |
Move bind/device stream addresses to env/config |
| I6 |
Duplicate /WSspectrum route declaration in server.py |
Low |
Resolved in code |
Removed the duplicate ws_spectrum handler; one declaration remains |
| I7 |
restart.sh echoes an http://localhost:<port> hint even when TLS is active |
Low |
Cosmetic |
The actual scheme is decided by _find_ssl() at startup and logged correctly (https://[::]:<port>); the script echo is a local-convenience message only. start.sh no longer exists. |
| I8 |
Control-plane latency stuck at --ms (PING dropped before reply) |
Medium |
Resolved in code |
/WSCTRX answers PING with PONG before the colon-based command parse |
| I9 |
Low TX output power |
High |
Resolved in code |
DRIVE byte (0x0017) was sent in the wrong packet field (payload, not trailing word) → device received drive=0; fixed and per-band power added |
| I10 |
TX power formula approximate (cubic fit) |
- |
Resolved in code |
0x1F00 off30 f32 = forward watts (direct float, no fit needed); verified against real 40m drive sweep + external wattmeter |
| I11 |
TX voice audio distorted (tanh over-saturation) |
- |
Resolved in code |
Client preamp 3.0→1.5 (2026-06-25): server input had peak=1.0, drive ×3.0 pushed to 3.95, forcing tanh to squash 75% → heavy distortion. At ×1.5 the tanh barely engages (~4% reduction). |
13.5 Dependencies
| ID |
Dependency |
Type |
Status |
| D1 |
Python 3.12+ |
Runtime |
Required |
| D2 |
FastAPI/Uvicorn |
Runtime |
Required |
| D3 |
NumPy |
Runtime/DSP |
Required |
| D4 |
Shared ../web_control modules |
Code dependency |
Required |
| D5 |
SunSDR2 DX network reachability |
Hardware/network |
Required |
| D6 |
TLS cert/key files |
Mobile production |
Required for iOS secure context |
| D7 |
libwdsp |
Optional DSP |
Optional |
| D8 |
Browser Web Audio/WebSocket support |
Client |
Required |
13.6 Feasibility Conclusion
SunMRRC is feasible and already useful as a mobile RX/control baseline for SunSDR2 DX. The primary production-grade path is HTTPS/WSS mobile RX plus direct radio control. Full voice TX, ATR, memory-channel backend, and legacy menu targets should be treated as planned work until implemented and verified.