From 0111d85236d4411d58521af176e7cad02bb8b5e4 Mon Sep 17 00:00:00 2001 From: Sil <94360907+Sil333033@users.noreply.github.com> Date: Wed, 20 Mar 2024 02:00:46 +0100 Subject: [PATCH] SubGHz: Manual region bypass (#47) * Subghz: brought back manual region bypass * MNTM: change frequency check this allows to add "extended" frequencies to your custom added frequencies * MNTM: reboot when changing extended frequencies * Fix regio typo * Show bypass before extend * Consistency with OFW and UL api for region, version, otp * Fix API symbols * Restrict only on TX * Oops * Improve bypass/extend UI --------- Co-authored-by: Willy-JL <49810075+Willy-JL@users.noreply.github.com> --- applications/main/momentum_app/momentum_app.c | 3 + applications/main/momentum_app/momentum_app.h | 1 + .../scenes/momentum_app_scene_protocols.c | 31 ++++- .../main/subghz/subghz_extended_freq.c | 3 + applications/settings/about/about.c | 2 +- targets/f7/api_symbols.csv | 1 + targets/f7/furi_hal/furi_hal.c | 1 + targets/f7/furi_hal/furi_hal_region.c | 122 +++++++++++++++--- targets/f7/furi_hal/furi_hal_region_i.h | 5 + targets/f7/furi_hal/furi_hal_subghz.c | 17 ++- targets/f7/furi_hal/furi_hal_subghz_i.h | 4 +- targets/f7/furi_hal/furi_hal_version.c | 16 +-- targets/furi_hal_include/furi_hal_region.h | 3 + targets/furi_hal_include/furi_hal_version.h | 12 +- 14 files changed, 186 insertions(+), 35 deletions(-) create mode 100644 targets/f7/furi_hal/furi_hal_region_i.h diff --git a/applications/main/momentum_app/momentum_app.c b/applications/main/momentum_app/momentum_app.c index d1ff7d6208..362caf64ac 100644 --- a/applications/main/momentum_app/momentum_app.c +++ b/applications/main/momentum_app/momentum_app.c @@ -76,6 +76,8 @@ bool momentum_app_apply(MomentumApp* app) { if(!flipper_format_write_bool( file, "use_ext_range_at_own_risk", &app->subghz_extend, 1)) break; + if(!flipper_format_write_bool(file, "ignore_default_tx_region", &app->subghz_bypass, 1)) + break; } while(0); flipper_format_free(file); } @@ -307,6 +309,7 @@ MomentumApp* momentum_app_alloc() { file = flipper_format_file_alloc(storage); if(flipper_format_file_open_existing(file, "/ext/subghz/assets/extend_range.txt")) { flipper_format_read_bool(file, "use_ext_range_at_own_risk", &app->subghz_extend, 1); + flipper_format_read_bool(file, "ignore_default_tx_region", &app->subghz_bypass, 1); } flipper_format_free(file); furi_record_close(RECORD_STORAGE); diff --git a/applications/main/momentum_app/momentum_app.h b/applications/main/momentum_app/momentum_app.h index 9511185d36..905bea3299 100644 --- a/applications/main/momentum_app/momentum_app.h +++ b/applications/main/momentum_app/momentum_app.h @@ -59,6 +59,7 @@ typedef struct { uint8_t subghz_hopper_index; char subghz_freq_buffer[7]; bool subghz_extend; + bool subghz_bypass; RgbColor lcd_color; Rgb565Color vgm_color; char device_name[FURI_HAL_VERSION_ARRAY_NAME_LENGTH]; diff --git a/applications/main/momentum_app/scenes/momentum_app_scene_protocols.c b/applications/main/momentum_app/scenes/momentum_app_scene_protocols.c index 7258a9d9a0..255daaa054 100644 --- a/applications/main/momentum_app/scenes/momentum_app_scene_protocols.c +++ b/applications/main/momentum_app/scenes/momentum_app_scene_protocols.c @@ -2,8 +2,10 @@ enum VarItemListIndex { VarItemListIndexSubghzFreqs, + VarItemListIndexSubghzBypass, VarItemListIndexSubghzExtend, VarItemListIndexGpioPins, + VarItemListIndexFileNamingPrefix, }; void momentum_app_scene_protocols_var_item_list_callback(void* context, uint32_t index) { @@ -11,11 +13,24 @@ void momentum_app_scene_protocols_var_item_list_callback(void* context, uint32_t view_dispatcher_send_custom_event(app->view_dispatcher, index); } +static void xtreme_app_scene_protocols_subghz_bypass_changed(VariableItem* item) { + MomentumApp* app = variable_item_get_context(item); + app->subghz_bypass = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, app->subghz_bypass ? "ON" : "OFF"); + app->save_subghz = true; + app->require_reboot = true; + variable_item_set_locked( + variable_item_list_get(app->var_item_list, VarItemListIndexSubghzExtend), + !app->subghz_bypass, + NULL); +} + static void momentum_app_scene_protocols_subghz_extend_changed(VariableItem* item) { MomentumApp* app = variable_item_get_context(item); app->subghz_extend = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, app->subghz_extend ? "ON" : "OFF"); app->save_subghz = true; + app->require_reboot = true; } static void momentum_app_scene_protocols_file_naming_prefix_changed(VariableItem* item) { @@ -35,9 +50,23 @@ void momentum_app_scene_protocols_on_enter(void* context) { variable_item_set_current_value_text(item, ">"); item = variable_item_list_add( - var_item_list, "SubGHz Extend", 2, momentum_app_scene_protocols_subghz_extend_changed, app); + var_item_list, + "SubGHz Bypass Region Lock", + 2, + xtreme_app_scene_protocols_subghz_bypass_changed, + app); + variable_item_set_current_value_index(item, app->subghz_bypass); + variable_item_set_current_value_text(item, app->subghz_bypass ? "ON" : "OFF"); + + item = variable_item_list_add( + var_item_list, + "SubGHz Extend Freq Bands", + 2, + momentum_app_scene_protocols_subghz_extend_changed, + app); variable_item_set_current_value_index(item, app->subghz_extend); variable_item_set_current_value_text(item, app->subghz_extend ? "ON" : "OFF"); + variable_item_set_locked(item, !app->subghz_bypass, "Must bypass\nregion lock\nfirst!"); item = variable_item_list_add(var_item_list, "GPIO Pins", 0, NULL, app); variable_item_set_current_value_text(item, ">"); diff --git a/applications/main/subghz/subghz_extended_freq.c b/applications/main/subghz/subghz_extended_freq.c index 488b3312da..d7f41a25bf 100644 --- a/applications/main/subghz/subghz_extended_freq.c +++ b/applications/main/subghz/subghz_extended_freq.c @@ -6,14 +6,17 @@ void subghz_extended_freq() { bool is_extended_i = false; + bool is_bypassed = false; Storage* storage = furi_record_open(RECORD_STORAGE); FlipperFormat* file = flipper_format_file_alloc(storage); if(flipper_format_file_open_existing(file, "/ext/subghz/assets/extend_range.txt")) { flipper_format_read_bool(file, "use_ext_range_at_own_risk", &is_extended_i, 1); + flipper_format_read_bool(file, "ignore_default_tx_region", &is_bypassed, 1); } furi_hal_subghz_set_extended_frequency(is_extended_i); + furi_hal_subghz_set_bypass_region(is_bypassed); flipper_format_free(file); furi_record_close(RECORD_STORAGE); diff --git a/applications/settings/about/about.c b/applications/settings/about/about.c index 97f575ab67..e6340072e5 100644 --- a/applications/settings/about/about.c +++ b/applications/settings/about/about.c @@ -138,7 +138,7 @@ static DialogMessageButton about_screen_hw_version(DialogsApp* dialogs, DialogMe furi_hal_version_get_hw_target(), furi_hal_version_get_hw_body(), furi_hal_version_get_hw_connect(), - furi_hal_version_get_hw_region_name_otp(), + furi_hal_version_get_hw_region_name(), furi_hal_region_get_name(), my_name ? my_name : "Unknown"); diff --git a/targets/f7/api_symbols.csv b/targets/f7/api_symbols.csv index 5e9783b1fd..df8d6a6109 100644 --- a/targets/f7/api_symbols.csv +++ b/targets/f7/api_symbols.csv @@ -1522,6 +1522,7 @@ Function,+,furi_hal_random_init,void, Function,+,furi_hal_region_get,const FuriHalRegion*, Function,+,furi_hal_region_get_band,const FuriHalRegionBand*,uint32_t Function,+,furi_hal_region_get_name,const char*, +Function,-,furi_hal_region_init,void, Function,+,furi_hal_region_is_frequency_allowed,_Bool,uint32_t Function,+,furi_hal_region_is_provisioned,_Bool, Function,+,furi_hal_region_set,void,FuriHalRegion* diff --git a/targets/f7/furi_hal/furi_hal.c b/targets/f7/furi_hal/furi_hal.c index 172ee38abb..03e4acdc91 100644 --- a/targets/f7/furi_hal/furi_hal.c +++ b/targets/f7/furi_hal/furi_hal.c @@ -49,6 +49,7 @@ void furi_hal_init() { furi_hal_flash_init(); furi_hal_resources_init(); furi_hal_version_init(); + furi_hal_region_init(); furi_hal_spi_config_init(); furi_hal_spi_dma_init(); furi_hal_ibutton_init(); diff --git a/targets/f7/furi_hal/furi_hal_region.c b/targets/f7/furi_hal/furi_hal_region.c index 0f0cb855cb..cecf48b788 100644 --- a/targets/f7/furi_hal/furi_hal_region.c +++ b/targets/f7/furi_hal/furi_hal_region.c @@ -1,5 +1,6 @@ #include -#include +#include +#include const FuriHalRegion furi_hal_region_zero = { .country_code = "00", @@ -13,18 +14,118 @@ const FuriHalRegion furi_hal_region_zero = { }, }}; +const FuriHalRegion furi_hal_region_eu_ru = { + .country_code = "EU", + .bands_count = 2, + .bands = { + { + .start = 433050000, + .end = 434790000, + .power_limit = 12, + .duty_cycle = 50, + }, + { + .start = 868150000, + .end = 868550000, + .power_limit = 12, + .duty_cycle = 50, + }}}; + +const FuriHalRegion furi_hal_region_us_ca_au = { + .country_code = "US", + .bands_count = 3, + .bands = { + { + .start = 304100000, + .end = 321950000, + .power_limit = 12, + .duty_cycle = 50, + }, + { + .start = 433050000, + .end = 434790000, + .power_limit = 12, + .duty_cycle = 50, + }, + { + .start = 915000000, + .end = 928000000, + .power_limit = 12, + .duty_cycle = 50, + }}}; + +const FuriHalRegion furi_hal_region_jp = { + .country_code = "JP", + .bands_count = 2, + .bands = { + { + .start = 312000000, + .end = 315250000, + .power_limit = 12, + .duty_cycle = 50, + }, + { + .start = 920500000, + .end = 923500000, + .power_limit = 12, + .duty_cycle = 50, + }}}; + static const FuriHalRegion* furi_hal_region = NULL; +void furi_hal_region_init() { + FuriHalVersionRegion region = furi_hal_version_get_hw_region(); + + if(region == FuriHalVersionRegionUnknown) { + furi_hal_region = &furi_hal_region_zero; + } else if(region == FuriHalVersionRegionEuRu) { + furi_hal_region = &furi_hal_region_eu_ru; + } else if(region == FuriHalVersionRegionUsCaAu) { + furi_hal_region = &furi_hal_region_us_ca_au; + } else if(region == FuriHalVersionRegionJp) { + furi_hal_region = &furi_hal_region_jp; + } +} + const FuriHalRegion* furi_hal_region_get() { - return &furi_hal_region_zero; + return furi_hal_region; } void furi_hal_region_set(FuriHalRegion* region) { - UNUSED(region); + furi_hal_region = region; +} + +bool furi_hal_region_is_provisioned() { + return furi_hal_region != NULL; +} + +const char* furi_hal_region_get_name() { + if(furi_hal_region) { + return furi_hal_region->country_code; + } else { + return "--"; + } +} + +bool _furi_hal_region_is_frequency_allowed(uint32_t frequency) { + if(!furi_hal_region) { + return false; + } + + const FuriHalRegionBand* band = furi_hal_region_get_band(frequency); + if(!band) { + return false; + } + + return true; +} + +// Check furi_hal_subghz settings for region bypass, if not it uses function above +bool furi_hal_region_is_frequency_allowed(uint32_t frequency) { + return furi_hal_subghz_is_tx_allowed(frequency); } const FuriHalRegionBand* furi_hal_region_get_band(uint32_t frequency) { - furi_hal_region = &furi_hal_region_zero; if(!furi_hal_region) { return NULL; } @@ -38,16 +139,3 @@ const FuriHalRegionBand* furi_hal_region_get_band(uint32_t frequency) { return NULL; } - -bool furi_hal_region_is_frequency_allowed(uint32_t frequency) { - UNUSED(frequency); - return true; -} - -bool furi_hal_region_is_provisioned() { - return true; -} - -const char* furi_hal_region_get_name() { - return "00"; -} diff --git a/targets/f7/furi_hal/furi_hal_region_i.h b/targets/f7/furi_hal/furi_hal_region_i.h new file mode 100644 index 0000000000..6a98f47ee2 --- /dev/null +++ b/targets/f7/furi_hal/furi_hal_region_i.h @@ -0,0 +1,5 @@ +#pragma once + +#include + +bool _furi_hal_region_is_frequency_allowed(uint32_t frequency); diff --git a/targets/f7/furi_hal/furi_hal_subghz.c b/targets/f7/furi_hal/furi_hal_subghz.c index 765730df06..8e4b7272a2 100644 --- a/targets/f7/furi_hal/furi_hal_subghz.c +++ b/targets/f7/furi_hal/furi_hal_subghz.c @@ -1,6 +1,6 @@ #include #include - +#include #include #include #include @@ -54,6 +54,7 @@ typedef struct { int8_t rolling_counter_mult; bool ext_power_amp : 1; bool extended_frequency_i : 1; + bool bypass_region : 1; } FuriHalSubGhz; volatile FuriHalSubGhz furi_hal_subghz = { @@ -63,6 +64,7 @@ volatile FuriHalSubGhz furi_hal_subghz = { .rolling_counter_mult = 1, .ext_power_amp = false, .extended_frequency_i = false, + .bypass_region = false, }; int8_t furi_hal_subghz_get_rolling_counter_mult(void) { @@ -77,6 +79,10 @@ void furi_hal_subghz_set_extended_frequency(bool state_i) { furi_hal_subghz.extended_frequency_i = state_i; } +void furi_hal_subghz_set_bypass_region(bool enabled) { + furi_hal_subghz.bypass_region = enabled; +} + void furi_hal_subghz_set_ext_power_amp(bool enabled) { furi_hal_subghz.ext_power_amp = enabled; } @@ -381,6 +387,15 @@ uint32_t furi_hal_subghz_set_frequency_and_path(uint32_t value) { } bool furi_hal_subghz_is_tx_allowed(uint32_t value) { + if(!furi_hal_subghz.bypass_region) { + if(!_furi_hal_region_is_frequency_allowed(value)) { + FURI_LOG_I(TAG, "Frequency blocked - outside region range"); + return false; + } + + return true; + } + bool allow_extended_for_int = furi_hal_subghz.extended_frequency_i; if(!(allow_extended_for_int) && diff --git a/targets/f7/furi_hal/furi_hal_subghz_i.h b/targets/f7/furi_hal/furi_hal_subghz_i.h index 85532a5d36..bbaf418a27 100644 --- a/targets/f7/furi_hal/furi_hal_subghz_i.h +++ b/targets/f7/furi_hal/furi_hal_subghz_i.h @@ -1,3 +1,5 @@ #pragma once -void furi_hal_subghz_set_extended_frequency(bool state_i); \ No newline at end of file +void furi_hal_subghz_set_extended_frequency(bool state_i); + +void furi_hal_subghz_set_bypass_region(bool enabled); diff --git a/targets/f7/furi_hal/furi_hal_version.c b/targets/f7/furi_hal/furi_hal_version.c index 19f67ce050..8ce93b1de5 100644 --- a/targets/f7/furi_hal/furi_hal_version.c +++ b/targets/f7/furi_hal/furi_hal_version.c @@ -249,19 +249,15 @@ uint8_t furi_hal_version_get_hw_connect() { } FuriHalVersionRegion furi_hal_version_get_hw_region() { - return FuriHalVersionRegionUnknown; + return furi_hal_version.board_region; } FuriHalVersionRegion furi_hal_version_get_hw_region_otp() { - return furi_hal_version.board_region; + return furi_hal_version_get_hw_region(); } const char* furi_hal_version_get_hw_region_name() { - return "R00"; -} - -const char* furi_hal_version_get_hw_region_name_otp() { - switch(furi_hal_version_get_hw_region_otp()) { + switch(furi_hal_version_get_hw_region()) { case FuriHalVersionRegionUnknown: return "R00"; case FuriHalVersionRegionEuRu: @@ -276,6 +272,10 @@ const char* furi_hal_version_get_hw_region_name_otp() { return "R??"; } +const char* furi_hal_version_get_hw_region_name_otp() { + return furi_hal_version_get_hw_region_name(); +} + FuriHalVersionDisplay furi_hal_version_get_hw_display() { return furi_hal_version.board_display; } @@ -316,5 +316,5 @@ const uint8_t* furi_hal_version_uid() { if(version_get_custom_name(NULL) != NULL) { return (const uint8_t*)&(*((uint32_t*)version_get_custom_name(NULL))); } - return (const uint8_t*)UID64_BASE; + return furi_hal_version_uid_default(); } diff --git a/targets/furi_hal_include/furi_hal_region.h b/targets/furi_hal_include/furi_hal_region.h index 9586d51ed7..ddc8a6a430 100644 --- a/targets/furi_hal_include/furi_hal_region.h +++ b/targets/furi_hal_include/furi_hal_region.h @@ -21,6 +21,9 @@ typedef struct { FuriHalRegionBand bands[]; } FuriHalRegion; +/** Initialize region */ +void furi_hal_region_init(); + /** Get Region Data. * * Region data may be allocated in Flash or in RAM. diff --git a/targets/furi_hal_include/furi_hal_version.h b/targets/furi_hal_include/furi_hal_version.h index 49f4f82cb1..cf8b97bfb5 100644 --- a/targets/furi_hal_include/furi_hal_version.h +++ b/targets/furi_hal_include/furi_hal_version.h @@ -141,25 +141,25 @@ FuriHalVersionColor furi_hal_version_get_hw_color(); */ uint8_t furi_hal_version_get_hw_connect(); -/** Get hardware region (fake) = 0 +/** Get hardware region * - * @return Hardware Region (fake) + * @return Hardware Region */ FuriHalVersionRegion furi_hal_version_get_hw_region(); -/** Get hardware region name (fake) = R00 +/** Get hardware region name * - * @return Hardware Region name (fake) + * @return Hardware Region name */ const char* furi_hal_version_get_hw_region_name(); -/** Get hardware region (OTP) +/** Get hardware region (compatibility with Unleashed API) * * @return Hardware Region */ FuriHalVersionRegion furi_hal_version_get_hw_region_otp(); -/** Get hardware region name (OTP) +/** Get hardware region name (compatibility with Unleashed API) * * @return Hardware Region name */