SmartWheels self-driving race car. Designed for NXP Cup. Uses FRDM-KL25Z, area-scan camera, and simple image processing to detect and navigate any NXP spec track.

Dependencies:   TSI USBDevice mbed-dev

Fork of SmartWheels by haofan Zheng

Revision:
99:c6665262fd3d
Parent:
97:0ed9ede9a995
Parent:
98:fc92bb37ee17
Child:
100:ffbeefc9e218
--- a/Hardwares/ArduCAM.cpp	Wed Apr 19 21:17:40 2017 +0000
+++ b/Hardwares/ArduCAM.cpp	Thu Apr 20 16:23:19 2017 +0000
@@ -9,7 +9,7 @@
 
 #include "ArduUTFT.h"
 
-#include <string>
+#include <math.h>
 
 #define CAM_BLK_CAL_ACTIVE
 
@@ -33,7 +33,8 @@
 static uint8_t black_calibrate = 70;
 static volatile uint8_t centerLine[CAM_ROI_UPPER_LIMIT * 2];
 static volatile uint8_t is_encounter_terminate = 0;
-static volatile uint8_t is_border_find = BOTH_NOT_FOUND;
+//static volatile uint8_t is_border_find = BOTH_NOT_FOUND;
+static volatile uint8_t is_intersection_detected = 0;
 
 void cal_black_calibrate();
 
@@ -234,7 +235,7 @@
         while (!(ardu_cam_spi_read_8(ARDUCHIP_TRIG) & CAP_DONE_MASK));
         
         temp_mid_pos = RESOLUTION_WIDTH / 2;
-        is_border_find = BOTH_NOT_FOUND;
+        //is_border_find = BOTH_NOT_FOUND;
 #ifdef CAM_BLK_CAL_ACTIVE
         static float calTemp = 0.0f;
         calTemp = 0.0f;
@@ -270,6 +271,13 @@
         uint8_t leftPos = 0;
         uint8_t rightPos = 0;
         uint8_t isBorderFound = BOTH_NOT_FOUND;
+        
+        is_intersection_detected = 0;
+        uint8_t leftNearCenter1 = 0;
+        uint8_t leftNearCenter2 = 0;
+        uint8_t rightNearCenter1 = 0;
+        uint8_t rightNearCenter2 = 0;
+        
         is_encounter_terminate = 0;
         for (uint8_t i = 0; i < CAM_ROI_UPPER_LIMIT; ++i)
         {
@@ -291,51 +299,24 @@
 
             centerLine[CAM_ROI_UPPER_LIMIT - i - 1] = temp_mid_pos;
             centerLine[(2 * CAM_ROI_UPPER_LIMIT) - i - 1] = isBorderFound;
-            switch(is_border_find)
+            
+            if(leftPos > leftNearCenter1)
+            {
+                leftNearCenter2 = leftNearCenter1; 
+                leftNearCenter1 = CAM_ROI_UPPER_LIMIT - i - 1;
+            }
+            if(rightPos < rightNearCenter1)
             {
-            case BOTH_NOT_FOUND:
-                switch(isBorderFound)
-                {
-                case LEFT_FOUND:
-                    is_border_find = LEFT_FOUND;
-                    break;
-                case RIGHT_FOUND:
-                    is_border_find = RIGHT_FOUND;
-                    break;
-                case BOTH_FOUND:
-                    is_border_find = BOTH_FOUND;
-                    break;
-                default:
-                    break;
-                }
-                break;
-            case LEFT_FOUND:
-                switch(isBorderFound)
-                {
-                case RIGHT_FOUND:
-                case BOTH_FOUND:
-                    is_border_find = BOTH_FOUND;
-                    break;
-                default:
-                    break;
-                }
-                break;
-            case RIGHT_FOUND:
-                switch(isBorderFound)
-                {
-                case LEFT_FOUND:
-                case BOTH_FOUND:
-                    is_border_find = BOTH_FOUND;
-                    break;
-                default:
-                    break;
-                }
-                break;
-            case BOTH_FOUND:
-            default:
-                break;
+                rightNearCenter2 = rightNearCenter1;
+                rightNearCenter1 = CAM_ROI_UPPER_LIMIT - i - 1;
             }
         }
+        
+        if( ((1 < rightNearCenter1 && rightNearCenter1 < (CAM_ROI_UPPER_LIMIT - 2)) && (abs(rightNearCenter1 - rightNearCenter2) == 1)) ||
+            ((1 < leftNearCenter1 && leftNearCenter1 < (CAM_ROI_UPPER_LIMIT - 2)) && (abs(leftNearCenter1 - leftNearCenter1) == 1)) )
+        {
+            is_intersection_detected = 1;
+        }
     }
 }
 
@@ -439,17 +420,23 @@
 {
     return is_encounter_terminate;
 }
-
+/*
 uint8_t ardu_cam_get_is_border_found()
 {
     return is_border_find;
 }
+*/
 
 uint8_t ardu_cam_get_ver_num()
 {
     return ardu_cam_spi_read_8(ARDUCHIP_VER);
 }
 
+uint8_t ardu_cam_get_is_intersection_detected()
+{
+    return is_intersection_detected;
+}
+
 #ifdef __cplusplus
 }
 #endif