From 793f64f8d78e48566417e932271f7c123b9da61f Mon Sep 17 00:00:00 2001 From: r3df0xx Date: Thu, 19 May 2022 16:34:36 +0300 Subject: [PATCH] try rollback subghz fix --- applications/desktop/desktop.c | 7 +- applications/desktop/helpers/pin_lock.c | 5 +- .../subghz_frequency_analyzer_worker.c | 155 +++++------------- 3 files changed, 47 insertions(+), 120 deletions(-) diff --git a/applications/desktop/desktop.c b/applications/desktop/desktop.c index 34c169e07..514166375 100644 --- a/applications/desktop/desktop.c +++ b/applications/desktop/desktop.c @@ -56,7 +56,12 @@ static bool desktop_custom_event_callback(void* context, uint32_t event) { return true; case DesktopGlobalAutoLock: if(!loader_is_locked(desktop->loader)) { - desktop_lock(desktop); + if(desktop->settings.pin_code.length > 0) { + desktop_pin_lock(&desktop->settings); + desktop_lock(desktop); + } else { + desktop_lock(desktop); + } } return true; } diff --git a/applications/desktop/helpers/pin_lock.c b/applications/desktop/helpers/pin_lock.c index d63398d96..00ac41778 100644 --- a/applications/desktop/helpers/pin_lock.c +++ b/applications/desktop/helpers/pin_lock.c @@ -100,12 +100,11 @@ void desktop_pin_lock_init(DesktopSettings* settings) { } else { furi_hal_rtc_set_pin_fails(0); furi_hal_rtc_reset_flag(FuriHalRtcFlagLock); + furi_hal_usb_enable(); } if(desktop_pin_lock_is_locked()) { - Cli* cli = furi_record_open("cli"); - cli_session_close(cli); - furi_record_close("cli"); + furi_hal_usb_disable(); } } diff --git a/applications/subghz/helpers/subghz_frequency_analyzer_worker.c b/applications/subghz/helpers/subghz_frequency_analyzer_worker.c index 88e2a621c..ddbe5e59f 100644 --- a/applications/subghz/helpers/subghz_frequency_analyzer_worker.c +++ b/applications/subghz/helpers/subghz_frequency_analyzer_worker.c @@ -1,22 +1,24 @@ #include "subghz_frequency_analyzer_worker.h" -#include +#include #include #include "../subghz_i.h" -#define TAG "SubghzFrequencyAnalyzerWorker" - -#define SUBGHZ_FREQUENCY_ANALYZER_THRESHOLD -95.0f - static const uint8_t subghz_preset_ook_58khz[][2] = { - {CC1101_MDMCFG4, 0b11110111}, // Rx BW filter is 58.035714kHz + {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_MDMCFG4, 0b00010111}, // Rx BW filter is 650.000kHz + {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}, }; @@ -25,7 +27,7 @@ struct SubGhzFrequencyAnalyzerWorker { FuriThread* thread; volatile bool worker_running; - uint8_t sample_hold_counter; + uint8_t count_repet; FrequencyRSSI frequency_rssi_buf; SubGhzSetting* setting; @@ -35,16 +37,6 @@ struct SubGhzFrequencyAnalyzerWorker { void* context; }; -static void subghz_frequency_analyzer_worker_load_registers(const uint8_t data[][2]) { - furi_hal_spi_acquire(&furi_hal_spi_bus_handle_subghz); - size_t i = 0; - while(data[i][0]) { - cc1101_write_reg(&furi_hal_spi_bus_handle_subghz, data[i][0], data[i][1]); - i++; - } - furi_hal_spi_release(&furi_hal_spi_bus_handle_subghz); -} - // running average with adaptive coefficient static uint32_t subghz_frequency_analyzer_worker_expRunningAverageAdaptive( SubGhzFrequencyAnalyzerWorker* instance, @@ -70,75 +62,32 @@ static int32_t subghz_frequency_analyzer_worker_thread(void* context) { SubGhzFrequencyAnalyzerWorker* instance = context; FrequencyRSSI frequency_rssi = {.frequency = 0, .rssi = 0}; - float rssi = 0; - uint32_t frequency = 0; - CC1101Status status; + float rssi; + uint32_t frequency; + uint32_t frequency_start; //Start CC1101 furi_hal_subghz_reset(); - - furi_hal_spi_acquire(&furi_hal_spi_bus_handle_subghz); - cc1101_flush_rx(&furi_hal_spi_bus_handle_subghz); - cc1101_flush_tx(&furi_hal_spi_bus_handle_subghz); - cc1101_write_reg(&furi_hal_spi_bus_handle_subghz, CC1101_IOCFG0, CC1101IocfgHW); - cc1101_write_reg(&furi_hal_spi_bus_handle_subghz, CC1101_MDMCFG3, - 0b11111111); // symbol rate - cc1101_write_reg( - &furi_hal_spi_bus_handle_subghz, - CC1101_AGCCTRL2, - 0b00000111); // 00 - DVGA all; 000 - MAX LNA+LNA2; 111 - MAGN_TARGET 42 dB - cc1101_write_reg( - &furi_hal_spi_bus_handle_subghz, - CC1101_AGCCTRL1, - 0b00001000); // 0; 0 - LNA 2 gain is decreased to minimum before decreasing LNA gain; 00 - Relative carrier sense threshold disabled; 1000 - Absolute carrier sense threshold disabled - cc1101_write_reg( - &furi_hal_spi_bus_handle_subghz, - CC1101_AGCCTRL0, - 0b00110000); // 00 - No hysteresis, medium asymmetric dead zone, medium gain ; 11 - 64 samples agc; 00 - Normal AGC, 00 - 4dB boundary - - furi_hal_spi_release(&furi_hal_spi_bus_handle_subghz); - + furi_hal_subghz_load_preset(FuriHalSubGhzPresetOok650Async); + furi_hal_subghz_set_frequency(433920000); + furi_hal_subghz_flush_rx(); furi_hal_subghz_set_path(FuriHalSubGhzPathIsolate); + furi_hal_subghz_rx(); while(instance->worker_running) { osDelay(10); - - float rssi_min = 26.0f; - float rssi_avg = 0; - size_t rssi_avg_samples = 0; - frequency_rssi.rssi = -127.0f; furi_hal_subghz_idle(); - subghz_frequency_analyzer_worker_load_registers(subghz_preset_ook_650khz); - - // First stage: coarse scan + furi_hal_subghz_load_registers(subghz_preset_ook_650khz); for(size_t i = 0; i < subghz_setting_get_frequency_count(instance->setting); i++) { if(furi_hal_subghz_is_frequency_valid( subghz_setting_get_frequency(instance->setting, i))) { - furi_hal_spi_acquire(&furi_hal_spi_bus_handle_subghz); - cc1101_switch_to_idle(&furi_hal_spi_bus_handle_subghz); - frequency = cc1101_set_frequency( - &furi_hal_spi_bus_handle_subghz, + furi_hal_subghz_idle(); + frequency = furi_hal_subghz_set_frequency( subghz_setting_get_frequency(instance->setting, i)); - - cc1101_calibrate(&furi_hal_spi_bus_handle_subghz); - do { - status = cc1101_get_status(&furi_hal_spi_bus_handle_subghz); - } while(status.STATE != CC1101StateIDLE); - - cc1101_switch_to_rx(&furi_hal_spi_bus_handle_subghz); - furi_hal_spi_release(&furi_hal_spi_bus_handle_subghz); - - // delay will be in range between 1 and 2ms - osDelay(2); - + furi_hal_subghz_rx(); + osDelay(3); rssi = furi_hal_subghz_get_rssi(); - - rssi_avg += rssi; - rssi_avg_samples++; - - if(rssi < rssi_min) rssi_min = rssi; - if(frequency_rssi.rssi < rssi) { frequency_rssi.rssi = rssi; frequency_rssi.frequency = frequency; @@ -146,41 +95,19 @@ static int32_t subghz_frequency_analyzer_worker_thread(void* context) { } } - FURI_LOG_T( - TAG, - "RSSI: avg %f, max %f at %u, min %f", - (double)(rssi_avg / rssi_avg_samples), - (double)frequency_rssi.rssi, - frequency_rssi.frequency, - (double)rssi_min); - - // Second stage: fine scan - if(frequency_rssi.rssi > SUBGHZ_FREQUENCY_ANALYZER_THRESHOLD) { - FURI_LOG_D(TAG, "~:%u:%f", frequency_rssi.frequency, (double)frequency_rssi.rssi); - + if(frequency_rssi.rssi > -90.0) { + // -0.5 ... 433.92 ... +0.5 + frequency_start = frequency_rssi.frequency - 250000; + //step 10KHz frequency_rssi.rssi = -127.0; furi_hal_subghz_idle(); - subghz_frequency_analyzer_worker_load_registers(subghz_preset_ook_58khz); - //-0.3 ... 433.92 ... +0.3 step 10KHz - for(uint32_t i = frequency_rssi.frequency - 300000; - i < frequency_rssi.frequency + 300000; - i += 20000) { + 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_spi_acquire(&furi_hal_spi_bus_handle_subghz); - cc1101_switch_to_idle(&furi_hal_spi_bus_handle_subghz); - frequency = cc1101_set_frequency(&furi_hal_spi_bus_handle_subghz, i); - - cc1101_calibrate(&furi_hal_spi_bus_handle_subghz); - do { - status = cc1101_get_status(&furi_hal_spi_bus_handle_subghz); - } while(status.STATE != CC1101StateIDLE); - - cc1101_switch_to_rx(&furi_hal_spi_bus_handle_subghz); - furi_hal_spi_release(&furi_hal_spi_bus_handle_subghz); - - // delay will be in range between 1 and 2ms - osDelay(2); - + furi_hal_subghz_idle(); + frequency = furi_hal_subghz_set_frequency(i); + furi_hal_subghz_rx(); + osDelay(3); rssi = furi_hal_subghz_get_rssi(); if(frequency_rssi.rssi < rssi) { frequency_rssi.rssi = rssi; @@ -190,24 +117,20 @@ static int32_t subghz_frequency_analyzer_worker_thread(void* context) { } } - // Deliver results - if(frequency_rssi.rssi > SUBGHZ_FREQUENCY_ANALYZER_THRESHOLD) { - FURI_LOG_D(TAG, "=:%u:%f", frequency_rssi.frequency, (double)frequency_rssi.rssi); - - instance->sample_hold_counter = 20; + if(frequency_rssi.rssi > -90.0) { + instance->count_repet = 20; if(instance->filVal) { frequency_rssi.frequency = subghz_frequency_analyzer_worker_expRunningAverageAdaptive( instance, frequency_rssi.frequency); } - // Deliver callback - if(instance->pair_callback) { + if(instance->pair_callback) instance->pair_callback( instance->context, frequency_rssi.frequency, frequency_rssi.rssi); - } + } else { - if(instance->sample_hold_counter > 0) { - instance->sample_hold_counter--; + if(instance->count_repet > 0) { + instance->count_repet--; } else { instance->filVal = 0; if(instance->pair_callback) instance->pair_callback(instance->context, 0, 0); @@ -275,4 +198,4 @@ void subghz_frequency_analyzer_worker_stop(SubGhzFrequencyAnalyzerWorker* instan bool subghz_frequency_analyzer_worker_is_running(SubGhzFrequencyAnalyzerWorker* instance) { furi_assert(instance); return instance->worker_running; -} +} \ No newline at end of file