Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ClusterM/flipperzero-firmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSkorpionm <85568270+Skorpionm@users.noreply.github.com>2021-09-02 00:05:00 +0300
committerGitHub <noreply@github.com>2021-09-02 00:05:00 +0300
commite17336498db48de0898313aca9099985b91bd89e (patch)
tree2ad1fedde8432714b1fa230c23f913d29b8ba494 /applications/subghz/views
parent3ed26e61eb75f715f4b46e6104c9b49057159594 (diff)
[FL-1756, FL-1769, FL-1776, FL-1759] Gui: input events complementary V3, refactoring. SubGhz: read/emulate fixes. Cleanup. (#684)
* Gui: move rotation logic to ViewPort, replace delayed View switch in ViewDispatcher with event filtering and redirection to previous view. * SubGhz: add function description * Gui, Input: add event id to input events. * SubGhz: fix "crashing on ?" * SubGhz: add icon scanning * SubGhz: updated interface read scene, updated interface config scene * Assets: update subghz assets * SubGhz: replaced the picture in the read scene, changed the paths to additional files * SubGhz: fix deadlock in timer callback * SubGhz: fix icon read scene * SubGhz: fix icon read scene * SubGhz: fix duble text transmitter scene * SubGhz: correct spelling. Gui: bigger queue for ViewDispatcher. * SubGhz: fix creation and transmission of dynamic code without the presence of a manufactory key * SubGhz: fix keelog, setting a name in the absence of a manufactory key * SubGhz: fix load bad keelog key * Format sources * Furi: remove garbage from core. GpioTester: fix memory leak and cleanup * Accessor: remove obsolete notification code * MusicPlayer: remove input event injection * Input: rename id to sequence Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
Diffstat (limited to 'applications/subghz/views')
-rw-r--r--applications/subghz/views/subghz_receiver.c123
-rw-r--r--applications/subghz/views/subghz_receiver.h3
-rw-r--r--applications/subghz/views/subghz_transmitter.c29
-rw-r--r--applications/subghz/views/subghz_transmitter.h1
4 files changed, 102 insertions, 54 deletions
diff --git a/applications/subghz/views/subghz_receiver.c b/applications/subghz/views/subghz_receiver.c
index d08b1d0a..df70786b 100644
--- a/applications/subghz/views/subghz_receiver.c
+++ b/applications/subghz/views/subghz_receiver.c
@@ -39,9 +39,9 @@ typedef enum {
} SubGhzHopperState;
static const Icon* ReceiverItemIcons[] = {
- [TYPE_PROTOCOL_UNKNOWN] = &I_quest_7x8,
- [TYPE_PROTOCOL_STATIC] = &I_unlock_7x8,
- [TYPE_PROTOCOL_DYNAMIC] = &I_lock_7x8,
+ [TYPE_PROTOCOL_UNKNOWN] = &I_Quest_7x8,
+ [TYPE_PROTOCOL_STATIC] = &I_Unlock_7x8,
+ [TYPE_PROTOCOL_DYNAMIC] = &I_Lock_7x8,
};
struct SubghzReceiver {
@@ -53,6 +53,7 @@ struct SubghzReceiver {
osTimerId timer;
SubGhzHopperState hopper_state;
uint8_t hopper_timeout;
+ uint32_t event_key_sequence;
};
typedef struct {
@@ -172,44 +173,40 @@ void subghz_receiver_draw(Canvas* canvas, SubghzReceiverModel* model) {
string_clean(str_buff);
}
if(scrollbar) {
- elements_scrollbar_pos(canvas, 126, 0, 49, model->idx, model->history_item);
+ elements_scrollbar_pos(canvas, 128, 0, 49, model->idx, model->history_item);
}
canvas_set_color(canvas, ColorBlack);
canvas_set_font(canvas, FontSecondary);
- elements_button_left(canvas, "Conf");
- if((model->real_frequency / 1000 % 10) > 4) {
- frequency = model->real_frequency + 10000;
+ elements_button_left(canvas, "Config");
+ canvas_draw_line(canvas, 46, 51, 125, 51);
+ if(subghz_history_get_text_space_left(model->history, str_buff)) {
+ canvas_draw_str(canvas, 54, 62, string_get_cstr(str_buff));
} else {
- frequency = model->real_frequency;
+ if((model->real_frequency / 1000 % 10) > 4) {
+ frequency = model->real_frequency + 10000;
+ } else {
+ frequency = model->real_frequency;
+ }
+ snprintf(
+ buffer,
+ sizeof(buffer),
+ "%03ld.%02ld",
+ frequency / 1000000 % 1000,
+ frequency / 10000 % 100);
+ canvas_draw_str(canvas, 44, 62, buffer);
+ canvas_draw_str(canvas, 79, 62, "AM");
+ canvas_draw_str(canvas, 96, 62, string_get_cstr(str_buff));
}
- snprintf(
- buffer,
- sizeof(buffer),
- "%03ld.%02ld",
- frequency / 1000000 % 1000,
- frequency / 10000 % 100);
- canvas_draw_str(canvas, 40, 62, buffer);
- canvas_draw_str(canvas, 75, 62, "AM");
- subghz_history_get_text_space_left(model->history, str_buff);
- canvas_draw_str(canvas, 94, 62, string_get_cstr(str_buff));
- canvas_draw_line(canvas, 38, 51, 125, 51);
break;
case ReceiverSceneStart:
- canvas_draw_icon(canvas, 0, 0, &I_RFIDDolphinReceive_97x61);
- canvas_invert_color(canvas);
- canvas_draw_box(canvas, 80, 2, 20, 20);
- canvas_invert_color(canvas);
- canvas_draw_icon(canvas, 75, 8, &I_sub1_10px);
+ canvas_draw_icon(canvas, 0, 0, &I_Scanning_123x52);
canvas_set_font(canvas, FontPrimary);
- canvas_draw_str(canvas, 63, 40, "Scanning...");
+ canvas_draw_str(canvas, 63, 46, "Scanning...");
canvas_set_color(canvas, ColorBlack);
canvas_set_font(canvas, FontSecondary);
- elements_button_left(canvas, "Conf");
- canvas_invert_color(canvas);
- canvas_draw_box(canvas, 38, 52, 10, 10);
- canvas_invert_color(canvas);
+ elements_button_left(canvas, "Config");
if((model->real_frequency / 1000 % 10) > 4) {
frequency = model->real_frequency + 10000;
} else {
@@ -221,11 +218,11 @@ void subghz_receiver_draw(Canvas* canvas, SubghzReceiverModel* model) {
"%03ld.%02ld",
frequency / 1000000 % 1000,
frequency / 10000 % 100);
- canvas_draw_str(canvas, 40, 62, buffer);
- canvas_draw_str(canvas, 75, 62, "AM");
+ canvas_draw_str(canvas, 44, 62, buffer);
+ canvas_draw_str(canvas, 79, 62, "AM");
subghz_history_get_text_space_left(model->history, str_buff);
- canvas_draw_str(canvas, 94, 62, string_get_cstr(str_buff));
- canvas_draw_line(canvas, 48, 51, 125, 51);
+ canvas_draw_str(canvas, 96, 62, string_get_cstr(str_buff));
+ canvas_draw_line(canvas, 46, 51, 125, 51);
break;
case ReceiverSceneConfig:
@@ -237,9 +234,12 @@ void subghz_receiver_draw(Canvas* canvas, SubghzReceiverModel* model) {
model->real_frequency / 1000000 % 1000,
model->real_frequency / 1000 % 1000);
canvas_draw_str(canvas, 0, 8, buffer);
+ canvas_draw_str(canvas, 0, 18, "Frequency Hopping: <OFF>");
} else {
- canvas_draw_str(canvas, 0, 8, "Frequency: <auto>");
+ canvas_draw_str(canvas, 0, 8, "Frequency: < --- >");
+ canvas_draw_str(canvas, 0, 18, "Frequency Hopping: <ON>");
}
+ canvas_draw_str(canvas, 0, 28, "Modulation: <AM>");
elements_button_center(canvas, "Save");
break;
@@ -269,6 +269,13 @@ void subghz_receiver_draw(Canvas* canvas, SubghzReceiverModel* model) {
string_clear(str_buff);
}
+void subghz_receiver_history_full(void* context) {
+ furi_assert(context);
+ SubghzReceiver* subghz_receiver = context;
+ subghz_receiver->callback(SubghzReceverEventSendHistoryFull, subghz_receiver->context);
+ subghz_receiver->hopper_state = SubGhzHopperStateOFF;
+}
+
bool subghz_receiver_input(InputEvent* event, void* context) {
furi_assert(context);
@@ -280,13 +287,11 @@ bool subghz_receiver_input(InputEvent* event, void* context) {
return false;
});
- if(scene != ReceiverSceneInfo && event->type != InputTypeShort) return false;
-
bool can_be_saved = false;
switch(scene) {
case ReceiverSceneMain:
- if(event->key == InputKeyBack) {
+ if(event->key == InputKeyBack && event->type == InputTypeShort) {
with_view_model(
subghz_receiver->view, (SubghzReceiverModel * model) {
model->idx = 0;
@@ -296,19 +301,23 @@ bool subghz_receiver_input(InputEvent* event, void* context) {
return true;
});
return false;
- } else if(event->key == InputKeyUp) {
+ } else if(
+ event->key == InputKeyUp &&
+ (event->type == InputTypeShort || event->type == InputTypeRepeat)) {
with_view_model(
subghz_receiver->view, (SubghzReceiverModel * model) {
if(model->idx != 0) model->idx--;
return true;
});
- } else if(event->key == InputKeyDown) {
+ } else if(
+ event->key == InputKeyDown &&
+ (event->type == InputTypeShort || event->type == InputTypeRepeat)) {
with_view_model(
subghz_receiver->view, (SubghzReceiverModel * model) {
if(model->idx != subghz_history_get_item(model->history) - 1) model->idx++;
return true;
});
- } else if(event->key == InputKeyLeft) {
+ } else if(event->key == InputKeyLeft && event->type == InputTypeShort) {
subghz_receiver->hopper_state = SubGhzHopperStatePause;
with_view_model(
subghz_receiver->view, (SubghzReceiverModel * model) {
@@ -317,7 +326,8 @@ bool subghz_receiver_input(InputEvent* event, void* context) {
return true;
});
subghz_receiver->callback(SubghzReceverEventConfig, subghz_receiver->context);
- } else if(event->key == InputKeyOk) {
+ } else if(event->key == InputKeyOk && event->type == InputTypeShort) {
+ subghz_receiver->event_key_sequence = event->sequence;
with_view_model(
subghz_receiver->view, (SubghzReceiverModel * model) {
string_clean(model->text);
@@ -358,18 +368,23 @@ bool subghz_receiver_input(InputEvent* event, void* context) {
} else if(can_be_saved && event->key == InputKeyRight) {
subghz_receiver->callback(SubghzReceverEventSave, subghz_receiver->context);
return false;
- } else if(can_be_saved && event->key == InputKeyOk && event->type == InputTypePress) {
+ } else if(
+ can_be_saved && event->key == InputKeyOk && event->type == InputTypePress &&
+ subghz_receiver->event_key_sequence != event->sequence) {
subghz_receiver->hopper_state = SubGhzHopperStatePause;
subghz_rx_end(subghz_receiver->worker);
subghz_receiver->callback(SubghzReceverEventSendStart, subghz_receiver->context);
return true;
- } else if(can_be_saved && event->key == InputKeyOk && event->type == InputTypeRelease) {
+ } else if(
+ can_be_saved && event->key == InputKeyOk && event->type == InputTypeRelease &&
+ subghz_receiver->event_key_sequence != event->sequence) {
subghz_receiver->callback(SubghzReceverEventSendStop, subghz_receiver->context);
return true;
}
break;
case ReceiverSceneConfig:
+ if(event->type != InputTypeShort) return false;
if(event->key == InputKeyBack) {
with_view_model(
subghz_receiver->view, (SubghzReceiverModel * model) {
@@ -396,7 +411,6 @@ bool subghz_receiver_input(InputEvent* event, void* context) {
osTimerStart(subghz_receiver->timer, 1024 / 10);
subghz_receiver->hopper_state = SubGhzHopperStateRunnig;
}
-
if(subghz_history_get_item(model->history) == 0) {
model->scene = ReceiverSceneStart;
} else {
@@ -426,6 +440,7 @@ bool subghz_receiver_input(InputEvent* event, void* context) {
break;
case ReceiverSceneStart:
+ if(event->type != InputTypeShort) return false;
if(event->key == InputKeyBack) {
return false;
} else if(event->key == InputKeyLeft) {
@@ -445,6 +460,16 @@ bool subghz_receiver_input(InputEvent* event, void* context) {
}
subghz_receiver_update_offset(subghz_receiver);
+ if(scene != ReceiverSceneInfo) {
+ with_view_model(
+ subghz_receiver->view, (SubghzReceiverModel * model) {
+ if(subghz_history_get_text_space_left(model->history, NULL)) {
+ subghz_receiver_history_full(subghz_receiver);
+ }
+ return false;
+ });
+ }
+
return true;
}
@@ -476,6 +501,9 @@ void subghz_receiver_protocol_callback(SubGhzProtocolCommon* parser, void* conte
model->history_item = subghz_history_get_item(model->history);
model->scene = ReceiverSceneMain;
+ if(subghz_history_get_text_space_left(model->history, NULL)) {
+ subghz_receiver_history_full(subghz_receiver);
+ }
return true;
});
subghz_protocol_reset(subghz_receiver->protocol);
@@ -528,10 +556,11 @@ static void subghz_receiver_timer_callback(void* context) {
}
// Restart radio
- subghz_rx_end(subghz_receiver->worker);
+ furi_hal_subghz_idle();
subghz_protocol_reset(subghz_receiver->protocol);
- model->real_frequency =
- subghz_rx(subghz_receiver->worker, subghz_frequencies_hopper[model->frequency]);
+ model->real_frequency = furi_hal_subghz_set_frequency_and_path(
+ subghz_frequencies_hopper[model->frequency]);
+ furi_hal_subghz_rx();
return true;
});
diff --git a/applications/subghz/views/subghz_receiver.h b/applications/subghz/views/subghz_receiver.h
index 400b5c13..513f438c 100644
--- a/applications/subghz/views/subghz_receiver.h
+++ b/applications/subghz/views/subghz_receiver.h
@@ -14,7 +14,8 @@ typedef enum {
SubghzReceverEventBack,
SubghzReceverEventMore,
SubghzReceverEventSendStart,
- SubghzReceverEventSendStop
+ SubghzReceverEventSendStop,
+ SubghzReceverEventSendHistoryFull,
} SubghzReceverEvent;
typedef struct SubghzReceiver SubghzReceiver;
diff --git a/applications/subghz/views/subghz_transmitter.c b/applications/subghz/views/subghz_transmitter.c
index 814eae66..1dd4e7d9 100644
--- a/applications/subghz/views/subghz_transmitter.c
+++ b/applications/subghz/views/subghz_transmitter.c
@@ -7,6 +7,7 @@
#include <input/input.h>
#include <gui/elements.h>
#include <notification/notification-messages.h>
+#include <lib/subghz/protocols/subghz_protocol_keeloq.h>
struct SubghzTransmitter {
View* view;
@@ -100,6 +101,10 @@ void subghz_transmitter_draw(Canvas* canvas, SubghzTransmitterModel* model) {
canvas_draw_str(canvas, 90, 8, buffer);
if(model->protocol && model->protocol->get_upload_protocol) {
+ if((!strcmp(model->protocol->name, "KeeLoq")) &&
+ (!strcmp(subghz_protocol_keeloq_get_manufacture_name(model->protocol), "Unknown"))) {
+ return;
+ }
subghz_transmitter_button_right(canvas, "Send");
}
}
@@ -107,22 +112,33 @@ void subghz_transmitter_draw(Canvas* canvas, SubghzTransmitterModel* model) {
bool subghz_transmitter_input(InputEvent* event, void* context) {
furi_assert(context);
SubghzTransmitter* subghz_transmitter = context;
- bool can_be_send = false;
+ bool can_be_sent = false;
+
+ if(event->key == InputKeyBack) {
+ return false;
+ }
+
with_view_model(
subghz_transmitter->view, (SubghzTransmitterModel * model) {
- can_be_send = (model->protocol && model->protocol->get_upload_protocol);
+ if(model->protocol && model->protocol->get_upload_protocol) {
+ if((!strcmp(model->protocol->name, "KeeLoq")) &&
+ (!strcmp(
+ subghz_protocol_keeloq_get_manufacture_name(model->protocol), "Unknown"))) {
+ return false;
+ }
+ can_be_sent = true;
+ }
+ //can_be_sent = (model->protocol && model->protocol->get_upload_protocol);
string_clean(model->text);
model->protocol->to_string(model->protocol, model->text);
return true;
});
//if(event->type != InputTypeShort) return false;
- if(event->key == InputKeyBack) {
- return false;
- } else if(can_be_send && event->key == InputKeyOk && event->type == InputTypePress) {
+ if(can_be_sent && event->key == InputKeyOk && event->type == InputTypePress) {
subghz_transmitter->callback(SubghzTransmitterEventSendStart, subghz_transmitter->context);
return true;
- } else if(can_be_send && event->key == InputKeyOk && event->type == InputTypeRelease) {
+ } else if(can_be_sent && event->key == InputKeyOk && event->type == InputTypeRelease) {
subghz_transmitter->callback(SubghzTransmitterEventSendStop, subghz_transmitter->context);
return true;
}
@@ -147,6 +163,7 @@ void subghz_transmitter_enter(void* context) {
SubghzTransmitter* subghz_transmitter = context;
with_view_model(
subghz_transmitter->view, (SubghzTransmitterModel * model) {
+ string_clean(model->text);
model->protocol->to_string(model->protocol, model->text);
return true;
});
diff --git a/applications/subghz/views/subghz_transmitter.h b/applications/subghz/views/subghz_transmitter.h
index 6f289e4d..c4dd5982 100644
--- a/applications/subghz/views/subghz_transmitter.h
+++ b/applications/subghz/views/subghz_transmitter.h
@@ -7,6 +7,7 @@ typedef enum {
SubghzTransmitterEventSendStart,
SubghzTransmitterEventSendStop,
SubghzTransmitterEventBack,
+ SubghzTransmitterEventNoMan,
} SubghzTransmitterEvent;
typedef struct SubghzTransmitter SubghzTransmitter;