Matthew Goldsmith
/
cis441projMS2b
Diff: Road.cpp
- Revision:
- 0:ca7cb51e9fd1
- Child:
- 1:54512aca944d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Road.cpp Sun Nov 10 23:02:16 2019 +0000 @@ -0,0 +1,78 @@ +#include <math.h> +#include "Road.h" + +Road::Road() { + active_cars = 0x00; + last_car = NULL; + + intersection_car = -1; + next_release = 0; + num_cars = 0; + + pending_car = new AccCar(num_cars, this, pow(2, num_cars)); + pending_car->set_target_speed(rand() % 11 + 5); +} + +int Road::try_enter_car(int time) { + if( next_release <= time && pending_car != NULL ) { + if( last_car == NULL || last_car->position >= pending_car->speed + 2 ) { + pending_car->set_forward_car(last_car); + pending_car->reset(); + active_cars = active_cars | pending_car->flag; + + last_car = pending_car; + cars[num_cars] = pending_car; + + num_cars++; + + if(num_cars < MAX_CARS) { + pending_car = new AccCar(num_cars, this, pow(2, num_cars)); + pending_car->set_target_speed(rand() % 11 + 5); + + next_release = time + rand() % 3; + } else { + pending_car = NULL; + } + + return last_car->id; + } + } + + return -1; +} + + void Road::let_cars_update() { + if( active_cars > 0x00 ) { + go_flags.set(active_cars); + } + } + + void Road::wait_for_car_update() { + if( active_cars > 0x00 ) { + done_flags.wait_all(active_cars); + } + } + + int Road::check_exit_cars(int cars[]) { + int arr_index = 0; + + for( int i=0; i < num_cars; i++ ) { + if( this->cars[i]->position >= 100 ) { + cars[arr_index] = this->cars[i]->id; + arr_index++; + + active_cars = active_cars ^ this->cars[i]->flag; + + this->cars[i]->position = -1; + this->cars[i]->speed = -1; + } + } + + return arr_index; + } + + void Road::print_status() { + for( int i=0; i < num_cars; i++ ) { + printf("Car %d: %d -> %d\r\n", cars[i]->id, cars[i]->position, cars[i]->speed); + } + } \ No newline at end of file