Просмотр исходного кода

Highlite button only if its pressed

Sandro Kalatozishvili 2 лет назад
Родитель
Сommit
f841dfb1b9

+ 1 - 1
README.md

@@ -8,7 +8,7 @@ With the current infrared application, users must navigate through the menu to l
 
 
 `XRemote` also introduces a more user-friendly learning approach. Instead of having to manually name each button on the flipper when cloning a remote, the learning tool informs you upfront which buttons it will record. All you need to do is press the corresponding button on your existing remote, eliminating the need to name them individually.
 `XRemote` also introduces a more user-friendly learning approach. Instead of having to manually name each button on the flipper when cloning a remote, the learning tool informs you upfront which buttons it will record. All you need to do is press the corresponding button on your existing remote, eliminating the need to name them individually.
 
 
-The application is compatible with standard `.ir` files. However, to ensure functionality, button names within these files must align with the predefined naming scheme.
+The application is compatible with standard `.ir` files. However, to ensure functionality, button names within these files must align with the predefined naming scheme. If the button is not highlighted when pressed, and the notification LED does not light up, it means that the button was not found in the file with the appropriate name.
 
 
 Button name | Description
 Button name | Description
 ------------|-------------------
 ------------|-------------------

+ 20 - 6
views/xremote_common_view.c

@@ -7,8 +7,6 @@
  */
  */
 
 
 #include "xremote_common_view.h"
 #include "xremote_common_view.h"
-
-#include "../infrared/infrared_remote.h"
 #include "../xremote_app.h"
 #include "../xremote_app.h"
 
 
 struct XRemoteView {
 struct XRemoteView {
@@ -90,24 +88,40 @@ View* xremote_view_get_view(XRemoteView* rview)
     return rview->view;
     return rview->view;
 }
 }
 
 
-static InfraredRemoteButton* xremote_view_get_button_by_name(XRemoteView *rview, const char* name)
+InfraredRemoteButton* xremote_view_get_button_by_name(XRemoteView *rview, const char* name)
 {
 {
     xremote_app_assert(rview->context, NULL);
     xremote_app_assert(rview->context, NULL);
     InfraredRemote* remote = (InfraredRemote*)rview->context;
     InfraredRemote* remote = (InfraredRemote*)rview->context;
     return infrared_remote_get_button_by_name(remote, name);
     return infrared_remote_get_button_by_name(remote, name);
 }
 }
 
 
-void xremote_view_send_ir(XRemoteView *rview, const char *name)
+bool xremote_view_send_ir_by_name(XRemoteView *rview, const char *name)
 {
 {
     InfraredRemoteButton* button = xremote_view_get_button_by_name(rview, name);
     InfraredRemoteButton* button = xremote_view_get_button_by_name(rview, name);
-    xremote_app_assert_void(button);
+    xremote_app_assert(button, false);
+
+    InfraredSignal* signal = infrared_remote_button_get_signal(button);
+    xremote_app_assert(signal, false);
+
+    infrared_signal_transmit(signal);
+    NotificationApp* notifications = rview->app_ctx->notifications;
+    notification_message(notifications, &g_sequence_blink_purple_50);
+
+    return true;
+}
+
+bool xremote_view_press_button(XRemoteView *rview, InfraredRemoteButton* button)
+{
+    xremote_app_assert(button, false);
 
 
     InfraredSignal* signal = infrared_remote_button_get_signal(button);
     InfraredSignal* signal = infrared_remote_button_get_signal(button);
-    xremote_app_assert_void(signal);
+    xremote_app_assert(signal, false);
 
 
     infrared_signal_transmit(signal);
     infrared_signal_transmit(signal);
     NotificationApp* notifications = rview->app_ctx->notifications;
     NotificationApp* notifications = rview->app_ctx->notifications;
     notification_message(notifications, &g_sequence_blink_purple_50);
     notification_message(notifications, &g_sequence_blink_purple_50);
+
+    return true;
 }
 }
 
 
 void xremote_canvas_draw_icon(Canvas* canvas, uint8_t x, uint8_t y, XRemoteIcon icon)
 void xremote_canvas_draw_icon(Canvas* canvas, uint8_t x, uint8_t y, XRemoteIcon icon)

+ 6 - 1
views/xremote_common_view.h

@@ -18,6 +18,8 @@
 #include <infrared_transmit.h>
 #include <infrared_transmit.h>
 #include <xc_icons.h>
 #include <xc_icons.h>
 
 
