Subversion Repositories Projects

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1687 - 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 <avr/interrupt.h>
14
#include <avr/eeprom.h>
15
#include <util/delay.h>
16
#include <stdlib.h>
17
#include <string.h>
18
 
19
#include "config.h"
20
#include "ngvideo.h"
21
#include "keys.h"
22
#include "menue.h"
23
#include "servo.h"
24
#include "tracking.h"
25
#include "messages.c"
26
#include "dogm.h"
27
#include "tools.h"
28
#include "usart.h"
29
#include "ngvideo.h"
30
 
31
typedef uint8_t scr_menu_t[SCROLL_MAIN_MAX];
32
char pmenu[6] = {"0"};                  // Zuordnung Menü Programmgliederung zu hinterlegten Funktionen
33
uint8_t m_pkt;                                                  // um bei Rücksprung auf ursprünglichen Arrayeintrag(Menüpunkt), Scroll_Menu zeigen
34
uint8_t servo_nr;                                               // zwischen Servo 1 und 2 wird nur mit global servo_nr unterschieden
35
uint8_t chrxs;                                                  // zum Laden lcdSpecialChrLs oder lcdSpecialChrRs
36
uint8_t exit_while = 0;                 // unabhängige Task (z.B: Menu_MK_BatteryChangeNr() - Aufruf) kann Eingabe while-Schleife beenden, wenn 1
37
 
38
// Menügliederung im Flash belassen
39
const char cmdStr0[]                            PROGMEM = "0";
40
const char cmdStr01[]                           PROGMEM = "01";
41
const char cmdStr02[]                           PROGMEM = "02";
42
const char cmdStr03[]                           PROGMEM = "03";
43
const char cmdStr031[]                  PROGMEM = "031";
44
const char cmdStr032[]                  PROGMEM = "032";               
45
const char cmdStr033[]                  PROGMEM = "033";               
46
const char cmdStr034[]                  PROGMEM = "034";               
47
const char cmdStr035[]                  PROGMEM = "035";               
48
const char cmdStr0351[]                 PROGMEM = "0351";              
49
const char cmdStr0352[]                 PROGMEM = "0352";              
50
const char cmdStr04[]                           PROGMEM = "04";
51
const char cmdStr05[]                           PROGMEM = "05";
52
const char cmdStr051[]                  PROGMEM = "051";
53
const char cmdStr052[]                  PROGMEM = "052";        // zwischen Servo 1 und 2 wird danach 
54
const char cmdStr0521[]                 PROGMEM = "0521";       // mit global servo_nr unterschieden
55
const char cmdStr0522[]                 PROGMEM = "0522";              
56
const char cmdStr0523[]                 PROGMEM = "0523";
57
const char cmdStr0524[]                 PROGMEM = "0524";
58
const char cmdStr053[]                  PROGMEM = "053";
59
const char cmdStr0531[]                 PROGMEM = "0531";
60
const char cmdStr0532[]                 PROGMEM = "0532";
61
const char cmdStr0533[]                 PROGMEM = "0533";
62
const char cmdStr0534[]                 PROGMEM = "0534";
63
const char cmdStr06[]                           PROGMEM = "06";
64
const char cmdStr061[]                  PROGMEM = "061";
65
const char cmdStr062[]                  PROGMEM = "062";
66
const char cmdStr0621[]                 PROGMEM = "0621";
67
const char cmdStr0622[]                 PROGMEM = "0622";
68
const char cmdStr0623[]                 PROGMEM = "0623";
69
const char cmdStr0624[]                 PROGMEM = "0624";
70
const char cmdStr0625[]                 PROGMEM = "0625";
71
const char cmdStr063[]                  PROGMEM = "063";
72
const char cmdStr064[]                  PROGMEM = "064";
73
const char cmdStr07[]                           PROGMEM = "07";
74
const char cmdStr071[]                  PROGMEM = "071";
75
const char cmdStr072[]                  PROGMEM = "072";
76
const char cmdStr08[]                           PROGMEM = "08";
77
const char cmdStr081[]                  PROGMEM = "081";
78
const char cmdStr082[]                  PROGMEM = "082";
79
const char cmdStr083[]                  PROGMEM = "083";
80
const char cmdStr0831[]                 PROGMEM = "0831";
81
const char cmdStr0832[]                 PROGMEM = "0832";
82
const char cmdStr0833[]                 PROGMEM = "0833";
83
const char cmdStr0834[]                 PROGMEM = "0834";
84
const char cmdStr0835[]                 PROGMEM = "0835";
85
const char cmdStr09[]                           PROGMEM = "09";
86
const char cmdStr0d[]                           PROGMEM = "0:";         // wird nur bei Tracking RSSI oder GPS eingeblendet - SCROLL_MAIN_MAX wird geändert
87
const char cmdStr0e[]                           PROGMEM = "0;";         // wird nur bei Tracking GPS eingeblendet                                        - SCROLL_MAIN_MAX wird geändert
88
const char cmdStr0e1[]                  PROGMEM = "0;1";        // nach '9' (0x39) folgt ':' (0x3a) ';' (0x3b)
89
const char cmdStr0e2[]                  PROGMEM = "0;2";       
90
const char cmdStr0e3[]                  PROGMEM = "0;3";
91
const char cmdStr0e4[]                  PROGMEM = "0;4";
92
const char cmdStr0e5[]                  PROGMEM = RXTimeStr;
93
 
94
command_table_t command_table[] PROGMEM =                       // Befehls-Tabelle
95
{
96
        {cmdStr0,               Menu_Main},
97
        {cmdStr01,              Menu_AV_Source},
98
        {cmdStr02,              Menu_RX_Channel},
99
        {cmdStr03,              Menu_RSSI_Calibr},
100
        {cmdStr031,             Menu_RSSI_min},
101
        {cmdStr032,             Menu_RSSI_min_all},            
102
        {cmdStr033,             Menu_RSSI_max},        
103
        {cmdStr034,             Menu_RSSI_invert},             
104
        {cmdStr035,             Menu_TX_identyfy},             
105
        {cmdStr0351,    Menu_TX_status_off},           
106
        {cmdStr0352,    Menu_TX_status_on},            
107
        {cmdStr04,              Menu_Language},
108
        {cmdStr05,              Menu_Servo_Calibr},
109
        {cmdStr051,             Menu_Servo_Steps},
110
        {cmdStr052,             Menu_Servo1},                                           // zwischen Servo 1 und 2 wird danach 
111
        {cmdStr0521,    Menu_Servo1_rev},                               // mit global servo_nr unterschieden
112
        {cmdStr0522,    Menu_Servo1_left},             
113
        {cmdStr0523,    Menu_Servo1_right},
114
        {cmdStr0524,    Menu_Servo1_middle},
115
        {cmdStr053,             Menu_Servo2},
116
        {cmdStr0531,    Menu_Servo2_rev},
117
        {cmdStr0532,    Menu_Servo2_left},
118
        {cmdStr0533,    Menu_Servo2_right},
119
        {cmdStr0534,    Menu_Servo2_middle},
120
        {cmdStr06,              Menu_Servo_Test},
121
        {cmdStr061,             Menu_Test_PulseWidth},
122
        {cmdStr062,             Menu_Test_Continuous},
123
        {cmdStr0621,    Menu_Test_Start},
124
        {cmdStr0622,    Menu_Test_SingleStep},
125
        {cmdStr0623,    Menu_Test_Repeat},
126
        {cmdStr0624,    Menu_Test_Pause},
127
        {cmdStr0625,    Menu_Test_Pause_Step},
128
        {cmdStr063,             Menu_Test_ServoNr},
129
        {cmdStr064,             Menu_Test_Frame},
130
        {cmdStr07,              Menu_lcd},
131
        {cmdStr071,             Menu_lcd_Contrast},
132
        {cmdStr072,             Menu_lcd_Backgr_Light},
133
        {cmdStr08,              Menu_Battery},
134
        {cmdStr081,             Menu_Low_U_Setup},
135
        {cmdStr082,             Menu_U_Offset},
136
        {cmdStr083,             Menu_MK_Battery},
137
        {cmdStr0831,    Menu_MK_BatteryNr},
138
        {cmdStr0832,    Menu_MK_BatteryCapacity},
139
        {cmdStr0833,    Menu_MK_I_Offset},
140
        {cmdStr0834,    Menu_MK_I_Faktor},
141
        {cmdStr0835,    Menu_MK_W_Faktor},
142
        {cmdStr09,              Menu_Tracking_Ant},
143
        {cmdStr0d,              Menu_Tracking_Option},  // wird nur bei Tracking RSSI oder GPS eingeblendet - SCROLL_MAIN_MAX wird geändert
144
        {cmdStr0e,              Menu_GPS_Display},                      // wird nur bei Tracking GPS oder NMEA eingeblendet - SCROLL_MAIN_MAX wird geändert
145
        {cmdStr0e1,             Menu_GPS_Display_FLAG}, // nach '9' (0x39) folgt ':' (0x3a)
146
        {cmdStr0e2,             Menu_GPS_Display_FLAG},
147
        {cmdStr0e3,             Menu_GPS_Display_FLAG},
148
        {cmdStr0e4,             Menu_GPS_Display_FLAG},
149
        {cmdStr0e5,             Menu_GPS_Displ_RX_Time} // bei NMEA wird dieser Menüpunkt um 1 vorgezogen (anstelle GPS_MISC)
150
};
151
 
152
 
153
uint8_t Change_Value(uint16_t *val, uint16_t min_val, uint16_t max_val, uint8_t fl_pos, Displ_Fnct_t Displ_Fnct);
154
 
155
 
156
/**************************************************************/
157
/*                                                                                                                                                                                                                                              */
158
/*                                                                              Steuerung der Menüs                                                                                     */
159
/*                                                                                                                                                                                                                                              */
160
/**************************************************************/
161
 
162
/************************************************************************************/
163
/*      sucht nach übergebenen String in der Kommandotabelle und springt zum daneben            */
164
/*      stehenden Menü-Programm                                                                                                                                                                                                                                 */
165
/*      Parameter:                                                                                                                                                                                                                                                                                      */
166
/*      char *pmenu             :zu suchender String in Kommandotabelle                                                                                                         */
167
/*                                                                                                                                                                                                                                                                                                                                      */
168
/************************************************************************************/
169
void Jump_Menu(char *pmenu)
170
{ uint8_t i;
171
        void (*func)(void);
172
 
173
        if (pmenu[0] != '\0'){
174
                for (i=0; i < sizeof(command_table) / sizeof(command_table_t); i++) {
175
                        // Ist das der gesuchte String? 
176
                        if (!(strcmp_P(pmenu, (char*)pgm_read_word(&(command_table[i].menu_nr))))) {
177
                                func = (void(*)(void))pgm_read_word(&(command_table[i].fp));
178
                                func();
179
                                break;
180
                        }
181
                }
182
        }
183
}
184
 
185
/************************************************************************************/
186
/*                                                                                                                                                                                                                                                                                                                                      */
187
/*                                                                                      Abfrage Short- oder Long-Enter                                                                                                                  */
188
/*              verbleibt in Abfrage bis Enter betätigt; Rückgabe => Short-Enter True/False             */
189
/*                                                                                                                                                                                                                                                                                                                                      */
190
/************************************************************************************/
191
uint8_t Long_Enter(void)
192
{
193
        Tasks_invisible();      // Dadurch ist Doppelaufruf von MK-GPS möglich!!! Nur bei Menu_MK_BatteryChangeNr()
194
        // falls Akku leer ==> Menü verlassen und Anzeige __ACCU_LOW
195
        U_Messen_cmp(DISABLE_BTIMER);
196
        if (Get_Key_Long( 1<<SW_ENTER ) || bat_low) {
197
                pmenu[0] ='\0';         // direkt in das Hauptprogramm
198
                return 1;
199
        }
200
        else return 0;
201
}
202
 
203
uint8_t Short_Enter(void)
204
{ uint8_t ret;
205
 
206
        // bis Short- oder Long-Enter, auch Akku leer
207
        while( !Get_Key_Short( 1<<SW_ENTER ) && !Long_Enter() && !exit_while);
208
        lcdClear();
209
        if (pmenu[0] == '\0') Displ_Main_Disp(); else Beep(BEEPENTER); // bei ShortEnter Beep
210
        ret = (pmenu[0] != '\0') && !exit_while;
211
        exit_while = 0;
212
        return(ret); // ShortEnter bringt 1 zurück
213
}
214
 
