Subversion Repositories Projects

Rev

Rev 2200 | Go to most recent revision | Blame | Last modification | View Log | RSS feed

/*****************************************************************************
 *   Copyright (C) 2008 Thomas Kaiser, thomas@ft-fanpage.de                  *
 *   Copyright (C) 2009 Peter "woggle" Mack, mac@denich.net                  *
 *   Copyright (C) 2011 Christian "Cebra" Brandtner, brandtner@brandtner.net *
 *   Copyright (C) 2011 Harald Bongartz                                      *
 *                                                                           *
 *   This program is free software; you can redistribute it and/or modify    *
 *   it under the terms of the GNU General Public License as published by    *
 *   the Free Software Foundation; either version 2 of the License.          *
 *                                                                           *
 *   This program is distributed in the hope that it will be useful,         *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of          *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
 *   GNU General Public License for more details.                            *
 *                                                                           *
 *   You should have received a copy of the GNU General Public License       *
 *   along with this program; if not, write to the                           *
 *   Free Software Foundation, Inc.,                                         *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.               *
 *                                                                           *
 *                                                                           *
 *   Credits to:                                                             *
 *   Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN  *
 *                        http://www.mikrokopter.de                          *
 *   Gregor "killagreg" Stobrawa for his version of the MK code              *
 *   Thomas Kaiser "thkais" for the original project. See                    *
 *                        http://www.ft-fanpage.de/mikrokopter/              *
 *                        http://forum.mikrokopter.de/topic-4061-1.html      *
 *   Claas Anders "CaScAdE" Rathje for providing the font and his C-OSD code *
 *                        http://www.mylifesucks.de/oss/c-osd/               *
 *   Harald Bongartz "HaraldB" for providing his Ideas and Code for usibility*
 *****************************************************************************/


//############################################################################
//# HISTORY  setup.c
//#
//#
//# 03.08.2015 CB
//# - add: FollowMe Setup um Distance und Azimuth erweitert
//#
//# 27.06.2014 OG
//# - chg: Setup_MAIN() - Reihenfolge von GPS-Maus/FollowMe/Tracking geaendert
//#
//# 25.06.2014 OG
//# - chg: Text von GPS_SHOWDEV
//# - chg: Setup_FollowMe() - deaktiviert/auskommentiert: FME_REFRESH
//# - chg: Setup_GPSMouse() - deaktiviert/auskommentiert: GPS_TYPE, GPS_ACTIVE
//#
//# 24.06.2014 OG
//# - chg: Setup_GPSMouse() angepasst auf geaendertes GPSMouse_ShowData()
//#
//# 22.06.2014 OG
//# - del: verschiedene weitere Modul-Variablen entfernt weil nicht benoetigt
//# - del: Variable CheckGPS
//# - del: BT_ShowGPSData() - ist jetzt als GPSMouse_ShowData() in gps/gpsmouse.c
//# - chg: BT_ShowGPSData() - Parameter und Rueckgabe
//# - del: BT_ShowGPSData_OLD
//#
//# 21.06.2014 CB
//# - chg: BT_SearchDevices - Timeoutanzeige bei Devicesuche
//#
//# 16.06.2014 OG
//# - chg: BT_ShowGPSData() - neues Layout und Anzeige fuer "XCnt" (=RX-Count)
//#        hinzugefuegt; XCnt zeigt die Anzahl empfangener GPS-Datenpakete an
//#        und ist ein Indikator wie schnell die BT-GPS Maus Daten sendet
//#
//# 13.06.2014 OG
//# - chg: Setup_PKTGeneric() - neue Einstellung "PKT aus nach"
//# - del: ChangeWi_SV2()
//#
//# 12.06.2014 OG
//# - del: Reset_EEprom() - ist jetzt als PKT_Reset_EEprom() in pkt.c
//#
//# 11.06.2014 OG
//# - fix: Edit_generic() funktioniert jetzt auch, wenn kein vorgelagertes
//#        Menue vorhanden ist (ggf. muss das Label angepasst werden)
//#
//# 10.06.2014 OG
//# - chg: verschiedene Funktionen umgestellt auf Wi232_Initalize()
//#
//# 08.06.2014 OG
//# - add: Setup_MKConnection() - hier ist auch das setzen der Baudrate Wi232/BT
//#        hin verschoben worden (war vorher im Wi.232 Bereicch)
//#
//# 06.06.2014 OG
//# - chg: Setup_WI232_MenuCreate()... Eintraege geloescht...
//#
//# 04.06.2014 OG
//# - chg: Setup_PKTGeneric() eine Menue-Trennlinie hinter Sommerzeit eingefuegt
//#
//# 01.06.2014 OG
//# - chg: Edit_LED_Form() Parameter 'Text' entfernt und auf strGetOSDOLD()
//#        umgestellt
//# - add: include "../osd/osdold_messages.h"
//#
//# 31.05.2014 OG
//# - chg: Edit_String() - Parameter 'Text' entfernt; angepasst auf neue
//#        Titelzeile; PKT_CtrlHook integriert; PKT Lipo-Anzeige;
//#        auf 'redraw' umgestellt
//#
//# 30.05.2014 OG
//# - chg: Edit_LipoOffset() - umgeschrieben auf neues Layout, Code optimiert,
//#        Increment jetzt +/-50 (statt vorher 20), Offset bis 15000 (statt 10000)
//# - chg: Edit_LipoOffset() - keine Parameter mehr, keine Rueckgabe
//#
//# 29.05.2014 OG
//# - chg: Setup_OSD() umgestellt auf Menuetexte statt strGet() mit Textaenderung
//#
//# 28.05.2014 OG
//# - chg: Setup's auf das neue Edit_generic() umgestellt
//# - chg: Edit_generic() - geaenderte Aufrufparameter
//#        (Text enfernt da vom Menue geerbt; optionale Hilfstexte moeglich)
//#
//# 27.05.2014 OG
//# - del: Edit_generic_int(), Edit_printout_int() - nicht mehr benoetigt da
//#        anhaengende Werte umgemappt auf Edit_generic()
//#
//# 26.05.2014 OG
//# - chg: Menuetext TIME_ZONE ergaenzt um "UTC"
//# - chg: Setup_MAIN() - neue Anordnung der Menueeintraege mit Trennlinien
//# - chg: Setup_OSDScreens() - OSDSCREEN_WAYPOINTS hinzugefuegt
//# - chg: Text "LCD aus nach..." nach "LCD aus nach"
//# - chg: Text "PKT allgemein" geaendert auf "PKT Allgemein"
//# - del: PKT_LCDINVERS inkl. Sprachen
//# - chg: Setup_PKTGeneric() - PKT_LCDINVERS (Config.LCD_DisplayMode) entfernt,
//#        nicht mehr unterstuetzt
//# - chg: Edit_printout() - Hilfstexte CHANGENORMREV1 und 2 fuer NormRev entfernt
//#
//# 23.05.2014 OG
//# - add: Edit_generic() - Anzeige Titel mit PKT_TitleFromMenuItem()
//# - fix: Setup_PKTGeneric() - PKT_LCDINVERS (Config.LCD_DisplayMode)
//#        Edit-Range umgestellt von 0,4 auf 0,1
//#
//# 11.05.2014 OG
//# - chg: die Setup-Menues umgestellt auf MenuCtrl_SetTitleFromParentItem()
//#        -> die Menues 'erben' damit ihren Titel vom aufrufenden Menuepunkt
//# - chg: ein paar Menuetexte fuer Setup_MAIN()
//#
//# 18.04.2014 OG
//# - chg: Setup_PKTGeneric() - PKT_BRIGHTNESS rausgenommen da es aktuell auch
//#        nicht mehr mit PKT 3.9m Hardware geht (spart ca. 650 Bytes)
//# - chg: Text von "Tracking Servos" gekuerzt auf "Tracking"
//#
//# 09.04.2014 OG
//# - chg: Edit_printout() Text von WlanMode 'Nein' auf 'Aus' geaendert
//#
//# 04.04.2014 OG
//# - chg: Edit_String() auf ShowTitle_P() umgestellt
//# - del: Edit_ShowTitle_P()
//# - chg: in versch. Funktionen Titel-Strings fuer Edit_String() gekuerzt
//# - chg: Edit_String() auf Edit_ShowTitle_P() umgestellt
//#
//# 02.04.2014 OG
//# - add: Edit_ShowTitle_P()
//# - add: Edit_printout(): WlanMode (Aus, AP-Mode, AdHoc)
//# - chg: Edit_printout(): Code-Optimierung
//#
//# 01.04.2014 OG
//# - add: Unterstuetzung fuer BLE (Bluetooth 4 Low Energy Zusatzmodul an SV2)
//# - chg: PCB_WiFlyPatch umbenannt zu PCB_SV2RxTxPatch
//#
//# 30.03.2014 OG
//# - chg: Sprache Hollaendisch vollstaendig entfernt
//# - chg: MenuCtrl_PushML_P() umgestellt auf MenuCtrl_PushML2_P()
//#
//# 27.03.2014 OG
//# - chg: Setup_PKTGeneric(), Edit_printout() Sprache "Niederländisch" nicht mehr waehlbar
//#
//# 04.02.2014 OG
//# - chg: kleine Layoutaenderung von 'PKT_Akku' in Edit_printout()
//# - add: PKT_CtrlHook() in Edit_generic(), Edit_generic_int(), Edit_LipoOffset() eingebaut
//# - add: kleiner Hilfetext in Edit_printout() bei Aenderung von Einstellung
//#        "LCD Normal/Invers" bzgl. PKT neu starten nach Aenderung
//# - chg: Anzeige von Edit_LipoOffset() geaendert und fix vom springen der
//#        Eingabe wenn Wert geaendert wird
//#
//# 03.02.2014 OG
//# - add: SHOWCELLU in Setup_OSD() ("zeige Zellensp.")
//#
//# 30.01.2014 OG
//# - add: Unterstuetzung fuer USE_BLUETOOTH
//#
//# 29.07.2013 Cebra
//# - chg: Fehler in Setup_WI232_MenuCreate, MenuCtrl_Push_P( WI_INSTALLED.. war auskommentiert, dadurch Fehler im Menu bei nicht
//#        aktivem Wi232
//#
//# 18.07.2013 Cebra
//# - chg: Edit_PKT_Accu entfernt, Edit_generic erweitert
//#
//# 15.07.2013 Cebra
//# - add: Edit_Printout um Wlan Security erweitert
//#
//# 07.07.2013 OG
//# - add: Setup_OSDScreens(), Mark_OSDScreen(), Edit_OSDScreen()
//#
//# 04.07.2013 Cebra
//# - chg: Setupmenü um Wlan erweitert
//#
//# 02.07.2013 Cebra
//# - chg: Edit_String, geändert für die Nutzung von SSID und Wlan Passwort
//#
//# 30.06.2013 OG
//# - del: Setup_OSD(): OSDS_HOMEVIEW
//#
//# 26.06.2013 OG
//# - del: USE_PKT_STARTINFO
//#
//# 24.06.2013 OG
//# - chg: vor dem editieren des Bluetooth Namens bt_fixname() eingefuegt
//#
//# 24.06.2013 OG
//# - fix: Edit_String(): Fehlermeldung bei EDIT_BT_NAME wenn erstes Zeichen = Space
//# - chg: Edit_String(): Code-Layout und diverses
//# - chg: Setup_BTM222(): Bearbeitung von BT_NAME geaendert
//# - chg: Setup_BTM222(): Menuetexte geaendert
//# - chg: Setup_MAIN(): Text im Setup-Hauptmenue von "BTM-222" auf "Bluetooth" geaendert
//#
//# 21.06.2013 OG
//# - fix: Menuetext GPSMouse "Zeige Geräteliste" (Anzeige "ä" korrigiert)
//#
//# 15.06.2013 OG
//# - add: "zeige MK-Setting" in Setup_OSD() hinzugefuegt
//#
//# 15.06.2013 OG
//# - chg: Umstrukturierungen am OSD-Setup
//# - chg: OSD Empfangsausfall von Setup_PKTGeneric() nach Setup_OSD() verschoben
//#
//# 13.06.2013 OG
//# - del: Setup_Time() - jetzt in Setup_PKTGeneric()
//# - del: Setup_PKTAccu() - jetzt in Setup_PKTGeneric()
//# - del: SETUP_PKTDEBUG in Setup_MAIN() entfernt (auskommentiert, wenn notwendig ggf. mit einem Debug define regeln)
//# - chg: diverse Aenderungen in Menutexten
//# - fix: keine LCD-Helligkeitseinstellung bei HW 3.9x mehr durch Abfrage von PCB_Version
//#
//# 31.05.2013 cebra
//# - chg: Umlaute, soweit gefunden, korrigiert
//#
//# 30.05.2013 cebra
//# - chg: doppelte Texte auf #define umgestellt
//#
//# 24.05.2013 OG
//# - chg: etliche Aenderungen rund um Bluetooth/BT-GPS Maus fuer bessere
//#        Usebility, Code-Einsparung und Code-Lesbarkeit
//# - add: Wait4KeyOK()
//# - chg: Aufrufe von MenuCtrl_Push() umgestellt auf MenuCtrl_PushML_P()
//#
//# 22.05.2013 OG
//# - chg: umgestellt auf menuctrl: BT_SelectDevice()
//#
//# 22.05.2013 OG
//# - chg: umgestellt auf menuctrl: Setup_Time(), Setup_FollowMe(), Setup_OSD()
//# - chg: weitere Speicheroptimierungen fuer USE_*
//# - chg: Menu_Setup() umbenannt zu Setup_MAIN()
//#
//# 20.05.2013 OG
//# - chg: umgestellt auf menuctrl: Menu_Setup(), Setup_PKTGeneric(), Setup_WI232()
//#        Setup_BTM222(), Setup_PKTAccu(), Setup_GPSMouse()
//# - add: GPSMouse_ShowData()
//#
//# 19.05.2013 OG
//# - chg: Aufruf von Update_PKT() umgestellt auf PKT_Update()
//#
//# 17.05.2013 OG
//# - chg: umgestellt auf utils/menuold.h
//#
//# 16.05.2013 Cebra
//# - chg: Fehler bei On/Off Settings
//#
//# 05.05.2013 Cebra
//# - add: PKT Zeitsetup
//#
//# 19.04.2013 Cebra
//# - chg: Fehlerbehandlung im GPS Menü für den Fall das kein BTM22 eingebaut oder GPS-Device konfiguriert
//#
//# 16.04.2013 Cebra
//# - chg: PROGMEM angepasst auf neue avr-libc und GCC, prog_char depreciated
//#
//# 12.04.2013 Cebra
//# - chg: edit_generic um Sprungfaktor erweitert, erm�glicht bei hohen Werten einen schnelleren Wertewechsel
//#
//# 03.04.2013 Cebra
//# - chg: find/replace Fehler bei lcd_puts_at beseitigt, GPS und BT-Maus Bereich
//#
//# 02.04.2013 Cebra
//# - chg: Textfehler bei der Einstellung "Verbindung zum MK" beseitigt
//#
//# 04.03.2013 Cebra
//# - del: OSD-Sreenmode ,is no longer necessary, last OSD-Screen is saved at shutdown
//#
//# 27.03.2013 Cebra
//# - chg: Fehler bei der Menüsteuerung behoben
//############################################################################


