Han Yan
/
ms2b
not running
main.cpp@0:3b4906b8a747, 2019-12-10 (annotated)
- Committer:
- hyan99
- Date:
- Tue Dec 10 22:29:09 2019 +0000
- Revision:
- 0:3b4906b8a747
- Child:
- 1:19c3299ea83a
error
Who changed what in which revision?
User | Revision | Line number | New 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 | } |