Subversion Repositories Projects

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2136 - 1
/*****************************************************************************
2
 *   Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de                  *
3
 *   Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net                  *
4
 *   Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
5
 *   Copyright (C) 2011 Harald Bongartz                                      *
6
 *                                                                           *
7
 *   This program is free software; you can redistribute it and/or modify    *
8
 *   it under the terms of the GNU General Public License as published by    *
9
 *   the Free Software Foundation; either version 2 of the License.          *
10
 *                                                                           *
11
 *   This program is distributed in the hope that it will be useful,         *
12
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of          *
13
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
14
 *   GNU General Public License for more details.                            *
15
 *                                                                           *
16
 *   You should have received a copy of the GNU General Public License       *
17
 *   along with this program; if not, write to the                           *
18
 *   Free Software Foundation, Inc.,                                         *
19
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.               *
20
 *                                                                           *
21
 *                                                                           *
22
 *   Credits to:                                                             *
23
 *   Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN  *
24
 *                          http://www.mikrokopter.de                        *
25
 *   Gregor "killagreg" Stobrawa for his version of the MK code              *
26
 *   Thomas Kaiser "thkais" for the original project. See                    *
27
 *                          http://www.ft-fanpage.de/mikrokopter/            *
28
 *                          http://forum.mikrokopter.de/topic-4061-1.html    *
29
 *   Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
30
 *                          http://www.mylifesucks.de/oss/c-osd/             *
31
 *   Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
32
 *****************************************************************************/
33
 
34
//############################################################################
35
//# HISTORY  pkt.c
36
//#
37
//# 25.06.2014 OG
38
//# - chg: PKT_Ask(), PKT_Ask_P() auf PKT_AskX() angepasst
39
//# - add: PKT_AskX() - ehemals _pkt_ask(), jetzt erweitert um zusaetzliche progmen Parameter und exportiert
40
//#
41
//# 24.06.2014 OG
42
//# - add: PKT_Gauge_Begin(), PKT_Gauge_End(), PKT_Gauge_Next()
43
//#
44
//# 15.06.2014 OG
45
//# - add: PKT_Progress_Init(), PKT_Progress_Next()
46
//#
47
//# 14.06.2014 OG
48
//# - add: PKT_TitlePKTlipo() fuer optionale Anzeige der LiPo-Spannung
49
//#
50
//# 13.06.2014 OG
51
//# - add: PKT_Ask_Restart()
52
//#
53
//# 12.06.2014 OG
54
//# - add: PKT_Reset_EEprom()  (ehemals in setup.c)
55
//# - chg: PKT_Update() auf PKT_Ask_P() umgestellt
56
//# - add: PKT_Ask(), PKT_Ask_P(), _pkt_ask()
57
//#
58
//# 11.06.2014 OG
59
//# - add: PKT_Title(), PKT_Title_P(), _pkt_title()
60
//# - chg: PKT_TitleFromMenuItem() umgestellt auf _pkt_title()
61
//# - chg: PKT_TitlePKTVersion() umbenannt zu PKT_TitlePKT()
62
//# - fix: PKT_TitleFromMenuItem() funktioniert jetzt auch wenn kein Menue vorhanden ist
63
//#
64
//# 04.06.2014 OG
65
//# - add: PKT_Message_Datenverlust()
66
//#
67
//# 31.05.2014 OG
68
//# - fix: PKT_CtrlHook() bzgl. PKT_CheckUpdate() - seit Februar 2014 Probleme
69
//#        mit Update-Anforderung vom PKT-Updatetool -> PKT war zu schnell
70
//#        Es wurde jetzt ein Timer in PKT_CtrlHook() eingebaut der den Aufruf
71
//#        von PKT_CheckUpdate() etwas einbremst ohne das PKT auszubremsen.
72
//#        Ich hoffe, das es ist Loesung ist (bin guter Dinge nach Test's)
73
//# - chg: PKT_CheckUpdate() - Code optimiert
74
//# - add: PKT_Info() - Anzeige ob SV2-Patch vorhanden ist oder nicht (ganz oben)
75
//# - add: PKT_Info() - Anzeige fuer USE_OSD_SCREEN_WAYPOINTS
76
//# - add: PKT_KeylineUpDown()
77
//#
78
//# 23.05.2014 OG
79
//# - add: PKT_TitleFromMenuItem()
80
//# - add: #include "../utils/menuctrl.h"
81
//#
82
//# 06.05.2014 OG
83
//# - chg: PKT_CheckUpdate() - seit Februar funktioniert die Update-Anforderung
84
//#        vom PKT-Updatetool an das PKT nicht immer zuverlaessig - fgf. weil sich
85
//#        seitens des PKT's Timings etwas geaendert haben (durch weglassen von Code).
86
//#        Hier ein Versuch etwas daran wieder zu aendern... its zwar weiterhin
87
//#        nicht immer zuverlaessig aber vieleicht etwas besser.
88
//#        Wahrscheinlich kann man das nur richtig korrigieren in Verbindung mit
89
//#        Anpassungen am PKT-Updatetool - aber das ist ein anderes Thema...
90
//# - chg: PKT_Update() - ein kurzer Beep wenn das PKT-Update aufgerufen wird
91
//#
92
//# 05.05.2014 OG
93
//# - add: PKT_Popup(), PKT_Popup_P(), _pkt_popup()
94
//#
95
//# 11.04.2014 OG
96
//# - chg: _pkt_message() ergaenzt um clear_key_all()
97
//#
98
//# 09.04.2014 OG
99
//# - chg: PKT_Update() - umgestellt auf ShowTitle_P()
100
//#
101
//# 08.04.2014 OG
102
//# - chg: PKT_Update() - Text bzgl. "Druecke Start..." zentriert
103
//#
104
//# 04.04.2014 OG
105
//# - fix: define ESC umbenannt zu PKTESC da es einen Namenskonflikt mit enum
106
//#        STR in messages.h gab
107
//# - add: _pkt_message() zeigt einen Titel mit PKT Version und Lipo an
108
//#
109
//# 03.04.2014 OG
110
//# - chg: _pkt_message() abgesichert bzgl. zu langen Texten
111
//#
112
//# 27.03.2014 OG
113
//# - chg: PKT_SwitchOff() Anzeige optimiert
114
//#
115
//# 21.02.2014 OG
116
//# - fix: PKT_CheckUpdate() Zeile 0 flimmerte wegen einer nicht mehr
117
//#        benoetigten Textausgabe
118
//# - chg: PKT_SwitchOff() auf PKT_TitlePKTVersion() angepasst
119
//# - chg: PKT_TitlePKTVersion()
120
//#
121
//# 17.02.2014 OG
122
//# - add: PKT_Message(), PKT_Message_P(), _pkt_message()
123
//# - chg: MK_Info() auf USE_MKSETTINGS angepasst (ehemals MKPARAMETER)
124
//#
125
//# 13.02.2014 OG
126
//# - chg: Screenlayout von PKT_Update()
127
//# - chg: Screenlayout von PKT_SwitchOff()
128
//#
129
//# 11.02.2014 OG
130
//# - chg: PKT_Info() Anzeige der FC-Version entfernt
131
//#
132
//# 04.02.2014 OG
133
//# - fix: #include "../lipo/lipo.h" hinzugefuegt
134
//#
135
//# 03.02.2014 OG
136
//# - chg: Layout von PKT_SwitchOff() und bessere Unterstuetzung von PKT_CtrlHook()
137
//# - add: PKT_ShowTitleVersion()
138
//#
139
//# 30.01.2014 OG
140
//# - chg: geaenderte Anzeige der Reihenfolgen unterstuetzter Module in PKT_Info()
141
//# - add: Unterstuetzung fuer USE_BLUETOOTH
142
//#
143
//# 24.01.2014 OG
144
//# - chg: PKT_SwitchOff(): Layout; Code eliminiert; Beep;
145
//#        add PKT_Hook() (für PKT-Update)
146
//# - chg: PKT_Update(): Layout
147
//#
148
//# 21.10.2013 CB
149
//# - add: PKT_Info WyFly hinzugefügt
150
//#
151
//# 07.07.2013 OG
152
//# - del: PKT_Info(): USE_OSD_SCREEN_ELECTRIC_N
153
 