#include "../cpu.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <string.h>
#include <util/delay.h>
#include "../main.h"
#include "../setup/setup.h"
#include "../lcd/lcd.h"
#include "../timer/timer.h"
#include "../wi232/Wi232.h"
#include "../bluetooth/bluetooth.h"
#include "../connect.h"
#include "../lipo/lipo.h"
#include "../messages.h"
#include "../eeprom/eeprom.h"
#include "../tracking/tracking.h"
#include "../uart/uart1.h"
#include "../sound/pwmsine8bit.h"
#include "../tracking/servo_setup.h"
#include "../bluetooth/error.h"
#include "../stick/stick_setup.h"
#include "../utils/menuctrl.h"
#include "../utils/xutils.h"
#include "../pkt/pkt.h"
#include "../osd/osd.h"
#include "../wifly/wifly_setup.h"
#include "../gps/gpsmouse.h"
#include "../utils/scrollbox.h"
#include "../osd/osdold_messages.h"


uint8_t  edit = 0;
uint16_t Pre;
char     EditString[21];
uint8_t  length_tmp;
uint8_t  Old_Baudrate;              //Merkzelle für alte Baudrate


//############################################################################
//############################################################################

//-----------------------------
// Setup_Main()
//-----------------------------
#define SETUP_MKCONNECTION  1
#define SETUP_PKTCONFIG     2
#define SETUP_WI232         3
#define SETUP_BTM222        4
#define SETUP_SERVOCONFIG   5
#define SETUP_OSDVIEW       6
#define SETUP_TIME          7
#define SETUP_GPSMAUS       8
#define SETUP_FOLLOWME      9
#define SETUP_JOYSTICK      10
#define SETUP_PKTAKKU       11
#define SETUP_PKTUPDATE     12
#define SETUP_PKTDEBUG      13
#define SETUP_EEPROMRESET   14
#define SETUP_WIFLY         15
#define SETUP_OSDSCREENS    16
#define SETUP_BLE           17


static const char SETUP_MKCONNECTION_de[]     PROGMEM = "Verbindung MK";
static const char SETUP_MKCONNECTION_en[]     PROGMEM = "connection MK";

static const char SETUP_PKTCONFIG_de[]        PROGMEM = "PKT Allgemein";
static const char SETUP_PKTCONFIG_en[]        PROGMEM = "PKT general";

static const char SETUP_WI232_de[]            PROGMEM = "Wi.232";
#define           SETUP_WI232_en              SETUP_WI232_de

static const char SETUP_BTM222_de[]           PROGMEM = "Bluetooth";
#define           SETUP_BTM222_en             SETUP_BTM222_de

static const char SETUP_BLE_de[]              PROGMEM = "Bluetooth BLE";
#define           SETUP_BLE_en                SETUP_BLE_de

static const char SETUP_WIFLY_de[]            PROGMEM = "WLAN WiFly";
#define           SETUP_WIFLY_en              SETUP_WIFLY_de

static const char SETUP_SERVOCONFIG_de[]      PROGMEM = "Tracking";
#define           SETUP_SERVOCONFIG_en        SETUP_SERVOCONFIG_de

static const char SETUP_OSDVIEW_de[]          PROGMEM = "OSD Anzeige";
static const char SETUP_OSDVIEW_en[]          PROGMEM = "OSD display";

static const char SETUP_OSDSCREENS_de[]       PROGMEM = "OSD Screens";
static const char SETUP_OSDSCREENS_en[]       PROGMEM = "OSD screens";

static const char SETUP_GPSMAUS_de[]          PROGMEM = "GPS Maus";
static const char SETUP_GPSMAUS_en[]          PROGMEM = "GPS mouse";

static const char SETUP_FOLLOWME_de[]         PROGMEM = "Follow Me";
#define           SETUP_FOLLOWME_en           SETUP_FOLLOWME_de

static const char SETUP_JOYSTICK_de[]         PROGMEM = "Joystick";
#define           SETUP_JOYSTICK_en           SETUP_JOYSTICK_de

static const char SETUP_PKTUPDATE_de[]        PROGMEM = "PKT Update";
#define           SETUP_PKTUPDATE_en          SETUP_PKTUPDATE_de

static const char SETUP_PKTDEBUG_de[]         PROGMEM = "Debug PKT";
#define           SETUP_PKTDEBUG_en           SETUP_PKTDEBUG_de

static const char SETUP_EEPROMRESET_de[]      PROGMEM = "PKT Reset";
#define           SETUP_EEPROMRESET_en        SETUP_EEPROMRESET_de

//############################################################################

//-----------------------------
// Setup_PKTGeneric() ("PKT allgemein")
//-----------------------------
#define PKT_LANGUAGE        3
#define PKT_LIGHTOFF        4
#define PKT_BRIGHTNESS      5
#define PKT_CONTRAST        6
#define PKT_SOUNDMODUL      9
#define PKT_BEEPER          10
#define PKT_VOLUME          11
#define PKT_ACCUTYPE        12
#define PKT_ACCUMEASURE     13
#define TIME_ZONE           14
#define TIME_SUMMER         15
#define PKT_PKTOFF          16


static const char LANGUAGE_de[]         PROGMEM = "Sprache";
static const char LANGUAGE_en[]         PROGMEM = "language";

static const char TIME_ZONE_de[]        PROGMEM = "Zeitzone UTC";
static const char TIME_ZONE_en[]        PROGMEM = "time zone UTC";

static const char TIME_SUMMER_de[]      PROGMEM = "Sommerzeit";
static const char TIME_SUMMER_en[]      PROGMEM = "summer time";

static const char PKT_PKTOFF_de[]       PROGMEM = "PKT aus nach";
static const char PKT_PKTOFF_en[]       PROGMEM = "PKT off after";

static const char LIGHTOFF_de[]         PROGMEM = "LCD aus nach";
static const char LIGHTOFF_en[]         PROGMEM = "LCD off after";

//static const char BRIGHTNESS_de[]       PROGMEM = "LCD Helligkeit";
//static const char BRIGHTNESS_en[]       PROGMEM = "LCD brightness";

static const char CONTRAST_de[]         PROGMEM = "LCD Kontrast";
static const char CONTRAST_en[]         PROGMEM = "LCD contrast";

static const char BEEPER_de[]           PROGMEM = "Hardware Beeper";
#define           BEEPER_en             BEEPER_de

#ifdef USE_SOUND
static const char SOUNDMODUL_de[]       PROGMEM = "Soundmodul";
static const char SOUNDMODUL_en[]       PROGMEM = "Soundmodule";

static const char VOLUME_de[]           PROGMEM = "Lautstärke Sound";
static const char VOLUME_en[]           PROGMEM = "Volume Sound";
#endif

static const char ACCUTYPE_de[]         PROGMEM = "Akku Typ";
static const char ACCUTYPE_en[]         PROGMEM = "Accu type";

static const char ACCUMEASURE_de[]      PROGMEM = "Akku Messung";
static const char ACCUMEASURE_en[]      PROGMEM = "Accu measure";

//############################################################################

//-----------------------------
// Setup_MKConnection()
//-----------------------------

#define MKCONN_CONNECTION   1
#define MKCONN_BAUDRATE     2

#define           MKCONN_CONNECTION_de      SETUP_MKCONNECTION_de
#define           MKCONN_CONNECTION_en      SETUP_MKCONNECTION_en

static const char MKCONN_BAUDRATE_de[]      PROGMEM = "Baudrate Wi232/BT";
#define           MKCONN_BAUDRATE_en        MKCONN_BAUDRATE_de


//############################################################################

//-----------------------------
// Setup_WI232()
//-----------------------------
#define WI_INSTALLED    1
#define WI_TXRX         2
#define WI_GROUP        3
#define WI_MODE         4
#define WI_TIMEOUT      5
#define WI_MTU          6
#define WI_INIT         7
#define WI_PCCONFIG     8

static const char WI_INSTALLED_de[]     PROGMEM = "Modul eingebaut";
static const char WI_INSTALLED_en[]     PROGMEM = "module built in";

static const char WI_TXRX_de[]          PROGMEM = "TX/RX Kanal";
static const char WI_TXRX_en[]          PROGMEM = "TX/RX Channel";

static const char WI_GROUP_de[]         PROGMEM = "NetW. Gruppe";
static const char WI_GROUP_en[]         PROGMEM = "NetW. Group";

static const char WI_MODE_de[]          PROGMEM = "NetW. Mode";
#define           WI_MODE_en            WI_MODE_de

static const char WI_TIMEOUT_de[]       PROGMEM = "TX Timeout";
#define           WI_TIMEOUT_en         WI_TIMEOUT_de

static const char WI_MTU_de[]           PROGMEM = "TX MTU";
#define           WI_MTU_en             WI_MTU_de

static const char WI_INIT_de[]          PROGMEM = "Initialisieren";
static const char WI_INIT_en[]          PROGMEM = "initialize";

static const char WI_PCCONFIG_de[]      PROGMEM = "Konfig. mit PC";
static const char WI_PCCONFIG_en[]      PROGMEM = "config. with PC";


//############################################################################

//-----------------------------
// Setup_BTM222() (Bluetooth)
//-----------------------------
#define BT_INSTALLED  1
#define BT_NAME       2
#define BT_PIN        3
#define BT_INIT       4
#define BT_MAC        5
#define BT_REID       6
#define BT_PCCONFIG   7
#define BT_SHOWCONFIG   8

#define           BT_INSTALLED_de       WI_INSTALLED_de
#define           BT_INSTALLED_en       WI_INSTALLED_en

static const char BT_NAME_de[]          PROGMEM = "BT Name";
static const char BT_NAME_en[]          PROGMEM = "BT name";

static const char BT_PIN_de[]           PROGMEM = "BT Pin";
static const char BT_PIN_en[]           PROGMEM = "BT pin";

#define           BT_INIT_de            WI_INIT_de
#define           BT_INIT_en            WI_INIT_en

static const char BT_MAC_de[]           PROGMEM = "zeige BT MAC";
static const char BT_MAC_en[]           PROGMEM = "show BT MAC";

static const char BT_REID_de[]          PROGMEM = "RE-ID Notiz";
#define           BT_REID_en            BT_REID_de

#define           BT_PCCONFIG_de        WI_PCCONFIG_de
#define           BT_PCCONFIG_en        WI_PCCONFIG_en

static const char BT_SHOWCONFIG_de[]    PROGMEM = "zeige BT Konfig";
static const char BT_SHOWCONFIG_en[]    PROGMEM = "show BT config";

//############################################################################

//-----------------------------
// Setup_BLE() (Bluetooth 4 Low Energy)
//-----------------------------
#define BLE_INSTALLED  1

// Text ist in messages.c: MODULE_EXIST


//############################################################################

//-----------------------------
// Setup_GPSMouse()
//-----------------------------
#define GPS_DEVICES  1
#define GPS_SEARCH   2
#define GPS_TYPE     3
#define GPS_ACTIVE   4
#define GPS_SHOWDEV  5
#define GPS_DATA     6


static const char GPS_SEARCH_de[]       PROGMEM = "suche GPS-Maus";
static const char GPS_SEARCH_en[]       PROGMEM = "search GPS-mouse";

static const char GPS_DEVICES_de[]      PROGMEM = "Geräteliste";
static const char GPS_DEVICES_en[]      PROGMEM = "devicelist";

static const char GPS_SHOWDEV_de[]      PROGMEM = "aktuelle Maus";
static const char GPS_SHOWDEV_en[]      PROGMEM = "act. GPS-mouse";

