Jasmine Karlsson / Mbed 2 deprecated train_rail

Dependencies:   mbed TextLCD

Committer:
KwamsC
Date:
Thu Jun 14 14:47:16 2018 +0000
Revision:
24:418711ed8c52
Parent:
23:bb57966cb776
Child:
25:90f7a34c253a
all cases implemented

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 16:55c3c5727f14 22 //InterruptIn sw1(p5);
jasminealice 23:bb57966cb776 23 InterruptIn int0(p13), int1(p14);
jasminealice 22:c024b20a0e2d 24 I2C i2c(p28, p27);
jasminealice 18:f5824ba95892 25 MCP23017 *mcp;
jasminealice 17:b7b5f40cebff 26
jasminealice 17:b7b5f40cebff 27 /*----------------------------------------------------------------------------
jasminealice 17:b7b5f40cebff 28 Addresses
jasminealice 17:b7b5f40cebff 29 *----------------------------------------------------------------------------*/
jasminealice 21:31647d80614f 30 const unsigned int DCCaddress_silver = 0x01;
jasminealice 21:31647d80614f 31 const unsigned int DCCaddress_red = 0x03;
jasminealice 17:b7b5f40cebff 32 const unsigned int DCCaddress_switch = 0x06;
KwamsC 14:a5fd98a957e6 33
KwamsC 14:a5fd98a957e6 34 /*----------------------------------------------------------------------------
KwamsC 14:a5fd98a957e6 35 Train movement
KwamsC 14:a5fd98a957e6 36 *----------------------------------------------------------------------------*/
KwamsC 14:a5fd98a957e6 37 //move backwards/reverse
jasminealice 21:31647d80614f 38 const unsigned int DCCinst_reverse = 0x48; //reverse speed
KwamsC 14:a5fd98a957e6 39
jasminealice 15:8d96f7a06103 40 //speed dial forward
jasminealice 21:31647d80614f 41 const unsigned int DCCinst_step2 = 0x72; //step 2
KwamsC 24:418711ed8c52 42 const unsigned int DCCinst_step4 = 0x73; //step 4
jasminealice 18:f5824ba95892 43 //const unsigned int DCCinst_step6 = 0x68; //step 6 1/4 speed
jasminealice 16:55c3c5727f14 44 const unsigned int DCCinst_step13 = 0x78; //step 13 1/2 speed
jasminealice 18:f5824ba95892 45 //const unsigned int DCCinst_step20 = 0x75; //step 20 3/4 speed
jasminealice 18:f5824ba95892 46 //const unsigned int DCCinst_step28 = 0x7F; //step 28 Full speed
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
jasminealice 17:b7b5f40cebff 51 const unsigned int DCCinst_deactive_switch = 0x80; //Deactivate switches
KwamsC 14:a5fd98a957e6 52 //stop
jasminealice 16:55c3c5727f14 53 const unsigned int DCCinst_stop = 0x40; //forward and stop 01100000
KwamsC 10:cda57976225f 54
jasminealice 17:b7b5f40cebff 55 /*----------------------------------------------------------------------------
jasminealice 17:b7b5f40cebff 56 Function definitions
jasminealice 17:b7b5f40cebff 57 *----------------------------------------------------------------------------*/
jasminealice 17:b7b5f40cebff 58 bool readSwitch(DigitalIn theSwitch);
jasminealice 23:bb57966cb776 59 int convertHextoDec(int pos, int intnr);
KwamsC 24:418711ed8c52 60 void checkDetector(int inter);
jasminealice 22:c024b20a0e2d 61 void init_mcp();
jasminealice 23:bb57966cb776 62 void init_interrupt();
KwamsC 24:418711ed8c52 63 void init_trains();
KwamsC 24:418711ed8c52 64 void executeCase(int pos);
jasminealice 23:bb57966cb776 65 Train& assignTrain(int pos);
KwamsC 10:cda57976225f 66
jasminealice 21:31647d80614f 67 //Trains
jasminealice 23:bb57966cb776 68 Train redTrain(DCCaddress_red, DCCinst_step13, 12);
jasminealice 23:bb57966cb776 69 Train silverTrain(DCCaddress_silver,DCCinst_step13, 2);
jasminealice 21:31647d80614f 70 //Switches
jasminealice 21:31647d80614f 71 Switch switch1(DCCaddress_switch,DCCinst_switch1);
KwamsC 24:418711ed8c52 72 Switch switch2(DCCaddress_switch,DCCinst_switch2);
jasminealice 21:31647d80614f 73 Switch switch3(DCCaddress_switch,DCCinst_switch3);
jasminealice 21:31647d80614f 74 Switch switch4(DCCaddress_switch,DCCinst_switch4);
jasminealice 21:31647d80614f 75 //Detectors
jasminealice 23:bb57966cb776 76 Detector dect(false);
jasminealice 21:31647d80614f 77
jasminealice 23:bb57966cb776 78 // Detectors address
jasminealice 23:bb57966cb776 79 /*
jasminealice 23:bb57966cb776 80 d0 = 0xfe //254
jasminealice 23:bb57966cb776 81 d1 = 0xfd //253
jasminealice 23:bb57966cb776 82 d2 = fb //251
jasminealice 23:bb57966cb776 83 d3 = f7 //247
jasminealice 23:bb57966cb776 84 d4 = ef //239
jasminealice 23:bb57966cb776 85 d5 = df //223
jasminealice 23:bb57966cb776 86 d6 = bf //191
jasminealice 23:bb57966cb776 87 d7 = 7f //255
jasminealice 23:bb57966cb776 88 d8 = 0xfe //254
jasminealice 23:bb57966cb776 89 d9 = fd
jasminealice 23:bb57966cb776 90 d10 = fb
jasminealice 23:bb57966cb776 91 d11 = f7
jasminealice 23:bb57966cb776 92 d12 = ef
jasminealice 23:bb57966cb776 93 d13 = df
jasminealice 23:bb57966cb776 94 */
jasminealice 16:55c3c5727f14 95 /*----------------------------------------------------------------------------
jasminealice 16:55c3c5727f14 96 Main
jasminealice 16:55c3c5727f14 97 *----------------------------------------------------------------------------*/
jasminealice 16:55c3c5727f14 98 int main() {
jasminealice 22:c024b20a0e2d 99 lcd.printf("Start journey");
jasminealice 22:c024b20a0e2d 100 init_mcp();
jasminealice 23:bb57966cb776 101 init_interrupt();
KwamsC 24:418711ed8c52 102 init_trains();
KwamsC 24:418711ed8c52 103 wait(2);
jasminealice 21:31647d80614f 104 while(1){
jasminealice 23:bb57966cb776 105 redTrain.sendCommand();
jasminealice 23:bb57966cb776 106 silverTrain.sendCommand();
jasminealice 22:c024b20a0e2d 107
jasminealice 21:31647d80614f 108 if(!readSwitch(sw3)){ //Change speed
jasminealice 23:bb57966cb776 109 lcd.printf("Go forward");
jasminealice 23:bb57966cb776 110 redTrain.changeSpeed(DCCinst_step13);
jasminealice 23:bb57966cb776 111 silverTrain.changeSpeed(DCCinst_step13);
jasminealice 22:c024b20a0e2d 112 }
jasminealice 23:bb57966cb776 113
KwamsC 24:418711ed8c52 114 if(redTrain.checkStop()){ //check if Train stopped
KwamsC 24:418711ed8c52 115 lcd.cls();
KwamsC 24:418711ed8c52 116 lcd.printf("in stop");
KwamsC 24:418711ed8c52 117 wait(2);
KwamsC 24:418711ed8c52 118 executeCase(redTrain.getPosition());
KwamsC 24:418711ed8c52 119 }
KwamsC 24:418711ed8c52 120 else if(silverTrain.checkStop()){
KwamsC 24:418711ed8c52 121 executeCase(silverTrain.getPosition());
KwamsC 24:418711ed8c52 122 }
jasminealice 22:c024b20a0e2d 123 }
jasminealice 16:55c3c5727f14 124 }
KwamsC 10:cda57976225f 125
KwamsC 14:a5fd98a957e6 126 /*----------------------------------------------------------------------------
KwamsC 14:a5fd98a957e6 127 Functions
KwamsC 14:a5fd98a957e6 128 *----------------------------------------------------------------------------*/
jasminealice 23:bb57966cb776 129 int convertHextoDec(int pos, int intnr){
jasminealice 23:bb57966cb776 130 int newPos;
jasminealice 23:bb57966cb776 131 switch(pos){
jasminealice 23:bb57966cb776 132 case 0xfe:
jasminealice 23:bb57966cb776 133 newPos = 0;
jasminealice 23:bb57966cb776 134 break;
jasminealice 23:bb57966cb776 135 case 0xfd:
jasminealice 23:bb57966cb776 136 newPos = 1;
jasminealice 23:bb57966cb776 137 break;
jasminealice 23:bb57966cb776 138 case 0xfb:
jasminealice 23:bb57966cb776 139 newPos = 2;
jasminealice 23:bb57966cb776 140 break;
jasminealice 23:bb57966cb776 141 case 0xf7:
jasminealice 23:bb57966cb776 142 newPos = 3;
jasminealice 23:bb57966cb776 143 break;
jasminealice 23:bb57966cb776 144 case 0xef:
jasminealice 23:bb57966cb776 145 newPos = 4;
jasminealice 23:bb57966cb776 146 break;
jasminealice 23:bb57966cb776 147 case 0xdf:
jasminealice 23:bb57966cb776 148 newPos = 5;
jasminealice 23:bb57966cb776 149 break;
jasminealice 23:bb57966cb776 150 case 0xbf:
jasminealice 23:bb57966cb776 151 newPos = 6;
jasminealice 23:bb57966cb776 152 break;
jasminealice 23:bb57966cb776 153 case 0x7f:
jasminealice 23:bb57966cb776 154 newPos = 7;
jasminealice 23:bb57966cb776 155 break;
jasminealice 23:bb57966cb776 156 default:
jasminealice 23:bb57966cb776 157 return -1;
jasminealice 23:bb57966cb776 158 }
jasminealice 23:bb57966cb776 159
jasminealice 23:bb57966cb776 160 if(intnr == 1)
jasminealice 23:bb57966cb776 161 newPos += 8;
jasminealice 23:bb57966cb776 162 return newPos;
jasminealice 23:bb57966cb776 163 }
jasminealice 21:31647d80614f 164
jasminealice 23:bb57966cb776 165 Train& assignTrain(int pos){
jasminealice 23:bb57966cb776 166
jasminealice 21:31647d80614f 167 //Check which train got the interupt
jasminealice 21:31647d80614f 168 if(redTrain.checkInterupt(pos)){
jasminealice 21:31647d80614f 169 redTrain.setPosition(pos);
jasminealice 23:bb57966cb776 170 //lcd.cls();
jasminealice 23:bb57966cb776 171 //lcd.printf("Red train!");
jasminealice 23:bb57966cb776 172 return redTrain;
jasminealice 21:31647d80614f 173 }
jasminealice 21:31647d80614f 174 else if(silverTrain.checkInterupt(pos)){
jasminealice 21:31647d80614f 175 silverTrain.setPosition(pos);
jasminealice 23:bb57966cb776 176 //lcd.cls();
KwamsC 24:418711ed8c52 177 lcd.printf("Silver train!");
jasminealice 23:bb57966cb776 178 return silverTrain;
jasminealice 21:31647d80614f 179 }
jasminealice 23:bb57966cb776 180 }
jasminealice 23:bb57966cb776 181
KwamsC 24:418711ed8c52 182 void executeCase(int pos){
KwamsC 24:418711ed8c52 183 Train* currTrain = &assignTrain(pos);
KwamsC 24:418711ed8c52 184
KwamsC 24:418711ed8c52 185 switch(pos){
KwamsC 24:418711ed8c52 186 case 0:
KwamsC 24:418711ed8c52 187 lcd.printf("at 0");
KwamsC 24:418711ed8c52 188 break;
KwamsC 24:418711ed8c52 189 case 1:
KwamsC 24:418711ed8c52 190 lcd.printf("at 1");
KwamsC 24:418711ed8c52 191 currTrain->changeSpeed(DCCinst_step4);//Slow down
KwamsC 24:418711ed8c52 192 lcd.printf("slow down");
KwamsC 24:418711ed8c52 193 break;
KwamsC 24:418711ed8c52 194 case 2:
KwamsC 24:418711ed8c52 195 /*
KwamsC 24:418711ed8c52 196 Stop everytime at 2
KwamsC 24:418711ed8c52 197
KwamsC 24:418711ed8c52 198
KwamsC 24:418711ed8c52 199
KwamsC 24:418711ed8c52 200 */
KwamsC 24:418711ed8c52 201
KwamsC 24:418711ed8c52 202 lcd.printf("at 2");
KwamsC 24:418711ed8c52 203 if(currTrain->isClockwise()) //IF C goes towards 1
KwamsC 24:418711ed8c52 204 {
KwamsC 24:418711ed8c52 205 switch2.switchOff(); //Disable switch4
KwamsC 24:418711ed8c52 206 int arr [3] = {3,4,9};
KwamsC 24:418711ed8c52 207 vector<int> detectors(arr, arr + sizeof(arr) / sizeof(int));
KwamsC 24:418711ed8c52 208 dect.clearReservation(detectors); //Free 3,4,9
KwamsC 24:418711ed8c52 209 currTrain->changeSpeed(DCCinst_step13); //Move forward
KwamsC 24:418711ed8c52 210 }
KwamsC 24:418711ed8c52 211 else{ //IF CC
KwamsC 24:418711ed8c52 212 if(!dect.checkReservation(4) && !dect.checkReservation(3)){ //Check if 4 or 3 is reserved
KwamsC 24:418711ed8c52 213 int v1 = rand() % 100; //IF NOT randomize which way to go
KwamsC 24:418711ed8c52 214 if (v1 < 25){ //0.25 chance to enable the switch2, reserve 3,9
KwamsC 24:418711ed8c52 215 switch2.switchOn();
KwamsC 24:418711ed8c52 216 int arr [2] = {3,9};
KwamsC 24:418711ed8c52 217 vector<int> detectors(arr, arr + sizeof(arr) / sizeof(int));
KwamsC 24:418711ed8c52 218 dect.makeReservation(detectors);
KwamsC 24:418711ed8c52 219 }
KwamsC 24:418711ed8c52 220 else { //0.75 chance to disable switch2, reserve 4
KwamsC 24:418711ed8c52 221 switch2.switchOff();
KwamsC 24:418711ed8c52 222 vector<int> detectors(4);
KwamsC 24:418711ed8c52 223 dect.makeReservation(detectors);
KwamsC 24:418711ed8c52 224 }
KwamsC 24:418711ed8c52 225
KwamsC 24:418711ed8c52 226 }else if(dect.checkReservation(10)){ //IF 4 is reserved
KwamsC 24:418711ed8c52 227 switch2.switchOn(); //Enable switch2, reserve 3,9
KwamsC 24:418711ed8c52 228 int arr [2] = {3,9};
KwamsC 24:418711ed8c52 229 vector<int> detectors(arr, arr + sizeof(arr) / sizeof(int));
KwamsC 24:418711ed8c52 230 dect.makeReservation(detectors);
KwamsC 24:418711ed8c52 231
KwamsC 24:418711ed8c52 232 }else{ //IF 3 reserved
KwamsC 24:418711ed8c52 233 switch2.switchOff(); //Disable switch2, reserve 4
KwamsC 24:418711ed8c52 234 vector<int> detectors(4);
KwamsC 24:418711ed8c52 235 dect.makeReservation(detectors);
KwamsC 24:418711ed8c52 236 }
KwamsC 24:418711ed8c52 237
KwamsC 24:418711ed8c52 238 currTrain->changeSpeed(DCCinst_step13); //Go forward
KwamsC 24:418711ed8c52 239 }
KwamsC 24:418711ed8c52 240 break;
KwamsC 24:418711ed8c52 241 case 3:
KwamsC 24:418711ed8c52 242 lcd.printf("at 3");
KwamsC 24:418711ed8c52 243 if(currTrain->isClockwise()){ //Clock: Goes from 3 to 2
KwamsC 24:418711ed8c52 244 if(!dect.checkReservation(2)){
KwamsC 24:418711ed8c52 245 switch2.switchOn(); //Enable switch2
KwamsC 24:418711ed8c52 246 int arr [5] = {0,1,2,12,13};
KwamsC 24:418711ed8c52 247 vector<int> detectors(arr, arr + sizeof(arr) / sizeof(int));
KwamsC 24:418711ed8c52 248 dect.makeReservation(detectors); //Reserve 0,1,2, 12, 13
KwamsC 24:418711ed8c52 249 currTrain->changeSpeed(DCCinst_step13); //go forward
KwamsC 24:418711ed8c52 250 }
KwamsC 24:418711ed8c52 251 else{
KwamsC 24:418711ed8c52 252 currTrain->Stop();
KwamsC 24:418711ed8c52 253 }
KwamsC 24:418711ed8c52 254 }
KwamsC 24:418711ed8c52 255 else{ //Other Clock: Goes from 3->9
KwamsC 24:418711ed8c52 256 currTrain->changeDirection(); //change direction
KwamsC 24:418711ed8c52 257 switch2.switchOff(); //Disable switch2
KwamsC 24:418711ed8c52 258 int arr [5] = {0,1,2,12,13};
KwamsC 24:418711ed8c52 259 vector<int> detectors(arr, arr + sizeof(arr) / sizeof(int));
KwamsC 24:418711ed8c52 260 dect.clearReservation(detectors); //free nr 0,1,2,12,13
KwamsC 24:418711ed8c52 261 currTrain->changeSpeed(DCCinst_step13); //go forward
KwamsC 24:418711ed8c52 262 }
KwamsC 24:418711ed8c52 263
KwamsC 24:418711ed8c52 264 break;
KwamsC 24:418711ed8c52 265 case 4:
KwamsC 24:418711ed8c52 266 lcd.printf("At 4");
KwamsC 24:418711ed8c52 267 if(currTrain->isClockwise()) //IF Clock goes towards 2
KwamsC 24:418711ed8c52 268 {
KwamsC 24:418711ed8c52 269 int arr [4] = {5,6,7,8};
KwamsC 24:418711ed8c52 270 vector<int> detectors(arr, arr + sizeof(arr) / sizeof(int));
KwamsC 24:418711ed8c52 271 dect.clearReservation(detectors); //free nr 5,6, 7, 8
KwamsC 24:418711ed8c52 272 switch2.switchOff(); //Turn of switch2
KwamsC 24:418711ed8c52 273 if(dect.checkReservation(2)){ //Check if 2 is reserved
KwamsC 24:418711ed8c52 274 currTrain->Stop(); //IF yes STOP
KwamsC 24:418711ed8c52 275 }
KwamsC 24:418711ed8c52 276 else{
KwamsC 24:418711ed8c52 277 int arr [5] = {0,1,2,12,13};//else reserve 12,13,0,1,2
KwamsC 24:418711ed8c52 278 vector<int> detectors(arr, arr + sizeof(arr) / sizeof(int));
KwamsC 24:418711ed8c52 279 dect.makeReservation(detectors);
KwamsC 24:418711ed8c52 280 currTrain->changeSpeed(DCCinst_step13); //go forward
KwamsC 24:418711ed8c52 281 }
KwamsC 24:418711ed8c52 282 }
KwamsC 24:418711ed8c52 283 else{ //IF CC :goes towards 6
KwamsC 24:418711ed8c52 284 int arr [5] = {0,1,2,12,13};
KwamsC 24:418711ed8c52 285 vector<int> detectors(arr, arr + sizeof(arr) / sizeof(int));
KwamsC 24:418711ed8c52 286 dect.clearReservation(detectors); //free nr 0,1,2,12,13
KwamsC 24:418711ed8c52 287 switch3.switchOn(); //Turn on switch3
KwamsC 24:418711ed8c52 288 dect.showReservation();
KwamsC 24:418711ed8c52 289 wait(2);
KwamsC 24:418711ed8c52 290 if(dect.checkReservation(6)){ //Check if 6 is reserved
KwamsC 24:418711ed8c52 291 lcd.printf("stop, 6 is reserved");
KwamsC 24:418711ed8c52 292 currTrain->Stop(); //IF yes STOP
KwamsC 24:418711ed8c52 293 lcd.cls();
KwamsC 24:418711ed8c52 294 lcd.printf("Currtrain: ");
KwamsC 24:418711ed8c52 295 lcd.printf("%d", currTrain->getSpeed());
KwamsC 24:418711ed8c52 296 lcd.printf("\n Silver: ");
KwamsC 24:418711ed8c52 297 lcd.printf("%d", silverTrain.getSpeed());
KwamsC 24:418711ed8c52 298
KwamsC 24:418711ed8c52 299 }
KwamsC 24:418711ed8c52 300 else{
KwamsC 24:418711ed8c52 301 int arr [3] = {6,7,8};
KwamsC 24:418711ed8c52 302 vector<int> detectors(arr, arr + sizeof(arr) / sizeof(int));
KwamsC 24:418711ed8c52 303 dect.makeReservation(detectors); //else reserve 6,7,8 and go forward
KwamsC 24:418711ed8c52 304 currTrain->changeSpeed(DCCinst_step13);
KwamsC 24:418711ed8c52 305 }
KwamsC 24:418711ed8c52 306
KwamsC 24:418711ed8c52 307 }
KwamsC 24:418711ed8c52 308 break;
KwamsC 24:418711ed8c52 309 case 5:
KwamsC 24:418711ed8c52 310 lcd.printf("at 5");
KwamsC 24:418711ed8c52 311
KwamsC 24:418711ed8c52 312 if(!currTrain->isClockwise()){ //CC: Goes from 5 to 6
KwamsC 24:418711ed8c52 313 if(!dect.checkReservation(2)){
KwamsC 24:418711ed8c52 314 switch3.switchOff(); //Disable switch3
KwamsC 24:418711ed8c52 315 int arr [3] = {6,7,8};
KwamsC 24:418711ed8c52 316 vector<int> detectors(arr, arr + sizeof(arr) / sizeof(int));
KwamsC 24:418711ed8c52 317 dect.makeReservation(detectors); //Reserve 6,7,8
KwamsC 24:418711ed8c52 318 currTrain->changeSpeed(DCCinst_step13); //go forward
KwamsC 24:418711ed8c52 319 }
KwamsC 24:418711ed8c52 320 else{
KwamsC 24:418711ed8c52 321 currTrain->Stop();
KwamsC 24:418711ed8c52 322 }
KwamsC 24:418711ed8c52 323 }
KwamsC 24:418711ed8c52 324 else{ //Other Clock: Goes from 5->11
KwamsC 24:418711ed8c52 325 currTrain->changeDirection(); //change direction
KwamsC 24:418711ed8c52 326 switch3.switchOn(); //Enable switch3
KwamsC 24:418711ed8c52 327 int arr [3] = {6,7,8};
KwamsC 24:418711ed8c52 328 vector<int> detectors(arr, arr + sizeof(arr) / sizeof(int));
KwamsC 24:418711ed8c52 329 dect.clearReservation(detectors); //free nr 6,7,8
KwamsC 24:418711ed8c52 330 currTrain->changeSpeed(DCCinst_step13); //go forward
KwamsC 24:418711ed8c52 331 }
KwamsC 24:418711ed8c52 332 break;
KwamsC 24:418711ed8c52 333 case 6:
KwamsC 24:418711ed8c52 334 lcd.printf("At 6");
KwamsC 24:418711ed8c52 335 if(!currTrain->isClockwise()) //IF CC goes towards 7
KwamsC 24:418711ed8c52 336 {
KwamsC 24:418711ed8c52 337 switch3.switchOn(); //Enable switch3
KwamsC 24:418711ed8c52 338 int arr [3] = {4,5,11};
KwamsC 24:418711ed8c52 339 vector<int> detectors(arr, arr + sizeof(arr) / sizeof(int));
KwamsC 24:418711ed8c52 340 dect.clearReservation(detectors); //free nr 4,5,11
KwamsC 24:418711ed8c52 341 currTrain->changeSpeed(DCCinst_step13); //Move forward
KwamsC 24:418711ed8c52 342 }
KwamsC 24:418711ed8c52 343 else{
KwamsC 24:418711ed8c52 344 if(!dect.checkReservation(4) && !dect.checkReservation(5)){ //Check if 4 or 5 is reserved
KwamsC 24:418711ed8c52 345 int v1 = rand() % 100; //IF NOT randomize which way to go
KwamsC 24:418711ed8c52 346 if (v1 < 25){ //0.25 chance to disable the switch3, reserve 5,11
KwamsC 24:418711ed8c52 347 switch3.switchOff();
KwamsC 24:418711ed8c52 348 int arr [2] = {5,11};
KwamsC 24:418711ed8c52 349 vector<int> detectors(arr, arr + sizeof(arr) / sizeof(int));
KwamsC 24:418711ed8c52 350 dect.makeReservation(detectors);
KwamsC 24:418711ed8c52 351 }
KwamsC 24:418711ed8c52 352 else { //0.75 chance to Enable switch3, reserve 4
KwamsC 24:418711ed8c52 353 switch3.switchOn();
KwamsC 24:418711ed8c52 354 vector<int> detectors(4);
KwamsC 24:418711ed8c52 355 dect.makeReservation(detectors);
KwamsC 24:418711ed8c52 356 }
KwamsC 24:418711ed8c52 357
KwamsC 24:418711ed8c52 358 }else if(dect.checkReservation(4)){ //IF 4 is reserved
KwamsC 24:418711ed8c52 359 switch3.switchOff(); //Disable switch3, reserve 5,11
KwamsC 24:418711ed8c52 360 int arr [2] = {5, 11};
KwamsC 24:418711ed8c52 361 vector<int> detectors(arr, arr + sizeof(arr) / sizeof(int));
KwamsC 24:418711ed8c52 362 dect.makeReservation(detectors);
KwamsC 24:418711ed8c52 363
KwamsC 24:418711ed8c52 364 }else{ //IF 5 reserved
KwamsC 24:418711ed8c52 365 switch3.switchOn(); //Enable switch3, reserve 4
KwamsC 24:418711ed8c52 366 vector<int> detectors(4);
KwamsC 24:418711ed8c52 367 dect.makeReservation(detectors);
KwamsC 24:418711ed8c52 368 }
KwamsC 24:418711ed8c52 369
KwamsC 24:418711ed8c52 370 currTrain->changeSpeed(DCCinst_step13); //Go forward
KwamsC 24:418711ed8c52 371 }
KwamsC 24:418711ed8c52 372 break;
KwamsC 24:418711ed8c52 373 case 7:
KwamsC 24:418711ed8c52 374 lcd.printf("At 7yhyh");
KwamsC 24:418711ed8c52 375 break;
KwamsC 24:418711ed8c52 376 case 8:
KwamsC 24:418711ed8c52 377 lcd.printf("At 8");
KwamsC 24:418711ed8c52 378 if(currTrain->isClockwise()) //IF C goes towards 7
KwamsC 24:418711ed8c52 379 {
KwamsC 24:418711ed8c52 380 switch4.switchOff(); //Disable switch4
KwamsC 24:418711ed8c52 381 int arr [3] = {3,9,10};
KwamsC 24:418711ed8c52 382 vector<int> detectors(arr, arr + sizeof(arr) / sizeof(int));
KwamsC 24:418711ed8c52 383 dect.clearReservation(detectors); //Free 3,9,10
KwamsC 24:418711ed8c52 384 currTrain->changeSpeed(DCCinst_step13); //Move forward
KwamsC 24:418711ed8c52 385 }
KwamsC 24:418711ed8c52 386 else{ //IF CC
KwamsC 24:418711ed8c52 387 if(!dect.checkReservation(9) && !dect.checkReservation(10)){ //Check if 9 or 10 is reserved
KwamsC 24:418711ed8c52 388 int v1 = rand() % 100; //IF NOT randomize which way to go
KwamsC 24:418711ed8c52 389 if (v1 < 25){ //0.25 chance to enable the switch4, reserve 3,9
KwamsC 24:418711ed8c52 390 switch4.switchOn();
KwamsC 24:418711ed8c52 391 int arr [2] = {3,9};
KwamsC 24:418711ed8c52 392 vector<int> detectors(arr, arr + sizeof(arr) / sizeof(int));
KwamsC 24:418711ed8c52 393 dect.makeReservation(detectors);
KwamsC 24:418711ed8c52 394 }
KwamsC 24:418711ed8c52 395 else { //0.75 chance to disable switch4, reserve 10
KwamsC 24:418711ed8c52 396 switch4.switchOff();
KwamsC 24:418711ed8c52 397 vector<int> detectors(10);
KwamsC 24:418711ed8c52 398 dect.makeReservation(detectors);
KwamsC 24:418711ed8c52 399 }
KwamsC 24:418711ed8c52 400
KwamsC 24:418711ed8c52 401 }else if(dect.checkReservation(10)){ //IF 10 is reserved
KwamsC 24:418711ed8c52 402 switch4.switchOn(); //Enable switch4, reserve 3,9
KwamsC 24:418711ed8c52 403 int arr [2] = {3,9};
KwamsC 24:418711ed8c52 404 vector<int> detectors(arr, arr + sizeof(arr) / sizeof(int));
KwamsC 24:418711ed8c52 405 dect.makeReservation(detectors);
KwamsC 24:418711ed8c52 406
KwamsC 24:418711ed8c52 407 }else{ //IF 9 reserved
KwamsC 24:418711ed8c52 408 switch4.switchOff(); //Disable switch4, reserve 10
KwamsC 24:418711ed8c52 409 vector<int> detectors(10);
KwamsC 24:418711ed8c52 410 dect.makeReservation(detectors);
KwamsC 24:418711ed8c52 411 }
KwamsC 24:418711ed8c52 412
KwamsC 24:418711ed8c52 413 currTrain->changeSpeed(DCCinst_step13); //Go forward
KwamsC 24:418711ed8c52 414 }
KwamsC 24:418711ed8c52 415 break;
KwamsC 24:418711ed8c52 416 case 9:
KwamsC 24:418711ed8c52 417 lcd.printf("at 9");
KwamsC 24:418711ed8c52 418 if(currTrain->isClockwise()){ //Clock: Goes from 9 to 8
KwamsC 24:418711ed8c52 419 if(!dect.checkReservation(8)){
KwamsC 24:418711ed8c52 420 switch4.switchOn(); //Enable switch4
KwamsC 24:418711ed8c52 421 int arr [3] = {6,7,8};
KwamsC 24:418711ed8c52 422 vector<int> detectors(arr, arr + sizeof(arr) / sizeof(int));
KwamsC 24:418711ed8c52 423 dect.makeReservation(detectors); //Reserve 6,7,8
KwamsC 24:418711ed8c52 424 currTrain->changeSpeed(DCCinst_step13); //Go forward
KwamsC 24:418711ed8c52 425
KwamsC 24:418711ed8c52 426 }
KwamsC 24:418711ed8c52 427 else{
KwamsC 24:418711ed8c52 428 currTrain->Stop();
KwamsC 24:418711ed8c52 429 }
KwamsC 24:418711ed8c52 430 }
KwamsC 24:418711ed8c52 431 else{ //Other Clock: Goes from 9->3
KwamsC 24:418711ed8c52 432 currTrain->changeDirection(); //change direction
KwamsC 24:418711ed8c52 433 switch4.switchOff(); //Disable switch4
KwamsC 24:418711ed8c52 434 int arr [3] = {6,7,8};
KwamsC 24:418711ed8c52 435 vector<int> detectors(arr, arr + sizeof(arr) / sizeof(int));
KwamsC 24:418711ed8c52 436 dect.clearReservation(detectors); //free nr 6,7,8
KwamsC 24:418711ed8c52 437 currTrain->changeSpeed(DCCinst_step13); //Go forward
KwamsC 24:418711ed8c52 438 }
KwamsC 24:418711ed8c52 439 break;
KwamsC 24:418711ed8c52 440 case 10:
KwamsC 24:418711ed8c52 441 lcd.printf("At 10");
KwamsC 24:418711ed8c52 442 if(!currTrain->isClockwise()) //IF CC goes towards 12
KwamsC 24:418711ed8c52 443 {
KwamsC 24:418711ed8c52 444 int arr [4] = {6,7,8,9};
KwamsC 24:418711ed8c52 445 vector<int> detectors(arr, arr + sizeof(arr) / sizeof(int));
KwamsC 24:418711ed8c52 446 dect.clearReservation(detectors); //free nr 6, 7, 8, 9
KwamsC 24:418711ed8c52 447 switch1.switchOff(); //Turn of switch1
KwamsC 24:418711ed8c52 448 if(dect.checkReservation(12)){ //Check if 12 is reserved
KwamsC 24:418711ed8c52 449 currTrain->Stop(); //IF yes STOP
KwamsC 24:418711ed8c52 450 }
KwamsC 24:418711ed8c52 451 else{
KwamsC 24:418711ed8c52 452 int arr [5] = {0,1,2,12,13};//else reserve 12,13,0,1,2
KwamsC 24:418711ed8c52 453 vector<int> detectors(arr, arr + sizeof(arr) / sizeof(int));
KwamsC 24:418711ed8c52 454 dect.makeReservation(detectors);
KwamsC 24:418711ed8c52 455 currTrain->changeSpeed(DCCinst_step13); //go forward
KwamsC 24:418711ed8c52 456 }
KwamsC 24:418711ed8c52 457 }
KwamsC 24:418711ed8c52 458
KwamsC 24:418711ed8c52 459 else{ //IF C :goes towards 8
KwamsC 24:418711ed8c52 460 int arr [5] = {0,1,2,12,13};
KwamsC 24:418711ed8c52 461 vector<int> detectors(arr, arr + sizeof(arr) / sizeof(int));
KwamsC 24:418711ed8c52 462 dect.clearReservation(detectors); //free nr 0,1,2,12,13
KwamsC 24:418711ed8c52 463 switch4.switchOff(); //Turn off switch4
KwamsC 24:418711ed8c52 464
KwamsC 24:418711ed8c52 465 if(dect.checkReservation(8)){ //Check if 8 is reserved
KwamsC 24:418711ed8c52 466 currTrain->Stop(); //IF yes STOP
KwamsC 24:418711ed8c52 467 }
KwamsC 24:418711ed8c52 468 else{
KwamsC 24:418711ed8c52 469 int arr [3] = {6,7,8};
KwamsC 24:418711ed8c52 470 vector<int> detectors(arr, arr + sizeof(arr) / sizeof(int));
KwamsC 24:418711ed8c52 471 dect.makeReservation(detectors); //else reserve 6,7,8 and go forward
KwamsC 24:418711ed8c52 472 currTrain->changeSpeed(DCCinst_step13);
KwamsC 24:418711ed8c52 473 }
KwamsC 24:418711ed8c52 474 }
KwamsC 24:418711ed8c52 475 break;
KwamsC 24:418711ed8c52 476
KwamsC 24:418711ed8c52 477 case 11:
KwamsC 24:418711ed8c52 478 lcd.printf("at 11");
KwamsC 24:418711ed8c52 479
KwamsC 24:418711ed8c52 480 if(currTrain->isClockwise()){ //Clockwise: Goes from 11 to 5
KwamsC 24:418711ed8c52 481 currTrain->changeDirection(); //change direction
KwamsC 24:418711ed8c52 482 switch1.switchOff(); //Disable switch1
KwamsC 24:418711ed8c52 483 int arr [5] = {0,1,2,12,13};
KwamsC 24:418711ed8c52 484 vector<int> detectors(arr, arr + sizeof(arr) / sizeof(int));
KwamsC 24:418711ed8c52 485 dect.clearReservation(detectors); //free 0,1,2,12,13
KwamsC 24:418711ed8c52 486 currTrain->changeSpeed(DCCinst_step13); //go forward
KwamsC 24:418711ed8c52 487
KwamsC 24:418711ed8c52 488 }
KwamsC 24:418711ed8c52 489 else{ //Other Clock: Goes from 11->12
KwamsC 24:418711ed8c52 490 if(!dect.checkReservation(8)){
KwamsC 24:418711ed8c52 491
KwamsC 24:418711ed8c52 492 switch1.switchOn(); //Enable switch1
KwamsC 24:418711ed8c52 493 int arr [5] = {0,1,2, 12,13};
KwamsC 24:418711ed8c52 494 vector<int> detectors(arr, arr + sizeof(arr) / sizeof(int));
KwamsC 24:418711ed8c52 495 dect.makeReservation(detectors); //Reserve 0,1,2, 12, 13
KwamsC 24:418711ed8c52 496 currTrain->changeSpeed(DCCinst_step13); //go forward
KwamsC 24:418711ed8c52 497 }
KwamsC 24:418711ed8c52 498 else{
KwamsC 24:418711ed8c52 499 currTrain->Stop();
KwamsC 24:418711ed8c52 500 }
KwamsC 24:418711ed8c52 501 }
KwamsC 24:418711ed8c52 502 break;
KwamsC 24:418711ed8c52 503 case 12:
KwamsC 24:418711ed8c52 504 lcd.printf("at 12");
KwamsC 24:418711ed8c52 505 if(!currTrain->isClockwise()) //IF CC goes towards 13
KwamsC 24:418711ed8c52 506 {
KwamsC 24:418711ed8c52 507 switch1.switchOff(); //Turn of switch1
KwamsC 24:418711ed8c52 508 int arr [3] = {5,10,11};
KwamsC 24:418711ed8c52 509 vector<int> detectors(arr, arr + sizeof(arr) / sizeof(int));
KwamsC 24:418711ed8c52 510 dect.clearReservation(detectors); //free nr 5, 10, 11
KwamsC 24:418711ed8c52 511 currTrain->changeSpeed(DCCinst_step13); //Move forward
KwamsC 24:418711ed8c52 512 }
KwamsC 24:418711ed8c52 513 else{ //if C
KwamsC 24:418711ed8c52 514 if(!dect.checkReservation(10) && !dect.checkReservation(11)){ //Check if 10 or 11 is reserved
KwamsC 24:418711ed8c52 515 int v1 = rand() % 100; //IF NOT randomize which way to go
KwamsC 24:418711ed8c52 516 if (v1 < 25){ //0.25 chance to enable the switch1, reserve 5,11
KwamsC 24:418711ed8c52 517 switch1.switchOn();
KwamsC 24:418711ed8c52 518 int arr [2] = {5,11};
KwamsC 24:418711ed8c52 519 vector<int> detectors(arr, arr + sizeof(arr) / sizeof(int));
KwamsC 24:418711ed8c52 520 dect.makeReservation(detectors);
KwamsC 24:418711ed8c52 521 }
KwamsC 24:418711ed8c52 522 else { //0.75 chance to disable switch1, reserve 10
KwamsC 24:418711ed8c52 523 switch1.switchOff();
KwamsC 24:418711ed8c52 524 vector<int> detectors(10);
KwamsC 24:418711ed8c52 525 dect.makeReservation(detectors);
KwamsC 24:418711ed8c52 526 }
KwamsC 24:418711ed8c52 527
KwamsC 24:418711ed8c52 528 }else if(dect.checkReservation(10)){ //IF 10 is reserved
KwamsC 24:418711ed8c52 529 switch1.switchOn(); //Enable switch1, reserve 5,11
KwamsC 24:418711ed8c52 530 int arr [2] = {5, 11};
KwamsC 24:418711ed8c52 531 vector<int> detectors(arr, arr + sizeof(arr) / sizeof(int));
KwamsC 24:418711ed8c52 532 dect.makeReservation(detectors);
KwamsC 24:418711ed8c52 533
KwamsC 24:418711ed8c52 534 }else{ //IF 11 reserved
KwamsC 24:418711ed8c52 535 switch1.switchOff(); //Disable switch1, reserve 10
KwamsC 24:418711ed8c52 536 vector<int> detectors(10);
KwamsC 24:418711ed8c52 537 dect.makeReservation(detectors);
KwamsC 24:418711ed8c52 538 }
KwamsC 24:418711ed8c52 539
KwamsC 24:418711ed8c52 540 currTrain->changeSpeed(DCCinst_step13); //Go forward
KwamsC 24:418711ed8c52 541 }
KwamsC 24:418711ed8c52 542 break;
KwamsC 24:418711ed8c52 543
KwamsC 24:418711ed8c52 544
KwamsC 24:418711ed8c52 545 case 13:
KwamsC 24:418711ed8c52 546 lcd.printf("at 13");
KwamsC 24:418711ed8c52 547 break;
KwamsC 24:418711ed8c52 548 case 14:
KwamsC 24:418711ed8c52 549 lcd.printf("at 21");
KwamsC 24:418711ed8c52 550 break;
KwamsC 24:418711ed8c52 551 case 15:
KwamsC 24:418711ed8c52 552 lcd.printf("at 22");
KwamsC 24:418711ed8c52 553
KwamsC 24:418711ed8c52 554 //lcd.printf("In case ");
KwamsC 24:418711ed8c52 555 //lcd.printf("%d", pos);
KwamsC 24:418711ed8c52 556 break;
KwamsC 24:418711ed8c52 557 default:
KwamsC 24:418711ed8c52 558 lcd.printf("Not in a valid case");
KwamsC 24:418711ed8c52 559 break;
KwamsC 24:418711ed8c52 560 }
KwamsC 24:418711ed8c52 561
KwamsC 24:418711ed8c52 562 mcp->_read(GPIOA);
KwamsC 24:418711ed8c52 563 mcp->_read(GPIOB);
KwamsC 24:418711ed8c52 564 }
KwamsC 24:418711ed8c52 565
KwamsC 24:418711ed8c52 566 void checkDetector(int inter){
jasminealice 23:bb57966cb776 567 lcd.cls();
jasminealice 23:bb57966cb776 568 int pos;
jasminealice 23:bb57966cb776 569 wait_us(100);
jasminealice 23:bb57966cb776 570 if (inter == 0){
jasminealice 23:bb57966cb776 571 //Read from first one
jasminealice 23:bb57966cb776 572 pos = mcp->_read(INTCAPA);
jasminealice 23:bb57966cb776 573 pos = convertHextoDec(pos, 0);
jasminealice 21:31647d80614f 574 }
jasminealice 23:bb57966cb776 575 else if (inter == 1){
jasminealice 23:bb57966cb776 576 //Read from second one
jasminealice 23:bb57966cb776 577 pos = mcp->_read(INTCAPB);
jasminealice 23:bb57966cb776 578 pos = convertHextoDec(pos, 1);
jasminealice 23:bb57966cb776 579 }
jasminealice 23:bb57966cb776 580 else
jasminealice 23:bb57966cb776 581 //PROBLEM
jasminealice 23:bb57966cb776 582 lcd.printf("Fail to detect int");
KwamsC 24:418711ed8c52 583
KwamsC 24:418711ed8c52 584 executeCase(pos);
jasminealice 21:31647d80614f 585
jasminealice 15:8d96f7a06103 586 }
jasminealice 15:8d96f7a06103 587
jasminealice 17:b7b5f40cebff 588 bool readSwitch(DigitalIn theSwitch){
jasminealice 17:b7b5f40cebff 589 int val = theSwitch.read();
jasminealice 22:c024b20a0e2d 590 //lcd.printf("%d", val);
jasminealice 16:55c3c5727f14 591 if(val == 1)
jasminealice 16:55c3c5727f14 592 return true;
jasminealice 16:55c3c5727f14 593 else
jasminealice 16:55c3c5727f14 594 return false;
tanjinamicky 13:78a2481fd65b 595 }
tanjinamicky 13:78a2481fd65b 596
jasminealice 22:c024b20a0e2d 597 void init_mcp() {
jasminealice 22:c024b20a0e2d 598 // Initialisation of MCP registers,documentation on registers is availableatNiels/Jacco/Natalia
jasminealice 22:c024b20a0e2d 599 mcp = new MCP23017(i2c, 0x40);
jasminealice 22:c024b20a0e2d 600 mcp->_write(IODIRA, (unsigned char )0xff);
jasminealice 22:c024b20a0e2d 601 mcp->_write(IODIRB, (unsigned char )0xff);
jasminealice 22:c024b20a0e2d 602 mcp->_write(IPOLA, (unsigned char )0x00);
jasminealice 22:c024b20a0e2d 603 mcp->_write(IPOLB, (unsigned char )0x00);
jasminealice 22:c024b20a0e2d 604 mcp->_write(DEFVALA, (unsigned char )0xff);
jasminealice 22:c024b20a0e2d 605 mcp->_write(DEFVALB, (unsigned char )0xff);
jasminealice 22:c024b20a0e2d 606 mcp->_write(INTCONA, (unsigned char )0xff);
jasminealice 22:c024b20a0e2d 607 mcp->_write(INTCONB, (unsigned char )0xff);
jasminealice 22:c024b20a0e2d 608 mcp->_write(IOCONA, (unsigned char )0x2);
jasminealice 22:c024b20a0e2d 609 mcp->_write(IOCONB, (unsigned char )0x2);
jasminealice 22:c024b20a0e2d 610 mcp->_write(GPPUA, (unsigned char )0xff);
jasminealice 22:c024b20a0e2d 611 mcp->_write(GPPUB, (unsigned char )0xff);
jasminealice 18:f5824ba95892 612 }
jasminealice 23:bb57966cb776 613 void passZero(){
jasminealice 23:bb57966cb776 614 checkDetector(0);
jasminealice 23:bb57966cb776 615 }
jasminealice 22:c024b20a0e2d 616
jasminealice 23:bb57966cb776 617 void passOne(){
jasminealice 23:bb57966cb776 618 checkDetector(1);
jasminealice 23:bb57966cb776 619 }
jasminealice 23:bb57966cb776 620
jasminealice 23:bb57966cb776 621 void init_interrupt() {
jasminealice 22:c024b20a0e2d 622 // Clear current interrupts
jasminealice 22:c024b20a0e2d 623 mcp->_read(GPIOA);
jasminealice 22:c024b20a0e2d 624 mcp->_read(GPIOB);
jasminealice 22:c024b20a0e2d 625 // Register callbacks
jasminealice 23:bb57966cb776 626 int0.fall(&passZero);
jasminealice 23:bb57966cb776 627 int1.fall(&passOne);
jasminealice 22:c024b20a0e2d 628 // Enable interrupts on MCP
jasminealice 22:c024b20a0e2d 629 mcp->_write(GPINTENA, (unsigned char )0xff);
jasminealice 22:c024b20a0e2d 630 mcp->_write(GPINTENB, (unsigned char )0xff);// Ready to go!
jasminealice 22:c024b20a0e2d 631 }
KwamsC 24:418711ed8c52 632
KwamsC 24:418711ed8c52 633 void init_trains(){
KwamsC 24:418711ed8c52 634 redTrain.changeSpeed(0x40);
KwamsC 24:418711ed8c52 635 silverTrain.changeSpeed(0x40);
KwamsC 24:418711ed8c52 636
KwamsC 24:418711ed8c52 637 vector<int> res;
KwamsC 24:418711ed8c52 638 res.push_back(2);
KwamsC 24:418711ed8c52 639 res.push_back(4);
KwamsC 24:418711ed8c52 640 dect.makeReservation(res); //Run trains counterclockwise and reserve the
KwamsC 24:418711ed8c52 641 vector<int> res2;
KwamsC 24:418711ed8c52 642 res2.push_back(12);
KwamsC 24:418711ed8c52 643 res2.push_back(13);
KwamsC 24:418711ed8c52 644 dect.makeReservation(res2);
KwamsC 24:418711ed8c52 645 }