Denver / Mbed 2 deprecated denver_train_proj

Dependencies:   mbed TextLCD

Committer:
carlosperales95
Date:
Wed Jun 27 11:11:28 2018 +0000
Revision:
74:dbbc528f2b18
Parent:
73:1bf7f6a38fde
Child:
75:bae748a7905f
Code organiz. and comments;

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