For Evans

Dependencies:   TextLCD

Committer:
MannyK
Date:
Wed Oct 09 16:29:06 2019 +0000
Revision:
0:f17da79e74c9
For Evans

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MannyK 0:f17da79e74c9 1 #include "AccCar.h"
MannyK 0:f17da79e74c9 2 #include <stdlib.h>
MannyK 0:f17da79e74c9 3 #include <algorithm>
MannyK 0:f17da79e74c9 4
MannyK 0:f17da79e74c9 5 #define TICK 1000
MannyK 0:f17da79e74c9 6 #define MONITOR_DIST 17
MannyK 0:f17da79e74c9 7 #define SAFETY_GAP 2
MannyK 0:f17da79e74c9 8
MannyK 0:f17da79e74c9 9 AccCar::AccCar(int id, Road* road, int flag) {
MannyK 0:f17da79e74c9 10 this->id = id;
MannyK 0:f17da79e74c9 11 this->road = road;
MannyK 0:f17da79e74c9 12 this->flag = flag;
MannyK 0:f17da79e74c9 13 cycle = 0;
MannyK 0:f17da79e74c9 14 this->thread = NULL;
MannyK 0:f17da79e74c9 15 }
MannyK 0:f17da79e74c9 16
MannyK 0:f17da79e74c9 17 void AccCar::set_forward_car(AccCar* car) {
MannyK 0:f17da79e74c9 18 this->forward_car = car;
MannyK 0:f17da79e74c9 19 }
MannyK 0:f17da79e74c9 20
MannyK 0:f17da79e74c9 21 void AccCar::update() {
MannyK 0:f17da79e74c9 22 while (true) {
MannyK 0:f17da79e74c9 23 ThisThread::sleep_for(TICK);
MannyK 0:f17da79e74c9 24 road->go_flags.wait_all(flag);
MannyK 0:f17da79e74c9 25 cycle++;
MannyK 0:f17da79e74c9 26
MannyK 0:f17da79e74c9 27 position = position + speed;
MannyK 0:f17da79e74c9 28
MannyK 0:f17da79e74c9 29 if (cycle % 5 == 0) {
MannyK 0:f17da79e74c9 30 speed = rand() % 11 + 5;
MannyK 0:f17da79e74c9 31 }
MannyK 0:f17da79e74c9 32
MannyK 0:f17da79e74c9 33 if (forward_car->position - position < MONITOR_DIST) {
MannyK 0:f17da79e74c9 34 road->done_flags.wait_all(forward_car->flag, osWaitForever, false);
MannyK 0:f17da79e74c9 35
MannyK 0:f17da79e74c9 36 int diff = forward_car->position - position;
MannyK 0:f17da79e74c9 37 int maxSafeSpeed = diff - SAFETY_GAP;
MannyK 0:f17da79e74c9 38
MannyK 0:f17da79e74c9 39 speed = std::min(maxSafeSpeed, target_speed);
MannyK 0:f17da79e74c9 40 } else {
MannyK 0:f17da79e74c9 41 speed = target_speed;
MannyK 0:f17da79e74c9 42 }
MannyK 0:f17da79e74c9 43
MannyK 0:f17da79e74c9 44 road->done_flags.set(flag);
MannyK 0:f17da79e74c9 45 }
MannyK 0:f17da79e74c9 46 }
MannyK 0:f17da79e74c9 47
MannyK 0:f17da79e74c9 48 void AccCar::reset() {
MannyK 0:f17da79e74c9 49 road->done_flags.clear(flag);
MannyK 0:f17da79e74c9 50
MannyK 0:f17da79e74c9 51 if (thread != NULL) {
MannyK 0:f17da79e74c9 52 thread->terminate();
MannyK 0:f17da79e74c9 53 }
MannyK 0:f17da79e74c9 54
MannyK 0:f17da79e74c9 55 thread = new Thread();
MannyK 0:f17da79e74c9 56 thread->start( callback(this, &AccCar::update) );
MannyK 0:f17da79e74c9 57
MannyK 0:f17da79e74c9 58 this->position = 0;
MannyK 0:f17da79e74c9 59 this->speed = rand() % 11 + 5;
MannyK 0:f17da79e74c9 60 this->target_speed = speed;
MannyK 0:f17da79e74c9 61 }
MannyK 0:f17da79e74c9 62
MannyK 0:f17da79e74c9 63 void AccCar::stop() {
MannyK 0:f17da79e74c9 64 if (thread != NULL) {
MannyK 0:f17da79e74c9 65 thread->terminate();
MannyK 0:f17da79e74c9 66 }
MannyK 0:f17da79e74c9 67 }