Dependencies:   TextLCD MQTT

Revision:
0:ca7cb51e9fd1
Child:
1:54512aca944d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/AccCar.cpp	Sun Nov 10 23:02:16 2019 +0000
@@ -0,0 +1,107 @@
+#include "AccCar.h"
+#include <stdlib.h>
+#include <algorithm>
+
+#define TICK 1000
+#define MONITOR_DIST 17
+#define SAFETY_GAP 2
+
+AccCar::AccCar(int id, Road* road, int flag) {
+    this->id = id;
+    this->road = road;
+    this->flag = flag;
+    
+    waited = false;
+        
+    this->thread = NULL;
+}
+
+void AccCar::set_forward_car(AccCar* car) {
+    this->forward_car = car;   
+}
+
+void AccCar::set_target_speed(int speed) {
+    this->target_speed = speed;
+    this->speed = speed;   
+}
+
+void AccCar::update() {
+    do {
+        ThisThread::sleep_for(TICK);
+        road->go_flags.wait_all(flag);
+        cycle++;
+                
+        position = position + speed;
+        
+        if (cycle % 5 == 0) {
+            target_speed = rand() % 11 + 5;
+        }
+        
+        if( position < 54 ) {       
+            if (forward_car != NULL && forward_car->position > -1) {
+                if (forward_car->position - position < MONITOR_DIST && forward_car->position < 55) {
+                    road->done_flags.wait_all(forward_car->flag, osWaitForever, false);
+                    
+                    int diff = forward_car->position - position;
+                    int maxSafeSpeed = diff - SAFETY_GAP;
+                    
+                    speed = std::min(maxSafeSpeed, target_speed);
+                } else {
+                    speed = target_speed;   
+                }
+            } else {
+                speed = target_speed;
+            }
+            
+            int distance_to_intersection = 54 - position;
+            speed = std::min(distance_to_intersection, speed);
+                  
+        } else if( position == 54 ) {
+            if( waited) {
+                road->intersection_car = id;
+                speed = 1;   
+            } else {
+                speed = 0;   
+                waited = true;
+            }
+        } else if( position < 56 ) {
+            speed = 1;
+        } else {
+            if( position == 56 ) {
+                road->intersection_car = -1;
+            }
+            
+            if (forward_car != NULL && forward_car->position > -1) {
+                if (forward_car->position - position < MONITOR_DIST ) {
+                    road->done_flags.wait_all(forward_car->flag, osWaitForever, false);
+                    
+                    int diff = forward_car->position - position;
+                    int maxSafeSpeed = diff - SAFETY_GAP;
+                    
+                    speed = std::min(maxSafeSpeed, target_speed);
+                } else {
+                    speed = target_speed;   
+                }
+
+            } else {
+                speed = target_speed;
+            }
+        } 
+        
+        road->done_flags.set(flag);   
+    } while( position < 100 );
+}
+
+void AccCar::reset() {
+    road->done_flags.clear(flag);
+    
+    if (thread != NULL) {
+        thread->terminate();   
+    }
+    
+    thread = new Thread();
+    thread->start( callback(this, &AccCar::update) );
+    
+    this->position = 0;
+    this->cycle = 0;
+}
\ No newline at end of file