our little library for controlling a robot with two wheels and an LCD
Diff: Robo.cpp
- Revision:
- 0:bb5c5d6800a3
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Robo.cpp Sun Oct 27 09:16:19 2013 +0000 @@ -0,0 +1,145 @@ +#include "Robo.h" +extern DigitalOut buzzer; + +/* implementation of the Robo contructor */ +Robo::Robo(PinName l_en, PinName l_fwd, PinName l_rev, + PinName r_en, PinName r_fwd, PinName r_rev, + PinName rs, PinName en, PinName d4, PinName d5, + PinName d6, PinName d7): + lmotor(l_en, l_fwd, l_rev), rmotor(r_en, r_fwd, r_rev), + lcd(rs, en, d4, d5, d6, d7) +{ + lives = max_lives; + init(); +} + +/* I changed the cls function in the textLCD library + * to make it clear only the first row + */ +void Robo::printlcd(char *msg) // printf msg to the first row of LCD +{ + lcd.cls(); + lcd.printf(msg); +} +void Robo::init() // print the initial msg on the LCD +{ + buzzer = 1; + lcd.cls_all(); + updateLivesLCD(); + for (int i = 0; i < 2; i++) { + printlcd("Roger Here!"); + wait(1); + buzzer = 0; + printlcd(" "); + wait(1); + + } + printlcd("Roger Here!"); + +} + +/* I believe the following functions are pretty straight forward to + * understand + */ + +void Robo::goLeft() +{ + rState temp = this->getState(); // store the current state + lcd.cls(); + lcd.printf("Going Left! "); + lmotor.direct(0); // stop the left motor + rmotor.direct(1); // start the right motor + wait(1); + this->setState(temp); // restore original state + +} + +void Robo::moveRight() +{ + lcd.cls(); + rState temp = this->getState(); + lcd.printf("Turning Right! "); + rmotor.direct(0); + lmotor.direct(1); + wait(1); + this->setState(temp); +} + +void Robo::stop() +{ + lcd.cls(); + rmotor.direct(0); // stop motor left + lmotor.direct(0); // stop motor right + lcd.printf("Stopped! "); +} + +void Robo::goAhead() +{ + lcd.cls(); + lcd.locate(0, 0); + rmotor.direct(1); + lmotor.direct(1); + lcd.printf("Moving Forward!"); +} + +void Robo::moveBack() +{ + lcd.cls(); + rmotor.direct(-1); + lmotor.direct(-1); + lcd.printf("Going Back "); +} + +int Robo::getLives() +{ + return lives; +} + +// update LCD with the current value of the variable lives +void Robo::updateLivesLCD() { + lcd.locate(0, 1); + lcd.printf("lives : %d", lives); + lcd.locate(0, 0); +} + +void Robo::decLives() +{ + lives--; + printlcd("oops!! "); + updateLivesLCD(); + if (lives == 0) { + stop(); + int i = 0; + /* if all lives have been exhausted say goodbye to the world + * and rest in a peaceful forever loop + */ + while (++i) { + printlcd("GoodBye!! "); + wait(0.5); + printlcd(" "); + wait(0.5); + if (i < 4) + buzzer = 1; + wait(1); + buzzer = 0; + } + } + buzzer = 1; + wait(1); + buzzer = 0; + wait(2); +} + +rState Robo::getState() +{ + mState lm = lmotor.getState(); + mState rm = rmotor.getState(); + rState temp = {lm, rm }; // return a struct var containing the + return temp; +} + +void Robo::setState(rState roboState) +{ + lmotor.setState(roboState.lm); + rmotor.setState(roboState.rm); +} \ No newline at end of file