switch box for pneumatic state machine. Simple version with no grab drop features. Mid state of converting script to function calls within main()
main.cpp@0:ae0fe1adad01, 2013-06-25 (annotated)
- Committer:
- joliu
- Date:
- Tue Jun 25 01:09:35 2013 +0000
- Revision:
- 0:ae0fe1adad01
- Child:
- 1:2ee833c4b76f
with changes by Joris
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
joliu | 0:ae0fe1adad01 | 1 | #include "mbed.h" |
joliu | 0:ae0fe1adad01 | 2 | Serial pc(USBTX, USBRX); |
joliu | 0:ae0fe1adad01 | 3 | Serial lcd(p28, p27); |
joliu | 0:ae0fe1adad01 | 4 | |
joliu | 0:ae0fe1adad01 | 5 | void clearLCD() |
joliu | 0:ae0fe1adad01 | 6 | { |
joliu | 0:ae0fe1adad01 | 7 | lcd.printf("%c%c",0xFE,0x01); |
joliu | 0:ae0fe1adad01 | 8 | } |
joliu | 0:ae0fe1adad01 | 9 | void setLCDpos(int xpos, int ypos) |
joliu | 0:ae0fe1adad01 | 10 | { |
joliu | 0:ae0fe1adad01 | 11 | int pos = 0x80; |
joliu | 0:ae0fe1adad01 | 12 | switch (xpos) { |
joliu | 0:ae0fe1adad01 | 13 | case 1: |
joliu | 0:ae0fe1adad01 | 14 | pos +=0; |
joliu | 0:ae0fe1adad01 | 15 | break; |
joliu | 0:ae0fe1adad01 | 16 | case 2: |
joliu | 0:ae0fe1adad01 | 17 | pos +=64; |
joliu | 0:ae0fe1adad01 | 18 | break; |
joliu | 0:ae0fe1adad01 | 19 | case 3: |
joliu | 0:ae0fe1adad01 | 20 | pos +=20; |
joliu | 0:ae0fe1adad01 | 21 | break; |
joliu | 0:ae0fe1adad01 | 22 | case 4: |
joliu | 0:ae0fe1adad01 | 23 | pos +=84; |
joliu | 0:ae0fe1adad01 | 24 | break; |
joliu | 0:ae0fe1adad01 | 25 | } |
joliu | 0:ae0fe1adad01 | 26 | pos += (ypos-1); |
joliu | 0:ae0fe1adad01 | 27 | lcd.printf("%c%c",0xFE,pos); |
joliu | 0:ae0fe1adad01 | 28 | } |
joliu | 0:ae0fe1adad01 | 29 | void setBrightness(int lev) |
joliu | 0:ae0fe1adad01 | 30 | { |
joliu | 0:ae0fe1adad01 | 31 | lcd.printf("%c%c",0x7C,lev+127); |
joliu | 0:ae0fe1adad01 | 32 | wait(.1); |
joliu | 0:ae0fe1adad01 | 33 | } |
joliu | 0:ae0fe1adad01 | 34 | |
joliu | 0:ae0fe1adad01 | 35 | |
joliu | 0:ae0fe1adad01 | 36 | |
joliu | 0:ae0fe1adad01 | 37 | // V+/V- outputs cylinder down |
joliu | 0:ae0fe1adad01 | 38 | DigitalOut out1(p7); |
joliu | 0:ae0fe1adad01 | 39 | DigitalOut out2(p8); |
joliu | 0:ae0fe1adad01 | 40 | DigitalOut out3(p9); |
joliu | 0:ae0fe1adad01 | 41 | DigitalOut out4(p10); |
joliu | 0:ae0fe1adad01 | 42 | // V+/V- outputs cylinder up |
joliu | 0:ae0fe1adad01 | 43 | DigitalOut out5(p11); |
joliu | 0:ae0fe1adad01 | 44 | DigitalOut out6(p12); |
joliu | 0:ae0fe1adad01 | 45 | DigitalOut out7(p13); |
joliu | 0:ae0fe1adad01 | 46 | DigitalOut out8(p14); |
joliu | 0:ae0fe1adad01 | 47 | // Four push buttons left to right |
joliu | 0:ae0fe1adad01 | 48 | DigitalIn pushOne(p21); |
joliu | 0:ae0fe1adad01 | 49 | DigitalIn pushTwo(p22); |
joliu | 0:ae0fe1adad01 | 50 | DigitalIn pushThree(p23); |
joliu | 0:ae0fe1adad01 | 51 | DigitalIn pushFour(p24); |
joliu | 0:ae0fe1adad01 | 52 | // Run switch where p26 will be kept high |
joliu | 0:ae0fe1adad01 | 53 | DigitalIn runIn(p25); |
joliu | 0:ae0fe1adad01 | 54 | DigitalOut runOut(p26); |
joliu | 0:ae0fe1adad01 | 55 | |
joliu | 0:ae0fe1adad01 | 56 | typedef char * string; |
joliu | 0:ae0fe1adad01 | 57 | |
joliu | 0:ae0fe1adad01 | 58 | float upTime; |
joliu | 0:ae0fe1adad01 | 59 | float downTime; |
joliu | 0:ae0fe1adad01 | 60 | float waitTime; |
joliu | 0:ae0fe1adad01 | 61 | |
joliu | 0:ae0fe1adad01 | 62 | string strs[5] = { |
joliu | 0:ae0fe1adad01 | 63 | "Up Time", // 0 |
joliu | 0:ae0fe1adad01 | 64 | "Down Time", // 1 |
joliu | 0:ae0fe1adad01 | 65 | "Wait Time", // 2 |
joliu | 0:ae0fe1adad01 | 66 | "Target Count", // 3 |
joliu | 0:ae0fe1adad01 | 67 | "Reset Counter" // 4 |
joliu | 0:ae0fe1adad01 | 68 | }; |
joliu | 0:ae0fe1adad01 | 69 | |
joliu | 0:ae0fe1adad01 | 70 | |
joliu | 0:ae0fe1adad01 | 71 | enum ValveMode |
joliu | 0:ae0fe1adad01 | 72 | { |
joliu | 0:ae0fe1adad01 | 73 | CLOSED, |
joliu | 0:ae0fe1adad01 | 74 | UP, |
joliu | 0:ae0fe1adad01 | 75 | DOWN, |
joliu | 0:ae0fe1adad01 | 76 | BOTH |
joliu | 0:ae0fe1adad01 | 77 | }; |
joliu | 0:ae0fe1adad01 | 78 | |
joliu | 0:ae0fe1adad01 | 79 | unsigned int count = 0; |
joliu | 0:ae0fe1adad01 | 80 | |
joliu | 0:ae0fe1adad01 | 81 | void setValve(ValveMode dir) |
joliu | 0:ae0fe1adad01 | 82 | { |
joliu | 0:ae0fe1adad01 | 83 | switch(dir) |
joliu | 0:ae0fe1adad01 | 84 | { |
joliu | 0:ae0fe1adad01 | 85 | case CLOSED: |
joliu | 0:ae0fe1adad01 | 86 | //p0 = 0; |
joliu | 0:ae0fe1adad01 | 87 | //p1 = 0; |
joliu | 0:ae0fe1adad01 | 88 | //p2 = 0; |
joliu | 0:ae0fe1adad01 | 89 | //p3 = 0; |
joliu | 0:ae0fe1adad01 | 90 | break; |
joliu | 0:ae0fe1adad01 | 91 | case UP: |
joliu | 0:ae0fe1adad01 | 92 | //p0 = 0; |
joliu | 0:ae0fe1adad01 | 93 | //p1 = 0; |
joliu | 0:ae0fe1adad01 | 94 | //p2 = 0; |
joliu | 0:ae0fe1adad01 | 95 | //p3 = 0; |
joliu | 0:ae0fe1adad01 | 96 | break; |
joliu | 0:ae0fe1adad01 | 97 | } |
joliu | 0:ae0fe1adad01 | 98 | } |
joliu | 0:ae0fe1adad01 | 99 | |
joliu | 0:ae0fe1adad01 | 100 | |
joliu | 0:ae0fe1adad01 | 101 | void lcdShowParameters(int delay, int cycles) |
joliu | 0:ae0fe1adad01 | 102 | { |
joliu | 0:ae0fe1adad01 | 103 | clearLCD(); |
joliu | 0:ae0fe1adad01 | 104 | setLCDpos(1,1); |
joliu | 0:ae0fe1adad01 | 105 | lcd.printf(strs[strPos]); |
joliu | 0:ae0fe1adad01 | 106 | setLCDpos(2,1); |
joliu | 0:ae0fe1adad01 | 107 | if (strPos<=2) { |
joliu | 0:ae0fe1adad01 | 108 | lcd.printf("%f",times[strPos]); |
joliu | 0:ae0fe1adad01 | 109 | } else if(strPos==3) { |
joliu | 0:ae0fe1adad01 | 110 | lcd.printf("%d",target); |
joliu | 0:ae0fe1adad01 | 111 | } else if(strPos==4) { |
joliu | 0:ae0fe1adad01 | 112 | lcd.printf("Y/N?"); |
joliu | 0:ae0fe1adad01 | 113 | } |
joliu | 0:ae0fe1adad01 | 114 | } |
joliu | 0:ae0fe1adad01 | 115 | |
joliu | 0:ae0fe1adad01 | 116 | |
joliu | 0:ae0fe1adad01 | 117 | void lcdConfirmStart() |
joliu | 0:ae0fe1adad01 | 118 | { |
joliu | 0:ae0fe1adad01 | 119 | clearLCD(); |
joliu | 0:ae0fe1adad01 | 120 | setLCDpos(1,1); |
joliu | 0:ae0fe1adad01 | 121 | lcd.printf(strs[strPos]); |
joliu | 0:ae0fe1adad01 | 122 | setLCDpos(2,1); |
joliu | 0:ae0fe1adad01 | 123 | if (strPos<=2) { |
joliu | 0:ae0fe1adad01 | 124 | lcd.printf("%f",times[strPos]); |
joliu | 0:ae0fe1adad01 | 125 | } else if(strPos==3) { |
joliu | 0:ae0fe1adad01 | 126 | lcd.printf("%d",target); |
joliu | 0:ae0fe1adad01 | 127 | } else if(strPos==4) { |
joliu | 0:ae0fe1adad01 | 128 | lcd.printf("Y/N?"); |
joliu | 0:ae0fe1adad01 | 129 | } |
joliu | 0:ae0fe1adad01 | 130 | } |
joliu | 0:ae0fe1adad01 | 131 | |
joliu | 0:ae0fe1adad01 | 132 | |
joliu | 0:ae0fe1adad01 | 133 | |
joliu | 0:ae0fe1adad01 | 134 | |
joliu | 0:ae0fe1adad01 | 135 | int main() |
joliu | 0:ae0fe1adad01 | 136 | { |
joliu | 0:ae0fe1adad01 | 137 | unsigned int route1 = 0; |
joliu | 0:ae0fe1adad01 | 138 | //unsigned int route2 = 0; |
joliu | 0:ae0fe1adad01 | 139 | float times[3]; |
joliu | 0:ae0fe1adad01 | 140 | times[0] = 1.0; |
joliu | 0:ae0fe1adad01 | 141 | times[1] = 1.0; |
joliu | 0:ae0fe1adad01 | 142 | times[2] = 0.2; |
joliu | 0:ae0fe1adad01 | 143 | int target = 2000; |
joliu | 0:ae0fe1adad01 | 144 | int strPos = 0; |
joliu | 0:ae0fe1adad01 | 145 | Timer timer1; |
joliu | 0:ae0fe1adad01 | 146 | |
joliu | 0:ae0fe1adad01 | 147 | wait(1); |
joliu | 0:ae0fe1adad01 | 148 | clearLCD(); |
joliu | 0:ae0fe1adad01 | 149 | //setLCDpos(1,1); |
joliu | 0:ae0fe1adad01 | 150 | //lcd.printf("Current count is:"); |
joliu | 0:ae0fe1adad01 | 151 | //setLCDpos(2,1); |
joliu | 0:ae0fe1adad01 | 152 | //lcd.printf("%d",0); |
joliu | 0:ae0fe1adad01 | 153 | runOut = 1; |
joliu | 0:ae0fe1adad01 | 154 | while (1) { |
joliu | 0:ae0fe1adad01 | 155 | if (!runIn) { |
joliu | 0:ae0fe1adad01 | 156 | if (!route1) { |
joliu | 0:ae0fe1adad01 | 157 | clearLCD(); |
joliu | 0:ae0fe1adad01 | 158 | route1 = 1; |
joliu | 0:ae0fe1adad01 | 159 | timer1.start(); |
joliu | 0:ae0fe1adad01 | 160 | } |
joliu | 0:ae0fe1adad01 | 161 | |
joliu | 0:ae0fe1adad01 | 162 | else { |
joliu | 0:ae0fe1adad01 | 163 | if(pushOne && timer1.read_ms()>500) { |
joliu | 0:ae0fe1adad01 | 164 | //Go Left |
joliu | 0:ae0fe1adad01 | 165 | if(strPos<1) { |
joliu | 0:ae0fe1adad01 | 166 | strPos=4; |
joliu | 0:ae0fe1adad01 | 167 | } else { |
joliu | 0:ae0fe1adad01 | 168 | strPos--; |
joliu | 0:ae0fe1adad01 | 169 | } |
joliu | 0:ae0fe1adad01 | 170 | |
joliu | 0:ae0fe1adad01 | 171 | clearLCD(); |
joliu | 0:ae0fe1adad01 | 172 | setLCDpos(1,1); |
joliu | 0:ae0fe1adad01 | 173 | lcd.printf(strs[strPos]); |
joliu | 0:ae0fe1adad01 | 174 | setLCDpos(2,1); |
joliu | 0:ae0fe1adad01 | 175 | if (strPos<=2) { |
joliu | 0:ae0fe1adad01 | 176 | lcd.printf("%f",times[strPos]); |
joliu | 0:ae0fe1adad01 | 177 | } else if(strPos==3) { |
joliu | 0:ae0fe1adad01 | 178 | lcd.printf("%d",target); |
joliu | 0:ae0fe1adad01 | 179 | } else if(strPos==4) { |
joliu | 0:ae0fe1adad01 | 180 | lcd.printf("Y/N?"); |
joliu | 0:ae0fe1adad01 | 181 | } |
joliu | 0:ae0fe1adad01 | 182 | timer1.reset(); |
joliu | 0:ae0fe1adad01 | 183 | } else if(pushTwo && timer1.read_ms()>100) { |
joliu | 0:ae0fe1adad01 | 184 | //Increment |
joliu | 0:ae0fe1adad01 | 185 | clearLCD(); |
joliu | 0:ae0fe1adad01 | 186 | setLCDpos(1,1); |
joliu | 0:ae0fe1adad01 | 187 | lcd.printf(strs[strPos]); |
joliu | 0:ae0fe1adad01 | 188 | setLCDpos(2,1); |
joliu | 0:ae0fe1adad01 | 189 | if(strPos<=2) { |
joliu | 0:ae0fe1adad01 | 190 | times[strPos]=times[strPos]+0.1; |
joliu | 0:ae0fe1adad01 | 191 | lcd.printf("%f",times[strPos]); |
joliu | 0:ae0fe1adad01 | 192 | } else if(strPos==3) { |
joliu | 0:ae0fe1adad01 | 193 | target=target+100; |
joliu | 0:ae0fe1adad01 | 194 | lcd.printf("%d",target); |
joliu | 0:ae0fe1adad01 | 195 | } else if(strPos==4) { |
joliu | 0:ae0fe1adad01 | 196 | setLCDpos(2,1); |
joliu | 0:ae0fe1adad01 | 197 | lcd.printf("YES"); |
joliu | 0:ae0fe1adad01 | 198 | count=0; |
joliu | 0:ae0fe1adad01 | 199 | } |
joliu | 0:ae0fe1adad01 | 200 | timer1.reset(); |
joliu | 0:ae0fe1adad01 | 201 | } else if(pushThree && timer1.read_ms()>100) { |
joliu | 0:ae0fe1adad01 | 202 | //Decrement |
joliu | 0:ae0fe1adad01 | 203 | clearLCD(); |
joliu | 0:ae0fe1adad01 | 204 | setLCDpos(1,1); |
joliu | 0:ae0fe1adad01 | 205 | lcd.printf(strs[strPos]); |
joliu | 0:ae0fe1adad01 | 206 | setLCDpos(2,1); |
joliu | 0:ae0fe1adad01 | 207 | if(strPos<=2) { |
joliu | 0:ae0fe1adad01 | 208 | times[strPos]=times[strPos]- 0.1; |
joliu | 0:ae0fe1adad01 | 209 | lcd.printf("%f",times[strPos]); |
joliu | 0:ae0fe1adad01 | 210 | } else if(strPos==3) { |
joliu | 0:ae0fe1adad01 | 211 | target=target-100; |
joliu | 0:ae0fe1adad01 | 212 | lcd.printf("%d",target); |
joliu | 0:ae0fe1adad01 | 213 | } else if(strPos==4) { |
joliu | 0:ae0fe1adad01 | 214 | lcd.printf("NO"); |
joliu | 0:ae0fe1adad01 | 215 | } |
joliu | 0:ae0fe1adad01 | 216 | timer1.reset(); |
joliu | 0:ae0fe1adad01 | 217 | } else if(pushFour && timer1.read_ms()>150) { |
joliu | 0:ae0fe1adad01 | 218 | if(strPos>3) { |
joliu | 0:ae0fe1adad01 | 219 | strPos=0; |
joliu | 0:ae0fe1adad01 | 220 | } else { |
joliu | 0:ae0fe1adad01 | 221 | strPos++; |
joliu | 0:ae0fe1adad01 | 222 | } |
joliu | 0:ae0fe1adad01 | 223 | |
joliu | 0:ae0fe1adad01 | 224 | clearLCD(); |
joliu | 0:ae0fe1adad01 | 225 | setLCDpos(1,1); |
joliu | 0:ae0fe1adad01 | 226 | lcd.printf(strs[strPos]); |
joliu | 0:ae0fe1adad01 | 227 | setLCDpos(2,1); |
joliu | 0:ae0fe1adad01 | 228 | if (strPos<=2) { |
joliu | 0:ae0fe1adad01 | 229 | lcd.printf("%f",times[strPos]); |
joliu | 0:ae0fe1adad01 | 230 | } else if(strPos==3) { |
joliu | 0:ae0fe1adad01 | 231 | lcd.printf("%d",target); |
joliu | 0:ae0fe1adad01 | 232 | } else if(strPos==4) { |
joliu | 0:ae0fe1adad01 | 233 | lcd.printf("Y/N?"); |
joliu | 0:ae0fe1adad01 | 234 | } |
joliu | 0:ae0fe1adad01 | 235 | timer1.reset(); |
joliu | 0:ae0fe1adad01 | 236 | } |
joliu | 0:ae0fe1adad01 | 237 | } |
joliu | 0:ae0fe1adad01 | 238 | } else if (runIn && count<=target) { |
joliu | 0:ae0fe1adad01 | 239 | route1=0; |
joliu | 0:ae0fe1adad01 | 240 | upTime = times[0]; |
joliu | 0:ae0fe1adad01 | 241 | downTime = times[1]; |
joliu | 0:ae0fe1adad01 | 242 | waitTime = times[2]; |
joliu | 0:ae0fe1adad01 | 243 | count++; |
joliu | 0:ae0fe1adad01 | 244 | out5 = 1; |
joliu | 0:ae0fe1adad01 | 245 | out6 = 1; |
joliu | 0:ae0fe1adad01 | 246 | out7 = 1; |
joliu | 0:ae0fe1adad01 | 247 | out8 = 1; |
joliu | 0:ae0fe1adad01 | 248 | wait(upTime); |
joliu | 0:ae0fe1adad01 | 249 | out5 = 0; |
joliu | 0:ae0fe1adad01 | 250 | out6 = 0; |
joliu | 0:ae0fe1adad01 | 251 | out7 = 0; |
joliu | 0:ae0fe1adad01 | 252 | out8 = 0; |
joliu | 0:ae0fe1adad01 | 253 | wait(waitTime); |
joliu | 0:ae0fe1adad01 | 254 | out1 = 1; |
joliu | 0:ae0fe1adad01 | 255 | out2 = 1; |
joliu | 0:ae0fe1adad01 | 256 | out3 = 1; |
joliu | 0:ae0fe1adad01 | 257 | out4 = 1; |
joliu | 0:ae0fe1adad01 | 258 | wait(downTime); |
joliu | 0:ae0fe1adad01 | 259 | out1 = 0; |
joliu | 0:ae0fe1adad01 | 260 | out2 = 0; |
joliu | 0:ae0fe1adad01 | 261 | out3 = 0; |
joliu | 0:ae0fe1adad01 | 262 | out4 = 0; |
joliu | 0:ae0fe1adad01 | 263 | wait(waitTime); |
joliu | 0:ae0fe1adad01 | 264 | setLCDpos(1,1); |
joliu | 0:ae0fe1adad01 | 265 | lcd.printf("CURRENT COUNT IS"); |
joliu | 0:ae0fe1adad01 | 266 | setLCDpos(2,1); |
joliu | 0:ae0fe1adad01 | 267 | lcd.printf(" "); |
joliu | 0:ae0fe1adad01 | 268 | setLCDpos(2,1); |
joliu | 0:ae0fe1adad01 | 269 | lcd.printf("%d",count); |
joliu | 0:ae0fe1adad01 | 270 | } else if (count>target) { |
joliu | 0:ae0fe1adad01 | 271 | clearLCD(); |
joliu | 0:ae0fe1adad01 | 272 | setLCDpos(1,1); |
joliu | 0:ae0fe1adad01 | 273 | lcd.printf("TARGET REACHED"); |
joliu | 0:ae0fe1adad01 | 274 | setLCDpos(2,1); |
joliu | 0:ae0fe1adad01 | 275 | lcd.printf("%d",target); |
joliu | 0:ae0fe1adad01 | 276 | wait(0.1); |
joliu | 0:ae0fe1adad01 | 277 | } |
joliu | 0:ae0fe1adad01 | 278 | } |
joliu | 0:ae0fe1adad01 | 279 | /* |
joliu | 0:ae0fe1adad01 | 280 | setLCDpos(2,9); |
joliu | 0:ae0fe1adad01 | 281 | lcd.printf("#%7i",i);*/ |
joliu | 0:ae0fe1adad01 | 282 | } |
joliu | 0:ae0fe1adad01 | 283 |