ArDrone SDK 1.8 added
[mardrone] / mardrone / ARDrone_SDK_Version_1_8_20110726 / Examples / Linux / Testbenches / navdata_selection / Sources / ardrone_testing_tool.c
diff --git a/mardrone/ARDrone_SDK_Version_1_8_20110726/Examples/Linux/Testbenches/navdata_selection/Sources/ardrone_testing_tool.c b/mardrone/ARDrone_SDK_Version_1_8_20110726/Examples/Linux/Testbenches/navdata_selection/Sources/ardrone_testing_tool.c
new file mode 100644 (file)
index 0000000..ad0437c
--- /dev/null
@@ -0,0 +1,375 @@
+/**
+ * @file main.c
+ * @author sylvain.gaeremynck@parrot.com
+ * @date 2009/07/01
+ */
+#include <ardrone_testing_tool.h>
+
+//ARDroneLib
+#include <ardrone_tool/ardrone_time.h>
+#include <ardrone_tool/Navdata/ardrone_navdata_client.h>
+#include <ardrone_tool/Control/ardrone_control.h>
+#include <ardrone_tool/UI/ardrone_input.h>
+#include <ardrone_tool/ardrone_tool_configuration.h>
+
+//Common
+#include <config.h>
+#include <ardrone_api.h>
+
+//VP_SDK
+#include <ATcodec/ATcodec_api.h>
+#include <VP_Os/vp_os_print.h>
+#include <VP_Os/vp_os_thread.h>
+#include <VP_Api/vp_api_thread_helper.h>
+#include <VP_Os/vp_os_signal.h>
+#include <VP_Os/vp_os_types.h>
+#include <VP_Os/vp_os_delay.h>
+//#include <VP_Os/vp_os_signal_dep.h>
+
+//Local project
+#include <UI/gamepad.h>
+#include <Video/video_stage.h>
+
+static int32_t exit_ihm_program = 1;
+
+/* Implementing Custom methods for the main function of an ARDrone application */
+
+/* The delegate object calls this method during initialization of an ARDrone application */
+C_RESULT ardrone_tool_init_custom(int argc, char **argv)
+{
+  /* Registering for a new device of game controller */
+  ardrone_tool_input_add( &gamepad );
+  ardrone_tool_input_add( &ps3pad );
+
+  /* Start all threads of your application */
+  START_THREAD( video_stage, NULL );
+  START_THREAD( main_application_thread , NULL );
+  return C_OK;
+}
+
+/* The delegate object calls this method when the event loop exit */
+C_RESULT ardrone_tool_shutdown_custom()
+{
+  /* Relinquish all threads of your application */
+  JOIN_THREAD( video_stage );
+
+  /* Unregistering for the current device */
+  ardrone_tool_input_remove( &gamepad );
+
+  return C_OK;
+}
+
+/* The event loop calls this method for the exit condition */
+bool_t ardrone_tool_exit()
+{
+  return exit_ihm_program == 0;
+}
+
+C_RESULT signal_exit()
+{
+  exit_ihm_program = 0;
+
+  return C_OK;
+}
+
+PROTO_THREAD_ROUTINE(main_application_thread, data);
+
+/* Implementing thread table in which you add routines of your application and those provided by the SDK */
+BEGIN_THREAD_TABLE
+  THREAD_TABLE_ENTRY( ardrone_control, 20 )
+  THREAD_TABLE_ENTRY( navdata_update, 20 )
+  THREAD_TABLE_ENTRY( video_stage, 20 )
+  THREAD_TABLE_ENTRY( main_application_thread, 20 )
+END_THREAD_TABLE
+
+
+vp_os_mutex_t test_mutex;
+vp_os_cond_t  test_condition;
+
+vp_os_mutex_t navdata_mutex;
+vp_os_cond_t  navdata_condition;
+
+navdata_unpacked_t last_navdata;
+
+ C_RESULT demo_navdata_client_init( void* data ) { return C_OK; }
+
+ char anim[]={'-','\\','|','/'};
+
+ C_RESULT demo_navdata_client_process( const navdata_unpacked_t* const navdata )
+ {
+        static int counter=0;
+        printf("%c\n\033[1A",anim[(counter++)%sizeof(anim)]);
+        vp_os_memcpy(&last_navdata,navdata,sizeof(last_navdata));
+        vp_os_cond_signal(&navdata_condition);
+        return C_OK;
+ }
+
+ C_RESULT demo_navdata_client_release( void ) {return C_OK;}
+
+
+void wait_for_next_navdata()
+{
+       vp_os_mutex_lock(&navdata_mutex);
+       vp_os_cond_wait(&navdata_condition);
+       vp_os_mutex_unlock(&navdata_mutex);
+}
+
+
+void test_callback(int res)
+{
+       PRINT("<ArdroneTool callback>\n");
+       /* Make the test program continue */
+       if (res)
+       {
+               vp_os_cond_signal(&test_condition);
+       }
+       else
+       {
+               printf("  -- Configuration command is taking time to succeed ... ---\n");
+       }
+}
+
+void wait_for_setting_to_be_acknowlegded()
+{
+       vp_os_mutex_lock(&test_mutex);
+       vp_os_cond_wait(&test_condition);
+       vp_os_mutex_unlock(&test_mutex);
+}
+
+
+#define BLUE { printf("%s","\033[34;01m"); }
+#define RED { printf("%s","\033[31;01m"); }
+#define GREEN { printf("%s","\033[32;01m"); }
+
+#define RAZ { printf("%s","\033[0m"); }
+
+#define title(x) { BLUE; printf("[%i] %s",__LINE__,x); RAZ; }
+
+#define ok(x)      { GREEN; printf("[%i] %s",__LINE__,x); RAZ; }
+#define failure(x) { RED; printf("[%i] %s",__LINE__,x); RAZ; }
+
+void mypause()
+{
+       //char buffer[128];
+       char c;
+       printf("Press a key to continue...\n"); 
+       vp_os_delay(2000);
+       return;
+       c=fgetc(stdin); //getchar_unlocked();
+       perror("Erreur");
+       printf(" Key : %i\n",(int)c);
+}
+
+//#define USE_STEP_1
+//#define USE_STEP_2
+#define USE_STEP_3
+
+
+DEFINE_THREAD_ROUTINE(main_application_thread, data)
+{
+       int i;
+       int expected_mask=0;
+       int mask_to_test = 0;
+       int32_t i_value;
+
+       /* Mutexes for synchronisation */
+               vp_os_mutex_init(&test_mutex);
+               vp_os_cond_init(&test_condition,&test_mutex);
+
+               vp_os_mutex_init(&navdata_mutex);
+               vp_os_cond_init(&navdata_condition,&navdata_mutex);
+
+       vp_os_delay(1000);
+
+       //fflush(stdin);
+
+       title("[IMPORTANT]  Make sure no client application connected to the drone before.\n");
+
+       printf("Navdata full option mask : <%x>\n",NAVDATA_OPTION_FULL_MASK);
+       printf("Navdata nb options : <%i>\n",NAVDATA_NUM_TAGS);
+
+
+       mypause();
+
+#ifdef USE_STEP_1
+
+       /* Check that the drone is in bootstrap mode */
+
+/*Ardronetool sets the navdata full mode at startup */
+#ifdef NOARDRONETOOL
+       title("-- Checking drone state at bootstrap -- \n");
+
+               wait_for_next_navdata();
+
+               if (ardrone_get_mask_from_state(last_navdata.ardrone_state,ARDRONE_NAVDATA_BOOTSTRAP))
+               { ok("Bootstrap bit is set.\n"); }
+               else
+               { failure("Bootstrap bit is not set.\n"); }
+
+               if (!ardrone_get_mask_from_state(last_navdata.ardrone_state,ARDRONE_NAVDATA_DEMO_MASK))
+               { ok("Demo mask bit is not set\n"); }
+               else
+               { failure("Demo mask bit is set.\n"); }
+#endif
+
+       title("-- Checking drone state in navdata DEMO mode -- \n");
+
+               i_value = 1;
+               ARDRONE_TOOL_CONFIGURATION_ADDEVENT(navdata_demo, &i_value, NULL);
+
+               ARDRONE_TOOL_CONFIGURATION_GET(test_callback);
+               wait_for_setting_to_be_acknowlegded();
+
+               wait_for_next_navdata();
+
+               if (ardrone_get_mask_from_state(last_navdata.ardrone_state,ARDRONE_NAVDATA_BOOTSTRAP))
+               { failure("Bootstrap bit is set.\n"); }
+               else
+               { ok("Bootstrap bit is not set.\n"); }
+
+               if (!ardrone_get_mask_from_state(last_navdata.ardrone_state,ARDRONE_NAVDATA_DEMO_MASK))
+               { failure("Demo mask bit is not set\n"); }
+               else
+               { ok("Demo mask bit is set.\n"); }
+
+               if (last_navdata.last_navdata_refresh == ( NAVDATA_OPTION_MASK(NAVDATA_DEMO_TAG) | NAVDATA_OPTION_MASK(NAVDATA_VISION_DETECT_TAG) ) )
+               {       ok("Received the right options in the navdata\n");              }
+               else
+               {   failure("Received the wrong navdata options"); printf(" - mask : %x\n",last_navdata.last_navdata_refresh); }
+
+               if (ardrone_control_config.navdata_options == ( NAVDATA_OPTION_MASK(NAVDATA_DEMO_TAG) | NAVDATA_OPTION_MASK(NAVDATA_VISION_DETECT_TAG) ) )
+               {       ok("Navdata option mask is ok in the configuration\n");         }
+               else
+               {   failure("Wrong navdata option mask in the configuration"); printf(" - mask : %x\n",ardrone_control_config.navdata_options); }
+
+               mypause();
+
+
+
+       title("-- Checking drone state in navdata FULL mode -- \n");
+
+               i_value = 0;
+               ARDRONE_TOOL_CONFIGURATION_ADDEVENT(navdata_demo, &i_value, NULL);
+
+               ARDRONE_TOOL_CONFIGURATION_GET(test_callback);
+               wait_for_setting_to_be_acknowlegded();
+
+               wait_for_next_navdata();
+
+               if (ardrone_get_mask_from_state(last_navdata.ardrone_state,ARDRONE_NAVDATA_BOOTSTRAP))
+               { failure("Bootstrap bit is set.\n"); }
+               else
+               { ok("Bootstrap bit is not set.\n"); }
+
+               if (!ardrone_get_mask_from_state(last_navdata.ardrone_state,ARDRONE_NAVDATA_DEMO_MASK))
+               { ok("Demo mask bit is not set\n"); }
+               else
+               { failure("Demo mask bit is set.\n"); }
+
+               if ( (last_navdata.last_navdata_refresh  & (NAVDATA_OPTION_FULL_MASK)) == NAVDATA_OPTION_FULL_MASK )
+               {       ok("Received the right options in the navdata\n");              }
+               else
+               {   failure("Received the wrong navdata options"); printf("mask : %x\n",last_navdata.last_navdata_refresh); }
+
+               if ( (ardrone_control_config.navdata_options & (NAVDATA_OPTION_FULL_MASK)) == NAVDATA_OPTION_FULL_MASK )
+               {   ok("Navdata option mask part is ok\n");             }
+               else
+               {   failure("Wrong navdata option mask"); printf("mask : %x\n",ardrone_control_config.navdata_options); }
+
+               mypause();
+
+#endif
+
+       /*----------------------------*/
+#ifdef USE_STEP_2
+
+               /* Set the demo mode to get 15 navdatas per second */
+               i_value = 1;
+               ARDRONE_TOOL_CONFIGURATION_ADDEVENT(navdata_demo, &ivalue, NULL);
+
+               for (i=NAVDATA_DEMO_TAG ; i<NAVDATA_NUM_TAGS ; i++)
+               {
+                       title("-- Checking navdata tag "); printf("[%d]",i);
+
+                                       expected_mask = ( NAVDATA_OPTION_MASK(i) | NAVDATA_OPTION_MASK(NAVDATA_DEMO_TAG) |  NAVDATA_OPTION_MASK(NAVDATA_VISION_DETECT_TAG) );
+                                       i_value = NAVDATA_OPTION_MASK(i);
+                                       ARDRONE_TOOL_CONFIGURATION_ADDEVENT(navdata_options, &i_value, NULL);
+                                       ARDRONE_TOOL_CONFIGURATION_GET(test_callback);
+
+                                       wait_for_setting_to_be_acknowlegded();
+                                       wait_for_next_navdata();
+
+                                       if (ardrone_get_mask_from_state(last_navdata.ardrone_state,ARDRONE_NAVDATA_BOOTSTRAP))
+                                       { failure("Bootstrap bit is set.\n"); }
+                                       else
+                                       { ok("Bootstrap bit is not set.\n"); }
+
+                                       if (ardrone_get_mask_from_state(last_navdata.ardrone_state,ARDRONE_NAVDATA_DEMO_MASK))
+                                       { ok("Demo mask bit is set\n"); }
+                                       else
+                                       { failure("Demo mask bit is not set.\n"); }
+
+                                       if ( (last_navdata.last_navdata_refresh  & (NAVDATA_OPTION_FULL_MASK)) == expected_mask )
+                                       {       ok("Received the right options in the navdata\n");              }
+                                       else
+                                       {   failure("Received the wrong navdata options"); printf("mask : %x\n",last_navdata.last_navdata_refresh); }
+
+                                       if ( (ardrone_control_config.navdata_options & (NAVDATA_OPTION_FULL_MASK)) == expected_mask )
+                                       {   ok("Navdata option mask in the configuration is ok\n");             }
+                                       else
+                                       {   failure("Wrong navdata option mask in the configuration"); printf("mask : %x\n",ardrone_control_config.navdata_options); }
+
+                                       //mypause();
+
+               }
+
+#endif
+
+#ifdef USE_STEP_3
+
+               /* Set the demo mode to get 15 navdatas per second */
+               i_value = 1;
+               ARDRONE_TOOL_CONFIGURATION_ADDEVENT(navdata_demo, &i_value, NULL);
+
+               while(1)
+               {
+                       i = mask_to_test = rand() & NAVDATA_OPTION_FULL_MASK;
+
+                       title("-- Checking navdata tag "); printf("[%x]",i);
+
+                                                               expected_mask = ( mask_to_test | NAVDATA_OPTION_MASK(NAVDATA_DEMO_TAG) |  NAVDATA_OPTION_MASK(NAVDATA_VISION_DETECT_TAG) );
+                                                               i_value = (int32_t)mask_to_test;
+                                                               ARDRONE_TOOL_CONFIGURATION_ADDEVENT(navdata_options, &i_value, NULL);
+                                                               ARDRONE_TOOL_CONFIGURATION_GET(test_callback);
+
+                                                               wait_for_setting_to_be_acknowlegded();
+                                                               wait_for_next_navdata();
+
+                                                               if (ardrone_get_mask_from_state(last_navdata.ardrone_state,ARDRONE_NAVDATA_BOOTSTRAP))
+                                                               { failure("Bootstrap bit is set.\n"); }
+                                                               else
+                                                               { ok("Bootstrap bit is not set.\n"); }
+
+                                                               if (ardrone_get_mask_from_state(last_navdata.ardrone_state,ARDRONE_NAVDATA_DEMO_MASK))
+                                                               { ok("Demo mask bit is set\n"); }
+                                                               else
+                                                               { failure("Demo mask bit is not set.\n"); }
+
+                                                               if ( (last_navdata.last_navdata_refresh  & (NAVDATA_OPTION_FULL_MASK)) == expected_mask )
+                                                               {       ok("Received the right options in the navdata\n");              }
+                                                               else
+                                                               {   failure("Received the wrong navdata options"); printf("mask : %x  expected : %x\n",last_navdata.last_navdata_refresh,expected_mask); }
+
+                                                               if ( (ardrone_control_config.navdata_options & (NAVDATA_OPTION_FULL_MASK)) == expected_mask )
+                                                               {   ok("Navdata option mask in the configuration is ok\n");             }
+                                                               else
+                                                               {   failure("Wrong navdata option mask in the configuration"); printf("mask : %x  epxpected : %x\n",ardrone_control_config.navdata_options,expected_mask); }
+
+               }
+
+#endif
+
+
+       title("\nEnd of the test.\n");
+
+}