
CIS441 Proj MS 2b
Road.cpp@16:cb7cbf2cc23b, 2019-12-13 (annotated)
- 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?
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; |
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 | } |