not running

Dependencies:   TextLCD MQTT

Committer:
hyan99
Date:
Tue Dec 10 22:29:09 2019 +0000
Revision:
0:3b4906b8a747
Child:
1:19c3299ea83a
error

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hyan99 0:3b4906b8a747 1 /* mbed Microcontroller Library
hyan99 0:3b4906b8a747 2 * Copyright (c) 2018 ARM Limited
hyan99 0:3b4906b8a747 3 * SPDX-License-Identifier: Apache-2.0
hyan99 0:3b4906b8a747 4 */
hyan99 0:3b4906b8a747 5
hyan99 0:3b4906b8a747 6 #include "mbed.h"
hyan99 0:3b4906b8a747 7 #include <cctype>
hyan99 0:3b4906b8a747 8 #include "Car.h"
hyan99 0:3b4906b8a747 9 #include "AccCar.h"
hyan99 0:3b4906b8a747 10 #include "TextLCD.h"
hyan99 0:3b4906b8a747 11 #include "Road.h"
hyan99 0:3b4906b8a747 12 #include "Intersection.h"
hyan99 0:3b4906b8a747 13 #include "Communication.h"
hyan99 0:3b4906b8a747 14
hyan99 0:3b4906b8a747 15 #include <algorithm>
hyan99 0:3b4906b8a747 16 #include <vector>
hyan99 0:3b4906b8a747 17 #include <string>
hyan99 0:3b4906b8a747 18 #include <stdlib.h>
hyan99 0:3b4906b8a747 19
hyan99 0:3b4906b8a747 20 Serial pc(USBTX, USBRX);
hyan99 0:3b4906b8a747 21 TextLCD lcd(p15, p16, p17, p18, p19, p20);
hyan99 0:3b4906b8a747 22
hyan99 0:3b4906b8a747 23 #define ROADLENGTH 100
hyan99 0:3b4906b8a747 24 #define STOP 54
hyan99 0:3b4906b8a747 25 #define MIN_SPEED 5
hyan99 0:3b4906b8a747 26 #define MAX_SPEED 15
hyan99 0:3b4906b8a747 27
hyan99 0:3b4906b8a747 28 // Read the max number of services to perform from pc input
hyan99 0:3b4906b8a747 29 int read_int(char* prompt) {
hyan99 0:3b4906b8a747 30 int maxService = 0;
hyan99 0:3b4906b8a747 31
hyan99 0:3b4906b8a747 32 pc.printf(prompt);
hyan99 0:3b4906b8a747 33
hyan99 0:3b4906b8a747 34 char input;
hyan99 0:3b4906b8a747 35 while(1) {
hyan99 0:3b4906b8a747 36 input = pc.getc();
hyan99 0:3b4906b8a747 37 pc.putc(input);
hyan99 0:3b4906b8a747 38
hyan99 0:3b4906b8a747 39 if( std::isdigit(input) ) {
hyan99 0:3b4906b8a747 40 maxService = (maxService * 10) + (input-'0');
hyan99 0:3b4906b8a747 41 } else {
hyan99 0:3b4906b8a747 42 pc.putc(input);
hyan99 0:3b4906b8a747 43 break;
hyan99 0:3b4906b8a747 44 }
hyan99 0:3b4906b8a747 45 }
hyan99 0:3b4906b8a747 46
hyan99 0:3b4906b8a747 47 return maxService;
hyan99 0:3b4906b8a747 48 }
hyan99 0:3b4906b8a747 49
hyan99 0:3b4906b8a747 50 // main() runs in its own thread in the OS
hyan99 0:3b4906b8a747 51 int main()
hyan99 0:3b4906b8a747 52 {
hyan99 0:3b4906b8a747 53
hyan99 0:3b4906b8a747 54 pc.printf("\nStarting simulation\n");
hyan99 0:3b4906b8a747 55 // ------------------------------------------------------------------------------
hyan99 0:3b4906b8a747 56 // The following three variables are used for timing statistics, do not modify them
hyan99 0:3b4906b8a747 57 Timer stopwatch; // A timer to keep track of how long the updates take, for statistics purposes
hyan99 0:3b4906b8a747 58 int numberCycles = 0;
hyan99 0:3b4906b8a747 59 int totalUpdateTime = 0;
hyan99 0:3b4906b8a747 60 // ------------------------------------------------------------------------------
hyan99 0:3b4906b8a747 61
hyan99 0:3b4906b8a747 62 Intersection intersection;
hyan99 0:3b4906b8a747 63
hyan99 0:3b4906b8a747 64 // Initialize Communication
hyan99 0:3b4906b8a747 65 Communication* communication = Communication::getInstance();
hyan99 0:3b4906b8a747 66 // Initialize 5 AccCars and the Road
hyan99 0:3b4906b8a747 67 Road road1("Rahman/Sync/Receive/1", "Rahman/Sync/Send/1");
hyan99 0:3b4906b8a747 68 intersection.road1 = &road1;
hyan99 0:3b4906b8a747 69 road1.intersection = &intersection;
hyan99 0:3b4906b8a747 70 AccCar car11(1, &road1, 0x01, "Rahman/Position/1/1", "Rahman/Control/1/1");
hyan99 0:3b4906b8a747 71 AccCar car12(2, &road1, 0x02, "Rahman/Position/1/2", "Rahman/Control/1/2");
hyan99 0:3b4906b8a747 72 AccCar car13(3, &road1, 0x04, "Rahman/Position/1/3", "Rahman/Control/1/3");
hyan99 0:3b4906b8a747 73 AccCar car14(4, &road1, 0x08, "Rahman/Position/1/4", "Rahman/Control/1/4");
hyan99 0:3b4906b8a747 74 AccCar car15(5, &road1, 0x10, "Rahman/Position/1/5", "Rahman/Control/1/5");
hyan99 0:3b4906b8a747 75
hyan99 0:3b4906b8a747 76 std::vector<AccCar*> q1;
hyan99 0:3b4906b8a747 77 q1.push_back(&car15);
hyan99 0:3b4906b8a747 78 q1.push_back(&car14);
hyan99 0:3b4906b8a747 79 q1.push_back(&car13);
hyan99 0:3b4906b8a747 80 q1.push_back(&car12);
hyan99 0:3b4906b8a747 81 q1.push_back(&car11);
hyan99 0:3b4906b8a747 82
hyan99 0:3b4906b8a747 83 for (int i = 0; i < 4; i++) {
hyan99 0:3b4906b8a747 84 q1[i]->set_forward_car(q1[i+1]);
hyan99 0:3b4906b8a747 85 }
hyan99 0:3b4906b8a747 86
hyan99 0:3b4906b8a747 87 AccCar *lastCar1 = q1.front();
hyan99 0:3b4906b8a747 88
hyan99 0:3b4906b8a747 89 stopwatch.start();
hyan99 0:3b4906b8a747 90
hyan99 0:3b4906b8a747 91 communication->reset(); // start thread
hyan99 0:3b4906b8a747 92
hyan99 0:3b4906b8a747 93 int interval = MAX_SPEED - MIN_SPEED + 1;
hyan99 0:3b4906b8a747 94 car11.reset(rand() % interval + MIN_SPEED); // set random speed [5, 15]
hyan99 0:3b4906b8a747 95 car12.reset(rand() % interval + MIN_SPEED);
hyan99 0:3b4906b8a747 96 car13.reset(rand() % interval + MIN_SPEED);
hyan99 0:3b4906b8a747 97 car14.reset(rand() % interval + MIN_SPEED);
hyan99 0:3b4906b8a747 98 car15.reset(rand() % interval + MIN_SPEED);
hyan99 0:3b4906b8a747 99
hyan99 0:3b4906b8a747 100 stopwatch.reset();
hyan99 0:3b4906b8a747 101
hyan99 0:3b4906b8a747 102 int waitTime1 = 0;
hyan99 0:3b4906b8a747 103
hyan99 0:3b4906b8a747 104 do {
hyan99 0:3b4906b8a747 105 int enterRoad1 = -1;
hyan99 0:3b4906b8a747 106 int enterCross1 = -1;
hyan99 0:3b4906b8a747 107
hyan99 0:3b4906b8a747 108 if (numberCycles == 0) {
hyan99 0:3b4906b8a747 109 // first car enters unconditionally
hyan99 0:3b4906b8a747 110 AccCar *car1 = q1.back();
hyan99 0:3b4906b8a747 111 enterRoad1 = car1->id;
hyan99 0:3b4906b8a747 112 road1.add_acc_car(car1, car1->id);
hyan99 0:3b4906b8a747 113 q1.pop_back();
hyan99 0:3b4906b8a747 114 waitTime1 = rand() % 4;
hyan99 0:3b4906b8a747 115 }
hyan99 0:3b4906b8a747 116 else {
hyan99 0:3b4906b8a747 117 if (q1.size() > 0) {
hyan99 0:3b4906b8a747 118 if (waitTime1 == 0) {
hyan99 0:3b4906b8a747 119 AccCar *car1 = q1.back();
hyan99 0:3b4906b8a747 120 if (car1->forward_car->position - 2 >= car1->speed) {
hyan99 0:3b4906b8a747 121 road1.add_acc_car(car1, car1->id);
hyan99 0:3b4906b8a747 122 enterRoad1 = car1->id;
hyan99 0:3b4906b8a747 123 q1.pop_back();
hyan99 0:3b4906b8a747 124 waitTime1 = rand() % 4;
hyan99 0:3b4906b8a747 125 }
hyan99 0:3b4906b8a747 126 } else {
hyan99 0:3b4906b8a747 127 waitTime1 = waitTime1 - 1;
hyan99 0:3b4906b8a747 128 }
hyan99 0:3b4906b8a747 129 }
hyan99 0:3b4906b8a747 130 }
hyan99 0:3b4906b8a747 131
hyan99 0:3b4906b8a747 132 road1.let_cars_update();
hyan99 0:3b4906b8a747 133 road1.wait_for_car_update();
hyan99 0:3b4906b8a747 134 // ------------------------------------------------------------------
hyan99 0:3b4906b8a747 135 // Timing statistics logic, do not modify
hyan99 0:3b4906b8a747 136 totalUpdateTime += stopwatch.read_ms();
hyan99 0:3b4906b8a747 137 numberCycles++;
hyan99 0:3b4906b8a747 138 stopwatch.reset();
hyan99 0:3b4906b8a747 139 // ------------------------------------------------------------------
hyan99 0:3b4906b8a747 140
hyan99 0:3b4906b8a747 141 if (car11.position == STOP) {
hyan99 0:3b4906b8a747 142 enterCross1 = 1;
hyan99 0:3b4906b8a747 143 } else if (car12.position == STOP) {
hyan99 0:3b4906b8a747 144 enterCross1 = 2;
hyan99 0:3b4906b8a747 145 } else if (car13.position == STOP) {
hyan99 0:3b4906b8a747 146 enterCross1 = 3;
hyan99 0:3b4906b8a747 147 } else if (car14.position == STOP) {
hyan99 0:3b4906b8a747 148 enterCross1 = 4;
hyan99 0:3b4906b8a747 149 } else if (car15.position == STOP) {
hyan99 0:3b4906b8a747 150 enterCross1 = 5;
hyan99 0:3b4906b8a747 151 }
hyan99 0:3b4906b8a747 152 lcd.cls();
hyan99 0:3b4906b8a747 153 if (enterRoad1 == -1 && enterCross1 == -1) {
hyan99 0:3b4906b8a747 154 lcd.printf("x, x\n");
hyan99 0:3b4906b8a747 155 } else if (enterRoad1 == -1) {
hyan99 0:3b4906b8a747 156 lcd.printf("x, %d\n", enterCross1);
hyan99 0:3b4906b8a747 157 } else if (enterCross1 == -1) {
hyan99 0:3b4906b8a747 158 lcd.printf("%d, x\n", enterRoad1);
hyan99 0:3b4906b8a747 159 } else {
hyan99 0:3b4906b8a747 160 lcd.printf("%d, %d\n", enterRoad1, enterCross1);
hyan99 0:3b4906b8a747 161 }
hyan99 0:3b4906b8a747 162
hyan99 0:3b4906b8a747 163 pc.printf("Car 1 on road 1: position %d, speed %d\r\n", car11.position, car11.speed);
hyan99 0:3b4906b8a747 164 pc.printf("Car 2 on road 1: position %d, speed %d\r\n", car12.position, car12.speed);
hyan99 0:3b4906b8a747 165 pc.printf("Car 3 on road 1: position %d, speed %d\r\n", car13.position, car13.speed);
hyan99 0:3b4906b8a747 166 pc.printf("Car 4 on road 1: position %d, speed %d\r\n", car14.position, car14.speed);
hyan99 0:3b4906b8a747 167 pc.printf("Car 5 on road 1: position %d, speed %d\r\n", car15.position, car15.speed);
hyan99 0:3b4906b8a747 168
hyan99 0:3b4906b8a747 169 } while (lastCar1->position <= ROADLENGTH);
hyan99 0:3b4906b8a747 170 car11.stop();
hyan99 0:3b4906b8a747 171 car12.stop();
hyan99 0:3b4906b8a747 172 car13.stop();
hyan99 0:3b4906b8a747 173 car14.stop();
hyan99 0:3b4906b8a747 174 car15.stop();
hyan99 0:3b4906b8a747 175 communication->stop();
hyan99 0:3b4906b8a747 176
hyan99 0:3b4906b8a747 177 // ----------------------------------------------------------------------
hyan99 0:3b4906b8a747 178 // Timing statistics printout, do not modify
hyan99 0:3b4906b8a747 179 pc.printf("Average update cycle took: %fms \r\n", (totalUpdateTime*1.0)/(numberCycles*1.0));
hyan99 0:3b4906b8a747 180 totalUpdateTime = 0;
hyan99 0:3b4906b8a747 181 numberCycles = 0;
hyan99 0:3b4906b8a747 182 // ----------------------------------------------------------------------
hyan99 0:3b4906b8a747 183 }