215
/************************************************************************************/
216
/*                                                                                                                                                                                                                                                                                                                                      */
217
/*      Unterprogramm vom Scroll_Menu(...) stellt Menüpunkte dar                                                                                                */
218
/*      Parameter:                                                                                                                                                                                                                                                                                      */
219
/*      scr_menu_t scr_menu             : Array mit Strings der Menüanzeige                                                                                             */
220
/*      uint8_t         scr_idx                 : ausgewählter Menüpunkt                                                                                                                                        */
221
/*      uint8_t         scroll_max      : scrollen bis Wert                                                                                                                                                             */
222
/*                                                                                                                                                                                                                                                                                                                                      */
223
/************************************************************************************/
224
void Displ_Scroll_Menu(scr_menu_t scr_menu, uint8_t scr_idx)
225
{       uint8_t i;
226
 
227
        if (scr_idx > 0) scr_idx--; else scr_idx = scr_menu[0];
228
        for (i = 0; i < LCD_LINES; i++) {
229
                lcdGotoXY(2, i);                                // LCD Beginn x-Position, 2 Zeichen rechts eingerückt
230
                lcdPuts(Msg(scr_menu[scr_idx + 1]));
231
                lcdClearEOL();                                  // ab Stringende bis zum Zeilenende löschen; LCD löschen flackert sonst zu sehr
232
                if (scr_idx < scr_menu[0]) scr_idx++; else scr_idx = 0;
233
        }
234
}
235
 
236
/************************************************************************************/
237
/*                                                                                                                                                                                                                                                                                                                                      */
238
/*      Unterprogramm vom Scroll_Menu(...) und Change_Value(...)                                                                                                */
239
/*      bei Rücksprung auf ursprünglichen Menüpunkt zeigen                                                                                                                      */
240
/*      Parameter:                                                                                                                                                                                                                                                                                      */
241
/*      uint8_t l               : Strinlänge von pmenue                                                                                                                                                                                 */
242
/*                                                                                                                                                                                                                                                                                                                                      */
243
/************************************************************************************/
244
void return_m_pkt(uint8_t l)
245
{
246
        if (l > 1) {            // bei l=1 und Subtraktion 1 wird sowieso Displ_Main_Disp() ausgeführt und dort pmenu[0] = '\0' gesetzt
247
                l--;
248
                m_pkt = pmenu[l] - '0'; // um bei Rücksprung auf ursprünglichen Arrayeintrag(Menüpunkt) zeigen
249
                pmenu[l] ='\0';                                 // auf letztes Zeichen Stringende schreiben
250
        }
251
        else Displ_Main_Disp();
252
}
253
 
254
/************************************************************************************/
255
/*                                                                                                                                                                                                                                                                                                                                      */
256
/*      scrollt Menü über Mehrzeilige LCD                                                                                                                                                                                               */
257
/*                                                                                                                                                                                                                                                                                                                                      */
258
/*      Taste<Enter> lang springt in Hauptanzeige, kurz geht in den angewälten Menüpunkt*/
259
/*      Taste<+>                eine Zeile nach oben                                                                                                                                                                                            */
260
/*      Taste<->                eine Zeile nach unten                                                                                                                                                                                           */
261
/*      Parameter:                                                                                                                                                                                                                                                                                      */
262
/*      scr_menu_t scr_menu             : Array mit Strings der Menüanzeige                                                                                             */
263
/*      uint8_t         scroll_max      : scrollen bis Wert                                                                                                                                                             */
264
/*      uint8_t         scr_idx                 : Index für array von Displ_Scroll_Menu(...)                                                    */
265
/*                                                                                                                                                                                                                                                                                                                                      */
266
/************************************************************************************/
267
void Scroll_Menu(scr_menu_t scr_menu, uint8_t scr_idx)
268
{ uint8_t l;
269
 
270
        lcdClear();
271
        lcdGotoXY(0, 1);
272
        lcdPutc(MARKER_SELECT);         // '>>'
273
        Displ_Scroll_Menu(scr_menu, scr_idx);
274
        // bis Menueeingabe bestätigt oder zum vorherigen Menue
275
        while( !Get_Key_Short( 1<<SW_ENTER ) && !Long_Enter() && !exit_while)
276
        {
277
                // >> Menueauswahl nach oben
278
                if( Get_Key_Press( 1<<SW_PLUS ) || Get_Key_Rpt( 1<<SW_PLUS ))           {
279
                        if (scr_idx > 0) scr_idx--; else scr_idx = scr_menu[0];
280
                        Displ_Scroll_Menu(scr_menu, scr_idx);
281
                }      
282
                // >> Menueauswahl nach unten
283
                if( Get_Key_Press( 1<<SW_MINUS ) || Get_Key_Rpt( 1<<SW_MINUS )) {
284
                        if (scr_idx < scr_menu[0]) scr_idx++; else scr_idx = 0;
285
                        Displ_Scroll_Menu(scr_menu, scr_idx);
286
                }
287
        }
288
 
289
        lcdClear();
290
        if (exit_while)                                                                                 // wegen Aufruf Menu_MK_BatteryChangeNr() in Task
291
                m_pkt = scr_idx;                                                                        // nach Task Menu_MK_BatteryChangeNr() wieder zum ursprünlichen Anzeigepunkt
292
        else {
293
                l = strlen(pmenu);
294
                if ((scr_idx == 0) || (l == 0)) // long Enter wird durch l == 0 brücksichtigt
295
                        return_m_pkt(l);                                                                // um bei Rücksprung auf ursprünglichen Menüpunkt zu zeigen oder Displ_Main_Disp()
296
                else {
297
                        m_pkt = 1;                                                                                      // 0 wäre "zurück", so aber ins Untermenü immer erster Menüpunkt
298
                        pmenu[l] = scr_idx + '0';                               // nächsten MenueIndex anhängen 1 oder 2 oder ...
299
                        pmenu[++l] ='\0';
300
                        Beep(BEEPENTER);
301
                }
302
        }
303
        exit_while = 0;
304
}
305
 
306
/************************************************************************************/
307
/*                                                                                                                                                                                                                                                                                                                                      */
308
/*      Ändern der Werte mit Tasten +,- und Anzeige                                                                                                                                                     */
309
/*      z.B. für U-Offset, Batterie leer Eingabe ...                                                                                                                                            */
310
/*                                                                                                                                                                                                                                                                                                                                      */
311
/*      Parameter:                                                                                                                                                                                                                                                                                      */
312
/*      uint16_t                        val                                     :zu ändernter Wert                                                                                                                                      */
313
/*      uint16_t min_val, max_val               :min, max Grenze Wert ändern darf                                                                               */
314
/*      uint8_t posX, posY                                      :Darstellung Wert xPos, YPos auf LCD                                                            */
315
/*      Displ_Fnct_t    Displ_Fnct              :Pointer auf Funktion Addr. Display(val)                                                */
316
/*      uint8_t                         cycle                                   :0 begrenzt Anzeige bei man_val, bzw. max_val                           */
317
/*                                                                                                                      :1 springt nach max_val auf min_val und umgedreht               */
318
/*      uint8_t                         vrepeat                         :beschleunigte Repeat-Funktion aus/ein                                                  */
319
/*      uint16_t Change_Value_plmi(...)         :Rückgabe geänderter Wert                                                                                       */
320
/*                                                                                                                                                                                                                                                                                                                                      */
321
/************************************************************************************/
322
uint16_t Change_Value_plmi(uint16_t val, uint16_t min_val, uint16_t max_val, uint8_t posX, uint8_t posY, \
323
                                                                                                         Displ_Fnct_t Displ_Fnct, uint8_t cycle, uint8_t vrepeat)
324
{
325
        // >> Menueauswahl nach oben
326
        if( Get_Key_Press( 1<<SW_PLUS ) || Get_Key_Rpt( 1<<SW_PLUS )){
327
                if (val < max_val) {
328
                        val++;
329
                        Key_Speedup_rpt(vrepeat);               // beschleunigte Repeat-Funktion
330
                }
331
                else
332
                        if (cycle) val = min_val;
333
                lcdGotoXY(posX, posY);                          // lcd Position Wert
334
                Displ_Fnct(val);                                                        // geänderten Wert darstellen, je nach Menüpunkt
335
        }
336
        // >> Menueauswahl nach unten
337
        if( Get_Key_Press( 1<<SW_MINUS ) || Get_Key_Rpt( 1<<SW_MINUS )) {
338
                if (val > min_val) {
339
                        val--;
340
                        Key_Speedup_rpt(vrepeat);               // beschleunigte Repeat-Funktion
341
                }
342
                else
343
                        if (cycle) val = max_val;
344
                lcdGotoXY(posX, posY);                          // noch einmal lcd Position, sonst zum Teil + und - gleichzeitig, Anzeige verrutscht
345
                Displ_Fnct(val);                                                        // geänderten Wert darstellen, je nach Menüpunkt
346
        }
347
        return(val);
348
}
349
 
350
/************************************************************************************/
351
/*                                                                                                                                                                                                                                                                                                                                      */
352
/*      Ändern der Werte mit Tasten +,- repetierend; (long)Entertaste und Anzeige                               */
353
/*                                                      z.B. für U-Offset, Batterie leer Eingabe ...                                                                                            */
354
/*                                                                                                                                                                                                                                                                                                                                      */
355
/*      Parameter:                                                                                                                                                                                                                                                                                      */
356
/*      uint16_t *val                                           :zu ändernter Wert                                                                                                                                              */
357
/*      uint16_t min_val, max_val       :min, max Grenze Wert ändern darf                                                                                       */
358
/*      uint8_t fl_pos                                          :Bit 7 beschleunigte Repeat-Funktion aus/ein                                    */
359
/*                                                                                                               Bit 6 zyklische Werteänderung aus/ein                                                          */
360
/*                                                                                                               Bit 4-5  z.Z. ohne Funktion                                                                                                    */
361
/*                                                                                                               Bit 0-3 Wert xPos auf LCD                                                                                                              */
362
/*      Displ_Fnct_t    Displ_Fnct      :Pointer auf Funktion Addr. Display(val)                                                        */
363
/*      uint8_t Change_Value(...)       :Rückgabe geändert ergibt TRUE                                                                                          */
364
/*                                                                                                                                                                                                                                                                                                                                      */
365
/************************************************************************************/
366
// Bei Bedarf könnte einfach innerhalp fl_pos auch noch pos_y (Bit 4-5) übergeben werden
367
uint8_t Change_Value(uint16_t *val, uint16_t min_val, uint16_t max_val, uint8_t fl_pos, Displ_Fnct_t Displ_Fnct)
368
{ uint16_t tmp_val;
369
 
370
        tmp_val = *val;
371
        lcdGotoXY(fl_pos & POSXMASK, ZLE_VAL);          // Position Wert
372
        Displ_Fnct(tmp_val);                                                                                    // initiale Wertdarstellung, je nach Menüpunkt
373
        if (pmenu[0] =='\0') strcpy(pmenu, "0");        // sonst wird eventuell nachfolgende while-Schleife nicht ausgeführt
374
        // bis Menueeingabe bestätigt oder zum vorherigen Menue
375
        while( !Get_Key_Short( 1<<SW_ENTER ) && !Long_Enter() && !exit_while)
376
                *val = Change_Value_plmi(*val, min_val, max_val, fl_pos & POSXMASK, ZLE_VAL, Displ_Fnct, fl_pos & (1<<CYCLE), fl_pos & (1<<V_REPEAT));
377
 
378
        lcdClear();
379
        if (exit_while) {
380
                exit_while = 0;
381
                *val = tmp_val;
382
        }
383
        else
384
                return_m_pkt(strlen(pmenu));            // um bei Rücksprung auf ursprünglichen Menüpunkt zeigen oder Displ_Main_Disp()
385
        return(tmp_val != *val);
386
}
387
 
388
/**************************************************************/
389
/*                                                                                                                                                                                                                                              */
390
/*                                               LCD-Darstellungen der Menüs                                                                            */
391
/*      Zur Unterstützung der Auswahl werden einige Einstellungen */
392
/*      sofort ausgeführt. Z.B.: Kontrast, Servo-Endausschlag                   */
393
/*                                                                                                                                                                                                                                              */
394
/**************************************************************/
395
 
396
/************************************************************************************/
397
/*      zeigt Menü-     * Überschrift * auf erste Zeile mittig auf Display an                                                           */
398
/*      Parameter:                                                                                                                                                                                                                                                                                      */
399
/*      uint8_t message         : index (MSG_) der darzustellenden Zeichenkette                                                         */
400
/*                                                                                                                                                                                                                                                                                                                                      */
401
/************************************************************************************/
402
void Displ_Title(uint8_t message)
403
{ uint8_t l;
404
        uint8_t x = 0;
405
 
406
        l = strlen(Msg(message));
407
        if ( LCD_COLS > l) x = (LCD_COLS - l)/2;
408
        if (x > 1) {
409
                lcdGotoXY(x - 2, 0);
410
                lcdPuts("* ");
411
                lcdPuts(Msg(message));
412
                lcdPutc(' ');
413
        }
414
        else {
415
                lcdGotoXY(0, 0);
416
                lcdPutc('*');
417
                lcdGotoXY(x, 0);
418
                lcdPuts(Msg(message));
419
                lcdGotoXY(LCD_COLS - 1, 0);
420
        }
421
        lcdPutc('*');
422
}
423
 
