New project

Dependencies:   mbed TextLCD

Revision:
21:31647d80614f
Parent:
20:32ba0a5f2d02
Child:
22:c024b20a0e2d
--- a/main.cpp	Mon Jun 11 14:50:15 2018 +0000
+++ b/main.cpp	Tue Jun 12 15:02:44 2018 +0000
@@ -4,11 +4,9 @@
 #include "Train.h"
 #include "Switch.h"
 #include "Track.h"
-
-#include <ctime>
+#include "Detector.h"
 
 //Board 1
-
 /*----------------------------------------------------------------------------
 Pin definitions
 *----------------------------------------------------------------------------*/
@@ -35,6 +33,7 @@
 DigitalIn sw2(p30);
 DigitalIn sw3(p11);
 DigitalIn sw4(p12);
+
 //InterruptIn sw1(p5);
 InterruptIn inter0(p13);
 InterruptIn inter1(p14);
@@ -43,18 +42,18 @@
 /*----------------------------------------------------------------------------
 Addresses
 *----------------------------------------------------------------------------*/
-const unsigned int DCCaddress_darkRed = 0x01;
-const unsigned int DCCaddress_lightRed = 0x03;
+const unsigned int DCCaddress_silver = 0x01;
+const unsigned int DCCaddress_red = 0x03;
 const unsigned int DCCaddress_switch = 0x06;
 
 /*----------------------------------------------------------------------------
 Train movement
 *----------------------------------------------------------------------------*/
 //move backwards/reverse
-//const unsigned int DCCinst_reverse = 0x48; //reverse speed
+const unsigned int DCCinst_reverse = 0x48; //reverse speed
 
 //speed dial forward
-//const unsigned int DCCinst_step2 = 0x72; //step 2
+const unsigned int DCCinst_step2 = 0x72; //step 2
 //const unsigned int DCCinst_step4 = 0x73; //step 4
 //const unsigned int DCCinst_step6 = 0x68; //step 6 1/4 speed
 const unsigned int DCCinst_step13 = 0x78; //step 13 1/2 speed
@@ -76,13 +75,22 @@
 /*----------------------------------------------------------------------------
 Function definitions
 *----------------------------------------------------------------------------*/
-void readVoltage();
 bool readDetector(DigitalIn detector);
 bool readSwitch(DigitalIn theSwitch);
-//void DCC_send_command(unsigned int address, unsigned int inst, unsigned int repeat_count); //send command
 void initialize_mcp();
 
 
+//Trains
+Train redTrain(DCCaddress_red, DCCinst_step13, 2);
+Train silverTrain(DCCaddress_silver,DCCinst_step13, 12);
+//Switches
+Switch switch1(DCCaddress_switch,DCCinst_switch1);
+//Switch switch2(DCCaddress_switch,DCCinst_switch2);
+Switch switch3(DCCaddress_switch,DCCinst_switch3);
+Switch switch4(DCCaddress_switch,DCCinst_switch4);
+//Detectors
+Detector dect;
+
 /*----------------------------------------------------------------------------
 Main
 *----------------------------------------------------------------------------*/
@@ -91,18 +99,16 @@
     sw1.fall(&testInterupt);
     inter0.rise(&riseFunction);
     inter1.rise(&riseFunction);*/
-    Train lightRed(DCCaddress_darkRed, DCCinst_step13);
-    //Train darkRed(DCCaddress_darkRed);
-    Switch switch1(DCCaddress_switch,DCCinst_switch1);
-    //Switch switch2(DCCaddress_switch,DCCinst_switch2);
-    Switch switch3(DCCaddress_switch,DCCinst_switch3);
-    Switch switch4(DCCaddress_switch,DCCinst_switch4);
+    
+    initialize_mcp();
+    int res[2] = {2,4};
+    dect.reserveDetector(res); //Run trains counterclockwise and reserve the 
+    int res2[2] = {12,13};
+    dect.reserveDetector(res2);//detectors in front 
 
