Subversion Repositories Projects

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
962 - 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 <util/delay.h>
14
 
15
#include "config.h"
16
#include "ngvideo.h"
17
#include "keys.h"
18
#include "menue.h"
19
#include "servo.h"
20
#include "messages.c"
21
 
22
typedef uint8_t scr_menu_t[SCROLL_MAIN_MAX + 3]; // einmal, da Index mit 0 beginnt plus Vergrößerung für 2 zusätzlich eingeblendete Punkte 
23
uint8_t m_pkt;          // um bei Rücksprung auf ursprünglichen Arrayeintrag(Menüpunkt) zeigen
24
uint8_t servo_nr;       // zwischen Servo 1 und 2 wird nur mit global servo_nr unterschieden
25
 
26
COMMAND_STRUCTUR COMMAND_TABELLE[] = // Befehls-Tabelle
27
{
28
  {"0",         Menu_Main},
29
  {"01",        Menu_AV_Source},
30
  {"02",        Menu_RX_Channel},
31
  {"03",        Menu_RSSI_Calibr},
32
  {"031",       Menu_RSSI_min},
33
  {"032",       Menu_RSSI_max},
34
  {"04",        Menu_Language},
35
  {"05",        Menu_Servo_Calibr},
36
  {"051",       Menu_Servo_Steps},
37
  {"052",       Menu_Servo1},           // zwischen Servo 1 und 2 wird danach 
38
  {"0521",      Menu_Servo1_rev},       // mit global servo_nr unterschieden
39
  {"0522",      Menu_Servo1_left},     
40
  {"0523",      Menu_Servo1_right},
41
  {"0524",      Menu_Servo1_middle},
42
  {"053",       Menu_Servo2},
43
  {"0531",      Menu_Servo2_rev},
44
  {"0532",      Menu_Servo2_left},
45
  {"0533",      Menu_Servo2_right},
46
  {"0534",      Menu_Servo2_middle},
47
  {"06",        Menu_lcd},
48
  {"061",       Menu_lcd_Contrast},
49
  {"062",       Menu_lcd_Backgr_Light},
50
  {"07",        Menu_Battery},
51
  {"071",       Menu_Low_U_Setup},
52
  {"072",       Menu_U_Offset},
53
  {"08",        Menu_Tracking_Ant},
54
  {"09",        Menu_Tracking_Option},  // wird nur bei Tracking RSSI oder GPS eingeblendet - SCROLL_MAIN_MAX wird geändert
55
  {"0:",        Menu_GPS_Display},      // wird nur bei Tracking GPS eingeblendet           - SCROLL_MAIN_MAX wird geändert
56
  {"0:1",       Menu_GPS_Display_FLAG}, // nach '9' (0x39) folgt ':' (0x3a)
57
  {"0:2",       Menu_GPS_Display_FLAG},  
58
  {"0:3",       Menu_GPS_Display_FLAG},  
59
  {NULL,NULL}
60
};
61
 
62
 
63
uint32_t Change_Value(uint32_t val, uint32_t min_val, uint32_t max_val, uint8_t pos, uint8_t fu_index, uint8_t vrepeat);
64
 
65
void Displ_AV_Source(uint32_t  q);
66
void Displ_Channels(uint32_t  k);
67
void Displ_Set_Contrast(uint32_t val);
68
void Displ_Backgr_Light(uint32_t val);
69
void Displ_U_2Nk(uint32_t u);
70
void Displ_Off_On(uint32_t val);
71
void Displ_Language(uint32_t q);
72
void DISPL_Servo_Steps(uint32_t val);
73
void Displ_Servo_Min(uint32_t val);
74
void Displ_Servo_Max(uint32_t val);
75
void Displ_Servo_Mid(uint32_t val);
76
void Displ_Format_Int(uint32_t val);
77
void Displ_sel_Tracking(uint32_t q);
78
void Displ_track_TX(uint32_t q);
79
void Displ_Baudrate(uint32_t q);
80
typedef void (*Displ_Ptr_Fnct)( uint32_t );
81
Displ_Ptr_Fnct Displ_Fnct[] = {Displ_U_2Nk, Displ_Set_Contrast, Displ_Backgr_Light, Displ_Channels, Displ_AV_Source, \
82
                               Displ_Off_On, Displ_Language, DISPL_Servo_Steps, Displ_Servo_Min, Displ_Servo_Max, \
83
                                                           Displ_Servo_Mid, Displ_Format_Int, Displ_sel_Tracking, Displ_track_TX, Displ_Baudrate};
84
 
85
 
86
/**************************************************************/
87
/*                                                                                                                        */
88
/*                    Steuerung der Menüs                                         */
89
/*                                                                                                                        */
90
/**************************************************************/
91
 
92
/************************************************************************************/
93
/*  sucht nach übergebenen String in der Kommandotabelle und springt zum daneben        */
94
/*  stehenden Menü-Programm                                                                                                                     */
95
/*      Parameter:                                                                                                                                              */
96
/*  char *string_pointer        :zu suchender String in Kommandotabelle                                 */
97
/*                                                                                                                                                                      */
98
/************************************************************************************/
99
void Jump_Menu(char *string_pointer)
100
{
101
  //Stringzeiger;
102
  char *string_pointer_tmp;
103
  unsigned char menu_index = 0;
104
 
105
  if (strlen(string_pointer) > 0)
106
  {
107
    string_pointer_tmp = strsep(&string_pointer,",");
108
    //Kommando in Tabelle suchen
109
    while(strcasecmp(COMMAND_TABELLE[menu_index].menu_nr,string_pointer_tmp))
110
    {
111
      //Abruch Whileschleife und Unterprogramm verlassen
112
      if (COMMAND_TABELLE[++menu_index].menu_nr == 0);
113
    }
114
    COMMAND_TABELLE[menu_index].fp();   //Kommando ausführen
115
  }
116
}
117
 
118
/************************************************************************************/
119
/*                                                                                                                                                                      */
120
/*    Unterprogramm von Scroll_Menu(...) stellt Menüpunkte dar                                          */
121
/*      Parameter:                                                                                                                                              */
122
/*      scr_menu_t scr_menu      : Array mit Strings der Menüanzeige                                            */
123
/*      uint8_t    scr_idx   : ausgewählter Menüpunkt                                                                   */
124
/*      uint8_t    scroll_max: scrollen bis Wert                                                                                */
125
/*                                                                                                                                                                      */
126
/************************************************************************************/
127
void Displ_Scroll_Menu(scr_menu_t scr_menu, uint8_t scr_idx, uint8_t scroll_max)
128
{
129
  uint8_t i;
130
  const uint8_t p = 2; // LCD Beginn x-Position
131
 
132
  if (scr_idx > 0) scr_idx--; else scr_idx = scroll_max;
133
  for (i = 0; i < LCD_LINES; i++) {
134
    lcdGotoXY(p, i);
135
        lcdPuts(Msg(scr_menu[scr_idx]));
136
        // ab Stringende bis zum Zeilenende löschen; LCD löschen flackert sonst zu sehr
137
        for (int8_t n = LCD_COLS - strlen(Msg(scr_menu[scr_idx])) - p; n > 0; n--)
138
          lcdPutc(' ');
139
        if (scr_idx < scroll_max) scr_idx++; else scr_idx = 0;
140
  }
141
}
142
 
