Subversion Repositories Projects

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1915 - 1
 
2
/****************************************************************/
3
/*                                                                                                                              */
4
/*      NG-Video 5,8GHz                                                                                         */
5
/*                                                                                                                              */
6
/*      Copyright (C) 2011 - gebad                                                                      */
7
/*                                                                                                                              */
8
/*      This code is distributed under the GNU Public License           */
9
/*      which can be found at http://www.gnu.org/licenses/gpl.txt       */
10
/*                                                                                                                              */
11
/****************************************************************/
12
 
13
#include <stdio.h>
14
#include <stdlib.h>
15
#include <string.h>
16
#include <math.h>
17
#include "../cpu.h"
18
#include <util/delay.h>
19
#include <avr/pgmspace.h>
20
#include <avr/interrupt.h>
21
#include "../main.h"
22
#include "../timer/timer.h"
23
#include "servo_setup.h"
24
#include "tracking.h"
25
#include "../lcd/lcd.h"
26
#include "../timer/timer.h"
27
#include "../menu.h"
28
#include "../messages.h"
29
#include "../mk-data-structs.h"
30
#include "mymath.h"
31
#include "../uart/usart.h"
32
#include "../osd/osd.h"
33
#include "../eeprom/eeprom.h"
34
#include "../setup/setup.h"
35
#include "tools.h"
36
 
37
//#include "ng_usart.h"
38
//#include "ng_config.h"
39
//#include "servo.h"
40
//#include "tools.h"
41
//#include "mk.h"
42
//#include "keys.h"
43
//#include "mymath.h"
44
//
45
 
46
//GPS_Pos_t last5pos[7];
47
//uint8_t error1 = 0;
48
//NaviData_t *naviData;
49
//HomePos_t MK_pos;                             // Home position of station
50
//GPS_Pos_t currentPos;                 // Current position of flying object
51
//int8_t satsInUse;                     // Number of satelites currently in use
52
 
53
//uint8_t tracking   = TRACKING_MIN;
54
//uint8_t track_hyst = TRACKING_HYSTERESE;
55
//uint8_t track_tx   = 0;
56
 
57
//geo_t geo;
58
//int16_t       anglePan, angleTilt; // Servo Winkel
59
//uint8_t       coldstart       = 1;
60
 
61
uint8_t servo_nr;                        // zwischen Servo 1 und 2 wird nur mit global servo_nr unterschieden
62
//uint8_t       FCStatusFlags;
63
 
64
 
65
//--------------------------------------------------------------
66
#define ITEMS_SERVO 4
67
 
68
const prog_char servo_menuitems[ITEMS_SERVO][NUM_LANG][18]= // Zeilen,Zeichen+1
69
{
70
       {"Servoschritte    ","servo steps    ","servo steps     "},
71
       {"Servo 1         \x1d","servo 1         \x1d","servo 1         \x1d"},
72
       {"Servo 2         \x1d","servo 2         \x1d","servo 2         \x1d"},
73
       {"Servotest       \x1d","servotest       \x1d","servotest       \x1d"},
74
};
75
 
76
//--------------------------------------------------------------
77
 
78
#define ITEMS_SERVOTEST 4
79
 
80
const prog_char servotest_menuitems[ITEMS_SERVOTEST][NUM_LANG][18]= // Zeilen,Zeichen+1
81
{
82
       {"Test Pulslänge   ","test puls width","test puls width "},
83
       {"Test fortlaufend\x1d","test cont.      \x1d","test cont.      \x1d"},
84
       {"Servo            ","servo          ","servo           "},
85
       {"Periode          ","frame          ","frame           "},
86
};
87
 
88
//--------------------------------------------------------------
89
 
90
#define ITEMS_SERVOTEST_CONT 5
91
 
92
const prog_char servotest_cont_menuitems[ITEMS_SERVOTEST_CONT][NUM_LANG][18]= // Zeilen,Zeichen+1
93
 
94
{     {"Start Test       ","start test       ","start test       "},
95
      {"Einzelschritt    ","single step      ","single step      "},
96
      {"Anzahl Test      ","number of test   ","number of test   "},
97
      {"Pause Endposition","pause end pos    ","pasue end pos    "},
98
      {"Pause pro Inc.   ","pause proc inc.  ","pause proc inc.  "},
99
};
100
 
101
//--------------------------------------------------------------
102
 
103
#define ITEMS_SERVOADJUST 4
104
 
105
const prog_char servo_adjust_menuitems[ITEMS_SERVOADJUST][NUM_LANG][18]= // Zeilen,Zeichen+1
106
{
107
      {"Reverse          ","reverse          ","reverse          "},
108
      {"Links            ","left             ","left             "},
109
      {"Rechts           ","right            ","rigth            "},
110
      {"Mitte            ","middle           ","middle           "},
111
};
112
 
113
 
114
 
115
///************************************************************************************/
116
///*                                                                                                                                                                                                                                                                                                                                      */
117
///*      Ändern der Werte mit Tasten +,- und Anzeige                                                                                                                                                     */
118
///*      z.B. für U-Offset, Batterie leer Eingabe ...                                                                                                                                            */
119
///*                                                                                                                                                                                                                                                                                                                                      */
120
///*      Parameter:                                                                                                                                                                                                                                                                                      */
121
///*      uint16_t                        val                                     :zu ändernter Wert                                                                                                                                      */
122
///*      uint16_t min_val, max_val               :min, max Grenze Wert ändern darf                                                                               */
123
///*      uint8_t posX, posY                                      :Darstellung Wert xPos, YPos auf LCD                                                            */
124
///*      Displ_Fnct_t    Displ_Fnct              :Index um variable Display Funktion aufzurufen                  */
125
///*      uint8_t                         cycle                                   :0 begrenzt Anzeige bei man_val, bzw. max_val                           */
126
///*                                                                                                                      :1 springt nach max_val auf min_val und umgedreht               */
127
///*      uint8_t                         vrepeat                         :beschleunigte Repeat-Funktion aus/ein                                                  */
128
///*      uint16_t Change_Value_plmi(...)         :Rückgabe geänderter Wert                                                                                       */
129
///*                                                                                                                                                                                                                                                                                                                                      */
130
///************************************************************************************/
131
 
132
void Servo_tmp_Original(uint8_t track)
133
{
134
        servoSetDefaultPos();
135
//        tracking = track;                     // ursprünglicher Wert Tracking aus, RSSI oder GPS
136
//        NoTracking_ServosOff();              // Servos sind nur zum Tracking oder bei Kalibrierung eingeschaltet
137
//        Jump_Menu(pmenu);
138
}
139
 
140
uint8_t Servo_tmp_on(uint8_t servo_period)
141
{
142
//  uint8_t tmp_tracking = tracking;
143
 
144
//        tracking = 0;                                           // Servopositionierung durch tracking abschalten
145
//        if (tracking == TRACKING_MIN) servoInit(servo_period);  // falls aus, Servos einschalten
146
        servoInit(servo_period);
147
//        lcdGotoXY(0, 0);                                        // lcd Cursor vorpositionieren
148
//        return(tmp_tracking);
149
        return (0);
150
}
151
 
152
 
153
void Displ_Off_On(uint16_t val)
154
{
155
        if (val == 0) lcd_puts_at(17, 2, strGet(OFF), 0); else lcd_puts_at(17, 2, strGet(ON), 0);
156
}
157
 
158
 
159
uint16_t Change_Value_plmi(uint16_t val, uint16_t min_val, uint16_t max_val, uint8_t posX, uint8_t posY,Displ_Fnct_t Displ_Fnct)
160
{
161
  uint16_t tmp_val;
162
  // >> Menueauswahl nach oben
163
          tmp_val = val;
164
 
165
          if (get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 3))
166
          {
167
                if (val < max_val) {
168
                    edit = 1;
169
                    val++;
170
 
171
                }
172
                else
173
                  {
174
                   val = min_val;
175
                  }
176
                   Displ_Fnct(val);                                // geänderten Wert darstellen, je nach Menüpunkt
177
 
178
 
179
        }
180
        // >> Menueauswahl nach unten
181
 
182
          if (get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 3))
183
          {
184
                if (val > min_val) {
185
                        val--;
186
                        edit = 1;
187
 
188
                }
189
                else
190
                  {
191
                  val = max_val;
192
                  }
193
                  Displ_Fnct(val);                                                        // geänderten Wert darstellen, je nach Menüpunkt
194
 
195
 
196
        }
197
 
198
        return(val);
199
}
200
//
201
///************************************************************************************/
202
///*                                                                                                              */
203
///*      Ändern der Werte mit Tasten +,- repetierend; (long)Entertaste und Anzeige                               */
204
///*                                                      z.B. für U-Offset, Batterie leer Eingabe ...            */
205
///*                                                                                                              */
206
///*      Parameter:                                                                                              */
207
///*      uint16_t *val                   :zu ändernter Wert                                                      */
208
///*      uint16_t min_val, max_val       :min, max Grenze Wert ändern darf                                       */
209
///*      uint8_t fl_pos                  :Bit 7 beschleunigte Repeat-Funktion aus/ein                            */
210
///*                                       Bit 6 zyklische Werteänderung aus/ein                                  */
211
///*                                       Bit 4-5  z.Z. ohne Funktion                                            */
212
///*                                       Bit 0-3 Wert xPos auf LCD                                              */
213
///*      Displ_Fnct_t Displ_Fnct         :Index um variable Display Funktion aufzurufen                          */
214
///*      uint8_t Change_Value(...)       :Rückgabe geändert ergibt TRUE                                          */
215
///*                                                                                                              */
216
///************************************************************************************/
217
//// Bei Bedarf könnte einfach innerhalp fl_pos auch noch pos_y (Bit 4-5) übergeben werden
218
uint8_t Change_Value(uint16_t *val, uint16_t min_val, uint16_t max_val,Displ_Fnct_t Displ_Fnct)
219
 
