Advertisement
Guest User

Strategy Mars Rover Hank

a guest
Jun 17th, 2011
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.35 KB | None | 0 0
  1.   while(!shutdown_requested()) {
  2.  
  3.     if (lake_detected) {
  4.       rover_state(LAKE_DETECTED);
  5.     } else if (edge_detected) {
  6.       rover_state(EDGE_DETECTED);
  7.     }
  8.  
  9.     // display rover state
  10.     lcd_int(rover_current_state);
  11.  
  12.     /***********************************
  13.          SCANNING FOR LAKES
  14.     ***********************************/
  15.     if (rover_current_state == SCANNING_FOR_LAKES) {
  16.  
  17.       // just started scanning?
  18.       if (rover_scanning_angle == 0) {
  19.        
  20.         // reset trigger
  21.         sem_wait(&sem_com);
  22.         TRIGGER2 = 0;
  23.         TRIGGER3 = 0;
  24.         sem_post(&sem_com);
  25.  
  26.         // sleep to wait for coordinates
  27.         msleep(SCANNING_WAIT_TIME);
  28.        
  29.       }
  30.    
  31.       // if other brick received coordinates
  32.       if (TRIGGER2 != 0) {
  33.  
  34.         // point mars rover to the found lake
  35.         rover_state(DIRECTING_TO_LAKE);
  36.  
  37.       } else {
  38.        
  39.         // rotate a step and stay in scanning mode
  40.         drive_rotate(LAKE_SCANNING_STEP_ANGLE);
  41.  
  42.         // sleep to wait for coordinates
  43.         msleep(SCANNING_WAIT_TIME);
  44.  
  45.         // increase angle
  46.         rover_scanning_angle += LAKE_SCANNING_STEP_ANGLE;
  47.        
  48.       }
  49.  
  50.       // when turned 360 degrees and still no lake is found
  51.       if (rover_scanning_angle >= 360) {
  52.  
  53.         // go to exploratory driving
  54.         rover_state(DRIVING);
  55.  
  56.       }
  57.  
  58.     }
  59.    
  60.     /***********************************
  61.          DIRECTING TO LAKE
  62.     ***********************************/
  63.     else if (rover_current_state == DIRECTING_TO_LAKE) {
  64.  
  65.       // when no coordinate is present
  66.       if (TRIGGER2 == 0) {
  67.  
  68.         // no coordinate, no point in directing, just drive
  69.         rover_state(DRIVING);
  70.  
  71.       } else {
  72.        
  73.         // convert camera coordinates to distance and angle
  74.         lake_angle = 0;
  75.         lake_distance = 0;
  76.         conv_coord(TRIGGER2, TRIGGER3, &lake_distance, &lake_angle);
  77.  
  78.         // when error is low enough, drive ahead
  79.         if (absolute(lake_angle) < DIRECTING_THRESHOLD_ANGLE) {
  80.  
  81.           // drive to the lake
  82.           rover_state(DRIVING);
  83.        
  84.         } else {
  85.          
  86.           // rotate towards the lake and stay in directing mode
  87.           drive_rotate(lake_angle);
  88.  
  89.         }
  90.  
  91.         // forget current coordinate
  92.         sem_wait(&sem_com);
  93.         TRIGGER2 = 0;
  94.         TRIGGER3 = 0;
  95.         sem_post(&sem_com);
  96.  
  97.  
  98.       }
  99.  
  100.     }
  101.  
  102.     /***********************************
  103.          DRIVING STRAIGHT
  104.     ***********************************/
  105.     else if (rover_current_state == DRIVING) {
  106.  
  107.       // if driving end time is not set
  108.       if (rover_driving_start_time == 0) {
  109.  
  110.         // start driving
  111.         drive_forward();
  112.        
  113.         // set driving end time
  114.         rover_driving_start_time = get_system_up_time();
  115.  
  116.       }
  117.  
  118.       // when the rover is not driving to a lake or the directed driving time is exceeded
  119.       if (rover_previous_state != DIRECTING_TO_LAKE || get_system_up_time() > rover_driving_start_time + DIRECTED_DRIVING_TIME) {
  120.  
  121.         // when a coordinate is received
  122.         if (TRIGGER2 != 0) {
  123.  
  124.           // brake
  125.           drive_brake();
  126.  
  127.           // direct towards lake
  128.           rover_state(DIRECTING_TO_LAKE);
  129.  
  130.         }
  131.       }
  132.      
  133.       // when the rover is not driving to a lake and the exploratory driving time is exceeded
  134.       if (rover_previous_state != DIRECTING_TO_LAKE && get_system_up_time() > rover_driving_start_time + EXPLORATORY_DRIVING_TIME)  {
  135.  
  136.                 // brake
  137.                 drive_brake();
  138.  
  139.                 // scan for lakes
  140.                 rover_state(SCANNING_FOR_LAKES);
  141.  
  142.       }
  143.  
  144.     }
  145.  
  146.     /***********************************
  147.          LAKE DETECTED
  148.     ***********************************/
  149.     else if (rover_current_state == LAKE_DETECTED) {
  150.  
  151.       // brake
  152.       drive_brake();
  153.  
  154.       // reset communication trigger
  155.       sem_wait(&sem_com);
  156.       TRIGGER1 = 0;
  157.       sem_post(&sem_com);
  158.  
  159.       // set max measurement end time
  160.       temp_measurement_end_time = get_system_up_time()+2*TEMP_ACTUATION_TIME+TEMP_WAIT_TIME+2000;
  161.  
  162.       // ask brick 1 to do temperature measurement
  163.       com_send(ID,1,1,&message);
  164.  
  165.       // wait for brick 2 to complete temp measurement or max time exceeding
  166.       while (TRIGGER1 == 0 && temp_measurement_end_time > get_system_up_time()) {
  167.         msleep(50);
  168.       }
  169.  
  170.       // reset lake light sensor
  171.       light_reset_average(1);
  172.  
  173.       // we have dealt with this lake
  174.       lake_detected = 0;
  175.        
  176.       // act like edge is detected
  177.       rover_state(EDGE_DETECTED);
  178.      
  179.     }
  180.  
  181.     /***********************************
  182.          EDGE DETECTED
  183.     ***********************************/
  184.     else if (rover_current_state == EDGE_DETECTED) {
  185.      
  186.       // drive backwards
  187.       drive_backward();
  188.       msleep(EDGE_BACKWARDS_TIME);
  189.      
  190.       // reset light averages
  191.       light_reset_average(0);
  192.       light_reset_average(2);
  193.  
  194.       // we have dealt with this edge
  195.       edge_detected = 0;
  196.  
  197.       // if a lake was detected, we are away from it now
  198.       lake_detected = 0;
  199.  
  200.       // rotate plus or minus pseudo randomly
  201.       if (get_system_up_time() % 2 > 0) {
  202.          drive_rotate(-1*EDGE_ANGLE);
  203.       } else {
  204.          drive_rotate(EDGE_ANGLE);
  205.       }
  206.      
  207.       // drive a while
  208.       rover_state(DRIVING);
  209.  
  210.     }
  211.  
  212.     // end of loop
  213.     msleep(100);
  214.  
  215.   }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement