Mitchell Hatfield / Mbed 2 deprecated Component_Test_Interface

Dependencies:   BridgeDriver FrontPanelButtons MCP23017 SDFileSystem TextLCD mbed

Committer:
mehatfie
Date:
Wed Oct 01 18:11:38 2014 +0000
Revision:
11:bc9cd2869f95
Parent:
10:e8db892fbc52
Child:
14:953820302fb7
- Latest revision is not a working copy, simply publishing all previous working copies to the server

Who changed what in which revision?

UserRevisionLine numberNew 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 11:bc9cd2869f95 82
mehatfie 11:bc9cd2869f95 83 //Record the settings for Pause and Resume
mehatfie 11:bc9cd2869f95 84 currDir = 0;
mehatfie 11:bc9cd2869f95 85 currSpeed = 0;
mehatfie 2:3e7baa3e3fec 86 }
mehatfie 2:3e7baa3e3fec 87
mehatfie 2:3e7baa3e3fec 88
mehatfie 2:3e7baa3e3fec 89 /******************************************************************************/
mehatfie 2:3e7baa3e3fec 90 /*** <Func: drive> ***/
mehatfie 2:3e7baa3e3fec 91 /******************************************************************************/
mehatfie 2:3e7baa3e3fec 92 else if (func.compare("drive") == 0){
mehatfie 2:3e7baa3e3fec 93
mehatfie 2:3e7baa3e3fec 94 if (lineData.numWords != 4){
mehatfie 9:5a0c4c6e39c7 95 ErrorOut("Incorrect number of parameters", lineData.lineNumber);
mehatfie 9:5a0c4c6e39c7 96 return -1;
mehatfie 2:3e7baa3e3fec 97 }
mehatfie 2:3e7baa3e3fec 98
mehatfie 2:3e7baa3e3fec 99 //Initialize Parameters
mehatfie 2:3e7baa3e3fec 100 string speed = lineData.word[2];
mehatfie 2:3e7baa3e3fec 101 string dir = lineData.word[3];
mehatfie 2:3e7baa3e3fec 102
mehatfie 2:3e7baa3e3fec 103 //Initialize Convertion Variables if needed
mehatfie 2:3e7baa3e3fec 104 float speedValue;
mehatfie 2:3e7baa3e3fec 105 int dirValue = 0;
mehatfie 2:3e7baa3e3fec 106
mehatfie 2:3e7baa3e3fec 107 //Convert string to usable values
mehatfie 9:5a0c4c6e39c7 108 int numValuesFound = sscanf(speed.c_str(), "%f", &speedValue);
mehatfie 9:5a0c4c6e39c7 109 if (numValuesFound < 1){
mehatfie 9:5a0c4c6e39c7 110 ErrorOut("Parameter Unknown, speed value can't be converted", lineData.lineNumber);
mehatfie 9:5a0c4c6e39c7 111 return -1;
mehatfie 9:5a0c4c6e39c7 112 }
mehatfie 9:5a0c4c6e39c7 113
mehatfie 9:5a0c4c6e39c7 114 //Speed is given as a percentage of 100, so convert it to the value needed for the bridge.drive function
mehatfie 2:3e7baa3e3fec 115 speedValue = speedValue / 100;
mehatfie 2:3e7baa3e3fec 116
mehatfie 9:5a0c4c6e39c7 117
mehatfie 9:5a0c4c6e39c7 118 if (speedValue <= 0 && speedValue > 1.0){
mehatfie 9:5a0c4c6e39c7 119 ErrorOut("Speed Value must be between 0 - 100", lineData.lineNumber);
mehatfie 9:5a0c4c6e39c7 120 return -1;
mehatfie 9:5a0c4c6e39c7 121 }
mehatfie 9:5a0c4c6e39c7 122
mehatfie 2:3e7baa3e3fec 123 if (dir.compare("CC") == 0 || dir.compare("cc") == 0)
mehatfie 2:3e7baa3e3fec 124 dirValue = -1; //Turn Clockwise
mehatfie 2:3e7baa3e3fec 125 else if (dir.compare("C") == 0 || dir.compare("c") == 0)
mehatfie 2:3e7baa3e3fec 126 dirValue = 1; //Turn CounterClockwise
mehatfie 9:5a0c4c6e39c7 127
mehatfie 9:5a0c4c6e39c7 128 else{
mehatfie 9:5a0c4c6e39c7 129 ErrorOut("Direction Value must be C or CC", lineData.lineNumber);
mehatfie 9:5a0c4c6e39c7 130 return -1;
mehatfie 9:5a0c4c6e39c7 131 }
mehatfie 2:3e7baa3e3fec 132
mehatfie 10:e8db892fbc52 133 //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 134 if (DummyMode)
mehatfie 10:e8db892fbc52 135 return 0; //Function operated successfully but doesn't return a value
mehatfie 10:e8db892fbc52 136
mehatfie 2:3e7baa3e3fec 137 bridges.drive(getMotor(), dirValue, speedValue); //Turn on the Motor
mehatfie 11:bc9cd2869f95 138
mehatfie 11:bc9cd2869f95 139 //Record the settings for Pause and Resume
mehatfie 11:bc9cd2869f95 140 currDir = dirValue;
mehatfie 11:bc9cd2869f95 141 currSpeed = speedValue;
mehatfie 2:3e7baa3e3fec 142 }
mehatfie 9:5a0c4c6e39c7 143
mehatfie 9:5a0c4c6e39c7 144
mehatfie 2:3e7baa3e3fec 145 /******************************************************************************/
mehatfie 2:3e7baa3e3fec 146 /**** <Func: off> ****/
mehatfie 2:3e7baa3e3fec 147 /******************************************************************************/
mehatfie 2:3e7baa3e3fec 148 else if (func.compare("off") == 0){
mehatfie 2:3e7baa3e3fec 149
mehatfie 2:3e7baa3e3fec 150 if (lineData.numWords != 2){
mehatfie 9:5a0c4c6e39c7 151 ErrorOut("Incorrect number of parameters", lineData.lineNumber);
mehatfie 9:5a0c4c6e39c7 152 return -1;
mehatfie 2:3e7baa3e3fec 153 }
mehatfie 10:e8db892fbc52 154
mehatfie 10:e8db892fbc52 155 //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 156 if (DummyMode)
mehatfie 10:e8db892fbc52 157 return 0; //Function operated successfully but doesn't return a value
mehatfie 10:e8db892fbc52 158
mehatfie 9:5a0c4c6e39c7 159 off();
mehatfie 2:3e7baa3e3fec 160 }
mehatfie 2:3e7baa3e3fec 161
mehatfie 2:3e7baa3e3fec 162 else {
mehatfie 9:5a0c4c6e39c7 163 ErrorOut("Unknown Command for Motor Class", lineData.lineNumber);
mehatfie 9:5a0c4c6e39c7 164 return -1;
mehatfie 9:5a0c4c6e39c7 165 }
mehatfie 2:3e7baa3e3fec 166
mehatfie 9:5a0c4c6e39c7 167 return 0; //Return success as 0 since no condition had to be met
mehatfie 2:3e7baa3e3fec 168 }
mehatfie 2:3e7baa3e3fec 169
mehatfie 2:3e7baa3e3fec 170
mehatfie 2:3e7baa3e3fec 171
mehatfie 9:5a0c4c6e39c7 172 //For stopping the entire system if an error occurs, can be called from main
mehatfie 9:5a0c4c6e39c7 173 int Motor::off(void){
mehatfie 9:5a0c4c6e39c7 174 bridges.drive(getMotor(), 0, 0); //Turn off the Motor
mehatfie 11:bc9cd2869f95 175
mehatfie 11:bc9cd2869f95 176 //Record the settings for Pause and Resume, and exit
mehatfie 11:bc9cd2869f95 177 currDir = 0;
mehatfie 11:bc9cd2869f95 178 currSpeed = 0;
mehatfie 10:e8db892fbc52 179 return 0;
mehatfie 9:5a0c4c6e39c7 180 }
mehatfie 2:3e7baa3e3fec 181
mehatfie 2:3e7baa3e3fec 182
mehatfie 11:bc9cd2869f95 183 //Stop the motor without changing the previous known settings, so that it will be saved on resume
mehatfie 11:bc9cd2869f95 184 int Motor::pause(void){
mehatfie 11:bc9cd2869f95 185 bridges.drive(getMotor(), 0, 0); //Turn off the Motor
mehatfie 11:bc9cd2869f95 186 return 0;
mehatfie 2:3e7baa3e3fec 187 }
mehatfie 2:3e7baa3e3fec 188
mehatfie 11:bc9cd2869f95 189 //Resume the motor using its previously known settings
mehatfie 11:bc9cd2869f95 190 int Motor::resume(void){
mehatfie 11:bc9cd2869f95 191 bridges.drive(getMotor(), this->currDir, this->currSpeed); //Resume Motor from it's last known state
mehatfie 11:bc9cd2869f95 192 return 0;
mehatfie 2:3e7baa3e3fec 193 }