Matthew Goldsmith / Mbed OS cis441projMS1a

Dependencies:   TextLCD

Committer:
mwgold
Date:
Sun Nov 10 23:02:16 2019 +0000
Revision:
0:ca7cb51e9fd1
Child:
1:54512aca944d
initial

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 0:ca7cb51e9fd1 4 Road::Road() {
mwgold 0:ca7cb51e9fd1 5 active_cars = 0x00;
mwgold 0:ca7cb51e9fd1 6 last_car = NULL;
mwgold 0:ca7cb51e9fd1 7
mwgold 0:ca7cb51e9fd1 8 intersection_car = -1;
mwgold 0:ca7cb51e9fd1 9 next_release = 0;
mwgold 0:ca7cb51e9fd1 10 num_cars = 0;
mwgold 0:ca7cb51e9fd1 11
mwgold 0:ca7cb51e9fd1 12 pending_car = new AccCar(num_cars, this, pow(2, num_cars));
mwgold 0:ca7cb51e9fd1 13 pending_car->set_target_speed(rand() % 11 + 5);
mwgold 0:ca7cb51e9fd1 14 }
mwgold 0:ca7cb51e9fd1 15
mwgold 0:ca7cb51e9fd1 16 int Road::try_enter_car(int time) {
mwgold 0:ca7cb51e9fd1 17 if( next_release <= time && pending_car != NULL ) {
mwgold 0:ca7cb51e9fd1 18 if( last_car == NULL || last_car->position >= pending_car->speed + 2 ) {
mwgold 0:ca7cb51e9fd1 19 pending_car->set_forward_car(last_car);
mwgold 0:ca7cb51e9fd1 20 pending_car->reset();
mwgold 0:ca7cb51e9fd1 21 active_cars = active_cars | pending_car->flag;
mwgold 0:ca7cb51e9fd1 22
mwgold 0:ca7cb51e9fd1 23 last_car = pending_car;
mwgold 0:ca7cb51e9fd1 24 cars[num_cars] = pending_car;
mwgold 0:ca7cb51e9fd1 25
mwgold 0:ca7cb51e9fd1 26 num_cars++;
mwgold 0:ca7cb51e9fd1 27
mwgold 0:ca7cb51e9fd1 28 if(num_cars < MAX_CARS) {
mwgold 0:ca7cb51e9fd1 29 pending_car = new AccCar(num_cars, this, pow(2, num_cars));
mwgold 0:ca7cb51e9fd1 30 pending_car->set_target_speed(rand() % 11 + 5);
mwgold 0:ca7cb51e9fd1 31
mwgold 0:ca7cb51e9fd1 32 next_release = time + rand() % 3;
mwgold 0:ca7cb51e9fd1 33 } else {
mwgold 0:ca7cb51e9fd1 34 pending_car = NULL;
mwgold 0:ca7cb51e9fd1 35 }
mwgold 0:ca7cb51e9fd1 36
mwgold 0:ca7cb51e9fd1 37 return last_car->id;
mwgold 0:ca7cb51e9fd1 38 }
mwgold 0:ca7cb51e9fd1 39 }
mwgold 0:ca7cb51e9fd1 40
mwgold 0:ca7cb51e9fd1 41 return -1;
mwgold 0:ca7cb51e9fd1 42 }
mwgold 0:ca7cb51e9fd1 43
mwgold 0:ca7cb51e9fd1 44 void Road::let_cars_update() {
mwgold 0:ca7cb51e9fd1 45 if( active_cars > 0x00 ) {
mwgold 0:ca7cb51e9fd1 46 go_flags.set(active_cars);
mwgold 0:ca7cb51e9fd1 47 }
mwgold 0:ca7cb51e9fd1 48 }
mwgold 0:ca7cb51e9fd1 49
mwgold 0:ca7cb51e9fd1 50 void Road::wait_for_car_update() {
mwgold 0:ca7cb51e9fd1 51 if( active_cars > 0x00 ) {
mwgold 0:ca7cb51e9fd1 52 done_flags.wait_all(active_cars);
mwgold 0:ca7cb51e9fd1 53 }
mwgold 0:ca7cb51e9fd1 54 }
mwgold 0:ca7cb51e9fd1 55
mwgold 0:ca7cb51e9fd1 56 int Road::check_exit_cars(int cars[]) {
mwgold 0:ca7cb51e9fd1 57 int arr_index = 0;
mwgold 0:ca7cb51e9fd1 58
mwgold 0:ca7cb51e9fd1 59 for( int i=0; i < num_cars; i++ ) {
mwgold 0:ca7cb51e9fd1 60 if( this->cars[i]->position >= 100 ) {
mwgold 0:ca7cb51e9fd1 61 cars[arr_index] = this->cars[i]->id;
mwgold 0:ca7cb51e9fd1 62 arr_index++;
mwgold 0:ca7cb51e9fd1 63
mwgold 0:ca7cb51e9fd1 64 active_cars = active_cars ^ this->cars[i]->flag;
mwgold 0:ca7cb51e9fd1 65
mwgold 0:ca7cb51e9fd1 66 this->cars[i]->position = -1;
mwgold 0:ca7cb51e9fd1 67 this->cars[i]->speed = -1;
mwgold 0:ca7cb51e9fd1 68 }
mwgold 0:ca7cb51e9fd1 69 }
mwgold 0:ca7cb51e9fd1 70
mwgold 0:ca7cb51e9fd1 71 return arr_index;
mwgold 0:ca7cb51e9fd1 72 }
mwgold 0:ca7cb51e9fd1 73
mwgold 0:ca7cb51e9fd1 74 void Road::print_status() {
mwgold 0:ca7cb51e9fd1 75 for( int i=0; i < num_cars; i++ ) {
mwgold 0:ca7cb51e9fd1 76 printf("Car %d: %d -> %d\r\n", cars[i]->id, cars[i]->position, cars[i]->speed);
mwgold 0:ca7cb51e9fd1 77 }
mwgold 0:ca7cb51e9fd1 78 }