143
/************************************************************************************/
144
/*                                                                                                                                                                      */
145
/*    scrollt Menü über Mehrzeilige LCD                                                                                         */
146
/*                                                                                                                                                                      */
147
/*      Taste<Enter> lang springt in Hauptanzeige, kurz geht in den angewälten Menüpunkt*/
148
/*      Taste<+>    eine Zeile nach oben                                                                                                */
149
/*  Taste<->    eine Zeile nach unten                                                                                           */
150
/*      Parameter:                                                                                                                                              */
151
/*      scr_menu_t scr_menu      : Array mit Strings der Menüanzeige                                            */
152
/*      uint8_t    scroll_max: scrollen bis Wert                                                                                */
153
/*      uint8_t    scr_idx       : Index für array von Displ_Scroll_Menu(...)                           */
154
/*                                                                                                                                                                      */
155
/************************************************************************************/
156
//void Scroll_Menu(scr_menu_t scr_menu, uint8_t scroll_max, uint8_t scr_idx, char *str)
157
void Scroll_Menu(scr_menu_t scr_menu, uint8_t scroll_max, uint8_t scr_idx)
158
{ uint8_t l;
159
  uint8_t end = 1;      // false
160
 
161
  // pmenu[1] == '\0' entspricht <wenn Hauptmenue>, da jetzt nur noch Servo x für Scrollemenue (rev,min,max,mid)
162
  if ((pmenu[1] == '\0') && ((tracking == TRACKING_RSSI) || (tracking == TRACKING_GPS) || (tracking == TRACKING_MKCOCKPIT))) {
163
    ++scroll_max;
164
    if (tracking == TRACKING_RSSI) scr_menu[scroll_max] = MSG_TRACK_SERVO_HYTERESE;
165
    if (tracking == TRACKING_GPS) {
166
      scr_menu[scroll_max] = MSG_TRACK_TX_OSD_DATA;
167
          ++scroll_max; // zusätzliche Anzeige zu GPS
168
        }
169
    if (tracking == TRACKING_MKCOCKPIT) scr_menu[scroll_max] = MSG_COM;
170
  }
171
  lcdClear();
172
  lcdGotoXY(0, 1);
173
  lcdPutc(MARKER_SELECT);    // '>>'
174
  Displ_Scroll_Menu(scr_menu, scr_idx, scroll_max);
175
  // bis Menueeingabe bestätigt oder zum vorherigen Menue
176
  while( !Get_Key_Short( 1<<SW_ENTER ) && end)
177
  {
178
    // >> Menueauswahl nach oben
179
        if( Get_Key_Press( 1<<SW_PLUS ) || Get_Key_Rpt( 1<<SW_PLUS ))
180
        {
181
      if (scr_idx > 0) scr_idx--; else scr_idx = scroll_max;
182
          Displ_Scroll_Menu(scr_menu, scr_idx, scroll_max);
183
        }  
184
    // >> Menueauswahl nach unten
185
    if( Get_Key_Press( 1<<SW_MINUS ) || Get_Key_Rpt( 1<<SW_MINUS ))
186
        {
187
          if (scr_idx < scroll_max) scr_idx++; else scr_idx = 0;
188
          Displ_Scroll_Menu(scr_menu, scr_idx, scroll_max);
189
        }
190
        // direkt in das Hauptprogramm
191
        if (Get_Key_Long( 1<<SW_ENTER )) end = 0;
192
        Tasks_unvisible();
193
        // falls Akku leer ==> Menü verlassen und Anzeige __ACCU_LOW
194
        U_Messen_cmp(DISABLE_BTIMER);
195
        if (bat_low == 0) end = 0;
196
  }
197
  lcdClear();
198
  if (end) {
199
    l = strlen(pmenu);
200
    if (scr_idx > 0) {
201
      m_pkt = 1;                                // 0 wäre "zurück", so aber ins Untermenü immer erster Menüpunkt
202
      pmenu[l] = scr_idx + '0'; // nächsten MenueIndex anhängen 1 oder 2 oder ...
203
      pmenu[l + 1] ='\0';
204
          Beep(BEEPENTER);
205
        }
206
        else {
207
          l--;
208
          m_pkt = pmenu[l] - '0';               // um bei Rücksprung auf ursprünglichen Arrayeintrag(Menüpunkt) zeigen
209
          pmenu[l] ='\0';  // auf letztes Zeichen Stringende schreiben
210
          if (l == 0) Displ_Main_Disp();
211
        }
212
  }
213
  else {
214
    pmenu[0] = '\0';
215
        Displ_Main_Disp();
216
  }
217
}
218
 
219
/************************************************************************************/
220
/*                                                                                                                                                                      */
221
/*                      Abfrage Short- oder Long-Enter                                                          */
222
/*        verbleibt in Abfrage bis Enter betätigt; Rückgabe => Short-Enter True/False   */
223
/*                                                                                                                                                                      */
224
/************************************************************************************/
225
uint8_t Short_Enter(void)
226
{ uint8_t ShortEnter = 1;
227
 
228
  // bis Enter
229
  while( !Get_Key_Short( 1<<SW_ENTER ) && (ShortEnter > 0)) {  
230
        // direkt in das Hauptprogramm
231
        if (Get_Key_Long( 1<<SW_ENTER )) {
232
          ShortEnter = 0;
233
          pmenu[0] ='\0';
234
    }
235
        Tasks_unvisible();
236
        // falls Akku leer ==> Menü verlassen und Anzeige __ACCU_LOW
237
        U_Messen_cmp(DISABLE_BTIMER);
238
        if (bat_low == 0) pmenu[0] ='\0';
239
  }
240
  lcdClear();
241
  if (ShortEnter) Beep(BEEPENTER);
242
  if (pmenu[0] == '\0') Displ_Main_Disp();
243
  return(ShortEnter);
244
}
245
 
246
/************************************************************************************/
247
/*                                                                                                                                                                      */
248
/*    Ändern der Werte mit Tasten +,- und Anzeige                                                                       */
249
/*                      z.B. für U-Offset, Batterie leer Eingabe ...                                            */
250
/*                                                                                                                                                                      */
251
/*      Parameter:                                                                                                                                              */
252
/*      uint32_t val                            :zu ändernter Wert                                                                      */
253
/*      uint32_t min_val, max_val       :min, max Grenze Wert ändern darf                                       */
254
/*      uint8_t  posX, posY                     :Darstellung Wert xPos, YPos auf LCD                            */
255
/*      uint8_t  fu_index                       :Index um Adresse der Display Funktion aufzurufen       */
256
/*      uint8_t  cycle                          :0 begrenzt Anzeige bei man_val, bzw. max_val           */
257
/*                                                              :1 springt nach max_val auf min_val und umgedreht       */
258
/*  uint8_t      vrepeat                        :beschleunigte Repeat-Funktion aus/ein                          */
259
/*      uint32_t Change_Value_plmi(...) :Rückgabe geänderter Wert                                               */
260
/*                                                                                                                                                                      */
261
/************************************************************************************/
262
uint32_t Change_Value_plmi(uint32_t val, uint32_t min_val, uint32_t max_val, uint8_t posX, uint8_t posY, \
263
                           uint8_t fu_index, uint8_t cycle, uint8_t vrepeat)
264
{
265
  // >> Menueauswahl nach oben
266
  if( Get_Key_Press( 1<<SW_PLUS ) || Get_Key_Rpt( 1<<SW_PLUS )){
267
    if (val < max_val) {
268
      val++;
269
          Key_Speedup_rpt(vrepeat);     // beschleunigte Repeat-Funktion
270
        }
271
        else
272
          if (cycle) {
273
        val = min_val;
274
        }
275
    lcdGotoXY(posX, posY);              // lcd Position Wert
276
    Displ_Fnct[fu_index](val);  // geänderten Wert darstellen, je nach Menüpunkt
277
  }
278
  // >> Menueauswahl nach unten
279
  if( Get_Key_Press( 1<<SW_MINUS ) || Get_Key_Rpt( 1<<SW_MINUS )) {
280
    if (val > min_val) {
281
      val--;
282
          Key_Speedup_rpt(vrepeat);     // beschleunigte Repeat-Funktion
283
        }
284
        else
285
          if (cycle) {
286
        val = max_val;
287
          }
288
    lcdGotoXY(posX, posY);              // noch einmal lcd Position, sonst zum Teil + und - gleichzeitig, Anzeige verrutscht
289
        Displ_Fnct[fu_index](val);      // geänderten Wert darstellen, je nach Menüpunkt
290
  }
291
  return(val);
292
}
293
 
