Jasmine Karlsson / Mbed 2 deprecated train_rail

Dependencies:   mbed TextLCD

Committer:
KwamsC
Date:
Wed Jun 20 14:38:20 2018 +0000
Revision:
27:9f9cd0df9a79
Parent:
26:f5e71308a13e
Child:
28:1430685f4d12
june 20 assign trains

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