mirror of
https://github.com/DarkFlippers/unleashed-firmware
synced 2025-02-17 13:58:32 +00:00
Implement TX while button is hold, other small changes
Repeat functionality removed since all buttons adds event in queue to be executed after tx is finished
This commit is contained in:
parent
5b6f2cb80d
commit
7abc49ea21
1 changed files with 156 additions and 143 deletions
|
@ -25,6 +25,19 @@
|
||||||
|
|
||||||
#define TAG "UniRF Remix"
|
#define TAG "UniRF Remix"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t frequency;
|
||||||
|
string_t name;
|
||||||
|
|
||||||
|
string_t protocol;
|
||||||
|
uint32_t repeat;
|
||||||
|
|
||||||
|
uint8_t* data;
|
||||||
|
size_t data_size;
|
||||||
|
|
||||||
|
SubGhzProtocolDecoderBase* decoder;
|
||||||
|
} UniRFPreset;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
FuriMutex* model_mutex;
|
FuriMutex* model_mutex;
|
||||||
|
|
||||||
|
@ -37,6 +50,7 @@ typedef struct {
|
||||||
SubGhzEnvironment* environment;
|
SubGhzEnvironment* environment;
|
||||||
SubGhzReceiver* subghz_receiver;
|
SubGhzReceiver* subghz_receiver;
|
||||||
NotificationApp* notification;
|
NotificationApp* notification;
|
||||||
|
UniRFPreset* txpreset;
|
||||||
|
|
||||||
string_t up_file;
|
string_t up_file;
|
||||||
string_t down_file;
|
string_t down_file;
|
||||||
|
@ -68,7 +82,11 @@ typedef struct {
|
||||||
char* send_status;
|
char* send_status;
|
||||||
int send_status_c;
|
int send_status_c;
|
||||||
int processing;
|
int processing;
|
||||||
int repeat;
|
|
||||||
|
SubGhzTransmitter* tx_transmitter;
|
||||||
|
FlipperFormat* tx_fff_data;
|
||||||
|
const char* tx_file_path;
|
||||||
|
//int repeat;
|
||||||
int button;
|
int button;
|
||||||
|
|
||||||
int file_result;
|
int file_result;
|
||||||
|
@ -78,19 +96,6 @@ typedef struct {
|
||||||
string_t signal;
|
string_t signal;
|
||||||
} UniRFRemix;
|
} UniRFRemix;
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint32_t frequency;
|
|
||||||
string_t name;
|
|
||||||
|
|
||||||
string_t protocol;
|
|
||||||
uint32_t repeat;
|
|
||||||
|
|
||||||
uint8_t* data;
|
|
||||||
size_t data_size;
|
|
||||||
|
|
||||||
SubGhzProtocolDecoderBase* decoder;
|
|
||||||
} UniRFPreset;
|
|
||||||
|
|
||||||
UniRFPreset* unirfremix_preset_alloc(void) {
|
UniRFPreset* unirfremix_preset_alloc(void) {
|
||||||
UniRFPreset* preset = malloc(sizeof(UniRFPreset));
|
UniRFPreset* preset = malloc(sizeof(UniRFPreset));
|
||||||
string_init(preset->name);
|
string_init(preset->name);
|
||||||
|
@ -113,7 +118,7 @@ static char* char_to_str(char* str, int i) {
|
||||||
|
|
||||||
return converted;
|
return converted;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
static const char* int_to_char(int number) {
|
static const char* int_to_char(int number) {
|
||||||
switch(number) {
|
switch(number) {
|
||||||
case 0:
|
case 0:
|
||||||
|
@ -140,7 +145,7 @@ static const char* int_to_char(int number) {
|
||||||
return "0";
|
return "0";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
//get filename without path
|
//get filename without path
|
||||||
static char* extract_filename(const char* name, int len) {
|
static char* extract_filename(const char* name, int len) {
|
||||||
string_t tmp;
|
string_t tmp;
|
||||||
|
@ -328,8 +333,6 @@ void unirfremix_cfg_set_check(UniRFRemix* app, string_t file_name) {
|
||||||
flipper_format_file_close(fff_data_file);
|
flipper_format_file_close(fff_data_file);
|
||||||
flipper_format_free(fff_data_file);
|
flipper_format_free(fff_data_file);
|
||||||
|
|
||||||
furi_record_close(RECORD_STORAGE);
|
|
||||||
|
|
||||||
//File Existence Check
|
//File Existence Check
|
||||||
//Check each file definition if not already set to "N/A"
|
//Check each file definition if not already set to "N/A"
|
||||||
|
|
||||||
|
@ -350,7 +353,6 @@ void unirfremix_cfg_set_check(UniRFRemix* app, string_t file_name) {
|
||||||
//if button is still enabled, check that file exists
|
//if button is still enabled, check that file exists
|
||||||
if(app->up_enabled == 1) {
|
if(app->up_enabled == 1) {
|
||||||
string_set(file_name, app->up_file);
|
string_set(file_name, app->up_file);
|
||||||
storage = furi_record_open(RECORD_STORAGE);
|
|
||||||
fff_data_file = flipper_format_file_alloc(storage);
|
fff_data_file = flipper_format_file_alloc(storage);
|
||||||
|
|
||||||
if(!flipper_format_file_open_existing(fff_data_file, string_get_cstr(file_name))) {
|
if(!flipper_format_file_open_existing(fff_data_file, string_get_cstr(file_name))) {
|
||||||
|
@ -365,12 +367,10 @@ void unirfremix_cfg_set_check(UniRFRemix* app, string_t file_name) {
|
||||||
//close the file
|
//close the file
|
||||||
flipper_format_file_close(fff_data_file);
|
flipper_format_file_close(fff_data_file);
|
||||||
flipper_format_free(fff_data_file);
|
flipper_format_free(fff_data_file);
|
||||||
furi_record_close(RECORD_STORAGE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(app->down_enabled == 1) {
|
if(app->down_enabled == 1) {
|
||||||
string_set(file_name, app->down_file);
|
string_set(file_name, app->down_file);
|
||||||
storage = furi_record_open(RECORD_STORAGE);
|
|
||||||
fff_data_file = flipper_format_file_alloc(storage);
|
fff_data_file = flipper_format_file_alloc(storage);
|
||||||
|
|
||||||
if(!flipper_format_file_open_existing(fff_data_file, string_get_cstr(file_name))) {
|
if(!flipper_format_file_open_existing(fff_data_file, string_get_cstr(file_name))) {
|
||||||
|
@ -383,12 +383,10 @@ void unirfremix_cfg_set_check(UniRFRemix* app, string_t file_name) {
|
||||||
|
|
||||||
flipper_format_file_close(fff_data_file);
|
flipper_format_file_close(fff_data_file);
|
||||||
flipper_format_free(fff_data_file);
|
flipper_format_free(fff_data_file);
|
||||||
furi_record_close(RECORD_STORAGE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(app->left_enabled == 1) {
|
if(app->left_enabled == 1) {
|
||||||
string_set(file_name, app->left_file);
|
string_set(file_name, app->left_file);
|
||||||
storage = furi_record_open(RECORD_STORAGE);
|
|
||||||
fff_data_file = flipper_format_file_alloc(storage);
|
fff_data_file = flipper_format_file_alloc(storage);
|
||||||
|
|
||||||
if(!flipper_format_file_open_existing(fff_data_file, string_get_cstr(file_name))) {
|
if(!flipper_format_file_open_existing(fff_data_file, string_get_cstr(file_name))) {
|
||||||
|
@ -401,12 +399,10 @@ void unirfremix_cfg_set_check(UniRFRemix* app, string_t file_name) {
|
||||||
|
|
||||||
flipper_format_file_close(fff_data_file);
|
flipper_format_file_close(fff_data_file);
|
||||||
flipper_format_free(fff_data_file);
|
flipper_format_free(fff_data_file);
|
||||||
furi_record_close(RECORD_STORAGE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(app->right_enabled == 1) {
|
if(app->right_enabled == 1) {
|
||||||
string_set(file_name, app->right_file);
|
string_set(file_name, app->right_file);
|
||||||
storage = furi_record_open(RECORD_STORAGE);
|
|
||||||
fff_data_file = flipper_format_file_alloc(storage);
|
fff_data_file = flipper_format_file_alloc(storage);
|
||||||
|
|
||||||
if(!flipper_format_file_open_existing(fff_data_file, string_get_cstr(file_name))) {
|
if(!flipper_format_file_open_existing(fff_data_file, string_get_cstr(file_name))) {
|
||||||
|
@ -419,12 +415,10 @@ void unirfremix_cfg_set_check(UniRFRemix* app, string_t file_name) {
|
||||||
|
|
||||||
flipper_format_file_close(fff_data_file);
|
flipper_format_file_close(fff_data_file);
|
||||||
flipper_format_free(fff_data_file);
|
flipper_format_free(fff_data_file);
|
||||||
furi_record_close(RECORD_STORAGE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(app->ok_enabled == 1) {
|
if(app->ok_enabled == 1) {
|
||||||
string_set(file_name, app->ok_file);
|
string_set(file_name, app->ok_file);
|
||||||
storage = furi_record_open(RECORD_STORAGE);
|
|
||||||
fff_data_file = flipper_format_file_alloc(storage);
|
fff_data_file = flipper_format_file_alloc(storage);
|
||||||
|
|
||||||
if(!flipper_format_file_open_existing(fff_data_file, string_get_cstr(file_name))) {
|
if(!flipper_format_file_open_existing(fff_data_file, string_get_cstr(file_name))) {
|
||||||
|
@ -437,9 +431,10 @@ void unirfremix_cfg_set_check(UniRFRemix* app, string_t file_name) {
|
||||||
|
|
||||||
flipper_format_file_close(fff_data_file);
|
flipper_format_file_close(fff_data_file);
|
||||||
flipper_format_free(fff_data_file);
|
flipper_format_free(fff_data_file);
|
||||||
furi_record_close(RECORD_STORAGE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
furi_record_close(RECORD_STORAGE);
|
||||||
|
|
||||||
if(app->file_blank == 5) {
|
if(app->file_blank == 5) {
|
||||||
app->file_result = 1;
|
app->file_result = 1;
|
||||||
} else {
|
} else {
|
||||||
|
@ -587,40 +582,50 @@ bool unirfremix_save_protocol_to_file(FlipperFormat* fff_file, const char* dev_f
|
||||||
return saved;
|
return saved;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool unirfremix_send_sub(
|
void unirfremix_tx_stop(UniRFRemix* app) {
|
||||||
UniRFRemix* app,
|
if(!string_cmp_str(app->txpreset->protocol, "RAW")) {
|
||||||
FlipperFormat* fff_file,
|
while(!furi_hal_subghz_is_async_tx_complete()) {
|
||||||
FlipperFormat* fff_data,
|
furi_delay_ms(60);
|
||||||
const char* path) {
|
}
|
||||||
//
|
}
|
||||||
UniRFPreset* preset = unirfremix_preset_alloc();
|
//Stop TX
|
||||||
|
furi_hal_subghz_stop_async_tx();
|
||||||
|
FURI_LOG_I(TAG, "TX Done!");
|
||||||
|
subghz_transmitter_stop(app->tx_transmitter);
|
||||||
|
|
||||||
|
FURI_LOG_D(TAG, "Checking if protocol is dynamic");
|
||||||
|
const SubGhzProtocol* registry =
|
||||||
|
subghz_protocol_registry_get_by_name(string_get_cstr(app->txpreset->protocol));
|
||||||
|
FURI_LOG_D(TAG, "Protocol-TYPE %d", registry->type);
|
||||||
|
if(registry && registry->type == SubGhzProtocolTypeDynamic) {
|
||||||
|
FURI_LOG_D(TAG, "Protocol is dynamic. Saving key");
|
||||||
|
unirfremix_save_protocol_to_file(app->tx_fff_data, app->tx_file_path);
|
||||||
|
|
||||||
|
keeloq_reset_mfname();
|
||||||
|
keeloq_reset_kl_type();
|
||||||
|
star_line_reset_mfname();
|
||||||
|
star_line_reset_kl_type();
|
||||||
|
}
|
||||||
|
|
||||||
|
subghz_transmitter_free(app->tx_transmitter);
|
||||||
|
furi_hal_subghz_idle();
|
||||||
|
|
||||||
|
notification_message(app->notification, &sequence_blink_stop);
|
||||||
|
|
||||||
|
unirfremix_preset_free(app->txpreset);
|
||||||
|
flipper_format_free(app->tx_fff_data);
|
||||||
|
unirfremix_end_send(app);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool unirfremix_send_sub(UniRFRemix* app, FlipperFormat* fff_data) {
|
||||||
|
//
|
||||||
bool res = false;
|
bool res = false;
|
||||||
do {
|
do {
|
||||||
// load settings/stream from .sub file
|
if(!furi_hal_subghz_is_tx_allowed(app->txpreset->frequency)) {
|
||||||
bool open_ok = false;
|
|
||||||
do {
|
|
||||||
if(!flipper_format_file_open_existing(fff_file, path)) {
|
|
||||||
FURI_LOG_E(TAG, "Could not open file %s", path);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if(!unirfremix_key_load(
|
|
||||||
preset, fff_file, fff_data, app->setting, app->subghz_receiver, path)) {
|
|
||||||
FURI_LOG_E(TAG, "Could not load key");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
open_ok = true;
|
|
||||||
} while(0);
|
|
||||||
flipper_format_free(fff_file);
|
|
||||||
if(!open_ok) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!furi_hal_subghz_is_tx_allowed(preset->frequency)) {
|
|
||||||
printf(
|
printf(
|
||||||
"In your settings, only reception on this frequency (%lu) is allowed,\r\n"
|
"In your settings, only reception on this frequency (%lu) is allowed,\r\n"
|
||||||
"the actual operation of the unirf app is not possible\r\n ",
|
"the actual operation of the unirf app is not possible\r\n ",
|
||||||
preset->frequency);
|
app->txpreset->frequency);
|
||||||
app->tx_not_allowed = true;
|
app->tx_not_allowed = true;
|
||||||
unirfremix_end_send(app);
|
unirfremix_end_send(app);
|
||||||
break;
|
break;
|
||||||
|
@ -628,21 +633,21 @@ static bool unirfremix_send_sub(
|
||||||
app->tx_not_allowed = false;
|
app->tx_not_allowed = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
SubGhzTransmitter* transmitter =
|
app->tx_transmitter = subghz_transmitter_alloc_init(
|
||||||
subghz_transmitter_alloc_init(app->environment, string_get_cstr(preset->protocol));
|
app->environment, string_get_cstr(app->txpreset->protocol));
|
||||||
if(!transmitter) {
|
if(!app->tx_transmitter) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
subghz_transmitter_deserialize(transmitter, fff_data);
|
subghz_transmitter_deserialize(app->tx_transmitter, fff_data);
|
||||||
|
|
||||||
furi_hal_subghz_reset();
|
furi_hal_subghz_reset();
|
||||||
furi_hal_subghz_idle();
|
furi_hal_subghz_idle();
|
||||||
furi_hal_subghz_load_custom_preset(preset->data);
|
furi_hal_subghz_load_custom_preset(app->txpreset->data);
|
||||||
furi_hal_gpio_init(&gpio_cc1101_g0, GpioModeInput, GpioPullNo, GpioSpeedLow);
|
furi_hal_gpio_init(&gpio_cc1101_g0, GpioModeInput, GpioPullNo, GpioSpeedLow);
|
||||||
|
|
||||||
furi_hal_subghz_idle();
|
furi_hal_subghz_idle();
|
||||||
furi_hal_subghz_set_frequency_and_path(preset->frequency);
|
furi_hal_subghz_set_frequency_and_path(app->txpreset->frequency);
|
||||||
furi_hal_gpio_init(&gpio_cc1101_g0, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow);
|
furi_hal_gpio_init(&gpio_cc1101_g0, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow);
|
||||||
furi_hal_gpio_write(&gpio_cc1101_g0, true);
|
furi_hal_gpio_write(&gpio_cc1101_g0, true);
|
||||||
|
|
||||||
|
@ -652,65 +657,52 @@ static bool unirfremix_send_sub(
|
||||||
}
|
}
|
||||||
|
|
||||||
FURI_LOG_I(TAG, "Sending...");
|
FURI_LOG_I(TAG, "Sending...");
|
||||||
notification_message(app->notification, &sequence_blink_start_green);
|
notification_message(app->notification, &sequence_blink_start_magenta);
|
||||||
|
|
||||||
furi_hal_subghz_start_async_tx(subghz_transmitter_yield, transmitter);
|
furi_hal_subghz_start_async_tx(subghz_transmitter_yield, app->tx_transmitter);
|
||||||
while(!furi_hal_subghz_is_async_tx_complete()) {
|
|
||||||
furi_delay_ms(33);
|
|
||||||
}
|
|
||||||
furi_hal_subghz_stop_async_tx();
|
|
||||||
|
|
||||||
FURI_LOG_I(TAG, " Done!");
|
|
||||||
notification_message(app->notification, &sequence_blink_stop);
|
|
||||||
|
|
||||||
subghz_transmitter_stop(transmitter);
|
|
||||||
|
|
||||||
res = true;
|
res = true;
|
||||||
|
|
||||||
FURI_LOG_D(TAG, "Checking if protocol is dynamic");
|
|
||||||
const SubGhzProtocol* registry =
|
|
||||||
subghz_protocol_registry_get_by_name(string_get_cstr(preset->protocol));
|
|
||||||
FURI_LOG_D(TAG, "Protocol-TYPE %d", registry->type);
|
|
||||||
if(registry && registry->type == SubGhzProtocolTypeDynamic) {
|
|
||||||
FURI_LOG_D(TAG, " Protocol is dynamic. Updating Repeat");
|
|
||||||
unirfremix_save_protocol_to_file(fff_data, path);
|
|
||||||
|
|
||||||
keeloq_reset_mfname();
|
|
||||||
keeloq_reset_kl_type();
|
|
||||||
star_line_reset_mfname();
|
|
||||||
star_line_reset_kl_type();
|
|
||||||
}
|
|
||||||
|
|
||||||
subghz_transmitter_free(transmitter);
|
|
||||||
|
|
||||||
furi_hal_subghz_idle();
|
|
||||||
furi_hal_subghz_sleep();
|
|
||||||
} while(0);
|
} while(0);
|
||||||
|
|
||||||
unirfremix_preset_free(preset);
|
|
||||||
unirfremix_end_send(app);
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void unirfremix_send_signal(UniRFRemix* app, Storage* storage, const char* path) {
|
static void unirfremix_send_signal(UniRFRemix* app, Storage* storage, const char* path) {
|
||||||
FURI_LOG_I(TAG, "Sending: %s", path);
|
FURI_LOG_I(TAG, "Sending: %s", path);
|
||||||
|
|
||||||
FlipperFormat* fff_data = flipper_format_string_alloc();
|
app->tx_file_path = path;
|
||||||
|
|
||||||
string_t preset, protocol;
|
app->tx_fff_data = flipper_format_string_alloc();
|
||||||
string_init(preset);
|
|
||||||
string_init(protocol);
|
|
||||||
|
|
||||||
for(int x = 0; x < app->repeat; ++x) {
|
app->txpreset = unirfremix_preset_alloc();
|
||||||
FlipperFormat* fff_file = flipper_format_file_alloc(storage);
|
|
||||||
unirfremix_send_sub(app, fff_file, fff_data, path);
|
// load settings/stream from .sub file
|
||||||
|
FlipperFormat* fff_file = flipper_format_file_alloc(storage);
|
||||||
|
bool open_ok = false;
|
||||||
|
do {
|
||||||
|
if(!flipper_format_file_open_existing(fff_file, path)) {
|
||||||
|
FURI_LOG_E(TAG, "Could not open file %s", path);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(!unirfremix_key_load(
|
||||||
|
app->txpreset,
|
||||||
|
fff_file,
|
||||||
|
app->tx_fff_data,
|
||||||
|
app->setting,
|
||||||
|
app->subghz_receiver,
|
||||||
|
path)) {
|
||||||
|
FURI_LOG_E(TAG, "Could not load key");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
open_ok = true;
|
||||||
|
} while(0);
|
||||||
|
flipper_format_free(fff_file);
|
||||||
|
if(!open_ok) {
|
||||||
|
FURI_LOG_E(TAG, "Could not load file!");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
string_clear(protocol);
|
unirfremix_send_sub(app, app->tx_fff_data);
|
||||||
string_clear(preset);
|
|
||||||
flipper_format_free(fff_data);
|
|
||||||
|
|
||||||
unirfremix_end_send(app);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void unirfremix_process_signal(UniRFRemix* app, string_t signal) {
|
static void unirfremix_process_signal(UniRFRemix* app, string_t signal) {
|
||||||
|
@ -739,7 +731,7 @@ static void render_callback(Canvas* canvas, void* ctx) {
|
||||||
canvas_draw_str_aligned(canvas, 62, 5, AlignCenter, AlignTop, "Config is incorrect.");
|
canvas_draw_str_aligned(canvas, 62, 5, AlignCenter, AlignTop, "Config is incorrect.");
|
||||||
canvas_set_font(canvas, FontSecondary);
|
canvas_set_font(canvas, FontSecondary);
|
||||||
canvas_draw_str_aligned(canvas, 62, 30, AlignCenter, AlignTop, "Please configure map.");
|
canvas_draw_str_aligned(canvas, 62, 30, AlignCenter, AlignTop, "Please configure map.");
|
||||||
canvas_draw_str_aligned(canvas, 62, 60, AlignCenter, AlignBottom, "Hold Back to Exit.");
|
canvas_draw_str_aligned(canvas, 62, 60, AlignCenter, AlignBottom, "Press Back to Exit.");
|
||||||
} else if(app->tx_not_allowed) {
|
} else if(app->tx_not_allowed) {
|
||||||
canvas_clear(canvas);
|
canvas_clear(canvas);
|
||||||
canvas_set_font(canvas, FontPrimary);
|
canvas_set_font(canvas, FontPrimary);
|
||||||
|
@ -748,7 +740,7 @@ static void render_callback(Canvas* canvas, void* ctx) {
|
||||||
canvas_draw_str_aligned(canvas, 62, 15, AlignCenter, AlignTop, "Frequency is outside of");
|
canvas_draw_str_aligned(canvas, 62, 15, AlignCenter, AlignTop, "Frequency is outside of");
|
||||||
canvas_draw_str_aligned(canvas, 62, 25, AlignCenter, AlignTop, "default range.");
|
canvas_draw_str_aligned(canvas, 62, 25, AlignCenter, AlignTop, "default range.");
|
||||||
canvas_draw_str_aligned(canvas, 62, 35, AlignCenter, AlignTop, "Check docs.");
|
canvas_draw_str_aligned(canvas, 62, 35, AlignCenter, AlignTop, "Check docs.");
|
||||||
canvas_draw_str_aligned(canvas, 62, 60, AlignCenter, AlignBottom, "Hold Back to Exit.");
|
canvas_draw_str_aligned(canvas, 62, 60, AlignCenter, AlignBottom, "Press Back to Exit.");
|
||||||
} else {
|
} else {
|
||||||
//map found, draw all the things
|
//map found, draw all the things
|
||||||
canvas_clear(canvas);
|
canvas_clear(canvas);
|
||||||
|
@ -779,8 +771,7 @@ static void render_callback(Canvas* canvas, void* ctx) {
|
||||||
canvas_draw_str(canvas, 10, 40, app->right_label);
|
canvas_draw_str(canvas, 10, 40, app->right_label);
|
||||||
canvas_draw_str(canvas, 10, 50, app->ok_label);
|
canvas_draw_str(canvas, 10, 50, app->ok_label);
|
||||||
|
|
||||||
canvas_draw_str_aligned(
|
canvas_draw_str_aligned(canvas, 11, 62, AlignLeft, AlignBottom, "Press=Exit.");
|
||||||
canvas, 11, 62, AlignLeft, AlignBottom, "Hold=Exit. Tap for Repeat:");
|
|
||||||
|
|
||||||
//Status text and indicator
|
//Status text and indicator
|
||||||
canvas_draw_str_aligned(canvas, 126, 10, AlignRight, AlignBottom, app->send_status);
|
canvas_draw_str_aligned(canvas, 126, 10, AlignRight, AlignBottom, app->send_status);
|
||||||
|
@ -814,8 +805,7 @@ static void render_callback(Canvas* canvas, void* ctx) {
|
||||||
//Repeat indicator
|
//Repeat indicator
|
||||||
//canvas_draw_str_aligned(canvas, 125, 40, AlignRight, AlignBottom, "Repeat:");
|
//canvas_draw_str_aligned(canvas, 125, 40, AlignRight, AlignBottom, "Repeat:");
|
||||||
//canvas_draw_icon(canvas, 115, 39, &I_UniRFRemix_Repeat_12x14);
|
//canvas_draw_icon(canvas, 115, 39, &I_UniRFRemix_Repeat_12x14);
|
||||||
canvas_draw_str_aligned(
|
//canvas_draw_str_aligned(canvas, 125, 62, AlignRight, AlignBottom, int_to_char(app->repeat));
|
||||||
canvas, 125, 62, AlignRight, AlignBottom, int_to_char(app->repeat));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
furi_mutex_release(app->model_mutex);
|
furi_mutex_release(app->model_mutex);
|
||||||
|
@ -826,6 +816,24 @@ static void input_callback(InputEvent* input_event, void* ctx) {
|
||||||
furi_message_queue_put(app->input_queue, input_event, 0);
|
furi_message_queue_put(app->input_queue, input_event, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void unirfremix_subghz_alloc(UniRFRemix* app) {
|
||||||
|
// load subghz presets
|
||||||
|
app->setting = subghz_setting_alloc();
|
||||||
|
subghz_setting_load(app->setting, EXT_PATH("subghz/assets/setting_user"));
|
||||||
|
|
||||||
|
// load mfcodes
|
||||||
|
app->environment = subghz_environment_alloc();
|
||||||
|
subghz_environment_load_keystore(app->environment, EXT_PATH("subghz/assets/keeloq_mfcodes"));
|
||||||
|
subghz_environment_load_keystore(
|
||||||
|
app->environment, EXT_PATH("subghz/assets/keeloq_mfcodes_user"));
|
||||||
|
subghz_environment_set_came_atomo_rainbow_table_file_name(
|
||||||
|
app->environment, EXT_PATH("subghz/assets/came_atomo"));
|
||||||
|
subghz_environment_set_nice_flor_s_rainbow_table_file_name(
|
||||||
|
app->environment, EXT_PATH("subghz/assets/nice_flor_s"));
|
||||||
|
|
||||||
|
app->subghz_receiver = subghz_receiver_alloc_init(app->environment);
|
||||||
|
}
|
||||||
|
|
||||||
UniRFRemix* unirfremix_alloc(void) {
|
UniRFRemix* unirfremix_alloc(void) {
|
||||||
UniRFRemix* app = malloc(sizeof(UniRFRemix));
|
UniRFRemix* app = malloc(sizeof(UniRFRemix));
|
||||||
|
|
||||||
|
@ -841,22 +849,6 @@ UniRFRemix* unirfremix_alloc(void) {
|
||||||
app->gui = furi_record_open(RECORD_GUI);
|
app->gui = furi_record_open(RECORD_GUI);
|
||||||
gui_add_view_port(app->gui, app->view_port, GuiLayerFullscreen);
|
gui_add_view_port(app->gui, app->view_port, GuiLayerFullscreen);
|
||||||
|
|
||||||
// load subghz presets
|
|
||||||
app->setting = subghz_setting_alloc();
|
|
||||||
subghz_setting_load(app->setting, EXT_PATH("subghz/assets/setting_user"));
|
|
||||||
|
|
||||||
// load mfcodes
|
|
||||||
app->environment = subghz_environment_alloc();
|
|
||||||
subghz_environment_load_keystore(app->environment, EXT_PATH("subghz/assets/keeloq_mfcodes"));
|
|
||||||
subghz_environment_load_keystore(
|
|
||||||
app->environment, EXT_PATH("subghz/assets/keeloq_mfcodes_user"));
|
|
||||||
subghz_environment_set_came_atomo_rainbow_table_file_name(
|
|
||||||
app->environment, EXT_PATH("subghz/assets/came_atomo"));
|
|
||||||
subghz_environment_set_nice_flor_s_rainbow_table_file_name(
|
|
||||||
app->environment, EXT_PATH("subghz/assets/nice_flor_s"));
|
|
||||||
|
|
||||||
app->subghz_receiver = subghz_receiver_alloc_init(app->environment);
|
|
||||||
|
|
||||||
app->notification = furi_record_open(RECORD_NOTIFICATION);
|
app->notification = furi_record_open(RECORD_NOTIFICATION);
|
||||||
|
|
||||||
return app;
|
return app;
|
||||||
|
@ -887,6 +879,7 @@ void unirfremix_free(UniRFRemix* app) {
|
||||||
|
|
||||||
furi_mutex_free(app->model_mutex);
|
furi_mutex_free(app->model_mutex);
|
||||||
|
|
||||||
|
furi_hal_subghz_sleep();
|
||||||
subghz_setting_free(app->setting);
|
subghz_setting_free(app->setting);
|
||||||
subghz_receiver_free(app->subghz_receiver);
|
subghz_receiver_free(app->subghz_receiver);
|
||||||
subghz_environment_free(app->environment);
|
subghz_environment_free(app->environment);
|
||||||
|
@ -938,6 +931,9 @@ int32_t unirfremix_app(void* p) {
|
||||||
unirfremix_cfg_set_check(app, app->file_path);
|
unirfremix_cfg_set_check(app, app->file_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// init subghz stuff
|
||||||
|
unirfremix_subghz_alloc(app);
|
||||||
|
|
||||||
bool exit_loop = false;
|
bool exit_loop = false;
|
||||||
|
|
||||||
if(app->file_result == 2) {
|
if(app->file_result == 2) {
|
||||||
|
@ -954,7 +950,7 @@ int32_t unirfremix_app(void* p) {
|
||||||
app->send_status = "Idle";
|
app->send_status = "Idle";
|
||||||
app->send_status_c = 0;
|
app->send_status_c = 0;
|
||||||
app->processing = 0;
|
app->processing = 0;
|
||||||
app->repeat = 1;
|
//app->repeat = 1;
|
||||||
app->button = 0;
|
app->button = 0;
|
||||||
|
|
||||||
//refresh screen to update variables before processing main screen or error screens
|
//refresh screen to update variables before processing main screen or error screens
|
||||||
|
@ -976,7 +972,7 @@ int32_t unirfremix_app(void* p) {
|
||||||
|
|
||||||
switch(input.key) {
|
switch(input.key) {
|
||||||
case InputKeyUp:
|
case InputKeyUp:
|
||||||
if(input.type == InputTypeShort) {
|
if(input.type == InputTypePress) {
|
||||||
if(app->up_enabled) {
|
if(app->up_enabled) {
|
||||||
if(app->processing == 0) {
|
if(app->processing == 0) {
|
||||||
*app->signal = *app->empty;
|
*app->signal = *app->empty;
|
||||||
|
@ -986,10 +982,15 @@ int32_t unirfremix_app(void* p) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(input.type == InputTypeRelease) {
|
||||||
|
if(app->up_enabled) {
|
||||||
|
unirfremix_tx_stop(app);
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case InputKeyDown:
|
case InputKeyDown:
|
||||||
if(input.type == InputTypeShort) {
|
if(input.type == InputTypePress) {
|
||||||
if(app->down_enabled) {
|
if(app->down_enabled) {
|
||||||
if(app->processing == 0) {
|
if(app->processing == 0) {
|
||||||
*app->signal = *app->empty;
|
*app->signal = *app->empty;
|
||||||
|
@ -999,10 +1000,15 @@ int32_t unirfremix_app(void* p) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(input.type == InputTypeRelease) {
|
||||||
|
if(app->down_enabled) {
|
||||||
|
unirfremix_tx_stop(app);
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case InputKeyRight:
|
case InputKeyRight:
|
||||||
if(input.type == InputTypeShort) {
|
if(input.type == InputTypePress) {
|
||||||
if(app->right_enabled) {
|
if(app->right_enabled) {
|
||||||
if(app->processing == 0) {
|
if(app->processing == 0) {
|
||||||
*app->signal = *app->empty;
|
*app->signal = *app->empty;
|
||||||
|
@ -1012,10 +1018,15 @@ int32_t unirfremix_app(void* p) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(input.type == InputTypeRelease) {
|
||||||
|
if(app->right_enabled) {
|
||||||
|
unirfremix_tx_stop(app);
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case InputKeyLeft:
|
case InputKeyLeft:
|
||||||
if(input.type == InputTypeShort) {
|
if(input.type == InputTypePress) {
|
||||||
if(app->left_enabled) {
|
if(app->left_enabled) {
|
||||||
if(app->processing == 0) {
|
if(app->processing == 0) {
|
||||||
*app->signal = *app->empty;
|
*app->signal = *app->empty;
|
||||||
|
@ -1025,10 +1036,15 @@ int32_t unirfremix_app(void* p) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(input.type == InputTypeRelease) {
|
||||||
|
if(app->left_enabled) {
|
||||||
|
unirfremix_tx_stop(app);
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case InputKeyOk:
|
case InputKeyOk:
|
||||||
if(input.type == InputTypeShort) {
|
if(input.type == InputTypePress) {
|
||||||
if(app->ok_enabled) {
|
if(app->ok_enabled) {
|
||||||
if(app->processing == 0) {
|
if(app->processing == 0) {
|
||||||
*app->signal = *app->empty;
|
*app->signal = *app->empty;
|
||||||
|
@ -1038,18 +1054,15 @@ int32_t unirfremix_app(void* p) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(input.type == InputTypeRelease) {
|
||||||
|
if(app->ok_enabled) {
|
||||||
|
unirfremix_tx_stop(app);
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case InputKeyBack:
|
case InputKeyBack:
|
||||||
if(input.type == InputTypeShort) {
|
if(input.type == InputTypeShort) {
|
||||||
if(app->processing == 0) {
|
|
||||||
if(app->repeat < 5) {
|
|
||||||
app->repeat++;
|
|
||||||
} else {
|
|
||||||
app->repeat = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if(input.type == InputTypeLong) {
|
|
||||||
exit_loop = true;
|
exit_loop = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -1122,7 +1135,7 @@ int32_t unirfremix_app(void* p) {
|
||||||
case InputKeyOk:
|
case InputKeyOk:
|
||||||
break;
|
break;
|
||||||
case InputKeyBack:
|
case InputKeyBack:
|
||||||
if(input.type == InputTypeLong) {
|
if(input.type == InputTypeShort) {
|
||||||
exit_loop = true;
|
exit_loop = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Add table
Reference in a new issue