Antes que nada, debemos establecer cómo fluye su programa.
¿Ejecuta un comando, espera y luego ejecuta el siguiente comando? ¿O ejecuta comandos simultáneamente? (por ejemplo, mover y hacer otra cosa)
Supongo que querrá que ejecute comandos en secuencia, en lugar de algunos subprocesos complejos que su sistema de motor puede no admitir.
Con el fin de obtener su robot se mueva lentamente, sugeriría la creación de un método Move() que toma un parámetro, la cantidad de tiempo que desea que pasan en movimiento, así:
public void Move(int numberOfSeconds)
{
while (numberOfSeconds > 0)
{
myRobot.MotorOn();
Thread.Sleep(2000);
myRobot.MotorOff();
Thread.Sleep(500);
numberOfSeconds -= 2;
}
}
¡Es no es exacto, pero esa es una forma de hacerlo.
Si a continuación, llama a Move (10), por ejemplo, su robot se moverá durante 10 segundos, y pausará cada 2 segundos durante medio segundo.
En cuanto a sus preguntas flujo del programa, es posible que desee pensar en ella como una lista de instrucciones:
AVANZAR PARADA VERIFICACIÓN DE OBJETO GIRAR para apuntar a OBJETO AVANZAR PARADA
etc.
Por lo tanto, en su bucle de control de programa principal, suponiendo que las llamadas son síncronas (es decir.el programa se detiene mientras se está ejecutando un comando, al igual que en el método Move arriba), usted puede simplemente tener un montón de IF (o un interruptor)
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);
}
}
que podría ayudarle a empezar.
Sin embargo, si su robot es asincrónico, es decir, el código se mantiene funcionando mientras el robot está haciendo cosas (como que recibe constantemente retroalimentación de los sensores de movimiento) tendrá que estructurar su programa de manera diferente. El método Move() aún puede funcionar, pero el flujo de tu programa debería ser ligeramente diferente. Se puede utilizar una variable para realizar un seguimiento del estado:
public enum RobotStates
{
Searching,
Waiting,
Hunting,
Busy,
}
Luego, en el bucle principal, se puede examinar el estado:
if (myRobotState != RobotStates.Busy)
{
// Do something
}
Recuerde cambiar el estado cuando sus acciones completa.
Es muy posible que tenga que utilizar el enhebrado para una solución asincrónica, por lo que su método que recibe retroalimentación de su sensor no se atasca esperando a que el robot se mueva, pero puede continuar sondeando. Sin embargo, el enrutamiento está más allá del alcance de esta respuesta, pero hay muchos recursos disponibles.
+1 para una respuesta completa. –