Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
main.cpp
- Committer:
- kolanery
- Date:
- 2017-05-21
- Revision:
- 26:191ec0e78774
- Parent:
- 25:7155cb993870
- Child:
- 27:b980fce784ea
File content as of revision 26:191ec0e78774:
#include "drivecontrol.h"
#include "io_modules.h"
#include "mbed.h"
#include "maze_solver.h"
//// PIN ASSIGNMENTS
AnalogIn battery(PA_3);
DigitalOut led_1(PB_12);
DigitalOut led_2(PB_13);
DigitalOut led_3(PB_14);
DigitalOut led_4(PB_15);
Serial serial (PA_9, PA_10);
// CONTROL CONSTANTS
const int STRAIGHT = 0, LEFT = 1, RIGHT = 2, UTURN = 3;
const int START_POS = 0, END_POS = 0;
const int CONTROL = 1;
Timer flood_fill_timer;
Timer state_timeout_timer;
void check_battery () {
if (battery.read() < 0.70f){
led_1 = 1;
led_2 = 1;
led_3 = 1;
led_4 = 1;
}
}
void flash_led (int _led_1, int _led_2, int _led_3, int _led_4) {
led_1 = _led_1;
led_2 = _led_2;
led_3 = _led_3;
led_4 = _led_4;
}
int main() {
DriveControl * driver = new DriveControl (START_POS, END_POS);
driver->resetEncoders();
int state, count = 0;
bool finished_traverse_one_cell = true;
Mouse *my_mouse = new Mouse();
flood_fill_timer.start();
while(flood_fill_timer.read() < 50) {
check_battery();
wait_ms(1);
if (finished_traverse_one_cell == true) {
if (state_timeout_timer.read() > 10) {
driver->stop();
wait(0.5);
driver->reverse();
wait(0.5);
driver->stop();
driver->resetEncoders();
state_timeout_timer.reset();
state_timeout_timer.start();
}
state = my_mouse->solve_maze();
if(state == RIGHT){
flash_led(1,1,0,0);
wait(0.25);
driver->resetEncoders();
}
else if(state == LEFT){
flash_led(1,0,1,0);
wait(0.25);
driver->resetEncoders();
}
else if(state == UTURN){
flash_led(1,1,1,0);
wait(0.25);
driver->resetEncoders();
count = 0;
}
finished_traverse_one_cell = false;
}
state_timeout_timer.start();
if (state == STRAIGHT) {
if (!driver->should_finish_drive_forward() && !driver-> has_front_wall()) {
driver->drive_forward();
flash_led(1, 0, 0, 0);
}
else {
driver->clear_pid();
driver->stop();
driver->resetEncoders();
flash_led (0, 0, 0, 0);
finished_traverse_one_cell = true;
continue;
}
}
if (state == RIGHT) {
if (!driver->should_finish_turn_right()) {
driver->turn_right();
flash_led (0, 1, 0, 0);
}
else {
driver->stop();
flash_led (0, 0, 0, 0);
//finished_traverse_one_cell = true;
state = STRAIGHT;
driver->resetEncoders();
driver->clear_pid();
// wait(0.25);
continue;
}
}
if (state == LEFT) {
if (!driver->should_finish_turn_left()) {
driver->turn_left();
flash_led (0, 0, 1, 0);
}
else {
driver->stop();
flash_led (0, 0, 0, 0);
state = STRAIGHT;
driver->resetEncoders();
driver->clear_pid();
continue;
}
}
if (state == UTURN){
if (!driver->should_finish_turn_left()) {
driver->turn_left();
flash_led (0, 1, 1, 0);
}
else {
driver->stop();
driver->resetEncoders();
flash_led (0, 0, 0, 0);
count == 1 ? finished_traverse_one_cell = true: count++;
continue;
}
}
}
flood_fill_timer.stop();
state = count = 0;
finished_traverse_one_cell = true;
flash_led(1,1,1,1);
while(CONTROL) {
check_battery();
wait_ms(1);
if (finished_traverse_one_cell == true) {
if (!driver->has_right_wall() && !driver->has_left_wall()) {
wait(1);
if ((rand() % 3) == 0) {
state = LEFT;
driver->resetEncoders();
}
else {
state = RIGHT;
driver->resetEncoders();
}
}
else if (!driver->has_right_wall()) {
wait(0.25);
state = RIGHT;
driver->resetEncoders();
}
else if (!driver->has_left_wall()) {
wait(0.25);
state = LEFT;
driver->resetEncoders();
}
else if(!driver->has_front_wall()){
state = STRAIGHT;
driver->resetEncoders();
}
else{
wait(0.25);
state = UTURN;
driver->resetEncoders();
count = 0;
}
finished_traverse_one_cell = false;
}
if (state == STRAIGHT) {
if (!driver->should_finish_drive_forward() && !driver-> has_front_wall()) {
driver->drive_forward();
flash_led(1, 0, 0, 0);
}
else {
driver->clear_pid();
driver->stop();
driver->resetEncoders();
flash_led (0, 0, 0, 0);
finished_traverse_one_cell = true;
continue;
}
}
if (state == RIGHT) {
if (!driver->should_finish_turn_right()) {
driver->turn_right();
flash_led (0, 1, 0, 0);
}
else {
driver->stop();
flash_led (0, 0, 0, 0);
//finished_traverse_one_cell = true;
state = STRAIGHT;
driver->resetEncoders();
driver->clear_pid();
// wait(0.25);
continue;
}
}
if (state == LEFT) {
if (!driver->should_finish_turn_left()) {
driver->turn_left();
flash_led (0, 0, 1, 0);
}
else {
driver->stop();
flash_led (0, 0, 0, 0);
state = STRAIGHT;
driver->resetEncoders();
driver->clear_pid();
continue;
}
}
if (state == UTURN){
if (!driver->should_finish_turn_left()) {
driver->turn_left();
flash_led (0, 1, 1, 0);
}
else {
driver->stop();
driver->resetEncoders();
flash_led (0, 0, 0, 0);
count == 1 ? finished_traverse_one_cell = true: count++;
continue;
}
}
}
}