154
//# 26.06.2013 OG
155
//# - del: PKT_Info(): USE_PKT_STARTINFO
156
//#
157
//# 13.06.2013 OG
158
//# - add: PKT-Hardwareversion in der Titelanzeige von PKT_Info()
159
//# - chg: Layout Titelanzeige von PKT_Info()
160
//# - del: USE_PCFASTCONNECT in PKT_Info() (nicht mehr benoetigt)
161
//# - del: PC_Fast_Connect() - ersetzt durch Menu_PKTTools() in menu.c
162
//#
163
//# 20.05.2013 OG
164
//# - chg: PKT_CtrlHook() bei PKT-Update um WriteParameter() ergaenzt
165
//#
166
//# 19.05.2013 OG
167
//# - add: PKT_CtrlHook() ruft ggf. PKT_Update() auf und kann spaeter weitere
168
//#        PKT interne Sachen verarbeiten wie z.B. senden von Daten an den PC
169
//# - chg: PKT_CheckUpdate() umgestellt auf timer_pktctrl um Konflikte mit
170
//#        mit z.B. osd zu vermeiden
171
//# - chg: PKT_Info() bzgl. Codeverbrauch verringert
172
//# - fix: PKT_Info() Anzeige von USE_OSD_SCREEN_NAVIGATION
173
//# - add: PC_Fast_Connect() aus menu.c
174
//# - add: PKT_* Funktionen aus main.c bzw. menu.c
175
//############################################################################
176
 
177
 
178
#include "../cpu.h"
179
#include <avr/io.h>
180
#include <inttypes.h>
181
#include <stdlib.h>
182
#include <avr/pgmspace.h>
183
#include <avr/wdt.h>
184
#include <util/delay.h>
185
#include <avr/eeprom.h>
186
#include <util/atomic.h>
187
 
188
#include "../main.h"
189
#include "../lcd/lcd.h"
190
#include "../uart/usart.h"
191
 
192
#include "../uart/uart1.h"
193
#include "../mk-data-structs.h"
194
#include "../timer/timer.h"
195
#include "../eeprom/eeprom.h"
196
#include "../messages.h"
197
#include "../utils/scrollbox.h"
198
#include "../utils/xutils.h"
199
#include "../lipo/lipo.h"
200
#include "../utils/menuctrl.h"
201
#include "pkt.h"
202
 
203
 
204
//#############################################################################################
205
//#############################################################################################
206
 
207
uint8_t pkt_progress_act    = 0;
208
uint8_t pkt_progress_max    = 0;
209
int8_t  pkt_progress_yoffs  = 0;
210
uint8_t pkt_progress_width  = 0;
211
uint8_t pkt_progress_height = 0;
212
 
213
#define PROGRESS_YOFFS  -8
214
#define PROGRESS_WIDTH  96
215
 
216
 
217
 
218
//#############################################################################################
219
//#############################################################################################
220
 
221
//--------------------------------------------------------------
222
//--------------------------------------------------------------
223
void PKT_Progress_Init( uint8_t max, int8_t yoffs, uint8_t width, uint8_t height)
224
{
225
    pkt_progress_act    = 0;
226
    pkt_progress_max    = max;
227
    pkt_progress_yoffs  = yoffs;
228
    pkt_progress_width  = 0;        // Parameter width - aktuell nicht unterstuetzt
229
    pkt_progress_height = 0;        // Parameter height - aktuell nicht unterstuetzt
230
 
231
    if( pkt_progress_width == 0 )
232
        pkt_progress_width = PROGRESS_WIDTH;
233
 
234
    lcd_rect_round( 13, 32+pkt_progress_yoffs, 102, 6, 1, R1);              // Rahmen fuer Progress
235
}
236
 
237
 
238
 
239
//--------------------------------------------------------------
240
//--------------------------------------------------------------
241
uint8_t PKT_Progress_Next( void )
242
{
243
    uint8_t width;
244
 
245
    pkt_progress_act++;                                                 // Progress: hochzaehlen
246
    width = (pkt_progress_act*pkt_progress_width) / pkt_progress_max;           // Progress: Breite berechnen
247
    lcd_frect( 16, 34+pkt_progress_yoffs, width, 2,  1);                // Progress: anzeigen
248
 
249
    return true;
250
}
251
 
252
 
253
 
254
//#############################################################################################
255
//# Anzeigefunktionen
256
//#############################################################################################
257
 
258
 
259
//--------------------------------------------------------------
260
// PKT_KeylineUpDown( xUp, xDown,  xoffs,yoffs)
261
//
262
// gibt in der Keyline (y=7) ein Up- und Down-Zeichen aus.
263
// Das Up-Zeichen wird dabei um einen Pixel versetzt damit
264
// es besser aussieht
265
//
266
// Parameter:
267
//  xUp  : x-Position des Up-Zeichens in Zeile 7
268
//  xDown: x-Position des Down-Zeichens in Zeile 7
269
//  xoffs, yoffs: normalerweise 0,0
270
//--------------------------------------------------------------
271
void PKT_KeylineUpDown( uint8_t xUp, uint8_t xDown,  uint8_t xoffs, uint8_t yoffs)
272
{
273
    lcdx_printp_at( xUp  , 7, PSTR("\x1a")    , MNORMAL, xoffs,yoffs+1);    // Up
274
    lcdx_printp_at( xDown, 7, PSTR("\x1b")    , MNORMAL, xoffs,yoffs);      // Down
275
}
276
 