static const char GPS_DATA_de[]         PROGMEM = "GPS-Maus Daten";
static const char GPS_DATA_en[]         PROGMEM = "GPS-mouse data";

static const char GPS_TYPE_de[]         PROGMEM = "GPS-Maus Typ";       // aktuell nicht verwendet
static const char GPS_TYPE_en[]         PROGMEM = "GPS-mouse typ";

static const char GPS_ACTIVE_de[]       PROGMEM = "GPS-Maus aktiv";     // aktuell nicht verwendet
static const char GPS_ACTIVE_en[]       PROGMEM = "GPS-mouse activ";


//############################################################################

//-----------------------------
// Setup_FollowMe()
//-----------------------------
#define FME_DISTANCE 1
#define FME_SPEED    2
#define FME_RADIUS   3
#define FME_AZIMUTH  4

static const char FME_DISTANCE_de[]     PROGMEM = "FollowMe Abstand";
static const char FME_DISTANCE_en[]     PROGMEM = "followMe distance";

static const char FME_AZIMUTH_de[]      PROGMEM = "FollowMe Winkel";
static const char FME_AZIMUTH_en[]      PROGMEM = "followMe angle";

static const char FME_SPEED_de[]        PROGMEM = "FollowMe Speed";
#define           FME_SPEED_en          FME_SPEED_de

static const char FME_RADIUS_de[]       PROGMEM = "Toleranz Radius";
static const char FME_RADIUS_en[]       PROGMEM = "tolerance radius";




//############################################################################

//-----------------------------
// Setup_OSD()
//-----------------------------
#define OSDS_SHOWCELLU      1
#define OSDS_LOWBAT         2
#define OSDS_RCERROR        3
#define OSDS_MKSETTING      4
#define OSDS_MAH            5
#define OSDS_DATASV2        6
#define OSDS_OUTFORMAT      7
#define OSDS_OUTPOLARITY    8
#define OSDS_FALLSPEED      9
#define OSDS_VARIOBEEP      10
#define OSDS_VOLTBAR        11


static const char OSDS_LOWBAT_de[]          PROGMEM = "Warn Unterspannung";
static const char OSDS_LOWBAT_en[]          PROGMEM = "Warn LowBat";

static const char OSDS_MAH_de[]             PROGMEM = "Warn mAh";
static const char OSDS_MAH_en[]             PROGMEM = "Warn mAh";

static const char OSDS_RCERROR_de[]         PROGMEM = "Warn RC-Fehler";
static const char OSDS_RCERROR_en[]         PROGMEM = "Warn RC-Error";

static const char OSDS_SHOWCELLU_de[]       PROGMEM = "zeige Zellspannung";
static const char OSDS_SHOWCELLU_en[]       PROGMEM = "show cell voltage";

static const char OSDS_MKSETTING_de[]       PROGMEM = "zeige MK Setting";
static const char OSDS_MKSETTING_en[]       PROGMEM = "show mk setting";

static const char OSDS_DATASV2_de[]         PROGMEM = "Navi Daten an SV2";
static const char OSDS_DATASV2_en[]         PROGMEM = "Navi data to SV2";


#ifdef USE_OSD_SCREEN_OLD
static const char OSDS_OUTFORMAT_de[]       PROGMEM = "OUT1/2 Format";
static const char OSDS_OUTFORMAT_en[]       PROGMEM = "OUT1/2 format";

static const char OSDS_FALLSPEED_de[]       PROGMEM = "Max. Sinkrate m/s";
static const char OSDS_FALLSPEED_en[]       PROGMEM = "max fallspeed m/s";

static const char OSDS_VARIOBEEP_de[]       PROGMEM = "Variometer Beep";
static const char OSDS_VARIOBEEP_en[]       PROGMEM = "Variometer beep";

static const char OSDS_OUTPOLARITY_de[]     PROGMEM = "OUT1/2 Polarität";
static const char OSDS_OUTPOLARITY_en[]     PROGMEM = "OUT1/2 polarity";

static const char OSDS_VOLTBAR_de[]         PROGMEM = "Volt Balken";
static const char OSDS_VOLTBAR_en[]         PROGMEM = "volt bargraph";
#endif



//############################################################################


//############################################################################
//# Allgemeines
//############################################################################

//--------------------------------------------------------------
//--------------------------------------------------------------
void Wait4KeyOK( void )
{
    set_beep( 60, 0xffff, BeepNormal);
    lcd_printp_at(19, 7, strGet(OK) , MNORMAL);
    while( !get_key_press(1 << KEY_ENTER) ) PKT_CtrlHook();   // PKT-Update usw...
    clear_key_all();
}


//--------------------------------------------------------------
//--------------------------------------------------------------
void Wait4KeyENDE( uint8_t beep )
{
    if( beep ) set_beep( 60, 0xffff, BeepNormal);
    lcd_printp_at(12, 7, strGet(ENDE) , MNORMAL);
    while( !get_key_press(1 << KEY_ESC) )
    {
        show_Lipo();
        PKT_CtrlHook();   // PKT-Update usw...
    }
    clear_key_all();
}


//############################################################################
//# BT-Funktionen (GPS-Maus)
//############################################################################

#ifdef USE_BLUETOOTH

//--------------------------------------------------------------
// BT_CheckBTM222()
//
// prueft ob das Bluetooth Modul im PKT installiert ist
//--------------------------------------------------------------
uint8_t BT_CheckBTM222( void )
{
    if( !Config.UseBT )
    {
        // PKT_Message_P( text, error, timeout, beep, clearscreen)
        PKT_Message_P( strGet(STR_NOBTM222), true, 1000, true, true);               // 1000 = max. 10 Sekunden anzeigen; "kein BTM222 vorh."
        return false;                                                               // -> kein BTM222 eingebaut
    }

    return true;
}



//--------------------------------------------------------------
// BT_SelectDevice()
//
// Auswahl eines BT-Device aus einer Liste von BT-Devices
//--------------------------------------------------------------
void BT_SelectDevice( void )
{
    uint8_t itemid;
    uint8_t event;
    uint8_t i;

    //-------------------------------
    // BTM222 Modul vorhanden?
    //-------------------------------
    if( !BT_CheckBTM222() ) return;


    //-------------------------------
    // BT Device-Suche durchgefuert?
    //-------------------------------
    if( bt_devicecount == 0 )
    {
        // PKT_Message_P( text, error, timeout, beep, clearscreen)
        PKT_Message_P( PSTR("Suche durchführen!"), true, 1000, true, true);         // 1000 = max. 10 Sekunden anzeigen; "kein BTM222 vorh."
        return;
    }


    //---------------
    // Create
    //---------------
    MenuCtrl_Create();
    MenuCtrl_SetTitle_P( strGet(STR_BT_DEVICES) );                                  // "BT Geräte"

    //---------------
    // Menuitems
    //---------------
    for( i = 0; i < bt_devicecount; i++ )
    {
        MenuCtrl_Push( i, MENU_ITEM, NOFUNC, device_list[i].DevName );

        if( strncmp(device_list[i].mac,Config.gps_UsedMac,14) == 0 )
            MenuCtrl_ItemMark( i, true );                                           // aktuelles BT-Device markieren
    }

    //---------------
    // Control
    //---------------
    event = MenuCtrl_Control( MENUCTRL_EVENT );

    if( event == MENUEVENT_ITEM )
    {
        itemid = MenuCtrl_GetItemId();                                              // welcher Menu-Punkt (ID)
        strncpy( Config.gps_UsedMac    , device_list[itemid].mac    , 14);
        strncpy( Config.gps_UsedDevName, device_list[itemid].DevName, 20);
    }

    //---------------
    // Destroy
    //---------------
    MenuCtrl_Destroy();
}



//--------------------------------------------------------------
// BT_SearchDevices()
//
// sucht BT-Devices
//--------------------------------------------------------------
void BT_SearchDevices( void )
{
    uint8_t wahl;

    char *title;

    //-------------------
    // 1. Frage: suchen?
    //-------------------
    if( Config.gps_UsedDevName[0] != 0 )        // ist eine BT GPS-Maus bereits vorhanden?
        title = Config.gps_UsedDevName;         //   dann zeige im Titel den Namen der GPS-Maus an
    else
        title = "BT Devices";

    set_beep( 50, 0xffff, BeepNormal);

  //wahl = PKT_AskX( asktype, text1, text2, text_progmem, headline, headline_progmem, title, title_progmem)
    wahl = PKT_AskX( ASK_END_START, strGet(STR_SEARCH_BT_ASK), strGet(STR_BT_SEARCHTIME), true, MenuCtrl_GetItemText(), true, title, false);    // "BT Geräte suchen?"


    //-------------------
    // 2. BT suchen
    //-------------------
    if( wahl )
    {
        if( BT_CheckBTM222() )
        {
            //PKT_Title_P( text, lShowLipo, clearscreen )
            PKT_Title_P( PSTR("BT Suche"), true, true );

            lcdx_printp_center( 2, strGet(STR_SEARCH_BT), MNORMAL, 0,1);                // "suche BT Geräte"

            //PKT_Gauge_Begin( 0 );                                                       // Gauge: 0 = Default fuer y verwenden

            set_BTOn();
            bt_downlink_init();

            lcd_printp_at(  11, 7, strGet(KEYCANCEL), MNORMAL);                         // Keyline: "Abbr." bzw "Cancel"
            bt_searchDevice();

            set_BTOff();

            //PKT_Gauge_End();                                                            // Gauge: Ende

            if( bt_devicecount==0 )
            {
              //PKT_Message_P( text, error, timeout, beep, clearscreen)
                PKT_Message_P( strGet(STR_NO_BT_FOUND), true, 2000, true, true);
            }
            else
            {
                set_beep( 50, 0xffff, BeepNormal);
                BT_SelectDevice();
            }
        }
    }
}


#endif   // end: #ifdef USE_BLUETOOTH




//############################################################################
//# Edit-Funktionen
//############################################################################


//--------------------------------------------------------------
// Ausgabe von Werten fuer Edit_generic()
//--------------------------------------------------------------
void Edit_generic_printout( int16_t Value, int16_t min, int16_t max, uint8_t what, int8_t yoffs)
{
    const char *pStr = 0;   // PGM
    const char *pstr = 0;   // RAM
    //uint8_t x = 0;
    //uint8_t y = 3;


    switch( what )
    {
      case Show_uint3:          pstr = buffered_sprintf_P( PSTR("%3d"), Value );
                                break;


      case Show_uint5:          pstr = buffered_sprintf_P( PSTR("%5d"), Value );
                                break;


      case Show_uint10th:       pstr = buffered_sprintf_P( PSTR("%2.1d"), Value );
                                break;


      case MK_Connection:       switch( Value )
                                {
                                        case    0: pStr = PSTR("Wi.232");     break;
                                        case    1: pStr = strGet(KABEL);      break;
                                }

                                if( (Value == 0) && (Config.UseWi == false) )
                                {
                                    lcd_rect_round( 0, 37, 127, 21-6, 1, R2);                           // Rahmen
                                    lcdx_printp_center( 6, strGet(STR_WI232_ACTIVATE), MNORMAL, 0,-7);  // "aktiviere Wi.232!"
                                }
                                else
                                {
                                    lcd_frect( 0, 37, 127, 21-6, 0);                                    // Hilfebereich loeschen
                                }
                                break;


      case GPSMOUSE:            switch( Value )
                                {
                                        case GPS_Bluetoothmouse1: pStr = PSTR("BT-Mouse");      break;
                                        case GPS_Mikrokopter:     pStr = PSTR("Mikrokopter");   break;
                                        default:                  pStr = PSTR("unknown");
                                }
                                break;


      case Wi_Netmode:          switch( Value )
                                {
                                        case    false: pStr = strGet(SLAVE);    break;
                                        case    true : pStr = strGet(NORMAL);   break;
                                }
                                break;



      case OnOff:               switch( Value )
                                {
                                        case    0: pStr = strGet(OFF);      break;
                                        case    1: pStr = strGet(ON);       break;
                                }
                                break;


      case YesNo:               switch( Value )
                                {
                                        case    0: pStr = strGet(NOO);      break;
                                        case    1: pStr = strGet(YES);      break;
                                }
                                break;


      case WlanMode:            switch( Value )
                                {
                                        case    0: pStr = strGet(OFF);      break;
                                        case    1: pStr = PSTR("AP-Mode");  break;
                                        case    2: pStr = PSTR("AdHoc");    break;
                                }
                                break;



      case NormRev:             switch( Value )                                             // wird noch von stick/stick_setup.c verwendet
                                {
                                    case    0 : pStr = strGet(NORMAL);      break;
                                    case    1 : pStr = strGet(REVERSE);     break;
                                }
                                break;


      case Kontrast:            if( Value >= max )
                                {
                                    Value = max;
                                    set_beep( 200, 0x0080, BeepNormal);
                                }

                                if( Value == min )
                                {
                                    Value = min;
                                    set_beep( 200, 0x0080, BeepNormal);
                                }

                                lcd_set_contrast( Value );

                                pstr = buffered_sprintf_P( PSTR("%3d"), Value );
                                break;


        case Baudrate:          pstr = buffered_sprintf_P( PSTR("%ld"), Baud_to_uint32(Value) );
                                break;


        case Language:          switch( Value )
                                {
                                    case    0: pStr = strGet(DEUTSCH);      break;
                                    case    1: pStr = strGet(ENGLISCH);     break;
                                }
                                break;


        case Sticktype:         switch( Value )
{
                                    case    false: pStr = strGet(POTI);     break;
                                    case    true : pStr = strGet(TASTER);   break;
                                }
                                break;


        /*
        case WlanSecurity:      // Anmerkung 02.04.2014 OG: wird aktuell nicht benoetigt weil anders geloest
                                switch (Value)
                                {
                                    case    0x0 :   lcd_printp_at(15, 2, PSTR("Adhoc"), 0);
                                            break;
                                    case    0x1 :   lcd_printp_at(15, 2, PSTR("WPA  "), 0);
                                            break;
                                }
                                break;
        */


        case PKT_Akku:          switch( Value )
                                {
                                    case true :  pStr = PSTR("Lipo");       break;
                                    case false:  pStr = PSTR("LiIon");      break;
                                }
                                break;
    } // end: switch( what )



  //lcdx_printf_at_P( uint8_t x, uint8_t y, uint8_t mode, int8_t xoffs, int8_t yoffs, const char *format, ... )

    if( pStr )  lcdx_printf_at_P( 0, 3, MNORMAL, 0,yoffs, PSTR("> %16S"), pStr );   // PGM
    if( pstr )  lcdx_printf_at_P( 0, 3, MNORMAL, 0,yoffs, PSTR("> %16s"), pstr );   // RAM
}




