ArDrone SDK 1.8 added
[mardrone] / mardrone / ARDrone_SDK_Version_1_8_20110726 / ControlEngine / iPhone / Classes / ControlData.c
diff --git a/mardrone/ARDrone_SDK_Version_1_8_20110726/ControlEngine/iPhone/Classes/ControlData.c b/mardrone/ARDrone_SDK_Version_1_8_20110726/ControlEngine/iPhone/Classes/ControlData.c
new file mode 100644 (file)
index 0000000..0ca7d3e
--- /dev/null
@@ -0,0 +1,331 @@
+/*
+ *  ControlData.m
+ *  ARDroneEngine
+ *
+ *  Created by Frederic D'HAEYER on 14/01/10.
+ *  Copyright 2010 Parrot SA. All rights reserved.
+ *
+ */
+#include "ConstantsAndMacros.h"
+#include "ControlData.h"
+
+//#define DEBUG_CONTROL
+
+ControlData ctrldata = { 0 };
+navdata_unpacked_t ctrlnavdata;
+extern char iphone_mac_address[];
+
+void setApplicationDefaultConfig(void)
+{
+       ardrone_application_default_config.navdata_demo = TRUE;
+       ardrone_application_default_config.navdata_options = (NAVDATA_OPTION_MASK(NAVDATA_DEMO_TAG) | NAVDATA_OPTION_MASK(NAVDATA_VISION_DETECT_TAG) | NAVDATA_OPTION_MASK(NAVDATA_GAMES_TAG));
+       ardrone_application_default_config.video_codec = P264_CODEC;
+       ardrone_application_default_config.bitrate_ctrl_mode = ARDRONE_VARIABLE_BITRATE_MODE_DYNAMIC;
+       ctrldata.applicationDefaultConfigState = CONFIG_STATE_IDLE;
+}
+
+void config_callback(bool_t result)
+{
+       if(result)
+               ctrldata.configurationState = CONFIG_STATE_IDLE;
+}
+
+void initControlData(void)
+{
+       ctrldata.framecounter = 0;
+       
+       ctrldata.needSetEmergency = FALSE;
+       ctrldata.needSetTakeOff = FALSE;
+       ctrldata.isInEmergency = FALSE;
+       ctrldata.navdata_connected = FALSE;
+       
+       ctrldata.needAnimation = FALSE;
+       vp_os_memset(ctrldata.needAnimationParam, 0, sizeof(ctrldata.needAnimationParam));
+       
+       ctrldata.needVideoSwitch = -1;
+       
+       ctrldata.needLedAnimation = FALSE;
+       vp_os_memset(ctrldata.needLedAnimationParam, 0, sizeof(ctrldata.needLedAnimationParam));
+       
+       ctrldata.wifiReachabled = FALSE;
+       
+       strcpy(ctrldata.error_msg, "");
+       strcpy(ctrldata.takeoff_msg, "take_off");
+       strcpy(ctrldata.emergency_msg, "emergency");
+       
+       initNavdataControlData();
+       resetControlData();
+       ardrone_tool_start_reset();
+       
+       ctrldata.configurationState = CONFIG_STATE_NEEDED;
+       
+       ardrone_navdata_write_to_file(FALSE);
+       
+       /* Setting default values for ControlEngine */
+       ctrldata.applicationDefaultConfigState = CONFIG_STATE_NEEDED;
+}
+
+void initNavdataControlData(void)
+{
+       //drone data
+       ardrone_navdata_reset_data(&ctrlnavdata);
+}
+
+void resetControlData(void)
+{
+       //printf("reset control data\n");
+       ctrldata.accelero_flag = 0;
+       inputPitch(0.0);
+       inputRoll(0.0);
+       inputYaw(0.0);
+       inputGaz(0.0);
+       initNavdataControlData();
+}
+
+void configuration_get(void)
+{
+       if(ctrldata.configurationState == CONFIG_STATE_IDLE)
+               ctrldata.configurationState = CONFIG_STATE_NEEDED;
+}
+
+void switchTakeOff(void)
+{
+#ifdef DEBUG_CONTROL
+       PRINT("%s\n", __FUNCTION__);
+#endif         
+       ctrldata.needSetTakeOff = TRUE;
+}
+
+void emergency(void)
+{
+#ifdef DEBUG_CONTROL
+       PRINT("%s\n", __FUNCTION__);
+#endif
+       ctrldata.needSetEmergency = TRUE;
+}
+
+void inputYaw(float percent)
+{
+#ifdef DEBUG_CONTROL
+       PRINT("%s : %f\n", __FUNCTION__, percent);
+#endif
+       if(-1.0 <= percent && percent <= 1.0)
+               ctrldata.yaw = percent;
+       else if(-1.0 < percent)
+               ctrldata.yaw = -1.0;
+       else
+               ctrldata.yaw = 1.0;
+}
+
+void inputGaz(float percent)
+{
+#ifdef DEBUG_CONTROL
+       PRINT("%s : %f\n", __FUNCTION__, percent);
+#endif
+       if(-1.0 <= percent && percent <= 1.0)
+               ctrldata.gaz = percent;
+       else if(-1.0 < percent)
+               ctrldata.gaz = -1.0;
+       else
+               ctrldata.gaz = 1.0;
+}
+
+void inputPitch(float percent)
+{
+#ifdef DEBUG_CONTROL
+       PRINT("%s : %f, accelero_enable : %d\n", __FUNCTION__, percent, (ctrldata.accelero_flag >> ARDRONE_PROGRESSIVE_CMD_ENABLE) & 0x1 );
+#endif
+       if(-1.0 <= percent && percent <= 1.0)
+               ctrldata.accelero_theta = -percent;
+       else if(-1.0 < percent)
+               ctrldata.accelero_theta = 1.0;
+       else
+               ctrldata.accelero_theta = -1.0;
+}
+
+void inputRoll(float percent)
+{
+#ifdef DEBUG_CONTROL
+       PRINT("%s : %f, accelero_enable : %d\n", __FUNCTION__, percent, (ctrldata.accelero_flag >> ARDRONE_PROGRESSIVE_CMD_ENABLE) & 0x1);
+#endif
+       if(-1.0 <= percent && percent <= 1.0)
+               ctrldata.accelero_phi = percent;
+       else if(-1.0 < percent)
+               ctrldata.accelero_phi = -1.0;
+       else
+               ctrldata.accelero_phi = 1.0;
+}
+
+void sendControls(void)
+{
+       ardrone_at_set_progress_cmd(ctrldata.accelero_flag, ctrldata.accelero_phi, ctrldata.accelero_theta, ctrldata.gaz, ctrldata.yaw);
+}
+
+void checkErrors(void)
+{
+       input_state_t* input_state = ardrone_tool_get_input_state();
+       
+       strcpy(ctrldata.error_msg, "");
+       
+       if(!ctrldata.wifiReachabled)
+       {
+               strcpy(ctrldata.error_msg, "WIFI NOT REACHABLE");
+               resetControlData();
+       }
+       else
+       {
+               if(ctrldata.applicationDefaultConfigState == CONFIG_STATE_NEEDED)
+               {
+                       ctrldata.applicationDefaultConfigState = CONFIG_STATE_IN_PROGRESS;
+                       setApplicationDefaultConfig();
+               }
+               
+               if(ctrldata.configurationState == CONFIG_STATE_NEEDED)
+               {
+                       ctrldata.configurationState = CONFIG_STATE_IN_PROGRESS;
+                       ARDRONE_TOOL_CONFIGURATION_GET(config_callback);
+               }                       
+               
+               if(ctrldata.needSetTakeOff)
+               {
+                       if(ctrlnavdata.ardrone_state & ARDRONE_EMERGENCY_MASK)
+                       {
+                               ctrldata.needSetEmergency = TRUE;
+                       }
+                       else
+                       {
+                               printf("Take off ...\n");
+                               if(!(ctrlnavdata.ardrone_state & ARDRONE_USER_FEEDBACK_START))
+                                       ardrone_tool_set_ui_pad_start(1);
+                               else
+                                       ardrone_tool_set_ui_pad_start(0);
+                               ctrldata.needSetTakeOff = FALSE;
+                       }
+               }
+               
+               if(ctrldata.needSetEmergency)
+               {
+                       ctrldata.isInEmergency = (ctrlnavdata.ardrone_state & ARDRONE_EMERGENCY_MASK);
+                       ardrone_tool_set_ui_pad_select(1);
+                       ctrldata.needSetEmergency = FALSE;
+               }
+               
+               if(ctrlnavdata.ardrone_state & ARDRONE_NAVDATA_BOOTSTRAP)
+               {
+                       configuration_get();
+               }
+               
+               if(ardrone_navdata_client_get_num_retries() >= NAVDATA_MAX_RETRIES)
+               {
+                       strcpy(ctrldata.error_msg, "CONTROL LINK NOT AVAILABLE");
+                       ctrldata.navdata_connected = FALSE;
+                       resetControlData();
+               }
+               else
+               {
+                       ctrldata.navdata_connected = TRUE;
+                       if(ctrlnavdata.ardrone_state & ARDRONE_EMERGENCY_MASK)
+                       {
+                               if(!ctrldata.isInEmergency && input_state->select)
+                                       ardrone_tool_set_ui_pad_select(0);
+                               
+                               if(ctrlnavdata.ardrone_state & ARDRONE_CUTOUT_MASK)
+                               {
+                                       strcpy(ctrldata.error_msg, "CUT OUT EMERGENCY");
+                               }
+                               else if(ctrlnavdata.ardrone_state & ARDRONE_MOTORS_MASK)
+                               {
+                                       strcpy(ctrldata.error_msg, "MOTORS EMERGENCY");
+                               }
+                               else if(!(ctrlnavdata.ardrone_state & ARDRONE_VIDEO_THREAD_ON))
+                               {
+                                       strcpy(ctrldata.error_msg, "CAMERA EMERGENCY");
+                               }
+                               else if(ctrlnavdata.ardrone_state & ARDRONE_ADC_WATCHDOG_MASK)
+                               {
+                                       strcpy(ctrldata.error_msg, "PIC WATCHDOG EMERGENCY");
+                               }
+                               else if(!(ctrlnavdata.ardrone_state & ARDRONE_PIC_VERSION_MASK))
+                               {
+                                       strcpy(ctrldata.error_msg, "PIC VERSION EMERGENCY");
+                               }
+                               else if(ctrlnavdata.ardrone_state & ARDRONE_ANGLES_OUT_OF_RANGE)
+                               {
+                                       strcpy(ctrldata.error_msg, "TOO MUCH ANGLE EMERGENCY");
+                               }
+                               else if(ctrlnavdata.ardrone_state & ARDRONE_VBAT_LOW)
+                               {
+                                       strcpy(ctrldata.error_msg, "BATTERY LOW EMERGENCY");
+                               }
+                               else if(ctrlnavdata.ardrone_state & ARDRONE_USER_EL)
+                               {
+                                       strcpy(ctrldata.error_msg, "USER EMERGENCY");
+                               }
+                               else if(ctrlnavdata.ardrone_state & ARDRONE_ULTRASOUND_MASK)
+                               {
+                                       strcpy(ctrldata.error_msg, "ULTRASOUND EMERGENCY");
+                               }
+                               else
+                               {
+                                       strcpy(ctrldata.error_msg, "UNKNOWN EMERGENCY");
+                               }
+                                                       
+                               strcpy(ctrldata.emergency_msg, "");
+                               strcpy(ctrldata.takeoff_msg, "take_off");
+                               
+                               resetControlData();
+                               ardrone_tool_start_reset();
+                       }
+                       else // Not emergency landing
+                       {       
+                               if(ctrldata.isInEmergency && input_state->select)
+                               {
+                                       ardrone_tool_set_ui_pad_select(0);
+                               }
+                               
+                               if(video_stage_get_num_retries() > VIDEO_MAX_RETRIES)
+                               {
+                                       strcpy(ctrldata.error_msg, "VIDEO CONNECTION ALERT");
+                               }
+                               else if(ctrlnavdata.ardrone_state & ARDRONE_VBAT_LOW)
+                               {
+                                       strcpy(ctrldata.error_msg, "BATTERY LOW ALERT");
+                               }
+                               else if(ctrlnavdata.ardrone_state & ARDRONE_ULTRASOUND_MASK)
+                               {
+                                       strcpy(ctrldata.error_msg, "ULTRASOUND ALERT");
+                               }
+                               else if(!(ctrlnavdata.ardrone_state & ARDRONE_VISION_MASK))
+                               {
+                                       ARDRONE_FLYING_STATE tmp_state = ardrone_navdata_get_flying_state(ctrlnavdata); 
+                                       if(tmp_state == ARDRONE_FLYING_STATE_FLYING)
+                                       {
+                                               strcpy(ctrldata.error_msg, "VISION ALERT");
+                                       }
+                               }
+
+                               if(!(ctrlnavdata.ardrone_state & ARDRONE_TIMER_ELAPSED))
+                                       strcpy(ctrldata.emergency_msg, "emergency");
+                               
+                               if(input_state->start)
+                               {
+                                       if(ctrlnavdata.ardrone_state & ARDRONE_USER_FEEDBACK_START)
+                                       {
+                                               strcpy(ctrldata.takeoff_msg, "take_land");
+                                       }
+                                       else
+                                       {       
+                                               strcpy(ctrldata.takeoff_msg, "take_off");
+                                               strcpy(ctrldata.error_msg, "START NOT RECEIVED");
+                                               
+                                       }
+                               }
+                               else
+                               {
+                                       strcpy(ctrldata.takeoff_msg, "take_off");
+                               }                       
+                       }
+               }
+       }
+}
+