Ver Fonte

Merge cross_remote from https://github.com/leedave/flipper-zero-cross-remote

# Conflicts:
#	cross_remote/helpers/gui/int_input.c
#	cross_remote/xremote.c
Willy-JL há 1 ano atrás
pai
commit
a054a5a049

+ 1 - 1
cross_remote/application.fam

@@ -6,7 +6,7 @@ App(
     stack_size=3 * 1024,
     fap_icon="icons/xremote_10px.png",
     fap_icon_assets="icons",
-    fap_version="2.6",
+    fap_version="2.7",
     fap_category="Infrared",
     fap_author="Leedave",
     fap_description="One-Click, sends multiple commands",

+ 4 - 0
cross_remote/docs/changelog.md

@@ -1,3 +1,7 @@
+## 2.7
+- Replaced custom keyboard for timing with new number_input from Firmware
+- Requires minimum OFW version 0.105.0 or custom firmware based on this
+
 ## 2.6
 - Fix for conflict wiht SubGHz folder variable in 0.103.1-rc
 

+ 0 - 388
cross_remote/helpers/gui/int_input.c

@@ -1,388 +0,0 @@
-#include "int_input.h"
-
-#include <gui/elements.h>
-#include <furi.h>
-
-/** IntInput type */
-struct IntInput {
-    View* view;
-};
-
-typedef struct {
-    const char text;
-    const uint8_t x;
-    const uint8_t y;
-} IntInputKey;
-
-typedef struct {
-    const char* header;
-    char* text_buffer;
-    size_t text_buffer_size;
-    bool clear_default_text;
-
-    IntInputCallback callback;
-    void* callback_context;
-
-    int8_t selected_row;
-    uint8_t selected_column;
-} IntInputModel;
-
-static const uint8_t keyboard_origin_x = 7;
-static const uint8_t keyboard_origin_y = 31;
-static const uint8_t keyboard_row_count = 2;
-static const uint8_t enter_symbol = '\r';
-static const uint8_t backspace_symbol = '\b';
-
-static const IntInputKey keyboard_keys_row_1[] = {
-    {'0', 0, 12},
-    {'1', 11, 12},
-    {'2', 22, 12},
-    {'3', 33, 12},
-    {'4', 44, 12},
-    {backspace_symbol, 103, 4},
-};
-
-static const IntInputKey keyboard_keys_row_2[] = {
-    {'5', 0, 26},
-    {'6', 11, 26},
-    {'7', 22, 26},
-    {'8', 33, 26},
-    {'9', 44, 26},
-    {enter_symbol, 95, 17},
-};
-
-/** Get row size
- *
- * @param      row_index  Index of row
- *
- * @return     uint8_t Row size
- */
-static uint8_t int_input_get_row_size(uint8_t row_index) {
-    uint8_t row_size = 0;
-
-    switch(row_index + 1) {
-    case 1:
-        row_size = COUNT_OF(keyboard_keys_row_1);
-        break;
-    case 2:
-        row_size = COUNT_OF(keyboard_keys_row_2);
-        break;
-    default:
-        furi_crash();
-    }
-
-    return row_size;
-}
-
-/** Get row pointer
- *
- * @param      row_index  Index of row
- *
- * @return     const IntInputKey* Row pointer
- */
-static const IntInputKey* int_input_get_row(uint8_t row_index) {
-    const IntInputKey* row = NULL;
-
-    switch(row_index + 1) {
-    case 1:
-        row = keyboard_keys_row_1;
-        break;
-    case 2:
-        row = keyboard_keys_row_2;
-        break;
-    default:
-        furi_crash();
-    }
-
-    return row;
-}
-
-/** Draw input box (common view)
- *
- * @param      canvas  The canvas
- * @param      model   The model
- */
-static void int_input_draw_input(Canvas* canvas, IntInputModel* model) {
-    const uint8_t text_x = 8;
-    const uint8_t text_y = 25;
-
-    elements_slightly_rounded_frame(canvas, 6, 14, 116, 15);
-
-    const char* text = model->text_buffer;
-    canvas_draw_str(canvas, text_x, text_y, text);
-}
-
-static void int_input_backspace_cb(IntInputModel* model) {
-    uint8_t text_length = model->clear_default_text ? 1 : strlen(model->text_buffer);
-    if(text_length > 0) {
-        model->text_buffer[text_length - 1] = 0;
-    }
-}
-
-/** Handle up button
- *
- * @param      model  The model
- */
-static void int_input_handle_up(IntInputModel* model) {
-    if(model->selected_row > 0) {
-        model->selected_row--;
-    }
-}
-
-/** Handle down button
- *
- * @param      model  The model
- */
-static void int_input_handle_down(IntInputModel* model) {
-    if(model->selected_row < keyboard_row_count - 1) {
-        model->selected_row += 1;
-    }
-}
-
-/** Handle left button
- *
- * @param      model  The model
- */
-static void int_input_handle_left(IntInputModel* model) {
-    if(model->selected_column > 0) {
-        model->selected_column--;
-    } else {
-        model->selected_column = int_input_get_row_size(model->selected_row) - 1;
-    }
-}
-
-/** Handle right button
- *
- * @param      model  The model
- */
-static void int_input_handle_right(IntInputModel* model) {
-    if(model->selected_column < int_input_get_row_size(model->selected_row) - 1) {
-        model->selected_column++;
-    } else {
-        model->selected_column = 0;
-    }
-}
-
-/** Handle OK button
- *
- * @param      model  The model
- */
-static void int_input_handle_ok(IntInputModel* model) {
-    char selected = int_input_get_row(model->selected_row)[model->selected_column].text;
-    size_t text_length = strlen(model->text_buffer);
-    if(selected == enter_symbol) {
-        model->callback(model->callback_context);
-    } else if(selected == backspace_symbol) {
-        int_input_backspace_cb(model);
-    } else {
-        if(model->clear_default_text) {
-            text_length = 0;
-        }
-        if(text_length < (model->text_buffer_size - 1)) {
-            model->text_buffer[text_length] = selected;
-            model->text_buffer[text_length + 1] = 0;
-        }
-    }
-    model->clear_default_text = false;
-}
-
-/** Draw callback
- *
- * @param      canvas  The canvas
- * @param      _model  The model
- */
-static void int_input_view_draw_callback(Canvas* canvas, void* _model) {
-    IntInputModel* model = _model;
-    uint8_t text_length = model->text_buffer ? strlen(model->text_buffer) : 0;
-    UNUSED(text_length);
-
-    canvas_clear(canvas);
-    canvas_set_color(canvas, ColorBlack);
-
-    int_input_draw_input(canvas, model);
-
-    canvas_set_font(canvas, FontSecondary);
-    canvas_draw_str(canvas, 2, 9, model->header);
-    canvas_set_font(canvas, FontKeyboard);
-    // Draw keyboard
-    for(uint8_t row = 0; row < keyboard_row_count; row++) {
-        const uint8_t column_count = int_input_get_row_size(row);
-        const IntInputKey* keys = int_input_get_row(row);
-
-        for(size_t column = 0; column < column_count; column++) {
-            if(keys[column].text == enter_symbol) {
-                canvas_set_color(canvas, ColorBlack);
-                if(model->selected_row == row && model->selected_column == column) {
-                    canvas_draw_icon(
-                        canvas,
-                        keyboard_origin_x + keys[column].x,
-                        keyboard_origin_y + keys[column].y,
-                        &I_KeySaveSelected_24x11);
-                } else {
-                    canvas_draw_icon(
-                        canvas,
-                        keyboard_origin_x + keys[column].x,
-                        keyboard_origin_y + keys[column].y,
-                        &I_KeySave_24x11);
-                }
-            } else if(keys[column].text == backspace_symbol) {
-                canvas_set_color(canvas, ColorBlack);
-                if(model->selected_row == row && model->selected_column == column) {
-                    canvas_draw_icon(
-                        canvas,
-                        keyboard_origin_x + keys[column].x,
-                        keyboard_origin_y + keys[column].y,
-                        &I_KeyBackspaceSelected_16x9);
-                } else {
-                    canvas_draw_icon(
-                        canvas,
-                        keyboard_origin_x + keys[column].x,
-                        keyboard_origin_y + keys[column].y,
-                        &I_KeyBackspace_16x9);
-                }
-            } else {
-                if(model->selected_row == row && model->selected_column == column) {
-                    canvas_set_color(canvas, ColorBlack);
-                    canvas_draw_box(
-                        canvas,
-                        keyboard_origin_x + keys[column].x - 3,
-                        keyboard_origin_y + keys[column].y - 10,
-                        11,
-                        13);
-                    canvas_set_color(canvas, ColorWhite);
-                } else if(model->selected_row == -1 && row == 0 && model->selected_column == column) {
-                    canvas_set_color(canvas, ColorBlack);
-                    canvas_draw_frame(
-                        canvas,
-                        keyboard_origin_x + keys[column].x - 3,
-                        keyboard_origin_y + keys[column].y - 10,
-                        11,
-                        13);
-                } else {
-                    canvas_set_color(canvas, ColorBlack);
-                }
-
-                canvas_draw_glyph(
-                    canvas,
-                    keyboard_origin_x + keys[column].x,
-                    keyboard_origin_y + keys[column].y,
-                    keys[column].text);
-            }
-        }
-    }
-}
-
-/** Input callback
- *
- * @param      event    The event
- * @param      context  The context
- *
- * @return     true
- * @return     false
- */
-static bool int_input_view_input_callback(InputEvent* event, void* context) {
-    IntInput* int_input = context;
-    furi_assert(int_input);
-
-    bool consumed = false;
-
-    // Fetch the model
-    IntInputModel* model = view_get_model(int_input->view);
-
-    if(event->type == InputTypeShort || event->type == InputTypeLong ||
-       event->type == InputTypeRepeat) {
-        consumed = true;
-        switch(event->key) {
-        case InputKeyLeft:
-            int_input_handle_left(model);
-            break;
-        case InputKeyRight:
-            int_input_handle_right(model);
-            break;
-        case InputKeyUp:
-            int_input_handle_up(model);
-            break;
-        case InputKeyDown:
-            int_input_handle_down(model);
-            break;
-        case InputKeyOk:
-            int_input_handle_ok(model);
-            break;
-        default:
-            consumed = false;
-            break;
-        }
-    }
-
-    // commit view
-    view_commit_model(int_input->view, consumed);
-
-    return consumed;
-}
-
-void int_input_reset(IntInput* int_input) {
-    FURI_LOG_D("INT_INPUT", "Resetting Model");
-    furi_assert(int_input);
-    with_view_model(
-        int_input->view,
-        IntInputModel * model,
-        {
-            model->header = "";
-            model->selected_row = 0;
-            model->selected_column = 0;
-            model->clear_default_text = false;
-            model->text_buffer = "";
-            model->text_buffer_size = 0;
-            model->callback = NULL;
-            model->callback_context = NULL;
-        },
-        true);
-}
-
-IntInput* int_input_alloc() {
-    IntInput* int_input = malloc(sizeof(IntInput));
-    int_input->view = view_alloc();
-    view_set_context(int_input->view, int_input);
-    view_allocate_model(int_input->view, ViewModelTypeLocking, sizeof(IntInputModel));
-    view_set_draw_callback(int_input->view, int_input_view_draw_callback);
-    view_set_input_callback(int_input->view, int_input_view_input_callback);
-
-    int_input_reset(int_input);
-
-    return int_input;
-}
-
-void int_input_free(IntInput* int_input) {
-    furi_assert(int_input);
-    view_free(int_input->view);
-    free(int_input);
-}
-
-View* int_input_get_view(IntInput* int_input) {
-    furi_assert(int_input);
-    return int_input->view;
-}
-
-void int_input_set_result_callback(
-    IntInput* int_input,
-    IntInputCallback callback,
-    void* callback_context,
-    char* text_buffer,
-    size_t text_buffer_size,
-    bool clear_default_text) {
-    with_view_model(
-        int_input->view,
-        IntInputModel * model,
-        {
-            model->callback = callback;
-            model->callback_context = callback_context;
-            model->text_buffer = text_buffer;
-            model->text_buffer_size = text_buffer_size;
-            model->clear_default_text = clear_default_text;
-        },
-        true);
-}
-
-void int_input_set_header_text(IntInput* int_input, const char* text) {
-    with_view_model(int_input->view, IntInputModel * model, { model->header = text; }, true);
-}

+ 0 - 72
cross_remote/helpers/gui/int_input.h

@@ -1,72 +0,0 @@
-/**
- * @file int_input.h
- * GUI: Integer string keyboard view module API
- */
-
-#pragma once
-
-#include <gui/view.h>
-#include "xremote_icons.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/** Int input anonymous structure  */
-typedef struct IntInput IntInput;
-
-/** callback that is executed on save button press */
-typedef void (*IntInputCallback)(void* context);
-
-/** callback that is executed when byte buffer is changed */
-typedef void (*IntChangedCallback)(void* context);
-
-/** Allocate and initialize Int input. This Int input is used to enter Ints.
- *
- * @return     IntInput instance pointer
- */
-IntInput* int_input_alloc();
-
-/** Deinitialize and free byte input
- *
- * @param      int_input  Int input instance
- */
-void int_input_free(IntInput* int_input);
-
-/** Get byte input view
- *
- * @param      int_input  byte input instance
- *
- * @return     View instance that can be used for embedding
- */
-View* int_input_get_view(IntInput* int_input);
-
-/** Set byte input result callback
- *
- * @param      int_input          byte input instance
- * @param      input_callback     input callback fn
- * @param      changed_callback   changed callback fn
- * @param      callback_context   callback context
- * @param      text_buffer        buffer to use
- * @param      text_buffer_size   buffer length
- * @param      clear_default_text clear previous entry
- */
-
-void int_input_set_result_callback(
-    IntInput* int_input,
-    IntInputCallback input_callback,
-    void* callback_context,
-    char* text_buffer,
-    size_t text_buffer_size,
-    bool clear_default_text);
-
-/** Set byte input header text
- *
- * @param      int_input  byte input instance
- * @param      text        text to be shown
- */
-void int_input_set_header_text(IntInput* int_input, const char* text);
-
-#ifdef __cplusplus
-}
-#endif