//--------------------------------------------------------------
// int16_t Edit_generic( Value, min, max, what, Addfactor, strHelp1, strHelp2)
//
// generische Funktion zum aendern von Setup-Werten
//
// PARAMETER:
//   Value: Ausgangswert der zu aendern ist
//   min  : minimaler Wert
//   max  : maximaler Wert
//   what : Typ des Wertes, abhaengig davon wird der Wert dargestellt, ENUM dafuer in setup.h
//   Addfactor : Sprungwert der beim erhöhen und erniedrigen addiert wird
//   strHelp1 : Hilefetext 1 (PGM)
//   strHelp2 : Hilefetext 2 (PGM)
//S
// RUECKGABE:
//   int16_t Return    : Ergebnis der Veraenderung des Wertes
//--------------------------------------------------------------
int16_t Edit_generic( int16_t Value, int16_t min, int16_t max, uint8_t what, uint8_t Addfactor, const char *strHelp1, const char *strHelp2 )
{
    uint8_t redraw   = true;
    uint8_t noCancel = false;
    int8_t  yoffs    = 0;     // yoffs fuer das Edit-Label
    int8_t  yoffsV   = 4;     // yoffs fuer den Eingabebereich
    const char *pStr;

    Pre = Value;

    do
    {
        //------------------------
        // Screen neu zeichnen
        //------------------------
        if( redraw )
        {
            PKT_TitleFromMenuItem( true );                              // Titel mit PKT-LiPo Anzeige und clearcsreen


            //------------------------
            // Platz reservieren fuer
            // spezielle Typen
            //------------------------
            if( what == MK_Connection )
            {
                yoffs  = -2;                                            // yoffs fuer das Edit-Label
                yoffsV =  0;                                            // yoffs fuer den Eingabebereich
            }

            //------------------------
            // 1 zeiliger Hilfstext
            //------------------------
            if( strHelp1 != NULL && strHelp2 == NULL )
            {
                lcd_rect_round( 0, 37, 127, 21-6, 1, R2);               // Rahmen
                lcdx_printp_center( 6, strHelp1, MNORMAL, 0,-7);        // Hilfe-Text 1
                yoffs  = -2;                                            // yoffs fuer das Edit-Label
                yoffsV =  0;                                            // yoffs fuer den Eingabebereich
            }

            //------------------------
            // 2 zeiliger Hilfstext
            //------------------------
            if( strHelp2 != NULL )
            {
                lcd_rect_round( 0, 32, 127, 21, 1, R2);                 // Rahmen
                lcdx_printp_center( 5, strHelp1, MNORMAL, 0,-5);        // Hilfe-Text 1
                lcdx_printp_center( 6, strHelp2, MNORMAL, 0,-5);        // Hilfe-Text 2
                yoffs  = -4;                                            // yoffs fuer das Edit-Label
                yoffsV = -2;                                            // yoffs fuer den Eingabebereich
            }

            //------------------------
            // Label
            //------------------------
            pStr = PSTR("???");
            if( MenuCtrl_GetMenuIndex() >= 0 )  pStr = MenuCtrl_GetItemText();              // das Label wird vom Menueeintrag uebernommen (Menuetext muss im PGM sein!)
            else
            {
                if( what == Language )                                                      // Ausnahme: wird ggf. beim Start vom PKT von HAL_HW3_9.c aufgerufen
                {
                    pStr = strGetLanguage( LANGUAGE_de, LANGUAGE_en);
                    noCancel = true;
                }
            }
            lcdx_printf_at_P( 0, 2, MNORMAL, 0,yoffs, PSTR("%S:"), pStr );                  // Ausgabe des Labels


            lcd_printp_at( 0, 7, strGet(KEYLINE5) , MNORMAL);                               // Keyline:  <-   ->   Abbr.   OK
            if( noCancel ) lcd_printp_at(11, 7, PSTR("      "), MNORMAL);                   // Keyline: "Abbr." loeschen wenn noCancel

            Edit_generic_printout( Value, min, max, what, yoffsV);                          // aktuellen Eingabewert anzeigen
            redraw = false;
        }


        //------------------------
        // PKT CtrlHook
        //------------------------
        if( PKT_CtrlHook() )
        {
            redraw = true;
        }


        //------------------------
        // Key: PLUS
        //------------------------
        if( (get_key_press(1 << KEY_PLUS) || get_key_long_rpt_sp((1 << KEY_PLUS), 2)) )
        {
            if( Value <= (max-Addfactor) )      Value = Value + Addfactor;
            else                                Value = min;

            Edit_generic_printout( Value, min, max, what, yoffsV);
        }


        //------------------------
        // Key: MINUS
        //------------------------
        if( (get_key_press(1 << KEY_MINUS) || get_key_long_rpt_sp((1 << KEY_MINUS), 2)) )
        {
            if( Value >= (min + Addfactor) )    Value = Value - Addfactor;
            else                                Value = max;

            Edit_generic_printout( Value, min, max, what, yoffsV);
        }


        //------------------------
        // Key: ENTER
        //------------------------
        if( get_key_press(1 << KEY_ENTER) )
        {
            return Value;
        }


        //------------------------
        // Key: ESC
        //------------------------
        if( !noCancel && get_key_press(1 << KEY_ESC) )      // Ende ohne speichern
        {
            break;
        }
    }
    while( true );

    get_key_press(KEY_ALL);
    return Pre;
}



//--------------------------------------------------------------
// bei HW 3.9x geht das nicht mehr wegen dem Platinenlayout
// bei HW 3.9m geht es theoretisch noch - aber durch einen Bug scheinbar
//             nicht mehr. Kann nur von jemanden mit HW 3.9m repariert werden.
// ALSO -> raus und Speicher sparen
//--------------------------------------------------------------
/*
uint8_t Edit_DisplayHelligkeit(uint8_t Value, uint8_t min, uint8_t max)
{
    float ValCorr = 2.55;  // (Value * ValCorr) maximal 255
    Pre = Value;
    OCR2A = Value * ValCorr;

    lcd_cls();
//  lcd_printp_at (0, 2, Text, 0);
    lcdx_printf_at_P( 0, 2, MNORMAL, 0,0, PSTR("%S:"), MenuCtrl_GetItemText() );    // Menuetext muss im PGM sein! (aktuell keine Unterscheidung RAM/PGM)
    write_ndigit_number_u (16, 2, Value, 3, 0,0);
    lcd_printp_at (17, 2, PSTR("%"), 0);
//  lcd_printp_at (0, 7, PSTR(KEY_LINE_2), 0);
        lcd_printp_at(0, 7, strGet(KEYLINE2), 0);

    do
    {
        write_ndigit_number_u (16, 2,Value, 3, 0,0);
        lcd_frect ((8*0), (8*4), (Value * (16*8) / 100), 6, 1);

        if ((get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 3)) && (Value < max))
        {
            Value++;

            if (Value >= max)
            {
                Value = max;
                set_beep ( 200, 0x0080, BeepNormal);
            }
            else
                OCR2A = Value * ValCorr;

        }

        if ((get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 3)) && (Value > min))
        {
            lcd_frect (((Value - 1) * (16*8) / 100), (8*4), (16*8), 6, 0);
            Value--;

            if (Value == min)
            {
                Value = min;
                set_beep ( 200, 0x0080, BeepNormal);
            }
            else
                OCR2A = Value * ValCorr;

        }

        if (get_key_press (1 << KEY_ENTER))
        {
            OCR2A = Value * ValCorr;
            Config.LCD_Helligkeit = Value;
//          WriteParameter();
            edit = 0;
            return Value;
        }
    }

    while (!get_key_press (1 << KEY_ESC));
    {
        get_key_press(KEY_ALL);
        OCR2A = Pre * ValCorr;
        Config.LCD_Helligkeit = Pre;
//      WriteParameter();
        return Pre;
    }
}
*/




//--------------------------------------------------------------
//--------------------------------------------------------------
uint8_t Edit_String( const char *data, const uint8_t length, uint8_t type)
{
    uint8_t redraw = true;
    uint8_t x      = 1;
    uint8_t I      = 0;
    uint8_t lOk    = false;
    uint8_t i;


    for( i = 0; i < length; i++)
    {
        EditString[i] = data[i];
    }


    do
    {
        //-------------------------
        // Screen zeichnen
        //-------------------------
        if( redraw )
        {
            PKT_TitleFromMenuItem( true );                                              // true = showlipo (mit clearscreen)

            for( i = 0; i < length; i++)
            {
                lcd_putc     ( (i*2)+1, 3, EditString[i], MNORMAL);
                lcd_printp_at( (i*2)+2, 3, PSTR(" ")    , MNORMAL);
            }

            lcd_rect( (x*6)-3, (8*3)-2, 10, 10, 1);
            lcd_printp_at(13, 6, PSTR("C"), MNORMAL);
            lcd_printp_at( 0, 7, PSTR(" \x17     \x16     \x19     OK"), MNORMAL);      // Keyline

            redraw = false;
        }


        //-------------------------
        // PKT-LiPo anzeigen
        //-------------------------
        show_Lipo();


        //-------------------------
        // PKT Update-Anforderung?
        //-------------------------
        if( PKT_CtrlHook() )
        {
            redraw = true;
        }


        if( (type == EDIT_BT_NAME) || (type == EDIT_SSID) || (type == EDIT_WL_PASSWORD))  // Name
        {
                if ((get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 2)) && EditString[I] < 'z')
                {
                        EditString[I]++;

                        if (EditString[I] >= 0x00 && EditString[I] < ' ')
                                EditString[I] = ' ';

                        if (EditString[I] > ' ' && EditString[I] < '0')
                                EditString[I] = '0';

                        if (EditString[I] > '9' && EditString[I] < 'A')
                                EditString[I] = 'A';

                        if (EditString[I] > 'Z' && EditString[I] < 'a')
                                EditString[I] = 'a';

                        lcd_putc (x, 3, EditString[I], 0);
                        edit = 1;
                }

                if ((get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 2)) && EditString[I] > ' ')
                {
                        EditString[I]--;

                        if (EditString[I] < 'a' && EditString[I] > 'Z')
                                EditString[I] = 'Z';

                        if (EditString[I] < 'A' && EditString[I] > '9')
                                EditString[I] = '9';

                        if (EditString[I] < '0' && EditString[I] > ' ')
                                EditString[I] = ' ';

                        lcd_putc (x, 3, EditString[I], 0);
                        edit = 1;
                }
        }
        else if( type == EDIT_BT_PIN )  // PIN
        {
            if ((get_key_press (1 << KEY_PLUS) || get_key_long_rpt_sp ((1 << KEY_PLUS), 1)) && (EditString[I] < '9'))
            {
                EditString[I]++;

                if (EditString[I] >= 0x00 && EditString[I] < ' ')
                        EditString[I] = ' ';

                if (EditString[I] > ' ' && EditString[I] < '0')
                        EditString[I] = '0';

                lcd_putc (x, 3, EditString[I], 0);
                edit = 1;
            }

            if ((get_key_press (1 << KEY_MINUS) || get_key_long_rpt_sp ((1 << KEY_MINUS), 1)) && (EditString[I] > '0'))
            {
                EditString[I]--;

                if (EditString[I] < 'A' && EditString[I] > '9')
                        EditString[I] = '9';

                lcd_putc (x, 3, EditString[I], 0);
                edit = 1;
            }
        }

        if( get_key_long (1 << KEY_ESC))
        {
            if( type == EDIT_BT_NAME|| type == EDIT_SSID || type == EDIT_WL_PASSWORD)   EditString[I] = ' ';  // Zeichen loeschen
            if( type == EDIT_BT_PIN)    EditString[I] = '0';  // Zeichen setzen
            lcd_putc (x, 3, EditString[I], 0);
            edit = 1;
        }

        if( get_key_short (1 << KEY_ESC))
        {
            if( type == EDIT_BT_NAME )  length_tmp = bt_name_length;
            if( type == EDIT_BT_PIN  )  length_tmp = bt_pin_length;
            if (type == EDIT_SSID )     length_tmp = wlan_ssid_length;
            if (type == EDIT_WL_PASSWORD )     length_tmp = wlan_password_length;

            if ((x / 2) + 2 > length_tmp)
            {
                lcd_rect ((x*6)-3, (8*3)-2, 10, 10, 0);
                x = 1;
                lcd_rect ((x*6)-3, (8*3)-2, 10, 10, 1);
                I = 0;
            }
            else
            {
                lcd_rect ((x*6)-3, (8*3)-2, 10, 10, 0);
                x++;
                x++;
                lcd_rect ((x*6)-3, (8*3)-2, 10, 10, 1);
                I++;  //Zeiger auf Zeichen
            }
        }

        if( get_key_press (1 << KEY_ENTER) )
        {
            lOk = true;
            if( type == EDIT_BT_NAME && EditString[0] == ' ' )          // BT-Name: 1. Zeichen darf nicht Space sein
            {
                lcdx_printp_at( 0, 5, PSTR(" FEHLER! 1. Zeichen! "), MNORMAL, 0,-4);
                set_beep ( 300, 0xf00f, BeepNormal);
                _delay_ms(2000);
                lcd_frect( 0, 5*8-4, 127, 7, 0);            // loesche Fehlertext

                lcd_rect ((x*6)-3, (8*3)-2, 10, 10, 0);     // setze Cursor auf Position 1
                x = 1;
                lcd_rect ((x*6)-3, (8*3)-2, 10, 10, 1);
                I = 0;

                get_key_press(KEY_ALL);
                lOk = false;
            }
        }

    } while( !lOk );

    return 1;
}