424
/************************************************************************************/
425
/*                              zeigt bei Programmstart Firmware- und DOGM-Version auf Display an                                       */
426
/*                                                                                                                                                                                                                                                                                                                                      */
427
/************************************************************************************/
428
void Displ_Version(void)
429
{
430
        lcdGotoXY(0, 0);
431
        lcdPuts(Msg(MSG_VERSION1));
432
        if (dogm_vers == DOGM3V)
433
                lcdPuts(Msg(MSG_UHW33V));
434
        else
435
                lcdPuts(Msg(MSG_UHW5V));
436
        lcdPuts(Msg(MSG_VERSION2));
437
        delay_ms100x(30);
438
        lcdClear();
439
}
440
 
441
/************************************************************************************/
442
/*      zeigt auszuwählenden/-gewählten Kanal und Frequenz auf Display an                                                               */
443
/*      Parameter:                                                                                                                                                                                                                                                                                      */
444
/*      uint16_t k                                              :Index anzuzeigender Wert = Kanal + 0x30 als Char,                              */
445
/*                                                                                               uint16_t wegen Vereinheitlichung f. Funktionsaufrauf                   */
446
/*                                                                                                                                                                                                                                                                                                                                      */
447
/************************************************************************************/
448
void Displ_Channels(uint16_t k)
449
{ char *channels[] = {"5740", "5760","5780", "5800", "5820", "5840", "5860"};
450
 
451
        lcdPutc(k+0x30);
452
        lcdPuts(": ");
453
        lcdPuts(channels[k-1]);
454
        lcdPuts("MHz");
455
}
456
 
457
/************************************************************************************/
458
/*      zeigt Source AV1, AV2 oder Diversity zur Auswahl auf Display an                                                                 */
459
/*      Parameter:                                                                                                                                                                                                                                                                                      */
460
/*      uint16_t q                                              :Index anzuzeigender Wert,                                                                                                                              */
461
/*                                                                                               unint16_t wegen Vereinheitlichung f. Funktionsaufrauf          */
462
/*                                                                                                                                                                                                                                                                                                                                      */
463
/************************************************************************************/
464
void Displ_AV_Source(uint16_t q)
465
{ uint8_t av_src_table[] = {MSG_AV1, MSG_AV2, MSG_DIVERSITY};
466
 
467
        lcdPutStrMid(Msg(av_src_table[q]), ZLE_VAL);
468
}
469
 
470
/************************************************************************************/
471
/*      zeigt Tracking-Varianten zur Auswahl auf Display an                                                                                                                     */
472
/*      Parameter:                                                                                                                                                                                                                                                                                      */
473
/*      uint16_t q                                              :Index anzuzeigender Wert,                                                                                                                              */
474
/*                                                                                               uint16_t wegen Vereinheitlichung f. Funktionsaufrauf                   */
475
/*                                                                                                                                                                                                                                                                                                                                      */
476
/************************************************************************************/
477
void Displ_sel_Tracking(uint16_t q)
478
{ uint8_t track_sel_table[] = {MSG_OFF, MSG_TRACK_RSSI, MSG_TRACK_GPS, MSG_TRACK_MKCOCKPIT, MSG_TRACK_NMEA};
479
 
480
        lcdPutStrMid(Msg(track_sel_table[q]), ZLE_VAL);
481
}
482
 
483
/************************************************************************************/
484
/*      zeigt Senden der OSD-Daten Anforderung zur Auswahl auf Display an                                                               */
485
/*      Parameter:                                                                                                                                                                                                                                                                                      */
486
/*      uint16_t q                                              :Index anzuzeigender Wert,                                                                                                                              */
487
/*                                                                                               uint16_t wegen Vereinheitlichung f. Funktionsaufrauf                   */
488
/*                                                                                                                                                                                                                                                                                                                                      */
489
/************************************************************************************/
490
void Displ_track_TX(uint16_t q)
491
{ uint8_t track_TX_table[] = {MSG_OFF, MSG_TRACK_TX_ON};
492
 
493
        lcdPutStrMid(Msg(track_TX_table[q]), ZLE_VAL);
494
}
495
 
496
/************************************************************************************/
497
/*      zeigt einen max. 3-stelligen Integerwert auf Display an                                                                                                 */
498
/*      Parameter:                                                                                                                                                                                                                                                                                      */
499
/*      uint16_t val                            :anzuzeigender Wert,                                                                                                                                                            */
500
/*                                                                                       uint16_t wegen Vereinheitlichung f. Funktionsaufrauf                           */
501
/*                                                                                                                                                                                                                                                                                                                                      */
502
/************************************************************************************/
503
void Displ_Format_Int(uint16_t val)
504
{
505
        lcdPuts(my_itoa(val, 3, 0, 0));
506
}
507
 
508
/************************************************************************************/
509
/*      zeigt den Kontrastwert auf Display an mit sofortiger Änderung                                                                           */
510
/*      Parameter:                                                                                                                                                                                                                                                                                      */
511
/*      uint16_t val                            :anzuzeigender Wert,                                                                                                                                                            */
512
/*                                                                                       uint16_t wegen Vereinheitlichung f. Funktionsaufrauf                           */
513
/*                                                                                                                                                                                                                                                                                                                                      */
514
/************************************************************************************/
515
void Displ_Set_Contrast(uint16_t val)
516
{
517
        Displ_Format_Int(val);
518
        lcdContrast(dogm_vers, val);
519
}
520
 
521
/************************************************************************************/
522
/*      zeigt die Zeit zur Abschaltung der LCD-Hintergrundbeleuchtung an                                                                */
523
/*      Parameter:                                                                                                                                                                                                                                                                                      */
524
/*      uint16_t val                            :anzuzeigender Wert,                                                                                                                                                            */
525
/*                                                                                       uint16_t wegen Vereinheitlichung f. Funktionsaufrauf                           */
526
/*                                                                                                                                                                                                                                                                                                                                      */
527
/************************************************************************************/
528
void Displ_Backgr_Light(uint16_t val)
529
{ char str[5];
530
 
531
        switch(val) {
532
                case BACKGR_LIGHT_MIN : lcdPuts(Msg(MSG_LIGHT_OFF));
533
                                                                                                                break;
534
                case BACKGR_LIGHT_MAX : lcdPuts(Msg(MSG_LIGHT_ON));
535
                                                                                                                break;
536
                default :                                                       itoa (val * 10, str, 10);
537
                                                                                                                lcdPutc(' ');
538
                                                                                                                lcdPuts(str);
539
                                                                                                                lcdPuts(Msg(MSG_SEC));
540
        }
541
        lcdClearEOL();
542
}
543
 
544
/************************************************************************************/
545
/*      zeigt ein oder aus zur Auswahl auf Display an                                                                                                                                           */
546
/*      Parameter:                                                                                                                                                                                                                                                                                      */
547
/*      uint16_t val                            :0 = aus oder 1 = ein,                                                                                                                                                  */
548
/*                                                                                       uint16_t wegen Vereinheitlichung f. Funktionsaufrauf                           */
549
/*                                                                                                                                                                                                                                                                                                                                      */
550
/************************************************************************************/
551
void Displ_Off_On(uint16_t val)
552
{
553
        if (val == 0) lcdPuts(Msg(MSG_OFF)); else lcdPuts(Msg(MSG_ON));
554
}
555
 
556
/************************************************************************************/
557
/*      zeigt Servoschritte zur Auswahl auf Display an                                                                                                                                  */
558
/*      Parameter:                                                                                                                                                                                                                                                                                      */
559
/*      uint16_t val                            :0 = 255 oder 1 = 1023,                                                                                                                                                 */
560
/*                                                                                       uint16_t wegen Vereinheitlichung f. Funktionsaufrauf                           */
561
/*                                                                                                                                                                                                                                                                                                                                      */
562
/************************************************************************************/
563
void Displ_Servo_Steps(uint16_t val)
564
{ uint8_t servo_step_table[] =          {MSG_STEPS_255, MSG_STEPS_1023};
565
 
566
        lcdPutStrMid(Msg(servo_step_table[val]), ZLE_VAL);
567
}
568
 
569
/************************************************************************************/
570
/*      zeigt Servo-Anschlagposition links auf Display an                                                                                                                       */
571
/*      mit sofortiger Wirkung auf Servo                                                                                                                                                                                                */
572
/*      Parameter:                                                                                                                                                                                                                                                                                      */
573
/*      uint16_t val                            :anzuzeigender Wert,                                                                                                                                                            */
574
/*                                                                                       uint16_t wegen Vereinheitlichung f. Funktionsaufrauf                           */
575
/*                                                                                                                                                                                                                                                                                                                                      */
576
/************************************************************************************/
577
void Displ_Servo_Min(uint16_t val)
578
{ uint16_t steps = 0;
579
 
580
        Displ_Format_Int(val);
581
        servoSet_min(servo_nr, val);                                                                    // Wert setzen damit nachfolgend die
582
        if (servo[servo_nr].rev) steps = ServoSteps();
583
        servoSetPosition(servo_nr, steps);                                              // Änderung direkt am Servo sichtbar ist
584
}
585
 
586
/************************************************************************************/
587
/*      zeigt Servo-Anschlagposition rechts auf Display an                                                                                                                      */
588
/*      mit sofortiger Wirkung auf Servo                                                                                                                                                                                                */
589
/*      Parameter:                                                                                                                                                                                                                                                                                      */
590
/*      uint16_t val                            :anzuzeigender Wert,                                                                                                                                                            */
591
/*                                                                                       uint16_t wegen Vereinheitlichung f. Funktionsaufrauf                           */
592
/*                                                                                                                                                                                                                                                                                                                                      */
593
/************************************************************************************/
594
void Displ_Servo_Max(uint16_t val)
595
{ uint16_t steps = ServoSteps();
596
 
597
        Displ_Format_Int(val);
598
        servoSet_max(servo_nr, val);                                                                    // Wert setzen damit nachfolgend die
599
        if (servo[servo_nr].rev) steps = 0;
600
        servoSetPosition(servo_nr, steps);                                              // Änderung direkt am Servo sichtbar ist
601
}
602
 
603
/************************************************************************************/
604
/*      zeigt Servo-Anschlagposition Mitte auf Display an                                                                                                                               */
605
/*      mit sofortiger Wirkung auf Servo                                                                                                                                                                                                */
606
/*      Parameter:                                                                                                                                                                                                                                                                                      */
607
/*      uint16_t val                            :anzuzeigender Wert,                                                                                                                                                            */
608
/*                                                                                       uint16_t wegen Vereinheitlichung f. Funktionsaufrauf                           */
609
/*                                                                                                                                                                                                                                                                                                                                      */
610
/************************************************************************************/
611
void Displ_Servo_Mid(uint16_t val)
612
{ int16_t mid_val;
613
 
614
        mid_val = val - ServoSteps()/2;
615
        lcdPuts(my_itoa(mid_val, 4, 0, 0));
616
        servoSet_mid(servo_nr, val);                                                                    // Wert setzen damit nachfolgend die
617
        servoSetPosition(servo_nr, ServoSteps()/2);     // Änderung direkt am Servo sichtbar ist
618
}
619
 
620
/************************************************************************************/
621
/*      zeigt zu testende Servonummer zur Auswahl auf Display an                                                                                                */
622
/*      Parameter:                                                                                                                                                                                                                                                                                      */
623
/*      uint16_t val                            :0 = Servo 1 oder 1 = Servo 2,                                                                                                                  */
624
/*                                                                                       uint16_t wegen Vereinheitlichung f. Funktionsaufrauf                           */
625
/*                                                                                                                                                                                                                                                                                                                                      */
626
/************************************************************************************/
627
void Displ_ServoNr(uint16_t val)
628
{
629
        if (val == 0) lcdPuts(Msg(MSG_SERVO1)); else lcdPuts(Msg(MSG_SERVO2));
630
}
631
 
632
 
