
not running
main.cpp
- Committer:
- hyan99
- Date:
- 2019-12-10
- Revision:
- 0:3b4906b8a747
- Child:
- 1:19c3299ea83a
File content as of revision 0:3b4906b8a747:
/* mbed Microcontroller Library * Copyright (c) 2018 ARM Limited * SPDX-License-Identifier: Apache-2.0 */ #include "mbed.h" #include <cctype> #include "Car.h" #include "AccCar.h" #include "TextLCD.h" #include "Road.h" #include "Intersection.h" #include "Communication.h" #include <algorithm> #include <vector> #include <string> #include <stdlib.h> Serial pc(USBTX, USBRX); TextLCD lcd(p15, p16, p17, p18, p19, p20); #define ROADLENGTH 100 #define STOP 54 #define MIN_SPEED 5 #define MAX_SPEED 15 // Read the max number of services to perform from pc input int read_int(char* prompt) { int maxService = 0; pc.printf(prompt); char input; while(1) { input = pc.getc(); pc.putc(input); if( std::isdigit(input) ) { maxService = (maxService * 10) + (input-'0'); } else { pc.putc(input); break; } } return maxService; } // main() runs in its own thread in the OS int main() { pc.printf("\nStarting simulation\n"); // ------------------------------------------------------------------------------ // The following three variables are used for timing statistics, do not modify them Timer stopwatch; // A timer to keep track of how long the updates take, for statistics purposes int numberCycles = 0; int totalUpdateTime = 0; // ------------------------------------------------------------------------------ Intersection intersection; // Initialize Communication Communication* communication = Communication::getInstance(); // Initialize 5 AccCars and the Road Road road1("Rahman/Sync/Receive/1", "Rahman/Sync/Send/1"); intersection.road1 = &road1; road1.intersection = &intersection; AccCar car11(1, &road1, 0x01, "Rahman/Position/1/1", "Rahman/Control/1/1"); AccCar car12(2, &road1, 0x02, "Rahman/Position/1/2", "Rahman/Control/1/2"); AccCar car13(3, &road1, 0x04, "Rahman/Position/1/3", "Rahman/Control/1/3"); AccCar car14(4, &road1, 0x08, "Rahman/Position/1/4", "Rahman/Control/1/4"); AccCar car15(5, &road1, 0x10, "Rahman/Position/1/5", "Rahman/Control/1/5"); std::vector<AccCar*> q1; q1.push_back(&car15); q1.push_back(&car14); q1.push_back(&car13); q1.push_back(&car12); q1.push_back(&car11); for (int i = 0; i < 4; i++) { q1[i]->set_forward_car(q1[i+1]); } AccCar *lastCar1 = q1.front(); stopwatch.start(); communication->reset(); // start thread int interval = MAX_SPEED - MIN_SPEED + 1; car11.reset(rand() % interval + MIN_SPEED); // set random speed [5, 15] car12.reset(rand() % interval + MIN_SPEED); car13.reset(rand() % interval + MIN_SPEED); car14.reset(rand() % interval + MIN_SPEED); car15.reset(rand() % interval + MIN_SPEED); stopwatch.reset(); int waitTime1 = 0; do { int enterRoad1 = -1; int enterCross1 = -1; if (numberCycles == 0) { // first car enters unconditionally AccCar *car1 = q1.back(); enterRoad1 = car1->id; road1.add_acc_car(car1, car1->id); q1.pop_back(); waitTime1 = rand() % 4; } else { if (q1.size() > 0) { if (waitTime1 == 0) { AccCar *car1 = q1.back(); if (car1->forward_car->position - 2 >= car1->speed) { road1.add_acc_car(car1, car1->id); enterRoad1 = car1->id; q1.pop_back(); waitTime1 = rand() % 4; } } else { waitTime1 = waitTime1 - 1; } } } road1.let_cars_update(); road1.wait_for_car_update(); // ------------------------------------------------------------------ // Timing statistics logic, do not modify totalUpdateTime += stopwatch.read_ms(); numberCycles++; stopwatch.reset(); // ------------------------------------------------------------------ if (car11.position == STOP) { enterCross1 = 1; } else if (car12.position == STOP) { enterCross1 = 2; } else if (car13.position == STOP) { enterCross1 = 3; } else if (car14.position == STOP) { enterCross1 = 4; } else if (car15.position == STOP) { enterCross1 = 5; } lcd.cls(); if (enterRoad1 == -1 && enterCross1 == -1) { lcd.printf("x, x\n"); } else if (enterRoad1 == -1) { lcd.printf("x, %d\n", enterCross1); } else if (enterCross1 == -1) { lcd.printf("%d, x\n", enterRoad1); } else { lcd.printf("%d, %d\n", enterRoad1, enterCross1); } pc.printf("Car 1 on road 1: position %d, speed %d\r\n", car11.position, car11.speed); pc.printf("Car 2 on road 1: position %d, speed %d\r\n", car12.position, car12.speed); pc.printf("Car 3 on road 1: position %d, speed %d\r\n", car13.position, car13.speed); pc.printf("Car 4 on road 1: position %d, speed %d\r\n", car14.position, car14.speed); pc.printf("Car 5 on road 1: position %d, speed %d\r\n", car15.position, car15.speed); } while (lastCar1->position <= ROADLENGTH); car11.stop(); car12.stop(); car13.stop(); car14.stop(); car15.stop(); communication->stop(); // ---------------------------------------------------------------------- // Timing statistics printout, do not modify pc.printf("Average update cycle took: %fms \r\n", (totalUpdateTime*1.0)/(numberCycles*1.0)); totalUpdateTime = 0; numberCycles = 0; // ---------------------------------------------------------------------- }