+#include "../infrared/infrared_remote.h"
+
 #define XREMOTE_COMMAND_POWER           "Power"
 #define XREMOTE_COMMAND_POWER           "Power"
 #define XREMOTE_COMMAND_SETUP           "Setup"
 #define XREMOTE_COMMAND_SETUP           "Setup"
 #define XREMOTE_COMMAND_INPUT           "Input"
 #define XREMOTE_COMMAND_INPUT           "Input"
@@ -112,7 +114,10 @@ XRemoteView* xremote_view_alloc(void *app_ctx, ViewInputCallback input_cb, ViewD
 void xremote_view_free(XRemoteView* rview);
 void xremote_view_free(XRemoteView* rview);
 
 
 View* xremote_view_get_view(XRemoteView* rview);
 View* xremote_view_get_view(XRemoteView* rview);
-void xremote_view_send_ir(XRemoteView *rview, const char *name);
+bool xremote_view_send_ir_by_name(XRemoteView *rview, const char *name);
+
+InfraredRemoteButton* xremote_view_get_button_by_name(XRemoteView *rview, const char* name);
+bool xremote_view_press_button(XRemoteView *rview, InfraredRemoteButton* button);
 
 
 void xremote_view_set_context(XRemoteView* rview, void *context, XRemoteViewClearCallback on_clear);
 void xremote_view_set_context(XRemoteView* rview, void *context, XRemoteViewClearCallback on_clear);
 void* xremote_view_get_context(XRemoteView* rview);
 void* xremote_view_get_context(XRemoteView* rview);

+ 10 - 10
views/xremote_control_view.c

@@ -55,28 +55,28 @@ static void xremote_control_view_process(XRemoteView* view, InputEvent* event)
             {
             {
                 if (event->key == InputKeyOk)
                 if (event->key == InputKeyOk)
                 {
                 {
-                    model->ok_pressed = true;
-                    xremote_view_send_ir(view, XREMOTE_COMMAND_MUTE);
+                    if (xremote_view_send_ir_by_name(view, XREMOTE_COMMAND_MUTE))
+                        model->ok_pressed = true;
                 }
                 }
                 else if (event->key == InputKeyUp)
                 else if (event->key == InputKeyUp)
                 {
                 {
-                    model->up_pressed = true;
-                    xremote_view_send_ir(view, XREMOTE_COMMAND_VOL_UP);
+                    if (xremote_view_send_ir_by_name(view, XREMOTE_COMMAND_VOL_UP))
+                        model->up_pressed = true;
                 }
                 }
                 else if (event->key == InputKeyDown)
                 else if (event->key == InputKeyDown)
                 {
                 {
-                    model->down_pressed = true;
-                    xremote_view_send_ir(view, XREMOTE_COMMAND_VOL_DOWN);
+                    if (xremote_view_send_ir_by_name(view, XREMOTE_COMMAND_VOL_DOWN))
+                        model->down_pressed = true;
                 }
                 }
                 else if (event->key == InputKeyLeft)
                 else if (event->key == InputKeyLeft)
                 {
                 {
-                    model->left_pressed = true;
-                    xremote_view_send_ir(view, XREMOTE_COMMAND_PREV_CHAN);
+                    if (xremote_view_send_ir_by_name(view, XREMOTE_COMMAND_PREV_CHAN))
+                        model->left_pressed = true;
                 }
                 }
                 else if (event->key == InputKeyRight)
                 else if (event->key == InputKeyRight)
                 {
                 {
-                    model->right_pressed = true;
-                    xremote_view_send_ir(view, XREMOTE_COMMAND_NEXT_CHAN);
+                    if (xremote_view_send_ir_by_name(view, XREMOTE_COMMAND_NEXT_CHAN))
+                        model->right_pressed = true;
                 }
                 }
             }
             }
             else if (event->type == InputTypeRelease)
             else if (event->type == InputTypeRelease)

+ 10 - 10
views/xremote_general_view.c

@@ -55,28 +55,28 @@ static void xremote_general_view_process(XRemoteView* view, InputEvent* event)
 
 
                 if (event->key == InputKeyOk)
                 if (event->key == InputKeyOk)
                 {
                 {
-                    model->ok_pressed = true;
-                    xremote_view_send_ir(view, XREMOTE_COMMAND_POWER);
+                    if (xremote_view_send_ir_by_name(view, XREMOTE_COMMAND_POWER))
+                        model->ok_pressed = true;
                 }
                 }
                 else if (event->key == InputKeyUp)
                 else if (event->key == InputKeyUp)
                 {
                 {
-                    model->up_pressed = true;
-                    xremote_view_send_ir(view, XREMOTE_COMMAND_INPUT);
+                    if (xremote_view_send_ir_by_name(view, XREMOTE_COMMAND_INPUT))
+                        model->up_pressed = true;
                 }
                 }
                 else if (event->key == InputKeyDown)
                 else if (event->key == InputKeyDown)
                 {
                 {
-                    model->down_pressed = true;
-                    xremote_view_send_ir(view, XREMOTE_COMMAND_SETUP);
+                    if (xremote_view_send_ir_by_name(view, XREMOTE_COMMAND_SETUP))
+                        model->down_pressed = true;
                 }
                 }
                 else if (event->key == InputKeyLeft)
                 else if (event->key == InputKeyLeft)
                 {
                 {
-                    model->left_pressed = true;
-                    xremote_view_send_ir(view, XREMOTE_COMMAND_MENU);
+                    if (xremote_view_send_ir_by_name(view, XREMOTE_COMMAND_MENU))
+                        model->left_pressed = true;
                 }
                 }
                 else if (event->key == InputKeyRight)
                 else if (event->key == InputKeyRight)
                 {
                 {
-                    model->right_pressed = true;
-                    xremote_view_send_ir(view, XREMOTE_COMMAND_LIST);
+                    if (xremote_view_send_ir_by_name(view, XREMOTE_COMMAND_LIST))
+                        model->right_pressed = true;
                 }
                 }
             }
             }
             else if (event->type == InputTypeRelease)
             else if (event->type == InputTypeRelease)