294
/************************************************************************************/
295
/*                                                                                                                                                                      */
296
/*    Ändern der Werte mit Tasten +,- repetierend; (long)Entertaste und Anzeige         */
297
/*                      z.B. für U-Offset, Batterie leer Eingabe ...                                            */
298
/*                                                                                                                                                                      */
299
/*      Parameter:                                                                                                                                              */
300
/*      uint32_t val                            :zu ändernter Wert                                                                      */
301
/*      uint32_t min_val, max_val       :min, max Grenze Wert ändern darf                                       */
302
/*      uint8_t  pos                            :Darstellung Wert xPos auf LCD                                          */
303
/*      uint8_t  fu_index                       :Index um Adresse der Display Funktion aufzurufen       */
304
/*  uint8_t      vrepeat                        :beschleunigte Repeat-Funktion aus/ein                          */
305
/*      uint32_t Change_Value(...)      :Rückgabe geänderter Wert                                                       */
306
/*                                                                                                                                                                      */
307
/************************************************************************************/
308
uint32_t Change_Value(uint32_t val, uint32_t min_val, uint32_t max_val, uint8_t pos, uint8_t fu_index, \
309
                      uint8_t vrepeat)
310
{ uint8_t l;
311
 
312
  lcdGotoXY(pos, ZLE_VAL);              // Position Wert
313
  Displ_Fnct[fu_index](val);    // initiale Wertdarstellung, je nach Menüpunkt
314
  // bis Menueeingabe bestätigt oder zum vorherigen Menue
315
  while( !Get_Key_Short( 1<<SW_ENTER ) && (strlen(pmenu) > 0))
316
  {
317
    val = Change_Value_plmi(val, min_val, max_val, pos, ZLE_VAL, fu_index, 0, vrepeat);
318
        // direkt in das Hauptprogramm zurück
319
        if (Get_Key_Long( 1<<SW_ENTER )) pmenu[0] ='\0';
320
        Tasks_unvisible();
321
        // falls Akku leer ==> Menü verlassen und Anzeige MSG_ACCU_LOW
322
        U_Messen_cmp(DISABLE_BTIMER);
323
        if (bat_low == 0) pmenu[0] ='\0';
324
  }
325
  lcdClear();
326
  l = strlen(pmenu);
327
  if (l > 0) {
328
    l--;
329
        m_pkt = pmenu[l] - '0'; // um bei Rücksprung auf ursprünglichen Arrayeintrag(Menüpunkt) zeigen
330
        pmenu[l] ='\0';                 // auf letztes Zeichen Stringende schreiben
331
  }
332
  else
333
    Displ_Main_Disp();
334
  return(val);
335
}
336
 
337
 
338
 
339
/**************************************************************/
340
/*                                                                                                                        */
341
/*             LCD-Darstellungen der Menüs                                        */
342
/*      Zur Unterstützung der Auswahl werden einige Einstellungen */
343
/*      sofort ausgeführt. Z.B.: Kontrast, Servo-Endausschlag     */
344
/*                                                                                                                        */
345
/**************************************************************/
346
 
347
/************************************************************************************/
348
/*  stellt eine String mittig auf Display dar                                                                           */
349
/*      Parameter:                                                                                                                                              */
350
/*  char        *str    : darzustellende Zeichenkette                                                                   */
351
/*      uint8_t zle             : Display-Zeile                                                                                                 */
352
/*                                                                                                                                                                      */
353
/************************************************************************************/
354
void Disp_Str_mid(char *str, uint8_t zle)
355
{ int8_t x;
356
 
357
  lcdGotoXY(0,zle);
358
  for (x = 0; x < LCD_COLS; x++) lcdPutc(' '); // Zeile löschen
359
  x = (LCD_COLS - strlen(str))/2;  // Array-String mittig schreiben
360
  lcdGotoXY(x,zle);
361
  lcdPuts(str);
362
}
363
 
364
/************************************************************************************/
365
/*  zeigt Menü-  * Überschrift *  auf erste Zeile mittig auf Display an                         */
366
/*      Parameter:                                                                                                                                              */
367
/*  uint8_t message     : index (MSG_) der darzustellenden Zeichenkette                                 */
368
/*                                                                                                                                                                      */
369
/************************************************************************************/
370
void Disp_Title(uint8_t message)
371
{ uint8_t l;
372
  uint8_t x = 0;
373
 
374
  l = strlen(Msg(message));
375
  if ( LCD_COLS > l) x = (LCD_COLS - l)/2;
376
  if (x > 1) {
377
    lcdGotoXY(x - 2, 0);
378
    lcdPuts("* ");
379
        lcdPuts(Msg(message));
380
    lcdPutc(' ');
381
  }
382
  else {
383
    lcdGotoXY(0, 0);
384
    lcdPutc('*');
385
    lcdGotoXY(x, 0);
386
        lcdPuts(Msg(message));
387
        lcdGotoXY(LCD_COLS - 1, 0);
388
  }
389
  lcdPutc('*');
390
}
391
 
392
/************************************************************************************/
393
/*        zeigt bei Programmstart Firmware- und DOGM-Version auf Display an                     */
394
/*                                                                                                                                                                      */
395
/************************************************************************************/
396
void Displ_Version(void)
397
{
398
  lcdGotoXY(0, 0);
399
  lcdPuts(Msg(MSG_VERSION1));
400
  if (dogm_vers == DOGM3V)
401
    lcdPuts(Msg(MSG_UHW33V));
402
  else
403
    lcdPuts(Msg(MSG_UHW5V));
404
  lcdPuts(Msg(MSG_VERSION2));
405
  for ( uint8_t i=0; i<=30;i++)
406
    _delay_ms(100);
407
  lcdClear();
408
}
409
 
410
/************************************************************************************/
411
/*  zeigt auszuwählenden/-gewählten Kanal und Frequenz auf Display an                           */
412
/*      Parameter:                                                                                                                                              */
413
/*  uint32_t k                  :Index anzuzeigender Wert = Kanal + 0x30 als Char,                      */
414
/*                                               unint32_t wegen Vereinheitlichung f. Funktionsaufrauf          */
415
/*                                                                                                                                                                      */
416
/************************************************************************************/
417
void Displ_Channels(uint32_t k)
418
{ char *channels[] =    {"5740", "5760","5780", "5800", "5820", "5840", "5860"};
419
 
420
  lcdPutc(k+0x30);
421
  lcdPuts(": ");
422
  lcdPuts(channels[k-1]);
423
  lcdPuts("MHz");
424
}
425
 
426
/************************************************************************************/
427
/*  zeigt Source AV1, AV2 oder Diversity zur Auswahl auf Display an                                     */
428
/*      Parameter:                                                                                                                                              */
429
/*  uint32_t q                  :Index anzuzeigender Wert,                                                                      */
430
/*                                               unint32_t wegen Vereinheitlichung f. Funktionsaufrauf          */
431
/*                                                                                                                                                                      */
432
/************************************************************************************/
433
void Displ_AV_Source(uint32_t q)
434
{ uint8_t av_src_table[] = {MSG_AV1, MSG_AV2, MSG_DIVERSITY};
435
 
436
  Disp_Str_mid(Msg(av_src_table[q]), ZLE_VAL);
437
}
438
 