//--------------------------------------------------------------
// min,max sind in Setup_PKTGeneric() festgelegt
//--------------------------------------------------------------
void Edit_LipoOffset( void )
{
    uint8_t  redraw = true;
    uint8_t  inc    = 50;           // in diesen Schritten hoch/runter zaehlen
    uint16_t min    = 0;            // min. Offset Wert
    uint16_t max    = 15000;        // max. Offset Wert
    uint16_t oldValue;

    if( Config.Lipo_UOffset % inc )                                     // ggf. wurde frueher ein anderer Wert fuer das Increment 'inc' verwendet
        Config.Lipo_UOffset = (uint16_t)(Config.Lipo_UOffset/inc)*inc;  // hier wird der Wert auf das aktuelle 'inc' angepasst

    oldValue = Config.Lipo_UOffset;

    do
    {
        //-------------------------
        // Screen zeichnen
        //-------------------------
        if( redraw )
        {
            PKT_TitleFromMenuItem( true );                                                  // true = showlipo (mit clearscreen)

            lcdx_printf_at_P( 0, 2, MNORMAL, 0,-4, PSTR("%S:"), MenuCtrl_GetItemText() );   // Menuetext muss im PGM sein! (aktuell keine Unterscheidung RAM/PGM)

            lcd_rect_round( 0, 32, 127, 21, 1, R2);                                         // Rahmen
            lcdx_printp_at( 1, 5, strGet(STR_HELP_LIPOOFFSET1), MNORMAL, 0,-5);             // Hilfe-Text 1
            lcdx_printp_at( 1, 6, strGet(STR_HELP_LIPOOFFSET2), MNORMAL, 0,-5);             // Hilfe-Text 2
            lcd_printp_at(  0, 7, strGet(KEYLINE5), MNORMAL);                               // Keyline
            redraw = false;
        }


        //-------------------------
        // Wert ausgeben
        //-------------------------
        lcdx_printf_at_P( 0, 3, MNORMAL, 0,-2, PSTR("> %5d      => %1.2dv"), Config.Lipo_UOffset, volt_avg );
        show_Lipo();


        //-------------------------
        // PKT Update-Anforderung?
        //-------------------------
        if( PKT_CtrlHook() )
        {
            redraw = true;
        }


        //-------------------------
        // Tasten
        //-------------------------
        if( (get_key_press(1 << KEY_PLUS) || get_key_long_rpt_sp((1 << KEY_PLUS),2)) && (Config.Lipo_UOffset < max) )
        {
            Config.Lipo_UOffset = Config.Lipo_UOffset + inc;
        }

        if( (get_key_press(1 << KEY_MINUS) || get_key_long_rpt_sp((1 << KEY_MINUS),2)) && (Config.Lipo_UOffset > min) )
        {
            Config.Lipo_UOffset = Config.Lipo_UOffset - inc;
        }

        if( get_key_press(1 << KEY_ENTER) )
        {
            clear_key_all();
            return;
        }

    } while( !get_key_press(1 << KEY_ESC) );

    clear_key_all();

    Config.Lipo_UOffset = oldValue;     // Abbruch, orginalen Wert wieder herstellen
    return;
}



//--------------------------------------------------------------
//--------------------------------------------------------------
#ifdef USE_OSD_SCREEN_OLD
uint8_t Edit_LED_Form (uint8_t Value,  uint8_t min, uint8_t max )
{
    Pre = Value;
    lcd_cls();

    lcd_printp_at(0, 2, strGetOSDOLD(OSD_LED_Form), MNORMAL);

    switch (Value)
    {
        case    0x1:
            lcd_circle  (14 * 6 + 5, 2 * 8 + 3, 3, 1);   // kreis

            lcd_fcircle (16 * 6 + 5, 2 * 8 + 3, 3, 0);   // l�schen
            lcd_circle  (16 * 6 + 5, 2 * 8 + 3, 3, 1);   // kreis
            lcd_fcircle (16 * 6 + 5, 2 * 8 + 3, 1, 1);   // plus
            break;
        case    0x3 :
            lcd_circle  (14 * 6 + 5, 2 * 8 + 3, 3, 1);   // kreis

            lcd_fcircle (16 * 6 + 5, 2 * 8 + 3, 3, 1);   // schwarz
            break;
        break;
    }

        lcd_printp_at(0, 7, strGet(KEYLINE2), 0);

    do
    {
        if ((get_key_press (1 << KEY_PLUS)) && (Value == 1))
        {
            Value = 3;
            lcd_circle  (14 * 6 + 5, 2 * 8 + 3, 3, 1);   // kreis

            lcd_fcircle (16 * 6 + 5, 2 * 8 + 3, 3, 1);   // schwarz
        }

        if ((get_key_press (1 << KEY_MINUS)) && (Value == 3))
        {
            Value = 1;
            lcd_circle  (14 * 6 + 5, 2 * 8 + 3, 3, 1);   // kreis

            lcd_fcircle (16 * 6 + 5, 2 * 8 + 3, 3, 0);   // l�schen
            lcd_circle  (16 * 6 + 5, 2 * 8 + 3, 3, 1);   // kreis
            lcd_fcircle (16 * 6 + 5, 2 * 8 + 3, 1, 1);   // plus
        }

        if (get_key_press (1 << KEY_ENTER))
        {
            edit = 1;
            Config.OSD_LEDform = Value;
//          WriteParameter();
            edit = 0;
            return Value;
        }
    }

    while (!get_key_press (1 << KEY_ESC));
    {
        get_key_press(KEY_ALL);
        edit = 0;
        Config.OSD_LEDform = Pre;
        return Pre;
    }
}
#endif // USE_OSD_SCREEN_OLD



//--------------------------------------------------------------
// Show_MAC( progmem, headline, mac)
//--------------------------------------------------------------
void Show_MAC( uint8_t progmem, const char *headline, const char *mac )
{
    uint8_t i;
    uint8_t z;

    lcd_cls();
    PKT_TitleFromMenuItem( true );

    if( progmem )
        lcdx_printp_center( 2, headline, MNORMAL,  0,2);
    else
        lcdx_print_center( 2, (uint8_t *)headline, MNORMAL,  0,2);

    z = 0;
    for( i = 0; i < 13; i++)
    {
        lcdx_putc( z+2, 5, mac[i], MNORMAL, 0,-1);
        if( (i%2==1) && (i<11) )
        {
            z++;
            lcdx_printp_at( z+2, 5, PSTR(":"), MNORMAL, 0,-1);
        }
        z++;
    }
    lcd_rect_round( 0, 34, 127, 16, 1, R2);               // Rahmen
    Wait4KeyENDE( false );
}



//--------------------------------------------------------------
// Setup_OSD()
//--------------------------------------------------------------
void Setup_OSD( void )
{
    uint8_t itemid;

    //---------------
    // Create
    //---------------
    MenuCtrl_Create();
    MenuCtrl_SetTitleFromParentItem();      // "OSD Anzeige"

    //---------------
    // Menuitems
    //---------------
    MenuCtrl_PushML2_P( OSDS_LOWBAT       , MENU_ITEM, NOFUNC , OSDS_LOWBAT_de      , OSDS_LOWBAT_en      );
  //MenuCtrl_PushML2_P( OSDS_MAH          , MENU_ITEM, NOFUNC , OSDS_MAH_de         , OSDS_MAH_en         );
    MenuCtrl_PushML2_P( OSDS_RCERROR      , MENU_ITEM, NOFUNC , OSDS_RCERROR_de     , OSDS_RCERROR_en     );

    MenuCtrl_PushSeparator();       // MENUE TRENNLINIE

    MenuCtrl_PushML2_P( OSDS_SHOWCELLU    , MENU_ITEM, NOFUNC , OSDS_SHOWCELLU_de   , OSDS_SHOWCELLU_en   );
    MenuCtrl_PushML2_P( OSDS_MKSETTING    , MENU_ITEM, NOFUNC , OSDS_MKSETTING_de   , OSDS_MKSETTING_en   );

    #ifdef USE_OSD_SCREEN_OLD
    MenuCtrl_PushSeparator();   // MENUE TRENNLINIE
    MenuCtrl_PushML2_P( OSDS_FALLSPEED    , MENU_ITEM, NOFUNC , OSDS_FALLSPEED_de   , OSDS_FALLSPEED_en   );
    MenuCtrl_PushML2_P( OSDS_VARIOBEEP    , MENU_ITEM, NOFUNC , OSDS_VARIOBEEP_de   , OSDS_VARIOBEEP_en   );
    MenuCtrl_PushML2_P( OSDS_VOLTBAR      , MENU_ITEM, NOFUNC , OSDS_VOLTBAR_de     , OSDS_VOLTBAR_en     );
    MenuCtrl_PushML2_P( OSDS_OUTFORMAT    , MENU_ITEM, NOFUNC , OSDS_OUTFORMAT_de   , OSDS_OUTFORMAT_en   );
    MenuCtrl_PushML2_P( OSDS_OUTPOLARITY  , MENU_ITEM, NOFUNC , OSDS_OUTPOLARITY_de , OSDS_OUTPOLARITY_en );
    #endif

    MenuCtrl_PushSeparator();       // MENUE TRENNLINIE

    MenuCtrl_PushML2_P( OSDS_DATASV2      , MENU_ITEM, NOFUNC , OSDS_DATASV2_de     , OSDS_DATASV2_en     );


    //---------------
    // Control
    //---------------
    while( true )
    {
        MenuCtrl_Control( MENUCTRL_EVENT );

        if( MenuCtrl_GetKey() == KEY_ESC )  break;      // ENDE

        itemid = MenuCtrl_GetItemId();                  // welcher Menu-Punkt (ID)

        if( itemid == OSDS_LOWBAT       ) { Config.MK_LowBat         = Edit_generic( Config.MK_LowBat        ,32,255,   Show_uint10th,1 ,strGet(STR_HELP_LOWBAT1),strGet(STR_HELP_LOWBAT2));  }
        if( itemid == OSDS_SHOWCELLU    ) { Config.OSD_ShowCellU     = Edit_generic( Config.OSD_ShowCellU    , 0,  1,   YesNo,1         ,NULL,NULL);  }
        if( itemid == OSDS_MAH          ) { Config.OSD_mAh_Warning   = Edit_generic( Config.OSD_mAh_Warning  , 0,30000, Show_uint5,100  ,NULL,NULL);  }
        if( itemid == OSDS_RCERROR      ) { Config.OSD_RCErrorbeep   = Edit_generic( Config.OSD_RCErrorbeep  , 0,  1,   OnOff,1         ,NULL,NULL);  }
        if( itemid == OSDS_MKSETTING    ) { Config.OSD_ShowMKSetting = Edit_generic( Config.OSD_ShowMKSetting, 0,  1,   YesNo,1         ,NULL,NULL);  }
        if( itemid == OSDS_DATASV2      ) { Config.OSD_SendOSD       = Edit_generic( Config.OSD_SendOSD      , 0,  1,   YesNo,1         ,NULL,NULL);  }

        #ifdef USE_OSD_SCREEN_OLD
        if( itemid == OSDS_FALLSPEED    ) { Config.OSD_Fallspeed     = Edit_generic( Config.OSD_Fallspeed    , 0,247,   Show_uint10th,1 ,NULL,NULL);  }
        if( itemid == OSDS_VARIOBEEP    ) { Config.OSD_VarioBeep     = Edit_generic( Config.OSD_VarioBeep    , 0,  1,   YesNo,1         ,NULL,NULL);  }
        if( itemid == OSDS_OUTFORMAT    ) { Config.OSD_LEDform       = Edit_LED_Form(Config.OSD_LEDform      , 1,  3 );                               }
        if( itemid == OSDS_OUTPOLARITY  ) { Config.OSD_InvertOut     = Edit_generic( Config.OSD_InvertOut    , 0,  1,   YesNo,1         ,NULL,NULL);  }
        if( itemid == OSDS_VOLTBAR      ) { Config.OSD_LipoBar       = Edit_generic( Config.OSD_LipoBar      , 0,  1,   YesNo,1         ,NULL,NULL);  }
        #endif
    }

    //---------------
    // Destroy
    //---------------
    MenuCtrl_Destroy();
}



