Jasmine Karlsson / Mbed 2 deprecated train_rail

Dependencies:   mbed TextLCD

Committer:
jasminealice
Date:
Fri Jun 22 09:55:58 2018 +0000
Revision:
29:6031227dcac9
Parent:
28:1430685f4d12
Child:
30:63a8a5cefc6b
changed vectors for 4 and 10 now stop works

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