277
 
278
 
279
//#############################################################################################
280
//# Titel Funktionen
281
//#############################################################################################
282
 
283
//--------------------------------------------------------------
284
//--------------------------------------------------------------
285
void _pkt_title( uint8_t progmem, const char *text, uint8_t lShowLipo, uint8_t clearscreen )
286
{
287
    const char *pMask;
288
 
289
    if( clearscreen )   lcd_cls();
290
 
291
    lcd_frect( 0, 0, 127, 7, 1);                             // Titel: Invers
292
 
293
    if( progmem )   pMask = PSTR("%19S");
294
    else            pMask = PSTR("%19s");
295
 
296
    lcdx_printf_at_P( 1, 0, MINVERS, 0,0, pMask, text );
297
 
298
    if( lShowLipo )     show_Lipo();
299
}
300
 
301
 
302
 
303
//--------------------------------------------------------------
304
// PKT_Title( text, lShowLipo, clearscreen )
305
//
306
// text im RAM
307
//--------------------------------------------------------------
308
void PKT_Title( const char *text, uint8_t lShowLipo, uint8_t clearscreen )
309
{
310
    _pkt_title( false, text, lShowLipo, clearscreen );
311
}
312
 
313
 
314
 
315
//--------------------------------------------------------------
316
// PKT_Title_P( text, lShowLipo, clearscreen )
317
//
318
// text im PROGMEM
319
//--------------------------------------------------------------
320
void PKT_Title_P( const char *text, uint8_t lShowLipo, uint8_t clearscreen )
321
{
322
    _pkt_title( true, text, lShowLipo, clearscreen );
323
}
324
 
325
 
326
 
327
//--------------------------------------------------------------
328
// zeigt als Titel die PKT-Version (invers)
329
// optional: rechts die PKT Lipo-Spannung anzeigen
330
//--------------------------------------------------------------
331
void PKT_TitlePKTlipo( uint8_t lShowLipo )
332
{
333
    //PKT_Title( buffered_sprintf_P(PSTR("PKT v%S"),PSTR(PKTSWVersion)), true, false ); // showlipo, kein clearscreen
334
    PKT_Title( buffered_sprintf_P(PSTR("PKT v%S"),PSTR(PKTSWVersion)), lShowLipo, true );   // showlipo und clearscreen
335
}
336
 
337
 
338
 
339
//--------------------------------------------------------------
340
// zeigt als Titel die PKT-Version (invers)
341
// und rechts die PKT Lipo-Spannung
342
//--------------------------------------------------------------
343
void PKT_TitlePKT( void )
344
{
345
    PKT_TitlePKTlipo( true );
346
}
347
 
348
 
349
 
350
//--------------------------------------------------------------
351
// PKT_TitleFromMenuItem( lShowLipo )
352
//
353
// zeigt eine PKT-Titelzeile mit Text vom aufrufenden Menuepunkt
354
// optional kann die PKT LiPo-Spannung angezeigt werden
355
//
356
// wenn kein Menue vorhandenist wird die PKT-Version angezeigt
357
//--------------------------------------------------------------
358
void PKT_TitleFromMenuItem( uint8_t lShowLipo )
359
{
360
    const char *pStr;
361
    uint8_t     isPGM;
362
 
363
    if( MenuCtrl_GetMenuIndex() < 0 )
364
    {
365
        PKT_TitlePKT();                                     // kein Menue vorhanden -> PKT-Version anzeigen
366
        return;
367
    }
368
 
369
    pStr  = MenuCtrl_GetItemText();
370
    isPGM = MenuCtrl_IsItemTextPGM();
371
 
372
    _pkt_title( isPGM, pStr, lShowLipo, true );             // true = clearscreen
373
}
374
 
375
 
376
 
377
//#############################################################################################
378
//# PKT Message
379
//#############################################################################################
380
 
381
//--------------------------------------------------------------
382
// _pkt_message( progmem, text, error, timeout, beep, clearscreen)
383
//
384
// INTERN
385
// fuer: PKT_Message(), PKT_Message_P()
386
// Parameter? -> siehe dort...
387
//--------------------------------------------------------------
388
void _pkt_message( uint8_t progmem, const char *text, uint8_t error, uint16_t timeout, uint8_t beep, uint8_t clearscreen )
389
{
390
    char *pStr;
391
 
392
    if( clearscreen )
393
        lcd_cls();
394
 
395
    PKT_TitlePKT();
396
 
397
    if( error )
398
    {
399
        //lcd_frect_round(   0+36, (2*8)-2, 127-73, 8+2, 1, R1);        // Fill: Schwarz
400
        lcd_frect_round(   0+36, (2*8)-1, 127-74, 8+2, 1, R1);          // Fill: Schwarz
401
        lcdx_printp_center( 2, strGet(STR_ERROR), MINVERS, 0,1);        // "FEHLER"
402
    }
403
    else
404
        lcdx_printp_center( 2, strGet(STR_PKT)  , MNORMAL, 0,1);        // "PKT"
405
 
406
 
407
    //-----------------------
408
    // Ausgabe der Nachricht
409
    //-----------------------
410
    pStr = buffered_sprintf_P( ( progmem ? PSTR("%20S") : PSTR("%20s")), text); // max. 20 Zeichen
411
    strrtrim( pStr );                                                           // alle Leerzeichen rechts loeschen
412
    lcdx_print_center( 4, (uint8_t *)pStr, MNORMAL, 0,5);                       // Text zentriert; String im RAM
413
    lcd_rect_round( 0, 32, 127, 16, 1, R2);                                     // Rahmen
414
 
415
    if( beep )
416
    {
417
        if( error )
418
            set_beep( 1000, 0xffff, BeepNormal );                       // langer Error-Beep
419
        else
420
            set_beep( 25, 0xffff, BeepNormal );                         // kurzer Bestaetigungs-Beep
421
    }
422
 
423
    if( timeout )
424
    {
425
        //lcd_printp_at( 19, 7, strGet(OK), MNORMAL);                   // Keyline... tja, welche Variante nehmen wir denn nun Final??? OK oder ENDE?
426
        lcd_printp_at(12, 7, strGet(ENDE), MNORMAL);                    // Keyline
427
 
428
        clear_key_all();
429
 
430
        timer2 = timeout;                                               // max. Anzeigezeit (z.B. 800 = 8 Sekunden)
431
        while( timer2 > 0 )
432
        {
433
            //if( get_key_short(1 << KEY_ENTER) )   break;
434
            if( get_key_short(1 << KEY_ESC) )       break;
435
            PKT_CtrlHook();
436
        }
437
    }
438
    clear_key_all();
439
}
440
 
