Denver trai project

Dependencies:   mbed TextLCD

Committer:
carlosperales95
Date:
Tue Jun 26 14:22:47 2018 +0000
Revision:
68:9859a3ff9298
Parent:
67:7ff2425141ce
Child:
69:609c69e91b4e
AFC&ALC Working

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