My Version of CreaBotLib

Fork of CreaBotLib by CreaLab

Committer:
sepp_nepp
Date:
Tue Jan 01 13:05:08 2019 +0000
Revision:
7:3a793ddc3490
Parent:
6:4d8938b686a6
Child:
9:efe9f76d6f76
uncommented doxy

Who changed what in which revision?

UserRevisionLine numberNew contents of line
garphil 0:a7fb03c9ea9d 1 #include "CreaBot.h"
garphil 0:a7fb03c9ea9d 2
sepp_nepp 5:efe80c5db389 3 // *****************************************************************
sepp_nepp 6:4d8938b686a6 4 // BotCommand Structure Helper
sepp_nepp 5:efe80c5db389 5 // *****************************************************************
sepp_nepp 5:efe80c5db389 6
sepp_nepp 6:4d8938b686a6 7 // Struct Helper; set structure fields to values */
sepp_nepp 7:3a793ddc3490 8 void BotCommand::set(BotCmdVerb Acommand, float Aangle_deg, float Adist_cm)
sepp_nepp 6:4d8938b686a6 9 { command = Acommand;
sepp_nepp 6:4d8938b686a6 10 dist_cm = Adist_cm;
sepp_nepp 6:4d8938b686a6 11 angle_deg= Aangle_deg;
sepp_nepp 6:4d8938b686a6 12 };
sepp_nepp 6:4d8938b686a6 13
sepp_nepp 6:4d8938b686a6 14 // Struct Helper; set structure fields to values */
sepp_nepp 7:3a793ddc3490 15 void BotCommand::set(BotCmdVerb Acommand, float Aparam)
sepp_nepp 6:4d8938b686a6 16 { command = Acommand;
sepp_nepp 7:3a793ddc3490 17 dist_cm = Aparam;
sepp_nepp 7:3a793ddc3490 18 angle_deg= Aparam;
sepp_nepp 5:efe80c5db389 19 };
sepp_nepp 5:efe80c5db389 20
sepp_nepp 6:4d8938b686a6 21 // *****************************************************************
sepp_nepp 7:3a793ddc3490 22 // circle_geos Structure Helper
sepp_nepp 7:3a793ddc3490 23 // *****************************************************************
sepp_nepp 7:3a793ddc3490 24
sepp_nepp 7:3a793ddc3490 25 void circle_geos:( float Adiam_cm) /**< Helper; set diameter and perim to values */
sepp_nepp 7:3a793ddc3490 26 {
sepp_nepp 7:3a793ddc3490 27 diam_cm = Adiam_cm;
sepp_nepp 7:3a793ddc3490 28 perim_cm = PI*diam_cm;
sepp_nepp 7:3a793ddc3490 29 degree_per_cm=360.0f/perim_cm;
sepp_nepp 7:3a793ddc3490 30 }
sepp_nepp 7:3a793ddc3490 31
sepp_nepp 7:3a793ddc3490 32 // *****************************************************************
sepp_nepp 6:4d8938b686a6 33 // CommandFIFO Class
sepp_nepp 6:4d8938b686a6 34 // *****************************************************************
sepp_nepp 6:4d8938b686a6 35
sepp_nepp 6:4d8938b686a6 36 // Class Creator: initializes an empties FIFO
sepp_nepp 7:3a793ddc3490 37 CommandFIFO::CommandFIFO()
sepp_nepp 7:3a793ddc3490 38 { readIdx = writeIdx = Count = 0;
sepp_nepp 6:4d8938b686a6 39 cmd_idle.set(IDLE, 0, 0);
sepp_nepp 6:4d8938b686a6 40 }
sepp_nepp 6:4d8938b686a6 41
sepp_nepp 6:4d8938b686a6 42 // Reserve a new element at the head of the FIFO
sepp_nepp 6:4d8938b686a6 43 BotCommand *CommandFIFO::put()
sepp_nepp 6:4d8938b686a6 44 {
sepp_nepp 6:4d8938b686a6 45 if( !isFull() ) {
sepp_nepp 5:efe80c5db389 46 int old_writeIdx = writeIdx;
sepp_nepp 5:efe80c5db389 47 writeIdx++;
sepp_nepp 6:4d8938b686a6 48 if (writeIdx==DEPTH_FIFO) writeIdx=0;
sepp_nepp 7:3a793ddc3490 49 Count++;
sepp_nepp 5:efe80c5db389 50 return &cmd[old_writeIdx];
sepp_nepp 6:4d8938b686a6 51 } else
sepp_nepp 5:efe80c5db389 52 return NULL;
sepp_nepp 5:efe80c5db389 53 }; // put()
sepp_nepp 5:efe80c5db389 54
sepp_nepp 6:4d8938b686a6 55 // Get and remove the oldest element at the tail of the FIFO
sepp_nepp 6:4d8938b686a6 56 BotCommand *CommandFIFO::get()
sepp_nepp 6:4d8938b686a6 57 {
sepp_nepp 5:efe80c5db389 58 if ( !isEmpty() ) {
sepp_nepp 6:4d8938b686a6 59 int old_readIdx = readIdx;
sepp_nepp 5:efe80c5db389 60 readIdx++;
sepp_nepp 6:4d8938b686a6 61 if (readIdx==DEPTH_FIFO) readIdx=0;
sepp_nepp 7:3a793ddc3490 62 Count--;
sepp_nepp 5:efe80c5db389 63 return &cmd[old_readIdx];
sepp_nepp 6:4d8938b686a6 64 } else
sepp_nepp 5:efe80c5db389 65 return NULL;
sepp_nepp 5:efe80c5db389 66 }; // get()
sepp_nepp 5:efe80c5db389 67
sepp_nepp 5:efe80c5db389 68 // *****************************************************************
sepp_nepp 5:efe80c5db389 69 // Creabot Class
sepp_nepp 5:efe80c5db389 70 // *****************************************************************
sepp_nepp 5:efe80c5db389 71
sepp_nepp 7:3a793ddc3490 72 Creabot::Creabot(Motor *left, Motor *right, float diameter_wheel_cm, float bot_diam_cm):
sepp_nepp 7:3a793ddc3490 73 motor_left(left), motor_right(right),
garphil 0:a7fb03c9ea9d 74 {
sepp_nepp 7:3a793ddc3490 75 // Initialize wheel and bot geometires
sepp_nepp 7:3a793ddc3490 76 wheel.setDiam(wheel_diam_cm);
sepp_nepp 7:3a793ddc3490 77 bot.setDiam(bot_diam_cm);
sepp_nepp 7:3a793ddc3490 78 // some other parameters:
sepp_nepp 7:3a793ddc3490 79 ratio_wheel_bot=bot_diam_cm/wheel_diam_cm;
sepp_nepp 7:3a793ddc3490 80 bot_speed_cm_sec = DEFAULT_SPEED_CM_SEC;
garphil 0:a7fb03c9ea9d 81
sepp_nepp 6:4d8938b686a6 82 // Attach the Crabot functions as callbacks to the motors
sepp_nepp 6:4d8938b686a6 83 motor_left->callbackSet(this, &Creabot::cbLeftMotStopped);
sepp_nepp 6:4d8938b686a6 84 motor_right->callbackSet(this, &Creabot::cbRightMotStopped);
sepp_nepp 6:4d8938b686a6 85 // Initialize own callback as empty
garphil 0:a7fb03c9ea9d 86 extCallBack = NULL;
sepp_nepp 6:4d8938b686a6 87
sepp_nepp 6:4d8938b686a6 88 // Initialize the own status fields
sepp_nepp 7:3a793ddc3490 89 MotState = LRMOTS_STOP;
sepp_nepp 6:4d8938b686a6 90 executingFifo= false;
garphil 0:a7fb03c9ea9d 91 }
garphil 0:a7fb03c9ea9d 92
sepp_nepp 6:4d8938b686a6 93 void Creabot::fifo(BotCmdVerb moveType, float angle_or_cm)
garphil 0:a7fb03c9ea9d 94 {
sepp_nepp 6:4d8938b686a6 95 BotCommand *cmd = fifoBot.put();
sepp_nepp 5:efe80c5db389 96 if(cmd != NULL) {
sepp_nepp 6:4d8938b686a6 97 cmd->set(moveType, angle_or_cm, 0);
sepp_nepp 5:efe80c5db389 98 }
garphil 0:a7fb03c9ea9d 99 executeFifo();
garphil 0:a7fb03c9ea9d 100 }
garphil 0:a7fb03c9ea9d 101
sepp_nepp 6:4d8938b686a6 102 void Creabot::fifo(BotCmdVerb moveType, float angle_deg, float dist_cm)
sepp_nepp 5:efe80c5db389 103 {
sepp_nepp 6:4d8938b686a6 104 BotCommand *cmd = fifoBot.put();
sepp_nepp 5:efe80c5db389 105 if(cmd!=NULL) {
sepp_nepp 6:4d8938b686a6 106 cmd->set(moveType, angle_deg, dist_cm);
sepp_nepp 5:efe80c5db389 107 }
sepp_nepp 5:efe80c5db389 108 executeFifo();
sepp_nepp 5:efe80c5db389 109 }
garphil 0:a7fb03c9ea9d 110
garphil 0:a7fb03c9ea9d 111 void Creabot::flushFifo()
garphil 0:a7fb03c9ea9d 112 {
garphil 0:a7fb03c9ea9d 113 fifoBot.empty();
garphil 0:a7fb03c9ea9d 114 if(executingFifo) botTicker.detach();
garphil 0:a7fb03c9ea9d 115 executingFifo=false;
garphil 0:a7fb03c9ea9d 116 }
sepp_nepp 5:efe80c5db389 117
garphil 0:a7fb03c9ea9d 118 int Creabot::moveInFifo()
garphil 0:a7fb03c9ea9d 119 {
sepp_nepp 5:efe80c5db389 120 return fifoBot.getCount();
sepp_nepp 5:efe80c5db389 121 }
sepp_nepp 5:efe80c5db389 122
sepp_nepp 5:efe80c5db389 123 void Creabot::spirale(float b, float turns) {
sepp_nepp 6:4d8938b686a6 124 float r=0.0f;
sepp_nepp 6:4d8938b686a6 125 float angle_deg = 0.0f;
sepp_nepp 6:4d8938b686a6 126 while(angle_deg < float( 360.0f * turns) ) {
sepp_nepp 5:efe80c5db389 127 this->moveAndWait(RIGHT, 10, r);
sepp_nepp 5:efe80c5db389 128 r=r+b;
sepp_nepp 5:efe80c5db389 129 }
sepp_nepp 5:efe80c5db389 130 }
sepp_nepp 5:efe80c5db389 131
sepp_nepp 5:efe80c5db389 132 // This is the own callback function of the ticker, that works throught the FIFO stack
sepp_nepp 5:efe80c5db389 133 void Creabot::executeFifo()
sepp_nepp 5:efe80c5db389 134 { if (fifoBot.isEmpty()) flushFifo();
sepp_nepp 5:efe80c5db389 135 else {
sepp_nepp 5:efe80c5db389 136 if(endMove) {
sepp_nepp 6:4d8938b686a6 137 BotCommand *cmd = fifoBot.get();
sepp_nepp 5:efe80c5db389 138 executeCommand(cmd);
sepp_nepp 5:efe80c5db389 139 if (!executingFifo) botTicker.attach_us( callback( this, &Creabot::executeFifo), 3150);
sepp_nepp 5:efe80c5db389 140 executingFifo=true;
sepp_nepp 5:efe80c5db389 141 }
sepp_nepp 5:efe80c5db389 142 }
sepp_nepp 5:efe80c5db389 143 }
sepp_nepp 5:efe80c5db389 144
sepp_nepp 7:3a793ddc3490 145 //**************************************************************************
sepp_nepp 7:3a793ddc3490 146 // Using the BotCmdVerb to encode different commands, done immediately
sepp_nepp 7:3a793ddc3490 147 //**************************************************************************
sepp_nepp 7:3a793ddc3490 148
sepp_nepp 7:3a793ddc3490 149 void Creabot::moveAndWait(BotCmdVerb moveType, float Aparam)
sepp_nepp 5:efe80c5db389 150 {
sepp_nepp 7:3a793ddc3490 151 move(moveType,Aparam);
sepp_nepp 7:3a793ddc3490 152 waitEndMove();
sepp_nepp 5:efe80c5db389 153 }
sepp_nepp 5:efe80c5db389 154
sepp_nepp 7:3a793ddc3490 155 void Creabot::moveAndWait(BotCmdVerb moveType, float Aangle_deg, float Adist_cm)
sepp_nepp 5:efe80c5db389 156 {
sepp_nepp 7:3a793ddc3490 157 move(moveType,Aangle_deg,Adist_cm);
sepp_nepp 7:3a793ddc3490 158 waitEndMove();
sepp_nepp 5:efe80c5db389 159 }
sepp_nepp 5:efe80c5db389 160
sepp_nepp 7:3a793ddc3490 161
sepp_nepp 7:3a793ddc3490 162 void Creabot::move(BotCmdVerb moveType, float Aparam)
sepp_nepp 7:3a793ddc3490 163 { move(moveType, Aparam, Aparam)
sepp_nepp 7:3a793ddc3490 164 }
sepp_nepp 7:3a793ddc3490 165
sepp_nepp 7:3a793ddc3490 166 void Creabot::move(BotCmdVerb moveType, float Aangle_deg, float Adist_cm)
sepp_nepp 7:3a793ddc3490 167 { BotCommand Anew_cmd;
sepp_nepp 7:3a793ddc3490 168 Anew_cmd.set(moveType, Aangle_deg, Adist_cm);
sepp_nepp 7:3a793ddc3490 169 executeCommand(&Anew_cmd);
sepp_nepp 7:3a793ddc3490 170 }
sepp_nepp 7:3a793ddc3490 171
sepp_nepp 7:3a793ddc3490 172 // Direct Command Execution, also called by FIFO-Handler.
sepp_nepp 6:4d8938b686a6 173 void Creabot::executeCommand(BotCommand *cmd) {
garphil 0:a7fb03c9ea9d 174 switch (cmd->command) {
garphil 0:a7fb03c9ea9d 175 case FORWARD:
sepp_nepp 6:4d8938b686a6 176 moveForward(cmd->dist_cm);
garphil 0:a7fb03c9ea9d 177 break;
garphil 0:a7fb03c9ea9d 178 case BACKWARD:
sepp_nepp 6:4d8938b686a6 179 moveBackward(cmd->dist_cm);
garphil 0:a7fb03c9ea9d 180 break;
garphil 0:a7fb03c9ea9d 181 case ROTATE:
sepp_nepp 6:4d8938b686a6 182 rotate(cmd->angle_deg);
garphil 0:a7fb03c9ea9d 183 break;
garphil 0:a7fb03c9ea9d 184 case LEFT:
sepp_nepp 6:4d8938b686a6 185 moveLeft(cmd->angle_deg, cmd->dist_cm);
garphil 0:a7fb03c9ea9d 186 break;
garphil 0:a7fb03c9ea9d 187 case RIGHT:
sepp_nepp 6:4d8938b686a6 188 moveRight(cmd->angle_deg, cmd->dist_cm);
garphil 0:a7fb03c9ea9d 189 break;
garphil 0:a7fb03c9ea9d 190 case IDLE:
garphil 0:a7fb03c9ea9d 191 default:
garphil 0:a7fb03c9ea9d 192 break;
garphil 0:a7fb03c9ea9d 193 };
sepp_nepp 5:efe80c5db389 194 }; // executeCommand
sepp_nepp 5:efe80c5db389 195
sepp_nepp 6:4d8938b686a6 196 void Creabot::stopAll()
sepp_nepp 6:4d8938b686a6 197 {
sepp_nepp 6:4d8938b686a6 198 flushFifo();
sepp_nepp 6:4d8938b686a6 199 stopMotors();
sepp_nepp 6:4d8938b686a6 200 }
sepp_nepp 6:4d8938b686a6 201
garphil 0:a7fb03c9ea9d 202
sepp_nepp 7:3a793ddc3490 203
sepp_nepp 7:3a793ddc3490 204 // *****************************************************************
sepp_nepp 7:3a793ddc3490 205 // Creabot Mid level control functions:
sepp_nepp 7:3a793ddc3490 206 // all directly access the motor, no FIFO */
sepp_nepp 7:3a793ddc3490 207 // *****************************************************************
sepp_nepp 7:3a793ddc3490 208
sepp_nepp 7:3a793ddc3490 209 // set bot_speed_cm_sec parameter for next high level commands
sepp_nepp 7:3a793ddc3490 210 void Creabot::setBotSpeed(float Abot_speed_cm_sec)
sepp_nepp 7:3a793ddc3490 211 {
sepp_nepp 7:3a793ddc3490 212 if (Abot_speed_cm_sec < MAX_SPEED_CM_P_SEC) && (Abot_speed_cm_sec>MIN_SPEED_CM_SEC)
sepp_nepp 7:3a793ddc3490 213 bot_speed_cm_sec = Abot_speed_cm_sec;
sepp_nepp 7:3a793ddc3490 214 // Low level setting of motor speed is done inside SetMotsSpeed:
sepp_nepp 7:3a793ddc3490 215 }
garphil 0:a7fb03c9ea9d 216
sepp_nepp 7:3a793ddc3490 217 // Mid level control function: move bot forward for a given distance
sepp_nepp 7:3a793ddc3490 218 void Creabot::moveForward(float dist_cm)
sepp_nepp 7:3a793ddc3490 219 {
sepp_nepp 7:3a793ddc3490 220 if (dist_cm<0) moveBackward(-dist_cm);
sepp_nepp 7:3a793ddc3490 221 else {
sepp_nepp 7:3a793ddc3490 222 float angle_deg = dist_cm*wheel.degree_per_cm;
sepp_nepp 7:3a793ddc3490 223 setMotorsSpeed(bot_speed_cm_sec);
sepp_nepp 7:3a793ddc3490 224 moveMotorLeft(COUNTERCLOCKWISE, angle_deg);
sepp_nepp 7:3a793ddc3490 225 moveMotorRight(CLOCKWISE, angle_deg);
sepp_nepp 7:3a793ddc3490 226 }
sepp_nepp 7:3a793ddc3490 227 }
sepp_nepp 7:3a793ddc3490 228
sepp_nepp 7:3a793ddc3490 229 // Mid level control function: move bot backwards for a given distance
sepp_nepp 7:3a793ddc3490 230 void Creabot::moveBackward(float dist_cm)
sepp_nepp 7:3a793ddc3490 231 {
sepp_nepp 7:3a793ddc3490 232 if(dist_cm<0) moveForward(-dist_cm);
sepp_nepp 7:3a793ddc3490 233 else {
sepp_nepp 7:3a793ddc3490 234 float angle_deg = dist_cm*wheel.degree_per_cm;
sepp_nepp 7:3a793ddc3490 235 setMotorsSpeed(bot_speed_cm_sec);
sepp_nepp 7:3a793ddc3490 236 moveMotorLeft(CLOCKWISE, angle_deg);
sepp_nepp 7:3a793ddc3490 237 moveMotorRight(COUNTERCLOCKWISE, angle_deg);
sepp_nepp 7:3a793ddc3490 238 }
sepp_nepp 7:3a793ddc3490 239 }
sepp_nepp 7:3a793ddc3490 240
sepp_nepp 7:3a793ddc3490 241 /* Mid level control function: turn bot forward right,
sepp_nepp 7:3a793ddc3490 242 around a radius twice the bot size */
sepp_nepp 6:4d8938b686a6 243 void Creabot::moveRight(float angle_deg)
sepp_nepp 5:efe80c5db389 244 {
sepp_nepp 7:3a793ddc3490 245 moveRight(angle_deg,bot.diam_cm);
garphil 0:a7fb03c9ea9d 246 }
garphil 0:a7fb03c9ea9d 247
sepp_nepp 7:3a793ddc3490 248 /* Mid level control function: turn bot forward right,
sepp_nepp 7:3a793ddc3490 249 around a radius that is center_cm away from the right wheel*/
sepp_nepp 6:4d8938b686a6 250 void Creabot::moveRight(float angle_deg, float center_cm)
sepp_nepp 5:efe80c5db389 251 {
sepp_nepp 5:efe80c5db389 252 if(center_cm<0) center_cm=0; /* TO remove? */
sepp_nepp 7:3a793ddc3490 253 float perimeter_outer = 2.0f*angle_deg*(center_cm+bot.diam_cm)*PI/360.0f;
sepp_nepp 6:4d8938b686a6 254 float perimeter_inner = 2.0f*angle_deg*(center_cm)*PI/360.0f;
sepp_nepp 7:3a793ddc3490 255 float angleLeft = perimeter_outer*wheel.degree_per_cm;
sepp_nepp 7:3a793ddc3490 256 float angleRight = perimeter_inner*wheel.degree_per_cm;
sepp_nepp 5:efe80c5db389 257 float ratio = angleRight/angleLeft;
sepp_nepp 7:3a793ddc3490 258 float speedRight = bot_speed_cm_sec * ratio;
sepp_nepp 7:3a793ddc3490 259 setMotSpeed(motor_left,bot_speed_cm_sec);
sepp_nepp 7:3a793ddc3490 260 setMotSpeed(motor_right,speedRight);
sepp_nepp 5:efe80c5db389 261 moveMotorLeft(COUNTERCLOCKWISE, angleLeft);
sepp_nepp 5:efe80c5db389 262 moveMotorRight(CLOCKWISE, angleRight);
sepp_nepp 5:efe80c5db389 263 }
sepp_nepp 5:efe80c5db389 264
sepp_nepp 7:3a793ddc3490 265 /* Mid level control function: turn bot forward left,
sepp_nepp 7:3a793ddc3490 266 around a radius twice the bot size */
sepp_nepp 6:4d8938b686a6 267 void Creabot::moveLeft(float angle_deg)
sepp_nepp 5:efe80c5db389 268 {
sepp_nepp 6:4d8938b686a6 269 moveLeft(angle_deg,0);
garphil 4:531b1120d3ec 270 }
garphil 4:531b1120d3ec 271
sepp_nepp 7:3a793ddc3490 272 /* Mid level control function: turn bot forward left,
sepp_nepp 7:3a793ddc3490 273 around a radius that is center_cm away from the left wheel*/
sepp_nepp 6:4d8938b686a6 274 void Creabot::moveLeft(float angle_deg, float center_cm)
garphil 0:a7fb03c9ea9d 275 {
sepp_nepp 7:3a793ddc3490 276 if (center_cm<0) center_cm=0; /* TO remove? */
sepp_nepp 7:3a793ddc3490 277 float perimeter_outer = 2.0f*angle_deg*(center_cm+bot.diam_cm)*PI/360.0f;
sepp_nepp 6:4d8938b686a6 278 float perimeter_inner = 2.0f*angle_deg*(center_cm)*PI/360.0f;
sepp_nepp 7:3a793ddc3490 279 float angleLeft = perimeter_inner*wheel.degree_per_cm;
sepp_nepp 7:3a793ddc3490 280 float angleRight = perimeter_outer*wheel.degree_per_cm;
sepp_nepp 5:efe80c5db389 281 float ratio = angleLeft/angleRight;
sepp_nepp 7:3a793ddc3490 282 float speedRLeft = bot_speed_cm_sec * ratio;
sepp_nepp 7:3a793ddc3490 283 setMotSpeed(motor_left,speedRLeft);
sepp_nepp 7:3a793ddc3490 284 setMotSpeed(motor_right,bot_speed_cm_sec);
sepp_nepp 5:efe80c5db389 285 moveMotorLeft(COUNTERCLOCKWISE, angleLeft);
sepp_nepp 5:efe80c5db389 286 moveMotorRight(CLOCKWISE, angleRight);
garphil 0:a7fb03c9ea9d 287 }
garphil 0:a7fb03c9ea9d 288
sepp_nepp 7:3a793ddc3490 289 /* Mid level control function: turn bot on its place for a given angle.
sepp_nepp 7:3a793ddc3490 290 positive angles turn right, negative angles turn left*/
sepp_nepp 7:3a793ddc3490 291 void Creabot::rotate(float angleBot)
garphil 0:a7fb03c9ea9d 292 {
sepp_nepp 7:3a793ddc3490 293 float angleWheel = angleBot*ratio_wheel_bot;
sepp_nepp 7:3a793ddc3490 294 setSpeed(bot_speed_cm_sec);
sepp_nepp 7:3a793ddc3490 295 if(angleBot<0) {
sepp_nepp 7:3a793ddc3490 296 moveMotorLeft(CLOCKWISE, -angleWheel);
sepp_nepp 7:3a793ddc3490 297 moveMotorRight(CLOCKWISE, -angleWheel);
sepp_nepp 7:3a793ddc3490 298 } else {
sepp_nepp 7:3a793ddc3490 299 moveMotorLeft(COUNTERCLOCKWISE, angleWheel);
sepp_nepp 7:3a793ddc3490 300 moveMotorRight(COUNTERCLOCKWISE, angleWheel);
sepp_nepp 6:4d8938b686a6 301 }
sepp_nepp 5:efe80c5db389 302 }
sepp_nepp 5:efe80c5db389 303
sepp_nepp 7:3a793ddc3490 304 /* spends all time with waits, returns only once MotorState = LRMOTS_STOP */
sepp_nepp 7:3a793ddc3490 305 void Creabot::waitEndMotors()
sepp_nepp 7:3a793ddc3490 306 { while(MotState!=LRMOTS_STOP) wait(0.1); }
sepp_nepp 7:3a793ddc3490 307
sepp_nepp 7:3a793ddc3490 308 /* spends all time with waits, returns only once MotorState = LRMOTS_STOP,
sepp_nepp 7:3a793ddc3490 309 but maximum max_wait_ms milli seconds */
sepp_nepp 7:3a793ddc3490 310 void Creabot::waitEndMotors(uint32_t max_wait_ms)
sepp_nepp 7:3a793ddc3490 311 { uint32_t waited=0;
sepp_nepp 7:3a793ddc3490 312 while( (MotState!=LRMOTS_STOP) && (waited < max_wait_ms) )
sepp_nepp 7:3a793ddc3490 313 { wait(0.1); waited += 100; }
sepp_nepp 7:3a793ddc3490 314 } // waitEndMotors
sepp_nepp 7:3a793ddc3490 315
sepp_nepp 7:3a793ddc3490 316 //******************************************************************************
sepp_nepp 7:3a793ddc3490 317 // low level motor functions, only filters for angle_deg>0, then passes
sepp_nepp 7:3a793ddc3490 318 // to Motor Class; and remembers that a motor moves
sepp_nepp 7:3a793ddc3490 319 //******************************************************************************
sepp_nepp 7:3a793ddc3490 320
sepp_nepp 7:3a793ddc3490 321 /* Low level access functions: sets both motor speeds immediately */
sepp_nepp 7:3a793ddc3490 322 void Creabot::setMotorsSpeed(float mot_speed_cm_sec)
sepp_nepp 5:efe80c5db389 323 {
sepp_nepp 7:3a793ddc3490 324 setMotSpeed(motor_left,mot_speed_cm_sec);
sepp_nepp 7:3a793ddc3490 325 setMotSpeed(motor_right,mot_speed_cm_sec);
sepp_nepp 5:efe80c5db389 326 }
sepp_nepp 5:efe80c5db389 327
sepp_nepp 7:3a793ddc3490 328
sepp_nepp 7:3a793ddc3490 329 void Creabot::setMotorSpeed(Motor *motor, float speed_cm_sec)
sepp_nepp 7:3a793ddc3490 330 { if (speed_cm_sec < MIN_SPEED_CM_SEC) // catch too small or negative speeds
sepp_nepp 7:3a793ddc3490 331 motor->setStepTime_us( 1000000 ); // arbitrary value
sepp_nepp 7:3a793ddc3490 332 else
sepp_nepp 7:3a793ddc3490 333 { motor->setStepTime_us( wheel.perim_cm * 1000000 /
sepp_nepp 7:3a793ddc3490 334 speed_cm_sec / motor->getStepsFullTurn() ) ; }
sepp_nepp 6:4d8938b686a6 335 }
sepp_nepp 6:4d8938b686a6 336
sepp_nepp 7:3a793ddc3490 337 void Creabot::moveMotorLeft(motorDir dir, float angle_deg)
sepp_nepp 7:3a793ddc3490 338 { if(angle_deg>0) {
sepp_nepp 7:3a793ddc3490 339 motor_left->RunDegrees(dir, angle_deg);
sepp_nepp 7:3a793ddc3490 340 if (MotState==RMOT_RUNS) MotState=LRMOTS_RUN;
sepp_nepp 7:3a793ddc3490 341 else MotState=LMOT_RUNS;
sepp_nepp 7:3a793ddc3490 342 }
sepp_nepp 5:efe80c5db389 343 }
sepp_nepp 5:efe80c5db389 344
sepp_nepp 7:3a793ddc3490 345 void Creabot::moveMotorRight(motorDir dir, float angle_deg)
sepp_nepp 7:3a793ddc3490 346 { if(angle_deg>0) {
sepp_nepp 7:3a793ddc3490 347 motor_right->RunDegrees(dir, angle_deg);
sepp_nepp 7:3a793ddc3490 348 if (MotState==LMOT_RUNS) MotState=LRMOTS_RUN;
sepp_nepp 7:3a793ddc3490 349 else MotState=RMOT_RUNS;
sepp_nepp 7:3a793ddc3490 350 }
sepp_nepp 7:3a793ddc3490 351 }
sepp_nepp 6:4d8938b686a6 352
sepp_nepp 6:4d8938b686a6 353 void Creabot::stopMotors()
sepp_nepp 6:4d8938b686a6 354 {
sepp_nepp 6:4d8938b686a6 355 motor_left->MotorOFF();
sepp_nepp 6:4d8938b686a6 356 motor_right->MotorOFF();
sepp_nepp 6:4d8938b686a6 357 AllMotorsStopped()
sepp_nepp 6:4d8938b686a6 358 }
sepp_nepp 6:4d8938b686a6 359
sepp_nepp 7:3a793ddc3490 360
sepp_nepp 7:3a793ddc3490 361 //******************************************************************************
sepp_nepp 7:3a793ddc3490 362 // low level motor functions, handles callbacks from motors
sepp_nepp 7:3a793ddc3490 363 // *****************************************************************************
sepp_nepp 7:3a793ddc3490 364 void Creabot::setCallBack(void (*Acallback)(int status))
sepp_nepp 6:4d8938b686a6 365 {
sepp_nepp 7:3a793ddc3490 366 extCallBack = Acallback;
sepp_nepp 6:4d8938b686a6 367 }
sepp_nepp 6:4d8938b686a6 368
sepp_nepp 7:3a793ddc3490 369 void Creabot::cbLeftMotStopped()
sepp_nepp 7:3a793ddc3490 370 {
sepp_nepp 7:3a793ddc3490 371 if (MotState==LRMOTS_RUN) MotState = RMOT_RUNS;
sepp_nepp 7:3a793ddc3490 372 else AllMotorsStopped();
sepp_nepp 7:3a793ddc3490 373 }
sepp_nepp 7:3a793ddc3490 374
sepp_nepp 7:3a793ddc3490 375 void Creabot::cbRightMotStopped()
sepp_nepp 7:3a793ddc3490 376 {
sepp_nepp 7:3a793ddc3490 377 if (MotState==LRMOTS_RUN) MotState = LMOT_RUNS;
sepp_nepp 7:3a793ddc3490 378 else AllMotorsStopped();
sepp_nepp 7:3a793ddc3490 379 }
sepp_nepp 7:3a793ddc3490 380
sepp_nepp 7:3a793ddc3490 381 void Creabot::AllMotorsStopped()
sepp_nepp 7:3a793ddc3490 382 {
sepp_nepp 7:3a793ddc3490 383 if (MotState!=LRMOTS_STOP)
sepp_nepp 7:3a793ddc3490 384 { // Only do all this here if motor state is not already in LRMOTS_STOP!
sepp_nepp 7:3a793ddc3490 385 MotState = LRMOTS_STOP;
sepp_nepp 7:3a793ddc3490 386 if(extCallBack!=NULL) extCallBack( MotState );
sepp_nepp 6:4d8938b686a6 387 }
sepp_nepp 6:4d8938b686a6 388 }
sepp_nepp 6:4d8938b686a6 389
sepp_nepp 7:3a793ddc3490 390
sepp_nepp 7:3a793ddc3490 391