mirror of
https://github.com/flipperdevices/flipperzero-firmware.git
synced 2025-12-12 12:51:22 +04:00
162 lines
5.2 KiB
C
162 lines
5.2 KiB
C
|
|
#include "nfc_cli_commands.h"
|
||
|
|
#include "nfc_cli_command_base_i.h"
|
||
|
|
|
||
|
|
/** Include new commands here */
|
||
|
|
#include "commands/raw/nfc_cli_command_raw.h"
|
||
|
|
#include "commands/apdu/nfc_cli_command_apdu.h"
|
||
|
|
#include "commands/dump/nfc_cli_command_dump.h"
|
||
|
|
#include "commands/mfu/nfc_cli_command_mfu.h"
|
||
|
|
#include "commands/nfc_cli_command_emulate.h"
|
||
|
|
#include "commands/nfc_cli_command_scanner.h"
|
||
|
|
#include "commands/nfc_cli_command_field.h"
|
||
|
|
|
||
|
|
#define TAG "NfcCliCommands"
|
||
|
|
|
||
|
|
/** Add new commands here */
|
||
|
|
static const NfcCliCommandDescriptor* nfc_cli_commands[] = {
|
||
|
|
&apdu_cmd,
|
||
|
|
&raw_cmd,
|
||
|
|
&emulate_cmd,
|
||
|
|
&mfu_cmd,
|
||
|
|
&scanner_cmd,
|
||
|
|
&dump_cmd,
|
||
|
|
&field_cmd,
|
||
|
|
};
|
||
|
|
|
||
|
|
size_t nfc_cli_command_get_count() {
|
||
|
|
return COUNT_OF(nfc_cli_commands);
|
||
|
|
}
|
||
|
|
|
||
|
|
const NfcCliActionDescriptor*
|
||
|
|
nfc_cli_command_get_action_by_name(const NfcCliCommandDescriptor* cmd, const FuriString* name) {
|
||
|
|
furi_assert(cmd);
|
||
|
|
furi_assert(name);
|
||
|
|
|
||
|
|
for(size_t i = 0; i < cmd->action_count; i++) {
|
||
|
|
const NfcCliActionDescriptor* action = cmd->actions[i];
|
||
|
|
if(furi_string_equal_str(name, action->name)) return action;
|
||
|
|
}
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
const NfcCliCommandDescriptor* nfc_cli_command_get_by_index(size_t index) {
|
||
|
|
furi_assert(index < COUNT_OF(nfc_cli_commands));
|
||
|
|
return nfc_cli_commands[index];
|
||
|
|
}
|
||
|
|
|
||
|
|
bool nfc_cli_command_has_multiple_actions(const NfcCliCommandDescriptor* cmd) {
|
||
|
|
furi_assert(cmd);
|
||
|
|
furi_check(cmd->action_count > 0);
|
||
|
|
return (cmd->action_count > 1);
|
||
|
|
}
|
||
|
|
|
||
|
|
const char* nfc_cli_command_get_name(const NfcCliCommandDescriptor* cmd) {
|
||
|
|
furi_assert(cmd);
|
||
|
|
return cmd->name;
|
||
|
|
}
|
||
|
|
|
||
|
|
CliCommandExecuteCallback nfc_cli_command_get_execute(const NfcCliCommandDescriptor* cmd) {
|
||
|
|
furi_assert(cmd);
|
||
|
|
return cmd->callback;
|
||
|
|
}
|
||
|
|
|
||
|
|
static inline const NfcCliKeyDescriptor* nfc_cli_action_get_key_by_name(
|
||
|
|
const NfcCliActionDescriptor* action,
|
||
|
|
const FuriString* name,
|
||
|
|
bool long_name) {
|
||
|
|
for(size_t i = 0; i < action->key_count; i++) {
|
||
|
|
const NfcCliKeyDescriptor* key = &action->keys[i];
|
||
|
|
const char* buf = long_name ? key->long_name : key->short_name;
|
||
|
|
if((buf != NULL) && furi_string_equal_str(name, buf)) return key;
|
||
|
|
}
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
const NfcCliKeyDescriptor*
|
||
|
|
nfc_cli_action_get_key_descriptor(const NfcCliActionDescriptor* action, FuriString* argument) {
|
||
|
|
furi_assert(action);
|
||
|
|
furi_assert(argument);
|
||
|
|
|
||
|
|
return nfc_cli_action_get_key_by_name(action, argument, furi_string_size(argument) > 1);
|
||
|
|
}
|
||
|
|
|
||
|
|
size_t nfc_cli_action_get_required_keys_count(const NfcCliActionDescriptor* action) {
|
||
|
|
furi_assert(action);
|
||
|
|
|
||
|
|
size_t required_key_count = 0;
|
||
|
|
for(size_t i = 0; i < action->key_count; i++) {
|
||
|
|
const NfcCliKeyDescriptor* key = &action->keys[i];
|
||
|
|
if(!key->features.required) continue;
|
||
|
|
required_key_count++;
|
||
|
|
}
|
||
|
|
return required_key_count;
|
||
|
|
}
|
||
|
|
|
||
|
|
static int nfc_cli_action_format_key_name(const NfcCliKeyDescriptor* key, FuriString* output) {
|
||
|
|
int len = 0;
|
||
|
|
FuriString* name = furi_string_alloc();
|
||
|
|
if(key->short_name && key->long_name) {
|
||
|
|
len = furi_string_printf(name, "-%s, --%s", key->short_name, key->long_name);
|
||
|
|
} else if(key->short_name && (key->long_name == NULL)) {
|
||
|
|
len = furi_string_printf(name, "-%s", key->short_name);
|
||
|
|
} else if((key->short_name == NULL) && key->long_name) {
|
||
|
|
len = furi_string_printf(name, "--%s", key->long_name);
|
||
|
|
}
|
||
|
|
|
||
|
|
const char* color = key->features.required ? ANSI_FLIPPER_BRAND_ORANGE : ANSI_RESET;
|
||
|
|
furi_string_printf(output, "%s%s%s", color, furi_string_get_cstr(name), ANSI_RESET);
|
||
|
|
furi_string_free(name);
|
||
|
|
return len;
|
||
|
|
}
|
||
|
|
|
||
|
|
void nfc_cli_action_format_info(const NfcCliActionDescriptor* action, FuriString* output) {
|
||
|
|
furi_assert(action);
|
||
|
|
furi_assert(output);
|
||
|
|
furi_string_printf(
|
||
|
|
output,
|
||
|
|
action->description ? "%s - %s\r\n\n" : "%s\r\n\n",
|
||
|
|
action->name,
|
||
|
|
action->description);
|
||
|
|
|
||
|
|
if(action->key_count == 0) return;
|
||
|
|
|
||
|
|
FuriString* buf = furi_string_alloc();
|
||
|
|
furi_string_cat_printf(
|
||
|
|
output,
|
||
|
|
ANSI_FG_BR_GREEN "Keys " ANSI_FLIPPER_BRAND_ORANGE "(required) " ANSI_RESET
|
||
|
|
"(optional):\r\n");
|
||
|
|
|
||
|
|
for(size_t i = 0; i < action->key_count; i++) {
|
||
|
|
const NfcCliKeyDescriptor* key = &action->keys[i];
|
||
|
|
|
||
|
|
int len = nfc_cli_action_format_key_name(key, buf);
|
||
|
|
furi_string_cat_printf(output, "%s", furi_string_get_cstr(buf));
|
||
|
|
|
||
|
|
if(key->description) {
|
||
|
|
const int offset = 20;
|
||
|
|
furi_string_cat_printf(
|
||
|
|
output, ANSI_CURSOR_RIGHT_BY("%d") "%s", offset - len, key->description);
|
||
|
|
}
|
||
|
|
furi_string_cat_printf(output, "\r\n");
|
||
|
|
}
|
||
|
|
furi_string_free(buf);
|
||
|
|
}
|
||
|
|
|
||
|
|
void nfc_cli_command_format_info(const NfcCliCommandDescriptor* cmd, FuriString* output) {
|
||
|
|
furi_assert(cmd);
|
||
|
|
furi_assert(output);
|
||
|
|
furi_string_printf(output, "%s - %s\r\n", cmd->name, cmd->description);
|
||
|
|
if(cmd->action_count > 1) {
|
||
|
|
furi_string_cat_printf(output, "Possible actions: \r\n");
|
||
|
|
|
||
|
|
for(size_t i = 0; i < cmd->action_count; i++) {
|
||
|
|
const NfcCliActionDescriptor* action = cmd->actions[i];
|
||
|
|
furi_string_cat_printf(
|
||
|
|
output,
|
||
|
|
action->description ? "\t%s\t-\t%s\r\n" : "%s\r\n",
|
||
|
|
action->name,
|
||
|
|
action->description);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|