441
 
442
 
443
//--------------------------------------------------------------
444
// PKT_Message( text, error, timeout, beep, clearscreen)
445
//
446
// zeigt eine Nachricht an ggf. mit Display-Timeout, Tasten, Beep (String im RAM)
447
//
448
// Parameter:
449
//  text       : String im RAM
450
//  error      : true/false
451
//  timeout    : 0 = direktes Verlassen der Funktion ohne warten
452
//               1..nnnn = max. Anzeigezeit (timer); Keyline wird
453
//                  eingeblendet -> Benutzer kann auch eher beenden
454
//  beep       : true/false - bei true haengt die Art des Beep's von 'error' ab
455
//  clearscreen: true/false - ggf. Bildschirm loeschen
456
//--------------------------------------------------------------
457
void PKT_Message( const char *text, uint8_t error, uint16_t timeout, uint8_t beep, uint8_t clearscreen )
458
{
459
    _pkt_message( false, text, error, timeout, beep, clearscreen );
460
}
461
 
462
 
463
 
464
//--------------------------------------------------------------
465
// PKT_Message_P( text, error, timeout, beep, clearscreen)
466
//
467
// zeigt eine Nachricht an ggf. mit Display-Timeout, Tasten, Beep (String im PROGMEM)
468
//
469
// Parameter:
470
//  text     : String im PROGMEM
471
//  error    : true/false
472
//  timeout  : 0 = direktes Verlassen der Funktion ohne warten
473
//             1..nnnn = max. Anzeigezeit (timer); Keyline wird
474
//                eingeblendet -> Benutzer kann auch eher beenden
475
//  beep     : true/false - bei true haengt die Art des Beep's von 'error' ab
476
//  clrscreen: true/false - ggf. Bildschirm loeschen
477
//--------------------------------------------------------------
478
void PKT_Message_P( const char *text, uint8_t error, uint16_t timeout, uint8_t beep, uint8_t clearscreen )
479
{
480
    _pkt_message( true, text, error, timeout, beep, clearscreen );
481
}
482
 
483
 
484
 
485
//--------------------------------------------------------------
486
// PKT_Message_Datenverlust( timeout, beep)
487
//--------------------------------------------------------------
488
void PKT_Message_Datenverlust( uint16_t timeout, uint8_t beep )
489
{
490
  //_pkt_message( true, text,                 error, timeout, beep, clearscreen );
491
    _pkt_message( true, strGet(ERROR_NODATA), true,  timeout, beep, true );
492
}
493
 
494
 
495
 
496
//#############################################################################################
497
//# PKT Popup
498
//#############################################################################################
499
 
500
//--------------------------------------------------------------
501
// INTERN
502
//
503
// PARAMETER:
504
//   progmem : true  = Texte in PROGMEM
505
//             false = Texte im RAM (RAM geht noch nicht!)
506
//   timeout : Zeit bis zum automatischen beenden (z.B. 400 = 4 Sekunden)
507
//             wenn timeout == 0 dann direkt beenden ohne auf Tastendruck zu warten
508
//   text1..4: Text (die Hoehe des Popups berechnet sich aus der Anzahl der Texte)
509
//             -> ein nicht benutzer Text wird mit NULL oder Dezimal 0 uebergeben
510
//--------------------------------------------------------------
511
void _pkt_popup( uint8_t progmem, uint16_t timeout, const char *text1, const char *text2, const char *text3, const char *text4)
512
{
513
    uint8_t n     = 0;
514
    uint8_t yoffs = 0;
515
 
516
    if( text1 ) { n = 1; yoffs = 1; }
517
    if( text2 ) { n = 2; yoffs = 2; }
518
    if( text3 ) { n = 3; yoffs = 2; }
519
    if( text4 ) { n = 4; yoffs = 3; }
520
 
521
    Popup_Draw(n+1);
522
 
523
    if( text1 ) lcdx_printp_center(  8-n, text1, MINVERS, 0,-5-yoffs);          // Text zentriert; String im PROGMEM
524
    if( text2 ) lcdx_printp_center(  9-n, text2, MINVERS, 0,-4-yoffs);          // Text zentriert; String im PROGMEM
525
    if( text3 ) lcdx_printp_center( 10-n, text3, MINVERS, 0,-3-yoffs);          // Text zentriert; String im PROGMEM
526
    if( text4 ) lcdx_printp_center( 11-n, text4, MINVERS, 0,-2-yoffs);          // Text zentriert; String im PROGMEM
527
 
528
    if( timeout )
529
    {
530
        clear_key_all();
531
 
532
        timer2 = timeout;                                                       // max. Anzeigezeit (z.B. 800 = 8 Sekunden)
533
        while( timer2 > 0 )
534
        {
535
            if(    get_key_short(1<<KEY_ESC)
536
                || get_key_short(1<<KEY_ENTER)
537
                || get_key_short(1<<KEY_PLUS)
538
                || get_key_short(1<<KEY_MINUS) )
539
            {
540
                break;
541
            }
542
        }
543
 
544
        lcd_frect( 0, 58-((n+1)*8), 127,  5+((n+1)*8), 0);                      // Box clear - der Bereich des Popup's wird wieder geloescht (nur wenn timeout > 0!)
545
    }
546
    clear_key_all();
547
}
548
 
549
 
550
 
551
//--------------------------------------------------------------
552
// PKT_Popup( timeout, text1, text2, text3, text4 )
553
//
554
// Texte im RAM
555
//--------------------------------------------------------------
556
void PKT_Popup( uint16_t timeout, const char *text1, const char *text2, const char *text3, const char *text4 )
557
{
558
    _pkt_popup( false, timeout, text1, text2, text3, text4 );
559
}
560
 
561
 
562
 
563
//--------------------------------------------------------------
564
// PKT_Popup_P( timeout, text1, text2, text3, text4 )
565
//
566
// Texte im PROGMEM
567
//--------------------------------------------------------------
568
void PKT_Popup_P( uint16_t timeout, const char *text1, const char *text2, const char *text3, const char *text4 )
569
{
570
    _pkt_popup( true, timeout, text1, text2, text3, text4 );
571
}
572
 
573
 
574
 
575
//#############################################################################################
576
//# PKT Ask
577
//#############################################################################################
578
 