220
{ uint16_t tmp_val;
221
 
222
        tmp_val = *val;
223
        Displ_Fnct(tmp_val);               // initiale Wertdarstellung, je nach Menüpunkt
224
        while(!get_key_press(1<<KEY_ENTER) && !get_key_press(1<<KEY_ESC))
225
                *val = Change_Value_plmi(*val, min_val, max_val, 16,2, Displ_Fnct);
226
 
227
 
228
        if (*val == tmp_val) {
229
           edit = 0;
230
//            lcd_printp_at (0, 5, PSTR("Edit=0"), 0);
231
//            _delay_ms(500);
232
////            return (*val);
233
        }
234
//
235
        else
236
          {
237
           edit = 1;
238
//            lcd_printp_at (0, 5, PSTR("Edit=1"), 0);
239
//            _delay_ms(500);
240
          }
241
 
242
            return (tmp_val != *val);
243
 
244
 
245
}
246
 
247
uint16_t calc_range(int16_t PosProzent, int16_t min, int16_t max, int16_t mid)
248
{ uint16_t range;
249
 
250
        if (PosProzent < 0) {
251
                range = mid - min;
252
//                if (chrxs == CHRRS) {           // falls Richtung geändert, anderen Zeichensatz laden
253
//                        chrxs = CHRLS;
254
////                        lcdWriteCGRAM_Array(lcdSpecialChrLs, 5);// LCD-Char mit Rahmensymbole vom Graph
255
//                }
256
        }
257
        else {
258
                range = max - mid;
259
//                if (chrxs == CHRLS) {           // falls Richtung geändert, anderen Zeichensatz laden
260
////                        lcdWriteCGRAM_Array(lcdSpecialChrRs, 5);// LCD-Char mit Rahmensymbole vom Graph
261
//                        chrxs = CHRRS;
262
//                }
263
        }
264
        return(range);
265
}
266
 
267
 
268
/************************************************************************************/
269
/*      zeigt einen max. 3-stelligen Integerwert auf Display an                                                                                                 */
270
/*      Parameter:                                                                                                                                                                                                                                                                                      */
271
/*      uint16_t val                            :anzuzeigender Wert,                                                                                                                                                            */
272
/*                                                                                       uint16_t wegen Vereinheitlichung f. Funktionsaufrauf                           */
273
/*                                                                                                                                                                                                                                                                                                                                      */
274
/************************************************************************************/
275
void Displ_Format_Int(uint16_t val)
276
{
277
//        lcdPuts(my_itoa(val, 3, 0, 0));
278
 
279
        //        lcdPuts(my_itoa(mid_val, 4, 0, 0));
280
        lcd_puts_at(16,2,my_itoa(val, 3, 0, 0),0);
281
 
282
}
283
 
284
void Displ_PulseWidth(uint16_t val)
285
{ int16_t PosProzent, range;
286
        uint16_t Pos_us;
287
        char me[3] = {"ms"};
288
 
289
        servoSetPositionRaw(servo_nr, val);
290
 
291
        PosProzent = val - steps_pw[Config.sIdxSteps].mid;
292
        range = calc_range(PosProzent, steps_pw[Config.sIdxSteps].min, steps_pw[Config.sIdxSteps].max, steps_pw[Config.sIdxSteps].mid);
293
//        draw_bar(PosProzent, range, 2); // auf 3. Display-Zeile
294
        PosProzent = (int32_t)1000 * PosProzent / range;
295
//        lcdGotoXY(1, 1);
296
        Pos_us = pw_us(val);                            // Zeit in µs bei x Servoschritte
297
        if (Pos_us < 1000) {
298
                me[0] = 'u';                            // soll 'µ' => programmierbarer Zeichensatz zu klein
299
//                lcdPuts("  ");
300
                Displ_Format_Int(Pos_us);
301
        }
302
        else {
303
//                lcdPuts(my_itoa(Pos_us, 5, 3, 3));
304
                lcd_puts_at(14,2,my_itoa(Pos_us, 5, 3, 3),0);
305
        }
306
//        lcdPuts(me);
307
//        lcdGotoXY(8, 1);
308
//        lcdPuts(my_itoa(PosProzent, 6, 1, 1));
309
        lcd_puts_at(14,2,my_itoa(PosProzent, 6, 1, 1),0);
310
//        lcdPutc('%');
311
}
312
/************************************************************************************/
313
/*      zeigt Pausenlänge der Links-, Mittel- und Rechtsposition auf Display an                                 */
314
/*      Parameter:                                                                                                                                                                                                                                                                                      */
315
/*      uint16_t val            : Zeit in 1ms * 100                                                                                                                                                                                     */
316
/*                                                                                                                                                                                                                                                                                                                                      */
317
/************************************************************************************/
318
void Displ_Pause(uint16_t val)
319
{
320
        if (val > 9) {
321
//               lcdPuts(my_itoa(val, 3, 1, 1));
322
                lcd_puts_at(16,2,my_itoa(val, 3, 1, 1),0);
323
//                lcdPuts("s ");
324
        }
325
        else {
326
                Displ_Format_Int(val * 100);
327
//                lcdPuts("ms");
328
        }
329
}
330
 
331
/************************************************************************************/
332
/*      zeigt aus oder Integerwert auf Display an                                                                                                                                                               */
333
/*      Parameter:                                                                                                                                                                                                                                                                                      */
334
/*      uint16_t val            : val = 0 ==> aus, sont Integerwert                                                                                                                     */
335
/*                                                                                                                                                                                                                                                                                                                                      */
336
/************************************************************************************/
337
void Displ_Off_Format_Int(uint16_t val)
338
{
339
        if (val == 0)
340
//                lcdPutStrMid(Msg(MSG_OFF), ZLE_VAL);
341
                lcd_puts_at(17, 2, strGet(OFF), 0);
342
        else {
343
//            write_ndigit_number_u (16, 2, val, 5, 0,0);
344
//                lcdGotoXY(5,ZLE_VAL);
345
                Displ_Format_Int(val);
346
//                lcdPutc(' ');
347
        }
348
}
349
 
350
/************************************************************************************/
351
/*      zeigt aus oder Pausenzeit zwischen 2 Servoschritte auf Display an                                                               */
352
/*      Parameter:                                                                                                                                                                                                                                                                                      */
353
/*      uint16_t val            : val = 0 ==> aus, sont Integerwert                                                                                                                     */
354
/*                                                                                                                                                                                                                                                                                                                                      */
355
/************************************************************************************/
356
void Displ_Pause_Step(uint16_t val)
357
{
358
        Displ_Off_Format_Int(val);
359
        if (val > 0) {
360
//                lcdGotoXY(8,ZLE_VAL);
361
//                lcdPuts("ms");
362
        }
363
}
364
/************************************************************************************/
365
/*      zeigt zu testende Servonummer zur Auswahl auf Display an                                                                                                */
366
/*      Parameter:                                                                                                                                                                                                                                                                                      */
367
/*      uint16_t val                            :0 = Servo 1 oder 1 = Servo 2,                                                                                                                  */
368
/*                                                                                       uint16_t wegen Vereinheitlichung f. Funktionsaufrauf                           */
369
/*                                                                                                                                                                                                                                                                                                                                      */
370
/************************************************************************************/
371
void Displ_ServoNr(uint16_t val)
372
{
373
//        if (val == 0) lcdPuts(Msg(MSG_SERVO1)); else lcdPuts(Msg(MSG_SERVO2));
374
        lcd_printp_at (0, 2, PSTR("Servo:"), 0);
375
        if (val == 0) lcd_printp_at (14, 2, PSTR("Servo 1"), 0); else lcd_printp_at (14, 2, PSTR("Servo 2"), 0);
376
}
377
/**************************/
378
/*                                                                                              */
379
/*                      Servos-Tests                    */
380
/*                                                                                              */
381
/**************************/
382
//void Menu_Servo_Test(void)
383
//{ uint8_t scr_sub_menu[SCROLL_MAX_6]    = {SCROLL_MAX_6 - 2, MSG_RETURN, MSG_PULSE_WIDTH, MSG_CONTINOUS, MSG_SERVO, MSG_FRAME};
384
//
385
//        Scroll_Menu(scr_sub_menu, m_pkt); // pmenu global
386
//        servo_nr = eeprom_read_byte(&ep_servo_nr);
387
//        Jump_Menu(pmenu);
388
//}
389
 
390
void Menu_Test_Frame(void)
391
{ uint16_t tmp_val;
392
 
393
//        Displ_Title(MSG_FRAME);
394
//        lcdGotoXY(8, ZLE_VAL);
395
        lcd_cls ();
396
        lcd_puts_at(0, 0, strGet(SV_TEST3),2);
397
        lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
398
 
399
//        lcdPuts("ms");
400
        tmp_val = Config.servo_frame;
401
        if (Change_Value(&tmp_val, SERVO_PERIODE_MIN, SERVO_PERIODE_MAX,Displ_Format_Int)) { // pmenu global
402
            Config.servo_frame = tmp_val;
403
//                eeprom_write_byte(&ep_servo_frame, servo_frame);
404
//                Double_Beep(DBEEPWR, DBEEPWRP);
405
        }
406
//        Jump_Menu(pmenu);
407
}
408
 
