Changed protocol info

This commit is contained in:
DerSkythe
2022-10-08 21:53:31 +04:00
parent 9ba7e625ca
commit b86f42e7fb
13 changed files with 310 additions and 215 deletions

View File

@@ -1,7 +1,5 @@
#include "../subbrute_i.h" #include "../subbrute_i.h"
#include "subbrute_scene.h" #include "subbrute_scene.h"
#include "../subbrute_custom_event.h"
#include "../views/subbrute_attack_view.h"
#define TAG "SubBruteSceneRunAttack" #define TAG "SubBruteSceneRunAttack"

View File

@@ -1,6 +1,5 @@
#include "../subbrute_i.h" #include "../subbrute_i.h"
#include "subbrute_scene.h" #include "subbrute_scene.h"
#include <core/string.h>
#include <lib/toolbox/random_name.h> #include <lib/toolbox/random_name.h>
#define TAG "SubBruteSceneSaveFile" #define TAG "SubBruteSceneSaveFile"

View File

@@ -40,7 +40,7 @@ SubBruteState* subbrute_alloc() {
view_dispatcher_set_navigation_event_callback( view_dispatcher_set_navigation_event_callback(
instance->view_dispatcher, subbrute_back_event_callback); instance->view_dispatcher, subbrute_back_event_callback);
view_dispatcher_set_tick_event_callback( view_dispatcher_set_tick_event_callback(
instance->view_dispatcher, subbrute_tick_event_callback, 10); instance->view_dispatcher, subbrute_tick_event_callback, 100);
//Dialog //Dialog
instance->dialogs = furi_record_open(RECORD_DIALOGS); instance->dialogs = furi_record_open(RECORD_DIALOGS);
@@ -87,8 +87,6 @@ SubBruteState* subbrute_alloc() {
SubBruteViewAttack, SubBruteViewAttack,
subbrute_attack_view_get_view(instance->view_attack)); subbrute_attack_view_get_view(instance->view_attack));
// Loading
instance->loading = loading_alloc();
//instance->flipper_format = flipper_format_string_alloc(); //instance->flipper_format = flipper_format_string_alloc();
//instance->environment = subghz_environment_alloc(); //instance->environment = subghz_environment_alloc();
@@ -99,91 +97,49 @@ void subbrute_free(SubBruteState* instance) {
furi_assert(instance); furi_assert(instance);
// SubBruteDevice // SubBruteDevice
#ifdef FURI_DEBUG
FURI_LOG_D(TAG, "free SubBruteDevice");
#endif
subbrute_worker_stop(instance->device); subbrute_worker_stop(instance->device);
subbrute_device_free(instance->device); subbrute_device_free(instance->device);
// Notifications // Notifications
#ifdef FURI_DEBUG
FURI_LOG_D(TAG, "free Notifications");
#endif
notification_message(instance->notifications, &sequence_blink_stop); notification_message(instance->notifications, &sequence_blink_stop);
furi_record_close(RECORD_NOTIFICATION); furi_record_close(RECORD_NOTIFICATION);
instance->notifications = NULL; instance->notifications = NULL;
// Loading
#ifdef FURI_DEBUG
FURI_LOG_D(TAG, "free loading");
#endif
loading_free(instance->loading);
// View Main // View Main
#ifdef FURI_DEBUG
FURI_LOG_D(TAG, "free SubBruteViewMain");
#endif
view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewMain); view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewMain);
subbrute_main_view_free(instance->view_main); subbrute_main_view_free(instance->view_main);
// View Attack // View Attack
#ifdef FURI_DEBUG
FURI_LOG_D(TAG, "free SubBruteViewAttack");
#endif
view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewAttack); view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewAttack);
subbrute_attack_view_free(instance->view_attack); subbrute_attack_view_free(instance->view_attack);
// TextInput // TextInput
#ifdef FURI_DEBUG
FURI_LOG_D(TAG, "free SubBruteViewTextInput");
#endif
view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewTextInput); view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewTextInput);
text_input_free(instance->text_input); text_input_free(instance->text_input);
// Custom Widget // Custom Widget
#ifdef FURI_DEBUG
FURI_LOG_D(TAG, "free SubBruteViewWidget");
#endif
view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewWidget); view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewWidget);
widget_free(instance->widget); widget_free(instance->widget);
// Popup // Popup
#ifdef FURI_DEBUG
FURI_LOG_D(TAG, "free SubBruteViewPopup");
#endif
view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewPopup); view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewPopup);
popup_free(instance->popup); popup_free(instance->popup);
// ViewStack // ViewStack
#ifdef FURI_DEBUG
FURI_LOG_D(TAG, "free SubBruteViewStack");
#endif
view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewStack); view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewStack);
view_stack_free(instance->view_stack); view_stack_free(instance->view_stack);
//Dialog //Dialog
#ifdef FURI_DEBUG
FURI_LOG_D(TAG, "free RECORD_DIALOGS");
#endif
furi_record_close(RECORD_DIALOGS); furi_record_close(RECORD_DIALOGS);
instance->dialogs = NULL; instance->dialogs = NULL;
// Scene manager // Scene manager
#ifdef FURI_DEBUG
FURI_LOG_D(TAG, "free scene_manager");
#endif
scene_manager_free(instance->scene_manager); scene_manager_free(instance->scene_manager);
// View Dispatcher // View Dispatcher
#ifdef FURI_DEBUG
FURI_LOG_D(TAG, "free view_dispatcher");
#endif
view_dispatcher_free(instance->view_dispatcher); view_dispatcher_free(instance->view_dispatcher);
// GUI // GUI
#ifdef FURI_DEBUG
FURI_LOG_D(TAG, "free RECORD_GUI");
#endif
furi_record_close(RECORD_GUI); furi_record_close(RECORD_GUI);
instance->gui = NULL; instance->gui = NULL;
@@ -193,23 +149,6 @@ void subbrute_free(SubBruteState* instance) {
free(instance); free(instance);
} }
void subbrute_show_loading_popup(void* context, bool show) {
TaskHandle_t timer_task = xTaskGetHandle(configTIMER_SERVICE_TASK_NAME);
SubBruteState* instance = context;
ViewStack* view_stack = instance->view_stack;
Loading* loading = instance->loading;
if(show) {
// Raise timer priority so that animations can play
vTaskPrioritySet(timer_task, configMAX_PRIORITIES - 1);
view_stack_add_view(view_stack, loading_get_view(loading));
} else {
view_stack_remove_view(view_stack, loading_get_view(loading));
// Restore default timer priority
vTaskPrioritySet(timer_task, configTIMER_TASK_PRIORITY);
}
}
void subbrute_text_input_callback(void* context) { void subbrute_text_input_callback(void* context) {
furi_assert(context); furi_assert(context);
SubBruteState* instance = context; SubBruteState* instance = context;

View File

@@ -1,8 +1,5 @@
#pragma once #pragma once
#include <stdint.h>
#include <stddef.h>
typedef enum { typedef enum {
// Reserve first 100 events for button types and indexes, starting from 0 // Reserve first 100 events for button types and indexes, starting from 0
SubBruteCustomEventTypeReserved = 100, SubBruteCustomEventTypeReserved = 100,

View File

@@ -40,6 +40,7 @@ SubBruteDevice* subbrute_device_alloc() {
instance->callback = NULL; instance->callback = NULL;
instance->protocol_info = NULL; instance->protocol_info = NULL;
instance->file_protocol_info = NULL;
instance->decoder_result = NULL; instance->decoder_result = NULL;
instance->transmitter = NULL; instance->transmitter = NULL;
instance->receiver = NULL; instance->receiver = NULL;
@@ -150,7 +151,8 @@ bool subbrute_worker_start(SubBruteDevice* instance) {
FURI_LOG_W(TAG, "Worker cannot start, invalid device state: %d", instance->state); FURI_LOG_W(TAG, "Worker cannot start, invalid device state: %d", instance->state);
return false; return false;
} }
if(instance->protocol_info == NULL) { if((instance->protocol_info == NULL && instance->attack != SubBruteAttackLoadFile) ||
(instance->attack == SubBruteAttackLoadFile && instance->file_protocol_info == NULL)) {
FURI_LOG_W(TAG, "Worker cannot start, protocol_info is NULL!"); FURI_LOG_W(TAG, "Worker cannot start, protocol_info is NULL!");
return false; return false;
} }
@@ -230,9 +232,13 @@ void subbrute_device_subghz_transmit(SubBruteDevice* instance, FlipperFormat* fl
instance->environment, subbrute_protocol_name(instance->attack)); instance->environment, subbrute_protocol_name(instance->attack));
subghz_transmitter_deserialize(instance->transmitter, flipper_format); subghz_transmitter_deserialize(instance->transmitter, flipper_format);
furi_hal_subghz_reset(); furi_hal_subghz_reset();
furi_hal_subghz_load_preset(instance->protocol_info->preset); if(instance->attack == SubBruteAttackLoadFile) {
furi_hal_subghz_set_frequency_and_path(instance->protocol_info->preset); furi_hal_subghz_load_preset(instance->file_protocol_info->preset);
furi_hal_subghz_set_frequency_and_path(instance->file_protocol_info->preset);
} else {
furi_hal_subghz_load_preset(instance->protocol_info->preset);
furi_hal_subghz_set_frequency_and_path(instance->protocol_info->preset);
}
furi_hal_subghz_start_async_tx(subghz_transmitter_yield, instance->transmitter); furi_hal_subghz_start_async_tx(subghz_transmitter_yield, instance->transmitter);
while(!furi_hal_subghz_is_async_tx_complete()) { while(!furi_hal_subghz_is_async_tx_complete()) {
@@ -348,6 +354,9 @@ bool subbrute_device_create_packet_parsed(
FuriString* candidate = furi_string_alloc(); FuriString* candidate = furi_string_alloc();
Stream* stream = flipper_format_get_raw_stream(flipper_format);
stream_clean(stream);
if(instance->attack == SubBruteAttackLoadFile) { if(instance->attack == SubBruteAttackLoadFile) {
if(step >= sizeof(instance->file_key)) { if(step >= sizeof(instance->file_key)) {
return false; return false;
@@ -357,6 +366,42 @@ bool subbrute_device_create_packet_parsed(
snprintf(subbrute_payload_byte, 4, "%02X ", (uint8_t)step); snprintf(subbrute_payload_byte, 4, "%02X ", (uint8_t)step);
furi_string_replace_at(candidate, instance->load_index * 3, 3, subbrute_payload_byte); furi_string_replace_at(candidate, instance->load_index * 3, 3, subbrute_payload_byte);
//snprintf(step_payload, sizeof(step_payload), "%02X", (uint8_t)instance->file_key[step]); //snprintf(step_payload, sizeof(step_payload), "%02X", (uint8_t)instance->file_key[step]);
if(small) {
if(instance->file_protocol_info->te) {
stream_write_format(
stream,
subbrute_key_small_with_tail,
instance->file_protocol_info->bits,
furi_string_get_cstr(candidate),
instance->file_protocol_info->te,
instance->file_protocol_info->repeat);
} else {
stream_write_format(
stream,
subbrute_key_small_no_tail,
instance->file_protocol_info->bits,
furi_string_get_cstr(candidate),
instance->file_protocol_info->repeat);
}
} else {
if(instance->file_protocol_info->te) {
stream_write_format(
stream,
subbrute_key_file_key_with_tail,
instance->file_template,
furi_string_get_cstr(candidate),
instance->file_protocol_info->te,
instance->file_protocol_info->repeat);
} else {
stream_write_format(
stream,
subbrute_key_file_key,
instance->file_template,
furi_string_get_cstr(candidate),
instance->file_protocol_info->repeat);
}
}
} else { } else {
//snprintf(step_payload, sizeof(step_payload), "%16X", step); //snprintf(step_payload, sizeof(step_payload), "%16X", step);
//snprintf(step_payload, sizeof(step_payload), "%016llX", step); //snprintf(step_payload, sizeof(step_payload), "%016llX", step);
@@ -375,53 +420,50 @@ bool subbrute_device_create_packet_parsed(
} }
} }
furi_string_free(buffer); furi_string_free(buffer);
}
#ifdef FURI_DEBUG #ifdef FURI_DEBUG
FURI_LOG_D(TAG, "candidate: %s, step: %lld", furi_string_get_cstr(candidate), step); FURI_LOG_D(TAG, "candidate: %s, step: %lld", furi_string_get_cstr(candidate), step);
#endif #endif
Stream* stream = flipper_format_get_raw_stream(flipper_format); if(small) {
stream_clean(stream); if(instance->protocol_info->te) {
stream_write_format(
if(small) { stream,
if(instance->protocol_info->te) { subbrute_key_small_with_tail,
stream_write_format( instance->protocol_info->bits,
stream, furi_string_get_cstr(candidate),
subbrute_key_small_with_tail, instance->protocol_info->te,
instance->protocol_info->bits, instance->protocol_info->repeat);
furi_string_get_cstr(candidate), } else {
instance->protocol_info->te, stream_write_format(
instance->protocol_info->repeat); stream,
subbrute_key_small_no_tail,
instance->protocol_info->bits,
furi_string_get_cstr(candidate),
instance->protocol_info->repeat);
}
} else { } else {
stream_write_format( if(instance->protocol_info->te) {
stream, stream_write_format(
subbrute_key_small_no_tail, stream,
instance->protocol_info->bits, subbrute_key_file_key_with_tail,
furi_string_get_cstr(candidate), instance->file_template,
instance->protocol_info->repeat); furi_string_get_cstr(candidate),
instance->protocol_info->te,
instance->protocol_info->repeat);
} else {
stream_write_format(
stream,
subbrute_key_file_key,
instance->file_template,
furi_string_get_cstr(candidate),
instance->protocol_info->repeat);
}
} }
} else {
if(instance->protocol_info->te) {
stream_write_format(
stream,
subbrute_key_file_key_with_tail,
instance->file_template,
furi_string_get_cstr(candidate),
instance->protocol_info->te,
instance->protocol_info->repeat);
} else {
stream_write_format(
stream,
subbrute_key_file_key,
instance->file_template,
furi_string_get_cstr(candidate),
instance->protocol_info->repeat);
}
}
#ifdef FURI_DEBUG #ifdef FURI_DEBUG
//FURI_LOG_D(TAG, "payload: %s", instance->payload); //FURI_LOG_D(TAG, "payload: %s", instance->payload);
#endif #endif
}
furi_string_free(candidate); furi_string_free(candidate);
@@ -471,6 +513,17 @@ SubBruteFileResult subbrute_device_attack_set(SubBruteDevice* instance, SubBrute
// Calc max value // Calc max value
if(instance->attack == SubBruteAttackLoadFile) { if(instance->attack == SubBruteAttackLoadFile) {
instance->max_value = 0x3F; instance->max_value = 0x3F;
// Now we are ready to set file template for using in the future with snprintf
// for sending attack payload ONLY for files!
snprintf(
instance->file_template,
sizeof(instance->file_template),
subbrute_key_file_start,
instance->file_protocol_info->frequency,
subbrute_protocol_preset(instance->file_protocol_info->preset),
subbrute_protocol_file(instance->file_protocol_info->file),
instance->file_protocol_info->bits);
} else { } else {
FuriString* max_value_s; FuriString* max_value_s;
max_value_s = furi_string_alloc(); max_value_s = furi_string_alloc();
@@ -479,22 +532,22 @@ SubBruteFileResult subbrute_device_attack_set(SubBruteDevice* instance, SubBrute
} }
instance->max_value = (uint64_t)strtol(furi_string_get_cstr(max_value_s), NULL, 2); instance->max_value = (uint64_t)strtol(furi_string_get_cstr(max_value_s), NULL, 2);
furi_string_free(max_value_s); furi_string_free(max_value_s);
}
// Now we are ready to set file template for using in the future with snprintf // Now we are ready to set file template for using in the future with snprintf
// for sending attack payload // for sending attack payload
snprintf( snprintf(
instance->file_template, instance->file_template,
sizeof(instance->file_template), sizeof(instance->file_template),
subbrute_key_file_start, subbrute_key_file_start,
instance->protocol_info->frequency, instance->protocol_info->frequency,
subbrute_protocol_preset(instance->protocol_info->preset), subbrute_protocol_preset(instance->protocol_info->preset),
subbrute_protocol_file(instance->protocol_info->file), subbrute_protocol_file(instance->protocol_info->file),
instance->protocol_info->bits); instance->protocol_info->bits);
#ifdef FURI_DEBUG #ifdef FURI_DEBUG
FURI_LOG_D( FURI_LOG_D(
TAG, "tail: %d, file_template: %s", instance->protocol_info->te, instance->file_template); TAG, "tail: %d, file_template: %s", instance->protocol_info->te, instance->file_template);
#endif #endif
}
// Init payload // Init payload
FlipperFormat* flipper_format = flipper_format_string_alloc(); FlipperFormat* flipper_format = flipper_format_string_alloc();
@@ -517,6 +570,9 @@ uint8_t subbrute_device_load_from_file(SubBruteDevice* instance, const char* fil
Storage* storage = furi_record_open(RECORD_STORAGE); Storage* storage = furi_record_open(RECORD_STORAGE);
FlipperFormat* fff_data_file = flipper_format_file_alloc(storage); FlipperFormat* fff_data_file = flipper_format_file_alloc(storage);
subbrute_device_free_protocol_info(instance);
instance->file_protocol_info = malloc(sizeof(SubBruteProtocol));
FuriString* temp_str; FuriString* temp_str;
temp_str = furi_string_alloc(); temp_str = furi_string_alloc();
uint32_t temp_data32; uint32_t temp_data32;
@@ -539,8 +595,8 @@ uint8_t subbrute_device_load_from_file(SubBruteDevice* instance, const char* fil
// Frequency // Frequency
if(flipper_format_read_uint32(fff_data_file, "Frequency", &temp_data32, 1)) { if(flipper_format_read_uint32(fff_data_file, "Frequency", &temp_data32, 1)) {
instance->protocol_info->frequency = temp_data32; instance->file_protocol_info->frequency = temp_data32;
if(!furi_hal_subghz_is_tx_allowed(instance->protocol_info->frequency)) { if(!furi_hal_subghz_is_tx_allowed(instance->file_protocol_info->frequency)) {
result = SubBruteFileResultFrequencyNotAllowed; result = SubBruteFileResultFrequencyNotAllowed;
break; break;
} }
@@ -555,7 +611,7 @@ uint8_t subbrute_device_load_from_file(SubBruteDevice* instance, const char* fil
FURI_LOG_E(TAG, "Preset FAIL"); FURI_LOG_E(TAG, "Preset FAIL");
result = SubBruteFileResultPresetInvalid; result = SubBruteFileResultPresetInvalid;
} else { } else {
instance->protocol_info->preset = subbrute_protocol_convert_preset(temp_str); instance->file_protocol_info->preset = subbrute_protocol_convert_preset(temp_str);
} }
const char* protocol_file = NULL; const char* protocol_file = NULL;
@@ -565,8 +621,8 @@ uint8_t subbrute_device_load_from_file(SubBruteDevice* instance, const char* fil
result = SubBruteFileResultMissingProtocol; result = SubBruteFileResultMissingProtocol;
break; break;
} else { } else {
instance->protocol_info->file = subbrute_protocol_file_protocol_name(temp_str); instance->file_protocol_info->file = subbrute_protocol_file_protocol_name(temp_str);
protocol_file = subbrute_protocol_file(instance->protocol_info->file); protocol_file = subbrute_protocol_file(instance->file_protocol_info->file);
#ifdef FURI_DEBUG #ifdef FURI_DEBUG
FURI_LOG_D(TAG, "Protocol: %s", protocol_file); FURI_LOG_D(TAG, "Protocol: %s", protocol_file);
#endif #endif
@@ -598,9 +654,9 @@ uint8_t subbrute_device_load_from_file(SubBruteDevice* instance, const char* fil
result = SubBruteFileResultMissingOrIncorrectBit; result = SubBruteFileResultMissingOrIncorrectBit;
break; break;
} else { } else {
instance->protocol_info->bits = temp_data32; instance->file_protocol_info->bits = temp_data32;
#ifdef FURI_DEBUG #ifdef FURI_DEBUG
FURI_LOG_D(TAG, "Bit: %d", instance->protocol_info->bits); FURI_LOG_D(TAG, "Bit: %d", instance->file_protocol_info->bits);
#endif #endif
} }
@@ -626,7 +682,7 @@ uint8_t subbrute_device_load_from_file(SubBruteDevice* instance, const char* fil
//result = SubBruteFileResultMissingOrIncorrectTe; //result = SubBruteFileResultMissingOrIncorrectTe;
//break; //break;
} else { } else {
instance->protocol_info->te = temp_data32 != 0; instance->file_protocol_info->te = temp_data32 != 0;
} }
// Repeat // Repeat
@@ -634,12 +690,12 @@ uint8_t subbrute_device_load_from_file(SubBruteDevice* instance, const char* fil
#ifdef FURI_DEBUG #ifdef FURI_DEBUG
FURI_LOG_D(TAG, "Repeat: %ld", temp_data32); FURI_LOG_D(TAG, "Repeat: %ld", temp_data32);
#endif #endif
instance->protocol_info->repeat = (uint8_t)temp_data32; instance->file_protocol_info->repeat = (uint8_t)temp_data32;
} else { } else {
#ifdef FURI_DEBUG #ifdef FURI_DEBUG
FURI_LOG_D(TAG, "Repeat: 3 (default)"); FURI_LOG_D(TAG, "Repeat: 3 (default)");
#endif #endif
instance->protocol_info->repeat = 3; instance->file_protocol_info->repeat = 3;
} }
result = SubBruteFileResultOk; result = SubBruteFileResultOk;
@@ -659,6 +715,8 @@ uint8_t subbrute_device_load_from_file(SubBruteDevice* instance, const char* fil
#ifdef FURI_DEBUG #ifdef FURI_DEBUG
FURI_LOG_D(TAG, "Loaded successfully"); FURI_LOG_D(TAG, "Loaded successfully");
#endif #endif
} else {
subbrute_device_free_protocol_info(instance);
} }
return result; return result;
@@ -742,7 +800,9 @@ const char* subbrute_device_error_get_desc(SubBruteFileResult error_id) {
void subbrute_device_free_protocol_info(SubBruteDevice* instance) { void subbrute_device_free_protocol_info(SubBruteDevice* instance) {
furi_assert(instance); furi_assert(instance);
free(instance->protocol_info);
instance->protocol_info = NULL; instance->protocol_info = NULL;
if(instance->file_protocol_info) {
free(instance->file_protocol_info);
}
instance->file_protocol_info = NULL;
} }

View File

@@ -41,7 +41,8 @@ typedef enum {
typedef void (*SubBruteDeviceWorkerCallback)(void* context, SubBruteDeviceState state); typedef void (*SubBruteDeviceWorkerCallback)(void* context, SubBruteDeviceState state);
typedef struct { typedef struct {
SubBruteDeviceState state; SubBruteDeviceState state;
SubBruteProtocol* protocol_info; const SubBruteProtocol* protocol_info;
SubBruteProtocol* file_protocol_info;
volatile bool worker_running; volatile bool worker_running;
// Current step // Current step

View File

@@ -47,7 +47,6 @@ struct SubBruteState {
Popup* popup; Popup* popup;
Widget* widget; Widget* widget;
DialogsApp* dialogs; DialogsApp* dialogs;
Loading* loading;
// Text store // Text store
char text_store[SUBBRUTE_MAX_LEN_NAME]; char text_store[SUBBRUTE_MAX_LEN_NAME];

View File

@@ -1,41 +1,155 @@
#include "subbrute_protocols.h" #include "subbrute_protocols.h"
static const SubBruteProtocol subbrute_protocols[SubBruteAttackTotalCount] = { /**
[SubBruteAttackCAME12bit303] = * CAME 12bit 303MHz
{303875000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, CAMEFileProtocol}, */
[SubBruteAttackCAME12bit307] = const SubBruteProtocol subbrute_protocol_came_12bit_303 = {
{307800000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, CAMEFileProtocol}, .frequency = 303875000,
[SubBruteAttackCAME12bit433] = .bits = 12,
{433920000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, CAMEFileProtocol}, .te = 0,
[SubBruteAttackCAME12bit868] = .repeat = 3,
{868350000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, CAMEFileProtocol}, .preset = FuriHalSubGhzPresetOok650Async,
[SubBruteAttackNICE12bit433] = .file = CAMEFileProtocol};
{433920000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, NICEFileProtocol},
[SubBruteAttackNICE12bit868] = /**
{868350000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, NICEFileProtocol}, * CAME 12bit 307MHz
[SubBruteAttackChamberlain9bit300] = */
{300000000, 9, 0, 3, FuriHalSubGhzPresetOok650Async, ChamberlainFileProtocol}, const SubBruteProtocol subbrute_protocol_came_12bit_307 = {
[SubBruteAttackChamberlain9bit315] = .frequency = 307800000,
{315000000, 9, 0, 3, FuriHalSubGhzPresetOok650Async, ChamberlainFileProtocol}, .bits = 12,
[SubBruteAttackChamberlain9bit390] = .te = 0,
{390000000, 9, 0, 3, FuriHalSubGhzPresetOok650Async, ChamberlainFileProtocol}, .repeat = 3,
[SubBruteAttackLinear10bit300] = .preset = FuriHalSubGhzPresetOok650Async,
{300000000, 10, 0, 5, FuriHalSubGhzPresetOok650Async, LinearFileProtocol}, .file = CAMEFileProtocol};
[SubBruteAttackLinear10bit310] =
{300000000, 10, 0, 5, FuriHalSubGhzPresetOok650Async, LinearFileProtocol}, /**
[SubBruteAttackLoadFile] = {0, 0, 0, 3, FuriHalSubGhzPresetOok650Async, RAWFileProtocol}, * CAME 12bit 433MHz
}; */
//static const uint32_t subbrute_protocols[SubBruteAttackTotalCount][TotalProtocolFields] = { const SubBruteProtocol subbrute_protocol_came_12bit_433 = {
// [SubBruteAttackCAME12bit307] = {307800000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, CAMEFileProtocol}, .frequency = 433920000,
// [SubBruteAttackCAME12bit433] = {433920000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, CAMEFileProtocol}, .bits = 12,
// [SubBruteAttackCAME12bit868] = {868350000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, CAMEFileProtocol}, .te = 0,
// [SubBruteAttackNICE12bit433] = {433920000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, NICEFileProtocol}, .repeat = 3,
// [SubBruteAttackNICE12bit868] = {868350000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, NICEFileProtocol}, .preset = FuriHalSubGhzPresetOok650Async,
// [SubBruteAttackChamberlain9bit300] = {300000000, 9, 0, 3, FuriHalSubGhzPresetOok650Async, ChamberlainFileProtocol}, .file = CAMEFileProtocol};
// [SubBruteAttackChamberlain9bit315] = {315000000, 9, 0, 3, FuriHalSubGhzPresetOok650Async, ChamberlainFileProtocol},
// [SubBruteAttackChamberlain9bit390] = {390000000, 9, 0, 3, FuriHalSubGhzPresetOok650Async, ChamberlainFileProtocol}, /**
// [SubBruteAttackLinear10bit300] = {300000000, 10, 0, 5, FuriHalSubGhzPresetOok650Async, LinearFileProtocol}, * CAME 12bit 868MHz
// [SubBruteAttackLinear10bit310] = {300000000, 10, 0, 5, FuriHalSubGhzPresetOok650Async, LinearFileProtocol}, */
const SubBruteProtocol subbrute_protocol_came_12bit_868 = {
.frequency = 868350000,
.bits = 12,
.te = 0,
.repeat = 3,
.preset = FuriHalSubGhzPresetOok650Async,
.file = CAMEFileProtocol};
/**
* NICE 12bit 433MHz
*/
const SubBruteProtocol subbrute_protocol_nice_12bit_433 = {
.frequency = 433920000,
.bits = 12,
.te = 0,
.repeat = 3,
.preset = FuriHalSubGhzPresetOok650Async,
.file = NICEFileProtocol};
/**
* NICE 12bit 868MHz
*/
const SubBruteProtocol subbrute_protocol_nice_12bit_868 = {
.frequency = 868350000,
.bits = 12,
.te = 0,
.repeat = 3,
.preset = FuriHalSubGhzPresetOok650Async,
.file = NICEFileProtocol};
/**
* Chamberlain 9bit 300MHz
*/
const SubBruteProtocol subbrute_protocol_chamberlain_9bit_300 = {
.frequency = 300000000,
.bits = 9,
.te = 0,
.repeat = 3,
.preset = FuriHalSubGhzPresetOok650Async,
.file = ChamberlainFileProtocol};
/**
* Chamberlain 9bit 315MHz
*/
const SubBruteProtocol subbrute_protocol_chamberlain_9bit_315 = {
.frequency = 315000000,
.bits = 9,
.te = 0,
.repeat = 3,
.preset = FuriHalSubGhzPresetOok650Async,
.file = ChamberlainFileProtocol};
/**
* Chamberlain 9bit 390MHz
*/
const SubBruteProtocol subbrute_protocol_chamberlain_9bit_390 = {
.frequency = 390000000,
.bits = 9,
.te = 0,
.repeat = 3,
.preset = FuriHalSubGhzPresetOok650Async,
.file = ChamberlainFileProtocol};
/**
* Linear 10bit 300MHz
*/
const SubBruteProtocol subbrute_protocol_linear_10bit_300 = {
.frequency = 300000000,
.bits = 10,
.te = 0,
.repeat = 5,
.preset = FuriHalSubGhzPresetOok650Async,
.file = LinearFileProtocol};
/**
* Linear 10bit 310MHz
*/
const SubBruteProtocol subbrute_protocol_linear_10bit_310 = {
.frequency = 310000000,
.bits = 10,
.te = 0,
.repeat = 5,
.preset = FuriHalSubGhzPresetOok650Async,
.file = LinearFileProtocol};
/**
* BF existing dump
*/
const SubBruteProtocol subbrute_protocol_load_file =
{0, 0, 0, 3, FuriHalSubGhzPresetOok650Async, RAWFileProtocol};
//static const SubBruteProtocol subbrute_protocols[SubBruteAttackTotalCount] = {
// [SubBruteAttackCAME12bit303] =
// {303875000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, CAMEFileProtocol},
// [SubBruteAttackCAME12bit307] =
// {307800000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, CAMEFileProtocol},
// [SubBruteAttackCAME12bit433] =
// {433920000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, CAMEFileProtocol},
// [SubBruteAttackCAME12bit868] =
// {868350000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, CAMEFileProtocol},
// [SubBruteAttackNICE12bit433] =
// {433920000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, NICEFileProtocol},
// [SubBruteAttackNICE12bit868] =
// {868350000, 12, 0, 3, FuriHalSubGhzPresetOok650Async, NICEFileProtocol},
// [SubBruteAttackChamberlain9bit300] =
// {300000000, 9, 0, 3, FuriHalSubGhzPresetOok650Async, ChamberlainFileProtocol},
// [SubBruteAttackChamberlain9bit315] =
// {315000000, 9, 0, 3, FuriHalSubGhzPresetOok650Async, ChamberlainFileProtocol},
// [SubBruteAttackChamberlain9bit390] =
// {390000000, 9, 0, 3, FuriHalSubGhzPresetOok650Async, ChamberlainFileProtocol},
// [SubBruteAttackLinear10bit300] =
// {300000000, 10, 0, 5, FuriHalSubGhzPresetOok650Async, LinearFileProtocol},
// [SubBruteAttackLinear10bit310] =
// {300000000, 10, 0, 5, FuriHalSubGhzPresetOok650Async, LinearFileProtocol},
// [SubBruteAttackLoadFile] = {0, 0, 0, 3, FuriHalSubGhzPresetOok650Async, RAWFileProtocol}, // [SubBruteAttackLoadFile] = {0, 0, 0, 3, FuriHalSubGhzPresetOok650Async, RAWFileProtocol},
//}; //};
@@ -65,7 +179,21 @@ static const char* subbrute_protocol_presets[] = {
[FuriHalSubGhzPresetGFSK9_99KbAsync] = "FuriHalSubGhzPresetGFSK9_99KbAsync", [FuriHalSubGhzPresetGFSK9_99KbAsync] = "FuriHalSubGhzPresetGFSK9_99KbAsync",
}; };
static const char* subbrute_protocol_file_types[TotalFileProtocol] = { const SubBruteProtocol* subbrute_protocol_registry[] = {
[SubBruteAttackCAME12bit303] = &subbrute_protocol_came_12bit_303,
[SubBruteAttackCAME12bit307] = &subbrute_protocol_came_12bit_307,
[SubBruteAttackCAME12bit433] = &subbrute_protocol_came_12bit_433,
[SubBruteAttackCAME12bit868] = &subbrute_protocol_came_12bit_868,
[SubBruteAttackNICE12bit433] = &subbrute_protocol_nice_12bit_433,
[SubBruteAttackNICE12bit868] = &subbrute_protocol_nice_12bit_868,
[SubBruteAttackChamberlain9bit300] = &subbrute_protocol_chamberlain_9bit_300,
[SubBruteAttackChamberlain9bit315] = &subbrute_protocol_chamberlain_9bit_315,
[SubBruteAttackChamberlain9bit390] = &subbrute_protocol_chamberlain_9bit_390,
[SubBruteAttackLinear10bit300] = &subbrute_protocol_linear_10bit_300,
[SubBruteAttackLinear10bit310] = &subbrute_protocol_linear_10bit_310,
[SubBruteAttackLoadFile] = &subbrute_protocol_load_file};
static const char* subbrute_protocol_file_types[] = {
[CAMEFileProtocol] = "CAME", [CAMEFileProtocol] = "CAME",
[NICEFileProtocol] = "Nice FLO", [NICEFileProtocol] = "Nice FLO",
[ChamberlainFileProtocol] = "Cham_Code", [ChamberlainFileProtocol] = "Cham_Code",
@@ -73,32 +201,12 @@ static const char* subbrute_protocol_file_types[TotalFileProtocol] = {
[PrincetonFileProtocol] = "Princeton", [PrincetonFileProtocol] = "Princeton",
[RAWFileProtocol] = "RAW"}; [RAWFileProtocol] = "RAW"};
SubBruteProtocol* subbrute_protocol_alloc(void) {
SubBruteProtocol* protocol = malloc(sizeof(SubBruteProtocol));
protocol->frequency = subbrute_protocols[SubBruteAttackLoadFile].frequency;
protocol->repeat = subbrute_protocols[SubBruteAttackLoadFile].repeat;
protocol->preset = subbrute_protocols[SubBruteAttackLoadFile].preset;
protocol->file = subbrute_protocols[SubBruteAttackLoadFile].file;
protocol->te = subbrute_protocols[SubBruteAttackLoadFile].te;
protocol->bits = subbrute_protocols[SubBruteAttackLoadFile].bits;
return protocol;
}
const char* subbrute_protocol_name(SubBruteAttacks index) { const char* subbrute_protocol_name(SubBruteAttacks index) {
return subbrute_protocol_names[index]; return subbrute_protocol_names[index];
} }
SubBruteProtocol* subbrute_protocol(SubBruteAttacks index) { const SubBruteProtocol* subbrute_protocol(SubBruteAttacks index) {
SubBruteProtocol* protocol = subbrute_protocol_alloc(); return subbrute_protocol_registry[index];
protocol->frequency = subbrute_protocols[index].frequency;
protocol->repeat = subbrute_protocols[index].repeat;
protocol->preset = subbrute_protocols[index].preset;
protocol->file = subbrute_protocols[index].file;
protocol->te = subbrute_protocols[index].te;
protocol->bits = subbrute_protocols[index].bits;
return protocol;
} }
const char* subbrute_protocol_preset(FuriHalSubGhzPreset preset) { const char* subbrute_protocol_preset(FuriHalSubGhzPreset preset) {

View File

@@ -49,8 +49,7 @@ typedef struct {
SubBruteFileProtocol file; SubBruteFileProtocol file;
} SubBruteProtocol; } SubBruteProtocol;
SubBruteProtocol* subbrute_protocol_alloc(void); const SubBruteProtocol* subbrute_protocol(SubBruteAttacks index);
SubBruteProtocol* subbrute_protocol(SubBruteAttacks index);
const char* subbrute_protocol_preset(FuriHalSubGhzPreset preset); const char* subbrute_protocol_preset(FuriHalSubGhzPreset preset);
const char* subbrute_protocol_file(SubBruteFileProtocol protocol); const char* subbrute_protocol_file(SubBruteFileProtocol protocol);
FuriHalSubGhzPreset subbrute_protocol_convert_preset(FuriString* preset_name); FuriHalSubGhzPreset subbrute_protocol_convert_preset(FuriString* preset_name);

View File

@@ -2,11 +2,11 @@
#include "../subbrute_i.h" #include "../subbrute_i.h"
#include "../subbrute_protocols.h" #include "../subbrute_protocols.h"
#include "assets_icons.h"
#include <input/input.h> #include <input/input.h>
#include <gui/elements.h> #include <gui/elements.h>
#include <gui/icon_i.h> #include <gui/icon.h>
#include <gui/icon_animation_i.h> #include <gui/icon_animation.h>
#include <assets_icons.h>
#define TAG "SubBruteAttackView" #define TAG "SubBruteAttackView"
@@ -291,8 +291,8 @@ void elements_button_top_left(Canvas* canvas, const char* str) {
const uint8_t horizontal_offset = 3; const uint8_t horizontal_offset = 3;
const uint8_t string_width = canvas_string_width(canvas, str); const uint8_t string_width = canvas_string_width(canvas, str);
const uint8_t icon_h_offset = 3; const uint8_t icon_h_offset = 3;
const uint8_t icon_width_with_offset = icon->width + icon_h_offset; const uint8_t icon_width_with_offset = icon_get_width(icon) + icon_h_offset;
const uint8_t icon_v_offset = icon->height; // const uint8_t icon_v_offset = icon_get_height(icon); //
const uint8_t button_width = string_width + horizontal_offset * 2 + icon_width_with_offset + 1; const uint8_t button_width = string_width + horizontal_offset * 2 + icon_width_with_offset + 1;
const uint8_t x = 0; const uint8_t x = 0;
@@ -318,8 +318,8 @@ void elements_button_top_right(Canvas* canvas, const char* str) {
const uint8_t horizontal_offset = 3; const uint8_t horizontal_offset = 3;
const uint8_t string_width = canvas_string_width(canvas, str); const uint8_t string_width = canvas_string_width(canvas, str);
const uint8_t icon_h_offset = 3; const uint8_t icon_h_offset = 3;
const uint8_t icon_width_with_offset = icon->width + icon_h_offset; const uint8_t icon_width_with_offset = icon_get_width(icon) + icon_h_offset;
const uint8_t icon_v_offset = icon->height; // + vertical_offset; const uint8_t icon_v_offset = icon_get_height(icon); // + vertical_offset;
const uint8_t button_width = string_width + horizontal_offset * 2 + icon_width_with_offset + 1; const uint8_t button_width = string_width + horizontal_offset * 2 + icon_width_with_offset + 1;
const uint8_t x = canvas_width(canvas); const uint8_t x = canvas_width(canvas);
@@ -332,7 +332,7 @@ void elements_button_top_right(Canvas* canvas, const char* str) {
canvas_invert_color(canvas); canvas_invert_color(canvas);
canvas_draw_str(canvas, x - button_width + horizontal_offset, y + vertical_offset, str); canvas_draw_str(canvas, x - button_width + horizontal_offset, y + vertical_offset, str);
canvas_draw_icon(canvas, x - horizontal_offset - icon->width, y + icon_v_offset, icon); canvas_draw_icon(canvas, x - horizontal_offset - icon_get_width(icon), y + icon_v_offset, icon);
canvas_invert_color(canvas); canvas_invert_color(canvas);
} }
@@ -371,8 +371,8 @@ void subbrute_attack_view_draw(Canvas* canvas, void* context) {
} }
// canvas_draw_icon_animation // canvas_draw_icon_animation
const uint8_t icon_h_offset = 0; const uint8_t icon_h_offset = 0;
const uint8_t icon_width_with_offset = model->icon->icon->width + icon_h_offset; const uint8_t icon_width_with_offset = icon_animation_get_width(model->icon) + icon_h_offset;
const uint8_t icon_v_offset = model->icon->icon->height; // + vertical_offset; const uint8_t icon_v_offset = icon_animation_get_height(model->icon); // + vertical_offset;
const uint8_t x = canvas_width(canvas); const uint8_t x = canvas_width(canvas);
const uint8_t y = canvas_height(canvas); const uint8_t y = canvas_height(canvas);
canvas_draw_icon_animation( canvas_draw_icon_animation(

View File

@@ -2,11 +2,8 @@
#include "../subbrute_custom_event.h" #include "../subbrute_custom_event.h"
#include <gui/view.h> #include <gui/view.h>
#include "assets_icons.h"
#include <input/input.h> #include <input/input.h>
#include <gui/elements.h> #include <gui/elements.h>
#include <gui/icon.h>
#include <subghz/types.h>
typedef void (*SubBruteAttackViewCallback)(SubBruteCustomEvent event, void* context); typedef void (*SubBruteAttackViewCallback)(SubBruteCustomEvent event, void* context);
typedef struct SubBruteAttackView SubBruteAttackView; typedef struct SubBruteAttackView SubBruteAttackView;

View File

@@ -4,8 +4,8 @@
#include <input/input.h> #include <input/input.h>
#include <gui/elements.h> #include <gui/elements.h>
#include "assets_icons.h"
#include <gui/icon.h> #include <gui/icon.h>
#include <assets_icons.h>
#define STATUS_BAR_Y_SHIFT 14 #define STATUS_BAR_Y_SHIFT 14
#define TAG "SubBruteMainView" #define TAG "SubBruteMainView"

View File

@@ -2,10 +2,8 @@
#include "../subbrute_custom_event.h" #include "../subbrute_custom_event.h"
#include <gui/view.h> #include <gui/view.h>
#include "assets_icons.h"
#include <input/input.h> #include <input/input.h>
#include <gui/elements.h> #include <gui/elements.h>
#include <gui/icon.h>
typedef void (*SubBruteMainViewCallback)(SubBruteCustomEvent event, void* context); typedef void (*SubBruteMainViewCallback)(SubBruteCustomEvent event, void* context);
typedef struct SubBruteMainView SubBruteMainView; typedef struct SubBruteMainView SubBruteMainView;