579
//--------------------------------------------------------------
580
// wahl = PKT_AskX( asktype, text1, text2, text_progmem, headline, headline_progmem, title, title_progmem)
581
//
582
// PARAMETER:
583
//   asktype         : ASK_YES_NO, ASK_NO_YES, ASK_CANCEL_OK, ASK_END_OK, ASK_END_START
584
//   text1           : 1. Zeile Text
585
//   text2           : optionale 2. Zeile Text
586
//   text_progmem    : text1 & text2 in PROGMEM oder RAM  (PROGMEM = true)
587
//   headline        : Ueberschrift
588
//   headline_progmem: -> PROGMEM oder RAM
589
//   title           : ganz oben der Titel (Zeile 0, Invers)
590
//   title_progmem   : -> PROGMEM oder RAM
591
//
592
// RUECKGABE:
593
//   true  : Ja
594
//   false : Nein
595
//--------------------------------------------------------------
596
uint8_t PKT_AskX( uint8_t asktype, const char *text1, const char *text2, uint8_t text_progmem, const char *headline, uint8_t headline_progmem, const char *title, uint8_t title_progmem )
597
{
598
    uint8_t redraw   = true;
599
    uint8_t keyenter = false;
600
    uint8_t retcode  = false;
601
    const char *pMaskP;
602
    const char *pMaskR;
603
    const char *pMask;
604
 
605
    pMaskP = PSTR("%S");
606
    pMaskR = PSTR("%s");
607
 
608
    set_beep( 35, 0xffff, BeepNormal );                                     // kurzer Beep
609
 
610
    while( true )
611
    {
612
        //------------------------
613
        // Screen zeichnen
614
        //------------------------
615
        if( redraw )
616
        {
617
            if(      title == NULL )    PKT_TitlePKT();                     // Titel mit PKT-Version anzeigen (und clearscreen)
618
            else if( title_progmem )    PKT_Title_P( title, true, true );   // uebergebenen Titel anzeigen (und clearscreen) (PROGMEM)
619
            else                        PKT_Title(   title, true, true );   // uebergebenen Titel anzeigen (und clearscreen) (RAM)
620
 
621
            if( text2 == NULL )
622
            {
623
                // 1 zeiliger Text
624
                pMask = (headline_progmem ? pMaskP : pMaskR);               // Formatmaske fuer headline je nach PROGMEN oder RAM
625
                lcdx_printf_center_P( 2, MNORMAL, 0,2, pMask, headline);    // headline
626
 
627
                lcd_rect_round( 0, 3*7+2+10, 127, 16+0, 1, R2);             // Rahmen
628
 
629
                pMask = (text_progmem ? pMaskP : pMaskR);                   // Formatmaske fuer text1 und text2 je nach PROGMEN oder RAM
630
                lcdx_printf_center_P( 4, MNORMAL, 0,6, pMask, text1);       // text1
631
            }
632
            else
633
            {
634
                // 2 zeiliger Text
635
                pMask = (headline_progmem ? pMaskP : pMaskR);               // Formatmaske fuer headline je nach PROGMEN oder RAM
636
                lcdx_printf_center_P( 2, MNORMAL, 0,-1, pMask, headline);   // headline
637
 
638
                lcd_rect_round(0, 4*8-5, 127, 16+7, 1, R2);                 // Rahmen
639
 
640
                pMask = (text_progmem ? pMaskP : pMaskR);                   // Formatmaske fuer text1 und text2 je nach PROGMEN oder RAM
641
                lcdx_printf_center_P( 4, MNORMAL, 0,-1, pMask, text1);      // text1
642
                lcdx_printf_center_P( 5, MNORMAL, 0, 0, pMask, text2);      // text2
643
            }
644
 
645
 
646
            //------------------------
647
            // Keyline
648
            //------------------------
649
            switch( asktype )
650
            {
651
                case ASK_NO_YES:     lcd_printp_at(12, 7, strGet(NOYES), MNORMAL);               // Keyline: "Nein   Ja"
652
                                     break;
653
 
654
                case ASK_YES_NO:     lcd_printp_at(12, 7, strGet(YESNO), MNORMAL);               // Keyline: "Nein   Ja"
655
                                     break;
656
 
657
                case ASK_CANCEL_OK:  lcd_printp_at(11, 7, strGet(KEYCANCEL), MNORMAL);           // Keyline: "Abbr.   OK"
658
                                     lcd_printp_at(19, 7, PSTR("OK")       , MNORMAL);
659
                                     break;
660
 
661
                case ASK_END_OK:     lcd_printp_at(12, 7, strGet(KEYLINE4), MNORMAL);            // Keyline: "Ende   OK"
662
                                     break;
663
 
664
                case ASK_END_START:  lcd_printp_at(11, 7, strGet(ENDSTART), MNORMAL);            // Keyline: "Ende Start"
665
                                     break;
666
            }
667
 
668
            redraw = false;
669
        }
670
 
671
        //------------------------
672
        // LiPo Spannung zeigen
673
        //------------------------
674
        show_Lipo();
675
 
676
        //------------------------
677
        // ggf. auf PKT-Update reagieren
678
        //------------------------
679
        if( PKT_CtrlHook() )
680
        {
681
            redraw = true;
682
        }
683
 
684
        //------------------------
685
        // Tasten abfragen
686
        //------------------------
687
        if( get_key_short(1 << KEY_ESC) )       // 3. Taste
688
        {
689
            break;
690
        }
691
 
692
        if( get_key_press(1 << KEY_ENTER) )     // 4. Taste
693
        {
694
            keyenter = true;
695
            break;
696
        }
697
    } // end: while( true )
698
 
699
 
700
    //-------------------------
701
    retcode = keyenter;
702
    if( asktype == ASK_YES_NO ) retcode = !retcode;
703
 
704
    clear_key_all();
705
 
706
    return retcode;
707
}
708
 
709
 
710
//--------------------------------------------------------------
711
// wahl = PKT_Ask( asktype, text1, text2, headline, title)
712
//
713
// text1 und text2 im RAM
714
//--------------------------------------------------------------
715
uint8_t PKT_Ask( uint8_t asktype, const char *text1, const char *text2, const char *headline, const char *title )
716
{
717
  //wahl = PKT_AskX( asktype, text1, text2, text_progmem, headline, headline_progmem, title, title_progmem)
718
    return PKT_AskX( asktype, text1, text2, false, headline, true, title, true);
719
  //return _pkt_ask( false, asktype, text1, text2, headline, title);
720
}
721
 
722
 
723
 
724
//--------------------------------------------------------------
725
// wahl = PKT_Ask_P( asktype, text1, text2, headline, title)
726
//
727
// text1 und text2 im PROGMEM
728
//--------------------------------------------------------------
729
uint8_t PKT_Ask_P( uint8_t asktype, const char *text1, const char *text2, const char *headline, const char *title )
730
{
731
  //wahl = PKT_AskX( asktype, text1, text2, text_progmem, headline, headline_progmem, title, title_progmem)
732
    return PKT_AskX( asktype, text1, text2, true, headline, true, title, true);
733
  //return _pkt_ask( true, asktype, text1, text2, headline, title);
734
}
735
 