-    while(1){
-        if(readSwitch(sw1)){
-        //DCC_send_command(DCCaddress_switch,DCCinst_switch3,10); //Make sure to deactivate 2 right after activating it
+    while(1){ 
+        if(readSwitch(sw1)){ //Control switches
         switch1.switchOn();    
-        //lcd.printf("%d",switch1.switchOn());
         lcd.printf("Switch 1 on");
         //switch2.switchOn();  // Need to turn it off immediately!!!
         switch3.switchOn();
@@ -119,15 +125,23 @@
             
         }
             
-        if(readSwitch(sw2)){
-            lightRed.goForward(DCCinst_step13);
+        if(readSwitch(sw2)){ //run train
+            redTrain.goForward();
+            silverTrain.goForward();
         }
         else 
         {
-            lightRed.Stop(DCCinst_stop);
+            redTrain.Stop();
+            silverTrain.Stop();
         }
+        if(!readSwitch(sw3)){ //Change speed
+            if(silverTrain.getSpeed() == DCCinst_step2)
+                silverTrain.changeSpeed(DCCinst_step13);
+            else
+                silverTrain.changeSpeed(DCCinst_step2);
+        
     }
-    
+} 
     
     /*lcd.printf("Start the journey");
     time_t tstart, tend; 
@@ -135,78 +149,172 @@
     int data = mcp->readRegister(0x12);
     lcd.printf("%d", data);
     wait(2);
-    
-    while(1){
-        
-        wait(0.2);
-        if(readSwitch(sw1)){
-            //lcd.cls();
-            //lcd.printf("Forward");
-            tstart = time(0);
-            DCC_send_command(DCCaddress_darkRed,DCCinst_step13,10); // forward half speed train address 3
-            tend = time(0); 
-            lcd.cls();
-            lcd.printf("Time to send command:");
-            lcd.printf("%f", difftime(tend, tstart));
-
-        }else{
-            //lcd.cls();
-            //lcd.printf("Stop");
-            tstart = time(0);
-            DCC_send_command(DCCaddress_darkRed,DCCinst_stop,10); // forward half speed train address 3
-            tend = time(0); 
-            lcd.cls();
-            lcd.printf("Time to send command:");
-            lcd.printf("%f", difftime(tend, tstart));
-        }
-        
-        if(readSwitch(sw2)){
-             
-             DCC_send_command(DCCaddress_switch,DCCinst_switch1,10);
-             myled1 = 1;
-             externalLed1 = 1;
-             DCC_send_command(DCCaddress_switch,DCCinst_deactive_switch,10);
-             myled1 = 0;
-             externalLed1 = 0;
-             
-             DCC_send_command(DCCaddress_switch,DCCinst_switch2,10); //Make sure to deactivate 2 right after activating it
-             myled2 = 1;
-             externalLed2 = 1;
-             DCC_send_command(DCCaddress_switch,DCCinst_deactive_switch,10);
-             myled2 = 0;
-             externalLed2 = 0;
-             
-             DCC_send_command(DCCaddress_switch,DCCinst_switch3,10);
-             myled3 = 1;
-             externalLed3 = 1;
-             DCC_send_command(DCCaddress_switch,DCCinst_deactive_switch,10);
-             myled3 = 0;
-             externalLed3 = 0;
-             
-             DCC_send_command(DCCaddress_switch,DCCinst_switch4,10);
-             myled4 = 1;
-             externalLed4 = 1;
-             DCC_send_command(DCCaddress_switch,DCCinst_deactive_switch,10);
-             myled4 = 0;
-             externalLed4 = 0;
-             
-        }
-    }*/
+    */
 }
 
 /*----------------------------------------------------------------------------
 Functions
 *----------------------------------------------------------------------------*/
 
-/*
-void testInterupt(){
+
+bool testInterupt(){
+    int pos = mcp->readRegister(0x12); 
     lcd.cls();
-    myled = 1;
-    lcd.printf("In interupt function");
-    lcd.printf("%d", sw1.read());
-    myled4 = 0;
+    //Check which train got the interupt
+    Train *temptrain;
+    if(redTrain.checkInterupt(pos)){
+        redTrain.setPosition(pos);
+        temptrain = &redTrain;
+    }
+    else if(silverTrain.checkInterupt(pos)){
+        silverTrain.setPosition(pos);
+        temptrain = &silverTrain;    
+    }
+    else{
+        //WE HAVE A PROBLEM
+        lcd.printf("WRONG DETECTOR DETECTED");
+        return false; 
+    }
+    
+    switch(pos){
+    case 0:
+    case 1:
+    case 2:
+        //IF Clock 2->1
+            //Disable Switch2
+            //Free 3,4,9 
+            //Move forward
+        //IF CC
+            //Check if 4 or 3 is reserved
+                //IF NOT randomize which way to go
+                    //0.3 chance to enable the switch2, reserve 3,9 and go
+                    //0.7 chance to disable switch2, reserve 4 and go
+                //IF 4 is reserved
+                    //Enable switch2, reserve 3,9 and go
+                //IF 3 reserved 
+                    //Disable switch2, reserve 4 and go
+    case 3:
+        //Clock: Goes from 3 to 2
+            //Enable switch2
+            //Reserve 0,1,2, 12, 13
+            //Go forward
+        //Other Clock: Goes from 3->9
+            //disable switch2
+            //free 0,1,2,12,13
+            //Go forward
+    case 4:
+        //IF CC : goes towards 6
+            //free nr 0,1,2,12, 13
+            //Turn of switch3
+            //Check if 6 is reserved
+            //IF yes STOP
+            //else reserve 6,7,8 and go forward
+        //IF Clock goes towards 2
+            //free nr 5,6, 7, 8
+            //Turn of switch2
+            //Check if 2 is reserved
+            //IF yes STOP
+            //else reserve 12,13,0,1,2 go forward
+        
+    case 5:
+        //Clock: Goes from 5->6
+            //Enable switch3
+            //Reserve 6,7,8
+            //Go forward
+        //Other Clock: Goes from 5->11
+            //disable switch3
+            //free 6,7,8
+            //Go forward
+    case 6:
+        //IF CC
+            //Disable switch3
+            //Free 4,5,11
+            //Move forward
+        //IF Clock
+            //Check if 4 or 5 is reserved
+                //IF NOT randomize which way to go
+                    //0.3 chance to enable the switch3, reserve 5,11 and go
+                    //0.7 chance to disable switch3, reserve 4 and go
+                //IF 4 is reserved
+                    //Enable switch3, reserve 5,11 and go
+                //IF 5 reserved 
+                    //Disable switch3, reserve 4 and go
+                    
+    
+    case 7:
+    case 8:
+        //IF Clock 8->7
+            //Disable switch4
+            //Free 3,9,10
+            //Move forward
+        //IF CC
+            //Check if 9 or 10 is reserved
+                //IF NOT randomize which way to go
+                    //0.3 chance to enable the switch4, reserve 3,9 and go
+                    //0.7 chance to disable switch4, reserve 10 and go
+                //IF 10 is reserved
+                    //Enable switch4, reserve 3,9 and go
+                //IF 9 reserved 
+                    //Disable switch4, reserve 10 and go
+    case 9:
+        //Clock: Goes from 9 to 8
+            //Enable switch4
+            //Reserve 6,7,8
+            //Go forward
+        //Other Clock: Goes from 9->3
+            //disable switch4
+            //free 6,7,8
+            //Go forward
+    case 10:
+        //IF CC
+            //free nr 6,7,8,9
+            //Turn off switch1
+            //Check if 12 is reserved
+            //IF yes STOP
+            //else reserve 12,13,0,1,2 and go forward
+        //IF Clock
+            //Free nr 0,1,2,11, 12, 13
+            //Turn off switch4
+            //Check if 8 is reserved
+            //IF yes STOP
+            //else reserve 6,7,8 go forward
+    case 11:
+        //Clock: Goes from 11 to 12
+            //Enable switch1
+            //Reserve 0,1,2, 12, 13
+            //Go forward
+        //Other Clock: Goes from 11->5
+            //disable switch1
+            //free 0,1,2,12,13
+            //Go forward
+    case 12: 
+        //IF CC: 12->13
+            //Disable switch1
+            //Free 5,10,11
+            //Move forward
+        //IF Clock
+            //Check if 11 or 10 is reserved
+                //IF NOT randomize which way to go
+                    //0.3 chance to enable switch1, reserve 5,11 and go
+                    //0.7 chance to disable switch1, reserve 10 and go
+                //IF 10 is reserved
+                    //Enable switch1, reserve 5,11 and go
+                //IF 11 reserved 
+                    //Disable switch1,reserve 10 and go
+    case 13: 
+        
+        lcd.printf("In case ");
+        lcd.printf("%d", pos);
+        break;
+    default:   
+        lcd.printf("Not in a valid case");
+        break; 
+    }
+    
+    return true;
 }
 
+/*
 void testInterupt2(){
     lcd.cls();
     myled = 0;
@@ -246,13 +354,6 @@
     return false;
 }
 
-void readVoltage(){
-        /*float f = Ain.read(); //Read voltage value
-        float Vin = f *3.3;
-        lcd.printf("%.2f", Vin);
-        wait(0.1);
-        lcd.printf("\n");*/
-}
 void initialize_mcp(){
     mcp = new MCP23017(p28, p27, 0x40);
     mcp->reset();     
@@ -271,42 +372,3 @@
     mcp->writeRegister(0x0c, (unsigned char )0x00);     
     mcp->writeRegister(0x0d, (unsigned char )0x00);
 }
-
-/*
-void DCC_send_command(unsigned int address, unsigned int inst, unsigned int repeat_count)
-{
-    unsigned __int64 command = 0x0000000000000000; // __int64 is the 64-bit integer type
-    unsigned __int64 temp_command = 0x0000000000000000;
-    unsigned __int64 prefix = 0x3FFF; // 14 "1" bits needed at start
-    unsigned int error = 0x00; //error byte
-    //calculate error detection byte with xor
-    error = address ^ inst;
-    //combine packet bits in basic DCC format
-    command = (prefix<<28)|(address<<19)|(inst<<10)|((error)<<1)|0x01;
-    //printf("\n\r %llx \n\r",command);
-    int i=0;
-//repeat DCC command lots of times
-    while(i < repeat_count) {
-        temp_command = command;
-//loops through packet bits encoding and sending out digital pulses for a DCC command
-        for (int j=0; j<64; j++) {
-            if((temp_command&0x8000000000000000)==0) { //test packet bit
-                //send data for a "0" bit
-                Track=0;
-                wait_us(100);
-                Track=1;
-                wait_us(100);
-            } else {
-                //send data for a "1"bit
-                Track=0;
-                wait_us(58);
-                Track=1;
-                wait_us(58);
-            }
-            // next bit in packet
-            temp_command = temp_command<<1;
-        }
-        i++;
-    }
-}
-*/
\ No newline at end of file