Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
107 | mikeljo | 1 | |
2 | #include <avr/io.h> |
||
3 | #include <inttypes.h> |
||
4 | #include <stdlib.h> |
||
5 | #include <avr/pgmspace.h> |
||
6 | |||
7 | #include "main.h" |
||
8 | #include "lcd.h" |
||
9 | #include "rs232.h" |
||
10 | #include "base64.h" |
||
11 | #include "parameter.h" |
||
12 | #include "menu.h" |
||
13 | |||
14 | uint8_t array[8]; |
||
15 | |||
16 | prog_uchar p_menus[12][11]= |
||
17 | { |
||
18 | "Config ", |
||
19 | "Channels ", |
||
20 | "Stick ", |
||
21 | "Hoehe ", |
||
22 | "Gyro ", |
||
23 | "Looping ", |
||
24 | "Camera ", |
||
25 | "Sonstiges ", |
||
26 | "User ", |
||
27 | "Coupling ", |
||
28 | "Config(2) ", |
||
29 | "Loopingset" |
||
30 | }; |
||
31 | |||
32 | |||
33 | // Diese Tabelle ordnet die eingelesenen Parameter den Menü-Seiten zu |
||
34 | |||
35 | prog_uchar p_menu_number[67]= |
||
36 | { |
||
37 | 2,2,2,2,2,2,2,2, // Die ersten 8 Parameter werden auf Menüseite 2 angezeigt (=Kanalzuordnungen) |
||
38 | 0,4,4,4,4,4,4,3, |
||
39 | 3,3,8,8,8,8,5,5, |
||
40 | 8,8,8,0,5,9,9,9, |
||
41 | 9,7,7,7,7,7,7,6, |
||
42 | 6,6,10,10,6,6,5,5, |
||
43 | 5,9,9,9,9,0,7,11, |
||
44 | 11,11,11,12,12, 12, |
||
45 | 12,12,12,12,12 |
||
46 | |||
47 | }; |
||
48 | |||
49 | prog_uchar p_limits[199]= // Limits für die Parameter |
||
50 | { |
||
51 | 1,8,2, // 2:Nick (3) |
||
52 | 1,8,2, // 2:Roll (4) |
||
53 | 1,8,2, // 2:Gas (2) |
||
54 | 1,8,2, // 2:Gier (1) |
||
55 | 1,8,2, // 2:Poti1 (6) |
||
56 | 1,8,2, // 2:Poti2 (6) |
||
57 | 1,8,2, // 2:Poti3 (7) |
||
58 | 1,8,2, // 2:Poti4 (5) |
||
59 | 0,0,0, // 1:Config |
||
60 | 0,255,4, // 4:Höhe MinGas (30) |
||
61 | 0,255,4, // 4:Luftdruck_D (30) |
||
62 | 0,255,4, // 4:MaxHöhe (Setpoint?) (Poti4) |
||
63 | 0,255,4, // 4:Höhe_P (10) |
||
64 | 0,50,4, // 4:Höhe Verstärkung (3) |
||
65 | 0,255,4, // 4:Höhe Z-acc (30) |
||
66 | 0,6,3, // 3:Nick/Roll P (3) |
||
67 | 0,64,3, // 3:Nick/Roll D (4) |
||
68 | 0,20,3, // 3:Gier_P (6) |
||
69 | 0,32,8, // 8:Min.Gas (15) |
||
70 | 33,250,8, // 8:Max.Gas (250) |
||
71 | 0,50,8, // 5:Gyro-Acc Faktor (30) |
||
72 | 0,255,8, // 8:Kompass-Wirkung (128) |
||
73 | 0,0,5, // 5:Gyro-P (80) |
||
74 | 0,0,5, // 5:Gyro-I (120) |
||
75 | 0,250,8, // 8:Unterspannung (94) |
||
76 | 0,250,8, // 8:Not-Gas Zeit (20) |
||
77 | 0,250,8, // 8:Not-Gas (35) |
||
78 | 0,1,0, // Ufo-Ausrichtung (X +) |
||
79 | 0,255,5, // I-Faktor (32) |
||
80 | 0,255,9, // 9:User1 (80) |
||
81 | 0,255,9, // 9:User2 (0) |
||
82 | 0,255,9, // 9:User3 |
||
83 | 0,255,9, // 9:User4 |
||
84 | 0,255,7, // 7:Servo Nick Control (100) |
||
85 | 0,250,7, // 7:Servo Nick Compensation (40) |
||
86 | 0,250,7, // 7:Servo Nick min (50) |
||
87 | 0,250,7, // 7:Servo Nick max (150) |
||
88 | 0,25,7, // 7:Servo Nick refrsh (5) |
||
89 | 0,255,6, // 6:Loop Gas Limit (50) |
||
90 | 0,250,6, // 6:Loop Ansprechschwelle (90) |
||
91 | 0,250,6, // 6:Loop Hysterese (50) |
||
92 | 0,255,10, // 10:Achskopplung (90) |
||
93 | 0,255,10, // 10:Achsgegenkopplung (5) |
||
94 | 0,250,6, // 6:Turnover Nick (100) |
||
95 | 0,250,6, // 6:Turnover Roll (100) |
||
96 | 0,250,5, // 5: Gyro-Abgleich (Comp.) (32) |
||
97 | 0,250,5, // 5: Drift (4) |
||
98 | 0,255,5, // 5: Dynamic stability (75) |
||
99 | 0,255,9, // 9:User5 |
||
100 | 0,255,9, // 9:User6 |
||
101 | 0,255,9, // 9:User7 |
||
102 | 0,255,9, // 9:User8 (0) |
||
103 | |||
104 | 0,0,1, // 6:Loop Config (0) |
||
105 | 0,1,7 // 7:Servo Nick Compensation Invert (0) |
||
106 | |||
107 | }; |
||
108 | |||
109 | prog_char bin_parameter[12][16] = // Die binär kodierten Parametern werden getrennt behandelt. |
||
110 | { |
||
111 | "Loop up ", |
||
112 | "Loop down ", |
||
113 | "Loop left ", |
||
114 | "Loop right ", |
||
115 | "Höhenregler ", // 8 |
||
116 | "Höhenschalter ", |
||
117 | "Headhold ", |
||
118 | "Kompass ", |
||
119 | "KompassFix ", |
||
120 | "GPS ", |
||
121 | "Achsenkopplung ", |
||
122 | "Drehrate " |
||
123 | }; |
||
124 | |||
125 | prog_char parameter[54][16]= |
||
126 | { |
||
127 | "Nick ", // 0 (3) |
||
128 | "Roll ", // 1 (4) |
||
129 | "Gas ", // (2) |
||
130 | "Gier ", // (1) |
||
131 | "Poti1 ", // (6) |
||
132 | "Poti2 ", // (6) |
||
133 | "Poti3 ", // (7) |
||
134 | "Poti4 ", // 7 (5) |
||
135 | "Config ", // 8 |
||
136 | "Hoehe_MinGas ", // 9 (30) |
||
137 | "Luftdruck_D ", // 10 Wert : 0-250 (30) |
||
138 | "MaxHoehe ", // 11 Wert : 0-250 251 -> Poti1 (Poti4) |
||
139 | "Hoehe_P ", // 12 Wert : 0-32 (10) |
||
140 | "Hoehe_Verstaerk", // 13 Wert : 0-50 |
||
141 | "Hoehe_ACC_Wirk.", // 14 Wert : 0-250 (30) |
||
142 | "Stick_P ", // 15 Wert : 1-6 |
||
143 | "Stick_D ", // 16 Wert : 0-64 |
||
144 | "Gier_P ", // 17 Wert : 1-20 POTI(?) |
||
145 | "Gas_Min ", // 17 Wert : 0-32 |
||
146 | "Gas_Max ", // 18 Wert : 33-250 |
||
147 | "GyroAccFaktor ", // 19 Wert : 1-64 |
||
148 | "KompassWirkung ", // 20 Wert : 0-250 |
||
149 | "Gyro_P ", // 21 Wert : 0-250 |
||
150 | "Gyro_I ", // 22 Wert : 0-250 |
||
151 | "Unterspannung ", // 23 Wert : 0-250 |
||
152 | "NotGas ", // 24 Wert : 0-250 // Gaswert bei Empangsverlust |
||
153 | "NotGasZeit ", // 25 Wert : 0-250 // Zeit bis auf NotGas geschaltet wird, wg. Rx-Problemen |
||
154 | "UfoAusrichtung ", // 26 X oder + Formation |
||
155 | "I_Faktor ", // 27 = 32; |
||
156 | "UserParam1 ", // 28 = 32 * 4; //zur freien Verwendung |
||
157 | "UserParam2 ", // 29 zur freien Verwendung |
||
158 | "UserParam3 ", // 30 zur freien Verwendung |
||
159 | "UserParam4 ", // 31 zur freien Verwendung |
||
160 | "ServoNickCtrl ", // 32 Wert : 0-250 // Stellung des Servos |
||
161 | "ServoNickComp ", // 33 Wert : 0-250 // Einfluss Gyro/Servo |
||
162 | "ServoNickMin ", // 34 Wert : 0-250 // Anschlag |
||
163 | "ServoNickMax ", // 35 Wert : 0-250 // Anschlag |
||
164 | "ServoNickRefrsh", // 36 |
||
165 | "LoopGasLimit ", // 37 |
||
166 | "LoopThreshold ", // 38 Wert: 0-250 Schwelle für Stickausschlag |
||
167 | "LoopHysterese ", // 39 |
||
168 | "AchsKopplung ", // 40 |
||
169 | "AchsGegenKoppl.", // 41 |
||
170 | "WinklUmschlNick", // 42 |
||
171 | "WinklUmschlRoll", // 43 |
||
172 | "GyroAccAbgleich", // 44 1/k |
||
173 | "Driftkomp ", // 45 |
||
174 | "DynamicStabilit", // 47 |
||
175 | "UserParam5 ", // 48 zur freien Verwendung |
||
176 | "UserParam6 ", // 49 zur freien Verwendung |
||
177 | "UserParam7 ", // 50 zur freien Verwendung |
||
178 | "UserParam8 ", // 51 zur freien Verwendung |
||
179 | "LoopConfig ", // 52 Bitcodiert: 0x01=oben, 0x02=unten, 0x04=links, 0x08=rechts / wird getrennt behandelt |
||
180 | "ServoNickCompIn" // 53 Wert : 0-250 // Richtung Einfluss Gyro/Servo |
||
181 | // "Name " // 54 |
||
182 | }; |
||
183 | |||
184 | |||
185 | // Parameter lesen, editieren und zurückschreiben |
||
186 | |||
187 | uint8_t read_parameter (uint8_t number) // Number = Parameter-Set# |
||
188 | { |
||
189 | uint8_t timeout; |
||
190 | |||
191 | timeout = 0; |
||
192 | |||
193 | p_buffer[0] = '#'; // Parameter anfordern |
||
194 | p_buffer[1] = 'a'; |
||
195 | p_buffer[2] = 'q'; |
||
196 | p_buffer[3] = number; |
||
197 | p_buffer[4] = 0; |
||
198 | p_buffer[5] = 0; |
||
199 | base64_send(6); |
||
200 | |||
201 | do // warten, bis die Parameter gesendet werden |
||
202 | { |
||
203 | if (get_message() == 1) // Fehler bei der Übertragung? |
||
204 | timeout = 30; // Timeout sofort auf Endwert setzen |
||
205 | timeout ++; |
||
206 | } |
||
207 | while (((r_buffer[1] < 'L') || (r_buffer[1] > 'P')) && (timeout < 30)); // warten, bis Parameter empfangen wurden oder ein Timeout auftrat |
||
208 | |||
209 | if (timeout >= 30) // Wenn ein Timeout (=Fehler) auftrat, eine 1 zurückgeben, ansonsten 0 |
||
210 | return 1; |
||
211 | else |
||
212 | return 0; |
||
213 | } |
||
214 | |||
215 | void write_parameter(uint8_t number) // Schreibe Parameter-Satz |
||
216 | { |
||
217 | uint8_t i; |
||
218 | |||
219 | if (number <= 5) |
||
220 | { |
||
221 | |||
222 | for (i=0;i<71;i++) // Den gesamten Parameter-Puffer um 3 Bytes nach hinten verschieben |
||
223 | p_buffer[(70-i)+3] = p_buffer[70-i]; |
||
224 | |||
225 | p_buffer[0] = '#'; // Befehl zum Schreiben der Parameter |
||
226 | p_buffer[1] = 'a'; |
||
227 | p_buffer[2] = number + 'k'; // Nummer des Parameters |
||
228 | p_buffer[74] = 0; |
||
229 | base64_send(75); // Parameter in base64 kodieren und senden, 75 Bytes |
||
230 | } |
||
231 | } |
||
232 | |||
233 | void binary (uint8_t data, uint8_t *feld) // Wandelt eine 8-Bit Zahl in eine Binärzahl um (Array mit 8 Elementen) |
||
234 | { // Wird für die Flags (Loop + Grundkonfiguration) benötigt |
||
235 | uint8_t i; |
||
236 | |||
237 | i=0; |
||
238 | for (i=0;i<8;i++) |
||
239 | { |
||
240 | if ((1<<i) & data) |
||
241 | feld[i] = 1; |
||
242 | else |
||
243 | feld[i] = 0; |
||
244 | } |
||
245 | } |
||
246 | |||
247 | uint8_t bindec (uint8_t *feld) // wandelt eine Binärzahl (im Array) in eine 8-Bit Zahl |
||
248 | { // Wird für die Flags (Loop + Grundkonfiguration) benötigt |
||
249 | uint8_t i; |
||
250 | uint8_t result; |
||
251 | |||
252 | result = 0; |
||
253 | for (i=0;i<8;i++) |
||
254 | { |
||
255 | if (feld[i] == 1) |
||
256 | result += 1<<i; |
||
257 | } |
||
258 | return result; |
||
259 | } |
||
260 | |||
261 | |||
262 | |||
263 | |||
264 | void decimal (uint8_t data, uint8_t *text) // wandelt Wert in rechtsbündigen Text um |
||
265 | { // (schneller/kleiner als printf()) |
||
266 | text[0] = data/100; |
||
267 | data -= (text[0] * 100); |
||
268 | text[1] = data/10; |
||
269 | data -= (text[1] *10); |
||
270 | text[2] = data + 0x30; |
||
271 | text[0] += 0x30; |
||
272 | text[1] += 0x30; |
||
273 | |||
274 | if (text[0] == 0x30) |
||
275 | { |
||
276 | text[0] = 0x20; |
||
277 | if (text[1] == 0x30) |
||
278 | text[1] = 0x20; |
||
279 | } |
||
280 | text[3] = 0x00; |
||
281 | } |
||
282 | |||
283 | uint8_t show_parameter (uint8_t number) // Zeigt eine Parameter-Seite an und gibt die ausgewählte Zeile zurück |
||
284 | { |
||
285 | uint8_t i; |
||
286 | uint8_t line; |
||
287 | uint8_t text[25]; |
||
288 | uint8_t bin[8]; |
||
289 | |||
290 | line = 0; |
||
291 | |||
292 | if (number > 1) |
||
293 | { |
||
294 | for (i = 0; i<66; i++) |
||
295 | { |
||
296 | if (pgm_read_byte(p_limits+i*3+2) == number) |
||
297 | { |
||
298 | array[line] = i; |
||
299 | decimal(p_buffer[i],text); |
||
300 | lcd_print_at(0,line,text,0); |
||
301 | lcd_print_atp(5,line,parameter[i],0); |
||
302 | if (line <= 7) |
||
303 | line++; |
||
304 | } |
||
305 | } |
||
306 | } |
||
307 | else |
||
308 | { // Sonderfälle: Binäre Eingabe |
||
309 | if (number == 1) |
||
310 | { |
||
311 | binary(p_buffer[52],bin); // Loop-Config |
||
312 | text[1] = 0x00; |
||
313 | for (i=0;i<4;i++) |
||
314 | { |
||
315 | text[0] = bin[i] + 0x30; |
||
316 | lcd_print_at(0,i,text,0); |
||
317 | lcd_print_atp(5,i,bin_parameter[i],0); |
||
318 | } |
||
319 | |||
320 | } |
||
321 | if (number == 0) |
||
322 | { |
||
323 | binary(p_buffer[8],bin); // Config |
||
324 | text[1] = 0x00; |
||
325 | for (i=0;i<8;i++) |
||
326 | { |
||
327 | text[0] = bin[i] + 0x30; |
||
328 | lcd_print_at(0,i,text,0); |
||
329 | lcd_print_atp(5,i,bin_parameter[i+4],0); |
||
330 | } |
||
331 | } |
||
332 | |||
333 | |||
334 | } |
||
335 | return line; |
||
336 | } |
||
337 | |||
338 | void edit_parameter2 (uint8_t page, uint8_t lines) // Ändern der Parameter einer Seite |
||
339 | { |
||
340 | uint8_t line; |
||
341 | uint8_t par; |
||
342 | uint8_t min; |
||
343 | uint8_t max; |
||
344 | uint8_t text[10]; |
||
345 | uint8_t bin[8]; |
||
346 | |||
347 | if (page > 1) // "normale" Parameter-Seiten |
||
348 | { |
||
349 | line = menu_choose(0,lines-1,4); |
||
350 | if (line != 255) // Wenn line == 255, wurde Escape gedrückt |
||
351 | { |
||
352 | par = p_buffer[array[line]]; |
||
353 | min = pgm_read_byte(p_limits + par * 3); |
||
354 | max = pgm_read_byte(p_limits + par * 3 + 1); |
||
355 | |||
356 | lcd_print_atp(4,line,PSTR("-"),0); |
||
357 | |||
358 | while (key != key_nokey); |
||
359 | |||
360 | do |
||
361 | { |
||
362 | if (key == key_minus) |
||
363 | { |
||
364 | //if (par > min) // Überprüfung der Parameter auf Bereichsüberschreitung derzeit deaktiviert |
||
365 | par --; |
||
366 | } |
||
367 | if (key == key_plus) |
||
368 | { |
||
369 | //if (par < max) |
||
370 | par ++; |
||
371 | } |
||
372 | |||
373 | decimal(par,text); |
||
374 | lcd_print_at(0,line,text,0); |
||
375 | |||
376 | timer = 20; |
||
377 | while (timer > 0); |
||
378 | } |
||
379 | while ((key != 0x04) && (key != 0x08)); |
||
380 | |||
381 | if (key == 0x08) |
||
382 | p_buffer[array[line]] = par; |
||
383 | } |
||
384 | } |
||
385 | |||
386 | if (page == 1) // Spezialfall: Loop-Config (einzelne Bits setzen / löschen) |
||
387 | { |
||
388 | binary(p_buffer[52],bin); |
||
389 | text[1] = 0x00; |
||
390 | |||
391 | line = menu_choose(0,3,4); |
||
392 | if (line != 255) // Wenn line == 255, wurde Escape gedrückt |
||
393 | { |
||
394 | par = bin[line]; |
||
395 | |||
396 | lcd_print_atp(4,line,PSTR("-"),0); |
||
397 | |||
398 | do |
||
399 | { |
||
400 | |||
401 | if (key == key_minus) |
||
402 | { |
||
403 | par = 0x00; |
||
404 | } |
||
405 | if (key == key_plus) |
||
406 | { |
||
407 | par = 0x01; |
||
408 | } |
||
409 | |||
410 | text[0] = par+0x30; |
||
411 | lcd_print_at(0,line,text,0); |
||
412 | timer = 20; |
||
413 | while (timer > 0); |
||
414 | |||
415 | |||
416 | } |
||
417 | while ((key != key_enter) && (key != key_esc)); |
||
418 | |||
419 | if (key == key_enter) |
||
420 | { |
||
421 | bin[line] = par; |
||
422 | p_buffer[52] = bindec(bin); |
||
423 | } |
||
424 | |||
425 | lcd_cls(); |
||
426 | decimal(p_buffer[52],text); |
||
427 | lcd_print(text,0); |
||
428 | timer = 200; |
||
429 | while(timer > 0); |
||
430 | } |
||
431 | } |
||
432 | if (page == 0) // Spezialfall: Allgemeine Konfiguration (einzelne Bits setzen/löschen) |
||
433 | { |
||
434 | binary(p_buffer[8],bin); |
||
435 | text[1] = 0x00; |
||
436 | |||
437 | line = menu_choose(0,7,4); |
||
438 | if (line != 255) // Wenn line == 255, wurde Escape gedrückt |
||
439 | { |
||
440 | par = bin[line]; |
||
441 | |||
442 | lcd_print_atp(4,line,PSTR("-"),0); |
||
443 | |||
444 | do |
||
445 | { |
||
446 | |||
447 | if (key == key_minus) |
||
448 | { |
||
449 | par = 0x00; |
||
450 | } |
||
451 | if (key == key_plus) |
||
452 | { |
||
453 | par = 0x01; |
||
454 | } |
||
455 | |||
456 | text[0] = par+0x30; |
||
457 | lcd_print_at(0,line,text,0); |
||
458 | timer = 20; |
||
459 | while (timer > 0); |
||
460 | |||
461 | |||
462 | } |
||
463 | while ((key != key_enter) && (key != key_esc)); |
||
464 | |||
465 | if (key == key_enter) |
||
466 | { |
||
467 | bin[line] = par; |
||
468 | p_buffer[8] = bindec(bin); |
||
469 | } |
||
470 | |||
471 | lcd_cls(); |
||
472 | decimal(p_buffer[8],text); |
||
473 | lcd_print(text,0); |
||
474 | timer = 200; |
||
475 | while(timer > 0); |
||
476 | } |
||
477 | } |
||
478 | } |
||
479 | |||
480 | |||
481 | void edit_parameter (void) // Blättert die Parameter seitenweise durch, Einsprung vom Hauptmenü |
||
482 | { |
||
483 | uint8_t page; // 12 Pages |
||
484 | uint8_t text[15]; |
||
485 | uint8_t lines; |
||
486 | uint8_t parameter; |
||
487 | |||
488 | lcd_cls(); |
||
489 | |||
490 | lcd_printp(PSTR("Lade Parameter\r\n"),0); |
||
491 | lcd_printp(PSTR(" 1:\r\n"),0); |
||
492 | lcd_printp(PSTR(" 2:\r\n"),0); |
||
493 | lcd_printp(PSTR(" 3:\r\n"),0); |
||
494 | lcd_printp(PSTR(" 4:\r\n"),0); |
||
495 | lcd_printp(PSTR(" 5:\r\n"),0); |
||
496 | |||
497 | parameter = menu_choose(1,5,0); |
||
498 | |||
499 | page = 2; |
||
500 | if (read_parameter(parameter) == 1) |
||
501 | { |
||
502 | lcd_print_atp(0,6,PSTR("Timeout"),0); |
||
503 | } |
||
504 | else |
||
505 | { |
||
506 | do |
||
507 | { |
||
508 | lcd_cls(); |
||
509 | utoa(page,text,10); |
||
510 | lcd_print(text,0); |
||
511 | timer = 50; |
||
512 | |||
513 | while (timer > 0); |
||
514 | |||
515 | lcd_cls(); |
||
516 | |||
517 | lines = show_parameter(page); |
||
518 | |||
519 | while (key == key_nokey); |
||
520 | if (key == key_plus) |
||
521 | page++; |
||
522 | if (key == key_minus) |
||
523 | page--; |
||
524 | |||
525 | if (page == 255) |
||
526 | page = 12; |
||
527 | |||
528 | if (page > 12) |
||
529 | page = 0; |
||
530 | |||
531 | if (key == key_enter) |
||
532 | edit_parameter2(page,lines); |
||
533 | |||
534 | } |
||
535 | while (key != key_esc); |
||
536 | |||
537 | lcd_cls(); |
||
538 | lcd_printp(PSTR("Parameter speichern?\r\n ja\r\n nein"),0); |
||
539 | |||
540 | lines = menu_choose(1,2,0); |
||
541 | |||
542 | if (lines == 1 ) |
||
543 | { |
||
544 | lcd_printp(PSTR("\r\n--->"),0); |
||
545 | write_parameter(5); // Sicherheitshalber wird derzeit ausschließlich auf Parametersatz 5 gesichert. |
||
546 | lcd_printp(PSTR("\r\nParameter gespeichert"),0); |
||
547 | } |
||
548 | else |
||
549 | { |
||
550 | lcd_printp(PSTR("\r\nNicht gespeichert"),0); |
||
551 | } |
||
552 | } |
||
553 | timer = 100; |
||
554 | while(timer > 0); |
||
555 | |||
556 | } |