CIS441 Proj MS 2b

Dependencies:   TextLCD MQTT

Committer:
kchen7
Date:
Fri Dec 13 22:14:27 2019 +0000
Revision:
16:cb7cbf2cc23b
Parent:
9:f5981ced0b47
final version;

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
mwgold 4:ef8866873df5 4 Road::Road() {
mwgold 0:ca7cb51e9fd1 5 active_cars = 0x00;
mwgold 0:ca7cb51e9fd1 6 last_car = NULL;
mwgold 4:ef8866873df5 7 Road::road_in_use(this);
mwgold 0:ca7cb51e9fd1 8
mwgold 4:ef8866873df5 9 intersection_car = -1;
mwgold 0:ca7cb51e9fd1 10 next_release = 0;
mwgold 0:ca7cb51e9fd1 11 num_cars = 0;
kchen7 16:cb7cbf2cc23b 12 wait_counter = 0;
mwgold 0:ca7cb51e9fd1 13
mwgold 4:ef8866873df5 14 pending_car = new AccCar(num_cars, this, pow(2, num_cars));
mwgold 0:ca7cb51e9fd1 15 pending_car->set_target_speed(rand() % 11 + 5);
mwgold 0:ca7cb51e9fd1 16 }
mwgold 0:ca7cb51e9fd1 17
mwgold 4:ef8866873df5 18 Road* Road::road_in_use(Road* new_road) {
mwgold 4:ef8866873df5 19 static Road* road_in_use = NULL;
mwgold 4:ef8866873df5 20 if (new_road != NULL) {
mwgold 4:ef8866873df5 21 road_in_use = new_road;
mwgold 4:ef8866873df5 22 }
mwgold 4:ef8866873df5 23 return road_in_use;
mwgold 4:ef8866873df5 24 }
mwgold 4:ef8866873df5 25
mwgold 4:ef8866873df5 26 int Road::ready(int new_ready) {
mwgold 4:ef8866873df5 27 static int ready = -1;
mwgold 4:ef8866873df5 28 if (new_ready != -1) {
mwgold 4:ef8866873df5 29 ready = new_ready;
mwgold 4:ef8866873df5 30 }
mwgold 4:ef8866873df5 31 return ready;
mwgold 4:ef8866873df5 32 }
mwgold 4:ef8866873df5 33
mwgold 0:ca7cb51e9fd1 34 int Road::try_enter_car(int time) {
mwgold 0:ca7cb51e9fd1 35 if( next_release <= time && pending_car != NULL ) {
mwgold 0:ca7cb51e9fd1 36 if( last_car == NULL || last_car->position >= pending_car->speed + 2 ) {
mwgold 0:ca7cb51e9fd1 37 pending_car->set_forward_car(last_car);
mwgold 0:ca7cb51e9fd1 38 pending_car->reset();
mwgold 0:ca7cb51e9fd1 39 active_cars = active_cars | pending_car->flag;
mwgold 0:ca7cb51e9fd1 40
mwgold 0:ca7cb51e9fd1 41 last_car = pending_car;
mwgold 0:ca7cb51e9fd1 42 cars[num_cars] = pending_car;
mwgold 0:ca7cb51e9fd1 43
mwgold 0:ca7cb51e9fd1 44 num_cars++;
mwgold 0:ca7cb51e9fd1 45
mwgold 0:ca7cb51e9fd1 46 if(num_cars < MAX_CARS) {
mwgold 4:ef8866873df5 47 pending_car = new AccCar(num_cars, this, pow(2, num_cars));
mwgold 0:ca7cb51e9fd1 48 pending_car->set_target_speed(rand() % 11 + 5);
mwgold 0:ca7cb51e9fd1 49
mwgold 0:ca7cb51e9fd1 50 next_release = time + rand() % 3;
mwgold 0:ca7cb51e9fd1 51 } else {
mwgold 0:ca7cb51e9fd1 52 pending_car = NULL;
mwgold 0:ca7cb51e9fd1 53 }
mwgold 0:ca7cb51e9fd1 54
mwgold 0:ca7cb51e9fd1 55 return last_car->id;
mwgold 0:ca7cb51e9fd1 56 }
mwgold 0:ca7cb51e9fd1 57 }
mwgold 0:ca7cb51e9fd1 58
mwgold 0:ca7cb51e9fd1 59 return -1;
mwgold 0:ca7cb51e9fd1 60 }
mwgold 0:ca7cb51e9fd1 61
mwgold 0:ca7cb51e9fd1 62 void Road::let_cars_update() {
mwgold 0:ca7cb51e9fd1 63 if( active_cars > 0x00 ) {
mwgold 0:ca7cb51e9fd1 64 go_flags.set(active_cars);
mwgold 0:ca7cb51e9fd1 65 }
mwgold 0:ca7cb51e9fd1 66 }
mwgold 0:ca7cb51e9fd1 67
mwgold 0:ca7cb51e9fd1 68 void Road::wait_for_car_update() {
mwgold 0:ca7cb51e9fd1 69 if( active_cars > 0x00 ) {
mwgold 0:ca7cb51e9fd1 70 done_flags.wait_all(active_cars);
mwgold 0:ca7cb51e9fd1 71 }
mwgold 0:ca7cb51e9fd1 72 }
mwgold 0:ca7cb51e9fd1 73
mwgold 4:ef8866873df5 74 int Road::check_exit_cars(int cars[]) {
mwgold 4:ef8866873df5 75 int arr_index = 0;
mwgold 4:ef8866873df5 76
mwgold 0:ca7cb51e9fd1 77 for( int i=0; i < num_cars; i++ ) {
mwgold 4:ef8866873df5 78 if( this->cars[i]->position >= 100 ) {
mwgold 4:ef8866873df5 79 cars[arr_index] = this->cars[i]->id;
mwgold 4:ef8866873df5 80 arr_index++;
mwgold 4:ef8866873df5 81
mwgold 0:ca7cb51e9fd1 82 active_cars = active_cars ^ this->cars[i]->flag;
mwgold 0:ca7cb51e9fd1 83
mwgold 0:ca7cb51e9fd1 84 this->cars[i]->position = -1;
mwgold 0:ca7cb51e9fd1 85 this->cars[i]->speed = -1;
mwgold 0:ca7cb51e9fd1 86 }
mwgold 4:ef8866873df5 87 }
mwgold 4:ef8866873df5 88
mwgold 4:ef8866873df5 89 return arr_index;
mwgold 0:ca7cb51e9fd1 90 }
mwgold 0:ca7cb51e9fd1 91
mwgold 4:ef8866873df5 92 void Road::update_car_speed(int id, int speed) {
mwgold 4:ef8866873df5 93 cars[id]->speed = speed;
mwgold 4:ef8866873df5 94 }
mwgold 4:ef8866873df5 95
mwgold 0:ca7cb51e9fd1 96 void Road::print_status() {
mwgold 0:ca7cb51e9fd1 97 for( int i=0; i < num_cars; i++ ) {
mwgold 4:ef8866873df5 98 printf("Car %d: %d -> %d\r\n", cars[i]->id, cars[i]->position, cars[i]->speed);
mwgold 0:ca7cb51e9fd1 99 }
mwgold 8:c40e805eecba 100 }
mwgold 8:c40e805eecba 101
mwgold 8:c40e805eecba 102 void Road::publish_car_info() {
mwgold 8:c40e805eecba 103 for (int i = 0; i < num_cars; i++) {
mwgold 8:c40e805eecba 104 Communication::publish_car_info(i, cars[i]->position, cars[i]->speed);
mwgold 8:c40e805eecba 105 }
mwgold 8:c40e805eecba 106 for (int i = num_cars; i < MAX_CARS; i++) {
mwgold 8:c40e805eecba 107 Communication::publish_car_info(i, 0, 0);
mwgold 8:c40e805eecba 108 }
mwgold 9:f5981ced0b47 109 }
mwgold 9:f5981ced0b47 110
kchen7 16:cb7cbf2cc23b 111 void Road::update_wait_counter() {
kchen7 16:cb7cbf2cc23b 112 for (int i = 0; i < num_cars; i++) {
kchen7 16:cb7cbf2cc23b 113 if (cars[i]->position == 54) {
kchen7 16:cb7cbf2cc23b 114 wait_counter++;
kchen7 16:cb7cbf2cc23b 115 printf("Wait Counter: %d\r\n", wait_counter);
kchen7 16:cb7cbf2cc23b 116 }
kchen7 16:cb7cbf2cc23b 117 }
kchen7 16:cb7cbf2cc23b 118 }
kchen7 16:cb7cbf2cc23b 119
mwgold 9:f5981ced0b47 120 void Road::wait_for_sync() {
mwgold 9:f5981ced0b47 121 done_flags.wait_all(0xF0);
mwgold 8:c40e805eecba 122 }