439
/************************************************************************************/
440
/*  zeigt Tracking-Varianten zur Auswahl auf Display an                                                         */
441
/*      Parameter:                                                                                                                                              */
442
/*  uint32_t q                  :Index anzuzeigender Wert,                                                                      */
443
/*                                               unint32_t wegen Vereinheitlichung f. Funktionsaufrauf          */
444
/*                                                                                                                                                                      */
445
/************************************************************************************/
446
void Displ_sel_Tracking(uint32_t q)
447
{ uint8_t track_sel_table[] =    {MSG_OFF, MSG_TRACK_RSSI, MSG_TRACK_GPS, MSG_TRACK_MKCOCKPIT};
448
 
449
  Disp_Str_mid(Msg(track_sel_table[q]), ZLE_VAL);
450
}
451
 
452
/************************************************************************************/
453
/*  zeigt Senden der OSD-Daten Anforderung zur Auswahl auf Display an                           */
454
/*      Parameter:                                                                                                                                              */
455
/*  uint32_t q                  :Index anzuzeigender Wert,                                                                      */
456
/*                                               unint32_t wegen Vereinheitlichung f. Funktionsaufrauf          */
457
/*                                                                                                                                                                      */
458
/************************************************************************************/
459
void Displ_track_TX(uint32_t q)
460
{ uint8_t track_TX_table[] =    {MSG_OFF, MSG_TRACK_TX_ON};
461
 
462
  Disp_Str_mid(Msg(track_TX_table[q]), ZLE_VAL);
463
}
464
 
465
/************************************************************************************/
466
/*  zeigt einen max. 3-stelligen Integerwert auf Display an                                                     */
467
/*      Parameter:                                                                                                                                              */
468
/*  uint32_t val                :anzuzeigender Wert,                                                                            */
469
/*                                               unint32_t wegen Vereinheitlichung f. Funktionsaufrauf          */
470
/*                                                                                                                                                                      */
471
/************************************************************************************/
472
void Displ_Format_Int(uint32_t val)
473
{ char s[4];
474
 
475
  if (val < 100) lcdPutc(' ');
476
  if (val < 10) lcdPutc(' ');
477
  utoa(val ,s ,10 );
478
  lcdPuts(s);
479
}
480
 
481
/************************************************************************************/
482
/*  zeigt den Kontrastwert auf Display an mit sofortiger Änderung                                       */
483
/*      Parameter:                                                                                                                                              */
484
/*  uint32_t val                :anzuzeigender Wert,                                                                            */
485
/*                                               unint32_t wegen Vereinheitlichung f. Funktionsaufrauf          */
486
/*                                                                                                                                                                      */
487
/************************************************************************************/
488
void Displ_Set_Contrast(uint32_t val)
489
{
490
  Displ_Format_Int(val);
491
  lcdContrast(dogm_vers, val);
492
}
493
 
494
/************************************************************************************/
495
/*  zeigt die Zeit zur Abschaltung der LCD-Hintergrundbeleuchtung an                            */
496
/*      Parameter:                                                                                                                                              */
497
/*  uint32_t val                :anzuzeigender Wert,                                                                            */
498
/*                                               unint32_t wegen Vereinheitlichung f. Funktionsaufrauf          */
499
/*                                                                                                                                                                      */
500
/************************************************************************************/
501
void Displ_Backgr_Light(uint32_t val)
502
{ char str[5];
503
  uint8_t l;
504
 
505
  l = strlen(Msg(MSG_LIGHT));   // etwas Aufwand um Zeilenende sauber zu löschen
506
  switch(val) {
507
    case BACKGR_LIGHT_MIN : l += strlen(Msg(MSG_LIGHT_OFF));
508
                                                        lcdPuts(Msg(MSG_LIGHT_OFF));
509
                                                        break;
510
        case BACKGR_LIGHT_MAX : l += strlen(Msg(MSG_LIGHT_ON));
511
                                                        lcdPuts(Msg(MSG_LIGHT_ON));
512
                                                        break;
513
        default :                               itoa (val * 10, str, 10);
514
                                                        lcdPutc(' ');
515
                                                        lcdPuts(str);
516
                                                        lcdPuts(Msg(MSG_SEC));
517
                                                        l += 1 + strlen(str) + strlen(Msg(MSG_SEC));
518
  }
519
  l = LCD_COLS - l;
520
  for (uint8_t x = 0; x < l; x++) lcdPutc(' '); // Zeilenende löschen
521
}
522
 
523
/************************************************************************************/
524
/*  zeigt ein oder aus zur Auswahl auf Display an                                                                       */
525
/*      Parameter:                                                                                                                                              */
526
/*  uint32_t val                :0 = aus oder 1 = ein,                                                                          */
527
/*                                               unint32_t wegen Vereinheitlichung f. Funktionsaufrauf          */
528
/*                                                                                                                                                                      */
529
/************************************************************************************/
530
void Displ_Off_On(uint32_t val)
531
{
532
  if (val == 0) lcdPuts(Msg(MSG_OFF)); else lcdPuts(Msg(MSG_ON));
533
}
534
 
535
/************************************************************************************/
536
/*  zeigt Servoschritte zur Auswahl auf Display an                                                                      */
537
/*      Parameter:                                                                                                                                              */
538
/*  uint32_t val                :0 = 255 oder 1 = 1023,                                                                         */
539
/*                                               unint32_t wegen Vereinheitlichung f. Funktionsaufrauf          */
540
/*                                                                                                                                                                      */
541
/************************************************************************************/
542
void DISPL_Servo_Steps(uint32_t val)
543
{ uint8_t servo_step_table[] =  {MSG_STEPS_255, MSG_STEPS_1023};
544
 
545
  Disp_Str_mid(Msg(servo_step_table[val]), ZLE_VAL);
546
}
547
 
548
/************************************************************************************/
549
/*  zeigt Servo-Anschlagposition links auf Display an                                                           */
550
/*  mit sofortiger Wirkung auf Servo                                                                                            */
551
/*      Parameter:                                                                                                                                              */
552
/*  uint32_t val                :anzuzeigender Wert,                                                                            */
553
/*                                               unint32_t wegen Vereinheitlichung f. Funktionsaufrauf          */
554
/*                                                                                                                                                                      */
555
/************************************************************************************/
556
void Displ_Servo_Min(uint32_t val)
557
{ uint16_t steps = 0;
558
 
559
  Displ_Format_Int(val);
560
  servoSet_min(servo_nr, val);                          // Wert setzen damit nachfolgend die
561
  if (servo[servo_nr].rev) steps = ServoSteps();
562
  servoSetPosition(servo_nr, steps);            // Änderung direkt am Servo sichtbar ist
563
}
564
 
565
/************************************************************************************/
566
/*  zeigt Servo-Anschlagposition rechts auf Display an                                                          */
567
/*  mit sofortiger Wirkung auf Servo                                                                                            */
568
/*      Parameter:                                                                                                                                              */
569
/*  uint32_t val                :anzuzeigender Wert,                                                                            */
570
/*                                               unint32_t wegen Vereinheitlichung f. Funktionsaufrauf          */
571
/*                                                                                                                                                                      */
572
/************************************************************************************/
573
void Displ_Servo_Max(uint32_t val)
574
{ uint16_t steps = ServoSteps();
575
 
576
  Displ_Format_Int(val);
577
  servoSet_max(servo_nr, val);                          // Wert setzen damit nachfolgend die
578
  if (servo[servo_nr].rev) steps = 0;
579
  servoSetPosition(servo_nr, steps);            // Änderung direkt am Servo sichtbar ist
580
}
581
 