736
 
737
//#############################################################################################
738
//# PKT Gauge
739
//#############################################################################################
740
 
741
uint8_t Gauge_px;
742
uint8_t Gauge_py;
743
uint8_t Gauge_rx;
744
uint8_t Gauge_ry;
745
uint8_t Gauge_step;
746
volatile uint8_t Gauge_active;          // wird in timer.c abgefragt
747
 
748
#define GAUGE_DEFAULT_PX    64          // Default X (Pixel)
749
#define GAUGE_DEFAULT_PY    40          // Default Y (Pixel)
750
#define GAUGE_DEFAULT_RX    10          // Default Radius X Gauge-Kreis
751
#define GAUGE_DEFAULT_RY     8          // Default Radius Y Gauge-Kreis
752
 
753
#define GAUGE_TIMER         40          // alle n aktualisieren (Timer Intervall)
754
#define GAUGE_DEGREE        45          // Winkel von Schritt zu Schritt
755
#define GAUGE_LROFFS        -2          // die Laenge der Gauge-Linie verringern/vergroessern
756
 
757
//--------------------------------------------------------------
758
// PKT_Gauge_Begin( py )
759
//--------------------------------------------------------------
760
void PKT_Gauge_Begin( uint8_t py )
761
{
762
    Gauge_px = GAUGE_DEFAULT_PX;
763
    Gauge_py = GAUGE_DEFAULT_PY;
764
    Gauge_rx = GAUGE_DEFAULT_RX;
765
    Gauge_ry = GAUGE_DEFAULT_RY;
766
 
767
    if( py>0 ) Gauge_py = py;
768
 
769
    Gauge_step   = 0;
770
    timer_gauge  = GAUGE_TIMER;
771
    Gauge_active = true;
772
 
773
    lcd_ellipse_line( Gauge_px, Gauge_py, Gauge_rx+GAUGE_LROFFS, Gauge_ry+GAUGE_LROFFS, (0), 1);
774
    lcd_ellipse( Gauge_px, Gauge_py, Gauge_rx, Gauge_ry, 1);
775
}
776
 
777
 
778
//--------------------------------------------------------------
779
// PKT_Gauge_End()
780
//--------------------------------------------------------------
781
void PKT_Gauge_End( void )
782
{
783
    Gauge_active = false;
784
}
785
 
786
 
787
//  uint8_t old_step;
788
 
789
//--------------------------------------------------------------
790
// PKT_Gauge_Next()
791
//
792
// INTERN fuer Timer ISR!
793
//--------------------------------------------------------------
794
void PKT_Gauge_Next( void )
795
{
796
    uint8_t old_step;
797
 
798
    old_step = Gauge_step;
799
    Gauge_step++;
800
    if( Gauge_step >= (360/GAUGE_DEGREE))   Gauge_step = 0;
801
 
802
    lcd_ellipse_line( Gauge_px, Gauge_py, Gauge_rx+GAUGE_LROFFS, Gauge_ry+GAUGE_LROFFS, (old_step*GAUGE_DEGREE)  , 0);
803
    lcd_ellipse_line( Gauge_px, Gauge_py, Gauge_rx+GAUGE_LROFFS, Gauge_ry+GAUGE_LROFFS, (Gauge_step*GAUGE_DEGREE), 1);
804
 
805
    timer_gauge  = GAUGE_TIMER;
806
}
807
 
808
 
809
 
810
//#############################################################################################
811
//# PKT Kontrollfunktionen
812
//#############################################################################################
813
 
814
//--------------------------------------------------------------
815
//--------------------------------------------------------------
816
void PKT_Reset_EEprom( void )
817
{
818
    // Text1: "PKT-EEProm"        (EEPROM1)
819
    // Text2: "wirklich löschen?" (EEPROM2)
820
    // Head : "* ACHTUNG '"       (STR_ATTENTION)
821
    // Titel: PKT-Version         (NULL)
822
 
823
    if( PKT_Ask_P( ASK_YES_NO, strGet(EEPROM1), strGet(EEPROM2), strGet(STR_ATTENTION), NULL) )
824
    {
825
        Delete_EEPROM();
826
        clr_V_On();
827
    }
828
}
829
 
830
 
831
 
832
//--------------------------------------------------------------
833
//--------------------------------------------------------------
834
void PKT_SwitchOff( void )
835
{
836
    // Text1: "PKT ausschalten?"  (SHUTDOWN)
837
    // Text2: NULL
838
    // Head : "PKT"               (STR_PKT)
839
    // Titel: PKT-Version         (NULL)
840
 
841
    if( PKT_Ask_P( ASK_NO_YES, strGet(SHUTDOWN), NULL, strGet(STR_PKT), NULL) )
842
    {
843
        WriteParameter();   // am Ende alle Parameter sichern
844
        clr_V_On();         // Spannung abschalten
845
    }
846
}
847
 
848
 
849
 
850
//--------------------------------------------------------------
851
//--------------------------------------------------------------
852
void PKT_Ask_Restart( const char *title )
853
{
854
    // Text1: "jetzt ausschalten?"  (STR_PKT_SWITCHOFF_NOW)
855
    // Text2: NULL
856
    // Head : "PKT neu starten!"    (STR_PKT_RESTART_NOW)
857
    // Titel: via Parameter
858
 
859
    if( PKT_Ask_P( ASK_NO_YES, strGet(STR_PKT_SWITCHOFF_NOW), NULL, strGet(STR_PKT_RESTART_NOW), title) )
860
    {
861
        WriteParameter();       // am Ende alle Parameter sichern
862
        clr_V_On();             // Spannung abschalten
863
    }
864
}
865
 
866
 
867
 
868
//--------------------------------------------------------------
869
//--------------------------------------------------------------
870
void PKT_Update( void )
871
{
872
    // Text1: "Drücke 'Start' für"   (UPDATE2)
873
    // Text2: "min. 2 Sekunden"      (UPDATE3)
874
    // Head : "Verbinde PKT mit PC!" (UPDATE1)
875
    // Titel: "PKT Update"
876
 
877
    if( PKT_Ask_P( ASK_END_START, strGet(UPDATE2), strGet(UPDATE3), strGet(UPDATE1), PSTR("PKT Update")) )
878
    {
879
        uart1_putc('S');            // Startzeichen zum Updatetool schicken
880
        wdt_enable( WDTO_250MS );   // start bootloader with Reset, Hold KEY_ENTER
881
        while(true);
882
    }
883
}
884
 
