
Basic Mid-Level control for the rebuilt MorphGI control unit, using PWM to communicate with the low level controllers.
Dependencies: ros_lib_kinetic
main.cpp@42:5a5ad23a4bb1, 2021-06-24 (annotated)
- Committer:
- dofydoink
- Date:
- Thu Jun 24 20:34:47 2021 +0000
- Revision:
- 42:5a5ad23a4bb1
- Parent:
- 36:4459be8296e9
first
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
WD40andTape | 7:5b6a2cefbf3b | 1 | // STANDARD IMPORTS |
WD40andTape | 7:5b6a2cefbf3b | 2 | #include "math.h" |
WD40andTape | 7:5b6a2cefbf3b | 3 | // MBED IMPORTS |
dofydoink | 0:607bc887b6e0 | 4 | #include "mbed.h" |
dofydoink | 42:5a5ad23a4bb1 | 5 | |
WD40andTape | 7:5b6a2cefbf3b | 6 | // CUSTOM IMPORTS |
dofydoink | 12:595ed862e52f | 7 | #include "MLSettings.h" |
dofydoink | 42:5a5ad23a4bb1 | 8 | //#include "HLComms.h" |
dofydoink | 42:5a5ad23a4bb1 | 9 | |
dofydoink | 42:5a5ad23a4bb1 | 10 | #define N_CHANNELS 4 |
dofydoink | 0:607bc887b6e0 | 11 | |
WD40andTape | 21:0b10d8e615d1 | 12 | // DEMAND VARIABLES |
dofydoink | 11:7029367a1840 | 13 | |
WD40andTape | 7:5b6a2cefbf3b | 14 | Serial pc(USBTX, USBRX); // tx, rx for usb debugging |
dofydoink | 42:5a5ad23a4bb1 | 15 | |
dofydoink | 42:5a5ad23a4bb1 | 16 | //HLComms hlcomms(HL_COMMS_FREQ_HZ); |
dofydoink | 42:5a5ad23a4bb1 | 17 | |
dofydoink | 42:5a5ad23a4bb1 | 18 | double limDouble(double var, double min, double max){ |
dofydoink | 42:5a5ad23a4bb1 | 19 | double output = var; |
dofydoink | 42:5a5ad23a4bb1 | 20 | if(var <min){ |
dofydoink | 42:5a5ad23a4bb1 | 21 | output = min; |
dofydoink | 42:5a5ad23a4bb1 | 22 | } |
dofydoink | 42:5a5ad23a4bb1 | 23 | if (var>max){ |
dofydoink | 42:5a5ad23a4bb1 | 24 | output = max; |
dofydoink | 42:5a5ad23a4bb1 | 25 | } |
dofydoink | 42:5a5ad23a4bb1 | 26 | return output; |
dofydoink | 42:5a5ad23a4bb1 | 27 | } |
dofydoink | 42:5a5ad23a4bb1 | 28 | |
dofydoink | 42:5a5ad23a4bb1 | 29 | |
dofydoink | 42:5a5ad23a4bb1 | 30 | //Ticker setDemandsTicker; |
dofydoink | 42:5a5ad23a4bb1 | 31 | |
dofydoink | 42:5a5ad23a4bb1 | 32 | |
dofydoink | 42:5a5ad23a4bb1 | 33 | //joystick input pins |
dofydoink | 42:5a5ad23a4bb1 | 34 | |
dofydoink | 42:5a5ad23a4bb1 | 35 | InterruptIn pinZeroIn (PD_4); |
dofydoink | 42:5a5ad23a4bb1 | 36 | InterruptIn pinCycleIn (PD_6); |
dofydoink | 42:5a5ad23a4bb1 | 37 | InterruptIn pinSucIn (PD_7); |
dofydoink | 42:5a5ad23a4bb1 | 38 | InterruptIn pinGasIn (PF_5); |
dofydoink | 42:5a5ad23a4bb1 | 39 | InterruptIn pinDebugIn (PF_9); |
dofydoink | 42:5a5ad23a4bb1 | 40 | InterruptIn pinFlushIn (PG_1); |
dofydoink | 42:5a5ad23a4bb1 | 41 | |
dofydoink | 42:5a5ad23a4bb1 | 42 | DigitalIn pinWashIn (PD_5); |
dofydoink | 42:5a5ad23a4bb1 | 43 | DigitalIn pinFwd (PD_3); |
dofydoink | 42:5a5ad23a4bb1 | 44 | DigitalIn pinRev (PC_3); |
dofydoink | 42:5a5ad23a4bb1 | 45 | |
dofydoink | 42:5a5ad23a4bb1 | 46 | |
dofydoink | 42:5a5ad23a4bb1 | 47 | AnalogIn pinJSX (PC_0); |
dofydoink | 42:5a5ad23a4bb1 | 48 | AnalogIn pinJSY (PF_3); |
dofydoink | 42:5a5ad23a4bb1 | 49 | |
dofydoink | 42:5a5ad23a4bb1 | 50 | DigitalOut pinFlushOut (PG_0); |
dofydoink | 42:5a5ad23a4bb1 | 51 | DigitalOut pinGasOut (PD_0); |
dofydoink | 42:5a5ad23a4bb1 | 52 | DigitalOut pinWashOut (PF_1); |
dofydoink | 42:5a5ad23a4bb1 | 53 | DigitalOut pinSucOut (PD_1); |
dofydoink | 42:5a5ad23a4bb1 | 54 | DigitalOut pinThirdPump(PF_2); |
dofydoink | 42:5a5ad23a4bb1 | 55 | DigitalOut pinJetOut (PF_0); |
dofydoink | 42:5a5ad23a4bb1 | 56 | |
dofydoink | 42:5a5ad23a4bb1 | 57 | //DigitalIn arPins[7] = {pinZeroIn, pinCycleIn, pinSucIn, pinWashIn, pinGasIn, pinFwd, pinRev}; |
dofydoink | 42:5a5ad23a4bb1 | 58 | |
dofydoink | 42:5a5ad23a4bb1 | 59 | Thread threadReadHHC(osPriorityHigh); |
dofydoink | 42:5a5ad23a4bb1 | 60 | Thread threadSendFeedback(osPriorityNormal); |
dofydoink | 42:5a5ad23a4bb1 | 61 | |
dofydoink | 42:5a5ad23a4bb1 | 62 | Semaphore semReadHHC(1); |
dofydoink | 42:5a5ad23a4bb1 | 63 | Semaphore semSendFeedback(1); |
dofydoink | 42:5a5ad23a4bb1 | 64 | Semaphore semReceiveAndReplan(1); |
dofydoink | 42:5a5ad23a4bb1 | 65 | |
dofydoink | 42:5a5ad23a4bb1 | 66 | //Ticker SendSensorDataTicker; |
dofydoink | 42:5a5ad23a4bb1 | 67 | Ticker tickerReadHHC; |
dofydoink | 42:5a5ad23a4bb1 | 68 | Ticker tickerSendFeedback; |
dofydoink | 42:5a5ad23a4bb1 | 69 | |
dofydoink | 42:5a5ad23a4bb1 | 70 | void signalReadHHC(){ |
dofydoink | 42:5a5ad23a4bb1 | 71 | semReadHHC.release(); |
dofydoink | 42:5a5ad23a4bb1 | 72 | } |
dofydoink | 42:5a5ad23a4bb1 | 73 | |
dofydoink | 42:5a5ad23a4bb1 | 74 | void signalSendFeedback() { |
dofydoink | 42:5a5ad23a4bb1 | 75 | semSendFeedback.release(); |
dofydoink | 42:5a5ad23a4bb1 | 76 | } |
dofydoink | 42:5a5ad23a4bb1 | 77 | |
dofydoink | 42:5a5ad23a4bb1 | 78 | //support function states; |
dofydoink | 42:5a5ad23a4bb1 | 79 | |
dofydoink | 42:5a5ad23a4bb1 | 80 | bool isZero = 0; |
dofydoink | 42:5a5ad23a4bb1 | 81 | bool isCycle = 0; |
dofydoink | 42:5a5ad23a4bb1 | 82 | bool isSuc = 0; |
dofydoink | 42:5a5ad23a4bb1 | 83 | bool isWash = 0; |
dofydoink | 42:5a5ad23a4bb1 | 84 | bool isGas = 0; |
dofydoink | 42:5a5ad23a4bb1 | 85 | bool isFwd = 0; |
dofydoink | 42:5a5ad23a4bb1 | 86 | bool isRev = 0; |
dofydoink | 42:5a5ad23a4bb1 | 87 | bool isBusy = 0; |
dofydoink | 42:5a5ad23a4bb1 | 88 | bool DemPos=0; |
dofydoink | 42:5a5ad23a4bb1 | 89 | bool isDebug = 0; |
dofydoink | 42:5a5ad23a4bb1 | 90 | |
dofydoink | 42:5a5ad23a4bb1 | 91 | //set up PWM output pins for Demand POSITION AND VELOCITY |
dofydoink | 42:5a5ad23a4bb1 | 92 | PwmOut pinPosOut[N_CHANNELS] = {PB_15, PB_8, PB_9 ,PC_6}; |
dofydoink | 42:5a5ad23a4bb1 | 93 | PwmOut pinVelOut[N_CHANNELS] = {PB_10, PA_0, PB_11 ,PB_3}; |
dofydoink | 42:5a5ad23a4bb1 | 94 | |
WD40andTape | 3:c83291bf9fd2 | 95 | |
dofydoink | 42:5a5ad23a4bb1 | 96 | void FlushActivate(){ |
dofydoink | 42:5a5ad23a4bb1 | 97 | if(!isBusy){ |
dofydoink | 42:5a5ad23a4bb1 | 98 | pinFlushOut = 1; |
dofydoink | 42:5a5ad23a4bb1 | 99 | } |
dofydoink | 42:5a5ad23a4bb1 | 100 | } |
dofydoink | 42:5a5ad23a4bb1 | 101 | |
dofydoink | 42:5a5ad23a4bb1 | 102 | void FlushStop(){ |
dofydoink | 42:5a5ad23a4bb1 | 103 | if(!isBusy){ |
dofydoink | 42:5a5ad23a4bb1 | 104 | pinFlushOut = 0; |
dofydoink | 42:5a5ad23a4bb1 | 105 | } |
dofydoink | 42:5a5ad23a4bb1 | 106 | } |
dofydoink | 42:5a5ad23a4bb1 | 107 | |
dofydoink | 42:5a5ad23a4bb1 | 108 | void ZeroActivate(){ |
dofydoink | 42:5a5ad23a4bb1 | 109 | if(!isBusy){ |
dofydoink | 42:5a5ad23a4bb1 | 110 | isZero = 1; |
dofydoink | 42:5a5ad23a4bb1 | 111 | } |
dofydoink | 42:5a5ad23a4bb1 | 112 | } |
dofydoink | 42:5a5ad23a4bb1 | 113 | void ZeroStop(){ |
dofydoink | 42:5a5ad23a4bb1 | 114 | |
dofydoink | 42:5a5ad23a4bb1 | 115 | } |
dofydoink | 42:5a5ad23a4bb1 | 116 | |
dofydoink | 42:5a5ad23a4bb1 | 117 | void DebugActivate(){ |
dofydoink | 42:5a5ad23a4bb1 | 118 | isDebug = 1; |
dofydoink | 42:5a5ad23a4bb1 | 119 | } |
dofydoink | 42:5a5ad23a4bb1 | 120 | |
dofydoink | 42:5a5ad23a4bb1 | 121 | void DebugStop(){ |
dofydoink | 42:5a5ad23a4bb1 | 122 | isDebug = 0; |
dofydoink | 42:5a5ad23a4bb1 | 123 | } |
dofydoink | 42:5a5ad23a4bb1 | 124 | |
dofydoink | 42:5a5ad23a4bb1 | 125 | void CycleActivate(){ |
dofydoink | 42:5a5ad23a4bb1 | 126 | if(!isBusy){ |
dofydoink | 42:5a5ad23a4bb1 | 127 | isCycle = 1; |
dofydoink | 42:5a5ad23a4bb1 | 128 | } |
dofydoink | 42:5a5ad23a4bb1 | 129 | } |
dofydoink | 42:5a5ad23a4bb1 | 130 | void CycleStop(){ |
dofydoink | 42:5a5ad23a4bb1 | 131 | |
dofydoink | 42:5a5ad23a4bb1 | 132 | } |
dofydoink | 42:5a5ad23a4bb1 | 133 | |
dofydoink | 42:5a5ad23a4bb1 | 134 | void GasActivate(){ |
dofydoink | 42:5a5ad23a4bb1 | 135 | if(!isBusy){ |
dofydoink | 42:5a5ad23a4bb1 | 136 | pinGasOut = 1; |
dofydoink | 42:5a5ad23a4bb1 | 137 | } |
dofydoink | 42:5a5ad23a4bb1 | 138 | } |
dofydoink | 42:5a5ad23a4bb1 | 139 | void GasStop(){ |
dofydoink | 42:5a5ad23a4bb1 | 140 | pinGasOut = 0; |
dofydoink | 42:5a5ad23a4bb1 | 141 | } |
dofydoink | 42:5a5ad23a4bb1 | 142 | |
dofydoink | 42:5a5ad23a4bb1 | 143 | void SucActivate(){ |
dofydoink | 42:5a5ad23a4bb1 | 144 | if(!isBusy){ |
dofydoink | 42:5a5ad23a4bb1 | 145 | pinSucOut = 1; |
dofydoink | 42:5a5ad23a4bb1 | 146 | } |
dofydoink | 42:5a5ad23a4bb1 | 147 | } |
dofydoink | 42:5a5ad23a4bb1 | 148 | void SucStop(){ |
dofydoink | 42:5a5ad23a4bb1 | 149 | pinSucOut = 0; |
dofydoink | 42:5a5ad23a4bb1 | 150 | } |
dofydoink | 42:5a5ad23a4bb1 | 151 | |
dofydoink | 42:5a5ad23a4bb1 | 152 | bool isChange = 1; |
dofydoink | 42:5a5ad23a4bb1 | 153 | |
dofydoink | 42:5a5ad23a4bb1 | 154 | Timer timer1; |
dofydoink | 42:5a5ad23a4bb1 | 155 | |
dofydoink | 42:5a5ad23a4bb1 | 156 | Ticker DemTicker; |
dofydoink | 42:5a5ad23a4bb1 | 157 | |
dofydoink | 42:5a5ad23a4bb1 | 158 | int intAnchorDirection = 0; |
dofydoink | 42:5a5ad23a4bb1 | 159 | |
dofydoink | 42:5a5ad23a4bb1 | 160 | |
dofydoink | 42:5a5ad23a4bb1 | 161 | |
dofydoink | 42:5a5ad23a4bb1 | 162 | //global variables |
dofydoink | 42:5a5ad23a4bb1 | 163 | double dblSensitivity = 1.0; |
dofydoink | 42:5a5ad23a4bb1 | 164 | double dblDriveStep = 0.05; |
dofydoink | 42:5a5ad23a4bb1 | 165 | bool isSteerLock = 0; |
dofydoink | 42:5a5ad23a4bb1 | 166 | double dblAlpha; |
dofydoink | 42:5a5ad23a4bb1 | 167 | double dblBeta; |
dofydoink | 42:5a5ad23a4bb1 | 168 | double dblTheta; |
dofydoink | 42:5a5ad23a4bb1 | 169 | double dblPhi; |
dofydoink | 42:5a5ad23a4bb1 | 170 | double dblS; |
dofydoink | 42:5a5ad23a4bb1 | 171 | double dblSdot; |
dofydoink | 42:5a5ad23a4bb1 | 172 | double dblX[3]; |
dofydoink | 42:5a5ad23a4bb1 | 173 | double dblXdot[3]; |
dofydoink | 42:5a5ad23a4bb1 | 174 | double dblAlphaDot; |
dofydoink | 42:5a5ad23a4bb1 | 175 | double dblBetaDot; |
dofydoink | 42:5a5ad23a4bb1 | 176 | double dblDeltaAlpha; |
dofydoink | 42:5a5ad23a4bb1 | 177 | double dblDeltaBeta; |
dofydoink | 42:5a5ad23a4bb1 | 178 | |
dofydoink | 42:5a5ad23a4bb1 | 179 | double x_axis_sign = -1.0; |
dofydoink | 42:5a5ad23a4bb1 | 180 | |
dofydoink | 42:5a5ad23a4bb1 | 181 | //kinematic constants |
dofydoink | 42:5a5ad23a4bb1 | 182 | double K_theta = 0.77;// rad/mL |
dofydoink | 42:5a5ad23a4bb1 | 183 | double d_theta = 0.3;// no unit |
dofydoink | 0:607bc887b6e0 | 184 | |
dofydoink | 42:5a5ad23a4bb1 | 185 | void SendFeedback(){ |
dofydoink | 42:5a5ad23a4bb1 | 186 | //support function interrupt states |
dofydoink | 42:5a5ad23a4bb1 | 187 | while(1){ |
dofydoink | 42:5a5ad23a4bb1 | 188 | semSendFeedback.wait(); |
dofydoink | 42:5a5ad23a4bb1 | 189 | if(!isBusy){ |
dofydoink | 42:5a5ad23a4bb1 | 190 | if(pinFwd.read()){ |
dofydoink | 42:5a5ad23a4bb1 | 191 | isFwd = 1; |
dofydoink | 42:5a5ad23a4bb1 | 192 | } else { |
dofydoink | 42:5a5ad23a4bb1 | 193 | isFwd = 0; |
dofydoink | 42:5a5ad23a4bb1 | 194 | } |
dofydoink | 42:5a5ad23a4bb1 | 195 | |
dofydoink | 42:5a5ad23a4bb1 | 196 | if(pinRev.read()){ |
dofydoink | 42:5a5ad23a4bb1 | 197 | isRev = 1; |
dofydoink | 42:5a5ad23a4bb1 | 198 | } else { |
dofydoink | 42:5a5ad23a4bb1 | 199 | isRev = 0; |
dofydoink | 42:5a5ad23a4bb1 | 200 | } |
dofydoink | 42:5a5ad23a4bb1 | 201 | |
dofydoink | 42:5a5ad23a4bb1 | 202 | if(pinSucIn.read()){ |
dofydoink | 42:5a5ad23a4bb1 | 203 | isSuc = 1; |
dofydoink | 42:5a5ad23a4bb1 | 204 | } else { |
dofydoink | 42:5a5ad23a4bb1 | 205 | isSuc = 0; |
dofydoink | 42:5a5ad23a4bb1 | 206 | } |
dofydoink | 42:5a5ad23a4bb1 | 207 | |
dofydoink | 42:5a5ad23a4bb1 | 208 | if(pinWashIn.read()){ |
dofydoink | 42:5a5ad23a4bb1 | 209 | isWash = 1; |
dofydoink | 42:5a5ad23a4bb1 | 210 | } else { |
dofydoink | 42:5a5ad23a4bb1 | 211 | isWash = 0; |
dofydoink | 42:5a5ad23a4bb1 | 212 | } |
dofydoink | 42:5a5ad23a4bb1 | 213 | |
dofydoink | 42:5a5ad23a4bb1 | 214 | if(pinGasIn.read()){ |
dofydoink | 42:5a5ad23a4bb1 | 215 | isGas = 1; |
dofydoink | 42:5a5ad23a4bb1 | 216 | } else { |
dofydoink | 42:5a5ad23a4bb1 | 217 | isGas = 0; |
dofydoink | 42:5a5ad23a4bb1 | 218 | } |
dofydoink | 42:5a5ad23a4bb1 | 219 | |
dofydoink | 42:5a5ad23a4bb1 | 220 | |
dofydoink | 42:5a5ad23a4bb1 | 221 | // |
dofydoink | 42:5a5ad23a4bb1 | 222 | //printf("\r\n"); |
dofydoink | 42:5a5ad23a4bb1 | 223 | //printf("%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t", isZero, isGas, isSuc, isRev, isWash, isCycle, isFwd, isDebug); |
dofydoink | 42:5a5ad23a4bb1 | 224 | // |
dofydoink | 42:5a5ad23a4bb1 | 225 | // double dblJSXprint = pinJSX.read(); |
dofydoink | 42:5a5ad23a4bb1 | 226 | // double dblJSYprint = pinJSY.read(); |
dofydoink | 42:5a5ad23a4bb1 | 227 | // printf("X:%f\tY:%f\t", dblJSXprint, dblJSYprint); |
dofydoink | 42:5a5ad23a4bb1 | 228 | |
dofydoink | 42:5a5ad23a4bb1 | 229 | // printf("%f\t",dblAlphaDot); |
dofydoink | 42:5a5ad23a4bb1 | 230 | // printf("%f\t",dblBetaDot); |
dofydoink | 42:5a5ad23a4bb1 | 231 | // printf(":: "); |
dofydoink | 42:5a5ad23a4bb1 | 232 | // |
dofydoink | 42:5a5ad23a4bb1 | 233 | // printf("%f\t",dblAlpha); |
dofydoink | 42:5a5ad23a4bb1 | 234 | // printf("%f\t",dblBeta); |
dofydoink | 42:5a5ad23a4bb1 | 235 | // printf(":: "); |
dofydoink | 42:5a5ad23a4bb1 | 236 | // |
dofydoink | 42:5a5ad23a4bb1 | 237 | // printf("%f\t",dblTheta); |
dofydoink | 42:5a5ad23a4bb1 | 238 | // printf("%f\t",dblPhi); |
dofydoink | 42:5a5ad23a4bb1 | 239 | // printf(":: "); |
dofydoink | 42:5a5ad23a4bb1 | 240 | printf("\t"); |
dofydoink | 42:5a5ad23a4bb1 | 241 | |
dofydoink | 42:5a5ad23a4bb1 | 242 | printf("%f\t",dblX[1]); |
dofydoink | 42:5a5ad23a4bb1 | 243 | printf("%f\t",dblX[0]); |
dofydoink | 42:5a5ad23a4bb1 | 244 | printf("%f\t",dblX[2]); |
dofydoink | 42:5a5ad23a4bb1 | 245 | printf(":: "); |
dofydoink | 42:5a5ad23a4bb1 | 246 | |
dofydoink | 42:5a5ad23a4bb1 | 247 | // printf("%f\t",dblXdot[0]); |
dofydoink | 42:5a5ad23a4bb1 | 248 | // printf("%f\t",dblXdot[2]); |
dofydoink | 42:5a5ad23a4bb1 | 249 | // printf("%f\t",dblXdot[1]); |
dofydoink | 42:5a5ad23a4bb1 | 250 | // printf(":: "); |
dofydoink | 42:5a5ad23a4bb1 | 251 | |
dofydoink | 42:5a5ad23a4bb1 | 252 | printf("%f\t",dblS); |
dofydoink | 42:5a5ad23a4bb1 | 253 | printf("%f\t",dblSdot); |
dofydoink | 42:5a5ad23a4bb1 | 254 | printf("\r\n"); |
dofydoink | 42:5a5ad23a4bb1 | 255 | } |
dofydoink | 42:5a5ad23a4bb1 | 256 | } |
dofydoink | 42:5a5ad23a4bb1 | 257 | } |
dofydoink | 0:607bc887b6e0 | 258 | |
dofydoink | 42:5a5ad23a4bb1 | 259 | double DeadZone(double var, double threshold, double max, double min){ |
dofydoink | 42:5a5ad23a4bb1 | 260 | |
dofydoink | 42:5a5ad23a4bb1 | 261 | double output = var; |
dofydoink | 42:5a5ad23a4bb1 | 262 | output -= 0.5; |
dofydoink | 42:5a5ad23a4bb1 | 263 | min -= 0.5; |
dofydoink | 42:5a5ad23a4bb1 | 264 | max -= 0.5; |
dofydoink | 42:5a5ad23a4bb1 | 265 | |
dofydoink | 42:5a5ad23a4bb1 | 266 | if(output > threshold){ |
dofydoink | 42:5a5ad23a4bb1 | 267 | output = (output - threshold); |
dofydoink | 42:5a5ad23a4bb1 | 268 | output /= (max - threshold); |
dofydoink | 42:5a5ad23a4bb1 | 269 | } else if(output < -1.0*threshold){ |
dofydoink | 42:5a5ad23a4bb1 | 270 | output = -1.0*(output + threshold); |
dofydoink | 42:5a5ad23a4bb1 | 271 | output /= (threshold + min); |
dofydoink | 42:5a5ad23a4bb1 | 272 | } else { |
dofydoink | 42:5a5ad23a4bb1 | 273 | output = 0.0; |
dofydoink | 42:5a5ad23a4bb1 | 274 | } |
dofydoink | 42:5a5ad23a4bb1 | 275 | |
dofydoink | 42:5a5ad23a4bb1 | 276 | output = limDouble(output, -1.0, 1.0); |
dofydoink | 42:5a5ad23a4bb1 | 277 | return output; |
dofydoink | 42:5a5ad23a4bb1 | 278 | } |
dofydoink | 42:5a5ad23a4bb1 | 279 | |
dofydoink | 42:5a5ad23a4bb1 | 280 | double ConvertToPWM(double target, double max){ |
dofydoink | 42:5a5ad23a4bb1 | 281 | double output; |
dofydoink | 42:5a5ad23a4bb1 | 282 | output = target*0.8/max ; |
dofydoink | 42:5a5ad23a4bb1 | 283 | output += 0.1; |
dofydoink | 42:5a5ad23a4bb1 | 284 | return output; |
dofydoink | 42:5a5ad23a4bb1 | 285 | } |
WD40andTape | 17:bbaf3e8440ad | 286 | |
dofydoink | 42:5a5ad23a4bb1 | 287 | void SetFrontDemand(double demandPos[], double demandVel[]){ |
dofydoink | 42:5a5ad23a4bb1 | 288 | |
dofydoink | 42:5a5ad23a4bb1 | 289 | double demandPos_abs[3]; |
dofydoink | 42:5a5ad23a4bb1 | 290 | double demandVel_abs[3]; |
dofydoink | 42:5a5ad23a4bb1 | 291 | double pwmPos_front[3]; |
dofydoink | 42:5a5ad23a4bb1 | 292 | double pwmVel_front[3]; |
dofydoink | 42:5a5ad23a4bb1 | 293 | |
dofydoink | 42:5a5ad23a4bb1 | 294 | for(int ii = 0; ii<3; ii++){ |
dofydoink | 42:5a5ad23a4bb1 | 295 | demandPos_abs[ii] = abs(demandPos[ii]); |
dofydoink | 42:5a5ad23a4bb1 | 296 | demandVel_abs[ii] = abs(demandVel[ii]); |
dofydoink | 42:5a5ad23a4bb1 | 297 | pwmPos_front[ii] = ConvertToPWM(demandPos_abs[ii], (double)MAX_ACTUATOR_LIMIT_MM); |
dofydoink | 42:5a5ad23a4bb1 | 298 | pwmVel_front[ii] = ConvertToPWM(demandVel_abs[ii], (double)MAX_SPEED_MMPS); |
dofydoink | 42:5a5ad23a4bb1 | 299 | pinPosOut[ii].write(pwmPos_front[ii]); |
dofydoink | 42:5a5ad23a4bb1 | 300 | pinVelOut[ii].write(pwmVel_front[ii]); |
dofydoink | 42:5a5ad23a4bb1 | 301 | |
dofydoink | 42:5a5ad23a4bb1 | 302 | } |
dofydoink | 42:5a5ad23a4bb1 | 303 | |
dofydoink | 42:5a5ad23a4bb1 | 304 | /* |
dofydoink | 42:5a5ad23a4bb1 | 305 | //print for debugging |
dofydoink | 42:5a5ad23a4bb1 | 306 | printf("X: "); |
dofydoink | 42:5a5ad23a4bb1 | 307 | for(int ii = 0; ii<3; ii++){ |
dofydoink | 42:5a5ad23a4bb1 | 308 | printf("%f\t",pwmPos_front[ii]); |
dofydoink | 42:5a5ad23a4bb1 | 309 | } |
dofydoink | 42:5a5ad23a4bb1 | 310 | printf("Xdot: "); |
dofydoink | 42:5a5ad23a4bb1 | 311 | for(int ii = 0; ii<3; ii++){ |
dofydoink | 42:5a5ad23a4bb1 | 312 | printf("%f\t",pwmVel_front[ii]); |
dofydoink | 42:5a5ad23a4bb1 | 313 | } |
dofydoink | 42:5a5ad23a4bb1 | 314 | */ |
dofydoink | 42:5a5ad23a4bb1 | 315 | } |
dofydoink | 42:5a5ad23a4bb1 | 316 | |
dofydoink | 42:5a5ad23a4bb1 | 317 | void SetDriveDemand(double drivePos, double driveVel){ |
dofydoink | 42:5a5ad23a4bb1 | 318 | |
dofydoink | 42:5a5ad23a4bb1 | 319 | double drivePos_abs; |
dofydoink | 42:5a5ad23a4bb1 | 320 | double driveVel_abs; |
dofydoink | 42:5a5ad23a4bb1 | 321 | double pwmPos_drive; |
dofydoink | 42:5a5ad23a4bb1 | 322 | double pwmVel_drive; |
dofydoink | 42:5a5ad23a4bb1 | 323 | |
dofydoink | 42:5a5ad23a4bb1 | 324 | drivePos_abs = abs(drivePos); |
dofydoink | 42:5a5ad23a4bb1 | 325 | driveVel_abs = abs(driveVel); |
dofydoink | 42:5a5ad23a4bb1 | 326 | |
dofydoink | 42:5a5ad23a4bb1 | 327 | pwmPos_drive = ConvertToPWM(drivePos_abs, MAX_DRIVE_SEGMENT_POSITION); |
dofydoink | 42:5a5ad23a4bb1 | 328 | pwmVel_drive = ConvertToPWM(driveVel_abs, MAX_DRIVE_SEGMENT_SPEED); |
dofydoink | 42:5a5ad23a4bb1 | 329 | |
dofydoink | 42:5a5ad23a4bb1 | 330 | pinPosOut[3].write(pwmPos_drive); |
dofydoink | 42:5a5ad23a4bb1 | 331 | pinVelOut[3].write(pwmVel_drive); |
dofydoink | 42:5a5ad23a4bb1 | 332 | |
dofydoink | 42:5a5ad23a4bb1 | 333 | /* |
dofydoink | 42:5a5ad23a4bb1 | 334 | //print for debugging |
dofydoink | 42:5a5ad23a4bb1 | 335 | printf("S:%f\tSdot:%f\t",pwmPos_drive,pwmVel_drive); |
dofydoink | 42:5a5ad23a4bb1 | 336 | */ |
dofydoink | 42:5a5ad23a4bb1 | 337 | } |
dofydoink | 42:5a5ad23a4bb1 | 338 | |
dofydoink | 42:5a5ad23a4bb1 | 339 | double GetMaxTravelTime(double startPositions[], double endPositions[], double speed){ |
dofydoink | 42:5a5ad23a4bb1 | 340 | double arT[3]; |
dofydoink | 42:5a5ad23a4bb1 | 341 | for(int ii = 0; ii< 3; ii++){ |
dofydoink | 42:5a5ad23a4bb1 | 342 | arT[ii] = endPositions[ii] - startPositions[ii]; |
dofydoink | 42:5a5ad23a4bb1 | 343 | arT[ii] /= speed; |
dofydoink | 42:5a5ad23a4bb1 | 344 | arT[ii] = abs(arT[ii]); |
dofydoink | 42:5a5ad23a4bb1 | 345 | } |
dofydoink | 42:5a5ad23a4bb1 | 346 | double Tmax = 0.0; |
dofydoink | 42:5a5ad23a4bb1 | 347 | for(int ii = 0; ii<3; ii++){ |
dofydoink | 42:5a5ad23a4bb1 | 348 | if( Tmax < arT[ii] ){ |
dofydoink | 42:5a5ad23a4bb1 | 349 | Tmax = arT[ii]; |
dofydoink | 42:5a5ad23a4bb1 | 350 | } |
dofydoink | 42:5a5ad23a4bb1 | 351 | } |
dofydoink | 42:5a5ad23a4bb1 | 352 | return Tmax; |
dofydoink | 42:5a5ad23a4bb1 | 353 | } |
dofydoink | 42:5a5ad23a4bb1 | 354 | |
dofydoink | 42:5a5ad23a4bb1 | 355 | void UpdateFrontSegPosition(double position[]){ |
dofydoink | 42:5a5ad23a4bb1 | 356 | for(int ii = 0; ii<3; ii++){ |
dofydoink | 42:5a5ad23a4bb1 | 357 | dblX[ii] = position[ii]; |
WD40andTape | 17:bbaf3e8440ad | 358 | } |
WD40andTape | 17:bbaf3e8440ad | 359 | } |
WD40andTape | 17:bbaf3e8440ad | 360 | |
dofydoink | 42:5a5ad23a4bb1 | 361 | void GoToNeutralPose(double speed){ |
dofydoink | 42:5a5ad23a4bb1 | 362 | isBusy = 1; |
dofydoink | 42:5a5ad23a4bb1 | 363 | double T_wait; |
dofydoink | 42:5a5ad23a4bb1 | 364 | double arSpeed[3] = {speed, speed, speed}; |
dofydoink | 42:5a5ad23a4bb1 | 365 | double arPosition[3] = {ACTUATOR_OFFSET, ACTUATOR_OFFSET, ACTUATOR_OFFSET}; |
dofydoink | 42:5a5ad23a4bb1 | 366 | SetFrontDemand(arPosition, arSpeed); |
dofydoink | 42:5a5ad23a4bb1 | 367 | |
dofydoink | 42:5a5ad23a4bb1 | 368 | //T_wait = 40.0 / speed; |
dofydoink | 42:5a5ad23a4bb1 | 369 | T_wait = GetMaxTravelTime(dblX, arPosition, speed); |
dofydoink | 42:5a5ad23a4bb1 | 370 | T_wait += 0.25;//add a little bit of time for security |
dofydoink | 42:5a5ad23a4bb1 | 371 | //print for debug |
dofydoink | 42:5a5ad23a4bb1 | 372 | printf("\r\nGoing to neutral. %f\r\n", T_wait); |
dofydoink | 42:5a5ad23a4bb1 | 373 | |
dofydoink | 42:5a5ad23a4bb1 | 374 | wait(T_wait); |
dofydoink | 42:5a5ad23a4bb1 | 375 | UpdateFrontSegPosition(arPosition); |
dofydoink | 42:5a5ad23a4bb1 | 376 | //isZero = 0; |
dofydoink | 42:5a5ad23a4bb1 | 377 | isBusy = 0; |
dofydoink | 42:5a5ad23a4bb1 | 378 | } |
dofydoink | 42:5a5ad23a4bb1 | 379 | |
dofydoink | 42:5a5ad23a4bb1 | 380 | void GoToAnchorPose(double speed){ |
dofydoink | 42:5a5ad23a4bb1 | 381 | //reset front segment position |
dofydoink | 42:5a5ad23a4bb1 | 382 | //isAnchor = 0; |
dofydoink | 42:5a5ad23a4bb1 | 383 | isBusy = 1; |
dofydoink | 42:5a5ad23a4bb1 | 384 | double T_wait; |
dofydoink | 42:5a5ad23a4bb1 | 385 | double arSpeed[3] = {speed, speed, speed}; |
dofydoink | 42:5a5ad23a4bb1 | 386 | double arStartPosition[3]; |
dofydoink | 42:5a5ad23a4bb1 | 387 | //save starting position |
dofydoink | 42:5a5ad23a4bb1 | 388 | for (int ii = 0; ii<3; ii++){ |
dofydoink | 42:5a5ad23a4bb1 | 389 | arStartPosition[ii] = dblX[ii]; |
dofydoink | 42:5a5ad23a4bb1 | 390 | } |
dofydoink | 42:5a5ad23a4bb1 | 391 | |
dofydoink | 42:5a5ad23a4bb1 | 392 | double arAnchorPosition[3] = {ACTUATOR_OFFSET, ACTUATOR_OFFSET, ACTUATOR_OFFSET}; |
dofydoink | 42:5a5ad23a4bb1 | 393 | |
dofydoink | 42:5a5ad23a4bb1 | 394 | //Go to neutral |
dofydoink | 42:5a5ad23a4bb1 | 395 | GoToNeutralPose(speed); |
dofydoink | 42:5a5ad23a4bb1 | 396 | |
dofydoink | 42:5a5ad23a4bb1 | 397 | //select direction of anchor |
dofydoink | 42:5a5ad23a4bb1 | 398 | arAnchorPosition[intAnchorDirection] = ANCHOR_POSITION; |
dofydoink | 42:5a5ad23a4bb1 | 399 | intAnchorDirection++; //rotate next anchoring position |
dofydoink | 42:5a5ad23a4bb1 | 400 | if(intAnchorDirection >= 3){ |
dofydoink | 42:5a5ad23a4bb1 | 401 | intAnchorDirection = 0; |
dofydoink | 42:5a5ad23a4bb1 | 402 | } |
dofydoink | 42:5a5ad23a4bb1 | 403 | //go to anchor position |
dofydoink | 42:5a5ad23a4bb1 | 404 | SetFrontDemand(arAnchorPosition, arSpeed); |
dofydoink | 42:5a5ad23a4bb1 | 405 | T_wait = GetMaxTravelTime(dblX, arAnchorPosition, speed); |
dofydoink | 42:5a5ad23a4bb1 | 406 | T_wait += 0.25;//add a little bit of time for security |
dofydoink | 42:5a5ad23a4bb1 | 407 | printf("Going to anchor. %f s\r\n", T_wait); |
dofydoink | 42:5a5ad23a4bb1 | 408 | wait(T_wait); |
dofydoink | 42:5a5ad23a4bb1 | 409 | |
dofydoink | 42:5a5ad23a4bb1 | 410 | //update front segment position. |
dofydoink | 42:5a5ad23a4bb1 | 411 | UpdateFrontSegPosition(arAnchorPosition); |
dofydoink | 42:5a5ad23a4bb1 | 412 | |
dofydoink | 42:5a5ad23a4bb1 | 413 | //contract |
dofydoink | 42:5a5ad23a4bb1 | 414 | SetDriveDemand(HOME_DRIVE_POSITION, SAFE_CONTRACT_SPEED); |
dofydoink | 42:5a5ad23a4bb1 | 415 | T_wait = dblS - HOME_DRIVE_POSITION; |
dofydoink | 42:5a5ad23a4bb1 | 416 | T_wait /= SAFE_CONTRACT_SPEED; |
dofydoink | 42:5a5ad23a4bb1 | 417 | printf("Contracting. %f s\r\n", T_wait); |
dofydoink | 42:5a5ad23a4bb1 | 418 | wait(T_wait); |
dofydoink | 42:5a5ad23a4bb1 | 419 | //update drive segment position |
dofydoink | 42:5a5ad23a4bb1 | 420 | dblS = HOME_DRIVE_POSITION; |
dofydoink | 42:5a5ad23a4bb1 | 421 | |
dofydoink | 42:5a5ad23a4bb1 | 422 | //go back to neutral pose |
dofydoink | 42:5a5ad23a4bb1 | 423 | GoToNeutralPose(speed); |
dofydoink | 42:5a5ad23a4bb1 | 424 | |
dofydoink | 42:5a5ad23a4bb1 | 425 | //go back to starting position |
dofydoink | 42:5a5ad23a4bb1 | 426 | SetFrontDemand(arStartPosition, arSpeed); |
dofydoink | 42:5a5ad23a4bb1 | 427 | T_wait = GetMaxTravelTime(dblX, arStartPosition, speed); |
dofydoink | 42:5a5ad23a4bb1 | 428 | T_wait += 0.25;//add a little bit of time for security |
dofydoink | 42:5a5ad23a4bb1 | 429 | printf("Going to intial position. %f\r\n", T_wait); |
dofydoink | 42:5a5ad23a4bb1 | 430 | wait(T_wait); |
dofydoink | 42:5a5ad23a4bb1 | 431 | //UpdateFrontSegPosition(arStartPosition); |
dofydoink | 42:5a5ad23a4bb1 | 432 | for(int ii = 0; ii<3; ii++){ |
dofydoink | 42:5a5ad23a4bb1 | 433 | dblX[ii] = arStartPosition[ii]; |
dofydoink | 42:5a5ad23a4bb1 | 434 | } |
dofydoink | 42:5a5ad23a4bb1 | 435 | |
dofydoink | 42:5a5ad23a4bb1 | 436 | //print for debug |
dofydoink | 42:5a5ad23a4bb1 | 437 | isBusy = 0; |
dofydoink | 42:5a5ad23a4bb1 | 438 | } |
dofydoink | 42:5a5ad23a4bb1 | 439 | |
dofydoink | 42:5a5ad23a4bb1 | 440 | |
dofydoink | 42:5a5ad23a4bb1 | 441 | void GoToCustomPose(double position[], double speed){ |
dofydoink | 42:5a5ad23a4bb1 | 442 | //reset front segment position |
dofydoink | 42:5a5ad23a4bb1 | 443 | //isBusy = 1; |
dofydoink | 42:5a5ad23a4bb1 | 444 | double T_wait; |
dofydoink | 42:5a5ad23a4bb1 | 445 | double arSpeed[3] = {speed, speed, speed}; |
dofydoink | 42:5a5ad23a4bb1 | 446 | for (int ii = 0; ii<3; ii++){ |
dofydoink | 42:5a5ad23a4bb1 | 447 | position[ii] = limDouble(position[ii], 0.0, (double)MAX_ACTUATOR_LIMIT_MM); |
dofydoink | 42:5a5ad23a4bb1 | 448 | } |
dofydoink | 42:5a5ad23a4bb1 | 449 | SetFrontDemand(position, arSpeed); |
dofydoink | 42:5a5ad23a4bb1 | 450 | |
dofydoink | 42:5a5ad23a4bb1 | 451 | //T_wait = 40.0 / speed; |
dofydoink | 42:5a5ad23a4bb1 | 452 | T_wait = GetMaxTravelTime(dblX, position, speed); |
dofydoink | 42:5a5ad23a4bb1 | 453 | T_wait += 0.25;//add a little bit of time for security |
dofydoink | 42:5a5ad23a4bb1 | 454 | //print for debug |
dofydoink | 42:5a5ad23a4bb1 | 455 | printf("\r\nGoing to custom pose. T_wait: %f s \r\n", T_wait); |
dofydoink | 42:5a5ad23a4bb1 | 456 | wait(T_wait); |
dofydoink | 42:5a5ad23a4bb1 | 457 | UpdateFrontSegPosition(position); |
dofydoink | 42:5a5ad23a4bb1 | 458 | printf("Done\r\n"); |
dofydoink | 42:5a5ad23a4bb1 | 459 | //isBusy = 0; |
dofydoink | 42:5a5ad23a4bb1 | 460 | } |
dofydoink | 42:5a5ad23a4bb1 | 461 | |
dofydoink | 42:5a5ad23a4bb1 | 462 | |
dofydoink | 42:5a5ad23a4bb1 | 463 | void AllGoTo(double position, double speed){ |
dofydoink | 42:5a5ad23a4bb1 | 464 | //reset front segment position |
dofydoink | 42:5a5ad23a4bb1 | 465 | //isBusy = 1; |
dofydoink | 42:5a5ad23a4bb1 | 466 | double T_wait; |
dofydoink | 42:5a5ad23a4bb1 | 467 | double arSpeed[3] = {speed, speed, speed}; |
dofydoink | 42:5a5ad23a4bb1 | 468 | position = limDouble(position, 0.0, (double)MAX_ACTUATOR_LIMIT_MM); |
dofydoink | 42:5a5ad23a4bb1 | 469 | |
dofydoink | 42:5a5ad23a4bb1 | 470 | double arPosition[3] = {position, position, position}; |
dofydoink | 42:5a5ad23a4bb1 | 471 | SetFrontDemand(arPosition, arSpeed); |
dofydoink | 42:5a5ad23a4bb1 | 472 | |
dofydoink | 42:5a5ad23a4bb1 | 473 | //T_wait = 40.0 / speed; |
dofydoink | 42:5a5ad23a4bb1 | 474 | T_wait = GetMaxTravelTime(dblX, arPosition, speed); |
dofydoink | 42:5a5ad23a4bb1 | 475 | T_wait += 0.25;//add a little bit of time for security |
dofydoink | 42:5a5ad23a4bb1 | 476 | //print for debug |
dofydoink | 42:5a5ad23a4bb1 | 477 | printf("\r\nMoving all to %f mm. T_wait: %f\r\n",position, T_wait); |
dofydoink | 42:5a5ad23a4bb1 | 478 | |
dofydoink | 42:5a5ad23a4bb1 | 479 | wait(T_wait); |
dofydoink | 42:5a5ad23a4bb1 | 480 | UpdateFrontSegPosition(arPosition); |
dofydoink | 42:5a5ad23a4bb1 | 481 | printf("Done\r\n"); |
dofydoink | 42:5a5ad23a4bb1 | 482 | //isBusy = 0; |
dofydoink | 42:5a5ad23a4bb1 | 483 | } |
dofydoink | 42:5a5ad23a4bb1 | 484 | |
dofydoink | 42:5a5ad23a4bb1 | 485 | void FlushSyringes(int repetitions){ |
dofydoink | 42:5a5ad23a4bb1 | 486 | //isBusy = 1; |
dofydoink | 42:5a5ad23a4bb1 | 487 | printf("\r\n\r\n:::Flushing Syringes:::\r\n"); |
dofydoink | 42:5a5ad23a4bb1 | 488 | pinFlushOut = 1; |
dofydoink | 42:5a5ad23a4bb1 | 489 | wait(1.0); |
dofydoink | 42:5a5ad23a4bb1 | 490 | for(int ii = 0; ii<repetitions; ii++){ |
dofydoink | 42:5a5ad23a4bb1 | 491 | AllGoTo(40.0,20.0); |
dofydoink | 42:5a5ad23a4bb1 | 492 | wait(0.5); |
dofydoink | 42:5a5ad23a4bb1 | 493 | AllGoTo(0.0,2.0); |
dofydoink | 42:5a5ad23a4bb1 | 494 | wait(0.5); |
dofydoink | 42:5a5ad23a4bb1 | 495 | } |
dofydoink | 42:5a5ad23a4bb1 | 496 | pinFlushOut = 0; |
dofydoink | 42:5a5ad23a4bb1 | 497 | printf("Done\r\n"); |
dofydoink | 42:5a5ad23a4bb1 | 498 | //isBusy = 0; |
dofydoink | 42:5a5ad23a4bb1 | 499 | } |
dofydoink | 42:5a5ad23a4bb1 | 500 | |
dofydoink | 42:5a5ad23a4bb1 | 501 | void FlushSegment(int repetitions){ |
dofydoink | 42:5a5ad23a4bb1 | 502 | //isBusy = 1; |
dofydoink | 42:5a5ad23a4bb1 | 503 | printf("\r\n\r\n:::Flushing Segment:::\r\n"); |
dofydoink | 42:5a5ad23a4bb1 | 504 | FlushSyringes(1);//ensure syringes are flushed. |
dofydoink | 42:5a5ad23a4bb1 | 505 | double arZero[3] = {0.0, 0.0, 0.0}; |
dofydoink | 42:5a5ad23a4bb1 | 506 | |
dofydoink | 42:5a5ad23a4bb1 | 507 | double flushPosition = 30.0; |
dofydoink | 42:5a5ad23a4bb1 | 508 | |
dofydoink | 42:5a5ad23a4bb1 | 509 | double arFlushPose1[3] = {flushPosition, 0.0, 0.0}; |
dofydoink | 42:5a5ad23a4bb1 | 510 | double arFlushPose2[3] = {0.0, flushPosition, 0.0}; |
dofydoink | 42:5a5ad23a4bb1 | 511 | double arFlushPose3[3] = {0.0, 0.0, flushPosition}; |
dofydoink | 42:5a5ad23a4bb1 | 512 | for(int ii = 0; ii<repetitions; ii++){ |
dofydoink | 42:5a5ad23a4bb1 | 513 | //flush first chamber |
dofydoink | 42:5a5ad23a4bb1 | 514 | printf("Flushing first chamber\r\n"); |
dofydoink | 42:5a5ad23a4bb1 | 515 | GoToCustomPose(arFlushPose1, SAFE_SPEED_MMpS); |
dofydoink | 42:5a5ad23a4bb1 | 516 | AllGoTo(0.0, SAFE_SPEED_MMpS); |
dofydoink | 42:5a5ad23a4bb1 | 517 | |
dofydoink | 42:5a5ad23a4bb1 | 518 | //flush second chamber |
dofydoink | 42:5a5ad23a4bb1 | 519 | printf("Flushing second chamber\r\n"); |
dofydoink | 42:5a5ad23a4bb1 | 520 | GoToCustomPose(arFlushPose2, SAFE_SPEED_MMpS); |
dofydoink | 42:5a5ad23a4bb1 | 521 | AllGoTo(0.0, SAFE_SPEED_MMpS); |
dofydoink | 42:5a5ad23a4bb1 | 522 | |
dofydoink | 42:5a5ad23a4bb1 | 523 | //flush third chamber |
dofydoink | 42:5a5ad23a4bb1 | 524 | printf("Flushing third chamber\r\n"); |
dofydoink | 42:5a5ad23a4bb1 | 525 | GoToCustomPose(arFlushPose3, SAFE_SPEED_MMpS); |
dofydoink | 42:5a5ad23a4bb1 | 526 | AllGoTo(0.0, SAFE_SPEED_MMpS); |
dofydoink | 42:5a5ad23a4bb1 | 527 | |
dofydoink | 42:5a5ad23a4bb1 | 528 | FlushSyringes(1);//flush syringes |
dofydoink | 42:5a5ad23a4bb1 | 529 | } |
dofydoink | 42:5a5ad23a4bb1 | 530 | printf("Done\r\n"); |
dofydoink | 42:5a5ad23a4bb1 | 531 | //isBusy = 0; |
WD40andTape | 17:bbaf3e8440ad | 532 | } |
dofydoink | 0:607bc887b6e0 | 533 | |
dofydoink | 42:5a5ad23a4bb1 | 534 | void FlushTubing(int repetitions){ |
dofydoink | 42:5a5ad23a4bb1 | 535 | //isBusy = 1; |
dofydoink | 42:5a5ad23a4bb1 | 536 | printf("\r\n\r\n:::Flushing Tubing:::\r\n"); |
dofydoink | 42:5a5ad23a4bb1 | 537 | for (int ii = 0; ii<repetitions; ii++){ |
dofydoink | 42:5a5ad23a4bb1 | 538 | AllGoTo(40.0,15.0); |
dofydoink | 42:5a5ad23a4bb1 | 539 | pinFlushOut = 1; |
dofydoink | 42:5a5ad23a4bb1 | 540 | wait(1.0); |
dofydoink | 42:5a5ad23a4bb1 | 541 | AllGoTo(0.0, 2.0); |
dofydoink | 42:5a5ad23a4bb1 | 542 | pinFlushOut = 0; |
dofydoink | 42:5a5ad23a4bb1 | 543 | wait(0.5); |
dofydoink | 42:5a5ad23a4bb1 | 544 | } |
dofydoink | 42:5a5ad23a4bb1 | 545 | } |
WD40andTape | 6:f0a18e28a322 | 546 | |
dofydoink | 42:5a5ad23a4bb1 | 547 | |
dofydoink | 42:5a5ad23a4bb1 | 548 | void DebugMode(){ |
dofydoink | 42:5a5ad23a4bb1 | 549 | isBusy = 1; |
dofydoink | 42:5a5ad23a4bb1 | 550 | printf("\r\nEntering debug mode. Going to zero.\r\n"); |
dofydoink | 42:5a5ad23a4bb1 | 551 | double zeroPos[3] = {0.0, 0.0, 0.0}; |
dofydoink | 42:5a5ad23a4bb1 | 552 | double safeVel[3] = {SAFE_SPEED_MMpS, SAFE_SPEED_MMpS, SAFE_SPEED_MMpS}; |
WD40andTape | 17:bbaf3e8440ad | 553 | |
dofydoink | 42:5a5ad23a4bb1 | 554 | |
dofydoink | 42:5a5ad23a4bb1 | 555 | SetFrontDemand(zeroPos, safeVel); |
dofydoink | 42:5a5ad23a4bb1 | 556 | SetDriveDemand(0.0, SAFE_CONTRACT_SPEED); |
dofydoink | 42:5a5ad23a4bb1 | 557 | double T_wait = GetMaxTravelTime(dblX, zeroPos, SAFE_SPEED_MMpS); |
dofydoink | 42:5a5ad23a4bb1 | 558 | T_wait += 0.25; |
dofydoink | 42:5a5ad23a4bb1 | 559 | wait(T_wait); |
dofydoink | 42:5a5ad23a4bb1 | 560 | UpdateFrontSegPosition(zeroPos); |
dofydoink | 42:5a5ad23a4bb1 | 561 | printf("Done\r\nPlease enter command\r\n"); |
dofydoink | 42:5a5ad23a4bb1 | 562 | |
dofydoink | 42:5a5ad23a4bb1 | 563 | int countSyringeFlush = 0; |
dofydoink | 42:5a5ad23a4bb1 | 564 | int countSegmentFlush = 0; |
dofydoink | 42:5a5ad23a4bb1 | 565 | int countTubingFlush = 0; |
WD40andTape | 4:303584310071 | 566 | |
dofydoink | 42:5a5ad23a4bb1 | 567 | while(isDebug){ |
dofydoink | 42:5a5ad23a4bb1 | 568 | isBusy = 1; |
dofydoink | 42:5a5ad23a4bb1 | 569 | //printf("x\r\n"); |
dofydoink | 42:5a5ad23a4bb1 | 570 | |
dofydoink | 42:5a5ad23a4bb1 | 571 | if( pinZeroIn.read() ){ |
dofydoink | 42:5a5ad23a4bb1 | 572 | //printf("zero%d\r\n",countSyringeFlush); |
dofydoink | 42:5a5ad23a4bb1 | 573 | |
dofydoink | 42:5a5ad23a4bb1 | 574 | if(countSyringeFlush == 0){ |
dofydoink | 42:5a5ad23a4bb1 | 575 | printf("\r\n Syringe Flush Selected\r\n"); |
dofydoink | 42:5a5ad23a4bb1 | 576 | } |
dofydoink | 42:5a5ad23a4bb1 | 577 | countSyringeFlush++; |
dofydoink | 42:5a5ad23a4bb1 | 578 | countSegmentFlush = 0; |
dofydoink | 42:5a5ad23a4bb1 | 579 | countTubingFlush = 0; |
dofydoink | 42:5a5ad23a4bb1 | 580 | if(countSyringeFlush > 50){ |
dofydoink | 42:5a5ad23a4bb1 | 581 | FlushSyringes(4); |
dofydoink | 42:5a5ad23a4bb1 | 582 | countSyringeFlush = 0; |
WD40andTape | 33:9877ca32e43c | 583 | } |
dofydoink | 42:5a5ad23a4bb1 | 584 | //printf("%d\r\n", countSyringeFlush); |
dofydoink | 42:5a5ad23a4bb1 | 585 | |
dofydoink | 42:5a5ad23a4bb1 | 586 | }else { |
dofydoink | 42:5a5ad23a4bb1 | 587 | countSyringeFlush = 0; |
dofydoink | 42:5a5ad23a4bb1 | 588 | } |
dofydoink | 42:5a5ad23a4bb1 | 589 | |
dofydoink | 42:5a5ad23a4bb1 | 590 | if( pinSucIn.read() ){ |
dofydoink | 42:5a5ad23a4bb1 | 591 | //printf("suc%d\r\n", countSegmentFlush); |
dofydoink | 42:5a5ad23a4bb1 | 592 | |
dofydoink | 42:5a5ad23a4bb1 | 593 | if(countSegmentFlush == 0){ |
dofydoink | 42:5a5ad23a4bb1 | 594 | printf("\r\n Segment Flush Selected\r\n"); |
dofydoink | 42:5a5ad23a4bb1 | 595 | } |
dofydoink | 42:5a5ad23a4bb1 | 596 | countSyringeFlush = 0; |
dofydoink | 42:5a5ad23a4bb1 | 597 | countSegmentFlush++; |
dofydoink | 42:5a5ad23a4bb1 | 598 | countTubingFlush = 0; |
dofydoink | 42:5a5ad23a4bb1 | 599 | if(countSegmentFlush > 50){ |
dofydoink | 42:5a5ad23a4bb1 | 600 | FlushSegment(2); |
dofydoink | 42:5a5ad23a4bb1 | 601 | countSegmentFlush = 0; |
dofydoink | 42:5a5ad23a4bb1 | 602 | } |
dofydoink | 42:5a5ad23a4bb1 | 603 | }else { |
dofydoink | 42:5a5ad23a4bb1 | 604 | countSegmentFlush = 0; |
dofydoink | 42:5a5ad23a4bb1 | 605 | } |
dofydoink | 42:5a5ad23a4bb1 | 606 | |
dofydoink | 42:5a5ad23a4bb1 | 607 | if( pinWashIn.read() ){ |
dofydoink | 42:5a5ad23a4bb1 | 608 | //printf("wash%d\r\n", countTubingFlush); |
dofydoink | 42:5a5ad23a4bb1 | 609 | if(countTubingFlush == 0){ |
dofydoink | 42:5a5ad23a4bb1 | 610 | printf("\r\n Tubing Flush Selected\r\n"); |
dofydoink | 42:5a5ad23a4bb1 | 611 | } |
dofydoink | 42:5a5ad23a4bb1 | 612 | countSyringeFlush = 0; |
dofydoink | 42:5a5ad23a4bb1 | 613 | countSegmentFlush = 0; |
dofydoink | 42:5a5ad23a4bb1 | 614 | countTubingFlush++; |
dofydoink | 42:5a5ad23a4bb1 | 615 | if(countTubingFlush > 50){ |
dofydoink | 42:5a5ad23a4bb1 | 616 | FlushTubing(2); |
dofydoink | 42:5a5ad23a4bb1 | 617 | countTubingFlush = 0; |
dofydoink | 42:5a5ad23a4bb1 | 618 | } |
dofydoink | 42:5a5ad23a4bb1 | 619 | }else { |
dofydoink | 42:5a5ad23a4bb1 | 620 | countTubingFlush = 0; |
WD40andTape | 33:9877ca32e43c | 621 | } |
dofydoink | 42:5a5ad23a4bb1 | 622 | |
dofydoink | 42:5a5ad23a4bb1 | 623 | wait(0.1); |
dofydoink | 42:5a5ad23a4bb1 | 624 | } |
dofydoink | 42:5a5ad23a4bb1 | 625 | |
dofydoink | 42:5a5ad23a4bb1 | 626 | GoToNeutralPose(SAFE_SPEED_MMpS); |
dofydoink | 42:5a5ad23a4bb1 | 627 | //reset front segment position |
dofydoink | 42:5a5ad23a4bb1 | 628 | dblAlpha = 0.0; |
dofydoink | 42:5a5ad23a4bb1 | 629 | dblBeta = 0.0; |
dofydoink | 42:5a5ad23a4bb1 | 630 | printf("\r\nManual control enabled\r\n"); |
dofydoink | 42:5a5ad23a4bb1 | 631 | isBusy = 0; |
dofydoink | 42:5a5ad23a4bb1 | 632 | } |
dofydoink | 42:5a5ad23a4bb1 | 633 | |
dofydoink | 42:5a5ad23a4bb1 | 634 | void ReadHHC(){ |
dofydoink | 42:5a5ad23a4bb1 | 635 | printf("Homing. Please wait...\r\n"); |
dofydoink | 42:5a5ad23a4bb1 | 636 | |
dofydoink | 42:5a5ad23a4bb1 | 637 | |
dofydoink | 42:5a5ad23a4bb1 | 638 | double startingPos[3] = {ACTUATOR_OFFSET, ACTUATOR_OFFSET, ACTUATOR_OFFSET}; |
dofydoink | 42:5a5ad23a4bb1 | 639 | double startingVel[3] = {SAFE_SPEED_MMpS, SAFE_SPEED_MMpS, SAFE_SPEED_MMpS}; |
dofydoink | 42:5a5ad23a4bb1 | 640 | SetFrontDemand(startingPos, startingVel); |
dofydoink | 42:5a5ad23a4bb1 | 641 | SetDriveDemand(HOME_DRIVE_POSITION, SAFE_CONTRACT_SPEED); |
dofydoink | 42:5a5ad23a4bb1 | 642 | wait(5); |
dofydoink | 42:5a5ad23a4bb1 | 643 | printf("Done.\r\n"); |
dofydoink | 42:5a5ad23a4bb1 | 644 | threadSendFeedback.start(SendFeedback); |
dofydoink | 42:5a5ad23a4bb1 | 645 | tickerSendFeedback.attach(&signalSendFeedback, 1/(float)SENSOR_FEEDBACK_HZ); |
dofydoink | 42:5a5ad23a4bb1 | 646 | while(1){ |
dofydoink | 42:5a5ad23a4bb1 | 647 | semReadHHC.wait(); |
dofydoink | 42:5a5ad23a4bb1 | 648 | |
dofydoink | 42:5a5ad23a4bb1 | 649 | if(isZero){ |
dofydoink | 42:5a5ad23a4bb1 | 650 | GoToNeutralPose(SAFE_SPEED_MMpS); |
dofydoink | 42:5a5ad23a4bb1 | 651 | //reset front segment position |
dofydoink | 42:5a5ad23a4bb1 | 652 | dblAlpha = 0.0; |
dofydoink | 42:5a5ad23a4bb1 | 653 | dblBeta = 0.0; |
dofydoink | 42:5a5ad23a4bb1 | 654 | isZero = 0; |
dofydoink | 42:5a5ad23a4bb1 | 655 | printf("Done\r\n"); |
dofydoink | 42:5a5ad23a4bb1 | 656 | } |
dofydoink | 42:5a5ad23a4bb1 | 657 | |
dofydoink | 42:5a5ad23a4bb1 | 658 | if(isCycle){ |
dofydoink | 42:5a5ad23a4bb1 | 659 | GoToAnchorPose(SAFE_SPEED_MMpS); |
dofydoink | 42:5a5ad23a4bb1 | 660 | isCycle = 0; |
dofydoink | 42:5a5ad23a4bb1 | 661 | printf("Done\r\n"); |
dofydoink | 42:5a5ad23a4bb1 | 662 | } |
dofydoink | 42:5a5ad23a4bb1 | 663 | if(isDebug){ |
dofydoink | 42:5a5ad23a4bb1 | 664 | DebugMode(); |
dofydoink | 42:5a5ad23a4bb1 | 665 | } |
dofydoink | 42:5a5ad23a4bb1 | 666 | |
dofydoink | 42:5a5ad23a4bb1 | 667 | if(!isSteerLock){ |
dofydoink | 42:5a5ad23a4bb1 | 668 | //read Joystick sensors |
dofydoink | 42:5a5ad23a4bb1 | 669 | double dblJSX = pinJSX.read(); |
dofydoink | 42:5a5ad23a4bb1 | 670 | double dblJSY = pinJSY.read(); |
dofydoink | 42:5a5ad23a4bb1 | 671 | |
dofydoink | 42:5a5ad23a4bb1 | 672 | dblJSX = DeadZone(dblJSX, 0.07, 0.85, 0.15); |
dofydoink | 42:5a5ad23a4bb1 | 673 | dblJSY = DeadZone(dblJSY, 0.07, 0.85, 0.15); |
dofydoink | 42:5a5ad23a4bb1 | 674 | |
dofydoink | 42:5a5ad23a4bb1 | 675 | if(pinWashIn.read()){ |
dofydoink | 42:5a5ad23a4bb1 | 676 | pinWashOut = 0; |
dofydoink | 42:5a5ad23a4bb1 | 677 | }else{ |
dofydoink | 42:5a5ad23a4bb1 | 678 | pinWashOut = 1; |
dofydoink | 42:5a5ad23a4bb1 | 679 | } |
dofydoink | 42:5a5ad23a4bb1 | 680 | |
dofydoink | 42:5a5ad23a4bb1 | 681 | //convert to angular velocity for front segment |
dofydoink | 42:5a5ad23a4bb1 | 682 | |
dofydoink | 42:5a5ad23a4bb1 | 683 | //Find changes in angle |
dofydoink | 42:5a5ad23a4bb1 | 684 | dblDeltaAlpha = dblJSX * x_axis_sign * dblSensitivity * MAX_STEER_SPEED_RADpS / HHC_READ_FREQ_HZ; |
dofydoink | 42:5a5ad23a4bb1 | 685 | dblDeltaBeta = dblJSY*dblSensitivity*MAX_STEER_SPEED_RADpS/HHC_READ_FREQ_HZ; |
dofydoink | 42:5a5ad23a4bb1 | 686 | //convert to speeds in [rad/s] |
dofydoink | 42:5a5ad23a4bb1 | 687 | dblAlphaDot = dblDeltaAlpha*HHC_READ_FREQ_HZ; |
dofydoink | 42:5a5ad23a4bb1 | 688 | dblBetaDot = dblDeltaBeta*HHC_READ_FREQ_HZ; |
dofydoink | 42:5a5ad23a4bb1 | 689 | |
dofydoink | 42:5a5ad23a4bb1 | 690 | //calculate required velocity based on current possition and new inputs. |
dofydoink | 42:5a5ad23a4bb1 | 691 | dblPhi = atan2(dblBeta,dblAlpha); |
dofydoink | 42:5a5ad23a4bb1 | 692 | double dblPhiDot = dblAlpha * dblBetaDot - dblBeta * dblAlphaDot; |
dofydoink | 42:5a5ad23a4bb1 | 693 | dblPhiDot /= (dblAlpha * dblAlpha + dblBeta*dblBeta); |
dofydoink | 42:5a5ad23a4bb1 | 694 | if( fabs( cos(dblPhi) ) >= 0.7106781 ){ |
dofydoink | 42:5a5ad23a4bb1 | 695 | dblTheta = dblAlpha / cos(dblPhi); |
dofydoink | 42:5a5ad23a4bb1 | 696 | double dblThetaDot = dblAlphaDot * cos(dblPhi) + dblAlpha * dblPhiDot * sin(dblPhi); |
dofydoink | 42:5a5ad23a4bb1 | 697 | dblThetaDot /= cos(dblPhi)*cos(dblPhi); |
dofydoink | 42:5a5ad23a4bb1 | 698 | double dblPsi[3]; |
dofydoink | 42:5a5ad23a4bb1 | 699 | for (int ii =0; ii<3; ii++){ |
dofydoink | 42:5a5ad23a4bb1 | 700 | dblPsi[ii] = dblPhi - ii*2*PI/3; |
dofydoink | 42:5a5ad23a4bb1 | 701 | if(dblBeta == 0){ |
dofydoink | 42:5a5ad23a4bb1 | 702 | dblXdot[ii] = ACT_CONV * K_theta*( cos(dblPsi[ii]) + d_theta); |
dofydoink | 42:5a5ad23a4bb1 | 703 | dblXdot[ii] *= ( dblAlphaDot - dblBetaDot * sin(dblPsi[ii]) ) / cos(dblPhi); |
WD40andTape | 32:8c59c536a2a6 | 704 | } |
dofydoink | 42:5a5ad23a4bb1 | 705 | else{ |
dofydoink | 42:5a5ad23a4bb1 | 706 | dblXdot[ii] = ACT_CONV * K_theta * ( ( cos(dblPsi[ii]) + d_theta) * dblThetaDot - dblTheta * sin(dblPsi[ii]) * dblPhiDot); |
dofydoink | 42:5a5ad23a4bb1 | 707 | } |
dofydoink | 42:5a5ad23a4bb1 | 708 | } |
dofydoink | 42:5a5ad23a4bb1 | 709 | } |
dofydoink | 42:5a5ad23a4bb1 | 710 | else { |
dofydoink | 42:5a5ad23a4bb1 | 711 | dblTheta = dblBeta / sin(dblPhi); |
dofydoink | 42:5a5ad23a4bb1 | 712 | double dblThetaDot = dblBetaDot * sin(dblPhi) + dblBeta * dblPhiDot * cos(dblPhi); |
dofydoink | 42:5a5ad23a4bb1 | 713 | dblThetaDot /= sin(dblPhi)*sin(dblPhi); |
dofydoink | 42:5a5ad23a4bb1 | 714 | double dblPsi[3]; |
dofydoink | 42:5a5ad23a4bb1 | 715 | for (int ii =0; ii<3; ii++){ |
dofydoink | 42:5a5ad23a4bb1 | 716 | dblPsi[ii] = dblPhi - ii*2*PI/3; |
dofydoink | 42:5a5ad23a4bb1 | 717 | if(dblAlpha == 0){ |
dofydoink | 42:5a5ad23a4bb1 | 718 | dblXdot[ii] = ACT_CONV * K_theta * ( cos(dblPsi[ii]) + d_theta); |
dofydoink | 42:5a5ad23a4bb1 | 719 | dblXdot[ii] *= ( dblBetaDot - dblAlphaDot * sin(dblPsi[ii]) ) / sin(dblPhi); |
WD40andTape | 31:08cb04eb75fc | 720 | } |
dofydoink | 42:5a5ad23a4bb1 | 721 | else{ |
dofydoink | 42:5a5ad23a4bb1 | 722 | dblXdot[ii] = ACT_CONV * K_theta * ( ( cos(dblPsi[ii]) + d_theta ) * dblThetaDot - dblTheta * sin(dblPsi[ii]) * dblPhiDot); |
WD40andTape | 31:08cb04eb75fc | 723 | } |
WD40andTape | 29:10a5cf37a875 | 724 | } |
dofydoink | 42:5a5ad23a4bb1 | 725 | } |
dofydoink | 42:5a5ad23a4bb1 | 726 | //calculate new angles for next front segment position |
dofydoink | 42:5a5ad23a4bb1 | 727 | dblAlpha += dblDeltaAlpha; // update new alpha postion |
dofydoink | 42:5a5ad23a4bb1 | 728 | dblBeta += dblDeltaBeta; // update new beta position |
dofydoink | 42:5a5ad23a4bb1 | 729 | |
dofydoink | 42:5a5ad23a4bb1 | 730 | dblAlpha = limDouble(dblAlpha, (double)-1.0*MAX_THETA_RAD, (double)MAX_THETA_RAD); |
dofydoink | 42:5a5ad23a4bb1 | 731 | dblBeta = limDouble(dblBeta, (double)-1.0*MAX_THETA_RAD, (double)MAX_THETA_RAD); |
dofydoink | 42:5a5ad23a4bb1 | 732 | dblPhi = atan2(dblBeta,dblAlpha); // update new phi position |
dofydoink | 42:5a5ad23a4bb1 | 733 | if( fabs( cos(dblPhi) ) >= 0.7106781 ){ |
dofydoink | 42:5a5ad23a4bb1 | 734 | dblTheta = dblAlpha / cos(dblPhi);//calculate new theta value |
dofydoink | 42:5a5ad23a4bb1 | 735 | } |
dofydoink | 42:5a5ad23a4bb1 | 736 | else { |
dofydoink | 42:5a5ad23a4bb1 | 737 | dblTheta = dblBeta / sin(dblPhi); |
dofydoink | 42:5a5ad23a4bb1 | 738 | } |
dofydoink | 42:5a5ad23a4bb1 | 739 | dblTheta = limDouble(dblTheta, 0.0, (double)MAX_THETA_RAD ); //limit angle |
dofydoink | 42:5a5ad23a4bb1 | 740 | //update alpha and beta if limit has occured |
dofydoink | 42:5a5ad23a4bb1 | 741 | dblAlpha = dblTheta *cos(dblPhi); |
dofydoink | 42:5a5ad23a4bb1 | 742 | dblBeta = dblTheta *sin(dblPhi); |
dofydoink | 42:5a5ad23a4bb1 | 743 | |
dofydoink | 42:5a5ad23a4bb1 | 744 | double dblPsi[3]; |
dofydoink | 42:5a5ad23a4bb1 | 745 | for (int ii = 0; ii <3; ii++) {//calculate new acuator positions |
dofydoink | 42:5a5ad23a4bb1 | 746 | dblPsi[ii] = dblPhi - ii*2*PI/3; |
dofydoink | 42:5a5ad23a4bb1 | 747 | dblX[ii] = ACT_CONV * K_theta * ( cos(dblPsi[ii]) + d_theta) * dblTheta; |
dofydoink | 42:5a5ad23a4bb1 | 748 | //add offset |
dofydoink | 42:5a5ad23a4bb1 | 749 | dblX[ii] += ACTUATOR_OFFSET; |
dofydoink | 42:5a5ad23a4bb1 | 750 | |
dofydoink | 42:5a5ad23a4bb1 | 751 | //limit positions |
dofydoink | 42:5a5ad23a4bb1 | 752 | dblX[ii] = limDouble( dblX[ii], 0.0, (double)MAX_ACTUATOR_LIMIT_MM ); |
dofydoink | 42:5a5ad23a4bb1 | 753 | } |
dofydoink | 42:5a5ad23a4bb1 | 754 | //calculate new drive segment position |
dofydoink | 42:5a5ad23a4bb1 | 755 | //read drive segment buttons |
dofydoink | 42:5a5ad23a4bb1 | 756 | //double dblDriveStep = 0.4; |
dofydoink | 42:5a5ad23a4bb1 | 757 | |
dofydoink | 42:5a5ad23a4bb1 | 758 | //printf("pin:%d\t", pinFwd.read()); |
dofydoink | 42:5a5ad23a4bb1 | 759 | |
dofydoink | 42:5a5ad23a4bb1 | 760 | if(pinFwd.read()){ |
dofydoink | 42:5a5ad23a4bb1 | 761 | if(!pinRev.read()){ |
dofydoink | 42:5a5ad23a4bb1 | 762 | dblSdot = SAFE_CONTRACT_SPEED; |
dofydoink | 42:5a5ad23a4bb1 | 763 | } else{ |
dofydoink | 42:5a5ad23a4bb1 | 764 | dblSdot = 0.0; |
WD40andTape | 19:e5acb2183d4e | 765 | } |
WD40andTape | 31:08cb04eb75fc | 766 | } else { |
dofydoink | 42:5a5ad23a4bb1 | 767 | if(pinRev.read()){ |
dofydoink | 42:5a5ad23a4bb1 | 768 | dblSdot = -1.0*SAFE_CONTRACT_SPEED; |
dofydoink | 42:5a5ad23a4bb1 | 769 | } else{ |
dofydoink | 42:5a5ad23a4bb1 | 770 | dblSdot = 0.0; |
dofydoink | 42:5a5ad23a4bb1 | 771 | } |
WD40andTape | 19:e5acb2183d4e | 772 | } |
dofydoink | 42:5a5ad23a4bb1 | 773 | |
dofydoink | 42:5a5ad23a4bb1 | 774 | dblS += dblSdot/HHC_READ_FREQ_HZ; |
dofydoink | 42:5a5ad23a4bb1 | 775 | //limit extension (uses word position, but actually refers to pressure) |
dofydoink | 42:5a5ad23a4bb1 | 776 | dblS = limDouble( dblS, 0.0, (double)MAX_EXTENSION_PRESSURE ); |
dofydoink | 42:5a5ad23a4bb1 | 777 | |
dofydoink | 42:5a5ad23a4bb1 | 778 | // printf("S:%f\tSdot:%f\t", dblS, dblSdot); |
dofydoink | 42:5a5ad23a4bb1 | 779 | //Send signals to actuators. |
dofydoink | 42:5a5ad23a4bb1 | 780 | SetFrontDemand(dblX, dblXdot);//front segment |
dofydoink | 42:5a5ad23a4bb1 | 781 | SetDriveDemand(dblS, dblSdot);//drive segment |
dofydoink | 42:5a5ad23a4bb1 | 782 | |
dofydoink | 42:5a5ad23a4bb1 | 783 | |
dofydoink | 11:7029367a1840 | 784 | } |
WD40andTape | 6:f0a18e28a322 | 785 | } |
WD40andTape | 24:bc852aa89e7a | 786 | } |
WD40andTape | 24:bc852aa89e7a | 787 | |
dofydoink | 42:5a5ad23a4bb1 | 788 | void SetUp(){ |
dofydoink | 42:5a5ad23a4bb1 | 789 | for(int ii = 0; ii<N_CHANNELS; ii++){ |
dofydoink | 42:5a5ad23a4bb1 | 790 | pinPosOut[ii].write(0.0); |
dofydoink | 42:5a5ad23a4bb1 | 791 | pinVelOut[ii].write(0.0); |
dofydoink | 42:5a5ad23a4bb1 | 792 | } |
WD40andTape | 3:c83291bf9fd2 | 793 | } |
dofydoink | 0:607bc887b6e0 | 794 | |
WD40andTape | 13:a373dfc57b89 | 795 | int main() { |
dofydoink | 42:5a5ad23a4bb1 | 796 | pinThirdPump = 1; |
dofydoink | 42:5a5ad23a4bb1 | 797 | pinJetOut = 1; |
dofydoink | 42:5a5ad23a4bb1 | 798 | pinWashOut = 1; |
WD40andTape | 7:5b6a2cefbf3b | 799 | pc.baud(BAUD_RATE); |
dofydoink | 42:5a5ad23a4bb1 | 800 | for(int ii = 0; ii<N_CHANNELS; ii++){ |
dofydoink | 42:5a5ad23a4bb1 | 801 | pinPosOut[ii].period_ms(2.0); |
dofydoink | 42:5a5ad23a4bb1 | 802 | pinVelOut[ii].period_ms(2.0); |
dofydoink | 42:5a5ad23a4bb1 | 803 | } |
dofydoink | 42:5a5ad23a4bb1 | 804 | wait(1.0); |
dofydoink | 42:5a5ad23a4bb1 | 805 | printf("ML engage. Compiled at %s\r\n",__TIME__); |
dofydoink | 42:5a5ad23a4bb1 | 806 | |
dofydoink | 42:5a5ad23a4bb1 | 807 | |
dofydoink | 42:5a5ad23a4bb1 | 808 | //set up support function interrupts |
dofydoink | 42:5a5ad23a4bb1 | 809 | //Rising |
WD40andTape | 9:cd3607ba5643 | 810 | |
dofydoink | 42:5a5ad23a4bb1 | 811 | pinZeroIn.mode(PullNone); |
dofydoink | 42:5a5ad23a4bb1 | 812 | pinCycleIn.mode(PullNone); |
dofydoink | 42:5a5ad23a4bb1 | 813 | pinWashIn.mode(PullNone); |
dofydoink | 42:5a5ad23a4bb1 | 814 | pinGasIn.mode(PullNone); |
dofydoink | 42:5a5ad23a4bb1 | 815 | pinSucIn.mode(PullNone); |
dofydoink | 42:5a5ad23a4bb1 | 816 | pinFwd.mode(PullNone); |
dofydoink | 42:5a5ad23a4bb1 | 817 | pinRev.mode(PullNone); |
dofydoink | 42:5a5ad23a4bb1 | 818 | pinFlushIn.mode(PullDown); |
dofydoink | 42:5a5ad23a4bb1 | 819 | pinDebugIn.mode(PullDown); |
dofydoink | 42:5a5ad23a4bb1 | 820 | |
dofydoink | 42:5a5ad23a4bb1 | 821 | pinZeroIn.rise(&ZeroActivate); |
dofydoink | 42:5a5ad23a4bb1 | 822 | pinCycleIn.rise(&CycleActivate); |
dofydoink | 42:5a5ad23a4bb1 | 823 | pinFlushIn.rise(&FlushActivate); |
dofydoink | 42:5a5ad23a4bb1 | 824 | pinSucIn.rise(&SucActivate); |
dofydoink | 42:5a5ad23a4bb1 | 825 | pinGasIn.rise(&GasActivate); |
dofydoink | 42:5a5ad23a4bb1 | 826 | pinDebugIn.rise(&DebugActivate); |
dofydoink | 42:5a5ad23a4bb1 | 827 | //falling |
dofydoink | 42:5a5ad23a4bb1 | 828 | pinZeroIn.fall(&ZeroStop); |
dofydoink | 42:5a5ad23a4bb1 | 829 | pinCycleIn.fall(&CycleStop); |
dofydoink | 42:5a5ad23a4bb1 | 830 | pinFlushIn.fall(&FlushStop); |
dofydoink | 42:5a5ad23a4bb1 | 831 | pinSucIn.fall(&SucStop); |
dofydoink | 42:5a5ad23a4bb1 | 832 | pinGasIn.fall(&GasStop); |
dofydoink | 42:5a5ad23a4bb1 | 833 | pinDebugIn.fall(&DebugStop); |
dofydoink | 42:5a5ad23a4bb1 | 834 | threadReadHHC.start(ReadHHC); |
WD40andTape | 7:5b6a2cefbf3b | 835 | |
dofydoink | 0:607bc887b6e0 | 836 | |
dofydoink | 42:5a5ad23a4bb1 | 837 | tickerReadHHC.attach(&signalReadHHC, 1/(float)HHC_READ_FREQ_HZ); // set up |
dofydoink | 42:5a5ad23a4bb1 | 838 | |
dofydoink | 42:5a5ad23a4bb1 | 839 | |
WD40andTape | 1:2a43cf183a62 | 840 | while(1) { |
WD40andTape | 1:2a43cf183a62 | 841 | Thread::wait(osWaitForever); |
dofydoink | 0:607bc887b6e0 | 842 | } |
WD40andTape | 7:5b6a2cefbf3b | 843 | } |