CIS441 Proj MS 2b

Dependencies:   TextLCD MQTT

Committer:
mwgold
Date:
Thu Dec 12 21:51:10 2019 +0000
Revision:
8:c40e805eecba
Parent:
4:ef8866873df5
Child:
9:f5981ced0b47
publishes correctly

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