Skip to content

Commit ec19c11

Browse files
Skorpionmskotopes
andauthored
[FL-2669] SubGhz: add support for loading custom presets (#1398)
* SubGhz: load custom -preset * SubGhz: fix error prt=0 * SubGhz: load custom preset * SubGhz: code refactoring to support custom preset * SubGhz: add custom presert refactoring * SubGhz: fix alloc history alloc preset * SubGhz: fix error load file * SubGhz: fix start custom preset * SubGhz: fix delete custom preset * SubGhz: add description Custom_preset_data for CC1101 * SubGhz: debug logging and buffer size rounding Co-authored-by: あく <alleteam@gmail.com> Co-authored-by: Aleksandr Kutuzov <aku@plooks.com>
1 parent ed7db33 commit ec19c11

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

75 files changed

+681
-454
lines changed

applications/subghz/helpers/subghz_types.h

+13
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
#pragma once
22

3+
#include "m-string.h"
4+
#include <furi.h>
5+
#include <furi_hal.h>
6+
37
/** SubGhzNotification state */
48
typedef enum {
59
SubGhzNotificationStateStarting,
@@ -67,3 +71,12 @@ typedef enum {
6771
SubGhzViewIdTestCarrier,
6872
SubGhzViewIdTestPacket,
6973
} SubGhzViewId;
74+
75+
struct SubGhzPesetDefinition {
76+
string_t name;
77+
uint32_t frequency;
78+
uint8_t* data;
79+
size_t data_size;
80+
};
81+
82+
typedef struct SubGhzPesetDefinition SubGhzPesetDefinition;

applications/subghz/scenes/subghz_scene_need_saving.c

+6-2
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,12 @@ bool subghz_scene_need_saving_on_event(void* context, SceneManagerEvent event) {
4848
} else if(event.event == SubGhzCustomEventSceneExit) {
4949
if(subghz->txrx->rx_key_state == SubGhzRxKeyStateExit) {
5050
subghz->txrx->rx_key_state = SubGhzRxKeyStateIDLE;
51-
subghz->txrx->frequency = subghz_setting_get_default_frequency(subghz->setting);
52-
subghz->txrx->preset = FuriHalSubGhzPresetOok650Async;
51+
subghz_preset_init(
52+
subghz,
53+
"AM650",
54+
subghz_setting_get_default_frequency(subghz->setting),
55+
NULL,
56+
0);
5357
scene_manager_search_and_switch_to_previous_scene(
5458
subghz->scene_manager, SubGhzSceneStart);
5559
} else {

applications/subghz/scenes/subghz_scene_read_raw.c

+11-5
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,12 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) {
131131
scene_manager_next_scene(subghz->scene_manager, SubGhzSceneNeedSaving);
132132
} else {
133133
//Restore default setting
134-
subghz->txrx->frequency = subghz_setting_get_default_frequency(subghz->setting);
135-
subghz->txrx->preset = FuriHalSubGhzPresetOok650Async;
134+
subghz_preset_init(
135+
subghz,
136+
"AM650",
137+
subghz_setting_get_default_frequency(subghz->setting),
138+
NULL,
139+
0);
136140
if(!scene_manager_search_and_switch_to_previous_scene(
137141
subghz->scene_manager, SubGhzSceneSaved)) {
138142
if(!scene_manager_search_and_switch_to_previous_scene(
@@ -268,13 +272,15 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) {
268272
if(subghz_protocol_raw_save_to_file_init(
269273
(SubGhzProtocolDecoderRAW*)subghz->txrx->decoder_result,
270274
RAW_FILE_NAME,
271-
subghz->txrx->frequency,
272275
subghz->txrx->preset)) {
273276
DOLPHIN_DEED(DolphinDeedSubGhzRawRec);
274277
if((subghz->txrx->txrx_state == SubGhzTxRxStateIDLE) ||
275278
(subghz->txrx->txrx_state == SubGhzTxRxStateSleep)) {
276-
subghz_begin(subghz, subghz->txrx->preset);
277-
subghz_rx(subghz, subghz->txrx->frequency);
279+
subghz_begin(
280+
subghz,
281+
subghz_setting_get_preset_data_by_name(
282+
subghz->setting, string_get_cstr(subghz->txrx->preset->name)));
283+
subghz_rx(subghz, subghz->txrx->preset->frequency);
278284
}
279285
subghz->state_notifications = SubGhzNotificationStateRx;
280286
subghz->txrx->rx_key_state = SubGhzRxKeyStateAddKey;

applications/subghz/scenes/subghz_scene_receiver.c

+14-8
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,7 @@ static void subghz_scene_add_to_history_callback(
7575
string_t str_buff;
7676
string_init(str_buff);
7777

78-
if(subghz_history_add_to_history(
79-
subghz->txrx->history, decoder_base, subghz->txrx->frequency, subghz->txrx->preset)) {
78+
if(subghz_history_add_to_history(subghz->txrx->history, decoder_base, subghz->txrx->preset)) {
8079
string_reset(str_buff);
8180

8281
subghz->state_notifications = SubGhzNotificationStateRxDone;
@@ -103,8 +102,8 @@ void subghz_scene_receiver_on_enter(void* context) {
103102
string_init(str_buff);
104103

105104
if(subghz->txrx->rx_key_state == SubGhzRxKeyStateIDLE) {
106-
subghz->txrx->frequency = subghz_setting_get_default_frequency(subghz->setting);
107-
subghz->txrx->preset = FuriHalSubGhzPresetOok650Async;
105+
subghz_preset_init(
106+
subghz, "AM650", subghz_setting_get_default_frequency(subghz->setting), NULL, 0);
108107
subghz_history_reset(subghz->txrx->history);
109108
subghz->txrx->rx_key_state = SubGhzRxKeyStateStart;
110109
}
@@ -135,8 +134,11 @@ void subghz_scene_receiver_on_enter(void* context) {
135134
};
136135
if((subghz->txrx->txrx_state == SubGhzTxRxStateIDLE) ||
137136
(subghz->txrx->txrx_state == SubGhzTxRxStateSleep)) {
138-
subghz_begin(subghz, subghz->txrx->preset);
139-
subghz_rx(subghz, subghz->txrx->frequency);
137+
subghz_begin(
138+
subghz,
139+
subghz_setting_get_preset_data_by_name(
140+
subghz->setting, string_get_cstr(subghz->txrx->preset->name)));
141+
subghz_rx(subghz, subghz->txrx->preset->frequency);
140142
}
141143
subghz_view_receiver_set_idx_menu(subghz->subghz_receiver, subghz->txrx->idx_menu_chosen);
142144

@@ -164,8 +166,12 @@ bool subghz_scene_receiver_on_event(void* context, SceneManagerEvent event) {
164166
scene_manager_next_scene(subghz->scene_manager, SubGhzSceneNeedSaving);
165167
} else {
166168
subghz->txrx->rx_key_state = SubGhzRxKeyStateIDLE;
167-
subghz->txrx->frequency = subghz_setting_get_default_frequency(subghz->setting);
168-
subghz->txrx->preset = FuriHalSubGhzPresetOok650Async;
169+
subghz_preset_init(
170+
subghz,
171+
"AM650",
172+
subghz_setting_get_default_frequency(subghz->setting),
173+
NULL,
174+
0);
169175
scene_manager_search_and_switch_to_previous_scene(
170176
subghz->scene_manager, SubGhzSceneStart);
171177
}

applications/subghz/scenes/subghz_scene_receiver_config.c

+28-36
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,6 @@ enum SubGhzSettingIndex {
77
SubGhzSettingIndexLock,
88
};
99

10-
#define PRESET_COUNT 4
11-
const char* const preset_text[PRESET_COUNT] = {
12-
"AM270",
13-
"AM650",
14-
"FM238",
15-
"FM476",
16-
};
17-
const uint32_t preset_value[PRESET_COUNT] = {
18-
FuriHalSubGhzPresetOok270Async, /** OOK, bandwidth 270kHz, asynchronous */
19-
FuriHalSubGhzPresetOok650Async, /** OOK, bandwidth 650kHz, asynchronous */
20-
FuriHalSubGhzPreset2FSKDev238Async, /** FM, deviation 2.380371 kHz, asynchronous */
21-
FuriHalSubGhzPreset2FSKDev476Async, /** FM, deviation 4.760742 kHz, asynchronous */
22-
};
23-
2410
#define HOPPING_COUNT 2
2511
const char* const hopping_text[HOPPING_COUNT] = {
2612
"OFF",
@@ -31,32 +17,31 @@ const uint32_t hopping_value[HOPPING_COUNT] = {
3117
SubGhzHopperStateRunnig,
3218
};
3319

34-
uint8_t subghz_scene_receiver_config_uint32_value_index(
35-
const uint32_t value,
36-
const uint32_t values[],
37-
uint8_t values_count) {
38-
int64_t last_value = INT64_MIN;
20+
uint8_t subghz_scene_receiver_config_next_frequency(const uint32_t value, void* context) {
21+
furi_assert(context);
22+
SubGhz* subghz = context;
3923
uint8_t index = 0;
40-
for(uint8_t i = 0; i < values_count; i++) {
41-
if((value >= last_value) && (value <= values[i])) {
24+
for(uint8_t i = 0; i < subghz_setting_get_frequency_count(subghz->setting); i++) {
25+
if(value == subghz_setting_get_frequency(subghz->setting, i)) {
4226
index = i;
4327
break;
28+
} else {
29+
index = subghz_setting_get_frequency_default_index(subghz->setting);
4430
}
45-
last_value = values[i];
4631
}
4732
return index;
4833
}
4934

50-
uint8_t subghz_scene_receiver_config_next_frequency(const uint32_t value, void* context) {
35+
uint8_t subghz_scene_receiver_config_next_preset(const char* preset_name, void* context) {
5136
furi_assert(context);
5237
SubGhz* subghz = context;
5338
uint8_t index = 0;
54-
for(uint8_t i = 0; i < subghz_setting_get_frequency_count(subghz->setting); i++) {
55-
if(value == subghz_setting_get_frequency(subghz->setting, i)) {
39+
for(uint8_t i = 0; i < subghz_setting_get_preset_count(subghz->setting); i++) {
40+
if(!strcmp(subghz_setting_get_preset_name(subghz->setting, i), preset_name)) {
5641
index = i;
5742
break;
5843
} else {
59-
index = subghz_setting_get_frequency_default_index(subghz->setting);
44+
// index = subghz_setting_get_frequency_default_index(subghz->setting);
6045
}
6146
}
6247
return index;
@@ -94,7 +79,7 @@ static void subghz_scene_receiver_config_set_frequency(VariableItem* item) {
9479
subghz_setting_get_frequency(subghz->setting, index) / 1000000,
9580
(subghz_setting_get_frequency(subghz->setting, index) % 1000000) / 10000);
9681
variable_item_set_current_value_text(item, text_buf);
97-
subghz->txrx->frequency = subghz_setting_get_frequency(subghz->setting, index);
82+
subghz->txrx->preset->frequency = subghz_setting_get_frequency(subghz->setting, index);
9883
} else {
9984
variable_item_set_current_value_index(
10085
item, subghz_setting_get_frequency_default_index(subghz->setting));
@@ -104,9 +89,14 @@ static void subghz_scene_receiver_config_set_frequency(VariableItem* item) {
10489
static void subghz_scene_receiver_config_set_preset(VariableItem* item) {
10590
SubGhz* subghz = variable_item_get_context(item);
10691
uint8_t index = variable_item_get_current_value_index(item);
107-
108-
variable_item_set_current_value_text(item, preset_text[index]);
109-
subghz->txrx->preset = preset_value[index];
92+
variable_item_set_current_value_text(
93+
item, subghz_setting_get_preset_name(subghz->setting, index));
94+
subghz_preset_init(
95+
subghz,
96+
subghz_setting_get_preset_name(subghz->setting, index),
97+
subghz->txrx->preset->frequency,
98+
subghz_setting_get_preset_data(subghz->setting, index),
99+
subghz_setting_get_preset_data_size(subghz->setting, index));
110100
}
111101

112102
static void subghz_scene_receiver_config_set_hopping_runing(VariableItem* item) {
@@ -125,7 +115,7 @@ static void subghz_scene_receiver_config_set_hopping_runing(VariableItem* item)
125115
(VariableItem*)scene_manager_get_scene_state(
126116
subghz->scene_manager, SubGhzSceneReceiverConfig),
127117
text_buf);
128-
subghz->txrx->frequency = subghz_setting_get_default_frequency(subghz->setting);
118+
subghz->txrx->preset->frequency = subghz_setting_get_default_frequency(subghz->setting);
129119
variable_item_set_current_value_index(
130120
(VariableItem*)scene_manager_get_scene_state(
131121
subghz->scene_manager, SubGhzSceneReceiverConfig),
@@ -164,7 +154,8 @@ void subghz_scene_receiver_config_on_enter(void* context) {
164154
subghz_setting_get_frequency_count(subghz->setting),
165155
subghz_scene_receiver_config_set_frequency,
166156
subghz);
167-
value_index = subghz_scene_receiver_config_next_frequency(subghz->txrx->frequency, subghz);
157+
value_index =
158+
subghz_scene_receiver_config_next_frequency(subghz->txrx->preset->frequency, subghz);
168159
scene_manager_set_scene_state(
169160
subghz->scene_manager, SubGhzSceneReceiverConfig, (uint32_t)item);
170161
variable_item_set_current_value_index(item, value_index);
@@ -193,13 +184,14 @@ void subghz_scene_receiver_config_on_enter(void* context) {
193184
item = variable_item_list_add(
194185
subghz->variable_item_list,
195186
"Modulation:",
196-
PRESET_COUNT,
187+
subghz_setting_get_preset_count(subghz->setting),
197188
subghz_scene_receiver_config_set_preset,
198189
subghz);
199-
value_index = subghz_scene_receiver_config_uint32_value_index(
200-
subghz->txrx->preset, preset_value, PRESET_COUNT);
190+
value_index = subghz_scene_receiver_config_next_preset(
191+
string_get_cstr(subghz->txrx->preset->name), subghz);
201192
variable_item_set_current_value_index(item, value_index);
202-
variable_item_set_current_value_text(item, preset_text[value_index]);
193+
variable_item_set_current_value_text(
194+
item, subghz_setting_get_preset_name(subghz->setting, value_index));
203195

204196
if(scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneReadRAW) !=
205197
SubGhzCustomEventManagerSet) {

applications/subghz/scenes/subghz_scene_receiver_info.c

+15-6
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,16 @@ static bool subghz_scene_receiver_info_update_parser(void* context) {
2727
subghz_protocol_decoder_base_deserialize(
2828
subghz->txrx->decoder_result,
2929
subghz_history_get_raw_data(subghz->txrx->history, subghz->txrx->idx_menu_chosen));
30-
subghz->txrx->frequency =
31-
subghz_history_get_frequency(subghz->txrx->history, subghz->txrx->idx_menu_chosen);
32-
subghz->txrx->preset =
33-
subghz_history_get_preset(subghz->txrx->history, subghz->txrx->idx_menu_chosen);
30+
31+
SubGhzPesetDefinition* preset =
32+
subghz_history_get_presset(subghz->txrx->history, subghz->txrx->idx_menu_chosen);
33+
subghz_preset_init(
34+
subghz,
35+
string_get_cstr(preset->name),
36+
preset->frequency,
37+
preset->data,
38+
preset->data_size);
39+
3440
return true;
3541
}
3642
return false;
@@ -137,8 +143,11 @@ bool subghz_scene_receiver_info_on_event(void* context, SceneManagerEvent event)
137143
subghz_tx_stop(subghz);
138144
}
139145
if(subghz->txrx->txrx_state == SubGhzTxRxStateIDLE) {
140-
subghz_begin(subghz, subghz->txrx->preset);
141-
subghz_rx(subghz, subghz->txrx->frequency);
146+
subghz_begin(
147+
subghz,
148+
subghz_setting_get_preset_data_by_name(
149+
subghz->setting, string_get_cstr(subghz->txrx->preset->name)));
150+
subghz_rx(subghz, subghz->txrx->preset->frequency);
142151
}
143152
if(subghz->txrx->hopper_state == SubGhzHopperStatePause) {
144153
subghz->txrx->hopper_state = SubGhzHopperStateRunnig;

0 commit comments

Comments
 (0)