В настоящее время я работаю над проектом, в котором используются энкодеры для отслеживания положения ряда ходовых винтов. Этот блок кода используется для захвата положения каждого кодировщика и отображения его пользователю с помощью while l oop (ни одна клавиша не нажата), а также дает им возможность сбросить любую из трех позиций на ноль ( нажав на клавиатуре либо 'x', 'y' или 'z').
Как есть, пользователю нужно будет один раз нажать клавишу 'x', чтобы обнулить x-позицию, нажмите ' y »2 раза, чтобы обнулить y-позицию,« z »3 раза, чтобы обнулить z-позицию и 4 раза, чтобы завершить программу. Количество раз, которое необходимо нажать клавишу, чтобы переключение / случай произошли, соответствует его числовому значению в списке случаев. Однако мне нужно, чтобы каждая клавиша была нажата только один раз, чтобы действие произошло. Как мне go исправить структуру switch / case (или что-то еще), чтобы это произошло?
Кроме того, похоже, не нравится! Console.KeyAvaible в первом операторе switch чтобы проверить, была ли нажата клавиша. Ошибка: «не удается преобразовать bool в System.ConsoleKey». Есть ли другой способ сформулировать это?
while (true){
long Position0 = encoder0.Position;
long Position1 = encoder1.Position;
long Position2 = encoder2.Position;
ConsoleKeyInfo input = Console.ReadKey();
switch (input.Key){
case !Console.KeyAvailable:
// initialize encoder positions and do math to convert to mm
float Position0f = Convert.ToSingle(Position0);
float Position1f = Convert.ToSingle(Position1);
float Position2f = Convert.ToSingle(Position2);
float LinearPosition0 = Position0f / 400;
float LinearPosition1 = Position1f / 400;
float LinearPosition2 = Position2f / 400;
Console.SetCursorPosition(0, 0);
Console.WriteLine("x Position: {0:0.0000##} mm", LinearPosition0);
Console.SetCursorPosition(0, 1);
Console.WriteLine("y Position: {0:0.0000##} mm", LinearPosition1);
Console.SetCursorPosition(0, 2);
continue;
default:
switch (input.Key){
case ConsoleKey.X:
Console.WriteLine("\nYou selected X!");
Position0 = 0;
break;
case ConsoleKey.Y:
Console.WriteLine("\nYou selected Y!");
Position1 = 0;
break;
case ConsoleKey.Z:
Console.WriteLine("\nYou selected Z!");
Position2 = 0;
break;
case ConsoleKey.Escape:
Console.WriteLine("\nYou selected Esc! Exiting program.");
break;
default:
break;
}
break;
}
}
Помимо проблемы с клавишами, позиция, отображаемая в первом операторе if, не изменяется. Где я должен инициализировать Position0 / 1/2, чтобы их можно было сбросить до нуля во втором операторе if, но при этом они будут обновляться каждые l oop в первом?