+/* FSM Base
+
+Prototipo rozzo per il movimento utilizzando le funzioni
+di base della libreria Rover e una FSM.
+
+
+Schema: https://lab.piffa.net/schemi/2wd_car_bb.png
+Codice: http://git.andreamanni.com/web?p=rove
+
+*/
+
+
+#include "rover.h"
+#include "Servo.h"
+#define dEBUG
+
+int rotPausa = 500; // Pausa per una rotazione di ~90'
+
+void setup()
+{
+ abilita();
+#ifdef DEBUG
+ Serial.begin(9600);
+ Serial.println("Attivazione sketch");
+#endif
+}
+
+
+// FSM
+enum { // Stati della FMS
+ forward,
+ check, // Cerca percorso libero
+ sx, // sx
+ dx, // dx
+ ferma,
+ inversione
+} stato = forward;
+
+const int giroPausa = 630 ; // Tempo necessario per rotazione
+void loop()
+{
+ switch (stato) {
+ case forward:
+ servoMiddle();
+ avanti();
+ delay(10); // Movimento minimo, per stabilizzare
+ // l'input del sensore
+ if (distanceCheck()) {
+#ifdef DEBUG
+Serial.println("\t ###### Ostacolo! ######");
+#endif
+ stato = check ;
+ }
+
+ break;
+
+ case check:
+ if (!distanceCheck()) {
+ stato = forward ;
+ break;
+ }
+ stop();
+// check dx
+ servoDX();
+ if (!distanceCheck()) {
+ stato = dx ;
+ servoMiddle();
+ break;
+ }
+
+// check sx
+ servoSX();
+ if (!distanceCheck()) {
+ stato = sx ;
+ servoMiddle();
+ break;
+ }
+// Inversione
+ servoMiddle();
+ stato = inversione ;
+#ifdef DEBUG
+Serial.print("Stato: ");
+Serial.println(stato);
+#endif
+ break;
+
+ case sx:
+#ifdef DEBUG
+Serial.print("Stato: ");
+Serial.println(stato);
+#endif
+ giraSX();
+ delay(giroPausa);
+ stato = forward ;
+ break;
+
+ case dx:
+#ifdef DEBUG
+Serial.print("Stato: ");
+Serial.println(stato);
+#endif
+ giraDX();
+ delay(giroPausa);
+ stato = forward ;
+ break;
+
+ case ferma:
+ stop();
+ delay(1000);
+ stato = check ;
+ break;
+
+ case inversione:
+#ifdef DEBUG
+Serial.print("Stato: ");
+Serial.println(stato);
+#endif
+ stop();
+ indietro(); // Why not? :)
+ delay(giroPausa * 1);
+ giraDX();
+ delay(giroPausa * 3);
+ stato = check ;
+ break;
+
+ default:
+ stop();
+ delay(2000);
+ stato = check ;
+ break;
+ }
+
+#ifdef DEBUG
+//Serial.print("Stato: ");
+//Serial.println(stato);
+//Serial.print("Distanza: ");
+//Serial.println(distanceMonitor());
+#endif
+}