Przede wszystkim musimy ustalić, w jaki sposób płynie Twój program.
Czy wykonuje jedno polecenie, czekaj, a następnie wykonaj następne polecenie? Czy może jednocześnie wykonywać polecenia? (na przykład: przenieś i zrób coś innego)
Wyobrażam sobie, że będziesz chciał, aby wykonywał polecenia w sekwencji, a nie skomplikowane wątki, które twój układ motoryczny może nie obsługiwać.
Aby dostać robota poruszać się powoli, chciałbym zaproponować stworzenie metody Move(), która przyjmuje parametr, ilość czasu chcesz go spędzić w ruchu, na przykład:
public void Move(int numberOfSeconds)
{
while (numberOfSeconds > 0)
{
myRobot.MotorOn();
Thread.Sleep(2000);
myRobot.MotorOff();
Thread.Sleep(500);
numberOfSeconds -= 2;
}
}
Nadszedł nie dokładny, ale jest to jeden ze sposobów robienia tego.
Jeśli na przykład wywołasz Move (10), robot porusza się na 10 sekund, a pauza co 2 sekundy przez pół sekundy.
Odnośnie pytania przebiegu programu, może warto pomyśleć o tym, jak listy instrukcji:
naprzód STOP SPRAWDZIĆ NA PRZEDMIOT obracać zmierzać PRZEDMIOT naprzód STOP
itp.
Tak więc w głównej pętli sterowania programem, zakładając, że połączenia są synchroniczne (tj.Twój program zatrzymuje się, gdy jest on wykonaniem polecenia, jak w powyższej metodzie ruchu), można po prostu mieć kilka IF zaczniesz oświadczenia (lub przełącznik)
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);
}
}
To może pomóc.
Jeśli jednak twój robot jest asynchroniczny, to znaczy, że kod działa nadal, podczas gdy robot robi różne rzeczy (na przykład ciągle otrzymuje informacje zwrotne od czujników ruchu), będziesz musiał inaczej skonstruować swój program. Metoda Move() może nadal działać, ale Twój przepływ programu powinien być nieco inny. Można użyć zmiennej aby śledzić stan:
public enum RobotStates
{
Searching,
Waiting,
Hunting,
Busy,
}
Następnie w pętli głównej, można sprawdzić stan:
if (myRobotState != RobotStates.Busy)
{
// Do something
}
Pamiętaj, aby zmienić stan, gdy wasze działania kompletne.
Jest całkowicie możliwe, że będziesz musiał używać wątku dla asynchronicznego rozwiązania, więc twoja metoda, która otrzyma informację zwrotną od twojego czujnika, nie utknie, czekając na ruch robota, ale może kontynuować odpytywanie. Jednak wątek wykracza poza zakres tej odpowiedzi, ale istnieje wiele zasobów.
+1 za kompleksową odpowiedź. –