1 /********************************************************************
2 * COPYRIGHT PARROT 2010
3 ********************************************************************
5 *-----------------------------------------------------------------*/
10 * @author K. Leplat <karl.leplat.ext@parrot.com>
11 * @date Mon Feb 1 10:30:50 2010
14 *******************************************************************/
15 #include <VP_Os/vp_os_assert.h>
16 #include <VP_Os/vp_os_print.h>
17 #include <ardrone_tool/Com/config_com.h>
18 #include <ardrone_tool/ardrone_tool.h>
21 #include <ardrone_api.h>
22 #include <at_msgs_ids.h>
26 #include <VP_Com/vp_com.h>
27 #include <VP_Com/vp_com_socket.h>
29 //GNU STANDARD C LIBRARY
32 /********************************************************************
34 *******************************************************************/
35 #define MAX_BUF_SIZE 256
37 /********************************************************************
38 * Static variables and types
39 *******************************************************************/
41 static uint32_t at_init = 0;
42 static vp_os_mutex_t at_mutex;
43 static uint32_t nb_sequence = 0;
44 static vp_com_socket_t at_socket;
45 static AT_CODEC_FUNCTIONS_PTRS func_ptrs;
46 static Write atcodec_write = NULL;
47 static Read atcodec_read = NULL;
50 float32_t nd_iphone_gaz=0;
51 float32_t nd_iphone_yaw=0;
52 int32_t nd_iphone_flag = 0;
53 float32_t nd_iphone_phi=0;
54 float32_t nd_iphone_theta=0;
56 /********************************************************************
57 * Static function declarations
58 *******************************************************************/
59 static void atcodec_init( AT_CODEC_FUNCTIONS_PTRS *funcs );
60 void ardrone_at_shutdown ( void );
61 AT_CODEC_ERROR_CODE atresu_error(ATcodec_Memory_t *mem, ATcodec_Memory_t *output, int *id);
62 AT_CODEC_ERROR_CODE atresu_ok(ATcodec_Memory_t *mem, ATcodec_Memory_t *output, int *id);
63 AT_CODEC_ERROR_CODE host_init( void );
64 AT_CODEC_ERROR_CODE host_shutdown( void );
65 AT_CODEC_ERROR_CODE host_enable( void );
66 AT_CODEC_ERROR_CODE host_open( void );
67 AT_CODEC_ERROR_CODE host_close( void );
68 AT_CODEC_ERROR_CODE host_write(int8_t *buffer, int32_t *len);
69 AT_CODEC_ERROR_CODE host_read(int8_t *buffer, int32_t *len);
72 /********************************************************************
74 *******************************************************************/
75 AT_CODEC_ERROR_CODE atresu_ok(ATcodec_Memory_t *mem, ATcodec_Memory_t *output, int *id)
77 return AT_CODEC_GENERAL_OK;
80 AT_CODEC_ERROR_CODE atresu_error(ATcodec_Memory_t *mem, ATcodec_Memory_t *output, int *id)
82 return AT_CODEC_GENERAL_OK;
85 AT_CODEC_ERROR_CODE host_init( void )
87 if( func_ptrs.init != NULL )
90 # undef ATCODEC_DEFINE_AT_CMD
91 # define ATCODEC_DEFINE_AT_CMD(ID,Str,From,Cb,Prio) \
92 if((ids.ID = ATcodec_Add_Defined_Message(Str)) == -1) \
94 return AT_CODEC_INIT_ERROR; \
97 # undef ATCODEC_DEFINE_AT_RESU
98 # define ATCODEC_DEFINE_AT_RESU(ID,Str,From,Cb) \
99 if((ids.ID = ATcodec_Add_Hashed_Message(Str,ids.From,Cb,0)) == -1) \
101 return AT_CODEC_INIT_ERROR; \
104 # include <at_msgs.h>
106 return AT_CODEC_INIT_OK;
109 AT_CODEC_ERROR_CODE host_shutdown( void )
111 if( func_ptrs.shutdown != NULL )
112 func_ptrs.shutdown();
114 ardrone_at_shutdown();
116 return AT_CODEC_SHUTDOWN_OK;
119 AT_CODEC_ERROR_CODE host_enable( void )
121 if( func_ptrs.enable != NULL )
122 return func_ptrs.enable();
124 /* Only used with ARDrone */
125 return AT_CODEC_ENABLE_OK;
128 AT_CODEC_ERROR_CODE host_open( void )
130 static bool_t init_ok = FALSE;
132 if( func_ptrs.open != NULL )
133 return func_ptrs.open();
137 COM_CONFIG_SOCKET_AT(&at_socket, VP_COM_CLIENT, AT_PORT, wifi_ardrone_ip);
138 at_socket.protocol = VP_COM_UDP;
140 if(VP_FAILED(vp_com_init(COM_AT())))
142 PRINT ("Failed to init AT\n");
143 vp_com_shutdown( COM_AT() );
144 return AT_CODEC_OPEN_ERROR;
147 if(VP_FAILED(vp_com_open(COM_AT(), &at_socket, &atcodec_read, &atcodec_write)))
149 PRINT ("Failed to open AT\n");
150 return AT_CODEC_OPEN_ERROR;
156 return AT_CODEC_OPEN_OK;
159 AT_CODEC_ERROR_CODE host_close( void )
161 if( func_ptrs.close != NULL )
162 return func_ptrs.close();
164 vp_com_close(COM_AT(), &at_socket);
166 return AT_CODEC_CLOSE_OK;
169 AT_CODEC_ERROR_CODE host_write(int8_t *buffer, int32_t *len)
171 if( func_ptrs.write != NULL )
172 return func_ptrs.write( buffer, len );
174 if( atcodec_write != NULL )
176 return VP_FAILED(atcodec_write(&at_socket, buffer, len)) ? AT_CODEC_WRITE_ERROR : AT_CODEC_WRITE_OK;
179 return AT_CODEC_WRITE_OK;
182 AT_CODEC_ERROR_CODE host_read(int8_t *buffer, int32_t *len)
184 if( func_ptrs.read != NULL )
185 return func_ptrs.read( buffer, len );
187 return AT_CODEC_READ_OK;
190 static void atcodec_init( AT_CODEC_FUNCTIONS_PTRS *funcs )
194 memcpy(&func_ptrs, funcs, sizeof(*funcs));
197 #if defined (_MSC_VER)
199 AT_CODEC_FUNCTIONS_PTRS ptrs =
202 /*shutdown*/host_shutdown,
203 /*enable*/host_enable,
210 AT_CODEC_FUNCTIONS_PTRS ptrs =
213 .shutdown = host_shutdown,
214 .enable = host_enable,
221 vp_os_mutex_init(&at_mutex);
222 ATcodec_Init_Library( &ptrs );
225 /********************************************************************
227 *******************************************************************/
228 void ardrone_at_set_ui_value( uint32_t value )
233 vp_os_mutex_lock(&at_mutex);
234 ATcodec_Queue_Message_valist( ids.AT_MSG_ATCMD_RC_REF_EXE,
237 vp_os_mutex_unlock(&at_mutex);
240 void ardrone_at_set_pmode( int32_t pmode )
245 vp_os_mutex_lock(&at_mutex);
246 ATcodec_Queue_Message_valist( ids.AT_MSG_ATCMD_PMODE_EXE,
249 vp_os_mutex_unlock(&at_mutex);
252 void ardrone_at_set_ui_misc(int32_t m1, int32_t m2, int32_t m3, int32_t m4)
257 vp_os_mutex_lock(&at_mutex);
258 ATcodec_Queue_Message_valist( ids.AT_MSG_ATCMD_MISC_EXE,
264 vp_os_mutex_unlock(&at_mutex);
267 void ardrone_at_set_anim( anim_mayday_t type, int32_t timeout )
269 int32_t animtype = type;
274 vp_os_mutex_lock(&at_mutex);
275 ATcodec_Queue_Message_valist( ids.AT_MSG_ATCMD_ANIM_EXE,
279 vp_os_mutex_unlock(&at_mutex);
282 void ardrone_at_set_flat_trim(void)
287 vp_os_mutex_lock(&at_mutex);
288 ATcodec_Queue_Message_valist( ids.AT_MSG_ATCMD_FTRIM_EXE,
290 vp_os_mutex_unlock(&at_mutex);
293 void ardrone_at_set_manual_trims(float32_t trim_pitch, float32_t trim_roll, float32_t trim_yaw)
295 float_or_int_t _trim_pitch, _trim_roll, _trim_yaw;
299 _trim_pitch.f = trim_pitch;
300 _trim_roll.f = trim_roll;
301 _trim_yaw.f = trim_yaw;
303 vp_os_mutex_lock(&at_mutex);
304 ATcodec_Queue_Message_valist( ids.AT_MSG_ATCMD_MTRIM_EXE,
309 vp_os_mutex_unlock(&at_mutex);
312 void ardrone_at_set_control_gains( api_control_gains_t* gains )
317 vp_os_mutex_lock(&at_mutex);
318 ATcodec_Queue_Message_valist( ids.AT_MSG_ATCMD_GAIN_EXE,
320 gains->pq_kp, gains->r_kp, gains->r_ki, gains->ea_kp, gains->ea_ki,
321 gains->alt_kp, gains->alt_ki, gains->vz_kp, gains->vz_ki,
322 gains->hovering_kp, gains->hovering_ki,
323 gains->hovering_b_kp, gains->hovering_b_ki);
324 vp_os_mutex_unlock(&at_mutex);
327 void ardrone_at_set_vision_track_params( api_vision_tracker_params_t* params )
332 vp_os_mutex_lock(&at_mutex);
333 ATcodec_Queue_Message_valist( ids.AT_MSG_ATCMD_VISP_EXE,
335 params->coarse_scale,
338 params->nb_tracker_width,
339 params->nb_tracker_height,
342 params->max_pair_dist,
344 vp_os_mutex_unlock(&at_mutex);
347 void ardrone_at_start_raw_capture(void)
352 vp_os_mutex_lock(&at_mutex);
353 ATcodec_Queue_Message_valist(ids.AT_MSG_ATCMD_RAWC_EXE,
355 vp_os_mutex_unlock(&at_mutex);
358 void ardrone_at_zap( ZAP_VIDEO_CHANNEL channel )
363 vp_os_mutex_lock(&at_mutex);
364 ATcodec_Queue_Message_valist( ids.AT_MSG_ATCMD_ZAP_EXE,
367 vp_os_mutex_unlock(&at_mutex);
370 void ardrone_at_cad( CAD_TYPE type, float32_t tag_size )
378 vp_os_mutex_lock(&at_mutex);
379 ATcodec_Queue_Message_valist( ids.AT_MSG_ATCMD_CAD_EXE,
383 vp_os_mutex_unlock(&at_mutex);
386 /********************************************************************
387 * ardrone_at_set_progress_cmd:
388 *-----------------------------------------------------------------*/
390 * @param enable 1,with pitch,roll and 0,without pitch,roll.
391 * @param pitch Using floating value between -1 to +1.
392 * @param roll Using floating value between -1 to +1.
393 * @param gaz Using floating value between -1 to +1.
394 * @param yaw Using floating value between -1 to +1.
400 *******************************************************************/
401 void ardrone_at_set_progress_cmd( int32_t flag, float32_t phi, float32_t theta, float32_t gaz, float32_t yaw )
403 float_or_int_t _phi, _theta, _gaz, _yaw;
413 // Saving values to set them in navdata_file
416 nd_iphone_theta=theta;
420 vp_os_mutex_lock(&at_mutex);
421 ATcodec_Queue_Message_valist( ids.AT_MSG_ATCMD_PCMD_EXE,
428 vp_os_mutex_unlock(&at_mutex);
431 void ardrone_at_set_led_animation ( LED_ANIMATION_IDS anim_id, float32_t freq, uint32_t duration_sec )
433 float_or_int_t _freq;
440 vp_os_mutex_lock(&at_mutex);
441 ATcodec_Queue_Message_valist(ids.AT_MSG_ATCMD_LED_EXE,
446 vp_os_mutex_unlock(&at_mutex);
449 void ardrone_at_set_vision_update_options(int32_t user_vision_option)
454 vp_os_mutex_lock(&at_mutex);
455 ATcodec_Queue_Message_valist(ids.AT_MSG_ATCMD_VISO_EXE,
458 vp_os_mutex_unlock(&at_mutex);
461 /********************************************************************
462 * ardrone_at_set_polaris_pos:
463 *-----------------------------------------------------------------*/
464 void ardrone_at_set_polaris_pos( float32_t fx, float32_t fy, float32_t fpsi, bool_t defined, int32_t time_us )
466 float_or_int_t x, y, psi;
475 vp_os_mutex_lock(&at_mutex);
476 ATcodec_Queue_Message_valist( ids.AT_MSG_ATCMD_POLARIS_EXE,
483 vp_os_mutex_unlock(&at_mutex);
486 void ardrone_at_set_vicon_data(struct timeval time, int32_t frame_number, float32_t latency, vector31_t global_translation, vector31_t global_rotation_euler)
488 float_or_int_t _latency, _global_translation_x, _global_translation_y, _global_translation_z, _global_rotation_euler_x, _global_rotation_euler_y,
489 _global_rotation_euler_z;
494 _latency.f = latency;
495 _global_translation_x.f = global_translation.x;
496 _global_translation_y.f = global_translation.y;
497 _global_translation_z.f = global_translation.z;
498 _global_rotation_euler_x.f = global_rotation_euler.x;
499 _global_rotation_euler_y.f = global_rotation_euler.y;
500 _global_rotation_euler_z.f = global_rotation_euler.z;
502 vp_os_mutex_lock(&at_mutex);
503 ATcodec_Queue_Message_valist( ids.AT_MSG_ATCMD_VICON_EXE,
509 _global_translation_x.i,
510 _global_translation_y.i,
511 _global_translation_z.i,
512 _global_rotation_euler_x.i,
513 _global_rotation_euler_y.i,
514 _global_rotation_euler_z.i);
516 vp_os_mutex_unlock(&at_mutex);
519 /********************************************************************
520 * ardrone_at_set_toy_configuration_ids:
521 *-----------------------------------------------------------------*/
523 * @param param A key as read from an ini file is given as "section:key".
527 * @brief identified ardrone_at_set_toy_configuration
531 *******************************************************************/
532 void ardrone_at_set_toy_configuration_ids(const char* param,char* ses_id, char* usr_id, char* app_id, const char* value)
537 vp_os_mutex_lock(&at_mutex);
538 ATcodec_Queue_Message_valist( ids.AT_MSG_ATCMD_CONFIG_IDS,
543 ATcodec_Queue_Message_valist( ids.AT_MSG_ATCMD_CONFIG_EXE,
547 vp_os_mutex_unlock(&at_mutex);
550 /********************************************************************
551 * ardrone_at_reset_com_watchdog:
552 *-----------------------------------------------------------------*/
554 * @brief Re-connect with the ARDrone.
558 *******************************************************************/
559 void ardrone_at_reset_com_watchdog(void)
564 vp_os_mutex_lock(&at_mutex);
565 ATcodec_Queue_Message_valist( ids.AT_MSG_ATCMD_RESET_COM_WATCHDOG,
567 vp_os_mutex_unlock(&at_mutex);
570 /********************************************************************
571 * ardrone_at_update_control_mode:
572 *-----------------------------------------------------------------*/
582 *******************************************************************/
583 void ardrone_at_update_control_mode(uint32_t what_to_do, uint32_t filesize)
588 vp_os_mutex_lock(&at_mutex);
589 ATcodec_Queue_Message_valist( ids.AT_MSG_ATCMD_CTRL_EXE,
593 vp_os_mutex_unlock(&at_mutex);
596 /********************************************************************
597 * ardrone_at_configuration_get_ctrl_mode:
598 *-----------------------------------------------------------------*/
600 * @brief Request to receive configuration file.
604 *******************************************************************/
605 void ardrone_at_configuration_get_ctrl_mode(void)
610 ardrone_at_update_control_mode( CFG_GET_CONTROL_MODE, 0 );
613 /* Stephane - multiconfiguration support */
614 void ardrone_at_custom_configuration_get_ctrl_mode(void)
616 printf("%s %s %i\n",__FILE__,__FUNCTION__,__LINE__);
620 ardrone_at_update_control_mode( CUSTOM_CFG_GET_CONTROL_MODE, 0 );
623 /********************************************************************
624 * ardrone_at_configuration_ack_ctrl_mode:
625 *-----------------------------------------------------------------*/
627 * @brief Signal to the drone that the file has been received.
631 *******************************************************************/
632 void ardrone_at_configuration_ack_ctrl_mode(void)
637 ardrone_at_update_control_mode( ACK_CONTROL_MODE, 0 );
640 /********************************************************************
641 * ardrone_at_set_pwm: .
642 *-----------------------------------------------------------------*/
656 *******************************************************************/
657 void ardrone_at_set_pwm(int32_t p1, int32_t p2, int32_t p3, int32_t p4)
662 vp_os_mutex_lock(&at_mutex);
663 ATcodec_Queue_Message_valist( ids.AT_MSG_ATCMD_PWM_EXE,
669 vp_os_mutex_unlock(&at_mutex);
672 /********************************************************************
673 * ardrone_at_set_autonomous_flight: Enables / disables the autopilot.
674 *-----------------------------------------------------------------*/
676 * @param isActive Integer set to 1 to enable the autopilot.
678 * @brief Enables / disables the autopilot.
682 *******************************************************************/
683 void ardrone_at_set_autonomous_flight( int32_t isActive )
688 vp_os_mutex_lock(&at_mutex);
689 ATcodec_Queue_Message_valist( ids.AT_MSG_ATCMD_AUTONOMOUS_FLIGHT_EXE,
692 vp_os_mutex_unlock(&at_mutex);
695 static inline void strtolower(char *str)
698 for(i = 0 ; str[i] != '\0' ; i++)
699 str[i] = (char)tolower((int)str[i]);
702 #undef ARDRONE_CONFIG_KEY_IMM
703 #undef ARDRONE_CONFIG_KEY_REF
704 #undef ARDRONE_CONFIG_KEY_STR
705 #define ARDRONE_CONFIG_KEY_IMM(KEY, NAME, INI_TYPE, C_TYPE, C_TYPE_PTR, RW, DEFAULT, CALLBACK) \
706 ARDRONE_CONFIGURATION_PROTOTYPE(NAME) \
708 C_RESULT res = C_FAIL; \
710 if(strcmp("" #INI_TYPE, "INI_FLOAT") == 0) \
712 sprintf( &msg[0], "%f", *((float*)value)); \
715 if(strcmp("" #INI_TYPE, "INI_DOUBLE") == 0) \
717 sprintf( &msg[0], "%lf", *((double*)value)); \
720 else if(strcmp("" #INI_TYPE, "INI_INT") == 0) \
722 sprintf( &msg[0], "%d", *((int*)value)); \
725 else if(strcmp("" #INI_TYPE, "INI_BOOLEAN") == 0) \
727 sprintf( &msg[0], *((bool_t*)value) ? "TRUE" : "FALSE"); \
733 strcpy(&tmp[0], KEY); \
734 strtolower(&tmp[0]); \
735 strcat(tmp, ":" #NAME); \
736 ardrone_at_set_toy_configuration_ids( &tmp[0], ses_id, usr_id, app_id, &msg[0] ); \
741 #define ARDRONE_CONFIG_KEY_REF(KEY, NAME, INI_TYPE, C_TYPE, C_TYPE_PTR, RW, DEFAULT, CALLBACK)
743 #define ARDRONE_CONFIG_KEY_STR(KEY, NAME, INI_TYPE, C_TYPE, C_TYPE_PTR, RW, DEFAULT, CALLBACK) \
744 ARDRONE_CONFIGURATION_PROTOTYPE(NAME) \
746 C_RESULT res = C_FAIL; \
750 strcpy(&tmp[0], KEY); \
751 strtolower(&tmp[0]); \
752 strcat(&tmp[0], ":" #NAME); \
753 ardrone_at_set_toy_configuration_ids( &tmp[0], ses_id, usr_id, app_id, ((C_TYPE_PTR)value) ); \
759 #include <config_keys.h> // must be included before to have types
763 /********************************************************************
764 * ardrone_at_init_with_funcs: Init at command with ATCodec funcs
765 *-----------------------------------------------------------------*/
769 * @brief Fill structure AT codec
770 * and built the library AT commands.
774 *******************************************************************/
775 void ardrone_at_init_with_funcs ( const char* ip, size_t ip_len, AT_CODEC_FUNCTIONS_PTRS *funcs)
780 VP_OS_ASSERT( ip_len < MAX_BUF_SIZE );
782 vp_os_memcpy( &wifi_ardrone_ip[0], ip, ip_len);
783 wifi_ardrone_ip[ip_len]='\0';
785 atcodec_init (funcs);
790 /********************************************************************
791 * ardrone_at_shutdown: Close at command.
792 *-----------------------------------------------------------------*/
800 *******************************************************************/
801 void ardrone_at_shutdown ( void )
806 ATcodec_Shutdown_Library();
807 vp_os_mutex_destroy(&at_mutex);
812 /********************************************************************
813 * ardrone_at_init: Init at command.
814 *-----------------------------------------------------------------*/
818 * @brief Fill structure AT codec
819 * and built the library AT commands.
823 *******************************************************************/
824 void ardrone_at_init ( const char* ip, size_t ip_len)
829 VP_OS_ASSERT( ip_len < MAX_BUF_SIZE );
831 if(wifi_ardrone_ip!=ip){
832 vp_os_memcpy( &wifi_ardrone_ip[0], ip, ip_len);
834 wifi_ardrone_ip[ip_len]='\0';
841 /********************************************************************
842 * ardrone_at_open: Open at command socket.
843 *-----------------------------------------------------------------*/
847 * @brief Open at command socket.
851 *******************************************************************/
852 ATCODEC_RET ardrone_at_open ( void )
855 return ATCODEC_FALSE;
857 return host_open()==AT_CODEC_OPEN_OK?ATCODEC_TRUE:ATCODEC_FALSE;
860 /********************************************************************
861 * ardrone_at_send: Send all pushed messages.
862 *-----------------------------------------------------------------*/
866 * @brief Send all pushed messages.
870 *******************************************************************/
871 ATCODEC_RET ardrone_at_send ( void )
876 return ATCODEC_FALSE;
878 res = ATcodec_Send_Messages();