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@14:953820302fb7, 2014-10-02 (annotated)
- Committer:
 - mehatfie
 - Date:
 - Thu Oct 02 23:49:44 2014 +0000
 - Revision:
 - 14:953820302fb7
 - Parent:
 - 11:bc9cd2869f95
 
- Working system, code testing on two Test Systems and works directly as desired; - Fixed bug where the cycle timer does not add the first cycle and takes it as zero
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 | 14:953820302fb7 | 5 | this->errorFlag = 0; | 
| mehatfie | 2:3e7baa3e3fec | 6 | |
| mehatfie | 9:5a0c4c6e39c7 | 7 | //Order of Line: Command, Local_Name, MOTOR, MotorID(A,B,C,D) | 
| mehatfie | 9:5a0c4c6e39c7 | 8 | //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 | 9 | if (lineData.numWords != 4) | 
| mehatfie | 9:5a0c4c6e39c7 | 10 | this->errorFlag = 1; | 
| mehatfie | 14:953820302fb7 | 11 | |
| mehatfie | 2:3e7baa3e3fec | 12 | string channel = lineData.word[3]; //Parameter is a single character, so dereference the point to the word | 
| mehatfie | 2:3e7baa3e3fec | 13 | |
| mehatfie | 2:3e7baa3e3fec | 14 | if ((channel.compare("A") == 0) || (channel.compare("a") == 0)) | 
| mehatfie | 2:3e7baa3e3fec | 15 | this->motor = BridgeDriver::MOTOR_A; | 
| mehatfie | 2:3e7baa3e3fec | 16 | else if ((channel.compare("B") == 0) || (channel.compare("b") == 0)) | 
| mehatfie | 2:3e7baa3e3fec | 17 | this->motor = BridgeDriver::MOTOR_B; | 
| mehatfie | 2:3e7baa3e3fec | 18 | else if ((channel.compare("C") == 0) || (channel.compare("c") == 0)) | 
| mehatfie | 2:3e7baa3e3fec | 19 | this->motor = BridgeDriver::MOTOR_C; | 
| mehatfie | 2:3e7baa3e3fec | 20 | else if ((channel.compare("D") == 0) || (channel.compare("d") == 0)) | 
| mehatfie | 2:3e7baa3e3fec | 21 | this->motor = BridgeDriver::MOTOR_D; | 
| mehatfie | 9:5a0c4c6e39c7 | 22 | |
| mehatfie | 9:5a0c4c6e39c7 | 23 | //MotorID not known | 
| mehatfie | 9:5a0c4c6e39c7 | 24 | else | 
| mehatfie | 9:5a0c4c6e39c7 | 25 | this->errorFlag = 1; | 
| mehatfie | 9:5a0c4c6e39c7 | 26 | |
| mehatfie | 6:d1594fd2ec5a | 27 | bridges.enablePwm(this->motor, 1); | 
| mehatfie | 2:3e7baa3e3fec | 28 | } | 
| mehatfie | 2:3e7baa3e3fec | 29 | |
| mehatfie | 2:3e7baa3e3fec | 30 | |
| mehatfie | 2:3e7baa3e3fec | 31 | enum BridgeDriver::Motors Motor::getMotor(){ | 
| mehatfie | 2:3e7baa3e3fec | 32 | return this->motor; | 
| mehatfie | 2:3e7baa3e3fec | 33 | } | 
| mehatfie | 2:3e7baa3e3fec | 34 | |
| mehatfie | 2:3e7baa3e3fec | 35 | //A line consists of [ __(Local_Name)__ __(function)__ __(parameter1)__ __(parameter2)__ __(parameter3)__ ... and so on] | 
| mehatfie | 5:e36e0538a903 | 36 | int Motor::interpret(LineData &lineData){ | 
| mehatfie | 9:5a0c4c6e39c7 | 37 | |
| mehatfie | 2:3e7baa3e3fec | 38 | //Order of Line: Local_Name, Function_Name, Param1, Param2, Param3,....... | 
| mehatfie | 2:3e7baa3e3fec | 39 | string func = lineData.word[1]; | 
| mehatfie | 2:3e7baa3e3fec | 40 | |
| mehatfie | 2:3e7baa3e3fec | 41 | /******************************************************************************/ | 
| mehatfie | 2:3e7baa3e3fec | 42 | /*** <Func: enableBrake> ***/ | 
| mehatfie | 2:3e7baa3e3fec | 43 | /******************************************************************************/ | 
| mehatfie | 2:3e7baa3e3fec | 44 | if (func.compare("enableBrake") == 0){ | 
| mehatfie | 2:3e7baa3e3fec | 45 | |
| mehatfie | 9:5a0c4c6e39c7 | 46 | if (lineData.numWords != 3){ | 
| mehatfie | 9:5a0c4c6e39c7 | 47 | ErrorOut("Incorrect number of parameters", lineData.lineNumber); | 
| mehatfie | 9:5a0c4c6e39c7 | 48 | return -1; | 
| mehatfie | 2:3e7baa3e3fec | 49 | } | 
| mehatfie | 2:3e7baa3e3fec | 50 | |
| mehatfie | 2:3e7baa3e3fec | 51 | //Initialize and Convert Parameters | 
| mehatfie | 2:3e7baa3e3fec | 52 | string enable = lineData.word[2]; | 
| mehatfie | 2:3e7baa3e3fec | 53 | int enableValue = 0; | 
| mehatfie | 2:3e7baa3e3fec | 54 | |
| mehatfie | 9:5a0c4c6e39c7 | 55 | int numValuesFound = sscanf(enable.c_str(), "%d", &enableValue); | 
| mehatfie | 9:5a0c4c6e39c7 | 56 | if (numValuesFound < 1){ | 
| mehatfie | 9:5a0c4c6e39c7 | 57 | ErrorOut("Parameter Unknown, enableBrake value can't be converted", lineData.lineNumber); | 
| mehatfie | 9:5a0c4c6e39c7 | 58 | return -1; | 
| mehatfie | 9:5a0c4c6e39c7 | 59 | } | 
| mehatfie | 10:e8db892fbc52 | 60 | |
| mehatfie | 10:e8db892fbc52 | 61 | //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 | 62 | if (DummyMode) | 
| mehatfie | 10:e8db892fbc52 | 63 | return 0; //Function operated successfully but doesn't return a value | 
| mehatfie | 10:e8db892fbc52 | 64 | |
| mehatfie | 2:3e7baa3e3fec | 65 | bridges.enableBraking(getMotor(), enableValue); | 
| mehatfie | 2:3e7baa3e3fec | 66 | } | 
| mehatfie | 2:3e7baa3e3fec | 67 | |
| mehatfie | 2:3e7baa3e3fec | 68 | /******************************************************************************/ | 
| mehatfie | 2:3e7baa3e3fec | 69 | /*** <Func: forceBrake> ***/ | 
| mehatfie | 2:3e7baa3e3fec | 70 | /******************************************************************************/ | 
| mehatfie | 2:3e7baa3e3fec | 71 | else if (func.compare("forceBrake") == 0){ | 
| mehatfie | 2:3e7baa3e3fec | 72 | |
| mehatfie | 9:5a0c4c6e39c7 | 73 | if (lineData.numWords != 2){ | 
| mehatfie | 9:5a0c4c6e39c7 | 74 | ErrorOut("Incorrect number of parameters", lineData.lineNumber); | 
| mehatfie | 9:5a0c4c6e39c7 | 75 | return -1; | 
| mehatfie | 2:3e7baa3e3fec | 76 | } | 
| mehatfie | 2:3e7baa3e3fec | 77 | |
| mehatfie | 10:e8db892fbc52 | 78 | //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 | 79 | if (DummyMode) | 
| mehatfie | 10:e8db892fbc52 | 80 | return 0; //Function operated successfully but doesn't return a value | 
| mehatfie | 10:e8db892fbc52 | 81 | |
| mehatfie | 2:3e7baa3e3fec | 82 | bridges.forceBrake(getMotor()); | 
| mehatfie | 11:bc9cd2869f95 | 83 | |
| mehatfie | 11:bc9cd2869f95 | 84 | //Record the settings for Pause and Resume | 
| mehatfie | 11:bc9cd2869f95 | 85 | currDir = 0; | 
| mehatfie | 11:bc9cd2869f95 | 86 | currSpeed = 0; | 
| mehatfie | 2:3e7baa3e3fec | 87 | } | 
| mehatfie | 2:3e7baa3e3fec | 88 | |
| mehatfie | 2:3e7baa3e3fec | 89 | |
| mehatfie | 2:3e7baa3e3fec | 90 | /******************************************************************************/ | 
| mehatfie | 2:3e7baa3e3fec | 91 | /*** <Func: drive> ***/ | 
| mehatfie | 2:3e7baa3e3fec | 92 | /******************************************************************************/ | 
| mehatfie | 2:3e7baa3e3fec | 93 | else if (func.compare("drive") == 0){ | 
| mehatfie | 2:3e7baa3e3fec | 94 | |
| mehatfie | 2:3e7baa3e3fec | 95 | if (lineData.numWords != 4){ | 
| mehatfie | 9:5a0c4c6e39c7 | 96 | ErrorOut("Incorrect number of parameters", lineData.lineNumber); | 
| mehatfie | 9:5a0c4c6e39c7 | 97 | return -1; | 
| mehatfie | 2:3e7baa3e3fec | 98 | } | 
| mehatfie | 2:3e7baa3e3fec | 99 | |
| mehatfie | 2:3e7baa3e3fec | 100 | //Initialize Parameters | 
| mehatfie | 2:3e7baa3e3fec | 101 | string speed = lineData.word[2]; | 
| mehatfie | 2:3e7baa3e3fec | 102 | string dir = lineData.word[3]; | 
| mehatfie | 2:3e7baa3e3fec | 103 | |
| mehatfie | 2:3e7baa3e3fec | 104 | //Initialize Convertion Variables if needed | 
| mehatfie | 2:3e7baa3e3fec | 105 | float speedValue; | 
| mehatfie | 2:3e7baa3e3fec | 106 | int dirValue = 0; | 
| mehatfie | 2:3e7baa3e3fec | 107 | |
| mehatfie | 2:3e7baa3e3fec | 108 | //Convert string to usable values | 
| mehatfie | 9:5a0c4c6e39c7 | 109 | int numValuesFound = sscanf(speed.c_str(), "%f", &speedValue); | 
| mehatfie | 9:5a0c4c6e39c7 | 110 | if (numValuesFound < 1){ | 
| mehatfie | 9:5a0c4c6e39c7 | 111 | ErrorOut("Parameter Unknown, speed value can't be converted", lineData.lineNumber); | 
| mehatfie | 9:5a0c4c6e39c7 | 112 | return -1; | 
| mehatfie | 9:5a0c4c6e39c7 | 113 | } | 
| mehatfie | 9:5a0c4c6e39c7 | 114 | |
| mehatfie | 9:5a0c4c6e39c7 | 115 | //Speed is given as a percentage of 100, so convert it to the value needed for the bridge.drive function | 
| mehatfie | 2:3e7baa3e3fec | 116 | speedValue = speedValue / 100; | 
| mehatfie | 2:3e7baa3e3fec | 117 | |
| mehatfie | 9:5a0c4c6e39c7 | 118 | |
| mehatfie | 9:5a0c4c6e39c7 | 119 | if (speedValue <= 0 && speedValue > 1.0){ | 
| mehatfie | 9:5a0c4c6e39c7 | 120 | ErrorOut("Speed Value must be between 0 - 100", lineData.lineNumber); | 
| mehatfie | 9:5a0c4c6e39c7 | 121 | return -1; | 
| mehatfie | 9:5a0c4c6e39c7 | 122 | } | 
| mehatfie | 9:5a0c4c6e39c7 | 123 | |
| mehatfie | 2:3e7baa3e3fec | 124 | if (dir.compare("CC") == 0 || dir.compare("cc") == 0) | 
| mehatfie | 2:3e7baa3e3fec | 125 | dirValue = -1; //Turn Clockwise | 
| mehatfie | 2:3e7baa3e3fec | 126 | else if (dir.compare("C") == 0 || dir.compare("c") == 0) | 
| mehatfie | 2:3e7baa3e3fec | 127 | dirValue = 1; //Turn CounterClockwise | 
| mehatfie | 9:5a0c4c6e39c7 | 128 | |
| mehatfie | 9:5a0c4c6e39c7 | 129 | else{ | 
| mehatfie | 9:5a0c4c6e39c7 | 130 | ErrorOut("Direction Value must be C or CC", lineData.lineNumber); | 
| mehatfie | 9:5a0c4c6e39c7 | 131 | return -1; | 
| mehatfie | 9:5a0c4c6e39c7 | 132 | } | 
| mehatfie | 2:3e7baa3e3fec | 133 | |
| mehatfie | 10:e8db892fbc52 | 134 | //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 | 135 | if (DummyMode) | 
| mehatfie | 10:e8db892fbc52 | 136 | return 0; //Function operated successfully but doesn't return a value | 
| mehatfie | 10:e8db892fbc52 | 137 | |
| mehatfie | 2:3e7baa3e3fec | 138 | bridges.drive(getMotor(), dirValue, speedValue); //Turn on the Motor | 
| mehatfie | 11:bc9cd2869f95 | 139 | |
| mehatfie | 11:bc9cd2869f95 | 140 | //Record the settings for Pause and Resume | 
| mehatfie | 11:bc9cd2869f95 | 141 | currDir = dirValue; | 
| mehatfie | 11:bc9cd2869f95 | 142 | currSpeed = speedValue; | 
| mehatfie | 2:3e7baa3e3fec | 143 | } | 
| mehatfie | 9:5a0c4c6e39c7 | 144 | |
| mehatfie | 9:5a0c4c6e39c7 | 145 | |
| mehatfie | 2:3e7baa3e3fec | 146 | /******************************************************************************/ | 
| mehatfie | 2:3e7baa3e3fec | 147 | /**** <Func: off> ****/ | 
| mehatfie | 2:3e7baa3e3fec | 148 | /******************************************************************************/ | 
| mehatfie | 2:3e7baa3e3fec | 149 | else if (func.compare("off") == 0){ | 
| mehatfie | 2:3e7baa3e3fec | 150 | |
| mehatfie | 2:3e7baa3e3fec | 151 | if (lineData.numWords != 2){ | 
| mehatfie | 9:5a0c4c6e39c7 | 152 | ErrorOut("Incorrect number of parameters", lineData.lineNumber); | 
| mehatfie | 9:5a0c4c6e39c7 | 153 | return -1; | 
| mehatfie | 2:3e7baa3e3fec | 154 | } | 
| mehatfie | 10:e8db892fbc52 | 155 | |
| mehatfie | 10:e8db892fbc52 | 156 | //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 | 157 | if (DummyMode) | 
| mehatfie | 10:e8db892fbc52 | 158 | return 0; //Function operated successfully but doesn't return a value | 
| mehatfie | 10:e8db892fbc52 | 159 | |
| mehatfie | 9:5a0c4c6e39c7 | 160 | off(); | 
| mehatfie | 2:3e7baa3e3fec | 161 | } | 
| mehatfie | 2:3e7baa3e3fec | 162 | |
| mehatfie | 2:3e7baa3e3fec | 163 | else { | 
| mehatfie | 9:5a0c4c6e39c7 | 164 | ErrorOut("Unknown Command for Motor Class", lineData.lineNumber); | 
| mehatfie | 9:5a0c4c6e39c7 | 165 | return -1; | 
| mehatfie | 9:5a0c4c6e39c7 | 166 | } | 
| mehatfie | 2:3e7baa3e3fec | 167 | |
| mehatfie | 9:5a0c4c6e39c7 | 168 | return 0; //Return success as 0 since no condition had to be met | 
| mehatfie | 2:3e7baa3e3fec | 169 | } | 
| mehatfie | 2:3e7baa3e3fec | 170 | |
| mehatfie | 2:3e7baa3e3fec | 171 | |
| mehatfie | 2:3e7baa3e3fec | 172 | |
| mehatfie | 9:5a0c4c6e39c7 | 173 | //For stopping the entire system if an error occurs, can be called from main | 
| mehatfie | 9:5a0c4c6e39c7 | 174 | int Motor::off(void){ | 
| mehatfie | 9:5a0c4c6e39c7 | 175 | bridges.drive(getMotor(), 0, 0); //Turn off the Motor | 
| mehatfie | 11:bc9cd2869f95 | 176 | |
| mehatfie | 11:bc9cd2869f95 | 177 | //Record the settings for Pause and Resume, and exit | 
| mehatfie | 11:bc9cd2869f95 | 178 | currDir = 0; | 
| mehatfie | 11:bc9cd2869f95 | 179 | currSpeed = 0; | 
| mehatfie | 10:e8db892fbc52 | 180 | return 0; | 
| mehatfie | 9:5a0c4c6e39c7 | 181 | } | 
| mehatfie | 2:3e7baa3e3fec | 182 | |
| mehatfie | 2:3e7baa3e3fec | 183 | |
| mehatfie | 11:bc9cd2869f95 | 184 | //Stop the motor without changing the previous known settings, so that it will be saved on resume | 
| mehatfie | 11:bc9cd2869f95 | 185 | int Motor::pause(void){ | 
| mehatfie | 11:bc9cd2869f95 | 186 | bridges.drive(getMotor(), 0, 0); //Turn off the Motor | 
| mehatfie | 11:bc9cd2869f95 | 187 | return 0; | 
| mehatfie | 2:3e7baa3e3fec | 188 | } | 
| mehatfie | 2:3e7baa3e3fec | 189 | |
| mehatfie | 11:bc9cd2869f95 | 190 | //Resume the motor using its previously known settings | 
| mehatfie | 11:bc9cd2869f95 | 191 | int Motor::resume(void){ | 
| mehatfie | 11:bc9cd2869f95 | 192 | bridges.drive(getMotor(), this->currDir, this->currSpeed); //Resume Motor from it's last known state | 
| mehatfie | 11:bc9cd2869f95 | 193 | return 0; | 
| mehatfie | 2:3e7baa3e3fec | 194 | } |