633
/************************************************************************************/
634
/*      zeigt Servoausschlag in ms, in % und als Bargraph auf Display an                                                                */
635
/*      Parameter:                                                                                                                                                                                                                                                                                      */
636
/*      int16_t PosProzent      : aktuell eingestellte Position vom 0-Punkt (Mitte) aus                 */
637
/*      int16_t range                           : maximaler absoluter Ausschlag vom 0-Punkt aus                                                 */
638
/*                                                                                                                                                                                                                                                                                                                                      */
639
/************************************************************************************/
640
// leerer Rahmen für Bar
641
char* empty_Bar(void)
642
{ static char tmp_empty[LCD_COLS];
643
        uint8_t i;
644
 
645
        tmp_empty[0] = '\0';                    // '['
646
        for (i = 1; i < 15; i++)
647
                tmp_empty[i] = '\x07';
648
        tmp_empty[i] = '\x06';          // ']'
649
        return(tmp_empty);
650
}
651
 
652
void draw_bar(int16_t PosProzent, int16_t range, uint8_t zle)
653
{ int8_t i, sp_quad, sp_ch;
654
        int8_t lz = 8;
655
        char* bar;
656
 
657
        bar = empty_Bar();                                                                                              // leerer Rahmen für Bar
658
        sp_quad = abs(PosProzent) * 7 / range;          // Anzahl der vollen Kästchen
659
 
660
        sp_ch = (abs(PosProzent) -(range * sp_quad / 7)) * 35 / range; // Unterteilung Kästchen in 6 senkrechte Striche
661
        if (sp_ch > 4) sp_ch = 4; // bei 28 (7*4) wäre keine Korrektur erforderlich aber so kontinuierlicher
662
        if (PosProzent < 0){
663
                lz -=   sp_quad;                                                                                                        // Position für volles Kästchen bei Linksausschlag
664
                if (sp_ch > 0) bar[lz-1] = sp_ch;                       // vor erstes volles Kästchen Kästchenunterteilung schreiben
665
        }                                                                                                                                                                       // Unterteilung Kästchen der 4 senkrechte Striche nach Bar (0 und 5 entfallen)
666
        else
667
                if (sp_ch > 0) bar[lz+sp_quad] = sp_ch;// nach lezten vollen Kästchen Kästchenunterteilung schreiben
668
 
669
        for (i = 0; i < sp_quad; i++)
670
                bar[i+lz] = '\x05';                                                                                     // volle Kästchen schreiben
671
        lcdGotoXY(0,zle);
672
        for (uint8_t i = 0; i < LCD_COLS; i++) lcdPutc(bar[i]);// kpl. Bar zum Display
673
}
674
 
675
uint16_t calc_range(int16_t PosProzent, int16_t min, int16_t max, int16_t mid)
676
{ uint16_t range;
677
 
678
        if (PosProzent < 0) {
679
                range = mid - min;
680
                if (chrxs == CHRRS) {           // falls Richtung geändert, anderen Zeichensatz laden
681
                        chrxs = CHRLS;
682
                        lcdWriteCGRAM_Array(lcdSpecialChrLs, 5);// LCD-Char mit Rahmensymbole vom Graph
683
                }
684
        }
685
        else {
686
                range = max - mid;
687
                if (chrxs == CHRLS) {           // falls Richtung geändert, anderen Zeichensatz laden
688
                        lcdWriteCGRAM_Array(lcdSpecialChrRs, 5);// LCD-Char mit Rahmensymbole vom Graph
689
                        chrxs = CHRRS;
690
                }
691
        }
692
        return(range);
693
}
694
 
695
void Displ_PulseWidth(uint16_t val)
696
{ int16_t PosProzent, range;
697
        uint16_t Pos_us;
698
        char me[3] = {"ms"};
699
 
700
        servoSetPositionRaw(servo_nr, val);
701
 
702
        PosProzent = val - steps_pw[sIdxSteps].mid;
703
        range = calc_range(PosProzent, steps_pw[sIdxSteps].min, steps_pw[sIdxSteps].max, steps_pw[sIdxSteps].mid);
704
        draw_bar(PosProzent, range, 2); // auf 3. Display-Zeile
705
        PosProzent = (int32_t)1000 * PosProzent / range;
706
        lcdGotoXY(1, 1);
707
        Pos_us = pw_us(val);    // Zeit in µs bei x Servoschritte
708
        if (Pos_us < 1000) {
709
                me[0] = 'u';                            // soll 'µ' => programmierbarer Zeichensatz zu klein
710
                lcdPuts("  ");
711
                Displ_Format_Int(Pos_us);
712
        }
713
        else {
714
                lcdPuts(my_itoa(Pos_us, 5, 3, 3));
715
        }
716
        lcdPuts(me);
717
        lcdGotoXY(8, 1);
718
        lcdPuts(my_itoa(PosProzent, 6, 1, 1));
719
        lcdPutc('%');
720
}
721
 
722
/************************************************************************************/
723
/*      zeigt Pausenlänge der Links-, Mittel- und Rechtsposition auf Display an                                 */
724
/*      Parameter:                                                                                                                                                                                                                                                                                      */
725
/*      uint16_t val            : Zeit in 1ms * 100                                                                                                                                                                                     */
726
/*                                                                                                                                                                                                                                                                                                                                      */
727
/************************************************************************************/
728
void Displ_Pause(uint16_t val)
729
{
730
        if (val > 9) {
731
                lcdPuts(my_itoa(val, 3, 1, 1));
732
                lcdPuts("s ");
733
        }
734
        else {
735
                Displ_Format_Int(val * 100);
736
                lcdPuts("ms");
737
        }
738
}
739
 
740
/************************************************************************************/
741
/*      zeigt aus oder Integerwert auf Display an                                                                                                                                                               */
742
/*      Parameter:                                                                                                                                                                                                                                                                                      */
743
/*      uint16_t val            : val = 0 ==> aus, sont Integerwert                                                                                                                     */
744
/*                                                                                                                                                                                                                                                                                                                                      */
745
/************************************************************************************/
746
void Displ_Off_Format_Int(uint16_t val)
747
{
748
        if (val == 0)
749
                lcdPutStrMid(Msg(MSG_OFF), ZLE_VAL);
750
        else {
751
                lcdGotoXY(5,ZLE_VAL);
752
                Displ_Format_Int(val);
753
                lcdPutc(' ');
754
        }
755
}
756
 
757
/************************************************************************************/
758
/*      zeigt aus oder Pausenzeit zwischen 2 Servoschritte auf Display an                                                               */
759
/*      Parameter:                                                                                                                                                                                                                                                                                      */
760
/*      uint16_t val            : val = 0 ==> aus, sont Integerwert                                                                                                                     */
761
/*                                                                                                                                                                                                                                                                                                                                      */
762
/************************************************************************************/
763
void Displ_Pause_Step(uint16_t val)
764
{
765
        Displ_Off_Format_Int(val);
766
        if (val > 0) {
767
                lcdGotoXY(8,ZLE_VAL);
768
                lcdPuts("ms");
769
        }
770
}
771
/************************************************************************************/
772
/*      zeigt Baudrate für COM bei MKCockpit zur Auswahl auf Display an                                                                 */
773
/*      Parameter:                                                                                                                                                                                                                                                                                      */
774
/*      uint16_t q                                              :Index anzuzeigender Wert,                                                                                                                              */
775
/*                                                                                               uint16_t wegen Vereinheitlichung f. Funktionsaufrauf                   */
776
/*                                                                                                                                                                                                                                                                                                                                      */
777
/************************************************************************************/
778
void Displ_Baudrate(uint16_t q)
779
{ char str[7];
780
 
781
        ltoa(getBaud(q), str, 10);
782
        lcdPutStrMid(str, ZLE_VAL);
783
}
784
 
785
/************************************************************************************/
786
/*      zeigt aktive Empfängerzeiten auf Display an                                                                                                                                                     */
787
/*                                                                                                                                                                                                                                                                                                                                      */
788
/************************************************************************************/
789
void Displ_RX_Time(void)
790
{
791
        lcdGotoXY(6, 1);
792
        Displ_TimeHMS(rxcount0);
793
        lcdGotoXY(6, 2);
794
        Displ_TimeHMS(rxcount1);
795
}
796
 
797
/************************************************************************************/
798
/*      zeigt eingestellte Akku-Kapazität des MK auf Display an                                                                                                 */
799
/*      Parameter:                                                                                                                                                                                                                                                                                      */
800
/*      uint16_t val                            :Akku-Kapazität in 50mAh Schritte                                                                                                               */
801
/*                                                                                       uint16_t wegen Vereinheitlichung f. Funktionsaufrauf                           */
802
/*                                                                                                                                                                                                                                                                                                                                      */
803
/************************************************************************************/
804
void Displ_MK_Capacity(uint16_t val)
805
{
806
        lcdPuts(my_itoa(val * 50, 4, 0, 0));
807
        lcdPuts("mAh");
808
}
809
 
810
/************************************************************************************/
811
/*      zeigt Offset (Korrektur Ruhestrom) für Strom des MK auf Display an                                                      */
812
/*      Parameter:                                                                                                                                                                                                                                                                                      */
813
/*      uint16_t val                            :Korrekturfaktor                                                                                                                                                                                */
814
/*                                                                                       uint16_t wegen Vereinheitlichung f. Funktionsaufrauf                           */
815
/*                                                                                                                                                                                                                                                                                                                                      */
816
/************************************************************************************/
817
void Displ_I_Offset(uint16_t val)
818
{
819
        lcdPuts(my_itoa((int8_t)val - MK_I_OFFSET_5,4,1,1));
820
        lcdPutc('A');
821
}
822
 
823
 
824
/************************************************************************************/
825
/*      zeigt Korrekturfaktor für Strom und Arbeit des MK auf Display an                                                                */
826
/*      Parameter:                                                                                                                                                                                                                                                                                      */
827
/*      uint16_t val                            :Korrekturfaktor                                                                                                                                                                                */
828
/*                                                                                       uint16_t wegen Vereinheitlichung f. Funktionsaufrauf                           */
829
/*                                                                                                                                                                                                                                                                                                                                      */
830
/************************************************************************************/
831
void Displ_Faktor_2Nk(uint16_t val)
832
{
833
        lcdPuts(my_itoa(val,4,2,2));
834
}
835
 
836
/************************************************************************************/
837
/*      zeigt den Marker in Hauptdarstellung auf selektierten RX an                                                                                     */
838
/*      d Diversity, << fester RX                                                                                                                                                                                                                               */
839
/*      Parameter:                                                                                                                                                                                                                                                                                      */
840
/*      uint8_t p                               :x-Position des Markers                                                                                                                                                         */
841
/*      uint8_t marker          :Markerzeichen z.B.:'' oder 'd' oder 's'                                                                                        */
842
/*                                                                                                                                                                                                                                                                                                                                      */
843
/************************************************************************************/
844
void Displ_AV_Mark(uint8_t p, char marker)
845
{
846
        if (p < 2) {
847
                lcdGotoXY(15,2 - p);            // da p immer neue Position 0 oder 1
848
                lcdPutc(' ');                                           // bisherigen AVx-, Diversity-Marker löschen
849
                lcdGotoXY(15,p + 1);            // an neuer Positon
850
                lcdPutc(marker);                                // übergebenes Markerzeichen darstellen
851
        }
852
        else { // falls beim Einschalten Diversity auf aktiv, keine Marker
853
                lcdGotoXY(15,1);
854
                lcdPutc(' ');
855
                lcdGotoXY(15,2);
856
                lcdPutc(' ');
857
        }
858
}
859
 
860
/************************************************************************************/
861
/*                                                              Hauptanzeige unter Berücksichtigung von VBat                                                                                    */
862
/*                                                                                                                                                                                                                                                                                                                                      */
863
/************************************************************************************/
864
void SetAndDispl_AV_Mark(void)
865
{ char marker;
866
 
867
        marker = av_source < DIVERSITY? MARKER_AV : MARKER_RSSI;                // wird nur bei gesetzten Diversity überschrieben 
868
        Displ_AV_Mark(sw_avx, marker);
869
}
870
 
871
void Displ_Main_Disp(void)
872
{
873
        pmenu[0] ='\0';                                         // bei Direktansprung z.B. von Menu_RSSI_min() erforderlich
874
        lcdClear();
875
        if (!bat_low) {
876
                lcdClear();
877
                Displ_Channels(channel);
878
                lcdGotoXY(LCD_COLS - 1, 0);
879
                lcdPuts("V\n1\n2");
880
                SetAndDispl_AV_Mark();
881
                Displ_VBat();                                   // muss zuletzt stehen
882
        }
883
        else {
884
                lcdPutStrMid(Msg(MSG_ACCU_LOW), 0);
885
        }
886
}
887
 
888
 
889
 
890
/**************************************************************/
891
/*                                                                                                                                                                                                                                              */
892
/*                                                                                                      Menüs                                                                                                                   */
893
/*                                                                                                                                                                                                                                              */
894
/**************************************************************/
895
 
