mirror of
https://github.com/DarkFlippers/unleashed-firmware.git
synced 2026-05-12 05:55:03 +00:00
eea53491de
* feat: FuriThread stdin * ci: fix f18 * feat: stdio callback context * feat: FuriPipe * POTENTIALLY EXPLOSIVE pipe welding * fix: non-explosive welding * Revert welding * docs: furi_pipe * feat: pipe event loop integration * update f18 sdk * f18 * docs: make doxygen happy * fix: event loop not triggering when pipe attached to stdio * fix: partial stdout in pipe * allow simultaneous in and out subscription in event loop * feat: vcp i/o * feat: cli ansi stuffs and history * feat: more line editing * working but slow cli rewrite * restore previous speed after 4 days of debugging 🥲 * fix: cli_app_should_stop * fix: cli and event_loop memory leaks * style: remove commented out code * ci: fix pvs warnings * fix: unit tests, event_loop crash * ci: fix build * ci: silence pvs warning * feat: cli gpio * ci: fix formatting * Fix memory leak during event loop unsubscription * Event better memory leak fix * feat: cli completions * Merge remote-tracking branch 'origin/dev' into portasynthinca3/3928-cli-threads * merge fixups * temporarily exclude speaker_debug app * pvs and unit tests fixups * feat: commands in fals * move commands out of flash, code cleanup * ci: fix errors * fix: run commands in buffer when stopping session * speedup cli file transfer * fix f18 * separate cli_shell into modules * fix pvs warning * fix qflipper refusing to connect * remove temp debug logs * remove erroneous conclusion * Fix memory leak during event loop unsubscription * Event better memory leak fix * unit test for the fix * improve thread stdio callback signatures * pipe stdout timeout * update api symbols * fix f18, formatting * fix pvs warnings * increase stack size, hope to fix unit tests * cli completions * more key combos * commands in fals * move commands out of flash * ci: fix errors * speedup cli file transfer * merge fixups * fix f18 * cli: revert flag changes * cli: fix formatting * cli, fbt: loopback perf benchmark * thread, event_loop: subscribing to thread flags * cli: signal internal events using thread flags, improve performance * fix f18, formatting * event_loop: fix crash * storage_cli: increase write_chunk buffer size again * cli: explanation for order=0 * thread, event_loop: thread flags callback refactor * cli: increase stack size * cli: rename cli_app_should_stop -> cli_is_pipe_broken_or_is_etx_next_char * cli: use plain array instead of mlib for history * cli: prepend file name to static fns * cli: fix formatting * cli_shell: increase stack size * Now cli_shell can be customized with another motd and another command set * Added custom motd callback definition * Now user can alloc and free his own cli command set * cli_vcp can now restart shell with another command set * Help command modified to show available commands from different command sets * Api adjustement * Reworked nfc_cli to start new shell with another command set * Revert custom shell changes from vcp * Custom motd callback moved to cli_shell * Cli Shell now can be started from ongoing cli command * Help command moved to a separate function so it can be used for custom shell * Now nfc command spawns separate shell for further nfc commands * cli_shell: give up pipe to command thread * fix formatting * cli_shell: separate into toolbox * speaker_debug: fix * fix: format * Merge branch 'portasynthinca3/3928-3929-cli-fals-threads' into portasynthinca3/3965-cli_shell-toolbox * fix merge * fix. merge. * fix formatting * fix: cmd flags * fix: formatting * Added basic command descriptor structs and macros * Basic nfc commands definitions added * Nfc cli commands collection and functions added * Raw skeleton of nfc cli processor added * cli: increase default stack depth * New callbacks for ctx alloc / free added * nfc_cli moved to cli folder * Some more logic for command processor * Scanner command no works via command_processor * plugin manifest adj * Argument descriptors were removed, now only keys left * Some helper command function implemented * Command processor logic now mostly works * Added all parsers and dummy implementation of raw cmd * Now processor checks duplicated keys and treat them as errors * Some renamings * Arguments processing moved to separate function * Now command processor can reuse context of previuos command for the next one if it's allowed * can_reuse callback added for checking if context can be reused * command processor is now freed on nfc cli exit * Some cleanups * First working version of raw command * Now input data are placed directly to bit buffer * Added tag * Introduced request/response structs * Moved raw command to a separate folder * Moved some common types to header * Added protocol specific handlers for iso14a and felica * Opened felica crc header for referencing * Added handler for iso14443_3b * Opened iso15693_3_poller for referencing * Added iso15693_3 handler for raw command * NfcCliRawError enum introduced for response result * Refactored handlers implementation * Formatting functions now added as helpers * New printing result logic * Not present error value added to enum * Timeout added to raw command * Command processor now supports multivalue keys * Apdu command implementation added * NfcScanner moved to helpers and command now uses it * Helper now can format protocol names * Dump command added * Added some more functions to scanner helper * Dump main logic simplified * Dump handlers moved to protocols folder * Protocol parser added to simplify searching protocol by name * Protocol and key arguments added to dump command * Cleanups * Apdu now parses protocol using helper parser * Raw now parses protocol using helper parser * Wrong naming fix * Emulate command added to cli * Description added to action descriptor and command macros * Description field added to all commands * Removed unnecessary enum for commands * Added functions for formatting command and action info * Proper error messages and help added * Fix for unsupported single action command * Function renamed to more appropriate * Field command moved to all other commands * Cleanups * Nfc commands modified with new cli shell * Removed previous nfc_cli.c after merge * Removed nfc_cli.h header * Some renamings and cleanups * Some comments and instructions added * Some comments and instructions added * TODOs removed * Fix for missing parse callback * Added not implemented dummy for mfu actions, for now * Fix name mismatch * Remove unneeded header * Mfu command moved to separate folder, also raw info action logic added * Dictionary with id/vendors added to assets. It is used by nfc_cli_mfu_info_get_vendor function * One more unneeded header removed * Moved mfu info action to a separate file * Info action now uses sync mfu poller * mfu rdbl action added * wrbl action added for mfu command * Some formatting for rdbl command * Function for formatting mfu errors added * All mfu actions now show errors in the same way * Fix error with sync poller. Previously when read failed function returned ErrorNone, now it processes iso14a error to get proper value * Make PVS happy * Nfc cli now doesn't start if desktop app is running * Make action description look more common * Scanner now has -t key and can show detected protocol hierarchies * Apdu now checks max input payload data * Proper format * Proper error handling added to dump command * Timeout key added dump command * Fix merge issue * formatting * Pragma pack replaced with FURI_PACKED * Fix felica memory leak --------- Co-authored-by: Anna Antonenko <portasynthinca3@gmail.com> Co-authored-by: Georgii Surkov <georgii.surkov@outlook.com> Co-authored-by: あく <alleteam@gmail.com> Co-authored-by: hedger <hedger@users.noreply.github.com> Co-authored-by: hedger <hedger@nanode.su>
131 lines
6.1 KiB
C
131 lines
6.1 KiB
C
#pragma once
|
|
|
|
#include "nfc_cli_command_base.h"
|
|
#include <toolbox/cli/cli_ansi.h>
|
|
#include <nfc/nfc.h>
|
|
#include <nfc/protocols/nfc_protocol.h>
|
|
#include "nfc_cli_command_processor.h"
|
|
|
|
/**
|
|
* @brief How to add command.
|
|
*
|
|
* There are 3 possible option on how to add new command to nfc_cli:
|
|
*
|
|
* @see Option 1 "Add action command directly to nfc_shell"
|
|
*
|
|
* In this case command will be invoked with argument string from nfc_shell.
|
|
* Command registration must be performed directly by user.
|
|
*
|
|
* Steps:
|
|
* 1. Add new function for command to nfc_cli.c
|
|
* 2. In nfc_cli_alloc function register command using cli_registry_add_command after nfc_cli_subscribe_commands
|
|
*
|
|
* This option is NOT RECOMENDED, because such command will not have any 'help'
|
|
* processing and parsing error checks. Argument parsing must also be done by hand.
|
|
*
|
|
* --------------------------------------------------------------------------
|
|
*
|
|
* @see Option 2 "Add action command to collection without further processing"
|
|
*
|
|
* In this case command will be invoked with argument string from nfc_shell.
|
|
* nfc_cli_command_processor is skipped, so argument handling is up to the developer.
|
|
*
|
|
* Steps:
|
|
* 1. Add new pair of nfc_cli_command_<cmd>.c/.h files to /commands folder
|
|
* 2. Define const NfcCliCommandDescriptor instance in .c file and its extern definition in .h file
|
|
* 3. Include .h file to nfc_cli_commands.c file below comment "Include new commands here"
|
|
* 4. Add new command reference to nfc_cli_commands array
|
|
* 5. Add path to nfc_cli_command_<cmd>.c file into 'cli_nfc' plugin in application.fam file
|
|
*
|
|
* This option suites for simple commands with no any parameters.
|
|
* @see nfc_cli_command_field.c implementation as an example.
|
|
*
|
|
* --------------------------------------------------------------------------
|
|
*
|
|
* @see Option 3 "Add action command to collection with full processing"
|
|
*
|
|
* In this nfc_cli_command_processor will be invoked for parsing command arguments
|
|
* and action execution. Also it will handle errors and help printing.
|
|
*
|
|
* Steps:
|
|
* 1. Add new pair of nfc_cli_command_<cmd>.c/.h files to /commands folder
|
|
* 2. Use macro ADD_NFC_CLI_COMMAND to define command in .c file
|
|
* 3. Define command extern in .h file, using command name from macro in form of "<name>_cmd"
|
|
* 4. Add all desired actions and keys to your command
|
|
* 5. Include .h file to nfc_cli_commands.c file below comment "Include new commands here"
|
|
* 6. Add new command reference to nfc_cli_commands array
|
|
* 7. Add path to nfc_cli_command_<cmd>.c file into 'cli_nfc' plugin in application.fam file
|
|
*
|
|
* This option suites for "difficult" commands which has actions with lots of keys.
|
|
* @see nfc_cli_command_emulate.c implementation as an example.
|
|
*
|
|
*/
|
|
|
|
/**
|
|
* @brief Used to decorate argument with some properties
|
|
*/
|
|
typedef struct {
|
|
bool required : 1; /**< Command always needs this argument. Missing arguments with this set to true will result execution error.*/
|
|
bool parameter : 1; /**< Such argument requires value after its name, otherwise it is a simple on/off switch */
|
|
bool multivalue : 1; /**< Such argument can take multiple values after its name, like this "-key value1 value2 .. valueN" */
|
|
} FURI_PACKED NfcCliKeyFeatureSupport;
|
|
|
|
/**
|
|
* @brief Describes key for action
|
|
*/
|
|
struct NfcCliKeyDescriptor {
|
|
NfcCliKeyFeatureSupport features; /**< Features supported defining key behaviour */
|
|
const char* long_name; /**< Long key name starts with '--' symbol in argument string */
|
|
const char* short_name; /**< Short key name starts with '-' symbol in argument string */
|
|
const char* description; /**< Key description showed in help */
|
|
NfcCliArgParseCallback parse; /**< Parsing callback */
|
|
};
|
|
|
|
/**
|
|
* @brief Describes action
|
|
*/
|
|
struct NfcCliActionDescriptor {
|
|
const char* name; /**< Action name MUST be the first argument after command.*/
|
|
const char* description; /**< Description showed in help */
|
|
size_t key_count; /**< Amount of key entries in keys array */
|
|
const NfcCliKeyDescriptor* keys; /**< Keys available for action */
|
|
|
|
NfcCliActionHandlerCallback execute; /**< Action callback, invoked if parsing is ok */
|
|
NfcCliActionContextAlloc alloc; /**< Allocates action context during command processing */
|
|
NfcCliActionContextFree free; /**< Frees action context */
|
|
NfcCliActionContextCanReuse can_reuse; /**< Checks context reuse possibility */
|
|
};
|
|
|
|
/**
|
|
* @brief Describes command
|
|
*/
|
|
struct NfcCliCommandDescriptor {
|
|
const char* name; /** Used to register command in cli shell */
|
|
const char* description; /**< Description showed in help */
|
|
size_t action_count; /** Amount of actions available in scope of this particular command */
|
|
const NfcCliActionDescriptor** actions; /**< Actions available for command */
|
|
CliCommandExecuteCallback callback; /** Entry point for command */
|
|
};
|
|
|
|
/**
|
|
* @brief This macro simplifies command creation. It fills instance of
|
|
* NfcCliCommandDescriptor and generates a callback which invokes
|
|
* nfc_cli_command_processor inside
|
|
*/
|
|
#define ADD_NFC_CLI_COMMAND(name, description, actions) \
|
|
static void nfc_cli_command_##name##_callback( \
|
|
PipeSide* pipe, FuriString* args, void* context); \
|
|
\
|
|
const NfcCliCommandDescriptor name##_cmd = { \
|
|
#name, \
|
|
#description, \
|
|
COUNT_OF(actions), \
|
|
actions, \
|
|
nfc_cli_command_##name##_callback, \
|
|
}; \
|
|
\
|
|
static void nfc_cli_command_##name##_callback( \
|
|
PipeSide* pipe, FuriString* args, void* context) { \
|
|
nfc_cli_command_processor_run(&name##_cmd, pipe, args, context); \
|
|
}
|