MX 1 год назад
Родитель
Сommit
5ab0b9e162
30 измененных файлов с 0 добавлено и 2247 удалено
  1. 0 1
      ReadMe.md
  2. 0 1
      non_catalog_apps/esp32_gravity/.vscode/settings.json
  3. 0 22
      non_catalog_apps/esp32_gravity/LICENSE
  4. 0 146
      non_catalog_apps/esp32_gravity/README.md
  5. 0 17
      non_catalog_apps/esp32_gravity/application.fam
  6. BIN
      non_catalog_apps/esp32_gravity/assets/KeyBackspaceSelected_16x9.png
  7. BIN
      non_catalog_apps/esp32_gravity/assets/KeyBackspace_16x9.png
  8. BIN
      non_catalog_apps/esp32_gravity/assets/KeySaveSelected_24x11.png
  9. BIN
      non_catalog_apps/esp32_gravity/assets/KeySave_24x11.png
  10. BIN
      non_catalog_apps/esp32_gravity/assets/WarningDolphin_45x42.png
  11. 0 56
      non_catalog_apps/esp32_gravity/esp_flip_struct.h
  12. BIN
      non_catalog_apps/esp32_gravity/grav_10x.png
  13. 0 30
      non_catalog_apps/esp32_gravity/scenes/uart_terminal_scene.c
  14. 0 29
      non_catalog_apps/esp32_gravity/scenes/uart_terminal_scene.h
  15. 0 3
      non_catalog_apps/esp32_gravity/scenes/uart_terminal_scene_config.h
  16. 0 126
      non_catalog_apps/esp32_gravity/scenes/uart_terminal_scene_console_output.c
  17. 0 474
      non_catalog_apps/esp32_gravity/scenes/uart_terminal_scene_start.c
  18. 0 137
      non_catalog_apps/esp32_gravity/scenes/uart_terminal_scene_text_input.c
  19. BIN
      non_catalog_apps/esp32_gravity/uart_terminal.png
  20. 0 113
      non_catalog_apps/esp32_gravity/uart_terminal_app.c
  21. 0 11
      non_catalog_apps/esp32_gravity/uart_terminal_app.h
  22. 0 57
      non_catalog_apps/esp32_gravity/uart_terminal_app_i.h
  23. 0 7
      non_catalog_apps/esp32_gravity/uart_terminal_custom_event.h
  24. 0 103
      non_catalog_apps/esp32_gravity/uart_terminal_uart.c
  25. 0 14
      non_catalog_apps/esp32_gravity/uart_terminal_uart.h
  26. 0 683
      non_catalog_apps/esp32_gravity/uart_text_input.c
  27. 0 82
      non_catalog_apps/esp32_gravity/uart_text_input.h
  28. 0 57
      non_catalog_apps/esp32_gravity/uart_validators.c
  29. 0 21
      non_catalog_apps/esp32_gravity/uart_validators.h
  30. 0 57
      non_catalog_apps/esp32_gravity/usage_const.h

+ 0 - 1
ReadMe.md

@@ -165,7 +165,6 @@ The Flipper and its community wouldn't be as rich as it is without your contribu
 | ESP32->Flipper Camera | ![GPIO Badge] | [by Z4urce](https://github.com/Z4urce/flipperzero-camera) |  | ![None Badge] |
 | RC2014 ColecoVision | ![GPIO Badge] | [by ezod](https://github.com/ezod/flipperzero-rc2014-coleco) |  | ![None Badge] |
 | ESP Flasher | ![GPIO Badge] | [by 0xchocolate](https://github.com/0xchocolate/flipperzero-esp-flasher) | QuickFlash mode and other changes [by @Willy-JL](https://github.com/Flipper-XFW/Xtreme-Apps/tree/dev/esp_flasher) | [![Author Badge]](https://lab.flipper.net/apps/esp_flasher) |
-| ESP32-C6 Gravity terminal | ![GPIO Badge] | [by chris-bc](https://github.com/chris-bc/Flipper-Gravity) |  | ![None Badge] |
 | IFTTT Virtual Button for ESP8266 | ![GPIO Badge] | [by Ferrazzi](https://github.com/Ferrazzi/FlipperZero_IFTTT_Virtual_Button) | Fixes [by Willy-JL](https://github.com/Flipper-XFW/Xtreme-Firmware/commit/ae321fb5f4c616d3965546926b1b4b446eef8d86) | ![None Badge] |
 | Wifi Deauth v2 for ESP8266 | ![GPIO Badge] | [by Timmotools](https://github.com/Timmotools/flipperzero_esp8266_deautherv2) |  | ![None Badge] |
 | Evil captive portal | ![GPIO Badge] | [by bigbrodude6119](https://github.com/bigbrodude6119/flipper-zero-evil-portal) | WIP -> +2 new features [by leedave](https://github.com/leedave/flipper-zero-evil-portal/tree/leedave/ap_rename) + Fixed and modded [by Willy-JL](https://github.com/Flipper-XFW/Xtreme-Firmware/tree/dev/applications/external/evil_portal) | ![None Badge] |

+ 0 - 1
non_catalog_apps/esp32_gravity/.vscode/settings.json

@@ -1 +0,0 @@
-{}

+ 0 - 22
non_catalog_apps/esp32_gravity/LICENSE

@@ -1,22 +0,0 @@
-MIT License
-
-=======
-Copyright (c) 2023 chris-bc
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.

+ 0 - 146
non_catalog_apps/esp32_gravity/README.md

@@ -1,146 +0,0 @@
-# Gravity for Flipper Zero
-## The Unseen Force
-
-This Flipper Zero application (FAP) is a companion application to ESP32-Gravity.
-
-ESP32-Gravity is a wireless exploration framework written for the ESP32. It
-supports a variety of wireless exploration, offensive and defensive features.
-
-ESP32-Gravity can be used without a Flipper, but Flipper-Gravity can't be used
-without ESP32-Gravity. You can download it from the [esp32-gravity GitHub repo](https://github.com/chris-bc/esp32-gravity).
-
-## Download Flipper-Gravity
-
-### 1. From Source
-
-1. Clone the RogueMaster repository using a command such as
-    * You may prefer to `checkout` - or even download - a release version of the code. You do you :)
-```c
-gh repo clone RogueMaster/flipperzero-firmware-wPlugins
-```
-2. Change to the RogueMaster directory: `cd flipperzero-firmware-wPlugins`
-3. Install the Flipper compilation toolchain: `./fbt`
-4. Configure your environment variables: `` . `./fbt -s env` `` (note the leading 'dot space')
-5. Change to the applications_user directory: `cd applications_user`
-6. Clone this repository using a command such as 
-```c
-gh repo clone chris-bc/Flipper-Gravity
-```
-7. Change back to the firmware root directory: `cd ..`
-
-Unless you've already flashed the firmware being used you'll need to upgrade the firmware on your Flipper so that it uses the same version as the FAP.
-
-To build and flash the complete firmware bundle make sure your
-Flipper Zero is on the home screen (no applications or menus open),
-connect it to your computer, and run
-```c
-./fbt firmware_all flash_usb_full
-```
-
-However, if you want to install just the application, you have two main options:
-1. `./fbt launch_app APPSRC=esp32_gravity` will build, install and start the application;
-2. `./fbt flash_usb fap_esp32_gravity` will build the application and package it into a firmware update package;
-3. Copy the update directory, which will be reported towards the end of the above command and will be similar to `dist/f7-C/f7-update-RM420FAP`, to the Flipper Zero's SD card;
-4. Open Browser on the Flipper by pressing `Down`, then `Left` repeatedly until you reach a screen labelled **Browser**;
-5. Navigate to the update directory you copied;
-6. Push `OK` on `update.fuf`, then select *Run in App*;
-7. Once the firmware update completes Gravity will be installed under `Apps/GPIO/ESP32/[ESP32] Gravity`
-
-
-### 2. Binaries
-
-Simply download this `FAP` (Flipper Application Package) and copy it to your
-preferred applications folder on your Flipper Zero's SD card.
-
-Now you just need to flash and connect an ESP32 and you'll be ready to go!
-
-[![FAP Factory](https://flipc.org/api/v1/cool4uma/UART_Terminal/badge?firmware=unleashed)](https://flipc.org/chris-bc/Flipper-Gravity?firmware=roguemaster)
-
-
-## Reduced Support for ESP32-C6
-
-Good news for all the Flipper tinkerers who have a bucket of ESP32s but
-no ESP32-C6s - Espressif's development environment, even trying the
-bleeding edge from GitHub, doesn't yet have full Bluetooth support
-for the ESP32-C6.
-
-Gravity now targets the regular ESP32. I'm using a Wroom during development,
-and hope to verify it working on ESP32-Cam cam at some point, but I think
-this makes ESP32 the only Espressif microcontroller with full-stack Bluetooth
-support. For now, at least.
-
-For more information, including a thorough overview of all features,
-check out the [readme doc over at esp-32-gravity](https://github.com/chris-bc/esp32-gravity/blob/main/README.md)
-
-
-## Version Compatibility
-
-Since Gravity has been included with RogueMaster Firmware I thought I should
-make a couple of changes to make it easy for people other than me to know
-which esp32-Gravity is compatible with which Flipper-Gravity.
-
-* From here on out versions will be numbered `(major).(minor).(release)`;
-* For example `1.2.1`;
-* Different **release** versions (such as `1.2.1` and `1.2.9`) will always be compatible with each other, although the addition or significant modification of some features may result in a small number of features not working;
-* Changes in minor version, such as `1.2.1` and `1.3.1`, are unlikely to be compatible. A change in minor version represents a noteable change to the platform or a breaking change to the platform;
-* Changes in major verson, such as `1.4.9` to `2.0.0`, represent substantial changes to the application and how it runs. Different major versions *will not* be compatible with each other.
-
-
-## Gravity In Action
-
-![Gravity Main Menu](https://github.com/chris-bc/flipper-gravity/blob/main/flip-grav-mainmenu.png)
-
-![Gravity Mana Attack](https://github.com/chris-bc/flipper-gravity/blob/main/flip-grav-mana.jpg)
-
-![Gravity About Page](https://github.com/chris-bc/flipper-gravity/blob/main/flip-grav-about.png)
-
-
-## TODO
-* Bug: Console scrolls to top mid-scroll when text is added to it
-    * Replicate: Start scan, Run help and try to read it
-* Add space to keyboard
-* add channel, mode, count STA+AP on console header
-* Paging in homing mode where all targets can't be displayed at the same time
-    * like airline departures - one screen for 3s, another screen for 3s.
-
-## Menu Structure
-* Beacon: target-ssids, APs, RickRoll, Random, Infinite
-* Probe: Any, target-ssids, APs
-* Sniff: On, Off
-* target-ssids: add, remove, list
-* scan: <ssid> WiFi BT BLE *SERVICES* OFF
-* hop: on, off, sequential, random, default, set
-* view: sta, ap, bt, sta+ap+bt, sta+ap, *services*
-* select: sta, ap, bt
-* selected: sta, ap, bt, sta+ap+bt
-* clear: sta, ap, bt, *services* *selected*
-* purge: WiFi, BT, BLE, *AP* *STA* *SERVICES*
-* get/set: <variables> BLE_PURGE_STRAT _MIN_AGE _MAX_RSSI
-* deauth: off, frame STA, device STA, spoof STA, frame APs, device APs, spoof APs, frame broadcast, device broadcast, spoof broadcast
-* mana: on, off, clear
-* mana verbose: on, off
-* mana loud: on, off
-* DOS AP: on, off
-* DOS Clone: status, off, Open, WEP, WPA, Open+WEP, Open+WPA, WEP+WPA, Open+WEP+WPA
-* Homing: 802.11, Bluetooth, any (more options coming soon)
-* help: commands help info
-
-
-Info: If possible, do not power your devices from 3V3 (pin 9) Flipper Zero. It does not support hot plugging.
-
-## Keyboard
-UART_terminal uses its own special keyboard for work, which has all the symbols necessary for working in the console.
-
-To accommodate more characters on a small display, some characters are called up by holding.
-
-![kbf](https://user-images.githubusercontent.com/122148894/212286637-7063f1ee-c6ff-46b9-8dc5-79a5f367fab1.png)
-
-## How to install
-Copy the contents of the repository to the applications_user/uart_terminal folder Flipper Zero firmware and build app with the command ./fbt fap_uart_terminal.
-
-Or use the tool [uFBT](https://github.com/flipperdevices/flipperzero-ufbt) for building applications for Flipper Zero.
-
-Download ready [fap](https://github.com/playmean/fap-list)
-
-## How it works
-

+ 0 - 17
non_catalog_apps/esp32_gravity/application.fam

@@ -1,17 +0,0 @@
-App(
-    appid="esp32_gravity",
-    name="[ESP32] Gravity",
-    apptype=FlipperAppType.EXTERNAL,
-    entry_point="uart_terminal_app",
-    requires=["gui"],
-    stack_size=1 * 1024,
-    order=90,
-    fap_icon="grav_10x.png",
-    fap_category="GPIO",
-    fap_icon_assets="assets",
-    fap_icon_assets_symbol="uart_terminal",
-    fap_author="https://github.com/chris-bc",
-    fap_weburl="https://github.com/chris-bc/Flipper-Gravity",
-    fap_version="0.6.0",
-    fap_description="App to control ESP32 Gravity wireless exploration platform.",
-)

BIN
non_catalog_apps/esp32_gravity/assets/KeyBackspaceSelected_16x9.png


BIN
non_catalog_apps/esp32_gravity/assets/KeyBackspace_16x9.png


BIN
non_catalog_apps/esp32_gravity/assets/KeySaveSelected_24x11.png


BIN
non_catalog_apps/esp32_gravity/assets/KeySave_24x11.png


BIN
non_catalog_apps/esp32_gravity/assets/WarningDolphin_45x42.png


+ 0 - 56
non_catalog_apps/esp32_gravity/esp_flip_struct.h

@@ -1,56 +0,0 @@
-#ifndef ESP_FLIP_STRUCT_H
-#define ESP_FLIP_STRUCT_H
-
-/*  Globals to track module status information */
-enum AttackMode {
-    ATTACK_BEACON,
-    ATTACK_PROBE,
-    ATTACK_FUZZ,
-    ATTACK_SNIFF,
-    ATTACK_DEAUTH,
-    ATTACK_MANA,
-    ATTACK_MANA_VERBOSE,
-    ATTACK_MANA_LOUD,
-    ATTACK_AP_DOS,
-    ATTACK_AP_CLONE,
-    ATTACK_SCAN,
-    ATTACK_SCAN_BT_DISCOVERY,
-    ATTACK_SCAN_BLE,
-    ATTACK_HANDSHAKE,
-    ATTACK_RANDOMISE_MAC, // True
-    ATTACK_BT,
-    ATTACK_STALK,
-    ATTACKS_COUNT
-};
-typedef enum AttackMode AttackMode;
-
-enum GravityCommand {
-    GRAVITY_BEACON = 0,
-    GRAVITY_TARGET_SSIDS,
-    GRAVITY_PROBE,
-    GRAVITY_FUZZ,
-    GRAVITY_SNIFF,
-    GRAVITY_DEAUTH,
-    GRAVITY_MANA,
-    GRAVITY_STALK,
-    GRAVITY_AP_DOS,
-    GRAVITY_AP_CLONE,
-    GRAVITY_SCAN,
-    GRAVITY_HOP,
-    GRAVITY_SET,
-    GRAVITY_GET,
-    GRAVITY_VIEW,
-    GRAVITY_SELECT,
-    GRAVITY_SELECTED,
-    GRAVITY_CLEAR,
-    GRAVITY_HANDSHAKE,
-    GRAVITY_COMMANDS,
-    GRAVITY_INFO,
-    GRAVITY_GET_VERSION,
-    GRAVITY_PURGE,
-    GRAVITY_BT,
-    GRAVITY_NONE = 99
-};
-typedef enum GravityCommand GravityCommand;
-
-#endif

BIN
non_catalog_apps/esp32_gravity/grav_10x.png


+ 0 - 30
non_catalog_apps/esp32_gravity/scenes/uart_terminal_scene.c

@@ -1,30 +0,0 @@
-#include "uart_terminal_scene.h"
-
-// Generate scene on_enter handlers array
-#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_enter,
-void (*const uart_terminal_scene_on_enter_handlers[])(void*) = {
-#include "uart_terminal_scene_config.h"
-};
-#undef ADD_SCENE
-
-// Generate scene on_event handlers array
-#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_event,
-bool (*const uart_terminal_scene_on_event_handlers[])(void* context, SceneManagerEvent event) = {
-#include "uart_terminal_scene_config.h"
-};
-#undef ADD_SCENE
-
-// Generate scene on_exit handlers array
-#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_exit,
-void (*const uart_terminal_scene_on_exit_handlers[])(void* context) = {
-#include "uart_terminal_scene_config.h"
-};
-#undef ADD_SCENE
-
-// Initialize scene handlers configuration structure
-const SceneManagerHandlers uart_terminal_scene_handlers = {
-    .on_enter_handlers = uart_terminal_scene_on_enter_handlers,
-    .on_event_handlers = uart_terminal_scene_on_event_handlers,
-    .on_exit_handlers = uart_terminal_scene_on_exit_handlers,
-    .scene_num = UART_TerminalSceneNum,
-};

+ 0 - 29
non_catalog_apps/esp32_gravity/scenes/uart_terminal_scene.h

@@ -1,29 +0,0 @@
-#pragma once
-
-#include <gui/scene_manager.h>
-
-// Generate scene id and total number
-#define ADD_SCENE(prefix, name, id) UART_TerminalScene##id,
-typedef enum {
-#include "uart_terminal_scene_config.h"
-    UART_TerminalSceneNum,
-} UART_TerminalScene;
-#undef ADD_SCENE
-
-extern const SceneManagerHandlers uart_terminal_scene_handlers;
-
-// Generate scene on_enter handlers declaration
-#define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_enter(void*);
-#include "uart_terminal_scene_config.h"
-#undef ADD_SCENE
-
-// Generate scene on_event handlers declaration
-#define ADD_SCENE(prefix, name, id) \
-    bool prefix##_scene_##name##_on_event(void* context, SceneManagerEvent event);
-#include "uart_terminal_scene_config.h"
-#undef ADD_SCENE
-
-// Generate scene on_exit handlers declaration
-#define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_exit(void* context);
-#include "uart_terminal_scene_config.h"
-#undef ADD_SCENE

+ 0 - 3
non_catalog_apps/esp32_gravity/scenes/uart_terminal_scene_config.h

@@ -1,3 +0,0 @@
-ADD_SCENE(uart_terminal, start, Start)
-ADD_SCENE(uart_terminal, console_output, ConsoleOutput)
-ADD_SCENE(uart_terminal, text_input, UART_TextInput)

+ 0 - 126
non_catalog_apps/esp32_gravity/scenes/uart_terminal_scene_console_output.c

@@ -1,126 +0,0 @@
-#include "../uart_terminal_app_i.h"
-
-#define MIN_VERSION_STRLEN 43
-
-void uart_terminal_console_output_handle_rx_data_cb(uint8_t* buf, size_t len, void* context) {
-    furi_assert(context);
-    UART_TerminalApp* app = context;
-
-    // If text box store gets too big, then truncate it
-    app->text_box_store_strlen += len;
-    if(app->text_box_store_strlen >= UART_TERMINAL_TEXT_BOX_STORE_SIZE - 1) {
-        furi_string_right(app->text_box_store, app->text_box_store_strlen / 2);
-        app->text_box_store_strlen = furi_string_size(app->text_box_store) + len;
-    }
-
-    // Null-terminate buf and append to text box store
-    buf[len] = '\0';
-    furi_string_cat_printf(app->text_box_store, "%s", buf);
-
-    view_dispatcher_send_custom_event(
-        app->view_dispatcher, UART_TerminalEventRefreshConsoleOutput);
-}
-
-void uart_terminal_scene_console_output_on_enter(void* context) {
-    UART_TerminalApp* app = context;
-
-    TextBox* text_box = app->text_box;
-    text_box_reset(app->text_box);
-    text_box_set_font(text_box, TextBoxFontText);
-    if(app->focus_console_start) {
-        text_box_set_focus(text_box, TextBoxFocusStart);
-    } else {
-        text_box_set_focus(text_box, TextBoxFocusEnd);
-    }
-
-    if(app->is_command) { /* View console ensures this is false */
-        furi_string_reset(app->text_box_store);
-        app->text_box_store_strlen = 0;
-
-        /* Handle Flipper commands here - set ap->is_command = false for commands that are consumed */
-        if(!strcmp(app->selected_tx_string, "GET_STARTED")) {
-            app->is_command = false;
-            /* Display detailed instructions on getting started */
-            uart_text_input_set_header_text(app->text_input, "Getting Started");
-            // TODO: See if the header works
-            const char string[] =
-                "             Flipper Gravity\nGETTING STARTED\nUnless you're doing a basic beacon spam or probe flood attack, or a Mana attack, the first thing to do is turn scanning on and let it run while you explore the menu. View found APs (you can leave scanning on or turn it off), select a few APs or STAs and run a DEAUTH attack against the selected APs or STAs. When an AP is specified for a DEAUTH attack Gravity will use all STAs it identifies as clients of the specified APs. Turn off scanning and deauth, and turn on MANA or LOUD MANA. This is still under development, but you can watch Wireshark to see if any devices send you an association request.\n";
-            furi_string_cat_str(app->text_box_store, string);
-            app->text_box_store_strlen += strlen(string);
-        } else if(!strcmp(app->selected_tx_string, "gravity-version")) {
-            /* Display Flipper-Gravity components of the About screen */
-            /* Not setting app->is_command = false;
-               We want this command to be passed through to esp32-Gravity, so we can also
-               display its version */
-            /* Display a basic about screen */
-            // TODO: See if the following works:
-            const char about1[] =
-                "              Flipper Gravity\nBy Chris BC\n\nBe The Unseen Force.\n\nhttps://github.com/chris-bc/esp32-gravity\nhttps://github.com/chris-bc/Flipper-Gravity\n\nFlipper-Gravity : v";
-            furi_string_cat_str(app->text_box_store, about1);
-            app->text_box_store_strlen += strlen(about1);
-            furi_string_cat_str(app->text_box_store, GRAVITY_VERSION);
-            app->text_box_store_strlen += strlen(GRAVITY_VERSION);
-            furi_string_cat_str(app->text_box_store, "");
-            app->text_box_store_strlen += strlen("\n");
-            //furi_string_cat_printf(app->text_box_store, %s\n", GRAVITY_VERSION);
-            //app->text_box_store_strlen += 5 + strlen("              Flipper Gravity\nBy Chris BC\n\nBe The Unseen Force.\n\nhttps://github.com/chris-bc/esp32-gravity\nhttps://github.com/chris-bc/Flipper-Gravity\n\nFlipper-Gravity : v\n");
-        }
-
-        if(app->show_stopscan_tip) {
-            const char* help_msg = "Press BACK to return\n";
-            furi_string_cat_str(app->text_box_store, help_msg);
-            app->text_box_store_strlen += strlen(help_msg);
-        }
-    }
-
-    // Set starting text - for "View Log", this will just be what was already in the text box store
-    text_box_set_text(app->text_box, furi_string_get_cstr(app->text_box_store));
-
-    scene_manager_set_scene_state(app->scene_manager, UART_TerminalSceneConsoleOutput, 0);
-    view_dispatcher_switch_to_view(app->view_dispatcher, UART_TerminalAppViewConsoleOutput);
-
-    // Register callback to receive data
-    uart_terminal_uart_set_handle_rx_data_cb(
-        app->uart, uart_terminal_console_output_handle_rx_data_cb); // setup callback for rx thread
-
-    // Send command with CR+LF or newline '\n'
-    /* GRAVITY: Ignore the "cls" command */
-    if(app->is_command && app->selected_tx_string && strcmp(app->selected_tx_string, "cls")) {
-        if(app->TERMINAL_MODE == 1) {
-            uart_terminal_uart_tx(
-                app->uart, (uint8_t*)(app->selected_tx_string), strlen(app->selected_tx_string));
-            uart_terminal_uart_tx(app->uart, (uint8_t*)("\r\n"), 2);
-        } else {
-            uart_terminal_uart_tx(
-                app->uart, (uint8_t*)(app->selected_tx_string), strlen(app->selected_tx_string));
-            uart_terminal_uart_tx(app->uart, (uint8_t*)("\n"), 1);
-        }
-    }
-}
-
-bool uart_terminal_scene_console_output_on_event(void* context, SceneManagerEvent event) {
-    UART_TerminalApp* app = context;
-
-    bool consumed = false;
-
-    if(event.type == SceneManagerEventTypeCustom) {
-        text_box_set_text(app->text_box, furi_string_get_cstr(app->text_box_store));
-        consumed = true;
-    } else if(event.type == SceneManagerEventTypeTick) {
-        consumed = true;
-    }
-
-    return consumed;
-}
-
-void uart_terminal_scene_console_output_on_exit(void* context) {
-    UART_TerminalApp* app = context;
-
-    // Unregister rx callback
-    uart_terminal_uart_set_handle_rx_data_cb(app->uart, NULL);
-
-    /* Instruct ESP32 to halt any UIs that may be drawing */
-    if(!strcmp(app->selected_tx_string, "stalk on")) {
-        uart_terminal_uart_tx(app->uart, (uint8_t*)"stalk off\n", strlen("stalk off\n"));
-    }
-}

+ 0 - 474
non_catalog_apps/esp32_gravity/scenes/uart_terminal_scene_start.c

@@ -1,474 +0,0 @@
-#include "../uart_terminal_app_i.h"
-#include <dolphin/dolphin.h>
-
-// For each command, define whether additional arguments are needed
-// (enabling text input to fill them out), and whether the console
-// text box should focus at the start of the output or the end
-typedef enum { NO_ARGS = 0, INPUT_ARGS, TOGGLE_ARGS } InputArgs;
-
-typedef enum { FOCUS_CONSOLE_END = 0, FOCUS_CONSOLE_START, FOCUS_CONSOLE_TOGGLE } FocusConsole;
-
-#define SHOW_STOPSCAN_TIP (true)
-#define NO_TIP (false)
-
-#define MAX_OPTIONS (12)
-typedef struct {
-    const char* item_string;
-    const char* options_menu[MAX_OPTIONS];
-    int num_options_menu;
-    const char* actual_commands[MAX_OPTIONS];
-    InputArgs needs_keyboard;
-    FocusConsole focus_console;
-    bool show_stopscan_tip;
-} UART_TerminalItem;
-
-// NUM_MENU_ITEMS defined in uart_terminal_app_i.h - if you add an entry here, increment it!
-/* CBC: Looking for a way to best use TOGGLE_ARGS, how's this:
-        ** If actual_commands[i] ends with space, display a keyboard to fill in the blank ***
-*/
-const UART_TerminalItem items[NUM_MENU_ITEMS] = {
-    {"Console", {"View", "Clear"}, 2, {"", "cls"}, NO_ARGS, FOCUS_CONSOLE_END, NO_TIP},
-    {"Beacon",
-     {"Status", "target-ssids", "APs", "RickRoll", "Random", "Infinite", "Off"},
-     7,
-     {"beacon",
-      "beacon target-ssids",
-      "beacon aps",
-      "beacon rickroll",
-      "beacon random ",
-      "beacon infinite",
-      "beacon off"},
-     TOGGLE_ARGS,
-     FOCUS_CONSOLE_END,
-     NO_TIP},
-    {"Probe",
-     {"Status", "Any", "target-ssids", "APs", "Off"},
-     5,
-     {"probe", "probe any", "probe target-ssids", "probe aps", "probe off"},
-     NO_ARGS,
-     FOCUS_CONSOLE_END,
-     NO_TIP},
-    {"Fuzz",
-     {"Status",
-      "Off",
-      "Overflow Beacon",
-      "Overflow Request",
-      "Overflow Response",
-      "Malformed Beacon",
-      "Malformed Request",
-      "Malformed Response"},
-     8,
-     {"fuzz",
-      "fuzz off",
-      "fuzz beacon overflow",
-      "fuzz req overflow",
-      "fuzz resp overflow",
-      "fuzz beacon malformed",
-      "fuzz req malformed",
-      "fuzz resp malformed"},
-     NO_ARGS,
-     FOCUS_CONSOLE_END,
-     NO_TIP},
-    {"Sniff",
-     {"Status", "On", "Off"},
-     3,
-     {"sniff", "sniff on", "sniff off"},
-     NO_ARGS,
-     FOCUS_CONSOLE_END,
-     NO_TIP},
-    {"target-ssids",
-     {"Add", "Remove", "List"},
-     3,
-     {"target-ssids add ", "target-ssids remove ", "target-ssids"},
-     TOGGLE_ARGS,
-     FOCUS_CONSOLE_END,
-     NO_TIP},
-    {"Scan",
-     {"Status", "<SSID>", "WiFi", "BT", "BLE", "BT Svcs", "Off"},
-     7,
-     {"scan", "scan ", "scan wifi", "scan bt", "scan ble", "scan bt services", "scan off"},
-     TOGGLE_ARGS,
-     FOCUS_CONSOLE_END,
-     NO_TIP},
-    {"Hop",
-     {"Status", "On", "Off", "Sequential", "Random", "Default", "Set "},
-     7,
-     {"hop", "hop on", "hop off", "hop sequential", "hop random", "hop default", "hop "},
-     TOGGLE_ARGS,
-     FOCUS_CONSOLE_END,
-     NO_TIP},
-    {"View",
-     {"STA", "AP", "BT", "BT SVCS", "BT+AP+STA", "STA+AP"},
-     6,
-     {"view sta", "view ap", "view bt", "view bt services", "view ap sta bt", "view sta ap"},
-     NO_ARGS,
-     FOCUS_CONSOLE_START,
-     NO_TIP},
-    {"Select",
-     {"STA", "AP", "BT"},
-     3,
-     {"select sta ", "select ap ", "select bt "},
-     INPUT_ARGS,
-     FOCUS_CONSOLE_END,
-     NO_TIP},
-    {"Selected",
-     {"STA", "AP", "BT", "AP+STA+BT"},
-     4,
-     {"selected sta", "selected ap", "selected bt", "selected"},
-     NO_ARGS,
-     FOCUS_CONSOLE_START,
-     NO_TIP},
-    {"Clear",
-     {"STA", "STA Sel.", "AP", "AP Sel.", "BT", "BT Sel.", "BT Svcs", "ALL"},
-     8,
-     {"clear sta",
-      "clear sta selected",
-      "clear ap",
-      "clear ap selected",
-      "clear bt",
-      "clear bt selected",
-      "clear bt services",
-      "clear all"},
-     NO_ARGS,
-     FOCUS_CONSOLE_END,
-     NO_TIP},
-    {"Purge",
-     {"AP", "STA", "BT", "BLE"},
-     4,
-     {"purge ap", "purge sta", "purge bt", "purge ble"},
-     NO_ARGS,
-     FOCUS_CONSOLE_END,
-     NO_TIP},
-    {"Get",
-     {"pkt expiry",
-      "SSID rnd chars",
-      "Attack millis",
-      "SSID min len",
-      "SSID max len",
-      "default SSID count",
-      "Channel",
-      "MAC",
-      "MAC Randomisation",
-      "Purge Strategy",
-      "Purge Min Age",
-      "Purge Max RSSI"},
-     12,
-     {"get expiry",
-      "get scramble_words",
-      "get attack_millis",
-      "get ssid_len_min",
-      "get ssid_len_max",
-      "get default_ssid_count",
-      "get channel",
-      "get mac",
-      "get mac_rand",
-      "get ble_purge_strat",
-      "get ble_purge_min_age",
-      "get ble_purge_max_rssi"},
-     NO_ARGS,
-     FOCUS_CONSOLE_END,
-     NO_TIP},
-    {"Set",
-     {"pkt expiry",
-      "SSID rnd chars",
-      "Attack millis",
-      "SSID min len",
-      "SSID max len",
-      "default SSID count",
-      "Channel",
-      "MAC",
-      "MAC Randomisation",
-      "Purge Strategy",
-      "Purge Min Age",
-      "Purge Max RSSI"},
-     12,
-     {"set expiry ",
-      "set scramble_words ",
-      "set attack_millis ",
-      "set ssid_len_min ",
-      "set ssid_len_max ",
-      "set default_ssid_count ",
-      "set channel ",
-      "set mac ",
-      "set mac_rand ",
-      "set BLE_PURGE_STRAT ",
-      "set BLE_PURGE_MIN_AGE ",
-      "set BLE_PURGE_MAX_RSSI "},
-     INPUT_ARGS,
-     FOCUS_CONSOLE_END,
-     NO_TIP},
-    {"Deauth",
-     {"Status",
-      "Set Delay",
-      "Off",
-      "Frame STA",
-      "Device STA",
-      "Spoof STA",
-      "Frame APs",
-      "Device APs",
-      "Spoof APs",
-      "Frame B'Cast",
-      "Device B'Cast",
-      "Spoof B'Cast"},
-     12,
-     {"deauth",
-      "deauth ",
-      "deauth off",
-      "deauth frame sta",
-      "deauth device sta",
-      "deauth spoof sta",
-      "deauth frame ap",
-      "deauth device ap",
-      "deauth spoof ap",
-      "deauth frame broadcast",
-      "deauth device broadcast",
-      "deauth spoof broadcast"},
-     TOGGLE_ARGS,
-     FOCUS_CONSOLE_END,
-     NO_TIP},
-    {"Mana",
-     {"Status", "On", "Off", "Clear"},
-     4,
-     {"mana", "mana on", "mana off", "mana clear"},
-     NO_ARGS,
-     FOCUS_CONSOLE_END,
-     NO_TIP},
-    {"Mana Verbose",
-     {"Status", "On", "Off"},
-     3,
-     {"mana verbose", "mana verbose on", "mana verbose off"},
-     NO_ARGS,
-     FOCUS_CONSOLE_END,
-     NO_TIP},
-    {"Mana Loud",
-     {"Status", "On", "Off"},
-     3,
-     {"mana loud", "mana loud on", "mana loud off"},
-     NO_ARGS,
-     FOCUS_CONSOLE_END,
-     NO_TIP},
-    {"selectedAP DOS",
-     {"Status", "On", "Off"},
-     3,
-     {"ap-dos", "ap-dos on", "ap-dos off"},
-     NO_ARGS,
-     FOCUS_CONSOLE_END,
-     NO_TIP},
-    {"AP Clone Attack",
-     {"Status", "Off", "OPN", "WEP", "WPA", "OPN+WEP", "OPN+WPA", "WEP+WPA", "OPN+WEP+WPA"},
-     9,
-     {"ap-clone",
-      "ap-clone off",
-      "ap-clone on open",
-      "ap-clone on wep",
-      "ap-clone on wpa",
-      "ap-clone on open wep",
-      "ap-clone on open wpa",
-      "ap-clone on wep wpa",
-      "ap-clone on open wep wpa"},
-     NO_ARGS,
-     FOCUS_CONSOLE_END,
-     NO_TIP},
-    {"Homing", {"On", "Off"}, 2, {"stalk on", "stalk off"}, NO_ARGS, FOCUS_CONSOLE_END, NO_TIP},
-    {"Help",
-     {"Info <cmd>", "Get Started", "Commands", "About", "Help"},
-     5,
-     {"info ", "GET_STARTED", "commands", "gravity-version", "help"},
-     TOGGLE_ARGS,
-     FOCUS_CONSOLE_START,
-     NO_TIP},
-};
-
-char* strToken(char* cmdLine, char sep, int tokenNum) {
-    int i;
-    int tokenCount = 0;
-    for(i = 0; i < (int)strlen(cmdLine) && tokenCount != tokenNum; ++i) {
-        if(cmdLine[i] == sep) {
-            ++tokenCount;
-        }
-    }
-    if(cmdLine[i - 1] == sep || cmdLine[i - 1] == '\0') {
-        /* Found the end of the token, now find the beginning */
-        int j;
-        for(j = (i - 2); j > 0 && cmdLine[j] != sep; --j) {
-        }
-        /* Token runs from index j to (i - 2) */
-        char* retVal = malloc(sizeof(char) * (i - j));
-        if(retVal == NULL) {
-            printf("GRAVITY: Failed to malloc token\n");
-            return NULL;
-        }
-        strncpy(retVal, cmdLine, (i - j - 1));
-        retVal[i - j - 1] = '\0';
-        return retVal;
-    } else {
-        /* No token */
-        if(tokenNum == 1) {
-            return cmdLine;
-        } else {
-            return NULL;
-        }
-    }
-    return NULL;
-}
-
-/* Callback when an option is selected */
-static void uart_terminal_scene_start_var_list_enter_callback(void* context, uint32_t index) {
-    furi_assert(context);
-    UART_TerminalApp* app = context;
-
-    furi_assert(index < NUM_MENU_ITEMS);
-    const UART_TerminalItem* item = &items[index];
-
-    const int selected_option_index = app->selected_option_index[index];
-    dolphin_deed(DolphinDeedGpioUartBridge);
-    furi_assert(selected_option_index < item->num_options_menu);
-    app->selected_tx_string = item->actual_commands[selected_option_index];
-    /* Don't clear screen if command is an empty string */
-    app->is_command = (strlen(app->selected_tx_string) > 0);
-    app->is_custom_tx_string = false;
-    app->selected_menu_index = index;
-    app->focus_console_start = (item->focus_console == FOCUS_CONSOLE_TOGGLE) ?
-                                   (selected_option_index == 0) :
-                                   item->focus_console;
-    app->show_stopscan_tip = item->show_stopscan_tip;
-
-    /* GRAVITY: Set app->gravityMode based on first word in command */
-
-    //char *cmd = strsep(&origCmd, " ");
-    /* GRAVITY: strsep is disabled by Flipper's SDK. RYO */
-
-    char* cmd = strToken((char*)app->selected_tx_string, ' ', 1);
-    if(!strcmp(cmd, "beacon")) {
-        app->gravityCommand = GRAVITY_BEACON;
-    } else if(!strcmp(cmd, "target-ssids")) {
-        app->gravityCommand = GRAVITY_TARGET_SSIDS;
-    } else if(!strcmp(cmd, "probe")) {
-        app->gravityCommand = GRAVITY_PROBE;
-    } else if(!strcmp(cmd, "fuzz")) {
-        app->gravityCommand = GRAVITY_FUZZ;
-    } else if(!strcmp(cmd, "sniff")) {
-        app->gravityCommand = GRAVITY_SNIFF;
-    } else if(!strcmp(cmd, "deauth")) {
-        app->gravityCommand = GRAVITY_DEAUTH;
-    } else if(!strcmp(cmd, "mana")) {
-        app->gravityCommand = GRAVITY_MANA;
-    } else if(!strcmp(cmd, "stalk")) {
-        app->gravityCommand = GRAVITY_STALK;
-    } else if(!strcmp(cmd, "ap-dos")) {
-        app->gravityCommand = GRAVITY_AP_DOS;
-    } else if(!strcmp(cmd, "ap-clone")) {
-        app->gravityCommand = GRAVITY_AP_CLONE;
-    } else if(!strcmp(cmd, "scan")) {
-        app->gravityCommand = GRAVITY_SCAN;
-    } else if(!strcmp(cmd, "hop")) {
-        app->gravityCommand = GRAVITY_HOP;
-    } else if(!strcmp(cmd, "set")) {
-        app->gravityCommand = GRAVITY_SET;
-    } else if(!strcmp(cmd, "get")) {
-        app->gravityCommand = GRAVITY_GET;
-    } else if(!strcmp(cmd, "view")) {
-        app->gravityCommand = GRAVITY_VIEW;
-    } else if(!strcmp(cmd, "select")) {
-        app->gravityCommand = GRAVITY_SELECT;
-    } else if(!strcmp(cmd, "selected")) {
-        app->gravityCommand = GRAVITY_SELECTED;
-    } else if(!strcmp(cmd, "clear")) {
-        app->gravityCommand = GRAVITY_CLEAR;
-    } else if(!strcmp(cmd, "handshake")) {
-        app->gravityCommand = GRAVITY_HANDSHAKE;
-    } else if(!strcmp(cmd, "commands")) {
-        app->gravityCommand = GRAVITY_COMMANDS;
-    } else if(!strcmp(cmd, "info")) {
-        app->gravityCommand = GRAVITY_INFO;
-    } else {
-        app->gravityCommand = GRAVITY_NONE;
-    }
-
-    free(cmd);
-
-    /* GRAVITY: For TOGGLE_ARGS display a keyboard if actual_command ends with ' ' */
-    int cmdLen = strlen(app->selected_tx_string);
-    bool needs_keyboard =
-        ((item->needs_keyboard == INPUT_ARGS) ||
-         (item->needs_keyboard == TOGGLE_ARGS && (app->selected_tx_string[cmdLen - 1] == ' ')));
-    /* Initialise the serial console */
-    uart_terminal_uart_tx(app->uart, (uint8_t*)("\n"), 1);
-
-    if(needs_keyboard) {
-        view_dispatcher_send_custom_event(app->view_dispatcher, UART_TerminalEventStartKeyboard);
-    } else {
-        view_dispatcher_send_custom_event(app->view_dispatcher, UART_TerminalEventStartConsole);
-    }
-}
-
-/* Callback when a selected option is changed (I Think) */
-static void uart_terminal_scene_start_var_list_change_callback(VariableItem* item) {
-    furi_assert(item);
-
-    UART_TerminalApp* app = variable_item_get_context(item);
-    furi_assert(app);
-
-    const UART_TerminalItem* menu_item = &items[app->selected_menu_index];
-    uint8_t item_index = variable_item_get_current_value_index(item);
-    furi_assert(item_index < menu_item->num_options_menu);
-    variable_item_set_current_value_text(item, menu_item->options_menu[item_index]);
-    app->selected_option_index[app->selected_menu_index] = item_index;
-}
-
-/* Callback on entering the scene (initialisation) */
-void uart_terminal_scene_start_on_enter(void* context) {
-    UART_TerminalApp* app = context;
-    VariableItemList* var_item_list = app->var_item_list;
-
-    variable_item_list_set_enter_callback(
-        var_item_list, uart_terminal_scene_start_var_list_enter_callback, app);
-
-    VariableItem* item;
-    for(int i = 0; i < NUM_MENU_ITEMS; ++i) {
-        item = variable_item_list_add(
-            var_item_list,
-            items[i].item_string,
-            items[i].num_options_menu,
-            uart_terminal_scene_start_var_list_change_callback,
-            app);
-        variable_item_set_current_value_index(item, app->selected_option_index[i]);
-        variable_item_set_current_value_text(
-            item, items[i].options_menu[app->selected_option_index[i]]);
-    }
-
-    variable_item_list_set_selected_item(
-        var_item_list, scene_manager_get_scene_state(app->scene_manager, UART_TerminalSceneStart));
-
-    view_dispatcher_switch_to_view(app->view_dispatcher, UART_TerminalAppViewVarItemList);
-}
-
-/* Event handler callback - Handle scene change and tick events */
-bool uart_terminal_scene_start_on_event(void* context, SceneManagerEvent event) {
-    UNUSED(context);
-    UART_TerminalApp* app = context;
-    bool consumed = false;
-
-    if(event.type == SceneManagerEventTypeCustom) {
-        if(event.event == UART_TerminalEventStartKeyboard) {
-            scene_manager_set_scene_state(
-                app->scene_manager, UART_TerminalSceneStart, app->selected_menu_index);
-            scene_manager_next_scene(app->scene_manager, UART_TerminalAppViewTextInput);
-        } else if(event.event == UART_TerminalEventStartConsole) {
-            scene_manager_set_scene_state(
-                app->scene_manager, UART_TerminalSceneStart, app->selected_menu_index);
-            scene_manager_next_scene(app->scene_manager, UART_TerminalAppViewConsoleOutput);
-        }
-        consumed = true;
-    } else if(event.type == SceneManagerEventTypeTick) {
-        app->selected_menu_index = variable_item_list_get_selected_item_index(app->var_item_list);
-        consumed = true;
-    }
-    return consumed;
-}
-
-/* Clean up on exit */
-void uart_terminal_scene_start_on_exit(void* context) {
-    UART_TerminalApp* app = context;
-    variable_item_list_reset(app->var_item_list);
-}

+ 0 - 137
non_catalog_apps/esp32_gravity/scenes/uart_terminal_scene_text_input.c

@@ -1,137 +0,0 @@
-#include "../uart_terminal_app_i.h"
-
-/* GRAVITY: Import ESP32-Gravity usage strings */
-#include "../usage_const.h"
-
-void uart_terminal_scene_text_input_callback(void* context) {
-    UART_TerminalApp* app = context;
-
-    view_dispatcher_send_custom_event(app->view_dispatcher, UART_TerminalEventStartConsole);
-}
-
-void uart_terminal_scene_text_input_on_enter(void* context) {
-    UART_TerminalApp* app = context;
-
-    if(false == app->is_custom_tx_string) {
-        // Fill text input with selected string so that user can add to it
-        size_t length = strlen(app->selected_tx_string);
-        furi_assert(length < UART_TERMINAL_TEXT_INPUT_STORE_SIZE);
-        bzero(app->text_input_store, UART_TERMINAL_TEXT_INPUT_STORE_SIZE);
-        strncpy(app->text_input_store, app->selected_tx_string, length);
-
-        // Add space - because flipper keyboard currently doesn't have a space
-        //app->text_input_store[length] = ' ';
-        app->text_input_store[length + 1] = '\0';
-        app->is_custom_tx_string = true;
-    }
-
-    // Setup view
-    UART_TextInput* text_input = app->text_input;
-    // Add help message to header
-
-    char *helpStr = NULL;
-    switch (app->gravityCommand) {
-        case GRAVITY_BEACON:
-            helpStr = (char *)SHORT_BEACON;
-            break;
-        case GRAVITY_TARGET_SSIDS:
-            helpStr = (char*)SHORT_TARGET_SSIDS;
-            break;
-        case GRAVITY_PROBE:
-            helpStr = (char *)SHORT_PROBE;
-            break;
-        case GRAVITY_FUZZ:
-            helpStr = (char *)SHORT_FUZZ;
-            break;
-        case GRAVITY_SNIFF:
-            helpStr = (char *)SHORT_SNIFF;
-            break;
-        case GRAVITY_DEAUTH:
-            helpStr = (char *)SHORT_DEAUTH;
-            break;
-        case GRAVITY_MANA:
-            helpStr = (char *)SHORT_MANA;
-            break;
-        case GRAVITY_STALK:
-            helpStr = (char *)SHORT_STALK;
-            break;
-        case GRAVITY_AP_DOS:
-            helpStr = (char *)SHORT_AP_DOS;
-            break;
-        case GRAVITY_AP_CLONE:
-            helpStr = (char *)SHORT_AP_CLONE;
-            break;
-        case GRAVITY_SCAN:
-            helpStr = (char *)SHORT_SCAN;
-            break;
-        case GRAVITY_HOP:
-            helpStr = (char *)SHORT_HOP;
-            break;
-        case GRAVITY_SET:
-            helpStr = (char *)SHORT_SET;
-            break;
-        case GRAVITY_GET:
-            helpStr = (char *)SHORT_GET;
-            break;
-        case GRAVITY_VIEW:
-            helpStr = (char *)SHORT_VIEW;
-            break;
-        case GRAVITY_SELECT:
-            helpStr = (char *)SHORT_SELECT;
-            break;
-        case GRAVITY_SELECTED:
-            helpStr = (char *)SHORT_SELECTED;
-            break;
-        case GRAVITY_CLEAR:
-            helpStr = (char *)SHORT_CLEAR;
-            break;
-        case GRAVITY_HANDSHAKE:
-            helpStr = (char *)SHORT_HANDSHAKE;
-            break;
-        case GRAVITY_COMMANDS:
-            helpStr = (char *)SHORT_COMMANDS;
-            break;
-        case GRAVITY_INFO:
-            helpStr = (char *)SHORT_INFO;
-            break;
-        case GRAVITY_PURGE:
-            helpStr = (char *)SHORT_PURGE;
-            break;
-        default:
-            helpStr = "Send command to UART";
-            break;
-    }
-
-    uart_text_input_set_header_text(text_input, helpStr);
-    uart_text_input_set_result_callback(
-        text_input,
-        uart_terminal_scene_text_input_callback,
-        app,
-        app->text_input_store,
-        UART_TERMINAL_TEXT_INPUT_STORE_SIZE,
-        false);
-
-    view_dispatcher_switch_to_view(app->view_dispatcher, UART_TerminalAppViewTextInput);
-}
-
-bool uart_terminal_scene_text_input_on_event(void* context, SceneManagerEvent event) {
-    UART_TerminalApp* app = context;
-    bool consumed = false;
-
-    if(event.type == SceneManagerEventTypeCustom) {
-        if(event.event == UART_TerminalEventStartConsole) {
-            // Point to custom string to send
-            app->selected_tx_string = app->text_input_store;
-            scene_manager_next_scene(app->scene_manager, UART_TerminalAppViewConsoleOutput);
-            consumed = true;
-        }
-    }
-
-    return consumed;
-}
-
-void uart_terminal_scene_text_input_on_exit(void* context) {
-    UART_TerminalApp* app = context;
-
-    uart_text_input_reset(app->text_input);
-}

BIN
non_catalog_apps/esp32_gravity/uart_terminal.png


+ 0 - 113
non_catalog_apps/esp32_gravity/uart_terminal_app.c

@@ -1,113 +0,0 @@
-#include "uart_terminal_app_i.h"
-
-#include <furi.h>
-#include <furi_hal.h>
-#include <expansion/expansion.h>
-
-static bool uart_terminal_app_custom_event_callback(void* context, uint32_t event) {
-    furi_assert(context);
-    UART_TerminalApp* app = context;
-    return scene_manager_handle_custom_event(app->scene_manager, event);
-}
-
-static bool uart_terminal_app_back_event_callback(void* context) {
-    furi_assert(context);
-    UART_TerminalApp* app = context;
-    return scene_manager_handle_back_event(app->scene_manager);
-}
-
-static void uart_terminal_app_tick_event_callback(void* context) {
-    furi_assert(context);
-    UART_TerminalApp* app = context;
-    scene_manager_handle_tick_event(app->scene_manager);
-}
-
-UART_TerminalApp* uart_terminal_app_alloc() {
-    UART_TerminalApp* app = malloc(sizeof(UART_TerminalApp));
-
-    app->gui = furi_record_open(RECORD_GUI);
-
-    app->view_dispatcher = view_dispatcher_alloc();
-    app->scene_manager = scene_manager_alloc(&uart_terminal_scene_handlers, app);
-    view_dispatcher_enable_queue(app->view_dispatcher);
-    view_dispatcher_set_event_callback_context(app->view_dispatcher, app);
-
-    view_dispatcher_set_custom_event_callback(
-        app->view_dispatcher, uart_terminal_app_custom_event_callback);
-    view_dispatcher_set_navigation_event_callback(
-        app->view_dispatcher, uart_terminal_app_back_event_callback);
-    view_dispatcher_set_tick_event_callback(
-        app->view_dispatcher, uart_terminal_app_tick_event_callback, 100);
-
-    view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen);
-
-    app->var_item_list = variable_item_list_alloc();
-    view_dispatcher_add_view(
-        app->view_dispatcher,
-        UART_TerminalAppViewVarItemList,
-        variable_item_list_get_view(app->var_item_list));
-
-    for(int i = 0; i < NUM_MENU_ITEMS; ++i) {
-        app->selected_option_index[i] = 0;
-    }
-
-    app->text_box = text_box_alloc();
-    view_dispatcher_add_view(
-        app->view_dispatcher, UART_TerminalAppViewConsoleOutput, text_box_get_view(app->text_box));
-    app->text_box_store = furi_string_alloc();
-    furi_string_reserve(app->text_box_store, UART_TERMINAL_TEXT_BOX_STORE_SIZE);
-
-    app->text_input = uart_text_input_alloc();
-    view_dispatcher_add_view(
-        app->view_dispatcher,
-        UART_TerminalAppViewTextInput,
-        uart_text_input_get_view(app->text_input));
-
-    scene_manager_next_scene(app->scene_manager, UART_TerminalSceneStart);
-
-    return app;
-}
-
-void uart_terminal_app_free(UART_TerminalApp* app) {
-    furi_assert(app);
-
-    // Views
-    view_dispatcher_remove_view(app->view_dispatcher, UART_TerminalAppViewVarItemList);
-    view_dispatcher_remove_view(app->view_dispatcher, UART_TerminalAppViewConsoleOutput);
-    view_dispatcher_remove_view(app->view_dispatcher, UART_TerminalAppViewTextInput);
-    text_box_free(app->text_box);
-    furi_string_free(app->text_box_store);
-    uart_text_input_free(app->text_input);
-
-    // View dispatcher
-    view_dispatcher_free(app->view_dispatcher);
-    scene_manager_free(app->scene_manager);
-
-    uart_terminal_uart_free(app->uart);
-
-    // Close records
-    furi_record_close(RECORD_GUI);
-
-    free(app);
-}
-
-int32_t uart_terminal_app(void* p) {
-    UNUSED(p);
-    // Disable expansion protocol to avoid interference with UART Handle
-    Expansion* expansion = furi_record_open(RECORD_EXPANSION);
-    expansion_disable(expansion);
-
-    UART_TerminalApp* uart_terminal_app = uart_terminal_app_alloc();
-
-    uart_terminal_app->uart = uart_terminal_uart_init(uart_terminal_app);
-
-    view_dispatcher_run(uart_terminal_app->view_dispatcher);
-
-    uart_terminal_app_free(uart_terminal_app);
-
-    // Return previous state of expansion
-    expansion_enable(expansion);
-    furi_record_close(RECORD_EXPANSION);
-
-    return 0;
-}

+ 0 - 11
non_catalog_apps/esp32_gravity/uart_terminal_app.h

@@ -1,11 +0,0 @@
-#pragma once
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef struct UART_TerminalApp UART_TerminalApp;
-
-#ifdef __cplusplus
-}
-#endif

+ 0 - 57
non_catalog_apps/esp32_gravity/uart_terminal_app_i.h

@@ -1,57 +0,0 @@
-#pragma once
-
-#include "uart_terminal_app.h"
-#include "scenes/uart_terminal_scene.h"
-#include "uart_terminal_custom_event.h"
-#include "uart_terminal_uart.h"
-
-#include <gui/gui.h>
-#include <gui/view_dispatcher.h>
-#include <gui/scene_manager.h>
-#include <gui/modules/text_box.h>
-#include <gui/modules/variable_item_list.h>
-#include "uart_text_input.h"
-
-#define GRAVITY_VERSION "0.6.0"
-
-#define NUM_MENU_ITEMS (23)
-
-#define UART_TERMINAL_TEXT_BOX_STORE_SIZE (1024)
-#define UART_TERMINAL_TEXT_INPUT_STORE_SIZE (512)
-#define UART_CH (FuriHalSerialIdUsart)
-
-/* GRAVITY: Import GravityMode etc. */
-#include "esp_flip_struct.h"
-
-struct UART_TerminalApp {
-    Gui* gui;
-    ViewDispatcher* view_dispatcher;
-    SceneManager* scene_manager;
-
-    char text_input_store[UART_TERMINAL_TEXT_INPUT_STORE_SIZE + 1];
-    FuriString* text_box_store;
-    size_t text_box_store_strlen;
-    TextBox* text_box;
-    UART_TextInput* text_input;
-
-    VariableItemList* var_item_list;
-
-    UART_TerminalUart* uart;
-    int selected_menu_index;
-    int selected_option_index[NUM_MENU_ITEMS];
-    const char* selected_tx_string;
-    bool is_command;
-    bool is_custom_tx_string;
-    bool focus_console_start;
-    bool show_stopscan_tip;
-    int BAUDRATE;
-    int TERMINAL_MODE; //1=AT mode, 0=other mode
-
-    GravityCommand gravityCommand; /* Gravity command */
-};
-
-typedef enum {
-    UART_TerminalAppViewVarItemList,
-    UART_TerminalAppViewConsoleOutput,
-    UART_TerminalAppViewTextInput,
-} UART_TerminalAppView;

+ 0 - 7
non_catalog_apps/esp32_gravity/uart_terminal_custom_event.h

@@ -1,7 +0,0 @@
-#pragma once
-
-typedef enum {
-    UART_TerminalEventRefreshConsoleOutput = 0,
-    UART_TerminalEventStartConsole,
-    UART_TerminalEventStartKeyboard,
-} UART_TerminalCustomEvent;

+ 0 - 103
non_catalog_apps/esp32_gravity/uart_terminal_uart.c

@@ -1,103 +0,0 @@
-#include "uart_terminal_app_i.h"
-#include "uart_terminal_uart.h"
-
-//#define UART_CH (FuriHalUartIdUSART1)
-//#define BAUDRATE (115200)
-
-struct UART_TerminalUart {
-    UART_TerminalApp* app;
-    FuriThread* rx_thread;
-    FuriStreamBuffer* rx_stream;
-    uint8_t rx_buf[RX_BUF_SIZE + 1];
-    void (*handle_rx_data_cb)(uint8_t* buf, size_t len, void* context);
-    FuriHalSerialHandle* serial_handle;
-};
-
-typedef enum {
-    WorkerEvtStop = (1 << 0),
-    WorkerEvtRxDone = (1 << 1),
-} WorkerEvtFlags;
-
-void uart_terminal_uart_set_handle_rx_data_cb(
-    UART_TerminalUart* uart,
-    void (*handle_rx_data_cb)(uint8_t* buf, size_t len, void* context)) {
-    furi_assert(uart);
-    uart->handle_rx_data_cb = handle_rx_data_cb;
-}
-
-#define WORKER_ALL_RX_EVENTS (WorkerEvtStop | WorkerEvtRxDone)
-void uart_terminal_uart_on_irq_cb(
-    FuriHalSerialHandle* handle,
-    FuriHalSerialRxEvent event,
-    void* context) {
-    UART_TerminalUart* uart = (UART_TerminalUart*)context;
-
-    if(event == FuriHalSerialRxEventData) {
-        uint8_t data = furi_hal_serial_async_rx(handle);
-        furi_stream_buffer_send(uart->rx_stream, &data, 1, 0);
-        furi_thread_flags_set(furi_thread_get_id(uart->rx_thread), WorkerEvtRxDone);
-    }
-}
-
-static int32_t uart_worker(void* context) {
-    UART_TerminalUart* uart = (void*)context;
-
-    while(1) {
-        uint32_t events =
-            furi_thread_flags_wait(WORKER_ALL_RX_EVENTS, FuriFlagWaitAny, FuriWaitForever);
-        furi_check((events & FuriFlagError) == 0);
-        if(events & WorkerEvtStop) break;
-        if(events & WorkerEvtRxDone) {
-            size_t len = furi_stream_buffer_receive(uart->rx_stream, uart->rx_buf, RX_BUF_SIZE, 0);
-            if(len > 0) {
-                if(uart->handle_rx_data_cb) uart->handle_rx_data_cb(uart->rx_buf, len, uart->app);
-            }
-        }
-    }
-
-    furi_stream_buffer_free(uart->rx_stream);
-
-    return 0;
-}
-
-void uart_terminal_uart_tx(UART_TerminalUart* uart, uint8_t* data, size_t len) {
-    furi_hal_serial_tx(uart->serial_handle, data, len);
-}
-
-UART_TerminalUart* uart_terminal_uart_init(UART_TerminalApp* app) {
-    UART_TerminalUart* uart = malloc(sizeof(UART_TerminalUart));
-    uart->app = app;
-    // Init all rx stream and thread early to avoid crashes
-    uart->rx_stream = furi_stream_buffer_alloc(RX_BUF_SIZE, 1);
-    uart->rx_thread = furi_thread_alloc();
-    furi_thread_set_name(uart->rx_thread, "UART_TerminalUartRxThread");
-    furi_thread_set_stack_size(uart->rx_thread, 1024);
-    furi_thread_set_context(uart->rx_thread, uart);
-    furi_thread_set_callback(uart->rx_thread, uart_worker);
-
-    furi_thread_start(uart->rx_thread);
-
-    if(app->BAUDRATE == 0) {
-        app->BAUDRATE = 115200;
-    }
-    uart->serial_handle = furi_hal_serial_control_acquire(UART_CH);
-    furi_check(uart->serial_handle);
-    furi_hal_serial_init(uart->serial_handle, app->BAUDRATE);
-    furi_hal_serial_async_rx_start(uart->serial_handle, uart_terminal_uart_on_irq_cb, uart, false);
-
-    return uart;
-}
-
-void uart_terminal_uart_free(UART_TerminalUart* uart) {
-    furi_assert(uart);
-
-    furi_hal_serial_async_rx_stop(uart->serial_handle);
-    furi_hal_serial_deinit(uart->serial_handle);
-    furi_hal_serial_control_release(uart->serial_handle);
-
-    furi_thread_flags_set(furi_thread_get_id(uart->rx_thread), WorkerEvtStop);
-    furi_thread_join(uart->rx_thread);
-    furi_thread_free(uart->rx_thread);
-
-    free(uart);
-}

+ 0 - 14
non_catalog_apps/esp32_gravity/uart_terminal_uart.h

@@ -1,14 +0,0 @@
-#pragma once
-
-#include "furi_hal.h"
-
-#define RX_BUF_SIZE (320)
-
-typedef struct UART_TerminalUart UART_TerminalUart;
-
-void uart_terminal_uart_set_handle_rx_data_cb(
-    UART_TerminalUart* uart,
-    void (*handle_rx_data_cb)(uint8_t* buf, size_t len, void* context));
-void uart_terminal_uart_tx(UART_TerminalUart* uart, uint8_t* data, size_t len);
-UART_TerminalUart* uart_terminal_uart_init(UART_TerminalApp* app);
-void uart_terminal_uart_free(UART_TerminalUart* uart);

+ 0 - 683
non_catalog_apps/esp32_gravity/uart_text_input.c

@@ -1,683 +0,0 @@
-#include "uart_text_input.h"
-#include <gui/elements.h>
-#include "uart_terminal_icons.h"
-#include "uart_terminal_app_i.h"
-#include <furi.h>
-
-struct UART_TextInput {
-    View* view;
-    FuriTimer* timer;
-};
-
-typedef struct {
-    const char text;
-    const uint8_t x;
-    const uint8_t y;
-} UART_TextInputKey;
-
-typedef struct {
-    const char* header;
-    char* text_buffer;
-    size_t text_buffer_size;
-    bool clear_default_text;
-
-    UART_TextInputCallback callback;
-    void* callback_context;
-
-    uint8_t selected_row;
-    uint8_t selected_column;
-
-    UART_TextInputValidatorCallback validator_callback;
-    void* validator_callback_context;
-    FuriString* validator_text;
-    bool valadator_message_visible;
-} UART_TextInputModel;
-
-static const uint8_t keyboard_origin_x = 1;
-static const uint8_t keyboard_origin_y = 29;
-static const uint8_t keyboard_row_count = 4;
-
-#define mode_AT "Send AT command to UART"
-
-#define ENTER_KEY '\r'
-#define BACKSPACE_KEY '\b'
-
-static const UART_TextInputKey keyboard_keys_row_1[] = {
-    {'{', 1, 0},
-    {'(', 9, 0},
-    {'[', 17, 0},
-    {'|', 25, 0},
-    {'@', 33, 0},
-    {'&', 41, 0},
-    {'#', 49, 0},
-    {';', 57, 0},
-    {'^', 65, 0},
-    {'*', 73, 0},
-    {'`', 81, 0},
-    {'"', 89, 0},
-    {'~', 97, 0},
-    {'\'', 105, 0},
-    {'.', 113, 0},
-    {'/', 120, 0},
-};
-
-static const UART_TextInputKey keyboard_keys_row_2[] = {
-    {'q', 1, 10},
-    {'w', 9, 10},
-    {'e', 17, 10},
-    {'r', 25, 10},
-    {'t', 33, 10},
-    {'y', 41, 10},
-    {'u', 49, 10},
-    {'i', 57, 10},
-    {'o', 65, 10},
-    {'p', 73, 10},
-    {'0', 81, 10},
-    {'1', 89, 10},
-    {'2', 97, 10},
-    {'3', 105, 10},
-    {'=', 113, 10},
-    {'-', 120, 10},
-};
-
-static const UART_TextInputKey keyboard_keys_row_3[] = {
-    {'a', 1, 21},
-    {'s', 9, 21},
-    {'d', 18, 21},
-    {'f', 25, 21},
-    {'g', 33, 21},
-    {'h', 41, 21},
-    {'j', 49, 21},
-    {'k', 57, 21},
-    {'l', 65, 21},
-    {BACKSPACE_KEY, 72, 13},
-    {'4', 89, 21},
-    {'5', 97, 21},
-    {'6', 105, 21},
-    {'$', 113, 21},
-    {'%', 120, 21},
-
-};
-
-static const UART_TextInputKey keyboard_keys_row_4[] = {
-    {'z', 1, 33},
-    {'x', 9, 33},
-    {'c', 18, 33},
-    {'v', 25, 33},
-    {'b', 33, 33},
-    {'n', 41, 33},
-    {'m', 49, 33},
-    {'_', 57, 33},
-    {ENTER_KEY, 64, 24},
-    {'7', 89, 33},
-    {'8', 97, 33},
-    {'9', 105, 33},
-    {'!', 113, 33},
-    {'+', 120, 33},
-};
-
-static uint8_t get_row_size(uint8_t row_index) {
-    uint8_t row_size = 0;
-
-    switch(row_index + 1) {
-    case 1:
-        row_size = sizeof(keyboard_keys_row_1) / sizeof(UART_TextInputKey);
-        break;
-    case 2:
-        row_size = sizeof(keyboard_keys_row_2) / sizeof(UART_TextInputKey);
-        break;
-    case 3:
-        row_size = sizeof(keyboard_keys_row_3) / sizeof(UART_TextInputKey);
-        break;
-    case 4:
-        row_size = sizeof(keyboard_keys_row_4) / sizeof(UART_TextInputKey);
-        break;
-    }
-
-    return row_size;
-}
-
-static const UART_TextInputKey* get_row(uint8_t row_index) {
-    const UART_TextInputKey* row = NULL;
-
-    switch(row_index + 1) {
-    case 1:
-        row = keyboard_keys_row_1;
-        break;
-    case 2:
-        row = keyboard_keys_row_2;
-        break;
-    case 3:
-        row = keyboard_keys_row_3;
-        break;
-    case 4:
-        row = keyboard_keys_row_4;
-        break;
-    }
-
-    return row;
-}
-
-static char get_selected_char(UART_TextInputModel* model) {
-    return get_row(model->selected_row)[model->selected_column].text;
-}
-
-static bool char_is_lowercase(char letter) {
-    return (letter >= 0x61 && letter <= 0x7A);
-}
-
-static bool char_is_uppercase(char letter) {
-    return (letter >= 0x41 && letter <= 0x5A);
-}
-
-static char char_to_lowercase(const char letter) {
-    switch(letter) {
-    case ' ':
-        return 0x5f;
-        break;
-    case ')':
-        return 0x28;
-        break;
-    case '}':
-        return 0x7b;
-        break;
-    case ']':
-        return 0x5b;
-        break;
-    case '\\':
-        return 0x2f;
-        break;
-    case ':':
-        return 0x3b;
-        break;
-    case ',':
-        return 0x2e;
-        break;
-    case '?':
-        return 0x21;
-        break;
-    case '>':
-        return 0x3c;
-        break;
-    }
-    if(char_is_uppercase(letter)) {
-        return (letter + 0x20);
-    } else {
-        return letter;
-    }
-}
-
-static char char_to_uppercase(const char letter) {
-    switch(letter) {
-    case '_':
-        return 0x20;
-        break;
-    case '(':
-        return 0x29;
-        break;
-    case '{':
-        return 0x7d;
-        break;
-    case '[':
-        return 0x5d;
-        break;
-    case '/':
-        return 0x5c;
-        break;
-    case ';':
-        return 0x3a;
-        break;
-    case '.':
-        return 0x2c;
-        break;
-    case '!':
-        return 0x3f;
-        break;
-    case '<':
-        return 0x3e;
-        break;
-    }
-    if(char_is_lowercase(letter)) {
-        return (letter - 0x20);
-    } else {
-        return letter;
-    }
-}
-
-static void uart_text_input_backspace_cb(UART_TextInputModel* 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;
-    }
-}
-
-static void uart_text_input_view_draw_callback(Canvas* canvas, void* _model) {
-    UART_TextInputModel* model = _model;
-    //uint8_t text_length = model->text_buffer ? strlen(model->text_buffer) : 0;
-    uint8_t needed_string_width = canvas_width(canvas) - 8;
-    uint8_t start_pos = 4;
-
-    const char* text = model->text_buffer;
-
-    canvas_clear(canvas);
-    canvas_set_color(canvas, ColorBlack);
-
-    canvas_draw_str(canvas, 2, 7, model->header);
-    elements_slightly_rounded_frame(canvas, 1, 8, 126, 12);
-
-    if(canvas_string_width(canvas, text) > needed_string_width) {
-        canvas_draw_str(canvas, start_pos, 17, "...");
-        start_pos += 6;
-        needed_string_width -= 8;
-    }
-
-    while(text != 0 && canvas_string_width(canvas, text) > needed_string_width) {
-        text++;
-    }
-
-    if(model->clear_default_text) {
-        elements_slightly_rounded_box(
-            canvas, start_pos - 1, 14, canvas_string_width(canvas, text) + 2, 10);
-        canvas_set_color(canvas, ColorWhite);
-    } else {
-        canvas_draw_str(canvas, start_pos + canvas_string_width(canvas, text) + 1, 18, "|");
-        canvas_draw_str(canvas, start_pos + canvas_string_width(canvas, text) + 2, 18, "|");
-    }
-    canvas_draw_str(canvas, start_pos, 17, text);
-
-    canvas_set_font(canvas, FontKeyboard);
-
-    for(uint8_t row = 0; row <= keyboard_row_count; row++) {
-        const uint8_t column_count = get_row_size(row);
-        const UART_TextInputKey* keys = get_row(row);
-
-        for(size_t column = 0; column < column_count; column++) {
-            if(keys[column].text == ENTER_KEY) {
-                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_KEY) {
-                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 - 1,
-                        keyboard_origin_y + keys[column].y - 8,
-                        7,
-                        10);
-                    canvas_set_color(canvas, ColorWhite);
-                } else {
-                    canvas_set_color(canvas, ColorBlack);
-                }
-                if(0 == strcmp(model->header, mode_AT)) {
-                    canvas_draw_glyph(
-                        canvas,
-                        keyboard_origin_x + keys[column].x,
-                        keyboard_origin_y + keys[column].y,
-                        char_to_uppercase(keys[column].text));
-                } else {
-                    canvas_draw_glyph(
-                        canvas,
-                        keyboard_origin_x + keys[column].x,
-                        keyboard_origin_y + keys[column].y,
-                        keys[column].text);
-                }
-            }
-        }
-    }
-    if(model->valadator_message_visible) {
-        canvas_set_font(canvas, FontSecondary);
-        canvas_set_color(canvas, ColorWhite);
-        canvas_draw_box(canvas, 8, 10, 110, 48);
-        canvas_set_color(canvas, ColorBlack);
-        canvas_draw_icon(canvas, 10, 14, &I_WarningDolphin_45x42);
-        canvas_draw_rframe(canvas, 8, 8, 112, 50, 3);
-        canvas_draw_rframe(canvas, 9, 9, 110, 48, 2);
-        elements_multiline_text(canvas, 62, 20, furi_string_get_cstr(model->validator_text));
-        canvas_set_font(canvas, FontKeyboard);
-    }
-}
-
-static void
-    uart_text_input_handle_up(UART_TextInput* uart_text_input, UART_TextInputModel* model) {
-    UNUSED(uart_text_input);
-    if(model->selected_row > 0) {
-        model->selected_row--;
-        if(model->selected_column > get_row_size(model->selected_row) - 6) {
-            model->selected_column = model->selected_column + 1;
-        }
-    }
-}
-
-static void
-    uart_text_input_handle_down(UART_TextInput* uart_text_input, UART_TextInputModel* model) {
-    UNUSED(uart_text_input);
-    if(model->selected_row < keyboard_row_count - 1) {
-        model->selected_row++;
-        if(model->selected_column > get_row_size(model->selected_row) - 4) {
-            model->selected_column = model->selected_column - 1;
-        }
-    }
-}
-
-static void
-    uart_text_input_handle_left(UART_TextInput* uart_text_input, UART_TextInputModel* model) {
-    UNUSED(uart_text_input);
-    if(model->selected_column > 0) {
-        model->selected_column--;
-    } else {
-        model->selected_column = get_row_size(model->selected_row) - 1;
-    }
-}
-
-static void
-    uart_text_input_handle_right(UART_TextInput* uart_text_input, UART_TextInputModel* model) {
-    UNUSED(uart_text_input);
-    if(model->selected_column < get_row_size(model->selected_row) - 1) {
-        model->selected_column++;
-    } else {
-        model->selected_column = 0;
-    }
-}
-
-static void uart_text_input_handle_ok(
-    UART_TextInput* uart_text_input,
-    UART_TextInputModel* model,
-    bool shift) {
-    char selected = get_selected_char(model);
-    uint8_t text_length = strlen(model->text_buffer);
-
-    if(0 == strcmp(model->header, mode_AT)) {
-        selected = char_to_uppercase(selected);
-    }
-
-    if(shift) {
-        if(0 == strcmp(model->header, mode_AT)) {
-            selected = char_to_lowercase(selected);
-        } else {
-            selected = char_to_uppercase(selected);
-        }
-    }
-
-    if(selected == ENTER_KEY) {
-        if(model->validator_callback &&
-           (!model->validator_callback(
-               model->text_buffer, model->validator_text, model->validator_callback_context))) {
-            model->valadator_message_visible = true;
-            furi_timer_start(uart_text_input->timer, furi_kernel_get_tick_frequency() * 4);
-        } else if(model->callback != 0 && text_length > 0) {
-            model->callback(model->callback_context);
-        }
-    } else if(selected == BACKSPACE_KEY) {
-        uart_text_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;
-}
-
-static bool uart_text_input_view_input_callback(InputEvent* event, void* context) {
-    UART_TextInput* uart_text_input = context;
-    furi_assert(uart_text_input);
-
-    bool consumed = false;
-
-    // Acquire model
-    UART_TextInputModel* model = view_get_model(uart_text_input->view);
-
-    if((!(event->type == InputTypePress) && !(event->type == InputTypeRelease)) &&
-       model->valadator_message_visible) {
-        model->valadator_message_visible = false;
-        consumed = true;
-    } else if(event->type == InputTypeShort) {
-        consumed = true;
-        switch(event->key) {
-        case InputKeyUp:
-            uart_text_input_handle_up(uart_text_input, model);
-            break;
-        case InputKeyDown:
-            uart_text_input_handle_down(uart_text_input, model);
-            break;
-        case InputKeyLeft:
-            uart_text_input_handle_left(uart_text_input, model);
-            break;
-        case InputKeyRight:
-            uart_text_input_handle_right(uart_text_input, model);
-            break;
-        case InputKeyOk:
-            uart_text_input_handle_ok(uart_text_input, model, false);
-            break;
-        default:
-            consumed = false;
-            break;
-        }
-    } else if(event->type == InputTypeLong) {
-        consumed = true;
-        switch(event->key) {
-        case InputKeyUp:
-            uart_text_input_handle_up(uart_text_input, model);
-            break;
-        case InputKeyDown:
-            uart_text_input_handle_down(uart_text_input, model);
-            break;
-        case InputKeyLeft:
-            uart_text_input_handle_left(uart_text_input, model);
-            break;
-        case InputKeyRight:
-            uart_text_input_handle_right(uart_text_input, model);
-            break;
-        case InputKeyOk:
-            uart_text_input_handle_ok(uart_text_input, model, true);
-            break;
-        case InputKeyBack:
-            uart_text_input_backspace_cb(model);
-            break;
-        default:
-            consumed = false;
-            break;
-        }
-    } else if(event->type == InputTypeRepeat) {
-        consumed = true;
-        switch(event->key) {
-        case InputKeyUp:
-            uart_text_input_handle_up(uart_text_input, model);
-            break;
-        case InputKeyDown:
-            uart_text_input_handle_down(uart_text_input, model);
-            break;
-        case InputKeyLeft:
-            uart_text_input_handle_left(uart_text_input, model);
-            break;
-        case InputKeyRight:
-            uart_text_input_handle_right(uart_text_input, model);
-            break;
-        case InputKeyBack:
-            uart_text_input_backspace_cb(model);
-            break;
-        default:
-            consumed = false;
-            break;
-        }
-    }
-
-    // Commit model
-    view_commit_model(uart_text_input->view, consumed);
-
-    return consumed;
-}
-
-void uart_text_input_timer_callback(void* context) {
-    furi_assert(context);
-    UART_TextInput* uart_text_input = context;
-
-    with_view_model(
-        uart_text_input->view,
-        UART_TextInputModel * model,
-        { model->valadator_message_visible = false; },
-        true);
-}
-
-UART_TextInput* uart_text_input_alloc() {
-    UART_TextInput* uart_text_input = malloc(sizeof(UART_TextInput));
-    uart_text_input->view = view_alloc();
-    view_set_context(uart_text_input->view, uart_text_input);
-    view_allocate_model(uart_text_input->view, ViewModelTypeLocking, sizeof(UART_TextInputModel));
-    view_set_draw_callback(uart_text_input->view, uart_text_input_view_draw_callback);
-    view_set_input_callback(uart_text_input->view, uart_text_input_view_input_callback);
-
-    uart_text_input->timer =
-        furi_timer_alloc(uart_text_input_timer_callback, FuriTimerTypeOnce, uart_text_input);
-
-    with_view_model(
-        uart_text_input->view,
-        UART_TextInputModel * model,
-        { model->validator_text = furi_string_alloc(); },
-        false);
-
-    uart_text_input_reset(uart_text_input);
-
-    return uart_text_input;
-}
-
-void uart_text_input_free(UART_TextInput* uart_text_input) {
-    furi_assert(uart_text_input);
-    with_view_model(
-        uart_text_input->view,
-        UART_TextInputModel * model,
-        { furi_string_free(model->validator_text); },
-        false);
-
-    // Send stop command
-    furi_timer_stop(uart_text_input->timer);
-    // Release allocated memory
-    furi_timer_free(uart_text_input->timer);
-
-    view_free(uart_text_input->view);
-
-    free(uart_text_input);
-}
-
-void uart_text_input_reset(UART_TextInput* uart_text_input) {
-    furi_assert(uart_text_input);
-    with_view_model(
-        uart_text_input->view,
-        UART_TextInputModel * model,
-        {
-            model->text_buffer_size = 0;
-            model->header = "";
-            model->selected_row = 0;
-            model->selected_column = 0;
-            model->clear_default_text = false;
-            model->text_buffer = NULL;
-            model->text_buffer_size = 0;
-            model->callback = NULL;
-            model->callback_context = NULL;
-            model->validator_callback = NULL;
-            model->validator_callback_context = NULL;
-            furi_string_reset(model->validator_text);
-            model->valadator_message_visible = false;
-        },
-        true);
-}
-
-View* uart_text_input_get_view(UART_TextInput* uart_text_input) {
-    furi_assert(uart_text_input);
-    return uart_text_input->view;
-}
-
-void uart_text_input_set_result_callback(
-    UART_TextInput* uart_text_input,
-    UART_TextInputCallback callback,
-    void* callback_context,
-    char* text_buffer,
-    size_t text_buffer_size,
-    bool clear_default_text) {
-    with_view_model(
-        uart_text_input->view,
-        UART_TextInputModel * 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;
-            if(text_buffer && text_buffer[0] != '\0') {
-                // Set focus on Save
-                model->selected_row = 2;
-                model->selected_column = 8;
-            }
-        },
-        true);
-}
-
-void uart_text_input_set_validator(
-    UART_TextInput* uart_text_input,
-    UART_TextInputValidatorCallback callback,
-    void* callback_context) {
-    with_view_model(
-        uart_text_input->view,
-        UART_TextInputModel * model,
-        {
-            model->validator_callback = callback;
-            model->validator_callback_context = callback_context;
-        },
-        true);
-}
-
-UART_TextInputValidatorCallback
-    uart_text_input_get_validator_callback(UART_TextInput* uart_text_input) {
-    UART_TextInputValidatorCallback validator_callback = NULL;
-    with_view_model(
-        uart_text_input->view,
-        UART_TextInputModel * model,
-        { validator_callback = model->validator_callback; },
-        false);
-    return validator_callback;
-}
-
-void* uart_text_input_get_validator_callback_context(UART_TextInput* uart_text_input) {
-    void* validator_callback_context = NULL;
-    with_view_model(
-        uart_text_input->view,
-        UART_TextInputModel * model,
-        { validator_callback_context = model->validator_callback_context; },
-        false);
-    return validator_callback_context;
-}
-
-void uart_text_input_set_header_text(UART_TextInput* uart_text_input, const char* text) {
-    with_view_model(
-        uart_text_input->view, UART_TextInputModel * model, { model->header = text; }, true);
-}

+ 0 - 82
non_catalog_apps/esp32_gravity/uart_text_input.h

@@ -1,82 +0,0 @@
-#pragma once
-
-#include <gui/view.h>
-#include "uart_validators.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/** Text input anonymous structure */
-typedef struct UART_TextInput UART_TextInput;
-typedef void (*UART_TextInputCallback)(void* context);
-typedef bool (*UART_TextInputValidatorCallback)(const char* text, FuriString* error, void* context);
-
-/** Allocate and initialize text input 
- * 
- * This text input is used to enter string
- *
- * @return     UART_TextInput instance
- */
-UART_TextInput* uart_text_input_alloc();
-
-/** Deinitialize and free text input
- *
- * @param      uart_text_input  UART_TextInput instance
- */
-void uart_text_input_free(UART_TextInput* uart_text_input);
-
-/** Clean text input view Note: this function does not free memory
- *
- * @param      uart_text_input  Text input instance
- */
-void uart_text_input_reset(UART_TextInput* uart_text_input);
-
-/** Get text input view
- *
- * @param      uart_text_input  UART_TextInput instance
- *
- * @return     View instance that can be used for embedding
- */
-View* uart_text_input_get_view(UART_TextInput* uart_text_input);
-
-/** Set text input result callback
- *
- * @param      uart_text_input          UART_TextInput instance
- * @param      callback            callback fn
- * @param      callback_context    callback context
- * @param      text_buffer         pointer to YOUR text buffer, that we going
- *                                 to modify
- * @param      text_buffer_size    YOUR text buffer size in bytes. Max string
- *                                 length will be text_buffer_size-1.
- * @param      clear_default_text  clear text from text_buffer on first OK
- *                                 event
- */
-void uart_text_input_set_result_callback(
-    UART_TextInput* uart_text_input,
-    UART_TextInputCallback callback,
-    void* callback_context,
-    char* text_buffer,
-    size_t text_buffer_size,
-    bool clear_default_text);
-
-void uart_text_input_set_validator(
-    UART_TextInput* uart_text_input,
-    UART_TextInputValidatorCallback callback,
-    void* callback_context);
-
-UART_TextInputValidatorCallback
-    uart_text_input_get_validator_callback(UART_TextInput* uart_text_input);
-
-void* uart_text_input_get_validator_callback_context(UART_TextInput* uart_text_input);
-
-/** Set text input header text
- *
- * @param      uart_text_input  UART_TextInput instance
- * @param      text        text to be shown
- */
-void uart_text_input_set_header_text(UART_TextInput* uart_text_input, const char* text);
-
-#ifdef __cplusplus
-}
-#endif

+ 0 - 57
non_catalog_apps/esp32_gravity/uart_validators.c

@@ -1,57 +0,0 @@
-#include <furi.h>
-#include "uart_validators.h"
-#include <storage/storage.h>
-
-struct ValidatorIsFile {
-    char* app_path_folder;
-    const char* app_extension;
-    char* current_name;
-};
-
-bool validator_is_file_callback(const char* text, FuriString* error, void* context) {
-    furi_assert(context);
-    ValidatorIsFile* instance = context;
-
-    if(instance->current_name != NULL) {
-        if(strcmp(instance->current_name, text) == 0) {
-            return true;
-        }
-    }
-
-    bool ret = true;
-    FuriString* path = furi_string_alloc_printf(
-        "%s/%s%s", instance->app_path_folder, text, instance->app_extension);
-    Storage* storage = furi_record_open(RECORD_STORAGE);
-    if(storage_common_stat(storage, furi_string_get_cstr(path), NULL) == FSE_OK) {
-        ret = false;
-        furi_string_printf(error, "This name\nexists!\nChoose\nanother one.");
-    } else {
-        ret = true;
-    }
-    furi_string_free(path);
-    furi_record_close(RECORD_STORAGE);
-
-    return ret;
-}
-
-ValidatorIsFile* validator_is_file_alloc_init(
-    const char* app_path_folder,
-    const char* app_extension,
-    const char* current_name) {
-    ValidatorIsFile* instance = malloc(sizeof(ValidatorIsFile));
-
-    instance->app_path_folder = strdup(app_path_folder);
-    instance->app_extension = app_extension;
-    if(current_name != NULL) {
-        instance->current_name = strdup(current_name);
-    }
-
-    return instance;
-}
-
-void validator_is_file_free(ValidatorIsFile* instance) {
-    furi_assert(instance);
-    free(instance->app_path_folder);
-    free(instance->current_name);
-    free(instance);
-}

+ 0 - 21
non_catalog_apps/esp32_gravity/uart_validators.h

@@ -1,21 +0,0 @@
-#pragma once
-
-#include <core/common_defines.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-typedef struct ValidatorIsFile ValidatorIsFile;
-
-ValidatorIsFile* validator_is_file_alloc_init(
-    const char* app_path_folder,
-    const char* app_extension,
-    const char* current_name);
-
-void validator_is_file_free(ValidatorIsFile* instance);
-
-bool validator_is_file_callback(const char* text, FuriString* error, void* context);
-
-#ifdef __cplusplus
-}
-#endif

+ 0 - 57
non_catalog_apps/esp32_gravity/usage_const.h

@@ -1,57 +0,0 @@
-#ifndef ESP_FLIP_CONST_H
-#define ESP_FLIP_CONST_H
-
-/* Command usage string - SHORT_* is compressed help text for Flipper */
-const char USAGE_BT[] = "Bluetooth Test Module. bluetooth";
-const char USAGE_BEACON[] = "Beacon spam attack. Usage: beacon [ RICKROLL | RANDOM [ COUNT ] |\n\t\tINFINITE | TARGET-SSIDs | APs | OFF ] [ AUTH ( OPEN | WPA )+ ]";
-const char USAGE_TARGET_SSIDS[] = "Manage SSID targets. Usage: target-ssids [ ( ADD | REMOVE ) <ssid_name> ]";
-const char USAGE_PROBE[] = "Probe flood attack. Usage: probe [ ANY | TARGET-SSIDs | APs | OFF ]";
-const char USAGE_FUZZ[] = "Various invalid packets. Usage: fuzz OFF | ( ( BEACON | REQ | RESP )+\n\t\t( OVERFLOW | MALFORMED ) [ BROADCAST | TARGET-SSIDs | selectedSTA | selectedAP | RANDOM ] )";
-const char USAGE_SNIFF[] = "Display interesting packets. Usage: sniff [ ON | OFF ]";
-const char USAGE_DEAUTH[] = "Deauth attack. Usage: deauth [ <millis> ] [ FRAME | DEVICE | SPOOF ]\n\t\t[ STA | AP | BROADCAST | OFF ]";
-const char USAGE_MANA[] = "Mana attack. Usage: mana ( CLEAR | ( [ VERBOSE ] [ ON | OFF ] ) |\n\t\t( AUTH [ NONE | WEP | WPA ] ) | ( LOUD [ ON | OFF ] ) )";
-const char USAGE_STALK[] = "Toggle target tracking/homing. Usage: stalk [ ON | OFF ]";
-const char USAGE_AP_DOS[] = "Denial-of-service attack on selectedAPs. Usage: ap-dos [ ON | OFF ]";
-const char USAGE_AP_CLONE[] = "Clone and attempt takeover of the specified AP.\n\tUsage: ap-clone [ ( ON | OFF ) ( OPEN | WEP | WPA )+ ]";
-const char USAGE_SCAN[] = "scan [ ( [ <ssid> ] WIFI ) | BT [ SERVICES ] |\n\t\tBLE [ PURGE ( RSSI [ <maxRSSI> ] | AGE [ <minAge> ] |\n\t\tUNNAMED | UNSELECTED | NONE )+ ] | OFF ]";
-const char USAGE_HOP[] = "Configure channel hopping. Usage: hop [ <millis> ] [ ON | OFF | DEFAULT | KILL ]\n\t\t[ SEQUENTIAL | RANDOM ]";
-const char USAGE_SET[] = "Set a variable. Usage: set <variable> <value>";
-const char USAGE_GET[] = "Get a variable. Usage: get <variable>";
-const char USAGE_VIEW[] = "List available targets. Usage: view ( ( AP [ selectedSTA ] ) |\n\t\t( STA [ selectedAP ] ) | BT [ SERVICES [ SELECTED | KNOWN | UNKNOWN ] ] |\n\t\tSORT ( AGE | RSSI | SSID ) )+";
-const char USAGE_SELECT[] = "Select an element. Usage: select ( AP | STA | BT ) <elementId>+";
-const char USAGE_SELECTED[] = "Display selected elements. Usage: selected ( AP | STA | BT )";
-const char USAGE_CLEAR[] = "Clear stored APs, STAs or HCIs. Usage: clear ( AP [ SELECTED ] | STA [ SELECTED ] | BT [ SERVICES | SELECTED ] | ALL )";
-const char USAGE_HANDSHAKE[] = "Toggle monitoring for encryption material. Usage handshake [ ON | OFF ]";
-const char USAGE_COMMANDS[] = "Display a *brief* summary of Gravity commands";
-const char USAGE_INFO[] = "Provide help information for the specified command. Usage: info <cmd>";
-const char USAGE_VERSION[] = "Display esp32-Gravity version information. Usage: gravity-version";
-const char USAGE_BT_STRAT[] = "BLE Purge Strategy. Permitted values: RSSI AGE UNNAMED UNSELECTED NONE.\n\t\tAlternatively can be specified by providing a total value where\n\t\tRSSI is 1, AGE 2, UNNAMED 4, UNSELECTED 8, and NONE 16.";
-const char USAGE_PURGE[] = "Purge cached devices based on criteria. Usage: purge [ AP | STA | BT | BLE ]+\n\t\t[ RSSI [ <maxRSSI> ] | AGE [ <minAge> ] | UNNAMED | UNSELECTED | NONE ]+";
-
-const char SHORT_PURGE[] = "purge [ AP | STA | BT | BLE ]+ [ RSSI [ <maxRSSI> ] | AGE [ <minAge> ] | UNNAMED | UNSELECTED | NONE ]+";
-const char SHORT_BT_STRAT[] = "set BLE_PURGE_STRAT ( RSSI | AGE | UNNAMED | UNSELECTED | NONE )+";
-const char SHORT_BT[] = "bluetooth [ ON | OFF ]";
-const char SHORT_BEACON[] = "beacon [ RICKROLL | RANDOM [ COUNT ] | INFINITE | TARGET-SSIDs | APs | OFF] [ AUTH ( OPEN | WPA )+ ]";
-const char SHORT_TARGET_SSIDS[] = "(ADD | REMOVE) <apName>";
-const char SHORT_PROBE[] = "probe ANY | TARGET-SSIDs | APs | OFF";
-const char SHORT_FUZZ[] = "fuzz OFF | ( ( BEACON | REQ | RESP )+ ( OVERFLOW | MALFORMED ) [ BROADCAST | TARGET-SSIDs | selectedSTA | selectedAP | RANDOM ] )";
-const char SHORT_SNIFF[] = "sniff [ ON | OFF ]";
-const char SHORT_DEAUTH[] = "deauth <millis>";
-const char SHORT_MANA[] = "Mana attack";
-const char SHORT_STALK[] = "Track RSSI. stalk [ ON | OFF ]";
-const char SHORT_AP_DOS[] = "ap-dos [ ON | OFF ]";
-const char SHORT_AP_CLONE[] = "ap-clone [ ( ON | OFF ) ( OPEN | WEP | WPA )+ ]";
-const char SHORT_SCAN[] = "scan [ ( [ <ssid> ] WIFI ) | BT [ SERVICES ] | BLE [ PURGE ( RSSI [ <maxRSSI> ] | AGE [ <minAge> ] | UNNAMED | UNSELECTED | NONE )+ ] | OFF ]";
-const char SHORT_HOP[] = "hop [ <millis> ] [ ON | OFF | DEFAULT | KILL ] [ SEQUENTIAL | RANDOM ]";
-const char SHORT_SET[] = "set <variable> <value>";
-const char SHORT_GET[] = "get <variable>";
-const char SHORT_VIEW[] = "VIEW ( ( AP [ selectedSTA ] ) | ( STA [ selectedAP ] ) | BT [ SERVICES [ SELECTED | KNOWN | UNKNOWN ] ] | SORT ( AGE | RSSI | SSID ) )+";
-char SHORT_SELECT[] = "select ( AP | STA | BT ) <id>+ sep. ~";
-const char SHORT_SELECTED[] = "selected ( AP | STA | BT )";
-const char SHORT_CLEAR[] = "clear ( AP [ SELECTED ] | STA [ SELECTED ] | BT [ SERVICES | SELECTED ] | ALL )";
-const char SHORT_HANDSHAKE[] = "handshake [ ON | OFF ]";
-const char SHORT_COMMANDS[] = "Brief command summary";
-const char SHORT_INFO[] = "Command help. info <cmd>";
-const char SHORT_VERSION[] = "esp32-Gravity Version. gravity-version";
-
-#endif