Jasmine Karlsson / Mbed 2 deprecated train_rail

Dependencies:   mbed TextLCD

Committer:
jasminealice
Date:
Thu Jun 21 13:42:31 2018 +0000
Revision:
28:1430685f4d12
Parent:
27:9f9cd0df9a79
Child:
29:6031227dcac9
Stop working

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jasminealice 0:57cbecaac770 1 #include "mbed.h"
Kwame 2:9bb410612929 2 #include "TextLCD.h"
jasminealice 18:f5824ba95892 3 #include "MCP23017.h"
jasminealice 18:f5824ba95892 4 #include "Train.h"
jasminealice 20:32ba0a5f2d02 5 #include "Switch.h"
jasminealice 20:32ba0a5f2d02 6 #include "Track.h"
jasminealice 21:31647d80614f 7 #include "Detector.h"
KwamsC 24:418711ed8c52 8 #include <cstdlib>
KwamsC 10:cda57976225f 9
jasminealice 16:55c3c5727f14 10 //Board 1
jasminealice 16:55c3c5727f14 11 /*----------------------------------------------------------------------------
jasminealice 16:55c3c5727f14 12 Pin definitions
jasminealice 16:55c3c5727f14 13 *----------------------------------------------------------------------------*/
jasminealice 17:b7b5f40cebff 14 DigitalOut Track(p20); // train track
jasminealice 17:b7b5f40cebff 15
jasminealice 23:bb57966cb776 16 DigitalOut myled1(LED1), myled2(LED2), myled3(LED3), myled4(LED4);
jasminealice 23:bb57966cb776 17 DigitalOut externalLed1(p15), externalLed2(p16), externalLed3(p17), externalLed4(p18);
KwamsC 14:a5fd98a957e6 18 TextLCD lcd(p22, p21, p23, p24, p25, p26); // lcd
KwamsC 14:a5fd98a957e6 19
jasminealice 23:bb57966cb776 20 DigitalIn sw1(p29), sw2(p30), sw3(p11), sw4(p12);
jasminealice 21:31647d80614f 21
jasminealice 23:bb57966cb776 22 InterruptIn int0(p13), int1(p14);
jasminealice 22:c024b20a0e2d 23 I2C i2c(p28, p27);
jasminealice 18:f5824ba95892 24 MCP23017 *mcp;
jasminealice 17:b7b5f40cebff 25
jasminealice 25:90f7a34c253a 26 //DigitalOut en(p6);
jasminealice 25:90f7a34c253a 27
jasminealice 17:b7b5f40cebff 28 /*----------------------------------------------------------------------------
jasminealice 17:b7b5f40cebff 29 Addresses
jasminealice 17:b7b5f40cebff 30 *----------------------------------------------------------------------------*/
jasminealice 21:31647d80614f 31 const unsigned int DCCaddress_silver = 0x01;
jasminealice 21:31647d80614f 32 const unsigned int DCCaddress_red = 0x03;
jasminealice 17:b7b5f40cebff 33 const unsigned int DCCaddress_switch = 0x06;
KwamsC 14:a5fd98a957e6 34
KwamsC 14:a5fd98a957e6 35 /*----------------------------------------------------------------------------
KwamsC 14:a5fd98a957e6 36 Train movement
KwamsC 14:a5fd98a957e6 37 *----------------------------------------------------------------------------*/
KwamsC 14:a5fd98a957e6 38 //move backwards/reverse
KwamsC 14:a5fd98a957e6 39
jasminealice 15:8d96f7a06103 40 //speed dial forward
jasminealice 28:1430685f4d12 41 const unsigned int slow_speed = 0x74; //step 4
jasminealice 18:f5824ba95892 42 //const unsigned int DCCinst_step6 = 0x68; //step 6 1/4 speed
KwamsC 26:f5e71308a13e 43 const unsigned int normal_speed = 0x78; //step 13 1/2 speed
KwamsC 26:f5e71308a13e 44
KwamsC 27:9f9cd0df9a79 45 const unsigned int high_speed = 0x7A; //high speed
KwamsC 27:9f9cd0df9a79 46
jasminealice 17:b7b5f40cebff 47 const unsigned int DCCinst_switch1 = 0x81; //Activate switch1
jasminealice 17:b7b5f40cebff 48 const unsigned int DCCinst_switch2 = 0x82; //Activate switch2
jasminealice 17:b7b5f40cebff 49 const unsigned int DCCinst_switch3 = 0x84; //Activate switch3
jasminealice 17:b7b5f40cebff 50 const unsigned int DCCinst_switch4 = 0x88; //Activate switch4
KwamsC 14:a5fd98a957e6 51 //stop
KwamsC 26:f5e71308a13e 52 const unsigned int stop = 0x40; //forward and stop 01100000
KwamsC 10:cda57976225f 53
jasminealice 25:90f7a34c253a 54 static const int cRight[] = {6,7,8};
jasminealice 25:90f7a34c253a 55 vector<int> C_right (cRight, cRight + sizeof(cRight) / sizeof(cRight[0]) );
jasminealice 25:90f7a34c253a 56
jasminealice 25:90f7a34c253a 57 static const int cLeft[] = {0,1,2,12,13};
jasminealice 25:90f7a34c253a 58 vector<int> C_left (cLeft, cLeft + sizeof(cLeft) / sizeof(cLeft[0]) );
jasminealice 25:90f7a34c253a 59
KwamsC 26:f5e71308a13e 60 static const int junction39[] = {3,9};
KwamsC 26:f5e71308a13e 61 vector<int> junction_39 (junction39, junction39 + sizeof(junction39) / sizeof(junction39[0]) );
KwamsC 26:f5e71308a13e 62
KwamsC 26:f5e71308a13e 63 static const int junction511[] = {5,11};
KwamsC 26:f5e71308a13e 64 vector<int> junction_511 (junction511, junction511 + sizeof(junction511) / sizeof(junction511[0]) );
KwamsC 26:f5e71308a13e 65
jasminealice 28:1430685f4d12 66 int redStartVal = 10;
KwamsC 26:f5e71308a13e 67 int silverStartVal = 2;
KwamsC 26:f5e71308a13e 68
jasminealice 17:b7b5f40cebff 69 /*----------------------------------------------------------------------------
jasminealice 17:b7b5f40cebff 70 Function definitions
jasminealice 17:b7b5f40cebff 71 *----------------------------------------------------------------------------*/
jasminealice 17:b7b5f40cebff 72 bool readSwitch(DigitalIn theSwitch);
jasminealice 23:bb57966cb776 73 int convertHextoDec(int pos, int intnr);
KwamsC 24:418711ed8c52 74 void checkDetector(int inter);
jasminealice 22:c024b20a0e2d 75 void init_mcp();
jasminealice 23:bb57966cb776 76 void init_interrupt();
KwamsC 24:418711ed8c52 77 void init_trains();
KwamsC 27:9f9cd0df9a79 78 void executeCase(int pos, Train* currTrain);
jasminealice 23:bb57966cb776 79 Train& assignTrain(int pos);
KwamsC 10:cda57976225f 80
jasminealice 21:31647d80614f 81 //Trains
jasminealice 28:1430685f4d12 82 Train redTrain(DCCaddress_red, normal_speed, redStartVal, high_speed, normal_speed);
jasminealice 28:1430685f4d12 83 Train silverTrain(DCCaddress_silver,normal_speed, silverStartVal, normal_speed, slow_speed);
jasminealice 21:31647d80614f 84 //Switches
jasminealice 21:31647d80614f 85 Switch switch1(DCCaddress_switch,DCCinst_switch1);
KwamsC 24:418711ed8c52 86 Switch switch2(DCCaddress_switch,DCCinst_switch2);
jasminealice 21:31647d80614f 87 Switch switch3(DCCaddress_switch,DCCinst_switch3);
jasminealice 21:31647d80614f 88 Switch switch4(DCCaddress_switch,DCCinst_switch4);
jasminealice 21:31647d80614f 89 //Detectors
jasminealice 23:bb57966cb776 90 Detector dect(false);
jasminealice 21:31647d80614f 91
jasminealice 16:55c3c5727f14 92 /*----------------------------------------------------------------------------
jasminealice 16:55c3c5727f14 93 Main
jasminealice 16:55c3c5727f14 94 *----------------------------------------------------------------------------*/
jasminealice 16:55c3c5727f14 95 int main() {
jasminealice 22:c024b20a0e2d 96 lcd.printf("Start journey");
jasminealice 22:c024b20a0e2d 97 init_mcp();
jasminealice 23:bb57966cb776 98 init_interrupt();
KwamsC 24:418711ed8c52 99 init_trains();
jasminealice 21:31647d80614f 100 while(1){
jasminealice 23:bb57966cb776 101 redTrain.sendCommand();
jasminealice 23:bb57966cb776 102 silverTrain.sendCommand();
jasminealice 22:c024b20a0e2d 103
jasminealice 21:31647d80614f 104 if(!readSwitch(sw3)){ //Change speed
jasminealice 28:1430685f4d12 105 lcd.cls();
jasminealice 23:bb57966cb776 106 lcd.printf("Go forward");
jasminealice 28:1430685f4d12 107 redTrain.changeSpeed(high_speed);
KwamsC 26:f5e71308a13e 108 silverTrain.changeSpeed(normal_speed);
jasminealice 22:c024b20a0e2d 109 }
jasminealice 23:bb57966cb776 110
KwamsC 24:418711ed8c52 111 if(redTrain.checkStop()){ //check if Train stopped
jasminealice 28:1430685f4d12 112 lcd.cls();
jasminealice 28:1430685f4d12 113 lcd.printf("%d", redTrain.getPosition());
KwamsC 27:9f9cd0df9a79 114 executeCase(redTrain.getPosition(), &redTrain);
KwamsC 24:418711ed8c52 115 }
KwamsC 24:418711ed8c52 116 else if(silverTrain.checkStop()){
KwamsC 27:9f9cd0df9a79 117 executeCase(silverTrain.getPosition(), &silverTrain);
jasminealice 25:90f7a34c253a 118 }
jasminealice 25:90f7a34c253a 119
jasminealice 25:90f7a34c253a 120 if(redTrain.checkStop() && silverTrain.checkStop()) {
jasminealice 28:1430685f4d12 121 lcd.cls();
jasminealice 28:1430685f4d12 122 lcd.printf("Stop loop...");
jasminealice 25:90f7a34c253a 123 break;
jasminealice 25:90f7a34c253a 124 }
jasminealice 22:c024b20a0e2d 125 }
jasminealice 25:90f7a34c253a 126
jasminealice 25:90f7a34c253a 127 lcd.printf("Shutting down...");
jasminealice 25:90f7a34c253a 128 // en = 0; TO Do : emergency shutdown!!
jasminealice 25:90f7a34c253a 129 //wait(3);
jasminealice 25:90f7a34c253a 130 return 0;
jasminealice 16:55c3c5727f14 131 }
KwamsC 10:cda57976225f 132
KwamsC 14:a5fd98a957e6 133 /*----------------------------------------------------------------------------
KwamsC 14:a5fd98a957e6 134 Functions
KwamsC 14:a5fd98a957e6 135 *----------------------------------------------------------------------------*/
jasminealice 23:bb57966cb776 136 int convertHextoDec(int pos, int intnr){
jasminealice 23:bb57966cb776 137 int newPos;
jasminealice 23:bb57966cb776 138 switch(pos){
jasminealice 23:bb57966cb776 139 case 0xfe:
jasminealice 23:bb57966cb776 140 newPos = 0;
jasminealice 23:bb57966cb776 141 break;
jasminealice 23:bb57966cb776 142 case 0xfd:
jasminealice 23:bb57966cb776 143 newPos = 1;
jasminealice 23:bb57966cb776 144 break;
jasminealice 23:bb57966cb776 145 case 0xfb:
jasminealice 23:bb57966cb776 146 newPos = 2;
jasminealice 23:bb57966cb776 147 break;
jasminealice 23:bb57966cb776 148 case 0xf7:
jasminealice 23:bb57966cb776 149 newPos = 3;
jasminealice 23:bb57966cb776 150 break;
jasminealice 23:bb57966cb776 151 case 0xef:
jasminealice 23:bb57966cb776 152 newPos = 4;
jasminealice 23:bb57966cb776 153 break;
jasminealice 23:bb57966cb776 154 case 0xdf:
jasminealice 23:bb57966cb776 155 newPos = 5;
jasminealice 23:bb57966cb776 156 break;
jasminealice 23:bb57966cb776 157 case 0xbf:
jasminealice 23:bb57966cb776 158 newPos = 6;
jasminealice 23:bb57966cb776 159 break;
jasminealice 23:bb57966cb776 160 case 0x7f:
jasminealice 23:bb57966cb776 161 newPos = 7;
jasminealice 23:bb57966cb776 162 break;
jasminealice 23:bb57966cb776 163 default:
jasminealice 23:bb57966cb776 164 return -1;
jasminealice 23:bb57966cb776 165 }
jasminealice 23:bb57966cb776 166
jasminealice 23:bb57966cb776 167 if(intnr == 1)
jasminealice 23:bb57966cb776 168 newPos += 8;
jasminealice 23:bb57966cb776 169 return newPos;
jasminealice 23:bb57966cb776 170 }
jasminealice 21:31647d80614f 171
jasminealice 23:bb57966cb776 172 Train& assignTrain(int pos){
jasminealice 23:bb57966cb776 173
jasminealice 21:31647d80614f 174 //Check which train got the interupt
KwamsC 27:9f9cd0df9a79 175 if(redTrain.checkInterupt(pos) && !redTrain.checkStop()){
jasminealice 21:31647d80614f 176 redTrain.setPosition(pos);
jasminealice 23:bb57966cb776 177 return redTrain;
jasminealice 21:31647d80614f 178 }
KwamsC 27:9f9cd0df9a79 179 else if(silverTrain.checkInterupt(pos) && !silverTrain.checkStop()){
jasminealice 21:31647d80614f 180 silverTrain.setPosition(pos);
jasminealice 23:bb57966cb776 181 return silverTrain;
jasminealice 28:1430685f4d12 182 }else if(redTrain.checkInterupt(pos) && redTrain.checkStop()){
jasminealice 28:1430685f4d12 183 return redTrain;
jasminealice 28:1430685f4d12 184 }else if(silverTrain.checkInterupt(pos) && silverTrain.checkStop()){
jasminealice 28:1430685f4d12 185 return silverTrain;
jasminealice 28:1430685f4d12 186 }
jasminealice 28:1430685f4d12 187 else{
jasminealice 25:90f7a34c253a 188 lcd.cls();
jasminealice 25:90f7a34c253a 189 lcd.printf("NO TRAIN ASSIGNED");
jasminealice 28:1430685f4d12 190 lcd.printf("%d", pos);
jasminealice 25:90f7a34c253a 191 silverTrain.Stop();
jasminealice 25:90f7a34c253a 192 redTrain.Stop();
jasminealice 25:90f7a34c253a 193 switch2.switchOff();
jasminealice 25:90f7a34c253a 194
jasminealice 21:31647d80614f 195 }
jasminealice 23:bb57966cb776 196 }
jasminealice 23:bb57966cb776 197
KwamsC 27:9f9cd0df9a79 198 void executeCase(int pos, Train* currTrain){
jasminealice 28:1430685f4d12 199 lcd.cls();
KwamsC 24:418711ed8c52 200 switch(pos){
jasminealice 25:90f7a34c253a 201 case 0:{
KwamsC 24:418711ed8c52 202 lcd.printf("at 0");
KwamsC 27:9f9cd0df9a79 203 currTrain->changeSpeed(currTrain->normalSpeed());
jasminealice 25:90f7a34c253a 204 break;}
jasminealice 25:90f7a34c253a 205 case 1:{
KwamsC 24:418711ed8c52 206 lcd.printf("at 1");
jasminealice 25:90f7a34c253a 207 //TO DO: Check which train is going and only slow down if it started from 2
jasminealice 25:90f7a34c253a 208 /*if(!currTrain->isClockwise()){
KwamsC 26:f5e71308a13e 209 currTrain->changeSpeed(slow_speed);//Slow down
jasminealice 25:90f7a34c253a 210 lcd.printf("slow down");
jasminealice 25:90f7a34c253a 211 }*/
jasminealice 25:90f7a34c253a 212 //else
KwamsC 27:9f9cd0df9a79 213 currTrain->changeSpeed(currTrain->normalSpeed());
jasminealice 25:90f7a34c253a 214
jasminealice 25:90f7a34c253a 215 break;}
jasminealice 25:90f7a34c253a 216 case 2:{
KwamsC 24:418711ed8c52 217 /*
jasminealice 25:90f7a34c253a 218 Stop everytime at 2
KwamsC 24:418711ed8c52 219 */
jasminealice 25:90f7a34c253a 220 lcd.printf("at 2");
jasminealice 28:1430685f4d12 221 /*if(!dect.checkReservation(10) && !dect.checkReservation(11)){
jasminealice 28:1430685f4d12 222
jasminealice 28:1430685f4d12 223 currTrain->Stop();
jasminealice 28:1430685f4d12 224 lcd.printf("Stopping at 2");
jasminealice 28:1430685f4d12 225 }
jasminealice 28:1430685f4d12 226 else{ */
jasminealice 28:1430685f4d12 227
jasminealice 28:1430685f4d12 228 if(!dect.checkReservation(4) && !dect.checkReservation(3)){ //Check if 4 or 3 is reserved
jasminealice 28:1430685f4d12 229 lcd.cls();
jasminealice 28:1430685f4d12 230 lcd.printf("none is reserved");
jasminealice 28:1430685f4d12 231 int v1 = rand() % 100; //IF NOT randomize which way to go
jasminealice 28:1430685f4d12 232 if (v1 < 50){ //0.25 chance to enable the switch2, reserve 3,9
jasminealice 28:1430685f4d12 233 switch2.switchOn();
jasminealice 28:1430685f4d12 234 dect.makeReservation(junction_39);
jasminealice 28:1430685f4d12 235 }
jasminealice 28:1430685f4d12 236 else { //0.75 chance to disable switch2, reserve 4
jasminealice 28:1430685f4d12 237 switch2.switchOff();
jasminealice 28:1430685f4d12 238 vector<int> detectors(4);
jasminealice 28:1430685f4d12 239 dect.makeReservation(detectors);
jasminealice 28:1430685f4d12 240 }
jasminealice 28:1430685f4d12 241 }else if(dect.checkReservation(4)){ //IF 4 is reserved
jasminealice 28:1430685f4d12 242 switch2.switchOn(); //Enable switch2, reserve 3,9
jasminealice 28:1430685f4d12 243 lcd.cls();
jasminealice 28:1430685f4d12 244 lcd.printf("4 is reserved");
KwamsC 26:f5e71308a13e 245 dect.makeReservation(junction_39);
jasminealice 28:1430685f4d12 246
jasminealice 28:1430685f4d12 247 }else{ //IF 3 reserved
jasminealice 28:1430685f4d12 248 lcd.cls();
jasminealice 28:1430685f4d12 249 lcd.printf("3 is reserved");
jasminealice 28:1430685f4d12 250 switch2.switchOff(); //Disable switch2, reserve 4
jasminealice 28:1430685f4d12 251 vector<int> detectors(4);
jasminealice 28:1430685f4d12 252 dect.makeReservation(detectors);
jasminealice 28:1430685f4d12 253 }
jasminealice 28:1430685f4d12 254 currTrain->changeSpeed(currTrain->normalSpeed()); //Go forward
jasminealice 28:1430685f4d12 255 //}
jasminealice 25:90f7a34c253a 256 break;}
jasminealice 25:90f7a34c253a 257 case 3:{
KwamsC 24:418711ed8c52 258 lcd.printf("at 3");
jasminealice 25:90f7a34c253a 259
jasminealice 25:90f7a34c253a 260 currTrain->changeDirection(); //change direction
jasminealice 25:90f7a34c253a 261 switch2.switchOff(); //Disable switch2
jasminealice 28:1430685f4d12 262 dect.clearReservation(C_left); //free nr 0,1,2,12,13
jasminealice 28:1430685f4d12 263 if(!dect.checkReservation(5)){
jasminealice 28:1430685f4d12 264 currTrain->changeSpeed(currTrain->normalSpeed()); //go forward
jasminealice 28:1430685f4d12 265 }
jasminealice 28:1430685f4d12 266 else{
jasminealice 28:1430685f4d12 267 currTrain->Stop();
jasminealice 28:1430685f4d12 268 lcd.printf("5 is reserved");
jasminealice 28:1430685f4d12 269 }
jasminealice 25:90f7a34c253a 270 break;}
jasminealice 25:90f7a34c253a 271 case 4:{
jasminealice 25:90f7a34c253a 272 lcd.printf("At 4");
jasminealice 25:90f7a34c253a 273 dect.clearReservation(C_left); //free nr 0,1,2,12,13
jasminealice 25:90f7a34c253a 274 switch3.switchOn(); //Turn on switch3
jasminealice 28:1430685f4d12 275 dect.showReservation();
jasminealice 25:90f7a34c253a 276 if(dect.checkReservation(6)){ //Check if 6 is reserved
jasminealice 25:90f7a34c253a 277 lcd.printf("6 is reserved");
jasminealice 25:90f7a34c253a 278 currTrain->Stop(); //IF yes STOP
KwamsC 24:418711ed8c52 279 }
jasminealice 25:90f7a34c253a 280 else{
jasminealice 25:90f7a34c253a 281 dect.makeReservation(C_right); //else reserve 6,7,8 and go forward
KwamsC 27:9f9cd0df9a79 282 currTrain->changeSpeed(currTrain->normalSpeed());
KwamsC 24:418711ed8c52 283 }
KwamsC 24:418711ed8c52 284
jasminealice 25:90f7a34c253a 285 break; }
jasminealice 25:90f7a34c253a 286 case 5:{
KwamsC 24:418711ed8c52 287 lcd.printf("at 5");
KwamsC 24:418711ed8c52 288
jasminealice 25:90f7a34c253a 289 currTrain->changeDirection(); //change direction
jasminealice 25:90f7a34c253a 290 switch3.switchOn(); //Enable switch3
jasminealice 25:90f7a34c253a 291 dect.clearReservation(C_right); //free nr 6,7,8
jasminealice 28:1430685f4d12 292
jasminealice 28:1430685f4d12 293 if(!dect.checkReservation(3)){
jasminealice 28:1430685f4d12 294 lcd.printf("3 is reserved");
jasminealice 28:1430685f4d12 295 currTrain->changeSpeed(currTrain->normalSpeed()); //go forward
jasminealice 28:1430685f4d12 296 }
jasminealice 28:1430685f4d12 297 else{
jasminealice 28:1430685f4d12 298 currTrain->Stop();
jasminealice 28:1430685f4d12 299 }
jasminealice 25:90f7a34c253a 300
jasminealice 25:90f7a34c253a 301 break;}
jasminealice 25:90f7a34c253a 302 case 6:{
KwamsC 24:418711ed8c52 303 lcd.printf("At 6");
KwamsC 24:418711ed8c52 304 if(!currTrain->isClockwise()) //IF CC goes towards 7
KwamsC 24:418711ed8c52 305 {
KwamsC 24:418711ed8c52 306 switch3.switchOn(); //Enable switch3
KwamsC 24:418711ed8c52 307 int arr [3] = {4,5,11};
KwamsC 24:418711ed8c52 308 vector<int> detectors(arr, arr + sizeof(arr) / sizeof(int));
KwamsC 24:418711ed8c52 309 dect.clearReservation(detectors); //free nr 4,5,11
KwamsC 27:9f9cd0df9a79 310 currTrain->changeSpeed(currTrain->normalSpeed()); //Move forward
KwamsC 24:418711ed8c52 311 }
KwamsC 24:418711ed8c52 312 else{
jasminealice 25:90f7a34c253a 313 if(dect.checkReservation(5)){ //IF 5 is reserved
jasminealice 25:90f7a34c253a 314 currTrain->Stop();
jasminealice 28:1430685f4d12 315 lcd.printf("5 is reserved");
jasminealice 25:90f7a34c253a 316
jasminealice 25:90f7a34c253a 317 }else{ //else 5 reserved
jasminealice 25:90f7a34c253a 318 switch3.switchOff(); //Enable switch3, reserve 4
KwamsC 26:f5e71308a13e 319 dect.makeReservation(junction_511);
KwamsC 27:9f9cd0df9a79 320 currTrain->changeSpeed(currTrain->normalSpeed());
KwamsC 24:418711ed8c52 321 }
KwamsC 27:9f9cd0df9a79 322 currTrain->changeSpeed(currTrain->normalSpeed()); //Go forward
KwamsC 24:418711ed8c52 323 }
jasminealice 25:90f7a34c253a 324 break;}
jasminealice 25:90f7a34c253a 325 case 7:{
jasminealice 25:90f7a34c253a 326 lcd.printf("At 7");
KwamsC 27:9f9cd0df9a79 327 currTrain->changeSpeed(currTrain->normalSpeed());
jasminealice 25:90f7a34c253a 328 break;}
jasminealice 25:90f7a34c253a 329 case 8:{
jasminealice 25:90f7a34c253a 330 lcd.printf("At 8");
KwamsC 24:418711ed8c52 331 if(currTrain->isClockwise()) //IF C goes towards 7
KwamsC 24:418711ed8c52 332 {
KwamsC 24:418711ed8c52 333 switch4.switchOff(); //Disable switch4
KwamsC 26:f5e71308a13e 334 dect.clearReservation(junction_39); //Free 3,9,10
KwamsC 27:9f9cd0df9a79 335 currTrain->changeSpeed(currTrain->normalSpeed()); //Move forward
KwamsC 24:418711ed8c52 336 }
jasminealice 28:1430685f4d12 337 else{ //IF CC if 10 is reserved stop
jasminealice 28:1430685f4d12 338 if(dect.checkReservation(10)){
jasminealice 28:1430685f4d12 339 lcd.printf("10 is reserved");
jasminealice 28:1430685f4d12 340 currTrain->Stop();
jasminealice 28:1430685f4d12 341 }else{
jasminealice 28:1430685f4d12 342 switch4.switchOff(); //Disable switch4, reserve 10
jasminealice 28:1430685f4d12 343 vector<int> detectors(10);
jasminealice 28:1430685f4d12 344 dect.makeReservation(detectors);
jasminealice 28:1430685f4d12 345 currTrain->changeSpeed(currTrain->slowlySpeed()); //Go forward
jasminealice 28:1430685f4d12 346 }
KwamsC 24:418711ed8c52 347 }
jasminealice 25:90f7a34c253a 348 break;}
jasminealice 25:90f7a34c253a 349 case 9:{
jasminealice 25:90f7a34c253a 350 lcd.printf("at 9");
jasminealice 25:90f7a34c253a 351 if(!dect.checkReservation(8)){
jasminealice 25:90f7a34c253a 352 switch4.switchOn(); //Enable switch4
jasminealice 25:90f7a34c253a 353 dect.makeReservation(C_right); //Reserve 6,7,8
KwamsC 27:9f9cd0df9a79 354 currTrain->changeSpeed(currTrain->normalSpeed()); //Go forward
KwamsC 24:418711ed8c52 355
KwamsC 24:418711ed8c52 356 }
jasminealice 25:90f7a34c253a 357 else{
jasminealice 28:1430685f4d12 358 lcd.printf("8 is reserved");
jasminealice 25:90f7a34c253a 359 currTrain->Stop();
jasminealice 25:90f7a34c253a 360 }
jasminealice 25:90f7a34c253a 361 break;}
jasminealice 25:90f7a34c253a 362 case 10:{
jasminealice 25:90f7a34c253a 363 lcd.printf("At 10");
jasminealice 25:90f7a34c253a 364
jasminealice 25:90f7a34c253a 365 dect.clearReservation(C_right); //free nr 6, 7, 8, 9
jasminealice 25:90f7a34c253a 366 if(dect.checkReservation(12)){ //Check if 12 is reserved
jasminealice 28:1430685f4d12 367 lcd.printf("12 is reserved");
jasminealice 25:90f7a34c253a 368 currTrain->Stop(); //IF yes STOP
KwamsC 24:418711ed8c52 369 }
jasminealice 28:1430685f4d12 370 else{
jasminealice 28:1430685f4d12 371 switch1.switchOff(); //Turn off switch1
jasminealice 25:90f7a34c253a 372 dect.makeReservation(C_left);
KwamsC 27:9f9cd0df9a79 373 currTrain->changeSpeed(currTrain->normalSpeed()); //go forward
jasminealice 25:90f7a34c253a 374 }
jasminealice 25:90f7a34c253a 375 break;}
jasminealice 25:90f7a34c253a 376
jasminealice 25:90f7a34c253a 377 case 11:{
jasminealice 25:90f7a34c253a 378 lcd.printf("at 11");
jasminealice 25:90f7a34c253a 379
jasminealice 25:90f7a34c253a 380 if(!dect.checkReservation(12)){
jasminealice 25:90f7a34c253a 381
jasminealice 25:90f7a34c253a 382 switch1.switchOn(); //Enable switch1
jasminealice 25:90f7a34c253a 383 dect.makeReservation(C_left); //Reserve 0,1,2, 12, 13
KwamsC 27:9f9cd0df9a79 384 currTrain->changeSpeed(currTrain->normalSpeed()); //go forward
jasminealice 25:90f7a34c253a 385 }
jasminealice 25:90f7a34c253a 386 else{
jasminealice 28:1430685f4d12 387 currTrain->Stop();
jasminealice 28:1430685f4d12 388 lcd.printf("12 is reserved");
jasminealice 25:90f7a34c253a 389 }
jasminealice 25:90f7a34c253a 390
KwamsC 24:418711ed8c52 391 break;
KwamsC 24:418711ed8c52 392 case 12:
KwamsC 27:9f9cd0df9a79 393 lcd.printf("at 12");
jasminealice 25:90f7a34c253a 394 switch1.switchOff(); //Turn of switch1
jasminealice 25:90f7a34c253a 395 int arr2 [3] = {5,10,11};
jasminealice 25:90f7a34c253a 396 vector<int> detectors2(arr2, arr2 + sizeof(arr2) / sizeof(int));
jasminealice 25:90f7a34c253a 397 dect.clearReservation(detectors2); //free nr 5, 10, 11
KwamsC 27:9f9cd0df9a79 398 currTrain->changeSpeed(currTrain->normalSpeed()); //Move forward
jasminealice 25:90f7a34c253a 399
jasminealice 25:90f7a34c253a 400 break;}
jasminealice 25:90f7a34c253a 401 case 13: {
KwamsC 24:418711ed8c52 402 lcd.printf("at 13");
KwamsC 27:9f9cd0df9a79 403 currTrain->changeSpeed(currTrain->normalSpeed());
jasminealice 25:90f7a34c253a 404 break;}
jasminealice 25:90f7a34c253a 405 case 14:{
jasminealice 25:90f7a34c253a 406 lcd.printf("at 21");
jasminealice 28:1430685f4d12 407 currTrain->changeSpeed(currTrain->slowlySpeed());
jasminealice 25:90f7a34c253a 408 break;}
jasminealice 25:90f7a34c253a 409 case 15:{
jasminealice 25:90f7a34c253a 410 lcd.printf("at 22");
KwamsC 27:9f9cd0df9a79 411 currTrain->changeSpeed(currTrain->normalSpeed());
jasminealice 25:90f7a34c253a 412 break;}
jasminealice 25:90f7a34c253a 413 default: {
KwamsC 24:418711ed8c52 414 lcd.printf("Not in a valid case");
KwamsC 26:f5e71308a13e 415 currTrain->Stop();
jasminealice 25:90f7a34c253a 416 break; }
KwamsC 24:418711ed8c52 417 }
KwamsC 24:418711ed8c52 418
KwamsC 24:418711ed8c52 419 mcp->_read(GPIOA);
KwamsC 24:418711ed8c52 420 mcp->_read(GPIOB);
KwamsC 24:418711ed8c52 421 }
KwamsC 24:418711ed8c52 422
KwamsC 24:418711ed8c52 423 void checkDetector(int inter){
jasminealice 23:bb57966cb776 424 lcd.cls();
jasminealice 23:bb57966cb776 425 int pos;
jasminealice 23:bb57966cb776 426 wait_us(100);
jasminealice 23:bb57966cb776 427 if (inter == 0){
jasminealice 23:bb57966cb776 428 //Read from first one
jasminealice 23:bb57966cb776 429 pos = mcp->_read(INTCAPA);
jasminealice 23:bb57966cb776 430 pos = convertHextoDec(pos, 0);
jasminealice 21:31647d80614f 431 }
jasminealice 23:bb57966cb776 432 else if (inter == 1){
jasminealice 23:bb57966cb776 433 //Read from second one
jasminealice 23:bb57966cb776 434 pos = mcp->_read(INTCAPB);
jasminealice 23:bb57966cb776 435 pos = convertHextoDec(pos, 1);
jasminealice 23:bb57966cb776 436 }
jasminealice 23:bb57966cb776 437 else
jasminealice 23:bb57966cb776 438 //PROBLEM
jasminealice 23:bb57966cb776 439 lcd.printf("Fail to detect int");
jasminealice 28:1430685f4d12 440 if(pos!=7){
jasminealice 28:1430685f4d12 441 Train* currTrain = &assignTrain(pos);
jasminealice 28:1430685f4d12 442 executeCase(pos, currTrain);
jasminealice 28:1430685f4d12 443 }
jasminealice 15:8d96f7a06103 444 }
jasminealice 15:8d96f7a06103 445
jasminealice 17:b7b5f40cebff 446 bool readSwitch(DigitalIn theSwitch){
jasminealice 17:b7b5f40cebff 447 int val = theSwitch.read();
jasminealice 22:c024b20a0e2d 448 //lcd.printf("%d", val);
jasminealice 16:55c3c5727f14 449 if(val == 1)
jasminealice 16:55c3c5727f14 450 return true;
jasminealice 16:55c3c5727f14 451 else
jasminealice 16:55c3c5727f14 452 return false;
tanjinamicky 13:78a2481fd65b 453 }
tanjinamicky 13:78a2481fd65b 454
jasminealice 22:c024b20a0e2d 455 void init_mcp() {
jasminealice 22:c024b20a0e2d 456 // Initialisation of MCP registers,documentation on registers is availableatNiels/Jacco/Natalia
jasminealice 22:c024b20a0e2d 457 mcp = new MCP23017(i2c, 0x40);
jasminealice 22:c024b20a0e2d 458 mcp->_write(IODIRA, (unsigned char )0xff);
jasminealice 22:c024b20a0e2d 459 mcp->_write(IODIRB, (unsigned char )0xff);
jasminealice 22:c024b20a0e2d 460 mcp->_write(IPOLA, (unsigned char )0x00);
jasminealice 22:c024b20a0e2d 461 mcp->_write(IPOLB, (unsigned char )0x00);
jasminealice 22:c024b20a0e2d 462 mcp->_write(DEFVALA, (unsigned char )0xff);
jasminealice 22:c024b20a0e2d 463 mcp->_write(DEFVALB, (unsigned char )0xff);
jasminealice 22:c024b20a0e2d 464 mcp->_write(INTCONA, (unsigned char )0xff);
jasminealice 22:c024b20a0e2d 465 mcp->_write(INTCONB, (unsigned char )0xff);
jasminealice 22:c024b20a0e2d 466 mcp->_write(IOCONA, (unsigned char )0x2);
jasminealice 22:c024b20a0e2d 467 mcp->_write(IOCONB, (unsigned char )0x2);
jasminealice 22:c024b20a0e2d 468 mcp->_write(GPPUA, (unsigned char )0xff);
jasminealice 22:c024b20a0e2d 469 mcp->_write(GPPUB, (unsigned char )0xff);
jasminealice 18:f5824ba95892 470 }
jasminealice 23:bb57966cb776 471 void passZero(){
jasminealice 23:bb57966cb776 472 checkDetector(0);
jasminealice 23:bb57966cb776 473 }
jasminealice 22:c024b20a0e2d 474
jasminealice 23:bb57966cb776 475 void passOne(){
jasminealice 23:bb57966cb776 476 checkDetector(1);
jasminealice 23:bb57966cb776 477 }
jasminealice 23:bb57966cb776 478
jasminealice 23:bb57966cb776 479 void init_interrupt() {
jasminealice 22:c024b20a0e2d 480 // Clear current interrupts
jasminealice 25:90f7a34c253a 481 //en = 1;
jasminealice 22:c024b20a0e2d 482 mcp->_read(GPIOA);
jasminealice 22:c024b20a0e2d 483 mcp->_read(GPIOB);
jasminealice 22:c024b20a0e2d 484 // Register callbacks
jasminealice 23:bb57966cb776 485 int0.fall(&passZero);
jasminealice 23:bb57966cb776 486 int1.fall(&passOne);
jasminealice 22:c024b20a0e2d 487 // Enable interrupts on MCP
jasminealice 22:c024b20a0e2d 488 mcp->_write(GPINTENA, (unsigned char )0xff);
jasminealice 22:c024b20a0e2d 489 mcp->_write(GPINTENB, (unsigned char )0xff);// Ready to go!
jasminealice 22:c024b20a0e2d 490 }
KwamsC 24:418711ed8c52 491
KwamsC 24:418711ed8c52 492 void init_trains(){
KwamsC 26:f5e71308a13e 493 redTrain.changeSpeed(stop);
KwamsC 26:f5e71308a13e 494 silverTrain.changeSpeed(stop);
KwamsC 24:418711ed8c52 495
KwamsC 24:418711ed8c52 496 vector<int> res;
KwamsC 24:418711ed8c52 497 res.push_back(2);
jasminealice 25:90f7a34c253a 498 //res.push_back(4);
jasminealice 28:1430685f4d12 499 dect.makeReservation(C_left); //Run trains counterclockwise and reserve
KwamsC 24:418711ed8c52 500 vector<int> res2;
jasminealice 28:1430685f4d12 501 res2.push_back(10);
jasminealice 25:90f7a34c253a 502 //res2.push_back(13);
KwamsC 24:418711ed8c52 503 dect.makeReservation(res2);
jasminealice 28:1430685f4d12 504 dect.showReservation();
jasminealice 25:90f7a34c253a 505 }