Skip to content

Commit d76af06

Browse files
authored
Merge pull request #12 from flipperdevices/skorp/subghz_
SubGhz: MegaCode display changes
2 parents 6c1f605 + a41003c commit d76af06

File tree

2 files changed

+73
-23
lines changed

2 files changed

+73
-23
lines changed

applications/subghz/helpers/subghz_frequency_analyzer_worker.c

Lines changed: 67 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
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+
810
static 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
4153
static 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 =

lib/subghz/protocols/megacode.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -401,13 +401,14 @@ void subghz_protocol_decoder_megacode_get_string(void* context, string_t output)
401401
string_cat_printf(
402402
output,
403403
"%s %dbit\r\n"
404-
"Key:%06lX\r\n"
405-
"Sn:%04lX Btn:%X\r\n"
406-
"Facility:%X\r\n",
404+
"Key:0x%06lX\r\n"
405+
"Sn:0x%04lX - %d\r\n"
406+
"Facility:%X Btn:%X\r\n",
407407
instance->generic.protocol_name,
408408
instance->generic.data_count_bit,
409409
(uint32_t)instance->generic.data,
410410
instance->generic.serial,
411-
instance->generic.btn,
412-
instance->generic.cnt);
411+
instance->generic.serial,
412+
instance->generic.cnt,
413+
instance->generic.btn);
413414
}

0 commit comments

Comments
 (0)