Starting point for the student buggy project

Dependencies:   microbit

Fork of microbit-hello-world by micro:bit

Revision:
2:47b7a55b0805
Parent:
1:8c05eb53f714
Child:
3:c3a42966b47c
--- a/main.cpp	Sun Jul 16 20:23:27 2017 +0000
+++ b/main.cpp	Mon Jul 31 21:48:36 2017 +0000
@@ -23,404 +23,39 @@
 DEALINGS IN THE SOFTWARE.
 */
 
-#include "MicroBit.h"
+#include "Buggy.h"
 
-#define BUGGY_HALTED    0
-#define BUGGY_RUNNING   1
-#define BUGGY_PAUSED    2
 
 void onButtonA(MicroBitEvent);
 int main();
-void MoveForward(unsigned int Voltage, unsigned int Time_ms);
-void MoveBackward(unsigned int Voltage, unsigned int Time_ms);
-void RotateClockwise(unsigned int Voltage, unsigned int Time_ms);
-void RotateAnticlockwise(unsigned int Voltage, unsigned int Time_ms);
-void PauseLastCommand();
-void ContinueLastCommand();
-bool hasLastCommandCompleted();
-
-MicroBit uBit;
+void SelfTest();
+void DisplaySonarTiming();
 
 MicroBitButton buttonA(MICROBIT_PIN_BUTTON_A, MICROBIT_ID_BUTTON_A);
 MicroBitButton buttonB(MICROBIT_PIN_BUTTON_B, MICROBIT_ID_BUTTON_B);
 
-MicroBitPin MotorSpeed_L(MICROBIT_ID_IO_P0, MICROBIT_PIN_P0, PIN_CAPABILITY_ANALOG);
-MicroBitPin MotorDirection_L(MICROBIT_ID_IO_P8, MICROBIT_PIN_P8, PIN_CAPABILITY_DIGITAL );
-
-MicroBitPin MotorSpeed_R(MICROBIT_ID_IO_P1, MICROBIT_PIN_P1, PIN_CAPABILITY_ANALOG);
-MicroBitPin MotorDirection_R(MICROBIT_ID_IO_P12, MICROBIT_PIN_P12, PIN_CAPABILITY_DIGITAL );
-
-//Sonar trigger and echo
-MicroBitPin Echo(MICROBIT_ID_IO_P13, MICROBIT_PIN_P13, PIN_CAPABILITY_DIGITAL);
-MicroBitPin Trig(MICROBIT_ID_IO_P13, MICROBIT_PIN_P13, PIN_CAPABILITY_DIGITAL);
-
-MicroBitMessageBus bus; 
-unsigned long StartEdge = 0;
-unsigned long Duration = 0;
-int SendPulseRequest = 0;
-int Triggered = 0;
-int TargetMotorRunTime = 0;
-int CurrentMotorRunTime = 0;
-unsigned int TimerStart = 0;
-unsigned int LastMotorVoltage_L = 0;
-unsigned int LastMotorVoltage_R = 0;
-unsigned int LastMotorDirection_L = 0;
-unsigned int LastMotorDirection_R = 0;
-int BuggyState = BUGGY_HALTED;
-
 
 void onButtonA(MicroBitEvent evt) 
 { 
     if(evt.value == MICROBIT_BUTTON_EVT_CLICK)
     {
-        SendPulseRequest = 1;
+
     }
 } 
 
-void onEchoHi(MicroBitEvent evt) 
-{ 
-    StartEdge = evt.timestamp; 
-    Triggered++;
-} 
 