582
/************************************************************************************/
583
/*  zeigt Servo-Anschlagposition Mitte auf Display an                                                           */
584
/*  mit sofortiger Wirkung auf Servo                                                                                            */
585
/*      Parameter:                                                                                                                                              */
586
/*  uint32_t val                :anzuzeigender Wert,                                                                            */
587
/*                                               unint32_t wegen Vereinheitlichung f. Funktionsaufrauf          */
588
/*                                                                                                                                                                      */
589
/************************************************************************************/
590
void Displ_Servo_Mid(uint32_t val)
591
{ char s[6];
592
  int16_t mid_val;
593
 
594
  mid_val = val - ServoSteps()/2;
595
  if (abs(mid_val) < 10) lcdPutc(' ');           // einstellige Ausgabe eins nach rechts rücken
596
  if (mid_val > -1) lcdPutc(' ');                        // ohne Vorzeichen Ausgabe eins nach rechts rücken
597
  itoa(mid_val ,s ,10 );
598
  lcdPuts(s);
599
  lcdPutc(' ');                                                          // nach Werten > 99 letzte 0 wieder löschen
600
  servoSet_mid(servo_nr, val);                           // Wert setzen damit nachfolgend die
601
  servoSetPosition(servo_nr, ServoSteps()/2);// Änderung direkt am Servo sichtbar ist
602
}
603
 
604
/************************************************************************************/
605
/*  zeigt Baudrate für COM bei MKCockpit zur Auswahl auf Display an                                     */
606
/*      Parameter:                                                                                                                                              */
607
/*  uint32_t q                  :Index anzuzeigender Wert,                                                                      */
608
/*                                               unint32_t wegen Vereinheitlichung f. Funktionsaufrauf          */
609
/*                                                                                                                                                                      */
610
/************************************************************************************/
611
void Displ_Baudrate(uint32_t q)
612
{ char str[7];
613
 
614
  ltoa(baud[q], str, 10);
615
  Disp_Str_mid(str, ZLE_VAL);
616
}
617
 
618
/************************************************************************************/
619
/*  zeigt den Marker in Hauptdarstellung auf selektierten RX an                                         */
620
/*  d Diversity, << fester RX                                                                                                           */
621
/*      Parameter:                                                                                                                                              */
622
/*  uint8_t p           :x-Position des Markers                                                                                 */
623
/*  uint8_t marker      :Markerzeichen z.B.:'' oder 'd' oder 's'                                                */
624
/*                                                                                                                                                                      */
625
/************************************************************************************/
626
void Displ_AV_Mark(uint8_t p, char marker)
627
{
628
  if (p < 2) {
629
    lcdGotoXY(15,2 - p);        // da p immer neue Position 0 oder 1
630
    lcdPutc(' ');                       // bisherigen AVx-, Diversity-Marker löschen
631
    lcdGotoXY(15,p + 1);        // an neuer Positon
632
    lcdPutc(marker);            // übergebenes Markerzeichen darstellen
633
   }
634
   else { // falls beim Einschalten Diversity auf aktiv, keine Marker
635
    lcdGotoXY(15,1);
636
    lcdPutc(' ');
637
    lcdGotoXY(15,2);
638
    lcdPutc(' ');
639
   }
640
}
641
 
642
/************************************************************************************/
643
/*                      Hauptanzeige unter Berücksichtigung von VBat                                            */
644
/*                                                                                                                                                                      */
645
/************************************************************************************/
646
void Displ_Main_Disp(void)
647
{ char marker;
648
 
649
  lcdClear();
650
  if (bat_low != 0) {
651
    lcdClear();
652
    Displ_Channels(channel);
653
    lcdGotoXY(LCD_COLS - 1, 0);
654
    lcdPuts("V\n1\n2");
655
    if (av_source < DIVERSITY)
656
          marker = MARKER_AV;   // wird nur bei gesetzten Diversity überschrieben 
657
        else
658
          marker = MARKER_RSSI; // nur Schönheit, damit man sofort Umschaltung sieht
659
        Displ_AV_Mark(sw_avx, marker);
660
    Displ_VBat(); // muss zuletzt stehen
661
  }
662
  else {
663
    Disp_Str_mid(Msg(MSG_ACCU_LOW), 0);
664
  }
665
}
666
 
667
 
668
 
669
/**************************************************************/
670
/*                                                                                                                        */
671
/*                          Menüs                                                         */
672
/*                                                                                                                        */
673
/**************************************************************/
674
 
675
/**************************/
676
/*                                                */
677
/*         Haupmenü               */
678
/*                                                */
679
/**************************/
680
void Menu_Main(void)
681
{ scr_menu_t scr_main_menu = {MSG_RETURN, MSG_AV_SOURCE, MSG_RX_CHANNEL, MSG_RSSI_CALIBR, MSG_LANGUAGE, MSG_SERVO_CALIBR, \
682
                                                          MSG_LCD , MSG_BATTERY, MSG_TRACKING, 0, MSG_GPS_DISPLAY};
683
 
684
  strcpy(pmenu, "0");
685
  Scroll_Menu(scr_main_menu, SCROLL_MAIN_MAX, m_pkt); // pmenu global
686
  Jump_Menu(pmenu); //gewähltes Untermenü anspringen oder nur Return
687
}
688
 
689
/**************************/
690
/*                                                */
691
/*        AV-Quelle               */
692
/*                                                */
693
/**************************/
694
void Menu_AV_Source(void)
695
{ char marker;
696
  uint32_t eep_val;
697
 
698
  Disp_Title(MSG_AV_SOURCE);
699
  eep_val = Change_Value(av_source, AV_SOURCE_MIN, AV_SOURCE_MAX, 3, IDX_DISPL_AV_SOURCE, C_REPEAT); // pmenu global
700
  if (eep_val != av_source) {
701
    cli();
702
        av_source = eep_val;
703
        eeprom_write_byte(&ep_av_source, av_source);
704
        Double_Beep(DBEEPWR, DBEEPWRP);
705
        sw_avx = Set_AV_Source(av_source);
706
    if (pmenu[0] == '\0') {             // sonst ist AV-Source marker im Hauptdisplay nicht aktuallisiert
707
      if (av_source < DIVERSITY)
708
            marker = MARKER_AV;                 // wird nur bei gesetzten Diversity überschrieben 
709
          else
710
            marker = MARKER_RSSI;               // nur Schönheit, damit man sofort Umschaltung sieht
711
          Displ_AV_Mark(sw_avx, marker);// da erst jetzt die Variable für main_display geändert ist!
712
        }
713
        sei();
714
  }
715
  Jump_Menu(pmenu);
716
}
717
 
718
/**************************/
719
/*                                                */
720
/*        Kanal                   */
721
/*                                                */
722
/**************************/
723
void Menu_RX_Channel(void)
724
{ uint32_t eep_val;
725
 
726
  Disp_Title(MSG_RX_CHANNEL);
727
  eep_val = Change_Value(channel, CHANNEL_MIN, CHANNEL_MAX, 3, IDX_DISPL_CHANNEL, C_REPEAT);  // pmenu global
728
  if ((eep_val != channel) || (eep_val != ch_stored)) { // oder Channel wurde im Hauptdisplay geändert
729
    channel = eep_val;
730
        ch_stored = eep_val;
731
        eeprom_write_byte(&ep_channel, channel);
732
        Double_Beep(DBEEPWR, DBEEPWRP);
733
        Set_Channel(channel);
734
    if (pmenu[0] == '\0') {     // sonst ist channel im Hauptdisplay nicht aktuallisiert
735
      lcdGotoXY(0,0);
736
      Displ_Channels(channel);  // da erst jetzt die Variable für main_display geändert ist!
737
    }
738
  }
739
  Jump_Menu(pmenu);
740
}
741
 
