Я реализую минимальную командную строку в последовательном терминале, используя плату 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");
}