From 63428609b786962a3d857c89b40fd87d3db051a3 Mon Sep 17 00:00:00 2001 From: Skorpionm <85568270+Skorpionm@users.noreply.github.com> Date: Wed, 13 Oct 2021 23:35:33 +0400 Subject: [PATCH] SubGhz: fix frequency determination in a frequency analyzer (#762) --- .../subghz_frequency_analyzer_worker.c | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/applications/subghz/helpers/subghz_frequency_analyzer_worker.c b/applications/subghz/helpers/subghz_frequency_analyzer_worker.c index 83f09e04..5c7199b6 100644 --- a/applications/subghz/helpers/subghz_frequency_analyzer_worker.c +++ b/applications/subghz/helpers/subghz_frequency_analyzer_worker.c @@ -1,9 +1,28 @@ #include "subghz_frequency_analyzer_worker.h" +#include #include #include "../subghz_i.h" +static const uint8_t subghz_preset_ook_58khz[][2] = { + {CC1101_FIFOTHR, 0x47}, // The only important bit is ADC_RETENTION, FIFO Tx=33 Rx=32 + {CC1101_MDMCFG4, 0xF5}, // Rx BW filter is 58.035714kHz + {CC1101_TEST2, 0x81}, // FIFOTHR ADC_RETENTION=1 matched value + {CC1101_TEST1, 0x35}, // FIFOTHR ADC_RETENTION=1 matched value + /* End */ + {0, 0}, +}; + +static const uint8_t subghz_preset_ook_650khz[][2] = { + {CC1101_FIFOTHR, 0x07}, // The only important bit is ADC_RETENTION + {CC1101_MDMCFG4, 0x17}, // Rx BW filter is 650.000kHz + {CC1101_TEST2, 0x88}, + {CC1101_TEST1, 0x31}, + /* End */ + {0, 0}, +}; + struct SubGhzFrequencyAnalyzerWorker { FuriThread* thread; @@ -56,6 +75,8 @@ static int32_t subghz_frequency_analyzer_worker_thread(void* context) { while(instance->worker_running) { osDelay(10); frequency_rssi.rssi = -127.0f; + furi_hal_subghz_idle(); + furi_hal_subghz_load_registers(subghz_preset_ook_650khz); for(size_t i = 0; i < subghz_frequencies_count; i++) { if(furi_hal_subghz_is_frequency_valid(subghz_frequencies[i])) { furi_hal_subghz_idle(); @@ -74,6 +95,9 @@ static int32_t subghz_frequency_analyzer_worker_thread(void* context) { // -0.5 ... 433.92 ... +0.5 frequency_start = frequency_rssi.frequency - 250000; //step 10KHz + frequency_rssi.rssi = -127.0; + furi_hal_subghz_idle(); + furi_hal_subghz_load_registers(subghz_preset_ook_58khz); for(uint32_t i = frequency_start; i < frequency_start + 500000; i += 10000) { if(furi_hal_subghz_is_frequency_valid(i)) { furi_hal_subghz_idle();