742
/**************************/
743
/*                                                */
744
/*        RSSI                    */
745
/*                                                */
746
/**************************/
747
void Menu_RSSI_Calibr(void)
748
{ uint8_t scr_sub_menu[3]  = {MSG_RETURN, MSG_RSSI_MIN, MSG_RSSI_MAX};
749
 
750
  Scroll_Menu(scr_sub_menu, 2, m_pkt); // pmenu global
751
  Jump_Menu(pmenu);
752
}
753
 
754
void Menu_RSSI_min(void)
755
{ char str[20];
756
 
757
  Disp_Title(MSG_RSSI_MIN);
758
  strcpy(str, Msg(MSG_TX));
759
  strcat(str, Msg(MSG_TX_OFF));
760
  Disp_Str_mid(str, 1);
761
  Disp_Str_mid(Msg(MSG_CONTINUE), 2);
762
  if (Short_Enter()) {                  // pmenu global
763
    RSSI_Min_Calibrate(pudbm);
764
        pmenu[0] = '\0';                        // zur Hauptdarstellung
765
        Displ_Main_Disp();                      // da erst jetzt die Variable für main_display geändert ist!
766
  }
767
  else
768
    Jump_Menu(pmenu);
769
}
770
 
771
void Menu_RSSI_max(void)
772
{ char str[20];
773
 
774
  Disp_Title(MSG_RSSI_MAX);
775
  strcpy(str, Msg(MSG_TX));
776
  strcat(str, Msg(MSG_TX_ON));
777
  Disp_Str_mid(str, 1);
778
  Disp_Str_mid(Msg(MSG_CONTINUE), 2);
779
  if (Short_Enter()) {                  // pmenu global
780
    RSSI_Max_Calibrate(pudbm);
781
        pmenu[0] = '\0';                        // zur Hauptdarstellung
782
        Displ_Main_Disp();                      // da erst jetzt die Variable für main_display geändert ist!
783
  }
784
  else
785
    Jump_Menu(pmenu);
786
}
787
 
788
/**************************/
789
/*                                                */
790
/*        Sprache                 */
791
/*                                                */
792
/**************************/
793
void Displ_Language(uint32_t i)
794
{ uint8_t lanuage_table[3] = {MSG_GERMAN, MSG_ENGLISH, MSG_FRENCH};
795
 
796
  Disp_Str_mid(Msg(lanuage_table[i]), ZLE_VAL);
797
}
798
 
799
void Menu_Language(void)
800
{ uint32_t eep_val;
801
 
802
  Disp_Title(MSG_LANGUAGE);
803
  eep_val = Change_Value(language, GERMAN, LAST_LANG, 3, IDX_DISPL_LANGUAGE, C_REPEAT); // pmenu global
804
  language = eeprom_read_byte(&ep_language); // damit bei Erstinbetriebnahme Sprache gespeichert wird NO_LANGUAGE
805
  if (eep_val != language) {
806
        language = eep_val;
807
        eeprom_write_byte(&ep_language, language);
808
        Double_Beep(DBEEPWR, DBEEPWRP);
809
  }
810
  Jump_Menu(pmenu);
811
}
812
 
813
/**************************/
814
/*                                                */
815
/*        Servos                  */
816
/*                                                */
817
/**************************/
818
void Menu_Servo_Calibr(void)
819
{ uint8_t scr_sub_menu[4] = {MSG_RETURN, MSG_SERVO_STEPS, MSG_SERVO1, MSG_SERVO2};
820
 
821
  Scroll_Menu(scr_sub_menu, 3, m_pkt); // pmenu global
822
  Jump_Menu(pmenu);
823
}
824
 
825
void Servo_NewValues(uint8_t idx_presc)
826
{
827
  for (uint8_t i = 0; i < SERVO_NUM_CHANNELS; i++) {
828
        if (idx_presc == STEPS_255) {   // Werte umrechnen für Prescaler = 256
829
          servo[i].min /= 4;
830
          servo[i].max /= 4;
831
          servo[i].mid /= 4;
832
        }
833
        else {                                                  // Werte umrechnen für Prescaler = 64
834
          servo[i].min *= 4;
835
          servo[i].max *= 4;
836
          servo[i].mid *= 4;
837
        }
838
        servoSet_min(i, servo[i].min);
839
        servoSet_max(i, servo[i].max);
840
        servoSet_mid(i, servo[i].mid);
841
        eeprom_write_block(&servo[i],&ep_servo[i],sizeof(servo_t));
842
  }
843
  // Vorberechnung von ServoChannels[channel].duty
844
  servoSetDefaultPos(); // Ausgangsstellung beider Servos
845
}
846
 
847
void Menu_Servo_Steps(void)
848
{ uint32_t eep_val;
849
 
850
  Disp_Title(MSG_SERVO_STEPS);
851
  lcdGotoXY(8, ZLE_VAL);
852
  eep_val = Change_Value(sIdxSteps, STEPS_255, STEPS_1023, 5, IDX_DISPL_SERVO_STEPS, C_REPEAT); // pmenu global
853
  if (eep_val != sIdxSteps) {
854
        cli();
855
    sIdxSteps = eep_val;
856
        eeprom_write_byte(&ep_sIdxSteps, sIdxSteps);
857
        Servo_NewValues(sIdxSteps);  // hier ist der neue Index anzugeben!
858
        servoInit();
859
        sei();
860
        Double_Beep(DBEEPWR, DBEEPWRP);
861
  }
862
  Jump_Menu(pmenu);
863
}
864
 
865
void Menu_Servo1(void)
866
{ uint8_t scr_servo_menu[5] = {MSG_RETURN, MSG_SERVO1_REVERSE, MSG_CALIB1_LEFT, MSG_CALIB1_RIGHT, MSG_CALIB1_MIDDLE};
867
 
868
  Scroll_Menu(scr_servo_menu, SCROLL_SERVO_MAX, m_pkt); // pmenu global
869
  servo_nr = 0;
870
  Jump_Menu(pmenu);
871
}
872
 
873
void Menu_Servo2(void)
874
{ uint8_t scr_servo_menu[5] = {MSG_RETURN, MSG_SERVO2_REVERSE, MSG_CALIB2_LEFT, MSG_CALIB2_RIGHT, MSG_CALIB2_MIDDLE};
875
 
876
  Scroll_Menu(scr_servo_menu, SCROLL_SERVO_MAX, m_pkt); // pmenu global
877
  servo_nr = 1;
878
  Jump_Menu(pmenu);
879
}
880
 
881
uint8_t Servo_tmp_on(void)
882
{ uint8_t tmp_tracking = tracking;
883
 
884
  tracking = 0;                                                           // Servopositionierung durch tracking abschalten
885
  if (tracking == TRACKING_MIN) servoInit(); // falls aus, Servos einschalten
886
  lcdGotoXY(0, 0);                                                        // lcd Cursor vorpositionieren
887
  return(tmp_tracking);
888
}
889
 
890
void Servo_tmp_Original(uint8_t track)
891
{ uint16_t steps;
892
 
893
  if (servo_nr == SERVO_PAN)
894
        steps = ServoSteps()/2;                         // PAN auf Mittelstellung
895
  else
896
    steps = 0;                                                  // Tilt auf Endausschlag
897
  servoSetPosition(servo_nr, steps);    // Bei PAN auf ServoSteps/2 und bei Tilt auf 0 oder ServoSteps NICHT!!! reverse beachten
898
  tracking = track;                                             // ursprünglicher Wert Tracking aus, RSSI oder GPS
899
  if (tracking == TRACKING_MIN) {
900
    for (uint8_t i = 0; i < 2; i++)
901
      _delay_ms(200);                                   // sonst werden Impulse bereits vor erreichen der Servo-default-Stellung abgeschaltet
902
    servoOff();                                                 // Servos sind nur zum Tracking oder bei Kalibrierung eingeschaltet
903
  }
904
  Jump_Menu(pmenu);
905
}
906
 
