fatboyslim / Mbed 2 deprecated bouncesinglecam

Dependencies:   FRDM-TFC mbed

Revision:
31:55d26f4ef5f0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/asof3_29_2015_1400h.txt	Sun Mar 29 18:00:19 2015 +0000
@@ -0,0 +1,295 @@
+//#include "mbed.h"
+#include "TFC.h"
+#include <iostream>
+#include <stdio.h>
+//#include "serialib.h"
+
+const float AGGRESSIVE = .43;
+const float MODERATE =.41;
+const float CONSERVATIVE =.39;
+const float STOP =0;
+const float PROTECTION_THRESHOLD_UPPER =.7;
+const float PROTECTION_THRESHOLD_LOWER =-.7;
+const float TURN_FORWARD_ACCEL =0.045;
+const float TURN_BACKWARD_ACCEL =0.025;
+const float SERVO_CAN_MOVE_IN_ONE_FRAME =0.1;
+const float SERVO_MAX =.5;
+
+const int BLACK_THRESHOLD =63;
+const int LINE_SCAN_LENGTH =128;
+
+
+DigitalOut myled(LED1);
+
+int main()
+{
+    //run this before anything
+    TFC_Init();
+
+    //variables
+    float current_servo_position = 0;
+    float current_left_motor_speed = 0;
+    float current_right_motor_speed = 0;
+    
+    // gains on prop, int, der
+    // subject to change, need to fine tune
+    
+    bool rear_motor_enable_flag = true;
+    bool linescan_ping_pong = false;
+    bool linescan_enable = true;
+
+    int black_values_list[LINE_SCAN_LENGTH];
+    int black_value_count = 0;
+    int black_center_value = 0;
+    int sum_black = 0;
+    int violence_level = 0;
+    
+    int center_now = 63;
+    int center_past_1 = 63;
+    int center_past_2 = 63;
+    int center_past_3 = 63;
+    int center_past_4 = 63;
+    
+    float left_counter  =0;
+    float right_counter =0;
+    bool turn_left=false;
+    bool turn_right=false;
+
+    float bullshit_offset = .088;
+    
+    int num_of_straight =0;
+    int num_of_left =0;
+    int num_of_right=0;
+    
+    int values_list_add =0;
+    int value_count =0;
+    int avg_value=0;
+    //int black_threshhold=0;
+    int black_threshhold =450;
+
+    // major loop
+    while(1) {
+
+        // initial motor stuff
+        if(rear_motor_enable_flag) {
+            TFC_HBRIDGE_ENABLE;
+
+            // checking behavior level
+            violence_level =  int(TFC_GetDIP_Switch());
+
+            if (violence_level==3) {
+                current_left_motor_speed  = -(AGGRESSIVE);
+                current_right_motor_speed = AGGRESSIVE;
+            }
+            else if (violence_level==2) {
+                current_left_motor_speed  = -(MODERATE);
+                current_right_motor_speed = (MODERATE);
+            }
+            else if (violence_level==1) {
+                current_left_motor_speed  = -(CONSERVATIVE);
+                current_right_motor_speed = CONSERVATIVE;
+            }
+            else if (violence_level==0) {
+                current_left_motor_speed  = STOP;
+                current_right_motor_speed = STOP;
+            }
+            else {
+                current_left_motor_speed  = STOP;
+                current_right_motor_speed = STOP;
+            }
+            
+            // protection block
+            if(current_left_motor_speed >= PROTECTION_THRESHOLD_UPPER)
+                current_left_motor_speed= PROTECTION_THRESHOLD_UPPER;
+            if(current_right_motor_speed >= PROTECTION_THRESHOLD_UPPER)
+                current_right_motor_speed = PROTECTION_THRESHOLD_UPPER;
+            if(current_left_motor_speed <= PROTECTION_THRESHOLD_LOWER)
+                current_left_motor_speed = PROTECTION_THRESHOLD_LOWER;
+            if(current_right_motor_speed <= PROTECTION_THRESHOLD_LOWER)
+                current_right_motor_speed = PROTECTION_THRESHOLD_LOWER;
+
+            TFC_SetMotorPWM(current_left_motor_speed, current_right_motor_speed);
+        }// end motor enabled
+        else {
+            TFC_HBRIDGE_DISABLE;
+        }// end motor disabled
+
+        // camera stuff
+        if (linescan_enable) {
+            if (TFC_LineScanImageReady !=0) {
+
+                if (linescan_ping_pong) {
+                    //checking channel 0
+                    
+                    
+                    // checking for center line (single line)
+                    for (uint16_t i=10; i<118; i++) {
+
+                        int black_threshhold =700*(TFC_ReadPot(0));
+                        if ((*(TFC_LineScanImage0+i) < black_threshhold)) {
+                            black_values_list[black_value_count] = i;
+                            black_value_count++;
+                        }
+                    }
+
+                    for(int i=0; i<black_value_count; i++) {
+                        sum_black += black_values_list[i];
+                    }
+
+                    //update history
+                    /*
+                    center_past_4= center_past_3;
+                    center_past_3= center_past_2;
+                    center_past_2= center_past_1;
+                    center_past_1= center_now;
+                    */
+                    
+                    //if (black_value_count>2)
+                    center_now = sum_black / black_value_count;
+                    
+                    uint8_t num = 0;
+                    
+                    if(center_now > 10 && center_now < 27)
+                        num = 1;
+                    else if(center_now >= 27 && center_now < 54)
+                        num = 2;
+                    else if(center_now > 60 && center_now < 70)
+                        num = 15;
+                    else if(center_now >= 54 && center_now < 81)
+                        num = 4;
+                    else if(center_now >= 81 && center_now < 118)
+                        num = 8;
+                    
+                    else
+                        num = 0;
+                    
+                    if (black_value_count<2)
+                        num = 0;
+                        
+                    //if (black_value_count>26 and ((*(TFC_LineScanImage0+64) > 450) or (*(TFC_LineScanImage0+63) > 450)or(*(TFC_LineScanImage0+62) > 450)))
+                    if (black_value_count>26)
+                    {
+                        while(1)
+                            TFC_SetMotorPWM(0, 0);
+                    }    
+                    
+                    TFC_SetBatteryLED(num);
+                    
+                    // best guess of center based on weighted average of history
+                    black_center_value = center_now;
+  
+                    
+                    // turn left
+                    if (num==8 and right_counter <.35)
+                    {
+                        
+                        if (center_now <113)
+                            left_counter=-0.4;
+                        else
+                        {
+                            if (left_counter > -.15)
+                                left_counter=-0.15; // less drastic for outside parts
+                        }
+                        turn_left=true;
+                        turn_right=false;
+
+                    }
+                    if (num==4 and right_counter <.35)
+                    {
+                        left_counter=-0.6;
+                        //left_counter=-0.55;
+                        turn_left=true;
+                        turn_right=false;
+                    }
+                    
+                    // need to turn right
+                    else if (num==1 and left_counter >-.35)
+                    {
+                        if (center_now >15)
+                            right_counter =.4;
+                        else 
+                        {
+                            if (right_counter <.15)
+                                right_counter =.15; // less drastic for outside parts
+                        }
+                        
+                        turn_left=false;
+                        turn_right=true;
+                   
+                    }
+                
+                      else if (num==2 and left_counter >-.35)
+                    {
+                        right_counter =.6;
+                        //right_counter =.55;
+                        turn_left=false;
+                        turn_right=true;
+                    }
+
+                    //straight
+                   else if (turn_right == false and turn_left == false)
+                    {
+                        TFC_SetServo(0,(0.0+ bullshit_offset));
+                        TFC_SetMotorPWM(current_left_motor_speed-(.0004*num_of_straight), current_right_motor_speed+(.0004*num_of_straight)); // --left is faster, ++right is faster
+                        if (violence_level !=0)
+                            num_of_straight++;
+                    }
+                   
+                    else
+                    {
+                    }
+                    
+                    //dealwiththeshit
+                    if(turn_left)
+                    {
+                        turn_right = false;
+                        num_of_straight = 0; // no longer on a straight
+                        
+                        TFC_SetServo(0,left_counter+ bullshit_offset );
+                        //TFC_SetServo(0,left_counter);
+                        left_counter += .01;
+                        if (left_counter > (0+ bullshit_offset))
+                            turn_left = false;
+                            
+                        TFC_SetMotorPWM(current_left_motor_speed+(.2*left_counter), current_right_motor_speed+(.2*left_counter));  
+                        }
+                        
+                    if(turn_right)
+                    {
+                        turn_left =false;
+                        num_of_straight = 0; // no longer on a straight
+                        
+                        //TFC_SetServo(0,right_counter- bullshit_offset );
+                        TFC_SetServo(0,right_counter);
+                        right_counter -= .01;
+                        if (right_counter < (0+ bullshit_offset))
+                            turn_right = false;
+                        
+                        TFC_SetMotorPWM(current_left_motor_speed-(.2*right_counter), current_right_motor_speed-(.2*right_counter));        
+                        }   
+
+                    // clearing values for next image processing round
+                    black_value_count = 0;
+                    sum_black = 0;
+                    values_list_add =0;
+                    value_count =0;
+                    avg_value=0;
+                    black_threshhold=0;
+
+                    // end image processing
+
+                    linescan_ping_pong = false;
+                } // end checking channel 0
+                
+                else { //checking channel 1
+                    linescan_ping_pong = true;
+                }
+
+                TFC_LineScanImageReady = 0;  // since we used it, we reset the flag
+            }// end imageready
+        }// end linescan stuff
+    }
+}
+
+// shit code down here
+