-void onEchoLo(MicroBitEvent evt)
-{
-    Duration = evt.timestamp - StartEdge;
-    Triggered++;
-}
-
-void onEchoPulse(MicroBitEvent evt)
-{
-    Duration = evt.timestamp;
-    Triggered++;
-}
-
-bool hasLastCommandCompleted()
-{
-    if(BuggyState == BUGGY_RUNNING)
-    {
-        CurrentMotorRunTime = uBit.systemTime() - TimerStart;
-        if(CurrentMotorRunTime >= TargetMotorRunTime)
-        {
-            //Stop the motors by writing a 0 voltage and setting direction to forward.
-            MotorDirection_L.setDigitalValue(0);
-            MotorDirection_R.setDigitalValue(0);
-            MotorSpeed_L.setAnalogValue(0);  
-            MotorSpeed_R.setAnalogValue(0);
-            
-            //Update the buggy state to show that it is now halted
-            BuggyState = BUGGY_HALTED;
-            
-            //completed
-            return true;
-        }
-        else
-        {
-            //return not completed
-            return false;
-        }
-    }
-    
-    //return no last command was running
-    return false; 
-}
-
-void PauseLastCommand()
-{
-    //Only do this if the buggy is actually running
-    if(BuggyState == BUGGY_RUNNING)
-    {
-        //Store the amount of elapsed time before the command is paused.
-        CurrentMotorRunTime = uBit.systemTime() - TimerStart;
-        //Stop the motors by writing a 0 voltage and setting direction to forward.
-        MotorDirection_L.setDigitalValue(0);
-        MotorDirection_R.setDigitalValue(0);
-        MotorSpeed_L.setAnalogValue(0);  
-        MotorSpeed_R.setAnalogValue(0);
-        
-        //Update the buggy state to show that it is now halted
-        BuggyState = BUGGY_PAUSED;
-    }
-}
-
-void ContinueLastCommand()
-{
-    //Only do this if the buggy is currently halted we have not yet reached the target run time
-    if( (BuggyState == BUGGY_PAUSED) && (TargetMotorRunTime > CurrentMotorRunTime) )
-    {
-        //Update the target motor run time to only run for the incomplete time period and zero CurrentMotorRunTime
-        TargetMotorRunTime = TargetMotorRunTime - CurrentMotorRunTime;
-        CurrentMotorRunTime = 0;
-        //Set the voltage of the motors as per the stored last voltage and direction command.
-        MotorDirection_L.setDigitalValue(LastMotorDirection_L);
-        MotorDirection_R.setDigitalValue(LastMotorDirection_R);
-        MotorSpeed_L.setAnalogValue(LastMotorVoltage_L);  
-        MotorSpeed_R.setAnalogValue(LastMotorVoltage_R); 
-        
-        //Start the timer
-        TimerStart = uBit.systemTime();
-        
-        //Update the buggy state to show that it is now running
-        BuggyState = BUGGY_RUNNING;
-    }
-}
-
-void MoveForward(unsigned int Voltage, unsigned int Time_ms)
-{
-    //Initialise the variables for tracking the travel progress
-    TargetMotorRunTime = Time_ms;
-    CurrentMotorRunTime = 0;
-    
-    //Limit the voltage to 1024, which is the max A2D output value.
-    if(Voltage > 1024)
-    {
-        Voltage = 1024;
-    }
-    
-    //Set the direction of the motors to forward
-    MotorDirection_L.setDigitalValue(0);
-    MotorDirection_R.setDigitalValue(0);
-    //Set the voltage of the motors as per the user request 
-    MotorSpeed_L.setAnalogValue(Voltage);  
-    MotorSpeed_R.setAnalogValue(Voltage); 
-    
-    //Store the command being used in case the command has to be paused and resumed later
-    LastMotorVoltage_L = Voltage;
-    LastMotorVoltage_R = Voltage;
-    LastMotorDirection_L = 0;
-    LastMotorDirection_R = 0;
-    //Start the timer
-    TimerStart = uBit.systemTime();
-    
-    //Update the buggy state to show that it is now running
-    BuggyState = BUGGY_RUNNING;
-}
-
-void MoveBackward(unsigned int Voltage, unsigned int Time_ms)
-{
-    int ReverseVoltage;
-    //Initialise the variables for tracking the travel progress
-    TargetMotorRunTime = Time_ms;
-    CurrentMotorRunTime = 0;
-    
-    //Limit the voltage to 1024, which is the max A2D output value.
-    if(Voltage > 1024)
-    {
-        Voltage = 1024;
-    }
-    
-    //In reverse, 0 is actually max speed and 1024 is stopped.
-    ReverseVoltage = 1024 - Voltage;
-    
-    //Set the direction of the motors to reverse
-    MotorDirection_L.setDigitalValue(1);
-    MotorDirection_R.setDigitalValue(1);
-    //Set the voltage of the motors as per the user request (1024 - value) 
-    MotorSpeed_L.setAnalogValue(ReverseVoltage);  
-    MotorSpeed_R.setAnalogValue(ReverseVoltage); 
-    
-    //Store the command being used in case the command has to be paused and resumed later
-    LastMotorVoltage_L = ReverseVoltage;
-    LastMotorVoltage_R = ReverseVoltage;
-    LastMotorDirection_L = 1;
-    LastMotorDirection_R = 1;
-    //Start the timer
-    TimerStart = uBit.systemTime();
-    
-    //Update the buggy state to show that it is now running
-    BuggyState = BUGGY_RUNNING;
-}
-void RotateClockwise(unsigned int Voltage, unsigned int Time_ms)
-{
-    int ReverseVoltage;
-    //Initialise the variables for tracking the travel progress
-    TargetMotorRunTime = Time_ms;
-    CurrentMotorRunTime = 0;
-    
-    //Limit the voltage to 1024, which is the max A2D output value.
-    if(Voltage > 1024)
-    {
-        Voltage = 1024;
-    }
-    
-    //In reverse, 0 is actually max speed and 1024 is stopped.
-    ReverseVoltage = 1024 - Voltage;
-    
-    //Set the motor direction: left-forward, right-backward
-    MotorDirection_L.setDigitalValue(0);
-    MotorDirection_R.setDigitalValue(1);
-    //Set the voltage of the motors as per the user request (1024 - value) 
-    MotorSpeed_L.setAnalogValue(Voltage);  
-    MotorSpeed_R.setAnalogValue(ReverseVoltage); 
-    
-    //Store the command being used in case the command has to be paused and resumed later
-    LastMotorVoltage_L = Voltage;
-    LastMotorVoltage_R = ReverseVoltage;
-    LastMotorDirection_L = 0;
-    LastMotorDirection_R = 1;
-    //Start the timer
-    TimerStart = uBit.systemTime();
-    
-    //Update the buggy state to show that it is now running
-    BuggyState = BUGGY_RUNNING;
-}
-
-void RotateAnticlockwise(unsigned int Voltage, unsigned int Time_ms)
-{
-    int ReverseVoltage;
-    //Initialise the variables for tracking the travel progress
-    TargetMotorRunTime = Time_ms;
-    CurrentMotorRunTime = 0;
-    
-    //Limit the voltage to 1024, which is the max A2D output value.
-    if(Voltage > 1024)
-    {
-        Voltage = 1024;
-    }
-    
-    //In reverse, 0 is actually max speed and 1024 is stopped.
-    ReverseVoltage = 1024 - Voltage;
-    
-    //Set the motor direction: left-backward, right-forward
-    MotorDirection_L.setDigitalValue(1);
-    MotorDirection_R.setDigitalValue(0);
-    //Set the voltage of the motors as per the user request (1024 - value) 
-    MotorSpeed_L.setAnalogValue(ReverseVoltage);  
-    MotorSpeed_R.setAnalogValue(Voltage); 
-    
-    //Store the command being used in case the command has to be paused and resumed later
-    LastMotorVoltage_L = ReverseVoltage;
-    LastMotorVoltage_R = Voltage;
-    LastMotorDirection_L = 1;
-    LastMotorDirection_R = 0;
-    //Start the timer
-    TimerStart = uBit.systemTime();
-    
-    //Update the buggy state to show that it is now running
-    BuggyState = BUGGY_RUNNING;
-}
 
 
 int main()
