Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: main.cpp
- Revision:
- 27:9f9cd0df9a79
- Parent:
- 26:f5e71308a13e
- Child:
- 28:1430685f4d12
--- a/main.cpp Wed Jun 20 10:05:45 2018 +0000
+++ b/main.cpp Wed Jun 20 14:38:20 2018 +0000
@@ -42,6 +42,8 @@
//const unsigned int DCCinst_step6 = 0x68; //step 6 1/4 speed
const unsigned int normal_speed = 0x78; //step 13 1/2 speed
+const unsigned int high_speed = 0x7A; //high speed
+
const unsigned int DCCinst_switch1 = 0x81; //Activate switch1
const unsigned int DCCinst_switch2 = 0x82; //Activate switch2
const unsigned int DCCinst_switch3 = 0x84; //Activate switch3
@@ -73,12 +75,12 @@
void init_mcp();
void init_interrupt();
void init_trains();
-void executeCase(int pos);
+void executeCase(int pos, Train* currTrain);
Train& assignTrain(int pos);
//Trains
-Train redTrain(DCCaddress_red, normal_speed, redStartVal);
-Train silverTrain(DCCaddress_silver,normal_speed, silverStartVal);
+Train redTrain(DCCaddress_red, normal_speed, redStartVal, high_speed);
+Train silverTrain(DCCaddress_silver,normal_speed, silverStartVal, normal_speed);
//Switches
Switch switch1(DCCaddress_switch,DCCinst_switch1);
Switch switch2(DCCaddress_switch,DCCinst_switch2);
@@ -106,10 +108,12 @@
}
if(redTrain.checkStop()){ //check if Train stopped
- executeCase(redTrain.getPosition());
+ executeCase(redTrain.getPosition(), &redTrain);
+ wait(5);
}
else if(silverTrain.checkStop()){
- executeCase(silverTrain.getPosition());
+ executeCase(silverTrain.getPosition(), &silverTrain);
+ wait(5);
}
if(redTrain.checkStop() && silverTrain.checkStop()) {
@@ -165,11 +169,11 @@
Train& assignTrain(int pos){
//Check which train got the interupt
- if(redTrain.checkInterupt(pos)){
+ if(redTrain.checkInterupt(pos) && !redTrain.checkStop()){
redTrain.setPosition(pos);
return redTrain;
}
- else if(silverTrain.checkInterupt(pos)){
+ else if(silverTrain.checkInterupt(pos) && !silverTrain.checkStop()){
silverTrain.setPosition(pos);
return silverTrain;
}else{
@@ -182,13 +186,13 @@
}
}
-void executeCase(int pos){
- Train* currTrain = &assignTrain(pos);
+void executeCase(int pos, Train* currTrain){
+
switch(pos){
case 0:{
lcd.printf("at 0");
- currTrain->changeSpeed(normal_speed);
+ currTrain->changeSpeed(currTrain->normalSpeed());
break;}
case 1:{
lcd.printf("at 1");
@@ -198,7 +202,7 @@
lcd.printf("slow down");
}*/
//else
- currTrain->changeSpeed(normal_speed);
+ currTrain->changeSpeed(currTrain->normalSpeed());
break;}
case 2:{
@@ -206,21 +210,19 @@
Stop everytime at 2
*/
lcd.printf("at 2");
- dect.showReservation();
- wait(2);
if(!dect.checkReservation(4) && !dect.checkReservation(3)){ //Check if 4 or 3 is reserved
lcd.cls();
lcd.printf("none is reserved");
int v1 = rand() % 100; //IF NOT randomize which way to go
- if (v1 < 75){ //0.25 chance to enable the switch2, reserve 3,9
+ if (v1 < 25){ //0.25 chance to enable the switch2, reserve 3,9
switch2.switchOn();
dect.makeReservation(junction_39);
}
else { //0.75 chance to disable switch2, reserve 4
switch2.switchOff();
- vector<int> detectors(4);
- dect.makeReservation(detectors);
+ vector<int> detectors(4);
+ dect.makeReservation(detectors);
}
}else if(dect.checkReservation(4)){ //IF 4 is reserved
switch2.switchOn(); //Enable switch2, reserve 3,9
@@ -235,22 +237,19 @@
vector<int> detectors(4);
dect.makeReservation(detectors);
}
- currTrain->changeSpeed(normal_speed); //Go forward
+ currTrain->changeSpeed(currTrain->normalSpeed()); //Go forward
break;}
case 3:{
lcd.printf("at 3");
- dect.showReservation();
currTrain->changeDirection(); //change direction
switch2.switchOff(); //Disable switch2
dect.clearReservation(C_left); //free nr 0,1,2,12,13
- currTrain->changeSpeed(normal_speed); //go forward
+ currTrain->changeSpeed(currTrain->normalSpeed()); //go forward
break;}
case 4:{
lcd.printf("At 4");
- dect.showReservation();
- wait(2);
dect.clearReservation(C_left); //free nr 0,1,2,12,13
switch3.switchOn(); //Turn on switch3
if(dect.checkReservation(6)){ //Check if 6 is reserved
@@ -259,32 +258,28 @@
}
else{
dect.makeReservation(C_right); //else reserve 6,7,8 and go forward
- currTrain->changeSpeed(normal_speed);
+ currTrain->changeSpeed(currTrain->normalSpeed());
}
- dect.showReservation();
break; }
case 5:{
lcd.printf("at 5");
- dect.showReservation();
currTrain->changeDirection(); //change direction
switch3.switchOn(); //Enable switch3
dect.clearReservation(C_right); //free nr 6,7,8
- currTrain->changeSpeed(normal_speed); //go forward
+ currTrain->changeSpeed(currTrain->normalSpeed()); //go forward
break;}
case 6:{
lcd.printf("At 6");
- dect.showReservation();
- wait(2);
if(!currTrain->isClockwise()) //IF CC goes towards 7
{
switch3.switchOn(); //Enable switch3
int arr [3] = {4,5,11};
vector<int> detectors(arr, arr + sizeof(arr) / sizeof(int));
dect.clearReservation(detectors); //free nr 4,5,11
- currTrain->changeSpeed(normal_speed); //Move forward
+ currTrain->changeSpeed(currTrain->normalSpeed()); //Move forward
}
else{
if(dect.checkReservation(5)){ //IF 5 is reserved
@@ -293,43 +288,36 @@
}else{ //else 5 reserved
switch3.switchOff(); //Enable switch3, reserve 4
dect.makeReservation(junction_511);
- currTrain->changeSpeed(normal_speed);
+ currTrain->changeSpeed(currTrain->normalSpeed());
}
- currTrain->changeSpeed(normal_speed); //Go forward
+ currTrain->changeSpeed(currTrain->normalSpeed()); //Go forward
}
break;}
case 7:{
lcd.printf("At 7");
- dect.showReservation();
- wait(2);
- currTrain->changeSpeed(normal_speed);
+ currTrain->changeSpeed(currTrain->normalSpeed());
break;}
case 8:{
lcd.printf("At 8");
- dect.showReservation();
- wait(2);
if(currTrain->isClockwise()) //IF C goes towards 7
{
switch4.switchOff(); //Disable switch4
dect.clearReservation(junction_39); //Free 3,9,10
- currTrain->changeSpeed(normal_speed); //Move forward
+ currTrain->changeSpeed(currTrain->normalSpeed()); //Move forward
}
else{ //IF CC
switch4.switchOff(); //Disable switch4, reserve 10
vector<int> detectors(10);
dect.makeReservation(detectors);
- currTrain->changeSpeed(normal_speed); //Go forward
+ currTrain->changeSpeed(currTrain->normalSpeed()); //Go forward
}
break;}
case 9:{
lcd.printf("at 9");
- dect.showReservation();
- wait(2);
- dect.showReservation();
if(!dect.checkReservation(8)){
switch4.switchOn(); //Enable switch4
dect.makeReservation(C_right); //Reserve 6,7,8
- currTrain->changeSpeed(normal_speed); //Go forward
+ currTrain->changeSpeed(currTrain->normalSpeed()); //Go forward
}
else{
@@ -339,8 +327,6 @@
break;}
case 10:{
lcd.printf("At 10");
- dect.showReservation();
- wait(2);
dect.clearReservation(C_right); //free nr 6, 7, 8, 9
switch1.switchOff(); //Turn off switch1
@@ -351,20 +337,18 @@
else{
lcd.printf("12 not reserved");
dect.makeReservation(C_left);
- currTrain->changeSpeed(normal_speed); //go forward
+ currTrain->changeSpeed(currTrain->normalSpeed()); //go forward
}
break;}
case 11:{
lcd.printf("at 11");
- dect.showReservation();
- wait(2);
if(!dect.checkReservation(12)){
switch1.switchOn(); //Enable switch1
dect.makeReservation(C_left); //Reserve 0,1,2, 12, 13
- currTrain->changeSpeed(normal_speed); //go forward
+ currTrain->changeSpeed(currTrain->normalSpeed()); //go forward
}
else{
currTrain->Stop();
@@ -372,28 +356,25 @@
break;
case 12:
- lcd.printf("at 12");
- dect.showReservation();
- wait(2);
-
+ lcd.printf("at 12");
switch1.switchOff(); //Turn of switch1
int arr2 [3] = {5,10,11};
vector<int> detectors2(arr2, arr2 + sizeof(arr2) / sizeof(int));
dect.clearReservation(detectors2); //free nr 5, 10, 11
- currTrain->changeSpeed(normal_speed); //Move forward
+ currTrain->changeSpeed(currTrain->normalSpeed()); //Move forward
break;}
case 13: {
lcd.printf("at 13");
- currTrain->changeSpeed(normal_speed);
+ currTrain->changeSpeed(currTrain->normalSpeed());
break;}
case 14:{
lcd.printf("at 21");
- currTrain->changeSpeed(normal_speed);
+ currTrain->changeSpeed(slow_speed);
break;}
case 15:{
lcd.printf("at 22");
- currTrain->changeSpeed(normal_speed);
+ currTrain->changeSpeed(currTrain->normalSpeed());
break;}
default: {
lcd.printf("Not in a valid case");
@@ -422,8 +403,8 @@
else
//PROBLEM
lcd.printf("Fail to detect int");
-
- executeCase(pos);
+ Train* currTrain = &assignTrain(pos);
+ executeCase(pos, currTrain);
}
bool readSwitch(DigitalIn theSwitch){
@@ -484,5 +465,4 @@
res2.push_back(12);
//res2.push_back(13);
dect.makeReservation(res2);
- dect.showReservation();
}
\ No newline at end of file
