[webftr-js8-lab] command=full-audit [webftr-js8-lab] root=/decoders/js8_decoder [webftr-js8-lab] log=/decoders/js8_decoder/logs/20260527T100315Z_full-audit.log [webftr-js8-lab] manifest=/decoders/js8_decoder/logs/20260527T100315Z_full-audit_manifest.json [webftr-js8-lab] utc=20260527T100315Z [webftr-js8-lab] rx-only guard: no TX / no PTT / no Tune / no Send [webftr-js8-lab] full-audit mode [webftr-js8-lab] This runs selftest, then source audit, then creates an upload log bundle. [webftr-js8-lab] Tip: pass a local JS8Call-Improved source path to avoid internet/git clone. ========== FULL-AUDIT STEP 1/4: SELFTEST ========== [webftr-js8-lab] command=selftest [webftr-js8-lab] root=/decoders/js8_decoder [webftr-js8-lab] log=/decoders/js8_decoder/logs/20260527T100315Z_selftest.log [webftr-js8-lab] manifest=/decoders/js8_decoder/logs/20260527T100315Z_selftest_manifest.json [webftr-js8-lab] utc=20260527T100315Z [webftr-js8-lab] rx-only guard: no TX / no PTT / no Tune / no Send [webftr-js8-lab] creating tone test WAV: /decoders/js8_decoder/runtime/selftest_1500hz.wav /decoders/js8_decoder/runtime/selftest_1500hz.wav [webftr-js8-lab] creating short synthetic JS8-like Costas probe WAV: /decoders/js8_decoder/runtime/selftest_js8_costas_probe.wav /decoders/js8_decoder/runtime/selftest_js8_costas_probe.wav [webftr-js8-lab] running WAV validator [webftr-js8-lab] JSON output: /decoders/js8_decoder/logs/20260527T100315Z_selftest_decode_output.json [webftr-js8-lab] JSON timeout guard: 180s { "ok": true, "mode": "JS8", "decoder": "webftr-js8-decoder-lab", "decoder_version": "step49-source-constants-rx-core-extract-audit-2026-05-27", "timestamp_utc": "2026-05-27T10:03:18Z", "rx_only": true, "safety": { "tx": false, "ptt": false, "tune": false, "send": false, "rig_control": false, "js8call_api_control": false }, "capabilities": { "wav_validate": true, "audio_metrics": true, "spectrum_candidates": true, "sync_candidates": true, "soft_symbol_metrics": true, "fec_input_packager": true, "bit_pipeline_mapper": true, "ldpc_probe_harness": true, "message_parse": true, "real_js8_demod": false, "real_js8_fec_decode": false, "real_js8_unpack": false }, "warnings": [ "Step 49 adds an RX-only LDPC probe harness around the 174-bit candidates. It still does not perform final real JS8 LDPC/FEC or message unpack." ], "decodes": [], "input_wav": "/decoders/js8_decoder/runtime/selftest_1500hz.wav", "wav": { "path": "/decoders/js8_decoder/runtime/selftest_1500hz.wav", "channels": 1, "sample_rate": 12000, "sample_width_bytes": 2, "frames": 24000, "duration_seconds": 2.0, "rms_dbfs": -15.05, "peak_dbfs": -12.04, "clipped": false }, "spectrum_probe": { "ok": true, "method": "goertzel_300_3000hz_25hz_step", "note": "Audio plumbing probe only, not JS8 sync or demodulation.", "candidates": [ { "freq_hz": 1500.0, "relative_db": 0.0, "power": 374.91417208 }, { "freq_hz": 1475.0, "relative_db": -277.94, "power": 0.0 }, { "freq_hz": 1525.0, "relative_db": -283.93, "power": 0.0 }, { "freq_hz": 1400.0, "relative_db": -289.05, "power": 0.0 }, { "freq_hz": 1550.0, "relative_db": -293.96, "power": 0.0 }, { "freq_hz": 1650.0, "relative_db": -295.18, "power": 0.0 }, { "freq_hz": 1575.0, "relative_db": -296.53, "power": 0.0 }, { "freq_hz": 1175.0, "relative_db": -298.26, "power": 0.0 } ] }, "implementation_stage": "step49_message91_crc_distance_ranking_no_text_unpack", "next_steps": [ "audit JS8Call/JS8Call-Improved source to locate minimal RX decoder path", "run sync-probe, soft-symbols, bit-pipeline and ldpc-probe on real JS8 WAV captures", "extract/connect the real JS8 LDPC matrix/decoder using the Step9 174-bit soft candidates", "implement JS8 message unpack and map to stable decodes[] JSON" ] } [webftr-js8-lab] running JS8 text parser smoke test [webftr-js8-lab] JSON output: /decoders/js8_decoder/logs/20260527T100315Z_selftest_parse_output.json [webftr-js8-lab] JSON timeout guard: 180s { "ok": true, "mode": "JS8", "parser": "webftr-js8-message-parser", "count": 1, "messages": [ { "raw": "CQ DN9LO JO62", "normalized": "CQ DN9LO JO62", "message_type": "CQ", "directed_to": null, "callsigns": [ "DN9LO" ], "primary_callsign": "DN9LO", "locators": [ "JO62" ], "primary_locator": "JO62", "body": "CQ DN9LO JO62" } ] } [webftr-js8-lab] running input-check smoke test [webftr-js8-lab] JSON output: /decoders/js8_decoder/logs/20260527T100315Z_selftest_input_check_output.json [webftr-js8-lab] JSON timeout guard: 180s { "ok": true, "mode": "JS8", "tool": "webftr-js8-input-check", "tool_version": "step49-source-constants-rx-core-extract-audit", "input_wav": "/decoders/js8_decoder/runtime/selftest_js8_costas_probe.wav", "rx_only": true, "safety": { "tx": false, "ptt": false, "tune": false, "send": false, "js8call_runtime_control": false }, "decodes": [], "warnings": [ "WAV is short. A longer JS8 capture improves profile and LDPC candidate checks." ], "wav": { "path": "/decoders/js8_decoder/runtime/selftest_js8_costas_probe.wav", "channels": 1, "sample_rate": 12000, "sample_width_bytes": 2, "frames": 148608, "duration_seconds": 12.384, "rms_dbfs": -15.61, "peak_dbfs": -12.25, "clipped": false }, "next_action": "Run profile-scan, then auto-ldpc-probe on this WAV." } [webftr-js8-lab] running short sync-probe smoke test [webftr-js8-lab] JSON output: /decoders/js8_decoder/logs/20260527T100315Z_selftest_sync_probe_output.json [webftr-js8-lab] JSON timeout guard: 180s { "ok": true, "mode": "JS8", "tool": "webftr-js8-sync-probe", "tool_version": "step49-source-constants-rx-core-extract-audit", "input_wav": "/decoders/js8_decoder/runtime/selftest_js8_costas_probe.wav", "rx_only": true, "safety": { "tx": false, "ptt": false, "tune": false, "send": false, "js8call_runtime_control": false }, "implementation_stage": "step43_sync_candidates_with_ldpc_probe_followup_no_final_decode", "wav": { "path": "/decoders/js8_decoder/runtime/selftest_js8_costas_probe.wav", "channels": 1, "sample_rate": 12000, "sample_width_bytes": 2, "frames": 148608, "duration_seconds": 12.384, "rms_dbfs": -15.61, "peak_dbfs": -12.25, "clipped": false }, "js8_reference": { "source": "JS8Call-Improved source-map orientation plus FT8-like Costas7 hypothesis", "sample_rate_hz": 12000, "default_nsps": 6192, "default_symbol_duration_seconds": 0.516, "costas7_candidate": [ 3, 1, 4, 0, 6, 5, 2 ], "tone_count_candidate": 8, "note": "This is a sync/symbol candidate extractor only. It estimates frame/symbol candidates for lab work and does not perform LDPC/FEC decode or JS8 message unpacking." }, "scan": { "nsps": 6192, "tone_spacing_hz": 1.937984, "freq_min_hz": 300.0, "freq_max_hz": 3000.0, "max_seconds_analyzed": 4.0, "start_candidates_scanned": 1, "base_candidates_scanned": 1, "base_candidates_hz": [ 1000.0 ], "coarse_tone_candidates": [ { "freq_hz": 1000.0, "relative_db": 0.0, "power": 6.94910418 }, { "freq_hz": 1025.0, "relative_db": -27.24, "power": 0.0131166 }, { "freq_hz": 975.0, "relative_db": -27.53, "power": 0.01227993 }, { "freq_hz": 1050.0, "relative_db": -37.39, "power": 0.0012678 }, { "freq_hz": 1075.0, "relative_db": -41.43, "power": 0.00049951 }, { "freq_hz": 950.0, "relative_db": -43.35, "power": 0.00032115 }, { "freq_hz": 1100.0, "relative_db": -46.57, "power": 0.00015313 }, { "freq_hz": 1250.0, "relative_db": -47.96, "power": 0.00011108 }, { "freq_hz": 1125.0, "relative_db": -48.58, "power": 9.635e-05 }, { "freq_hz": 1200.0, "relative_db": -50.32, "power": 6.457e-05 }, { "freq_hz": 875.0, "relative_db": -50.9, "power": 5.646e-05 }, { "freq_hz": 1175.0, "relative_db": -51.46, "power": 4.965e-05 } ] }, "sync_candidates": [ { "ok": true, "start_sample": 0, "start_seconds": 0.0, "base_freq_hz": 1000.0, "tone_spacing_hz": 1.937984, "nsps": 6192, "costas_pattern": [ 3, 1, 4, 0, 6, 5, 2 ], "costas_hits": 7, "costas_symbols": 7, "avg_margin_db": 29.11, "energy_score_db": 29.11, "candidate_score": 128.22, "symbols": [ { "symbol": 0, "expected_tone": 3, "strongest_tone": 3, "expected_is_strongest": true, "expected_power": 83.0873099286, "median_other_power": 0.1042308968, "margin_db": 29.02, "tone_powers": [ 0.0981480318, 0.1051242996, 0.1064179268, 83.0873099286, 0.1057422016, 0.1042308968, 0.0993799575, 0.0932492823 ] }, { "symbol": 1, "expected_tone": 1, "strongest_tone": 1, "expected_is_strongest": true, "expected_power": 83.0774568889, "median_other_power": 0.1014706768, "margin_db": 29.13, "tone_powers": [ 0.1068702304, 83.0774568889, 0.1052822376, 0.105564598, 0.1014706768, 0.0956100015, 0.0879534486, 0.0800992227 ] }, { "symbol": 2, "expected_tone": 4, "strongest_tone": 4, "expected_is_strongest": true, "expected_power": 83.0917714671, "median_other_power": 0.1044873575, "margin_db": 29.0, "tone_powers": [ 0.0960127168, 0.0986802754, 0.1054058068, 0.1081981246, 83.0917714671, 0.1055965002, 0.1044873575, 0.0990928872 ] }, { "symbol": 3, "expected_tone": 0, "strongest_tone": 0, "expected_is_strongest": true, "expected_power": 83.0749822549, "median_other_power": 0.0948551103, "margin_db": 29.42, "tone_powers": [ 83.0749822549, 0.1081775542, 0.1032741915, 0.1002757935, 0.0948551103, 0.0864721839, 0.080493759, 0.0726495994 ] }, { "symbol": 4, "expected_tone": 6, "strongest_tone": 6, "expected_is_strongest": true, "expected_power": 83.0368796528, "median_other_power": 0.1013897721, "margin_db": 29.13, "tone_powers": [ 0.0811328494, 0.088780076, 0.0950670222, 0.1013897721, 0.1027811248, 0.1070386893, 83.0368796528, 0.1089829146 ] }, { "symbol": 5, "expected_tone": 5, "strongest_tone": 5, "expected_is_strongest": true, "expected_power": 83.0780861176, "median_other_power": 0.1045690469, "margin_db": 29.0, "tone_powers": [ 0.0865241623, 0.0949217802, 0.099666939, 0.1045690469, 0.1061057949, 83.0780861176, 0.1100149946, 0.1049352501 ] }, { "symbol": 6, "expected_tone": 2, "strongest_tone": 2, "expected_is_strongest": true, "expected_power": 83.0649691812, "median_other_power": 0.1027968836, "margin_db": 29.07, "tone_powers": [ 0.1060939743, 0.1064017103, 83.0649691812, 0.1058247328, 0.1027968836, 0.1002472492, 0.0945580448, 0.088818472 ] } ], "symbol_preview": [ { "symbol": 0, "tone_index": 3, "confidence_db": 28.93, "powers": [ 0.0981480318, 0.1051242996, 0.1064179268, 83.0873099286, 0.1057422016, 0.1042308968, 0.0993799575, 0.0932492823 ] }, { "symbol": 1, "tone_index": 1, "confidence_db": 28.91, "powers": [ 0.1068702304, 83.0774568889, 0.1052822376, 0.105564598, 0.1014706768, 0.0956100015, 0.0879534486, 0.0800992227 ] }, { "symbol": 2, "tone_index": 4, "confidence_db": 28.85, "powers": [ 0.0960127168, 0.0986802754, 0.1054058068, 0.1081981246, 83.0917714671, 0.1055965002, 0.1044873575, 0.0990928872 ] }, { "symbol": 3, "tone_index": 0, "confidence_db": 28.85, "powers": [ 83.0749822549, 0.1081775542, 0.1032741915, 0.1002757935, 0.0948551103, 0.0864721839, 0.080493759, 0.0726495994 ] }, { "symbol": 4, "tone_index": 6, "confidence_db": 28.82, "powers": [ 0.0811328494, 0.088780076, 0.0950670222, 0.1013897721, 0.1027811248, 0.1070386893, 83.0368796528, 0.1089829146 ] }, { "symbol": 5, "tone_index": 5, "confidence_db": 28.78, "powers": [ 0.0865241623, 0.0949217802, 0.099666939, 0.1045690469, 0.1061057949, 83.0780861176, 0.1100149946, 0.1049352501 ] }, { "symbol": 6, "tone_index": 2, "confidence_db": 28.92, "powers": [ 0.1060939743, 0.1064017103, 83.0649691812, 0.1058247328, 0.1027968836, 0.1002472492, 0.0945580448, 0.088818472 ] } ] } ], "decodes": [], "warnings": [ "No JS8 text decode is expected in Step 49. Final real LDPC/FEC and Varicode/message unpack are not implemented yet.", "Costas7 scoring is a lab candidate extractor; real decoder validation requires actual JS8 WAV samples." ], "next_action": "Run sync-probe on real JS8 WAV captures. If stable sync_candidates appear, Step 49 can continue soft-symbol metric extraction for the LDPC/FEC path." } [webftr-js8-lab] OK [webftr-js8-lab] log file: /decoders/js8_decoder/logs/20260527T100315Z_selftest.log [webftr-js8-lab] manifest: /decoders/js8_decoder/logs/20260527T100315Z_selftest_manifest.json [webftr-js8-lab] selftest exit_code=0 ========== FULL-AUDIT STEP 2/4: SOURCE AUDIT ========== [webftr-js8-lab] no local source directory supplied, trying clone-audit [webftr-js8-lab] command=clone-audit [webftr-js8-lab] root=/decoders/js8_decoder [webftr-js8-lab] log=/decoders/js8_decoder/logs/20260527T100324Z_clone-audit.log [webftr-js8-lab] manifest=/decoders/js8_decoder/logs/20260527T100324Z_clone-audit_manifest.json [webftr-js8-lab] utc=20260527T100324Z [webftr-js8-lab] rx-only guard: no TX / no PTT / no Tune / no Send [webftr-js8-lab] clone/audit destination: /decoders/js8_decoder/runtime/src/JS8Call-improved [webftr-js8-lab] existing checkout found, pulling fast-forward only... Already up to date. [webftr-js8-lab] running source audit [webftr-js8-lab] JSON output: /decoders/js8_decoder/logs/20260527T100324Z_clone_audit_output.json [webftr-js8-lab] JSON timeout guard: 180s { "ok": true, "source_dir": "/decoders/js8_decoder/runtime/src/JS8Call-improved", "scanned_files": 542, "ranked_results": [ { "path": "vendor/sqlite3/sqlite3.c", "score": 10570, "hits": { "decode": 159, "decoder": 6, "sync": 882, "unpack": 190, "symbol": 145, "soft": 93, "wav": 5, "message": 317 }, "sample_lines": [ { "line": 822, "text": "#define SQLITE_IOERR_FSYNC (SQLITE_IOERR | (4<<8))" }, { "line": 823, "text": "#define SQLITE_IOERR_DIR_FSYNC (SQLITE_IOERR | (5<<8))" }, { "line": 1017, "text": "** CAPI3REF: Synchronization Type Flags" }, { "line": 1019, "text": "** When SQLite invokes the xSync() method of an" }, { "line": 1023, "text": "** When the SQLITE_SYNC_DATAONLY flag is used, it means that the" }, { "line": 1024, "text": "** sync operation only needs to flush data to mass storage. Inode" } ] }, { "path": "JS8_UI/mainwindow.cpp", "score": 7772, "hits": { "js8": 337, "decode": 293, "decoder": 104, "sync": 11, "ft8": 1, "jt9": 1, "fsk": 1, "symbol": 6, "snr": 68, "wav": 1, "message": 448 }, "sample_lines": [ { "line": 3, "text": "* @brief source file that implements the JS8Call user interface" }, { "line": 5, "text": "* all functionality of the JS8call main window" }, { "line": 20, "text": "int volatile itone[JS8_NUM_SYMBOLS]; // Audio tones for all Tx symbols" }, { "line": 106, "text": "// JS8_Mainwindow/UI_Constructor.cpp" }, { "line": 349, "text": "m_decoder.quit();" }, { "line": 380, "text": "m_settings->setValue(\"SubModeHB\", ui->actionModeJS8HB->isChecked());" } ] }, { "path": "JS8_Mode/JS8.cpp", "score": 4014, "hits": { "js8": 111, "decode": 142, "decoder": 36, "sync": 120, "ldpc": 23, "ft8": 1, "symbol": 37, "soft": 8, "snr": 14, "wav": 4, "message": 41, "filename:js8": 1 }, "sample_lines": [ { "line": 2, "text": "* @file JS8.cpp" }, { "line": 3, "text": "* @brief Implementation of JS8 encoding and decoding functions" }, { "line": 8, "text": "#include \"JS8.h\"" }, { "line": 9, "text": "#include \"JS8_Include/commons.h\"" }, { "line": 10, "text": "#include \"JS8_Mode/FrequencyTracker.h\"" }, { "line": 11, "text": "#include \"JS8_Mode/whitening_processor.h\"" } ] }, { "path": "JS8_JSC/JSC_list.cpp", "score": 1916, "hits": { "js8": 6, "decode": 6, "decoder": 2, "sync": 73, "ldpc": 1, "unpack": 5, "ft8": 1, "fsk": 14, "symbol": 21, "soft": 168, "snr": 5, "wav": 109, "message": 22 }, "sample_lines": [ { "line": 5, "text": "* This file is part of JS8Call." }, { "line": 16249, "text": "{\"VSYNC\", 5, 146064}," }, { "line": 21073, "text": "{\"UUDECODE\", 8, 212134}," }, { "line": 23617, "text": "{\"UNPACKS\", 7, 238679}," }, { "line": 23618, "text": "{\"UNPACKING\", 9, 69270}," }, { "line": 23619, "text": "{\"UNPACKED\", 8, 92955}," } ] }, { "path": "JS8_JSC/JSC_map.cpp", "score": 1916, "hits": { "js8": 6, "decode": 6, "decoder": 2, "sync": 73, "ldpc": 1, "unpack": 5, "ft8": 1, "fsk": 14, "symbol": 21, "soft": 168, "snr": 5, "wav": 109, "message": 22 }, "sample_lines": [ { "line": 5, "text": "* This file is part of JS8Call." }, { "line": 95, "text": "{\"\\\\\", 1, 68}, // FYI: this used to be FT8 in JS8 1.0" }, { "line": 96, "text": "{\"\\n\", 1, 69}, // FYI: this used to be \"\\\" in JS8 1.0" }, { "line": 97, "text": "{\"JS8\", 3, 70}," }, { "line": 98, "text": "{\"JS8CALL\", 7, 71}," }, { "line": 100, "text": "72}, // FYI: this used to be JSQSO in JS8 1.0, it is now a substitute flag" } ] }, { "path": "JS8_Mainwindow/processDecodeEvent.cpp", "score": 1670, "hits": { "js8": 36, "decode": 118, "decoder": 4, "sync": 14, "ft8": 1, "jt9": 1, "snr": 19, "message": 36, "filename:decode": 1 }, "sample_lines": [ { "line": 5, "text": "* process decoded text" }, { "line": 8, "text": "#include \"JS8_UI/mainwindow.h\"" }, { "line": 10, "text": "void UI_Constructor::processDecodeEvent(JS8::Event::Variant const &event) {" }, { "line": 12, "text": "static qint32 syncStart = -1;" }, { "line": 18, "text": "if constexpr (std::is_same_v) {" }, { "line": 19, "text": "if (m_wideGraph->shouldDisplayDecodeAttempts()) {" } ] }, { "path": "JS8_UI/mainwindow.h", "score": 1487, "hits": { "js8": 87, "decode": 33, "decoder": 11, "symbol": 2, "snr": 9, "message": 114 }, "sample_lines": [ { "line": 5, "text": "#include \"JS8_Audio/AudioDevice.h\"" }, { "line": 6, "text": "#include \"JS8_Audio/NotificationAudio.h\"" }, { "line": 7, "text": "#include \"JS8_Audio/SoundInput.h\"" }, { "line": 8, "text": "#include \"JS8_Audio/SoundOutput.h\"" }, { "line": 9, "text": "#include \"JS8_Include/EventFilter.h\"" }, { "line": 10, "text": "#include \"JS8_Include/commons.h\"" } ] }, { "path": "JS8_Main/Varicode.cpp", "score": 1394, "hits": { "js8": 55, "decode": 8, "unpack": 76, "ft8": 2, "snr": 34, "message": 67 }, "sample_lines": [ { "line": 9, "text": "#include \"JS8_JSC/JSC.h\"" }, { "line": 10, "text": "#include \"JS8_Mode/DecodedText.h\"" }, { "line": 24, "text": "Q_DECLARE_LOGGING_CATEGORY(varicode_js8)" }, { "line": 29, "text": "// for FT8 freetext" }, { "line": 221, "text": "{\"@JS8NET\", nbasecall + 3}, // JS8NET group" }, { "line": 265, "text": "{\"@JS8\", nbasecall + 35}, // JS8 GROUP" } ] }, { "path": "CMakeLists.txt", "score": 1311, "hits": { "js8": 125, "decode": 2, "symbol": 1, "soft": 1, "message": 18 }, "sample_lines": [ { "line": 4, "text": "# JS8Call Build:" }, { "line": 38, "text": "set(CMAKE_PREFIX_PATH ${CMAKE_SOURCE_DIR}/../js8libs)" }, { "line": 60, "text": "JS8Call" }, { "line": 68, "text": "set(PROJECT_HOMEPAGE https://groups.io/g/js8call)" }, { "line": 91, "text": "# define in js8call_config.h.in, which makes them available to the C/C++" }, { "line": 220, "text": "JS8CALL_VERSION=\\\"${PROJECT_VERSION}\\\"" } ] }, { "path": "JS8_UI/Configuration.cpp", "score": 1131, "hits": { "js8": 71, "sync": 12, "soft": 1, "snr": 12, "wav": 3, "message": 144 }, "sample_lines": [ { "line": 134, "text": "#include \"JS8_Include/Maidenhead.h\"" }, { "line": 135, "text": "#include \"JS8_Include/SettingsGroup.h\"" }, { "line": 136, "text": "#include \"JS8_Include/pimpl_impl.h\"" }, { "line": 137, "text": "#include \"JS8_Main/Bands.h\"" }, { "line": 138, "text": "#include \"JS8_Main/CallsignValidator.h\"" }, { "line": 139, "text": "#include \"JS8_Main/CandidateKeyFilter.h\"" } ] }, { "path": "vendor/Eigen/src/Core/arch/AVX512/PacketMath.h", "score": 980, "hits": { "unpack": 140 }, "sample_lines": [ { "line": 169, "text": "struct unpacket_traits {" }, { "line": 177, "text": "struct unpacket_traits {" }, { "line": 183, "text": "struct unpacket_traits {" }, { "line": 190, "text": "struct unpacket_traits {" }, { "line": 1108, "text": "__m512 T0 = _mm512_unpacklo_ps(kernel.packet[0], kernel.packet[1]);" }, { "line": 1109, "text": "__m512 T1 = _mm512_unpackhi_ps(kernel.packet[0], kernel.packet[1]);" } ] }, { "path": "JS8_Mode/DecodedText.cpp", "score": 887, "hits": { "js8": 20, "decode": 42, "decoder": 2, "unpack": 22, "snr": 7, "message": 32, "filename:decode": 1 }, "sample_lines": [ { "line": 2, "text": "* @file DecodedText.cpp" }, { "line": 3, "text": "* @brief Implementation of DecodedText class" }, { "line": 6, "text": "#include \"DecodedText.h\"" }, { "line": 7, "text": "#include \"JS8_Include/commons.h\"" }, { "line": 8, "text": "#include " }, { "line": 17, "text": "// Quality level below which we'll consider a decode to be suspect;" } ] }, { "path": "JS8_Mainwindow/UI_Constructor.cpp", "score": 881, "hits": { "js8": 43, "decode": 15, "decoder": 8, "snr": 1, "message": 132 }, "sample_lines": [ { "line": 4, "text": "* constructs and connects UI elements to the JS8 \"engine\"" }, { "line": 7, "text": "#include \"JS8_UI/mainwindow.h\"" }, { "line": 8, "text": "#include \"JS8_UI/styles.h\"" }, { "line": 29, "text": "m_rigErrorMessageBox{JS8MessageBox::Critical, tr(\"Rig Control Error\")," }, { "line": 30, "text": "JS8MessageBox::Cancel | JS8MessageBox::Ok |" }, { "line": 31, "text": "JS8MessageBox::Retry}," } ] }, { "path": "JS8_Mode/JS8Submode.cpp", "score": 871, "hits": { "js8": 51, "decode": 6, "symbol": 32, "snr": 11, "filename:js8": 1 }, "sample_lines": [ { "line": 2, "text": "* @file JS8Submode.cpp" }, { "line": 3, "text": "* @brief Implementation of JS8 submode parameter inquiry functions" }, { "line": 5, "text": "#include \"JS8Submode.h\"" }, { "line": 6, "text": "#include \"JS8_Include/commons.h\"" }, { "line": 7, "text": "#include \"JS8_Main/Varicode.h\"" }, { "line": 17, "text": "Q_DECLARE_LOGGING_CATEGORY(js8submode_js8)" } ] }, { "path": "JS8_Mainwindow/networkMessage.cpp", "score": 827, "hits": { "js8": 33, "decode": 13, "decoder": 13, "snr": 5, "message": 125, "filename:message": 1 }, "sample_lines": [ { "line": 9, "text": "#include \"JS8_UI/mainwindow.h\"" }, { "line": 13, "text": "* This function acts as the primary router for the JS8Call API. It handles" }, { "line": 28, "text": "qCDebug(mainwindow_js8) << \"try processing network message\" << type << id;" }, { "line": 108, "text": "\"JS8\", // mode" }, { "line": 112, "text": "m_decoderBusy, // decoding (match WSJT-X: decoder busy only)" }, { "line": 158, "text": "// STATION refers to JS8Call station settings" } ] }, { "path": "vendor/sqlite3/shell.c", "score": 812, "hits": { "decode": 18, "sync": 55, "symbol": 17, "soft": 2, "message": 95 }, "sample_lines": [ { "line": 1110, "text": "static int decodeUtf8(const unsigned char *z, int *pU){" }, { "line": 1146, "text": "int len = decodeUtf8(&a[i], &u);" }, { "line": 1180, "text": "int len = decodeUtf8(a+i, &u);" }, { "line": 5273, "text": "/* Decode base64 text into a byte buffer. */" }, { "line": 5292, "text": "/* Treat dark non-digits as pad, but they terminate decode too. */" }, { "line": 5456, "text": "** (aka \"group\") length maps 1-to-1 to the decoded binary length." } ] }, { "path": "vendor/Eigen/src/Core/arch/SSE/PacketMath.h", "score": 798, "hits": { "unpack": 114 }, "sample_lines": [ { "line": 84, "text": "EIGEN_STRONG_INLINE Packet4f vec4f_unpacklo(const Packet4f& a, const Packet4f& b)" }, { "line": 86, "text": "return Packet4f(_mm_unpacklo_ps(a,b));" }, { "line": 88, "text": "EIGEN_STRONG_INLINE Packet4f vec4f_unpackhi(const Packet4f& a, const Packet4f& b)" }, { "line": 90, "text": "return Packet4f(_mm_unpackhi_ps(a,b));" }, { "line": 98, "text": "EIGEN_STRONG_INLINE Packet2d vec2d_unpacklo(const Packet2d& a, const Packet2d& b)" }, { "line": 100, "text": "return Packet2d(_mm_unpacklo_pd(a,b));" } ] }, { "path": "JS8_Mode/Decoder.cpp", "score": 784, "hits": { "js8": 8, "decode": 32, "decoder": 32, "filename:decode": 1, "filename:decoder": 1 }, "sample_lines": [ { "line": 2, "text": "* @file Decoder.cpp" }, { "line": 3, "text": "* @brief Implementation of the JS8 decoder and worker classes" }, { "line": 7, "text": "#include \"Decoder.h\"" }, { "line": 8, "text": "#include \"JS8_Include/commons.h\"" }, { "line": 13, "text": "Q_DECLARE_LOGGING_CATEGORY(decoder_js8)" }, { "line": 18, "text": "Decoder::Decoder(QObject * parent)" } ] }, { "path": "JS8_UDP/WSJTXMessageClient.cpp", "score": 739, "hits": { "js8": 21, "decode": 14, "sync": 1, "snr": 8, "message": 181, "filename:message": 1 }, "sample_lines": [ { "line": 2, "text": "* @brief WSJT-X compatible message client for JS8Call" }, { "line": 5, "text": "* communication. It allows JS8Call to send and receive messages compatible" }, { "line": 8, "text": "* Based on WSJT-X MessageClient but adapted for JS8Call." }, { "line": 12, "text": "#include \"JS8_Include/pimpl_impl.h\"" }, { "line": 13, "text": "#include \"JS8_Main/qt_helpers.h\"" }, { "line": 34, "text": "Q_LOGGING_CATEGORY(wsjtx_js8, \"wsjtx.js8\", QtWarningMsg)" } ] }, { "path": "tools/tracking_diag.cpp", "score": 727, "hits": { "js8": 25, "decode": 36, "decoder": 13, "sync": 1, "symbol": 1, "snr": 19, "message": 8 }, "sample_lines": [ { "line": 1, "text": "// Diagnostic harness for JS8 frequency/timing tracking." }, { "line": 3, "text": "// runs the decoder twice (tracking disabled vs enabled), and prints outcomes." }, { "line": 10, "text": "// fftw_mutex) that JS8.cpp expects." }, { "line": 11, "text": "// - Tracking is controlled via env vars: JS8_DISABLE_FREQ_TRACKING," }, { "line": 12, "text": "// JS8_DISABLE_TIMING_TRACKING." }, { "line": 30, "text": "#include \"JS8_Include/commons.h\"" } ] }, { "path": "JS8_UI/WideGraph.cpp", "score": 611, "hits": { "js8": 18, "decode": 22, "sync": 35, "message": 5 }, "sample_lines": [ { "line": 8, "text": "#include \"JS8_Include/EventFilter.h\"" }, { "line": 9, "text": "#include \"JS8_Include/SettingsGroup.h\"" }, { "line": 10, "text": "#include \"JS8_Main/DriftingDateTime.h\"" }, { "line": 11, "text": "#include \"JS8_Main/JS8MessageBox.h\"" }, { "line": 12, "text": "#include \"JS8_Main/Varicode.h\"" }, { "line": 28, "text": "Q_DECLARE_LOGGING_CATEGORY(widegraph_js8)" } ] }, { "path": "JS8_Include/commons.h", "score": 602, "hits": { "js8": 40, "decode": 18, "sync": 4, "symbol": 6 }, "sample_lines": [ { "line": 11, "text": "#define JS8_NSPS 6192" }, { "line": 12, "text": "#define JS8_NSMAX 6827" }, { "line": 13, "text": "#define JS8_NTMAX 60" }, { "line": 14, "text": "#define JS8_RX_SAMPLE_RATE 12000" }, { "line": 15, "text": "#define JS8_RX_SAMPLE_SIZE (JS8_NTMAX * JS8_RX_SAMPLE_RATE)" }, { "line": 17, "text": "#define JS8_RING_BUFFER 1 // use a ring buffer instead of clearing the decode frames" } ] }, { "path": "vendor/sqlite3/sqlite3.h", "score": 571, "hits": { "sync": 51, "symbol": 8, "soft": 25, "message": 37 }, "sample_lines": [ { "line": 503, "text": "#define SQLITE_IOERR_FSYNC (SQLITE_IOERR | (4<<8))" }, { "line": 504, "text": "#define SQLITE_IOERR_DIR_FSYNC (SQLITE_IOERR | (5<<8))" }, { "line": 698, "text": "** CAPI3REF: Synchronization Type Flags" }, { "line": 700, "text": "** When SQLite invokes the xSync() method of an" }, { "line": 704, "text": "** When the SQLITE_SYNC_DATAONLY flag is used, it means that the" }, { "line": 705, "text": "** sync operation only needs to flush data to mass storage. Inode" } ] }, { "path": "tools/whitening_diag.cpp", "score": 533, "hits": { "js8": 19, "decode": 26, "decoder": 11, "sync": 1, "snr": 12, "message": 2 }, "sample_lines": [ { "line": 1, "text": "// Diagnostic harness for JS8 whitening / noise estimation." }, { "line": 3, "text": "// runs the decoder twice (whitening OFF vs ON), and prints a concise summary." }, { "line": 9, "text": "// globals (dec_data, specData, fftw_mutex) that JS8 expects." }, { "line": 25, "text": "#include \"JS8_Include/commons.h\"" }, { "line": 26, "text": "#include \"JS8_Mode/JS8.h\"" }, { "line": 28, "text": "// Provide the globals expected by JS8.cpp" } ] }, { "path": "JS8_UDP/NetworkMessage.h", "score": 529, "hits": { "js8": 1, "decode": 32, "decoder": 1, "jt9": 1, "symbol": 2, "snr": 3, "wav": 1, "message": 102, "filename:message": 1 }, "sample_lines": [ { "line": 177, "text": "* after an old decodes replay sequence (see Replay below)," }, { "line": 209, "text": "* Decode Out 2 quint32" }, { "line": 221, "text": "* The decode message is sent when a new decode is completed, in" }, { "line": 223, "text": "* to a \"Replay\" message where each old decode in the \"Band" }, { "line": 227, "text": "* confidence decodes are flagged in protocols where the decoder" }, { "line": 228, "text": "* has knows that a decode has a higher than normal probability" } ] }, { "path": "JS8_UDP/WSJTXMessageMapper.cpp", "score": 527, "hits": { "js8": 24, "decode": 13, "snr": 7, "message": 69, "filename:message": 1 }, "sample_lines": [ { "line": 5, "text": "* and map them to JS8Call actions." }, { "line": 8, "text": "* @param main_window Main window instance for accessing JS8Call state" }, { "line": 13, "text": "#include \"JS8_UI/mainwindow.h\"" }, { "line": 19, "text": "Q_LOGGING_CATEGORY(wsjtx_mapper_js8, \"wsjtx.mapper.js8\", QtWarningMsg)" }, { "line": 38, "text": "* Maps JS8Call's status information to WSJT-X Status message format and" }, { "line": 58, "text": "qCDebug(wsjtx_mapper_js8)" } ] }, { "path": "vendor/Eigen/src/Core/arch/AVX/PacketMath.h", "score": 518, "hits": { "unpack": 74 }, "sample_lines": [ { "line": 217, "text": "template<> struct unpacket_traits {" }, { "line": 224, "text": "template<> struct unpacket_traits {" }, { "line": 229, "text": "template<> struct unpacket_traits { typedef int type; typedef Packet4i half; enum {size=8, alignment=Aligned32, vectorizable=false, masked_load_available=false, masked" }, { "line": 230, "text": "template<> struct unpacket_traits { typedef bfloat16 type; typedef Packet8bf half; enum {size=8, alignment=Aligned16, vectorizable=true, masked_load_available=false, mas" }, { "line": 599, "text": "// return _mm256_unpacklo_ps(tmp,tmp);" }, { "line": 864, "text": "__m256 T0 = _mm256_unpacklo_ps(kernel.packet[0], kernel.packet[1]);" } ] }, { "path": "vendor/Eigen/src/Core/products/GeneralBlockPanelKernel.h", "score": 511, "hits": { "unpack": 73 }, "sample_lines": [ { "line": 383, "text": "typename unpacket_traits::half>::half>::type \\" }, { "line": 390, "text": "typename unpacket_traits::half>::half>::type \\" }, { "line": 397, "text": "typename unpacket_traits::half>::half>::type \\" }, { "line": 404, "text": "typename unpacket_traits::half>::half>::type \\" }, { "line": 408, "text": "* real*real: unpack rhs to constant packets, ..." }, { "line": 410, "text": "* cd*cd : unpack rhs to (b_r,b_r), (b_i,b_i), mul to get (a_r b_r,a_i b_r) (a_r b_i,a_i b_i)," } ] }, { "path": "JS8_Mainwindow/processCommandActivity.cpp", "score": 446, "hits": { "js8": 23, "snr": 32, "message": 60 }, "sample_lines": [ { "line": 5, "text": "* processes JS8 commands" }, { "line": 8, "text": "#include \"JS8_Main/HBBlockingDB.h\"" }, { "line": 9, "text": "#include \"JS8_UI/mainwindow.h\"" }, { "line": 37, "text": "qCDebug(mainwindow_js8)" }, { "line": 117, "text": "// PROCESS @JS8NET, @APRSIS, AND OTHER GROUP SPOTS FOR EVERYONE" }, { "line": 145, "text": "bool isLast = (d.bits & Varicode::JS8CallLast) == Varicode::JS8CallLast;" } ] }, { "path": "JS8_Main/JS8MessageBox.cpp", "score": 442, "hits": { "js8": 23, "message": 34, "filename:js8": 1, "filename:message": 1 }, "sample_lines": [ { "line": 2, "text": "* @file JS8MessageBox.cpp" }, { "line": 6, "text": "#include \"JS8MessageBox.h\"" }, { "line": 13, "text": "JS8MessageBox::JS8MessageBox(QWidget *parent) : QMessageBox{parent} {" }, { "line": 17, "text": "JS8MessageBox::JS8MessageBox(Icon icon, QString const &text," }, { "line": 24, "text": "void JS8MessageBox::about_message(QWidget *parent, QString const &text) {" }, { "line": 28, "text": "void JS8MessageBox::about_Qt_message(QWidget *parent) {" } ] }, { "path": "vendor/Eigen/src/Core/ArithmeticSequence.h", "score": 415, "hits": { "symbol": 83 }, "sample_lines": [] }, { "path": "JS8_Main/main.cpp", "score": 362, "hits": { "js8": 29, "message": 36 }, "sample_lines": [ { "line": 8, "text": "#include \"JS8MessageBox.h\"" }, { "line": 9, "text": "#include \"JS8_Include/SettingsGroup.h\"" }, { "line": 10, "text": "#include \"JS8_Include/commons.h\"" }, { "line": 11, "text": "#include \"JS8_UI/mainwindow.h\"" }, { "line": 12, "text": "#include \"JS8_UI/styles.h\"" }, { "line": 45, "text": "Q_DECLARE_LOGGING_CATEGORY(main_js8)" } ] }, { "path": "JS8_Mode/DecodedText.h", "score": 352, "hits": { "js8": 2, "decode": 15, "decoder": 1, "unpack": 12, "snr": 4, "message": 6, "filename:decode": 1 }, "sample_lines": [ { "line": 3, "text": "* Class to handle the formatted string as returned from the decoder" }, { "line": 8, "text": "#ifndef DECODEDTEXT_H" }, { "line": 9, "text": "#define DECODEDTEXT_H" }, { "line": 11, "text": "#include \"JS8.h\"" }, { "line": 16, "text": "class DecodedText {" }, { "line": 20, "text": "explicit DecodedText(JS8::Event::Decoded const &);" } ] }, { "path": "JS8_Mode/JS8.h", "score": 336, "hits": { "js8": 5, "decode": 13, "decoder": 2, "sync": 5, "ft8": 1, "snr": 1, "message": 1, "filename:js8": 1 }, "sample_lines": [ { "line": 1, "text": "#ifndef __JS8" }, { "line": 2, "text": "#define __JS8" }, { "line": 12, "text": "namespace JS8 {" }, { "line": 16, "text": "// JS8 originally used the same Costas arrays as FT8 did, and so" }, { "line": 43, "text": "struct DecodeStarted {" }, { "line": 47, "text": "struct SyncStart {" } ] }, { "path": "vendor/Eigen/src/Core/GenericPacketMath.h", "score": 336, "hits": { "unpack": 48 }, "sample_lines": [ { "line": 132, "text": "template struct unpacket_traits" }, { "line": 146, "text": "template struct unpacket_traits : unpacket_traits { };" }, { "line": 179, "text": "typedef typename unpacket_traits::type Scalar;" }, { "line": 599, "text": "pload(const typename unpacket_traits::type* from) { return *from; }" }, { "line": 603, "text": "ploadu(const typename unpacket_traits::type* from) { return *from; }" }, { "line": 610, "text": "typename enable_if::masked_load_available, Packet>::type" } ] }, { "path": "JS8_Mode/JS8Submode.h", "score": 329, "hits": { "js8": 14, "decode": 2, "symbol": 10, "snr": 1, "filename:js8": 1 }, "sample_lines": [ { "line": 1, "text": "#ifndef JS8_SUBMODE_HPP_" }, { "line": 2, "text": "#define JS8_SUBMODE_HPP_" }, { "line": 4, "text": "#include \"JS8_Mode/JS8.h\"" }, { "line": 10, "text": "namespace JS8::Submode {" }, { "line": 22, "text": "// will throw if provided with an invalid JS8 submode." }, { "line": 29, "text": "// Running JS8Call with the environment variable" } ] }, { "path": "JS8_Mode/Decoder.h", "score": 324, "hits": { "js8": 2, "decode": 7, "decoder": 7, "filename:decode": 1, "filename:decoder": 1 }, "sample_lines": [ { "line": 1, "text": "#ifndef DECODER_H" }, { "line": 2, "text": "#define DECODER_H" }, { "line": 8, "text": "#include \"JS8_Main/ProcessThread.h\"" }, { "line": 37, "text": "class Decoder : public QObject {" }, { "line": 40, "text": "Decoder(QObject *parent = nullptr);" }, { "line": 41, "text": "~Decoder();" } ] }, { "path": "vendor/Eigen/src/Core/arch/AltiVec/PacketMath.h", "score": 322, "hits": { "unpack": 46 }, "sample_lines": [ { "line": 74, "text": "#define __UNPACK_TYPE__(PACKETNAME) typename unpacket_traits::type" }, { "line": 326, "text": "template<> struct unpacket_traits" }, { "line": 333, "text": "template<> struct unpacket_traits" }, { "line": 339, "text": "template<> struct unpacket_traits" }, { "line": 345, "text": "template<> struct unpacket_traits" }, { "line": 352, "text": "template<> struct unpacket_traits" } ] }, { "path": "vendor/Eigen/src/UmfPackSupport/UmfPackSupport.h", "score": 310, "hits": { "symbol": 62 }, "sample_lines": [] }, { "path": "JS8_Mainwindow/initializeDummyData.cpp", "score": 304, "hits": { "js8": 24, "decode": 2, "unpack": 3, "snr": 5, "message": 6 }, "sample_lines": [ { "line": 8, "text": "#include \"JS8_UI/mainwindow.h\"" }, { "line": 20, "text": "qCDebug(mainwindow_js8) << all;" }, { "line": 21, "text": "qCDebug(mainwindow_js8) << JSC::decompress(all) << (JSC::decompress(all) == \"HELLO WORLD \");" }, { "line": 87, "text": "qCDebug(mainwindow_js8) << \"select\" << c.selectionStart() << c.selectionEnd();" }, { "line": 145, "text": "// processDecodedLine(\"223000 -15 -0.3 1681 B 6t++yk+aJbaE 6 \\n\");" }, { "line": 158, "text": "qCDebug(mainwindow_js8) << \"test inbox opened\"" } ] }, { "path": "JS8_Mode/soft_combiner.h", "score": 286, "hits": { "js8": 9, "decode": 8, "decoder": 5, "soft": 11, "filename:soft": 1 }, "sample_lines": [ { "line": 18, "text": "Q_DECLARE_LOGGING_CATEGORY(decoder_js8);" }, { "line": 20, "text": "namespace js8 {" }, { "line": 22, "text": "* @brief Cache and combine repeated LLR frames for the same decode candidate." }, { "line": 25, "text": "* receptions accumulate LLRs to improve decode probability without changing" }, { "line": 27, "text": "* to the decoder's bit count." }, { "line": 58, "text": "qCDebug(decoder_js8)" } ] }, { "path": "JS8_Main/Varicode.h", "score": 286, "hits": { "js8": 9, "decode": 3, "unpack": 17, "ft8": 1, "snr": 3, "message": 19 }, "sample_lines": [ { "line": 25, "text": "JS8CallNormal = 0," }, { "line": 26, "text": "JS8CallFast = 1," }, { "line": 27, "text": "JS8CallTurbo = 2," }, { "line": 28, "text": "JS8CallSlow = 4," }, { "line": 29, "text": "JS8CallUltra = 8" }, { "line": 32, "text": "// frame type transmitted via itype and decoded by the ft8 decoded" } ] }, { "path": "JS8_Mode/ldpc_feedback.h", "score": 280, "hits": { "js8": 8, "decode": 3, "decoder": 1, "ldpc": 12, "filename:ldpc": 1 }, "sample_lines": [ { "line": 14, "text": "Q_DECLARE_LOGGING_CATEGORY(decoder_js8);" }, { "line": 16, "text": "namespace js8 {" }, { "line": 18, "text": "* @brief LDPC erasure threshold config and feedback refinement helpers." }, { "line": 21, "text": "* refineLlrsWithLdpcFeedback shrinks/boosts LLRs using the decoded" }, { "line": 22, "text": "* codeword to retry LDPC. Used inside the JS8 decode loop between" }, { "line": 23, "text": "* LDPC passes." } ] }, { "path": "JS8_Main/MessageServer.cpp", "score": 280, "hits": { "js8": 15, "message": 53, "filename:message": 1 }, "sample_lines": [ { "line": 12, "text": "Q_DECLARE_LOGGING_CATEGORY(messageserver_js8)" }, { "line": 20, "text": "qCDebug(messageserver_js8)" }, { "line": 27, "text": "qCDebug(messageserver_js8)" }, { "line": 33, "text": "qCDebug(messageserver_js8)" }, { "line": 39, "text": "qCDebug(messageserver_js8)" }, { "line": 117, "text": "qCDebug(messageserver_js8) << \"MessageServer incomingConnection\" << handle;" } ] }, { "path": "JS8_Mode/Modulator.cpp", "score": 278, "hits": { "js8": 22, "sync": 4, "symbol": 6 }, "sample_lines": [ { "line": 6, "text": "#include \"JS8Submode.h\"" }, { "line": 7, "text": "#include \"JS8_Audio/SoundOutput.h\"" }, { "line": 8, "text": "#include \"JS8_Include/commons.h\"" }, { "line": 9, "text": "#include \"JS8_Main/DriftingDateTime.h\"" }, { "line": 10, "text": "#include \"JS8_UI/mainwindow.h\"" }, { "line": 21, "text": "Q_DECLARE_LOGGING_CATEGORY(modulator_js8)" } ] }, { "path": "JS8_Mode/whitening_processor.h", "score": 270, "hits": { "js8": 9, "decode": 5, "decoder": 5, "symbol": 20 }, "sample_lines": [ { "line": 15, "text": "Q_DECLARE_LOGGING_CATEGORY(decoder_js8);" }, { "line": 17, "text": "namespace js8 {" }, { "line": 19, "text": "* @brief Compute per-tone/symbol noise medians and whiten LLRs for a JS8 frame." }, { "line": 23, "text": "* templated on matrix dimensions, so it stays header-only; used inside the JS8" }, { "line": 24, "text": "* decoder per candidate." }, { "line": 102, "text": "qCDebug(decoder_js8).noquote() << oss.str().c_str();" } ] }, { "path": "JS8_Main/APRSISClient.cpp", "score": 267, "hits": { "js8": 21, "sync": 1, "message": 25 }, "sample_lines": [ { "line": 3, "text": "* @brief Implementation of APRS-IS client for JS8Call" }, { "line": 14, "text": "Q_DECLARE_LOGGING_CATEGORY(aprsisclient_js8)" }, { "line": 105, "text": "loginFrame = loginFrame.arg(\"JS8Call\");" }, { "line": 319, "text": "qCDebug(aprsisclient_js8)" }, { "line": 354, "text": "auto spotFrame = QString(\"%1>APJ8CL,qAS,%2:=%3/%4G#JS8 %5\\n\");" }, { "line": 427, "text": "qCDebug(aprsisclient_js8)" } ] }, { "path": "vendor/Eigen/src/Core/util/SymbolicIndex.h", "score": 260, "hits": { "symbol": 40, "filename:symbol": 1 }, "sample_lines": [] }, { "path": "JS8_Main/TxLoop.cpp", "score": 250, "hits": { "js8": 25 }, "sample_lines": [ { "line": 13, "text": "#include \"JS8_Mode/JS8Submode.h\"" }, { "line": 21, "text": "Q_DECLARE_LOGGING_CATEGORY(txloop_js8)" }, { "line": 26, "text": "m_submode{Varicode::JS8CallSlow}, m_active{false}," }, { "line": 36, "text": "qCDebug(txloop_js8) << m_name << \"Destruction of TX loop\";" }, { "line": 47, "text": "((qint64)1000) * JS8::Submode::period(m_submode);" }, { "line": 52, "text": "qCWarning(txloop_js8)" } ] }, { "path": "JS8_UDP/WSJTXMessageClient.h", "score": 246, "hits": { "js8": 3, "decode": 14, "snr": 4, "message": 34, "filename:message": 1 }, "sample_lines": [ { "line": 4, "text": "#include \"JS8_Include/pimpl_h.h\"" }, { "line": 5, "text": "#include \"JS8_Main/Radio.h\"" }, { "line": 29, "text": "* @param id Application identifier (e.g., \"JS8Call\")" }, { "line": 126, "text": "* @brief Send a Decode message" }, { "line": 128, "text": "* Sends information about a decoded message." }, { "line": 130, "text": "* @param is_new Whether this is a new decode" } ] }, { "path": "JS8_Main/JS8MessageBox.h", "score": 246, "hits": { "js8": 5, "soft": 1, "message": 24, "filename:js8": 1, "filename:message": 1 }, "sample_lines": [ { "line": 7, "text": "* JS8MessageBox - wrap the Qt QMessageBox class to give a more platform" }, { "line": 11, "text": "* We dogde the resulting problems by calling our MessageBox JS8MessageBox." }, { "line": 13, "text": "class JS8MessageBox : public QMessageBox {" }, { "line": 15, "text": "explicit JS8MessageBox(QWidget *parent = nullptr);" }, { "line": 16, "text": "explicit JS8MessageBox(Icon, QString const &text," } ] }, { "path": "JS8_UI/MessagePanel.cpp", "score": 244, "hits": { "js8": 4, "message": 90, "filename:message": 1 }, "sample_lines": [ { "line": 2, "text": "#include \"JS8_Include/EventFilter.h\"" }, { "line": 3, "text": "#include \"JS8_Main/Radio.h\"" }, { "line": 4, "text": "#include \"JS8_Widgets/DateTableWidgetItem.h\"" }, { "line": 5, "text": "#include \"JS8_Widgets/SemiSortableHeader.h\"" } ] }, { "path": "JS8_Main/TransmitTextEdit.cpp", "score": 226, "hits": { "js8": 10, "sync": 18 }, "sample_lines": [ { "line": 8, "text": "#include \"JS8_Include/commons.h\"" }, { "line": 9, "text": "#include \"JS8_Include/pimpl_impl.h\"" }, { "line": 22, "text": "Q_DECLARE_LOGGING_CATEGORY(transmittextedit_js8)" }, { "line": 27, "text": "#if JS8_ALLOW_EXTENDED" }, { "line": 39, "text": "#if JS8_ALLOW_UNICODE" }, { "line": 41, "text": "#elif JS8_ALLOW_EXTENDED" } ] }, { "path": "JS8_UDP/WSJTXMessageMapper.h", "score": 225, "hits": { "js8": 8, "decode": 8, "snr": 3, "message": 24, "filename:message": 1 }, "sample_lines": [ { "line": 4, "text": "#include \"JS8_Main/Radio.h\"" }, { "line": 15, "text": "* @brief Maps JS8Call events to WSJT-X protocol messages" }, { "line": 17, "text": "* This class translates JS8Call's internal event format to the WSJT-X binary" }, { "line": 18, "text": "* UDP protocol format, allowing JS8Call to communicate with WSJT-X and" }, { "line": 29, "text": "* @param main_window Main window instance for accessing JS8Call state" }, { "line": 39, "text": "* Maps JS8Call's status information to WSJT-X Status message format." } ] }, { "path": "vendor/Eigen/src/Core/arch/SYCL/PacketMath.h", "score": 222, "hits": { "unpack": 30, "soft": 3 }, "sample_lines": [ { "line": 33, "text": "const typename unpacket_traits::type, \\" }, { "line": 36, "text": "typedef typename unpacket_traits::type scalar; \\" }, { "line": 41, "text": "static_cast::type>(0)); \\" }, { "line": 63, "text": "const typename unpacket_traits::type, \\" }, { "line": 84, "text": "typename unpacket_traits::type> \\" }, { "line": 99, "text": "const typename unpacket_traits::type, \\" } ] }, { "path": "JS8_Network/PSKReporter.cpp", "score": 222, "hits": { "js8": 13, "sync": 1, "soft": 1, "snr": 7, "message": 30 }, "sample_lines": [ { "line": 13, "text": "#include \"JS8_Include/pimpl_impl.h\"" }, { "line": 14, "text": "#include \"JS8_Main/Bands.h\"" }, { "line": 15, "text": "#include \"JS8_Main/DriftingDateTime.h\"" }, { "line": 16, "text": "#include \"JS8_UI/Configuration.h\"" }, { "line": 39, "text": "Q_DECLARE_LOGGING_CATEGORY(pskreporter_js8)" }, { "line": 365, "text": "// handle re-opening asynchronously" } ] }, { "path": "JS8_UI/LogQSO.cpp", "score": 220, "hits": { "js8": 20, "fsk": 2, "message": 5 }, "sample_lines": [ { "line": 8, "text": "#include \"JS8_Include/Maidenhead.h\"" }, { "line": 9, "text": "#include \"JS8_Logbook/ADIF.h\"" }, { "line": 10, "text": "#include \"JS8_Main/Bands.h\"" }, { "line": 11, "text": "#include \"JS8_Main/DriftingDateTime.h\"" }, { "line": 12, "text": "#include \"JS8_Main/JS8MessageBox.h\"" }, { "line": 27, "text": "Q_DECLARE_LOGGING_CATEGORY(logqso_js8)" } ] }, { "path": "JS8_Mainwindow/initializeGroupMessage.cpp", "score": 202, "hits": { "js8": 16, "message": 9, "filename:message": 1 }, "sample_lines": [ { "line": 8, "text": "#include \"JS8_UI/mainwindow.h\"" }, { "line": 26, "text": "cmd.submode = Varicode::JS8CallNormal;" }, { "line": 40, "text": "cmd1.submode = Varicode::JS8CallNormal;" }, { "line": 52, "text": "cmd2.submode = Varicode::JS8CallNormal;" }, { "line": 60, "text": "qCDebug(mainwindow_js8) << \"Testing group messaging\";" }, { "line": 61, "text": "qCDebug(mainwindow_js8) << \"Test message ID: \" << mid;" } ] }, { "path": "JS8_UI/About.cpp", "score": 192, "hits": { "js8": 19, "message": 1 }, "sample_lines": [ { "line": 7, "text": "#include \"JS8_Main/revision_utils.h\"" }, { "line": 14, "text": "setWindowTitle(\"About JS8Call\");" }, { "line": 18, "text": "\"

About the JS8Call Development Team

\"" }, { "line": 19, "text": "\"

JS8Call is now being developed by the team that \"" }, { "line": 21, "text": "\"js8call starting in late 2024.
This team includes:
Chris \"" }, { "line": 25, "text": "\"The JS8Call code can be downloaded at \"" } ] }, { "path": "JS8_Mainwindow/processRxActivity.cpp", "score": 187, "hits": { "js8": 13, "snr": 5, "message": 21 }, "sample_lines": [ { "line": 8, "text": "#include \"JS8_UI/mainwindow.h\"" }, { "line": 17, "text": "qCDebug(mainwindow_js8)" }, { "line": 41, "text": "abs(d.offset - freqOffset) <= JS8::Submode::rxThreshold(d.submode);" }, { "line": 53, "text": "// qCDebug(mainwindow_js8) << \"should display compound too" }, { "line": 84, "text": "if ((d.bits & Varicode::JS8CallFirst) == Varicode::JS8CallFirst &&" }, { "line": 116, "text": "(d.bits & Varicode::JS8CallFirst) == Varicode::JS8CallFirst;" } ] }, { "path": "JS8_Transceiver/HamlibTransceiver.cpp", "score": 186, "hits": { "js8": 15, "fsk": 4, "message": 8 }, "sample_lines": [ { "line": 23, "text": "Q_DECLARE_LOGGING_CATEGORY(hamlibtransceiver_js8)" }, { "line": 53, "text": "qCCritical(hamlibtransceiver_js8, fmt, message.toLocal8Bit().data());" }, { "line": 57, "text": "qCWarning(hamlibtransceiver_js8, fmt, message.toLocal8Bit().data());" }, { "line": 61, "text": "qCDebug(hamlibtransceiver_js8, fmt, message.toLocal8Bit().data());" }, { "line": 167, "text": "if (hamlibtransceiver_js8().isDebugEnabled())" }, { "line": 169, "text": "else if (hamlibtransceiver_js8().isInfoEnabled())" } ] }, { "path": "vendor/Eigen/src/Core/arch/NEON/PacketMath.h", "score": 182, "hits": { "unpack": 26 }, "sample_lines": [ { "line": 129, "text": "EIGEN_STRONG_INLINE Packet4f vec4f_unpacklo(const Packet4f& a, const Packet4f& b)" }, { "line": 133, "text": "EIGEN_STRONG_INLINE Packet4f vec4f_unpackhi(const Packet4f& a, const Packet4f& b)" }, { "line": 458, "text": "template<> struct unpacket_traits" }, { "line": 472, "text": "template<> struct unpacket_traits" }, { "line": 486, "text": "template<> struct unpacket_traits" }, { "line": 499, "text": "template<> struct unpacket_traits" } ] }, { "path": "JS8_Main/Inbox.cpp", "score": 180, "hits": { "js8": 10, "message": 40 }, "sample_lines": [ { "line": 12, "text": "Q_DECLARE_LOGGING_CATEGORY(inbox_js8)" }, { "line": 148, "text": "// qCDebug(inbox_js8) << \"exec\" << sqlite3_expanded_sql(stmt);" }, { "line": 324, "text": "// qCDebug(inbox_js8) << \"exec \" << sqlite3_expanded_sql(stmt);" }, { "line": 400, "text": "// qCDebug(inbox_js8) << \"exec \" << sqlite3_expanded_sql(stmt);" }, { "line": 509, "text": "// qCDebug(inbox_js8) << \"exec \" << sqlite3_expanded_sql(stmt);" }, { "line": 582, "text": "// qCDebug(inbox_js8) << \"exec \" << sqlite3_expanded_sql(stmt);" } ] }, { "path": "vendor/Eigen/src/KLUSupport/KLUSupport.h", "score": 175, "hits": { "symbol": 35 }, "sample_lines": [] }, { "path": "JS8_Mainwindow/displayBandActivity.cpp", "score": 173, "hits": { "js8": 8, "snr": 31 }, "sample_lines": [ { "line": 8, "text": "#include \"JS8_UI/mainwindow.h\"" }, { "line": 104, "text": "if (lhsSubmode == Varicode::JS8CallSlow)" }, { "line": 106, "text": "if (rhsSubmode == Varicode::JS8CallSlow)" }, { "line": 206, "text": "if ((item.bits & Varicode::JS8CallLast) ==" }, { "line": 207, "text": "Varicode::JS8CallLast) {" }, { "line": 256, "text": "auto name = JS8::Submode::name(submode);" } ] }, { "path": "JS8_Main/MessageClient.cpp", "score": 170, "hits": { "js8": 5, "message": 48, "filename:message": 1 }, "sample_lines": [ { "line": 9, "text": "#include \"JS8_Include/pimpl_impl.h\"" }, { "line": 24, "text": "Q_DECLARE_LOGGING_CATEGORY(messageclient_js8)" }, { "line": 161, "text": "qCDebug(messageclient_js8)" }, { "line": 265, "text": "Q_LOGGING_CATEGORY(messageclient_js8, \"messageclient.js8\", QtWarningMsg)" } ] }, { "path": "JS8_Main/AprsInboundRelay.cpp", "score": 170, "hits": { "js8": 8, "message": 45 }, "sample_lines": [ { "line": 9, "text": "* When function is enabled in settings JS8Call will listen for APRS messages" }, { "line": 15, "text": "#include \"JS8_Main/DriftingDateTime.h\"" }, { "line": 16, "text": "#include \"JS8_Main/Radio.h\"" }, { "line": 17, "text": "#include \"JS8_UI/Configuration.h\"" }, { "line": 26, "text": "Q_DECLARE_LOGGING_CATEGORY(mainwindow_js8)" }, { "line": 102, "text": "qCDebug(mainwindow_js8)" } ] }, { "path": "vendor/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h", "score": 161, "hits": { "unpack": 23 }, "sample_lines": [ { "line": 31, "text": "typedef typename unpacket_traits::type Scalar;" }, { "line": 32, "text": "typedef typename unpacket_traits::integer_packet PacketI;" }, { "line": 41, "text": "typedef typename unpacket_traits::type Scalar;" }, { "line": 108, "text": "typedef typename unpacket_traits::integer_packet PacketI;" }, { "line": 109, "text": "typedef typename unpacket_traits::type Scalar;" }, { "line": 110, "text": "typedef typename unpacket_traits::type ScalarI;" } ] }, { "path": "JS8_Main/FrequencyList.cpp", "score": 156, "hits": { "js8": 15, "ft8": 1 }, "sample_lines": [ { "line": 3, "text": "* @brief Implementation of the JS8 standard operating frequencies" }, { "line": 7, "text": "#include \"JS8_Include/pimpl_impl.h\"" }, { "line": 8, "text": "#include \"JS8_Main/Bands.h\"" }, { "line": 31, "text": "{1843500, Modes::JS8, IARURegions::ALL, \"\"}, // 3.5 above" }, { "line": 32, "text": "{3578000, Modes::JS8, IARURegions::ALL, \"\"}, // 5 above" }, { "line": 33, "text": "{5363000, Modes::JS8," } ] }, { "path": "JS8_Main/MultiSettings.cpp", "score": 152, "hits": { "js8": 9, "sync": 6, "message": 10 }, "sample_lines": [ { "line": 7, "text": "#include \"JS8MessageBox.h\"" }, { "line": 8, "text": "#include \"JS8_Include/SettingsGroup.h\"" }, { "line": 9, "text": "#include \"JS8_Include/pimpl_impl.h\"" }, { "line": 338, "text": "settings_.sync();" }, { "line": 388, "text": "settings_.sync();" }, { "line": 544, "text": "settings_.sync();" } ] }, { "path": "JS8_Mainwindow/processBufferedActivity.cpp", "score": 148, "hits": { "js8": 8, "message": 34 }, "sample_lines": [ { "line": 7, "text": "#include \"JS8_UI/mainwindow.h\"" }, { "line": 33, "text": "buffer.msgs.last().bits |= Varicode::JS8CallLast;" }, { "line": 49, "text": "if ((buffer.msgs.last().bits & Varicode::JS8CallLast) !=" }, { "line": 50, "text": "Varicode::JS8CallLast) {" }, { "line": 85, "text": "buffer.cmd.bits |= Varicode::JS8CallLast;" }, { "line": 90, "text": "qCDebug(mainwindow_js8)" } ] }, { "path": "JS8_Mainwindow/confirmThenEnqueueMessage.cpp", "score": 147, "hits": { "js8": 1, "decode": 2, "decoder": 2, "sync": 1, "message": 37, "filename:message": 1 }, "sample_lines": [ { "line": 6, "text": "* kept in sync on pending autoreply transmissions." }, { "line": 10, "text": "#include \"../JS8_UI/mainwindow.h\"" }, { "line": 15, "text": "* Called from the decoder thread; all Qt and network operations are marshalled" }, { "line": 37, "text": "// CRITICAL: called from decoder thread → QTimer/sendNetworkMessage must run in GUI thread" } ] }, { "path": "JS8_Mainwindow/buildQueryMenu.cpp", "score": 146, "hits": { "js8": 1, "snr": 12, "message": 50 }, "sample_lines": [ { "line": 7, "text": "#include \"JS8_UI/mainwindow.h\"" } ] }, { "path": "JS8_Transceiver/HRDTransceiver.cpp", "score": 144, "hits": { "js8": 8, "fsk": 4, "message": 22 }, "sample_lines": [ { "line": 8, "text": "#include \"JS8_Network/NetworkServerLookup.h\"" }, { "line": 19, "text": "Q_DECLARE_LOGGING_CATEGORY(hrdtransceiver_js8)" }, { "line": 891, "text": "bool quiet{hrdtransceiver_js8().isDebugEnabled()};" }, { "line": 893, "text": "qCDebug(hrdtransceiver_js8) << \"+++++++ poll dump +++++++\";" }, { "line": 894, "text": "qCDebug(hrdtransceiver_js8) << \"reversed:\" << reversed_;" }, { "line": 920, "text": "qCDebug(hrdtransceiver_js8) << \"------- poll dump -------\";" } ] }, { "path": "JS8_Mainwindow/dataSink.cpp", "score": 142, "hits": { "js8": 11, "decode": 3, "decoder": 1 }, "sample_lines": [ { "line": 8, "text": "#include \"JS8_UI/mainwindow.h\"" }, { "line": 80, "text": "constexpr int NMAX = JS8_NTMAX * 12000;" }, { "line": 92, "text": "m_ihsym = int((float)frames / (float)JS8_NSPS) * 2;" }, { "line": 97, "text": "// qCDebug(mainwindow_js8) << \"k\" << k << \"k0\" << k0 << \"delta\" << k-k0;" }, { "line": 104, "text": "int const cycle = JS8::Submode::computeCycleForDecode(m_nSubMode, k);" }, { "line": 107, "text": "qCDebug(decoder_js8) << \"period loop, resetting ssum\";" } ] }, { "path": "vendor/Eigen/src/Core/util/IndexedViewHelper.h", "score": 140, "hits": { "symbol": 28 }, "sample_lines": [] }, { "path": "JS8_Main/Message.cpp", "score": 130, "hits": { "message": 53, "filename:message": 1 }, "sample_lines": [] }, { "path": "JS8_UI/WideGraph.h", "score": 129, "hits": { "js8": 2, "decode": 4, "sync": 11 }, "sample_lines": [ { "line": 5, "text": "#include \"JS8_Include/commons.h\"" }, { "line": 6, "text": "#include \"JS8_Main/WF.h\"" }, { "line": 45, "text": "bool isAutoSyncEnabled() const;" }, { "line": 47, "text": "bool shouldDisplayDecodeAttempts() const;" }, { "line": 48, "text": "bool shouldAutoSyncSubmode(int) const;" }, { "line": 54, "text": "void drawDecodeLine(QColor const &, int, int);" } ] }, { "path": "CMake/Modules/GetPrerequisites.cmake", "score": 124, "hits": { "soft": 7, "message": 48 }, "sample_lines": [] }, { "path": "JS8_Mainwindow/displayCallActivity.cpp", "score": 124, "hits": { "js8": 6, "snr": 16, "message": 8 }, "sample_lines": [ { "line": 8, "text": "#include \"JS8_UI/mainwindow.h\"" }, { "line": 143, "text": "if (lhs == Varicode::JS8CallSlow)" }, { "line": 145, "text": "if (rhs == Varicode::JS8CallSlow)" }, { "line": 295, "text": "auto name = JS8::Submode::name(d.submode);" }, { "line": 296, "text": "auto modeItem = (name == \"JS8 40\" || name == \"JS8 60\")" } ] } ], "next_action": "Inspect top ranked files for the smallest RX-only WAV-to-message path; do not use GUI/API/TX code." } [webftr-js8-lab] OK [webftr-js8-lab] log file: /decoders/js8_decoder/logs/20260527T100324Z_clone-audit.log [webftr-js8-lab] manifest: /decoders/js8_decoder/logs/20260527T100324Z_clone-audit_manifest.json [webftr-js8-lab] audit exit_code=0 ========== FULL-AUDIT STEP 3/4: FOCUSED RX SOURCE MAP ========== [webftr-js8-lab] command=source-map [webftr-js8-lab] root=/decoders/js8_decoder [webftr-js8-lab] log=/decoders/js8_decoder/logs/20260527T100328Z_source-map.log [webftr-js8-lab] manifest=/decoders/js8_decoder/logs/20260527T100328Z_source-map_manifest.json [webftr-js8-lab] utc=20260527T100328Z [webftr-js8-lab] rx-only guard: no TX / no PTT / no Tune / no Send [webftr-js8-lab] focused RX source-map source: /decoders/js8_decoder/runtime/src/JS8Call-improved [webftr-js8-lab] JSON output: /decoders/js8_decoder/logs/20260527T100328Z_source_map_output.json [webftr-js8-lab] JSON timeout guard: 180s { "ok": true, "source_dir": "/decoders/js8_decoder/runtime/src/JS8Call-improved", "scanned_files": 542, "source_map_version": "step49-source-constants-rx-core-extract-audit", "rx_only_guard": { "tx": false, "ptt": false, "tune": false, "send": false, "js8call_runtime_control": false }, "audit_conclusion": { "smallest_likely_rx_core": [ "JS8_Mode/JS8.cpp", "JS8_Mode/JS8.h", "JS8_Mode/Decoder.cpp", "JS8_Mode/Decoder.h", "JS8_Mode/DecodedText.cpp", "JS8_Mode/DecodedText.h", "JS8_Mode/JS8Submode.cpp", "JS8_Mode/JS8Submode.h", "JS8_Mode/soft_combiner.h", "JS8_Mode/ldpc_feedback.h", "JS8_Mode/whitening_processor.h", "JS8_Include/commons.h", "JS8_Main/Varicode.cpp", "JS8_Main/Varicode.h", "JS8_JSC/JSC_map.cpp", "JS8_JSC/JSC_list.cpp" ], "missing_expected_files": [], "excluded_by_design": [ "vendor/", "JS8_UI/", "JS8_Mainwindow/", "JS8_UDP/", "JS8_Network/", "JS8_Transceiver/" ], "note": "This is a source-map for a future RX-only decoder extraction/reimplementation. It does not compile or link JS8Call and does not start JS8Call." }, "proposed_build_order": [ { "phase": "audio_ingest", "purpose": "read mono 12 kHz WAV blocks and expose stable sample windows", "local_lab_files": [ "wav_inspect.py", "decode_js8_lab.py" ], "reference_files": [ "JS8_Include/commons.h" ] }, { "phase": "sync_and_symbol_candidates", "purpose": "locate JS8 frames and extract soft symbol metrics without GUI/runtime", "reference_files": [ "JS8_Mode/JS8.cpp", "JS8_Mode/Decoder.cpp", "JS8_Mode/JS8Submode.cpp" ] }, { "phase": "fec_soft_decode", "purpose": "LDPC/FEC path and soft-combining needed before text messages exist", "reference_files": [ "JS8_Mode/ldpc_feedback.h", "JS8_Mode/soft_combiner.h", "JS8_Mode/whitening_processor.h" ] }, { "phase": "message_unpack", "purpose": "turn decoded bits into JS8 text and WebFTR decodes[] rows", "reference_files": [ "JS8_Main/Varicode.cpp", "JS8_Main/Varicode.h", "JS8_Mode/DecodedText.cpp", "JS8_Mode/DecodedText.h", "JS8_JSC/JSC_map.cpp", "JS8_JSC/JSC_list.cpp" ] } ], "core_files": [ { "path": "JS8_Mode/JS8.cpp", "exists": true, "category": "rx_core_candidate", "focused_rx_score": 1608, "hits": { "decode": 142, "decoder": 36, "sync": 120, "ldpc": 23, "soft": 8, "symbol": 37, "snr": 14, "js8": 111 }, "tx_risk_terms": { "tx": 24, "send": 2, "rig": 6, "cat": 13 }, "includes": [ "JS8.h", "JS8_Include/commons.h", "JS8_Mode/FrequencyTracker.h", "JS8_Mode/whitening_processor.h", "ldpc_feedback.h", "soft_combiner.h", "QDebug", "QLoggingCategory", "QtGlobal", "algorithm", "atomic", "boost/crc.hpp", "boost/math/ccmath/round.hpp", "boost/multi_index/key.hpp", "boost/multi_index/ordered_index.hpp", "boost/multi_index/ranked_index.hpp", "boost/multi_index_container.hpp", "chrono", "cmath", "complex", "concepts", "cstddef", "cstdint", "cstdlib", "fftw3.h", "initializer_list", "limits", "memory", "mutex", "numbers", "numeric", "optional", "sstream", "stdexcept", "string_view", "unordered_map", "utility", "vector", "vendor/Eigen/Dense", "JS8.moc" ], "interesting_symbols": [ { "line": 8, "text": "#include \"JS8.h\"" }, { "line": 9, "text": "#include \"JS8_Include/commons.h\"" }, { "line": 10, "text": "#include \"JS8_Mode/FrequencyTracker.h\"" }, { "line": 11, "text": "#include \"JS8_Mode/whitening_processor.h\"" }, { "line": 12, "text": "#include \"ldpc_feedback.h\"" }, { "line": 50, "text": "Q_DECLARE_LOGGING_CATEGORY(decoder_js8);" }, { "line": 187, "text": "constexpr int NS = 21; // Sync symbols (3 @ Costas 7x7)" }, { "line": 189, "text": "constexpr float ASYNCMIN = 1.5f; // Minimum sync" }, { "line": 215, "text": "/* A MODE DECODER */" }, { "line": 219, "text": "inline static constexpr int NSUBMODE = 0;" } ] }, { "path": "JS8_Mode/JS8.h", "exists": true, "category": "rx_core_candidate", "focused_rx_score": 256, "hits": { "decode": 13, "decoder": 2, "sync": 5, "snr": 1, "js8": 5 }, "tx_risk_terms": { "rig": 2 }, "includes": [ "QObject", "QSemaphore", "QThread", "array", "functional", "string", "variant" ], "interesting_symbols": [ { "line": 1, "text": "#ifndef __JS8" }, { "line": 2, "text": "#define __JS8" }, { "line": 12, "text": "namespace JS8 {" }, { "line": 43, "text": "struct DecodeStarted {" }, { "line": 44, "text": "int submodes;" }, { "line": 47, "text": "struct SyncStart {" }, { "line": 52, "text": "struct SyncState {" }, { "line": 53, "text": "enum class Type { CANDIDATE, DECODED } type;" }, { "line": 59, "text": "float decoded;" }, { "line": 60, "text": "} sync;" } ] }, { "path": "JS8_Mode/Decoder.cpp", "exists": true, "category": "rx_core_candidate", "focused_rx_score": 392, "hits": { "decode": 32, "decoder": 32, "js8": 8 }, "tx_risk_terms": { "rig": 1, "cat": 3 }, "includes": [ "Decoder.h", "JS8_Include/commons.h", "QLoggingCategory", "QTimer" ], "interesting_symbols": [ { "line": 7, "text": "#include \"Decoder.h\"" }, { "line": 8, "text": "#include \"JS8_Include/commons.h\"" }, { "line": 13, "text": "Q_DECLARE_LOGGING_CATEGORY(decoder_js8)" }, { "line": 18, "text": "Decoder::Decoder(QObject * parent)" }, { "line": 21, "text": "Decoder::~Decoder() {}" }, { "line": 24, "text": "void Decoder::lock() {" }, { "line": 29, "text": "void Decoder::unlock() {" }, { "line": 34, "text": "Worker *Decoder::createWorker() {" }, { "line": 38, "text": "connect(this, &Decoder::startWorker, worker, &Worker::start);" }, { "line": 39, "text": "connect(this, &Decoder::quitWorker, worker, &Worker::quit);" } ] }, { "path": "JS8_Mode/Decoder.h", "exists": true, "category": "rx_core_candidate", "focused_rx_score": 225, "hits": { "decode": 7, "decoder": 7, "js8": 2 }, "tx_risk_terms": { "rig": 1, "cat": 2 }, "includes": [ "JS8_Main/ProcessThread.h", "QByteArray", "QLoggingCategory", "QPointer", "QProcess" ], "interesting_symbols": [ { "line": 1, "text": "#ifndef DECODER_H" }, { "line": 2, "text": "#define DECODER_H" }, { "line": 8, "text": "#include \"JS8_Main/ProcessThread.h\"" }, { "line": 37, "text": "class Decoder : public QObject {" }, { "line": 40, "text": "Decoder(QObject *parent = nullptr);" }, { "line": 41, "text": "~Decoder();" }, { "line": 88, "text": "Q_DECLARE_LOGGING_CATEGORY(decoder_js8)" }, { "line": 90, "text": "#endif // DECODER_H" } ] }, { "path": "JS8_Mode/DecodedText.cpp", "exists": true, "category": "rx_core_candidate", "focused_rx_score": 447, "hits": { "decode": 42, "decoder": 2, "unpack": 22, "snr": 7, "js8": 20 }, "tx_risk_terms": { "tx": 3, "rig": 8, "cat": 1 }, "includes": [ "DecodedText.h", "JS8_Include/commons.h", "JS8_Main/Varicode.h", "QStringBuilder" ], "interesting_symbols": [ { "line": 6, "text": "#include \"DecodedText.h\"" }, { "line": 7, "text": "#include \"JS8_Include/commons.h\"" }, { "line": 8, "text": "#include " }, { "line": 33, "text": "QChar submodeChar(int const submode) {" }, { "line": 34, "text": "switch (submode) {" }, { "line": 35, "text": "case Varicode::SubmodeType::JS8CallNormal:" }, { "line": 37, "text": "case Varicode::SubmodeType::JS8CallFast:" }, { "line": 39, "text": "case Varicode::SubmodeType::JS8CallTurbo:" }, { "line": 41, "text": "case Varicode::SubmodeType::JS8CallSlow:" }, { "line": 43, "text": "case Varicode::SubmodeType::JS8CallUltra:" } ] }, { "path": "JS8_Mode/DecodedText.h", "exists": true, "category": "rx_core_candidate", "focused_rx_score": 282, "hits": { "decode": 15, "decoder": 1, "unpack": 12, "snr": 4, "js8": 2 }, "tx_risk_terms": {}, "includes": [ "JS8.h", "QString", "QStringList" ], "interesting_symbols": [ { "line": 8, "text": "#ifndef DECODEDTEXT_H" }, { "line": 9, "text": "#define DECODEDTEXT_H" }, { "line": 11, "text": "#include \"JS8.h\"" }, { "line": 16, "text": "class DecodedText {" }, { "line": 20, "text": "explicit DecodedText(JS8::Event::Decoded const &);" }, { "line": 21, "text": "explicit DecodedText(QString const &frame, int bits, int submode);" }, { "line": 40, "text": "int submode() const { return submode_; }" }, { "line": 53, "text": "bool tryUnpackFastData(QString const &);" }, { "line": 54, "text": "bool tryUnpackData(QString const &);" }, { "line": 55, "text": "bool tryUnpackHeartbeat(QString const &);" } ] }, { "path": "JS8_Mode/JS8Submode.cpp", "exists": true, "category": "rx_core_candidate", "focused_rx_score": 458, "hits": { "decode": 6, "symbol": 32, "snr": 11, "js8": 51 }, "tx_risk_terms": { "tx": 13, "transmit": 1, "rig": 4, "cat": 4 }, "includes": [ "JS8Submode.h", "JS8_Include/commons.h", "JS8_Main/Varicode.h", "QLoggingCategory", "concepts" ], "interesting_symbols": [ { "line": 5, "text": "#include \"JS8Submode.h\"" }, { "line": 6, "text": "#include \"JS8_Include/commons.h\"" }, { "line": 7, "text": "#include \"JS8_Main/Varicode.h\"" }, { "line": 17, "text": "Q_DECLARE_LOGGING_CATEGORY(js8submode_js8)" }, { "line": 19, "text": "namespace JS8::Submode {" }, { "line": 66, "text": "m_samplesForSymbols(JS8_NUM_SYMBOLS * samplesForOneSymbol)," }, { "line": 67, "text": "m_bandwidth(8 * JS8_RX_SAMPLE_RATE / samplesForOneSymbol)," }, { "line": 68, "text": "m_samplesPerPeriod(JS8_RX_SAMPLE_RATE * period)," }, { "line": 69, "text": "m_toneSpacing(JS8_RX_SAMPLE_RATE / (double)samplesForOneSymbol)," }, { "line": 72, "text": "(0.5 + startDelayMS / 1000.0) * JS8_RX_SAMPLE_RATE))," } ] }, { "path": "JS8_Mode/JS8Submode.h", "exists": true, "category": "rx_core_candidate", "focused_rx_score": 255, "hits": { "decode": 2, "symbol": 10, "snr": 1, "js8": 14 }, "tx_risk_terms": { "tx": 3, "transmit": 2, "send": 1 }, "includes": [ "JS8_Mode/JS8.h", "QString", "stdexcept" ], "interesting_symbols": [ { "line": 1, "text": "#ifndef JS8_SUBMODE_HPP_" }, { "line": 2, "text": "#define JS8_SUBMODE_HPP_" }, { "line": 4, "text": "#include \"JS8_Mode/JS8.h\"" }, { "line": 10, "text": "namespace JS8::Submode {" }, { "line": 33, "text": "/** Name of the submode, in all uppercase letters. */" }, { "line": 97, "text": "int computeCycleForDecode(int, int);" }, { "line": 98, "text": "int computeAltCycleForDecode(int, int, int);" }, { "line": 100, "text": "} // namespace JS8::Submode" }, { "line": 102, "text": "#endif // JS8_SUBMODE_HPP_" } ] }, { "path": "JS8_Mode/soft_combiner.h", "exists": true, "category": "rx_core_candidate", "focused_rx_score": 277, "hits": { "decode": 8, "decoder": 5, "soft": 11, "js8": 9 }, "tx_risk_terms": { "cat": 2 }, "includes": [ "QDebug", "QLoggingCategory", "QtGlobal", "algorithm", "array", "chrono", "cmath", "cstdint", "mutex", "optional", "unordered_map", "utility", "vector" ], "interesting_symbols": [ { "line": 18, "text": "Q_DECLARE_LOGGING_CATEGORY(decoder_js8);" }, { "line": 20, "text": "namespace js8 {" }, { "line": 58, "text": "qCDebug(decoder_js8)" }, { "line": 59, "text": "<< \"soft-combining disabled (JS8_SOFT_COMBINING=0)\";" }, { "line": 97, "text": "qCDebug(decoder_js8)" }, { "line": 104, "text": "void markDecoded(Key const &key) {" }, { "line": 200, "text": "int value = qEnvironmentVariableIntValue(\"JS8_SOFT_COMBINING\", &ok);" }, { "line": 231, "text": "if (!qEnvironmentVariableIsSet(\"JS8_SOFT_COMBINING_TEST\"))" }, { "line": 275, "text": "qCDebug(decoder_js8)" }, { "line": 294, "text": "} // namespace js8" } ] }, { "path": "JS8_Mode/ldpc_feedback.h", "exists": true, "category": "rx_core_candidate", "focused_rx_score": 250, "hits": { "decode": 3, "decoder": 1, "ldpc": 12, "js8": 8 }, "tx_risk_terms": { "cat": 2 }, "includes": [ "QDebug", "QLoggingCategory", "QtGlobal", "algorithm", "array", "cmath", "cstdint", "cstdlib", "optional" ], "interesting_symbols": [ { "line": 14, "text": "Q_DECLARE_LOGGING_CATEGORY(decoder_js8);" }, { "line": 16, "text": "namespace js8 {" }, { "line": 31, "text": "constexpr int LDPC_FEEDBACK_MAX_PASSES_DEFAULT = 8;" }, { "line": 36, "text": "if (auto const env = std::getenv(\"JS8_LLR_ERASURE_THRESH\"); env) {" }, { "line": 46, "text": "std::getenv(\"JS8_DISABLE_ERASURE_THRESHOLDING\")) {" }, { "line": 53, "text": "inline bool ldpcFeedbackEnabled() {" }, { "line": 55, "text": "int value = qEnvironmentVariableIntValue(\"JS8_LDPC_FEEDBACK\", &ok);" }, { "line": 59, "text": "inline int ldpcFeedbackMaxPasses() {" }, { "line": 61, "text": "int value = qEnvironmentVariableIntValue(\"JS8_LDPC_MAX_PASSES\", &ok);" }, { "line": 64, "text": "return LDPC_FEEDBACK_MAX_PASSES_DEFAULT;" } ] }, { "path": "JS8_Mode/whitening_processor.h", "exists": true, "category": "rx_core_candidate", "focused_rx_score": 295, "hits": { "decode": 5, "decoder": 5, "symbol": 20, "js8": 9 }, "tx_risk_terms": { "cat": 2 }, "includes": [ "QDebug", "QLoggingCategory", "algorithm", "array", "cmath", "cstdlib", "numeric", "optional", "sstream", "vector" ], "interesting_symbols": [ { "line": 15, "text": "Q_DECLARE_LOGGING_CATEGORY(decoder_js8);" }, { "line": 17, "text": "namespace js8 {" }, { "line": 102, "text": "qCDebug(decoder_js8).noquote() << oss.str().c_str();" }, { "line": 139, "text": "qCDebug(decoder_js8)" }, { "line": 146, "text": "std::getenv(\"JS8_DISABLE_WHITENING\") != nullptr;" }, { "line": 246, "text": "qCDebug(decoder_js8) << \"LLR whitening applied\"" }, { "line": 259, "text": "} // namespace js8" } ] }, { "path": "JS8_Include/commons.h", "exists": true, "category": "rx_core_candidate", "focused_rx_score": 379, "hits": { "decode": 18, "sync": 4, "symbol": 6, "js8": 40 }, "tx_risk_terms": { "tx": 5 }, "includes": [ "cstdint", "mutex" ], "interesting_symbols": [ { "line": 11, "text": "#define JS8_NSPS 6192" }, { "line": 12, "text": "#define JS8_NSMAX 6827" }, { "line": 13, "text": "#define JS8_NTMAX 60" }, { "line": 14, "text": "#define JS8_RX_SAMPLE_RATE 12000" }, { "line": 15, "text": "#define JS8_RX_SAMPLE_SIZE (JS8_NTMAX * JS8_RX_SAMPLE_RATE)" }, { "line": 17, "text": "#define JS8_RING_BUFFER 1 // use a ring buffer instead of clearing the decode frames" }, { "line": 18, "text": "#define JS8_DECODE_THREAD 1 // use a separate thread for decode process handling" }, { "line": 19, "text": "#define JS8_ALLOW_EXTENDED 1 // allow extended latin-1 capital charset" }, { "line": 20, "text": "#define JS8_AUTO_SYNC 1 // enable the experimental auto sync feature" }, { "line": 22, "text": "#define JS8_NUM_SYMBOLS 79" } ] }, { "path": "JS8_Main/Varicode.cpp", "exists": true, "category": "message_unpack_candidate", "focused_rx_score": 654, "hits": { "decode": 8, "unpack": 76, "snr": 34, "js8": 55 }, "tx_risk_terms": { "transmit": 5, "send": 16, "rig": 7, "cat": 17 }, "includes": [ "Varicode.h", "JS8_JSC/JSC.h", "JS8_Mode/DecodedText.h", "QLoggingCategory", "QMap", "QSet", "boost/format.hpp", "vendor/CRCpp/CRC.h", "cmath", "stdexcept" ], "interesting_symbols": [ { "line": 8, "text": "#include \"Varicode.h\"" }, { "line": 9, "text": "#include \"JS8_JSC/JSC.h\"" }, { "line": 10, "text": "#include \"JS8_Mode/DecodedText.h\"" }, { "line": 24, "text": "Q_DECLARE_LOGGING_CATEGORY(varicode_js8)" }, { "line": 221, "text": "{\"@JS8NET\", nbasecall + 3}, // JS8NET group" }, { "line": 265, "text": "{\"@JS8\", nbasecall + 35}, // JS8 GROUP" }, { "line": 359, "text": "QString Varicode::extendedChars() {" }, { "line": 372, "text": "QString Varicode::escape(const QString &text) {" }, { "line": 382, "text": "#if JS8_USE_ESCAPE_SUB_CHAR" }, { "line": 394, "text": "QString Varicode::unescape(const QString &text) {" } ] }, { "path": "JS8_Main/Varicode.h", "exists": true, "category": "message_unpack_candidate", "focused_rx_score": 274, "hits": { "decode": 3, "unpack": 17, "snr": 3, "js8": 9 }, "tx_risk_terms": { "transmit": 1, "rig": 1 }, "includes": [ "QBitArray", "QRegularExpression", "QString", "QThread", "QVector" ], "interesting_symbols": [ { "line": 1, "text": "#ifndef VARICODE_H" }, { "line": 2, "text": "#define VARICODE_H" }, { "line": 14, "text": "class Varicode {" }, { "line": 24, "text": "enum SubmodeType {" }, { "line": 25, "text": "JS8CallNormal = 0," }, { "line": 26, "text": "JS8CallFast = 1," }, { "line": 27, "text": "JS8CallTurbo = 2," }, { "line": 28, "text": "JS8CallSlow = 4," }, { "line": 29, "text": "JS8CallUltra = 8" }, { "line": 34, "text": "JS8Call = 0, // [000] <- any other frame of the message" } ] }, { "path": "JS8_JSC/JSC_map.cpp", "exists": true, "category": "rx_core_candidate", "focused_rx_score": -539, "hits": { "decode": 6, "decoder": 2, "sync": 73, "ldpc": 1, "soft": 168, "symbol": 21, "unpack": 5, "snr": 5, "js8": 6 }, "tx_risk_terms": { "tx": 47, "transmit": 15, "ptt": 10, "tune": 33, "send": 49, "rig": 416, "hamlib": 1, "cat": 1009 }, "includes": [ "JSC.h" ], "interesting_symbols": [ { "line": 95, "text": "{\"\\\\\", 1, 68}, // FYI: this used to be FT8 in JS8 1.0" }, { "line": 96, "text": "{\"\\n\", 1, 69}, // FYI: this used to be \"\\\" in JS8 1.0" }, { "line": 97, "text": "{\"JS8\", 3, 70}," }, { "line": 98, "text": "{\"JS8CALL\", 7, 71}," }, { "line": 100, "text": "72}, // FYI: this used to be JSQSO in JS8 1.0, it is now a substitute flag" }, { "line": 32911, "text": "{\"SYNC\", 4, 32883}," }, { "line": 40361, "text": "{\"SYNCHRONIZATION\", 15, 40333}," }, { "line": 43476, "text": "{\"DECODER\", 7, 43448}," }, { "line": 47164, "text": "{\"ASYNCHRONOUS\", 12, 47136}," }, { "line": 48994, "text": "{\"SYNCHRONOUS\", 11, 48966}," } ] }, { "path": "JS8_JSC/JSC_list.cpp", "exists": true, "category": "rx_core_candidate", "focused_rx_score": -539, "hits": { "decode": 6, "decoder": 2, "sync": 73, "ldpc": 1, "soft": 168, "symbol": 21, "unpack": 5, "snr": 5, "js8": 6 }, "tx_risk_terms": { "tx": 47, "transmit": 15, "ptt": 10, "tune": 33, "send": 49, "rig": 416, "hamlib": 1, "cat": 1009 }, "includes": [ "JSC.h" ], "interesting_symbols": [ { "line": 16249, "text": "{\"VSYNC\", 5, 146064}," }, { "line": 21073, "text": "{\"UUDECODE\", 8, 212134}," }, { "line": 23617, "text": "{\"UNPACKS\", 7, 238679}," }, { "line": 23618, "text": "{\"UNPACKING\", 9, 69270}," }, { "line": 23619, "text": "{\"UNPACKED\", 8, 92955}," }, { "line": 23620, "text": "{\"UNPACKAGED\", 10, 179051}," }, { "line": 23621, "text": "{\"UNPACK\", 6, 69093}," }, { "line": 39192, "text": "{\"SYNCYTIAL\", 9, 132486}," }, { "line": 39193, "text": "{\"SYNCTEST\", 8, 246773}," }, { "line": 39194, "text": "{\"SYNCS\", 5, 143059}," } ] } ], "additional_candidates": [ { "path": "CMakeLists.txt", "exists": true, "category": "support_or_unknown", "focused_rx_score": 349, "hits": { "decode": 2, "soft": 1, "symbol": 1, "js8": 125 }, "tx_risk_terms": { "tx": 4, "transmit": 2, "rig": 15, "hamlib": 9, "cat": 8 }, "includes": [], "interesting_symbols": [ { "line": 4, "text": "# JS8Call Build:" }, { "line": 38, "text": "set(CMAKE_PREFIX_PATH ${CMAKE_SOURCE_DIR}/../js8libs)" }, { "line": 60, "text": "JS8Call" }, { "line": 68, "text": "set(PROJECT_HOMEPAGE https://groups.io/g/js8call)" }, { "line": 91, "text": "# define in js8call_config.h.in, which makes them available to the C/C++" }, { "line": 220, "text": "JS8CALL_VERSION=\\\"${PROJECT_VERSION}\\\"" }, { "line": 229, "text": "\"${CMAKE_CURRENT_SOURCE_DIR}/JS8_Include/js8call_config.h.in\"" }, { "line": 230, "text": "\"${CMAKE_CURRENT_BINARY_DIR}/js8call_config.h\"" }, { "line": 235, "text": "${CMAKE_CURRENT_BINARY_DIR}/js8call_config.h" }, { "line": 245, "text": "JS8_Audio/AudioDevice.cpp" } ] }, { "path": "tools/tracking_diag.cpp", "exists": true, "category": "diagnostic_harness_reference", "focused_rx_score": 273, "hits": { "decode": 36, "decoder": 13, "sync": 1, "symbol": 1, "snr": 19, "js8": 25 }, "tx_risk_terms": { "tx": 6, "cat": 6 }, "includes": [ "cmath", "cstring", "optional", "random", "sstream", "vector", "iostream", "mutex", "thread", "cstdlib", "QCoreApplication", "QEventLoop", "QLoggingCategory", "QThread", "JS8_Include/commons.h", "JS8_Mode/JS8.h", "../JS8_Mode/JS8.cpp" ], "interesting_symbols": [ { "line": 30, "text": "#include \"JS8_Include/commons.h\"" }, { "line": 31, "text": "#include \"JS8_Mode/JS8.h\"" }, { "line": 38, "text": "Q_LOGGING_CATEGORY(decoder_js8, \"decoder.js8\", QtWarningMsg)" }, { "line": 41, "text": "#include \"../JS8_Mode/JS8.cpp\"" }, { "line": 47, "text": "struct DecodeMetrics" }, { "line": 49, "text": "bool decoded = false;" }, { "line": 50, "text": "int decodedCount = 0;" }, { "line": 70, "text": "JS8::encode(0, Costas, message, tones);" }, { "line": 103, "text": "auto const count = std::min(samples.size(), std::size_t(JS8_RX_SAMPLE_SIZE));" }, { "line": 112, "text": "dec_data.params.nsubmodes = 1 << 0; // ModeA only." } ] }, { "path": "tools/whitening_diag.cpp", "exists": true, "category": "diagnostic_harness_reference", "focused_rx_score": 203, "hits": { "decode": 26, "decoder": 11, "sync": 1, "snr": 12, "js8": 19 }, "tx_risk_terms": { "cat": 4 }, "includes": [ "cmath", "cstring", "random", "vector", "iostream", "mutex", "thread", "cstdlib", "QCoreApplication", "QEventLoop", "QLoggingCategory", "QThread", "JS8_Include/commons.h", "JS8_Mode/JS8.h", "../JS8_Mode/JS8.cpp" ], "interesting_symbols": [ { "line": 25, "text": "#include \"JS8_Include/commons.h\"" }, { "line": 26, "text": "#include \"JS8_Mode/JS8.h\"" }, { "line": 33, "text": "Q_LOGGING_CATEGORY(decoder_js8, \"decoder.js8\", QtWarningMsg)" }, { "line": 36, "text": "#include \"../JS8_Mode/JS8.cpp\"" }, { "line": 48, "text": "JS8::encode(0, Costas, message, tones);" }, { "line": 76, "text": "auto const count = std::min(samples.size(), std::size_t(JS8_RX_SAMPLE_SIZE));" }, { "line": 85, "text": "dec_data.params.nsubmodes = 1 << 0; // ModeA only." }, { "line": 89, "text": "dec_data.params.syncStats = false;" }, { "line": 101, "text": "bool decoded = false;" }, { "line": 107, "text": "run_decode(bool disableWhitening)" } ] }, { "path": "JS8_Mode/Modulator.cpp", "exists": true, "category": "rx_core_candidate", "focused_rx_score": 134, "hits": { "sync": 4, "symbol": 6, "js8": 22 }, "tx_risk_terms": { "tx": 9, "transmit": 3, "tune": 1, "send": 6, "cat": 3 }, "includes": [ "Modulator.h", "JS8Submode.h", "JS8_Audio/SoundOutput.h", "JS8_Include/commons.h", "JS8_Main/DriftingDateTime.h", "JS8_UI/mainwindow.h", "QDateTime", "QLoggingCategory", "QtMath", "limits", "numbers", "moc_Modulator.cpp" ], "interesting_symbols": [ { "line": 6, "text": "#include \"JS8Submode.h\"" }, { "line": 7, "text": "#include \"JS8_Audio/SoundOutput.h\"" }, { "line": 8, "text": "#include \"JS8_Include/commons.h\"" }, { "line": 9, "text": "#include \"JS8_Main/DriftingDateTime.h\"" }, { "line": 10, "text": "#include \"JS8_UI/mainwindow.h\"" }, { "line": 21, "text": "Q_DECLARE_LOGGING_CATEGORY(modulator_js8)" }, { "line": 38, "text": "void Modulator::start(double const frequency, int const submode," }, { "line": 45, "text": "qCDebug(modulator_js8)" }, { "line": 48, "text": ": current_state == State::Synchronizing ? \"Synchronizing\"" }, { "line": 57, "text": "m_nsps = JS8::Submode::samplesForOneSymbol(submode);" } ] }, { "path": "JS8_Mode/Detector.cpp", "exists": true, "category": "rx_core_candidate", "focused_rx_score": 93, "hits": { "decode": 1, "decoder": 1, "js8": 10 }, "tx_risk_terms": { "cat": 3 }, "includes": [ "Detector.h", "JS8_Include/commons.h", "JS8_Main/DriftingDateTime.h", "QDateTime", "QLoggingCategory", "QMutexLocker", "QtAlgorithms", "algorithm", "cmath", "moc_Detector.cpp" ], "interesting_symbols": [ { "line": 8, "text": "#include \"JS8_Include/commons.h\"" }, { "line": 9, "text": "#include \"JS8_Main/DriftingDateTime.h\"" }, { "line": 56, "text": "Q_DECLARE_LOGGING_CATEGORY(detector_js8)" }, { "line": 97, "text": "#if JS8_RING_BUFFER" }, { "line": 130, "text": "qCDebug(detector_js8) << \"advancing detector buffer from\" << prevKin << \"to\"" }, { "line": 152, "text": "qCDebug(detector_js8) << \"clearing detector buffer content\";" }, { "line": 187, "text": "qCDebug(detector_js8)" }, { "line": 204, "text": "static_cast(JS8_NTMAX * 12000 - m_samplesPerFFT)) {" }, { "line": 237, "text": "Q_LOGGING_CATEGORY(detector_js8, \"detector.js8\", QtWarningMsg)" } ] }, { "path": "JS8_JSC/JSC_checker.cpp", "exists": true, "category": "rx_core_candidate", "focused_rx_score": 89, "hits": { "soft": 2, "js8": 9 }, "tx_risk_terms": { "rig": 1, "cat": 3 }, "includes": [ "JSC_checker.h", "JS8_Main/Varicode.h", "JSC.h", "QLoggingCategory", "QTextBlock", "QTextCursor", "QTextDocument", "QTextEdit", "QTextLayout" ], "interesting_symbols": [ { "line": 24, "text": "#include \"JS8_Main/Varicode.h\"" }, { "line": 34, "text": "Q_DECLARE_LOGGING_CATEGORY(jsc_checker_js8)" }, { "line": 162, "text": "correct = Varicode::isValidCallsign(word, nullptr);" }, { "line": 310, "text": "Q_LOGGING_CATEGORY(jsc_checker_js8, \"jsc_checker.js8\", QtWarningMsg)" } ] }, { "path": "JS8_Mode/FrequencyTracker.h", "exists": true, "category": "rx_core_candidate", "focused_rx_score": 81, "hits": { "decode": 2, "symbol": 1, "js8": 4 }, "tx_risk_terms": {}, "includes": [ "complex", "numbers" ], "interesting_symbols": [ { "line": 6, "text": "namespace js8 {" }, { "line": 75, "text": "} // namespace js8" } ] }, { "path": "JS8_JSC/JSC.cpp", "exists": true, "category": "rx_core_candidate", "focused_rx_score": 71, "hits": { "soft": 2, "js8": 2 }, "tx_risk_terms": { "rig": 1 }, "includes": [ "JSC.h", "JS8_Main/Varicode.h", "QCache", "QDebug", "cmath" ], "interesting_symbols": [ { "line": 24, "text": "#include \"JS8_Main/Varicode.h\"" }, { "line": 48, "text": "out.prepend(Varicode::intToBits(v, bytesize + 1));" }, { "line": 53, "text": "out.prepend(Varicode::intToBits((x % c) + s, bytesize));" }, { "line": 154, "text": "quint64 byte = Varicode::bitsToInt(b);" } ] }, { "path": "JS8_Mode/FrequencyTracker.cpp", "exists": true, "category": "rx_core_candidate", "focused_rx_score": 69, "hits": { "js8": 3 }, "tx_risk_terms": {}, "includes": [ "FrequencyTracker.h", "algorithm", "cmath" ], "interesting_symbols": [ { "line": 14, "text": "namespace js8 {" }, { "line": 184, "text": "} // namespace js8" } ] }, { "path": "JS8_Main/JS8MessageBox.cpp", "exists": true, "category": "support_or_unknown", "focused_rx_score": 66, "hits": { "js8": 23 }, "tx_risk_terms": { "cat": 3 }, "includes": [ "JS8MessageBox.h", "revision_utils.h", "QCoreApplication", "QDialogButtonBox", "QPushButton" ], "interesting_symbols": [ { "line": 6, "text": "#include \"JS8MessageBox.h\"" }, { "line": 13, "text": "JS8MessageBox::JS8MessageBox(QWidget *parent) : QMessageBox{parent} {" }, { "line": 17, "text": "JS8MessageBox::JS8MessageBox(Icon icon, QString const &text," }, { "line": 24, "text": "void JS8MessageBox::about_message(QWidget *parent, QString const &text) {" }, { "line": 28, "text": "void JS8MessageBox::about_Qt_message(QWidget *parent) {" }, { "line": 34, "text": "show_it(QWidget *parent, JS8MessageBox::Icon icon, QString const &text," }, { "line": 36, "text": "JS8MessageBox::StandardButtons buttons," }, { "line": 37, "text": "JS8MessageBox::StandardButton default_button) {" }, { "line": 38, "text": "JS8MessageBox mb{icon, text, JS8MessageBox::NoButton, parent};" }, { "line": 42, "text": "uint mask = JS8MessageBox::FirstButton;" } ] }, { "path": "JS8_Mode/Modulator.h", "exists": true, "category": "rx_core_candidate", "focused_rx_score": 64, "hits": { "sync": 1, "js8": 1 }, "tx_risk_terms": { "tx": 1, "tune": 1 }, "includes": [ "JS8_Audio/AudioDevice.h", "QAudio", "QPointer" ], "interesting_symbols": [ { "line": 4, "text": "#include \"JS8_Audio/AudioDevice.h\"" }, { "line": 24, "text": "enum class State { Synchronizing, Active, Idle };" }, { "line": 55, "text": "Q_SLOT void start(double audioFrequency, int submode, double tx_delay," } ] }, { "path": "JS8_Mode/Detector.h", "exists": true, "category": "rx_core_candidate", "focused_rx_score": 63, "hits": { "js8": 1 }, "tx_risk_terms": {}, "includes": [ "JS8_Audio/AudioDevice.h", "QMutex", "vendor/Eigen/Dense", "array" ], "interesting_symbols": [ { "line": 4, "text": "#include \"JS8_Audio/AudioDevice.h\"" } ] }, { "path": "JS8_Include/Maidenhead.h", "exists": true, "category": "rx_core_candidate", "focused_rx_score": 63, "hits": { "soft": 1 }, "tx_risk_terms": {}, "includes": [ "QString", "QStringView", "QValidator" ], "interesting_symbols": [] }, { "path": "JS8_Include/sleep.h", "exists": true, "category": "rx_core_candidate", "focused_rx_score": 60, "hits": {}, "tx_risk_terms": {}, "includes": [ "qthread.h" ], "interesting_symbols": [] }, { "path": "JS8_Include/pimpl_h.h", "exists": true, "category": "rx_core_candidate", "focused_rx_score": 60, "hits": {}, "tx_risk_terms": {}, "includes": [ "memory" ], "interesting_symbols": [] }, { "path": "JS8_Include/pimpl_impl.h", "exists": true, "category": "rx_core_candidate", "focused_rx_score": 60, "hits": {}, "tx_risk_terms": {}, "includes": [ "utility" ], "interesting_symbols": [] }, { "path": "JS8_Include/EventFilter.h", "exists": true, "category": "rx_core_candidate", "focused_rx_score": 60, "hits": {}, "tx_risk_terms": {}, "includes": [ "QEvent", "QKeyEvent", "QMouseEvent", "QObject", "functional" ], "interesting_symbols": [] }, { "path": "JS8_Include/SettingsGroup.h", "exists": true, "category": "rx_core_candidate", "focused_rx_score": 60, "hits": {}, "tx_risk_terms": {}, "includes": [ "QSettings", "QString" ], "interesting_symbols": [] }, { "path": "JS8_Include/eclipse.txt", "exists": true, "category": "rx_core_candidate", "focused_rx_score": 60, "hits": {}, "tx_risk_terms": {}, "includes": [], "interesting_symbols": [] }, { "path": "JS8_JSC/JSC_checker.h", "exists": true, "category": "rx_core_candidate", "focused_rx_score": 59, "hits": {}, "tx_risk_terms": { "rig": 1 }, "includes": [ "QObject" ], "interesting_symbols": [] }, { "path": "JS8_JSC/JSC.h", "exists": true, "category": "rx_core_candidate", "focused_rx_score": 59, "hits": {}, "tx_risk_terms": { "rig": 1 }, "includes": [ "QList", "QMap", "QPair", "QStringList", "QTextStream", "QVector" ], "interesting_symbols": [] }, { "path": "JS8_Main/APRSISClient.cpp", "exists": true, "category": "support_or_unknown", "focused_rx_score": 51, "hits": { "sync": 1, "js8": 21 }, "tx_risk_terms": { "send": 3, "rig": 1, "cat": 11 }, "includes": [ "APRSISClient.h", "DriftingDateTime.h", "Varicode.h", "QLoggingCategory", "QRandomGenerator", "cmath" ], "interesting_symbols": [ { "line": 7, "text": "#include \"Varicode.h\"" }, { "line": 14, "text": "Q_DECLARE_LOGGING_CATEGORY(aprsisclient_js8)" }, { "line": 105, "text": "loginFrame = loginFrame.arg(\"JS8Call\");" }, { "line": 319, "text": "qCDebug(aprsisclient_js8)" }, { "line": 354, "text": "auto spotFrame = QString(\"%1>APJ8CL,qAS,%2:=%3/%4G#JS8 %5\\n\");" }, { "line": 427, "text": "qCDebug(aprsisclient_js8)" }, { "line": 446, "text": "qCDebug(aprsisclient_js8)" }, { "line": 468, "text": "qCDebug(aprsisclient_js8)" }, { "line": 478, "text": "qCDebug(aprsisclient_js8)" }, { "line": 486, "text": "qCDebug(aprsisclient_js8)" } ] }, { "path": "JS8_Main/main.cpp", "exists": true, "category": "support_or_unknown", "focused_rx_score": 51, "hits": { "js8": 29 }, "tx_risk_terms": { "rig": 9, "cat": 27 }, "includes": [ "DriftingDateTime.h", "FrequencyList.h", "JS8MessageBox.h", "JS8_Include/SettingsGroup.h", "JS8_Include/commons.h", "JS8_UI/mainwindow.h", "JS8_UI/styles.h", "MetaDataRegistry.h", "MultiSettings.h", "Radio.h", "TraceFile.h", "revision_utils.h", "QApplication", "QDateTime", "QDir", "QLibraryInfo", "QLockFile", "QLoggingCategory", "QObject", "QRegularExpression", "QSettings", "QStack", "QStandardPaths", "QStringList", "QSysInfo", "fftw3.h", "locale.h", "exception", "iostream", "stdexcept", "string", "QCommandLineOption", "QCommandLineParser" ], "interesting_symbols": [ { "line": 8, "text": "#include \"JS8MessageBox.h\"" }, { "line": 9, "text": "#include \"JS8_Include/SettingsGroup.h\"" }, { "line": 10, "text": "#include \"JS8_Include/commons.h\"" }, { "line": 11, "text": "#include \"JS8_UI/mainwindow.h\"" }, { "line": 12, "text": "#include \"JS8_UI/styles.h\"" }, { "line": 45, "text": "Q_DECLARE_LOGGING_CATEGORY(main_js8)" }, { "line": 91, "text": "a.setApplicationName(\"JS8Call\");" }, { "line": 183, "text": "switch (JS8MessageBox::query_message(" }, { "line": 188, "text": "JS8MessageBox::Yes | JS8MessageBox::Retry |" }, { "line": 189, "text": "JS8MessageBox::No," } ] }, { "path": "JS8_Include/qpriorityqueue.h", "exists": true, "category": "rx_core_candidate", "focused_rx_score": 45, "hits": { "soft": 1 }, "tx_risk_terms": { "tx": 1, "rig": 17 }, "includes": [ "QtCore/qalgorithms.h", "queue", "vector" ], "interesting_symbols": [] }, { "path": "JS8_Main/FrequencyList.cpp", "exists": true, "category": "support_or_unknown", "focused_rx_score": 42, "hits": { "js8": 15 }, "tx_risk_terms": { "rig": 2, "cat": 1 }, "includes": [ "FrequencyList.h", "JS8_Include/pimpl_impl.h", "JS8_Main/Bands.h", "Radio.h", "QAbstractTableModel", "QByteArray", "QDataStream", "QDebugStateSaver", "QList", "QListIterator", "QMetaType", "QMimeData", "QString", "QStringList", "QVector", "cstdlib", "limits", "utility", "moc_FrequencyList.cpp" ], "interesting_symbols": [ { "line": 7, "text": "#include \"JS8_Include/pimpl_impl.h\"" }, { "line": 8, "text": "#include \"JS8_Main/Bands.h\"" }, { "line": 31, "text": "{1843500, Modes::JS8, IARURegions::ALL, \"\"}, // 3.5 above" }, { "line": 32, "text": "{3578000, Modes::JS8, IARURegions::ALL, \"\"}, // 5 above" }, { "line": 33, "text": "{5363000, Modes::JS8," }, { "line": 35, "text": "{7078000, Modes::JS8, IARURegions::ALL, \"\"}, // 4 above" }, { "line": 36, "text": "{10130000, Modes::JS8, IARURegions::ALL, \"\"}, // 6 below" }, { "line": 37, "text": "{14078000, Modes::JS8, IARURegions::ALL, \"\"}, // 4 above" }, { "line": 38, "text": "{18104000, Modes::JS8, IARURegions::ALL, \"\"}, // 4 above" }, { "line": 39, "text": "{21078000, Modes::JS8, IARURegions::ALL, \"\"}, // 4 above" } ] } ], "next_action": "Run sync-probe and soft-symbols on real JS8 WAVs, then continue with LDPC/FEC. Message unpack remains not implemented in this step." } [webftr-js8-lab] OK [webftr-js8-lab] log file: /decoders/js8_decoder/logs/20260527T100328Z_source-map.log [webftr-js8-lab] manifest: /decoders/js8_decoder/logs/20260527T100328Z_source-map_manifest.json [webftr-js8-lab] source-map exit_code=0 ========== FULL-AUDIT STEP 4/5: SOURCE CONSTANTS / RX CORE EXTRACT ========== [webftr-js8-lab] command=source-constants [webftr-js8-lab] root=/decoders/js8_decoder [webftr-js8-lab] log=/decoders/js8_decoder/logs/20260527T100332Z_source-constants.log [webftr-js8-lab] manifest=/decoders/js8_decoder/logs/20260527T100332Z_source-constants_manifest.json [webftr-js8-lab] utc=20260527T100332Z [webftr-js8-lab] rx-only guard: no TX / no PTT / no Tune / no Send [webftr-js8-lab] source constants source: /decoders/js8_decoder/runtime/src/JS8Call-improved [webftr-js8-lab] JSON output: /decoders/js8_decoder/logs/20260527T100332Z_source_constants_output.json [webftr-js8-lab] JSON timeout guard: 180s { "ok": true, "tool": "webftr-js8-source-constants", "tool_version": "step49-source-constants-rx-core-extract-audit", "source_dir": "/decoders/js8_decoder/runtime/src/JS8Call-improved", "rx_only_guard": { "tx": false, "ptt": false, "tune": false, "send": false, "js8call_runtime_control": false }, "missing_expected_files": [], "defines": { "JS8_NSPS": 6192, "JS8_NSMAX": 6827, "JS8_NTMAX": 60, "JS8_RX_SAMPLE_RATE": 12000, "JS8_RX_SAMPLE_SIZE": "(JS8_NTMAX * JS8_RX_SAMPLE_RATE)", "JS8_RING_BUFFER": 1, "JS8_DECODE_THREAD": 1, "JS8_ALLOW_EXTENDED": 1, "JS8_AUTO_SYNC": 1, "JS8_NUM_SYMBOLS": 79, "JS8_ENABLE_JS8A": 1, "JS8_ENABLE_JS8B": 1, "JS8_ENABLE_JS8C": 1, "JS8_ENABLE_JS8E": 1, "JS8_ENABLE_JS8I": 1 }, "derived_parameters": { "normal_tone_spacing_hz": 1.937984496124031, "normal_symbol_seconds": 0.516, "rx_sample_size_expected": 720000, "symbols_audio_seconds": 40.764 }, "focused_files": [ { "path": "JS8_Include/commons.h", "exists": true, "bytes": 3525, "lines": 107, "hits": { "decode": 18, "symbol": 6, "sync": 4, "ldpc": 0, "message": 0, "crc": 0, "unpack": 0 }, "interesting_lines": [ { "line": 11, "text": "#define JS8_NSPS 6192" }, { "line": 12, "text": "#define JS8_NSMAX 6827" }, { "line": 13, "text": "#define JS8_NTMAX 60" }, { "line": 14, "text": "#define JS8_RX_SAMPLE_RATE 12000" }, { "line": 15, "text": "#define JS8_RX_SAMPLE_SIZE (JS8_NTMAX * JS8_RX_SAMPLE_RATE)" }, { "line": 20, "text": "#define JS8_AUTO_SYNC 1 // enable the experimental auto sync feature" }, { "line": 22, "text": "#define JS8_NUM_SYMBOLS 79" }, { "line": 59, "text": "bool syncStats; // only compute sync candidates" }, { "line": 78, "text": "float savg[JS8_NSMAX];" }, { "line": 79, "text": "float slin[JS8_NSMAX];" }, { "line": 102, "text": "result.second = nutc % 100;" } ] }, { "path": "JS8_Mode/JS8.cpp", "exists": true, "bytes": 113531, "lines": 2914, "hits": { "decode": 142, "symbol": 37, "sync": 120, "ldpc": 23, "message": 41, "crc": 23, "unpack": 0 }, "interesting_lines": [ { "line": 11, "text": "#include \"JS8_Mode/whitening_processor.h\"" }, { "line": 12, "text": "#include \"ldpc_feedback.h\"" }, { "line": 13, "text": "#include \"soft_combiner.h\"" }, { "line": 21, "text": "#include " }, { "line": 69, "text": "// syncjs8(); this version does. It wasn't typically off by much, but" }, { "line": 164, "text": "// parameter (KK=87) !Information bits (75 + CRC12)" }, { "line": 165, "text": "// parameter (ND=58) !Data symbols" }, { "line": 166, "text": "// parameter (NS=21) !Sync symbols (3 @ Costas 7x7)" }, { "line": 168, "text": "// parameter (ASYNCMIN=1.5) !Minimum Sync" }, { "line": 170, "text": "// +/- 2.5 Hz) parameter (NMAXCAND=300) !Maximum number of" }, { "line": 174, "text": "// KK\t87\tNumber of information bits (75 message bits + 12 CRC bits)." }, { "line": 176, "text": "// NS\t21\tNumber of synchronization symbols (3 Costas arrays of size 7)." }, { "line": 178, "text": "// ASYNCMIN\t1.5\tMinimum sync value for successful decoding." }, { "line": 185, "text": "constexpr int KK = 87; // Information bits (75 + CRC12)" }, { "line": 186, "text": "constexpr int ND = 58; // Data symbols" }, { "line": 187, "text": "constexpr int NS = 21; // Sync symbols (3 @ Costas 7x7)" }, { "line": 189, "text": "constexpr float ASYNCMIN = 1.5f; // Minimum sync" }, { "line": 191, "text": "constexpr std::size_t NMAXCAND = 300; // Maxiumum number of candidate signals" }, { "line": 204, "text": "// NCOSTAS - Which JS8 Costas Arrays to use" }, { "line": 211, "text": "// input wave NSTEP - Rough time-sync step size NHSYM - Number of symbol" }, { "line": 220, "text": "inline static constexpr auto NCOSTAS = JS8::Costas::Type::ORIGINAL;" }, { "line": 231, "text": "inline static constexpr int NMAX = NTXDUR * JS8_RX_SAMPLE_RATE;" }, { "line": 250, "text": "inline static constexpr auto NCOSTAS = JS8::Costas::Type::MODIFIED;" }, { "line": 261, "text": "inline static constexpr int NMAX = NTXDUR * JS8_RX_SAMPLE_RATE;" }, { "line": 280, "text": "inline static constexpr auto NCOSTAS = JS8::Costas::Type::MODIFIED;" }, { "line": 291, "text": "inline static constexpr int NMAX = NTXDUR * JS8_RX_SAMPLE_RATE;" }, { "line": 314, "text": "inline static constexpr auto NCOSTAS = JS8::Costas::Type::MODIFIED;" }, { "line": 326, "text": "inline static constexpr int NMAX = NTXDUR * JS8_RX_SAMPLE_RATE;" }, { "line": 345, "text": "inline static constexpr auto NCOSTAS = JS8::Costas::Type::MODIFIED;" }, { "line": 356, "text": "inline static constexpr int NMAX = NTXDUR * JS8_RX_SAMPLE_RATE;" }, { "line": 532, "text": "// Encapsulates the first-order search results provided by syncjs8()." }, { "line": 534, "text": "struct Sync {" }, { "line": 537, "text": "float sync;" }, { "line": 541, "text": "Sync(float const freq, float const step, float const sync)" }, { "line": 542, "text": ": freq(freq), step(step), sync(sync) {}" }, { "line": 552, "text": "struct Sync {};" }, { "line": 555, "text": "// Container indexing Sync objects in useful ways, used by syncjs8()." }, { "line": 558, "text": "using SyncIndex = MI::multi_index_container<" }, { "line": 559, "text": "Sync, MI::indexed_by<" }, { "line": 560, "text": "MI::ordered_non_unique, MI::key<&Sync::freq>>," }, { "line": 561, "text": "MI::ranked_non_unique, MI::key<&Sync::sync>>," }, { "line": 562, "text": "MI::ordered_non_unique, MI::key<&Sync::sync>," }, { "line": 595, "text": "constexpr int BP_MAX_ITERATIONS = 30; // Max iterations in BP decoder" }, { "line": 740, "text": "std::array synd = {}; // Syndrome for checks" }, { "line": 792, "text": "int nd = ncheck - nclast;" }, { "line": 891, "text": "template std::uint16_t CRC12(T const &range) {" }, { "line": 892, "text": "return boost::augmented_crc<12, 0xc06>(range.data(), range.size()) ^ 42;" }, { "line": 895, "text": "bool checkCRC12(std::array const &decoded) {" }, { "line": 903, "text": "// Extract the received CRC-12." }, { "line": 905, "text": "uint16_t crc = (static_cast(bits[9] & 0x1F) << 7) |" }, { "line": 908, "text": "// Clear bits that correspond to the CRC in the last bytes." }, { "line": 913, "text": "// Compute CRC and indicate if we have a match." }, { "line": 915, "text": "return crc == CRC12(bits);" }, { "line": 921, "text": "// Ensure received CRC matches computed CRC." }, { "line": 923, "text": "if (checkCRC12(decoded)) {" }, { "line": 950, "text": "// Background here is that this is a low-density parity check code (LDPC)," }, { "line": 959, "text": "// The data used was harvested from the original 'ldpc_174_87_params.f90'," }, { "line": 1069, "text": "csyncs;" }, { "line": 1080, "text": "SyncIndex sync;" }, { "line": 1081, "text": "js8::SoftCombiner m_softCombiner;" }, { "line": 1085, "text": "bool m_enableLdpcFeedback = js8::ldpcFeedbackEnabled();" }, { "line": 1086, "text": "int m_maxLdpcPasses = js8::ldpcFeedbackMaxPasses();" }, { "line": 1090, "text": "static constexpr auto Costas = JS8::Costas::array(Mode::NCOSTAS);" }, { "line": 1141, "text": "std::optional js8dec(bool const syncStats, bool const lsubtract," }, { "line": 1170, "text": "// Search for the best synchronization offset." }, { "line": 1173, "text": "float const sync = syncjs8d(idt, 0.0f);" }, { "line": 1175, "text": "if (sync > smax) {" }, { "line": 1176, "text": "smax = sync;" }, { "line": 1185, "text": "// Fine frequency synchronization" }, { "line": 1192, "text": "float const sync = syncjs8d(i0, delf);" }, { "line": 1194, "text": "if (sync > smax) {" }, { "line": 1195, "text": "smax = sync;" }, { "line": 1218, "text": "float const sync = syncjs8d(i0, 0.0f);" }, { "line": 1361, "text": "int costasBlock = 0;" }, { "line": 1362, "text": "int costasColumn = k;" }, { "line": 1365, "text": "costasBlock = 1;" }, { "line": 1366, "text": "costasColumn = k - 36;" }, { "line": 1368, "text": "costasBlock = 2;" }, { "line": 1369, "text": "costasColumn = k - 72;" }, { "line": 1372, "text": "int const expectedTone = Costas[costasBlock][costasColumn];" }, { "line": 1404, "text": "// Sync quality check using Costas tone patterns." }, { "line": 1406, "text": "int nsync = 0;" }, { "line": 1408, "text": "for (std::size_t costas = 0; costas < Costas.size(); ++costas) {" }, { "line": 1409, "text": "auto const offset = costas * 36;" }, { "line": 1423, "text": "// Check if the max row matches the Costas pattern." }, { "line": 1425, "text": "if (Costas[costas][column] == max_row)" }, { "line": 1426, "text": "++nsync;" }, { "line": 1430, "text": "// If the sync quality isn't at least 7, this one's a loser." }, { "line": 1432, "text": "if (nsync <= 6) {" }, { "line": 1433, "text": "logTracker(\"sync_fail\");" }, { "line": 1437, "text": "if (syncStats)" }, { "line": 1439, "text": "JS8::Event::SyncState{JS8::Event::SyncState::Type::CANDIDATE," }, { "line": 1443, "text": "{.candidate = nsync}});" }, { "line": 1447, "text": "// Fill s1 from s2, excluding the Costas arrays." }, { "line": 1473, "text": "auto const whitening = js8::WhiteningProcessor::process(" }, { "line": 1477, "text": "auto llr0 = whitening.llr0;" }, { "line": 1478, "text": "auto llr1 = whitening.llr1;" }, { "line": 1480, "text": "// Only apply a second erasure threshold pass if whitening didn't" }, { "line": 1482, "text": "if (!whitening.erasureApplied) {" }, { "line": 1526, "text": "m_softCombiner.flush(ttl);" }, { "line": 1529, "text": "m_softCombiner.makeKey(Mode::NSUBMODE, f1, xdt, llr0, llr1);" }, { "line": 1530, "text": "auto combined = m_softCombiner.combine(key, llr0, llr1, ttl);" }, { "line": 1538, "text": "int totalLdpcPasses = 0;" }, { "line": 1555, "text": "!(sync < 2.0f && nharderrors > 35) &&" }, { "line": 1558, "text": "if (checkCRC12(decoded)) {" }, { "line": 1559, "text": "if (syncStats)" }, { "line": 1560, "text": "emitEvent(JS8::Event::SyncState{" }, { "line": 1561, "text": "JS8::Event::SyncState::Type::DECODED," }, { "line": 1565, "text": "{.decoded = sync}});" }, { "line": 1574, "text": "JS8::encode(i3bit, Costas, message.data(), itone.data());" }, { "line": 1591, "text": "m_softCombiner.markDecoded(combined.key);" }, { "line": 1604, "text": "for (int ipass = 1; ipass <= 4 && totalLdpcPasses < m_maxLdpcPasses;" }, { "line": 1618, "text": "++totalLdpcPasses;" }, { "line": 1621, "text": "++totalLdpcPasses;" }, { "line": 1625, "text": "if (m_enableLdpcFeedback && totalLdpcPasses < m_maxLdpcPasses) {" }, { "line": 1629, "text": "js8::refineLlrsWithLdpcFeedback(" }, { "line": 1635, "text": "<< \"LDPC feedback pass\"" }, { "line": 1645, "text": "++totalLdpcPasses;" }, { "line": 1649, "text": "<< \"LDPC feedback succeeded on second pass\"" }, { "line": 1652, "text": "<< feedbackUncertain << \"passes\" << totalLdpcPasses;" } ] }, { "path": "JS8_Mode/JS8.h", "exists": true, "bytes": 2284, "lines": 109, "hits": { "decode": 13, "symbol": 0, "sync": 5, "ldpc": 0, "message": 1, "crc": 0, "unpack": 0 }, "interesting_lines": [ { "line": 15, "text": "namespace Costas {" }, { "line": 16, "text": "// JS8 originally used the same Costas arrays as FT8 did, and so" }, { "line": 25, "text": "constexpr auto COSTAS =" }, { "line": 33, "text": "return [COSTAS](Type type) -> Array const & {" }, { "line": 34, "text": "return COSTAS[static_cast>(type)];" }, { "line": 37, "text": "} // namespace Costas" }, { "line": 39, "text": "void encode(int type, Costas::Array const &costas, const char *message," }, { "line": 47, "text": "struct SyncStart {" }, { "line": 52, "text": "struct SyncState {" }, { "line": 60, "text": "} sync;" }, { "line": 79, "text": "std::variant;" } ] }, { "path": "JS8_Mode/JS8Submode.cpp", "exists": true, "bytes": 13093, "lines": 400, "hits": { "decode": 6, "symbol": 32, "sync": 0, "ldpc": 0, "message": 0, "crc": 0, "unpack": 0 }, "interesting_lines": [ { "line": 7, "text": "#include \"JS8_Main/Varicode.h\"" }, { "line": 55, "text": "// JS8_NUM_SYMBOLS and RX_SAMPLE_RATE definitions, and therefore can" }, { "line": 59, "text": "unsigned int const samplesForOneSymbol," }, { "line": 60, "text": "unsigned int const startDelayMS, unsigned int const period," }, { "line": 61, "text": "Costas::Type const costas, int const rxSNRThreshold," }, { "line": 63, "text": ": m_name(name), m_samplesForOneSymbol(samplesForOneSymbol)," }, { "line": 64, "text": "m_startDelayMS(startDelayMS), m_period(period), m_costas(costas)," }, { "line": 66, "text": "m_samplesForSymbols(JS8_NUM_SYMBOLS * samplesForOneSymbol)," }, { "line": 67, "text": "m_bandwidth(8 * JS8_RX_SAMPLE_RATE / samplesForOneSymbol)," }, { "line": 68, "text": "m_samplesPerPeriod(JS8_RX_SAMPLE_RATE * period)," }, { "line": 69, "text": "m_toneSpacing(JS8_RX_SAMPLE_RATE / (double)samplesForOneSymbol)," }, { "line": 72, "text": "(0.5 + startDelayMS / 1000.0) * JS8_RX_SAMPLE_RATE))," }, { "line": 73, "text": "m_dataDuration(m_samplesForSymbols / (double)JS8_RX_SAMPLE_RATE)," }, { "line": 74, "text": "m_txDuration(m_dataDuration + startDelayMS / 1000.0) {}" }, { "line": 79, "text": "constexpr unsigned int samplesForOneSymbol() const {" }, { "line": 80, "text": "return m_samplesForOneSymbol;" }, { "line": 82, "text": "constexpr unsigned int startDelayMS() const { return m_startDelayMS; }" }, { "line": 84, "text": "constexpr Costas::Type costas() const { return m_costas; }" }, { "line": 89, "text": "constexpr int samplesPerPeriod() const { return m_samplesPerPeriod; }" }, { "line": 92, "text": "constexpr double toneSpacing() const { return m_toneSpacing; }" }, { "line": 99, "text": "unsigned int m_samplesForOneSymbol;" }, { "line": 100, "text": "unsigned int m_startDelayMS;" }, { "line": 102, "text": "Costas::Type m_costas;" }, { "line": 107, "text": "int m_samplesPerPeriod;" }, { "line": 108, "text": "double m_toneSpacing;" }, { "line": 114, "text": "// Data for known submodes. Normal mode uses the old Costas Array" }, { "line": 121, "text": "Costas::Type::ORIGINAL," }, { "line": 128, "text": "Costas::Type::MODIFIED," }, { "line": 136, "text": "Costas::Type::MODIFIED," }, { "line": 144, "text": "Costas::Type::MODIFIED," }, { "line": 151, "text": "Costas::Type::MODIFIED," }, { "line": 165, "text": "// Note that the Varicode::SubModeType enum is not dense, so we can't" }, { "line": 170, "text": "case Varicode::JS8CallNormal:" }, { "line": 172, "text": "case Varicode::JS8CallFast:" }, { "line": 174, "text": "case Varicode::JS8CallTurbo:" }, { "line": 176, "text": "case Varicode::JS8CallSlow:" }, { "line": 178, "text": "case Varicode::JS8CallUltra:" }, { "line": 190, "text": "<< \"\\nname \" << data.name() << \"\\nsamplesForOneSymbol\"" }, { "line": 191, "text": "<< data.samplesForOneSymbol() << \"\\nstartDelayMS \"" }, { "line": 192, "text": "<< data.startDelayMS() << \"\\nperiod \" << data.period()" }, { "line": 193, "text": "<< \"\\ncostas \"" }, { "line": 194, "text": "<< (data.costas() == Costas::Type::MODIFIED" }, { "line": 196, "text": ": (data.costas() == Costas::Type::ORIGINAL ? \"ORIGINAL\"" }, { "line": 202, "text": "<< \"\\nsamplesPerPeriod \" << data.samplesPerPeriod()" }, { "line": 205, "text": "<< \"\\ntoneSpacing \" << data.toneSpacing()" }, { "line": 253, "text": "* @brief Get the Costas array type of the submode" }, { "line": 256, "text": "* @return Costas::Type" }, { "line": 258, "text": "Costas::Type costas(int const submode) { return data(submode).costas(); }" }, { "line": 265, "text": "unsigned int samplesPerPeriod(int const submode) {" }, { "line": 266, "text": "return data(submode).samplesPerPeriod();" }, { "line": 313, "text": "unsigned int startDelayMS(int const submode) {" }, { "line": 314, "text": "return data(submode).startDelayMS();" }, { "line": 322, "text": "unsigned int samplesForOneSymbol(int const submode) {" }, { "line": 323, "text": "return data(submode).samplesForOneSymbol();" }, { "line": 331, "text": "double toneSpacing(int const submode) { return data(submode).toneSpacing(); }" }, { "line": 359, "text": "int const cycleFrames = samplesPerPeriod(submode);" } ] }, { "path": "JS8_Mode/JS8Submode.h", "exists": true, "bytes": 2884, "lines": 103, "hits": { "decode": 2, "symbol": 10, "sync": 0, "ldpc": 0, "message": 0, "crc": 0, "unpack": 0 }, "interesting_lines": [ { "line": 25, "text": "// Something seemingly harmless such as 3 - samplesForOneSymbol" }, { "line": 36, "text": "Costas::Type costas(int);" }, { "line": 48, "text": "unsigned int samplesForOneSymbol(int);" }, { "line": 54, "text": "* As there are JS8_NUM_SYMBOLS = 79 symbols in a period," }, { "line": 69, "text": "unsigned int samplesPerPeriod(int);" }, { "line": 75, "text": "unsigned int startDelayMS(int);" }, { "line": 76, "text": "double toneSpacing(int);" }, { "line": 88, "text": "* This is samplesForSymbols / 12000 + startDelayMS / 1000" } ] }, { "path": "JS8_Mode/DecodedText.cpp", "exists": true, "bytes": 10173, "lines": 345, "hits": { "decode": 42, "symbol": 0, "sync": 0, "ldpc": 0, "message": 32, "crc": 0, "unpack": 22 }, "interesting_lines": [ { "line": 8, "text": "#include " }, { "line": 31, "text": "// here, but arguably it should be part of JS8::Submode or Varicode." }, { "line": 35, "text": "case Varicode::SubmodeType::JS8CallNormal:" }, { "line": 37, "text": "case Varicode::SubmodeType::JS8CallFast:" }, { "line": 39, "text": "case Varicode::SubmodeType::JS8CallTurbo:" }, { "line": 41, "text": "case Varicode::SubmodeType::JS8CallSlow:" }, { "line": 43, "text": "case Varicode::SubmodeType::JS8CallUltra:" }, { "line": 66, "text": "// Attempts to unpack, using the unpack strategies defined" }, { "line": 67, "text": "// in the order of the unpack strategies array, until one" }, { "line": 86, "text": ": frameType_(Varicode::FrameUnknown), frame_(frame), isAlt_(false)," }, { "line": 95, "text": "for (auto unpack : unpackStrategies) {" }, { "line": 96, "text": "if ((this->*unpack)(m))" }, { "line": 103, "text": "* @brief Try to unpack fast data message (private)" }, { "line": 109, "text": "bool DecodedText::tryUnpackFastData(QString const &m) {" }, { "line": 110, "text": "if ((bits_ & Varicode::JS8CallData) != Varicode::JS8CallData)" }, { "line": 113, "text": "if (auto const data = Varicode::unpackFastDataMessage(m); data.isEmpty()) {" }, { "line": 117, "text": "frameType_ = Varicode::FrameData;" }, { "line": 125, "text": "* @brief Try to unpack data message (private)" }, { "line": 131, "text": "bool DecodedText::tryUnpackData(QString const &m) {" }, { "line": 132, "text": "if ((bits_ & Varicode::JS8CallData) == Varicode::JS8CallData)" }, { "line": 135, "text": "if (auto const data = Varicode::unpackDataMessage(m); data.isEmpty()) {" }, { "line": 139, "text": "frameType_ = Varicode::FrameData;" }, { "line": 147, "text": "* @brief Try to unpack heartbeat message (private)" }, { "line": 153, "text": "bool DecodedText::tryUnpackHeartbeat(QString const &m) {" }, { "line": 154, "text": "if ((bits_ & Varicode::JS8CallData) == Varicode::JS8CallData)" }, { "line": 158, "text": "quint8 type = Varicode::FrameUnknown;" }, { "line": 161, "text": "Varicode::unpackHeartbeatMessage(m, &type, &isAlt, &bits3);" }, { "line": 179, "text": "message_ += \"@ALLCALL \" % Varicode::cqString(bits3);" }, { "line": 181, "text": "auto const sbits3 = Varicode::hbString(bits3);" }, { "line": 192, "text": "* @brief Try to unpack compound message (private)" }, { "line": 198, "text": "bool DecodedText::tryUnpackCompound(QString const &m) {" }, { "line": 199, "text": "quint8 type = Varicode::FrameUnknown;" }, { "line": 201, "text": "auto const parts = Varicode::unpackCompoundMessage(m, &type, &bits3);" }, { "line": 204, "text": "(bits_ & Varicode::JS8CallData) == Varicode::JS8CallData)" }, { "line": 211, "text": "if (type == Varicode::FrameCompound) {" }, { "line": 213, "text": "} else if (type == Varicode::FrameCompoundDirected) {" }, { "line": 226, "text": "* @brief Try to unpack directed message (private)" }, { "line": 232, "text": "bool DecodedText::tryUnpackDirected(QString const &m) {" }, { "line": 233, "text": "if ((bits_ & Varicode::JS8CallData) == Varicode::JS8CallData)" }, { "line": 236, "text": "quint8 type = Varicode::FrameUnknown;" }, { "line": 237, "text": "QStringList const parts = Varicode::unpackDirectedMessage(m, &type);" }, { "line": 282, "text": "// of this class to unpack, and as such this probably doesn't belong here, but" } ] }, { "path": "JS8_Mode/DecodedText.h", "exists": true, "bytes": 2704, "lines": 91, "hits": { "decode": 15, "symbol": 0, "sync": 0, "ldpc": 0, "message": 6, "crc": 0, "unpack": 12 }, "interesting_lines": [ { "line": 50, "text": "// Unpacking strategies, attempted in order until one of them" }, { "line": 53, "text": "bool tryUnpackFastData(QString const &);" }, { "line": 54, "text": "bool tryUnpackData(QString const &);" }, { "line": 55, "text": "bool tryUnpackHeartbeat(QString const &);" }, { "line": 56, "text": "bool tryUnpackCompound(QString const &);" }, { "line": 57, "text": "bool tryUnpackDirected(QString const &);" }, { "line": 59, "text": "static constexpr std::array unpackStrategies = {" }, { "line": 60, "text": "&DecodedText::tryUnpackFastData, &DecodedText::tryUnpackData," }, { "line": 61, "text": "&DecodedText::tryUnpackHeartbeat, &DecodedText::tryUnpackCompound," }, { "line": 62, "text": "&DecodedText::tryUnpackDirected};" } ] }, { "path": "JS8_Main/Varicode.cpp", "exists": true, "bytes": 72661, "lines": 2372, "hits": { "decode": 8, "symbol": 0, "sync": 0, "ldpc": 0, "message": 67, "crc": 26, "unpack": 76 }, "interesting_lines": [ { "line": 2, "text": "* @file Varicode.cpp" }, { "line": 8, "text": "#include \"Varicode.h\"" }, { "line": 16, "text": "#include " }, { "line": 21, "text": "#define CRCPP_INCLUDE_ESOTERIC_CRC_DEFINITIONS" }, { "line": 22, "text": "#define CRCPP_USE_CPP11" }, { "line": 24, "text": "Q_DECLARE_LOGGING_CATEGORY(varicode_js8)" }, { "line": 133, "text": "// commands that are checksummed and their crc size" }, { "line": 359, "text": "QString Varicode::extendedChars() {" }, { "line": 372, "text": "QString Varicode::escape(const QString &text) {" }, { "line": 394, "text": "QString Varicode::unescape(const QString &text) {" }, { "line": 413, "text": "QString Varicode::rstrip(const QString &str) {" }, { "line": 424, "text": "QString Varicode::lstrip(const QString &str) {" }, { "line": 436, "text": "* VARICODE" }, { "line": 438, "text": "QMap Varicode::defaultHuffTable() { return hufftable; }" }, { "line": 440, "text": "QString Varicode::cqString(int number) {" }, { "line": 447, "text": "QString Varicode::hbString(int number) {" }, { "line": 454, "text": "bool Varicode::startsWithCQ(QString text) {" }, { "line": 463, "text": "bool Varicode::startsWithHB(QString text) {" }, { "line": 472, "text": "QString Varicode::formatSNR(int snr) {" }, { "line": 482, "text": "QString Varicode::checksum16(QString const &input) {" }, { "line": 484, "text": "auto crc = CRC::Calculate(fromBytes.data(), fromBytes.length()," }, { "line": 485, "text": "CRC::CRC_16_KERMIT());" }, { "line": 486, "text": "auto checksum = Varicode::pack16bits(crc);" }, { "line": 493, "text": "bool Varicode::checksum16Valid(QString const &checksum, QString const &input) {" }, { "line": 495, "text": "auto crc = CRC::Calculate(fromBytes.data(), fromBytes.length()," }, { "line": 496, "text": "CRC::CRC_16_KERMIT());" }, { "line": 497, "text": "return Varicode::pack16bits(crc) == checksum;" }, { "line": 500, "text": "QString Varicode::checksum32(QString const &input) {" }, { "line": 502, "text": "auto crc = CRC::Calculate(fromBytes.data(), fromBytes.length()," }, { "line": 503, "text": "CRC::CRC_32_BZIP2());" }, { "line": 504, "text": "auto checksum = Varicode::pack32bits(crc);" }, { "line": 511, "text": "bool Varicode::checksum32Valid(QString const &checksum, QString const &input) {" }, { "line": 513, "text": "auto crc = CRC::Calculate(fromBytes.data(), fromBytes.length()," }, { "line": 514, "text": "CRC::CRC_32_BZIP2());" }, { "line": 515, "text": "return Varicode::pack32bits(crc) == checksum;" }, { "line": 518, "text": "QStringList Varicode::parseCallsigns(QString const &input) {" }, { "line": 528, "text": "if (!Varicode::isValidCallsign(callsign, nullptr)) {" }, { "line": 540, "text": "QStringList Varicode::parseGrids(const QString &input) {" }, { "line": 559, "text": "Varicode::huffEncode(const QMap &huff, QString const &text) {" }, { "line": 579, "text": "bool found = false;" }, { "line": 582, "text": "out.append({ch.length(), Varicode::strToBits(huff[ch])});" }, { "line": 584, "text": "found = true;" }, { "line": 597, "text": "QString Varicode::huffDecode(QMap const &huff," }, { "line": 601, "text": "QString bits = Varicode::bitsToStr(bitvec);" }, { "line": 605, "text": "bool found = false;" }, { "line": 610, "text": "found = false;" }, { "line": 615, "text": "found = true;" }, { "line": 626, "text": "QSet Varicode::huffValidChars(const QMap &huff) {" }, { "line": 632, "text": "QVector Varicode::bytesToBits(char *bitvec, int n) {" }, { "line": 641, "text": "QVector Varicode::strToBits(QString const &bitvec) {" }, { "line": 649, "text": "QString Varicode::bitsToStr(QVector const &bitvec) {" }, { "line": 657, "text": "QVector Varicode::intToBits(quint64 value, int expected) {" }, { "line": 674, "text": "quint64 Varicode::bitsToInt(QVector const value) {" }, { "line": 682, "text": "quint64 Varicode::bitsToInt(QVector::ConstIterator start, int n) {" }, { "line": 692, "text": "QVector Varicode::bitsListToBits(QList> &list) {" }, { "line": 700, "text": "quint8 Varicode::unpack5bits(QString const &value) {" }, { "line": 705, "text": "QString Varicode::pack5bits(quint8 packed) { return alphabet.at(packed % 32); }" }, { "line": 707, "text": "quint8 Varicode::unpack6bits(QString const &value) {" }, { "line": 712, "text": "QString Varicode::pack6bits(quint8 packed) { return alphabet.at(packed % 41); }" }, { "line": 714, "text": "quint16 Varicode::unpack16bits(QString const &value) {" }, { "line": 719, "text": "int unpacked = (nalphabet * nalphabet) * a + nalphabet * b + c;" }, { "line": 720, "text": "if (unpacked > (1 << 16) - 1) {" }, { "line": 725, "text": "return unpacked & ((1 << 16) - 1);" }, { "line": 729, "text": "QString Varicode::pack16bits(quint16 packed) {" }, { "line": 744, "text": "quint32 Varicode::unpack32bits(QString const &value) {" }, { "line": 745, "text": "return (quint32)(unpack16bits(value.left(3))) << 16 |" }, { "line": 746, "text": "unpack16bits(value.right(3));" }, { "line": 749, "text": "QString Varicode::pack32bits(quint32 packed) {" }, { "line": 755, "text": "quint64 Varicode::unpack64bits(QString const &value) {" }, { "line": 756, "text": "return (quint64)(unpack32bits(value.left(6))) << 32 |" }, { "line": 757, "text": "unpack32bits(value.right(6));" }, { "line": 760, "text": "QString Varicode::pack64bits(quint64 packed) {" }, { "line": 767, "text": "quint64 Varicode::unpack72bits(QString const &text, quint8 *pRem) {" }, { "line": 787, "text": "QString Varicode::pack72bits(quint64 value, quint8 rem) {" }, { "line": 815, "text": "quint32 Varicode::packAlphaNumeric22(QString const &value, bool isFlag) {" }, { "line": 833, "text": "QString Varicode::unpackAlphaNumeric22(quint32 packed, bool *isFlag) {" }, { "line": 868, "text": "quint64 Varicode::packAlphaNumeric50(QString const &value) {" }, { "line": 905, "text": "QString Varicode::unpackAlphaNumeric50(quint64 packed) {" }, { "line": 958, "text": "quint32 Varicode::packCallsign(QString const &value, bool *pPortable) {" }, { "line": 995, "text": "QStringList permutations = {callsign};" }, { "line": 1037, "text": "QString Varicode::unpackCallsign(quint32 value, bool portable) {" }, { "line": 1085, "text": "QString Varicode::deg2grid(float dlong, float dlat) {" }, { "line": 1118, "text": "QPair Varicode::grid2deg(QString const &grid) {" }, { "line": 1138, "text": "longLat.second = dlat;" }, { "line": 1144, "text": "quint16 Varicode::packGrid(QString const &value) {" }, { "line": 1150, "text": "auto pair = Varicode::grid2deg(grid.left(4));" }, { "line": 1157, "text": "QString Varicode::unpackGrid(quint16 value) {" }, { "line": 1165, "text": "return Varicode::deg2grid(dlong, dlat).left(4);" }, { "line": 1169, "text": "quint8 Varicode::packNum(QString const &num, bool *ok) {" }, { "line": 1183, "text": "quint8 Varicode::packCmd(quint8 cmd, quint8 num, bool *pPackedNum) {" }, { "line": 1189, "text": "if (Varicode::isSNRCommand(cmdStr)) {" }, { "line": 1207, "text": "quint8 Varicode::unpackCmd(quint8 value, quint8 *pNum) {" }, { "line": 1217, "text": "// so we zero them out when unpacking so we don't display them even if" }, { "line": 1230, "text": "bool Varicode::isSNRCommand(const QString &cmd) {" }, { "line": 1234, "text": "bool Varicode::isCommandAllowed(const QString &cmd) {" }, { "line": 1239, "text": "bool Varicode::isCommandBuffered(const QString &cmd) {" }, { "line": 1244, "text": "int Varicode::isCommandChecksumed(const QString &cmd) {" }, { "line": 1253, "text": "bool Varicode::isCommandAutoreply(const QString &cmd) {" }, { "line": 1294, "text": "bool Varicode::isValidCallsign(const QString &callsign, bool *pIsCompound) {" }, { "line": 1297, "text": "*pIsCompound = false;" }, { "line": 1304, "text": "*pIsCompound = false;" }, { "line": 1317, "text": "*pIsCompound = isValid;" }, { "line": 1322, "text": "*pIsCompound = false;" }, { "line": 1326, "text": "bool Varicode::isCompoundCallsign(const QString &callsign) {" }, { "line": 1343, "text": "qCDebug(varicode_js8) << \"is valid compound?\" << match.capturedView(0)" }, { "line": 1349, "text": "bool Varicode::isGroupAllowed(const QString &group) {" }, { "line": 1361, "text": "QString Varicode::packHeartbeatMessage(QString const &text," }, { "line": 1391, "text": "packed_extra = Varicode::packGrid(extra);" }, { "line": 1401, "text": "frame = packCompoundFrame(callsign, Varicode::FrameHeartbeat, packed_extra," }, { "line": 1414, "text": "QStringList Varicode::unpackHeartbeatMessage(const QString &text, quint8 *pType," }, { "line": 1416, "text": "quint8 type = Varicode::FrameHeartbeat;" }, { "line": 1420, "text": "QStringList unpacked = unpackCompoundFrame(text, &type, &num, &bits3);" }, { "line": 1421, "text": "if (unpacked.isEmpty() || type != Varicode::FrameHeartbeat) {" }, { "line": 1425, "text": "unpacked.append(Varicode::unpackGrid(num & ((1 << 15) - 1)));" }, { "line": 1434, "text": "return unpacked;" }, { "line": 1440, "text": "QString Varicode::packCompoundMessage(QString const &text, int *n) {" }, { "line": 1443, "text": "qCDebug(varicode_js8) << \"trying to pack compound message\" << text;" }, { "line": 1446, "text": "qCDebug(varicode_js8) << \"no match for compound message\" << text;" }, { "line": 1452, "text": "qCDebug(varicode_js8) << parsedText.capturedTexts();" }, { "line": 1465, "text": "quint8 type = Varicode::FrameCompound;" } ] }, { "path": "JS8_Main/Varicode.h", "exists": true, "bytes": 8286, "lines": 223, "hits": { "decode": 3, "symbol": 0, "sync": 0, "ldpc": 0, "message": 19, "crc": 0, "unpack": 17 }, "interesting_lines": [ { "line": 1, "text": "#ifndef VARICODE_H" }, { "line": 2, "text": "#define VARICODE_H" }, { "line": 14, "text": "class Varicode {" }, { "line": 51, "text": "FrameCompound = 1, // [001]" }, { "line": 76, "text": "// Varicode();" }, { "line": 120, "text": "static quint8 unpack5bits(QString const &value);" }, { "line": 123, "text": "static quint8 unpack6bits(QString const &value);" }, { "line": 126, "text": "static quint16 unpack16bits(QString const &value);" }, { "line": 129, "text": "static quint32 unpack32bits(QString const &value);" }, { "line": 132, "text": "static quint64 unpack64bits(QString const &value);" }, { "line": 135, "text": "static quint64 unpack72bits(QString const &value, quint8 *pRem);" }, { "line": 139, "text": "static QString unpackAlphaNumeric22(quint32 packed, bool *isFlag);" }, { "line": 142, "text": "static QString unpackAlphaNumeric50(quint64 packed);" }, { "line": 145, "text": "static QString unpackCallsign(quint32 value, bool portable);" }, { "line": 150, "text": "static QString unpackGrid(quint16 value);" }, { "line": 155, "text": "static quint8 unpackCmd(quint8 value, quint8 *pNum);" }, { "line": 168, "text": "static QStringList unpackHeartbeatMessage(const QString &text," }, { "line": 173, "text": "static QStringList unpackCompoundMessage(const QString &text, quint8 *pType," }, { "line": 178, "text": "static QStringList unpackCompoundFrame(const QString &text, quint8 *pType," }, { "line": 185, "text": "static QStringList unpackDirectedMessage(QString const &text," }, { "line": 189, "text": "static QString unpackDataMessage(QString const &text);" }, { "line": 192, "text": "static QString unpackFastDataMessage(QString const &text);" }, { "line": 222, "text": "#endif // VARICODE_H" } ] }, { "path": "JS8_Mode/ldpc_feedback.h", "exists": true, "bytes": 3293, "lines": 110, "hits": { "decode": 3, "symbol": 0, "sync": 0, "ldpc": 12, "message": 0, "crc": 0, "unpack": 0 }, "interesting_lines": [ { "line": 18, "text": "* @brief LDPC erasure threshold config and feedback refinement helpers." }, { "line": 21, "text": "* refineLlrsWithLdpcFeedback shrinks/boosts LLRs using the decoded" }, { "line": 22, "text": "* codeword to retry LDPC. Used inside the JS8 decode loop between" }, { "line": 23, "text": "* LDPC passes." }, { "line": 31, "text": "constexpr int LDPC_FEEDBACK_MAX_PASSES_DEFAULT = 8;" }, { "line": 37, "text": "char *end = nullptr;" }, { "line": 53, "text": "inline bool ldpcFeedbackEnabled() {" }, { "line": 55, "text": "int value = qEnvironmentVariableIntValue(\"JS8_LDPC_FEEDBACK\", &ok);" }, { "line": 59, "text": "inline int ldpcFeedbackMaxPasses() {" }, { "line": 61, "text": "int value = qEnvironmentVariableIntValue(\"JS8_LDPC_MAX_PASSES\", &ok);" }, { "line": 64, "text": "return LDPC_FEEDBACK_MAX_PASSES_DEFAULT;" }, { "line": 66, "text": "return std::clamp(value, 1, LDPC_FEEDBACK_MAX_PASSES_DEFAULT);" }, { "line": 70, "text": "void refineLlrsWithLdpcFeedback(std::array const &llrIn," } ] }, { "path": "JS8_Mode/soft_combiner.h", "exists": true, "bytes": 9185, "lines": 295, "hits": { "decode": 8, "symbol": 0, "sync": 0, "ldpc": 0, "message": 0, "crc": 0, "unpack": 0 }, "interesting_lines": [ { "line": 29, "text": "template class SoftCombiner {" }, { "line": 53, "text": "SoftCombiner() : SoftCombiner(defaultEnabled(), true) {}" }, { "line": 55, "text": "explicit SoftCombiner(bool enabled, bool runSelfTest = true)" }, { "line": 59, "text": "<< \"soft-combining disabled (JS8_SOFT_COMBINING=0)\";" }, { "line": 98, "text": "<< \"soft-combining repeats\" << it->repeats << \"mode\" << key.mode" }, { "line": 200, "text": "int value = qEnvironmentVariableIntValue(\"JS8_SOFT_COMBINING\", &ok);" }, { "line": 231, "text": "if (!qEnvironmentVariableIsSet(\"JS8_SOFT_COMBINING_TEST\"))" }, { "line": 234, "text": "SoftCombiner combiner(true, false);" }, { "line": 258, "text": "auto second =" }, { "line": 276, "text": "<< \"soft-combining self-test: A matches\" << matchesA" } ] }, { "path": "JS8_Mode/whitening_processor.h", "exists": true, "bytes": 9129, "lines": 260, "hits": { "decode": 5, "symbol": 20, "sync": 0, "ldpc": 0, "message": 0, "crc": 0, "unpack": 0 }, "interesting_lines": [ { "line": 21, "text": "* Given symbol magnitudes (sans Costas) and winners, produces normalized" }, { "line": 22, "text": "* LLR0/LLR1, optionally applying noise-based whitening and erasure. Fully" }, { "line": 26, "text": "template class WhiteningProcessor {" }, { "line": 31, "text": "bool whiteningApplied;" }, { "line": 145, "text": "bool const disableWhitening =" }, { "line": 146, "text": "std::getenv(\"JS8_DISABLE_WHITENING\") != nullptr;" }, { "line": 147, "text": "bool const whiteningAvailable = toneNoise && symbolNoise &&" }, { "line": 149, "text": "!disableWhitening;" }, { "line": 150, "text": "bool const applyErasureInWhitening =" }, { "line": 151, "text": "whiteningAvailable && erasureThreshold > 0.0f;" }, { "line": 185, "text": "if (whiteningAvailable) {" }, { "line": 191, "text": "auto const applyWhitening = [&](float &value) {" }, { "line": 199, "text": "if (applyErasureInWhitening &&" }, { "line": 208, "text": "applyWhitening(result.llr0[i1]);" }, { "line": 209, "text": "applyWhitening(result.llr0[i2]);" }, { "line": 210, "text": "applyWhitening(result.llr0[i4]);" }, { "line": 211, "text": "applyWhitening(result.llr1[i1]);" }, { "line": 212, "text": "applyWhitening(result.llr1[i2]);" }, { "line": 213, "text": "applyWhitening(result.llr1[i4]);" }, { "line": 240, "text": "if (whiteningAvailable && debug) {" }, { "line": 246, "text": "qCDebug(decoder_js8) << \"LLR whitening applied\"" }, { "line": 251, "text": "result.whiteningApplied = whiteningAvailable;" }, { "line": 252, "text": "result.erasureApplied = applyErasureInWhitening;" } ] } ], "audit_conclusion": { "next_technical_step": "Run a source-aligned NSPS/tone-spacing/timing comparison against the current JS8Lab best candidate before more Message91 repairs.", "candidate_rx_core_files": [ "JS8_Include/commons.h", "JS8_Mode/JS8Submode.cpp", "JS8_Mode/JS8.cpp", "JS8_Mode/ldpc_feedback.h", "JS8_Mode/soft_combiner.h", "JS8_Mode/whitening_processor.h", "JS8_Mode/DecodedText.cpp", "JS8_Main/Varicode.cpp" ], "no_gui_runtime_started": true }, "advisory": [ { "kind": "nsps_alignment", "message": "Source JS8_NSPS differs from older lab 6400 hypothesis; future sweep should test source-aligned NSPS first.", "source_js8_nsps": 6192, "old_lab_hypothesis_nsps": 6400 }, { "kind": "tone_spacing_alignment", "message": "Use source-derived tone spacing before further CRC/repair guessing.", "normal_tone_spacing_hz": 1.937984496124031 } ] } [webftr-js8-lab] OK [webftr-js8-lab] log file: /decoders/js8_decoder/logs/20260527T100332Z_source-constants.log [webftr-js8-lab] manifest: /decoders/js8_decoder/logs/20260527T100332Z_source-constants_manifest.json [webftr-js8-lab] source-constants exit_code=0 ========== FULL-AUDIT STEP 5/5: LOG BUNDLE ========== [webftr-js8-lab] collecting JS8Lab logs from /decoders/js8_decoder/logs [webftr-js8-lab] upload this JS8Lab bundle: /decoders/js8_decoder/logs/js8_decoder_lab_full_audit_20260527T100315Z.zip [webftr-js8-lab] OK [webftr-js8-lab] log file: /decoders/js8_decoder/logs/20260527T100315Z_full-audit.log [webftr-js8-lab] manifest: /decoders/js8_decoder/logs/20260527T100315Z_full-audit_manifest.json