409
void Menu_Test_ServoNr(void)
410
{ uint16_t tmp_val;
411
 
412
//        Displ_Title(MSG_SERVO);
413
        lcd_cls ();
414
        lcd_puts_at(0, 0, strGet(SV_TEST2),2);
415
        lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
416
        tmp_val = servo_nr;
417
        if (Change_Value(&tmp_val, 0, 1,Displ_ServoNr)) { // pmenu global; es gibt nur 0=Servo1, 1=Servo2
418
                servo_nr = tmp_val;
419
//                eeprom_write_byte(&ep_servo_nr, servo_nr);
420
//                Double_Beep(DBEEPWR, DBEEPWRP);
421
        }
422
//        Jump_Menu(pmenu);
423
}
424
 
425
// Dieser Test im raw-Modus ohne Anschlagkalibrierung (normiert) z.B.: für Modelleinstellungen ohne Empfänger
426
void Menu_Test_PulseWidth(void)
427
{ uint8_t tmp_tracking;
428
        uint16_t tmp_val;
429
        lcd_cls ();
430
        lcd_puts_at(0, 0, strGet(SERVO_TEST1),2);
431
        lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
432
        tmp_tracking = Servo_tmp_on(Config.servo_frame);
433
//        lcdWriteCGRAM_Array(lcdSpecialChrLs, 8);        // LCD-Char mit Rahmensymbole vom Graph
434
//        chrxs = CHRLS;                                                                                                          // verhindert wiederholtes Lesen bereits geladener LCD-Char
435
//        Displ_Title(MSG_PULSE_WIDTH);
436
        tmp_val = steps_pw[Config.sIdxSteps].mid;
437
        Change_Value(&tmp_val, steps_pw[Config.sIdxSteps].min, steps_pw[Config.sIdxSteps].max,Displ_PulseWidth); // pmenu global
438
//        lcdWriteCGRAM_Array(lcdSpecialChr, 7);          // LCD-Char für Bargraph zurückschreiben
439
        cli();
440
        servoInit(SERVO_PERIODE);
441
        sei();
442
        Servo_tmp_Original(tmp_tracking);
443
}
444
 
445
//void Menu_Test_Continuous(void)
446
//{ uint8_t scr_sub_menu[SCROLL_MAX_7]    = {SCROLL_MAX_7 - 2, MSG_RETURN, MSG_START, MSG_SINGLE_STEP, MSG_REPEAT, MSG_PAUSE, MSG_PAUSE_STEP};
447
//
448
//        Scroll_Menu(scr_sub_menu, m_pkt);                               // pmenu global
449
//        Jump_Menu(pmenu);
450
//}
451
 
452
void Menu_Test_SingleStep(void)
453
{uint16_t tmp_val;
454
//TODO:
455
//        Displ_Title(MSG_SINGLE_STEP);
456
        lcd_cls ();
457
        tmp_val = Config.single_step;
458
        lcd_puts_at(0, 0, strGet(SV_SINGLESTEP),2);
459
        lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
460
        if (Change_Value(&tmp_val, SINGLE_STEP_MIN, SINGLE_STEP_MAX, Displ_Off_Format_Int)) { // pmenu global
461
            Config.single_step = tmp_val;
462
//                eeprom_write_byte(&ep_single_step, single_step);
463
//                Double_Beep(DBEEPWR, DBEEPWRP);
464
        }
465
//        Jump_Menu(pmenu);
466
}
467
 
468
void Menu_Test_Repeat(void)
469
{uint16_t tmp_val;
470
//TODO:
471
//        Displ_Title(MSG_REPEAT);
472
        tmp_val = Config.repeat;
473
        lcd_cls ();
474
        lcd_puts_at(0, 0, strGet(SV_COUNTTEST),2);
475
        lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
476
        if (Change_Value(&tmp_val, REPEAT_MIN, REPEAT_MAX,Displ_Format_Int)) { // pmenu global
477
            Config.repeat = tmp_val;
478
//                eeprom_write_byte(&ep_repeat, repeat);
479
//                Double_Beep(DBEEPWR, DBEEPWRP);
480
        }
481
//        Jump_Menu(pmenu);
482
}
483
 
484
void Menu_Test_Pause(void)
485
{uint16_t tmp_val;
486
//TODO:
487
//        Displ_Title(MSG_PAUSE);
488
        lcd_cls ();
489
        lcd_puts_at(0, 0, strGet(SV_PAUSEEND),2);
490
        lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
491
        tmp_val = Config.pause;
492
        if (Change_Value(&tmp_val, PAUSE_MIN, PAUSE_MAX,Displ_Pause)) { // pmenu global
493
            Config.pause = tmp_val;
494
//                eeprom_write_byte(&ep_pause, pause);
495
//                Double_Beep(DBEEPWR, DBEEPWRP);
496
        }
497
//        Jump_Menu(pmenu);
498
}
499
 
500
void Menu_Test_Pause_Step(void)
501
{uint16_t tmp_val;
502
//TODO:
503
//        Displ_Title(MSG_PAUSE_STEP);
504
        lcd_cls ();
505
        lcd_puts_at(0, 0, strGet(SV_PAUSEINC),2);
506
        lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
507
        tmp_val = Config.pause_step;
508
        if (Change_Value(&tmp_val, PAUSE_STEP_MIN, PAUSE_STEP_MAX,Displ_Pause_Step)) { // pmenu global
509
            Config.pause_step = tmp_val;
510
//                eeprom_write_byte(&ep_pause_step, pause_step);
511
//                Double_Beep(DBEEPWR, DBEEPWRP);
512
        }
513
//        Jump_Menu(pmenu);
514
}
515
 
516
int8_t calc_dir(uint8_t idx, int16_t *Position)
517
{ uint8_t nextIdx;
518
        int8_t nextDir = 1;
519
 
520
        nextIdx = idx;
521
        if ((idx + 1) < POSIDX_MAX)
522
                nextIdx++;
523
        else
524
                nextIdx = 0;
525
        if (Position[PosIdx[idx]] > Position[PosIdx[nextIdx]]) nextDir = -1;
526
        return(nextDir);
527
}
528
void Displ_LoopCounter(uint8_t val)
529
{
530
//        lcdGotoXY(2,2);
531
//        lcdPuts(Msg(MSG_COUNTER));
532
//        lcdPuts(my_itoa(val, 4, 0, 0));
533
        lcd_puts_at(16,2,my_itoa(val, 4, 0, 0),0);
534
}
535
 
536
// Test über Scalierung der Servos mit Anschlagkalibrierung
537
void Menu_Test_Start(void)
538
{ uint8_t tmp_tracking, idx, rep;
539
        int8_t dir;
540
        int16_t sPos;
541
        int16_t Position[3];
542
        int16_t range;
543
 
544
        tmp_tracking = Servo_tmp_on(Config.servo_frame);
545
//        lcdWriteCGRAM_Array(lcdSpecialChrLs, 8);                // LCD-Char mit Rahmensymbole vom Graph
546
//        chrxs = CHRLS;                                          // Flag, welche Kästchensymbole geladen
547
//        Displ_Title(MSG_CONTINOUS);
548
        lcd_cls ();
549
        lcd_puts_at(0, 0, strGet(SV_TESTCONT),2);
550
        lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
551
        Displ_LoopCounter(Config.repeat);
552
        Position[0] = 0;                                         // skalierte Servoposition aber unterschiedliche Schrittanzahl möglich
553
        Position[1] = ServoSteps()/2;
554
        Position[2] = ServoSteps();
555
        // init Einzelschritt
556
        idx = 0;
557
        dir = calc_dir(idx, Position);
558
        sPos = Position[PosIdx[idx]];
559
        idx++;
560
        rep = Config.repeat;
561
 
562
        // Test bis Ende der Wiederholungen oder irgendein Enter
563
        while(!get_key_press(1<<KEY_ENTER) && !get_key_press(1<<KEY_ESC)) {
564
                range = calc_range(sPos - Position[1], Position[0], Position[2], Position[1]);
565
//                draw_bar(sPos - Position[1], range, 1); // eingerahmter Balkengraph auf 2. Display-Zeile
566
                servoSetPosition(servo_nr, sPos);
567
 
568
                if ( sPos != Position[PosIdx[idx]]) {           // Links-, Mittel- oder Rechtsposotion erreicht?
569
                        sPos += (Config.single_step * dir);            // variable Schrittweite subtrahieren oder addieren
570
                        if (((dir < 0) && (sPos < Position[PosIdx[idx]])) || ((dir > 0) && (sPos > Position[PosIdx[idx]])) || !(Config.single_step))
571
                                sPos = Position[PosIdx[idx]];   // Überlauf bei variabler Schrittweite berücksichtigen oder Einzelschritt
572
                        Delay_ms(Config.servo_frame + 1 + Config.pause_step);// Bei Schrittweite um 1 würden welche übersprungen, zusätzlich pro Servoschritt verzögert
573
                }
574
                else {
575
                        dir = calc_dir(idx, Position);            // Richtungsänderung
576
                        if (idx < (POSIDX_MAX - 1)) {
577
                                if (idx == 0) {
578
                                        rep--;                    // bei jeden vollen Durchlauf Wiederholzähler verringern
579
                                        Displ_LoopCounter(rep);
580
                                }
581
                                idx++;                          // Index für nächsten Positionswert ==> Array PosIdx[] bestimmt Anschlagreihenfolge
582
                        }
583
                        else
584
                                idx = 0;
585
                        delay_ms100x(Config.pause);                    // variable Pause bei Links-, Mittel- und Rechtsposotion Mindestzeit 400ms (Servolauf)
586
                }
587
        }
588
 
589
//        lcdClear();
590
//        if (pmenu[0] == '\0')
591
//                Displ_Main_Disp();
592
//        else
593
//                return_m_pkt(strlen(pmenu));                     // um bei Rücksprung auf ursprünglichen Menüpunkt zeigen oder Displ_Main_Disp()
594
//        lcdWriteCGRAM_Array(lcdSpecialChr, 7);                  // LCD-Char für Bargraph zurückschreiben
595
        cli();
596
        servoInit(SERVO_PERIODE);
597
        sei();
598
        Servo_tmp_Original(tmp_tracking);
599
}
600
 
