#keyboard #ada
#клавиатура #ada
Вопрос:
В рамках учебного проекта продолжительностью в семестр мы программируем систему model train. Частью этого является интерфейс монитора для просмотра текущего состояния и ввод с клавиатуры системных команд. При получении вводимых с клавиатуры данных мы не должны их отображать.
Есть ли способ отключить отображение входных данных на экране или как мне получить их из потока ввода с клавиатуры?
В настоящее время использую пакет Ada.Text_IO и протестировал как с Get, так и с Get_Immediate.
Дополнительные
Мы разрабатываем не для системы Linux. Мы разрабатываем для MaRTE_OS то, что в принципе можно назвать автономным терминалом. Эта система подключена к десяткам аппаратных плат, большинство из которых я не видел и даже не мог бы сказать вам, для чего они там.
Что касается монитора, экран будет полностью заполнен выводом, который часто обновляется (часть системы, у меня есть, обновляет информацию примерно за 0,05 секунды). Нет возможности пытаться не отображать информацию, а затем сдвигать обратно строку (также на самом деле ничего не печатается по строке за раз, класс отображения печатает то, что ему нужно, прямо в столбец, строку на экране).
Пользователю, вводящему ввод, не нужно проверять входные данные, поскольку система должна просто прочитать их и сгенерировать команду для обработки (также у нее есть команда ОШИБКИ, которая предназначена для неверных входных данных и просто ничего не делает, но позволяет системе вернуться в состояние ожидания).
Ответ №1:
Я не знаю Ada, но вы можете запустить следующие команды в системах unix: stty -echo
и stty -noecho
. Они переключают режим эха. Я использую это на многих разных языках, и это всегда работает.
Ответ №2:
Во-первых, я бы проверил требование. Я вижу, что команда не повторяется, но отмена echo кажется немного враждебной пользователю. В качестве альтернативы, если ваша консоль поддерживает управляющие последовательности ANSI VT100, вы могли бы использовать один из clear line
кодов.
Ответ №3:
Основываясь на предложении trashgods :
with Ada.Text_Io;
with Ada.Characters.Latin_1;
procedure Bsmain is
Achar : Character := ' ';
Escape: Character renames Ada.Characters.Latin_1.ESC;
begin
Ada.Text_Io.Put (Escape amp; "[8m"); -- invisible text mode
while Achar /= 'q' loop -- q=quit
Ada.Text_Io.Get (Achar);
Ada.Text_Io.Put (Escape amp; "[1A"); -- move cursor back up a line
end loop;
Ada.Text_Io.Put (Escape amp; "[m"); -- restore back to normal text mode
end Bsmain;
Ответ №4:
Если у вас есть необходимый доступ, вы можете настроить прерывание клавиатуры, тогда вы могли бы «отключить их при прохождении».