896
/**************************/
897
/*                                                                                              */
898
/*                               Haupmenü                               */
899
/*                                                                                              */
900
/**************************/
901
void Menu_Main(void)
902
{       scr_menu_t scr_main_menu = {SCROLL_MAIN_MAX-4, MSG_RETURN, MSG_AV_SOURCE, MSG_RX_CHANNEL, MSG_RSSI_CALIBR, MSG_LANGUAGE, \
903
                                                                                                                        MSG_SERVO_CALIBR, MSG_TEST_SERVO, MSG_LCD , MSG_BATTERY, MSG_TRACKING, 0, MSG_GPS_DISPLAY};
904
 
905
        switch(tracking) {
906
                case TRACKING_RSSI:                      scr_main_menu[11] = MSG_TRACK_SERVO_HYTERESE;
907
                                                                                                                 scr_main_menu[0]++;            // SCROLL_MAIN_MAX erhöhen
908
                                                                                                                 break;
909
                case TRACKING_GPS:                       scr_main_menu[11] = MSG_TRACK_TX_OSD_DATA;
910
                                                                                                                 scr_main_menu[0] += 2; // SCROLL_MAIN_MAX erhöhen, zusätzliche Anzeige zu GPS MSG_GPS_DISPLAY
911
                                                                                                                 break;
912
                case TRACKING_NMEA:                      scr_main_menu[0]++;            // SCROLL_MAIN_MAX erhöhen, zusätzliche Anzeige zu GPS 
913
                case TRACKING_MKCOCKPIT: scr_main_menu[0]++;            // SCROLL_MAIN_MAX erhöhen
914
                                                                                                                 scr_main_menu[11] = MSG_COM;
915
                                                                                                                 break;
916
        }
917
 
918
        strcpy(pmenu, "0");
919
        Scroll_Menu(scr_main_menu, m_pkt);      // pmenu global
920
        Jump_Menu(pmenu); //gewähltes Untermenü anspringen oder nur Return
921
}
922
 
923
/**************************/
924
/*                                                                                              */
925
/*                              AV-Quelle                               */
926
/*                                                                                              */
927
/**************************/
928
void Menu_AV_Source(void)
929
{ uint16_t tmp_val;
930
 
931
        Displ_Title(MSG_AV_SOURCE);
932
        tmp_val = av_source;
933
        if (Change_Value(&tmp_val, AV_SOURCE_MIN, AV_SOURCE_MAX, 3, Displ_AV_Source)) { // pmenu global
934
                cli();
935
                av_source = tmp_val;
936
                eeprom_write_byte(&ep_av_source, av_source);
937
                Double_Beep(DBEEPWR, DBEEPWRP);
938
                sw_avx = Set_AV_Source(av_source);
939
                if (pmenu[0] == '\0')                           // sonst ist AV-Source marker bei long Enter im Hauptdisplay nicht aktuallisiert
940
                        SetAndDispl_AV_Mark();
941
                sei();
942
        }
943
        Jump_Menu(pmenu);
944
}
945
 
946
/**************************/
947
/*                                                                                              */
948
/*                              Kanal                                           */
949
/*                                                                                              */
950
/**************************/
951
void Menu_RX_Channel(void)
952
{ uint16_t tmp_val;
953
 
954
        Displ_Title(MSG_RX_CHANNEL);
955
        tmp_val = channel;
956
        if (Change_Value(&tmp_val, CHANNEL_MIN, CHANNEL_MAX, 3, Displ_Channels) || (tmp_val != ch_stored)) {    // pmenu global
957
                channel = tmp_val;
958
                ch_stored = tmp_val;
959
                eeprom_write_byte(&ep_channel, channel);
960
                Double_Beep(DBEEPWR, DBEEPWRP);
961
                Set_Channel(channel);
962
                if (pmenu[0] == '\0') {                 // sonst ist channel im Hauptdisplay nicht aktuallisiert
963
                        lcdGotoXY(0,0);
964
                        Displ_Channels(channel);                // da erst jetzt die Variable für main_display geändert ist!
965
                }
966
        }
967
        Jump_Menu(pmenu);
968
}
969
 
970
/**************************/
971
/*                                                                                              */
972
/*                              RSSI                                            */
973
/*                                                                                              */
974
/**************************/
975
void Menu_RSSI_Calibr(void)
976
{ uint8_t scr_sub_menu[SCROLL_MAX_7]    = {SCROLL_MAX_7-2, MSG_RETURN, MSG_RSSI_MIN, MSG_RSSI_MIN_ALL, MSG_RSSI_MAX, MSG_RSSI_INVERT, MSG_TX_IDENTIFY};
977
 
978
        Scroll_Menu(scr_sub_menu, m_pkt);       // pmenu global
979
        Jump_Menu(pmenu);
980
}
981
 
982
void AdviceTX(uint8_t msg)
983
{ char str[20];
984
 
985
        strcpy(str, Msg(MSG_TX));
986
        strcat(str, Msg(msg));
987
        lcdPutStrMid(str, 1);
988
        lcdPutStrMid(Msg(MSG_CONTINUE), 2);
989
}
990
 
991
void Menu_RSSI_min(void)
992
{
993
        Displ_Title(MSG_RSSI_MIN);
994
        AdviceTX(MSG_TX_OFF);
995
        if (Short_Enter()) {                                                    // pmenu global
996
                RSSI_Min_Calibrate(0, bar_udbm);
997
                Displ_Main_Disp();                                                      // da erst jetzt die Variable für main_display geändert ist!
998
        }
999
        else
1000
                Jump_Menu(pmenu);
1001
}
1002
 
1003
void Displ_RSSImin_allError(char *str_ch)
1004
{ char str[LCD_COLS + 1];
1005
 
1006
        lcdClear();
1007
        strcpy(str, Msg(MSG_CALIB));
1008
        strcat(str, "-");
1009
        strcat(str, Msg(MSG_ERROR));
1010
        lcdPutStrMid(str,0);
1011
        lcdPutStrMid(Msg(MSG_RX_CHANNEL),1);
1012
        lcdPutStrMid(str_ch, 2);
1013
        delay_ms100x(30);
1014
}
1015
 
1016
void Menu_RSSI_min_all(void)
1017
{ char not_cal[15];
1018
        uint8_t f = 0;
1019
 
1020
        Displ_Title(MSG_RSSI_MIN_ALL);
1021
        AdviceTX(MSG_TX_OFF);
1022
        if (Short_Enter()) {                                            // pmenu global
1023
                for ( uint8_t i = 1; i <= CHANNEL_MAX; i++) {
1024
                        Set_Channel(i);
1025
                        if (!RSSI_Min_Calibrate(i, bar_udbm)) {
1026
                                not_cal[f++] = i + 0x30;
1027
                                not_cal[f++] = ',';
1028
                        }
1029
                }
1030
                Set_Channel(channel);
1031
                Double_Beep(DBEEPWR, DBEEPWRP);
1032
                if (f > 0) {                                                            // Konnten einige Kanäle nicht auf RSSI-Min kalibiert werden?
1033
                        not_cal[--f] = '\0';                    // letzes Komma durch Stringende ersetzen
1034
                        Displ_RSSImin_allError(not_cal);
1035
                }
1036
                Displ_Main_Disp();
1037
        }
1038
        else
1039
                Jump_Menu(pmenu);
1040
}
1041
 
1042
void Menu_RSSI_max(void)
1043
{
1044
        Displ_Title(MSG_RSSI_MAX);
1045
        AdviceTX(MSG_TX_ON);
1046
        if (Short_Enter()) {                                    // pmenu global
1047
                RSSI_Max_Calibrate(bar_udbm);
1048
                Displ_Main_Disp();
1049
        }
1050
        else
1051
                Jump_Menu(pmenu);
1052
}
1053
 
1054
 
1055
/* Wichtig bei invertierten RX-RSSI */
1056
void Menu_RSSI_invert(void)
1057
{ uint16_t tmp_val;
1058
 
1059
        Displ_Title(MSG_RSSI_INVERT);
1060
        tmp_val = rssi_inv;
1061
        if (Change_Value(&tmp_val, 0, 1, 6, Displ_Off_On)) { // pmenu global; RSSI invertieren gibt es nur 0=off, 1=on
1062
                rssi_inv = tmp_val;
1063
                eeprom_write_byte(&ep_rssi_inv, rssi_inv);
1064
                Double_Beep(DBEEPWR, DBEEPWRP);
1065
        }
1066
        Jump_Menu(pmenu);
1067
 
1068
}
1069
 
1070
 
1071
/* Schwellwert-Einstellungen für Erkennung Sender ein/aus */
1072
void Displ_TX_status(uint16_t val)      // für Min_Calibrate
1073
{
1074
        Displ_Off_Format_Int(val);
1075
        lcdGotoXY(strlen(Msg(MSG_TX_STATUS)), 2);
1076
        if (ADC_Read_inv(RSSI0) + ADC_Read_inv(RSSI1)  > val)
1077
                lcdPuts(Msg(MSG_OFF));
1078
        else
1079
          lcdPuts(Msg(MSG_ON));
1080
}
1081
 
1082
void Menu_TX_identyfy(void)
1083
{ uint8_t scr_sub_menu[SCROLL_MAX_6]    = {SCROLL_MAX_4-2, MSG_RETURN, MSG_TX_STATUS_OFF, MSG_TX_STATUS_ON};
1084
 
1085
        Scroll_Menu(scr_sub_menu, m_pkt);       // pmenu global
1086
        Jump_Menu(pmenu);
1087
}
1088
 
1089
void Menu_TX_status_off(void)   // für Min_Calibrate
1090
{       uint16_t tmp_val;
1091
 
1092
        Displ_Title(MSG_TX_STATUS_OFF);
1093
        lcdGotoXY(0, 2);
1094
        lcdPuts(Msg(MSG_TX_STATUS));
1095
        tmp_val = tx_value_off;
1096
        if (Change_Value(&tmp_val, TX_VALUE_OFF_MIN, TX_VALUE_OFF_MAX, 5|(1<<V_REPEAT), Displ_TX_status)) { // pmenu global
1097
                tx_value_off = tmp_val;
1098
                eeprom_write_word(&ep_tx_value_off, tx_value_off);
1099
                Double_Beep(DBEEPWR, DBEEPWRP);
1100
        }
1101
        Jump_Menu(pmenu);
1102
}
1103
 
1104
void Menu_TX_status_on(void)
1105
{       uint16_t tmp_val;
1106
 
1107
        Displ_Title(MSG_TX_STATUS_ON);
1108
        lcdGotoXY(0, 2);
1109
        lcdPuts(Msg(MSG_TX_STATUS));
1110
        tmp_val = tx_value_on;
1111
        if (Change_Value(&tmp_val, TX_VALUE_ON_MIN, TX_VALUE_ON_MAX, 5|(1<<V_REPEAT), Displ_TX_status)) { // pmenu global
1112
                tx_value_on = tmp_val;
1113
                eeprom_write_word(&ep_tx_value_on, tx_value_on);
1114
                Double_Beep(DBEEPWR, DBEEPWRP);
1115
        }
1116
        Jump_Menu(pmenu);
1117
}
1118
 
1119
/**************************/
1120
/*                                                                                              */
1121
/*                              Sprache                                 */
1122
/*                                                                                              */
1123
/**************************/
1124
void Displ_Language(uint16_t i)
1125
{ uint8_t lanuage_table[3] = {MSG_GERMAN, MSG_ENGLISH, MSG_FRENCH};
1126
 
1127
        lcdPutStrMid(Msg(lanuage_table[i]), ZLE_VAL);
1128
}
1129
 
1130
void Menu_Language(void)
1131
{ uint16_t tmp_val;
1132
 
1133
        Displ_Title(MSG_LANGUAGE);
1134
        tmp_val = language;
1135
        language = eeprom_read_byte(&ep_language); // damit bei Erstinbetriebnahme Sprache gespeichert wird NO_LANGUAGE
1136
        Change_Value(&tmp_val, GERMAN, LAST_LANG, 3, Displ_Language); // pmenu global
1137
        if (tmp_val != language) {
1138
                language = tmp_val;
1139
                eeprom_write_byte(&ep_language, language);
1140
                Double_Beep(DBEEPWR, DBEEPWRP);
1141
        }
1142
        Jump_Menu(pmenu);
1143
}
1144
 
1145
/**************************/
1146
/*                                                                                              */
1147
/*      Servo-Einstellungen             */
1148
/*                                                                                              */
1149
/**************************/
1150
void Menu_Servo_Calibr(void)
1151
{ uint8_t scr_sub_menu[SCROLL_MAX_5] = {SCROLL_MAX_5 - 2, MSG_RETURN, MSG_SERVO_STEPS, MSG_SERVO1, MSG_SERVO2};
1152
 
1153
        Scroll_Menu(scr_sub_menu, m_pkt); // pmenu global
1154
        Jump_Menu(pmenu);
1155
}
1156
 
1157
void NoTracking_ServosOff(void)
1158
{
1159
        if (tracking == TRACKING_MIN) {
1160
                delay_ms100x(4);                                // sonst werden Impulse bereits vor erreichen der Servo-default-Stellung abgeschaltet
1161
                servoOff();                                                     // Servos sind nur zum Tracking oder bei Kalibrierung eingeschaltet
1162
        }
1163
}
1164
 
1165
void Servo_NewValues(uint8_t idx_presc)
1166
{
1167
        for (uint8_t i = 0; i < SERVO_NUM_CHANNELS; i++) {
1168
                if (idx_presc == STEPS_255) {                   // Werte umrechnen für Prescaler = 256
1169
                        servo[i].min /= 4;
1170
                        servo[i].max /= 4;
1171
                        servo[i].mid /= 4;
1172
                }
1173
                else {                                                                                                          // Werte umrechnen für Prescaler = 64
1174
                        servo[i].min *= 4;
1175
                        servo[i].max *= 4;
1176
                        servo[i].mid    = (servo[i].mid + 1) * 4 - 1;
1177
                }
1178
                servoSet_min(i, servo[i].min);
1179
                servoSet_max(i, servo[i].max);
1180
                servoSet_mid(i, servo[i].mid);
1181
                eeprom_write_block(&servo[i],&ep_servo[i],sizeof(servo_t));
1182
        }
1183
        // Vorberechnung von ServoChannels[channel].duty
1184
        servoSetDefaultPos();                                                           // Ausgangsstellung beider Servos
1185
}
1186
 
1187
void Menu_Servo_Steps(void)
1188
{ uint16_t tmp_val;
1189
 
1190
        Displ_Title(MSG_SERVO_STEPS);
1191
        lcdGotoXY(8, ZLE_VAL);
1192
        tmp_val = sIdxSteps;
1193
        if (Change_Value(&tmp_val, STEPS_255, STEPS_1023, 5, Displ_Servo_Steps)) { // pmenu global
1194
                cli();
1195
                sIdxSteps = tmp_val;
1196
                eeprom_write_byte(&ep_sIdxSteps, sIdxSteps);
1197
                Servo_NewValues(sIdxSteps);                             // hier ist der neue Index anzugeben!
1198
                servoInit(SERVO_PERIODE);
1199
                sei();
1200
                NoTracking_ServosOff();
1201
                Double_Beep(DBEEPWR, DBEEPWRP);
1202
        }
1203
        Jump_Menu(pmenu);
1204
}
1205
 
1206
void Menu_Servo1(void)
1207
{ uint8_t scr_servo_menu[SCROLL_MAX_6] = {SCROLL_MAX_6 - 2, MSG_RETURN, MSG_SERVO1_REVERSE, MSG_CALIB1_LEFT, MSG_CALIB1_RIGHT, MSG_CALIB1_MIDDLE};
1208
 
1209
        Scroll_Menu(scr_servo_menu, m_pkt); // pmenu global
1210
        servo_nr = 0;
1211
        Jump_Menu(pmenu);
1212
}
1213
 
1214
void Menu_Servo2(void)
1215
{ uint8_t scr_servo_menu[SCROLL_MAX_6] = {SCROLL_MAX_6 - 2, MSG_RETURN, MSG_SERVO2_REVERSE, MSG_CALIB2_LEFT, MSG_CALIB2_RIGHT, MSG_CALIB2_MIDDLE};
1216
 
1217
        Scroll_Menu(scr_servo_menu, m_pkt); // pmenu global
1218
        servo_nr = 1;
1219
        Jump_Menu(pmenu);
1220
}
1221
 
1222
uint8_t Servo_tmp_on(uint8_t servo_period)
1223
{ uint8_t tmp_tracking = tracking;
1224
 
1225
        tracking = 0;                                                                                           // Servopositionierung durch tracking abschalten
1226
        if (tracking == TRACKING_MIN) servoInit(servo_period); // falls aus, Servos einschalten
1227
        lcdGotoXY(0, 0);                                                                                // lcd Cursor vorpositionieren
1228
        return(tmp_tracking);
1229
}
1230
 
1231
void Servo_tmp_Original(uint8_t track)
1232
{
1233
        servoSetDefaultPos();
1234
        tracking = track;                                                                               // ursprünglicher Wert Tracking aus, RSSI oder GPS
1235
        NoTracking_ServosOff();                                                 // Servos sind nur zum Tracking oder bei Kalibrierung eingeschaltet
1236
        Jump_Menu(pmenu);
1237
}
1238
 
1239
void Menu_Servo_rev(void)
1240
{ uint16_t tmp_val;
1241
        uint8_t tmp_tracking;
1242
 
1243
        tmp_tracking = Servo_tmp_on(SERVO_PERIODE);
1244
        tmp_val = servo[servo_nr].rev;
1245
        if (Change_Value(&tmp_val , 0, 1, 6, Displ_Off_On)) { // pmenu global; reverse gibt es nur 0=off, 1=on
1246
                servo[servo_nr].rev = tmp_val ;
1247
                servoSet_rev(servo_nr, tmp_val );
1248
                eeprom_write_block(&servo[servo_nr],&ep_servo[servo_nr],sizeof(servo_t));
1249
                Double_Beep(DBEEPWR, DBEEPWRP);
1250
        }
1251
        Servo_tmp_Original(tmp_tracking);
1252
}
1253
 
1254
void Menu_Servo1_rev(void)
1255
{
1256
        Displ_Title(MSG_SERVO1_REVERSE);
1257
        Menu_Servo_rev();
1258
}
1259
 
1260
void Menu_Servo2_rev(void)
1261
{
1262
        Displ_Title(MSG_SERVO2_REVERSE);
1263
        Menu_Servo_rev();
1264
}
1265
 
1266
void Menu_Servo_left(void)
1267
{ uint16_t tmp_val;
1268
        uint8_t tmp_tracking;
1269
 
1270
        tmp_tracking = Servo_tmp_on(SERVO_PERIODE);
1271
        servoSetPosition(servo_nr, ServoSteps());                               // Linkssanschlag um Kalibrierung am Servo zu sehen
1272
        tmp_val = servo[servo_nr].max;
1273
        if (Change_Value(&tmp_val, servo_limit[sIdxSteps][LEFT].min, servo_limit[sIdxSteps][LEFT].max, 6|(1<<V_REPEAT), Displ_Servo_Max)) { // pmenu global
1274
                servo[servo_nr].max = tmp_val;
1275
                eeprom_write_block(&servo[servo_nr],&ep_servo[servo_nr],sizeof(servo_t));
1276
                servoSet_mid(servo_nr, servo[servo_nr].mid);            // Mittelposition muss sich bei Ausschlagsänderung verschieben
1277
                Double_Beep(DBEEPWR, DBEEPWRP);
1278
        }
1279
        Servo_tmp_Original(tmp_tracking);
1280
}
1281
 
1282
void Menu_Servo1_left(void)
1283
{
1284
        Displ_Title(MSG_CALIB1_LEFT);
1285
        Menu_Servo_left();
1286
}
1287
 
1288
void Menu_Servo2_left(void)
1289
{
1290
        Displ_Title(MSG_CALIB2_LEFT);
1291
        Menu_Servo_left();
1292
}
1293
 
1294
void Menu_Servo_right(void)
1295
{ uint16_t tmp_val;
1296
        uint8_t tmp_tracking;
1297
 
1298
        tmp_tracking = Servo_tmp_on(SERVO_PERIODE);
1299
        servoSetPosition(servo_nr, 0);                                                                          // Rechtsanschlag um Kalibrierung am Servo zu sehen
1300
        tmp_val = servo[servo_nr].min;
1301
        if (Change_Value(&tmp_val, servo_limit[sIdxSteps][RIGHT].min, servo_limit[sIdxSteps][RIGHT].max, 6|(1<<V_REPEAT), Displ_Servo_Min)) { // pmenu global
1302
                servo[servo_nr].min = tmp_val;
1303
                eeprom_write_block(&servo[servo_nr],&ep_servo[servo_nr],sizeof(servo_t));
1304
                servoSet_mid(servo_nr, servo[servo_nr].mid);            // Mittelposition muss sich bei Ausschlagsänderung verschieben
1305
                Double_Beep(DBEEPWR, DBEEPWRP);
1306
        }
1307
         Servo_tmp_Original(tmp_tracking);
1308
}
1309
 
1310
void Menu_Servo1_right(void)
1311
{
1312
        Displ_Title(MSG_CALIB1_RIGHT);
1313
        Menu_Servo_right();
1314
}
1315
 
1316
void Menu_Servo2_right(void)
1317
{
1318
        Displ_Title(MSG_CALIB2_RIGHT);
1319
        Menu_Servo_right();
1320
}
1321
 
1322
void Menu_Servo_middle(void)
1323
{ uint16_t tmp_val;
1324
        uint8_t tmp_tracking;
1325
 
1326
        tmp_tracking = Servo_tmp_on(SERVO_PERIODE);
1327
        servoSetPosition(servo_nr, ServoSteps()/2);                     // Mittelposition um Kalibrierung am Servo zu sehen
1328
        tmp_val = servo[servo_nr].mid;
1329
        if (Change_Value(&tmp_val, servo_limit[sIdxSteps][MIDDLE].min, servo_limit[sIdxSteps][MIDDLE].max, 5|(1<<V_REPEAT), Displ_Servo_Mid)) { // pmenu global
1330
                servo[servo_nr].mid = tmp_val;
1331
                eeprom_write_block(&servo[servo_nr], &ep_servo[servo_nr], sizeof(servo_t));
1332
                Double_Beep(DBEEPWR, DBEEPWRP);
1333
        }
1334
        Servo_tmp_Original(tmp_tracking);
1335
}
1336
 
1337
void Menu_Servo1_middle(void)
1338
{
1339
        Displ_Title(MSG_CALIB1_MIDDLE);
1340
        Menu_Servo_middle();
1341
}
1342
 
1343
void Menu_Servo2_middle(void)
1344
{
1345
        Displ_Title(MSG_CALIB2_MIDDLE);
1346
        Menu_Servo_middle();
1347
}
1348
 
1349
/**************************/
1350
/*                                                                                              */
1351
/*                      Servos-Tests                    */
1352
/*                                                                                              */
1353
/**************************/
1354
void Menu_Servo_Test(void)
1355
{ uint8_t scr_sub_menu[SCROLL_MAX_6]    = {SCROLL_MAX_6 - 2, MSG_RETURN, MSG_PULSE_WIDTH, MSG_CONTINOUS, MSG_SERVO, MSG_FRAME};
1356
 
1357
        Scroll_Menu(scr_sub_menu, m_pkt); // pmenu global
1358
        servo_nr = eeprom_read_byte(&ep_servo_nr);
1359
        Jump_Menu(pmenu);
1360
}
1361
 
1362
void Menu_Test_Frame(void)
1363
{ uint16_t tmp_val;
1364
 
1365
        Displ_Title(MSG_FRAME);
1366
        lcdGotoXY(8, ZLE_VAL);
1367
        lcdPuts("ms");
1368
        tmp_val = servo_frame;
1369
        if (Change_Value(&tmp_val, SERVO_PERIODE_MIN, SERVO_PERIODE_MAX, 5|(1<<V_REPEAT), Displ_Format_Int)) { // pmenu global
1370
                servo_frame = tmp_val;
1371
                eeprom_write_byte(&ep_servo_frame, servo_frame);
1372
                Double_Beep(DBEEPWR, DBEEPWRP);
1373
        }
1374
        Jump_Menu(pmenu);
1375
}
1376
 
1377
void Menu_Test_ServoNr(void)
1378
{ uint16_t tmp_val;
1379
 
1380
        Displ_Title(MSG_SERVO);
1381
        tmp_val = servo_nr;
1382
        if (Change_Value(&tmp_val, 0, 1, 4, Displ_ServoNr)) { // pmenu global; es gibt nur 0=Servo1, 1=Servo2
1383
                servo_nr = tmp_val;
1384
                eeprom_write_byte(&ep_servo_nr, servo_nr);
1385
                Double_Beep(DBEEPWR, DBEEPWRP);
1386
        }
1387
        Jump_Menu(pmenu);
1388
}
1389
 