//--------------------------------------------------------------
//--------------------------------------------------------------
void Mark_OSDScreen( uint8_t osdscreenid )
{
    MenuCtrl_ItemMarkR( osdscreenid, (Config.OSD_UseScreen & (1 << osdscreenid)) != 0 );
}


//--------------------------------------------------------------
//--------------------------------------------------------------
void Edit_OSDScreen( uint8_t osdscreenid )
{
    if( (Config.OSD_UseScreen & (1 << osdscreenid)) == 0 )
        Config.OSD_UseScreen = (Config.OSD_UseScreen | (1 << osdscreenid));
    else
        Config.OSD_UseScreen = (Config.OSD_UseScreen ^ (1 << osdscreenid));

    Mark_OSDScreen( osdscreenid );
}



//--------------------------------------------------------------
// Setup_OSDScreens()
//--------------------------------------------------------------
void Setup_OSDScreens( void )
{
    uint8_t itemid;

    //---------------
    // Create
    //---------------
    MenuCtrl_Create();
    MenuCtrl_SetTitleFromParentItem();      // "OSD Screens"

    //---------------
    // Menuitems
    //---------------
    #ifdef USE_OSD_SCREEN_NAVIGATION
    MenuCtrl_Push_P( OSDSCREEN_NAVIGATION, MENU_ITEM, NOFUNC, strGet(STR_OSDSCREEN_NAVIGATION) );   Mark_OSDScreen( OSDSCREEN_NAVIGATION );
    #endif

    #ifdef USE_OSD_SCREEN_WAYPOINTS
    MenuCtrl_Push_P( OSDSCREEN_WAYPOINTS , MENU_ITEM, NOFUNC, strGet(STR_OSDSCREEN_WAYPOINTS) );    Mark_OSDScreen( OSDSCREEN_WAYPOINTS );
    #endif

    #ifdef USE_OSD_SCREEN_ELECTRIC
    MenuCtrl_Push_P( OSDSCREEN_ELECTRIC  , MENU_ITEM, NOFUNC, strGet(STR_OSDSCREEN_ELECTRIC) );     Mark_OSDScreen( OSDSCREEN_ELECTRIC );
    #endif

    #ifdef USE_OSD_SCREEN_ELECTRIC_N
    MenuCtrl_Push_P( OSDSCREEN_ELECTRIC  , MENU_ITEM, NOFUNC, strGet(STR_OSDSCREEN_ELECTRIC) );     Mark_OSDScreen( OSDSCREEN_ELECTRIC );
    #endif

    #ifdef USE_OSD_SCREEN_MKSTATUS
    MenuCtrl_Push_P( OSDSCREEN_MKSTATUS  , MENU_ITEM, NOFUNC, strGet(STR_OSDSCREEN_MKSTATUS) );     Mark_OSDScreen( OSDSCREEN_MKSTATUS );
    #endif

    #ifdef USE_OSD_SCREEN_USERGPS
    MenuCtrl_Push_P( OSDSCREEN_USERGPS   , MENU_ITEM, NOFUNC, strGet(STR_OSDSCREEN_USERGPS) );      Mark_OSDScreen( OSDSCREEN_USERGPS );
    #endif

    #ifdef USE_OSD_SCREEN_3DLAGE
    MenuCtrl_Push_P( OSDSCREEN_3DLAGE    , MENU_ITEM, NOFUNC, strGet(STR_OSDSCREEN_3DLAGE) );       Mark_OSDScreen( OSDSCREEN_3DLAGE );
    #endif

    #ifdef USE_OSD_SCREEN_STATISTIC
    MenuCtrl_Push_P( OSDSCREEN_STATISTICS, MENU_ITEM, NOFUNC, strGet(STR_OSDSCREEN_STATISTIC) );    Mark_OSDScreen( OSDSCREEN_STATISTICS );
    #endif

    #ifdef USE_OSD_SCREEN_OLD
    MenuCtrl_Push_P( OSDSCREEN_OSD0, MENU_ITEM, NOFUNC, strGet(STR_OSDSCREEN_OSD0) );               Mark_OSDScreen( OSDSCREEN_OSD0 );
    MenuCtrl_Push_P( OSDSCREEN_OSD1, MENU_ITEM, NOFUNC, strGet(STR_OSDSCREEN_OSD1) );               Mark_OSDScreen( OSDSCREEN_OSD1 );
    MenuCtrl_Push_P( OSDSCREEN_OSD2, MENU_ITEM, NOFUNC, strGet(STR_OSDSCREEN_OSD2) );               Mark_OSDScreen( OSDSCREEN_OSD2 );
    #endif


    //---------------
    // Control
    //---------------
    while( true )
    {
        MenuCtrl_Control( MENUCTRL_EVENT );

        if( MenuCtrl_GetKey() == KEY_ESC )  break;      // ENDE

        itemid = MenuCtrl_GetItemId();                  // welcher Menu-Punkt (ID)

        Edit_OSDScreen( itemid );
    }

    //---------------
    // Destroy
    //---------------
    MenuCtrl_Destroy();
}


//--------------------------------------------------------------
// Setup_FollowMe()
//--------------------------------------------------------------
#ifdef USE_FOLLOWME
void Setup_FollowMe( void )
{
    uint8_t itemid;

    //---------------
    // Create
    //---------------
    MenuCtrl_Create();
    MenuCtrl_SetTitle_P( PSTR("FollowMe Setup") );

    //---------------
    // Menuitems
    //---------------
    //--------------------------------------------------------------------------------------------------------
    // 25.06.2014 OG - auskommentiert weil nicht verwendet. FollowMe wird aktuell ueber die Daten-Updaterate
    // der BT GPS-Maus getriggert!
    //--------------------------------------------------------------------------------------------------------
    //MenuCtrl_PushML2_P( FME_REFRESH , MENU_ITEM, NOFUNC , FME_REFRESH_de , FME_REFRESH_en );



#ifdef USE_FOLLOWME_STEP2
    MenuCtrl_PushML2_P( FME_DISTANCE, MENU_ITEM, NOFUNC, FME_DISTANCE_de, FME_DISTANCE_en );
    MenuCtrl_PushML2_P( FME_AZIMUTH , MENU_ITEM, NOFUNC, FME_AZIMUTH_de , FME_AZIMUTH_en  );
#endif
    MenuCtrl_PushML2_P( FME_SPEED   , MENU_ITEM, NOFUNC, FME_SPEED_de   , FME_SPEED_en    );
    MenuCtrl_PushML2_P( FME_RADIUS  , MENU_ITEM, NOFUNC, FME_RADIUS_de  , FME_RADIUS_en   );
    MenuCtrl_PushSeparator();   // MENUE TRENNLINIE
    MenuCtrl_PushML2_P( GPS_DATA    , MENU_ITEM, NOFUNC, GPS_DATA_de    , GPS_DATA_en     );

    //---------------
    // Control
    //---------------
    while( true )
    {
        MenuCtrl_Control( MENUCTRL_EVENT );

        if( MenuCtrl_GetKey() == KEY_ESC )  break;      // ENDE

        itemid = MenuCtrl_GetItemId();                  // welcher Menu-Punkt (ID)

        //if( itemid == FME_REFRESH ) { Config.FM_Refresh = Edit_generic( Config.FM_Refresh   ,250,60000, Show_uint3,1   ,NULL,NULL);  }

        // FollowMeStep2:
        if( itemid == FME_DISTANCE) { Config.FM_Distance= Edit_generic( Config.FM_Distance  ,  0,  100, Show_uint3,1   ,strGet(STR_METERS),NULL);  }
        if( itemid == FME_AZIMUTH ) { Config.FM_Azimuth = Edit_generic( Config.FM_Azimuth   ,  0,  360, Show_uint3,1   ,PSTR("Grad"),NULL);        }
        // FollowMe:
        if( itemid == FME_SPEED   ) { Config.FM_Speed   = Edit_generic( Config.FM_Speed     ,  0,  100, Show_uint3,1   ,PSTR("0.1 m/s")   ,NULL);  }
        if( itemid == FME_RADIUS  ) { Config.FM_Radius  = Edit_generic( Config.FM_Radius    ,  1,   20, Show_uint3,1   ,strGet(STR_METERS),NULL);  }

        //--------------------
        // GPS_DATA
        //--------------------
        if( itemid == GPS_DATA )
        {
            GPSMouse_ShowData( GPSMOUSE_SHOW_TIME, 0 );     // 0 = beenden mit Verbindungstrennung
        }
    }

    //---------------
    // Destroy
    //---------------
    MenuCtrl_Destroy();
}
#endif // USE_FOLLOWME



//--------------------------------------------------------------
// Setup_GPSMouse()
//--------------------------------------------------------------
#ifdef USE_BLUETOOTH

void Setup_GPSMouse( void )
{
    uint8_t itemid;

    //---------------
    // Create
    //---------------
    MenuCtrl_Create();
    MenuCtrl_SetTitleFromParentItem();      // "GPS Maus"

    //---------------
    // Menuitems
    //---------------
    MenuCtrl_PushML2_P( GPS_SEARCH  , MENU_ITEM, &BT_SearchDevices  , GPS_SEARCH_de  , GPS_SEARCH_en  );
    MenuCtrl_PushML2_P( GPS_DEVICES , MENU_ITEM, &BT_SelectDevice   , GPS_DEVICES_de , GPS_DEVICES_en );

    //--------------------------------------------------------------------------------------------------------
    // 25.06.2014 OG - auskommentiert weil erstmal nicht weiter benoetigt. Wurde zwar verwendet in tracking.c
    // aber auch dort wurde betroffener Code deaktiviert - siehe Anmerkung tracking.c / PKT_tracking()
    //--------------------------------------------------------------------------------------------------------
    //MenuCtrl_PushML2_P( GPS_TYPE    , MENU_ITEM, NOFUNC             , GPS_TYPE_de    , GPS_TYPE_en    );

    //--------------------------------------------------------------------------------------------------------
    // 25.06.2014 OG - auskommentiert weil nirgendwo verwendet
    //--------------------------------------------------------------------------------------------------------
    //MenuCtrl_PushML2_P( GPS_ACTIVE  , MENU_ITEM, NOFUNC             , GPS_ACTIVE_de  , GPS_ACTIVE_en  );

      MenuCtrl_PushSeparator();   // MENUE TRENNLINIE
    MenuCtrl_PushML2_P( GPS_SHOWDEV , MENU_ITEM, NOFUNC             , GPS_SHOWDEV_de , GPS_SHOWDEV_en );
    MenuCtrl_PushML2_P( GPS_DATA    , MENU_ITEM, NOFUNC             , GPS_DATA_de    , GPS_DATA_en    );


    //---------------
    // Control
    //---------------
    while( true )
    {
        MenuCtrl_Control( MENUCTRL_EVENT );

        if( MenuCtrl_GetKey() == KEY_ESC )  break;      // ENDE

        itemid = MenuCtrl_GetItemId();                  // welcher Menu-Punkt (ID)

        //--------------------
        // GPS_TYPE
        //--------------------
        /*
        if( itemid == GPS_TYPE )
        {
            Config.gps_UsedGPSMouse  =  Edit_generic( Config.gps_UsedGPSMouse, 0,1,GPSMOUSE,1  ,NULL,NULL);
        }
        */


        //--------------------
        // GPS_ACTIVE
        //--------------------
        /*
        if( itemid == GPS_ACTIVE )
        {
            Config.gps_UseGPS = Edit_generic( Config.gps_UseGPS, 0,1,YesNo,1  ,NULL,NULL);
        }
        */



        //--------------------
        // GPS_SHOWDEV
        //--------------------
        if( itemid == GPS_SHOWDEV )
        {
            //Show_MAC( progmem, headline, mac)
            Show_MAC( false, Config.gps_UsedDevName, Config.gps_UsedMac);
        }


        //--------------------
        // GPS_DATA
        //--------------------
        if( itemid == GPS_DATA )
        {
            GPSMouse_ShowData( GPSMOUSE_SHOW_TIME, 0 );     // 0 = beenden mit Verbindungstrennung
        }

    }

    //---------------
    // Destroy
    //---------------
    MenuCtrl_Destroy();
}




//--------------------------------------------------------------
// zeigt die Konfig des BTM-222
//--------------------------------------------------------------
void BTM222_Info( void )
{

    lcd_cls();

    set_Modul_On( Bluetooth );

    if( !ScrollBox_Create(55) )     // max. 55 Zeilen
        return;                     //   kein RAM mehr

    ScrollBox_Push_P( MNORMAL, PSTR("BTM-222 Config") );
    ScrollBox_Push_P( MNORMAL, PSTR("") );
    bt_showsettings();
    ScrollBox_Push_P( MNORMAL, PSTR("End of Config") );

    ScrollBox_Show();
    ScrollBox_Destroy();            // free memory

    set_Modul_On( USB );

}



