ArDrone SDK 1.8 added
[mardrone] / mardrone / ARDrone_SDK_Version_1_8_20110726 / ARDroneLib / Soft / Lib / ardrone_tool / UI / ardrone_tool_ui.c
1 //
2 // Inputs specification
3 // rien d'appuyer : 11540000
4 // start: 11540200
5 // select: 11540000
6 // 1 : 11540001
7 // 2 : 11540002
8 // 3 : 11540004
9 // 4 : 11540008
10 // 5 : 11540010
11 // 6 : 11540020
12 // 7 : 11540040
13 // 8 : 11540080
14 // x+: 12540000
15 // x-: 10540000
16 // y+: 01540000
17 // y-: 21540000
18 //
19 // trims
20 // r2 + x+ = 11640080
21 // r2 + x- = 11440080
22 // r2 + y+ = 11500080
23 // r2 + y- = 11580080
24 // r2 + 5  = 11140090
25 // r2 + 6  = 119400A0
26 //
27
28 #include <config.h>
29 #include <ardrone_api.h>
30
31 #include <ardrone_tool/UI/ardrone_input.h>
32 #include <ardrone_tool/UI/ardrone_tool_ui.h>
33
34 static uint32_t user_input = 0;
35
36 C_RESULT ui_pad_ab(int32_t value)
37 {
38         if( value )
39                 user_input |= (1 << ARDRONE_UI_BIT_AB);
40         else
41                 user_input &= ~(1 << ARDRONE_UI_BIT_AB);
42
43         return C_OK;
44 }
45
46 C_RESULT ui_pad_ag(int32_t value)
47 {
48         if( value )
49                 user_input |= (1 << ARDRONE_UI_BIT_AG);
50         else
51                 user_input &= ~(1 << ARDRONE_UI_BIT_AG);
52
53         return C_OK;
54 }
55
56 C_RESULT ui_pad_ad(int32_t value)
57 {
58         if( value )
59                 user_input |= (1 << ARDRONE_UI_BIT_AD);
60         else
61                 user_input &= ~(1 << ARDRONE_UI_BIT_AD);
62
63         return C_OK;
64 }
65
66 C_RESULT ui_pad_ah(int32_t value)
67 {
68         if( value )
69                 user_input |= (1 << ARDRONE_UI_BIT_AH);
70         else
71                 user_input &= ~(1 << ARDRONE_UI_BIT_AH);
72
73         return C_OK;
74 }
75
76 C_RESULT ui_pad_l1(int32_t value)
77 {
78         if( value )
79                 user_input |= (1 << ARDRONE_UI_BIT_L1);
80         else
81                 user_input &= ~(1 << ARDRONE_UI_BIT_L1);
82
83         return C_OK;
84 }
85
86 C_RESULT ui_pad_r1(int32_t value)
87 {
88         if( value )
89                 user_input |= (1 << ARDRONE_UI_BIT_R1);
90         else
91                 user_input &= ~(1 << ARDRONE_UI_BIT_R1);
92
93         return C_OK;
94 }
95
96 C_RESULT ui_pad_l2(int32_t value)
97 {
98         if( value )
99                 user_input |= (1 << ARDRONE_UI_BIT_L2);
100         else
101                 user_input &= ~(1 << ARDRONE_UI_BIT_L2);
102
103         return C_OK;
104 }
105
106 C_RESULT ui_pad_r2(int32_t value)
107 {
108         if( value )
109                 user_input |= (1 << ARDRONE_UI_BIT_R2);
110         else
111                 user_input &= ~(1 << ARDRONE_UI_BIT_R2);
112
113         return C_OK;
114 }
115
116 C_RESULT ui_pad_start_stop(int32_t value)
117 {
118         if( value )
119                 user_input |= (1 << ARDRONE_UI_BIT_START);
120         else
121                 user_input &= ~(1 << ARDRONE_UI_BIT_START);
122
123         return C_OK;
124 }
125
126 C_RESULT ui_pad_select(int32_t value)
127 {
128         if( value )
129                 user_input |= (1 << ARDRONE_UI_BIT_SELECT);
130         else
131                 user_input &= ~(1 << ARDRONE_UI_BIT_SELECT);
132         
133         return C_OK;
134 }
135
136 C_RESULT ui_pad_xy_change(int32_t x, int32_t y)
137 {
138   user_input &= ~(3 << ARDRONE_UI_BIT_X);
139   user_input &= ~(3 << ARDRONE_UI_BIT_Y);
140
141   user_input |= (x + 1) << ARDRONE_UI_BIT_X;
142   user_input |= (y + 1) << ARDRONE_UI_BIT_Y;
143
144   return C_OK;
145 }
146
147 C_RESULT ui_pad_reset_user_input(input_state_t* input_state)
148 {
149   user_input = 0;
150   
151   input_state->ag       = 0;
152   input_state->ab       = 0;
153   input_state->ad       = 0;
154   input_state->ah       = 0;
155   input_state->l1       = 0;
156   input_state->r1       = 0;
157   input_state->l2       = 0;
158   //input_state->r2       = 0; (To avoid angle trim done when CTRL_TRANS_LANDING =>CTRL_LANDING)
159   input_state->select   = 0;
160   input_state->start    = 0;
161
162   input_state->x        = 0;
163   input_state->y        = 0;
164   
165   ui_pad_ag(1);
166   ui_pad_ag(0);
167   ui_pad_ab(1);
168   ui_pad_ab(0);
169   ui_pad_ad(1);
170   ui_pad_ad(0);
171   ui_pad_ah(1);
172   ui_pad_ah(0);
173   ui_pad_l1(1);
174   ui_pad_l1(0);
175   ui_pad_r1(1);
176   ui_pad_r1(0);
177   ui_pad_l2(1);
178   ui_pad_l2(0);
179   //ui_pad_r2_pressed(input_state);
180   //ui_pad_r2_released(input_state);
181   ui_pad_xy_change(0, 0);
182   ui_pad_yaw_trim(0);
183   ui_pad_phi_trim(0);
184   ui_pad_theta_trim(0);
185
186   return custom_reset_user_input(input_state, user_input);
187 }
188
189 C_RESULT ui_pad_reset_user_input_start(input_state_t* input_state)
190 {
191   ui_pad_start_stop(0);
192
193   return custom_reset_user_input(input_state, user_input);
194 }
195
196 C_RESULT ui_pad_update_user_input(input_state_t* input_state)
197 {
198   ardrone_at_set_ui_value( user_input );
199
200   return custom_update_user_input(input_state, user_input );
201 }
202
203 C_RESULT ui_pad_phi_trim( int32_t phi_trim )
204 {
205         user_input &= ~(3 << ARDRONE_UI_BIT_TRIM_PHI);
206         user_input |= (phi_trim + 1) << ARDRONE_UI_BIT_TRIM_PHI;
207
208         return C_OK;
209 }
210
211 C_RESULT ui_pad_theta_trim( int32_t theta_trim )
212 {
213         user_input &= ~(3 << ARDRONE_UI_BIT_TRIM_THETA);
214         user_input |= (theta_trim + 1) << ARDRONE_UI_BIT_TRIM_THETA;
215
216         return C_OK;
217 }
218
219 C_RESULT ui_pad_yaw_trim( int32_t yaw_trim )
220 {
221         user_input &= ~(3 << ARDRONE_UI_BIT_TRIM_YAW);
222         user_input |= (yaw_trim + 1) << ARDRONE_UI_BIT_TRIM_YAW;
223
224         return C_OK;
225 }
226
227 uint32_t ui_get_user_input(void)
228 {
229   return user_input;
230 }