Exemplo n.º 1
0
C_RESULT ardrone_tool_update_custom (void)
{
	static int a=0;
		
	printf("%d\n",a);
	if ( ++a < 200 ) {
	ardrone_tool_set_ui_pad_start(1);
	} else {
	
		ardrone_tool_input_start_reset();
	
	}
	
	return C_OK;
}
Exemplo n.º 2
0
void initControlData(void)
{
	ctrldata.framecounter = 0;
	
	ctrldata.needAnimation = FALSE;
	vp_os_memset(ctrldata.needAnimationParam, 0, sizeof(ctrldata.needAnimationParam));
	
	ctrldata.needVideoSwitch = -1;
	
	ctrldata.needLedAnimation = FALSE;
	vp_os_memset(ctrldata.needLedAnimationParam, 0, sizeof(ctrldata.needLedAnimationParam));
	
	resetControlData();
	ardrone_tool_input_start_reset();
	
	navdata_write_to_file(FALSE);
    
    ctrldata.navdata_connected = FALSE;
}
C_RESULT ardrone_academy_navdata_process( const navdata_unpacked_t* const pnd )
{
  static bool_t prevCameraIsReady = FALSE;
    static bool_t prevDroneUsbRecording = FALSE;
  if (C_OK == TRYLOCK_ND_MUTEX ())
    {
      input_state_t* input_state = ardrone_tool_input_get_state();
        bool_t recordIsReady = ! ardrone_academy_navdata_get_record_ready();
        bool_t recordIsInProgress = ardrone_academy_navdata_get_record_state();

        // Save ARDrone State
        navdata_state.lastState = pnd->ardrone_state;

        // Save remaining USB time
        navdata_state.usbFreeTime = pnd->navdata_hdvideo_stream.usbkey_remaining_time;

        bool_t currentDroneUsbRecording = (NAVDATA_HDVIDEO_USBKEY_IS_RECORDING == (NAVDATA_HDVIDEO_USBKEY_IS_RECORDING & pnd->navdata_hdvideo_stream.hdvideo_state));
        // Check for record stop from drone
        if (navdata_state.usbRecordInProgress)
        {
            if (TRUE  == prevDroneUsbRecording &&
                FALSE == currentDroneUsbRecording)
            {
                navdata_state.droneStoppedUsbRecording = TRUE;
                navdata_state.record_state = RECORD_STATE_NEEDED;
            }
        }
        prevDroneUsbRecording = currentDroneUsbRecording;

      ardrone_academy_check_take_off_timeout ();

      // Take off and Emergency management
      if(navdata_state.takeoff_state == TAKEOFF_STATE_NEEDED)
	{
          if(pnd->ardrone_state & ARDRONE_EMERGENCY_MASK)
            {
              navdata_state.needSetEmergency = TRUE;
            }
          else
            {
                if(recordIsInProgress)
                {
                  if(!(pnd->ardrone_state & ARDRONE_USER_FEEDBACK_START))
                    ardrone_tool_set_ui_pad_start(1);
                  else
                    ardrone_tool_set_ui_pad_start(0);
                  navdata_state.takeoff_state = TAKEOFF_STATE_IDLE;

                }
              else
                {
                  navdata_state.takeoff_state = TAKEOFF_STATE_WAIT_USERBOX;
                  ardrone_academy_navdata_userbox_switch();
                }
            }
	}

      if(navdata_state.needSetEmergency)
	{
          ardrone_tool_set_ui_pad_select(1);
          navdata_state.needSetEmergency = FALSE;
	}

      if(pnd->ardrone_state & ARDRONE_EMERGENCY_MASK)
        {
          if(!navdata_state.wasEmergency && (input_state->user_input & (1 << ARDRONE_UI_BIT_SELECT)))
            {
              ardrone_tool_set_ui_pad_select(0);
            }
        
          navdata_state.isEmergency = TRUE;
          navdata_state.isTakeOff = FALSE;

            if(!navdata_state.internalRecordInProgress && !navdata_state.usbRecordInProgress && (navdata_state.userbox_state == USERBOX_STATE_STARTED))
            {
                PRINT("Emergency !! Stopping userbox...\n");
              ardrone_academy_navdata_userbox_switch();
            }

          ardrone_tool_input_start_reset();
        }
      else // Not emergency landing
        {
          if(navdata_state.wasEmergency && (input_state->user_input & (1 << ARDRONE_UI_BIT_SELECT)))
            {
              ardrone_tool_set_ui_pad_select(0);
            }
        
          if(!(pnd->ardrone_state & ARDRONE_TIMER_ELAPSED))
            navdata_state.isEmergency = FALSE;

          if(input_state->user_input & (1 << ARDRONE_UI_BIT_START))
            {
              navdata_state.isTakeOff = (pnd->ardrone_state & ARDRONE_USER_FEEDBACK_START) ? TRUE : FALSE;
            }
          else
            {
              navdata_state.isTakeOff = FALSE;
            }
        }
      navdata_state.wasEmergency = (pnd->ardrone_state & ARDRONE_EMERGENCY_MASK) ? TRUE : FALSE;
    
      // Video record management

        bool_t usbRecordEnable = FALSE;
        if(navdata_state.record_state == RECORD_STATE_NEEDED &&
           TAKEOFF_STATE_IDLE == navdata_state.takeoff_state)
        {
            bool_t continueRecord = TRUE;
            bool_t nextInternalRecordState = FALSE;
            if (IS_LEAST_ARDRONE2)
	{
          static codec_type_t oldCodec;
                codec_type_t cancelCodec;
                if (recordIsReady && ! navdata_state.usbRecordInProgress && !navdata_state.internalRecordInProgress) // We want to enable recording
            {
                if ((ARDRONE_USB_MASK == (pnd->ardrone_state & ARDRONE_USB_MASK)) &&
                        (0 < pnd->navdata_hdvideo_stream.usbkey_remaining_time) &&
                    (TRUE == ardrone_control_config.video_on_usb))
                {
                        usbRecordEnable = TRUE;
                }
                    // Set the "non-record codec" to the codec defined as the application default
                    oldCodec = ardrone_application_default_config.video_codec;
                    cancelCodec = oldCodec;
                    ardrone_control_config.video_codec = (TRUE == usbRecordEnable) ? usbRecordCodec : deviceWifiRecordCodec;
                    PRINT ("Set codec %d -> %d\n", oldCodec, ardrone_control_config.video_codec);
                    nextInternalRecordState = TRUE;
            }
          else // We want to disable recording
            {
                    cancelCodec = ardrone_control_config.video_codec;
              ardrone_control_config.video_codec = oldCodec;
                    PRINT ("Reset codec %d -> %d\n", cancelCodec, oldCodec);
            }
                bool_t addEventSucceeded = ARDRONE_TOOL_CONFIGURATION_ADDEVENT (video_codec, &ardrone_control_config.video_codec, NULL);
                if (FALSE == addEventSucceeded)
                {
                    PRINT ("Unable to send codec switch ... retry later\n");
                    ardrone_control_config.video_codec = cancelCodec;
                    continueRecord = FALSE;
                }
            }
            else if (IS_ARDRONE1)
            {
                nextInternalRecordState = !recordIsInProgress;
            }

            if (TRUE == continueRecord)
            {
                navdata_state.internalRecordInProgress = nextInternalRecordState;
            switch (navdata_state.userbox_state)
            {
            case USERBOX_STATE_STOPPED:
              navdata_state.record_state = RECORD_STATE_WAIT_USERBOX;
                    navdata_state.usbRecordInProgress = usbRecordEnable;
              ardrone_academy_navdata_userbox_switch();
                break;
            case USERBOX_STATE_STARTED:
              if(navdata_state.isTakeOff)
                {
                        if(! recordIsReady)
                    {
                            PRINT("Userbox is started and record is started => Stop record\n");
                      ardrone_academy_navdata_recorder_enable(FALSE, navdata_state.userbox_time);
                      navdata_state.usbRecordInProgress = FALSE;
                    }
                  else
                    {
                            PRINT("Userbox is started and record is stopped => Start record\n");
                            if (FALSE == usbRecordEnable)
                        {
                            // Only activate the local recorder if we don't record on USB
                      ardrone_academy_navdata_recorder_enable(TRUE, navdata_state.userbox_time);
                                navdata_state.usbRecordInProgress = FALSE;
                            }
                            else
                            {
                                navdata_state.usbRecordInProgress = TRUE;
                        }
                    }

                  navdata_state.record_state = RECORD_STATE_IDLE;
                }
              else
                {
                  navdata_state.record_state = RECORD_STATE_WAIT_USERBOX;
                  ardrone_academy_navdata_userbox_switch();
                }
                break;
            case USERBOX_STATE_STARTING:
                    navdata_state.usbRecordInProgress = usbRecordEnable;
                navdata_state.record_state = RECORD_STATE_WAIT_USERBOX;
                break;
            case USERBOX_STATE_STOPPING:
                    navdata_state.usbRecordInProgress = usbRecordEnable;
                // Should never be here
                PRINT ("Don't know what to do for USERBOX_STATE_STOPPING\n");
                VP_OS_ASSERT (0 == 1); // Debug handler
                break;
                }
            }
        }

      // Screenshot management
      prevCameraIsReady = navdata_state.cameraIsReady;
      navdata_state.cameraIsReady = (pnd->ardrone_state & ARDRONE_CAMERA_MASK) ? TRUE : FALSE;
      if (TRUE == navdata_state.cameraIsReady && FALSE == prevCameraIsReady)
      {
          academy_download_resume ();
      }
        
      if((navdata_state.screenshot_state == SCREENSHOT_STATE_NEEDED) && navdata_state.cameraIsReady)
      {
          static char param[ARDRONE_DATE_MAXSIZE + 64];
          static char date[ARDRONE_DATE_MAXSIZE];
          time_t t = time(NULL);
          ardrone_time2date(t, ARDRONE_FILE_DATE_FORMAT, date);
          navdata_state.screenshot_state = SCREENSHOT_STATE_INPROGRESS;
          sprintf(param, "%d,%d,%d,%s", USERBOX_CMD_SCREENSHOT, 0, 0, date);
          ARDRONE_TOOL_CONFIGURATION_ADDEVENT(userbox_cmd, param, ardrone_academy_navdata_screenshot_cb);
      }

      // USB management
      navdata_state.usbIsReady = (pnd->ardrone_state & ARDRONE_USB_MASK) ? TRUE : FALSE;
      UNLOCK_ND_MUTEX ();
    }
  return C_OK;
}