diff options
author | あく <alleteam@gmail.com> | 2021-07-18 21:09:00 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-18 21:09:00 +0300 |
commit | 421a0f6b97dcfcfb1e5b990b3b9b1a453b13aaa3 (patch) | |
tree | ea12ff0aaa259b9a30cf03c1fde8fcc5f0e9f667 /applications/cli | |
parent | fbb81483aecbec294f2d6c13316742e6ba5769d3 (diff) |
[FL-1546, FL-1534, FL-1550] Drop F5, Certification preparation, Global application start lock (#585)
* Firmware: drop F5 target
* Rename app-loader to loader
* Update code owners file
* Loader: global application start lock API, minor refactoring
* Archive: update loader usage
* Cli: Command flags, global application start lock
* Apps: update cli API usage
* Bootloader: minor refactoring
* Firmware: minor build refactoring
* SubGhz: GUI packet test
* SubGhz: drop packet transmission and unused presets
* Github: drop F5 from build
* Archive: favorites
* Archive: a little bit more of Favorites
Diffstat (limited to 'applications/cli')
-rw-r--r-- | applications/cli/cli.c | 34 | ||||
-rw-r--r-- | applications/cli/cli.h | 13 | ||||
-rw-r--r-- | applications/cli/cli_commands.c | 23 | ||||
-rwxr-xr-x | applications/cli/cli_i.h | 1 |
4 files changed, 54 insertions, 17 deletions
diff --git a/applications/cli/cli.c b/applications/cli/cli.c index cf61cff0..4929b528 100644 --- a/applications/cli/cli.c +++ b/applications/cli/cli.c @@ -1,7 +1,9 @@ #include "cli_i.h" #include "cli_commands.h" + #include <version.h> #include <api-hal-version.h> +#include <loader/loader.h> Cli* cli_alloc() { Cli* cli = furi_alloc(sizeof(Cli)); @@ -166,10 +168,26 @@ static void cli_handle_enter(Cli* cli) { CliCommand* cli_command = CliCommandTree_get(cli->commands, command); if(cli_command) { cli_nl(cli); - // Execute command - cli_command->callback(cli, args, cli_command->context); - // Clear line - cli_reset(cli); + // Ensure that we running alone + if(!(cli_command->flags & CliCommandFlagParallelSafe)) { + Loader* loader = furi_record_open("loader"); + bool safety_lock = loader_lock(loader); + if(safety_lock) { + // Execute command + cli_command->callback(cli, args, cli_command->context); + loader_unlock(loader); + // Clear line + cli_reset(cli); + } else { + printf("Other application is running, close it first"); + } + furi_record_close("loader"); + } else { + // Execute command + cli_command->callback(cli, args, cli_command->context); + // Clear line + cli_reset(cli); + } } else { cli_nl(cli); printf( @@ -310,7 +328,12 @@ void cli_process_input(Cli* cli) { } } -void cli_add_command(Cli* cli, const char* name, CliCallback callback, void* context) { +void cli_add_command( + Cli* cli, + const char* name, + CliCommandFlag flags, + CliCallback callback, + void* context) { string_t name_str; string_init_set_str(name_str, name); string_strim(name_str); @@ -323,6 +346,7 @@ void cli_add_command(Cli* cli, const char* name, CliCallback callback, void* con CliCommand c; c.callback = callback; c.context = context; + c.flags = flags; furi_check(osMutexAcquire(cli->mutex, osWaitForever) == osOK); CliCommandTree_set_at(cli->commands, name_str, c); diff --git a/applications/cli/cli.h b/applications/cli/cli.h index 4d393620..5957cc37 100644 --- a/applications/cli/cli.h +++ b/applications/cli/cli.h @@ -20,6 +20,12 @@ typedef enum { CliSymbolAsciiDel = 0x7F, } CliSymbols; +typedef enum { + CliCommandFlagDefault = 0, /** Default, loader lock is used */ + CliCommandFlagParallelSafe = + (1 << 0), /** Safe to run in parallel with other apps, loader lock is not used */ +} CliCommandFlag; + /* Cli type * Anonymous structure. Use cli_i.h if you need to go deeper. */ @@ -39,7 +45,12 @@ typedef void (*CliCallback)(Cli* cli, string_t args, void* context); * @param callback - callback function * @param context - pointer to whatever we need to pass to callback */ -void cli_add_command(Cli* cli, const char* name, CliCallback callback, void* context); +void cli_add_command( + Cli* cli, + const char* name, + CliCommandFlag flags, + CliCallback callback, + void* context); /* Print unified cmd usage tip * @param cmd - cmd name diff --git a/applications/cli/cli_commands.c b/applications/cli/cli_commands.c index 90d5995d..89981384 100644 --- a/applications/cli/cli_commands.c +++ b/applications/cli/cli_commands.c @@ -376,17 +376,18 @@ void cli_command_free(Cli* cli, string_t args, void* context) { } void cli_commands_init(Cli* cli) { - cli_add_command(cli, "!", cli_command_device_info, NULL); - cli_add_command(cli, "device_info", cli_command_device_info, NULL); + cli_add_command(cli, "!", CliCommandFlagParallelSafe, cli_command_device_info, NULL); + cli_add_command(cli, "device_info", CliCommandFlagParallelSafe, cli_command_device_info, NULL); - cli_add_command(cli, "?", cli_command_help, NULL); - cli_add_command(cli, "help", cli_command_help, NULL); + cli_add_command(cli, "?", CliCommandFlagParallelSafe, cli_command_help, NULL); + cli_add_command(cli, "help", CliCommandFlagParallelSafe, cli_command_help, NULL); - cli_add_command(cli, "date", cli_command_date, NULL); - cli_add_command(cli, "log", cli_command_log, NULL); - cli_add_command(cli, "vibro", cli_command_vibro, NULL); - cli_add_command(cli, "led", cli_command_led, NULL); - cli_add_command(cli, "gpio_set", cli_command_gpio_set, NULL); - cli_add_command(cli, "ps", cli_command_ps, NULL); - cli_add_command(cli, "free", cli_command_free, NULL); + cli_add_command(cli, "date", CliCommandFlagParallelSafe, cli_command_date, NULL); + cli_add_command(cli, "log", CliCommandFlagParallelSafe, cli_command_log, NULL); + cli_add_command(cli, "ps", CliCommandFlagParallelSafe, cli_command_ps, NULL); + cli_add_command(cli, "free", CliCommandFlagParallelSafe, cli_command_free, NULL); + + cli_add_command(cli, "vibro", CliCommandFlagDefault, cli_command_vibro, NULL); + cli_add_command(cli, "led", CliCommandFlagDefault, cli_command_led, NULL); + cli_add_command(cli, "gpio_set", CliCommandFlagDefault, cli_command_gpio_set, NULL); } diff --git a/applications/cli/cli_i.h b/applications/cli/cli_i.h index 943d6304..e60fa450 100755 --- a/applications/cli/cli_i.h +++ b/applications/cli/cli_i.h @@ -15,6 +15,7 @@ typedef struct { CliCallback callback; void* context; + uint32_t flags; } CliCommand; BPTREE_DEF2( |