switch box for pneumatic state machine. Simple version with no grab drop features. Mid state of converting script to function calls within main()

Dependencies:   mbed

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?

UserRevisionLine numberNew 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