601
 
602
//--------------------------------------------------------------
603
 
604
void test_servo_menu(void)
605
{
606
 
607
//      uint8_t ii = 0;
608
//      uint8_t Offset = 0;
609
//      uint8_t dmode = 0;
610
        uint8_t target_pos = 1;
611
//      uint8_t val = 0;
612
 
613
        while(1)
614
        {
615
                size = ITEMS_SERVOTEST;
616
                lcd_cls ();
617
                lcd_printpns_at(0, 0, PSTR("test_servo_menu  "), 2);
618
//              lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
619
                lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
620
//              while(2)
621
//              {
622
//                      ii = 0;
623
//                      if(Offset > 0)
624
//                      {
625
//                              lcd_printp_at(1,1, PSTR("\x12"), 0);
626
//                      }
627
//                      for(ii = 0;ii < 6 ; ii++)
628
//                      {
629
//                              if((ii+Offset) < size)
630
//                              {
631
//                                      lcd_printp_at(3,ii+1,servotest_menuitems[ii+Offset][Config.DisplayLanguage], 0);
632
//                              }
633
//                              if((ii == 5)&&(ii+Offset < (size-1)))
634
//                              {
635
//                                      lcd_printp_at(1,6, PSTR("\x13"), 0);
636
//                              }
637
//                      }
638
//                      if(dmode == 0)
639
//                      {
640
//                              if(Offset == 0)
641
//                              {
642
//                                      if(size > 6)
643
//                                      {
644
//                                              val = menu_choose2 (1, 5, target_pos,0,1);
645
//                                      }
646
//                                      else
647
//                                      {
648
//                                              val = menu_choose2 (1, size, target_pos,0,0);
649
//                                      }
650
//                              }
651
//                              else
652
//                              {
653
//                                      val = menu_choose2 (2, 5, target_pos,1,1);
654
//                              }
655
//                      }
656
//                      if(dmode == 1)
657
//                      {
658
//                              if(Offset+7 > size)
659
//                              {
660
//                                      val = menu_choose2 (2, 6, target_pos,1,0);
661
//                              }
662
//                              else
663
//                              {
664
//                                      val = menu_choose2 (2, 5, target_pos,1,1);
665
//                              }
666
//                      }
667
//                      if(val == 254)
668
//                      {
669
//                              Offset++;
670
//                              dmode = 1;
671
//                              target_pos = 5;
672
//                      }
673
//                      else if(val == 253)
674
//                      {
675
//                              Offset--;
676
//                              dmode = 0;
677
//                              target_pos = 2;
678
//                      }
679
//                      else if(val == 255)
680
//                      {
681
//                              return;
682
//                      }
683
//                      else
684
//                      {
685
//                              break;
686
//                      }
687
//              }
688
                val = menu_select(servotest_menuitems,size,target_pos);
689
                if (val==255) break;
690
                target_pos = val;
691
 
692
//                     {"Test Pulslänge   ","test puls width","test puls width "},
693
//                     {"Test fortlaufend\x1d","test cont.      \x1d","test cont.      \x1d"},
694
//                     {"Servo            ","servo          ","servo           "},
695
//                     {"Periode          ","frame          ","frame           "},
696
 
697
                if(val == 1 )
698
                        Menu_Test_PulseWidth();
699
                if(val == 2 )
700
                        servotest_cont_menu();
701
                if(val == 3 )
702
                        Menu_Test_ServoNr();
703
 
704
                if(val == 4 )
705
                        Menu_Test_Frame();
706
 
707
        }
708
}
709
 
710
//--------------------------------------------------------------
711
 
712
 
713
 
714
//--------------------------------------------------------------
715
 
716
 
717
void servotest_cont_menu(void)
718
{
719
 
720
//      uint8_t ii = 0;
721
//      uint8_t Offset = 0;
722
//      uint8_t dmode = 0;
723
        uint8_t target_pos = 1;
724
//      uint8_t val = 0;
725
 
726
        while(1)
727
        {
728
                size = ITEMS_SERVOTEST_CONT;
729
                lcd_cls ();
730
                lcd_printpns_at(0, 0, PSTR("Servotest cont."), 2);
731
//              lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
732
                lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
733
//              while(2)
734
//              {
735
//                      ii = 0;
736
//                      if(Offset > 0)
737
//                      {
738
//                              lcd_printp_at(1,1, PSTR("\x12"), 0);
739
//                      }
740
//                      for(ii = 0;ii < 6 ; ii++)
741
//                      {
742
//                              if((ii+Offset) < size)
743
//                              {
744
//                                      lcd_printp_at(3,ii+1,servotest_cont_menuitems[ii+Offset][Config.DisplayLanguage], 0);
745
//                              }
746
//                              if((ii == 5)&&(ii+Offset < (size-1)))
747
//                              {
748
//                                      lcd_printp_at(1,6, PSTR("\x13"), 0);
749
//                              }
750
//                      }
751
//                      if(dmode == 0)
752
//                      {
753
//                              if(Offset == 0)
754
//                              {
755
//                                      if(size > 6)
756
//                                      {
757
//                                              val = menu_choose2 (1, 5, target_pos,0,1);
758
//                                      }
759
//                                      else
760
//                                      {
761
//                                              val = menu_choose2 (1, size, target_pos,0,0);
762
//                                      }
763
//                              }
764
//                              else
765
//                              {
766
//                                      val = menu_choose2 (2, 5, target_pos,1,1);
767
//                              }
768
//                      }
769
//                      if(dmode == 1)
770
//                      {
771
//                              if(Offset+7 > size)
772
//                              {
773
//                                      val = menu_choose2 (2, 6, target_pos,1,0);
774
//                              }
775
//                              else
776
//                              {
777
//                                      val = menu_choose2 (2, 5, target_pos,1,1);
778
//                              }
779
//                      }
780
//                      if(val == 254)
781
//                      {
782
//                              Offset++;
783
//                              dmode = 1;
784
//                              target_pos = 5;
785
//                      }
786
//                      else if(val == 253)
787
//                      {
788
//                              Offset--;
789
//                              dmode = 0;
790
//                              target_pos = 2;
791
//                      }
792
//                      else if(val == 255)
793
//                      {
794
//                              if (edit == 1)
795
//                                     {
796
////                                     WriteParameter();
797
//                                       edit = 0;
798
//                                       return;
799
//                                      }
800
//                              return;
801
//                      }
802
//                      else
803
//                      {
804
//                              break;
805
//                      }
806
//              }
807
                val = menu_select(servotest_cont_menuitems,size,target_pos);
808
                if (val==255) break;
809
                target_pos = val;
810
                if(val == 1 )
811
                        Menu_Test_Start();
812
                if(val == 2 )
813
                        Menu_Test_SingleStep();
814
                if(val == 3)
815
                        Menu_Test_Repeat();
816
                if(val == 4 )
817
                        Menu_Test_Pause();
818
                if(val == 5)
819
                  Menu_Test_Pause_Step();
820
 
821
        }
822
}
823
 
824
//--------------------------------------------------------------
825
void Servo_rev(void)
826
{ uint16_t tmp_val;
827
        uint8_t tmp_tracking;
828
        lcd_puts_at(0, 2, strGet(SERVO_REVERSE),0);
829
        lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
830
        tmp_tracking = Servo_tmp_on(SERVO_PERIODE);
831
        tmp_val = Config.servo[servo_nr].rev;
832
        if (Change_Value(&tmp_val , 0, 1, Displ_Off_On))
833
          { //reverse gibt es nur 0=off, 1=on
834
            Config.servo[servo_nr].rev = tmp_val ;
835
                servoSet_rev(servo_nr, tmp_val );
836
          }
837
        Servo_tmp_Original(tmp_tracking);
838
}
839
 
840
 
841
void Menu_Servotext(void)
842
{
843
  lcd_cls ();
844
  if (servo_nr == 0)
845
  lcd_puts_at(0, 0, strGet(SERVO1_TEXT), 2);
846
  else
847
    lcd_puts_at(0, 0, strGet(SERVO2_TEXT), 2);
848
 
849
}
850
 
851
 
852
void Menu_Servo_rev(void)
853
{
854
        Menu_Servotext();
855
        Servo_rev();
856
}
857
/********************************************************************************/
858
/*      zeigt Servo-Anschlagposition links auf Display an                       */
859
/*      mit sofortiger Wirkung auf Servo                                        */
860
/*      Parameter:                                                              */
861
/*      uint16_t val            :anzuzeigender Wert,                            */
862
/*      uint16_t wegen Vereinheitlichung f. Funktionsaufrauf                    */
863
/*                                                                              */
864
/********************************************************************************/
865
void Displ_Servo_Min(uint16_t val)
866
{ uint16_t steps = 0;
867
 
868
//        Displ_Format_Int(val);
869
        write_ndigit_number_s (16, 2, val, 5, 0,0);
870
        servoSet_min(servo_nr, val);                                                    // Wert setzen damit nachfolgend die
871
        if (Config.servo[servo_nr].rev) steps = ServoSteps();
872
        servoSetPosition(servo_nr, steps);                                              // Änderung direkt am Servo sichtbar ist
873
}
874
 
