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:
- 35:cfcfeccb959e
- Parent:
- 34:c9ab2a987734
- Child:
- 36:9428c72bdd58
- Child:
- 37:bb15bea420a3
--- a/main.cpp Wed Jun 13 13:36:14 2018 +0000 +++ b/main.cpp Thu Jun 14 10:14:59 2018 +0000 @@ -3,6 +3,9 @@ #include "MCP23017.h" #include <string> #include <iostream> +#include <vector> + +using namespace std; //mbed DCC Model Train Demo @@ -26,9 +29,9 @@ ///p12 //M0 - p13 -DigitalIn d21(p13); //Sensor right of the station +DigitalIn d21stat(p13); //Sensor right of the station //M1 - p14 -DigitalIn d22(p14); //Sensor left of the station +DigitalIn d22stat(p14); //Sensor left of the station //M2 - p15 DigitalIn station(p15); //Sensor in the middle of the station @@ -130,6 +133,59 @@ //**************** FUNCTIONS FOR DENVER TRAIN ****************// +class Position{ + private: + int position; + vector <int> previous_cw; + vector <int> previous_ccw; + public: + Position(int p){ + position = p; + } + + vector <int> get_prev_cw(){ + return previous_cw; + } + + vector <int> get_prev_ccw(){ + return previous_ccw; + } + + void add_prev_cw(int pos){ + previous_cw.push_back(pos); + }; + + void add_prev_ccw(int pos){ + previous_ccw.push_back(pos); + }; +}; + +Position d0(D0); +Position d1(D1); +Position d2(D2); +Position d3(D3); +Position d4(D4); +Position d5(D5); +Position d6(D6); +Position d7(D7); +Position d8(D8); +Position d9(D9); +Position d10(D10); +Position d11(D11); +Position d12(D12); +Position d13(D13); +Position d21(D21); +Position d22(D22); + +vector<Position> positions; + +//Starting position and orientation of the trains +int DR_train_pos = D4; +bool DR_cw = true; + +int LR_train_pos= D10; +bool LR_cw = true; + /** *Activates the buzzer for 0.5 seconds. @@ -141,6 +197,78 @@ buzz = 0; } +void init_positions(){ + //Initialize array with positions + positions.push_back(d0); + positions.push_back(d1); + positions.push_back(d2); + positions.push_back(d3); + positions.push_back(d4); + positions.push_back(d5); + positions.push_back(d6); + positions.push_back(d7); + positions.push_back(d8); + positions.push_back(d9); + positions.push_back(d10); + positions.push_back(d11); + positions.push_back(d12); + positions.push_back(d13); + positions.push_back(d21); + positions.push_back(d22); + + + d0.add_prev_cw(D1); + d0.add_prev_ccw(D13); + + d1.add_prev_cw(D22); + d1.add_prev_ccw(D0); + + d22.add_prev_cw(D2); + d22.add_prev_ccw(D1); + + d2.add_prev_cw(D21); + d2.add_prev_ccw(D22); + + d21.add_prev_cw(D3); + d21.add_prev_cw(D4); + d21.add_prev_ccw(D2); + + d3.add_prev_cw(D9); + d3.add_prev_ccw(D21); + + d4.add_prev_cw(D6); + d4.add_prev_ccw(D21); + + d5.add_prev_cw(D6); + d5.add_prev_ccw(D11); + + d6.add_prev_cw(D7); + d6.add_prev_ccw(D4); + d6.add_prev_ccw(D5); + + d7.add_prev_cw(D8); + d7.add_prev_ccw(D6); + + d8.add_prev_cw(D7); + d8.add_prev_ccw(D9); + d8.add_prev_ccw(D10); + + d9.add_prev_cw(D3); + d9.add_prev_ccw(D8); + + d10.add_prev_cw(D12); + d10.add_prev_ccw(D8); + + d11.add_prev_cw(D12); + d11.add_prev_ccw(D5); + + d12.add_prev_cw(D13); + d12.add_prev_ccw(D10); + d12.add_prev_ccw(D11); + + d13.add_prev_cw(D0); + d13.add_prev_ccw(D12); +} /** * @@ -185,6 +313,37 @@ return sensor; } +void update_train_pos(int sensor){ + bool found_DR = false; + bool found_LR = false; + + Position pos = positions[sensor]; + for(int i = 0; i<pos.get_prev_cw().size();i++){ + int prev = pos.get_prev_cw()[i]; + if(DR_train_pos == prev){ + found_DR = true; + DR_train_pos = prev; //We update the position of the train + } + if(LR_train_pos == prev){ + found_LR = true; + LR_train_pos = prev; //We update the position of the train + } + } + + if(found_DR){ + lcd.cls(); + lcd.printf("DR is at D%d",DR_train_pos); + } + if(found_LR){ + lcd.cls(); + lcd.printf("LR is at D%d",LR_train_pos); + } + if(!found_DR && !found_LR){ + lcd.cls(); + lcd.printf("No train before :("); + } +} + /** * *Method to catch interrupts 0 @@ -198,8 +357,11 @@ lcd.cls(); lcd.printf("int0 0x%x \n Sensor: %d",sensor_data,sensor); + update_train_pos(sensor); } + + /** * *Method to catch interrupts 1 @@ -212,6 +374,8 @@ int sensor = get_sensor(sensor_data,1); lcd.cls(); lcd.printf("int1 0x%x \n Sensor: %d",sensor_data,sensor); + + update_train_pos(sensor); } @@ -412,6 +576,7 @@ initialize_mcp(); //mcp initialization for interrupts before train running init(); + init_positions(); //Train light routine to start running DCC_send_command(DCCaddressDR,DCC_func_lighton,200); // turn light on full