885
 
886
 
887
//void PKT_Update( void )
888
//{
889
//    ShowTitle_P( PSTR("PKT Update"), true );
890
//    lcdx_printp_center( 2, strGet(UPDATE1), MNORMAL, 0,-1);      // "Verbinde PKT mit PC!"
891
//    lcd_rect_round(0, 4*8-5, 127, 16+7, 1, R2);                  // Rahmen
892
//    lcdx_printp_center( 4, strGet(UPDATE2), MNORMAL, 0,-1);      // "Drücke 'Start' für"
893
//    lcdx_printp_center( 5, strGet(UPDATE3), MNORMAL, 0, 0);      // "min. 2 Sekunden"
894
//    lcd_printp_at(11, 7, strGet(ENDSTART), MNORMAL);           // Keyline
895
//    //PKTupdate = false; // Flag löschen
896
//
897
//    set_beep( 80, 0x000f, BeepNormal);                           // kurzer Beep
898
//
899
//    do
900
//    {
901
//        if( get_key_press (1 << KEY_ESC) )
902
//        {
903
//            //get_key_press(KEY_ALL);
904
//            clear_key_all();
905
//            return;
906
//        }
907
//    }
908
//    while( !(get_key_press (1 << KEY_ENTER)) );
909
//
910
//    uart1_putc('S');          // Startzeichen zum Updatetool schicken
911
//    wdt_enable( WDTO_250MS ); // start bootloader with Reset, Hold KEY_ENTER
912
//    while(true);
913
//}
914
 
915
 
916
 
917
//--------------------------------------------------------------
918
// prueft im Menue ob das Updatetool ein Update machen will
919
//--------------------------------------------------------------
920
uint8_t PKT_CheckUpdate(void)
921
{
922
    unsigned int uart_data;
923
    uint8_t state         = 0;
924
    uint8_t update        = false;
925
    uint8_t error         = false;
926
    uint8_t SendVersion   = false;
927
    char s[7];
928
 
929
 
930
    //----------------------------
931
    // empfangen
932
    //----------------------------
933
    if( uart1_available() > 0 )             // Zeichen von der USB-Schnittstelle vorhanden?
934
    {
935
        timer_pktupdatecheck = 100;         // Timeouttimer um die Funktion abzubrechen
936
 
937
        while( !timer_pktupdatecheck==0 && !update && !error && !SendVersion )
938
        {
939
            uart_data = uart1_getc();
940
            if( !((uart_data & 0xFF00) == UART_NO_DATA) )
941
            {
942
                switch (state)
943
                {
944
                    case  0:    if( uart_data == PKTESC )
945
                                {
946
                                    state = 1;
947
                                }
948
                                else error = true;
949
                                break;
950
 
951
                    case  1:    if( uart_data == PKTESC )
952
                                {
953
                                    state = 2;
954
                                }
955
                                else error = true;
956
                                break;
957
 
958
                    case  2:    if(      uart_data == PKTUPDATE ) update = true;
959
                                else if (uart_data == PKTVERSION) SendVersion = true;
960
                                else error = true;
961
                                break;
962
                } // end: switch
963
            } // end: if
964
        } // end: while
965
 
966
 
967
        //----------------------------
968
        // Rueckmeldungen
969
        //----------------------------
970
        if( error )
971
        {
972
            uart1_putc('E');                            // Rueckmeldungen zum Updatetool
973
        }
974
        else if( update )
975
        {
976
            uart1_putc('U');
977
        }
978
        else if( SendVersion )
979
        {
980
            uart1_putc('V');
981
            itoa( EEpromVersion, s, 10 );
982
            uart1_puts(s);
983
         }
984
        else if( timer_pktupdatecheck==0 )
985
        {
986
            uart1_putc('T');
987
        }
988
 
989
         //uart1_flush();
990
    }
991
 
992
    return update;
993
}
994
 
995
 
996
 
997
//--------------------------------------------------------------
998
// retcode = PKT_CtrlHook()
999
//
1000
// ruft ggf. PKT_Update() auf und kann spaeter weitere PKT interne
1001
// Sachen verarbeiten wenn der Hook (=Nagel) in entsprechende
1002
// Routienen eingebaut ist (z.B. senden von Daten an den PC)
1003
//
1004
// Aktuell verwendet von: menuctrl, scrollbox, osd
1005
//
1006
// Rueckgabe:
1007
//   retcode: 0 = nichts wurde gemacht (false)
1008
//            1 = es wurde etwas durchgefuehrt und die Aufruffunktion
1009
//                muss gff. einen Screenrefresh durchfuehren
1010
//                (z.B. wenn der PKT-Update Screen gezeigt wurde)
1011
//--------------------------------------------------------------
1012
uint8_t PKT_CtrlHook( void )
1013
{
1014
    uint8_t retcode = 0;
1015
 
1016
    // 31.05.2014 OG: PKT_CheckUpdate() darf nicht in 'Hoechstgeschwindigkeit'
1017
    // aufgerufen werden da es sonst seitens des PKT-Updatetools ggf. zu einer
1018
    // Fehlermeldung kommt - deswegen hier timer_pktupdatecheck der PKT_CheckUpdate
1019
    // etwas einbremst sich aber nicht negativ auf die PKT-Performance auswirkt.
1020
    if( !timer_pktupdatecheck )
1021
    {
1022
        if( PKT_CheckUpdate() )                  // Update vom Updatetool angefordert?
1023
        {
1024
            WriteParameter();
1025
            PKT_Update();
1026
            retcode = 1;
1027
        }
1028
        timer_pktupdatecheck = 10;
1029
    }
1030
 
1031
    return retcode;
1032
}
1033
 
1034
 
1035
 
1036
//--------------------------------------------------------------
1037
// zeigt PKT-Version und Credits / Entwickler
1038
//--------------------------------------------------------------
1039
void PKT_Info( void )
1040
{
1041
    char *HWV_39m = "3.9m";
1042
    char *HWV_39x = "3.9x";
1043
    char *HWV     = "????";
1044
 
1045
    if( PCB_Version == PKT39m )    HWV = HWV_39m;
1046
    if( PCB_Version == PKT39x )    HWV = HWV_39x;
1047
 
1048
    lcd_cls();
1049
 
1050
    if( !ScrollBox_Create(55) )     // max. 55 Zeilen
1051
        return;                     //   kein RAM mehr
1052
 
1053
    ScrollBox_Push_P( MINVERS, PSTR(" PKT v%8S %s"), PSTR(PKTSWVersion), HWV );     // "3.6.8a..." und die PKT-Hardwareversion
1054
    ScrollBox_Push_P( MINVERS, PSTR(" %S SV2-Patch"), (PCB_SV2RxTxPatch ? strGet(STR_WITH) : strGet(STR_WITHOUT)) );
1055
    ScrollBox_Push_P( MNORMAL, PSTR("") );
1056
    ScrollBox_Push_P( MNORMAL, PSTR("(C) GNU GPL License") );
1057
    ScrollBox_Push_P( MNORMAL, PSTR("    NO WARRANTY") );
1058
    ScrollBox_Push_P( MNORMAL, PSTR("") );
1059
 
1060
 
1061
#ifdef USE_MODULEINFO
1062
 
1063
    const char *fmt = PSTR("%15S %4S");
1064
 
1065
    //--- MODULE SUPPORT INFO ---
1066
    ScrollBox_Push_P( MINVERS, PSTR(" Modules installed") );
1067
 
1068
    #ifdef USE_BLUETOOTH
1069
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("Bluetooth"), strGet(YES) );
1070
    #else
