TomYumBoys / Mbed 2 deprecated MM2017

Dependencies:   mbed

Committer:
kolanery
Date:
Sun May 21 08:10:29 2017 +0000
Revision:
26:191ec0e78774
Parent:
25:7155cb993870
Child:
27:b980fce784ea
Update baseline version for UCSD competition.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kolanery 0:cb667de3a336 1 #include "drivecontrol.h"
kolanery 4:73510c7fa316 2 #include "io_modules.h"
szh66 6:1bcfda49e146 3 #include "mbed.h"
ryan_whr 25:7155cb993870 4 #include "maze_solver.h"
kolanery 16:c26d8e007df5 5 //// PIN ASSIGNMENTS
szh66 6:1bcfda49e146 6 AnalogIn battery(PA_3);
szh66 6:1bcfda49e146 7 DigitalOut led_1(PB_12);
szh66 6:1bcfda49e146 8 DigitalOut led_2(PB_13);
szh66 6:1bcfda49e146 9 DigitalOut led_3(PB_14);
szh66 6:1bcfda49e146 10 DigitalOut led_4(PB_15);
szh66 6:1bcfda49e146 11 Serial serial (PA_9, PA_10);
kolanery 16:c26d8e007df5 12 // CONTROL CONSTANTS
kolanery 16:c26d8e007df5 13 const int STRAIGHT = 0, LEFT = 1, RIGHT = 2, UTURN = 3;
kolanery 16:c26d8e007df5 14 const int START_POS = 0, END_POS = 0;
kolanery 16:c26d8e007df5 15 const int CONTROL = 1;
kolanery 26:191ec0e78774 16 Timer flood_fill_timer;
kolanery 26:191ec0e78774 17 Timer state_timeout_timer;
kolanery 2:619b02232144 18
kolanery 16:c26d8e007df5 19 void check_battery () {
kolanery 15:151e59899221 20 if (battery.read() < 0.70f){
kolanery 4:73510c7fa316 21 led_1 = 1;
kolanery 4:73510c7fa316 22 led_2 = 1;
kolanery 4:73510c7fa316 23 led_3 = 1;
kolanery 4:73510c7fa316 24 led_4 = 1;
kolanery 15:151e59899221 25 }
kolanery 0:cb667de3a336 26 }
kolanery 0:cb667de3a336 27
kolanery 16:c26d8e007df5 28 void flash_led (int _led_1, int _led_2, int _led_3, int _led_4) {
kolanery 16:c26d8e007df5 29 led_1 = _led_1;
kolanery 16:c26d8e007df5 30 led_2 = _led_2;
kolanery 16:c26d8e007df5 31 led_3 = _led_3;
kolanery 16:c26d8e007df5 32 led_4 = _led_4;
kolanery 16:c26d8e007df5 33 }
kolanery 16:c26d8e007df5 34
kolanery 0:cb667de3a336 35 int main() {
kolanery 4:73510c7fa316 36 DriveControl * driver = new DriveControl (START_POS, END_POS);
kolanery 14:a646667ac9ea 37 driver->resetEncoders();
kolanery 16:c26d8e007df5 38 int state, count = 0;
kolanery 14:a646667ac9ea 39 bool finished_traverse_one_cell = true;
kolanery 26:191ec0e78774 40 Mouse *my_mouse = new Mouse();
kolanery 26:191ec0e78774 41 flood_fill_timer.start();
kolanery 26:191ec0e78774 42 while(flood_fill_timer.read() < 50) {
kolanery 26:191ec0e78774 43 check_battery();
kolanery 26:191ec0e78774 44 wait_ms(1);
kolanery 26:191ec0e78774 45 if (finished_traverse_one_cell == true) {
kolanery 26:191ec0e78774 46 if (state_timeout_timer.read() > 10) {
kolanery 26:191ec0e78774 47 driver->stop();
kolanery 26:191ec0e78774 48 wait(0.5);
kolanery 26:191ec0e78774 49 driver->reverse();
kolanery 26:191ec0e78774 50 wait(0.5);
kolanery 26:191ec0e78774 51 driver->stop();
kolanery 26:191ec0e78774 52 driver->resetEncoders();
kolanery 26:191ec0e78774 53 state_timeout_timer.reset();
kolanery 26:191ec0e78774 54 state_timeout_timer.start();
kolanery 26:191ec0e78774 55 }
kolanery 26:191ec0e78774 56 state = my_mouse->solve_maze();
kolanery 26:191ec0e78774 57 if(state == RIGHT){
kolanery 26:191ec0e78774 58 flash_led(1,1,0,0);
kolanery 26:191ec0e78774 59 wait(0.25);
kolanery 26:191ec0e78774 60 driver->resetEncoders();
kolanery 26:191ec0e78774 61 }
kolanery 26:191ec0e78774 62 else if(state == LEFT){
kolanery 26:191ec0e78774 63 flash_led(1,0,1,0);
kolanery 26:191ec0e78774 64 wait(0.25);
kolanery 26:191ec0e78774 65 driver->resetEncoders();
kolanery 26:191ec0e78774 66 }
kolanery 26:191ec0e78774 67 else if(state == UTURN){
kolanery 26:191ec0e78774 68 flash_led(1,1,1,0);
kolanery 26:191ec0e78774 69 wait(0.25);
kolanery 26:191ec0e78774 70 driver->resetEncoders();
kolanery 26:191ec0e78774 71 count = 0;
kolanery 26:191ec0e78774 72 }
kolanery 26:191ec0e78774 73 finished_traverse_one_cell = false;
kolanery 26:191ec0e78774 74 }
kolanery 26:191ec0e78774 75 state_timeout_timer.start();
kolanery 26:191ec0e78774 76 if (state == STRAIGHT) {
kolanery 26:191ec0e78774 77 if (!driver->should_finish_drive_forward() && !driver-> has_front_wall()) {
kolanery 26:191ec0e78774 78 driver->drive_forward();
kolanery 26:191ec0e78774 79 flash_led(1, 0, 0, 0);
kolanery 26:191ec0e78774 80 }
kolanery 26:191ec0e78774 81 else {
kolanery 26:191ec0e78774 82 driver->clear_pid();
kolanery 26:191ec0e78774 83 driver->stop();
kolanery 26:191ec0e78774 84 driver->resetEncoders();
kolanery 26:191ec0e78774 85 flash_led (0, 0, 0, 0);
kolanery 26:191ec0e78774 86 finished_traverse_one_cell = true;
kolanery 26:191ec0e78774 87 continue;
kolanery 26:191ec0e78774 88 }
kolanery 26:191ec0e78774 89 }
kolanery 26:191ec0e78774 90 if (state == RIGHT) {
kolanery 26:191ec0e78774 91 if (!driver->should_finish_turn_right()) {
kolanery 26:191ec0e78774 92 driver->turn_right();
kolanery 26:191ec0e78774 93 flash_led (0, 1, 0, 0);
kolanery 26:191ec0e78774 94 }
kolanery 26:191ec0e78774 95 else {
kolanery 26:191ec0e78774 96 driver->stop();
kolanery 26:191ec0e78774 97 flash_led (0, 0, 0, 0);
kolanery 26:191ec0e78774 98 //finished_traverse_one_cell = true;
kolanery 26:191ec0e78774 99 state = STRAIGHT;
kolanery 26:191ec0e78774 100 driver->resetEncoders();
kolanery 26:191ec0e78774 101 driver->clear_pid();
kolanery 26:191ec0e78774 102 // wait(0.25);
kolanery 26:191ec0e78774 103 continue;
kolanery 26:191ec0e78774 104 }
kolanery 26:191ec0e78774 105 }
kolanery 26:191ec0e78774 106 if (state == LEFT) {
kolanery 26:191ec0e78774 107 if (!driver->should_finish_turn_left()) {
kolanery 26:191ec0e78774 108 driver->turn_left();
kolanery 26:191ec0e78774 109 flash_led (0, 0, 1, 0);
kolanery 26:191ec0e78774 110 }
kolanery 26:191ec0e78774 111 else {
kolanery 26:191ec0e78774 112 driver->stop();
kolanery 26:191ec0e78774 113 flash_led (0, 0, 0, 0);
kolanery 26:191ec0e78774 114 state = STRAIGHT;
kolanery 26:191ec0e78774 115 driver->resetEncoders();
kolanery 26:191ec0e78774 116 driver->clear_pid();
kolanery 26:191ec0e78774 117 continue;
kolanery 26:191ec0e78774 118 }
kolanery 26:191ec0e78774 119 }
kolanery 26:191ec0e78774 120
kolanery 26:191ec0e78774 121 if (state == UTURN){
kolanery 26:191ec0e78774 122 if (!driver->should_finish_turn_left()) {
kolanery 26:191ec0e78774 123 driver->turn_left();
kolanery 26:191ec0e78774 124 flash_led (0, 1, 1, 0);
kolanery 26:191ec0e78774 125 }
kolanery 26:191ec0e78774 126 else {
kolanery 26:191ec0e78774 127 driver->stop();
kolanery 26:191ec0e78774 128 driver->resetEncoders();
kolanery 26:191ec0e78774 129 flash_led (0, 0, 0, 0);
kolanery 26:191ec0e78774 130 count == 1 ? finished_traverse_one_cell = true: count++;
kolanery 26:191ec0e78774 131 continue;
kolanery 26:191ec0e78774 132 }
kolanery 26:191ec0e78774 133 }
kolanery 26:191ec0e78774 134 }
kolanery 26:191ec0e78774 135 flood_fill_timer.stop();
kolanery 26:191ec0e78774 136 state = count = 0;
kolanery 26:191ec0e78774 137 finished_traverse_one_cell = true;
ryan_whr 25:7155cb993870 138
kolanery 26:191ec0e78774 139 flash_led(1,1,1,1);
kolanery 16:c26d8e007df5 140 while(CONTROL) {
kolanery 26:191ec0e78774 141 check_battery();
kolanery 26:191ec0e78774 142 wait_ms(1);
ryan_whr 22:1a02d66218e4 143 if (finished_traverse_one_cell == true) {
kolanery 26:191ec0e78774 144 if (!driver->has_right_wall() && !driver->has_left_wall()) {
ryan_whr 22:1a02d66218e4 145 wait(1);
kolanery 26:191ec0e78774 146 if ((rand() % 3) == 0) {
ryan_whr 22:1a02d66218e4 147 state = LEFT;
ryan_whr 22:1a02d66218e4 148 driver->resetEncoders();
ryan_whr 22:1a02d66218e4 149 }
ryan_whr 22:1a02d66218e4 150 else {
ryan_whr 22:1a02d66218e4 151 state = RIGHT;
ryan_whr 22:1a02d66218e4 152 driver->resetEncoders();
ryan_whr 22:1a02d66218e4 153 }
ryan_whr 22:1a02d66218e4 154
ryan_whr 22:1a02d66218e4 155 }
ryan_whr 25:7155cb993870 156 else if (!driver->has_right_wall()) {
ryan_whr 22:1a02d66218e4 157 wait(0.25);
kolanery 16:c26d8e007df5 158 state = RIGHT;
kolanery 19:931f8257fb74 159 driver->resetEncoders();
kolanery 15:151e59899221 160 }
kolanery 15:151e59899221 161 else if (!driver->has_left_wall()) {
ryan_whr 22:1a02d66218e4 162 wait(0.25);
kolanery 15:151e59899221 163 state = LEFT;
kolanery 19:931f8257fb74 164 driver->resetEncoders();
kolanery 15:151e59899221 165 }
kolanery 16:c26d8e007df5 166 else if(!driver->has_front_wall()){
kolanery 15:151e59899221 167 state = STRAIGHT;
kolanery 15:151e59899221 168 driver->resetEncoders();
kolanery 14:a646667ac9ea 169 }
kolanery 16:c26d8e007df5 170 else{
ryan_whr 22:1a02d66218e4 171 wait(0.25);
kolanery 16:c26d8e007df5 172 state = UTURN;
kolanery 16:c26d8e007df5 173 driver->resetEncoders();
kolanery 16:c26d8e007df5 174 count = 0;
kolanery 16:c26d8e007df5 175 }
kolanery 16:c26d8e007df5 176 finished_traverse_one_cell = false;
kolanery 7:7215adbae3da 177 }
kolanery 16:c26d8e007df5 178
kolanery 14:a646667ac9ea 179 if (state == STRAIGHT) {
kolanery 17:043ed1d0196f 180 if (!driver->should_finish_drive_forward() && !driver-> has_front_wall()) {
kolanery 16:c26d8e007df5 181 driver->drive_forward();
kolanery 16:c26d8e007df5 182 flash_led(1, 0, 0, 0);
kolanery 16:c26d8e007df5 183 }
kolanery 16:c26d8e007df5 184 else {
kolanery 16:c26d8e007df5 185 driver->clear_pid();
kolanery 16:c26d8e007df5 186 driver->stop();
kolanery 16:c26d8e007df5 187 driver->resetEncoders();
kolanery 16:c26d8e007df5 188 flash_led (0, 0, 0, 0);
kolanery 16:c26d8e007df5 189 finished_traverse_one_cell = true;
kolanery 16:c26d8e007df5 190 continue;
kolanery 14:a646667ac9ea 191 }
kolanery 7:7215adbae3da 192 }
kolanery 14:a646667ac9ea 193 if (state == RIGHT) {
kolanery 14:a646667ac9ea 194 if (!driver->should_finish_turn_right()) {
kolanery 14:a646667ac9ea 195 driver->turn_right();
kolanery 16:c26d8e007df5 196 flash_led (0, 1, 0, 0);
kolanery 14:a646667ac9ea 197 }
kolanery 14:a646667ac9ea 198 else {
kolanery 14:a646667ac9ea 199 driver->stop();
kolanery 16:c26d8e007df5 200 flash_led (0, 0, 0, 0);
kolanery 16:c26d8e007df5 201 //finished_traverse_one_cell = true;
kolanery 16:c26d8e007df5 202 state = STRAIGHT;
kolanery 16:c26d8e007df5 203 driver->resetEncoders();
kolanery 16:c26d8e007df5 204 driver->clear_pid();
ryan_whr 22:1a02d66218e4 205 // wait(0.25);
kolanery 14:a646667ac9ea 206 continue;
kolanery 14:a646667ac9ea 207 }
kolanery 14:a646667ac9ea 208 }
kolanery 14:a646667ac9ea 209 if (state == LEFT) {
kolanery 14:a646667ac9ea 210 if (!driver->should_finish_turn_left()) {
kolanery 14:a646667ac9ea 211 driver->turn_left();
kolanery 16:c26d8e007df5 212 flash_led (0, 0, 1, 0);
kolanery 16:c26d8e007df5 213 }
kolanery 16:c26d8e007df5 214 else {
kolanery 16:c26d8e007df5 215 driver->stop();
kolanery 16:c26d8e007df5 216 flash_led (0, 0, 0, 0);
kolanery 16:c26d8e007df5 217 state = STRAIGHT;
kolanery 16:c26d8e007df5 218 driver->resetEncoders();
kolanery 16:c26d8e007df5 219 driver->clear_pid();
kolanery 16:c26d8e007df5 220 continue;
kolanery 16:c26d8e007df5 221 }
kolanery 16:c26d8e007df5 222 }
kolanery 16:c26d8e007df5 223
kolanery 16:c26d8e007df5 224 if (state == UTURN){
kolanery 16:c26d8e007df5 225 if (!driver->should_finish_turn_left()) {
kolanery 16:c26d8e007df5 226 driver->turn_left();
kolanery 16:c26d8e007df5 227 flash_led (0, 1, 1, 0);
kolanery 14:a646667ac9ea 228 }
kolanery 14:a646667ac9ea 229 else {
kolanery 14:a646667ac9ea 230 driver->stop();
kolanery 16:c26d8e007df5 231 driver->resetEncoders();
kolanery 16:c26d8e007df5 232 flash_led (0, 0, 0, 0);
kolanery 16:c26d8e007df5 233 count == 1 ? finished_traverse_one_cell = true: count++;
kolanery 16:c26d8e007df5 234 continue;
kolanery 16:c26d8e007df5 235 }
kolanery 20:b18eed69ee32 236 }
kolanery 16:c26d8e007df5 237 }
kolanery 26:191ec0e78774 238 }