Denver / Mbed 2 deprecated denver_train_proj

Dependencies:   mbed TextLCD

Committer:
carlosperales95
Date:
Wed Jun 27 09:56:03 2018 +0000
Revision:
72:a1bd95af46b8
Parent:
71:9a303d90c9b8
Child:
73:1bf7f6a38fde
error fix

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mglmx 0:4d06a6a8e785 1 #include "mbed.h"
mglmx 3:fe7010b693a0 2 #include "TextLCD.h"
mglmx 18:aa43bb62e60f 3 #include "MCP23017.h"
mglmx 22:e4153ca757dd 4 #include <string>
mglmx 22:e4153ca757dd 5 #include <iostream>
mglmx 35:cfcfeccb959e 6 #include <vector>
mglmx 62:6fc0c683cb02 7 #include <fstream>
mglmx 62:6fc0c683cb02 8 #include <sstream>
mglmx 35:cfcfeccb959e 9
mglmx 35:cfcfeccb959e 10 using namespace std;
mglmx 18:aa43bb62e60f 11
carlosperales95 65:8fd4046c6540 12
carlosperales95 7:e2b8461d4f05 13 /******PINS AND DECLARATIONS*******/
carlosperales95 7:e2b8461d4f05 14
carlosperales95 25:a42a1ed4d8e9 15 //------PINS
mglmx 21:e6f1649add39 16
mglmx 21:e6f1649add39 17 //SWITCHES p5 - p8
mglmx 21:e6f1649add39 18 DigitalIn switch1(p5);
mglmx 21:e6f1649add39 19 DigitalIn switch2(p6);
mglmx 21:e6f1649add39 20 DigitalIn switch3(p7);
mglmx 21:e6f1649add39 21 DigitalIn switch4(p8);
carlosperales95 7:e2b8461d4f05 22
carlosperales95 10:2088b1935a93 23 //RAIL SENSORS - INT0,INT1
carlosperales95 7:e2b8461d4f05 24 //INT0 - p9
mglmx 18:aa43bb62e60f 25 InterruptIn int0(p9);
carlosperales95 7:e2b8461d4f05 26 //INT1 - p10
mglmx 18:aa43bb62e60f 27 InterruptIn int1(p10);
carlosperales95 7:e2b8461d4f05 28
carlosperales95 7:e2b8461d4f05 29 ///p11
carlosperales95 7:e2b8461d4f05 30 ///p12
carlosperales95 12:e914ca5cd44b 31
carlosperales95 7:e2b8461d4f05 32 //M0 - p13
mglmx 35:cfcfeccb959e 33 DigitalIn d21stat(p13); //Sensor right of the station
carlosperales95 7:e2b8461d4f05 34 //M1 - p14
mglmx 35:cfcfeccb959e 35 DigitalIn d22stat(p14); //Sensor left of the station
carlosperales95 7:e2b8461d4f05 36 //M2 - p15
carlosperales95 29:559eb2164488 37 DigitalIn station(p15); //Sensor in the middle of the station
carlosperales95 12:e914ca5cd44b 38
carlosperales95 7:e2b8461d4f05 39 //p16
carlosperales95 50:ee4398ee44be 40 //ENABLE - p17
carlosperales95 50:ee4398ee44be 41 DigitalOut enable(p17);
carlosperales95 12:e914ca5cd44b 42
carlosperales95 11:021210c59a95 43 //BUZZER - p18
carlosperales95 11:021210c59a95 44 DigitalOut buzz(p18); // buzz=0 doesn't beep, buzz=1 beeps
carlosperales95 7:e2b8461d4f05 45
carlosperales95 7:e2b8461d4f05 46 //POTENTIOMETER - p19
carlosperales95 13:dbf1ead12cee 47 AnalogIn pot(p19); //Gives float value pot.read(). Convert analog input to V with f*3.3
carlosperales95 7:e2b8461d4f05 48
carlosperales95 7:e2b8461d4f05 49 //DAT - p20
mglmx 3:fe7010b693a0 50 DigitalOut Track(p20); //Digital output bit used to drive track power via H-bridge
carlosperales95 7:e2b8461d4f05 51
carlosperales95 7:e2b8461d4f05 52 //LCD SCREEN - p21, p22, p23, p24, p25, p26
carlosperales95 11:021210c59a95 53 TextLCD lcd(p22,p21,p23,p24,p25,p26); // RS, E, A4, A5, A6, A7 // ldc.cls() to clear and printf(String up to 16char)
carlosperales95 7:e2b8461d4f05 54
carlosperales95 7:e2b8461d4f05 55 ///p27
mglmx 62:6fc0c683cb02 56 ///p28
mglmx 33:24ce12dec157 57 I2C i2c(p28,p27);
carlosperales95 7:e2b8461d4f05 58
carlosperales95 7:e2b8461d4f05 59 //LED1 - p29
mglmx 3:fe7010b693a0 60 DigitalOut redled(p29);
carlosperales95 7:e2b8461d4f05 61 //LED2 - p30
mglmx 3:fe7010b693a0 62 DigitalOut greenled(p30);
carlosperales95 7:e2b8461d4f05 63
carlosperales95 24:1d71dd8778c4 64 //MBED LEDS
mglmx 18:aa43bb62e60f 65 DigitalOut led1(LED1);
mglmx 18:aa43bb62e60f 66 DigitalOut led2(LED2);
mglmx 18:aa43bb62e60f 67 DigitalOut led3(LED3);
carlosperales95 69:609c69e91b4e 68 DigitalOut led4(LED4);
mglmx 16:2a2da0e67793 69
mglmx 16:2a2da0e67793 70 //MCP
mglmx 16:2a2da0e67793 71 MCP23017 *mcp;
carlosperales95 12:e914ca5cd44b 72
carlosperales95 65:8fd4046c6540 73
carlosperales95 24:1d71dd8778c4 74
carlosperales95 25:a42a1ed4d8e9 75 //------GLOBAL VARS
carlosperales95 25:a42a1ed4d8e9 76
carlosperales95 38:b9aba3715682 77 //......SENSOR POSITION VARS
carlosperales95 38:b9aba3715682 78
carlosperales95 45:d589318238bf 79 //Definition of D sensors, will be interpreted as ints for the program's logic
mglmx 34:c9ab2a987734 80 #define D0 0
mglmx 34:c9ab2a987734 81 #define D1 1
mglmx 34:c9ab2a987734 82 #define D2 2
mglmx 34:c9ab2a987734 83 #define D3 3
mglmx 34:c9ab2a987734 84 #define D4 4
mglmx 34:c9ab2a987734 85 #define D5 5
mglmx 34:c9ab2a987734 86 #define D6 6
mglmx 34:c9ab2a987734 87 #define D7 7
mglmx 34:c9ab2a987734 88 #define D8 8
mglmx 34:c9ab2a987734 89 #define D9 9
mglmx 34:c9ab2a987734 90 #define D10 10
mglmx 34:c9ab2a987734 91 #define D11 11
mglmx 34:c9ab2a987734 92 #define D12 12
mglmx 34:c9ab2a987734 93 #define D13 13
mglmx 34:c9ab2a987734 94 #define D21 14
mglmx 34:c9ab2a987734 95 #define D22 15
mglmx 34:c9ab2a987734 96
carlosperales95 65:8fd4046c6540 97 //Definition of the different train speeds, will be interpreted as ints for the program's logic
mglmx 57:ee5da8a011e0 98 #define STOP 0
mglmx 57:ee5da8a011e0 99 #define SLOW 1
mglmx 57:ee5da8a011e0 100 #define MEDIUM 2
mglmx 57:ee5da8a011e0 101 #define FAST 3
mglmx 57:ee5da8a011e0 102 #define FULL 4
mglmx 57:ee5da8a011e0 103 #define R_MEDIUM 5
mglmx 55:aa3baa01f43d 104
mglmx 55:aa3baa01f43d 105
mglmx 62:6fc0c683cb02 106
carlosperales95 38:b9aba3715682 107 /**
carlosperales95 38:b9aba3715682 108 *
carlosperales95 38:b9aba3715682 109 *Position class.
carlosperales95 38:b9aba3715682 110 *
carlosperales95 38:b9aba3715682 111 *@position -
carlosperales95 38:b9aba3715682 112 *@previous_cw -
carlosperales95 38:b9aba3715682 113 *@previous_ccw -
carlosperales95 38:b9aba3715682 114 *
carlosperales95 38:b9aba3715682 115 *Position(int) -
carlosperales95 38:b9aba3715682 116 *
carlosperales95 38:b9aba3715682 117 *get_pos() -
carlosperales95 38:b9aba3715682 118 *get_prev_cw() -
mglmx 62:6fc0c683cb02 119 *get_ccw() -
carlosperales95 38:b9aba3715682 120 *add_prev_cw() -
mglmx 62:6fc0c683cb02 121 *add_ccw() -
carlosperales95 38:b9aba3715682 122 *
carlosperales95 38:b9aba3715682 123 **/
mglmx 35:cfcfeccb959e 124 class Position{
mglmx 35:cfcfeccb959e 125 private:
mglmx 35:cfcfeccb959e 126 int position;
mglmx 35:cfcfeccb959e 127 vector <int> previous_cw;
mglmx 35:cfcfeccb959e 128 vector <int> previous_ccw;
mglmx 35:cfcfeccb959e 129 public:
mglmx 35:cfcfeccb959e 130 Position(int p){
mglmx 35:cfcfeccb959e 131 position = p;
mglmx 35:cfcfeccb959e 132 }
mglmx 36:9428c72bdd58 133
mglmx 36:9428c72bdd58 134 int get_pos(){
mglmx 36:9428c72bdd58 135 return position;
mglmx 36:9428c72bdd58 136 }
mglmx 41:4fa6aa29d1ed 137
mglmx 41:4fa6aa29d1ed 138 vector<int> get_next_cw(){
mglmx 41:4fa6aa29d1ed 139 return previous_ccw;
mglmx 41:4fa6aa29d1ed 140 }
mglmx 41:4fa6aa29d1ed 141
mglmx 41:4fa6aa29d1ed 142 vector<int> get_next_ccw(){
mglmx 41:4fa6aa29d1ed 143 return previous_cw;
mglmx 41:4fa6aa29d1ed 144 }
carlosperales95 25:a42a1ed4d8e9 145
mglmx 35:cfcfeccb959e 146 vector <int> get_prev_cw(){
mglmx 35:cfcfeccb959e 147 return previous_cw;
mglmx 35:cfcfeccb959e 148 }
mglmx 35:cfcfeccb959e 149
mglmx 35:cfcfeccb959e 150 vector <int> get_prev_ccw(){
mglmx 35:cfcfeccb959e 151 return previous_ccw;
mglmx 35:cfcfeccb959e 152 }
mglmx 35:cfcfeccb959e 153
mglmx 35:cfcfeccb959e 154 void add_prev_cw(int pos){
mglmx 35:cfcfeccb959e 155 previous_cw.push_back(pos);
mglmx 35:cfcfeccb959e 156 };
mglmx 35:cfcfeccb959e 157
mglmx 35:cfcfeccb959e 158 void add_prev_ccw(int pos){
mglmx 35:cfcfeccb959e 159 previous_ccw.push_back(pos);
mglmx 35:cfcfeccb959e 160 };
mglmx 35:cfcfeccb959e 161 };
mglmx 35:cfcfeccb959e 162
carlosperales95 45:d589318238bf 163
mglmx 41:4fa6aa29d1ed 164 //Creating a vector with all the positions.
mglmx 41:4fa6aa29d1ed 165 vector<Position> positions;
mglmx 41:4fa6aa29d1ed 166
carlosperales95 45:d589318238bf 167
carlosperales95 45:d589318238bf 168 /**
carlosperales95 45:d589318238bf 169 *
mglmx 57:ee5da8a011e0 170 *Method to send DCC commands to train and switches.
mglmx 57:ee5da8a011e0 171 *
mglmx 57:ee5da8a011e0 172 *@address - (HEX)Address where the commands will be sent
mglmx 57:ee5da8a011e0 173 *@inst - (HEX)Number of instruction that will be commanded
mglmx 57:ee5da8a011e0 174 *@repeat_count - Number of times the command will be sent
mglmx 57:ee5da8a011e0 175 *
mglmx 57:ee5da8a011e0 176 **/
mglmx 57:ee5da8a011e0 177 void DCC_send_command(unsigned int address, unsigned int inst, unsigned int repeat_count){
mglmx 57:ee5da8a011e0 178
mglmx 57:ee5da8a011e0 179 unsigned __int64 command = 0x0000000000000000; // __int64 is the 64-bit integer type
mglmx 57:ee5da8a011e0 180 unsigned __int64 temp_command = 0x0000000000000000;
mglmx 57:ee5da8a011e0 181 unsigned __int64 prefix = 0x3FFF; // 14 "1" bits needed at start
mglmx 57:ee5da8a011e0 182 unsigned int error = 0x00; //error byte
mglmx 57:ee5da8a011e0 183
mglmx 57:ee5da8a011e0 184 //calculate error detection byte with xor
mglmx 57:ee5da8a011e0 185 error = address ^ inst;
mglmx 57:ee5da8a011e0 186
mglmx 57:ee5da8a011e0 187 //combine packet bits in basic DCC format
mglmx 57:ee5da8a011e0 188 command = (prefix<<28)|(address<<19)|(inst<<10)|((error)<<1)|0x01;
mglmx 57:ee5da8a011e0 189 //printf("\n\r %llx \n\r",command);
mglmx 57:ee5da8a011e0 190
mglmx 57:ee5da8a011e0 191 int i=0;
mglmx 57:ee5da8a011e0 192 //repeat DCC command lots of times
mglmx 57:ee5da8a011e0 193 while(i < repeat_count) {
mglmx 57:ee5da8a011e0 194
mglmx 57:ee5da8a011e0 195 temp_command = command;
mglmx 57:ee5da8a011e0 196 //loops through packet bits encoding and sending out digital pulses for a DCC command
mglmx 57:ee5da8a011e0 197 for (int j=0; j<64; j++) {
mglmx 57:ee5da8a011e0 198
mglmx 57:ee5da8a011e0 199 if((temp_command&0x8000000000000000)==0) {
mglmx 57:ee5da8a011e0 200 //test packet bit
mglmx 57:ee5da8a011e0 201 //send data for a "0" bit
mglmx 57:ee5da8a011e0 202 Track=0;
mglmx 57:ee5da8a011e0 203 wait_us(100);
mglmx 57:ee5da8a011e0 204 Track=1;
mglmx 57:ee5da8a011e0 205 wait_us(100);
mglmx 57:ee5da8a011e0 206 //printf("0011");
mglmx 57:ee5da8a011e0 207 }else{
mglmx 57:ee5da8a011e0 208
mglmx 57:ee5da8a011e0 209 //send data for a "1"bit
mglmx 57:ee5da8a011e0 210 Track=0;
mglmx 57:ee5da8a011e0 211 wait_us(58);
mglmx 57:ee5da8a011e0 212 Track=1;
mglmx 57:ee5da8a011e0 213 wait_us(58);
mglmx 57:ee5da8a011e0 214 //printf("01");
mglmx 57:ee5da8a011e0 215 }
mglmx 57:ee5da8a011e0 216 // next bit in packet
mglmx 57:ee5da8a011e0 217 temp_command = temp_command<<1;
mglmx 57:ee5da8a011e0 218 }
mglmx 57:ee5da8a011e0 219 i++;
mglmx 57:ee5da8a011e0 220 }
mglmx 57:ee5da8a011e0 221 }
mglmx 57:ee5da8a011e0 222
mglmx 57:ee5da8a011e0 223 /**
mglmx 57:ee5da8a011e0 224 *Defining areas for train detection and collision logic.
mglmx 57:ee5da8a011e0 225 *area_A_arr/area_B_arr - Arrays that hold the Dsensors for each area, used to initialize the vectors.
mglmx 57:ee5da8a011e0 226 *area_A/area_B - Vectors that hold the different sensors of the corresponding areas of the track.
mglmx 57:ee5da8a011e0 227 **/
mglmx 57:ee5da8a011e0 228 int area_A_arr[] = {D21,D2,D22,D1,D0,D13,D12};
mglmx 57:ee5da8a011e0 229 int area_B_arr[] = {D6,D7,D8};
mglmx 57:ee5da8a011e0 230
mglmx 57:ee5da8a011e0 231 const vector<int> area_A(area_A_arr,area_A_arr + sizeof(area_A_arr) / sizeof(int));
mglmx 57:ee5da8a011e0 232 const vector<int> area_B(area_B_arr,area_B_arr + sizeof(area_B_arr) / sizeof(int));
mglmx 57:ee5da8a011e0 233
mglmx 57:ee5da8a011e0 234
mglmx 62:6fc0c683cb02 235
mglmx 57:ee5da8a011e0 236 /**
mglmx 57:ee5da8a011e0 237 *
carlosperales95 45:d589318238bf 238 *Train class.
carlosperales95 45:d589318238bf 239 *
carlosperales95 45:d589318238bf 240 *@position -
carlosperales95 45:d589318238bf 241 *@going_cw -
carlosperales95 45:d589318238bf 242 *
carlosperales95 45:d589318238bf 243 *Train(int, bool) -
mglmx 62:6fc0c683cb02 244 *Train(bool) -
carlosperales95 58:b60db1092088 245 *
mglmx 62:6fc0c683cb02 246 *Vector get_next_sensors() -
carlosperales95 58:b60db1092088 247 *set_position(int) -
carlosperales95 58:b60db1092088 248 *set_goes_cw(bool) -
carlosperales95 45:d589318238bf 249 *Position get_position() -
carlosperales95 45:d589318238bf 250 *Int get_position_number() -
carlosperales95 45:d589318238bf 251 *Bool goes_cw() -
carlosperales95 45:d589318238bf 252 *
carlosperales95 45:d589318238bf 253 **/
mglmx 41:4fa6aa29d1ed 254 class Train{
carlosperales95 45:d589318238bf 255
mglmx 62:6fc0c683cb02 256 private:
mglmx 62:6fc0c683cb02 257
mglmx 57:ee5da8a011e0 258 unsigned int train_address; //stop the train
mglmx 41:4fa6aa29d1ed 259 Position *position;
mglmx 41:4fa6aa29d1ed 260 bool going_cw;
mglmx 57:ee5da8a011e0 261 int speed;
carlosperales95 45:d589318238bf 262
mglmx 41:4fa6aa29d1ed 263 public:
mglmx 41:4fa6aa29d1ed 264 Train(int pos, bool cw){
carlosperales95 45:d589318238bf 265
mglmx 41:4fa6aa29d1ed 266 position = &positions[pos];
mglmx 41:4fa6aa29d1ed 267 going_cw = cw;
mglmx 41:4fa6aa29d1ed 268 }
carlosperales95 45:d589318238bf 269
mglmx 57:ee5da8a011e0 270 /**
mglmx 62:6fc0c683cb02 271 * Contructor that takes the address of the train and the speed with default value MEDIUM.
mglmx 62:6fc0c683cb02 272 */
mglmx 62:6fc0c683cb02 273 Train(unsigned int address, int s=MEDIUM){
mglmx 57:ee5da8a011e0 274 train_address = address;
mglmx 57:ee5da8a011e0 275 speed = s;
mglmx 57:ee5da8a011e0 276 }
mglmx 62:6fc0c683cb02 277
mglmx 62:6fc0c683cb02 278 Train(bool cw){ going_cw = cw; }
mglmx 62:6fc0c683cb02 279
mglmx 41:4fa6aa29d1ed 280 vector<int> get_next_sensors(){
mglmx 41:4fa6aa29d1ed 281
mglmx 41:4fa6aa29d1ed 282 //Checking direction
mglmx 62:6fc0c683cb02 283 if(going_cw){
mglmx 62:6fc0c683cb02 284
mglmx 62:6fc0c683cb02 285 return position->get_next_cw();
mglmx 62:6fc0c683cb02 286 }else{
mglmx 62:6fc0c683cb02 287
mglmx 62:6fc0c683cb02 288 return position->get_next_ccw();
mglmx 62:6fc0c683cb02 289 }
mglmx 41:4fa6aa29d1ed 290 }
mglmx 41:4fa6aa29d1ed 291
mglmx 57:ee5da8a011e0 292 void set_speed(int s){
mglmx 57:ee5da8a011e0 293 speed = s;
mglmx 57:ee5da8a011e0 294 }
mglmx 57:ee5da8a011e0 295
mglmx 57:ee5da8a011e0 296 /**
mglmx 57:ee5da8a011e0 297 * Sends a DCC command to the train with the speed indicaed by the attribute speed
mglmx 57:ee5da8a011e0 298 * The number of times the command is sent can be indicated as an optional parameter. Default value is 1.
mglmx 57:ee5da8a011e0 299 */
mglmx 62:6fc0c683cb02 300 void run(int times=1){
mglmx 57:ee5da8a011e0 301
mglmx 57:ee5da8a011e0 302 const unsigned int DCCinst_forward_slow = 0x66; //forward slow speed (step 9)
mglmx 57:ee5da8a011e0 303 const unsigned int DCCinst_forward_medium = 0x68; //forward half speed
mglmx 57:ee5da8a011e0 304 const unsigned int DCCinst_forward_fast = 0x6C; //Forward fast speed (step 22)
mglmx 57:ee5da8a011e0 305 const unsigned int DCCinst_forward_full = 0x6F; //Forward full speed
mglmx 57:ee5da8a011e0 306 const unsigned int DCCinst_reverse_medium = 0x48; //reverse half speed
mglmx 57:ee5da8a011e0 307 const unsigned int DCCinst_stop = 0x50; //stop the train
mglmx 57:ee5da8a011e0 308
mglmx 57:ee5da8a011e0 309 switch(speed){
mglmx 62:6fc0c683cb02 310 case STOP:
mglmx 57:ee5da8a011e0 311 DCC_send_command(train_address, DCCinst_stop,times);
mglmx 57:ee5da8a011e0 312 break;
mglmx 57:ee5da8a011e0 313 case SLOW:
mglmx 57:ee5da8a011e0 314 DCC_send_command(train_address, DCCinst_forward_slow,times);
mglmx 57:ee5da8a011e0 315 break;
mglmx 57:ee5da8a011e0 316 case MEDIUM:
mglmx 57:ee5da8a011e0 317 DCC_send_command(train_address, DCCinst_forward_medium,times);
mglmx 57:ee5da8a011e0 318 break;
mglmx 57:ee5da8a011e0 319 case FAST:
mglmx 57:ee5da8a011e0 320 DCC_send_command(train_address, DCCinst_forward_fast,times);
mglmx 57:ee5da8a011e0 321 break;
mglmx 57:ee5da8a011e0 322 case FULL:
mglmx 57:ee5da8a011e0 323 DCC_send_command(train_address, DCCinst_forward_full,times);
mglmx 57:ee5da8a011e0 324 break;
mglmx 57:ee5da8a011e0 325 case R_MEDIUM:
mglmx 57:ee5da8a011e0 326 DCC_send_command(train_address, DCCinst_reverse_medium,times);
mglmx 57:ee5da8a011e0 327 break;
mglmx 57:ee5da8a011e0 328 }
mglmx 57:ee5da8a011e0 329 }
mglmx 57:ee5da8a011e0 330
mglmx 41:4fa6aa29d1ed 331 void set_position(int pos){
carlosperales95 45:d589318238bf 332
mglmx 41:4fa6aa29d1ed 333 position = &positions[pos]; //Taking the new position from the positions vector
mglmx 41:4fa6aa29d1ed 334 }
mglmx 41:4fa6aa29d1ed 335
mglmx 41:4fa6aa29d1ed 336 void set_goes_cw(bool cw){
carlosperales95 45:d589318238bf 337
mglmx 41:4fa6aa29d1ed 338 going_cw = cw;
mglmx 41:4fa6aa29d1ed 339 }
mglmx 41:4fa6aa29d1ed 340
mglmx 41:4fa6aa29d1ed 341 Position get_position(){
carlosperales95 45:d589318238bf 342
mglmx 41:4fa6aa29d1ed 343 return *position;
mglmx 41:4fa6aa29d1ed 344 }
mglmx 41:4fa6aa29d1ed 345
mglmx 41:4fa6aa29d1ed 346 int get_position_number(){
carlosperales95 45:d589318238bf 347
mglmx 41:4fa6aa29d1ed 348 return position->get_pos();
mglmx 41:4fa6aa29d1ed 349 }
mglmx 41:4fa6aa29d1ed 350
mglmx 41:4fa6aa29d1ed 351 bool goes_cw(){
carlosperales95 45:d589318238bf 352
mglmx 41:4fa6aa29d1ed 353 return going_cw;
mglmx 41:4fa6aa29d1ed 354 }
mglmx 57:ee5da8a011e0 355
mglmx 62:6fc0c683cb02 356
mglmx 57:ee5da8a011e0 357 /**
mglmx 57:ee5da8a011e0 358 *
mglmx 57:ee5da8a011e0 359 *Checks if the element exists within the vector.
mglmx 57:ee5da8a011e0 360 *
mglmx 57:ee5da8a011e0 361 *@v - The vector (of ints) the method will go through.
mglmx 57:ee5da8a011e0 362 *@element - The element the method will look for.
mglmx 57:ee5da8a011e0 363 *
mglmx 57:ee5da8a011e0 364 **/
mglmx 57:ee5da8a011e0 365 bool in_vector(vector<int>v,int element){
mglmx 57:ee5da8a011e0 366
mglmx 57:ee5da8a011e0 367 bool exist = false;
mglmx 57:ee5da8a011e0 368
mglmx 57:ee5da8a011e0 369 for(int i=0; i< v.size(); i++){
mglmx 57:ee5da8a011e0 370
mglmx 57:ee5da8a011e0 371 if(v[i] == element){
mglmx 57:ee5da8a011e0 372
mglmx 57:ee5da8a011e0 373 exist = true;
mglmx 57:ee5da8a011e0 374 }
mglmx 57:ee5da8a011e0 375 }
mglmx 57:ee5da8a011e0 376 return exist;
mglmx 57:ee5da8a011e0 377 }
mglmx 57:ee5da8a011e0 378
mglmx 57:ee5da8a011e0 379 bool is_in_A(){
mglmx 62:6fc0c683cb02 380 return in_vector(area_A,get_position_number());
mglmx 57:ee5da8a011e0 381
mglmx 57:ee5da8a011e0 382 }
mglmx 57:ee5da8a011e0 383
mglmx 57:ee5da8a011e0 384 bool is_in_B(){
mglmx 57:ee5da8a011e0 385
mglmx 62:6fc0c683cb02 386 return in_vector(area_B,get_position_number());
mglmx 57:ee5da8a011e0 387 }
mglmx 41:4fa6aa29d1ed 388 };
mglmx 41:4fa6aa29d1ed 389
carlosperales95 45:d589318238bf 390
carlosperales95 38:b9aba3715682 391 //Creation of all the positions. One for every sensor on the table - Position name(mapping)
mglmx 35:cfcfeccb959e 392 Position d0(D0);
mglmx 35:cfcfeccb959e 393 Position d1(D1);
mglmx 35:cfcfeccb959e 394 Position d2(D2);
mglmx 35:cfcfeccb959e 395 Position d3(D3);
mglmx 35:cfcfeccb959e 396 Position d4(D4);
mglmx 35:cfcfeccb959e 397 Position d5(D5);
mglmx 35:cfcfeccb959e 398 Position d6(D6);
mglmx 35:cfcfeccb959e 399 Position d7(D7);
mglmx 35:cfcfeccb959e 400 Position d8(D8);
mglmx 35:cfcfeccb959e 401 Position d9(D9);
mglmx 35:cfcfeccb959e 402 Position d10(D10);
mglmx 35:cfcfeccb959e 403 Position d11(D11);
mglmx 35:cfcfeccb959e 404 Position d12(D12);
mglmx 35:cfcfeccb959e 405 Position d13(D13);
mglmx 35:cfcfeccb959e 406 Position d21(D21);
mglmx 35:cfcfeccb959e 407 Position d22(D22);
mglmx 35:cfcfeccb959e 408
mglmx 43:346a1f4144cd 409
carlosperales95 25:a42a1ed4d8e9 410 //01DCSSSS for speed, D is direction (fwd=1 and rev=0), C is speed(SSSSC) LSB
carlosperales95 25:a42a1ed4d8e9 411 const unsigned int DCCinst_forward = 0x68; //forward half speed
mglmx 51:badef9fc202f 412 const unsigned int DCCinst_forward_slow = 0x66; //forward slow speed (step 9)
mglmx 51:badef9fc202f 413 const unsigned int DCCinst_forward_fast = 0x6C; //Forward fast speed (step 22)
mglmx 51:badef9fc202f 414 const unsigned int DCCinst_forward_full = 0x6F; //Forward full speed
carlosperales95 25:a42a1ed4d8e9 415 const unsigned int DCCinst_reverse = 0x48; //reverse half speed
carlosperales95 25:a42a1ed4d8e9 416 const unsigned int DCCinst_stop = 0x50; //stop the train
carlosperales95 25:a42a1ed4d8e9 417
carlosperales95 25:a42a1ed4d8e9 418 //100DDDDD for basic headlight functions
carlosperales95 25:a42a1ed4d8e9 419 const unsigned int DCC_func_lighton = 0x90; //F0 turns on headlight function
carlosperales95 25:a42a1ed4d8e9 420 const unsigned int DCC_func_dimlight = 0x91; //F0 + F1 dims headlight
carlosperales95 25:a42a1ed4d8e9 421
carlosperales95 25:a42a1ed4d8e9 422
carlosperales95 25:a42a1ed4d8e9 423 //.....SWITCH COMMAND VARS
carlosperales95 25:a42a1ed4d8e9 424
carlosperales95 25:a42a1ed4d8e9 425 const unsigned int SWBaddress = 0x06; //Address for switch box
carlosperales95 25:a42a1ed4d8e9 426
carlosperales95 25:a42a1ed4d8e9 427 //100DDDDD where DDDDD is the switch command and 100 is constant:
carlosperales95 25:a42a1ed4d8e9 428
carlosperales95 25:a42a1ed4d8e9 429 //00001(F1 active)-00010(F2 active)-00100(F3 active)-01000(F4 active)
carlosperales95 25:a42a1ed4d8e9 430 //Example - 111111 0 00000101 0 10000000 0 10000101 1 - idle
carlosperales95 25:a42a1ed4d8e9 431 const unsigned int SWBidle = 0x80; //IDLE - Flip last activated SW.
carlosperales95 25:a42a1ed4d8e9 432 const unsigned int SWBflip_1 = 0x81; //Flip SW1
carlosperales95 25:a42a1ed4d8e9 433 const unsigned int SWBflip_2 = 0x82; //Flip SW2
carlosperales95 25:a42a1ed4d8e9 434 const unsigned int SWBflip_3 = 0x84; //Flip SW3
carlosperales95 25:a42a1ed4d8e9 435 const unsigned int SWBflip_4 = 0x88; //Flip SW4
carlosperales95 25:a42a1ed4d8e9 436
carlosperales95 40:9acc1341456a 437
mglmx 57:ee5da8a011e0 438 //.....DCC TRAIN COMMAND VARS
mglmx 57:ee5da8a011e0 439
mglmx 57:ee5da8a011e0 440 //typical out of box default engine DCC address is 3 (at least for Bachmann trains)
mglmx 57:ee5da8a011e0 441 //Note: A DCC controller can reprogram the address whenever needed
mglmx 57:ee5da8a011e0 442 const unsigned int DCCaddressDR = 0x01; //Address for train 1 DARK-RED
mglmx 57:ee5da8a011e0 443 const unsigned int DCCaddressLR = 0x03; //Address for train 3 LIGHT-RED
mglmx 57:ee5da8a011e0 444
carlosperales95 45:d589318238bf 445 /**
carlosperales95 45:d589318238bf 446 *Creation of 2 Train objects.
carlosperales95 45:d589318238bf 447 *Using boolean constructor because position initialization will be done after initializing all position vectors.
carlosperales95 45:d589318238bf 448 *DR_train = Dark Red train - LR_train = Light Red Train
carlosperales95 45:d589318238bf 449 **/
mglmx 66:45a90a945983 450 Train DR_train(DCCaddressDR,MEDIUM);
mglmx 57:ee5da8a011e0 451 Train LR_train(DCCaddressLR,MEDIUM);
mglmx 43:346a1f4144cd 452
carlosperales95 47:e992a129ef44 453 //possibility of an array having {dr_train, lr_train}? for reuse and modularity of functions
carlosperales95 47:e992a129ef44 454
carlosperales95 69:609c69e91b4e 455 int speedcheck = 0;
carlosperales95 65:8fd4046c6540 456
mglmx 62:6fc0c683cb02 457
mglmx 18:aa43bb62e60f 458
carlosperales95 38:b9aba3715682 459 //**************** FUNCTIONS FOR DENVER TRAIN ****************//
carlosperales95 38:b9aba3715682 460
carlosperales95 38:b9aba3715682 461
mglmx 22:e4153ca757dd 462 /**
carlosperales95 45:d589318238bf 463 *
carlosperales95 25:a42a1ed4d8e9 464 *Activates the buzzer for 0.5 seconds.
carlosperales95 45:d589318238bf 465 *
mglmx 22:e4153ca757dd 466 **/
mglmx 22:e4153ca757dd 467 void doBuzz(){
carlosperales95 25:a42a1ed4d8e9 468
mglmx 22:e4153ca757dd 469 buzz = 1;
mglmx 22:e4153ca757dd 470 wait(0.5);
mglmx 22:e4153ca757dd 471 buzz = 0;
mglmx 22:e4153ca757dd 472 }
mglmx 18:aa43bb62e60f 473
carlosperales95 45:d589318238bf 474
carlosperales95 45:d589318238bf 475 /**
carlosperales95 45:d589318238bf 476 *
carlosperales95 47:e992a129ef44 477 *Initializes every position's vectors (prev_cw and prev_ccw) with the corresponding sensors.
carlosperales95 47:e992a129ef44 478 *prev_cw - Sensors previous to the current in clockwise sense.
carlosperales95 47:e992a129ef44 479 *prev_ccw - Sensors previous to the current in counter-clockwise sense.
carlosperales95 45:d589318238bf 480 *
carlosperales95 45:d589318238bf 481 **/
mglmx 35:cfcfeccb959e 482 void init_positions(){
mglmx 36:9428c72bdd58 483
mglmx 35:cfcfeccb959e 484 d0.add_prev_cw(D1);
mglmx 35:cfcfeccb959e 485 d0.add_prev_ccw(D13);
mglmx 35:cfcfeccb959e 486
mglmx 35:cfcfeccb959e 487 d1.add_prev_cw(D22);
mglmx 35:cfcfeccb959e 488 d1.add_prev_ccw(D0);
mglmx 35:cfcfeccb959e 489
mglmx 35:cfcfeccb959e 490 d22.add_prev_cw(D2);
mglmx 35:cfcfeccb959e 491 d22.add_prev_ccw(D1);
mglmx 35:cfcfeccb959e 492
mglmx 35:cfcfeccb959e 493 d2.add_prev_cw(D21);
mglmx 35:cfcfeccb959e 494 d2.add_prev_ccw(D22);
mglmx 35:cfcfeccb959e 495
mglmx 35:cfcfeccb959e 496 d21.add_prev_cw(D3);
mglmx 35:cfcfeccb959e 497 d21.add_prev_cw(D4);
mglmx 35:cfcfeccb959e 498 d21.add_prev_ccw(D2);
mglmx 35:cfcfeccb959e 499
mglmx 35:cfcfeccb959e 500 d3.add_prev_cw(D9);
mglmx 35:cfcfeccb959e 501 d3.add_prev_ccw(D21);
mglmx 35:cfcfeccb959e 502
mglmx 35:cfcfeccb959e 503 d4.add_prev_cw(D6);
mglmx 35:cfcfeccb959e 504 d4.add_prev_ccw(D21);
mglmx 35:cfcfeccb959e 505
mglmx 35:cfcfeccb959e 506 d5.add_prev_cw(D6);
mglmx 35:cfcfeccb959e 507 d5.add_prev_ccw(D11);
mglmx 35:cfcfeccb959e 508
mglmx 35:cfcfeccb959e 509 d6.add_prev_cw(D7);
mglmx 35:cfcfeccb959e 510 d6.add_prev_ccw(D4);
mglmx 35:cfcfeccb959e 511 d6.add_prev_ccw(D5);
mglmx 35:cfcfeccb959e 512
mglmx 35:cfcfeccb959e 513 d7.add_prev_cw(D8);
mglmx 35:cfcfeccb959e 514 d7.add_prev_ccw(D6);
mglmx 35:cfcfeccb959e 515
mglmx 36:9428c72bdd58 516 d8.add_prev_cw(D9);
mglmx 36:9428c72bdd58 517 d8.add_prev_cw(D10);
mglmx 36:9428c72bdd58 518 d8.add_prev_ccw(D7);
mglmx 36:9428c72bdd58 519
mglmx 35:cfcfeccb959e 520 d9.add_prev_cw(D3);
mglmx 35:cfcfeccb959e 521 d9.add_prev_ccw(D8);
mglmx 35:cfcfeccb959e 522
mglmx 35:cfcfeccb959e 523 d10.add_prev_cw(D12);
mglmx 35:cfcfeccb959e 524 d10.add_prev_ccw(D8);
mglmx 35:cfcfeccb959e 525
mglmx 35:cfcfeccb959e 526 d11.add_prev_cw(D12);
mglmx 35:cfcfeccb959e 527 d11.add_prev_ccw(D5);
mglmx 35:cfcfeccb959e 528
mglmx 35:cfcfeccb959e 529 d12.add_prev_cw(D13);
mglmx 35:cfcfeccb959e 530 d12.add_prev_ccw(D10);
mglmx 35:cfcfeccb959e 531 d12.add_prev_ccw(D11);
mglmx 35:cfcfeccb959e 532
mglmx 35:cfcfeccb959e 533 d13.add_prev_cw(D0);
mglmx 35:cfcfeccb959e 534 d13.add_prev_ccw(D12);
mglmx 36:9428c72bdd58 535
mglmx 36:9428c72bdd58 536 //Initialize array with positions
mglmx 36:9428c72bdd58 537 positions.push_back(d0);
mglmx 36:9428c72bdd58 538 positions.push_back(d1);
mglmx 36:9428c72bdd58 539 positions.push_back(d2);
mglmx 36:9428c72bdd58 540 positions.push_back(d3);
mglmx 36:9428c72bdd58 541 positions.push_back(d4);
mglmx 36:9428c72bdd58 542 positions.push_back(d5);
mglmx 36:9428c72bdd58 543 positions.push_back(d6);
mglmx 36:9428c72bdd58 544 positions.push_back(d7);
mglmx 36:9428c72bdd58 545 positions.push_back(d8);
mglmx 36:9428c72bdd58 546 positions.push_back(d9);
mglmx 36:9428c72bdd58 547 positions.push_back(d10);
mglmx 36:9428c72bdd58 548 positions.push_back(d11);
mglmx 36:9428c72bdd58 549 positions.push_back(d12);
mglmx 36:9428c72bdd58 550 positions.push_back(d13);
mglmx 36:9428c72bdd58 551 positions.push_back(d21);
mglmx 36:9428c72bdd58 552 positions.push_back(d22);
mglmx 35:cfcfeccb959e 553 }
carlosperales95 24:1d71dd8778c4 554
carlosperales95 45:d589318238bf 555
mglmx 22:e4153ca757dd 556 /**
carlosperales95 24:1d71dd8778c4 557 *
carlosperales95 28:71bd4c83c05f 558 *Here we initialize the mcp that will be used to manage the interrupts.
carlosperales95 25:a42a1ed4d8e9 559 *
carlosperales95 24:1d71dd8778c4 560 **/
mglmx 18:aa43bb62e60f 561 void initialize_mcp(){
mglmx 33:24ce12dec157 562 mcp = new MCP23017(i2c,0x40); //Connect to SCL - p28 and SDA - p27 and MPC I2C address 0x40
mglmx 18:aa43bb62e60f 563
mglmx 33:24ce12dec157 564 mcp->_write(IODIRA, (unsigned char )0xff);
mglmx 33:24ce12dec157 565 mcp->_write(IODIRB, (unsigned char )0xff);
mglmx 33:24ce12dec157 566 mcp->_write(IPOLA, (unsigned char )0x00);
mglmx 33:24ce12dec157 567 mcp->_write(IPOLB, (unsigned char )0x00);
mglmx 33:24ce12dec157 568 mcp->_write(DEFVALA, (unsigned char )0xff);
mglmx 33:24ce12dec157 569 mcp->_write(DEFVALB, (unsigned char )0xff);
mglmx 33:24ce12dec157 570 mcp->_write(INTCONA, (unsigned char )0xff);
mglmx 33:24ce12dec157 571 mcp->_write(INTCONB, (unsigned char )0xff);
mglmx 33:24ce12dec157 572 mcp->_write(IOCONA, (unsigned char )0x2);
mglmx 33:24ce12dec157 573 mcp->_write(IOCONB, (unsigned char )0x2);
mglmx 33:24ce12dec157 574 mcp->_write(GPPUA, (unsigned char )0xff);
mglmx 33:24ce12dec157 575 mcp->_write(GPPUB, (unsigned char )0xff);
mglmx 33:24ce12dec157 576
mglmx 18:aa43bb62e60f 577 }
mglmx 18:aa43bb62e60f 578
carlosperales95 45:d589318238bf 579
carlosperales95 24:1d71dd8778c4 580 /**
carlosperales95 24:1d71dd8778c4 581 *
carlosperales95 37:bb15bea420a3 582 *Returns the number of the sensor where the train was detected.
carlosperales95 37:bb15bea420a3 583 *
carlosperales95 47:e992a129ef44 584 *@number -
carlosperales95 47:e992a129ef44 585 *@interrupt -
carlosperales95 47:e992a129ef44 586 *
carlosperales95 37:bb15bea420a3 587 **/
mglmx 34:c9ab2a987734 588 int get_sensor(unsigned int number,int interrupt){
carlosperales95 45:d589318238bf 589
mglmx 34:c9ab2a987734 590 int sensor = -1;
mglmx 34:c9ab2a987734 591
carlosperales95 37:bb15bea420a3 592 for(int i=0; i<8; i++){
mglmx 34:c9ab2a987734 593
carlosperales95 45:d589318238bf 594 if(~number & 1<<i){
carlosperales95 45:d589318238bf 595
mglmx 34:c9ab2a987734 596 sensor = i;
mglmx 34:c9ab2a987734 597 }
mglmx 34:c9ab2a987734 598 }
mglmx 34:c9ab2a987734 599
mglmx 34:c9ab2a987734 600 if(interrupt == 1){
carlosperales95 45:d589318238bf 601
carlosperales95 37:bb15bea420a3 602 sensor+= 8; // Sensors caught by interreupt1 are identified from 8 to 15.
mglmx 34:c9ab2a987734 603 }
carlosperales95 45:d589318238bf 604
mglmx 34:c9ab2a987734 605 return sensor;
mglmx 34:c9ab2a987734 606 }
mglmx 34:c9ab2a987734 607
carlosperales95 65:8fd4046c6540 608
mglmx 62:6fc0c683cb02 609 /**
mglmx 62:6fc0c683cb02 610 *
mglmx 62:6fc0c683cb02 611 *Method to flip the switches
mglmx 62:6fc0c683cb02 612 *
mglmx 62:6fc0c683cb02 613 *@switchId - (1-4)The ID of the switch we want to flip
mglmx 62:6fc0c683cb02 614 *@times - The number of times we want to send the command
mglmx 62:6fc0c683cb02 615 *@activate - True if the switch is going to be activated. False if it needs to go back to rest position.
mglmx 62:6fc0c683cb02 616 *
mglmx 62:6fc0c683cb02 617 **/
mglmx 62:6fc0c683cb02 618 void flip_switch(int switchId, int times, bool activate=true){
mglmx 62:6fc0c683cb02 619
mglmx 62:6fc0c683cb02 620 unsigned int SWBflip = SWBidle; //IDLE - Flip last activated SW.
mglmx 62:6fc0c683cb02 621
mglmx 62:6fc0c683cb02 622 switch(switchId){
mglmx 62:6fc0c683cb02 623
mglmx 62:6fc0c683cb02 624 case 1:
mglmx 62:6fc0c683cb02 625 SWBflip = SWBflip_1; //FLIP SW1
mglmx 62:6fc0c683cb02 626 break;
mglmx 62:6fc0c683cb02 627
mglmx 62:6fc0c683cb02 628 case 2:
mglmx 62:6fc0c683cb02 629 SWBflip = SWBflip_2; //FLIP SW2
mglmx 62:6fc0c683cb02 630 break;
mglmx 62:6fc0c683cb02 631
mglmx 62:6fc0c683cb02 632 case 3:
mglmx 66:45a90a945983 633 SWBflip = SWBidle; //FLIP SW3
mglmx 62:6fc0c683cb02 634 break;
mglmx 62:6fc0c683cb02 635
mglmx 62:6fc0c683cb02 636 case 4:
mglmx 62:6fc0c683cb02 637 SWBflip = SWBflip_4; //FLIP SW4
mglmx 62:6fc0c683cb02 638 break;
mglmx 62:6fc0c683cb02 639
mglmx 62:6fc0c683cb02 640 default:
mglmx 62:6fc0c683cb02 641 break;
mglmx 62:6fc0c683cb02 642 }
mglmx 62:6fc0c683cb02 643
carlosperales95 71:9a303d90c9b8 644 //Security measure not to burn the switch.
carlosperales95 71:9a303d90c9b8 645 DCC_send_command(SWBaddress,SWBflip,times); //Activating switch
mglmx 66:45a90a945983 646
mglmx 62:6fc0c683cb02 647 if(!activate){
mglmx 66:45a90a945983 648 if(switchId == 3){
mglmx 66:45a90a945983 649 DCC_send_command(SWBaddress,SWBflip_3,times); // Exception for switch 3
mglmx 66:45a90a945983 650 }else{
mglmx 66:45a90a945983 651 DCC_send_command(SWBaddress,SWBidle,times);
mglmx 66:45a90a945983 652 }
mglmx 62:6fc0c683cb02 653 }
mglmx 66:45a90a945983 654
mglmx 62:6fc0c683cb02 655 }
mglmx 62:6fc0c683cb02 656
carlosperales95 71:9a303d90c9b8 657
mglmx 62:6fc0c683cb02 658 /**
mglmx 62:6fc0c683cb02 659 * Action to do when NAC is detected
mglmx 62:6fc0c683cb02 660 * Booster is disabled and the buzz is activated
mglmx 62:6fc0c683cb02 661 *
mglmx 62:6fc0c683cb02 662 */
mglmx 62:6fc0c683cb02 663 void NAC_action(){
mglmx 62:6fc0c683cb02 664 enable = 0;
mglmx 62:6fc0c683cb02 665 doBuzz();
mglmx 62:6fc0c683cb02 666 }
mglmx 62:6fc0c683cb02 667
mglmx 62:6fc0c683cb02 668
carlosperales95 45:d589318238bf 669
carlosperales95 42:b445252a772a 670 /**
carlosperales95 71:9a303d90c9b8 671 *
mglmx 57:ee5da8a011e0 672 *This method will check if there is a non-avoidable frontal collision(NAFC).
carlosperales95 47:e992a129ef44 673 *A NAFC will happen if:
carlosperales95 47:e992a129ef44 674 *
carlosperales95 47:e992a129ef44 675 *Both trains in area A or B with different direction
carlosperales95 47:e992a129ef44 676 *Trains in (D11 and D5) or (D9 and D3) with same direction
carlosperales95 47:e992a129ef44 677 *
carlosperales95 71:9a303d90c9b8 678 **/
mglmx 57:ee5da8a011e0 679 bool check_NAC(){
carlosperales95 45:d589318238bf 680
mglmx 43:346a1f4144cd 681 bool NAC = false;
mglmx 43:346a1f4144cd 682
mglmx 57:ee5da8a011e0 683 if((DR_train.is_in_A() && LR_train.is_in_A()) || (DR_train.is_in_B() && LR_train.is_in_B()) ){ //Check if both are in same area
carlosperales95 45:d589318238bf 684
mglmx 43:346a1f4144cd 685 if(DR_train.goes_cw() ^ LR_train.goes_cw()){ //XOR: They must have different values to be true (Different direction)
mglmx 66:45a90a945983 686 lcd.cls();
mglmx 66:45a90a945983 687 lcd.printf("NAC Both area A or B");
mglmx 43:346a1f4144cd 688 NAC = true;
mglmx 43:346a1f4144cd 689 }
mglmx 67:7ff2425141ce 690 }else if(((DR_train.get_position_number() == D11) && (LR_train.get_position_number() == D5 ) ) || ((LR_train.get_position_number() == D5) && (DR_train.get_position_number() == D11 ))){ //Check if they are in position D11 and D5
carlosperales95 45:d589318238bf 691
mglmx 43:346a1f4144cd 692 if(!(DR_train.goes_cw() ^ LR_train.goes_cw())){ // NOT XOR: They must have same values to be true (Same direction)
mglmx 66:45a90a945983 693 lcd.cls();
mglmx 67:7ff2425141ce 694 lcd.printf("NAC D11 and D5");
mglmx 43:346a1f4144cd 695 NAC = true;
mglmx 43:346a1f4144cd 696 }
mglmx 67:7ff2425141ce 697 }else if(((DR_train.get_position_number() == D9) && (LR_train.get_position_number() == D3)) || ((LR_train.get_position_number() == D9) && (DR_train.get_position_number() == D3)) ){//Check if they are in position D9 and D3
carlosperales95 45:d589318238bf 698
mglmx 43:346a1f4144cd 699 if(!(DR_train.goes_cw() ^ LR_train.goes_cw())){ // NOT XOR: They must have same values to be true (Same direction)
mglmx 66:45a90a945983 700 lcd.cls();
mglmx 67:7ff2425141ce 701 lcd.printf("NAC D9 and D3");
mglmx 43:346a1f4144cd 702 NAC = true;
mglmx 43:346a1f4144cd 703 }
mglmx 43:346a1f4144cd 704 }
carlosperales95 45:d589318238bf 705 return NAC;
mglmx 43:346a1f4144cd 706 }
mglmx 43:346a1f4144cd 707
carlosperales95 71:9a303d90c9b8 708
mglmx 62:6fc0c683cb02 709 /**
mglmx 62:6fc0c683cb02 710 * Switch_n switch that needs to switch
carlosperales95 63:86f8dfa007ac 711 * cont_sensor sensor that when activated the stopped train continues
mglmx 62:6fc0c683cb02 712 * switch_sensor sensor where the switch should be activated
mglmx 66:45a90a945983 713 */
mglmx 62:6fc0c683cb02 714 void AFC_action(int switch_n, int cont_sensor, int switch_sensor, Train *stop_train, Train * cont_train ){
carlosperales95 71:9a303d90c9b8 715
mglmx 62:6fc0c683cb02 716 bool send_pack_switch = false;
carlosperales95 71:9a303d90c9b8 717
mglmx 66:45a90a945983 718 if(switch_n == 3){
mglmx 66:45a90a945983 719 DCC_send_command(SWBaddress,SWBflip_3,15); //Activating switchç
mglmx 66:45a90a945983 720 }
mglmx 66:45a90a945983 721
mglmx 62:6fc0c683cb02 722 while(cont_train->get_position_number() != cont_sensor){
carlosperales95 71:9a303d90c9b8 723
mglmx 62:6fc0c683cb02 724 if(cont_train->get_position_number() == switch_sensor){
carlosperales95 71:9a303d90c9b8 725
mglmx 62:6fc0c683cb02 726 send_pack_switch = true;
mglmx 62:6fc0c683cb02 727 }
mglmx 62:6fc0c683cb02 728 stop_train->set_speed(STOP);
mglmx 62:6fc0c683cb02 729 stop_train->run(); //Stopping train on sensor D4 or D10
mglmx 62:6fc0c683cb02 730 cont_train->run();
mglmx 62:6fc0c683cb02 731
mglmx 62:6fc0c683cb02 732 if(send_pack_switch){
carlosperales95 71:9a303d90c9b8 733
mglmx 62:6fc0c683cb02 734 lcd.cls();
mglmx 62:6fc0c683cb02 735 lcd.printf("Switching SW%d",switch_n);
mglmx 62:6fc0c683cb02 736 flip_switch(switch_n,5);
mglmx 62:6fc0c683cb02 737 }
mglmx 55:aa3baa01f43d 738 }
mglmx 62:6fc0c683cb02 739
mglmx 66:45a90a945983 740 if(switch_n == 3){
carlosperales95 71:9a303d90c9b8 741
mglmx 66:45a90a945983 742 DCC_send_command(SWBaddress,SWBflip_3,15); //Activating switch
mglmx 66:45a90a945983 743 }else{
carlosperales95 71:9a303d90c9b8 744
mglmx 66:45a90a945983 745 flip_switch(5,5); //Send IDLE command
mglmx 66:45a90a945983 746 }
mglmx 66:45a90a945983 747 stop_train->set_speed(MEDIUM);
mglmx 55:aa3baa01f43d 748 }
carlosperales95 45:d589318238bf 749
carlosperales95 71:9a303d90c9b8 750
carlosperales95 68:9859a3ff9298 751 /**
carlosperales95 71:9a303d90c9b8 752 *
carlosperales95 68:9859a3ff9298 753 * Switch_n switch that needs to switch
carlosperales95 68:9859a3ff9298 754 * cont_sensor sensor that when activated the stopped train continues
carlosperales95 68:9859a3ff9298 755 * switch_sensor sensor where the switch should be activated
carlosperales95 71:9a303d90c9b8 756 *
carlosperales95 68:9859a3ff9298 757 */
carlosperales95 68:9859a3ff9298 758 void ALC_action(int cont_sensor, Train *stop_train, Train * cont_train ){
carlosperales95 71:9a303d90c9b8 759
carlosperales95 68:9859a3ff9298 760 while(cont_train->get_position_number() != cont_sensor){
carlosperales95 68:9859a3ff9298 761
carlosperales95 68:9859a3ff9298 762 stop_train->set_speed(STOP);
carlosperales95 68:9859a3ff9298 763 stop_train->run(); //Stopping train on sensor D4 or D10
carlosperales95 68:9859a3ff9298 764 cont_train->run();
carlosperales95 68:9859a3ff9298 765 }
carlosperales95 68:9859a3ff9298 766 stop_train->set_speed(MEDIUM);
carlosperales95 68:9859a3ff9298 767 }
mglmx 66:45a90a945983 768
carlosperales95 58:b60db1092088 769
mglmx 43:346a1f4144cd 770 /**
carlosperales95 47:e992a129ef44 771 *
mglmx 55:aa3baa01f43d 772 *The function will check if there is an Avoidable Frontal Collision (AFC).
carlosperales95 47:e992a129ef44 773 *AFC will occur if:
carlosperales95 47:e992a129ef44 774 *
carlosperales95 47:e992a129ef44 775 *Train in area A(ccw) and train in D4(cw)
carlosperales95 47:e992a129ef44 776 *Train in area A(cw) and train in D10(ccw)
carlosperales95 47:e992a129ef44 777 *Train in area B(cw) and train in D4(ccw)
mglmx 62:6fc0c683cb02 778 *Train in area B(ccw) and train in D10(ccw)
mglmx 62:6fc0c683cb02 779 *
mglmx 62:6fc0c683cb02 780 *stop_train is the train that is going to stop in sensors D4 or D10 until the other train passes
mglmx 62:6fc0c683cb02 781 *cont_train is the train that won't stop and will do the switch
carlosperales95 47:e992a129ef44 782 *
mglmx 66:45a90a945983 783 **/
mglmx 62:6fc0c683cb02 784 bool check_AFC(Train *stop_train, Train *cont_train){ //TODO - Add same for LR train
mglmx 62:6fc0c683cb02 785 bool detected_AFC = false;
mglmx 62:6fc0c683cb02 786 if( stop_train->get_position_number() == D4){
carlosperales95 45:d589318238bf 787
mglmx 62:6fc0c683cb02 788 if(stop_train->goes_cw()){
carlosperales95 45:d589318238bf 789
mglmx 62:6fc0c683cb02 790 if(cont_train->is_in_A() && !cont_train->goes_cw()){
mglmx 62:6fc0c683cb02 791
carlosperales95 71:9a303d90c9b8 792 detected_AFC = true;
mglmx 62:6fc0c683cb02 793 lcd.cls();
mglmx 62:6fc0c683cb02 794 lcd.printf("AFC!!! STOP D4 SW2 CONT D3");
carlosperales95 45:d589318238bf 795
mglmx 62:6fc0c683cb02 796 AFC_action(2,D3,D2,stop_train,cont_train);
mglmx 62:6fc0c683cb02 797 //Activate switch2
mglmx 62:6fc0c683cb02 798 //When cont_train is at D3 stop_train continues
mglmx 43:346a1f4144cd 799 }
mglmx 43:346a1f4144cd 800 }else{ //DR goes ccw
carlosperales95 45:d589318238bf 801
mglmx 62:6fc0c683cb02 802 if(cont_train->is_in_B() && cont_train->goes_cw()){
carlosperales95 45:d589318238bf 803
carlosperales95 71:9a303d90c9b8 804 detected_AFC = true;
mglmx 62:6fc0c683cb02 805 lcd.cls();
mglmx 62:6fc0c683cb02 806 lcd.printf("AFC!!! STOP D4 SW3 CONT D5");
mglmx 62:6fc0c683cb02 807
mglmx 62:6fc0c683cb02 808 AFC_action(3,D5,D6,stop_train,cont_train);
mglmx 43:346a1f4144cd 809 //DR_train stops
mglmx 43:346a1f4144cd 810 //Activate switch3
mglmx 43:346a1f4144cd 811 //When LR is at D5 DR continues
mglmx 43:346a1f4144cd 812 }
mglmx 43:346a1f4144cd 813 }
mglmx 62:6fc0c683cb02 814 }else if(stop_train->get_position_number() == D10){
carlosperales95 45:d589318238bf 815
mglmx 62:6fc0c683cb02 816 if(stop_train->goes_cw()){
carlosperales95 45:d589318238bf 817
mglmx 62:6fc0c683cb02 818 if(cont_train->is_in_B() && !cont_train->goes_cw()){
carlosperales95 71:9a303d90c9b8 819
carlosperales95 71:9a303d90c9b8 820 detected_AFC = true;
mglmx 62:6fc0c683cb02 821 lcd.cls();
mglmx 62:6fc0c683cb02 822 lcd.printf("AFC!!! STOP D10 SW4 CONT D9");
carlosperales95 45:d589318238bf 823
mglmx 62:6fc0c683cb02 824 AFC_action(4,D9,D8,stop_train,cont_train);
mglmx 43:346a1f4144cd 825 //DR train stops
mglmx 43:346a1f4144cd 826 //Activate switch4
mglmx 43:346a1f4144cd 827 //When LR is at D9 DR continues
mglmx 43:346a1f4144cd 828 }
mglmx 43:346a1f4144cd 829 }else{
carlosperales95 45:d589318238bf 830
mglmx 62:6fc0c683cb02 831 if(cont_train->is_in_A() && cont_train->goes_cw()){
carlosperales95 71:9a303d90c9b8 832
carlosperales95 71:9a303d90c9b8 833 detected_AFC = true;
mglmx 62:6fc0c683cb02 834 lcd.cls();
mglmx 62:6fc0c683cb02 835 lcd.printf("AFC!!! STOP D10 SW1 CONT D11");
mglmx 62:6fc0c683cb02 836 AFC_action(1,D11,D12,stop_train,cont_train);
mglmx 43:346a1f4144cd 837 //DR train stops
mglmx 43:346a1f4144cd 838 //Activate switch1
mglmx 62:6fc0c683cb02 839 //When LR is at D11 DR continues
mglmx 43:346a1f4144cd 840 }
mglmx 43:346a1f4144cd 841 }
carlosperales95 68:9859a3ff9298 842 }else if(stop_train->get_position_number() == D9){
carlosperales95 68:9859a3ff9298 843
carlosperales95 68:9859a3ff9298 844 if(stop_train->goes_cw()){
carlosperales95 68:9859a3ff9298 845
carlosperales95 68:9859a3ff9298 846 if(cont_train->is_in_B() && !cont_train->goes_cw()){
carlosperales95 68:9859a3ff9298 847
carlosperales95 71:9a303d90c9b8 848 detected_AFC = true;
carlosperales95 68:9859a3ff9298 849 lcd.cls();
carlosperales95 68:9859a3ff9298 850 lcd.printf("AFC!!! STOP D9 CONT D8");
carlosperales95 68:9859a3ff9298 851 AFC_action(5, D10, D4, stop_train, cont_train);
carlosperales95 68:9859a3ff9298 852 //train in 9 stops
carlosperales95 71:9a303d90c9b8 853 //when cont_train is at d10 stop train continues
carlosperales95 68:9859a3ff9298 854 }
carlosperales95 68:9859a3ff9298 855 }
carlosperales95 68:9859a3ff9298 856 }else if(stop_train->get_position_number() == D11){
carlosperales95 68:9859a3ff9298 857
carlosperales95 68:9859a3ff9298 858 if(!stop_train->goes_cw()){
carlosperales95 68:9859a3ff9298 859
carlosperales95 68:9859a3ff9298 860 if(cont_train->is_in_A() && cont_train->goes_cw()){
carlosperales95 68:9859a3ff9298 861
carlosperales95 71:9a303d90c9b8 862 detected_AFC = true;
carlosperales95 68:9859a3ff9298 863 lcd.cls();
carlosperales95 68:9859a3ff9298 864 lcd.printf("AFC!!! STOP D11 CONT D12");
carlosperales95 68:9859a3ff9298 865 AFC_action(5, D10, D4, stop_train, cont_train);
carlosperales95 68:9859a3ff9298 866 //train in 11 stops
carlosperales95 68:9859a3ff9298 867 //when cont_train is at d10 stop train continues
carlosperales95 68:9859a3ff9298 868 }
carlosperales95 68:9859a3ff9298 869 }
carlosperales95 68:9859a3ff9298 870 }else if(stop_train->get_position_number() == D3){
carlosperales95 68:9859a3ff9298 871
carlosperales95 68:9859a3ff9298 872 if(stop_train->goes_cw()){
carlosperales95 68:9859a3ff9298 873
carlosperales95 68:9859a3ff9298 874 if(cont_train->is_in_A() && !cont_train->goes_cw()){
carlosperales95 68:9859a3ff9298 875
carlosperales95 71:9a303d90c9b8 876 detected_AFC = true;
carlosperales95 68:9859a3ff9298 877 lcd.cls();
carlosperales95 68:9859a3ff9298 878 lcd.printf("AFC!!! STOP D3 CONT D14");
carlosperales95 68:9859a3ff9298 879 AFC_action(5, D4, D10, stop_train, cont_train);
carlosperales95 68:9859a3ff9298 880 //train in 3 stops
carlosperales95 68:9859a3ff9298 881 //when cont_train is at d4 stop train continues
carlosperales95 68:9859a3ff9298 882 }
carlosperales95 68:9859a3ff9298 883 }
carlosperales95 68:9859a3ff9298 884
carlosperales95 68:9859a3ff9298 885 }else if(stop_train->get_position_number() == D5){
carlosperales95 68:9859a3ff9298 886
carlosperales95 68:9859a3ff9298 887 if(!stop_train->goes_cw()){
carlosperales95 68:9859a3ff9298 888
carlosperales95 68:9859a3ff9298 889 if(cont_train->is_in_B() && cont_train->goes_cw()){
carlosperales95 68:9859a3ff9298 890
carlosperales95 71:9a303d90c9b8 891 detected_AFC = true;
carlosperales95 68:9859a3ff9298 892 lcd.cls();
carlosperales95 68:9859a3ff9298 893 lcd.printf("AFC!!! STOP D5 CONT D6");
carlosperales95 68:9859a3ff9298 894 AFC_action(5, D4, D10, stop_train, cont_train);
carlosperales95 68:9859a3ff9298 895 //train in 5 stops
carlosperales95 68:9859a3ff9298 896 //when cont_train is at d4 stop train continues
carlosperales95 68:9859a3ff9298 897 }
carlosperales95 68:9859a3ff9298 898 }
mglmx 43:346a1f4144cd 899 }
mglmx 62:6fc0c683cb02 900 return detected_AFC;
mglmx 66:45a90a945983 901 }
mglmx 43:346a1f4144cd 902
carlosperales95 45:d589318238bf 903
carlosperales95 45:d589318238bf 904 /**
carlosperales95 45:d589318238bf 905 *
carlosperales95 63:86f8dfa007ac 906 *
carlosperales95 63:86f8dfa007ac 907 *
carlosperales95 68:9859a3ff9298 908 **/
carlosperales95 63:86f8dfa007ac 909 bool check_ALC(Train *stop_train, Train *cont_train){ //TODO - Add same for LR train
carlosperales95 64:be1015efd974 910
carlosperales95 63:86f8dfa007ac 911 bool detected_ALC = false;
carlosperales95 71:9a303d90c9b8 912
carlosperales95 63:86f8dfa007ac 913 if( stop_train->get_position_number() == D4){
carlosperales95 63:86f8dfa007ac 914
carlosperales95 63:86f8dfa007ac 915 if(stop_train->goes_cw()){
carlosperales95 63:86f8dfa007ac 916
carlosperales95 63:86f8dfa007ac 917 if(cont_train->get_position_number() == D3 && cont_train->goes_cw()){
carlosperales95 63:86f8dfa007ac 918
carlosperales95 71:9a303d90c9b8 919 detected_ALC = true;
carlosperales95 63:86f8dfa007ac 920 lcd.cls();
carlosperales95 63:86f8dfa007ac 921 lcd.printf("ALC!!! STOP D4 CONT D3");
carlosperales95 68:9859a3ff9298 922 ALC_action(2, stop_train, cont_train );
carlosperales95 63:86f8dfa007ac 923 //When cont_train is at D22 stop_train continues
carlosperales95 63:86f8dfa007ac 924 }
carlosperales95 63:86f8dfa007ac 925 }else{ //DR goes ccw
carlosperales95 63:86f8dfa007ac 926
carlosperales95 63:86f8dfa007ac 927 if(cont_train->get_position_number() == D5 && !cont_train->goes_cw()){
carlosperales95 63:86f8dfa007ac 928
carlosperales95 71:9a303d90c9b8 929 detected_ALC = true;
carlosperales95 63:86f8dfa007ac 930 lcd.cls();
carlosperales95 68:9859a3ff9298 931 lcd.printf("ALC!!! STOP D4 SW3 CONT D5");
carlosperales95 68:9859a3ff9298 932 ALC_action(7, stop_train, cont_train );
carlosperales95 63:86f8dfa007ac 933 //Train stops
carlosperales95 63:86f8dfa007ac 934 //When CONT is at D6 DR continues
carlosperales95 63:86f8dfa007ac 935 }
carlosperales95 63:86f8dfa007ac 936 }
carlosperales95 63:86f8dfa007ac 937 }else if(stop_train->get_position_number() == D10){
carlosperales95 63:86f8dfa007ac 938
carlosperales95 63:86f8dfa007ac 939 if(stop_train->goes_cw()){
carlosperales95 63:86f8dfa007ac 940
carlosperales95 64:be1015efd974 941 if(cont_train->get_position_number() == D9 && cont_train->goes_cw()){
carlosperales95 63:86f8dfa007ac 942
carlosperales95 71:9a303d90c9b8 943 detected_ALC = true;
carlosperales95 63:86f8dfa007ac 944 lcd.cls();
carlosperales95 68:9859a3ff9298 945 lcd.printf("ALC!!! STOP D10 CONT D9");
carlosperales95 68:9859a3ff9298 946 ALC_action(8, stop_train, cont_train );
carlosperales95 63:86f8dfa007ac 947 //D10 train stops
carlosperales95 63:86f8dfa007ac 948 //When CONT is at D8, D10 continues
carlosperales95 63:86f8dfa007ac 949 }
carlosperales95 63:86f8dfa007ac 950 }else{
carlosperales95 63:86f8dfa007ac 951
carlosperales95 64:be1015efd974 952 if(cont_train->get_position_number() == D11 && !cont_train->goes_cw()){
carlosperales95 63:86f8dfa007ac 953
carlosperales95 71:9a303d90c9b8 954 detected_ALC = true;
carlosperales95 63:86f8dfa007ac 955 lcd.cls();
carlosperales95 68:9859a3ff9298 956 lcd.printf("ALC!!! STOP D10 CONT D11");
carlosperales95 68:9859a3ff9298 957 ALC_action(12, stop_train, cont_train );
carlosperales95 63:86f8dfa007ac 958 //D10 train stops
carlosperales95 63:86f8dfa007ac 959 //When CONT is at D12, D10 continues
carlosperales95 63:86f8dfa007ac 960 }
carlosperales95 63:86f8dfa007ac 961 }
carlosperales95 63:86f8dfa007ac 962 }
carlosperales95 64:be1015efd974 963 return detected_ALC;
carlosperales95 63:86f8dfa007ac 964 }
carlosperales95 64:be1015efd974 965
carlosperales95 64:be1015efd974 966
carlosperales95 63:86f8dfa007ac 967 /**
carlosperales95 63:86f8dfa007ac 968 *
carlosperales95 47:e992a129ef44 969 *The method check_position will check if any of the trains is in any of the areas.
carlosperales95 47:e992a129ef44 970 *It will go through all the area vectors (A,B) and call the function in_vector to check inside the vectors.
carlosperales95 45:d589318238bf 971 *
carlosperales95 45:d589318238bf 972 **/
mglmx 57:ee5da8a011e0 973 void check_position(){
mglmx 57:ee5da8a011e0 974
mglmx 57:ee5da8a011e0 975 if(check_NAC()){
carlosperales95 71:9a303d90c9b8 976 lcd.cls();
carlosperales95 71:9a303d90c9b8 977 lcd.printf("NAC!!!");
mglmx 62:6fc0c683cb02 978 NAC_action();
mglmx 62:6fc0c683cb02 979 }
carlosperales95 71:9a303d90c9b8 980
carlosperales95 68:9859a3ff9298 981 check_AFC(&DR_train,&LR_train);
carlosperales95 68:9859a3ff9298 982 check_AFC(&LR_train,&DR_train);
carlosperales95 68:9859a3ff9298 983 check_ALC(&LR_train,&DR_train);
carlosperales95 68:9859a3ff9298 984 check_ALC(&DR_train,&LR_train);
mglmx 43:346a1f4144cd 985 }
mglmx 43:346a1f4144cd 986
carlosperales95 45:d589318238bf 987
carlosperales95 45:d589318238bf 988 /**
carlosperales95 45:d589318238bf 989 *
carlosperales95 72:a1bd95af46b8 990 *
carlosperales95 72:a1bd95af46b8 991 *
carlosperales95 72:a1bd95af46b8 992 **/
carlosperales95 72:a1bd95af46b8 993 void printPos(int sensor){
carlosperales95 72:a1bd95af46b8 994
carlosperales95 72:a1bd95af46b8 995 string DR_dir,LR_dir;
carlosperales95 72:a1bd95af46b8 996
carlosperales95 72:a1bd95af46b8 997 if(DR_train.goes_cw()){ DR_dir = "cw";}
carlosperales95 72:a1bd95af46b8 998 else{DR_dir = "ccw";}
carlosperales95 72:a1bd95af46b8 999
carlosperales95 72:a1bd95af46b8 1000 if(LR_train.goes_cw()){LR_dir = "cw";}
carlosperales95 72:a1bd95af46b8 1001 else{LR_dir = "ccw";}
carlosperales95 72:a1bd95af46b8 1002
carlosperales95 72:a1bd95af46b8 1003 lcd.cls();
carlosperales95 72:a1bd95af46b8 1004 lcd.printf("S:D%d DR%d(",sensor,DR_train.get_position_number());
carlosperales95 72:a1bd95af46b8 1005
carlosperales95 72:a1bd95af46b8 1006 for(int i=0; i<DR_train.get_next_sensors().size(); i++){
carlosperales95 72:a1bd95af46b8 1007
carlosperales95 72:a1bd95af46b8 1008 lcd.printf("%d,",DR_train.get_next_sensors()[i]);
carlosperales95 72:a1bd95af46b8 1009 }
carlosperales95 72:a1bd95af46b8 1010
carlosperales95 72:a1bd95af46b8 1011 lcd.printf(")%s LR%d(",DR_dir,LR_train.get_position_number());
carlosperales95 72:a1bd95af46b8 1012
carlosperales95 72:a1bd95af46b8 1013 for(int i=0; i<LR_train.get_next_sensors().size(); i++){
carlosperales95 72:a1bd95af46b8 1014
carlosperales95 72:a1bd95af46b8 1015 lcd.printf("%d,",LR_train.get_next_sensors()[i]);
carlosperales95 72:a1bd95af46b8 1016 }
carlosperales95 72:a1bd95af46b8 1017 lcd.printf(")%s",LR_dir);
carlosperales95 72:a1bd95af46b8 1018 }
carlosperales95 72:a1bd95af46b8 1019
carlosperales95 72:a1bd95af46b8 1020
carlosperales95 72:a1bd95af46b8 1021 /**
carlosperales95 72:a1bd95af46b8 1022 *
carlosperales95 47:e992a129ef44 1023 *Description
carlosperales95 45:d589318238bf 1024 *
carlosperales95 47:e992a129ef44 1025 *@sensor -
carlosperales95 45:d589318238bf 1026 *
carlosperales95 45:d589318238bf 1027 **/
mglmx 35:cfcfeccb959e 1028 void update_train_pos(int sensor){
carlosperales95 70:594fe5c1ad5c 1029
carlosperales95 71:9a303d90c9b8 1030 //bool found_DR = false;
carlosperales95 71:9a303d90c9b8 1031 //bool found_LR = false;
mglmx 49:880c0b9c9c64 1032
carlosperales95 71:9a303d90c9b8 1033
mglmx 55:aa3baa01f43d 1034 if(sensor == DR_train.get_position_number() || sensor == LR_train.get_position_number()){
carlosperales95 71:9a303d90c9b8 1035 redled = 1;
carlosperales95 71:9a303d90c9b8 1036 }else{
carlosperales95 71:9a303d90c9b8 1037
carlosperales95 71:9a303d90c9b8 1038 redled = 0;
carlosperales95 72:a1bd95af46b8 1039 printPos(sensor);
mglmx 55:aa3baa01f43d 1040
mglmx 52:c08495446f87 1041 //Checking next sensors for DR train
mglmx 55:aa3baa01f43d 1042 for(int i=0; i<DR_train.get_next_sensors().size(); i++){
mglmx 55:aa3baa01f43d 1043
mglmx 55:aa3baa01f43d 1044 if(DR_train.get_next_sensors()[i] == sensor){ //If the sensor is one expected to visit by the train we update the position
carlosperales95 37:bb15bea420a3 1045
carlosperales95 71:9a303d90c9b8 1046 //found_DR = true;
mglmx 55:aa3baa01f43d 1047
mglmx 55:aa3baa01f43d 1048 if(DR_train.goes_cw()){
mglmx 55:aa3baa01f43d 1049 if(DR_train.get_position_number() == D5 || DR_train.get_position_number() == D11){
mglmx 55:aa3baa01f43d 1050
mglmx 55:aa3baa01f43d 1051 DR_train.set_goes_cw(false); //If train goes cw and passes D5 or D11 we change orientation
mglmx 55:aa3baa01f43d 1052 }
mglmx 55:aa3baa01f43d 1053 }else{
mglmx 55:aa3baa01f43d 1054
mglmx 55:aa3baa01f43d 1055 if(DR_train.get_position_number() == D9 || DR_train.get_position_number() == D3){
mglmx 55:aa3baa01f43d 1056
mglmx 55:aa3baa01f43d 1057 DR_train.set_goes_cw(true); //If train goes ccw and passes D9 or D3 we change orientation
mglmx 55:aa3baa01f43d 1058 }
mglmx 55:aa3baa01f43d 1059 }
mglmx 55:aa3baa01f43d 1060
mglmx 55:aa3baa01f43d 1061 DR_train.set_position(sensor);
mglmx 55:aa3baa01f43d 1062
mglmx 55:aa3baa01f43d 1063 }
mglmx 55:aa3baa01f43d 1064 }
mglmx 55:aa3baa01f43d 1065
mglmx 55:aa3baa01f43d 1066 //Checking next sensors for LR train
mglmx 55:aa3baa01f43d 1067 for(int i=0; i<LR_train.get_next_sensors().size(); i++){
mglmx 55:aa3baa01f43d 1068
mglmx 55:aa3baa01f43d 1069 if(LR_train.get_next_sensors()[i] == sensor){
carlosperales95 45:d589318238bf 1070
carlosperales95 71:9a303d90c9b8 1071 //found_LR = true;
mglmx 55:aa3baa01f43d 1072
mglmx 55:aa3baa01f43d 1073 if(LR_train.goes_cw()){
carlosperales95 45:d589318238bf 1074
mglmx 55:aa3baa01f43d 1075 if(LR_train.get_position_number() == D5 || LR_train.get_position_number() == D11){
mglmx 55:aa3baa01f43d 1076 LR_train.set_goes_cw(false); //If train goes cw and passes D5 or D11 we change orientation
mglmx 55:aa3baa01f43d 1077 }
mglmx 55:aa3baa01f43d 1078 }else{
mglmx 55:aa3baa01f43d 1079
mglmx 55:aa3baa01f43d 1080 if(LR_train.get_position_number() == D9 || LR_train.get_position_number() == D3 ){
mglmx 55:aa3baa01f43d 1081
mglmx 55:aa3baa01f43d 1082 LR_train.set_goes_cw(true); //If train goes ccw and passes D9 or D3 we change orientation
mglmx 55:aa3baa01f43d 1083 }
mglmx 41:4fa6aa29d1ed 1084 }
carlosperales95 71:9a303d90c9b8 1085 LR_train.set_position(sensor);
mglmx 55:aa3baa01f43d 1086 }
mglmx 55:aa3baa01f43d 1087 }
carlosperales95 71:9a303d90c9b8 1088 }
carlosperales95 71:9a303d90c9b8 1089 }
carlosperales95 71:9a303d90c9b8 1090
carlosperales95 71:9a303d90c9b8 1091
carlosperales95 71:9a303d90c9b8 1092 /**
carlosperales95 71:9a303d90c9b8 1093 *
carlosperales95 25:a42a1ed4d8e9 1094 *Method to catch interrupts 0
carlosperales95 25:a42a1ed4d8e9 1095 *
carlosperales95 24:1d71dd8778c4 1096 **/
mglmx 33:24ce12dec157 1097 void on_int0_change(){
carlosperales95 25:a42a1ed4d8e9 1098
mglmx 33:24ce12dec157 1099 wait_us(2000);
mglmx 33:24ce12dec157 1100 int sensor_data = mcp->_read(INTCAPA);
mglmx 34:c9ab2a987734 1101 int sensor = get_sensor(sensor_data,0);
mglmx 35:cfcfeccb959e 1102 update_train_pos(sensor);
mglmx 16:2a2da0e67793 1103 }
mglmx 16:2a2da0e67793 1104
mglmx 35:cfcfeccb959e 1105
carlosperales95 24:1d71dd8778c4 1106 /**
carlosperales95 24:1d71dd8778c4 1107 *
carlosperales95 25:a42a1ed4d8e9 1108 *Method to catch interrupts 1
carlosperales95 25:a42a1ed4d8e9 1109 *
carlosperales95 24:1d71dd8778c4 1110 **/
mglmx 33:24ce12dec157 1111 void on_int1_change(){
carlosperales95 25:a42a1ed4d8e9 1112
mglmx 33:24ce12dec157 1113 wait_us(2000);
mglmx 33:24ce12dec157 1114 int sensor_data = mcp->_read(INTCAPB);
mglmx 34:c9ab2a987734 1115 int sensor = get_sensor(sensor_data,1);
mglmx 35:cfcfeccb959e 1116 update_train_pos(sensor);
mglmx 16:2a2da0e67793 1117 }
mglmx 26:5c966a0a3e8e 1118
carlosperales95 71:9a303d90c9b8 1119
carlosperales95 45:d589318238bf 1120 /**
carlosperales95 45:d589318238bf 1121 *
carlosperales95 47:e992a129ef44 1122 *Clear current interrupts
carlosperales95 45:d589318238bf 1123 *
carlosperales95 45:d589318238bf 1124 **/
mglmx 62:6fc0c683cb02 1125 void init() {
mglmx 26:5c966a0a3e8e 1126
mglmx 33:24ce12dec157 1127 mcp->_read(GPIOA);
mglmx 33:24ce12dec157 1128 mcp->_read(GPIOB); // Register callbacks
mglmx 33:24ce12dec157 1129 int0.fall(&on_int0_change);
mglmx 33:24ce12dec157 1130 int1.fall(&on_int1_change); // Enable interrupts on MCP
mglmx 33:24ce12dec157 1131 mcp->_write(GPINTENA, (unsigned char )0xff);
mglmx 33:24ce12dec157 1132 mcp->_write(GPINTENB, (unsigned char )0xff); // Ready to go!
mglmx 62:6fc0c683cb02 1133 }
mglmx 62:6fc0c683cb02 1134
carlosperales95 11:021210c59a95 1135
carlosperales95 24:1d71dd8778c4 1136 /**
carlosperales95 24:1d71dd8778c4 1137 *
carlosperales95 29:559eb2164488 1138 *Checks if any of the switches of the box has been activated.
carlosperales95 29:559eb2164488 1139 *Calls necessary function and displays LCD text.
carlosperales95 25:a42a1ed4d8e9 1140 *
carlosperales95 24:1d71dd8778c4 1141 **/
mglmx 21:e6f1649add39 1142 void checkSwitch(){
carlosperales95 24:1d71dd8778c4 1143
mglmx 22:e4153ca757dd 1144 if(switch1 == 1){
carlosperales95 24:1d71dd8778c4 1145
carlosperales95 69:609c69e91b4e 1146 //lcd.cls();
carlosperales95 69:609c69e91b4e 1147 //lcd.printf("TRAIN NOW WILL STOP AT STATION");
mglmx 22:e4153ca757dd 1148 }else if(switch2 == 1){
carlosperales95 24:1d71dd8778c4 1149
carlosperales95 69:609c69e91b4e 1150 //lcd.cls();
carlosperales95 69:609c69e91b4e 1151 //lcd.printf("SPEEDCHECKMODE");
carlosperales95 69:609c69e91b4e 1152 //change to speedcheckmode
carlosperales95 69:609c69e91b4e 1153 speedcheck = 1;
carlosperales95 69:609c69e91b4e 1154 }else{
carlosperales95 69:609c69e91b4e 1155
carlosperales95 69:609c69e91b4e 1156 //lcd.cls();
carlosperales95 69:609c69e91b4e 1157 //lcd.printf("NORMAL MODE");
carlosperales95 69:609c69e91b4e 1158 speedcheck = 0;
carlosperales95 69:609c69e91b4e 1159 }if(switch3 == 0){
carlosperales95 24:1d71dd8778c4 1160
carlosperales95 69:609c69e91b4e 1161 if(speedcheck>0){
carlosperales95 69:609c69e91b4e 1162
carlosperales95 69:609c69e91b4e 1163 //lcd.cls();
carlosperales95 69:609c69e91b4e 1164 //lcd.printf("SPEED TRAIN DARK RED");
carlosperales95 69:609c69e91b4e 1165 speedcheck = 2;
carlosperales95 69:609c69e91b4e 1166 }
carlosperales95 24:1d71dd8778c4 1167 }else if(switch4 == 0){
carlosperales95 69:609c69e91b4e 1168
carlosperales95 69:609c69e91b4e 1169 if(speedcheck>0){
carlosperales95 69:609c69e91b4e 1170
carlosperales95 69:609c69e91b4e 1171 //lcd.cls();
carlosperales95 69:609c69e91b4e 1172 //lcd.printf("SPEED TRAIN LIGHT RED");
carlosperales95 69:609c69e91b4e 1173 speedcheck = 3;
carlosperales95 69:609c69e91b4e 1174 }
carlosperales95 24:1d71dd8778c4 1175 }
mglmx 22:e4153ca757dd 1176 }
mglmx 22:e4153ca757dd 1177
carlosperales95 45:d589318238bf 1178
carlosperales95 24:1d71dd8778c4 1179
mglmx 55:aa3baa01f43d 1180
mglmx 55:aa3baa01f43d 1181 /**
carlosperales95 71:9a303d90c9b8 1182 *
mglmx 55:aa3baa01f43d 1183 * Returns a sensor number depending on how many times switch3 flips.
mglmx 55:aa3baa01f43d 1184 * When pressing switch4 it confirms the switch
mglmx 55:aa3baa01f43d 1185 * Init_sensor is the value where we start counting.
mglmx 55:aa3baa01f43d 1186 * string train is the name of the train that will be prited with the sensor
carlosperales95 71:9a303d90c9b8 1187 *
mglmx 55:aa3baa01f43d 1188 */
mglmx 55:aa3baa01f43d 1189 int select_sensor(int init_sensor, string train){
mglmx 55:aa3baa01f43d 1190
mglmx 55:aa3baa01f43d 1191 lcd.cls();
mglmx 57:ee5da8a011e0 1192 lcd.printf("%s SENSOR D%d",train,init_sensor);
mglmx 55:aa3baa01f43d 1193
mglmx 55:aa3baa01f43d 1194 int sensor = init_sensor;
mglmx 52:c08495446f87 1195 bool changed = false;
mglmx 52:c08495446f87 1196 bool exit = false;
mglmx 52:c08495446f87 1197
mglmx 52:c08495446f87 1198 while(!exit){
carlosperales95 71:9a303d90c9b8 1199
mglmx 52:c08495446f87 1200 if(switch3 == 0){
carlosperales95 71:9a303d90c9b8 1201
mglmx 52:c08495446f87 1202 if(changed){
carlosperales95 71:9a303d90c9b8 1203
mglmx 52:c08495446f87 1204 sensor++;
mglmx 52:c08495446f87 1205 sensor=sensor%15; //Only sensors from 0 to 15.
mglmx 52:c08495446f87 1206 changed=false;
mglmx 55:aa3baa01f43d 1207 lcd.cls();
mglmx 55:aa3baa01f43d 1208 lcd.printf("%s: D%d",train,sensor);
mglmx 52:c08495446f87 1209 }
carlosperales95 71:9a303d90c9b8 1210 }else{
mglmx 62:6fc0c683cb02 1211
mglmx 52:c08495446f87 1212 changed = true;
mglmx 55:aa3baa01f43d 1213 wait(0.2);
mglmx 52:c08495446f87 1214 }
mglmx 52:c08495446f87 1215 if(switch4 == 0){
carlosperales95 71:9a303d90c9b8 1216
mglmx 52:c08495446f87 1217 exit = true;
mglmx 55:aa3baa01f43d 1218 wait(0.2);
mglmx 52:c08495446f87 1219 }
mglmx 52:c08495446f87 1220 }
mglmx 52:c08495446f87 1221 return sensor;
mglmx 52:c08495446f87 1222 }
carlosperales95 45:d589318238bf 1223
carlosperales95 69:609c69e91b4e 1224
mglmx 55:aa3baa01f43d 1225 /**
mglmx 55:aa3baa01f43d 1226 * Returns a boolean representing the direction. Everytimew switch3 is 0 it changes the direction.
mglmx 55:aa3baa01f43d 1227 * When switch4 is 0 the selection is confirmed.
mglmx 55:aa3baa01f43d 1228 * Init_going_cw is the initial direction.
mglmx 55:aa3baa01f43d 1229 * Train is the string with the name of the train that will be printed next to the direction
mglmx 55:aa3baa01f43d 1230 */
mglmx 55:aa3baa01f43d 1231 bool select_direction(bool init_going_cw,string train){
mglmx 55:aa3baa01f43d 1232
mglmx 57:ee5da8a011e0 1233 string dir_string;
mglmx 57:ee5da8a011e0 1234
carlosperales95 71:9a303d90c9b8 1235 if(init_going_cw){dir_string = "cw";}
carlosperales95 71:9a303d90c9b8 1236 else{dir_string = "ccw";}
mglmx 57:ee5da8a011e0 1237
mglmx 55:aa3baa01f43d 1238 lcd.cls();
mglmx 57:ee5da8a011e0 1239 lcd.printf("%s DIRECTION %s ",train,dir_string);
mglmx 57:ee5da8a011e0 1240
mglmx 55:aa3baa01f43d 1241 bool exit = false;
mglmx 55:aa3baa01f43d 1242 bool going_cw = init_going_cw;
mglmx 55:aa3baa01f43d 1243 bool changed = false;
mglmx 55:aa3baa01f43d 1244
mglmx 55:aa3baa01f43d 1245 while(!exit){
carlosperales95 71:9a303d90c9b8 1246
mglmx 55:aa3baa01f43d 1247 if(switch3 == 0){
carlosperales95 71:9a303d90c9b8 1248
mglmx 55:aa3baa01f43d 1249 if(changed){
carlosperales95 71:9a303d90c9b8 1250
mglmx 55:aa3baa01f43d 1251 going_cw = !going_cw;
mglmx 55:aa3baa01f43d 1252 changed = false;
mglmx 55:aa3baa01f43d 1253 string dir;
carlosperales95 71:9a303d90c9b8 1254
carlosperales95 71:9a303d90c9b8 1255 if(going_cw){dir = "cw";}
carlosperales95 71:9a303d90c9b8 1256 else{dir = "ccw";}
carlosperales95 71:9a303d90c9b8 1257
mglmx 55:aa3baa01f43d 1258 lcd.cls();
mglmx 55:aa3baa01f43d 1259 lcd.printf("%s: %s",train,dir);
mglmx 55:aa3baa01f43d 1260 }
mglmx 55:aa3baa01f43d 1261 }else{
carlosperales95 71:9a303d90c9b8 1262
mglmx 55:aa3baa01f43d 1263 changed = true;
mglmx 55:aa3baa01f43d 1264 wait(0.2);
mglmx 55:aa3baa01f43d 1265 }
mglmx 55:aa3baa01f43d 1266 if(switch4 == 0){
carlosperales95 71:9a303d90c9b8 1267
mglmx 55:aa3baa01f43d 1268 exit = true;
mglmx 55:aa3baa01f43d 1269 wait(0.2);
mglmx 55:aa3baa01f43d 1270 }
mglmx 55:aa3baa01f43d 1271 }
mglmx 55:aa3baa01f43d 1272 return going_cw;
mglmx 55:aa3baa01f43d 1273 }
mglmx 55:aa3baa01f43d 1274
carlosperales95 69:609c69e91b4e 1275
carlosperales95 69:609c69e91b4e 1276 /**
carlosperales95 69:609c69e91b4e 1277 *
carlosperales95 69:609c69e91b4e 1278 *
carlosperales95 69:609c69e91b4e 1279 *
carlosperales95 69:609c69e91b4e 1280 **/
carlosperales95 69:609c69e91b4e 1281 void adjustSpeed(Train* train){
carlosperales95 69:609c69e91b4e 1282
carlosperales95 69:609c69e91b4e 1283 float f = pot.read();
carlosperales95 69:609c69e91b4e 1284 float vin = f * 3.3;
carlosperales95 69:609c69e91b4e 1285
carlosperales95 69:609c69e91b4e 1286 if(0<=vin && vin<0.60){
carlosperales95 69:609c69e91b4e 1287
carlosperales95 69:609c69e91b4e 1288 //speed = slow
carlosperales95 69:609c69e91b4e 1289 train->set_speed(SLOW);
carlosperales95 69:609c69e91b4e 1290 }else if(0.60<vin && vin<1.20){
carlosperales95 69:609c69e91b4e 1291
carlosperales95 69:609c69e91b4e 1292 //speed medium
carlosperales95 69:609c69e91b4e 1293 train->set_speed(MEDIUM);
carlosperales95 69:609c69e91b4e 1294 }else if(1.20<vin && vin<2.20){
carlosperales95 69:609c69e91b4e 1295
carlosperales95 69:609c69e91b4e 1296 //speed fast
carlosperales95 69:609c69e91b4e 1297 train->set_speed(FAST);
carlosperales95 69:609c69e91b4e 1298 }else if(2.20<vin && vin<3.20){
carlosperales95 69:609c69e91b4e 1299
carlosperales95 69:609c69e91b4e 1300 //speed full
carlosperales95 69:609c69e91b4e 1301 train->set_speed(FULL);
carlosperales95 69:609c69e91b4e 1302 }
carlosperales95 69:609c69e91b4e 1303 }
carlosperales95 69:609c69e91b4e 1304
carlosperales95 71:9a303d90c9b8 1305 /**
carlosperales95 71:9a303d90c9b8 1306 *
carlosperales95 71:9a303d90c9b8 1307 *
carlosperales95 71:9a303d90c9b8 1308 *
carlosperales95 71:9a303d90c9b8 1309 **/
carlosperales95 69:609c69e91b4e 1310 void switch_toSpeed(){
carlosperales95 69:609c69e91b4e 1311
carlosperales95 69:609c69e91b4e 1312 switch(speedcheck){
carlosperales95 69:609c69e91b4e 1313
carlosperales95 69:609c69e91b4e 1314 case 2:
carlosperales95 69:609c69e91b4e 1315 adjustSpeed(&DR_train);
carlosperales95 69:609c69e91b4e 1316
carlosperales95 69:609c69e91b4e 1317 case 3:
carlosperales95 69:609c69e91b4e 1318 adjustSpeed(&LR_train);
carlosperales95 69:609c69e91b4e 1319
carlosperales95 69:609c69e91b4e 1320 }
carlosperales95 69:609c69e91b4e 1321 }
carlosperales95 69:609c69e91b4e 1322
carlosperales95 71:9a303d90c9b8 1323
carlosperales95 71:9a303d90c9b8 1324
carlosperales95 11:021210c59a95 1325 //**************** MAIN PROGRAM FOR DENVER TRAIN ****************//
carlosperales95 11:021210c59a95 1326
carlosperales95 45:d589318238bf 1327
mglmx 1:0ab26889af9b 1328 int main()
mglmx 1:0ab26889af9b 1329 {
carlosperales95 25:a42a1ed4d8e9 1330
carlosperales95 56:fe999806787d 1331 enable = 0;
carlosperales95 25:a42a1ed4d8e9 1332
carlosperales95 25:a42a1ed4d8e9 1333 //Led routine to start main program
mglmx 22:e4153ca757dd 1334 wait(0.2);
mglmx 2:f580707c44fa 1335 led1 = 1;
mglmx 16:2a2da0e67793 1336
mglmx 55:aa3baa01f43d 1337 init_positions();
carlosperales95 25:a42a1ed4d8e9 1338 initialize_mcp(); //mcp initialization for interrupts before train running
mglmx 33:24ce12dec157 1339 init();
mglmx 57:ee5da8a011e0 1340
carlosperales95 68:9859a3ff9298 1341 int DR_init_sensor = select_sensor(D6,"DR");
mglmx 66:45a90a945983 1342 bool DR_init_dir = select_direction(true,"DR");
mglmx 55:aa3baa01f43d 1343
mglmx 55:aa3baa01f43d 1344 wait(0.5);
mglmx 55:aa3baa01f43d 1345
carlosperales95 68:9859a3ff9298 1346 int LR_init_sensor = select_sensor(D3,"LR");
carlosperales95 68:9859a3ff9298 1347 bool LR_init_dir = select_direction(true,"LR");
mglmx 55:aa3baa01f43d 1348
mglmx 55:aa3baa01f43d 1349 DR_train.set_position(DR_init_sensor);
mglmx 55:aa3baa01f43d 1350 DR_train.set_goes_cw(DR_init_dir);
mglmx 55:aa3baa01f43d 1351
mglmx 55:aa3baa01f43d 1352 LR_train.set_position(LR_init_sensor);
mglmx 55:aa3baa01f43d 1353 LR_train.set_goes_cw(LR_init_dir);
mglmx 55:aa3baa01f43d 1354
mglmx 55:aa3baa01f43d 1355 string DR_print_dir, LR_print_dir;
mglmx 55:aa3baa01f43d 1356
carlosperales95 71:9a303d90c9b8 1357 if(DR_train.goes_cw()){DR_print_dir = "cw";}
carlosperales95 71:9a303d90c9b8 1358 else{DR_print_dir = "ccw";}
mglmx 55:aa3baa01f43d 1359
carlosperales95 71:9a303d90c9b8 1360 if(LR_train.goes_cw()){LR_print_dir = "cw";}
carlosperales95 71:9a303d90c9b8 1361 else{LR_print_dir = "ccw";}
mglmx 55:aa3baa01f43d 1362
mglmx 55:aa3baa01f43d 1363 lcd.cls();
mglmx 55:aa3baa01f43d 1364 lcd.printf("DR(%d)%s \n LR(%d)%s",DR_train.get_position_number(),DR_print_dir,LR_train.get_position_number(),LR_print_dir);
mglmx 55:aa3baa01f43d 1365
mglmx 55:aa3baa01f43d 1366 wait(2);
mglmx 55:aa3baa01f43d 1367
carlosperales95 71:9a303d90c9b8 1368 //LED2+LED3 Shows start of route + LCD notif
carlosperales95 71:9a303d90c9b8 1369 led2 = 1; // Entering the while
carlosperales95 71:9a303d90c9b8 1370 wait(0.4);
mglmx 22:e4153ca757dd 1371 led3 = 1; // Entering the while
carlosperales95 71:9a303d90c9b8 1372 wait(0.4);
carlosperales95 71:9a303d90c9b8 1373
mglmx 22:e4153ca757dd 1374 lcd.cls();
mglmx 22:e4153ca757dd 1375 lcd.printf("Ready to start");
mglmx 55:aa3baa01f43d 1376 wait(1);
carlosperales95 19:ff21ba3a4dc5 1377
carlosperales95 56:fe999806787d 1378 enable = 1;
carlosperales95 56:fe999806787d 1379
carlosperales95 71:9a303d90c9b8 1380 led1 = 0;
carlosperales95 71:9a303d90c9b8 1381 led2 = 0;
carlosperales95 71:9a303d90c9b8 1382 led3 = 0;
carlosperales95 71:9a303d90c9b8 1383
carlosperales95 71:9a303d90c9b8 1384 //Demo for stopping at the station
carlosperales95 71:9a303d90c9b8 1385 while(1) {
carlosperales95 71:9a303d90c9b8 1386
carlosperales95 71:9a303d90c9b8 1387 checkSwitch(); //Checks for switch commands everytime.
carlosperales95 71:9a303d90c9b8 1388 switch_toSpeed();
carlosperales95 71:9a303d90c9b8 1389 lcd.cls();
carlosperales95 72:a1bd95af46b8 1390 check_position();
carlosperales95 72:a1bd95af46b8 1391 }
carlosperales95 71:9a303d90c9b8 1392 }
carlosperales95 71:9a303d90c9b8 1393
carlosperales95 71:9a303d90c9b8 1394
carlosperales95 71:9a303d90c9b8 1395 //**********************SAVED CODE CHUNKS****************************//
carlosperales95 71:9a303d90c9b8 1396
carlosperales95 71:9a303d90c9b8 1397
carlosperales95 71:9a303d90c9b8 1398 /**Flip switch-idle routine
carlosperales95 71:9a303d90c9b8 1399
mglmx 66:45a90a945983 1400 flip_switch(5,15);//Send IDLE command at the beginning
mglmx 66:45a90a945983 1401 flip_switch(1,40);
mglmx 66:45a90a945983 1402 wait(0.5);
mglmx 66:45a90a945983 1403 flip_switch(5,15);
mglmx 66:45a90a945983 1404 flip_switch(2,15);
mglmx 66:45a90a945983 1405 wait(0.5);
mglmx 66:45a90a945983 1406 flip_switch(5,15);
mglmx 66:45a90a945983 1407 flip_switch(3,40);
mglmx 66:45a90a945983 1408 wait(0.5);
mglmx 66:45a90a945983 1409 flip_switch(5,15);
mglmx 66:45a90a945983 1410 flip_switch(4,15);
mglmx 66:45a90a945983 1411 wait(0.5);
mglmx 66:45a90a945983 1412 flip_switch(5,15);
mglmx 66:45a90a945983 1413
carlosperales95 71:9a303d90c9b8 1414 **/
carlosperales95 69:609c69e91b4e 1415
carlosperales95 71:9a303d90c9b8 1416 /**Code for train to stop at station
carlosperales95 71:9a303d90c9b8 1417
carlosperales95 71:9a303d90c9b8 1418 if(station == 1){ //If train is on the sensor at the middle of the station it stops and displays LCD text.
carlosperales95 14:7bb998edd819 1419
mglmx 4:50879dfb82d5 1420 lcd.cls();
carlosperales95 29:559eb2164488 1421 lcd.printf("All aboard\n mind the gap");
mglmx 32:e5b732fb8e65 1422 DCC_send_command(DCCaddressDR,DCCinst_stop,400);
carlosperales95 29:559eb2164488 1423 lcd.cls();
mglmx 4:50879dfb82d5 1424
mglmx 22:e4153ca757dd 1425 }else{
mglmx 57:ee5da8a011e0 1426 DR_train.run();
mglmx 57:ee5da8a011e0 1427 LR_train.run();
mglmx 55:aa3baa01f43d 1428
carlosperales95 25:a42a1ed4d8e9 1429 }
carlosperales95 71:9a303d90c9b8 1430
carlosperales95 71:9a303d90c9b8 1431 **/
carlosperales95 71:9a303d90c9b8 1432
carlosperales95 71:9a303d90c9b8 1433
carlosperales95 71:9a303d90c9b8 1434 /**Train light routine to start running
carlosperales95 71:9a303d90c9b8 1435
carlosperales95 71:9a303d90c9b8 1436
carlosperales95 71:9a303d90c9b8 1437 DCC_send_command(DCCaddressDR,DCC_func_lighton,200); // turn light on full
carlosperales95 71:9a303d90c9b8 1438 DCC_send_command(DCCaddressDR,DCC_func_dimlight,400); // dim light
carlosperales95 71:9a303d90c9b8 1439 DCC_send_command(DCCaddressDR,DCC_func_lighton,200); // light full again
carlosperales95 71:9a303d90c9b8 1440
carlosperales95 71:9a303d90c9b8 1441
carlosperales95 71:9a303d90c9b8 1442 **/
carlosperales95 71:9a303d90c9b8 1443
carlosperales95 71:9a303d90c9b8 1444 /**Print if train is found and updated in update_Train_pos();
carlosperales95 71:9a303d90c9b8 1445 if(found_DR){
carlosperales95 71:9a303d90c9b8 1446
carlosperales95 71:9a303d90c9b8 1447 //doBuzz();
carlosperales95 71:9a303d90c9b8 1448 lcd.cls();
carlosperales95 71:9a303d90c9b8 1449 lcd.printf("DR is at D%d",DR_train.get_position_number());
carlosperales95 71:9a303d90c9b8 1450 }
carlosperales95 71:9a303d90c9b8 1451
carlosperales95 71:9a303d90c9b8 1452 if(found_LR){
carlosperales95 71:9a303d90c9b8 1453
carlosperales95 71:9a303d90c9b8 1454 lcd.cls();
carlosperales95 71:9a303d90c9b8 1455 lcd.printf("LR is at D%d",LR_train.get_position_number());
carlosperales95 71:9a303d90c9b8 1456 }
carlosperales95 71:9a303d90c9b8 1457
carlosperales95 71:9a303d90c9b8 1458 if(!found_DR && !found_LR){
carlosperales95 71:9a303d90c9b8 1459
carlosperales95 71:9a303d90c9b8 1460 lcd.cls();
carlosperales95 71:9a303d90c9b8 1461 lcd.printf("No train before :(");
carlosperales95 71:9a303d90c9b8 1462 }
carlosperales95 71:9a303d90c9b8 1463 **/
carlosperales95 71:9a303d90c9b8 1464
carlosperales95 71:9a303d90c9b8 1465
carlosperales95 71:9a303d90c9b8 1466 /**Print sensor interrupts in int0 and int1 functions
carlosperales95 71:9a303d90c9b8 1467
carlosperales95 71:9a303d90c9b8 1468 //lcd.cls();
carlosperales95 71:9a303d90c9b8 1469 //lcd.printf("int0 0x%x \n Sensor: %d",sensor_data,sensor);
carlosperales95 71:9a303d90c9b8 1470
carlosperales95 71:9a303d90c9b8 1471 **/
carlosperales95 71:9a303d90c9b8 1472
carlosperales95 71:9a303d90c9b8 1473 /**Print the potentiometer value
carlosperales95 71:9a303d90c9b8 1474
carlosperales95 71:9a303d90c9b8 1475 //lcd.cls();
carlosperales95 71:9a303d90c9b8 1476 // lcd.printf("vin: %.4f",vin);
carlosperales95 71:9a303d90c9b8 1477
carlosperales95 71:9a303d90c9b8 1478 **/
carlosperales95 71:9a303d90c9b8 1479
carlosperales95 71:9a303d90c9b8 1480 /** Chunk 1 of comments from main
carlosperales95 71:9a303d90c9b8 1481
carlosperales95 71:9a303d90c9b8 1482 //RISE FOR INTERRUPTS?? NOT WORKING ATM
carlosperales95 71:9a303d90c9b8 1483 //int0.rise(&interrupt0);
carlosperales95 71:9a303d90c9b8 1484 //int1.rise(&interrupt1);
carlosperales95 71:9a303d90c9b8 1485
carlosperales95 71:9a303d90c9b8 1486 //Read and display potentiometer
carlosperales95 71:9a303d90c9b8 1487 //float f = pot.read();
carlosperales95 71:9a303d90c9b8 1488 //float vin = f * 3.3;
carlosperales95 71:9a303d90c9b8 1489 //lcd.printf("vin: %.4f",vin);
carlosperales95 71:9a303d90c9b8 1490
carlosperales95 71:9a303d90c9b8 1491 //0xFFFC //1111111111111100
carlosperales95 71:9a303d90c9b8 1492
carlosperales95 71:9a303d90c9b8 1493 **/