Вложенный переключатель / корпус внутри while l oop и! Console.KeyAvailable C# - PullRequest
0 голосов
/ 13 июля 2020

В настоящее время я работаю над проектом, в котором используются энкодеры для отслеживания положения ряда ходовых винтов. Этот блок кода используется для захвата положения каждого кодировщика и отображения его пользователю с помощью 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 в первом?

1 Ответ

0 голосов
/ 13 июля 2020

Вам необходимо проверить, доступен ли ключ перед чтением ключа, например:

  long Position0 = 0;
  long Position1 = 0;
  long Position2 = 0;
  bool isEnd = false;
  while ( !isEnd )
  {
    Position0 = encoder0.Position;
    Position1 = encoder1.Position;
    Position2 = encoder2.Position;
    //Position0++; Position1++; Position2++;
    float LinearPosition0 = Convert.ToSingle(Position0) / 400;
    float LinearPosition1 = Convert.ToSingle(Position1) / 400;
    float LinearPosition2 = Convert.ToSingle(Position2) / 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);
    Console.WriteLine("z Position: {0:0.0000##} mm", LinearPosition2);
    if ( Console.KeyAvailable )
      switch ( Console.ReadKey(true).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.");
          isEnd = true;
          break;
      }
  }

Вы также можете скрыть курсор, если необходимо.

Console.CursorVisible = false;

Анимированный GIF

...