diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 489cca3c6a..d221e9524a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -119,6 +119,20 @@ jobs: tar czpf "artifacts/flipper-z-any-scripts-${SUFFIX}.tgz" scripts cp build/core2_firmware.tgz "artifacts/flipper-z-any-core2_firmware-${SUFFIX}.tgz" + - name: "Calculate DFU sizes" + env: + INDEXER_URL: ${{ secrets.INDEXER_URL }} + if: ${{ env.INDEXER_URL != '' && github.event.pull_request && matrix.target == env.DEFAULT_TARGET }} + run: | + curl -L "${{ secrets.INDEXER_URL }}"/firmware/development/f7/full_dfu -o dev.dfu + dfu_size_new=$(du --apparent-size -B 1 artifacts/flipper-z-${TARGET}-full-*.dfu | cut -f1) + dfu_size_dev=$(du --apparent-size -B 1 dev.dfu | cut -f1) + dfu_size_diff=$((dfu_size_new - dfu_size_dev)) + DFU_SIZE=$(echo ${dfu_size_new}B | sed -r 's/^([0-9]+)([0-9]{2})([0-9])B/\1.\2K/') + DFU_DIFF=$(echo ${dfu_size_diff}B | sed -r 's/^(-?[0-9]+)([0-9]{2})([0-9])B/\1.\2K/' | sed -r 's/^([^-])/+\1/') + echo "DFU_SIZE=$DFU_SIZE" >> $GITHUB_ENV + echo "DFU_DIFF=$DFU_DIFF" >> $GITHUB_ENV + - name: "Upload artifacts to update server" env: INDEXER_URL: ${{ secrets.INDEXER_URL }} @@ -155,6 +169,7 @@ jobs: **Compiled ${{ matrix.target }} firmware for commit `${{steps.names.outputs.commit_sha}}`:** - [☁️ Flipper Lab/App](https://lab.flipper.net/?url=${{secrets.INDEXER_URL}}/builds/firmware/${{steps.names.outputs.branch_name}}/flipper-z-${{steps.names.outputs.default_target}}-update-${{steps.names.outputs.suffix}}.tgz&channel=mntm-${{steps.names.outputs.branch_name}}&version=${{steps.names.outputs.commit_sha}}) - [📦 qFlipper Package](${{secrets.INDEXER_URL}}/builds/firmware/${{steps.names.outputs.branch_name}}/flipper-z-${{steps.names.outputs.default_target}}-update-${{steps.names.outputs.suffix}}.tgz) + - DFU Size: `${{ env.DFU_SIZE }}` (`${{ env.DFU_DIFF }}` from dev) edit-mode: replace - name: Send devbuild webhook diff --git a/CHANGELOG.md b/CHANGELOG.md index 680a42602b..6507b0bce1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -133,7 +133,9 @@ - UL: W5500 Ethernet: Various fixes and improvements (by @xMasterX) - OFW: SPI Mem Manager: Fixed UI rendering bug related to line breaks (by @portasynthinca3) - OFW: USB/BT Remote: Mouse clicker option to click as fast as possible (by @sumukhj1219) -- CLI: Print plugin name on load fail (by @Willy-JL) +- CLI: + - Print plugin name on load fail (by @Willy-JL) + - Move more commands as plugins on SD, refactor plugin wrapper (#276 by @Willy-JL) - NFC: - NDEF Parser: - Mifare Classic support (#265 by @luu176), protocol-agnostic rewrite and more improvements (#265 by @Willy-JL) diff --git a/applications/main/ibutton/application.fam b/applications/main/ibutton/application.fam index d33519580b..8fe1479688 100644 --- a/applications/main/ibutton/application.fam +++ b/applications/main/ibutton/application.fam @@ -25,6 +25,6 @@ App( apptype=FlipperAppType.STARTUP, targets=["f7"], entry_point="ibutton_on_system_start", - sources=["ibutton_start.c"], + sources=["ibutton_cli.c"], order=60, ) diff --git a/applications/main/ibutton/ibutton_cli.c b/applications/main/ibutton/ibutton_cli.c index dcac8f9632..8ca832500e 100644 --- a/applications/main/ibutton/ibutton_cli.c +++ b/applications/main/ibutton/ibutton_cli.c @@ -8,6 +8,22 @@ #include #include +static void ibutton_cli(Cli* cli, FuriString* args, void* context); + +#include +CLI_PLUGIN_WRAPPER("ibutton", ibutton_cli) + +// app cli function +void ibutton_on_system_start(void) { +#ifdef SRV_CLI + Cli* cli = furi_record_open(RECORD_CLI); + cli_add_command(cli, "ikey", CliCommandFlagDefault, ibutton_cli_wrapper, cli); + furi_record_close(RECORD_CLI); +#else + UNUSED(ibutton_cli); +#endif +} + static void ibutton_cli_print_usage(void) { printf("Usage:\r\n"); printf("ikey read\r\n"); @@ -239,16 +255,3 @@ void ibutton_cli(Cli* cli, FuriString* args, void* context) { furi_string_free(cmd); } - -#include -#include - -static const FlipperAppPluginDescriptor plugin_descriptor = { - .appid = CLI_PLUGIN_APP_ID, - .ep_api_version = CLI_PLUGIN_API_VERSION, - .entry_point = &ibutton_cli, -}; - -const FlipperAppPluginDescriptor* ibutton_cli_plugin_ep(void) { - return &plugin_descriptor; -} diff --git a/applications/main/ibutton/ibutton_start.c b/applications/main/ibutton/ibutton_start.c deleted file mode 100644 index d252bed7fb..0000000000 --- a/applications/main/ibutton/ibutton_start.c +++ /dev/null @@ -1,11 +0,0 @@ -#include - -static void ibutton_cli_wrapper(Cli* cli, FuriString* args, void* context) { - cli_plugin_wrapper("ibutton", cli, args, context); -} - -void ibutton_on_system_start(void) { - Cli* cli = furi_record_open(RECORD_CLI); - cli_add_command(cli, "ikey", CliCommandFlagDefault, ibutton_cli_wrapper, cli); - furi_record_close(RECORD_CLI); -} diff --git a/applications/main/infrared/application.fam b/applications/main/infrared/application.fam index 8ffaafa345..8c86c78f30 100644 --- a/applications/main/infrared/application.fam +++ b/applications/main/infrared/application.fam @@ -17,7 +17,7 @@ App( appid="infrared_cli", targets=["f7"], apptype=FlipperAppType.PLUGIN, - entry_point="infrared_cli_plugin_ep", + entry_point="infrared_cli_start_ir_plugin_ep", requires=["cli"], sources=[ "infrared_cli.c", @@ -31,6 +31,6 @@ App( apptype=FlipperAppType.STARTUP, targets=["f7"], entry_point="infrared_on_system_start", - sources=["infrared_start.c"], + sources=["infrared_cli.c"], order=20, ) diff --git a/applications/main/infrared/infrared_cli.c b/applications/main/infrared/infrared_cli.c index d4668d699c..3579c683ae 100644 --- a/applications/main/infrared/infrared_cli.c +++ b/applications/main/infrared/infrared_cli.c @@ -555,15 +555,15 @@ static void infrared_cli_start_ir(Cli* cli, FuriString* args, void* context) { furi_string_free(command); } -#include #include - -static const FlipperAppPluginDescriptor plugin_descriptor = { - .appid = CLI_PLUGIN_APP_ID, - .ep_api_version = CLI_PLUGIN_API_VERSION, - .entry_point = &infrared_cli_start_ir, -}; - -const FlipperAppPluginDescriptor* infrared_cli_plugin_ep(void) { - return &plugin_descriptor; +CLI_PLUGIN_WRAPPER("infrared", infrared_cli_start_ir) + +void infrared_on_system_start(void) { +#ifdef SRV_CLI + Cli* cli = (Cli*)furi_record_open(RECORD_CLI); + cli_add_command(cli, "ir", CliCommandFlagDefault, infrared_cli_start_ir_wrapper, NULL); + furi_record_close(RECORD_CLI); +#else + UNUSED(infrared_cli_start_ir); +#endif } diff --git a/applications/main/infrared/infrared_start.c b/applications/main/infrared/infrared_start.c deleted file mode 100644 index 6de11b677d..0000000000 --- a/applications/main/infrared/infrared_start.c +++ /dev/null @@ -1,11 +0,0 @@ -#include - -static void infrared_cli_start_ir_wrapper(Cli* cli, FuriString* args, void* context) { - cli_plugin_wrapper("infrared", cli, args, context); -} - -void infrared_on_system_start(void) { - Cli* cli = (Cli*)furi_record_open(RECORD_CLI); - cli_add_command(cli, "ir", CliCommandFlagDefault, infrared_cli_start_ir_wrapper, NULL); - furi_record_close(RECORD_CLI); -} diff --git a/applications/main/lfrfid/application.fam b/applications/main/lfrfid/application.fam index 5e97e925d3..d2abf300d4 100644 --- a/applications/main/lfrfid/application.fam +++ b/applications/main/lfrfid/application.fam @@ -25,6 +25,6 @@ App( targets=["f7"], apptype=FlipperAppType.STARTUP, entry_point="lfrfid_on_system_start", - sources=["lfrfid_start.c"], + sources=["lfrfid_cli.c"], order=50, ) diff --git a/applications/main/lfrfid/lfrfid_cli.c b/applications/main/lfrfid/lfrfid_cli.c index eaafcda922..acee316fe0 100644 --- a/applications/main/lfrfid/lfrfid_cli.c +++ b/applications/main/lfrfid/lfrfid_cli.c @@ -14,6 +14,18 @@ #include #include +static void lfrfid_cli(Cli* cli, FuriString* args, void* context); + +#include +CLI_PLUGIN_WRAPPER("lfrfid", lfrfid_cli) + +// app cli function +void lfrfid_on_system_start(void) { + Cli* cli = furi_record_open(RECORD_CLI); + cli_add_command(cli, "rfid", CliCommandFlagDefault, lfrfid_cli_wrapper, NULL); + furi_record_close(RECORD_CLI); +} + static void lfrfid_cli_print_usage(void) { printf("Usage:\r\n"); printf("rfid read - read in ASK/PSK mode\r\n"); @@ -568,16 +580,3 @@ static void lfrfid_cli(Cli* cli, FuriString* args, void* context) { furi_string_free(cmd); } - -#include -#include - -static const FlipperAppPluginDescriptor plugin_descriptor = { - .appid = CLI_PLUGIN_APP_ID, - .ep_api_version = CLI_PLUGIN_API_VERSION, - .entry_point = &lfrfid_cli, -}; - -const FlipperAppPluginDescriptor* lfrfid_cli_plugin_ep(void) { - return &plugin_descriptor; -} diff --git a/applications/main/lfrfid/lfrfid_start.c b/applications/main/lfrfid/lfrfid_start.c deleted file mode 100644 index faf275355b..0000000000 --- a/applications/main/lfrfid/lfrfid_start.c +++ /dev/null @@ -1,11 +0,0 @@ -#include - -static void lfrfid_cli_wrapper(Cli* cli, FuriString* args, void* context) { - cli_plugin_wrapper("lfrfid", cli, args, context); -} - -void lfrfid_on_system_start(void) { - Cli* cli = furi_record_open(RECORD_CLI); - cli_add_command(cli, "rfid", CliCommandFlagDefault, lfrfid_cli_wrapper, NULL); - furi_record_close(RECORD_CLI); -} diff --git a/applications/main/nfc/application.fam b/applications/main/nfc/application.fam index 53c04f609e..13c26b7aa3 100644 --- a/applications/main/nfc/application.fam +++ b/applications/main/nfc/application.fam @@ -352,6 +352,6 @@ App( targets=["f7"], apptype=FlipperAppType.STARTUP, entry_point="nfc_on_system_start", - sources=["nfc_start.c"], + sources=["nfc_cli.c"], order=30, ) diff --git a/applications/main/nfc/nfc_cli.c b/applications/main/nfc/nfc_cli.c index fae8ca933a..005d6cce1d 100644 --- a/applications/main/nfc/nfc_cli.c +++ b/applications/main/nfc/nfc_cli.c @@ -63,15 +63,15 @@ static void nfc_cli(Cli* cli, FuriString* args, void* context) { furi_string_free(cmd); } -#include #include +CLI_PLUGIN_WRAPPER("nfc", nfc_cli) -static const FlipperAppPluginDescriptor plugin_descriptor = { - .appid = CLI_PLUGIN_APP_ID, - .ep_api_version = CLI_PLUGIN_API_VERSION, - .entry_point = &nfc_cli, -}; - -const FlipperAppPluginDescriptor* nfc_cli_plugin_ep(void) { - return &plugin_descriptor; +void nfc_on_system_start(void) { +#ifdef SRV_CLI + Cli* cli = furi_record_open(RECORD_CLI); + cli_add_command(cli, "nfc", CliCommandFlagDefault, nfc_cli_wrapper, NULL); + furi_record_close(RECORD_CLI); +#else + UNUSED(nfc_cli); +#endif } diff --git a/applications/main/nfc/nfc_start.c b/applications/main/nfc/nfc_start.c deleted file mode 100644 index d38a956c3f..0000000000 --- a/applications/main/nfc/nfc_start.c +++ /dev/null @@ -1,11 +0,0 @@ -#include - -static void nfc_cli_wrapper(Cli* cli, FuriString* args, void* context) { - cli_plugin_wrapper("nfc", cli, args, context); -} - -void nfc_on_system_start(void) { - Cli* cli = furi_record_open(RECORD_CLI); - cli_add_command(cli, "nfc", CliCommandFlagDefault, nfc_cli_wrapper, NULL); - furi_record_close(RECORD_CLI); -} diff --git a/applications/main/onewire/application.fam b/applications/main/onewire/application.fam index 9fac2ff219..ef756ba56e 100644 --- a/applications/main/onewire/application.fam +++ b/applications/main/onewire/application.fam @@ -11,6 +11,6 @@ App( appid="onewire_start", apptype=FlipperAppType.STARTUP, entry_point="onewire_on_system_start", - sources=["onewire_start.c"], + sources=["onewire_cli.c"], order=60, ) diff --git a/applications/main/onewire/onewire_cli.c b/applications/main/onewire/onewire_cli.c index 4ee81a462e..1aeb2452f0 100644 --- a/applications/main/onewire/onewire_cli.c +++ b/applications/main/onewire/onewire_cli.c @@ -6,6 +6,21 @@ #include +static void onewire_cli(Cli* cli, FuriString* args, void* context); + +#include +CLI_PLUGIN_WRAPPER("onewire", onewire_cli) + +void onewire_on_system_start(void) { +#ifdef SRV_CLI + Cli* cli = furi_record_open(RECORD_CLI); + cli_add_command(cli, "onewire", CliCommandFlagDefault, onewire_cli_wrapper, cli); + furi_record_close(RECORD_CLI); +#else + UNUSED(onewire_cli); +#endif +} + static void onewire_cli_print_usage(void) { printf("Usage:\r\n"); printf("onewire search\r\n"); @@ -58,16 +73,3 @@ void onewire_cli(Cli* cli, FuriString* args, void* context) { furi_string_free(cmd); } - -#include -#include - -static const FlipperAppPluginDescriptor plugin_descriptor = { - .appid = CLI_PLUGIN_APP_ID, - .ep_api_version = CLI_PLUGIN_API_VERSION, - .entry_point = &onewire_cli, -}; - -const FlipperAppPluginDescriptor* onewire_cli_plugin_ep(void) { - return &plugin_descriptor; -} diff --git a/applications/main/onewire/onewire_start.c b/applications/main/onewire/onewire_start.c deleted file mode 100644 index 219335411b..0000000000 --- a/applications/main/onewire/onewire_start.c +++ /dev/null @@ -1,11 +0,0 @@ -#include - -static void onewire_cli_wrapper(Cli* cli, FuriString* args, void* context) { - cli_plugin_wrapper("onewire", cli, args, context); -} - -void onewire_on_system_start(void) { - Cli* cli = furi_record_open(RECORD_CLI); - cli_add_command(cli, "onewire", CliCommandFlagDefault, onewire_cli_wrapper, cli); - furi_record_close(RECORD_CLI); -} diff --git a/applications/main/subghz/application.fam b/applications/main/subghz/application.fam index 15831d6e61..3c9625ed35 100644 --- a/applications/main/subghz/application.fam +++ b/applications/main/subghz/application.fam @@ -48,7 +48,7 @@ App( appid="subghz_cli", targets=["f7"], apptype=FlipperAppType.PLUGIN, - entry_point="subghz_cli_plugin_ep", + entry_point="subghz_cli_command_plugin_ep", requires=["cli"], sources=["subghz_cli.c", "helpers/subghz_chat.c"], ) @@ -59,7 +59,7 @@ App( targets=["f7"], apptype=FlipperAppType.STARTUP, entry_point="subghz_on_system_start", - # sources=["subghz_start.c"], + # sources=["subghz_cli.c"], order=40, ) diff --git a/applications/main/subghz/subghz_cli.c b/applications/main/subghz/subghz_cli.c index cf7300d59d..70ce5b1385 100644 --- a/applications/main/subghz/subghz_cli.c +++ b/applications/main/subghz/subghz_cli.c @@ -1185,15 +1185,24 @@ static void subghz_cli_command(Cli* cli, FuriString* args, void* context) { furi_string_free(cmd); } -#include #include +CLI_PLUGIN_WRAPPER("subghz", subghz_cli_command) -static const FlipperAppPluginDescriptor plugin_descriptor = { - .appid = CLI_PLUGIN_APP_ID, - .ep_api_version = CLI_PLUGIN_API_VERSION, - .entry_point = &subghz_cli_command, -}; +static void subghz_cli_command_chat_wrapper(Cli* cli, FuriString* args, void* context) { + furi_string_replace_at(args, 0, 0, "chat "); + subghz_cli_command_wrapper(cli, args, context); +} + +void subghz_on_system_start(void) { +#ifdef SRV_CLI + Cli* cli = furi_record_open(RECORD_CLI); + + cli_add_command(cli, "subghz", CliCommandFlagDefault, subghz_cli_command_wrapper, NULL); + cli_add_command(cli, "chat", CliCommandFlagDefault, subghz_cli_command_chat_wrapper, NULL); -const FlipperAppPluginDescriptor* subghz_cli_plugin_ep(void) { - return &plugin_descriptor; + furi_record_close(RECORD_CLI); +#else + UNUSED(subghz_cli_command); + UNUSED(subghz_cli_command_chat_wrapper); +#endif } diff --git a/applications/main/subghz/subghz_start.c b/applications/main/subghz/subghz_start.c deleted file mode 100644 index 13a8e5c55c..0000000000 --- a/applications/main/subghz/subghz_start.c +++ /dev/null @@ -1,113 +0,0 @@ -#include - -#include -#include -#include - -#define SUBGHZ_REGION_FILENAME "/int/.region_data" - -static void subghz_cli_command_wrapper(Cli* cli, FuriString* args, void* context) { - cli_plugin_wrapper("subghz", cli, args, context); -} - -static void subghz_cli_command_chat_wrapper(Cli* cli, FuriString* args, void* context) { - furi_string_replace_at(args, 0, 0, "chat "); - subghz_cli_command_wrapper(cli, args, context); -} - -static bool - subghz_on_system_start_istream_read(pb_istream_t* istream, pb_byte_t* buf, size_t count) { - File* file = istream->state; - size_t ret = storage_file_read(file, buf, count); - return (count == ret); -} - -static bool subghz_on_system_start_istream_decode_band( - pb_istream_t* stream, - const pb_field_t* field, - void** arg) { - (void)field; - FuriHalRegion* region = *arg; - - PB_Region_Band band = {0}; - if(!pb_decode(stream, PB_Region_Band_fields, &band)) { - FURI_LOG_E("SubGhzOnStart", "PB Region band decode error: %s", PB_GET_ERROR(stream)); - return false; - } - - region->bands_count += 1; - region = realloc( //-V701 - region, - sizeof(FuriHalRegion) + sizeof(FuriHalRegionBand) * region->bands_count); - size_t pos = region->bands_count - 1; - region->bands[pos].start = band.start; - region->bands[pos].end = band.end; - region->bands[pos].power_limit = band.power_limit; - region->bands[pos].duty_cycle = band.duty_cycle; - *arg = region; - - FURI_LOG_I( - "SubGhzOnStart", - "Add allowed band: start %luHz, stop %luHz, power_limit %ddBm, duty_cycle %u%%", - band.start, - band.end, - band.power_limit, - band.duty_cycle); - return true; -} - -void subghz_on_system_start(void) { - Cli* cli = furi_record_open(RECORD_CLI); - cli_add_command(cli, "subghz", CliCommandFlagDefault, subghz_cli_command_wrapper, NULL); - cli_add_command(cli, "chat", CliCommandFlagDefault, subghz_cli_command_chat_wrapper, NULL); - furi_record_close(RECORD_CLI); - -#ifdef SRV_STORAGE - Storage* storage = furi_record_open(RECORD_STORAGE); - File* file = storage_file_alloc(storage); - FileInfo fileinfo = {0}; - PB_Region pb_region = {0}; - pb_region.bands.funcs.decode = subghz_on_system_start_istream_decode_band; - - do { - if(storage_common_stat(storage, SUBGHZ_REGION_FILENAME, &fileinfo) != FSE_OK || - fileinfo.size == 0) { - FURI_LOG_W("SubGhzOnStart", "Region data is missing or empty"); - break; - } - - if(!storage_file_open(file, SUBGHZ_REGION_FILENAME, FSAM_READ, FSOM_OPEN_EXISTING)) { - FURI_LOG_E("SubGhzOnStart", "Unable to open region data"); - break; - } - - pb_istream_t istream = { - .callback = subghz_on_system_start_istream_read, - .state = file, - .errmsg = NULL, - .bytes_left = fileinfo.size, - }; - - pb_region.bands.arg = malloc(sizeof(FuriHalRegion)); - if(!pb_decode(&istream, PB_Region_fields, &pb_region)) { - FURI_LOG_E("SubGhzOnStart", "Invalid region data"); - free(pb_region.bands.arg); - break; - } - - FuriHalRegion* region = pb_region.bands.arg; - memcpy( - region->country_code, - pb_region.country_code->bytes, - pb_region.country_code->size < 4 ? pb_region.country_code->size : 3); - furi_hal_region_set(region); - } while(0); - - pb_release(PB_Region_fields, &pb_region); - storage_file_free(file); - furi_record_close(RECORD_STORAGE); -#else - UNUSED(subghz_on_system_start_istream_decode_band); - UNUSED(subghz_on_system_start_istream_read); -#endif -} diff --git a/applications/services/bt/bt_cli.c b/applications/services/bt/bt_cli.c index 8f94e19634..bd85c88612 100644 --- a/applications/services/bt/bt_cli.c +++ b/applications/services/bt/bt_cli.c @@ -227,15 +227,15 @@ static void bt_cli(Cli* cli, FuriString* args, void* context) { furi_record_close(RECORD_BT); } -#include #include - -static const FlipperAppPluginDescriptor plugin_descriptor = { - .appid = CLI_PLUGIN_APP_ID, - .ep_api_version = CLI_PLUGIN_API_VERSION, - .entry_point = &bt_cli, -}; - -const FlipperAppPluginDescriptor* bt_cli_plugin_ep(void) { - return &plugin_descriptor; +CLI_PLUGIN_WRAPPER("bt", bt_cli) + +void bt_on_system_start(void) { +#ifdef SRV_CLI + Cli* cli = furi_record_open(RECORD_CLI); + cli_add_command(cli, RECORD_BT, CliCommandFlagDefault, bt_cli_wrapper, NULL); + furi_record_close(RECORD_CLI); +#else + UNUSED(bt_cli); +#endif } diff --git a/applications/services/bt/bt_start.c b/applications/services/bt/bt_start.c deleted file mode 100644 index 124e4f93f6..0000000000 --- a/applications/services/bt/bt_start.c +++ /dev/null @@ -1,12 +0,0 @@ -#include -#include "bt_service/bt.h" - -static void bt_cli_wrapper(Cli* cli, FuriString* args, void* context) { - cli_plugin_wrapper("bt", cli, args, context); -} - -void bt_on_system_start(void) { - Cli* cli = furi_record_open(RECORD_CLI); - cli_add_command(cli, RECORD_BT, CliCommandFlagDefault, bt_cli_wrapper, NULL); - furi_record_close(RECORD_CLI); -} diff --git a/applications/services/cli/application.fam b/applications/services/cli/application.fam index 7a57bb6076..b6c72ecd49 100644 --- a/applications/services/cli/application.fam +++ b/applications/services/cli/application.fam @@ -8,3 +8,102 @@ App( order=30, sdk_headers=["cli.h", "cli_vcp.h"], ) + +App( + appid="info_cli", + targets=["f7"], + apptype=FlipperAppType.PLUGIN, + entry_point="cli_command_info_plugin_ep", + requires=["cli"], + sources=["cli_commands.c"], +) + +App( + appid="src_cli", + targets=["f7"], + apptype=FlipperAppType.PLUGIN, + entry_point="cli_command_src_plugin_ep", + requires=["cli"], + sources=["cli_commands.c"], +) + +App( + appid="neofetch_cli", + targets=["f7"], + apptype=FlipperAppType.PLUGIN, + entry_point="cli_command_neofetch_plugin_ep", + requires=["cli"], + sources=["cli_commands.c"], +) + +App( + appid="help_cli", + targets=["f7"], + apptype=FlipperAppType.PLUGIN, + entry_point="cli_command_help_plugin_ep", + requires=["cli"], + sources=["cli_commands.c"], +) + +App( + appid="uptime_cli", + targets=["f7"], + apptype=FlipperAppType.PLUGIN, + entry_point="cli_command_uptime_plugin_ep", + requires=["cli"], + sources=["cli_commands.c"], +) + +App( + appid="date_cli", + targets=["f7"], + apptype=FlipperAppType.PLUGIN, + entry_point="cli_command_date_plugin_ep", + requires=["cli"], + sources=["cli_commands.c"], +) + +App( + appid="sysctl_cli", + targets=["f7"], + apptype=FlipperAppType.PLUGIN, + entry_point="cli_command_sysctl_plugin_ep", + requires=["cli"], + sources=["cli_commands.c"], +) + +App( + appid="vibro_cli", + targets=["f7"], + apptype=FlipperAppType.PLUGIN, + entry_point="cli_command_vibro_plugin_ep", + requires=["cli"], + sources=["cli_commands.c"], +) + +App( + appid="led_cli", + targets=["f7"], + apptype=FlipperAppType.PLUGIN, + entry_point="cli_command_led_plugin_ep", + requires=["cli"], + sources=["cli_commands.c"], +) + +App( + appid="gpio_cli", + targets=["f7"], + apptype=FlipperAppType.PLUGIN, + entry_point="cli_command_gpio_plugin_ep", + requires=["cli"], + sources=["cli_commands.c", "cli_command_gpio.c"], +) + +App( + appid="i2c_cli", + targets=["f7"], + apptype=FlipperAppType.PLUGIN, + entry_point="cli_command_i2c_plugin_ep", + requires=["cli"], + sources=["cli_commands.c"], +) diff --git a/applications/services/cli/cli_commands.c b/applications/services/cli/cli_commands.c index a305ae7348..9dd4e4265f 100644 --- a/applications/services/cli/cli_commands.c +++ b/applications/services/cli/cli_commands.c @@ -682,33 +682,46 @@ void cli_command_i2c(Cli* cli, FuriString* args, void* context) { furi_hal_i2c_release(&furi_hal_i2c_handle_external); } +CLI_PLUGIN_WRAPPER("info", cli_command_info) +CLI_PLUGIN_WRAPPER("src", cli_command_src) +CLI_PLUGIN_WRAPPER("neofetch", cli_command_neofetch) +CLI_PLUGIN_WRAPPER("help", cli_command_help) +CLI_PLUGIN_WRAPPER("uptime", cli_command_uptime) +CLI_PLUGIN_WRAPPER("date", cli_command_date) +CLI_PLUGIN_WRAPPER("sysctl", cli_command_sysctl) +CLI_PLUGIN_WRAPPER("vibro", cli_command_vibro) +CLI_PLUGIN_WRAPPER("led", cli_command_led) +CLI_PLUGIN_WRAPPER("gpio", cli_command_gpio) +CLI_PLUGIN_WRAPPER("i2c", cli_command_i2c) + void cli_commands_init(Cli* cli) { - cli_add_command(cli, "!", CliCommandFlagParallelSafe, cli_command_info, (void*)true); - cli_add_command(cli, "info", CliCommandFlagParallelSafe, cli_command_info, NULL); - cli_add_command(cli, "device_info", CliCommandFlagParallelSafe, cli_command_info, (void*)true); - cli_add_command(cli, "source", CliCommandFlagParallelSafe, cli_command_src, NULL); - cli_add_command(cli, "src", CliCommandFlagParallelSafe, cli_command_src, NULL); + cli_add_command(cli, "!", CliCommandFlagParallelSafe, cli_command_info_wrapper, (void*)true); + cli_add_command(cli, "info", CliCommandFlagParallelSafe, cli_command_info_wrapper, NULL); + cli_add_command( + cli, "device_info", CliCommandFlagParallelSafe, cli_command_info_wrapper, (void*)true); + cli_add_command(cli, "source", CliCommandFlagParallelSafe, cli_command_src_wrapper, NULL); + cli_add_command(cli, "src", CliCommandFlagParallelSafe, cli_command_src_wrapper, NULL); cli_add_command( cli, "neofetch", CliCommandFlagParallelSafe | CliCommandFlagHidden, - cli_command_neofetch, + cli_command_neofetch_wrapper, NULL); - cli_add_command(cli, "?", CliCommandFlagParallelSafe, cli_command_help, NULL); - cli_add_command(cli, "help", CliCommandFlagParallelSafe, cli_command_help, NULL); + cli_add_command(cli, "?", CliCommandFlagParallelSafe, cli_command_help_wrapper, NULL); + cli_add_command(cli, "help", CliCommandFlagParallelSafe, cli_command_help_wrapper, NULL); - cli_add_command(cli, "uptime", CliCommandFlagDefault, cli_command_uptime, NULL); - cli_add_command(cli, "date", CliCommandFlagParallelSafe, cli_command_date, NULL); + cli_add_command(cli, "uptime", CliCommandFlagDefault, cli_command_uptime_wrapper, NULL); + cli_add_command(cli, "date", CliCommandFlagParallelSafe, cli_command_date_wrapper, NULL); cli_add_command(cli, "log", CliCommandFlagParallelSafe, cli_command_log, NULL); cli_add_command(cli, "l", CliCommandFlagParallelSafe, cli_command_log, NULL); - cli_add_command(cli, "sysctl", CliCommandFlagDefault, cli_command_sysctl, NULL); + cli_add_command(cli, "sysctl", CliCommandFlagDefault, cli_command_sysctl_wrapper, NULL); cli_add_command(cli, "top", CliCommandFlagParallelSafe, cli_command_top, NULL); cli_add_command(cli, "free", CliCommandFlagParallelSafe, cli_command_free, NULL); cli_add_command(cli, "free_blocks", CliCommandFlagParallelSafe, cli_command_free_blocks, 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", CliCommandFlagDefault, cli_command_gpio, NULL); - cli_add_command(cli, "i2c", CliCommandFlagDefault, cli_command_i2c, NULL); + cli_add_command(cli, "vibro", CliCommandFlagDefault, cli_command_vibro_wrapper, NULL); + cli_add_command(cli, "led", CliCommandFlagDefault, cli_command_led_wrapper, NULL); + cli_add_command(cli, "gpio", CliCommandFlagDefault, cli_command_gpio_wrapper, NULL); + cli_add_command(cli, "i2c", CliCommandFlagDefault, cli_command_i2c_wrapper, NULL); } diff --git a/applications/services/cli/cli_i.h b/applications/services/cli/cli_i.h index ed207b9f9a..f6d2bba7e0 100644 --- a/applications/services/cli/cli_i.h +++ b/applications/services/cli/cli_i.h @@ -62,12 +62,28 @@ void cli_putc(Cli* cli, char c); 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 +// CLI command wrapping to load from plugin file on SD card +// Just need to: +// - Use CLI_PLUGIN_WRAPPER("name", cmd_callback) +// - Replace callback usages with cmd_callback_wrapper +// - Add "name_cli" entry in app manifest to build as plugin +void cli_plugin_wrapper(const char* name, Cli* cli, FuriString* args, void* context); +#include #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); +#define CLI_PLUGIN_WRAPPER(plugin_name_without_cli_suffix, cli_command_callback) \ + void cli_command_callback##_wrapper(Cli* cli, FuriString* args, void* context) { \ + cli_plugin_wrapper(plugin_name_without_cli_suffix, cli, args, context); \ + } \ + static const FlipperAppPluginDescriptor cli_command_callback##_plugin_descriptor = { \ + .appid = CLI_PLUGIN_APP_ID, \ + .ep_api_version = CLI_PLUGIN_API_VERSION, \ + .entry_point = &cli_command_callback, \ + }; \ + const FlipperAppPluginDescriptor* cli_command_callback##_plugin_ep(void) { \ + UNUSED(cli_command_callback##_wrapper); \ + return &cli_command_callback##_plugin_descriptor; \ + } #ifdef __cplusplus } diff --git a/applications/services/crypto/application.fam b/applications/services/crypto/application.fam index 9a45c27db5..e42f4e0f7c 100644 --- a/applications/services/crypto/application.fam +++ b/applications/services/crypto/application.fam @@ -11,6 +11,6 @@ App( appid="crypto_start", apptype=FlipperAppType.STARTUP, entry_point="crypto_on_system_start", - sources=["crypto_start.c"], + sources=["crypto_cli.c"], order=10, ) diff --git a/applications/services/crypto/crypto_cli.c b/applications/services/crypto/crypto_cli.c index 5ef704b8bc..e3637b2756 100644 --- a/applications/services/crypto/crypto_cli.c +++ b/applications/services/crypto/crypto_cli.c @@ -317,15 +317,15 @@ static void crypto_cli(Cli* cli, FuriString* args, void* context) { furi_string_free(cmd); } -#include #include - -static const FlipperAppPluginDescriptor plugin_descriptor = { - .appid = CLI_PLUGIN_APP_ID, - .ep_api_version = CLI_PLUGIN_API_VERSION, - .entry_point = &crypto_cli, -}; - -const FlipperAppPluginDescriptor* crypto_cli_plugin_ep(void) { - return &plugin_descriptor; +CLI_PLUGIN_WRAPPER("crypto", crypto_cli) + +void crypto_on_system_start(void) { +#ifdef SRV_CLI + Cli* cli = furi_record_open(RECORD_CLI); + cli_add_command(cli, "crypto", CliCommandFlagDefault, crypto_cli_wrapper, NULL); + furi_record_close(RECORD_CLI); +#else + UNUSED(crypto_cli); +#endif } diff --git a/applications/services/crypto/crypto_start.c b/applications/services/crypto/crypto_start.c deleted file mode 100644 index 0ec3940f9f..0000000000 --- a/applications/services/crypto/crypto_start.c +++ /dev/null @@ -1,11 +0,0 @@ -#include - -static void crypto_cli_wrapper(Cli* cli, FuriString* args, void* context) { - cli_plugin_wrapper("crypto", cli, args, context); -} - -void crypto_on_system_start(void) { - Cli* cli = furi_record_open(RECORD_CLI); - cli_add_command(cli, "crypto", CliCommandFlagDefault, crypto_cli_wrapper, NULL); - furi_record_close(RECORD_CLI); -} diff --git a/applications/services/input/input.c b/applications/services/input/input.c index a298001e1d..78b565aa78 100644 --- a/applications/services/input/input.c +++ b/applications/services/input/input.c @@ -25,7 +25,7 @@ typedef struct { } InputPinState; /** Input CLI command handler */ -void input_cli(Cli* cli, FuriString* args, void* context); +void input_cli_wrapper(Cli* cli, FuriString* args, void* context); // #define INPUT_DEBUG @@ -79,12 +79,6 @@ const char* input_get_type_name(InputType type) { } } -#include - -static void input_cli_wrapper(Cli* cli, FuriString* args, void* context) { - cli_plugin_wrapper("input", cli, args, context); -} - int32_t input_srv(void* p) { UNUSED(p); @@ -102,8 +96,6 @@ int32_t input_srv(void* p) { #ifdef SRV_CLI Cli* cli = furi_record_open(RECORD_CLI); cli_add_command(cli, "input", CliCommandFlagParallelSafe, input_cli_wrapper, event_pubsub); -#else - UNUSED(input_cli_wrapper); #endif InputPinState pin_states[input_pins_count]; diff --git a/applications/services/input/input_cli.c b/applications/services/input/input_cli.c index 10a09cd42e..27f7dae72e 100644 --- a/applications/services/input/input_cli.c +++ b/applications/services/input/input_cli.c @@ -226,15 +226,5 @@ void input_cli(Cli* cli, FuriString* args, void* context) { furi_string_free(cmd); } -#include #include - -static const FlipperAppPluginDescriptor plugin_descriptor = { - .appid = CLI_PLUGIN_APP_ID, - .ep_api_version = CLI_PLUGIN_API_VERSION, - .entry_point = &input_cli, -}; - -const FlipperAppPluginDescriptor* input_cli_plugin_ep(void) { - return &plugin_descriptor; -} +CLI_PLUGIN_WRAPPER("input", input_cli) diff --git a/applications/services/loader/loader_cli.c b/applications/services/loader/loader_cli.c index 45acefa68d..15b4c914d8 100644 --- a/applications/services/loader/loader_cli.c +++ b/applications/services/loader/loader_cli.c @@ -141,15 +141,15 @@ static void loader_cli(Cli* cli, FuriString* args, void* context) { furi_record_close(RECORD_LOADER); } -#include #include - -static const FlipperAppPluginDescriptor plugin_descriptor = { - .appid = CLI_PLUGIN_APP_ID, - .ep_api_version = CLI_PLUGIN_API_VERSION, - .entry_point = &loader_cli, -}; - -const FlipperAppPluginDescriptor* loader_cli_plugin_ep(void) { - return &plugin_descriptor; +CLI_PLUGIN_WRAPPER("loader", loader_cli) + +void loader_on_system_start(void) { +#ifdef SRV_CLI + Cli* cli = furi_record_open(RECORD_CLI); + cli_add_command(cli, RECORD_LOADER, CliCommandFlagParallelSafe, loader_cli_wrapper, NULL); + furi_record_close(RECORD_CLI); +#else + UNUSED(loader_cli); +#endif } diff --git a/applications/services/loader/loader_start.c b/applications/services/loader/loader_start.c deleted file mode 100644 index 23122062f1..0000000000 --- a/applications/services/loader/loader_start.c +++ /dev/null @@ -1,12 +0,0 @@ -#include -#include "loader.h" - -static void loader_cli_wrapper(Cli* cli, FuriString* args, void* context) { - cli_plugin_wrapper("loader", cli, args, context); -} - -void loader_on_system_start(void) { - Cli* cli = furi_record_open(RECORD_CLI); - cli_add_command(cli, RECORD_LOADER, CliCommandFlagParallelSafe, loader_cli_wrapper, NULL); - furi_record_close(RECORD_CLI); -} diff --git a/applications/services/power/power_cli.c b/applications/services/power/power_cli.c index 0b2a9851b4..929a4fa786 100644 --- a/applications/services/power/power_cli.c +++ b/applications/services/power/power_cli.c @@ -108,15 +108,17 @@ void power_cli(Cli* cli, FuriString* args, void* context) { furi_string_free(cmd); } -#include #include +CLI_PLUGIN_WRAPPER("power", power_cli) -static const FlipperAppPluginDescriptor plugin_descriptor = { - .appid = CLI_PLUGIN_APP_ID, - .ep_api_version = CLI_PLUGIN_API_VERSION, - .entry_point = &power_cli, -}; +void power_on_system_start(void) { +#ifdef SRV_CLI + Cli* cli = furi_record_open(RECORD_CLI); -const FlipperAppPluginDescriptor* power_cli_plugin_ep(void) { - return &plugin_descriptor; + cli_add_command(cli, "power", CliCommandFlagParallelSafe, power_cli_wrapper, NULL); + + furi_record_close(RECORD_CLI); +#else + UNUSED(power_cli); +#endif } diff --git a/applications/services/power/power_start.c b/applications/services/power/power_start.c deleted file mode 100644 index 33e6901f1b..0000000000 --- a/applications/services/power/power_start.c +++ /dev/null @@ -1,11 +0,0 @@ -#include - -static void power_cli_wrapper(Cli* cli, FuriString* args, void* context) { - cli_plugin_wrapper("power", cli, args, context); -} - -void power_on_system_start(void) { - Cli* cli = furi_record_open(RECORD_CLI); - cli_add_command(cli, "power", CliCommandFlagParallelSafe, power_cli_wrapper, NULL); - furi_record_close(RECORD_CLI); -} diff --git a/applications/system/js_app/application.fam b/applications/system/js_app/application.fam index 62dd1d0367..988fedb03a 100644 --- a/applications/system/js_app/application.fam +++ b/applications/system/js_app/application.fam @@ -25,7 +25,7 @@ App( appid="js_cli", targets=["f7"], apptype=FlipperAppType.PLUGIN, - entry_point="js_cli_plugin_ep", + entry_point="js_cli_execute_plugin_ep", requires=["cli"], sources=[ "js_app.c", @@ -41,8 +41,8 @@ App( appid="js_app_start", apptype=FlipperAppType.STARTUP, entry_point="js_app_on_system_start", - sources=["js_start.c"], order=160, + sources=["js_app.c"], ) App( diff --git a/applications/system/js_app/js_app.c b/applications/system/js_app/js_app.c index 27084b3b51..572c32262a 100644 --- a/applications/system/js_app/js_app.c +++ b/applications/system/js_app/js_app.c @@ -204,15 +204,13 @@ void js_cli_execute(Cli* cli, FuriString* args, void* context) { furi_record_close(RECORD_STORAGE); } -#include #include - -static const FlipperAppPluginDescriptor plugin_descriptor = { - .appid = CLI_PLUGIN_APP_ID, - .ep_api_version = CLI_PLUGIN_API_VERSION, - .entry_point = &js_cli_execute, -}; - -const FlipperAppPluginDescriptor* js_cli_plugin_ep(void) { - return &plugin_descriptor; +CLI_PLUGIN_WRAPPER("js", js_cli_execute) + +void js_app_on_system_start(void) { +#ifdef SRV_CLI + Cli* cli = furi_record_open(RECORD_CLI); + cli_add_command(cli, "js", CliCommandFlagDefault, js_cli_execute_wrapper, NULL); + furi_record_close(RECORD_CLI); +#endif } diff --git a/applications/system/js_app/js_start.c b/applications/system/js_app/js_start.c deleted file mode 100644 index 2328601c57..0000000000 --- a/applications/system/js_app/js_start.c +++ /dev/null @@ -1,11 +0,0 @@ -#include - -static void js_cli_execute_wrapper(Cli* cli, FuriString* args, void* context) { - cli_plugin_wrapper("js", cli, args, context); -} - -void js_app_on_system_start(void) { - Cli* cli = furi_record_open(RECORD_CLI); - cli_add_command(cli, "js", CliCommandFlagDefault, js_cli_execute_wrapper, NULL); - furi_record_close(RECORD_CLI); -}