Subversion Repositories Projects

Rev

Details | Last modification | View Log | RSS feed

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