Merge remote-tracking branch 'xMasterX/dev' into 420

This commit is contained in:
RogueMaster
2022-09-17 23:15:35 -04:00
20 changed files with 1474 additions and 1423 deletions

View File

@@ -1,13 +1,12 @@
### New changes
* Picopass plugin fixed (bug with mbedtls lib fixed by hedger in OFW PR 1742)
* PR: Fix SubGHz last used settings (PR 70 by derskythe)
* PR: Random UID for detect reader mode - changes each time when you exit NFC app and launch it (PR 69 by h4sh5)
* OFW PR: Dummy mode (aka dumb mode) (OFW PR 1739 by nminaylov)
* OFW PR: picopass se identify (OFW PR 1701 by pcunning)
* OFW PR: faploader api extension and lib fixes (OFW PR 1742 by hedger)
* Fixed all known issues with SubGHz settings (broken menu when you select last item in read and go into read raw config, issues with hopper and detect raw modes, bugs with frequency selector) (@xMasterX)
* Removed subghz last settings saving feature (may be returned in future) (caused issues with freq selector, hopper mode)
* Updated universal IR assets (by @Amec0e)
#### **DFU files no longer included in releases to avoid issues with wrong manual installation of assets - use web updater or microSD update package**
[- How to install](https://github.com/Eng1n33r/flipperzero-firmware/blob/dev/documentation/HowToInstall.md)
**Note: To avoid issues prefer installing using web updater or by self update package, all needed assets will be installed**
Self-update package (update from microSD) - `flipper-z-f7-update-(version).zip` or `.tgz` for iOS mobile app

View File

@@ -181,7 +181,7 @@ void subghz_scene_decode_raw_on_enter(void* context) {
subghz->txrx->receiver, SUBGHZ_PROTOCOL_RAW_NAME),
false);
subghz_receiver_set_filter(subghz->txrx->receiver, SubGhzProtocolFlag_Decodable);
if(decode_raw_state == SubGhzDecodeRawStateStart) {
//Decode RAW to history
subghz_history_reset(subghz->txrx->history);
@@ -225,6 +225,8 @@ bool subghz_scene_decode_raw_on_event(void* context, SceneManagerEvent event) {
subghz_file_encoder_worker_free(file_worker_encoder);
subghz->state_notifications = SubGhzNotificationStateIDLE;
scene_manager_set_scene_state(
subghz->scene_manager, SubGhzSceneReadRAW, SubGhzCustomEventManagerNoSet);
scene_manager_search_and_switch_to_previous_scene(
subghz->scene_manager, SubGhzSceneMoreRAW);
consumed = true;

View File

@@ -50,8 +50,8 @@ bool subghz_scene_need_saving_on_event(void* context, SceneManagerEvent event) {
subghz->txrx->rx_key_state = SubGhzRxKeyStateIDLE;
subghz_preset_init(
subghz,
string_get_cstr(subghz->last_setting->preset_name),
subghz->last_setting->frequency,
"AM650",
subghz_setting_get_default_frequency(subghz->setting),
NULL,
0);
scene_manager_search_and_switch_to_previous_scene(

View File

@@ -114,10 +114,6 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) {
if(event.type == SceneManagerEventTypeCustom) {
switch(event.event) {
case SubGhzCustomEventViewReadRAWBack:
// Check if return from config save values
if (subghz->current_scene == SubGhzSceneReceiverConfig) {
subghz_last_setting_save(subghz->last_setting, EXT_PATH("subghz/assets/last_used.txt"));
}
//Stop TX
if(subghz->txrx->txrx_state == SubGhzTxRxStateTx) {
subghz_tx_stop(subghz);
@@ -136,14 +132,13 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) {
if((subghz->txrx->rx_key_state == SubGhzRxKeyStateAddKey) ||
(subghz->txrx->rx_key_state == SubGhzRxKeyStateBack)) {
subghz->txrx->rx_key_state = SubGhzRxKeyStateExit;
subghz->current_scene = SubGhzSceneNeedSaving;
scene_manager_next_scene(subghz->scene_manager, SubGhzSceneNeedSaving);
} else {
//Restore default setting
subghz_preset_init(
subghz,
string_get_cstr(subghz->last_setting->preset_name),
subghz->last_setting->frequency,
"AM650",
subghz_setting_get_default_frequency(subghz->setting),
NULL,
0);
if(!scene_manager_search_and_switch_to_previous_scene(
@@ -152,11 +147,7 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) {
subghz->scene_manager, SubGhzSceneStart)) {
scene_manager_stop(subghz->scene_manager);
view_dispatcher_stop(subghz->view_dispatcher);
} else {
subghz->current_scene = SubGhzSceneStart;
}
} else {
subghz->current_scene = SubGhzSceneSaved;
}
}
consumed = true;
@@ -180,7 +171,6 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) {
case SubGhzCustomEventViewReadRAWConfig:
scene_manager_set_scene_state(
subghz->scene_manager, SubGhzSceneReadRAW, SubGhzCustomEventManagerSet);
subghz->current_scene = SubGhzSceneReceiverConfig;
scene_manager_next_scene(subghz->scene_manager, SubGhzSceneReceiverConfig);
consumed = true;
break;
@@ -202,7 +192,6 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) {
scene_manager_set_scene_state(
subghz->scene_manager, SubGhzSceneReadRAW, SubGhzCustomEventManagerSet);
subghz->txrx->rx_key_state = SubGhzRxKeyStateRAWLoad;
subghz->current_scene = SubGhzSceneMoreRAW;
scene_manager_next_scene(subghz->scene_manager, SubGhzSceneMoreRAW);
consumed = true;
} else {
@@ -222,7 +211,6 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) {
(subghz->txrx->txrx_state == SubGhzTxRxStateSleep)) {
if(!subghz_tx_start(subghz, subghz->txrx->fff_data)) {
subghz->txrx->rx_key_state = SubGhzRxKeyStateBack;
subghz->current_scene = SubGhzSceneShowOnlyRx;
scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowOnlyRx);
} else {
DOLPHIN_DEED(DolphinDeedSubGhzSend);
@@ -302,7 +290,6 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) {
case SubGhzCustomEventViewReadRAWREC:
if(subghz->txrx->rx_key_state != SubGhzRxKeyStateIDLE) {
subghz->current_scene = SubGhzSceneNeedSaving;
scene_manager_next_scene(subghz->scene_manager, SubGhzSceneNeedSaving);
} else {
uint32_t time = LL_RTC_TIME_Get(RTC); // 0x00HHMMSS
@@ -341,7 +328,6 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) {
subghz->txrx->rx_key_state = SubGhzRxKeyStateAddKey;
} else {
string_set_str(subghz->error_str, "Function requires\nan SD card.");
subghz->current_scene = SubGhzSceneShowError;
scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowError);
}
}
@@ -353,7 +339,6 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) {
scene_manager_set_scene_state(
subghz->scene_manager, SubGhzSceneReadRAW, SubGhzCustomEventManagerSetRAW);
subghz->txrx->rx_key_state = SubGhzRxKeyStateBack;
subghz->current_scene = SubGhzSceneSaveName;
scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSaveName);
}
consumed = true;

View File

@@ -1,8 +1,6 @@
#include "../subghz_i.h"
#include "../views/receiver.h"
#define TAG "SubGhzSceneReceiver"
const NotificationSequence subghz_sequence_rx = {
&message_green_255,
@@ -100,18 +98,12 @@ static void subghz_scene_add_to_history_callback(
void subghz_scene_receiver_on_enter(void* context) {
SubGhz* subghz = context;
subghz_last_setting_set_receiver_values(subghz->last_setting, subghz->txrx->receiver);
string_t str_buff;
string_init(str_buff);
if(subghz->txrx->rx_key_state == SubGhzRxKeyStateIDLE) {
subghz_preset_init(
subghz,
string_get_cstr(subghz->last_setting->preset_name),
subghz->last_setting->frequency,
NULL,
0);
subghz, "AM650", subghz_setting_get_default_frequency(subghz->setting), NULL, 0);
subghz_history_reset(subghz->txrx->history);
subghz->txrx->rx_key_state = SubGhzRxKeyStateStart;
}
@@ -143,8 +135,6 @@ void subghz_scene_receiver_on_enter(void* context) {
}
if((subghz->txrx->txrx_state == SubGhzTxRxStateIDLE) ||
(subghz->txrx->txrx_state == SubGhzTxRxStateSleep)) {
// Set values that can be reset after using DetectRAW Scene
subghz_last_setting_set_receiver_values(subghz->last_setting, subghz->txrx->receiver);
subghz_begin(
subghz,
subghz_setting_get_preset_data_by_name(
@@ -162,12 +152,6 @@ bool subghz_scene_receiver_on_event(void* context, SceneManagerEvent event) {
if(event.type == SceneManagerEventTypeCustom) {
switch(event.event) {
case SubGhzCustomEventViewReceiverBack:
// Check if return from config save values
if(subghz->current_scene == SubGhzSceneReceiverConfig) {
//FURI_LOG_I(TAG, "Raw value: %d", subghz->last_setting->detect_raw);
subghz_last_setting_save(
subghz->last_setting, EXT_PATH("subghz/assets/last_used.txt"));
}
// Stop CC1101 Rx
subghz->state_notifications = SubGhzNotificationStateIDLE;
if(subghz->txrx->txrx_state == SubGhzTxRxStateRx) {
@@ -180,17 +164,15 @@ bool subghz_scene_receiver_on_event(void* context, SceneManagerEvent event) {
if(subghz->txrx->rx_key_state == SubGhzRxKeyStateAddKey) {
subghz->txrx->rx_key_state = SubGhzRxKeyStateExit;
subghz->current_scene = SubGhzSceneNeedSaving;
scene_manager_next_scene(subghz->scene_manager, SubGhzSceneNeedSaving);
} else {
subghz->txrx->rx_key_state = SubGhzRxKeyStateIDLE;
subghz_preset_init(
subghz,
string_get_cstr(subghz->last_setting->preset_name),
subghz->last_setting->frequency,
"AM650",
subghz_setting_get_default_frequency(subghz->setting),
NULL,
0);
subghz->current_scene = SubGhzSceneStart;
scene_manager_search_and_switch_to_previous_scene(
subghz->scene_manager, SubGhzSceneStart);
}
@@ -199,7 +181,6 @@ bool subghz_scene_receiver_on_event(void* context, SceneManagerEvent event) {
case SubGhzCustomEventViewReceiverOK:
subghz->txrx->idx_menu_chosen =
subghz_view_receiver_get_idx_menu(subghz->subghz_receiver);
subghz->current_scene = SubGhzSceneReceiverInfo;
scene_manager_next_scene(subghz->scene_manager, SubGhzSceneReceiverInfo);
consumed = true;
break;
@@ -207,10 +188,6 @@ bool subghz_scene_receiver_on_event(void* context, SceneManagerEvent event) {
subghz->state_notifications = SubGhzNotificationStateIDLE;
subghz->txrx->idx_menu_chosen =
subghz_view_receiver_get_idx_menu(subghz->subghz_receiver);
scene_manager_set_scene_state(
subghz->scene_manager, SubGhzViewIdReceiver, SubGhzCustomEventManagerSet);
subghz->current_scene = SubGhzSceneReceiverConfig;
//FURI_LOG_I(TAG, "Raw value: %d", subghz->last_setting->detect_raw);
scene_manager_next_scene(subghz->scene_manager, SubGhzSceneReceiverConfig);
consumed = true;
break;
@@ -250,8 +227,5 @@ bool subghz_scene_receiver_on_event(void* context, SceneManagerEvent event) {
}
void subghz_scene_receiver_on_exit(void* context) {
SubGhz* subghz = context;
//filter restoration
subghz_receiver_set_filter(subghz->txrx->receiver, SubGhzProtocolFlag_Decodable);
UNUSED(context);
}

View File

@@ -2,8 +2,6 @@
#include <lib/subghz/protocols/raw.h>
#define TAG "SubGhzSceneReceiverConfig"
enum SubGhzSettingIndex {
SubGhzSettingIndexFrequency,
SubGhzSettingIndexHopping,
@@ -147,8 +145,6 @@ static void subghz_scene_receiver_config_set_frequency(VariableItem* item) {
(subghz_setting_get_frequency(subghz->setting, index) % 1000000) / 10000);
variable_item_set_current_value_text(item, text_buf);
subghz->txrx->preset->frequency = subghz_setting_get_frequency(subghz->setting, index);
subghz->last_setting->frequency = subghz->txrx->preset->frequency;
subghz_setting_set_default_frequency(subghz->setting, subghz->txrx->preset->frequency);
} else {
variable_item_set_current_value_index(
item, subghz_setting_get_frequency_default_index(subghz->setting));
@@ -158,13 +154,11 @@ static void subghz_scene_receiver_config_set_frequency(VariableItem* item) {
static void subghz_scene_receiver_config_set_preset(VariableItem* item) {
SubGhz* subghz = variable_item_get_context(item);
uint8_t index = variable_item_get_current_value_index(item);
const char* preset_name = subghz_setting_get_preset_name(subghz->setting, index);
variable_item_set_current_value_text(item, preset_name);
string_set_str(subghz->last_setting->preset_name, preset_name);
variable_item_set_current_value_text(
item, subghz_setting_get_preset_name(subghz->setting, index));
subghz_preset_init(
subghz,
preset_name,
subghz_setting_get_preset_name(subghz->setting, index),
subghz->txrx->preset->frequency,
subghz_setting_get_preset_data(subghz->setting, index),
subghz_setting_get_preset_data_size(subghz->setting, index));
@@ -179,7 +173,6 @@ static void subghz_scene_receiver_config_set_rssi_threshold(VariableItem* item)
subghz_receiver_search_decoder_base_by_name(
subghz->txrx->receiver, SUBGHZ_PROTOCOL_RAW_NAME),
rssi_threshold_value[index]);
subghz->last_setting->rssi_threshold = rssi_threshold_value[index];
}
static void subghz_scene_receiver_config_set_detect_raw(VariableItem* item) {
@@ -188,7 +181,6 @@ static void subghz_scene_receiver_config_set_detect_raw(VariableItem* item) {
variable_item_set_current_value_text(item, detect_raw_text[index]);
subghz_receiver_set_filter(subghz->txrx->receiver, detect_raw_value[index]);
subghz->last_setting->detect_raw = detect_raw_value[index];
subghz_protocol_decoder_raw_set_auto_mode(
subghz_receiver_search_decoder_base_by_name(
@@ -230,7 +222,6 @@ static void subghz_scene_receiver_config_set_hopping_running(VariableItem* item)
}
subghz->txrx->hopper_state = hopping_value[index];
subghz->last_setting->hopping = hopping_value[index];
}
static void subghz_scene_receiver_config_var_list_enter_callback(void* context, uint32_t index) {
@@ -244,9 +235,6 @@ static void subghz_scene_receiver_config_var_list_enter_callback(void* context,
void subghz_scene_receiver_config_on_enter(void* context) {
SubGhz* subghz = context;
subghz_last_setting_set_receiver_values(subghz->last_setting, subghz->txrx->receiver);
VariableItem* item;
uint8_t value_index;
@@ -270,6 +258,20 @@ void subghz_scene_receiver_config_on_enter(void* context) {
(subghz_setting_get_frequency(subghz->setting, value_index) % 1000000) / 10000);
variable_item_set_current_value_text(item, text_buf);
if(scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneReadRAW) !=
SubGhzCustomEventManagerSet) {
item = variable_item_list_add(
subghz->variable_item_list,
"Hopping:",
HOPPING_COUNT,
subghz_scene_receiver_config_set_hopping_running,
subghz);
value_index = subghz_scene_receiver_config_hopper_value_index(
subghz->txrx->hopper_state, hopping_value, HOPPING_COUNT, subghz);
variable_item_set_current_value_index(item, value_index);
variable_item_set_current_value_text(item, hopping_text[value_index]);
}
item = variable_item_list_add(
subghz->variable_item_list,
"Modulation:",
@@ -284,17 +286,6 @@ void subghz_scene_receiver_config_on_enter(void* context) {
if(scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneReadRAW) !=
SubGhzCustomEventManagerSet) {
item = variable_item_list_add(
subghz->variable_item_list,
"Hopping:",
HOPPING_COUNT,
subghz_scene_receiver_config_set_hopping_running,
subghz);
value_index = subghz_scene_receiver_config_hopper_value_index(
subghz->txrx->hopper_state, hopping_value, HOPPING_COUNT, subghz);
variable_item_set_current_value_index(item, value_index);
variable_item_set_current_value_text(item, hopping_text[value_index]);
item = variable_item_list_add(
subghz->variable_item_list,
"Detect Raw:",
@@ -307,7 +298,10 @@ void subghz_scene_receiver_config_on_enter(void* context) {
DETECT_RAW_COUNT);
variable_item_set_current_value_index(item, value_index);
variable_item_set_current_value_text(item, detect_raw_text[value_index]);
}
if(scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneReadRAW) !=
SubGhzCustomEventManagerSet) {
item = variable_item_list_add(
subghz->variable_item_list,
"RSSI for Raw:",
@@ -321,7 +315,10 @@ void subghz_scene_receiver_config_on_enter(void* context) {
RSSI_THRESHOLD_COUNT);
variable_item_set_current_value_index(item, value_index);
variable_item_set_current_value_text(item, rssi_threshold_text[value_index]);
}
if(scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneReadRAW) !=
SubGhzCustomEventManagerSet) {
variable_item_list_add(subghz->variable_item_list, "Lock Keyboard", 1, NULL, NULL);
variable_item_list_set_enter_callback(
subghz->variable_item_list,
@@ -348,6 +345,7 @@ bool subghz_scene_receiver_config_on_event(void* context, SceneManagerEvent even
void subghz_scene_receiver_config_on_exit(void* context) {
SubGhz* subghz = context;
variable_item_list_set_selected_item(subghz->variable_item_list, 0);
variable_item_list_reset(subghz->variable_item_list);
scene_manager_set_scene_state(
subghz->scene_manager, SubGhzSceneReadRAW, SubGhzCustomEventManagerNoSet);

View File

@@ -1,5 +1,7 @@
#include "../subghz_i.h"
#include <lib/subghz/protocols/raw.h>
enum SubmenuIndex {
SubmenuIndexRead = 10,
SubmenuIndexSaved,
@@ -19,6 +21,12 @@ void subghz_scene_start_on_enter(void* context) {
if(subghz->state_notifications == SubGhzNotificationStateStarting) {
subghz->state_notifications = SubGhzNotificationStateIDLE;
}
subghz_protocol_decoder_raw_set_auto_mode(
subghz_receiver_search_decoder_base_by_name(
subghz->txrx->receiver, SUBGHZ_PROTOCOL_RAW_NAME),
false);
subghz_receiver_set_filter(subghz->txrx->receiver, SubGhzProtocolFlag_Decodable);
submenu_add_item(
subghz->submenu, "Read", SubmenuIndexRead, subghz_scene_start_submenu_callback, subghz);
submenu_add_item(

View File

@@ -174,25 +174,16 @@ SubGhz* subghz_alloc() {
subghz->setting = subghz_setting_alloc();
subghz_setting_load(subghz->setting, EXT_PATH("subghz/assets/setting_user.txt"));
// Load last used values for Read, Read RAW, etc. or default
subghz->last_setting = subghz_last_setting_alloc();
subghz_last_setting_load(subghz->last_setting, EXT_PATH("subghz/assets/last_used.txt"));
subghz_setting_set_default_frequency(subghz->setting, subghz->last_setting->frequency);
//init Worker & Protocol & History & KeyBoard
subghz->lock = SubGhzLockOff;
subghz->txrx = malloc(sizeof(SubGhzTxRx));
subghz->txrx->preset = malloc(sizeof(SubGhzPresetDefinition));
string_init(subghz->txrx->preset->name);
subghz_preset_init(
subghz,
string_get_cstr(subghz->last_setting->preset_name),
subghz->last_setting->frequency,
NULL,
0);
subghz, "AM650", subghz_setting_get_default_frequency(subghz->setting), NULL, 0);
subghz->txrx->txrx_state = SubGhzTxRxStateSleep;
subghz->txrx->hopper_state = subghz->last_setting->hopping;
subghz->txrx->hopper_state = SubGhzHopperStateOFF;
subghz->txrx->rx_key_state = SubGhzRxKeyStateIDLE;
subghz->txrx->history = subghz_history_alloc();
subghz->txrx->worker = subghz_worker_alloc();
@@ -205,9 +196,7 @@ SubGhz* subghz_alloc() {
subghz_environment_set_nice_flor_s_rainbow_table_file_name(
subghz->txrx->environment, EXT_PATH("subghz/assets/nice_flor_s"));
subghz->txrx->receiver = subghz_receiver_alloc_init(subghz->txrx->environment);
// Setup values
subghz_last_setting_set_receiver_values(subghz->last_setting, subghz->txrx->receiver);
subghz_receiver_set_filter(subghz->txrx->receiver, SubGhzProtocolFlag_Decodable);
subghz_worker_set_overrun_callback(
subghz->txrx->worker, (SubGhzWorkerOverrunCallback)subghz_receiver_reset);
@@ -299,9 +288,6 @@ void subghz_free(SubGhz* subghz) {
//setting
subghz_setting_free(subghz->setting);
// Last setting
subghz_last_setting_free(subghz->last_setting);
//Worker & Protocol & History
subghz_receiver_free(subghz->txrx->receiver);
subghz_environment_free(subghz->txrx->environment);

View File

@@ -1,5 +1,7 @@
#include "subghz_history.h"
#include <lib/subghz/receiver.h>
#include <furi.h>
#include <m-string.h>
#define SUBGHZ_HISTORY_MAX 99
#define TAG "SubGhzHistory"
@@ -37,9 +39,15 @@ SubGhzHistory* subghz_history_alloc(void) {
void subghz_history_free(SubGhzHistory* instance) {
furi_assert(instance);
// Call method instead of code duplicate
subghz_history_reset(instance);
string_clear(instance->tmp_string);
for
M_EACH(item, instance->history->data, SubGhzHistoryItemArray_t) {
string_clear(item->item_str);
string_clear(item->preset->name);
free(item->preset);
flipper_format_free(item->flipper_string);
item->type = 0;
}
SubGhzHistoryItemArray_clear(instance->history->data);
free(instance->history);
free(instance);
@@ -133,22 +141,16 @@ bool subghz_history_add_to_history(
furi_assert(instance);
furi_assert(context);
if(instance->last_index_write >= SUBGHZ_HISTORY_MAX) {
FURI_LOG_W(TAG, "Out of history slots!");
return false;
}
if(instance->last_index_write >= SUBGHZ_HISTORY_MAX) return false;
SubGhzProtocolDecoderBase* decoder_base = context;
if((instance->code_last_hash_data ==
subghz_protocol_decoder_base_get_hash_data(decoder_base)) &&
((furi_get_tick() - instance->last_update_timestamp) < 500)) {
//FURI_LOG_W(TAG, "Too short period for add");
instance->last_update_timestamp = furi_get_tick();
return false;
}
//FURI_LOG_I(TAG, "Add to history. Total: %d", instance->last_index_write + 1);
instance->code_last_hash_data = subghz_protocol_decoder_base_get_hash_data(decoder_base);
instance->last_update_timestamp = furi_get_tick();

View File

@@ -33,7 +33,6 @@
#include "subghz_history.h"
#include "subghz_setting.h"
#include "subghz_last_setting.h"
#include <gui/modules/variable_item_list.h>
#include <lib/toolbox/path.h>
@@ -101,11 +100,10 @@ struct SubGhz {
SubGhzTestPacket* subghz_test_packet;
string_t error_str;
SubGhzSetting* setting;
SubGhzLastSetting* last_setting;
SubGhzLock lock;
bool in_decoder_scene;
SubGhzScene current_scene;
void* rpc_ctx;
};

View File

@@ -1,140 +0,0 @@
#include "subghz_setting.h"
#include "subghz_i.h"
#include "subghz_last_setting.h"
#include <furi.h>
#include <m-list.h>
#include <furi_hal_subghz.h>
#include <furi_hal_subghz_configs.h>
#include <lib/subghz/protocols/raw.h>
#define TAG "SubGhzLastSetting"
#define SUBGHZ_LAST_SETTING_FILE_TYPE "Flipper SubGhz Last Setting File"
#define SUBGHZ_LAST_SETTING_FILE_VERSION 1
#define SUBGHZ_LAST_SETTING_DEFAULT_PRESET "AM650"
#define SUBGHZ_LAST_SETTING_DEFAULT_FREQUENCY 433920000
SubGhzLastSetting* subghz_last_setting_alloc(void) {
SubGhzLastSetting* instance = malloc(sizeof(SubGhzLastSetting));
string_init(instance->preset_name);
return instance;
}
void subghz_last_setting_free(SubGhzLastSetting* instance) {
furi_assert(instance);
string_clear(instance->preset_name);
free(instance);
}
void subghz_last_setting_load(SubGhzLastSetting* instance, const char* file_path) {
furi_assert(instance);
string_init(instance->preset_name);
Storage* storage = furi_record_open(RECORD_STORAGE);
FlipperFormat* fff_data_file = flipper_format_file_alloc(storage);
string_t temp_preset;
string_init(temp_preset);
uint32_t temp_frequency = 0; // Default 433920000
uint32_t temp_hopping = 0; // Default 0
uint32_t temp_detect_raw = 0; // Default 2
int32_t temp_rssi_threshold = 0; // Default -72
if(FSE_OK == storage_sd_status(storage) && file_path &&
flipper_format_file_open_existing(fff_data_file, file_path)) {
flipper_format_read_string(fff_data_file, "Preset", temp_preset);
flipper_format_read_uint32(fff_data_file, "Frequency", (uint32_t*)&temp_frequency, 1);
flipper_format_read_uint32(fff_data_file, "Hopping", (uint32_t*)&temp_hopping, 1);
flipper_format_read_uint32(fff_data_file, "DetectRaw", (uint32_t*)&temp_detect_raw, 1);
flipper_format_read_int32(fff_data_file, "Rssi", (int32_t*)&temp_rssi_threshold, 1);
} else {
FURI_LOG_E(TAG, "Error open file %s", file_path);
}
if(string_empty_p(temp_preset)) {
FURI_LOG_D(TAG, "Last used preset not found");
string_set(instance->preset_name, SUBGHZ_LAST_SETTING_DEFAULT_PRESET);
} else {
string_set(instance->preset_name, temp_preset);
}
if(temp_frequency == 0 || !furi_hal_subghz_is_tx_allowed(temp_frequency)) {
FURI_LOG_D(TAG, "Last used frequency not found or can't be used!");
instance->frequency = SUBGHZ_LAST_SETTING_DEFAULT_FREQUENCY;
} else {
instance->frequency = temp_frequency;
}
if(temp_detect_raw == 0) {
instance->detect_raw = SubGhzProtocolFlag_Decodable;
} else {
instance->detect_raw = temp_detect_raw;
}
if(temp_rssi_threshold == 0) {
instance->rssi_threshold = -72;
} else {
instance->rssi_threshold = temp_rssi_threshold;
}
instance->hopping = temp_hopping;
string_clear(temp_preset);
flipper_format_free(fff_data_file);
furi_record_close(RECORD_STORAGE);
}
bool subghz_last_setting_save(SubGhzLastSetting* instance, const char* file_path) {
furi_assert(instance);
bool saved = false;
Storage* storage = furi_record_open(RECORD_STORAGE);
FlipperFormat* file = flipper_format_file_alloc(storage);
do {
if(FSE_OK != storage_sd_status(storage)) break;
// Open file
if(!flipper_format_file_open_always(file, file_path)) break;
// Write header
if(!flipper_format_write_header_cstr(
file, SUBGHZ_LAST_SETTING_FILE_TYPE, SUBGHZ_LAST_SETTING_FILE_VERSION))
break;
//FURI_LOG_D(TAG, "Preset %s", string_get_cstr(instance->preset_name));
if(!flipper_format_insert_or_update_string_cstr(
file, "Preset", string_get_cstr(instance->preset_name)))
break;
if(!flipper_format_insert_or_update_uint32(file, "Frequency", &instance->frequency, 1))
break;
if(!flipper_format_insert_or_update_uint32(file, "Hopping", &instance->hopping, 1)) break;
if(!flipper_format_insert_or_update_uint32(file, "DetectRaw", &instance->detect_raw, 1))
break;
if(!flipper_format_insert_or_update_int32(file, "Rssi", &instance->rssi_threshold, 1))
break;
saved = true;
} while(0);
if(!saved) {
FURI_LOG_E(TAG, "Error save file %s", file_path);
}
flipper_format_free(file);
furi_record_close(RECORD_STORAGE);
return saved;
}
void subghz_last_setting_set_receiver_values(SubGhzLastSetting* instance, SubGhzReceiver* receiver) {
SubGhzProtocolDecoderBase* protocolDecoderBase =
subghz_receiver_search_decoder_base_by_name(receiver, SUBGHZ_PROTOCOL_RAW_NAME);
subghz_receiver_set_filter(receiver, instance->detect_raw);
subghz_protocol_decoder_raw_set_auto_mode(
protocolDecoderBase, (instance->detect_raw != SubGhzProtocolFlag_Decodable));
subghz_protocol_decoder_raw_set_rssi_threshold(protocolDecoderBase, instance->rssi_threshold);
}

View File

@@ -1,24 +0,0 @@
#pragma once
#include <math.h>
#include <furi.h>
#include <furi_hal.h>
#include <lib/flipper_format/flipper_format.h>
typedef struct {
string_t preset_name;
uint32_t frequency;
uint32_t hopping;
uint32_t detect_raw;
int32_t rssi_threshold;
} SubGhzLastSetting;
SubGhzLastSetting* subghz_last_setting_alloc(void);
void subghz_last_setting_free(SubGhzLastSetting* instance);
void subghz_last_setting_load(SubGhzLastSetting* instance, const char* file_path);
bool subghz_last_setting_save(SubGhzLastSetting* instance, const char* file_path);
void subghz_last_setting_set_receiver_values(SubGhzLastSetting* instance, SubGhzReceiver* receiver);

View File

@@ -260,7 +260,13 @@ void subghz_setting_load(SubGhzSetting* instance, const char* file_path) {
break;
}
if(flipper_format_read_uint32(fff_data_file, "Default_frequency", &temp_data32, 1)) {
subghz_setting_set_default_frequency(instance, temp_data32);
for
M_EACH(frequency, instance->frequencies, FrequencyList_t) {
*frequency &= FREQUENCY_MASK;
if(*frequency == temp_data32) {
*frequency |= FREQUENCY_FLAG_DEFAULT;
}
}
}
// custom preset (optional)
@@ -288,16 +294,6 @@ void subghz_setting_load(SubGhzSetting* instance, const char* file_path) {
}
}
void subghz_setting_set_default_frequency(SubGhzSetting* instance, uint32_t frequency_to_setup) {
for
M_EACH(frequency, instance->frequencies, FrequencyList_t) {
*frequency &= FREQUENCY_MASK;
if(*frequency == frequency_to_setup) {
*frequency |= FREQUENCY_FLAG_DEFAULT;
}
}
}
size_t subghz_setting_get_frequency_count(SubGhzSetting* instance) {
furi_assert(instance);
return FrequencyList_size(instance->frequencies);

View File

@@ -46,5 +46,3 @@ uint32_t subghz_setting_get_hopper_frequency(SubGhzSetting* instance, size_t idx
uint32_t subghz_setting_get_frequency_default_index(SubGhzSetting* instance);
uint32_t subghz_setting_get_default_frequency(SubGhzSetting* instance);
void subghz_setting_set_default_frequency(SubGhzSetting* instance, uint32_t frequency_to_setup);

View File

@@ -340,7 +340,6 @@ bool subghz_view_receiver_input(InputEvent* event, void* context) {
return true;
});
} else if(event->key == InputKeyLeft && event->type == InputTypeShort) {
//Config receiver
subghz_receiver->callback(SubGhzCustomEventViewReceiverConfig, subghz_receiver->context);
} else if(event->key == InputKeyOk && event->type == InputTypeShort) {
with_view_model(

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,332 +1,356 @@
Filetype: IR library file
Version: 1
# Last Updated 8th Sep, 2022
#
# Last Updated 17th Sept, 2022
#
# ON
name: POWER
type: raw
frequency: 38000
duty_cycle: 0.330000
data: 529 7218 126 6585 219 703 180 5362 427 18618 177
#
name: VOL+
type: raw
frequency: 38000
duty_cycle: 0.330000
data: 9069 4362 622 486 621 487 621 491 622 1608 623 1603 622 487 621 487 621 491 622 1604 621 487 622 491 622 1604 621 491 622 1608 622 1609 621 1604 622 486 622 487 621 491 621 1605 621 487 621 491 622 1604 622 491 621 1609 621 1609 621 1604 622 491 621 1609 622 1604 621 491 621 1604 622 487 621 487 622 486 622 487 621 488 621 487 621 488 620 491 621 1609 622 1609 620 1609 621 1609 621 1609 621 1609 621 1609 621 1618 621 14330 9047 2137 620
#
name: VOL-
type: raw
frequency: 38000
duty_cycle: 0.330000
data: 9047 4362 621 486 622 463 645 490 622 1609 622 1604 622 487 620 487 621 491 622 1604 622 484 625 490 621 1605 649 463 621 1609 620 1611 621 1608 622 1605 621 486 622 491 622 1604 621 487 621 492 620 1604 621 488 621 492 620 1609 622 1604 621 492 622 1609 620 1605 621 491 622 1603 622 488 621 488 620 488 620 488 621 488 620 487 622 485 621 492 596 1635 621 1609 622 1585 643 1611 620 1608 621 1610 619 1611 620 1619 619 14332 9074 2109 647
#
name: MUTE
type: raw
frequency: 38000
duty_cycle: 0.330000
data: 9073 4336 648 461 647 484 624 489 623 1607 623 1603 622 486 622 486 622 491 622 1604 621 487 621 491 622 1604 622 491 621 1609 621 1609 621 1609 621 1608 622 1609 621 1604 621 486 622 486 622 491 622 1604 622 486 622 487 621 487 621 491 622 1608 622 1609 621 1604 622 491 621 1604 621 487 621 486 622 487 621 487 621 487 621 487 621 487 621 491 622 1608 622 1608 622 1609 621 1608 622 1608 622 1608 622 1609 621 1617 622 14330 9047 2137 620
# ON
name: POWER
type: parsed
protocol: NECext
address: 83 F4 00 00
command: 4F B0 00 00
#
#
name: POWER
type: parsed
protocol: NECext
address: 80 19 00 00
command: 10 EF 00 00
#
#
name: VOL+
type: parsed
protocol: NECext
address: 80 19 00 00
command: 1C E3 00 00
#
#
name: VOL-
type: parsed
protocol: NECext
address: 80 19 00 00
command: 46 B9 00 00
#
#
name: POWER
type: parsed
protocol: NEC
address: 80 00 00 00
command: 51 00 00 00
#
#
name: POWER
type: parsed
protocol: NECext
address: 40 40 00 00
command: 0A F5 00 00
#
#
name: POWER
type: parsed
protocol: NECext
address: 00 30 00 00
command: 4E B1 00 00
#
#
name: VOL+
type: parsed
protocol: NECext
address: 00 30 00 00
command: 0E F1 00 00
#
#
name: VOL-
type: parsed
protocol: NECext
address: 00 30 00 00
command: 0D F2 00 00
#
#
name: POWER
type: parsed
protocol: NECext
address: 00 30 00 00
command: 4F B0 00 00
#
#
name: MUTE
type: parsed
protocol: NECext
address: 00 30 00 00
command: 14 EB 00 00
#
#
name: POWER
type: parsed
protocol: NECext
address: 08 16 00 00
command: 87 78 00 00
#
#
name: MUTE
type: parsed
protocol: NECext
address: 08 16 00 00
command: C8 37 00 00
#
#
name: POWER
type: parsed
protocol: NEC
address: 01 00 00 00
command: 01 00 00 00
#
#
name: MUTE
type: parsed
protocol: NEC
address: 01 00 00 00
command: 02 00 00 00
#
#
name: VOL+
type: parsed
protocol: NEC
address: 01 00 00 00
command: 28 00 00 00
#
#
name: VOL-
type: parsed
protocol: NEC
address: 01 00 00 00
command: 29 00 00 00
#
#
name: POWER
type: parsed
protocol: NECext
address: 84 F4 00 00
command: 0B F4 00 00
#
#
name: POWER
type: parsed
protocol: NECext
address: 33 00 00 00
command: 00 FF 00 00
#
#
name: VOL-
type: parsed
protocol: NECext
address: 33 00 00 00
command: 1E E1 00 00
#
#
name: VOL+
type: parsed
protocol: NECext
address: 33 00 00 00
command: 1D E2 00 00
#
#
name: MUTE
type: parsed
protocol: NECext
address: 33 00 00 00
command: 0B F4 00 00
#
#
name: POWER
type: parsed
protocol: NECext
address: 83 55 00 00
command: 90 6F 00 00
#
#
name: VOL-
type: parsed
protocol: NECext
address: 83 55 00 00
command: 99 66 00 00
#
#
name: VOL+
type: parsed
protocol: NECext
address: 83 55 00 00
command: 98 67 00 00
#
#
name: POWER
type: parsed
protocol: NECext
address: 00 DF 00 00
command: 1C E3 00 00
#
#
name: VOL-
type: parsed
protocol: NECext
address: 00 DF 00 00
command: 4F B0 00 00
#
#
name: VOL+
type: parsed
protocol: NECext
address: 00 DF 00 00
command: 4B B4 00 00
#
#
name: POWER
type: parsed
protocol: NEC
address: 32 00 00 00
command: 02 00 00 00
#
#
name: POWER
type: parsed
protocol: NEC
address: 32 00 00 00
command: 2E 00 00 00
#
#
name: MUTE
type: parsed
protocol: NEC
address: 32 00 00 00
command: 52 00 00 00
#
#
name: POWER
type: parsed
protocol: NEC
address: 20 00 00 00
command: 41 00 00 00
#
#
name: VOL+
type: parsed
protocol: NEC
address: 20 00 00 00
command: 51 00 00 00
#
#
name: VOL-
type: parsed
protocol: NEC
address: 20 00 00 00
command: 56 00 00 00
#
#
name: MUTE
type: parsed
protocol: NEC
address: 20 00 00 00
command: 5A 00 00 00
#
#
name: POWER
type: parsed
protocol: SIRC15
address: 54 00 00 00
command: 15 00 00 00
#
#
name: VOL+
type: parsed
protocol: NECext
address: 83 F4 00 00
command: 82 7D 00 00
#
#
name: VOL-
type: parsed
protocol: NECext
address: 83 F4 00 00
command: 83 7C 00 00
#
#
name: MUTE
type: parsed
protocol: NECext
address: 83 F4 00 00
command: 14 EB 00 00
#
#
name: POWER
type: parsed
protocol: NEC
address: 31 00 00 00
command: 91 00 00 00
#
#
name: POWER
type: parsed
protocol: NEC
address: 31 00 00 00
command: 90 00 00 00
#
#
name: VOL+
type: parsed
protocol: NEC
address: 31 00 00 00
command: D0 00 00 00
#
#
name: MUTE
type: parsed
protocol: NEC
address: 31 00 00 00
command: 89 00 00 00
#
#
name: POWER
type: parsed
protocol: NECext
address: 86 00 00 00
command: 00 00 00 00
#
#
name: VOL+
type: parsed
protocol: NECext
address: 86 00 00 00
command: 30 00 00 00
#
#
name: VOL-
type: parsed
protocol: NECext
address: 86 00 00 00
command: 31 00 00 00
#
#
name: MUTE
type: parsed
protocol: NECext
address: 86 00 00 00
command: 32 00 00 00
#
#
name: POWER
type: parsed
protocol: NECext
address: 30 00 00 00
command: 00 00 00 00
#
#
name: POWER
type: parsed
protocol: NECext
address: 87 4E 00 00
command: 0D 00 00 00
#
#
name: POWER
type: raw
frequency: 38000
duty_cycle: 0.330000
data: 9032 4479 597 560 572 558 564 566 566 1666 589 1671 594 562 570 560 562 568 564 1669 596 560 562 568 564 1669 596 560 562 1671 594 1666 588 1671 594 562 570 560 562 568 564 1669 596 560 562 568 564 566 566 563 569 1664 591 1669 596 1664 590 565 567 1667 598 1661 593 1666 588 1671 594 562 570 560 562 568 564 565 567 563 569 560 562 568 564 565 567 1666 588 1671 594 1665 589 1670 595 1665 590 1669 596 1664 590 1668 597 13983 9029 2222 599 96237 9030 2221 589 96244 9034 2217 594 96244 9033 2218 592 96249 9038 2213 597 96239 9037 2214 596 96238 9028 2223 598 96221 9032 2215 595
#
#
name: VOL+
type: raw
frequency: 38000
duty_cycle: 0.330000
data: 9034 4482 593 563 569 561 571 559 563 1698 566 1694 570 559 563 568 564 566 566 1695 569 560 572 559 563 1671 593 563 569 1692 562 1671 593 1693 571 558 564 567 565 565 567 1693 571 532 590 567 565 1695 569 560 562 1698 566 1694 570 1663 591 539 593 1693 571 1688 566 564 568 1691 563 567 565 565 567 563 569 561 571 559 563 567 565 565 567 563 569 1690 564 1695 569 1691 563 1696 568 1691 563 1697 567 1692 562 1697 567 13988 9030 2223 597 96250 9035 2219 591 96245 9032 2221 589 96240 9038 2215 595 96235 9033 2220 590
#
#
name: VOL-
type: raw
frequency: 38000
duty_cycle: 0.330000
data: 9028 4482 593 563 569 561 571 558 564 1696 568 1690 564 566 566 563 569 561 571 1688 566 563 569 561 571 1688 566 563 569 1690 564 1695 569 1689 565 1668 596 560 562 568 564 1695 569 560 562 568 564 1695 569 560 562 568 564 1695 569 1690 564 566 566 1692 572 1687 567 563 569 1690 564 566 566 564 568 562 570 559 563 567 565 565 567 562 570 560 562 1696 568 1665 589 1670 594 1665 589 1670 594 1664 590 1669 647 1612 590 13987 9031 2220 590 96223 9033 2217 593 96223 9034 2218 592 96225 9032 2219 591 96221 9087 2164 595
#
#
name: MUTE
type: raw
frequency: 38000
duty_cycle: 0.330000
data: 9031 4479 596 560 572 558 564 566 566 1693 571 1688 566 563 569 561 571 559 563 1696 568 561 571 559 563 1697 567 562 570 1689 565 1694 570 1688 566 1693 571 1661 593 1693 571 558 564 566 566 564 568 1691 563 541 591 564 568 562 570 560 562 1697 567 1692 562 1696 568 562 570 1689 565 564 568 561 571 559 563 567 565 564 568 562 570 560 562 567 565 1694 570 1689 565 1694 570 1688 566 1693 571 1688 566 1693 571 1662 592 13987 9031 2220 590 96231 9034 2217 593 96234 9030 2222 588 96247 9037 2215 595
#
#
name: VOL+
type: parsed
protocol: NEC
address: 32 00 00 00
command: 11 00 00 00
#
#
name: VOL-
type: parsed
protocol: NEC
@@ -338,22 +362,52 @@ type: parsed
protocol: NECext
address: 83 F4 00 00
command: 4E B1 00 00
#
#
name: POWER
type: parsed
protocol: NEC
address: 03 00 00 00
command: 1D 00 00 00
#
#
name: VOL+
type: parsed
protocol: NEC
address: 03 00 00 00
command: 11 00 00 00
#
#
name: VOL-
type: parsed
protocol: NEC
address: 03 00 00 00
command: 15 00 00 00
#
# OFF
name: POWER
type: raw
frequency: 38000
duty_cycle: 0.330000
data: 9075 4307 677 433 675 456 651 461 651 1579 650 1576 649 459 649 460 648 465 648 1578 647 461 622 491 622 1604 647 465 647 1583 622 1608 647 1579 647 461 647 466 622 1604 647 465 647 1579 647 461 645 463 648 465 648 1583 646 1580 646 466 647 1579 622 491 647 1583 622 1608 647 1579 647 461 647 461 622 486 622 486 647 461 647 462 646 462 622 491 646 1584 622 1608 647 1584 621 1608 647 1583 646 1584 647 1584 646 1592 622 14330 9047 2137 621
#
name: POWER
type: parsed
protocol: Samsung32
address: 07 00 00 00
command: E6 00 00 00
#
name: VOL+
type: parsed
protocol: Samsung32
address: 07 00 00 00
command: 07 00 00 00
#
name: VOL-
type: parsed
protocol: Samsung32
address: 07 00 00 00
command: 0B 00 00 00
#
name: MUTE
type: parsed
protocol: Samsung32
address: 07 00 00 00
command: 0F 00 00 00
#

File diff suppressed because it is too large Load Diff