875
/************************************************************************************/
876
/*      zeigt Servo-Anschlagposition rechts auf Display an                                                                                                                      */
877
/*      mit sofortiger Wirkung auf Servo                                                                                                                                                                                                */
878
/*      Parameter:                                                                                                                                                                                                                                                                                      */
879
/*      uint16_t val                            :anzuzeigender Wert,                                                                                                                                                            */
880
/*      uint16_t wegen Vereinheitlichung f. Funktionsaufrauf                           */
881
/*                                                                                                                                                                                                                                                                                                                          */
882
/************************************************************************************/
883
void Displ_Servo_Max(uint16_t val)
884
{ uint16_t steps = ServoSteps();
885
 
886
//        Displ_Format_Int(val);
887
        write_ndigit_number_u (16, 2, val, 5, 0,0);
888
        servoSet_max(servo_nr, val);                                                    // Wert setzen damit nachfolgend die
889
        if (Config.servo[servo_nr].rev) steps = 0;
890
        servoSetPosition(servo_nr, steps);                                              // Änderung direkt am Servo sichtbar ist
891
}
892
 
893
/************************************************************************************/
894
/*      zeigt Servo-Anschlagposition Mitte auf Display an                                                                                                                               */
895
/*      mit sofortiger Wirkung auf Servo                                                                                                                                                                                                */
896
/*      Parameter:                                                                                                                                                                                                                                                                                      */
897
/*      uint16_t val                            :anzuzeigender Wert,                                                                                                                                                            */
898
/*      uint16_t wegen Vereinheitlichung f. Funktionsaufrauf                           */
899
/*                                                                                                                                                                                                                                                                                                                                      */
900
/************************************************************************************/
901
void Displ_Servo_Mid(uint16_t val)
902
{ int16_t mid_val;
903
 
904
        mid_val = val - ServoSteps()/2;
905
//        lcdPuts(my_itoa(mid_val, 4, 0, 0));
906
        lcd_puts_at(16,2,my_itoa(mid_val, 4, 0, 0),0);
907
 
908
        servoSet_mid(servo_nr, val);                    // Wert setzen damit nachfolgend die
909
        servoSetPosition(servo_nr, ServoSteps()/2);     // Änderung direkt am Servo sichtbar ist
910
}
911
 
912
 
913
void Servo_left(void)
914
{ uint16_t tmp_val;
915
        uint8_t tmp_tracking;
916
        lcd_puts_at(0, 2, strGet(SERVO_LEFT),0);
917
        lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
918
        tmp_tracking = Servo_tmp_on(SERVO_PERIODE);
919
        servoSetPosition(servo_nr, ServoSteps());                               // Linkssanschlag um Kalibrierung am Servo zu sehen
920
        tmp_val = Config.servo[servo_nr].max;
921
//        if (Change_Value(&tmp_val, servo_limit[sIdxSteps][LEFT].min, servo_limit[sIdxSteps][LEFT].max, 6|(1<<V_REPEAT), Displ_Servo_Max)) { // pmenu global
922
            if (Change_Value(&tmp_val , servo_limit[Config.sIdxSteps][LEFT].min, servo_limit[Config.sIdxSteps][LEFT].max, Displ_Servo_Max))
923
                {
924
                Config.servo[servo_nr].max = tmp_val;
925
//                eeprom_write_block(&servo[servo_nr],&ep_servo[servo_nr],sizeof(servo_t));
926
                servoSet_mid(servo_nr, Config.servo[servo_nr].mid);            // Mittelposition muss sich bei Ausschlagsänderung verschieben
927
//                Double_Beep(DBEEPWR, DBEEPWRP);
928
                 }
929
        Servo_tmp_Original(tmp_tracking);
930
}
931
 
932
void Menu_Servo_left(void)
933
{
934
//        Displ_Title(MSG_CALIB1_LEFT);
935
         Menu_Servotext();
936
         Servo_left();
937
 
938
}
939
 
940
 
941
void Servo_right(void)
942
{ uint16_t tmp_val;
943
        uint8_t tmp_tracking;
944
        lcd_puts_at(0, 2, strGet(SERVO_RIGTH),0);
945
        lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
946
        tmp_tracking = Servo_tmp_on(SERVO_PERIODE);
947
        servoSetPosition(servo_nr, 0);                                                                          // Rechtsanschlag um Kalibrierung am Servo zu sehen
948
        tmp_val = Config.servo[servo_nr].min;
949
//        if (Change_Value(&tmp_val, servo_limit[sIdxSteps][RIGHT].min, servo_limit[sIdxSteps][RIGHT].max, 6|(1<<V_REPEAT), Displ_Servo_Min)) { // pmenu global
950
            if (Change_Value(&tmp_val , servo_limit[Config.sIdxSteps][RIGHT].min, servo_limit[Config.sIdxSteps][RIGHT].max, Displ_Servo_Min))
951
                {Config.servo[servo_nr].min = tmp_val;
952
   //             eeprom_write_block(&servo[servo_nr],&ep_servo[servo_nr],sizeof(servo_t));
953
                servoSet_mid(servo_nr, Config.servo[servo_nr].mid);            // Mittelposition muss sich bei Ausschlagsänderung verschieben
954
  //              Double_Beep(DBEEPWR, DBEEPWRP);
955
        }
956
         Servo_tmp_Original(tmp_tracking);
957
}
958
 
959
void Menu_Servo_rigth(void)
960
{
961
        Menu_Servotext();
962
        Servo_right();
963
}
964
 
965
void Servo_middle(void)
966
{ uint16_t tmp_val;
967
        uint8_t tmp_tracking;
968
        lcd_puts_at(0, 2, strGet(SERVO_MID),0);
969
        lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
970
        tmp_tracking = Servo_tmp_on(SERVO_PERIODE);
971
        servoSetPosition(servo_nr, ServoSteps()/2);                     // Mittelposition um Kalibrierung am Servo zu sehen
972
        tmp_val = Config.servo[servo_nr].mid;
973
//        if (Change_Value(&tmp_val, servo_limit[sIdxSteps][MIDDLE].min, servo_limit[sIdxSteps][MIDDLE].max, 5|(1<<V_REPEAT), Displ_Servo_Mid)) { // pmenu global
974
            if (Change_Value(&tmp_val , servo_limit[Config.sIdxSteps][MIDDLE].min, servo_limit[Config.sIdxSteps][MIDDLE].max, Displ_Servo_Mid))
975
                { Config.servo[servo_nr].mid = tmp_val;
976
//                eeprom_write_block(&servo[servo_nr], &ep_servo[servo_nr], sizeof(servo_t));
977
//                Double_Beep(DBEEPWR, DBEEPWRP);
978
        }
979
        Servo_tmp_Original(tmp_tracking);
980
}
981
 
982
void Menu_Servo_mid(void)
983
{
984
        Menu_Servotext();
985
        Servo_middle();
986
}
987
 
988
 
989
void Servo_NewValues(uint8_t idx_presc)
990
{
991
        for (uint8_t i = 0; i < SERVO_NUM_CHANNELS; i++) {
992
                if (idx_presc == STEPS_255) {                   // Werte umrechnen für Prescaler = 256
993
                    Config.servo[i].min /= 4;
994
                    Config.servo[i].max /= 4;
995
                    Config.servo[i].mid /= 4;
996
                }
997
                else {                                                                                                          // Werte umrechnen für Prescaler = 64
998
                    Config.servo[i].min *= 4;
999
                    Config.servo[i].max *= 4;
1000
                    Config.servo[i].mid    = (Config.servo[i].mid + 1) * 4 - 1;
1001
                }
1002
                servoSet_min(i, Config.servo[i].min);
1003
                servoSet_max(i, Config.servo[i].max);
1004
                servoSet_mid(i, Config.servo[i].mid);
1005
//                eeprom_write_block(&servo[i],&ep_servo[i],sizeof(servo_t));
1006
        }
1007
        // Vorberechnung von ServoChannels[channel].duty
1008
        servoSetDefaultPos();                                                           // Ausgangsstellung beider Servos
1009
 
1010
}
1011
 
1012
/************************************************************************************/
1013
/*      zeigt Servoschritte zur Auswahl auf Display an                                                                                                                                  */
1014
/*      Parameter:                                                                                                                                                                                                                                                                                      */
1015
/*      uint16_t val                            :0 = 255 oder 1 = 1023,                                                                                                                                                 */
1016
/*                                                                                       uint16_t wegen Vereinheitlichung f. Funktionsaufrauf                           */
1017
/*                                                                                                                                                                                                                                                                                                                                      */
1018
/************************************************************************************/
1019
void Displ_Servo_Steps(uint16_t val)
1020
{
1021
        if (val==0)
1022
        lcd_puts_at(16,2,INTERNAT_STEPS_255,0 );
1023
        else
1024
          lcd_puts_at(16,2,INTERNAT_STEPS_1023,0 );
1025
 
1026
}
1027
 
1028
void Menu_Servo_Steps(void)
1029
{ uint16_t tmp_val;
1030
 
1031
        lcd_cls ();
1032
        lcd_puts_at(0, 0, strGet(SERVOSTEPS), 2);
1033
        lcd_puts_at(0, 2, strGet(SERVOSTEPS),0);
1034
        lcd_puts_at(0, 7, strGet(KEYLINE2), 0);
1035
 
1036
        tmp_val = Config.sIdxSteps;
1037
        if (Change_Value(&tmp_val, STEPS_255, STEPS_1023,Displ_Servo_Steps))
1038
          {
1039
                cli();
1040
                Config.sIdxSteps = tmp_val;
1041
 
1042
                Servo_NewValues(Config.sIdxSteps);                             // hier ist der neue Index anzugeben!
1043
                servoInit(SERVO_PERIODE);
1044
                sei();
1045
 
1046
 
1047
        }
1048
 
1049
}
1050
 
