11#include "subghz_frequency_analyzer_worker.h"
2- #include <lib/drivers/cc1101_regs .h>
2+ #include <lib/drivers/cc1101 .h>
33
44#include <furi.h>
55
66#include "../subghz_i.h"
77
8+ #define SUBGHZ_FREQUENCY_ANALYZER_THRESHOLD -90.0f
9+
810static const uint8_t subghz_preset_ook_58khz [][2 ] = {
911 {CC1101_FIFOTHR , 0x47 }, // The only important bit is ADC_RETENTION, FIFO Tx=33 Rx=32
1012 {CC1101_MDMCFG4 , 0xF5 }, // Rx BW filter is 58.035714kHz
@@ -37,6 +39,16 @@ struct SubGhzFrequencyAnalyzerWorker {
3739 void * context ;
3840};
3941
42+ static void subghz_frequency_analyzer_worker_load_registers (const uint8_t data [][2 ]) {
43+ furi_hal_spi_acquire (& furi_hal_spi_bus_handle_subghz );
44+ uint32_t i = 0 ;
45+ while (data [i ][0 ]) {
46+ cc1101_write_reg (& furi_hal_spi_bus_handle_subghz , data [i ][0 ], data [i ][1 ]);
47+ i ++ ;
48+ }
49+ furi_hal_spi_release (& furi_hal_spi_bus_handle_subghz );
50+ }
51+
4052// running average with adaptive coefficient
4153static uint32_t subghz_frequency_analyzer_worker_expRunningAverageAdaptive (
4254 SubGhzFrequencyAnalyzerWorker * instance ,
@@ -65,27 +77,55 @@ static int32_t subghz_frequency_analyzer_worker_thread(void* context) {
6577 float rssi ;
6678 uint32_t frequency ;
6779 uint32_t frequency_start ;
80+ CC1101Status status ;
6881
6982 //Start CC1101
7083 furi_hal_subghz_reset ();
71- furi_hal_subghz_load_preset (FuriHalSubGhzPresetOok650Async );
72- furi_hal_subghz_set_frequency (433920000 );
73- furi_hal_subghz_flush_rx ();
84+
85+ furi_hal_spi_acquire (& furi_hal_spi_bus_handle_subghz );
86+ cc1101_flush_rx (& furi_hal_spi_bus_handle_subghz );
87+ cc1101_flush_tx (& furi_hal_spi_bus_handle_subghz );
88+ cc1101_write_reg (& furi_hal_spi_bus_handle_subghz , CC1101_IOCFG0 , CC1101IocfgHW );
89+ cc1101_write_reg (
90+ & furi_hal_spi_bus_handle_subghz ,
91+ CC1101_AGCCTRL2 ,
92+ 0b0000111 ); // 00 - DVGA all; 000 - MAX LNA+LNA2; 111 - MAIN_TARGET 42 dB
93+ cc1101_write_reg (
94+ & furi_hal_spi_bus_handle_subghz ,
95+ CC1101_AGCCTRL1 ,
96+ 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
97+ cc1101_write_reg (
98+ & furi_hal_spi_bus_handle_subghz ,
99+ CC1101_AGCCTRL0 ,
100+ 0b00000001 ); // 00 - No hysteresis, medium asymmetric dead zone, medium gain ; 00 - 8 samples agc; 00 - Normal AGC, 01 - 8dB boundary
101+
102+ furi_hal_spi_release (& furi_hal_spi_bus_handle_subghz );
103+
74104 furi_hal_subghz_set_path (FuriHalSubGhzPathIsolate );
75- furi_hal_subghz_rx ();
76105
77106 while (instance -> worker_running ) {
78107 osDelay (10 );
79108 frequency_rssi .rssi = -127.0f ;
80109 furi_hal_subghz_idle ();
81- furi_hal_subghz_load_registers (subghz_preset_ook_650khz );
110+ subghz_frequency_analyzer_worker_load_registers (subghz_preset_ook_650khz );
111+
82112 for (size_t i = 0 ; i < subghz_setting_get_frequency_count (instance -> setting ); i ++ ) {
83113 if (furi_hal_subghz_is_frequency_valid (
84114 subghz_setting_get_frequency (instance -> setting , i ))) {
85- furi_hal_subghz_idle ();
86- frequency = furi_hal_subghz_set_frequency (
115+ furi_hal_spi_acquire (& furi_hal_spi_bus_handle_subghz );
116+ cc1101_switch_to_idle (& furi_hal_spi_bus_handle_subghz );
117+ frequency = cc1101_set_frequency (
118+ & furi_hal_spi_bus_handle_subghz ,
87119 subghz_setting_get_frequency (instance -> setting , i ));
88- furi_hal_subghz_rx ();
120+
121+ cc1101_calibrate (& furi_hal_spi_bus_handle_subghz );
122+ do {
123+ status = cc1101_get_status (& furi_hal_spi_bus_handle_subghz );
124+ } while (status .STATE != CC1101StateIDLE );
125+
126+ cc1101_switch_to_rx (& furi_hal_spi_bus_handle_subghz );
127+ furi_hal_spi_release (& furi_hal_spi_bus_handle_subghz );
128+
89129 osDelay (3 );
90130 rssi = furi_hal_subghz_get_rssi ();
91131 if (frequency_rssi .rssi < rssi ) {
@@ -95,19 +135,28 @@ static int32_t subghz_frequency_analyzer_worker_thread(void* context) {
95135 }
96136 }
97137
98- if (frequency_rssi .rssi > -90.0 ) {
138+ if (frequency_rssi .rssi > SUBGHZ_FREQUENCY_ANALYZER_THRESHOLD ) {
99139 // -0.5 ... 433.92 ... +0.5
100- frequency_start = frequency_rssi .frequency - 250000 ;
101- //step 10KHz
140+ frequency_start = frequency_rssi .frequency - 500000 ;
102141 frequency_rssi .rssi = -127.0 ;
103142 furi_hal_subghz_idle ();
104- furi_hal_subghz_load_registers (subghz_preset_ook_58khz );
143+ subghz_frequency_analyzer_worker_load_registers (subghz_preset_ook_58khz );
144+ //step 10KHz
105145 for (uint32_t i = frequency_start ; i < frequency_start + 500000 ; i += 10000 ) {
106146 if (furi_hal_subghz_is_frequency_valid (i )) {
107- furi_hal_subghz_idle ();
108- frequency = furi_hal_subghz_set_frequency (i );
109- furi_hal_subghz_rx ();
110- osDelay (3 );
147+ furi_hal_spi_acquire (& furi_hal_spi_bus_handle_subghz );
148+ cc1101_switch_to_idle (& furi_hal_spi_bus_handle_subghz );
149+ frequency = cc1101_set_frequency (& furi_hal_spi_bus_handle_subghz , i );
150+
151+ cc1101_calibrate (& furi_hal_spi_bus_handle_subghz );
152+ do {
153+ status = cc1101_get_status (& furi_hal_spi_bus_handle_subghz );
154+ } while (status .STATE != CC1101StateIDLE );
155+
156+ cc1101_switch_to_rx (& furi_hal_spi_bus_handle_subghz );
157+ furi_hal_spi_release (& furi_hal_spi_bus_handle_subghz );
158+
159+ osDelay (5 );
111160 rssi = furi_hal_subghz_get_rssi ();
112161 if (frequency_rssi .rssi < rssi ) {
113162 frequency_rssi .rssi = rssi ;
@@ -117,7 +166,7 @@ static int32_t subghz_frequency_analyzer_worker_thread(void* context) {
117166 }
118167 }
119168
120- if (frequency_rssi .rssi > -90.0 ) {
169+ if (frequency_rssi .rssi > SUBGHZ_FREQUENCY_ANALYZER_THRESHOLD ) {
121170 instance -> count_repet = 20 ;
122171 if (instance -> filVal ) {
123172 frequency_rssi .frequency =
0 commit comments