Dependencies:   TextLCD MQTT

Committer:
kchen7
Date:
Mon Nov 11 00:50:05 2019 +0000
Revision:
1:54512aca944d
Parent:
0:ca7cb51e9fd1
Child:
4:ef8866873df5
attempt 1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mwgold 0:ca7cb51e9fd1 1 #include <math.h>
mwgold 0:ca7cb51e9fd1 2 #include "Road.h"
mwgold 0:ca7cb51e9fd1 3
kchen7 1:54512aca944d 4 Road::Road(Intersection* intersection, int roadId) {
mwgold 0:ca7cb51e9fd1 5 active_cars = 0x00;
mwgold 0:ca7cb51e9fd1 6 last_car = NULL;
mwgold 0:ca7cb51e9fd1 7
kchen7 1:54512aca944d 8 this->intersection = intersection;
kchen7 1:54512aca944d 9 this->roadId = roadId;
mwgold 0:ca7cb51e9fd1 10 next_release = 0;
mwgold 0:ca7cb51e9fd1 11 num_cars = 0;
mwgold 0:ca7cb51e9fd1 12
kchen7 1:54512aca944d 13 pending_car = new AccCar(num_cars + 5 * (roadId - 1), this, pow(2, num_cars));
mwgold 0:ca7cb51e9fd1 14 pending_car->set_target_speed(rand() % 11 + 5);
mwgold 0:ca7cb51e9fd1 15 }
mwgold 0:ca7cb51e9fd1 16
mwgold 0:ca7cb51e9fd1 17 int Road::try_enter_car(int time) {
mwgold 0:ca7cb51e9fd1 18 if( next_release <= time && pending_car != NULL ) {
mwgold 0:ca7cb51e9fd1 19 if( last_car == NULL || last_car->position >= pending_car->speed + 2 ) {
mwgold 0:ca7cb51e9fd1 20 pending_car->set_forward_car(last_car);
mwgold 0:ca7cb51e9fd1 21 pending_car->reset();
mwgold 0:ca7cb51e9fd1 22 active_cars = active_cars | pending_car->flag;
mwgold 0:ca7cb51e9fd1 23
mwgold 0:ca7cb51e9fd1 24 last_car = pending_car;
mwgold 0:ca7cb51e9fd1 25 cars[num_cars] = pending_car;
mwgold 0:ca7cb51e9fd1 26
mwgold 0:ca7cb51e9fd1 27 num_cars++;
mwgold 0:ca7cb51e9fd1 28
mwgold 0:ca7cb51e9fd1 29 if(num_cars < MAX_CARS) {
kchen7 1:54512aca944d 30 pending_car = new AccCar(num_cars + 5 * (this->roadId - 1), this, pow(2, num_cars));
mwgold 0:ca7cb51e9fd1 31 pending_car->set_target_speed(rand() % 11 + 5);
mwgold 0:ca7cb51e9fd1 32
mwgold 0:ca7cb51e9fd1 33 next_release = time + rand() % 3;
mwgold 0:ca7cb51e9fd1 34 } else {
mwgold 0:ca7cb51e9fd1 35 pending_car = NULL;
mwgold 0:ca7cb51e9fd1 36 }
mwgold 0:ca7cb51e9fd1 37
mwgold 0:ca7cb51e9fd1 38 return last_car->id;
mwgold 0:ca7cb51e9fd1 39 }
mwgold 0:ca7cb51e9fd1 40 }
mwgold 0:ca7cb51e9fd1 41
mwgold 0:ca7cb51e9fd1 42 return -1;
mwgold 0:ca7cb51e9fd1 43 }
mwgold 0:ca7cb51e9fd1 44
mwgold 0:ca7cb51e9fd1 45 void Road::let_cars_update() {
mwgold 0:ca7cb51e9fd1 46 if( active_cars > 0x00 ) {
mwgold 0:ca7cb51e9fd1 47 go_flags.set(active_cars);
mwgold 0:ca7cb51e9fd1 48 }
mwgold 0:ca7cb51e9fd1 49 }
mwgold 0:ca7cb51e9fd1 50
mwgold 0:ca7cb51e9fd1 51 void Road::wait_for_car_update() {
mwgold 0:ca7cb51e9fd1 52 if( active_cars > 0x00 ) {
mwgold 0:ca7cb51e9fd1 53 done_flags.wait_all(active_cars);
mwgold 0:ca7cb51e9fd1 54 }
mwgold 0:ca7cb51e9fd1 55 }
mwgold 0:ca7cb51e9fd1 56
kchen7 1:54512aca944d 57 void Road::check_exit_cars() {
mwgold 0:ca7cb51e9fd1 58 for( int i=0; i < num_cars; i++ ) {
kchen7 1:54512aca944d 59 if(this->cars[i]->position >= 100 ) {
mwgold 0:ca7cb51e9fd1 60 active_cars = active_cars ^ this->cars[i]->flag;
mwgold 0:ca7cb51e9fd1 61
mwgold 0:ca7cb51e9fd1 62 this->cars[i]->position = -1;
mwgold 0:ca7cb51e9fd1 63 this->cars[i]->speed = -1;
mwgold 0:ca7cb51e9fd1 64 }
kchen7 1:54512aca944d 65 }
mwgold 0:ca7cb51e9fd1 66 }
mwgold 0:ca7cb51e9fd1 67
mwgold 0:ca7cb51e9fd1 68 void Road::print_status() {
mwgold 0:ca7cb51e9fd1 69 for( int i=0; i < num_cars; i++ ) {
kchen7 1:54512aca944d 70 printf("Car %d on road %d: %d -> %d\r\n", cars[i]->id, this->roadId, cars[i]->position, cars[i]->speed);
mwgold 0:ca7cb51e9fd1 71 }
kchen7 1:54512aca944d 72 }
kchen7 1:54512aca944d 73
kchen7 1:54512aca944d 74 void Road::intendToEnter(int carId) {
kchen7 1:54512aca944d 75 intersection->intendToEnter(carId, this->roadId);
kchen7 1:54512aca944d 76 }