[webftr-js8-lab] command=source-map [webftr-js8-lab] root=/decoders/js8_decoder [webftr-js8-lab] log=/decoders/js8_decoder/logs/20260527T085141Z_source-map.log [webftr-js8-lab] manifest=/decoders/js8_decoder/logs/20260527T085141Z_source-map_manifest.json [webftr-js8-lab] utc=20260527T085141Z [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/20260527T085141Z_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": "step48-source-decoder-path-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/20260527T085141Z_source-map.log [webftr-js8-lab] manifest: /decoders/js8_decoder/logs/20260527T085141Z_source-map_manifest.json