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: BridgeDriver FrontPanelButtons MCP23017 SDFileSystem TextLCD mbed
Devices/Motor.cpp@10:e8db892fbc52, 2014-09-24 (annotated)
- Committer:
- mehatfie
- Date:
- Wed Sep 24 22:54:36 2014 +0000
- Revision:
- 10:e8db892fbc52
- Parent:
- 9:5a0c4c6e39c7
- Child:
- 11:bc9cd2869f95
- Dummy Mode implemented with code functioning after compile; --- goes through all of the code, but doesn't actually turn anything on or run any physical functionality, it simple performs syntax checking on the entire programming, and resets and runs
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| mehatfie | 2:3e7baa3e3fec | 1 | #include "Motor.hpp" |
| mehatfie | 2:3e7baa3e3fec | 2 | |
| mehatfie | 2:3e7baa3e3fec | 3 | //Constructor |
| mehatfie | 5:e36e0538a903 | 4 | Motor::Motor(LineData lineData){ |
| mehatfie | 2:3e7baa3e3fec | 5 | |
| mehatfie | 9:5a0c4c6e39c7 | 6 | //Order of Line: Command, Local_Name, MOTOR, MotorID(A,B,C,D) |
| mehatfie | 9:5a0c4c6e39c7 | 7 | //Since we can't return from a constructor, instead we'll flip a flag, and check it after we've added the device in interpretCommand |
| mehatfie | 9:5a0c4c6e39c7 | 8 | if (lineData.numWords != 4) |
| mehatfie | 9:5a0c4c6e39c7 | 9 | this->errorFlag = 1; |
| mehatfie | 9:5a0c4c6e39c7 | 10 | |
| mehatfie | 2:3e7baa3e3fec | 11 | string channel = lineData.word[3]; //Parameter is a single character, so dereference the point to the word |
| mehatfie | 2:3e7baa3e3fec | 12 | |
| mehatfie | 2:3e7baa3e3fec | 13 | if ((channel.compare("A") == 0) || (channel.compare("a") == 0)) |
| mehatfie | 2:3e7baa3e3fec | 14 | this->motor = BridgeDriver::MOTOR_A; |
| mehatfie | 2:3e7baa3e3fec | 15 | else if ((channel.compare("B") == 0) || (channel.compare("b") == 0)) |
| mehatfie | 2:3e7baa3e3fec | 16 | this->motor = BridgeDriver::MOTOR_B; |
| mehatfie | 2:3e7baa3e3fec | 17 | else if ((channel.compare("C") == 0) || (channel.compare("c") == 0)) |
| mehatfie | 2:3e7baa3e3fec | 18 | this->motor = BridgeDriver::MOTOR_C; |
| mehatfie | 2:3e7baa3e3fec | 19 | else if ((channel.compare("D") == 0) || (channel.compare("d") == 0)) |
| mehatfie | 2:3e7baa3e3fec | 20 | this->motor = BridgeDriver::MOTOR_D; |
| mehatfie | 9:5a0c4c6e39c7 | 21 | |
| mehatfie | 9:5a0c4c6e39c7 | 22 | //MotorID not known |
| mehatfie | 9:5a0c4c6e39c7 | 23 | else |
| mehatfie | 9:5a0c4c6e39c7 | 24 | this->errorFlag = 1; |
| mehatfie | 9:5a0c4c6e39c7 | 25 | |
| mehatfie | 6:d1594fd2ec5a | 26 | bridges.enablePwm(this->motor, 1); |
| mehatfie | 2:3e7baa3e3fec | 27 | } |
| mehatfie | 2:3e7baa3e3fec | 28 | |
| mehatfie | 2:3e7baa3e3fec | 29 | |
| mehatfie | 2:3e7baa3e3fec | 30 | enum BridgeDriver::Motors Motor::getMotor(){ |
| mehatfie | 2:3e7baa3e3fec | 31 | return this->motor; |
| mehatfie | 2:3e7baa3e3fec | 32 | } |
| mehatfie | 2:3e7baa3e3fec | 33 | |
| mehatfie | 2:3e7baa3e3fec | 34 | //A line consists of [ __(Local_Name)__ __(function)__ __(parameter1)__ __(parameter2)__ __(parameter3)__ ... and so on] |
| mehatfie | 5:e36e0538a903 | 35 | int Motor::interpret(LineData &lineData){ |
| mehatfie | 9:5a0c4c6e39c7 | 36 | |
| mehatfie | 2:3e7baa3e3fec | 37 | //Order of Line: Local_Name, Function_Name, Param1, Param2, Param3,....... |
| mehatfie | 2:3e7baa3e3fec | 38 | string func = lineData.word[1]; |
| mehatfie | 2:3e7baa3e3fec | 39 | |
| mehatfie | 2:3e7baa3e3fec | 40 | /******************************************************************************/ |
| mehatfie | 2:3e7baa3e3fec | 41 | /*** <Func: enableBrake> ***/ |
| mehatfie | 2:3e7baa3e3fec | 42 | /******************************************************************************/ |
| mehatfie | 2:3e7baa3e3fec | 43 | if (func.compare("enableBrake") == 0){ |
| mehatfie | 2:3e7baa3e3fec | 44 | |
| mehatfie | 9:5a0c4c6e39c7 | 45 | if (lineData.numWords != 3){ |
| mehatfie | 9:5a0c4c6e39c7 | 46 | ErrorOut("Incorrect number of parameters", lineData.lineNumber); |
| mehatfie | 9:5a0c4c6e39c7 | 47 | return -1; |
| mehatfie | 2:3e7baa3e3fec | 48 | } |
| mehatfie | 2:3e7baa3e3fec | 49 | |
| mehatfie | 2:3e7baa3e3fec | 50 | //Initialize and Convert Parameters |
| mehatfie | 2:3e7baa3e3fec | 51 | string enable = lineData.word[2]; |
| mehatfie | 2:3e7baa3e3fec | 52 | int enableValue = 0; |
| mehatfie | 2:3e7baa3e3fec | 53 | |
| mehatfie | 9:5a0c4c6e39c7 | 54 | int numValuesFound = sscanf(enable.c_str(), "%d", &enableValue); |
| mehatfie | 9:5a0c4c6e39c7 | 55 | if (numValuesFound < 1){ |
| mehatfie | 9:5a0c4c6e39c7 | 56 | ErrorOut("Parameter Unknown, enableBrake value can't be converted", lineData.lineNumber); |
| mehatfie | 9:5a0c4c6e39c7 | 57 | return -1; |
| mehatfie | 9:5a0c4c6e39c7 | 58 | } |
| mehatfie | 10:e8db892fbc52 | 59 | |
| mehatfie | 10:e8db892fbc52 | 60 | //All syntax checking done by this point, if Dummy then return success in order to check the code, no need to perform functionality |
| mehatfie | 10:e8db892fbc52 | 61 | if (DummyMode) |
| mehatfie | 10:e8db892fbc52 | 62 | return 0; //Function operated successfully but doesn't return a value |
| mehatfie | 10:e8db892fbc52 | 63 | |
| mehatfie | 2:3e7baa3e3fec | 64 | bridges.enableBraking(getMotor(), enableValue); |
| mehatfie | 2:3e7baa3e3fec | 65 | } |
| mehatfie | 2:3e7baa3e3fec | 66 | |
| mehatfie | 2:3e7baa3e3fec | 67 | /******************************************************************************/ |
| mehatfie | 2:3e7baa3e3fec | 68 | /*** <Func: forceBrake> ***/ |
| mehatfie | 2:3e7baa3e3fec | 69 | /******************************************************************************/ |
| mehatfie | 2:3e7baa3e3fec | 70 | else if (func.compare("forceBrake") == 0){ |
| mehatfie | 2:3e7baa3e3fec | 71 | |
| mehatfie | 9:5a0c4c6e39c7 | 72 | if (lineData.numWords != 2){ |
| mehatfie | 9:5a0c4c6e39c7 | 73 | ErrorOut("Incorrect number of parameters", lineData.lineNumber); |
| mehatfie | 9:5a0c4c6e39c7 | 74 | return -1; |
| mehatfie | 2:3e7baa3e3fec | 75 | } |
| mehatfie | 2:3e7baa3e3fec | 76 | |
| mehatfie | 10:e8db892fbc52 | 77 | //All syntax checking done by this point, if Dummy then return success in order to check the code, no need to perform functionality |
| mehatfie | 10:e8db892fbc52 | 78 | if (DummyMode) |
| mehatfie | 10:e8db892fbc52 | 79 | return 0; //Function operated successfully but doesn't return a value |
| mehatfie | 10:e8db892fbc52 | 80 | |
| mehatfie | 2:3e7baa3e3fec | 81 | bridges.forceBrake(getMotor()); |
| mehatfie | 2:3e7baa3e3fec | 82 | } |
| mehatfie | 2:3e7baa3e3fec | 83 | |
| mehatfie | 2:3e7baa3e3fec | 84 | |
| mehatfie | 2:3e7baa3e3fec | 85 | /******************************************************************************/ |
| mehatfie | 2:3e7baa3e3fec | 86 | /*** <Func: drive> ***/ |
| mehatfie | 2:3e7baa3e3fec | 87 | /******************************************************************************/ |
| mehatfie | 2:3e7baa3e3fec | 88 | else if (func.compare("drive") == 0){ |
| mehatfie | 2:3e7baa3e3fec | 89 | |
| mehatfie | 2:3e7baa3e3fec | 90 | if (lineData.numWords != 4){ |
| mehatfie | 9:5a0c4c6e39c7 | 91 | ErrorOut("Incorrect number of parameters", lineData.lineNumber); |
| mehatfie | 9:5a0c4c6e39c7 | 92 | return -1; |
| mehatfie | 2:3e7baa3e3fec | 93 | } |
| mehatfie | 2:3e7baa3e3fec | 94 | |
| mehatfie | 2:3e7baa3e3fec | 95 | //Initialize Parameters |
| mehatfie | 2:3e7baa3e3fec | 96 | string speed = lineData.word[2]; |
| mehatfie | 2:3e7baa3e3fec | 97 | string dir = lineData.word[3]; |
| mehatfie | 2:3e7baa3e3fec | 98 | |
| mehatfie | 2:3e7baa3e3fec | 99 | //Initialize Convertion Variables if needed |
| mehatfie | 2:3e7baa3e3fec | 100 | float speedValue; |
| mehatfie | 2:3e7baa3e3fec | 101 | int dirValue = 0; |
| mehatfie | 2:3e7baa3e3fec | 102 | |
| mehatfie | 2:3e7baa3e3fec | 103 | //Convert string to usable values |
| mehatfie | 9:5a0c4c6e39c7 | 104 | int numValuesFound = sscanf(speed.c_str(), "%f", &speedValue); |
| mehatfie | 9:5a0c4c6e39c7 | 105 | if (numValuesFound < 1){ |
| mehatfie | 9:5a0c4c6e39c7 | 106 | ErrorOut("Parameter Unknown, speed value can't be converted", lineData.lineNumber); |
| mehatfie | 9:5a0c4c6e39c7 | 107 | return -1; |
| mehatfie | 9:5a0c4c6e39c7 | 108 | } |
| mehatfie | 9:5a0c4c6e39c7 | 109 | |
| mehatfie | 9:5a0c4c6e39c7 | 110 | //Speed is given as a percentage of 100, so convert it to the value needed for the bridge.drive function |
| mehatfie | 2:3e7baa3e3fec | 111 | speedValue = speedValue / 100; |
| mehatfie | 2:3e7baa3e3fec | 112 | |
| mehatfie | 9:5a0c4c6e39c7 | 113 | |
| mehatfie | 9:5a0c4c6e39c7 | 114 | if (speedValue <= 0 && speedValue > 1.0){ |
| mehatfie | 9:5a0c4c6e39c7 | 115 | ErrorOut("Speed Value must be between 0 - 100", lineData.lineNumber); |
| mehatfie | 9:5a0c4c6e39c7 | 116 | return -1; |
| mehatfie | 9:5a0c4c6e39c7 | 117 | } |
| mehatfie | 9:5a0c4c6e39c7 | 118 | |
| mehatfie | 2:3e7baa3e3fec | 119 | if (dir.compare("CC") == 0 || dir.compare("cc") == 0) |
| mehatfie | 2:3e7baa3e3fec | 120 | dirValue = -1; //Turn Clockwise |
| mehatfie | 2:3e7baa3e3fec | 121 | else if (dir.compare("C") == 0 || dir.compare("c") == 0) |
| mehatfie | 2:3e7baa3e3fec | 122 | dirValue = 1; //Turn CounterClockwise |
| mehatfie | 9:5a0c4c6e39c7 | 123 | |
| mehatfie | 9:5a0c4c6e39c7 | 124 | else{ |
| mehatfie | 9:5a0c4c6e39c7 | 125 | ErrorOut("Direction Value must be C or CC", lineData.lineNumber); |
| mehatfie | 9:5a0c4c6e39c7 | 126 | return -1; |
| mehatfie | 9:5a0c4c6e39c7 | 127 | } |
| mehatfie | 2:3e7baa3e3fec | 128 | |
| mehatfie | 10:e8db892fbc52 | 129 | //All syntax checking done by this point, if Dummy then return success in order to check the code, no need to perform functionality |
| mehatfie | 10:e8db892fbc52 | 130 | if (DummyMode) |
| mehatfie | 10:e8db892fbc52 | 131 | return 0; //Function operated successfully but doesn't return a value |
| mehatfie | 10:e8db892fbc52 | 132 | |
| mehatfie | 2:3e7baa3e3fec | 133 | bridges.drive(getMotor(), dirValue, speedValue); //Turn on the Motor |
| mehatfie | 2:3e7baa3e3fec | 134 | } |
| mehatfie | 9:5a0c4c6e39c7 | 135 | |
| mehatfie | 9:5a0c4c6e39c7 | 136 | |
| mehatfie | 2:3e7baa3e3fec | 137 | /******************************************************************************/ |
| mehatfie | 2:3e7baa3e3fec | 138 | /**** <Func: off> ****/ |
| mehatfie | 2:3e7baa3e3fec | 139 | /******************************************************************************/ |
| mehatfie | 2:3e7baa3e3fec | 140 | else if (func.compare("off") == 0){ |
| mehatfie | 2:3e7baa3e3fec | 141 | |
| mehatfie | 2:3e7baa3e3fec | 142 | if (lineData.numWords != 2){ |
| mehatfie | 9:5a0c4c6e39c7 | 143 | ErrorOut("Incorrect number of parameters", lineData.lineNumber); |
| mehatfie | 9:5a0c4c6e39c7 | 144 | return -1; |
| mehatfie | 2:3e7baa3e3fec | 145 | } |
| mehatfie | 10:e8db892fbc52 | 146 | |
| mehatfie | 10:e8db892fbc52 | 147 | //All syntax checking done by this point, if Dummy then return success in order to check the code, no need to perform functionality |
| mehatfie | 10:e8db892fbc52 | 148 | if (DummyMode) |
| mehatfie | 10:e8db892fbc52 | 149 | return 0; //Function operated successfully but doesn't return a value |
| mehatfie | 10:e8db892fbc52 | 150 | |
| mehatfie | 9:5a0c4c6e39c7 | 151 | off(); |
| mehatfie | 2:3e7baa3e3fec | 152 | } |
| mehatfie | 2:3e7baa3e3fec | 153 | |
| mehatfie | 2:3e7baa3e3fec | 154 | else { |
| mehatfie | 9:5a0c4c6e39c7 | 155 | ErrorOut("Unknown Command for Motor Class", lineData.lineNumber); |
| mehatfie | 9:5a0c4c6e39c7 | 156 | return -1; |
| mehatfie | 9:5a0c4c6e39c7 | 157 | } |
| mehatfie | 2:3e7baa3e3fec | 158 | |
| mehatfie | 9:5a0c4c6e39c7 | 159 | return 0; //Return success as 0 since no condition had to be met |
| mehatfie | 2:3e7baa3e3fec | 160 | } |
| mehatfie | 2:3e7baa3e3fec | 161 | |
| mehatfie | 2:3e7baa3e3fec | 162 | |
| mehatfie | 2:3e7baa3e3fec | 163 | |
| mehatfie | 9:5a0c4c6e39c7 | 164 | //For stopping the entire system if an error occurs, can be called from main |
| mehatfie | 9:5a0c4c6e39c7 | 165 | int Motor::off(void){ |
| mehatfie | 9:5a0c4c6e39c7 | 166 | bridges.drive(getMotor(), 0, 0); //Turn off the Motor |
| mehatfie | 10:e8db892fbc52 | 167 | return 0; |
| mehatfie | 9:5a0c4c6e39c7 | 168 | } |
| mehatfie | 2:3e7baa3e3fec | 169 | |
| mehatfie | 2:3e7baa3e3fec | 170 | |
| mehatfie | 2:3e7baa3e3fec | 171 | /* |
| mehatfie | 2:3e7baa3e3fec | 172 | int Motor::enableBrake(){ |
| mehatfie | 2:3e7baa3e3fec | 173 | |
| mehatfie | 2:3e7baa3e3fec | 174 | if (lineData.numWords != 4){ |
| mehatfie | 2:3e7baa3e3fec | 175 | //Error Check, incorrect number of parameter, error out |
| mehatfie | 2:3e7baa3e3fec | 176 | return 0; |
| mehatfie | 2:3e7baa3e3fec | 177 | } |
| mehatfie | 2:3e7baa3e3fec | 178 | |
| mehatfie | 2:3e7baa3e3fec | 179 | //Initialize and Convert Parameters |
| mehatfie | 2:3e7baa3e3fec | 180 | char *enable = lineData.word[2]; |
| mehatfie | 2:3e7baa3e3fec | 181 | int enableValue = atoi(enable); |
| mehatfie | 2:3e7baa3e3fec | 182 | |
| mehatfie | 2:3e7baa3e3fec | 183 | //If the atoi returned anything besides 0, it worked properly |
| mehatfie | 2:3e7baa3e3fec | 184 | if (enableValue) |
| mehatfie | 2:3e7baa3e3fec | 185 | bridges.enableBraking(getMotor(), enableValue); |
| mehatfie | 2:3e7baa3e3fec | 186 | else{ |
| mehatfie | 2:3e7baa3e3fec | 187 | //Error Check, incorrect number of parameter, error out |
| mehatfie | 2:3e7baa3e3fec | 188 | return 0; |
| mehatfie | 2:3e7baa3e3fec | 189 | } |
| mehatfie | 2:3e7baa3e3fec | 190 | |
| mehatfie | 2:3e7baa3e3fec | 191 | return 1; |
| mehatfie | 2:3e7baa3e3fec | 192 | } |
| mehatfie | 2:3e7baa3e3fec | 193 | |
| mehatfie | 2:3e7baa3e3fec | 194 | int Motor::forceBrake(){ |
| mehatfie | 2:3e7baa3e3fec | 195 | |
| mehatfie | 2:3e7baa3e3fec | 196 | if (lineData.numWords != 3){ |
| mehatfie | 2:3e7baa3e3fec | 197 | //Error Check, incorrect number of parameter, error out |
| mehatfie | 2:3e7baa3e3fec | 198 | return 0; |
| mehatfie | 2:3e7baa3e3fec | 199 | } |
| mehatfie | 2:3e7baa3e3fec | 200 | |
| mehatfie | 2:3e7baa3e3fec | 201 | bridges.forceBrake(getMotor()); |
| mehatfie | 2:3e7baa3e3fec | 202 | } |
| mehatfie | 2:3e7baa3e3fec | 203 | |
| mehatfie | 2:3e7baa3e3fec | 204 | int Motor::drive(){ |
| mehatfie | 2:3e7baa3e3fec | 205 | |
| mehatfie | 2:3e7baa3e3fec | 206 | if (lineData.numWords != 4){ |
| mehatfie | 2:3e7baa3e3fec | 207 | //Error Check, incorrect number of parameter, error out |
| mehatfie | 2:3e7baa3e3fec | 208 | return 0; |
| mehatfie | 2:3e7baa3e3fec | 209 | } |
| mehatfie | 2:3e7baa3e3fec | 210 | |
| mehatfie | 2:3e7baa3e3fec | 211 | //Initialize Parameters |
| mehatfie | 2:3e7baa3e3fec | 212 | char *speed = lineData.word[2]; |
| mehatfie | 2:3e7baa3e3fec | 213 | char *dir = lineData.word[3]; |
| mehatfie | 2:3e7baa3e3fec | 214 | |
| mehatfie | 2:3e7baa3e3fec | 215 | //Initialize Convertion Variables if needed |
| mehatfie | 2:3e7baa3e3fec | 216 | float speedValue; |
| mehatfie | 2:3e7baa3e3fec | 217 | int dirValue = 0; |
| mehatfie | 2:3e7baa3e3fec | 218 | |
| mehatfie | 2:3e7baa3e3fec | 219 | //Convert string to usable values |
| mehatfie | 2:3e7baa3e3fec | 220 | //NOTE both atof and atoi functions return 0 if no valid conversion could be performed |
| mehatfie | 2:3e7baa3e3fec | 221 | speedValue = atof(speed) / 100; |
| mehatfie | 2:3e7baa3e3fec | 222 | |
| mehatfie | 2:3e7baa3e3fec | 223 | if (speedValue <= 0) |
| mehatfie | 2:3e7baa3e3fec | 224 | return 0; //Error Out because a value gives no functionality or is wrong |
| mehatfie | 2:3e7baa3e3fec | 225 | |
| mehatfie | 2:3e7baa3e3fec | 226 | if (strncmp(dir,"CC", 2) == 0 || strncmp(dir,"cc", 2) == 0) |
| mehatfie | 2:3e7baa3e3fec | 227 | dirValue = -1; //Turn Clockwise |
| mehatfie | 2:3e7baa3e3fec | 228 | else if (strncmp(dir,"C", 1) == 0 || strncmp(dir,"c", 1) == 0) |
| mehatfie | 2:3e7baa3e3fec | 229 | dirValue = 1; //Turn CounterClockwise |
| mehatfie | 2:3e7baa3e3fec | 230 | else |
| mehatfie | 2:3e7baa3e3fec | 231 | return 0; //Error Out since the parameter is incorrect |
| mehatfie | 2:3e7baa3e3fec | 232 | |
| mehatfie | 2:3e7baa3e3fec | 233 | bridges.drive(getMotor(), dirValue, speedValue); //Turn on the Motor |
| mehatfie | 2:3e7baa3e3fec | 234 | } |
| mehatfie | 2:3e7baa3e3fec | 235 | */ |
| mehatfie | 2:3e7baa3e3fec | 236 | |
| mehatfie | 2:3e7baa3e3fec | 237 | |
| mehatfie | 2:3e7baa3e3fec | 238 |