1051
void adjust_servo_menu(uint8_t servo)
1052
{
1053
 
1054
//      uint8_t ii = 0;
1055
//      uint8_t Offset = 0;
1056
//      uint8_t dmode = 0;
1057
        uint8_t target_pos = 1;
1058
//      uint8_t val = 0;
1059
        char ServoNr;
1060
        servo_nr = servo;
1061
        if (servo_nr == 0) ServoNr = '1'; else ServoNr = '2';
1062
 
1063
 
1064
        while(1)
1065
        {
1066
                size = ITEMS_SERVOADJUST;
1067
                lcd_cls ();
1068
                lcd_printpns_at(0, 0, PSTR("adjust  servo "), 2);
1069
                lcd_putc (18, 0, ServoNr, 2);
1070
                lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
1071
//              while(2)
1072
//              {
1073
//                      ii = 0;
1074
//                      if(Offset > 0)
1075
//                      {
1076
//                              lcd_printp_at(1,1, PSTR("\x12"), 0);
1077
//                      }
1078
//                      for(ii = 0;ii < 6 ; ii++)
1079
//                      {
1080
//                              if((ii+Offset) < size)
1081
//                              {
1082
//                                      lcd_printp_at(3,ii+1,servo_adjust_menuitems[ii+Offset][Config.DisplayLanguage], 0);
1083
//                              }
1084
//                              if((ii == 5)&&(ii+Offset < (size-1)))
1085
//                              {
1086
//                                      lcd_printp_at(1,6, PSTR("\x13"), 0);
1087
//                              }
1088
//                      }
1089
//                      if(dmode == 0)
1090
//                      {
1091
//                              if(Offset == 0)
1092
//                              {
1093
//                                      if(size > 6)
1094
//                                      {
1095
//                                              val = menu_choose2 (1, 5, target_pos,0,1);
1096
//                                      }
1097
//                                      else
1098
//                                      {
1099
//                                              val = menu_choose2 (1, size, target_pos,0,0);
1100
//                                      }
1101
//                              }
1102
//                              else
1103
//                              {
1104
//                                      val = menu_choose2 (2, 5, target_pos,1,1);
1105
//                              }
1106
//                      }
1107
//                      if(dmode == 1)
1108
//                      {
1109
//                              if(Offset+7 > size)
1110
//                              {
1111
//                                      val = menu_choose2 (2, 6, target_pos,1,0);
1112
//                              }
1113
//                              else
1114
//                              {
1115
//                                      val = menu_choose2 (2, 5, target_pos,1,1);
1116
//                              }
1117
//                      }
1118
//                      if(val == 254)
1119
//                      {
1120
//                              Offset++;
1121
//                              dmode = 1;
1122
//                              target_pos = 5;
1123
//                      }
1124
//                      else if(val == 253)
1125
//                      {
1126
//                              Offset--;
1127
//                              dmode = 0;
1128
//                              target_pos = 2;
1129
//                      }
1130
//                      else if(val == 255)
1131
//                      {
1132
//                              if (edit == 1)
1133
//                                     {
1134
//
1135
////                                     WriteParameter();
1136
//                                       edit = 0;
1137
//                                       return;
1138
//                                      }
1139
//                              return;
1140
//                      }
1141
//                      else
1142
//                      {
1143
//                              break;
1144
//                      }
1145
//              }
1146
                val = menu_select(servo_adjust_menuitems,size,target_pos);
1147
                if (val==255) break;
1148
                target_pos = val;
1149
 
1150
//                    {"Reverse          ","reverse          ","reverse          "},
1151
//                    {"Links            ","left             ","left             "},
1152
//                    {"Rechts           ","right            ","rigth            "},
1153
//                    {"Mitte            ","middle           ","middle           "},
1154
 
1155
 
1156
 
1157
                if(val == 1 )
1158
                  {
1159
                    Menu_Servo_rev();
1160
 
1161
                  }
1162
 
1163
                if(val == 2 )
1164
                  {
1165
                    Menu_Servo_left();
1166
                  }
1167
 
1168
                if(val == 3 )
1169
                  {
1170
                    Menu_Servo_rigth();
1171
                  }
1172
 
1173
                if(val == 4 )
1174
                  {
1175
                    Menu_Servo_mid();
1176
                  }
1177
 
1178
 
1179
 
1180
        }
1181
}
1182
 
1183
//--------------------------------------------------------------
1184
 
1185
void servo_menu(void)
1186
{
1187
 
1188
//      uint8_t ii = 0;
1189
//      uint8_t Offset = 0;
1190
//      uint8_t dmode = 0;
1191
        uint8_t target_pos = 1;
1192
//      uint8_t val = 0;
1193
        edit =0;
1194
 
1195
        while(1)
1196
        {
1197
                size = ITEMS_SERVO;
1198
                lcd_cls ();
1199
                lcd_printpns_at(0, 0, PSTR("servo_menu"), 2);
1200
//              lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
1201
                lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
1202
//              while(2)
1203
//              {
1204
//                      ii = 0;
1205
//                      if(Offset > 0)
1206
//                      {
1207
//                              lcd_printp_at(1,1, PSTR("\x12"), 0);
1208
//                      }
1209
//                      for(ii = 0;ii < 6 ; ii++)
1210
//                      {
1211
//                              if((ii+Offset) < size)
1212
//                              {
1213
//                                      lcd_printp_at(3,ii+1,servo_menuitems[ii+Offset][Config.DisplayLanguage], 0);
1214
//                              }
1215
//                              if((ii == 5)&&(ii+Offset < (size-1)))
1216
//                              {
1217
//                                      lcd_printp_at(1,6, PSTR("\x13"), 0);
1218
//                              }
1219
//                      }
1220
//                      if(dmode == 0)
1221
//                      {
1222
//                              if(Offset == 0)
1223
//                              {
1224
//                                      if(size > 6)
1225
//                                      {
1226
//                                              val = menu_choose2 (1, 5, target_pos,0,1);
1227
//                                      }
1228
//                                      else
1229
//                                      {
1230
//                                              val = menu_choose2 (1, size, target_pos,0,0);
1231
//                                      }
1232
//                              }
1233
//                              else
1234
//                              {
1235
//                                      val = menu_choose2 (2, 5, target_pos,1,1);
1236
//                              }
1237
//                      }
1238
//                      if(dmode == 1)
1239
//                      {
1240
//                              if(Offset+7 > size)
1241
//                              {
1242
//                                      val = menu_choose2 (2, 6, target_pos,1,0);
1243
//                              }
1244
//                              else
1245
//                              {
1246
//                                      val = menu_choose2 (2, 5, target_pos,1,1);
1247
//                              }
1248
//                      }
1249
//                      if(val == 254)
1250
//                      {
1251
//                              Offset++;
1252
//                              dmode = 1;
1253
//                              target_pos = 5;
1254
//                      }
1255
//                      else if(val == 253)
1256
//                      {
1257
//                              Offset--;
1258
//                              dmode = 0;
1259
//                              target_pos = 2;
1260
//                      }
1261
//                      else if(val == 255)
1262
//                      {
1263
//                          if (edit == 1)
1264
//                               {
1265
////                                 WriteParameter();
1266
//                                 edit = 0;
1267
//                                 return;
1268
//                                }
1269
//                            return;
1270
//                      }
1271
//                      else
1272
//                      {
1273
//                              break;
1274
//                      }
1275
//              }
1276
                val = menu_select(servo_menuitems,size,target_pos);
1277
                if (val==255) break;
1278
                target_pos = val;
1279
//              Edit_generic(uint8_t Value, uint8_t min, uint8_t max,uint8_t Text, uint8_t what
1280
//                if(val == 1 ) sIdxSteps=Edit_generic (sIdxSteps, STEPS_255, STEPS_1023,SERVOSTEPS,0);
1281
 
1282
                if(val == 1 ) Menu_Servo_Steps();
1283
                if(val == 2 )
1284
                  adjust_servo_menu(0);
1285
                if(val == 3 )
1286
                  adjust_servo_menu(1);
1287
                if(val == 4 )
1288
                  test_servo_menu();
1289
        }
1290
}
1291
 
1292
//--------------------------------------------------------------
1293
 
1294
 
1295
//--------------------------------------------------------------
1296
 
