Прежде всего, нам нужно установить, как работает ваша программа.
Выполняет ли она одну команду, ждет, а затем выполняет следующую команду? Или он выполняет команды одновременно? (например, двигайся и делай что-нибудь еще)
Я полагаю, вы захотите, чтобы он выполнял команды по порядку, а не какую-то сложную многопоточность, которую ваша моторная система может не поддерживать.
Чтобы заставить вашего робота двигаться медленно, я бы предложил создать метод Move (), который принимает параметр, количество времени, которое вы хотите потратить на перемещение, например:
public void Move(int numberOfSeconds)
{
while (numberOfSeconds > 0)
{
myRobot.MotorOn();
Thread.Sleep(2000);
myRobot.MotorOff();
Thread.Sleep(500);
numberOfSeconds -= 2;
}
}
Это не точно, но это один из способов сделать это.
Если вы, например, позвоните в Move (10), ваш робот будет двигаться в течение 10 секунд и будет останавливаться каждые 2 секунды на полсекунды.
Что касается вопросов, связанных с потоком программ, вы можете подумать о них как о списке инструкций:
ПЕРЕМЕЩАТЬ ВПЕРЕД
СТОП
ПРОВЕРЬТЕ ОБЪЕКТ
ВРАЩАЙТЕСЬ, ЧТОБЫ НАЦЕЛИТЬСЯ НА ОБЪЕКТ
ДВИГАТЬСЯ ВПЕРЕД
СТОП
и т.д.
Таким образом, в главном цикле управления программой, предполагая, что вызовы являются синхронными (т. Е. Ваша программа останавливается во время выполнения команды, как в приведенном выше методе Move), вы можете просто иметь несколько операторов IF (или переключатель )
public void Main()
{
// What calculations should the robot do?
If (someCalculations == someValue)
{
// Rotate the robot to face the object
robot.RotateRight(10);
}
else if (someOtherCalculation == someValue)
{
// We are on course, so move forward
Move(10);
}
}
Это может помочь вам начать.
Если, однако, ваш робот работает асинхронно, то есть код продолжает работать, пока робот что-то делает (например, вы постоянно получаете обратную связь от датчиков движения), вам придется структурировать свою программу по-другому. Метод Move () может все еще работать, но поток вашей программы должен немного отличаться. Вы можете использовать переменную для отслеживания состояния:
public enum RobotStates
{
Searching,
Waiting,
Hunting,
Busy,
}
Затем в вашем основном цикле вы можете проверить состояние:
if (myRobotState != RobotStates.Busy)
{
// Do something
}
Не забудьте изменить состояние после завершения ваших действий.
Вполне возможно, вам придется использовать многопоточность для асинхронного решения, поэтому ваш метод, который получает обратную связь от вашего датчика, не застревает в ожидании движения робота, но может продолжать опрос. Тем не менее, работа с потоками выходит за рамки этого ответа, но есть множество ресурсов.