+ 17 - 27
cross_remote/scenes/xremote_scene_ir_timer.c

@@ -1,46 +1,36 @@
 #include "../xremote.h"
 #include "../models/cross/xremote_cross_remote.h"
 
-void xremote_scene_ir_timer_callback(void* context) {
+void xremote_scene_ir_timer_callback(void* context, int32_t number) {
     XRemote* app = context;
-    view_dispatcher_send_custom_event(app->view_dispatcher, XRemoteCustomEventTextInput);
+    CrossRemoteItem* item = xremote_cross_remote_get_item(app->cross_remote, app->edit_item);
+    item->time = number;
+    view_dispatcher_send_custom_event(app->view_dispatcher, 0);
 }
 
 void xremote_scene_ir_timer_on_enter(void* context) {
     furi_assert(context);
     XRemote* app = context;
-    IntInput* int_input = app->int_input;
-    size_t enter_name_length = 5;
-    char* str = "Transmit in ms (0 - 9999)";
-    const char* constStr = str;
+    NumberInput* number_input = app->number_input;
+
+    char str[50];
+    int32_t min_value = 0;
+    int32_t max_value = 9999;
+    snprintf(str, sizeof(str), "Transmit in ms (%ld - %ld)", min_value, max_value);
     CrossRemoteItem* item = xremote_cross_remote_get_item(app->cross_remote, app->edit_item);
-    int_input_set_header_text(int_input, constStr);
-    snprintf(app->text_store[1], 5, "%lu", item->time);
-
-    int_input_set_result_callback(
-        int_input,
-        xremote_scene_ir_timer_callback,
-        context,
-        app->text_store[1],
-        enter_name_length,
-        false);
-
-    view_dispatcher_switch_to_view(app->view_dispatcher, XRemoteViewIdIntInput);
+
+    number_input_set_header_text(number_input, str);
+    number_input_set_result_callback(
+        number_input, xremote_scene_ir_timer_callback, context, item->time, min_value, max_value);
+
+    view_dispatcher_switch_to_view(app->view_dispatcher, XRemoteViewIdNumberInput);
 }
 
 bool xremote_scene_ir_timer_on_event(void* context, SceneManagerEvent event) {
     XRemote* app = context;
     bool consumed = false;
 
-    if(event.type == SceneManagerEventTypeBack) {
-        scene_manager_previous_scene(app->scene_manager);
-        return true;
-    } else if(event.type == SceneManagerEventTypeCustom) {
-        CrossRemoteItem* item = xremote_cross_remote_get_item(app->cross_remote, app->edit_item);
-        xremote_cross_remote_item_set_time(item, atoi(app->text_store[1]));
-        if(item->time > 9999) {
-            item->time = 9999;
-        }
+    if(event.type == SceneManagerEventTypeCustom) {
         scene_manager_previous_scene(app->scene_manager);
         return true;
     }

+ 4 - 5
cross_remote/xremote.c

@@ -70,10 +70,9 @@ XRemote* xremote_app_alloc() {
 
     app->text_input = text_input_alloc();
 
-    // Custom made int keyboard
-    app->int_input = int_input_alloc();
+    app->number_input = number_input_alloc();
     view_dispatcher_add_view(
-        app->view_dispatcher, XRemoteViewIdIntInput, int_input_get_view(app->int_input));
+        app->view_dispatcher, XRemoteViewIdNumberInput, number_input_get_view(app->number_input));
 
     view_dispatcher_add_view(
         app->view_dispatcher, XRemoteViewIdTextInput, text_input_get_view(app->text_input));
@@ -147,12 +146,12 @@ void xremote_app_free(XRemote* app) {
     view_dispatcher_remove_view(app->view_dispatcher, XRemoteViewIdWip);
     view_dispatcher_remove_view(app->view_dispatcher, XRemoteViewIdStack);
     view_dispatcher_remove_view(app->view_dispatcher, XRemoteViewIdTextInput);
-    view_dispatcher_remove_view(app->view_dispatcher, XRemoteViewIdIntInput);
+    view_dispatcher_remove_view(app->view_dispatcher, XRemoteViewIdNumberInput);
     view_dispatcher_remove_view(app->view_dispatcher, XRemoteViewIdTransmit);
     view_dispatcher_remove_view(app->view_dispatcher, XRemoteViewIdPauseSet);
     view_dispatcher_remove_view(app->view_dispatcher, XRemoteViewIdIrRemote);
     text_input_free(app->text_input);
-    int_input_free(app->int_input);
+    number_input_free(app->number_input);
     button_menu_free(app->button_menu_create);
     button_menu_free(app->button_menu_create_add);
     button_menu_free(app->button_menu_ir);

+ 2 - 3
cross_remote/xremote.h

@@ -9,7 +9,6 @@
 #include "models/cross/xremote_cross_remote.h"
 #include "helpers/subghz/subghz_types.h"
 #include "helpers/subghz/subghz.h"
-#include "helpers/gui/int_input.h"
 #include "xremote_i.h"
 
 typedef struct SubGhz SubGhz;
@@ -52,7 +51,7 @@ typedef struct {
     bool stop_transmit;
     char text_store[XREMOTE_TEXT_STORE_NUM][XREMOTE_TEXT_STORE_SIZE + 1];
     SubGhz* subghz;
-    IntInput* int_input;
+    NumberInput* number_input;
 } XRemote;
 
 typedef enum {
@@ -66,7 +65,7 @@ typedef enum {
     XRemoteViewIdIrRemote,
     XRemoteViewIdStack,
     XRemoteViewIdTextInput,
-    XRemoteViewIdIntInput,
+    XRemoteViewIdNumberInput,
     XRemoteViewIdTransmit,
     XRemoteViewIdPauseSet,
 } XRemoteViewId;

+ 2 - 1
cross_remote/xremote_i.h

@@ -19,6 +19,7 @@
 #include <gui/modules/loading.h>
 #include <gui/modules/submenu.h>
 #include <gui/modules/dialog_ex.h>
+#include <gui/modules/number_input.h>
 #include <gui/modules/text_input.h>
 #include <gui/modules/button_menu.h>
 #include <gui/modules/button_panel.h>
@@ -50,7 +51,7 @@
 #define XREMOTE_TEXT_STORE_SIZE 128
 #define XREMOTE_MAX_ITEM_NAME_LENGTH 22
 #define XREMOTE_MAX_REMOTE_NAME_LENGTH 22
-#define XREMOTE_VERSION "2.6"
+#define XREMOTE_VERSION "2.7"
 
 #define INFRARED_APP_EXTENSION ".ir"
 #define INFRARED_APP_FOLDER ANY_PATH("infrared")