907
void Menu_Servo_rev(void)
908
{ uint32_t eep_val;
909
  uint8_t tmp_tracking;
910
 
911
  tmp_tracking = Servo_tmp_on();
912
  eep_val = Change_Value(servo[servo_nr].rev, 0, 1, 6, IDX_DISPL_OFF_ON, C_REPEAT); // pmenu global; reverse gibt es nur 0=off, 1=on
913
  if (eep_val != servo[servo_nr].rev) {
914
    servo[servo_nr].rev = eep_val;
915
        servoSet_rev(servo_nr, eep_val);
916
        eeprom_write_block(&servo[servo_nr],&ep_servo[servo_nr],sizeof(servo_t));
917
        Double_Beep(DBEEPWR, DBEEPWRP);
918
  }
919
  Servo_tmp_Original(tmp_tracking);
920
}
921
 
922
void Menu_Servo1_rev(void)
923
{
924
  Disp_Title(MSG_SERVO1_REVERSE);
925
  Menu_Servo_rev();
926
}
927
 
928
void Menu_Servo2_rev(void)
929
{
930
  Disp_Title(MSG_SERVO2_REVERSE);
931
  Menu_Servo_rev();
932
}
933
 
934
void Menu_Servo_left(void)
935
{ uint32_t eep_val;
936
  uint8_t tmp_tracking;
937
 
938
  tmp_tracking = Servo_tmp_on();
939
  servoSetPosition(servo_nr, ServoSteps());             // Linkssanschlag um Kalibrierung am Servo zu sehen
940
  eep_val = Change_Value(servo[servo_nr].max, servo_limit[sIdxSteps][LEFT].min, servo_limit[sIdxSteps][LEFT].max, 6, IDX_DISPL_SERVO_MAX, V_REPEAT); // pmenu global
941
  if (eep_val != servo[servo_nr].max) {
942
    servo[servo_nr].max = eep_val;
943
        eeprom_write_block(&servo[servo_nr],&ep_servo[servo_nr],sizeof(servo_t));
944
        servoSet_mid(servo_nr, servo[servo_nr].mid);    // Mittelposition muss sich bei Ausschlagsänderung verschieben
945
        Double_Beep(DBEEPWR, DBEEPWRP);
946
  }
947
  Servo_tmp_Original(tmp_tracking);
948
}
949
 
950
void Menu_Servo1_left(void)
951
{
952
  Disp_Title(MSG_CALIB1_LEFT);
953
  Menu_Servo_left();
954
}
955
 
956
void Menu_Servo2_left(void)
957
{
958
  Disp_Title(MSG_CALIB2_LEFT);
959
  Menu_Servo_left();
960
}
961
 
962
void Menu_Servo_right(void)
963
{ uint32_t eep_val;
964
  uint8_t tmp_tracking;
965
 
966
  tmp_tracking = Servo_tmp_on();
967
  servoSetPosition(servo_nr, 0);                                        // Rechtsanschlag um Kalibrierung am Servo zu sehen
968
  eep_val = Change_Value(servo[servo_nr].min, servo_limit[sIdxSteps][RIGHT].min, servo_limit[sIdxSteps][RIGHT].max, 6, IDX_DISPL_SERVO_MIN, V_REPEAT); // pmenu global
969
  if (eep_val != servo[servo_nr].min) {
970
    servo[servo_nr].min = eep_val;
971
        eeprom_write_block(&servo[servo_nr],&ep_servo[servo_nr],sizeof(servo_t));
972
        servoSet_mid(servo_nr, servo[servo_nr].mid);    // Mittelposition muss sich bei Ausschlagsänderung verschieben
973
        Double_Beep(DBEEPWR, DBEEPWRP);
974
  }
975
   Servo_tmp_Original(tmp_tracking);
976
}
977
 
978
void Menu_Servo1_right(void)
979
{
980
  Disp_Title(MSG_CALIB1_RIGHT);
981
  Menu_Servo_right();
982
}
983
 
984
void Menu_Servo2_right(void)
985
{
986
  Disp_Title(MSG_CALIB2_RIGHT);
987
  Menu_Servo_right();
988
}
989
 
990
void Menu_Servo_middle(void)
991
{ uint32_t eep_val;
992
  uint8_t tmp_tracking;
993
 
994
  tmp_tracking = Servo_tmp_on();
995
  servoSetPosition(servo_nr, ServoSteps()/2);           // Mittelposition um Kalibrierung am Servo zu sehen
996
  eep_val = Change_Value(servo[servo_nr].mid, servo_limit[sIdxSteps][MIDDLE].min, servo_limit[sIdxSteps][MIDDLE].max, 6, IDX_DISPL_SERVO_MID, V_REPEAT); // pmenu global
997
  if (eep_val != servo[servo_nr].mid) {
998
    servo[servo_nr].mid = eep_val;
999
        eeprom_write_block(&servo[servo_nr], &ep_servo[servo_nr], sizeof(servo_t));
1000
        Double_Beep(DBEEPWR, DBEEPWRP);
1001
  }
1002
  Servo_tmp_Original(tmp_tracking);
1003
}
1004
 
1005
void Menu_Servo1_middle(void)
1006
{
1007
  Disp_Title(MSG_CALIB1_MIDDLE);
1008
  Menu_Servo_middle();
1009
}
1010
 
1011
void Menu_Servo2_middle(void)
1012
{
1013
  Disp_Title(MSG_CALIB2_MIDDLE);
1014
  Menu_Servo_middle();
1015
}
1016
 
1017
/**************************/
1018
/*                                                */
1019
/*              LCD                       */
1020
/*                                                */
1021
/**************************/
1022
void Menu_lcd(void)
1023
{ uint8_t scr_sub_menu[3] = {MSG_RETURN, MSG_CONTRAST, MSG_BACKGR_LIGHT};
1024
 
1025
  Scroll_Menu(scr_sub_menu, 2, m_pkt); // pmenu global
1026
  Jump_Menu(pmenu);
1027
}
1028
 
1029
void Menu_lcd_Contrast(void)
1030
{ uint32_t eep_val;
1031
 
1032
  Disp_Title(MSG_LCD);
1033
  lcdGotoXY(2, ZLE_VAL);
1034
  lcdPuts(Msg(MSG_CONTRAST));
1035
  lcdPuts(": ");
1036
  eep_val = Change_Value(contrast, CONTRAST_MIN, CONTRAST_MAX, 11, IDX_DISPL_SET_CONTRAST, C_REPEAT); // pmenu global
1037
  if (eep_val != contrast) {
1038
    contrast = eep_val;
1039
        eeprom_write_byte(&ep_contrast, contrast);
1040
        Double_Beep(DBEEPWR, DBEEPWRP);
1041
  }
1042
  Jump_Menu(pmenu);
1043
}
1044
 
1045
void Menu_lcd_Backgr_Light(void)
1046
{ uint32_t eep_val;
1047
 
1048
  Disp_Title(MSG_BACKGR_LIGHT);
1049
  lcdGotoXY(0, ZLE_VAL);
1050
  lcdPuts(Msg(MSG_LIGHT));
1051
  eep_val = Change_Value(light_time, BACKGR_LIGHT_MIN, BACKGR_LIGHT_MAX, 6, IDX_DISPL_BACKGR_LIGHT, V_REPEAT); // pmenu global
1052
  if (eep_val != light_time) {
1053
    light_time = eep_val;
1054
        eeprom_write_byte(&ep_light_time, light_time);
1055
        Double_Beep(DBEEPWR, DBEEPWRP);
1056
        if (light_time == BACKGR_LIGHT_MIN) lcdSet_BackgrLight_Off(); // Hintergrundbeleuchtung immer aus ==> sofort schalten
1057
  }
1058
  Jump_Menu(pmenu);
1059
}
1060
 