1297
//void start_tracking(void)
1298
//{
1299
//      #define TIMEOUT 200     // 2 sec
1300
//
1301
//      uint16_t old_anglePan = 0;
1302
//      uint16_t old_angleTilt = 0;
1303
//
1304
//      //uint16_t old_hh = 0;
1305
//      uint8_t flag;
1306
//      uint8_t tmp_dat;
1307
//
1308
//      lcd_cls ();
1309
//      //lcd_printpns_at(0, 0, PSTR("start_tracking   "), 2);
1310
//
1311
//      //lcd_printpns_at(0, 1, PSTR("ab jetzt Tracking"), 0);
1312
//
1313
//      lcd_ecircle(22, 35, 16, 1);
1314
//      lcd_ecircle(88, 35, 16, 1);
1315
//      lcd_putc (10, 1, 0x1e, 0);      // degree symbol
1316
//      lcd_putc (20, 1, 0x1e, 0);      // degree symbol
1317
////    lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
1318
//        lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
1319
//      SwitchToNC();
1320
//
1321
//      mode = 'O';
1322
//
1323
//      // disable debug...
1324
//      //      RS232_request_mk_data (0, 'd', 0);
1325
//      tmp_dat = 0;
1326
//      SendOutData ('d', ADDRESS_ANY, 1, &tmp_dat, 1);
1327
//
1328
//      // request OSD Data from NC every 100ms
1329
//      //      RS232_request_mk_data (1, 'o', 100);
1330
//      tmp_dat = 10;
1331
//      SendOutData ('o', ADDRESS_NC, 1, &tmp_dat, 1);
1332
//
1333
//      if (rxd_buffer_locked)
1334
//              {
1335
//                      timer = TIMEOUT;
1336
//                      Decode64 ();
1337
//                      naviData = (NaviData_t *) pRxData;
1338
//
1339
//                      if(error1 == 1)
1340
//                              lcd_cls();
1341
//              }
1342
//
1343
//      GPS_Pos_t currpos;
1344
//      currpos.Latitude = naviData->CurrentPosition.Latitude;
1345
//      currpos.Longitude = naviData->CurrentPosition.Longitude;
1346
//
1347
//      flag = 0;
1348
//      timer = TIMEOUT;
1349
//      abo_timer = ABO_TIMEOUT;
1350
//
1351
//      coldstart = 1;
1352
//
1353
//      do
1354
//      {
1355
//              if (rxd_buffer_locked)
1356
//              {
1357
//                      timer = TIMEOUT;
1358
//                      Decode64 ();
1359
//                      naviData = (NaviData_t *) pRxData;
1360
//
1361
//
1362
////CB                  uint8_t FCStatusFlag = naviData->FCFlags;
1363
//                        uint8_t FCStatusFlag = naviData->FCStatusFlags;
1364
//                      //write_ndigit_number_u (0, 0, FCStatusFlag);
1365
//
1366
//                      Tracking_GPS();
1367
//
1368
//                      //uint16_t heading_home = (naviData->HomePositionDeviation.Bearing + 360 - naviData->CompassHeading) % 360;
1369
//
1370
//                      // alte Linien löschen
1371
//                      //lcd_ecirc_line (22, 35, 15, old_hh, 0);
1372
//                      //old_hh = heading_home;
1373
//                      lcd_ecirc_line (22, 35, 15, old_anglePan, 0);
1374
//                      old_anglePan = anglePan;
1375
//                      lcd_ecirc_line (88, 35, 15, old_angleTilt, 0);
1376
//                      old_angleTilt = angleTilt;
1377
//
1378
//                      lcd_ecirc_line (22, 35, 15, anglePan, 1);
1379
//                      write_ndigit_number_u (7, 1, anglePan, 3, 0,0);
1380
//                      lcd_ecirc_line (88, 35, 15, angleTilt, 1);
1381
//                      write_ndigit_number_u (17, 1, angleTilt, 3, 0,0);
1382
//
1383
//                      rxd_buffer_locked = FALSE;
1384
//
1385
//                      if (!abo_timer)
1386
//                      {       // renew abo every 3 sec
1387
//                              // request OSD Data from NC every 100ms
1388
//                              //      RS232_request_mk_data (1, 'o', 100);
1389
//                              tmp_dat = 10;
1390
//                              SendOutData ('o', ADDRESS_NC, 1, &tmp_dat, 1);
1391
//
1392
//                              abo_timer = ABO_TIMEOUT;
1393
//                      }
1394
//              }
1395
//
1396
//              if (!timer)
1397
//          {
1398
//                      OSD_Timeout(flag);
1399
//              flag = 0;
1400
//          }
1401
//      }
1402
//      while(!get_key_press (1 << KEY_ESC));
1403
//
1404
//      //lcd_cls();
1405
//      //return;
1406
//}
1407
 
1408
//--------------------------------------------------------------
1409
//
1410
//void conect2at_unit(void)
1411
//{
1412
//      lcd_cls ();
1413
//      lcd_printpns_at(0, 0, PSTR("conect2at_unit   "), 2);
1414
//
1415
//      lcd_printpns_at(0, 3, PSTR("work in progress ;)"), 2);
1416
//
1417
////    lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
1418
//        lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
1419
//
1420
//      while(!get_key_press (1 << KEY_ESC));
1421
//
1422
//      lcd_cls();
1423
//      return;
1424
//}
1425
//
1426
////--------------------------------------------------------------
1427
//
1428
//void conect2gps_ser (void)
1429
//{
1430
//      lcd_cls ();
1431
//      lcd_printpns_at(0, 0, PSTR("conect2gps_ser   "), 2);
1432
//
1433
//      lcd_printpns_at(0, 3, PSTR("work in progress ;)"), 2);
1434
//
1435
////    lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
1436
//        lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
1437
//      while(!get_key_press (1 << KEY_ESC));
1438
//
1439
//      lcd_cls();
1440
//      return;
1441
//}
1442
//
1443
////--------------------------------------------------------------
1444
//
1445
//void conect2gps_bt (void)
1446
//{
1447
//      lcd_cls ();
1448
//      lcd_printpns_at(0, 0, PSTR("conect2gps_bt    "), 2);
1449
//
1450
//      lcd_printpns_at(0, 3, PSTR("work in progress ;)"), 2);
1451
//
1452
////    lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
1453
//        lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
1454
//      while(!get_key_press (1 << KEY_ESC));
1455
//
1456
//      lcd_cls();
1457
//      return;
1458
//}
1459
 
1460
//--------------------------------------------------------------
1461
 
1462
//void conect2gps_menu(void)
1463
//{
1464
//      uint8_t ii = 0;
1465
//      uint8_t Offset = 0;
1466
//      uint8_t size = ITEMS_CONECT_GPS;
1467
//      uint8_t dmode = 0;
1468
//      uint8_t target_pos = 1;
1469
//      uint8_t val = 0;
1470
//
1471
//      while(1)
1472
//      {
1473
//              lcd_cls ();
1474
//              lcd_printpns_at(0, 0, PSTR("conect2gps_menu  "), 2);
1475
////            lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
1476
//                lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
1477
//              while(2)
1478
//              {
1479
//                      ii = 0;
1480
//                      if(Offset > 0)
1481
//                      {
1482
//                              lcd_printp_at(1,1, PSTR("\x12"), 0);
1483
//                      }
1484
//                      for(ii = 0;ii < 6 ; ii++)
1485
//                      {
1486
//                              if((ii+Offset) < size)
1487
//                              {
1488
//                                      lcd_printp_at(3,ii+1,conect_gps_menuitems[ii+Offset], 0);
1489
//                              }
1490
//                              if((ii == 5)&&(ii+Offset < (size-1)))
1491
//                              {
1492
//                                      lcd_printp_at(1,6, PSTR("\x13"), 0);
1493
//                              }
1494
//                      }
1495
//                      if(dmode == 0)
1496
//                      {
1497
//                              if(Offset == 0)
1498
//                              {
1499
//                                      if(size > 6)
1500
//                                      {
1501
//                                              val = menu_choose2 (1, 5, target_pos,0,1);
1502
//                                      }
1503
//                                      else
1504
//                                      {
1505
//                                              val = menu_choose2 (1, size, target_pos,0,0);
1506
//                                      }
1507
//                              }
1508
//                              else
1509
//                              {
1510
//                                      val = menu_choose2 (2, 5, target_pos,1,1);
1511
//                              }
1512
//                      }
1513
//                      if(dmode == 1)
1514
//                      {
1515
//                              if(Offset+7 > size)
1516
//                              {
1517
//                                      val = menu_choose2 (2, 6, target_pos,1,0);
1518
//                              }
1519
//                              else
1520
//                              {
1521
//                                      val = menu_choose2 (2, 5, target_pos,1,1);
1522
//                              }
1523
//                      }
1524
//                      if(val == 254)
1525
//                      {
1526
//                              Offset++;
1527
//                              dmode = 1;
1528
//                              target_pos = 5;
1529
//                      }
1530
//                      else if(val == 253)
1531
//                      {
1532
//                              Offset--;
1533
//                              dmode = 0;
1534
//                              target_pos = 2;
1535
//                      }
1536
//                      else if(val == 255)
1537
//                      {
1538
//                              return;
1539
//                      }
1540
//                      else
1541
//                      {
1542
//                              break;
1543
//                      }
1544
//              }
1545
//              target_pos = val;
1546
//
1547
//              if((val+Offset) == 1 )
1548
//                      conect2gps_ser();
1549
//              if((val+Offset) == 2 )
1550
//                      conect2gps_bt();
1551
//      }
1552
//}
1553
//--------------------------------------------------------------
1554
//void tracking_menu(void)
1555
//{
1556
//      uint8_t ii = 0;
1557
//      uint8_t Offset = 0;
1558
//      uint8_t size = ITEMS_AT;
1559
//      uint8_t dmode = 0;
1560
//      uint8_t target_pos = 1;
1561
//      uint8_t val = 0;
1562
//
1563
//      while(1)
1564
//      {
1565
//              lcd_cls ();
1566
//              lcd_printpns_at(1, 0, PSTR("Tracking Men\x06 V.01    "), 2);
1567
////            lcd_printp_at (0, 7, PSTR(KEY_LINE_1), 0);
1568
//                lcd_puts_at(0, 7, strGet(KEYLINE1), 0);
1569
//              while(2)
1570
//              {
1571
//                      ii = 0;
1572
//                      if(Offset > 0)
1573
//                      {
1574
//                              lcd_printp_at(1,1, PSTR("\x12"), 0);
1575
//                      }
1576
//                      for(ii = 0;ii < 6 ; ii++)
1577
//                      {
1578
//                              if((ii+Offset) < size)
1579
//                              {
1580
//                                      lcd_printp_at(3,ii+1,at_menuitems[ii+Offset], 0);
1581
//                              }
1582
//                              if((ii == 5)&&(ii+Offset < (size-1)))
1583
//                              {
1584
//                                      lcd_printp_at(1,6, PSTR("\x13"), 0);
1585
//                              }
1586
//                      }
1587
//                      if(dmode == 0)
1588
//                      {
1589
//                              if(Offset == 0)
1590
//                              {
1591
//                                      if(size > 6)
1592
//                                      {
1593
//                                              val = menu_choose2 (1, 5, target_pos,0,1);
1594
//                                      }
1595
//                                      else
1596
//                                      {
1597
//                                              val = menu_choose2 (1, size, target_pos,0,0);
1598
//                                      }
1599
//                              }
1600
//                              else
1601
//                              {
1602
//                                      val = menu_choose2 (2, 5, target_pos,1,1);
1603
//                              }
1604
//                      }
1605
//                      if(dmode == 1)
1606
//                      {
1607
//                              if(Offset+7 > size)
1608
//                              {
1609
//                                      val = menu_choose2 (2, 6, target_pos,1,0);
1610
//                              }
1611
//                              else
1612
//                              {
1613
//                                      val = menu_choose2 (2, 5, target_pos,1,1);
1614
//                              }
1615
//                      }
1616
//                      if(val == 254)
1617
//                      {
1618
//                              Offset++;
1619
//                              dmode = 1;
1620
//                              target_pos = 5;
1621
//                      }
1622
//                      else if(val == 253)
1623
//                      {
1624
//                              Offset--;
1625
//                              dmode = 0;
1626
//                              target_pos = 2;
1627
//                      }
1628
//                      else if(val == 255)
1629
//                      {
1630
//                              return;
1631
//                      }
1632
//                      else
1633
//                      {
1634
//                              break;
1635
//                      }
1636
//              }
1637
//              target_pos = val;
1638
//
1639
//              if((val+Offset) == 1 )
1640
//                      test_servo_menu();
1641
//              if((val+Offset) == 2 )
1642
//                      adjust_servo_menu();
1643
//              if((val+Offset) == 3 )
1644
//                      show_angle();
1645
//              if((val+Offset) == 4 )
1646
////TODO:                       start_tracking();
1647
//              if((val+Offset) == 5 )
1648
//                      conect2at_unit();
1649
//              if((val+Offset) == 6 )
1650
//                      conect2gps_menu();
1651
//      }
1652
//}
1653
 