1071
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("Bluetooth"), strGet(NOO) );
1072
    #endif
1073
 
1074
 
1075
    #ifdef USE_WLAN
1076
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("WLAN WyFly"), strGet(YES) );
1077
    #else
1078
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("WLAN WyFly"), strGet(NOO) );
1079
    #endif
1080
 
1081
 
1082
    #ifdef USE_MKSETTINGS
1083
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("MK Settings"), strGet(YES) );
1084
    #else
1085
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("MK Settings"), strGet(NOO) );
1086
    #endif
1087
 
1088
 
1089
    #ifdef USE_MKDEBUGDATA
1090
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("MK Debug Data"), strGet(YES) );
1091
    #else
1092
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("MK Debug Data"), strGet(NOO) );
1093
    #endif
1094
 
1095
 
1096
    #ifdef USE_MKDISPLAY
1097
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("MK Display"), strGet(YES) );
1098
    #else
1099
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("MK Display"), strGet(NOO) );
1100
    #endif
1101
 
1102
 
1103
    #ifdef USE_OSDDATA
1104
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD-Data"), strGet(YES) );
1105
    #else
1106
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD-Data"), strGet(NOO) );
1107
    #endif
1108
 
1109
 
1110
    #ifdef USE_OSD_SCREEN_OLD
1111
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD Old Screens"), strGet(YES) );
1112
    #else
1113
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD Old Screens"), strGet(NOO) );
1114
    #endif
1115
 
1116
 
1117
    #ifdef USE_OSD_SCREEN_NAVIGATION
1118
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD Navigation"), strGet(YES) );
1119
    #else
1120
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD Navigation"), strGet(NOO) );
1121
    #endif
1122
 
1123
 
1124
    #ifdef USE_OSD_SCREEN_WAYPOINTS
1125
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD Waypoints"), strGet(YES) );
1126
    #else
1127
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD Waypoints"), strGet(NOO) );
1128
    #endif
1129
 
1130
 
1131
    #ifdef USE_OSD_SCREEN_ELECTRIC
1132
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD Electric"), strGet(YES) );
1133
    #else
1134
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD Electric"), strGet(NOO) );
1135
    #endif
1136
 
1137
 
1138
    #ifdef USE_OSD_SCREEN_MKSTATUS
1139
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD MKStatus"), strGet(YES) );
1140
    #else
1141
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD MKStatus"), strGet(NOO) );
1142
    #endif
1143
 
1144
 
1145
    #ifdef USE_OSD_SCREEN_USERGPS
1146
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD UserGPS"), strGet(YES) );
1147
    #else
1148
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD UserGPS"), strGet(NOO) );
1149
    #endif
1150
 
1151
 
1152
    #ifdef USE_OSD_SCREEN_3DLAGE
1153
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD 3D-Lage"), strGet(YES) );
1154
    #else
1155
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD 3D-Lage"), strGet(NOO) );
1156
    #endif
1157
 
1158
 
1159
    #ifdef USE_OSD_SCREEN_STATISTIC
1160
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD Statistic"), strGet(YES) );
1161
    #else
1162
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("OSD Statistic"), strGet(NOO) );
1163
    #endif
1164
 
1165
 
1166
    #ifdef USE_TRACKING
1167
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("Tracking"), strGet(YES) );
1168
    #else
1169
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("Tracking"), strGet(NOO) );
1170
    #endif
1171
 
1172
 
1173
    #ifdef USE_FOLLOWME
1174
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("Follow Me"), strGet(YES) );
1175
    #else
1176
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("Follow Me"), strGet(NOO) );
1177
    #endif
1178
 
1179
 
1180
    #ifdef USE_JOYSTICK
1181
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("Joystick"), strGet(YES) );
1182
    #else
1183
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("Joystick"), strGet(NOO) );
1184
    #endif
1185
 
1186
 
1187
    #ifdef USE_I2CMOTORTEST
1188
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("I2C Motortest"), strGet(YES) );
1189
    #else
1190
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("I2C Motortest"), strGet(NOO) );
1191
    #endif
1192
 
1193
 
1194
    #ifdef USE_SOUND
1195
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("Sound"), strGet(YES) );
1196
    #else
1197
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("Sound"), strGet(NOO) );
1198
    #endif
1199
 
1200
 
1201
    #ifdef USE_FONT_BIG
1202
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("Font Big"), strGet(YES) );
1203
    #else
1204
        ScrollBox_Push_P( MNORMAL, fmt, PSTR("Font Big"), strGet(NOO) );
1205
    #endif
1206
 
1207
    ScrollBox_Push_P( MNORMAL, PSTR("") );
1208
 
1209
#endif // USE_MODULEINFO
1210
 
1211
 
1212
    //--- CREDITS INFO ---
1213
    ScrollBox_Push_P( MINVERS, PSTR(" Credits") );
1214
    ScrollBox_Push_P( MNORMAL, PSTR("2013 Oliver Gemesi") );
1215
    ScrollBox_Push_P( MNORMAL, PSTR("2012 Chr. Brandtner" ) );
1216
    ScrollBox_Push_P( MNORMAL, PSTR("     Harald Bongartz") );
1217
    ScrollBox_Push_P( MNORMAL, PSTR("2012 Martin Runkel") );
1218
    ScrollBox_Push_P( MNORMAL, PSTR("2012 gebad") );
1219
    ScrollBox_Push_P( MNORMAL, PSTR("2010 Sebastian Boehm") );
1220
    ScrollBox_Push_P( MNORMAL, PSTR("2009-2010 Peter Mack") );
1221
    ScrollBox_Push_P( MNORMAL, PSTR("2008 Thomas Kaiser") );
1222
 
1223
    ScrollBox_Show();
1224
    ScrollBox_Destroy();            // free memory
1225
}
1226
 
1227