1061
/**************************/
1062
/*                                                */
1063
/*        Batterie                */
1064
/*                                                */
1065
/**************************/
1066
void Menu_Battery(void)
1067
{ uint8_t scr_sub_menu[3] = {MSG_RETURN, MSG_U_SETUP, MSG_U_OFFSET};
1068
 
1069
  Scroll_Menu(scr_sub_menu, 2, m_pkt); // pmenu global
1070
  Jump_Menu(pmenu);
1071
}
1072
 
1073
void Menu_Low_U_Setup(void)
1074
{ uint32_t eep_val;
1075
 
1076
  Disp_Title(MSG_U_MIN);
1077
  eep_val = Change_Value(u_min, U_MIN_MIN, U_MIN_MAX, 4, IDX_DISPL_U_2Nk, V_REPEAT); // pmenu global
1078
  if (eep_val != u_min) {
1079
    u_min = eep_val;
1080
        eeprom_write_dword(&ep_u_min, u_min);
1081
        hyst_u_min = u_min;
1082
        Double_Beep(DBEEPWR, DBEEPWRP);
1083
  }
1084
  Jump_Menu(pmenu);
1085
}
1086
 
1087
void Menu_U_Offset(void)
1088
{ uint32_t eep_val;
1089
 
1090
  Disp_Title(MSG_U_OFFSET);
1091
  eep_val = Change_Value(u_offset, U_OFFSET_MIN, U_OFFSET_MAX, 4, IDX_DISPL_U_2Nk, V_REPEAT); // pmenu global
1092
  if (eep_val != u_offset) {
1093
    u_offset = eep_val;
1094
        eeprom_write_byte(&ep_u_offset, u_offset);
1095
        Double_Beep(DBEEPWR, DBEEPWRP);
1096
  }
1097
  Jump_Menu(pmenu);
1098
}
1099
 
1100
/**************************/
1101
/*                                                */
1102
/*  Antennennachführung   */
1103
/*                                                */
1104
/**************************/
1105
void Menu_Tracking_Ant(void)
1106
{ uint32_t eep_val;
1107
 
1108
  Disp_Title(MSG_TRACKING);
1109
  eep_val = Change_Value(tracking, TRACKING_MIN, TRACKING_MAX, 3, IDX_DISPL_SEL_TRACKING, C_REPEAT); // pmenu global
1110
  if (eep_val != tracking) {
1111
    cli();
1112
        tracking = eep_val;
1113
        sei();
1114
        eeprom_write_byte(&ep_tracking, tracking);
1115
        Double_Beep(DBEEPWR, DBEEPWRP);
1116
    USART_RX_Mode(tracking);    // Unterschied Datenempfang GPS/MKCockpit
1117
        coldstart = 1;
1118
        servoSetDefaultPos();           // Ausgangsstellung beider Servos
1119
    if (tracking > TRACKING_MIN)
1120
          servoInit();
1121
        else {
1122
          for (uint8_t i = 0; i < 2; i++)
1123
            _delay_ms(200);                     // sonst wird Impuls bereits vor erreichen der Mittelstellung abgeschaltet
1124
          servoOff();
1125
        }
1126
        USART_Init_Baudrate();
1127
  }
1128
  Jump_Menu(pmenu);
1129
}
1130
 
1131
/**************************/
1132
/*               Optionen                 */
1133
/*  Antennennachführung   */
1134
/*                                                */
1135
/**************************/
1136
void Menu_Tracking_HYST(void)
1137
{ uint32_t eep_val;
1138
 
1139
  Disp_Title(MSG_HYSTERESE);
1140
  eep_val = Change_Value(track_hyst, TRACKING_HYST_MIN, TRACKING_HYST_MAX, 7, IDX_DISPL_FORMAT_INT, V_REPEAT); // pmenu gloabal
1141
  if (eep_val != track_hyst) {
1142
    track_hyst = eep_val;
1143
        eeprom_write_byte(&ep_track_hyst, track_hyst);
1144
        Double_Beep(DBEEPWR, DBEEPWRP);
1145
  }
1146
  Jump_Menu(pmenu);
1147
}
1148
 
1149
void Menu_Tracking_TXOSD(void)
1150
{ uint32_t eep_val;
1151
 
1152
  Disp_Title(MSG_TRACK_TX_OSD_DATA);
1153
  eep_val = Change_Value(track_tx, 0, 1, 3, IDX_DISPL_TRACK_TX, C_REPEAT); // pmenu global; Senden gibt es nur 0=off, 1=on
1154
  if (eep_val != track_tx) {
1155
    track_tx = eep_val;
1156
        eeprom_write_byte(&ep_track_tx, track_tx);
1157
        Double_Beep(DBEEPWR, DBEEPWRP);
1158
  }
1159
  Jump_Menu(pmenu);
1160
}
1161
 
1162
void Menu_Baudrate(void)
1163
{ uint32_t eep_val;
1164
 
1165
  Disp_Title(MSG_BAUDRATE);
1166
  eep_val = Change_Value(baudrate, BAUDRATE_MIN, BAUDRATE_MAX, 3, IDX_DISPL_BAUDRATE, C_REPEAT); // pmenu global; Senden gibt es nur 0=off, 1=on
1167
  if (eep_val != baudrate) {
1168
    baudrate = eep_val;
1169
        eeprom_write_byte(&ep_baudrate, baudrate);
1170
        Double_Beep(DBEEPWR, DBEEPWRP);
1171
        USART_Init(baud[baudrate]);
1172
  }
1173
  Jump_Menu(pmenu);
1174
}
1175
 
1176
void Menu_Tracking_Option(void)
1177
{ // im Menü ist dies der gleiche Gliederungspunkt aber mit geänderter Auswahl
1178
  switch(tracking) {
1179
    case TRACKING_RSSI:          Menu_Tracking_HYST();
1180
                                                         break;
1181
    case TRACKING_GPS:           Menu_Tracking_TXOSD();
1182
                                                         break;
1183
    case TRACKING_MKCOCKPIT: Menu_Baudrate();
1184
  }
1185
}
1186
 
1187
/**************************/
1188
/*                                                */
1189
/*      Anzeige GPS               */
1190
/*                                                */
1191
/**************************/
1192
void Menu_GPS_Display(void)
1193
{ uint8_t scr_sub_menu[4] = {MSG_RETURN, MSG_GPS_CALCULATE, MSG_GPS_CURRENT, MSG_GPS_HOME};
1194
 
1195
  Scroll_Menu(scr_sub_menu, 3, m_pkt); // pmenu global
1196
  Jump_Menu(pmenu);
1197
}
1198
 
1199
void Menu_GPS_Display_FLAG(void) // ist Flag in tracking.c Tracking_GPS(void)
1200
{ uint8_t slen;
1201
 
1202
  slen = strlen(pmenu) - 1;
1203
  gps_display = pmenu[slen] - '0';      // char to byte 1 bis 3 im String enthalten
1204
  m_pkt = gps_display;
1205
  gps_disp_clear = 1;                   // damit Text "...keine Daten empf..." nach Datenempfang gelöscht wird
1206
  lcdPuts(Msg(MSG_GPS_NO_DATA));
1207
  if (Short_Enter())                    // pmenu global
1208
        pmenu[slen] = '\0';                     // Menüpunkt zurück
1209
  gps_display = GPS_DISP_NONE;  // nach Tastaturabfrage keine Anzeige GPS, sondern normales Menü
1210
  Jump_Menu(pmenu);
1211
}