CIS441 Proj MS 2b

Dependencies:   TextLCD MQTT

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?

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 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 }