1390
// Dieser Test im raw-Modus ohne Anschlagkalibrierung (normiert) z.B.: für Modelleinstellungen ohne Empfänger
1391
void Menu_Test_PulseWidth(void)
1392
{ uint8_t tmp_tracking;
1393
        uint16_t tmp_val;
1394
 
1395
        tmp_tracking = Servo_tmp_on(servo_frame);
1396
        lcdWriteCGRAM_Array(lcdSpecialChrLs, 8);        // LCD-Char mit Rahmensymbole vom Graph
1397
        chrxs = CHRLS;                                                                                                          // verhindert wiederholtes Lesen bereits geladener LCD-Char
1398
        Displ_Title(MSG_PULSE_WIDTH);
1399
        tmp_val = steps_pw[sIdxSteps].mid;
1400
        Change_Value(&tmp_val, steps_pw[sIdxSteps].min, steps_pw[sIdxSteps].max, 4|(1<<V_REPEAT), Displ_PulseWidth); // pmenu global
1401
        lcdWriteCGRAM_Array(lcdSpecialChr, 7);          // LCD-Char für Bargraph zurückschreiben
1402
        cli();
1403
        servoInit(SERVO_PERIODE);
1404
        sei();
1405
        Servo_tmp_Original(tmp_tracking);
1406
}
1407
 
1408
void Menu_Test_Continuous(void)
1409
{ uint8_t scr_sub_menu[SCROLL_MAX_7]    = {SCROLL_MAX_7 - 2, MSG_RETURN, MSG_START, MSG_SINGLE_STEP, MSG_REPEAT, MSG_PAUSE, MSG_PAUSE_STEP};
1410
 
1411
        Scroll_Menu(scr_sub_menu, m_pkt);                               // pmenu global
1412
        Jump_Menu(pmenu);
1413
}
1414
 
1415
void Menu_Test_SingleStep(void)
1416
{uint16_t tmp_val;
1417
 
1418
        Displ_Title(MSG_SINGLE_STEP);
1419
        tmp_val = single_step;
1420
        if (Change_Value(&tmp_val, SINGLE_STEP_MIN, SINGLE_STEP_MAX, 5|(1<<V_REPEAT), Displ_Off_Format_Int)) { // pmenu global
1421
                single_step = tmp_val;
1422
                eeprom_write_byte(&ep_single_step, single_step);
1423
                Double_Beep(DBEEPWR, DBEEPWRP);
1424
        }
1425
        Jump_Menu(pmenu);
1426
}
1427
 
1428
void Menu_Test_Repeat(void)
1429
{uint16_t tmp_val;
1430
 
1431
        Displ_Title(MSG_REPEAT);
1432
        tmp_val = repeat;
1433
        if (Change_Value(&tmp_val, REPEAT_MIN, REPEAT_MAX, 5|(1<<V_REPEAT), Displ_Format_Int)) { // pmenu global
1434
                repeat = tmp_val;
1435
                eeprom_write_byte(&ep_repeat, repeat);
1436
                Double_Beep(DBEEPWR, DBEEPWRP);
1437
        }
1438
        Jump_Menu(pmenu);
1439
}
1440
 
1441
void Menu_Test_Pause(void)
1442
{uint16_t tmp_val;
1443
 
1444
        Displ_Title(MSG_PAUSE);
1445
        tmp_val = pause;
1446
        if (Change_Value(&tmp_val, PAUSE_MIN, PAUSE_MAX, 5|(1<<V_REPEAT), Displ_Pause)) { // pmenu global
1447
                pause = tmp_val;
1448
                eeprom_write_byte(&ep_pause, pause);
1449
                Double_Beep(DBEEPWR, DBEEPWRP);
1450
        }
1451
        Jump_Menu(pmenu);
1452
}
1453
 
1454
void Menu_Test_Pause_Step(void)
1455
{uint16_t tmp_val;
1456
 
1457
        Displ_Title(MSG_PAUSE_STEP);
1458
        tmp_val = pause_step;
1459
        if (Change_Value(&tmp_val, PAUSE_STEP_MIN, PAUSE_STEP_MAX, 5|(1<<V_REPEAT), Displ_Pause_Step)) { // pmenu global
1460
                pause_step = tmp_val;
1461
                eeprom_write_byte(&ep_pause_step, pause_step);
1462
                Double_Beep(DBEEPWR, DBEEPWRP);
1463
        }
1464
        Jump_Menu(pmenu);
1465
}
1466
 
1467
int8_t calc_dir(uint8_t idx, int16_t *Position)
1468
{ uint8_t nextIdx;
1469
        int8_t nextDir = 1;
1470
 
1471
        nextIdx = idx;
1472
        if ((idx + 1) < POSIDX_MAX)
1473
                nextIdx++;
1474
        else
1475
                nextIdx = 0;
1476
        if (Position[PosIdx[idx]] > Position[PosIdx[nextIdx]]) nextDir = -1;
1477
        return(nextDir);
1478
}
1479
 
1480
void Displ_LoopCounter(uint8_t val)
1481
{
1482
        lcdGotoXY(2,2);
1483
        lcdPuts(Msg(MSG_COUNTER));
1484
        lcdPuts(my_itoa(val, 4, 0, 0));
1485
}
1486
 
1487
// Test über Scalierung der Servos mit Anschlagkalibrierung
1488
void Menu_Test_Start(void)
1489
{ uint8_t tmp_tracking, idx, rep;
1490
        int8_t dir;
1491
        int16_t sPos;
1492
        int16_t Position[3];   
1493
        int16_t range;
1494
 
1495
        tmp_tracking = Servo_tmp_on(servo_frame);
1496
        lcdWriteCGRAM_Array(lcdSpecialChrLs, 8);                // LCD-Char mit Rahmensymbole vom Graph
1497
        chrxs = CHRLS;                                                                                                                  // Flag, welche Kästchensymbole geladen
1498
        Displ_Title(MSG_CONTINOUS);
1499
        Displ_LoopCounter(repeat);
1500
        Position[0] = 0;                                                                                                                // skalierte Servoposition aber unterschiedliche Schrittanzahl möglich
1501
        Position[1] = ServoSteps()/2;
1502
        Position[2] = ServoSteps();
1503
        // init Einzelschritt
1504
        idx = 0;
1505
        dir = calc_dir(idx, Position);
1506
        sPos = Position[PosIdx[idx]];
1507
        idx++;
1508
        rep = repeat;
1509
 
1510
        // Test bis Ende der Wiederholungen oder irgendein Enter
1511
        while( !Get_Key_Short( 1<<SW_ENTER ) && !Long_Enter() && (rep > 0)) {  
1512
                range = calc_range(sPos - Position[1], Position[0], Position[2], Position[1]);
1513
                draw_bar(sPos - Position[1], range, 1); // eingerahmter Balkengraph auf 2. Display-Zeile
1514
                servoSetPosition(servo_nr, sPos);
1515
 
1516
                if ( sPos != Position[PosIdx[idx]]) {           // Links-, Mittel- oder Rechtsposotion erreicht?
1517
                        sPos += (single_step * dir);                                            // variable Schrittweite subtrahieren oder addieren
1518
                        if (((dir < 0) && (sPos < Position[PosIdx[idx]])) || ((dir > 0) && (sPos > Position[PosIdx[idx]])) || !(single_step))
1519
                                sPos = Position[PosIdx[idx]];                           // Überlauf bei variabler Schrittweite berücksichtigen oder Einzelschritt
1520
                        _delay_ms(servo_frame + 1 + pause_step);// Bei Schrittweite um 1 würden welche übersprungen, zusätzlich pro Servoschritt verzögert
1521
                }
1522
                else {
1523
                        dir = calc_dir(idx, Position);                                  // Richtungsänderung
1524
                        if (idx < (POSIDX_MAX - 1)) {
1525
                                if (idx == 0) {
1526
                                        rep--;                                                                                                                  // bei jeden vollen Durchlauf Wiederholzähler verringern
1527
                                        Displ_LoopCounter(rep);
1528
                                }
1529
                                idx++;                                                                                                                          // Index für nächsten Positionswert ==> Array PosIdx[] bestimmt Anschlagreihenfolge
1530
                        }
1531
                        else
1532
                                idx = 0;
1533
                        delay_ms100x(pause);                                                                            // variable Pause bei Links-, Mittel- und Rechtsposotion Mindestzeit 400ms (Servolauf)
1534
                }
1535
        }
1536
 
1537
        lcdClear();
1538
        if (pmenu[0] == '\0')
1539
                Displ_Main_Disp();
1540
        else
1541
                return_m_pkt(strlen(pmenu));                                                    // um bei Rücksprung auf ursprünglichen Menüpunkt zeigen oder Displ_Main_Disp()
1542
        lcdWriteCGRAM_Array(lcdSpecialChr, 7);                  // LCD-Char für Bargraph zurückschreiben
1543
        cli();
1544
        servoInit(SERVO_PERIODE);
1545
        sei();
1546
        Servo_tmp_Original(tmp_tracking);
1547
}
1548
 
1549
 
1550
/**************************/
1551
/*                                                                                              */
1552
/*                                      LCD                                             */
1553
/*                                                                                              */
1554
/**************************/
1555
void Menu_lcd(void)
1556
{ uint8_t scr_sub_menu[SCROLL_MAX_4] = {SCROLL_MAX_4 - 2, MSG_RETURN, MSG_CONTRAST, MSG_BACKGR_LIGHT};
1557
 
1558
        Scroll_Menu(scr_sub_menu, m_pkt); // pmenu global
1559
        Jump_Menu(pmenu);
1560
}
1561
 
1562
void Menu_lcd_Contrast(void)
1563
{ uint16_t tmp_val;
1564
 
1565
        Displ_Title(MSG_LCD);
1566
        lcdGotoXY(2, ZLE_VAL);
1567
        lcdPuts(Msg(MSG_CONTRAST));
1568
        lcdPuts(": ");
1569
        tmp_val = contrast;
1570
        if (Change_Value(&tmp_val, CONTRAST_MIN, CONTRAST_MAX, 11, Displ_Set_Contrast)) { // pmenu global
1571
                contrast = tmp_val;
1572
                eeprom_write_byte(&ep_contrast, contrast);
1573
                Double_Beep(DBEEPWR, DBEEPWRP);
1574
        }
1575
        Jump_Menu(pmenu);
1576
}
1577
 
1578
void Menu_lcd_Backgr_Light(void)
1579
{ uint16_t tmp_val;
1580
 
1581
        Displ_Title(MSG_BACKGR_LIGHT);
1582
        lcdGotoXY(0, ZLE_VAL);
1583
        lcdPuts(Msg(MSG_LIGHT));
1584
        tmp_val = light_time;
1585
        if (Change_Value(&tmp_val, BACKGR_LIGHT_MIN, BACKGR_LIGHT_MAX, 6|(1<<V_REPEAT), Displ_Backgr_Light)) { // pmenu global
1586
                light_time = tmp_val;
1587
                eeprom_write_byte(&ep_light_time, light_time);
1588
                Double_Beep(DBEEPWR, DBEEPWRP);
1589
                if (light_time == BACKGR_LIGHT_MIN) lcdSet_BackgrLight_Off(); // Hintergrundbeleuchtung immer aus ==> sofort schalten
1590
        }
1591
        Jump_Menu(pmenu);
1592
}
1593
 
1594
/**************************/
1595
/*                                                                                              */
1596
/*                              Batterie                                */
1597
/*                                                                                              */
1598
/**************************/
1599
void Menu_Battery(void)
1600
{ uint8_t scr_sub_menu[SCROLL_MAX_5] = {SCROLL_MAX_5 - 2, MSG_RETURN, MSG_U_SETUP, MSG_U_OFFSET, MSG_MK_BATTERY};
1601
 
1602
        Scroll_Menu(scr_sub_menu, m_pkt); // pmenu global
1603
        Jump_Menu(pmenu);
1604
}
1605
 
1606
/*****************/
1607
/* NG-Video Akku */
1608
/*****************/
1609
void Menu_Low_U_Setup(void)
1610
{ uint16_t tmp_val;
1611
 
1612
        Displ_Title(MSG_U_MIN);
1613
        tmp_val = u_min;
1614
        if (Change_Value(&tmp_val, U_MIN_MIN, U_MIN_MAX, 4|(1<<V_REPEAT), Displ_U_2Nk)) { // pmenu global
1615
                u_min = tmp_val;
1616
                eeprom_write_word(&ep_u_min, u_min);
1617
                hyst_u_min = u_min;
1618
                Double_Beep(DBEEPWR, DBEEPWRP);
1619
        }
1620
        Jump_Menu(pmenu);
1621
}
1622
 
1623
void Menu_U_Offset(void)
1624
{ uint16_t tmp_val;
1625
 
1626
        Displ_Title(MSG_U_OFFSET);
1627
        tmp_val = u_offset;
1628
        if (Change_Value(&tmp_val, U_OFFSET_MIN, U_OFFSET_MAX, 4|(1<<V_REPEAT), Displ_U_2Nk)) { // pmenu global
1629
                u_offset = tmp_val;
1630
                eeprom_write_byte(&ep_u_offset, u_offset);
1631
                Double_Beep(DBEEPWR, DBEEPWRP);
1632
        }
1633
        Jump_Menu(pmenu);
1634
}
1635
 
