Matthew Goldsmith
/
cis441projMS2b
CIS441 Proj MS 2b
AccCar.cpp@16:cb7cbf2cc23b, 2019-12-13 (annotated)
- Committer:
- kchen7
- Date:
- Fri Dec 13 22:14:27 2019 +0000
- Revision:
- 16:cb7cbf2cc23b
- Parent:
- 8:c40e805eecba
final version;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mwgold | 0:ca7cb51e9fd1 | 1 | #include "AccCar.h" |
mwgold | 0:ca7cb51e9fd1 | 2 | #include <stdlib.h> |
mwgold | 0:ca7cb51e9fd1 | 3 | #include <algorithm> |
mwgold | 0:ca7cb51e9fd1 | 4 | |
mwgold | 0:ca7cb51e9fd1 | 5 | #define TICK 1000 |
mwgold | 0:ca7cb51e9fd1 | 6 | #define MONITOR_DIST 17 |
mwgold | 0:ca7cb51e9fd1 | 7 | #define SAFETY_GAP 2 |
mwgold | 0:ca7cb51e9fd1 | 8 | |
mwgold | 0:ca7cb51e9fd1 | 9 | AccCar::AccCar(int id, Road* road, int flag) { |
mwgold | 0:ca7cb51e9fd1 | 10 | this->id = id; |
mwgold | 0:ca7cb51e9fd1 | 11 | this->road = road; |
mwgold | 0:ca7cb51e9fd1 | 12 | this->flag = flag; |
mwgold | 0:ca7cb51e9fd1 | 13 | |
mwgold | 0:ca7cb51e9fd1 | 14 | waited = false; |
mwgold | 0:ca7cb51e9fd1 | 15 | |
mwgold | 0:ca7cb51e9fd1 | 16 | this->thread = NULL; |
mwgold | 0:ca7cb51e9fd1 | 17 | } |
mwgold | 0:ca7cb51e9fd1 | 18 | |
mwgold | 0:ca7cb51e9fd1 | 19 | void AccCar::set_forward_car(AccCar* car) { |
mwgold | 0:ca7cb51e9fd1 | 20 | this->forward_car = car; |
mwgold | 0:ca7cb51e9fd1 | 21 | } |
mwgold | 0:ca7cb51e9fd1 | 22 | |
mwgold | 0:ca7cb51e9fd1 | 23 | void AccCar::set_target_speed(int speed) { |
mwgold | 0:ca7cb51e9fd1 | 24 | this->target_speed = speed; |
mwgold | 0:ca7cb51e9fd1 | 25 | this->speed = speed; |
mwgold | 0:ca7cb51e9fd1 | 26 | } |
mwgold | 0:ca7cb51e9fd1 | 27 | |
mwgold | 0:ca7cb51e9fd1 | 28 | void AccCar::update() { |
mwgold | 0:ca7cb51e9fd1 | 29 | do { |
mwgold | 0:ca7cb51e9fd1 | 30 | ThisThread::sleep_for(TICK); |
mwgold | 0:ca7cb51e9fd1 | 31 | road->go_flags.wait_all(flag); |
mwgold | 0:ca7cb51e9fd1 | 32 | cycle++; |
mwgold | 0:ca7cb51e9fd1 | 33 | |
mwgold | 0:ca7cb51e9fd1 | 34 | position = position + speed; |
mwgold | 0:ca7cb51e9fd1 | 35 | |
mwgold | 0:ca7cb51e9fd1 | 36 | if (cycle % 5 == 0) { |
mwgold | 0:ca7cb51e9fd1 | 37 | target_speed = rand() % 11 + 5; |
mwgold | 0:ca7cb51e9fd1 | 38 | } |
mwgold | 0:ca7cb51e9fd1 | 39 | |
mwgold | 4:ef8866873df5 | 40 | if (forward_car != NULL && forward_car->position > -1) { |
mwgold | 4:ef8866873df5 | 41 | if (forward_car->position - position < MONITOR_DIST) { |
mwgold | 4:ef8866873df5 | 42 | road->done_flags.wait_all(forward_car->flag, osWaitForever, false); |
mwgold | 4:ef8866873df5 | 43 | |
mwgold | 4:ef8866873df5 | 44 | int diff = forward_car->position - position; |
mwgold | 4:ef8866873df5 | 45 | int maxSafeSpeed = diff - SAFETY_GAP; |
mwgold | 4:ef8866873df5 | 46 | |
mwgold | 4:ef8866873df5 | 47 | speed = std::min(maxSafeSpeed, target_speed); |
mwgold | 0:ca7cb51e9fd1 | 48 | } else { |
mwgold | 4:ef8866873df5 | 49 | speed = target_speed; |
mwgold | 0:ca7cb51e9fd1 | 50 | } |
mwgold | 4:ef8866873df5 | 51 | } else { |
mwgold | 4:ef8866873df5 | 52 | speed = target_speed; |
mwgold | 4:ef8866873df5 | 53 | } |
mwgold | 8:c40e805eecba | 54 | |
mwgold | 0:ca7cb51e9fd1 | 55 | road->done_flags.set(flag); |
mwgold | 0:ca7cb51e9fd1 | 56 | } while( position < 100 ); |
mwgold | 0:ca7cb51e9fd1 | 57 | } |
mwgold | 0:ca7cb51e9fd1 | 58 | |
mwgold | 0:ca7cb51e9fd1 | 59 | void AccCar::reset() { |
mwgold | 0:ca7cb51e9fd1 | 60 | road->done_flags.clear(flag); |
mwgold | 0:ca7cb51e9fd1 | 61 | |
mwgold | 0:ca7cb51e9fd1 | 62 | if (thread != NULL) { |
mwgold | 0:ca7cb51e9fd1 | 63 | thread->terminate(); |
mwgold | 0:ca7cb51e9fd1 | 64 | } |
mwgold | 0:ca7cb51e9fd1 | 65 | |
mwgold | 0:ca7cb51e9fd1 | 66 | thread = new Thread(); |
mwgold | 0:ca7cb51e9fd1 | 67 | thread->start( callback(this, &AccCar::update) ); |
mwgold | 0:ca7cb51e9fd1 | 68 | |
mwgold | 0:ca7cb51e9fd1 | 69 | this->position = 0; |
mwgold | 0:ca7cb51e9fd1 | 70 | this->cycle = 0; |
mwgold | 0:ca7cb51e9fd1 | 71 | } |