
CIS441 Proj MS 2b
Road.cpp@8:c40e805eecba, 2019-12-12 (annotated)
- 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?
User | Revision | Line number | New 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 | } |