4
4
#include <furi_hal.h>
5
5
#include <furi.h>
6
6
7
+ #include "helpers/radio_device_loader.h"
8
+
7
9
#include <lib/drivers/cc1101_regs.h>
8
10
9
11
struct SpectrumAnalyzerWorker {
@@ -13,6 +15,8 @@ struct SpectrumAnalyzerWorker {
13
15
SpectrumAnalyzerWorkerCallback callback ;
14
16
void * callback_context ;
15
17
18
+ const SubGhzDevice * radio_device ;
19
+
16
20
uint32_t channel0_frequency ;
17
21
uint32_t spacing ;
18
22
uint8_t width ;
@@ -44,7 +48,9 @@ void spectrum_analyzer_worker_set_filter(SpectrumAnalyzerWorker* instance) {
44
48
filter_config [0 ][1 ] = 0x6C ; /* 196 kHz / .8 = 245 kHz --> 270 kHz */
45
49
break ;
46
50
}
47
- furi_hal_subghz_load_registers ((uint8_t * )filter_config );
51
+
52
+ UNUSED (filter_config );
53
+ // furi_hal_subghz_load_registers((uint8_t*)filter_config);
48
54
}
49
55
50
56
static int32_t spectrum_analyzer_worker_thread (void * context ) {
@@ -54,32 +60,53 @@ static int32_t spectrum_analyzer_worker_thread(void* context) {
54
60
FURI_LOG_D ("SpectrumWorker" , "spectrum_analyzer_worker_thread: Start" );
55
61
56
62
// Start CC1101
57
- furi_hal_subghz_reset ();
58
- furi_hal_subghz_load_preset (FuriHalSubGhzPresetOok650Async );
59
- furi_hal_subghz_set_frequency (433920000 );
60
- furi_hal_subghz_flush_rx ();
61
- furi_hal_subghz_rx ();
62
-
63
- static const uint8_t radio_config [][2 ] = {
64
- {CC1101_FSCTRL1 , 0x12 },
65
- {CC1101_FSCTRL0 , 0x00 },
66
-
67
- {CC1101_AGCCTRL2 , 0xC0 },
68
-
69
- {CC1101_MDMCFG4 , 0x6C },
70
- {CC1101_TEST2 , 0x88 },
71
- {CC1101_TEST1 , 0x31 },
72
- {CC1101_TEST0 , 0x09 },
63
+ subghz_devices_reset (instance -> radio_device );
64
+ subghz_devices_load_preset (instance -> radio_device , FuriHalSubGhzPresetOok650Async , NULL );
65
+ subghz_devices_set_frequency (instance -> radio_device , 433920000 );
66
+ subghz_devices_flush_rx (instance -> radio_device );
67
+ subghz_devices_set_rx (instance -> radio_device );
68
+
69
+ const uint8_t radio_config [] = {
70
+
71
+ CC1101_FSCTRL0 ,
72
+ 0x00 ,
73
+ CC1101_FSCTRL1 ,
74
+ 0x12 ,
75
+
76
+ CC1101_AGCCTRL2 ,
77
+ 0xC0 ,
78
+
79
+ CC1101_MDMCFG4 ,
80
+ 0x6C ,
81
+ CC1101_TEST2 ,
82
+ 0x88 ,
83
+ CC1101_TEST1 ,
84
+ 0x31 ,
85
+ CC1101_TEST0 ,
86
+ 0x09 ,
87
+
73
88
/* End */
74
- {0 , 0 },
89
+ 0 ,
90
+ 0 ,
91
+
92
+ // ook_async_patable
93
+ 0x00 ,
94
+ 0xC0 , // 12dBm 0xC0, 10dBm 0xC5, 7dBm 0xCD, 5dBm 0x86, 0dBm 0x50, -6dBm 0x37, -10dBm 0x26, -15dBm 0x1D, -20dBm 0x17, -30dBm 0x03
95
+ 0x00 ,
96
+ 0x00 ,
97
+ 0x00 ,
98
+ 0x00 ,
99
+ 0x00 ,
100
+ 0x00 ,
75
101
};
76
102
77
103
while (instance -> should_work ) {
78
104
furi_delay_ms (50 );
79
105
80
106
// FURI_LOG_T("SpectrumWorker", "spectrum_analyzer_worker_thread: Worker Loop");
81
- furi_hal_subghz_idle ();
82
- furi_hal_subghz_load_registers ((uint8_t * )radio_config );
107
+ subghz_devices_idle (instance -> radio_device );
108
+ subghz_devices_load_preset (
109
+ instance -> radio_device , FuriHalSubGhzPresetCustom , (uint8_t * )radio_config );
83
110
84
111
// TODO: Check filter!
85
112
// spectrum_analyzer_worker_set_filter(instance);
@@ -90,25 +117,31 @@ static int32_t spectrum_analyzer_worker_thread(void* context) {
90
117
for (uint8_t ch_offset = 0 , chunk = 0 ; ch_offset < CHUNK_SIZE ;
91
118
++ chunk >= NUM_CHUNKS && ++ ch_offset && (chunk = 0 )) {
92
119
uint8_t ch = chunk * CHUNK_SIZE + ch_offset ;
93
- furi_hal_subghz_set_frequency (instance -> channel0_frequency + (ch * instance -> spacing ));
94
120
95
- furi_hal_subghz_rx ();
121
+ if (subghz_devices_is_frequency_valid (
122
+ instance -> radio_device ,
123
+ instance -> channel0_frequency + (ch * instance -> spacing )))
124
+ subghz_devices_set_frequency (
125
+ instance -> radio_device ,
126
+ instance -> channel0_frequency + (ch * instance -> spacing ));
127
+
128
+ subghz_devices_set_rx (instance -> radio_device );
96
129
furi_delay_ms (3 );
97
130
98
131
// dec dBm
99
132
//max_ss = 127 -> -10.5
100
133
//max_ss = 0 -> -74.0
101
134
//max_ss = 255 -> -74.5
102
135
//max_ss = 128 -> -138.0
103
- instance -> channel_ss [ch ] = (furi_hal_subghz_get_rssi ( ) + 138 ) * 2 ;
136
+ instance -> channel_ss [ch ] = (subghz_devices_get_rssi ( instance -> radio_device ) + 138 ) * 2 ;
104
137
105
138
if (instance -> channel_ss [ch ] > instance -> max_rssi_dec ) {
106
139
instance -> max_rssi_dec = instance -> channel_ss [ch ];
107
140
instance -> max_rssi = (instance -> channel_ss [ch ] / 2 ) - 138 ;
108
141
instance -> max_rssi_channel = ch ;
109
142
}
110
143
111
- furi_hal_subghz_idle ( );
144
+ subghz_devices_idle ( instance -> radio_device );
112
145
}
113
146
114
147
// FURI_LOG_T("SpectrumWorker", "channel_ss[0]: %u", instance->channel_ss[0]);
@@ -138,6 +171,11 @@ SpectrumAnalyzerWorker* spectrum_analyzer_worker_alloc() {
138
171
furi_thread_set_context (instance -> thread , instance );
139
172
furi_thread_set_callback (instance -> thread , spectrum_analyzer_worker_thread );
140
173
174
+ subghz_devices_init ();
175
+
176
+ instance -> radio_device =
177
+ radio_device_loader_set (instance -> radio_device , SubGhzRadioDeviceTypeExternalCC1101 );
178
+
141
179
FURI_LOG_D ("Spectrum" , "spectrum_analyzer_worker_alloc: End" );
142
180
143
181
return instance ;
@@ -147,6 +185,12 @@ void spectrum_analyzer_worker_free(SpectrumAnalyzerWorker* instance) {
147
185
FURI_LOG_D ("Spectrum" , "spectrum_analyzer_worker_free" );
148
186
furi_assert (instance );
149
187
furi_thread_free (instance -> thread );
188
+
189
+ subghz_devices_sleep (instance -> radio_device );
190
+ radio_device_loader_end (instance -> radio_device );
191
+
192
+ subghz_devices_deinit ();
193
+
150
194
free (instance );
151
195
}
152
196
0 commit comments