//--------------------------------------------------------------
// Setup_BTM222_MenuCreate()
//
// das Menue aendert sich je nachdem ob BTM222 ein- oder
// ausgeschaltet ist
//--------------------------------------------------------------
void Setup_BTM222_MenuCreate( void )
{
    //---------------
    // Create
    //---------------
    MenuCtrl_Create();
    MenuCtrl_SetTitleFromParentItem();      // "Bluetooth"

    //---------------
    // Menuitems
    //---------------
    MenuCtrl_PushML2_P( BT_INSTALLED , MENU_ITEM, NOFUNC , BT_INSTALLED_de , BT_INSTALLED_en );

    if( Config.UseBT )
    {
          MenuCtrl_PushSeparator();   // MENUE TRENNLINIE
        MenuCtrl_PushML2_P( BT_NAME      , MENU_ITEM, NOFUNC          , BT_NAME_de      , BT_NAME_en      );
        MenuCtrl_PushML2_P( BT_PIN       , MENU_ITEM, NOFUNC          , BT_PIN_de       , BT_PIN_en       );
        MenuCtrl_PushML2_P( BT_REID      , MENU_ITEM, NOFUNC          , BT_REID_de      , BT_REID_en      );
          MenuCtrl_PushSeparator();   // MENUE TRENNLINIE
        MenuCtrl_PushML2_P( BT_INIT      , MENU_ITEM, NOFUNC          , BT_INIT_de      , BT_INIT_en      );
        MenuCtrl_PushML2_P( BT_PCCONFIG  , MENU_ITEM, &Port_FC2CFG_BT , BT_PCCONFIG_de  , BT_PCCONFIG_en  );
        MenuCtrl_PushML2_P( BT_SHOWCONFIG, MENU_ITEM, &BTM222_Info    , BT_SHOWCONFIG_de, BT_SHOWCONFIG_en);
          MenuCtrl_PushSeparator();   // MENUE TRENNLINIE
        MenuCtrl_PushML2_P( BT_MAC       , MENU_ITEM, NOFUNC          , BT_MAC_de       , BT_MAC_en       );
    }
}

#endif  // end: #ifdef USE_BLUETOOTH



//--------------------------------------------------------------
// Setup_BTM222()
//--------------------------------------------------------------
#ifdef USE_BLUETOOTH

void Setup_BTM222( void )
{
    uint8_t itemid;
    uint8_t UseBT;
    uint8_t i;
    char string[11];

    Setup_BTM222_MenuCreate();

    //---------------
    // Control
    //---------------
    while( true )
    {
        MenuCtrl_Control( MENUCTRL_EVENT );

        if( MenuCtrl_GetKey() == KEY_ESC )  break;      // ENDE

        itemid = MenuCtrl_GetItemId();                  // welcher Menu-Punkt (ID)
        edit = 0;

        //--------------------
        // BT_INSTALLED
        //--------------------
        if( itemid == BT_INSTALLED )
        {
            UseBT = Config.UseBT;
            Config.UseBT = Edit_generic( Config.UseBT ,0,1, YesNo,1  ,NULL,NULL);

            if( UseBT != Config.UseBT )                 // hat Benutzer Einstellung geaendert?
            {
                if( Config.UseBT )                      // BTM222 wurde aktiviert - initialisieren
                {
                    BTM222_Initalize();

                    //if( bt_init() )
                    //    Config.BTIsSet = true;
                    //else
                    //    Config.BTIsSet = false;
                }

                MenuCtrl_Destroy();                     // Menue aendern wegen wechsel Wi232 vorhanden / nicht vorhanden
                Setup_BTM222_MenuCreate();
                continue;
            }
        }


        //--------------------
        // BT_NAME
        //--------------------
        if( itemid == BT_NAME )
        {
            bt_fixname();
            strncpyfill( string, Config.bt_name, bt_name_length+1 );                    // bt_name_length=10 + 1 Terminierende 0
            Edit_String( string, bt_name_length, EDIT_BT_NAME );

            if( edit == 1 )
            {
                strrtrim( EditString);                                                  // Leerzeichen rechts entfernen
                //lcd_print_at( 0, 5, EditString, 0);   // DEBUG
                //lcdx_printf_at( 17, 5, MNORMAL, 0,0, "%3d", strlen(EditString) );
                //_delay_ms(8000);

                strncpy( Config.bt_name, EditString, bt_name_length+1 );
            }
        }


        //--------------------
        // BT_PIN
        //--------------------
        if( itemid == BT_PIN )
        {
            for( i = 0; i < bt_pin_length; i++)
            {
                string[i] = Config.bt_pin[i];
            }
            string[bt_pin_length] = 0;
            Edit_String( string, bt_pin_length, EDIT_BT_PIN );

            if (edit == 1)
            {
                for( i = 0; i < bt_pin_length; i++)
                {
                    Config.bt_pin[i] = EditString[i];
                }
            }
        }


        //--------------------
        // BT_INIT
        //--------------------
        if( itemid == BT_INIT )
        {
            //lcd_cls ();
            //Old_Baudrate = Config.PKT_Baudrate;

            BTM222_Initalize();

            /*
            if( bt_init() == true )
            {
                lcd_printp_at( 0, 3, PSTR("BT Init ok"), MNORMAL);
                WriteBTInitFlag();
            }
            else
            {
                lcd_printp_at( 0, 3, PSTR("BT Init Error"), MNORMAL);
                Config.BTIsSet = false;
                set_beep( 1000, 0x0040, BeepNormal);
            }
            _delay_ms(2500);    // 2.5 Sekunden anzeigen fuer Benutzer
            */

        }


        //--------------------
        // BT_MAC
        //--------------------
        if( itemid == BT_MAC )
        {
            //Show_MAC( progmem, headline, mac)
            Show_MAC( true, PSTR("BTM-222 MAC"), Config.bt_Mac);
        }


        //--------------------
        // BT_REID
        //--------------------
        if( itemid == BT_REID )
        {
            for( i = 0; i < RE_ID_length; i++)
            {
                string[i] = Config.RE_ID[i];
            }
            string[RE_ID_length] = 0;
            Edit_String( string, RE_ID_length, EDIT_BT_PIN );

            if( edit == 1 )
            {
                for( i = 0; i < RE_ID_length; i++)
                {
                    Config.RE_ID[i] = EditString[i];
                }
            }
        }

    }  // end: while( true )

    //---------------
    // Destroy
    //---------------
    MenuCtrl_Destroy();

} // end: Setup_BTM222()

#endif  // end: #ifdef USE_BLUETOOTH




//--------------------------------------------------------------
// Setup_BLE()
//--------------------------------------------------------------
void Setup_BLE( void )
{
    uint8_t itemid;

    //---------------
    // Create
    //---------------
    MenuCtrl_Create();
    MenuCtrl_SetTitleFromParentItem();                  // "Bluetooth BLE"

    //---------------
    // Menuitems
    //---------------
    MenuCtrl_Push_P( BLE_INSTALLED, MENU_ITEM, NOFUNC, strGet(MODULE_EXIST) );


    //---------------
    // Control
    //---------------
    while( true )
    {
        MenuCtrl_Control( MENUCTRL_EVENT );

        if( MenuCtrl_GetKey() == KEY_ESC )  break;      // ENDE

        itemid = MenuCtrl_GetItemId();                  // welcher Menu-Punkt (ID)

        //--------------------
        // BT_INSTALLED
        //--------------------
        if( itemid == BT_INSTALLED )
        {
            Config.UseBLE = Edit_generic( Config.UseBLE, 0, 1, YesNo, 1  ,strGet(STR_EXTSV2MODULE),NULL);
        }
    }  // end: while( true )

    //---------------
    // Destroy
    //---------------
    MenuCtrl_Destroy();

} // end: Setup_BTM222()



//--------------------------------------------------------------
// Setup_MKConnection()
//--------------------------------------------------------------
void Setup_MKConnection( void )
{
    uint8_t itemid;
    uint8_t old;

    //---------------
    // Create
    //---------------
    MenuCtrl_Create();
    MenuCtrl_SetTitleFromParentItem();                  // "Bluetooth BLE"

    //---------------
    // Menuitems
    //---------------
    MenuCtrl_PushML2_P( MKCONN_CONNECTION   , MENU_ITEM, NOFUNC     , MKCONN_CONNECTION_de , MKCONN_CONNECTION_en   );
          MenuCtrl_PushSeparator();   // MENUE TRENNLINIE
    MenuCtrl_PushML2_P( MKCONN_BAUDRATE     , MENU_ITEM, NOFUNC     , MKCONN_BAUDRATE_de   , MKCONN_BAUDRATE_en     );


    //---------------
    // Control
    //---------------
    while( true )
    {
        MenuCtrl_Control( MENUCTRL_EVENT );

        if( MenuCtrl_GetKey() == KEY_ESC )  break;      // ENDE

        itemid = MenuCtrl_GetItemId();                  // welcher Menu-Punkt (ID)


        //--------------------
        // MKCONN_CONNECTION
        //--------------------
        if( itemid == MKCONN_CONNECTION )
        {
            old = Config.U02SV2;
            Config.U02SV2 = Edit_generic( Config.U02SV2,  0,  1, MK_Connection,1,  NULL,NULL);

            if( Config.U02SV2 != old )                                                          // Verbindung geaendert?
            {
                if( Config.U02SV2 == 1 )    Change_Output( Uart02FC );                          // 1 = Kabel
                else                        Change_Output( Uart02Wi );                          // 0 = Wi.232
            }

            if( (Config.U02SV2 == 0) && (Config.UseWi == false) )                               // FEHLER: Wi.232 nicht aktiviert  (Config.U02SV2 = 0 -> entspricht Wi.232)
            {
              //PKT_Message_P( text                      , error, timeout, beep, clear)
                PKT_Message_P( strGet(STR_WI232_ACTIVATE), true , 3000   , true, true);
            }
        }


        //--------------------
        // MKCONN_BAUDRATE
        //--------------------
        if( itemid == MKCONN_BAUDRATE )
        {
            old = Config.PKT_Baudrate;
            Config.PKT_Baudrate = Edit_generic( Config.PKT_Baudrate ,1,6,Baudrate,1  ,PSTR("Standard: ! 57600 !"),NULL);

            if( Config.PKT_Baudrate != old )
            {
                // Wi.232 umkonfigurieren
                if( Config.UseWi )
                {
                    Wi232_Initalize();
                }

                // BTM222 umkonfigurieren
                #ifdef USE_BLUETOOTH
                if( Config.UseBT )
                {
                    //set_BTOn();
                    BTM222_Initalize();
                    //set_BTOff();
                }
                #endif  // end: #ifdef USE_BLUETOOTH
            }
        }

    }  // end: while( true )

    //---------------
    // Destroy
    //---------------
    MenuCtrl_Destroy();

} // end: Setup_BTM222()




//--------------------------------------------------------------
// Setup_WI232_MenuCreate()
//
// das Menue aendert sich je nachdem ob Wi.232 ein- oder
// ausgeschaltet ist
//--------------------------------------------------------------
void Setup_WI232_MenuCreate( void )
{
    //---------------
    // Create
    //---------------
    MenuCtrl_Create();
    MenuCtrl_SetTitleFromParentItem();      // "Wi.232"

    //---------------
    // Menuitems
    //---------------
    MenuCtrl_Push_P( WI_INSTALLED , MENU_ITEM, NOFUNC , strGet(CONNECT13) );

    if( Config.UseWi )
    {
          MenuCtrl_PushSeparator();   // MENUE TRENNLINIE
        MenuCtrl_PushML2_P( WI_TXRX      , MENU_ITEM, NOFUNC           , WI_TXRX_de     , WI_TXRX_en     );
        MenuCtrl_PushML2_P( WI_GROUP     , MENU_ITEM, NOFUNC           , WI_GROUP_de    , WI_GROUP_en    );

      // 06.06.2014 OG
      //MenuCtrl_PushML2_P( WI_MODE      , MENU_ITEM, NOFUNC           , WI_MODE_de     , WI_MODE_en     );
      //MenuCtrl_PushML2_P( WI_TIMEOUT   , MENU_ITEM, NOFUNC           , WI_TIMEOUT_de  , WI_TIMEOUT_en  );
      //MenuCtrl_PushML2_P( WI_MTU       , MENU_ITEM, NOFUNC           , WI_MTU_de      , WI_MTU_en      );

          MenuCtrl_PushSeparator();   // MENUE TRENNLINIE
        MenuCtrl_PushML2_P( WI_INIT      , MENU_ITEM, NOFUNC           , WI_INIT_de     , WI_INIT_en     );

      //MenuCtrl_PushML2_P( WI_PCCONFIG  , MENU_ITEM, &Port_USB2CFG_Wi , WI_PCCONFIG_de , WI_PCCONFIG_en );
        MenuCtrl_PushML2_P( WI_PCCONFIG  , MENU_ITEM, &Wi232_ConfigPC , WI_PCCONFIG_de , WI_PCCONFIG_en );


    }
}



