Selaa lähdekoodia

update: history commands

wang904 2 vuotta sitten
vanhempi
commit
aa64a3a375
1 muutettua tiedostoa jossa 67 lisäystä ja 8 poistoa
  1. 67 8
      user/apps/shell/shell.c

+ 67 - 8
user/apps/shell/shell.c

@@ -9,7 +9,7 @@
 #include "cmd.h"
 
 #define pause_cpu() asm volatile("pause\n\t");
-
+#define mem_history 1024
 /**
  * @brief 循环读取每一行
  *
@@ -21,9 +21,11 @@
 int shell_readline(int fd, char *buf);
 void print_ascii_logo();
 extern char *shell_current_path;
-
-
-
+//保存的历史命令
+char history_commands[mem_history][256];
+int count_history;
+//现在对应的命令
+int pointer;
 /**
  * @brief shell主循环
  *
@@ -31,7 +33,8 @@ extern char *shell_current_path;
  */
 void main_loop(int kb_fd)
 {
-
+    count_history = 0;
+    pointer = 1;
     unsigned char input_buffer[INPUT_BUFFER_SIZE] = {0};
 
     // 初始化当前工作目录的路径
@@ -40,7 +43,6 @@ void main_loop(int kb_fd)
     memset(shell_current_path, 0, 3);
     shell_current_path[0] = '/';
     shell_current_path[1] = '\0';
-
     // shell命令行的主循环
     while (true)
     {
@@ -56,10 +58,19 @@ void main_loop(int kb_fd)
 
         if (count)
         {
+            char *command_origin[strlen(input_buffer)];
+            strcpy(command_origin, input_buffer);
             int cmd_num = parse_command(input_buffer, &argc, &argv);
+
             printf("\n");
             if (cmd_num >= 0)
+            {
+                //加入历史命令
+                strcpy(history_commands[count_history], command_origin);
+                count_history++;
+                pointer = count_history;
                 shell_run_built_in_command(cmd_num, argc, argv);
+            }
         }
         else
             printf("\n");
@@ -80,7 +91,37 @@ int main()
     while (1)
         ;
 }
-
+/**
+ * @brief 清除缓冲区
+ *
+ * @param count 缓冲区大小
+ * @param buf 缓冲区内容
+ */
+void clear_command(int count, char *buf)
+{
+    for (int i = 0; i < count; i++)
+    {
+        printf("%c", '\b');
+    }
+    memset(buf, 0, sizeof(buf));
+}
+/**
+ * @brief 切换命令(写入到缓冲区)
+ *
+ * @param buf 缓冲区
+ * @param type 如果为1,就向下,如果为-1,就向上
+ */
+void change_command(char *buf, int type)
+{
+    pointer -= type;
+    //处理边界
+    if (pointer >= count_history)
+        pointer--;
+    if (pointer < 0)
+        pointer++;
+    strcpy(buf, history_commands[pointer]);
+    printf("%s", buf);
+}
 /**
  * @brief 循环读取每一行
  *
@@ -96,10 +137,28 @@ int shell_readline(int fd, char *buf)
     while (1)
     {
         key = keyboard_analyze_keycode(fd);
+        //向上方向键
+        if (count_history != 0 && key == 0xc8)
+        {
+            clear_command(count, buf);
+            count = 0;
+            //向历史
+            change_command(buf, 1);
+            count = strlen(buf);
+        }
+        //向下方向键
+        if (count_history != 0 && key == 0x50)
+        {
+            clear_command(count, buf);
+            count = 0;
+            //向现在
+            change_command(buf, -1);
+            count = strlen(buf);
+        }
         if (key == '\n')
             return count;
 
-        if (key)
+        if (key && key != 0x50 && key != 0xc8)
         {
             if (key == '\b')
             {