mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-04-24 03:29:57 -07:00
CLI: Simpler plugin wrapper
This commit is contained in:
@@ -19,6 +19,7 @@
|
||||
- JS: Added ADC (analog voltage) support to gpio library (by @jamisonderek)
|
||||
- FBT: New `SKIP_EXTERNAL` toggle and `EXTRA_EXT_APPS` config option (by @Willy-JL)
|
||||
- Desktop: Added TV animation from OFW which was missing (internal on OFW)
|
||||
- CLI: Simpler plugin wrapper (by @Willy-JL)
|
||||
- UL: BadKB: Add Finnish keyboard layout (by @nicou)
|
||||
- OFW: Furi: Event loop (by @skotopes)
|
||||
- OFW: RPC: Add TarExtract command, some small fixes (by @Willy-JL)
|
||||
|
||||
@@ -241,10 +241,11 @@ void ibutton_cli(Cli* cli, FuriString* args, void* context) {
|
||||
}
|
||||
|
||||
#include <flipper_application/flipper_application.h>
|
||||
#include <cli/cli_i.h>
|
||||
|
||||
static const FlipperAppPluginDescriptor plugin_descriptor = {
|
||||
.appid = "ibutton_cli",
|
||||
.ep_api_version = 1,
|
||||
.appid = CLI_PLUGIN_APP_ID,
|
||||
.ep_api_version = CLI_PLUGIN_API_VERSION,
|
||||
.entry_point = &ibutton_cli,
|
||||
};
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include <cli/cli_i.h>
|
||||
|
||||
static void ibutton_cli_wrapper(Cli* cli, FuriString* args, void* context) {
|
||||
cli_plugin_wrapper("ibutton_cli", 1, cli, args, context);
|
||||
cli_plugin_wrapper("ibutton", cli, args, context);
|
||||
}
|
||||
|
||||
void ibutton_on_system_start(void) {
|
||||
|
||||
@@ -546,10 +546,11 @@ static void infrared_cli_start_ir(Cli* cli, FuriString* args, void* context) {
|
||||
}
|
||||
|
||||
#include <flipper_application/flipper_application.h>
|
||||
#include <cli/cli_i.h>
|
||||
|
||||
static const FlipperAppPluginDescriptor plugin_descriptor = {
|
||||
.appid = "infrared_cli",
|
||||
.ep_api_version = 1,
|
||||
.appid = CLI_PLUGIN_APP_ID,
|
||||
.ep_api_version = CLI_PLUGIN_API_VERSION,
|
||||
.entry_point = &infrared_cli_start_ir,
|
||||
};
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include <cli/cli_i.h>
|
||||
|
||||
static void infrared_cli_start_ir_wrapper(Cli* cli, FuriString* args, void* context) {
|
||||
cli_plugin_wrapper("infrared_cli", 1, cli, args, context);
|
||||
cli_plugin_wrapper("infrared", cli, args, context);
|
||||
}
|
||||
|
||||
void infrared_on_system_start(void) {
|
||||
|
||||
@@ -570,10 +570,11 @@ static void lfrfid_cli(Cli* cli, FuriString* args, void* context) {
|
||||
}
|
||||
|
||||
#include <flipper_application/flipper_application.h>
|
||||
#include <cli/cli_i.h>
|
||||
|
||||
static const FlipperAppPluginDescriptor plugin_descriptor = {
|
||||
.appid = "lfrfid_cli",
|
||||
.ep_api_version = 1,
|
||||
.appid = CLI_PLUGIN_APP_ID,
|
||||
.ep_api_version = CLI_PLUGIN_API_VERSION,
|
||||
.entry_point = &lfrfid_cli,
|
||||
};
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include <cli/cli_i.h>
|
||||
|
||||
static void lfrfid_cli_wrapper(Cli* cli, FuriString* args, void* context) {
|
||||
cli_plugin_wrapper("lfrfid_cli", 1, cli, args, context);
|
||||
cli_plugin_wrapper("lfrfid", cli, args, context);
|
||||
}
|
||||
|
||||
void lfrfid_on_system_start(void) {
|
||||
|
||||
@@ -64,10 +64,11 @@ static void nfc_cli(Cli* cli, FuriString* args, void* context) {
|
||||
}
|
||||
|
||||
#include <flipper_application/flipper_application.h>
|
||||
#include <cli/cli_i.h>
|
||||
|
||||
static const FlipperAppPluginDescriptor plugin_descriptor = {
|
||||
.appid = "nfc_cli",
|
||||
.ep_api_version = 1,
|
||||
.appid = CLI_PLUGIN_APP_ID,
|
||||
.ep_api_version = CLI_PLUGIN_API_VERSION,
|
||||
.entry_point = &nfc_cli,
|
||||
};
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include <cli/cli_i.h>
|
||||
|
||||
static void nfc_cli_wrapper(Cli* cli, FuriString* args, void* context) {
|
||||
cli_plugin_wrapper("nfc_cli", 1, cli, args, context);
|
||||
cli_plugin_wrapper("nfc", cli, args, context);
|
||||
}
|
||||
|
||||
void nfc_on_system_start(void) {
|
||||
|
||||
@@ -60,10 +60,11 @@ void onewire_cli(Cli* cli, FuriString* args, void* context) {
|
||||
}
|
||||
|
||||
#include <flipper_application/flipper_application.h>
|
||||
#include <cli/cli_i.h>
|
||||
|
||||
static const FlipperAppPluginDescriptor plugin_descriptor = {
|
||||
.appid = "onewire_cli",
|
||||
.ep_api_version = 1,
|
||||
.appid = CLI_PLUGIN_APP_ID,
|
||||
.ep_api_version = CLI_PLUGIN_API_VERSION,
|
||||
.entry_point = &onewire_cli,
|
||||
};
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include <cli/cli_i.h>
|
||||
|
||||
static void onewire_cli_wrapper(Cli* cli, FuriString* args, void* context) {
|
||||
cli_plugin_wrapper("onewire_cli", 1, cli, args, context);
|
||||
cli_plugin_wrapper("onewire", cli, args, context);
|
||||
}
|
||||
|
||||
void onewire_on_system_start(void) {
|
||||
|
||||
@@ -1195,10 +1195,11 @@ static void subghz_cli_command(Cli* cli, FuriString* args, void* context) {
|
||||
}
|
||||
|
||||
#include <flipper_application/flipper_application.h>
|
||||
#include <cli/cli_i.h>
|
||||
|
||||
static const FlipperAppPluginDescriptor plugin_descriptor = {
|
||||
.appid = "subghz_cli",
|
||||
.ep_api_version = 1,
|
||||
.appid = CLI_PLUGIN_APP_ID,
|
||||
.ep_api_version = CLI_PLUGIN_API_VERSION,
|
||||
.entry_point = &subghz_cli_command,
|
||||
};
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#define SUBGHZ_REGION_FILENAME "/int/.region_data"
|
||||
|
||||
static void subghz_cli_command_wrapper(Cli* cli, FuriString* args, void* context) {
|
||||
cli_plugin_wrapper("subghz_cli", 1, cli, args, context);
|
||||
cli_plugin_wrapper("subghz", cli, args, context);
|
||||
}
|
||||
|
||||
static void subghz_cli_command_chat_wrapper(Cli* cli, FuriString* args, void* context) {
|
||||
|
||||
@@ -226,10 +226,11 @@ static void bt_cli(Cli* cli, FuriString* args, void* context) {
|
||||
}
|
||||
|
||||
#include <flipper_application/flipper_application.h>
|
||||
#include <cli/cli_i.h>
|
||||
|
||||
static const FlipperAppPluginDescriptor plugin_descriptor = {
|
||||
.appid = "bt_cli",
|
||||
.ep_api_version = 1,
|
||||
.appid = CLI_PLUGIN_APP_ID,
|
||||
.ep_api_version = CLI_PLUGIN_API_VERSION,
|
||||
.entry_point = &bt_cli,
|
||||
};
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#include "bt_service/bt.h"
|
||||
|
||||
static void bt_cli_wrapper(Cli* cli, FuriString* args, void* context) {
|
||||
cli_plugin_wrapper("bt_cli", 1, cli, args, context);
|
||||
cli_plugin_wrapper("bt", cli, args, context);
|
||||
}
|
||||
|
||||
void bt_on_system_start(void) {
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#include <furi_hal_version.h>
|
||||
#include <loader/loader.h>
|
||||
|
||||
#include <flipper_application/flipper_application.h>
|
||||
#include <flipper_application/plugins/plugin_manager.h>
|
||||
#include <loader/firmware_api/firmware_api.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
@@ -487,57 +487,18 @@ int32_t cli_srv(void* p) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
void cli_plugin_wrapper(
|
||||
const char* handler_name,
|
||||
uint32_t handler_version,
|
||||
Cli* cli,
|
||||
FuriString* args,
|
||||
void* context) {
|
||||
Storage* storage = furi_record_open(RECORD_STORAGE);
|
||||
FlipperApplication* plugin_app = flipper_application_alloc(storage, firmware_api_interface);
|
||||
do {
|
||||
FuriString* full_handler_path =
|
||||
furi_string_alloc_printf(EXT_PATH("apps_data/cli/plugins/%s.fal"), handler_name);
|
||||
FlipperApplicationPreloadStatus preload_res =
|
||||
flipper_application_preload(plugin_app, furi_string_get_cstr(full_handler_path));
|
||||
furi_string_free(full_handler_path);
|
||||
|
||||
if(preload_res != FlipperApplicationPreloadStatusSuccess) {
|
||||
printf("Failed to preload CLI plugin. Code: %d\r\n", preload_res);
|
||||
break;
|
||||
}
|
||||
|
||||
if(!flipper_application_is_plugin(plugin_app)) {
|
||||
printf("CLI plugin file is not a library\r\n");
|
||||
break;
|
||||
}
|
||||
|
||||
FlipperApplicationLoadStatus load_status = flipper_application_map_to_memory(plugin_app);
|
||||
if(load_status != FlipperApplicationLoadStatusSuccess) {
|
||||
printf("Failed to load CLI plugin file. Code %d\r\n", load_status);
|
||||
break;
|
||||
}
|
||||
|
||||
const FlipperAppPluginDescriptor* app_descriptor =
|
||||
flipper_application_plugin_get_descriptor(plugin_app);
|
||||
|
||||
if(strcmp(app_descriptor->appid, handler_name) != 0) {
|
||||
printf("CLI plugin type doesn't match\r\n");
|
||||
break;
|
||||
}
|
||||
|
||||
if(app_descriptor->ep_api_version != handler_version) {
|
||||
printf(
|
||||
"CLI plugin version %" PRIu32 " doesn't match\r\n",
|
||||
app_descriptor->ep_api_version);
|
||||
break;
|
||||
}
|
||||
|
||||
const CliCallback handler = app_descriptor->entry_point;
|
||||
|
||||
void cli_plugin_wrapper(const char* name, Cli* cli, FuriString* args, void* context) {
|
||||
PluginManager* manager =
|
||||
plugin_manager_alloc(CLI_PLUGIN_APP_ID, CLI_PLUGIN_API_VERSION, firmware_api_interface);
|
||||
FuriString* path =
|
||||
furi_string_alloc_printf(EXT_PATH("apps_data/cli/plugins/%s_cli.fal"), name);
|
||||
PluginManagerError error = plugin_manager_load_single(manager, furi_string_get_cstr(path));
|
||||
if(error == PluginManagerErrorNone) {
|
||||
const CliCallback handler = plugin_manager_get_ep(manager, 0);
|
||||
handler(cli, args, context);
|
||||
|
||||
} while(false);
|
||||
flipper_application_free(plugin_app);
|
||||
furi_record_close(RECORD_STORAGE);
|
||||
} else {
|
||||
printf("CLI plugin failed (code %" PRIu16 "), update firmware or check logs\r\n", error);
|
||||
}
|
||||
furi_string_free(path);
|
||||
plugin_manager_free(manager);
|
||||
}
|
||||
|
||||
@@ -65,12 +65,9 @@ void cli_stdout_callback(void* _cookie, const char* data, size_t size);
|
||||
// Wraps CLI commands to load from plugin file
|
||||
// Must call from CLI context, like dummy CLI command callback
|
||||
// You need to setup the plugin to compile correctly separately
|
||||
void cli_plugin_wrapper(
|
||||
const char* handler_name,
|
||||
uint32_t handler_version,
|
||||
Cli* cli,
|
||||
FuriString* args,
|
||||
void* context);
|
||||
#define CLI_PLUGIN_APP_ID "cli"
|
||||
#define CLI_PLUGIN_API_VERSION 1
|
||||
void cli_plugin_wrapper(const char* name, Cli* cli, FuriString* args, void* context);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -317,10 +317,11 @@ static void crypto_cli(Cli* cli, FuriString* args, void* context) {
|
||||
}
|
||||
|
||||
#include <flipper_application/flipper_application.h>
|
||||
#include <cli/cli_i.h>
|
||||
|
||||
static const FlipperAppPluginDescriptor plugin_descriptor = {
|
||||
.appid = "crypto_cli",
|
||||
.ep_api_version = 1,
|
||||
.appid = CLI_PLUGIN_APP_ID,
|
||||
.ep_api_version = CLI_PLUGIN_API_VERSION,
|
||||
.entry_point = &crypto_cli,
|
||||
};
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include <cli/cli_i.h>
|
||||
|
||||
static void crypto_cli_wrapper(Cli* cli, FuriString* args, void* context) {
|
||||
cli_plugin_wrapper("crypto_cli", 1, cli, args, context);
|
||||
cli_plugin_wrapper("crypto", cli, args, context);
|
||||
}
|
||||
|
||||
void crypto_on_system_start(void) {
|
||||
|
||||
@@ -57,7 +57,7 @@ const char* input_get_type_name(InputType type) {
|
||||
#include <cli/cli_i.h>
|
||||
|
||||
static void input_cli_wrapper(Cli* cli, FuriString* args, void* context) {
|
||||
cli_plugin_wrapper("input_cli", 1, cli, args, context);
|
||||
cli_plugin_wrapper("input", cli, args, context);
|
||||
}
|
||||
|
||||
int32_t input_srv(void* p) {
|
||||
|
||||
@@ -224,10 +224,11 @@ void input_cli(Cli* cli, FuriString* args, void* context) {
|
||||
}
|
||||
|
||||
#include <flipper_application/flipper_application.h>
|
||||
#include <cli/cli_i.h>
|
||||
|
||||
static const FlipperAppPluginDescriptor plugin_descriptor = {
|
||||
.appid = "input_cli",
|
||||
.ep_api_version = 1,
|
||||
.appid = CLI_PLUGIN_APP_ID,
|
||||
.ep_api_version = CLI_PLUGIN_API_VERSION,
|
||||
.entry_point = &input_cli,
|
||||
};
|
||||
|
||||
|
||||
@@ -105,10 +105,11 @@ static void loader_cli(Cli* cli, FuriString* args, void* context) {
|
||||
}
|
||||
|
||||
#include <flipper_application/flipper_application.h>
|
||||
#include <cli/cli_i.h>
|
||||
|
||||
static const FlipperAppPluginDescriptor plugin_descriptor = {
|
||||
.appid = "loader_cli",
|
||||
.ep_api_version = 1,
|
||||
.appid = CLI_PLUGIN_APP_ID,
|
||||
.ep_api_version = CLI_PLUGIN_API_VERSION,
|
||||
.entry_point = &loader_cli,
|
||||
};
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#include "loader.h"
|
||||
|
||||
static void loader_cli_wrapper(Cli* cli, FuriString* args, void* context) {
|
||||
cli_plugin_wrapper("loader_cli", 1, cli, args, context);
|
||||
cli_plugin_wrapper("loader", cli, args, context);
|
||||
}
|
||||
|
||||
void loader_on_system_start(void) {
|
||||
|
||||
@@ -107,10 +107,11 @@ void power_cli(Cli* cli, FuriString* args, void* context) {
|
||||
}
|
||||
|
||||
#include <flipper_application/flipper_application.h>
|
||||
#include <cli/cli_i.h>
|
||||
|
||||
static const FlipperAppPluginDescriptor plugin_descriptor = {
|
||||
.appid = "power_cli",
|
||||
.ep_api_version = 1,
|
||||
.appid = CLI_PLUGIN_APP_ID,
|
||||
.ep_api_version = CLI_PLUGIN_API_VERSION,
|
||||
.entry_point = &power_cli,
|
||||
};
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include <cli/cli_i.h>
|
||||
|
||||
static void power_cli_wrapper(Cli* cli, FuriString* args, void* context) {
|
||||
cli_plugin_wrapper("power_cli", 1, cli, args, context);
|
||||
cli_plugin_wrapper("power", cli, args, context);
|
||||
}
|
||||
|
||||
void power_on_system_start(void) {
|
||||
|
||||
@@ -206,10 +206,11 @@ void js_cli_execute(Cli* cli, FuriString* args, void* context) {
|
||||
}
|
||||
|
||||
#include <flipper_application/flipper_application.h>
|
||||
#include <cli/cli_i.h>
|
||||
|
||||
static const FlipperAppPluginDescriptor plugin_descriptor = {
|
||||
.appid = "js_cli",
|
||||
.ep_api_version = 1,
|
||||
.appid = CLI_PLUGIN_APP_ID,
|
||||
.ep_api_version = CLI_PLUGIN_API_VERSION,
|
||||
.entry_point = &js_cli_execute,
|
||||
};
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include <cli/cli_i.h>
|
||||
|
||||
static void js_cli_execute_wrapper(Cli* cli, FuriString* args, void* context) {
|
||||
cli_plugin_wrapper("js_cli", 1, cli, args, context);
|
||||
cli_plugin_wrapper("js", cli, args, context);
|
||||
}
|
||||
|
||||
void js_app_on_system_start(void) {
|
||||
|
||||
Reference in New Issue
Block a user