C_RESULT ardrone_general_navdata_process( const navdata_unpacked_t* const pnd )
{
	navdata_mode_t current_navdata_state = NAVDATA_BOOTSTRAP;

	/* Makes sure the navdata stream will be resumed if the drone is disconnected and reconnected.
	 * Allows changing the drone battery during debugging sessions.	 */
	if( ardrone_get_mask_from_state(pnd->ardrone_state, ARDRONE_NAVDATA_BOOTSTRAP) )
	{
		current_navdata_state = NAVDATA_BOOTSTRAP;
	}
	else
	{
		current_navdata_state = (ardrone_get_mask_from_state(pnd->ardrone_state, ARDRONE_NAVDATA_DEMO_MASK)) ? NAVDATA_DEMO : NAVDATA_FULL ;
	}

	if (current_navdata_state == NAVDATA_BOOTSTRAP && configState == MULTICONFIG_IDLE && navdataState == NAVDATA_REQUEST_IDLE)
	{
        navdataState = NAVDATA_REQUEST_NEEDED; 
	}
	
	/* Multiconfig settings */
	int configIndex, userNeedInit, appNeedInit;
	userNeedInit = 0; appNeedInit = 0;
	switch (configState)
	{
		case MULTICONFIG_GOT_DRONE_VERSION:
            PRINTDBG ("Checking drone version ...\n");
			// Check if drone version is >= 1.6
			if (versionSupportsMulticonfiguration (ardrone_control_config.num_version_soft))
			{
                PRINTDBG ("Drone supports multiconfig\n");
				configState = MULTICONFIG_IN_PROGRESS_LIST;
				ARDRONE_TOOL_CUSTOM_CONFIGURATION_GET (configurationCallback);
                droneSupportsMulticonfig = 1;
			}
			else
			{
                PRINTDBG ("Drone does not support multiconfig\n");
				// Drone does not support multiconfig ... don't call init functions because we don't want to mess up things in default config
				configState = MULTICONFIG_REQUEST_NAVDATA;
			}
			break;
		case MULTICONFIG_GOT_IDS_LIST:
			// At this point, we're sure that the AR.Drone supports multiconfiguration, so we'll wheck if our ids exists, and send them.
            PRINTDBG ("Got AR.Drone ID list. Switch->%d,%d,%d. ND->%d\n", sesSwitch, usrSwitch, appSwitch, navdataNeeded);
            if (1 == sesSwitch)
            {
                switchToSession(); // Go to session ...
            }

            if (1 == appSwitch)
            {
                if (0 != strcmp(ardrone_control_config_default.application_id, app_id)) // Check for application only if we're not asking for the default one
                {
                    appNeedInit = 1;
                    for (configIndex = 0; configIndex < available_configurations[CAT_APPLI].nb_configurations; configIndex++) // Check all existing app_ids
                    {
                        PRINTDBG ("Checking application %s (desc : %s)\n", available_configurations[CAT_APPLI].list[configIndex].id,
                                  available_configurations[CAT_APPLI].list[configIndex].description);
                        if (0 == strcmp(available_configurations[CAT_APPLI].list[configIndex].id, app_id))
                        {
                            PRINTDBG ("Found our application ... should not init\n");
                            appNeedInit = 0;
                            break;
                        }
                    }
                    switchToApplication();
                }
                else
                {
                    PRINTDBG ("We're requesting default application (%s), do nothing.\n", app_id);
                }
            }
			
            if (1 == usrSwitch)
            {
                if (0 != strcmp(ardrone_control_config_default.profile_id, usr_id)) // Check for user only if we're not asking for the default one
                {
                    userNeedInit = 1;
                    for (configIndex = 0; configIndex < available_configurations[CAT_USER].nb_configurations; configIndex++) // Check all existing user_ids
                    {
                        PRINTDBG ("Checking user %s (desc : %s)\n", available_configurations[CAT_USER].list[configIndex].id,
                                  available_configurations[CAT_USER].list[configIndex].description);
                        if (0 == strcmp(available_configurations[CAT_USER].list[configIndex].id, usr_id))
                        {
                            PRINTDBG ("Found our user ... should not init\n");
                            userNeedInit = 0;
                            break;
                        }
                    }
                    switchToUser();
                }
                else
                {
                    PRINTDBG ("We're requesting default user (%s), do nothing.\n", usr_id);
                }
            }
			
			if (1 == appNeedInit)
			{
				// Send application defined default values
				ardrone_tool_send_application_default();
				PRINTDBG ("Creating app. profile on AR.Drone\n");
				ARDRONE_TOOL_CONFIGURATION_ADDEVENT (application_desc, app_name, NULL);
			}
			if (1 == userNeedInit)
			{
				// Send user defined default values
				ardrone_tool_send_user_default();
				PRINTDBG ("Creating usr. profile on AR.Drone\n");
				ARDRONE_TOOL_CONFIGURATION_ADDEVENT (profile_desc, usr_name, NULL);
			}
            if (1 == sesSwitch)
            {
                if (0 != strcmp(ardrone_control_config_default.session_id, ses_id)) // Send session info only if session is not the default one
                {
                    ARDRONE_TOOL_CONFIGURATION_ADDEVENT (session_desc, ses_name, NULL);
                    // Send session specific default values
                    ardrone_tool_send_session_default();
                }
                else
                {
                    PRINTDBG ("We're requesting default session (%s), do nothing.\n", ses_id);
                }
            }
            configState = MULTICONFIG_IN_PROGRESS_IDS;
            ARDRONE_TOOL_CONFIGURATION_GET (configurationCallback);
			
        case MULTICONFIG_GOT_CURRENT_IDS:
            if (0 != strcmp(ardrone_control_config.session_id, ses_id) ||
                0 != strcmp(ardrone_control_config.profile_id, usr_id) ||
                0 != strcmp(ardrone_control_config.application_id, app_id))
            {
                configState = MULTICONFIG_GOT_DRONE_VERSION; // We failed at setting up the application ids ... restart (but assume that drone supports multiconfig as we already checked)
            }
            else if (1 == navdataNeeded)
            {
                configState = MULTICONFIG_REQUEST_NAVDATA;
            }
            else
            {
                configState = MULTICONFIG_IDLE;
            }
			break;
		case MULTICONFIG_NEEDED:
            PRINTDBG ("Need to check multiconfig ... request config file\n");
			// Get config file for reset
			configState = MULTICONFIG_IN_PROGRESS_VERSION;
			ARDRONE_TOOL_CONFIGURATION_GET (configurationCallback);
			break;
        case MULTICONFIG_REQUEST_NAVDATA:
            PRINTDBG ("Send application navdata demo/options\n");
            // Send application navdata demo/options to start navdatas from AR.Drone
			ARDRONE_TOOL_CONFIGURATION_ADDEVENT (navdata_demo, &ardrone_application_default_config.navdata_demo, NULL);
            if (TRUE == ardrone_application_default_config.navdata_demo)
            {   // Send navdata options only for navdata demo mode
                ARDRONE_TOOL_CONFIGURATION_ADDEVENT (navdata_options, &ardrone_application_default_config.navdata_options, NULL);
            }
            configState = MULTICONFIG_IDLE;
            break;
		case MULTICONFIG_IDLE:
		case MULTICONFIG_IN_PROGRESS_LIST:
		case MULTICONFIG_IN_PROGRESS_VERSION:
        case MULTICONFIG_IN_PROGRESS_IDS:
		default:
			break;
	}
			
    /* Navdata request settings */
    switch (navdataState)
    {
        case NAVDATA_REQUEST_NEEDED:
            PRINTDBG ("Resetting navdatas to %s\n", (0 == ardrone_application_default_config.navdata_demo) ? "full" : "demo");
            navdataState = NAVDATA_REQUEST_IN_PROGRESS;
            switchToSession(); // Resend session id when reconnecting.
			ARDRONE_TOOL_CONFIGURATION_ADDEVENT(navdata_demo, &ardrone_application_default_config.navdata_demo, NULL);
            if (TRUE == ardrone_application_default_config.navdata_demo)
            {   // Send navdata options only for navdata demo mode
                ARDRONE_TOOL_CONFIGURATION_ADDEVENT (navdata_options, &ardrone_application_default_config.navdata_options, navdataCallback);
            }
            break;
        case NAVDATA_REQUEST_IN_PROGRESS:
        case NAVDATA_REQUEST_IDLE:
        default:
            break;
    }

	return C_OK;
}
Example #2
0
static void* navdata_loop(void *arg)
{
	uint8_t msg[NAVDATA_BUFFER_SIZE];
    navdata_unpacked_t navdata_unpacked;
    unsigned int cks, navdata_cks, sequence = NAVDATA_SEQUENCE_DEFAULT-1;
    int sockfd = -1, addr_in_size;
	struct sockaddr_in *my_addr, *from;

	INFO("NAVDATA thread starting (thread=%d)...\n", (int)pthread_self());

    navdata_open_server();

	addr_in_size = sizeof(struct sockaddr_in);

    navdata_t* navdata = (navdata_t*) &msg[0];

	from = (struct sockaddr_in *)vp_os_malloc(addr_in_size);
	my_addr = (struct sockaddr_in *)vp_os_malloc(addr_in_size);
    assert(from);
    assert(my_addr);

	vp_os_memset((char *)my_addr,(char)0,addr_in_size);
	my_addr->sin_family = AF_INET;
	my_addr->sin_addr.s_addr = htonl(INADDR_ANY);
	my_addr->sin_port = htons( NAVDATA_PORT );

	if((sockfd = socket (AF_INET, SOCK_DGRAM, 0)) < 0){
        INFO ("socket: %s\n", strerror(errno));
        goto fail;
	};

	if(bind(sockfd, (struct sockaddr *)my_addr, addr_in_size) < 0){
        INFO ("bind: %s\n", strerror(errno));
        goto fail;
	};

	{
		struct timeval tv;
		// 1 second timeout
		tv.tv_sec   = 1;
		tv.tv_usec  = 0;
		setsockopt( sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
	}

	INFO("[NAVDATA] Ready to receive incomming data\n");

	while ( nav_thread_alive ) {
		int size;
		
	
		
		size = recvfrom (sockfd, &msg[0], NAVDATA_BUFFER_SIZE, 0, (struct sockaddr *)from,
                         (socklen_t *)&addr_in_size);
		
		
		//INFO ("SIZE %d \n", size);
		
	if( size == 0)
            {
                INFO ("Navdata lost connection \n");
                navdata_open_server();
                sequence = NAVDATA_SEQUENCE_DEFAULT-1;
            }
            
//         if (size == 24)
// 	{
// 	     const char cmds[] = "AT*COMWDG=0\r";
//              at_write ((int8_t*)cmds, strlen( cmds ));
// 	     
// 	     const char cmds2[] = "AT*CONFIG=1,\"general:navdata_demo\",\"TRUE\"\r";
//              at_write ((int8_t*)cmds2, strlen( cmds2 ));
// 	}
	
	if( navdata->header == NAVDATA_HEADER )
            {
                mykonos_state = navdata->ardrone_state;
			
                if(ardrone_get_mask_from_state(navdata->ardrone_state, ARDRONE_COM_WATCHDOG_MASK) )
                    { 
                       // INFO ("[NAVDATA] Detect com watchdog\n");
                        sequence = NAVDATA_SEQUENCE_DEFAULT-1; 

                        if( ardrone_get_mask_from_state(navdata->ardrone_state, ARDRONE_NAVDATA_BOOTSTRAP) == FALSE )
                            {
			        //INFO ("[NAVDATA] Send com watchdog\n");

                                const char cmds[] = "AT*COMWDG=0\r";
                                at_write ((int8_t*)cmds, strlen( cmds ));
                            }
                    } 
 
                if( navdata->sequence > sequence ) 
                    { 
                        if ( ardrone_get_mask_from_state( mykonos_state, ARDRONE_NAVDATA_DEMO_MASK ))
                            {
                              ardrone_navdata_unpack_all(&navdata_unpacked, navdata, &navdata_cks);
                                cks = ardrone_navdata_compute_cks( &msg[0], size - sizeof(navdata_cks_t) );

                                if( cks != navdata_cks )
				    {
				      INFO("NAVADATA wrong CKS\n");
				    }
				    //INFO("VALUE = %f \n", navdata_unpacked.navdata_demo.theta);
                            }
                    } 
                else 
                    { 
                        INFO ("[Navdata] Sequence pb : %d (distant) / %d (local)\n", navdata->sequence, sequence); 
                    } 

                sequence = navdata->sequence;
            }
	}
 fail:
    vp_os_free(from);
    vp_os_free(my_addr);

    if (sockfd >= 0){
        close(sockfd);
    }

    if (navdata_udp_socket >= 0){
        close(navdata_udp_socket);
        navdata_udp_socket = -1;
    }

	INFO("NAVDATA thread stopping\n");
    return NULL;
}
DEFINE_THREAD_ROUTINE( navdata_update, nomParams )
{
    C_RESULT res;
    int32_t  i, size;
    uint32_t cks, navdata_cks, sequence = NAVDATA_SEQUENCE_DEFAULT-1;
    struct timeval tv;
#ifdef _WIN32
    int timeout_for_windows=1000/*milliseconds*/;
#endif


    navdata_t* navdata = (navdata_t*) &navdata_buffer[0];

    tv.tv_sec   = 1/*second*/;
    tv.tv_usec  = 0;

    res = C_OK;

    if( VP_FAILED(vp_com_open(COM_NAVDATA(), &navdata_socket, &navdata_read, &navdata_write)) )
    {
        printf("VP_Com : Failed to open socket for navdata\n");
        res = C_FAIL;
    }

    if( VP_SUCCEEDED(res) )
    {
        PRINT("Thread navdata_update in progress...\n");

#ifdef _WIN32
        setsockopt((int32_t)navdata_socket.priv, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout_for_windows, sizeof(timeout_for_windows));
        /* Added by Stephane to force the drone start sending data. */
        if(navdata_write)
        {
            int sizeinit = 5;
            navdata_write( (void*)&navdata_socket, (int8_t*)"Init", &sizeinit );
        }
#else
        setsockopt((int32_t)navdata_socket.priv, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof(tv));
#endif


        i = 0;
        while( ardrone_navdata_handler_table[i].init != NULL )
        {
            // if init failed for an handler we set its process function to null
            // We keep its release function for cleanup
            if( VP_FAILED( ardrone_navdata_handler_table[i].init(ardrone_navdata_handler_table[i].data) ) )
                ardrone_navdata_handler_table[i].process = NULL;

            i ++;
        }

        navdata_thread_in_pause = FALSE;
        while( VP_SUCCEEDED(res)
                && !ardrone_tool_exit()
                && bContinue )
        {
            if(navdata_thread_in_pause)
            {
                vp_os_mutex_lock(&navdata_client_mutex);
                num_retries = NAVDATA_MAX_RETRIES + 1;
                vp_os_cond_wait(&navdata_client_condition);
                vp_os_mutex_unlock(&navdata_client_mutex);
            }

            if( navdata_read == NULL )
            {
                res = C_FAIL;
                continue;
            }

            size = NAVDATA_MAX_SIZE;
            navdata->header = 0; // Soft reset
            res = navdata_read( (void*)&navdata_socket, (int8_t*)&navdata_buffer[0], &size );

#ifdef _WIN32
            if( size <= 0 )
#else
            if( size == 0 )
#endif
            {
                // timeout
                PRINT("Timeout\n");
                ardrone_navdata_open_server();
                sequence = NAVDATA_SEQUENCE_DEFAULT-1;
                num_retries++;
            }
            else
                num_retries = 0;

            if( VP_SUCCEEDED( res ) )
            {
                if( navdata->header == NAVDATA_HEADER )
                {
                    if( ardrone_get_mask_from_state(navdata->ardrone_state, ARDRONE_COM_WATCHDOG_MASK) )
                    {
                        // reset sequence number because of com watchdog
                        // This code is mandatory because we can have a com watchdog without detecting it on mobile side :
                        //        Reconnection is fast enough (less than one second)
                        sequence = NAVDATA_SEQUENCE_DEFAULT-1;

                        if( ardrone_get_mask_from_state(navdata->ardrone_state, ARDRONE_NAVDATA_BOOTSTRAP) == FALSE )
                            ardrone_tool_send_com_watchdog(); // acknowledge
                    }

                    if( navdata->sequence > sequence )
                    {
                        i = 0;

                        ardrone_navdata_unpack_all(&navdata_unpacked, navdata, &navdata_cks);
                        cks = ardrone_navdata_compute_cks( &navdata_buffer[0], size - sizeof(navdata_cks_t) );

                        if( cks == navdata_cks )
                        {
                            while( ardrone_navdata_handler_table[i].init != NULL )
                            {
                                if( ardrone_navdata_handler_table[i].process != NULL )
                                    ardrone_navdata_handler_table[i].process( &navdata_unpacked );

                                i++;
                            }
                        }
                        else
                        {
                            PRINT("[Navdata] Checksum failed : %d (distant) / %d (local)\n", navdata_cks, cks);
                        }
                    }
                    else
                    {
                        PRINT("[Navdata] Sequence pb : %d (distant) / %d (local)\n", navdata->sequence, sequence);
                    }

                    // remaining = sizeof(navdata);

                    sequence = navdata->sequence;
                }
            }
        }

        // Release resources alllocated by handlers
        i = 0;
        while( ardrone_navdata_handler_table[i].init != NULL )
        {
            ardrone_navdata_handler_table[i].release();

            i ++;
        }
    }

    vp_com_close(COM_NAVDATA(), &navdata_socket);

    DEBUG_PRINT_SDK("Thread navdata_update ended\n");

    return (THREAD_RET)res;
}
Example #4
0
C_RESULT ardrone_navdata_file_process( const navdata_unpacked_t* const pnd )
{
  uint32_t i;
  char str[50];
  int32_t* locked_ptr;
  screen_point_t* point_ptr;
  struct timeval time;

  gettimeofday(&time,NULL);

  if( navdata_file_private == NULL )
    return C_FAIL;

  if( ardrone_get_mask_from_state(pnd->ardrone_state, ARDRONE_NAVDATA_BOOTSTRAP) )
    return C_OK;

  if( navdata_file == NULL )
  {
    navdata_file = navdata_file_private;

    if( ardrone_get_mask_from_state(pnd->ardrone_state, ARDRONE_NAVDATA_DEMO_MASK) )
    {
      printf("Receiving navdata demo\n");
    }
    else
    {
      printf("Receiving all navdata\n");
    }
    ardrone_navdata_file_print_version();
  }

  // Handle the case where user asked for a new navdata file
  if( navdata_file != navdata_file_private )
  {
    fclose(navdata_file);
    navdata_file = navdata_file_private;

    if( ardrone_get_mask_from_state(pnd->ardrone_state, ARDRONE_NAVDATA_DEMO_MASK) )
    {
      printf("Receiving navdata demo\n");
    }
    else
    {
      printf("Receiving all navdata\n");
    }
    ardrone_navdata_file_print_version();
  }

	vp_os_memset(&str[0], 0, sizeof(str));

    fprintf( navdata_file,"\n" );
    fprintf( navdata_file, "%u; %u", (unsigned int) pnd->navdata_demo.ctrl_state, (unsigned int) pnd->ardrone_state );

    sprintf( str, "%d.%06d", (int)((pnd->navdata_time.time & TSECMASK) >> TSECDEC), (int)(pnd->navdata_time.time & TUSECMASK) );
    fprintf( navdata_file, ";%s", str );

    fprintf( navdata_file, "; %04u; %04u; %04u; %04u; %04u; %04u; %04u; %04u; %04u; %04u; %04u; %04u; %04u; %04u; %04u; %04u; %04u; %04u; %04u; %04u",
                            (unsigned int) pnd->navdata_raw_measures.raw_accs[ACC_X],
                            (unsigned int) pnd->navdata_raw_measures.raw_accs[ACC_Y],
                            (unsigned int) pnd->navdata_raw_measures.raw_accs[ACC_Z],
                            (unsigned int) pnd->navdata_raw_measures.raw_gyros[GYRO_X],
                            (unsigned int) pnd->navdata_raw_measures.raw_gyros[GYRO_Y],
                            (unsigned int) pnd->navdata_raw_measures.raw_gyros[GYRO_Z],
                            (unsigned int) pnd->navdata_raw_measures.raw_gyros_110[0],
                            (unsigned int) pnd->navdata_raw_measures.raw_gyros_110[1],
                            (unsigned int) pnd->navdata_raw_measures.vbat_raw,
                            (unsigned int) pnd->navdata_phys_measures.alim3V3,
                            (unsigned int) pnd->navdata_phys_measures.vrefEpson,
                            (unsigned int) pnd->navdata_phys_measures.vrefIDG,
                            (unsigned int) pnd->navdata_raw_measures.flag_echo_ini,
                            (unsigned int) pnd->navdata_raw_measures.us_debut_echo,
                            (unsigned int) pnd->navdata_raw_measures.us_fin_echo,
                            (unsigned int) pnd->navdata_raw_measures.us_association_echo,
                            (unsigned int) pnd->navdata_raw_measures.us_distance_echo,
                            (unsigned int) pnd->navdata_raw_measures.us_courbe_temps,
                            (unsigned int) pnd->navdata_raw_measures.us_courbe_valeur,
                            (unsigned int) pnd->navdata_raw_measures.us_courbe_ref );

    fprintf( navdata_file, "; %f; %04u; % 5f; % 5f; % 5f; % 6f; % 6f; % 6f",
                            pnd->navdata_phys_measures.accs_temp,
                            (unsigned int)pnd->navdata_phys_measures.gyro_temp,
                            pnd->navdata_phys_measures.phys_accs[ACC_X],
                            pnd->navdata_phys_measures.phys_accs[ACC_Y],
                            pnd->navdata_phys_measures.phys_accs[ACC_Z],
                            pnd->navdata_phys_measures.phys_gyros[GYRO_X],
                            pnd->navdata_phys_measures.phys_gyros[GYRO_Y],
                            pnd->navdata_phys_measures.phys_gyros[GYRO_Z]);

    fprintf( navdata_file, "; % f; % f; % f",
                            pnd->navdata_gyros_offsets.offset_g[GYRO_X],
                            pnd->navdata_gyros_offsets.offset_g[GYRO_Y],
                            pnd->navdata_gyros_offsets.offset_g[GYRO_Z] );

    fprintf( navdata_file, "; % f; % f",
                            pnd->navdata_euler_angles.theta_a,
                            pnd->navdata_euler_angles.phi_a);

    fprintf( navdata_file, ";  %04d; %04d; %04d; %04d; %04d; %06d; %06d; %06d",
                            (int) pnd->navdata_references.ref_theta,
                            (int) pnd->navdata_references.ref_phi,
                            (int) pnd->navdata_references.ref_psi,
                            (int) pnd->navdata_references.ref_theta_I,
                            (int) pnd->navdata_references.ref_phi_I,
                            (int) pnd->navdata_references.ref_pitch,
                            (int) pnd->navdata_references.ref_roll,
                            (int) pnd->navdata_references.ref_yaw );

    fprintf( navdata_file, "; % 8.6f; % 8.6f; % 8.6f",
                            pnd->navdata_trims.euler_angles_trim_theta,
                            pnd->navdata_trims.euler_angles_trim_phi,
                            pnd->navdata_trims.angular_rates_trim_r );

    fprintf( navdata_file, "; %04d; %04d; %04d; %04d; %04d; %04u",
                            (int) pnd->navdata_rc_references.rc_ref_pitch,
                            (int) pnd->navdata_rc_references.rc_ref_roll,
                            (int) pnd->navdata_rc_references.rc_ref_yaw,
                            (int) pnd->navdata_rc_references.rc_ref_gaz,
                            (int) pnd->navdata_rc_references.rc_ref_ag,
                            (unsigned int) ui_get_user_input() );

    fprintf( navdata_file, "; %03u; %03u; %03u; %03u; %03u; %03u; %03u; %03u; %03u; %03d; % f; % f; %03d; %03d; %03d; % f; %03d; %03d; %03d; % f; %04d; %04d; %04d; %04d",
                            (unsigned int) pnd->navdata_pwm.motor1,
                            (unsigned int) pnd->navdata_pwm.motor2,
                            (unsigned int) pnd->navdata_pwm.motor3,
                            (unsigned int) pnd->navdata_pwm.motor4,
                            (unsigned int) pnd->navdata_pwm.sat_motor1,
                            (unsigned int) pnd->navdata_pwm.sat_motor2,
                            (unsigned int) pnd->navdata_pwm.sat_motor3,
                            (unsigned int) pnd->navdata_pwm.sat_motor4,
                            (int) pnd->navdata_pwm.gaz_feed_forward,
                            pnd->navdata_pwm.gaz_altitude,
                            pnd->navdata_pwm.altitude_integral,
                            pnd->navdata_pwm.vz_ref,
                            (int) pnd->navdata_pwm.u_pitch,
                            (int) pnd->navdata_pwm.u_roll,
                            (int) pnd->navdata_pwm.u_yaw,
                            pnd->navdata_pwm.yaw_u_I,
                            (int) pnd->navdata_pwm.u_pitch_planif,
                            (int) pnd->navdata_pwm.u_roll_planif,
                            (int) pnd->navdata_pwm.u_yaw_planif,
                            pnd->navdata_pwm.u_gaz_planif,
                            (int) pnd->navdata_pwm.current_motor1,
                            (int) pnd->navdata_pwm.current_motor2,
                            (int) pnd->navdata_pwm.current_motor3,
                            (int) pnd->navdata_pwm.current_motor4 );

    fprintf( navdata_file, "; %04d; %f; %04d; %04u",
                            (int) pnd->navdata_altitude.altitude_vision,
                            pnd->navdata_altitude.altitude_vz,
                            (int) pnd->navdata_altitude.altitude_ref,
                            (unsigned int) pnd->navdata_altitude.altitude_raw );

   fprintf( navdata_file, "; %f; %f; %f; %f; %f; %04u; %f; %f; %04u",
                            pnd->navdata_altitude.obs_accZ,
                            pnd->navdata_altitude.obs_alt,
                            pnd->navdata_altitude.obs_x.v[0],
                            pnd->navdata_altitude.obs_x.v[1],
                            pnd->navdata_altitude.obs_x.v[2],
                            pnd->navdata_altitude.obs_state,
														pnd->navdata_altitude.est_vb.v[0],
                            pnd->navdata_altitude.est_vb.v[1],
                            pnd->navdata_altitude.est_state );

		vp_os_memset(&str[0], 0, sizeof(str));
    sprintf( str, "%d.%06d", (int)((pnd->navdata_vision.time_capture & TSECMASK) >> TSECDEC), (int)(pnd->navdata_vision.time_capture & TUSECMASK) );

    fprintf( navdata_file, "; % 8.6f; % 8.6f; % 8.6f; %u; %u; % f;% f;% f;% f; % f; % f; % f; %u; % f; % f; % f; % f; % f; % f; % d; %s",
                            pnd->navdata_vision_raw.vision_tx_raw,
                            pnd->navdata_vision_raw.vision_ty_raw,
                            pnd->navdata_vision_raw.vision_tz_raw,
                            (unsigned int) pnd->navdata_vision.vision_state,
                            (unsigned int) pnd->vision_defined,
                            pnd->navdata_vision.vision_phi_trim,
                            pnd->navdata_vision.vision_phi_ref_prop,
                            pnd->navdata_vision.vision_theta_trim,
                            pnd->navdata_vision.vision_theta_ref_prop,
                            pnd->navdata_vision.body_v.x,
                            pnd->navdata_vision.body_v.y,
                            pnd->navdata_vision.body_v.z,
                            (unsigned int) pnd->navdata_vision.new_raw_picture,
                            pnd->navdata_vision.theta_capture,
                            pnd->navdata_vision.phi_capture,
                            pnd->navdata_vision.psi_capture,
                            pnd->navdata_vision.delta_phi,
                            pnd->navdata_vision.delta_theta,
                            pnd->navdata_vision.delta_psi,
                            (int)pnd->navdata_vision.altitude_capture,
                            str );

    fprintf( navdata_file, "; %04u",
                             (unsigned int) pnd->navdata_demo.vbat_flying_percentage );

     fprintf( navdata_file, "; % f; % f; % f",
                             pnd->navdata_demo.theta,
                             pnd->navdata_demo.phi,
                             pnd->navdata_demo.psi );

     fprintf( navdata_file, "; %04d",
                             (int) pnd->navdata_demo.altitude );

     fprintf( navdata_file, "; %f; %f; %f ",
							 pnd->navdata_demo.vx,
                             pnd->navdata_demo.vy,
                             pnd->navdata_demo.vz );

     fprintf( navdata_file, "; %04u", (unsigned int) pnd->navdata_demo.num_frames );

     fprintf( navdata_file, "; %f; %f; %f; %f; %f; %f; %f; %f; %f", pnd->navdata_demo.detection_camera_rot.m11,
																	pnd->navdata_demo.detection_camera_rot.m12,
																	pnd->navdata_demo.detection_camera_rot.m13,
																	pnd->navdata_demo.detection_camera_rot.m21,
																	pnd->navdata_demo.detection_camera_rot.m22,
																	pnd->navdata_demo.detection_camera_rot.m23,
																	pnd->navdata_demo.detection_camera_rot.m31,
																	pnd->navdata_demo.detection_camera_rot.m32,
																	pnd->navdata_demo.detection_camera_rot.m33);

     fprintf( navdata_file, "; %f; %f; %f", pnd->navdata_demo.detection_camera_trans.x,
											pnd->navdata_demo.detection_camera_trans.y,
											pnd->navdata_demo.detection_camera_trans.z);

     fprintf( navdata_file, "; %04u; %04u",
                             (unsigned int) pnd->navdata_demo.detection_tag_index,
                             (unsigned int) pnd->navdata_demo.detection_camera_type);

     fprintf( navdata_file, "; %f; %f; %f; %f; %f; %f; %f; %f; %f", pnd->navdata_demo.drone_camera_rot.m11,
																	pnd->navdata_demo.drone_camera_rot.m12,
																	pnd->navdata_demo.drone_camera_rot.m13,
																	pnd->navdata_demo.drone_camera_rot.m21,
																	pnd->navdata_demo.drone_camera_rot.m22,
																	pnd->navdata_demo.drone_camera_rot.m23,
																	pnd->navdata_demo.drone_camera_rot.m31,
																	pnd->navdata_demo.drone_camera_rot.m32,
																	pnd->navdata_demo.drone_camera_rot.m33);

     fprintf( navdata_file, "; %f; %f; %f", pnd->navdata_demo.drone_camera_trans.x,
											pnd->navdata_demo.drone_camera_trans.y,
											pnd->navdata_demo.drone_camera_trans.z);

     fprintf( navdata_file, "; %d; %f; %f; %f; %f",
											(int)nd_iphone_flag,
											nd_iphone_phi,
											nd_iphone_theta,
											nd_iphone_gaz,
											nd_iphone_yaw);

	   fprintf( navdata_file, "; %d; %d; %d; %d; %d; %f; %d",
			   pnd->navdata_video_stream.quant,
			   pnd->navdata_video_stream.frame_size,
			   pnd->navdata_video_stream.frame_number,
			   pnd->navdata_video_stream.atcmd_ref_seq,
			   pnd->navdata_video_stream.atcmd_mean_ref_gap,
			   pnd->navdata_video_stream.atcmd_var_ref_gap,
			   pnd->navdata_video_stream.atcmd_ref_quality);



    locked_ptr  = (int32_t*) &pnd->navdata_trackers_send.locked[0];
    point_ptr   = (screen_point_t*) &pnd->navdata_trackers_send.point[0];

    for(i = 0; i < DEFAULT_NB_TRACKERS_WIDTH*DEFAULT_NB_TRACKERS_HEIGHT; i++)
    {
      fprintf( navdata_file, "; %d; %u; %u",
                            (int) *locked_ptr++,
                            (unsigned int) point_ptr->x,
                            (unsigned int) point_ptr->y );
      point_ptr++;
    }

    fprintf( navdata_file, "; %u", (unsigned int) pnd->navdata_vision_detect.nb_detected );
    for(i = 0 ; i < 4 ; i++)
    {
      fprintf( navdata_file, "; %u; %u; %u; %u; %u; %u; %f",
                            (unsigned int) pnd->navdata_vision_detect.type[i],
                            (unsigned int) pnd->navdata_vision_detect.xc[i],
                            (unsigned int) pnd->navdata_vision_detect.yc[i],
                            (unsigned int) pnd->navdata_vision_detect.width[i],
                            (unsigned int) pnd->navdata_vision_detect.height[i],
                            (unsigned int) pnd->navdata_vision_detect.dist[i],
                            pnd->navdata_vision_detect.orientation_angle[i]);
    }

    fprintf( navdata_file, "; %f; %f; %f; %f; %f; %f",
                          pnd->navdata_vision_perf.time_szo,
                          pnd->navdata_vision_perf.time_corners,
                          pnd->navdata_vision_perf.time_compute,
                          pnd->navdata_vision_perf.time_tracking,
                          pnd->navdata_vision_perf.time_trans,
                          pnd->navdata_vision_perf.time_update );

    for(i = 0 ; i < NAVDATA_MAX_CUSTOM_TIME_SAVE ; i++)
    {
      fprintf( navdata_file, "; %f", pnd->navdata_vision_perf.time_custom[i]);
	}

    fprintf( navdata_file, "; %d", (int) pnd->navdata_watchdog.watchdog );

    fprintf( navdata_file, "; %u", (unsigned int) num_picture_decoded );

    sprintf( str, "%d.%06d", (int)time.tv_sec, (int)time.tv_usec);
    fprintf( navdata_file, "; %s", str );

  return C_OK;
}