1 #include <VP_Os/vp_os_malloc.h>
2 #include <VP_Os/vp_os_print.h>
3 #include <VP_Api/vp_api_thread_helper.h>
5 #include <ardrone_tool/ardrone_tool.h>
6 #include <ardrone_tool/ardrone_time.h>
7 #include <ardrone_tool/ardrone_tool_configuration.h>
8 #include <ardrone_tool/Navdata/ardrone_navdata_client.h>
9 #include <ardrone_tool/UI/ardrone_input.h>
10 #include <ardrone_tool/Com/config_com.h>
12 #include <utils/ardrone_gen_ids.h>
14 int32_t MiscVar[NB_MISC_VARS] = {
21 //static bool_t need_update = TRUE;
22 static ardrone_timer_t ardrone_tool_timer;
23 static int ArdroneToolRefreshTimeInUs = ARDRONE_REFRESH_MS * 1000;
24 static vp_os_mutex_t ardrone_tool_mutex;
25 static bool_t ardrone_tool_in_pause = FALSE;
26 char wifi_ardrone_ip[256] = { WIFI_ARDRONE_IP };
27 char app_id [MULTICONFIG_ID_SIZE] = "00000000"; // Default application ID.
28 char app_name [APPLI_NAME_SIZE] = "Default application"; // Default application name.
29 char usr_id [MULTICONFIG_ID_SIZE] = "00000000"; // Default user ID.
30 char usr_name [USER_NAME_SIZE] = "Default user"; // Default user name.
31 char ses_id [MULTICONFIG_ID_SIZE] = "00000000"; // Default session ID.
32 char ses_name [SESSION_NAME_SIZE] = "Default session"; // Default session name.
34 #ifndef __SDK_VERSION__
35 #define __SDK_VERSION__ "1.8" // TEMPORARY LOCATION OF __SDK_VERSION__ !!!
39 int usleep(unsigned int usec);
41 static bool_t send_com_watchdog = FALSE;
43 void ardrone_tool_send_com_watchdog( void )
45 send_com_watchdog = TRUE;
48 #ifndef NO_ARDRONE_MAINLOOP
49 static void ardrone_tool_usage( const char* appname )
51 printf("%s based on ARDrone Tool\n", appname);
52 printf("Be aware to not insert space in your options\n");
54 ardrone_tool_display_cmd_line_custom();
58 static void ardrone_toy_network_adapter_cb( const char* name )
60 strcpy( COM_CONFIG_NAVDATA()->itfName, name );
63 C_RESULT ardrone_tool_setup_com( const char* ssid )
67 #ifdef CHECK_WIFI_CONFIG
68 if( FAILED(vp_com_init(COM_NAVDATA())) )
70 DEBUG_PRINT_SDK("VP_Com : Failed to init com for navdata\n");
71 vp_com_shutdown(COM_NAVDATA());
75 vp_com_network_adapter_lookup(COM_NAVDATA(), ardrone_toy_network_adapter_cb);
77 if( SUCCEED(res) && FAILED(vp_com_local_config(COM_NAVDATA(), COM_CONFIG_NAVDATA())) )
79 DEBUG_PRINT_SDK("VP_Com : Failed to configure com for navdata\n");
80 vp_com_shutdown(COM_NAVDATA());
86 strcpy( ((vp_com_wifi_connection_t*)wifi_connection())->networkName, ssid );
89 if( SUCCEED(res) && FAILED(vp_com_connect(COM_NAVDATA(), COM_CONNECTION_NAVDATA(), NUM_ATTEMPTS)))
91 DEBUG_PRINT_SDK("VP_Com: Failed to connect for navdata\n");
92 vp_com_shutdown(COM_NAVDATA());
96 vp_com_init(COM_NAVDATA());
97 vp_com_network_adapter_lookup(COM_NAVDATA(), ardrone_toy_network_adapter_cb);
98 vp_com_local_config(COM_NAVDATA(), COM_CONFIG_NAVDATA());
102 strcpy( ((vp_com_wifi_connection_t*)wifi_connection())->networkName, ssid );
105 vp_com_connect(COM_NAVDATA(), COM_CONNECTION_NAVDATA(), NUM_ATTEMPTS);
106 ((vp_com_wifi_connection_t*)wifi_connection())->is_up=1;
112 #ifdef NO_ARDRONE_MAINLOOP
113 C_RESULT ardrone_tool_init( const char* ardrone_ip, size_t n, AT_CODEC_FUNCTIONS_PTRS *ptrs, const char *appname, const char *usrname)
115 // Initalize mutex and condition
116 vp_os_mutex_init(&ardrone_tool_mutex);
117 ardrone_tool_in_pause = FALSE;
119 // Initialize ardrone_control_config structures;
120 ardrone_tool_reset_configuration();
121 // ardrone_control_config_default initialisation. Sould not be modified after that !
122 vp_os_memcpy ((void *)&ardrone_control_config_default, (const void *)&ardrone_control_config, sizeof (ardrone_control_config_default));
123 // initialization of application defined default values
124 vp_os_memcpy ((void *)&ardrone_application_default_config, (const void *)&ardrone_control_config, sizeof (ardrone_application_default_config));
126 //Fill structure AT codec and built the library AT commands.
128 ardrone_at_init_with_funcs( ardrone_ip, n, ptrs );
130 ardrone_at_init( ardrone_ip, n );
132 // Save appname/appid for reconnections
135 ardrone_gen_appid (appname, __SDK_VERSION__, app_id, app_name, sizeof (app_name));
137 // Save usrname/usrid for reconnections
140 ardrone_gen_usrid (usrname, usr_id, usr_name, sizeof (usr_name));
142 // Create pseudorandom session id
143 ardrone_gen_sessionid (ses_id, ses_name, sizeof (ses_name));
146 ardrone_timer_reset(&ardrone_tool_timer);
147 ardrone_timer_update(&ardrone_tool_timer);
149 ardrone_tool_input_init();
150 ardrone_control_init();
151 ardrone_tool_configuration_init();
152 ardrone_navdata_client_init();
155 //Opens a connection to AT port.
158 START_THREAD(navdata_update, 0);
159 START_THREAD(ardrone_control, 0);
161 // Send start up configuration
162 ardrone_at_set_pmode( MiscVar[0] );
163 ardrone_at_set_ui_misc( MiscVar[0], MiscVar[1], MiscVar[2], MiscVar[3] );
168 C_RESULT ardrone_tool_init(int argc, char **argv)
171 int32_t b_value = FALSE;
173 // Initalize mutex and condition
174 vp_os_mutex_init(&ardrone_tool_mutex);
175 ardrone_tool_in_pause = FALSE;
177 // Initialize ardrone_control_config structures;
178 ardrone_tool_reset_configuration();
179 // ardrone_control_config_default initialisation. Sould not be modified after that !
180 vp_os_memcpy ((void *)&ardrone_control_config_default, (const void *)&ardrone_control_config, sizeof (ardrone_control_config_default));
181 // initialization of application defined default values
182 vp_os_memcpy ((void *)&ardrone_application_default_config, (const void *)&ardrone_control_config, sizeof (ardrone_application_default_config));
183 ardrone_application_default_config.navdata_demo = b_value;
185 // Save appname/appid for reconnections
188 char *appname = NULL;
190 /* Cut the invoking name to the last / or \ character on the command line
191 * This avoids using differents app_id for applications called from different directories
192 * e.g. if argv[0] is "Build/Release/ardrone_navigation", appname will point to "ardrone_navigation" only
194 for (lastSlashPos = strlen (argv[0])-1;
196 argv[0][lastSlashPos] != '/' &&
197 argv[0][lastSlashPos] != '\\';
199 appname = &argv[0][lastSlashPos+1];
200 ardrone_gen_appid (appname, __SDK_VERSION__, app_id, app_name, sizeof (app_name));
203 // Create pseudorandom session id
204 ardrone_gen_sessionid (ses_id, ses_name, sizeof (ses_name));
206 //Fill structure AT codec and built the library AT commands.
207 ardrone_at_init( wifi_ardrone_ip, strlen( wifi_ardrone_ip) );
210 ardrone_timer_reset(&ardrone_tool_timer);
211 ardrone_timer_update(&ardrone_tool_timer);
213 ardrone_tool_input_init();
214 ardrone_control_init();
215 ardrone_tool_configuration_init();
216 ardrone_navdata_client_init();
219 res = ardrone_tool_init_custom(argc, argv);
221 //Opens a connection to AT port.
224 START_THREAD(navdata_update, 0);
225 START_THREAD(ardrone_control, 0);
227 // Send start up configuration
228 ardrone_at_set_pmode( MiscVar[0] );
229 ardrone_at_set_ui_misc( MiscVar[0], MiscVar[1], MiscVar[2], MiscVar[3] );
235 C_RESULT ardrone_tool_set_refresh_time(int refresh_time_in_ms)
237 ArdroneToolRefreshTimeInUs = refresh_time_in_ms * 1000;
242 C_RESULT ardrone_tool_pause( void )
244 ardrone_navdata_client_suspend();
246 vp_os_mutex_lock(&ardrone_tool_mutex);
247 ardrone_tool_in_pause = TRUE;
248 vp_os_mutex_unlock(&ardrone_tool_mutex);
253 C_RESULT ardrone_tool_resume( void )
255 ardrone_navdata_client_resume();
257 vp_os_mutex_lock(&ardrone_tool_mutex);
258 ardrone_tool_in_pause = FALSE;
259 vp_os_mutex_unlock(&ardrone_tool_mutex);
264 C_RESULT ardrone_tool_update()
270 delta = ardrone_timer_delta_us(&ardrone_tool_timer);
271 if( delta >= ArdroneToolRefreshTimeInUs)
274 ardrone_timer_update(&ardrone_tool_timer);
276 if(!ardrone_tool_in_pause)
278 ardrone_tool_input_update();
279 res = ardrone_tool_update_custom();
282 if( send_com_watchdog == TRUE )
284 ardrone_at_reset_com_watchdog();
285 send_com_watchdog = FALSE;
288 // Send all pushed messages
291 res = ardrone_tool_display_custom();
295 usleep(ArdroneToolRefreshTimeInUs - delta);
301 C_RESULT ardrone_tool_shutdown()
305 #ifndef NO_ARDRONE_MAINLOOP
306 res = ardrone_tool_shutdown_custom();
309 // Shutdown subsystems
310 ardrone_navdata_client_shutdown();
311 ardrone_control_shutdown();
312 ardrone_tool_input_shutdown();
314 JOIN_THREAD(ardrone_control);
315 JOIN_THREAD(navdata_update);
317 // Shutdown AT Commands
318 ATcodec_exit_thread();
319 ATcodec_Shutdown_Library();
321 vp_com_disconnect(COM_NAVDATA());
322 vp_com_shutdown(COM_NAVDATA());
324 PRINT("Custom ardrone tool ended\n");
328 #ifndef NO_ARDRONE_MAINLOOP
332 int main(int argc, char **argv)
335 const char* old_locale;
336 const char* appname = argv[0];
337 int argc_backup = argc;
338 char** argv_backup = argv;
340 bool_t show_usage = FAILED( ardrone_tool_check_argc_custom(argc) ) ? TRUE : FALSE;
343 while( argc && *argv[0] == '-' )
345 if( !strcmp(*argv, "-?") || !strcmp(*argv, "-h") || !strcmp(*argv, "-help") || !strcmp(*argv, "--help") )
347 ardrone_tool_usage( appname );
350 else if( !ardrone_tool_parse_cmd_line_custom( *argv ) )
352 printf("Option %s not recognized\n", *argv);
359 if( show_usage || (argc != 0) )
361 ardrone_tool_usage( appname );
365 /* After a first analysis, the arguments are restored so they can be passed to the user-defined functions */
369 old_locale = setlocale(LC_NUMERIC, "en_GB.UTF-8");
371 if( old_locale == NULL )
373 PRINT("You have to install new locales in your dev environment! (avoid the need of conv_coma_to_dot)\n");
374 PRINT("As root, do a \"dpkg-reconfigure locales\" and add en_GB.UTF8 to your locale settings\n");
375 PRINT("If you have any problem, feel free to contact Pierre Eline (pierre.eline@parrot.com)\n");
379 PRINT("Setting locale to %s\n", old_locale);
382 vp_com_wifi_config_t *config = (vp_com_wifi_config_t*)wifi_config();
385 vp_os_memset( &wifi_ardrone_ip[0], 0, sizeof(wifi_ardrone_ip) );
386 printf("===================+> %s\n", config->server);
387 strcpy( &wifi_ardrone_ip[0], config->server);
392 return custom_main(argc, argv);
396 res = ardrone_tool_setup_com( NULL );
400 PRINT("Wifi initialization failed. It means either:\n");
401 PRINT("\t* you're not root (it's mandatory because you can set up wifi connection only as root)\n");
402 PRINT("\t* wifi device is not present (on your pc or on your card)\n");
403 PRINT("\t* you set the wrong name for wifi interface (for example rausb0 instead of wlan0) \n");
404 PRINT("\t* ap is not up (reboot card or remove wifi usb dongle)\n");
405 PRINT("\t* wifi device has no antenna\n");
409 res = ardrone_tool_init(argc, argv);
411 while( SUCCEED(res) && ardrone_tool_exit() == FALSE )
413 res = ardrone_tool_update();
416 res = ardrone_tool_shutdown();
420 if( old_locale != NULL )
422 setlocale(LC_NUMERIC, old_locale);
425 return SUCCEED(res) ? 0 : -1;
427 #endif // ! WITH_ARDRONE_MAIN_LOOP
429 // Default implementation for weak functions
431 C_RESULT ardrone_tool_init_custom(int argc, char **argv) { return C_OK; }
432 C_RESULT ardrone_tool_update_custom() { return C_OK; }
433 C_RESULT ardrone_tool_display_custom() { return C_OK; }
434 C_RESULT ardrone_tool_shutdown_custom() { return C_OK; }
435 bool_t ardrone_tool_exit() { return FALSE; }
436 C_RESULT ardrone_tool_check_argc_custom( int32_t argc) { return C_OK; }
437 void ardrone_tool_display_cmd_line_custom( void ) {}
438 bool_t ardrone_tool_parse_cmd_line_custom( const char* cmd ) { return TRUE; }