-{
-    /*initialise local variables*/
-    unsigned long LastSystemTime = 0;   //To keep track of the clock
-    int EchoValue = 5;
-    int PressedCount = 0;
-    int ValueChange = 0;
-    
+{    
     //Initialise the micro:bit runtime.
-    uBit.init();
-    
-    //Display start message using the LEDs
-    uBit.display.scroll("H");
-    /*The sw MicroBitButtons instantiated above also have events assigned to them. This line will 
-    suppress MICROBIT_BUTTON_EVT_CLICK and MICROBIT_BUTTON_EVT_LONG_CLICK events on the button, otherwise
-    2 events will be flagged*/
-    buttonA.setEventConfiguration(MICROBIT_BUTTON_SIMPLE_EVENTS);
-    
-    //Listen out for the button A press event
-    uBit.messageBus.listen(MICROBIT_ID_BUTTON_A, MICROBIT_BUTTON_EVT_CLICK, onButtonA, MESSAGE_BUS_LISTENER_IMMEDIATE);
-    
-    //Set the triggerpin low
-   // Trig.setDigitalValue(0);
-    
-/*    Echo.eventOn(MICROBIT_PIN_EVENT_ON_PULSE);
-    Echo.eventOn(MICROBIT_PIN_EVENT_ON_EDGE);
-    uBit.messageBus.listen(MICROBIT_ID_IO_P13, MICROBIT_PIN_EVT_RISE, onEchoHi, MESSAGE_BUS_LISTENER_IMMEDIATE);
-    uBit.messageBus.listen(MICROBIT_ID_IO_P13, MICROBIT_PIN_EVT_FALL, onEchoLo, MESSAGE_BUS_LISTENER_IMMEDIATE);
-    uBit.messageBus.listen(MICROBIT_ID_IO_P13, MICROBIT_PIN_EVT_PULSE_HI, onEchoPulse, MESSAGE_BUS_LISTENER_IMMEDIATE);
- */   
-     
-    /*Because this pin is being used as both input and output, the configuring of the pin as an input
-    must be done first because once the output has changed, it will not work - possible uBit bug*/
-    EchoValue = Echo.getDigitalValue();
-    uBit.display.print(EchoValue);
+    InitialiseBuggy();
     
-    while(1)
-    {
-        MoveBackward(900, 5000);
-        do
-        {
-            if(buttonA.isPressed())
-            {
-                PauseLastCommand();
-            }
-            else
-            {
-                ContinueLastCommand();
-            }
-        }while( hasLastCommandCompleted() == false );
-        wait_ms(1000);
-        
-        MoveForward(900, 5000);
-        do
-        {
-            if(buttonA.isPressed())
-            {
-                PauseLastCommand();
-            }
-            else
-            {
-                ContinueLastCommand();
-            }
-        }while( hasLastCommandCompleted() == false );
-        wait_ms(1000);
-        
-        RotateClockwise(900, 5000);
-        do
-        {
-            if(buttonA.isPressed())
-            {
-                PauseLastCommand();
-            }
-            else
-            {
-                ContinueLastCommand();
-            }
-        }while( hasLastCommandCompleted() == false );
-        wait_ms(1000);
-        
-        RotateAnticlockwise(900, 5000);
-        do
-        {
-            if(buttonA.isPressed())
-            {
-                PauseLastCommand();
-            }
-            else
-            {
-                ContinueLastCommand();
-            }
-        }while( hasLastCommandCompleted() == false );
-        wait_ms(1000);
- 
- #ifdef   HVHVHVHV    
-        EchoValue = Echo.getDigitalValue();
-        if(EchoValue > ValueChange) 
-        {
-            ValueChange = EchoValue;    
-        }
-       /* if( (uBit.systemTime()-LastSystemTime) > 1000)
-        {    
-            //uBit.serial.printf("Duration=%d, ", Duration);
-            LastSystemTime = uBit.systemTime();
-        }*/
-        
-        if(SendPulseRequest == 1)
-        {
-            SendPulseRequest = 0;
-            Trig.setDigitalValue(1);
-            wait_us(50);
-            Trig.setDigitalValue(0);
-            //uBit.display.printAsync(++PressedCount);
-        }
-        if(ValueChange>0)
-        {
-            uBit.display.printAsync(ValueChange);
-        }
-#endif
-    }
+    //Run self test forever
+    //SelfTest();
+    //Print the sonar time
+    DisplaySonarTiming();
+    
 
     // If main exits, there may still be other fibers running or registered event handlers etc.
     // Simply release this fiber, which will mean we enter the scheduler. Worse case, we then
@@ -428,3 +63,47 @@
     release_fiber();
 }
 
+void SelfTest()
+{
+    int Counter = 3;
+    unsigned int LastSystemTime = 0;
+    
+    //Display start message using the LEDs
+    //uBit.display.scroll("Hello World");
+    //Instead, display 3, 2, 1, 0
+    uBit.display.printAsync(Counter);
+    LastSystemTime = uBit.systemTime();
+    while (Counter > 0)
+    {
+        if( (uBit.systemTime()-LastSystemTime) > 1000)
+        {    
+            //uBit.serial.printf("Counter=%d, ", Counter);
+            LastSystemTime = uBit.systemTime();
+            Counter = Counter - 1;
+            uBit.display.printAsync(Counter);
+        }
+    }
+        
+    while(1)
+    {
+        //Run the sonar test for 10 secs
+        LastSystemTime = uBit.systemTime();
+        while( (uBit.systemTime()-LastSystemTime) < 10000)
+        {    
+            TestSonar();
+        }
+        //Display 0
+        uBit.display.printAsync(Counter);
+        //Run the motor test
+        RunBasicBuggyMotorTest(800, 1000, 1000);
+    }
+}
+
+void DisplaySonarTiming()
+{
+    while(1)
+    {
+        PrintSonarTiming();
+    }
+    
+}