//--------------------------------------------------------------
// Setup_WI232()
//--------------------------------------------------------------
void Setup_WI232( void )
{
    uint8_t itemid;
    uint8_t UseWi;

    Setup_WI232_MenuCreate();

    //---------------
    // Control
    //---------------
    while( true )
    {
        MenuCtrl_Control( MENUCTRL_EVENT );

        if( MenuCtrl_GetKey() == KEY_ESC )  break;      // ENDE

        itemid = MenuCtrl_GetItemId();                  // welcher Menu-Punkt (ID)
        edit = 0;

        if( itemid == WI_TXRX      ) { Config.WiTXRXChannel     = Edit_generic( Config.WiTXRXChannel    , 0,   5, Show_uint3,1  ,NULL,NULL);  }
        if( itemid == WI_GROUP     ) { Config.WiNetworkGroup    = Edit_generic( Config.WiNetworkGroup   , 0, 127, Show_uint3,1  ,NULL,NULL);  }
      //if( itemid == WI_MODE      ) { Config.WiNetworkMode     = Edit_generic( Config.WiNetworkMode    , 0,   1, Wi_Netmode,1  ,NULL,NULL);  }
      //if( itemid == WI_TIMEOUT   ) { Config.WiTXTO            = Edit_generic( Config.WiTXTO           , 0, 127, Show_uint3,1  ,NULL,NULL);  }
      //if( itemid == WI_MTU       ) { Config.WiUartMTU         = Edit_generic( Config.WiUartMTU        , 0, 127, Show_uint3,1  ,NULL,NULL);  }
        if( itemid == WI_INIT      ) { Wi232_Initalize();  }

        //--------------------
        // WI_INSTALLED
        //--------------------
        if( itemid == WI_INSTALLED )
        {
            UseWi = Config.UseWi;
            Config.UseWi = Edit_generic( Config.UseWi, 0,1, YesNo,1, NULL,NULL);
            if( UseWi != Config.UseWi )                 // hat Benutzer Einstellung geaendert?
            {
                if( Config.UseWi )
                    Wi232_Initalize();                  // Wi232 wurde aktiviert: init

                MenuCtrl_Destroy();                     // Menue aendern wegen wechsel Wi232 vorhanden / nicht vorhanden
                Setup_WI232_MenuCreate();
                continue;
            }
        }
    }

    //---------------
    // Destroy
    //---------------
    MenuCtrl_Destroy();
}



//--------------------------------------------------------------
// Setup_PKTGeneric()
//
// entspricht "PKT allgemein"
//--------------------------------------------------------------
void Setup_PKTGeneric( void )
{
    uint8_t itemid;
    uint8_t old;

    //---------------
    // Create
    //---------------
    MenuCtrl_Create();

    //---------------
    // Einstellungen
    //---------------
    MenuCtrl_SetTitleFromParentItem();      // "PKT allgemein"
    //MenuCtrl_SetCycle( false );
    //MenuCtrl_SetShowBatt( false );
    //MenuCtrl_SetBeep( true );

    //---------------
    // Menuitems
    //---------------
    MenuCtrl_PushML2_P( PKT_LANGUAGE     , MENU_ITEM, NOFUNC , LANGUAGE_de     , LANGUAGE_en      );
    MenuCtrl_PushML2_P( TIME_ZONE        , MENU_ITEM, NOFUNC , TIME_ZONE_de    , TIME_ZONE_en     );
    MenuCtrl_PushML2_P( TIME_SUMMER      , MENU_ITEM, NOFUNC , TIME_SUMMER_de  , TIME_SUMMER_en   );

    MenuCtrl_PushSeparator();   // MENUE TRENNLINIE

    MenuCtrl_PushML2_P( PKT_PKTOFF       , MENU_ITEM, NOFUNC , PKT_PKTOFF_de   , PKT_PKTOFF_en    );
    MenuCtrl_PushML2_P( PKT_LIGHTOFF     , MENU_ITEM, NOFUNC , LIGHTOFF_de     , LIGHTOFF_en      );

    MenuCtrl_PushSeparator();   // MENUE TRENNLINIE

    // 18.04.2014 OG: rausgenommen da es aktuell auch nicht mehr mit PKT 3.9m Hardware geht
    //if( PCB_Version == PKT39m )     // Helligkeit nur bei PKT39m - bei der PKT39x geht das nicht mehr
    //  MenuCtrl_PushML2_P( PKT_BRIGHTNESS   , MENU_ITEM, NOFUNC , BRIGHTNESS_de   , BRIGHTNESS_en  );

    MenuCtrl_PushML2_P( PKT_CONTRAST     , MENU_ITEM, NOFUNC , CONTRAST_de     , CONTRAST_en      );
    MenuCtrl_PushML2_P( PKT_BEEPER       , MENU_ITEM, NOFUNC , BEEPER_de       , BEEPER_en        );

    #ifdef USE_SOUND
    MenuCtrl_PushML2_P( PKT_SOUNDMODUL   , MENU_ITEM, NOFUNC , SOUNDMODUL_de   , SOUNDMODUL_en    );
    MenuCtrl_PushML2_P( PKT_VOLUME       , MENU_ITEM, NOFUNC , VOLUME_de       , VOLUME_en        );
    #endif

    MenuCtrl_PushML2_P( PKT_ACCUTYPE     , MENU_ITEM, NOFUNC , ACCUTYPE_de     , ACCUTYPE_en      );
    MenuCtrl_PushML2_P( PKT_ACCUMEASURE  , MENU_ITEM, NOFUNC , ACCUMEASURE_de  , ACCUMEASURE_en   );

    //---------------
    // Control
    //---------------
    while( true )
    {
        MenuCtrl_Control( MENUCTRL_EVENT );

        if( MenuCtrl_GetKey() == KEY_ESC )  break;

        itemid = MenuCtrl_GetItemId();        // welcher Menu-Punkt (ID)

        if( itemid == PKT_LANGUAGE )
        {
            old = Config.DisplayLanguage;
            Config.DisplayLanguage    = Edit_generic( Config.DisplayLanguage ,  0,  1, Language,1,      NULL,NULL);

            if( old != Config.DisplayLanguage )
            {
                PKT_Ask_Restart( strGetLanguage(LANGUAGE_de,LANGUAGE_en) );
            }
        }

        if( itemid == TIME_ZONE         )   Config.timezone           = Edit_generic( Config.timezone        ,-12, 12, Show_uint3,1,    PSTR("+1 = Berlin  "),PSTR("-5 = New York"));
        if( itemid == TIME_SUMMER       )   Config.summertime         = Edit_generic( Config.summertime      ,  0,  1, YesNo,1,         NULL,NULL);
        if( itemid == PKT_LIGHTOFF      )   Config.DisplayTimeout     = Edit_generic( Config.DisplayTimeout  ,  0,254, Show_uint3,1,    strGet(STR_HELP_PKTOFFTIME1),NULL);
        if( itemid == PKT_PKTOFF        )   Config.PKTOffTimeout      = Edit_generic( Config.PKTOffTimeout   ,  0,254, Show_uint3,1,    strGet(STR_HELP_PKTOFFTIME1),NULL);
        if( itemid == PKT_BEEPER        )   Config.HWBeeper           = Edit_generic( Config.HWBeeper        ,  0,  1, YesNo,1,         NULL,NULL);
        if( itemid == PKT_SOUNDMODUL    )   Config.HWSound            = Edit_generic( Config.HWSound         ,  0,  1, YesNo,1,         NULL,NULL);
        if( itemid == PKT_VOLUME        )   Config.Volume             = Edit_generic( Config.Volume          ,  0, 50, Show_uint3,1,    NULL,NULL);
        if( itemid == PKT_CONTRAST      ) { Config.LCD_Kontrast       = Edit_generic( Config.LCD_Kontrast    , 10, 40, Kontrast,1,      NULL,NULL);
                                            lcd_set_contrast( Config.LCD_Kontrast );
                                          }

      //if( itemid == PKT_BRIGHTNESS    )   Config.LCD_Helligkeit     = Edit_DisplayHelligkeit(Config.LCD_Helligkeit,0,100);
        if( itemid == PKT_ACCUTYPE      )   Config.PKT_Accutyp        = Edit_generic( Config.PKT_Accutyp     ,  0,  1, PKT_Akku,1,      NULL,NULL);
        if( itemid == PKT_ACCUMEASURE   )   Edit_LipoOffset();
    }

    //---------------
    // Destroy
    //---------------
    MenuCtrl_Destroy();
}



//--------------------------------------------------------------
// Setup_Main()
//
// Das Hauptmenue fuer das gesamte Setup
//--------------------------------------------------------------
void Setup_MAIN( void )
{
    uint8_t itemid;

    //---------------
    // Create
    //---------------
    MenuCtrl_Create();

    //---------------
    // Einstellungen
    //---------------
    MenuCtrl_SetTitleFromParentItem();      // "PKT Setup"
  //MenuCtrl_SetTitle_P( PSTR("PKT Setup") );
  //MenuCtrl_SetCycle( false );
  //MenuCtrl_SetShowBatt( false );
  //MenuCtrl_SetBeep( true );

    //---------------
    // Menuitems
    //---------------
    MenuCtrl_PushML2_P( SETUP_PKTCONFIG    , MENU_SUB , &Setup_PKTGeneric   , SETUP_PKTCONFIG_de    , SETUP_PKTCONFIG_en    );
    MenuCtrl_PushML2_P( SETUP_OSDVIEW      , MENU_SUB , &Setup_OSD          , SETUP_OSDVIEW_de      , SETUP_OSDVIEW_en      );
    MenuCtrl_PushML2_P( SETUP_OSDSCREENS   , MENU_SUB , &Setup_OSDScreens   , SETUP_OSDSCREENS_de   , SETUP_OSDSCREENS_en   );

    MenuCtrl_PushSeparator();       // MENUE TRENNLINIE

    MenuCtrl_PushML2_P( SETUP_MKCONNECTION , MENU_SUB , &Setup_MKConnection , SETUP_MKCONNECTION_de , SETUP_MKCONNECTION_en );

    MenuCtrl_PushML2_P( SETUP_WI232        , MENU_SUB , &Setup_WI232        , SETUP_WI232_de        , SETUP_WI232_en        );

    #ifdef USE_BLUETOOTH
    MenuCtrl_PushML2_P( SETUP_BTM222       , MENU_SUB , &Setup_BTM222       , SETUP_BTM222_de       , SETUP_BTM222_en       );
    #endif

    #if (defined(USE_SV2MODULE_BLE) || defined(USE_WLAN))
    if( PCB_SV2RxTxPatch )          // nur sichtbar mit SV2 Patch!
      MenuCtrl_PushSeparator();     // MENUE TRENNLINIE
    #endif

    #ifdef USE_SV2MODULE_BLE
    if( PCB_SV2RxTxPatch )          // nur sichtbar mit SV2 Patch!
      MenuCtrl_PushML2_P( SETUP_BLE        , MENU_SUB , &Setup_BLE          , SETUP_BLE_de          , SETUP_BLE_en          );
    #endif

    #ifdef USE_WLAN
    if( PCB_SV2RxTxPatch )          // nur sichtbar mit SV2 Patch!
      MenuCtrl_PushML2_P( SETUP_WIFLY      , MENU_SUB , &Setup_WiFly        , SETUP_WIFLY_de        , SETUP_WIFLY_en        );
    #endif

    MenuCtrl_PushSeparator();       // MENUE TRENNLINIE

    #ifdef USE_BLUETOOTH
    MenuCtrl_PushML2_P( SETUP_GPSMAUS      , MENU_SUB , &Setup_GPSMouse     , SETUP_GPSMAUS_de      , SETUP_GPSMAUS_en      );
    #endif

    #ifdef USE_FOLLOWME
    MenuCtrl_PushML2_P( SETUP_FOLLOWME     , MENU_SUB , &Setup_FollowMe     , SETUP_FOLLOWME_de     , SETUP_FOLLOWME_en     );
    #endif

    #ifdef USE_TRACKING
    MenuCtrl_PushML2_P( SETUP_SERVOCONFIG  , MENU_SUB , &Setup_ServoTracking, SETUP_SERVOCONFIG_de  , SETUP_SERVOCONFIG_en  );  // tracking/servo_setup.c
    #endif

    #ifdef USE_JOYSTICK
    MenuCtrl_PushML2_P( SETUP_JOYSTICK     , MENU_SUB , &Setup_Joysticks    , SETUP_JOYSTICK_de     , SETUP_JOYSTICK_en     );
    #endif

    MenuCtrl_PushSeparator();   // MENUE TRENNLINIE

    MenuCtrl_PushML2_P( SETUP_PKTUPDATE    , MENU_ITEM, &PKT_Update         , SETUP_PKTUPDATE_de    , SETUP_PKTUPDATE_en    );
  //MenuCtrl_PushML2_P( SETUP_PKTDEBUG     , MENU_ITEM, NOFUNC              , SETUP_PKTDEBUG_de     , SETUP_PKTDEBUG_en     );
    MenuCtrl_PushML2_P( SETUP_EEPROMRESET  , MENU_ITEM, &PKT_Reset_EEprom   , SETUP_EEPROMRESET_de  , SETUP_EEPROMRESET_en  );

    //---------------
    // Control
    //---------------
    while( true )
    {
        MenuCtrl_Control( MENUCTRL_EVENT );
        if( MenuCtrl_GetKey() == KEY_ESC )      break;

        itemid = MenuCtrl_GetItemId();              // welcher Menu-Punkt (ID)

        //--------------------
        // SETUP_PKTDEBUG
        //--------------------
        if( itemid == SETUP_PKTDEBUG )
        {
            Config.Debug = Edit_generic( Config.Debug, 0,1,Show_uint3,1  ,NULL,NULL);
        }

    }

    //---------------
    // Destroy
    //---------------
    MenuCtrl_Destroy();
}