ArDrone SDK 1.8 added
[mardrone] / mardrone / ARDrone_SDK_Version_1_8_20110726 / Examples / Android / ardrone / project / jni / navdata.c
diff --git a/mardrone/ARDrone_SDK_Version_1_8_20110726/Examples/Android/ardrone/project/jni/navdata.c b/mardrone/ARDrone_SDK_Version_1_8_20110726/Examples/Android/ardrone/project/jni/navdata.c
new file mode 100644 (file)
index 0000000..a9df379
--- /dev/null
@@ -0,0 +1,163 @@
+#include "navdata.h"
+
+#include "app.h"
+#include <control_states.h>
+#include <ardrone_tool/Navdata/ardrone_navdata_file.h>
+#include <ardrone_tool/Navdata/ardrone_navdata_client.h>
+#include <VP_Os/vp_os_signal.h>
+
+instance_navdata_t inst_nav;
+vp_os_mutex_t inst_nav_mutex;
+
+static inline C_RESULT ardrone_navdata_init( void* data )
+{
+       ardrone_navdata_reset_data(&inst_nav);
+
+       vp_os_mutex_init( &inst_nav_mutex );
+       
+       return C_OK;
+}
+
+static inline C_RESULT ardrone_navdata_process( const navdata_unpacked_t* const navdata )
+{
+       vp_os_mutex_lock( &inst_nav_mutex );
+       inst_nav.flyingState = ((navdata->navdata_demo.ctrl_state >> 16) == CTRL_FLYING) 
+                                               || ((navdata->navdata_demo.ctrl_state >> 16) == CTRL_HOVERING)
+                                               || ((navdata->navdata_demo.ctrl_state >> 16) == CTRL_TRANS_GOTOFIX);
+
+       inst_nav.pitch = navdata->navdata_demo.theta / 1000;
+       inst_nav.yaw = navdata->navdata_demo.psi / 1000;
+       inst_nav.roll = navdata->navdata_demo.phi / 1000;
+       inst_nav.trimPitch = navdata->navdata_trims.euler_angles_trim_theta;
+       inst_nav.trimYaw = navdata->navdata_trims.angular_rates_trim_r;
+       inst_nav.trimRoll = navdata->navdata_trims.euler_angles_trim_phi;                                       
+       inst_nav.altitude = navdata->navdata_demo.altitude;
+       inst_nav.vx = navdata->navdata_demo.vx;
+       inst_nav.vy = navdata->navdata_demo.vy;
+       inst_nav.vz = navdata->navdata_demo.vz;
+       inst_nav.videoNumFrames = navdata->navdata_demo.num_frames;
+       inst_nav.nbDetectedOpponent = navdata->navdata_vision_detect.nb_detected;
+       vp_os_memcpy(inst_nav.xOpponent, navdata->navdata_vision_detect.xc, sizeof(int) * 4);
+       vp_os_memcpy(inst_nav.yOpponent, navdata->navdata_vision_detect.yc, sizeof(int) * 4);
+       vp_os_memcpy(inst_nav.widthOpponent, navdata->navdata_vision_detect.width, sizeof(int) * 4);
+       vp_os_memcpy(inst_nav.heightOpponent, navdata->navdata_vision_detect.height, sizeof(int) * 4);
+       vp_os_memcpy(inst_nav.distOpponent, navdata->navdata_vision_detect.dist, sizeof(int) * 4);
+       vp_os_memcpy(inst_nav.detectCameraRot, &navdata->navdata_demo.detection_camera_rot, sizeof(float) * 9);
+       vp_os_memcpy(inst_nav.detectCameraTrans, &navdata->navdata_demo.detection_camera_trans, sizeof(float) * 3);
+       vp_os_memcpy(inst_nav.droneCameraRot, &navdata->navdata_demo.drone_camera_rot, sizeof(float) * 9);
+       vp_os_memcpy(inst_nav.droneCameraTrans, &navdata->navdata_demo.drone_camera_trans, sizeof(float) * 3);
+
+       if(inst_nav.detectionType != navdata->navdata_demo.detection_camera_type)
+               printf("%s : detection type %d changed to %d\n", __FUNCTION__, inst_nav.detectionType,  navdata->navdata_demo.detection_camera_type);
+       
+       inst_nav.detectionType = navdata->navdata_demo.detection_camera_type;
+       inst_nav.detectTagIndex = navdata->navdata_demo.detection_tag_index;
+       inst_nav.ardrone_state = navdata->ardrone_state;
+       inst_nav.commandState = (navdata->ardrone_state & ARDRONE_COMMAND_MASK);
+       inst_nav.comWatchdog = (navdata->ardrone_state & ARDRONE_COM_WATCHDOG_MASK);
+       inst_nav.emergencyLanding = (navdata->ardrone_state & ARDRONE_EMERGENCY_MASK);
+       inst_nav.startPressed = (navdata->ardrone_state & ARDRONE_USER_FEEDBACK_START);
+       inst_nav.cutoutProblem = (navdata->ardrone_state & ARDRONE_CUTOUT_MASK);
+       inst_nav.motorsProblem = (navdata->ardrone_state & ARDRONE_MOTORS_MASK);
+       inst_nav.cameraProblem = !(navdata->ardrone_state & ARDRONE_VIDEO_THREAD_ON);
+       inst_nav.adcVersionProblem = !(navdata->ardrone_state & ARDRONE_PIC_VERSION_MASK);
+       inst_nav.adcProblem = (navdata->ardrone_state & ARDRONE_ADC_WATCHDOG_MASK);
+       inst_nav.ultrasoundProblem = (navdata->ardrone_state & ARDRONE_ULTRASOUND_MASK);
+       inst_nav.visionProblem = !(navdata->ardrone_state & ARDRONE_VISION_MASK);
+       inst_nav.anglesProblem = (navdata->ardrone_state & ARDRONE_ANGLES_OUT_OF_RANGE);
+       inst_nav.vbatLowProblem = (navdata->ardrone_state & ARDRONE_VBAT_LOW);
+       inst_nav.userEmergency = (navdata->ardrone_state & ARDRONE_USER_EL);
+       inst_nav.timerElapsed = (navdata->ardrone_state & ARDRONE_TIMER_ELAPSED);
+       inst_nav.videoThreadOn = (navdata->ardrone_state & ARDRONE_VIDEO_THREAD_ON);
+       inst_nav.navdataThreadOn = (navdata->ardrone_state & ARDRONE_NAVDATA_THREAD_ON);
+       inst_nav.bootstrap = (navdata->ardrone_state & ARDRONE_NAVDATA_BOOTSTRAP);
+       inst_nav.remainingBattery = navdata->navdata_demo.vbat_flying_percentage;
+    
+       //PRINT( "command navdata demo:%d   ", (navdata->ardrone_state & ARDRONE_NAVDATA_DEMO_MASK) );
+       
+       
+       vp_os_mutex_unlock( &inst_nav_mutex );
+
+       return C_OK;
+}
+
+static inline C_RESULT ardrone_navdata_release( void )
+{
+       return C_OK;
+}
+
+C_RESULT ardrone_navdata_write_to_file(bool_t enable)
+{
+       return C_OK;
+}
+
+C_RESULT ardrone_navdata_reset_data(instance_navdata_t *nav)
+{
+       nav->ardrone_state = 0;
+       nav->flyingState = FALSE;
+       nav->commandState = FALSE;
+       nav->comWatchdog = FALSE;
+       nav->bootstrap = TRUE;
+       nav->emergencyLanding = FALSE;
+       nav->startPressed = FALSE;
+       nav->cutoutProblem = FALSE;
+       nav->motorsProblem = FALSE;
+       nav->cameraProblem = FALSE;
+       nav->adcVersionProblem =FALSE;
+       nav->adcProblem = FALSE;
+       nav->ultrasoundProblem = FALSE;
+       nav->visionProblem = TRUE;
+       nav->anglesProblem = FALSE;
+       nav->vbatLowProblem = FALSE;
+       nav->userEmergency = FALSE;
+       nav->pitch = 0.0f;
+       nav->yaw = 0.0f;
+       nav->roll = 0.0f;
+       nav->trimPitch = 0.0f;
+       nav->trimYaw = 0.0f;
+       nav->trimRoll = 0.0f;
+       nav->altitude = 0.0f;
+       nav->vx = 0.0f;
+       nav->vy = 0.0f;
+       nav->vz = 0.0f;
+       nav->remainingBattery = -1;
+       nav->nbDetectedOpponent = 0;
+       nav->videoNumFrames = 0;
+       vp_os_memset(nav->xOpponent, 0x0, (sizeof(int) * 4));
+       vp_os_memset(nav->yOpponent, 0x0, (sizeof(int) * 4));
+       vp_os_memset(nav->widthOpponent, 0x0, (sizeof(int) * 4));
+       vp_os_memset(nav->heightOpponent, 0x0, (sizeof(int) * 4));
+       vp_os_memset(nav->distOpponent, 0x0, (sizeof(int) * 4));
+       vp_os_memset(nav->detectCameraRot, 0x0, (sizeof(float) * 9));
+       vp_os_memset(nav->detectCameraHomo, 0x0, (sizeof(float) * 9));                  
+       vp_os_memset(nav->detectCameraTrans, 0x0, (sizeof(float) * 3));
+       vp_os_memset(nav->droneCameraRot, 0x0, (sizeof(float) * 9));
+       vp_os_memset(nav->droneCameraTrans, 0x0, (sizeof(float) * 3));
+       
+       nav->detectionType = CAD_TYPE_NUM;
+       nav->detectTagIndex = 0;
+       nav->timerElapsed = FALSE;
+       nav->videoThreadOn = FALSE;
+       nav->navdataThreadOn = FALSE;
+
+       return C_OK;
+}      
+
+C_RESULT ardrone_navdata_get_data(instance_navdata_t *data)
+{
+       C_RESULT result = C_FAIL;
+       
+       if(data)
+       {
+               vp_os_mutex_lock( &inst_nav_mutex );
+               vp_os_memcpy(data, &inst_nav, sizeof(instance_navdata_t));
+               vp_os_mutex_unlock( &inst_nav_mutex );
+               result = C_OK;
+       }
+       
+       return result;
+}
+
+BEGIN_NAVDATA_HANDLER_TABLE
+NAVDATA_HANDLER_TABLE_ENTRY(ardrone_navdata_init, ardrone_navdata_process, ardrone_navdata_release, NULL)
+END_NAVDATA_HANDLER_TABLE