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_scene.h"
#include "../subbrute_custom_event.h"
#include "../views/subbrute_attack_view.h"
#define TAG "SubBruteSceneRunAttack"

View File

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

View File

@@ -40,7 +40,7 @@ SubBruteState* subbrute_alloc() {
view_dispatcher_set_navigation_event_callback(
instance->view_dispatcher, subbrute_back_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
instance->dialogs = furi_record_open(RECORD_DIALOGS);
@@ -87,8 +87,6 @@ SubBruteState* subbrute_alloc() {
SubBruteViewAttack,
subbrute_attack_view_get_view(instance->view_attack));
// Loading
instance->loading = loading_alloc();
//instance->flipper_format = flipper_format_string_alloc();
//instance->environment = subghz_environment_alloc();
@@ -99,91 +97,49 @@ void subbrute_free(SubBruteState* instance) {
furi_assert(instance);
// SubBruteDevice
#ifdef FURI_DEBUG
FURI_LOG_D(TAG, "free SubBruteDevice");
#endif
subbrute_worker_stop(instance->device);
subbrute_device_free(instance->device);
// Notifications
#ifdef FURI_DEBUG
FURI_LOG_D(TAG, "free Notifications");
#endif
notification_message(instance->notifications, &sequence_blink_stop);
furi_record_close(RECORD_NOTIFICATION);
instance->notifications = NULL;
// Loading
#ifdef FURI_DEBUG
FURI_LOG_D(TAG, "free loading");
#endif
loading_free(instance->loading);
// View Main
#ifdef FURI_DEBUG
FURI_LOG_D(TAG, "free SubBruteViewMain");
#endif
view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewMain);
subbrute_main_view_free(instance->view_main);
// View Attack
#ifdef FURI_DEBUG
FURI_LOG_D(TAG, "free SubBruteViewAttack");
#endif
view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewAttack);
subbrute_attack_view_free(instance->view_attack);
// TextInput
#ifdef FURI_DEBUG
FURI_LOG_D(TAG, "free SubBruteViewTextInput");
#endif
view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewTextInput);
text_input_free(instance->text_input);
// Custom Widget
#ifdef FURI_DEBUG
FURI_LOG_D(TAG, "free SubBruteViewWidget");
#endif
view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewWidget);
widget_free(instance->widget);
// Popup
#ifdef FURI_DEBUG
FURI_LOG_D(TAG, "free SubBruteViewPopup");
#endif
view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewPopup);
popup_free(instance->popup);
// ViewStack
#ifdef FURI_DEBUG
FURI_LOG_D(TAG, "free SubBruteViewStack");
#endif
view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewStack);
view_stack_free(instance->view_stack);
//Dialog
#ifdef FURI_DEBUG
FURI_LOG_D(TAG, "free RECORD_DIALOGS");
#endif
furi_record_close(RECORD_DIALOGS);
instance->dialogs = NULL;
// Scene manager
#ifdef FURI_DEBUG
FURI_LOG_D(TAG, "free scene_manager");
#endif
scene_manager_free(instance->scene_manager);
// View Dispatcher
#ifdef FURI_DEBUG
FURI_LOG_D(TAG, "free view_dispatcher");
#endif
view_dispatcher_free(instance->view_dispatcher);
// GUI
#ifdef FURI_DEBUG
FURI_LOG_D(TAG, "free RECORD_GUI");
#endif
furi_record_close(RECORD_GUI);
instance->gui = NULL;
@@ -193,23 +149,6 @@ void subbrute_free(SubBruteState* 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) {
furi_assert(context);
SubBruteState* instance = context;

View File

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

View File

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

View File

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

View File

@@ -1,41 +1,155 @@
#include "subbrute_protocols.h"
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},
};
//static const uint32_t subbrute_protocols[SubBruteAttackTotalCount][TotalProtocolFields] = {
// [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},
/**
* CAME 12bit 303MHz
*/
const SubBruteProtocol subbrute_protocol_came_12bit_303 = {
.frequency = 303875000,
.bits = 12,
.te = 0,
.repeat = 3,
.preset = FuriHalSubGhzPresetOok650Async,
.file = CAMEFileProtocol};
/**
* CAME 12bit 307MHz
*/
const SubBruteProtocol subbrute_protocol_came_12bit_307 = {
.frequency = 307800000,
.bits = 12,
.te = 0,
.repeat = 3,
.preset = FuriHalSubGhzPresetOok650Async,
.file = CAMEFileProtocol};
/**
* CAME 12bit 433MHz
*/
const SubBruteProtocol subbrute_protocol_came_12bit_433 = {
.frequency = 433920000,
.bits = 12,
.te = 0,
.repeat = 3,
.preset = FuriHalSubGhzPresetOok650Async,
.file = CAMEFileProtocol};
/**
* CAME 12bit 868MHz
*/
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},
//};
@@ -65,7 +179,21 @@ static const char* subbrute_protocol_presets[] = {
[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",
[NICEFileProtocol] = "Nice FLO",
[ChamberlainFileProtocol] = "Cham_Code",
@@ -73,32 +201,12 @@ static const char* subbrute_protocol_file_types[TotalFileProtocol] = {
[PrincetonFileProtocol] = "Princeton",
[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) {
return subbrute_protocol_names[index];
}
SubBruteProtocol* subbrute_protocol(SubBruteAttacks index) {
SubBruteProtocol* protocol = subbrute_protocol_alloc();
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 SubBruteProtocol* subbrute_protocol(SubBruteAttacks index) {
return subbrute_protocol_registry[index];
}
const char* subbrute_protocol_preset(FuriHalSubGhzPreset preset) {

View File

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

View File

@@ -2,11 +2,11 @@
#include "../subbrute_i.h"
#include "../subbrute_protocols.h"
#include "assets_icons.h"
#include <input/input.h>
#include <gui/elements.h>
#include <gui/icon_i.h>
#include <gui/icon_animation_i.h>
#include <gui/icon.h>
#include <gui/icon_animation.h>
#include <assets_icons.h>
#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 string_width = canvas_string_width(canvas, str);
const uint8_t icon_h_offset = 3;
const uint8_t icon_width_with_offset = icon->width + icon_h_offset;
const uint8_t icon_v_offset = icon->height; //
const uint8_t icon_width_with_offset = icon_get_width(icon) + icon_h_offset;
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 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 string_width = canvas_string_width(canvas, str);
const uint8_t icon_h_offset = 3;
const uint8_t icon_width_with_offset = icon->width + icon_h_offset;
const uint8_t icon_v_offset = icon->height; // + vertical_offset;
const uint8_t icon_width_with_offset = icon_get_width(icon) + icon_h_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 x = canvas_width(canvas);
@@ -332,7 +332,7 @@ void elements_button_top_right(Canvas* canvas, const char* str) {
canvas_invert_color(canvas);
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);
}
@@ -371,8 +371,8 @@ void subbrute_attack_view_draw(Canvas* canvas, void* context) {
}
// canvas_draw_icon_animation
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_v_offset = model->icon->icon->height; // + vertical_offset;
const uint8_t icon_width_with_offset = icon_animation_get_width(model->icon) + icon_h_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 y = canvas_height(canvas);
canvas_draw_icon_animation(

View File

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

View File

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

View File

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