diff --git a/applications/subghz/helpers/subghz_frequency_analyzer_worker.c b/applications/subghz/helpers/subghz_frequency_analyzer_worker.c index c0e1fdbaaab..aedd666dfcd 100644 --- a/applications/subghz/helpers/subghz_frequency_analyzer_worker.c +++ b/applications/subghz/helpers/subghz_frequency_analyzer_worker.c @@ -1,10 +1,12 @@ #include "subghz_frequency_analyzer_worker.h" -#include +#include #include #include "../subghz_i.h" +#define SUBGHZ_FREQUENCY_ANALYZER_THRESHOLD -90.0f + 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 @@ -37,6 +39,16 @@ 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); + uint32_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, @@ -65,27 +77,55 @@ static int32_t subghz_frequency_analyzer_worker_thread(void* context) { float rssi; uint32_t frequency; uint32_t frequency_start; + CC1101Status status; //Start CC1101 furi_hal_subghz_reset(); - furi_hal_subghz_load_preset(FuriHalSubGhzPresetOok650Async); - furi_hal_subghz_set_frequency(433920000); - furi_hal_subghz_flush_rx(); + + 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_AGCCTRL2, + 0b0000111); // 00 - DVGA all; 000 - MAX LNA+LNA2; 111 - MAIN_TARGET 42 dB + cc1101_write_reg( + &furi_hal_spi_bus_handle_subghz, + CC1101_AGCCTRL1, + 0b00000000); // 0; 0 - LNA 2 gain is decreased to minimum before decreasing LNA gain; 00 - Relative carrier sense threshold disabled; 0000 - RSSI to MAIN_TARGET + cc1101_write_reg( + &furi_hal_spi_bus_handle_subghz, + CC1101_AGCCTRL0, + 0b00000001); // 00 - No hysteresis, medium asymmetric dead zone, medium gain ; 00 - 8 samples agc; 00 - Normal AGC, 01 - 8dB boundary + + furi_hal_spi_release(&furi_hal_spi_bus_handle_subghz); + furi_hal_subghz_set_path(FuriHalSubGhzPathIsolate); - furi_hal_subghz_rx(); while(instance->worker_running) { osDelay(10); frequency_rssi.rssi = -127.0f; furi_hal_subghz_idle(); - furi_hal_subghz_load_registers(subghz_preset_ook_650khz); + subghz_frequency_analyzer_worker_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_subghz_idle(); - frequency = furi_hal_subghz_set_frequency( + 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, subghz_setting_get_frequency(instance->setting, i)); - furi_hal_subghz_rx(); + + 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); + osDelay(3); rssi = furi_hal_subghz_get_rssi(); if(frequency_rssi.rssi < rssi) { @@ -95,19 +135,28 @@ static int32_t subghz_frequency_analyzer_worker_thread(void* context) { } } - if(frequency_rssi.rssi > -90.0) { + if(frequency_rssi.rssi > SUBGHZ_FREQUENCY_ANALYZER_THRESHOLD) { // -0.5 ... 433.92 ... +0.5 - frequency_start = frequency_rssi.frequency - 250000; - //step 10KHz + frequency_start = frequency_rssi.frequency - 500000; frequency_rssi.rssi = -127.0; furi_hal_subghz_idle(); - furi_hal_subghz_load_registers(subghz_preset_ook_58khz); + subghz_frequency_analyzer_worker_load_registers(subghz_preset_ook_58khz); + //step 10KHz for(uint32_t i = frequency_start; i < frequency_start + 500000; i += 10000) { if(furi_hal_subghz_is_frequency_valid(i)) { - furi_hal_subghz_idle(); - frequency = furi_hal_subghz_set_frequency(i); - furi_hal_subghz_rx(); - osDelay(3); + 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); + + osDelay(5); rssi = furi_hal_subghz_get_rssi(); if(frequency_rssi.rssi < rssi) { frequency_rssi.rssi = rssi; @@ -117,7 +166,7 @@ static int32_t subghz_frequency_analyzer_worker_thread(void* context) { } } - if(frequency_rssi.rssi > -90.0) { + if(frequency_rssi.rssi > SUBGHZ_FREQUENCY_ANALYZER_THRESHOLD) { instance->count_repet = 20; if(instance->filVal) { frequency_rssi.frequency = diff --git a/lib/subghz/protocols/megacode.c b/lib/subghz/protocols/megacode.c index 48a6908e9ea..6f6240a6203 100644 --- a/lib/subghz/protocols/megacode.c +++ b/lib/subghz/protocols/megacode.c @@ -401,13 +401,14 @@ void subghz_protocol_decoder_megacode_get_string(void* context, string_t output) string_cat_printf( output, "%s %dbit\r\n" - "Key:%06lX\r\n" - "Sn:%04lX Btn:%X\r\n" - "Facility:%X\r\n", + "Key:0x%06lX\r\n" + "Sn:0x%04lX - %d\r\n" + "Facility:%X Btn:%X\r\n", instance->generic.protocol_name, instance->generic.data_count_bit, (uint32_t)instance->generic.data, instance->generic.serial, - instance->generic.btn, - instance->generic.cnt); + instance->generic.serial, + instance->generic.cnt, + instance->generic.btn); }