Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Road.cpp@0:ca7cb51e9fd1, 2019-11-10 (annotated)
- Committer:
- mwgold
- Date:
- Sun Nov 10 23:02:16 2019 +0000
- Revision:
- 0:ca7cb51e9fd1
- Child:
- 1:54512aca944d
initial
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 | 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 | } |
