Как реализовать левый и правый курсор для редактирования текста на серийном UART? - PullRequest
0 голосов
/ 10 февраля 2019

Я реализую минимальную командную строку в последовательном терминале, используя плату TivaC от Texas Instruments.с помощью Putty

распознавание курсора уже включено приложением, поэтому мне не нужно удалять escape-последовательности, сгенерированные курсорами на терминале, такие как "esc [A", "esc [B" .. и т. д.

Однако в моем коде, где я храню ввод символов в массиве string [] размера 80, я не могу осуществить правую и левую правку курсора.если я нажимаю влево, я должен быть в состоянии переместить курсор в требуемое положение и уметь редактировать тексты.

Поведение: при нажатии левой клавиши на клавиатуре курсор долженперемещайтесь влево и позволяйте пользователю вводить персонажа, где бы он ни захотел.Однако в моем случае он может двигаться влево (уже включен в PUTYY), но не может добавить требуемый символ.

Например

$> echo hello

$> эхо Hellmo (символ введен на 5-й позиции)

идеальный вывод: -

hellmo

мой вывод: -

hellom

См. Код с комментариями: //left

getcUart0(); получает символы от пользователя.putsUart(char *string); помещает строку в сериал

void command_line(void)
{
    char char_input = 0;
    int char_count =0;

    // Get Input from User
    putsUart0("\r\n");
    putsUart0("\033[1;32m$>\033[0m");          //Print Input to let user know to start typing, foreground color:Yellow

    while(1)
    {
        //take input from user
        char_input = getcUart0();           

        //Exit on carriage return
        if (char_input == 13 || carriage_return)
        {
            string[char_count] = '\0';
            carriage_return = 0;
            char_count = 0;
            break;
        }

        // Cursor processing
        if (char_input == 27)
        {
            char next_1 = getcUart0();
            char next_2 = getcUart0();

             //nullify the behavior of up key
            if(next_1 == 91 && next_2 == 65)      //up
            {
                putsUart0("\033[B");
                char_input = '\0';
                continue;
            }
            //nullify the behavior of down key
            else if(next_1 == 91 && next_2 == 66) //down
            {
                putsUart0("\033[A");
                char_input = '\0';
                continue;
            }
            //left key 
            else if(next_1 == 91 && next_2 == 68) //left
            {
                int temp_count = char_count;
                char temp_inp = char_input;
                char_count--;
                string[temp_count] = temp_inp;
                putcUart0(string[temp_count]);
                continue;

            }
        }

        //Process backspace key
        if (char_input == 8 || char_input == 127)
        {
            //putsUart0("\r\nBackspace detect");

            if(char_count <= 0)
            {
                putsUart0("\033[C");

                continue;
            }
            else
            {
                putcUart0(' ');
                putsUart0("\033[D");
                char_count--;
                continue;
            }
        }

        //convert uppercase to lower before storing in string
        if (char_input >= 65 && char_input <= 90)
            string[char_count++] = char_input + 32;

        else
            string[char_count++] = char_input;

        //check for buffer overflow
        if (char_count == MAX_SIZE)
        {
            putsUart0("\r\nCan't exceed more than 80 chars");   

            reset_buffer();                                      
            *string = 0;

            break;
        }

    }

    putsUart0("\r\n");

}
...