1654
//--------------------------------------------------------------
1655
// kapeschi Ant.Treking Funktionen 
1656
//--------------------------------------------------------------
1657
 
1658
// Berechnung von Distanz und Winkel aus GPS-Daten home(MK eingeschaltet) 
1659
// zur aktuellen Position(nach Motorstart)
1660
//geo_t calc_geo(HomePos_t *home, GPS_Pos_t *pos)
1661
//{ int32_t lat1, lon1, lat2, lon2;
1662
//      int32_t d1, dlat;
1663
//      geo_t geo;
1664
//
1665
//      lon1 = MK_pos.Home_Lon;
1666
//      lat1 = MK_pos.Home_Lat;
1667
//      lon2 = pos->Longitude;
1668
//      lat2 = pos->Latitude;
1669
//
1670
//      // Formel verwendet von http://www.kompf.de/gps/distcalc.html
1671
//      // 111.3 km = Abstand zweier Breitenkreise und/oder zweier Längenkreise am Äquator
1672
//      // es wird jedoch in dm Meter weiter gerechnet
1673
//      // (tlon1 - tlon2)/10) sonst uint32_t-Überlauf bei cos(0) gleich 1
1674
//      d1       = (1359 * (int32_t)(c_cos_8192((lat1 + lat2) / 20000000)) * ((lon1 - lon2)/10))/ 10000000;
1675
//      dlat = 1113 * (lat1 - lat2) / 10000;
1676
//      geo.bearing = (my_atan2(d1, dlat) + 540) % 360; // 360 +180 besserer Vergleich mit MkCockpit
1677
//      geo.distance = sqrt32(d1 * d1 + dlat * dlat);
1678
//      return(geo);
1679
//}
1680
 
1681
//void do_tracking(void)
1682
//{     //static uint8_t hysteresis = 0;
1683
//      // aus MkCockpit http://forum.mikrokopter.de/topic-post216136.html#post216136
1684
//      // (4 * (........))/5 ==> Wichtung Luftdruck-Höhe zu GPS
1685
//      currentPos.Altitude = MK_pos.Home_Alt + (4000 * (int32_t)(naviData->Altimeter) / AltFaktor + currentPos.Altitude - MK_pos.Home_Alt) / 5;
1686
//
1687
//      geo = calc_geo(&MK_pos, &currentPos);
1688
//      angleTilt = RAD_TO_DEG * (double)atan2((double)(currentPos.Altitude - MK_pos.Home_Alt) / 1000, geo.distance);
1689
//      //if (geo.distance < 4 || (geo.distance < 6 && hysteresis)) {           // < 4m ==> Pan-Servo in Mittelstellung. Hysterese bis 6m, damit Servo im Grenzbereich nicht wild rumschlägt
1690
//              //geo.bearing = MK_pos.direction;
1691
//              //angleTilt = 0;
1692
//              //hysteresis = 1;
1693
//      //}
1694
//      //else {
1695
//              //hysteresis = 0;
1696
//      //}
1697
////
1698
//      //// egal wo der Übergangspunkt 359, 360, 1grd ist => Winkelübergangspunkt auf 0 bzw. 180grd des Servos bringen
1699
//      //// 360 grd negative Winkelwerte als positive
1700
//      anglePan = (geo.bearing + 450 - MK_pos.direction) % 360; // 450 = 360 + 90
1701
//
1702
//      //if (angleTilt < 0) angleTilt = 0;
1703
//      //if (angleTilt > 180) angleTilt = 180;
1704
////
1705
//      //if (anglePan >= 180) {                                // zwecks 360grd-Abdeckung flipt Pan-/Tilt-Servo
1706
//              //anglePan = anglePan - 180;
1707
//              //angleTilt = 180 - angleTilt;
1708
//              //
1709
//      //}
1710
////angleTilt = 180;
1711
////angleTilt = 180;
1712
//
1713
////    servoSetAngle(0, anglePan);
1714
////    servoSetAngle(1, angleTilt);
1715
//}
1716
 
1717
 
1718
/****************************************************************/
1719
/*                                                                                                                              */
1720
/*      MK GPS Tracking                                                                                         */
1721
/*                                                                                                                              */
1722
/****************************************************************/
1723
 
1724
// MK OSD-Daten lesen und verifizieren
1725
//uint8_t OSD_Data_valid(NaviData_t **navi_data)
1726
//{ uint8_t ret = 0;
1727
        //char *tx_osd = {"#co?]==EH\r"};
1728
////    char interval[2] = {10, '\0'};
1729
        //
1730
        //if (rx_line_decode('O')) {                                    // OSD-Datensatz prüfen/dekodieren
1731
                ////*navi_data = (NaviData_t*)data_decode;      // dekodierte Daten mit Struktur OSD-Daten versehen
1732
                //if (rx_timeout < RX_TIME_OLD) {                       // GPS-Daten nicht zu alt und ok.
1733
                        //currentPos = (*navi_data)->CurrentPosition;
1734
                        //if ((*navi_data)->NCFlags & NC_FLAG_GPS_OK)
1735
                                //ret = 1;
1736
                        //// aus MkCockpit http://forum.mikrokopter.de/topic-post216136.html#post216136
1737
                        //// (4 * (........))/5 ==> Wichtung Luftdruck-Höhe zu GPS
1738
                        //currentPos.Altitude = MK_pos.Home_Alt + (4000 * (int32_t)((*navi_data)->Altimeter) / AltFaktor + currentPos.Altitude - MK_pos.Home_Alt) / 5;                  
1739
                        //satsInUse = (*navi_data)->SatsInUse;
1740
                //}
1741
        //} 
1742
        //// ca. 210ms keine OSD-Daten empfangen ==> sende neue Anforderung an MK
1743
////    if ((track_tx) && (rx_timeout > RX_TIMEOUT)) tx_Mk(NC_ADDRESS, 'o', interval, 1); //    420 * 0.5ms interval
1744
        //if ((track_tx) && (rx_timeout > RX_TIMEOUT)) SendOutData(tx_osd); // 420 * 0.5ms interval
1745
        //return ret;
1746
//}
1747
//
1748
 
1749
// MK eingeschaltet und GPS-ok, danach Motoren gestartet ==> Berechnung horizontaler/vertikaler Servowinkel
1750
// Hauptprogramm von GPS Antennen-Nachführung
1751
//void Tracking_GPS(void)
1752
//{     //NaviData_t *navidata;
1753
//      static uint8_t track_running = 0;
1754
//
1755
//  if (!track_running)
1756
//  {
1757
//    //track_running = 1;      // verhindert doppelten Aufruf, wenn in Eingabeschleife Menu_MK_BatteryChangeNr() !!!
1758
//              //if (OSD_Data_valid(&naviData)) {
1759
//                      if (coldstart)
1760
//                      {
1761
//                              //// erst nach Neustart NGVideo und beim Motorstart werden Daten vom MK übernommen
1762
//                              //if (naviData->FCFlags & FC_FLAG_MOTOR_START)
1763
//                              //{
1764
//                                      MK_pos.Home_Lon  = (double)naviData->HomePosition.Longitude / 10000000.0;
1765
//                                      MK_pos.Home_Lat  = (double)naviData->HomePosition.Latitude       / 10000000.0;
1766
//                                      MK_pos.Home_Lon7 = naviData->HomePosition.Longitude;
1767
//                                      MK_pos.Home_Lat7 = naviData->HomePosition.Latitude;
1768
//                                      MK_pos.Home_Alt  = naviData->HomePosition.Altitude;
1769
//                                      MK_pos.direction = naviData->CompassHeading;
1770
//                                      coldstart        = 0;
1771
//                              //}
1772
//                      //}
1773
//                      //else {
1774
//                              //do_tracking();
1775
//                      }
1776
//              //}
1777
//              track_running = 0;
1778
//      }
1779
//      do_tracking();
1780
//}