فهرست منبع

[FL-1239] CLI commands readable list #464

Co-authored-by: あく <alleteam@gmail.com>
gornekich 4 سال پیش
والد
کامیت
5000424c42
3فایلهای تغییر یافته به همراه31 افزوده شده و 11 حذف شده
  1. 4 4
      applications/cli/cli.c
  2. 17 5
      applications/cli/cli_commands.c
  3. 10 2
      applications/cli/cli_i.h

+ 4 - 4
applications/cli/cli.c

@@ -5,7 +5,7 @@
 
 Cli* cli_alloc() {
     Cli* cli = furi_alloc(sizeof(Cli));
-    CliCommandDict_init(cli->commands);
+    CliCommandTree_init(cli->commands);
 
     cli->mutex = osMutexNew(NULL);
     furi_check(cli->mutex);
@@ -126,7 +126,7 @@ void cli_enter(Cli* cli) {
 
     // Search for command
     furi_check(osMutexAcquire(cli->mutex, osWaitForever) == osOK);
-    CliCommand* cli_command = CliCommandDict_get(cli->commands, command);
+    CliCommand* cli_command = CliCommandTree_get(cli->commands, command);
     furi_check(osMutexRelease(cli->mutex) == osOK);
     if(cli_command) {
         cli_nl();
@@ -190,7 +190,7 @@ void cli_add_command(Cli* cli, const char* name, CliCallback callback, void* con
     c.context = context;
 
     furi_check(osMutexAcquire(cli->mutex, osWaitForever) == osOK);
-    CliCommandDict_set_at(cli->commands, name_str, c);
+    CliCommandTree_set_at(cli->commands, name_str, c);
     furi_check(osMutexRelease(cli->mutex) == osOK);
 
     string_clear(name_str);
@@ -207,7 +207,7 @@ void cli_delete_command(Cli* cli, const char* name) {
     } while(name_replace != STRING_FAILURE);
 
     furi_check(osMutexAcquire(cli->mutex, osWaitForever) == osOK);
-    CliCommandDict_erase(cli->commands, name_str);
+    CliCommandTree_erase(cli->commands, name_str);
     furi_check(osMutexRelease(cli->mutex) == osOK);
 
     string_clear(name_str);

+ 17 - 5
applications/cli/cli_commands.c

@@ -10,11 +10,23 @@ void cli_command_help(string_t args, void* context) {
     printf("Commands we have:");
 
     furi_check(osMutexAcquire(cli->mutex, osWaitForever) == osOK);
-    CliCommandDict_it_t it;
-    for(CliCommandDict_it(it, cli->commands); !CliCommandDict_end_p(it); CliCommandDict_next(it)) {
-        CliCommandDict_itref_t* ref = CliCommandDict_ref(it);
-        printf(" ");
-        printf(string_get_cstr(ref->key));
+    // Get the middle element
+    CliCommandTree_it_t it_mid;
+    uint8_t cmd_num = CliCommandTree_size(cli->commands);
+    uint8_t i = cmd_num / 2 + cmd_num % 2;
+    for(CliCommandTree_it(it_mid, cli->commands); i; --i, CliCommandTree_next(it_mid))
+        ;
+    // Use 2 iterators from start and middle to show 2 columns
+    CliCommandTree_it_t it_i;
+    CliCommandTree_it_t it_j;
+    for(CliCommandTree_it(it_i, cli->commands), CliCommandTree_it_set(it_j, it_mid);
+        !CliCommandTree_it_equal_p(it_i, it_mid);
+        CliCommandTree_next(it_i), CliCommandTree_next(it_j)) {
+        CliCommandTree_itref_t* ref = CliCommandTree_ref(it_i);
+        printf("\r\n");
+        printf("%-30s", string_get_cstr(ref->key_ptr[0]));
+        ref = CliCommandTree_ref(it_j);
+        printf(string_get_cstr(ref->key_ptr[0]));
     };
     furi_check(osMutexRelease(cli->mutex) == osOK);
 

+ 10 - 2
applications/cli/cli_i.h

@@ -6,15 +6,23 @@
 #include <api-hal.h>
 
 #include <m-dict.h>
+#include <m-bptree.h>
 
 #define CLI_LINE_SIZE_MAX
+#define CLI_COMMANDS_TREE_RANK 4
 
 typedef struct {
     CliCallback callback;
     void* context;
 } CliCommand;
 
-DICT_DEF2(CliCommandDict, string_t, STRING_OPLIST, CliCommand, M_POD_OPLIST)
+BPTREE_DEF2(
+    CliCommandTree,
+    CLI_COMMANDS_TREE_RANK,
+    string_t,
+    STRING_OPLIST,
+    CliCommand,
+    M_POD_OPLIST)
 
 typedef enum {
     CliSymbolAsciiSOH = 0x01,
@@ -31,7 +39,7 @@ typedef enum {
 } CliSymbols;
 
 struct Cli {
-    CliCommandDict_t commands;
+    CliCommandTree_t commands;
     osMutexId_t mutex;
     string_t line;
 };