Matthew Goldsmith / Mbed OS cis441projMS1a

Dependencies:   TextLCD

Committer:
kchen7
Date:
Mon Nov 11 00:50:05 2019 +0000
Revision:
1:54512aca944d
Parent:
0:ca7cb51e9fd1
attempt 1

Who changed what in which revision?

UserRevisionLine numberNew 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 0:ca7cb51e9fd1 40 if( position < 54 ) {
mwgold 0:ca7cb51e9fd1 41 if (forward_car != NULL && forward_car->position > -1) {
mwgold 0:ca7cb51e9fd1 42 if (forward_car->position - position < MONITOR_DIST && forward_car->position < 55) {
mwgold 0:ca7cb51e9fd1 43 road->done_flags.wait_all(forward_car->flag, osWaitForever, false);
mwgold 0:ca7cb51e9fd1 44
mwgold 0:ca7cb51e9fd1 45 int diff = forward_car->position - position;
mwgold 0:ca7cb51e9fd1 46 int maxSafeSpeed = diff - SAFETY_GAP;
mwgold 0:ca7cb51e9fd1 47
mwgold 0:ca7cb51e9fd1 48 speed = std::min(maxSafeSpeed, target_speed);
mwgold 0:ca7cb51e9fd1 49 } else {
mwgold 0:ca7cb51e9fd1 50 speed = target_speed;
mwgold 0:ca7cb51e9fd1 51 }
mwgold 0:ca7cb51e9fd1 52 } else {
mwgold 0:ca7cb51e9fd1 53 speed = target_speed;
mwgold 0:ca7cb51e9fd1 54 }
mwgold 0:ca7cb51e9fd1 55
mwgold 0:ca7cb51e9fd1 56 int distance_to_intersection = 54 - position;
mwgold 0:ca7cb51e9fd1 57 speed = std::min(distance_to_intersection, speed);
mwgold 0:ca7cb51e9fd1 58
mwgold 0:ca7cb51e9fd1 59 } else if( position == 54 ) {
mwgold 0:ca7cb51e9fd1 60 if( waited) {
kchen7 1:54512aca944d 61 speed = road->intersection->attemptEnterIntersection(this->id);
mwgold 0:ca7cb51e9fd1 62 } else {
mwgold 0:ca7cb51e9fd1 63 speed = 0;
mwgold 0:ca7cb51e9fd1 64 waited = true;
kchen7 1:54512aca944d 65 road->intendToEnter(this->id);
mwgold 0:ca7cb51e9fd1 66 }
mwgold 0:ca7cb51e9fd1 67 } else if( position < 56 ) {
mwgold 0:ca7cb51e9fd1 68 speed = 1;
mwgold 0:ca7cb51e9fd1 69 } else {
mwgold 0:ca7cb51e9fd1 70 if( position == 56 ) {
kchen7 1:54512aca944d 71 road->intersection->leaveIntersection();
mwgold 0:ca7cb51e9fd1 72 }
mwgold 0:ca7cb51e9fd1 73
mwgold 0:ca7cb51e9fd1 74 if (forward_car != NULL && forward_car->position > -1) {
mwgold 0:ca7cb51e9fd1 75 if (forward_car->position - position < MONITOR_DIST ) {
mwgold 0:ca7cb51e9fd1 76 road->done_flags.wait_all(forward_car->flag, osWaitForever, false);
mwgold 0:ca7cb51e9fd1 77
mwgold 0:ca7cb51e9fd1 78 int diff = forward_car->position - position;
mwgold 0:ca7cb51e9fd1 79 int maxSafeSpeed = diff - SAFETY_GAP;
mwgold 0:ca7cb51e9fd1 80
mwgold 0:ca7cb51e9fd1 81 speed = std::min(maxSafeSpeed, target_speed);
mwgold 0:ca7cb51e9fd1 82 } else {
mwgold 0:ca7cb51e9fd1 83 speed = target_speed;
mwgold 0:ca7cb51e9fd1 84 }
mwgold 0:ca7cb51e9fd1 85
mwgold 0:ca7cb51e9fd1 86 } else {
mwgold 0:ca7cb51e9fd1 87 speed = target_speed;
mwgold 0:ca7cb51e9fd1 88 }
mwgold 0:ca7cb51e9fd1 89 }
mwgold 0:ca7cb51e9fd1 90
mwgold 0:ca7cb51e9fd1 91 road->done_flags.set(flag);
mwgold 0:ca7cb51e9fd1 92 } while( position < 100 );
mwgold 0:ca7cb51e9fd1 93 }
mwgold 0:ca7cb51e9fd1 94
mwgold 0:ca7cb51e9fd1 95 void AccCar::reset() {
mwgold 0:ca7cb51e9fd1 96 road->done_flags.clear(flag);
mwgold 0:ca7cb51e9fd1 97
mwgold 0:ca7cb51e9fd1 98 if (thread != NULL) {
mwgold 0:ca7cb51e9fd1 99 thread->terminate();
mwgold 0:ca7cb51e9fd1 100 }
mwgold 0:ca7cb51e9fd1 101
mwgold 0:ca7cb51e9fd1 102 thread = new Thread();
mwgold 0:ca7cb51e9fd1 103 thread->start( callback(this, &AccCar::update) );
mwgold 0:ca7cb51e9fd1 104
mwgold 0:ca7cb51e9fd1 105 this->position = 0;
mwgold 0:ca7cb51e9fd1 106 this->cycle = 0;
mwgold 0:ca7cb51e9fd1 107 }