1636
/******************/
1637
/*       MK-Akku(s)             */
1638
/******************/
1639
void Menu_MK_Battery(void)
1640
{ uint8_t scr_sub_menu[SCROLL_MAX_7] = {SCROLL_MAX_7 - 2, MSG_RETURN, MSG_MK_BAT_NR, MSG_MK_BAT_CAPACITY, MSG_MK_I_OFFSET, MSG_MK_I_FAKTOR, MSG_MK_W_FAKTOR};
1641
 
1642
        Scroll_Menu(scr_sub_menu, m_pkt); // pmenu global
1643
        Jump_Menu(pmenu);
1644
}
1645
 
1646
// für Nutzung verschiedener Akku's unterschiedlicher Kapazität
1647
// könnte auch für Statistik Ladezyklen erweitert werden aber sinnlos bei Verwendung gleicher Akku's in anderen Modellen
1648
void Menu_MK_BatteryChangeNr(void)
1649
{ uint16_t tmp_val;
1650
 
1651
        Displ_Title(MSG_MK_BAT_NR);
1652
        tmp_val = mk_akku_nr+1;
1653
        if (Change_Value(&tmp_val, AKKU_NR_MIN+1, AKKU_NR_MAX+1, 5|(1<<V_REPEAT), Displ_Format_Int)) { // pmenu global
1654
                mk_akku_nr = --tmp_val;
1655
                eeprom_write_byte(&ep_mk_akku_nr, mk_akku_nr);
1656
                eeprom_read_block(&mk_lipo,&ep_mk_lipo[mk_akku_nr],sizeof(mk_lipo_t));
1657
                mk_dUsedCapacity = mk_lipo.UsedCapacity;
1658
                Double_Beep(DBEEPWR, DBEEPWRP);
1659
        }
1660
}
1661
 
1662
void Menu_MK_BatteryNr(void)
1663
{
1664
        Menu_MK_BatteryChangeNr();
1665
        Jump_Menu(pmenu);
1666
}
1667
 
1668
void Menu_MK_BatteryCapacity(void)
1669
{ uint16_t tmp_val;
1670
 
1671
        Displ_Title(MSG_MK_BAT_CAPACITY);
1672
        tmp_val = mk_lipo.Capacity/50;
1673
        if (Change_Value(&tmp_val, AKKU_CAPACITY_MIN/50, AKKU_CAPACITY_MAX/50, 5|(1<<V_REPEAT), Displ_MK_Capacity)) { // pmenu global
1674
                mk_lipo.Capacity = tmp_val * 50;
1675
                eeprom_write_block(&mk_lipo,&ep_mk_lipo[mk_akku_nr],sizeof(mk_lipo_t));
1676
                Double_Beep(DBEEPWR, DBEEPWRP);
1677
        }
1678
        Jump_Menu(pmenu);
1679
}
1680
 
1681
void Menu_MK_I_Offset(void)
1682
{ uint16_t tmp_val;
1683
 
1684
        Displ_Title(MSG_MK_I_OFFSET);
1685
        tmp_val = mk_i_offset;
1686
        if (Change_Value(&tmp_val, MK_I_OFFSET_MIN, MK_I_OFFSET_MAX, 5|(1<<V_REPEAT), Displ_I_Offset)) { // pmenu global
1687
                mk_i_offset = tmp_val;
1688
                eeprom_write_byte(&ep_mk_i_offset, mk_i_offset);
1689
                Double_Beep(DBEEPWR, DBEEPWRP);
1690
        }
1691
        Jump_Menu(pmenu);
1692
}
1693
 
1694
void Menu_MK_I_Faktor(void)
1695
{ uint16_t tmp_val;
1696
 
1697
        Displ_Title(MSG_MK_I_FAKTOR);
1698
        tmp_val = mk_i_faktor;
1699
        if (Change_Value(&tmp_val, MK_I_FAKTOR_MIN, MK_I_FAKTOR_MAX, 6|(1<<V_REPEAT), Displ_Faktor_2Nk)) { // pmenu global
1700
                mk_i_faktor = tmp_val;
1701
                eeprom_write_byte(&ep_mk_i_faktor, mk_i_faktor);
1702
                Double_Beep(DBEEPWR, DBEEPWRP);
1703
        }
1704
        Jump_Menu(pmenu);
1705
}
1706
 
1707
void Menu_MK_W_Faktor(void)
1708
{ uint16_t tmp_val;
1709
 
1710
        Displ_Title(MSG_MK_W_FAKTOR);
1711
        tmp_val = mk_w_faktor;
1712
        if (Change_Value(&tmp_val, MK_W_FAKTOR_MIN, MK_W_FAKTOR_MAX, 6|(1<<V_REPEAT), Displ_Faktor_2Nk)) { // pmenu global
1713
                mk_w_faktor = tmp_val;
1714
                eeprom_write_byte(&ep_mk_w_faktor, mk_w_faktor);
1715
                Double_Beep(DBEEPWR, DBEEPWRP);
1716
        }
1717
        Jump_Menu(pmenu);
1718
}
1719
 
1720
 
1721
/**************************/
1722
/*                                                                                              */
1723
/*      Antennennachführung             */
1724
/*                                                                                              */
1725
/**************************/
1726
void Menu_Tracking_Ant(void)
1727
{ uint16_t tmp_val;
1728
 
1729
        Displ_Title(MSG_TRACKING);
1730
        tmp_val = tracking;
1731
        if (Change_Value(&tmp_val, TRACKING_MIN, TRACKING_MAX, 3, Displ_sel_Tracking)) { // pmenu global
1732
                cli();
1733
                tracking = tmp_val;
1734
                sei();
1735
                eeprom_write_byte(&ep_tracking, tracking);
1736
                Double_Beep(DBEEPWR, DBEEPWRP);
1737
                USART_RX_Mode(tracking);                // Unterschied Datenempfang GPS/MKCockpit/NMEA
1738
                coldstart = 1;
1739
                rxcount0 = 0;
1740
                rxcount1 = 0;
1741
                servoSetDefaultPos();                           // Ausgangsstellung beider Servos
1742
                if (tracking > TRACKING_MIN)
1743
                        servoInit(SERVO_PERIODE);
1744
                NoTracking_ServosOff();
1745
                USART_Init_Baudrate();
1746
        }
1747
        Jump_Menu(pmenu);
1748
}
1749
 
1750
/**************************/
1751
/*                       Optionen                                       */
1752
/*      Antennennachführung             */
1753
/*                                                                                              */
1754
/**************************/
1755
void Menu_Tracking_HYST(void)
1756
{ uint16_t tmp_val;
1757
 
1758
        Displ_Title(MSG_HYSTERESE);
1759
        tmp_val = track_hyst;
1760
        if (Change_Value(&tmp_val, TRACKING_HYST_MIN, TRACKING_HYST_MAX, 7|(1<<V_REPEAT), Displ_Format_Int)) { // pmenu gloabal
1761
                track_hyst = tmp_val;
1762
                eeprom_write_byte(&ep_track_hyst, track_hyst);
1763
                Double_Beep(DBEEPWR, DBEEPWRP);
1764
        }
1765
        Jump_Menu(pmenu);
1766
}
1767
 
1768
void Menu_Tracking_TXOSD(void)
1769
{ uint16_t tmp_val;
1770
 
1771
        Displ_Title(MSG_TRACK_TX_OSD_DATA);
1772
        tmp_val = track_tx;
1773
        if (Change_Value(&tmp_val, 0, 1, 3, Displ_track_TX)) { // pmenu global; Senden gibt es nur 0=off, 1=on
1774
                track_tx = tmp_val;
1775
                eeprom_write_byte(&ep_track_tx, track_tx);
1776
                Double_Beep(DBEEPWR, DBEEPWRP);
1777
        }
1778
        Jump_Menu(pmenu);
1779
}
1780
 
1781
void Menu_Baudrate(void)
1782
{ uint16_t tmp_val;
1783
 
1784
        Displ_Title(MSG_BAUDRATE);
1785
        tmp_val = baudrate;
1786
        if (Change_Value(&tmp_val, BAUDRATE_MIN, BAUDRATE_MAX, 3, Displ_Baudrate)) { // pmenu global
1787
                baudrate = tmp_val;
1788
                eeprom_write_byte(&ep_baudrate, baudrate);
1789
                Double_Beep(DBEEPWR, DBEEPWRP);
1790
                USART_Init(getBaud(baudrate));
1791
        }
1792
        Jump_Menu(pmenu);
1793
}
1794
 
1795
void Menu_Tracking_Option(void)
1796
{ // im Menü ist dies der gleiche Gliederungspunkt aber mit geänderter Auswahl
1797
        switch(tracking) {
1798
                case TRACKING_RSSI:                             Menu_Tracking_HYST();
1799
                                                                                                                        break;
1800
                case TRACKING_GPS:                              Menu_Tracking_TXOSD();
1801
                                                                                                                        break;
1802
                case TRACKING_MKCOCKPIT:       
1803
                case TRACKING_NMEA:                             Menu_Baudrate();
1804
                                                                                                                        break;
1805
        }
1806
}
1807
 
1808
/**************************/
1809
/*                                                                                              */
1810
/*                      Anzeige GPS                             */
1811
/*                                                                                              */
1812
/**************************/
1813
void Menu_GPS_Display(void)
1814
{ uint8_t scr_sub_menu[SCROLL_MAX_7] = {SCROLL_MAX_7 - 2, MSG_RETURN, MSG_GPS_CALCULATE, MSG_GPS_CURRENT, MSG_GPS_HOME, \
1815
                                                                                                                                                                 MSG_GPS_MISC, MSG_RX_TIME};
1816
 
1817
        if (tracking == TRACKING_NMEA) {                // Manipulierung der Menüanzeige/-ausführung
1818
                scr_sub_menu[0] = SCROLL_MAX_7 - 3;     // Only show MISC in GPS mode, not NMEA
1819
                scr_sub_menu[5] = MSG_RX_TIME;
1820
        }
1821
        else
1822
                if (tracking != TRACKING_GPS)   scr_sub_menu[0] = SCROLL_MAX_7 - 4;
1823
        Scroll_Menu(scr_sub_menu, m_pkt);       // pmenu global
1824
        Jump_Menu(pmenu);
1825
}
1826
 
1827
void Menu_GPS_Display_FLAG(void)                        // ist Flag in tracking.c Tracking_GPS(void)
1828
{ uint8_t slen;
1829
 
1830
        slen = strlen(pmenu) - 1;
1831
        gps_display = pmenu[slen] - '0';                // char to byte 1 bis 3 im String enthalten
1832
        if ((tracking == TRACKING_NMEA) && (gps_display == GPS_MISC))
1833
                pmenu[slen] = RXTimeChr[0];                     // Manipulierung der Menüausführung
1834
        else {
1835
                m_pkt = gps_display;
1836
                gps_disp_clear = 1;                                                             // damit Text "...keine Daten empf..." nach Datenempfang gelöscht wird
1837
                if (gps_display != GPS_MISC)    lcdPuts(Msg(MSG_GPS_NO_DATA));
1838
                if (Short_Enter())                                                              // pmenu global
1839
                        pmenu[slen] = '\0';                                                     // Menüpunkt zurück
1840
                gps_display = GPS_DISP_NONE;                    // nach Tastaturabfrage keine Anzeige GPS, sondern normales Menü
1841
        }
1842
        Jump_Menu(pmenu);
1843
}
1844
 
1845
void Menu_GPS_Displ_RX_Time(void)
1846
{
1847
        Displ_Title(MSG_RX_TIME);
1848
        lcdGotoXY(0, 1);
1849
        lcdPuts(Msg(MSG_RX1));
1850
        lcdGotoXY(0, 2);
1851
        lcdPuts(Msg(MSG_RX2));
1852
        Displ_RX_Time();
1853
        // bei Menüpunktmanipulatin TRACKING_NMEA und vorgezogen Menu_GPS_Displ_RX_Time ist Rücksprung real GPS_MISC
1854
        m_pkt = ((tracking == TRACKING_NMEA) && (gps_display == GPS_MISC))? GPS_MISC: GPS_RX_COUNT;
1855
        gps_display = GPS_RX_COUNT;
1856
        if (Short_Enter())                                                               // pmenu global
1857
                pmenu[strlen(pmenu) - 1] = '\0';// Menüpunkt zurück
1858
        gps_display = GPS_DISP_NONE;                     // nach Tastaturabfrage keine Anzeige GPS, sondern normales Menü
1859
        Jump_Menu(pmenu);
1860
}