+ 14 - 14
views/xremote_navigation_view.c

@@ -71,43 +71,43 @@ static void xremote_navigation_view_process(XRemoteView* view, InputEvent* event
             {
             {
                 if (event->key == InputKeyUp)
                 if (event->key == InputKeyUp)
                 {
                 {
-                    model->up_pressed = true;
-                    xremote_view_send_ir(view, XREMOTE_COMMAND_UP);
+                    if (xremote_view_send_ir_by_name(view, XREMOTE_COMMAND_UP))
+                        model->up_pressed = true;
                 }
                 }
                 else if (event->key == InputKeyDown)
                 else if (event->key == InputKeyDown)
                 {
                 {
-                    model->down_pressed = true;
-                    xremote_view_send_ir(view, XREMOTE_COMMAND_DOWN);
+                    if (xremote_view_send_ir_by_name(view, XREMOTE_COMMAND_DOWN))
+                        model->down_pressed = true;
                 }
                 }
                 else if (event->key == InputKeyLeft)
                 else if (event->key == InputKeyLeft)
                 {
                 {
-                    model->left_pressed = true;
-                    xremote_view_send_ir(view, XREMOTE_COMMAND_LEFT);
+                    if (xremote_view_send_ir_by_name(view, XREMOTE_COMMAND_LEFT))
+                        model->left_pressed = true;
                 }
                 }
                 else if (event->key == InputKeyRight)
                 else if (event->key == InputKeyRight)
                 {
                 {
-                    model->right_pressed = true;
-                    xremote_view_send_ir(view, XREMOTE_COMMAND_RIGHT);
+                    if (xremote_view_send_ir_by_name(view, XREMOTE_COMMAND_RIGHT))
+                        model->right_pressed = true;
                 }
                 }
                 else if (event->key == InputKeyOk)
                 else if (event->key == InputKeyOk)
                 {
                 {
-                    model->ok_pressed = true;
-                    xremote_view_send_ir(view, XREMOTE_COMMAND_OK);
+                    if (xremote_view_send_ir_by_name(view, XREMOTE_COMMAND_OK))
+                        model->ok_pressed = true;
                 }
                 }
             }
             }
             else if (event->type == InputTypeShort &&
             else if (event->type == InputTypeShort &&
                     event->key == InputKeyBack &&
                     event->key == InputKeyBack &&
                     exit == XRemoteAppExitHold)
                     exit == XRemoteAppExitHold)
             {
             {
-                model->back_pressed = true;
-                xremote_view_send_ir(view, XREMOTE_COMMAND_BACK);
+                if (xremote_view_send_ir_by_name(view, XREMOTE_COMMAND_BACK))
+                    model->back_pressed = true;
             }
             }
             else if (event->type == InputTypeLong &&
             else if (event->type == InputTypeLong &&
                     event->key == InputKeyBack &&
                     event->key == InputKeyBack &&
                     exit == XRemoteAppExitPress)
                     exit == XRemoteAppExitPress)
             {
             {
-                model->back_pressed = true;
-                xremote_view_send_ir(view, XREMOTE_COMMAND_BACK);
+                if (xremote_view_send_ir_by_name(view, XREMOTE_COMMAND_BACK))
+                    model->back_pressed = true;
             }
             }
             else if (event->type == InputTypeRelease)
             else if (event->type == InputTypeRelease)
             {
             {

+ 14 - 14
views/xremote_player_view.c

@@ -70,43 +70,43 @@ static void xremote_player_view_process(XRemoteView* view, InputEvent* event)
             {
             {
                 if (event->key == InputKeyUp)
                 if (event->key == InputKeyUp)
                 {
                 {
-                    model->up_pressed = true;
-                    xremote_view_send_ir(view, XREMOTE_COMMAND_JUMP_FORWARD);
+                    if (xremote_view_send_ir_by_name(view, XREMOTE_COMMAND_JUMP_FORWARD))
+                        model->up_pressed = true;
                 }
                 }
                 else if (event->key == InputKeyDown)
                 else if (event->key == InputKeyDown)
                 {
                 {
-                    model->down_pressed = true;
-                    xremote_view_send_ir(view, XREMOTE_COMMAND_JUMP_BACKWARD);
+                    if (xremote_view_send_ir_by_name(view, XREMOTE_COMMAND_JUMP_BACKWARD))
+                        model->down_pressed = true;
                 }
                 }
                 else if (event->key == InputKeyLeft)
                 else if (event->key == InputKeyLeft)
                 {
                 {
-                    model->left_pressed = true;
-                    xremote_view_send_ir(view, XREMOTE_COMMAND_FAST_BACKWARD);
+                    if (xremote_view_send_ir_by_name(view, XREMOTE_COMMAND_FAST_BACKWARD))
+                        model->left_pressed = true;
                 }
                 }
                 else if (event->key == InputKeyRight)
                 else if (event->key == InputKeyRight)
                 {
                 {
-                    model->right_pressed = true;
-                    xremote_view_send_ir(view, XREMOTE_COMMAND_FAST_FORWARD);
+                    if (xremote_view_send_ir_by_name(view, XREMOTE_COMMAND_FAST_FORWARD))
+                        model->right_pressed = true;
                 }
                 }
                 else if (event->key == InputKeyOk)
                 else if (event->key == InputKeyOk)
                 {
                 {
-                    model->ok_pressed = true;
-                    xremote_view_send_ir(view, XREMOTE_COMMAND_PLAY_PAUSE);
+                    if (xremote_view_send_ir_by_name(view, XREMOTE_COMMAND_PLAY_PAUSE))
+                        model->ok_pressed = true;
                 }
                 }
             }
             }
             else if (event->type == InputTypeShort &&
             else if (event->type == InputTypeShort &&
                     event->key == InputKeyBack &&
                     event->key == InputKeyBack &&
                     exit == XRemoteAppExitHold)
                     exit == XRemoteAppExitHold)
             {
             {
-                model->back_pressed = true;
-                xremote_view_send_ir(view, XREMOTE_COMMAND_STOP);
+                if (xremote_view_send_ir_by_name(view, XREMOTE_COMMAND_STOP))
+                    model->back_pressed = true;
             }
             }
             else if (event->type == InputTypeLong &&
             else if (event->type == InputTypeLong &&
                     event->key == InputKeyBack &&
                     event->key == InputKeyBack &&
                     exit == XRemoteAppExitPress)
                     exit == XRemoteAppExitPress)
             {
             {
-                model->back_pressed = true;
-                xremote_view_send_ir(view, XREMOTE_COMMAND_STOP);
+                if (xremote_view_send_ir_by_name(view, XREMOTE_COMMAND_STOP))
+                    model->back_pressed = true;
             }
             }
             else if (event->type == InputTypeRelease)
             else if (event->type == InputTypeRelease)
             {
             {

+ 1 - 1
xremote.h

@@ -10,6 +10,6 @@
 
 
 #define XREMOTE_VERSION_MAJOR  0
 #define XREMOTE_VERSION_MAJOR  0
 #define XREMOTE_VERSION_MINOR  9
 #define XREMOTE_VERSION_MINOR  9
-#define XREMOTE_BUILD_NUMBER   22
+#define XREMOTE_BUILD_NUMBER   23
 
 
 void xremote_get_version(char *version, size_t length);
 void xremote_get_version(char *version, size_t length);

+ 10 - 5
xremote_app.c

@@ -94,6 +94,7 @@ XRemoteAppContext* xremote_app_context_alloc(void *arg)
 {
 {
     XRemoteAppContext* ctx = malloc(sizeof(XRemoteAppContext));
     XRemoteAppContext* ctx = malloc(sizeof(XRemoteAppContext));
     ctx->app_argument = arg;
     ctx->app_argument = arg;
+    ctx->file_path = NULL;
 
 
     /* Open GUI and norification records */
     /* Open GUI and norification records */
     ctx->gui = furi_record_open(RECORD_GUI);
     ctx->gui = furi_record_open(RECORD_GUI);
@@ -103,10 +104,6 @@ XRemoteAppContext* xremote_app_context_alloc(void *arg)
     ctx->app_settings = xremote_app_settings_alloc();
     ctx->app_settings = xremote_app_settings_alloc();
     xremote_app_settings_load(ctx->app_settings);
     xremote_app_settings_load(ctx->app_settings);
 
 
-    /* Last opened file or directory path */
-    ctx->file_path = furi_string_alloc();
-    furi_string_set(ctx->file_path, XREMOTE_APP_FOLDER);
-
     /* Allocate and setup view dispatcher */
     /* Allocate and setup view dispatcher */
     ctx->view_dispatcher = view_dispatcher_alloc();
     ctx->view_dispatcher = view_dispatcher_alloc();
     view_dispatcher_enable_queue(ctx->view_dispatcher);
     view_dispatcher_enable_queue(ctx->view_dispatcher);
@@ -118,11 +115,19 @@ void xremote_app_context_free(XRemoteAppContext* ctx)
 {
 {
     xremote_app_assert_void(ctx);
     xremote_app_assert_void(ctx);
     notification_internal_message(ctx->notifications, &sequence_reset_blue);
     notification_internal_message(ctx->notifications, &sequence_reset_blue);
+
     xremote_app_settings_free(ctx->app_settings);
     xremote_app_settings_free(ctx->app_settings);
     view_dispatcher_free(ctx->view_dispatcher);
     view_dispatcher_free(ctx->view_dispatcher);
+
     furi_record_close(RECORD_NOTIFICATION);
     furi_record_close(RECORD_NOTIFICATION);
     furi_record_close(RECORD_GUI);
     furi_record_close(RECORD_GUI);
-    furi_string_free(ctx->file_path);
+
+    if (ctx->file_path != NULL)
+    {
+        furi_string_free(ctx->file_path);
+        ctx->file_path = NULL;
+    }
+
     free(ctx);
     free(ctx);
 }
 }
 
 

+ 7 - 2
xremote_control.c

@@ -62,7 +62,6 @@ static InfraredRemote* xremote_load_ir_buttons(XRemoteAppContext* app_ctx)
 {
 {
     DialogsApp* dialogs = furi_record_open(RECORD_DIALOGS);
     DialogsApp* dialogs = furi_record_open(RECORD_DIALOGS);
     Storage* storage = furi_record_open(RECORD_STORAGE);
     Storage* storage = furi_record_open(RECORD_STORAGE);
-
     storage_simply_mkdir(storage, XREMOTE_APP_FOLDER);
     storage_simply_mkdir(storage, XREMOTE_APP_FOLDER);
 
 
     /* Open file browser (view and dialogs are managed by the browser itself) */
     /* Open file browser (view and dialogs are managed by the browser itself) */
@@ -70,8 +69,14 @@ static InfraredRemote* xremote_load_ir_buttons(XRemoteAppContext* app_ctx)
     dialog_file_browser_set_basic_options(&browser, XREMOTE_APP_EXTENSION, &I_IR_Icon_10x10);
     dialog_file_browser_set_basic_options(&browser, XREMOTE_APP_EXTENSION, &I_IR_Icon_10x10);
     browser.base_path = XREMOTE_APP_FOLDER;
     browser.base_path = XREMOTE_APP_FOLDER;
 
 
+    if (app_ctx->file_path == NULL)
+    {
+        app_ctx->file_path = furi_string_alloc();
+        furi_string_set(app_ctx->file_path, XREMOTE_APP_FOLDER);
+    }
+
     /* Show file selection dialog (returns selected file path with variable file_path) */
     /* Show file selection dialog (returns selected file path with variable file_path) */
-    if(!dialog_file_browser_show(dialogs, app_ctx->file_path, app_ctx->file_path, &browser))
+    if (!dialog_file_browser_show(dialogs, app_ctx->file_path, app_ctx->file_path, &browser))
     {
     {
         furi_record_close(RECORD_STORAGE);
         furi_record_close(RECORD_STORAGE);
         furi_record_close(RECORD_DIALOGS);
         furi_record_close(RECORD_DIALOGS);