5 * Created by Frederic D'HAEYER on 14/01/10.
6 * Copyright 2010 Parrot SA. All rights reserved.
9 #include "ConstantsAndMacros.h"
10 #include "ControlData.h"
12 //#define DEBUG_CONTROL
14 ControlData ctrldata = { 0 };
15 navdata_unpacked_t ctrlnavdata;
16 extern char iphone_mac_address[];
18 void setApplicationDefaultConfig(void)
20 ardrone_application_default_config.navdata_demo = TRUE;
21 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));
22 ardrone_application_default_config.video_codec = P264_CODEC;
23 ardrone_application_default_config.bitrate_ctrl_mode = ARDRONE_VARIABLE_BITRATE_MODE_DYNAMIC;
24 ctrldata.applicationDefaultConfigState = CONFIG_STATE_IDLE;
27 void config_callback(bool_t result)
30 ctrldata.configurationState = CONFIG_STATE_IDLE;
33 void initControlData(void)
35 ctrldata.framecounter = 0;
37 ctrldata.needSetEmergency = FALSE;
38 ctrldata.needSetTakeOff = FALSE;
39 ctrldata.isInEmergency = FALSE;
40 ctrldata.navdata_connected = FALSE;
42 ctrldata.needAnimation = FALSE;
43 vp_os_memset(ctrldata.needAnimationParam, 0, sizeof(ctrldata.needAnimationParam));
45 ctrldata.needVideoSwitch = -1;
47 ctrldata.needLedAnimation = FALSE;
48 vp_os_memset(ctrldata.needLedAnimationParam, 0, sizeof(ctrldata.needLedAnimationParam));
50 ctrldata.wifiReachabled = FALSE;
52 strcpy(ctrldata.error_msg, "");
53 strcpy(ctrldata.takeoff_msg, "take_off");
54 strcpy(ctrldata.emergency_msg, "emergency");
56 initNavdataControlData();
58 ardrone_tool_start_reset();
60 ctrldata.configurationState = CONFIG_STATE_NEEDED;
62 ardrone_navdata_write_to_file(FALSE);
64 /* Setting default values for ControlEngine */
65 ctrldata.applicationDefaultConfigState = CONFIG_STATE_NEEDED;
68 void initNavdataControlData(void)
71 ardrone_navdata_reset_data(&ctrlnavdata);
74 void resetControlData(void)
76 //printf("reset control data\n");
77 ctrldata.accelero_flag = 0;
82 initNavdataControlData();
85 void configuration_get(void)
87 if(ctrldata.configurationState == CONFIG_STATE_IDLE)
88 ctrldata.configurationState = CONFIG_STATE_NEEDED;
91 void switchTakeOff(void)
94 PRINT("%s\n", __FUNCTION__);
96 ctrldata.needSetTakeOff = TRUE;
102 PRINT("%s\n", __FUNCTION__);
104 ctrldata.needSetEmergency = TRUE;
107 void inputYaw(float percent)
110 PRINT("%s : %f\n", __FUNCTION__, percent);
112 if(-1.0 <= percent && percent <= 1.0)
113 ctrldata.yaw = percent;
114 else if(-1.0 < percent)
120 void inputGaz(float percent)
123 PRINT("%s : %f\n", __FUNCTION__, percent);
125 if(-1.0 <= percent && percent <= 1.0)
126 ctrldata.gaz = percent;
127 else if(-1.0 < percent)
133 void inputPitch(float percent)
136 PRINT("%s : %f, accelero_enable : %d\n", __FUNCTION__, percent, (ctrldata.accelero_flag >> ARDRONE_PROGRESSIVE_CMD_ENABLE) & 0x1 );
138 if(-1.0 <= percent && percent <= 1.0)
139 ctrldata.accelero_theta = -percent;
140 else if(-1.0 < percent)
141 ctrldata.accelero_theta = 1.0;
143 ctrldata.accelero_theta = -1.0;
146 void inputRoll(float percent)
149 PRINT("%s : %f, accelero_enable : %d\n", __FUNCTION__, percent, (ctrldata.accelero_flag >> ARDRONE_PROGRESSIVE_CMD_ENABLE) & 0x1);
151 if(-1.0 <= percent && percent <= 1.0)
152 ctrldata.accelero_phi = percent;
153 else if(-1.0 < percent)
154 ctrldata.accelero_phi = -1.0;
156 ctrldata.accelero_phi = 1.0;
159 void sendControls(void)
161 ardrone_at_set_progress_cmd(ctrldata.accelero_flag, ctrldata.accelero_phi, ctrldata.accelero_theta, ctrldata.gaz, ctrldata.yaw);
164 void checkErrors(void)
166 input_state_t* input_state = ardrone_tool_get_input_state();
168 strcpy(ctrldata.error_msg, "");
170 if(!ctrldata.wifiReachabled)
172 strcpy(ctrldata.error_msg, "WIFI NOT REACHABLE");
177 if(ctrldata.applicationDefaultConfigState == CONFIG_STATE_NEEDED)
179 ctrldata.applicationDefaultConfigState = CONFIG_STATE_IN_PROGRESS;
180 setApplicationDefaultConfig();
183 if(ctrldata.configurationState == CONFIG_STATE_NEEDED)
185 ctrldata.configurationState = CONFIG_STATE_IN_PROGRESS;
186 ARDRONE_TOOL_CONFIGURATION_GET(config_callback);
189 if(ctrldata.needSetTakeOff)
191 if(ctrlnavdata.ardrone_state & ARDRONE_EMERGENCY_MASK)
193 ctrldata.needSetEmergency = TRUE;
197 printf("Take off ...\n");
198 if(!(ctrlnavdata.ardrone_state & ARDRONE_USER_FEEDBACK_START))
199 ardrone_tool_set_ui_pad_start(1);
201 ardrone_tool_set_ui_pad_start(0);
202 ctrldata.needSetTakeOff = FALSE;
206 if(ctrldata.needSetEmergency)
208 ctrldata.isInEmergency = (ctrlnavdata.ardrone_state & ARDRONE_EMERGENCY_MASK);
209 ardrone_tool_set_ui_pad_select(1);
210 ctrldata.needSetEmergency = FALSE;
213 if(ctrlnavdata.ardrone_state & ARDRONE_NAVDATA_BOOTSTRAP)
218 if(ardrone_navdata_client_get_num_retries() >= NAVDATA_MAX_RETRIES)
220 strcpy(ctrldata.error_msg, "CONTROL LINK NOT AVAILABLE");
221 ctrldata.navdata_connected = FALSE;
226 ctrldata.navdata_connected = TRUE;
227 if(ctrlnavdata.ardrone_state & ARDRONE_EMERGENCY_MASK)
229 if(!ctrldata.isInEmergency && input_state->select)
230 ardrone_tool_set_ui_pad_select(0);
232 if(ctrlnavdata.ardrone_state & ARDRONE_CUTOUT_MASK)
234 strcpy(ctrldata.error_msg, "CUT OUT EMERGENCY");
236 else if(ctrlnavdata.ardrone_state & ARDRONE_MOTORS_MASK)
238 strcpy(ctrldata.error_msg, "MOTORS EMERGENCY");
240 else if(!(ctrlnavdata.ardrone_state & ARDRONE_VIDEO_THREAD_ON))
242 strcpy(ctrldata.error_msg, "CAMERA EMERGENCY");
244 else if(ctrlnavdata.ardrone_state & ARDRONE_ADC_WATCHDOG_MASK)
246 strcpy(ctrldata.error_msg, "PIC WATCHDOG EMERGENCY");
248 else if(!(ctrlnavdata.ardrone_state & ARDRONE_PIC_VERSION_MASK))
250 strcpy(ctrldata.error_msg, "PIC VERSION EMERGENCY");
252 else if(ctrlnavdata.ardrone_state & ARDRONE_ANGLES_OUT_OF_RANGE)
254 strcpy(ctrldata.error_msg, "TOO MUCH ANGLE EMERGENCY");
256 else if(ctrlnavdata.ardrone_state & ARDRONE_VBAT_LOW)
258 strcpy(ctrldata.error_msg, "BATTERY LOW EMERGENCY");
260 else if(ctrlnavdata.ardrone_state & ARDRONE_USER_EL)
262 strcpy(ctrldata.error_msg, "USER EMERGENCY");
264 else if(ctrlnavdata.ardrone_state & ARDRONE_ULTRASOUND_MASK)
266 strcpy(ctrldata.error_msg, "ULTRASOUND EMERGENCY");
270 strcpy(ctrldata.error_msg, "UNKNOWN EMERGENCY");
273 strcpy(ctrldata.emergency_msg, "");
274 strcpy(ctrldata.takeoff_msg, "take_off");
277 ardrone_tool_start_reset();
279 else // Not emergency landing
281 if(ctrldata.isInEmergency && input_state->select)
283 ardrone_tool_set_ui_pad_select(0);
286 if(video_stage_get_num_retries() > VIDEO_MAX_RETRIES)
288 strcpy(ctrldata.error_msg, "VIDEO CONNECTION ALERT");
290 else if(ctrlnavdata.ardrone_state & ARDRONE_VBAT_LOW)
292 strcpy(ctrldata.error_msg, "BATTERY LOW ALERT");
294 else if(ctrlnavdata.ardrone_state & ARDRONE_ULTRASOUND_MASK)
296 strcpy(ctrldata.error_msg, "ULTRASOUND ALERT");
298 else if(!(ctrlnavdata.ardrone_state & ARDRONE_VISION_MASK))
300 ARDRONE_FLYING_STATE tmp_state = ardrone_navdata_get_flying_state(ctrlnavdata);
301 if(tmp_state == ARDRONE_FLYING_STATE_FLYING)
303 strcpy(ctrldata.error_msg, "VISION ALERT");
307 if(!(ctrlnavdata.ardrone_state & ARDRONE_TIMER_ELAPSED))
308 strcpy(ctrldata.emergency_msg, "emergency");
310 if(input_state->start)
312 if(ctrlnavdata.ardrone_state & ARDRONE_USER_FEEDBACK_START)
314 strcpy(ctrldata.takeoff_msg, "take_land");
318 strcpy(ctrldata.takeoff_msg, "take_off");
319 strcpy(ctrldata.error_msg, "START NOT RECEIVED");
325 strcpy(ctrldata.takeoff_msg, "take_off");