Subversion Repositories Projects

Rev

Rev 2212 | 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  menu.c
//# 14.10.2015 Starter
//# fix: -FollowMeStep2 Debug wird nur noch bei FollowMeStep2 angezeigt
//#
//# 03.08.2015 Cebra
//# - add: Menü _DefMenu_Main_NO erweitert für GPS Test , mit #define schaltbar
//#
//# 09.04.2015 Cebra
//# - add: Vorbereitung für ACC Kalibrartion aus dem Menü
//#        #ifdef USE_ACCCALIBRATION
//#
//# 27.06.2014 OG
//# - chg: Menu_PKTSpezial() - Tracking etwas nach oben verschoben
//#
//# 26.06.2014 OG
//# - chg: Menu_PKTSpezial() - ergaenzt um Setup_FollowMe()
//#
//# 18.06.2014 OG
//# - chg: Menu_PKTSpezial() umorganisiert
//#
//# 14.06.2014 OG
//# - chg: _DefMenu_Main_NO() - "PKT Spezial" wird nicht mehr angezeigt wenn
//#        kein Kopter gefunden wurde; aktuell sind dort nur Funktionen
//#        enthalten die einen Kopter benoetigen - wenn sich das mal irgendwann
//#        aendert muss man das anpassen
//#
//# 01.06.2014 OG
//# - chg: Menu_PKTSpezial() - Aufruf von Tracking und Followme ergaenzt
//#        um Abfrage MKVersion.isNC
//# - chg: _ConfigMenu_Main() umgestellt auf MKVersion.isNC/isFC
//#
//# 14.05.2014 OG
//# - chg: Aufruf von gps() geaendert zu MK_Gps_Info()
//# - chg: include "gps/gps.h" geaendert zu "mk/mkgpsinfo.h"
//#
//# 13.05.2014 OG
//# - del: USE_MAINMENU_SEPARATOR (verschoben nach main.h)
//# - chg: Menu_Main() - del unused variable 'event'
//#
//# 11.05.2014 OG
//# - chg: Menu_PKTSpezial() umgestellt auf MenuCtrl_SetTitleFromParentItem()
//#        -> die Menues 'erben' damit ihren Titel vom aufrufenden Menuepunkt
//#
//# 08.04.2014 OG
//# - chg: die Menuetrennlinien werden jetzt via define USE_MAINMENU_SEPARATOR
//#        angezeigt (das define ist hier im Code) und sind erstmal wieder
//#        abgeschaltet
//#
//# 08.04.2014 OG
//# - add: _DefMenu_Main_NC() - Menuetrennlinien hinzugefuegt
//# - add: _DefMenu_Main_FC(), _DefMenu_Main_NO() - Menuetrennlinien hinzugefuegt
//#
//# 01.04.2014 OG
//# - chg: PCB_WiFlyPatch umbenannt zu PCB_SV2RxTxPatch
//# - add: PKT-Connect(): "BLE Extender" (ext. Bluetooth 4 Low Energy Modul an SV2)
//# - fix: Menu_PKTConnect(): "WLAN Extender" nur sichtar wenn Config.UseWL gesetzt ist
//#
//# 30.03.2014 OG
//# - chg: Sprache Hollaendisch vollstaendig entfernt
//# - chg: MenuCtrl_PushML_P() umgestellt auf MenuCtrl_PushML2_P()
//#
//# 29.03.2014 OG
//# - chg: versch. Funktionen: del: MenuCtrl_SetShowBatt() wegen Aenderung
//#        des Defaults auf true
//#
//# 24.03.2014 OG
//# - chg: "MK Info" vor "MK Settings" verschoben
//#
//# 28.02.2014 OG
//# - chg: ID_MKSETTINGS in den Menues fuer NC/FC weiter nach oben geschoben
//#
//# 27.02.2014 OG
//# - chg: Menuetexte fuer Menu_PKTConnect()
//#
//# 26.02.2014 OG
//# - chg: DEBUG_NEW_PARAMETERS umbenannt zu DEBUG_PARAMSET
//#
//# 18.02.2014 OG
//# - chg: Aufruf von MK_Parameters() ist jetzt MK_Settings() und geht auf
//#        den Source mk/mksettings.c
//#
//# 17.02.2014 OG
//# - chg: aus "MK Parameters" ist "MK Settings" geworden! Entsprechende
//#        defines zu ID's, USE und Sprachen haben sich geaendert
//# - chg: umbenannt: USE_MKPARAMETER -> USE_MKSETTINGS
//#
//# 12.02.2014 OG
//# - del: die includes zu den alten parameter... entfernt
//# - chg: auf mk/mkparameters.c/h umgestellt -> MK_Parameters()
//# - chg: auf 'MKVersion.paramsetOK' umgestellt
//#
//# 05.02.2014 OG
//# - add: DEBUG_NEW_PARAMETERS in Hauptmenues fuer Entwicklung
//#
//# 30.01.2014 OG
//# - add: Unterstuetzung fuer USE_BLUETOOTH
//#
//# 29.01.2014 OG
//# - chg: Umstrukturierung vom Hauptmenue
//#          chg: "PKT Tools" -> "PKT Connect" (nur noch Connect-Funktionen drin)
//#          add: "PKT Spezial" -> MK-Motortest und Spezial-Funktionen
//#               wie Joystick, Tracking, FollowMe
//# - chg: call: display_debug() -> MK_DebugData()
//# - chg: call: display_data() -> MK_Display()
//# - chg: #include "debug.h" -> "mk/mkdebugdata.h"
//# - chg: #include "display.h" -> #include "mk/mkdisplay.h"
//# - add: #include "mk/mkbase.h"
//#
//# 25.01.2014 OG
//# - chg: MK-Display und MK-DebugData auch bei falscher FC-Revision wieder
//#        aktiviert
//#
//# 07.01.2014 Cebra
//# - chg: Abfrage WrongFCVersion etwas verändert
//#
//# 06.01.2014 Cebra
//# - add: Alle Menüpunkte die FC versionabhängig werden bei falscher FC Version ausgeblendet
//#
//# 04.10.2013 Cebra
//# - add: Motortest ohne FC = I2C-Anschluss PKT, mit FC/NC Motortest über FC
//#
//# 26.06.2013 Cebra
//# - add: Menüpunkt Wlan Rangeextender
//#
//# 24.06 2013 OG
//# - chg: Menu_PKTTools(): Menuepunkte fuer PKT-SV2-Verbindungen werden
//#        durch define USE_PKTTOOLS_SV2 (main.h) an-/ausgeschaltet
//# - chg: Menu_PKTTools(): Menuepunkte werden je nach aktiviertem Wi232 und
//#        Bluetooth ein-/ausgeblendet
//# - chg: Menuetexte fuer ID_USB2SV2 und ID_BT2SV2 geaendert
//# - chg: defines fuer Menuetexte von PKT-Tools geaendert
//# - del: verschiedene Exec_* Funktionen
//#
//# 24.06 2013 Cebra
//# - add: Menuepunkt MKUSB in PKT-Tools
//#
//# 13.06.2013 OG
//# - chg: Fastconnect auf Menu_PKTTools() umgelegt
//# - chg: Menueeintraege von Menu_PKTTools() modifiziert und reduziert
//# - chg: in allen Hauptmenues ist PKT-Setup und PKT-Info drin
//#
//# 11.06.2013 OG
//# - chg: Code zu Menu_OSDData() ausgegliedert nach osddata.c
//#
//# 24.05.2013 OG
//# - chg: Aufrufe von MenuCtrl_Push() umgestellt auf MenuCtrl_PushML_P()
//#
//# 21.05.2013 OG
//# - chg: Menu_Main() umgestellt auf MENUCTRL_EVENT
//# - fix: Menu_Main() nach Menu-Redraw searchMK()
//# - chg: Menu_Setup() umbenannt zu Setup_MAIN()
//# - del: include utils/menuold.h
//#
//# 20.05.2013 OG
//# - chg: Layout Menutitel
//#
//# 19.05.2013 OG
//# - chg: Menuepunkte Tracking und FollowMe werden nur angezeigt wenn BTM222
//#        installiert ist (Config.UseBT == true)
//# - add: Menu_PKTTools() (ehemals in tools.c)
//# - del: PC_Fast_Connect() verschoben nach pkt.c
//# - chg: main_menu() umbenannt zu Menu_Main()
//#
//# 19.05.2013 OG
//# - chg: Funktionen nach main.c verschoben
//#        CheckUpdate(), Update_PKT(), PKT_Info(), PKT_SwitchOff()
//#
//# 18.05.2013 OG
//# - chg: PKT_Info() erweitert um optionale Module-Info (via USE_MODULEINFO)
//#        und Credits chronoligisch umgedreht
//#
//# 18.05.2013 OG
//# - add: USE_JOYSTICK, USE_TRACKING, USE_OSDDATA, USE_MKPARAMETER, USE_MKDISPLAY
//# - chg: redundante Menue-Strings sind untereinander verpointert um Platz zu
//#        sparen
//# - chg: Umstellung auf neue menuctrl.c und damit starke Strukturaenderung
//#        Hinweis: autom. PKT-Update via Hauptmenue geht noch nicht - wird
//#        wieder eingebaut (wenn m�glich direkt in menuctrl.c dann geht
//#        das in allen Menues)
//# - del: Ausgliederung der alten Menue-Funktionen nach utils/menuold.c
//#        inkl. not_possible()
//#
//# 16.05.2013 OG
//# - add: define USE_MKGPSINFO fuer gps()
//#
//# 05.05.2013 Cebra
//# - chg: Fehler im Menü bei nicht verfügbaren Funktionen
//#
//# 02.05.2013 OG
//# - chg: Menuetext: osddata_menuitems:  "MK Fehlerliste" -> "MK Fehler"
//# - chg: Menuetext: "OSD Anzeige" wieder zurueck zu "OSD"
//#
//# 28.04.2013 OG
//# - chg: Show_Version() auf ScrollBox umgestellt
//# - chg: Menuetext "Debug Data" zu "MK Debug Data" (kam frueher zu Verwirrungen bei mir)
//# - chg: main_menu() bzgl. Menu_OSDDATA()
//# - add: Menu_OSDDATA() (aus ehemaligem osd/osd_tools.c)
//#
//# 21.04.2013 Cebra
//# - chg: OSD-Tools im Menue integriert
//#
//# 16.04.2013 Cebra
//# - chg: PROGMEM angepasst auf neue avr-libc und GCC, prog_char depreciated
//#
//# 14.04.2013 OG
//# - WIP: Anzeige "OSD-Daten" in param_menuitems_nc, param_menuitems_no
//#
//# 04.04.2013 Cebra
//# - chg:Texttuning
//#       not_possible, für Menüpunkte nicht nicht wählbar sind
//#
//# 03.04.2013 OG
//# - fix: Anzeigefehler wenn (hardware == NC) und nicht gesetzt define 'USE_MKDEBUGDATA' (bzw. 'analognames')
//# - chg: Layout von Anzeige wenn USE_MKDEBUGDATA nicht verfuegbar (jetzt Invers)
//# - chg: define 'analognames' zu define 'USE_MKDEBUGDATA'
//#
//# 30.03.2013 CB
//# - add: automatischer Start der PKT-Updatefunktion im Mainmenüe für das Updatetool
//#
//# 28.03.2013 CB
//# - chg: Hinweis wenn Debug Data nicht möglich ist
//#
//# 10.03.2013 Cebra
//# - add: menu_select, gemeinsame Routine für alle Setupmenüs
//#
//# 27.03.2013 Cebra
//# - chg: Fehler bei der Menüsteuerung behoben
//############################################################################


#include "cpu.h"
#include <avr/io.h>
#include <inttypes.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include <util/delay.h>
#include <string.h>

#include "main.h"
#include "lcd/lcd.h"
#include "menu.h"
#include "mk/mkdisplay.h"
#include "mk/mkdebugdata.h"
#include "timer/timer.h"
#include "osd/osd.h"
#include "osd/osddata.h"
#include "motortest/motortest.h"
#include "mk/mkgpsinfo.h"
#include "eeprom/eeprom.h"
#include "setup/setup.h"
#include "uart/uart1.h"
#include "mk-data-structs.h"
#include "wi232/Wi232.h"

#include "connect.h"
#include "lipo/lipo.h"
#include "messages.h"
#include "bluetooth/bluetooth.h"
#include "followme/followme.h"
#include "tracking/ng_servo.h"
#include "tracking/tracking.h"
#include "stick/stick.h"
#include "utils/menuctrl.h"
#include "pkt/pkt.h"
#include "mk/mkbase.h"
#include "mksettings/paramset.h"
#include "mksettings/mksettings.h"


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

char titlemain[]  = "PKT v                ";    // buffer fuer PKT-Versionsinfo
                   //123456789012345678901



// nur fuer Entwicklung...
static const char DEBUG_PARAMSET_Text[]         PROGMEM = "DEBUG PARAMSET";

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

//-----------------------
// main_menu
//-----------------------
#define ID_OSD              1
#define ID_OSDDATA          2
#define ID_MKDISPLAY        3
#define ID_MKSETTINGS       4
#define ID_MKDEBUGDATA      5
#define ID_MKGPSINFO        6
#define ID_SEARCHMK         7
#define ID_PKTCONNECT       8
#define ID_PKTSETUP         9
#define ID_PKTINFO          10
#define ID_PKTSPEZIAL       11
#define ID_MKINFO           12
#define ID_MKACCCAL         13

#define ID_DEBUG_GPS        14


static const char SEARCHMK_de[]         PROGMEM = "Suche Mikrokopter";
static const char SEARCHMK_en[]         PROGMEM = "search Kopter";

static const char OSD_de[]              PROGMEM = "OSD";
#define OSD_en OSD_de

static const char OSDDATA_de[]          PROGMEM = "OSD Daten";
static const char OSDDATA_en[]          PROGMEM = "OSD Data";

static const char MKINFO_de[]           PROGMEM = "MK Info";
#define MKINFO_en  MKINFO_de

static const char MKDISPLAY_de[]        PROGMEM = "MK Display";
#define MKDISPLAY_en MKDISPLAY_de

static const char MKACCCAL_de[]         PROGMEM = "MK ACC Kalibr.";
static const char MKACCCAL_en[]         PROGMEM = "MK ACC Calibr.";

static const char MKSETTINGS_de[]       PROGMEM = "MK Settings";
#define MKSETTINGS_en  MKSETTINGS_de

static const char MKDEBUGDATA_de[]      PROGMEM = "MK Daten";
static const char MKDEBUGDATA_en[]      PROGMEM = "MK Data";

static const char MKGPSINFO_de[]        PROGMEM = "MK GPS Info";
#define MKGPSINFO_en MKGPSINFO_de

static const char PKTCONNECT_de[]       PROGMEM = "PKT Connect";
#define PKTCONNECT_en PKTCONNECT_de

static const char PKTSPEZIAL_de[]       PROGMEM = "PKT Spezial";
static const char PKTSPEZIAL_en[]       PROGMEM = "PKT Special";

static const char PKTSETUP_de[]         PROGMEM = "PKT Setup";
#define PKTSETUP_en  PKTSETUP_de

static const char PKTINFO_de[]          PROGMEM = "PKT Info";
#define PKTINFO_en  PKTINFO_de


#ifdef USE_FOLLOWME_STEP2
static const char PKTGPS_de[]          PROGMEM = "PKT GPS Debug";
#define PKTGPS_en  PKTGPS_de
#endif


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

//-----------------------------
// Menu_PKTSpezial()
//-----------------------------
#define ID_BLTESTER         60
#define ID_TRACKING         61
#define ID_JOYSTICK         62
#define ID_FOLLOWME         63
#define ID_FOLLOWMESETUP    64

static const char BLTESTER_de[]         PROGMEM = "MK Motortest";
#define BLTESTER_en                     BLTESTER_de

static const char TRACKING_de[]         PROGMEM = "Tracking";
#define TRACKING_en                     TRACKING_de

static const char JOYSTICK_de[]         PROGMEM = "Joystick";
#define JOYSTICK_en                     JOYSTICK_de

static const char FOLLOWME_de[]         PROGMEM = "Follow Me";
#define FOLLOWME_en                     FOLLOWME_de

static const char FOLLOWMESETUP_de[]    PROGMEM = "Follow Me Setup";
#define FOLLOWMESETUP_en                FOLLOWMESETUP_de

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

//-----------------------------
// Menu_PKTConnect()
//-----------------------------
#define ID_BT2WI232         40
#define ID_USB2WI232        41
#define ID_USB2SV2          42
#define ID_BT2SV2           43
#define ID_WIFLY2WI232      44
#define ID_BLE2WI232        45



static const char BT2WI232_de[]         PROGMEM = "BT   Extender";
#define           BT2WI232_en           BT2WI232_de

static const char BLE2WI232_de[]        PROGMEM = "BLE  Extender";
#define           BLE2WI232_en          BLE2WI232_de

static const char WIFLY2WI232_de[]      PROGMEM = "WLAN Extender";
#define           WIFLY2WI232_en        WIFLY2WI232_de

static const char USB2WI232_de[]        PROGMEM = "USB  -> Wi232";
#define           USB2WI232_en          USB2WI232_de

#ifdef USE_PKTTOOLS_SV2
static const char USB2SV2_de[]          PROGMEM = "USB  -> SV2";
#define           USB2SV2_en            USB2SV2_de
#endif

#ifdef USE_PKTTOOLS_SV2
static const char BT2SV2_de[]           PROGMEM = "BT   -> SV2";
#define           BT2SV2_en             BT2SV2_de
#endif


//#############################################################################################
//# Hilfsfunktionen & Verschiedenes
//#############################################################################################


//--------------------------------------------------------------
// wird von Menu_PKTTools() verwendet
//--------------------------------------------------------------
void Exec_BLTESTER(void)
{
  if(hardware == NO) motor_test( I2C_Mode );
  if(hardware == NC) motor_test( FC_Mode );
  if(hardware == FC) motor_test( FC_Mode );

}


//#############################################################################################
//# Menu: Spezial
//#############################################################################################



//--------------------------------------------------------------
// Menue fuer 'PKTSpezial'
//--------------------------------------------------------------
void Menu_PKTSpezial( void )
{
    //---------------
    // Create
    //---------------
    MenuCtrl_Create();

    //---------------
    // Einstellungen
    //---------------
    MenuCtrl_SetTitleFromParentItem();      // "PKT Spezial"
  //MenuCtrl_SetTitle_P( PSTR("PKT Spezial") );
  //MenuCtrl_SetShowBatt( true );

    //---------------
    // Menuitems: PKTSpezial
    //---------------
    #ifdef USE_FOLLOWME
    if( Config.UseBT && MKVersion.isNC )
    {
      MenuCtrl_PushML2_P( ID_FOLLOWME     , MENU_ITEM, &FollowMe      , FOLLOWME_de     , FOLLOWME_en      );
      MenuCtrl_PushML2_P( ID_FOLLOWMESETUP, MENU_ITEM, &Setup_FollowMe, FOLLOWMESETUP_de, FOLLOWMESETUP_en );
    }
    #endif


    #ifdef USE_TRACKING
    if( Config.UseBT && MKVersion.isNC )
    {
      MenuCtrl_PushML2_P( ID_TRACKING   , MENU_ITEM, &PKT_tracking , TRACKING_de   , TRACKING_en  );
    }
    #endif


    #ifdef USE_JOYSTICK
    MenuCtrl_PushML2_P( ID_JOYSTICK   , MENU_ITEM, &joystick       , JOYSTICK_de   , JOYSTICK_en  );
    #endif


    MenuCtrl_PushSeparator();       // MENUE TRENNLINIE

    MenuCtrl_PushML2_P( ID_BLTESTER    , MENU_ITEM, &Exec_BLTESTER , BLTESTER_de    , BLTESTER_en );

    // {"Servo Tester     ","servo test       ","Servo Tester     "},
    // if((val+offset) == 2 )  servo_test();

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

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


//#############################################################################################
//# Menu: PKT-Connect
//#############################################################################################

//--------------------------------------------------------------
// Menue fuer; PKT-Connect
//
// verbindet das PKT mit anderen Devices wie Tablet usw.
//--------------------------------------------------------------
void Menu_PKTConnect( void )
{
    //---------------
    // Create
    //---------------
    MenuCtrl_Create();

    //---------------
    // Einstellungen
    //---------------
    MenuCtrl_SetTitle_P( PSTR("PKT Connect") );     // kann nicht auf MenuCtrl_SetTitleFromParentItem() umgestellt
                                                    // werden da PKT-Connect auch durch einen Hot-Key aufgerufen
                                                    // werden kann
  //MenuCtrl_SetCycle( false );
  //MenuCtrl_SetShowBatt( true );
  //MenuCtrl_SetBeep( true );

    //---------------
    // Menuitems
    //---------------
    #ifdef USE_BLUETOOTH
    if( Config.UseBT && Config.UseWi )
        MenuCtrl_PushML2_P( ID_BT2WI232    , MENU_ITEM, &Port_BT2Wi    , BT2WI232_de    , BT2WI232_en    );
    #endif

    #ifdef USE_SV2MODULE_BLE
    if( PCB_SV2RxTxPatch && Config.UseBLE )
        MenuCtrl_PushML2_P( ID_BLE2WI232   , MENU_ITEM, &Port_BLE2Wi   , BLE2WI232_de   , BLE2WI232_en );
    #endif

    if( PCB_SV2RxTxPatch && Config.UseWL )
        MenuCtrl_PushML2_P( ID_WIFLY2WI232 , MENU_ITEM, &Port_WiFly2Wi , WIFLY2WI232_de , WIFLY2WI232_en );

    if( Config.UseWi )
        MenuCtrl_PushML2_P( ID_USB2WI232   , MENU_ITEM, &Port_USB2Wi   , USB2WI232_de   , USB2WI232_en   );

    #ifdef USE_PKTTOOLS_SV2     // am PKT-SV2 liegen +5 Volt an...
        MenuCtrl_PushML2_P( ID_USB2SV2     , MENU_ITEM, &Port_USB2FC   , USB2SV2_de     , USB2SV2_en     );

    #ifdef USE_BLUETOOTH
    if( Config.UseBT )
        MenuCtrl_PushML2_P( ID_BT2SV2      , MENU_ITEM, &Port_BT2FC    , BT2SV2_de      , BT2SV2_en      );
    #endif

    #endif   // end: #ifdef USE_PKTTOOLS_SV2

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

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


//#############################################################################################
//# Menu: Menu_Main
//#############################################################################################

//--------------------------------------------------------------
//--------------------------------------------------------------
void _DefMenu_Main_NC( void )
{


    MenuCtrl_PushML2_P( ID_OSD        , MENU_ITEM, &osd              , OSD_de        , OSD_en         );

    #ifdef USE_OSDDATA
    MenuCtrl_PushML2_P( ID_OSDDATA    , MENU_SUB , &Menu_OSDData     , OSDDATA_de    , OSDDATA_en     );
    #endif

    #ifdef USE_MAINMENU_SEPARATOR
    MenuCtrl_PushSeparator();   // MENUE TRENNLINIE
    #endif

    MenuCtrl_PushML2_P( ID_MKINFO     , MENU_ITEM, NOFUNC            , MKINFO_de     , MKINFO_en      );

    #ifdef USE_MKSETTINGS
    if( MKVersion.paramsetOK )
    {
       MenuCtrl_PushML2_P( ID_MKSETTINGS, MENU_SUB , &MK_Settings   , MKSETTINGS_de, MKSETTINGS_en    );
    }
    #endif

    #ifdef USE_MKDISPLAY
//    ACC_Display = false;
    MenuCtrl_PushML2_P( ID_MKDISPLAY  , MENU_ITEM, &MK_Display       , MKDISPLAY_de  , MKDISPLAY_en   );
    #endif

    #ifdef USE_ACCCALIBRATION
    if ((MKVersion_Cmp( MKVersion.FCVer,  2,9,'i')  == VERSION_EQUAL) || (MKVersion_Cmp( MKVersion.FCVer,  2,9,'i')  == VERSION_GREATER))
      {
        ACC_Display = true;
        MenuCtrl_PushML2_P( ID_MKACCCAL   , MENU_ITEM, &MK_Display       , MKACCCAL_de  , MKACCCAL_en   );
      }
    #endif

    #ifdef USE_MKDEBUGDATA
    MenuCtrl_PushML2_P( ID_MKDEBUGDATA, MENU_ITEM, &MK_DebugData     , MKDEBUGDATA_de, MKDEBUGDATA_en );
    #endif


    #ifdef USE_MKGPSINFO
    MenuCtrl_PushML2_P( ID_MKGPSINFO  , MENU_ITEM, &MK_Gps_Info      , MKGPSINFO_de  , MKGPSINFO_en   );
    #endif

    #ifdef USE_MAINMENU_SEPARATOR
    MenuCtrl_PushSeparator();   // MENUE TRENNLINIE
    #endif

    MenuCtrl_PushML2_P( ID_PKTSPEZIAL , MENU_SUB , &Menu_PKTSpezial  , PKTSPEZIAL_de , PKTSPEZIAL_en  );
    MenuCtrl_PushML2_P( ID_PKTCONNECT , MENU_SUB , &Menu_PKTConnect  , PKTCONNECT_de , PKTCONNECT_en  );
    MenuCtrl_PushML2_P( ID_PKTSETUP   , MENU_SUB , NOFUNC            , PKTSETUP_de   , PKTSETUP_en    );
    MenuCtrl_PushML2_P( ID_PKTINFO    , MENU_ITEM ,&PKT_Info         , PKTINFO_de    , PKTINFO_en     );


    #ifdef DEBUG_PARAMSET
    MenuCtrl_Push_P( 0  , MENU_ITEM, &paramsetDEBUG , DEBUG_PARAMSET_Text  );
    #endif
}



//--------------------------------------------------------------
//--------------------------------------------------------------
void _DefMenu_Main_FC( void )
{
    MenuCtrl_PushML2_P( ID_MKINFO     , MENU_ITEM, NOFUNC            , MKINFO_de     , MKINFO_en      );

    #ifdef USE_MKSETTINGS
    if( MKVersion.paramsetOK )
    {
       MenuCtrl_PushML2_P( ID_MKSETTINGS, MENU_SUB , &MK_Settings   , MKSETTINGS_de, MKSETTINGS_en    );
    }
    #endif



    #ifdef USE_MKDISPLAY
//    ACC_Display = false;
    MenuCtrl_PushML2_P( ID_MKDISPLAY  , MENU_ITEM, &MK_Display       , MKDISPLAY_de  , MKDISPLAY_en   );
    #endif

    #ifdef USE_ACCCALIBRATION
    if ((MKVersion_Cmp( MKVersion.FCVer,  2,9,'i')  == VERSION_EQUAL) || (MKVersion_Cmp( MKVersion.FCVer,  2,9,'i')  == VERSION_GREATER))
      {
        ACC_Display = true;
        MenuCtrl_PushML2_P( ID_MKACCCAL   , MENU_ITEM, &MK_Display       , MKACCCAL_de  , MKACCCAL_en   );
      }
    #endif

    #ifdef USE_MKDEBUGDATA
    MenuCtrl_PushML2_P( ID_MKDEBUGDATA, MENU_ITEM, &MK_DebugData     , MKDEBUGDATA_de, MKDEBUGDATA_en );
    #endif

    #ifdef USE_MAINMENU_SEPARATOR
    MenuCtrl_PushSeparator();   // MENUE TRENNLINIE
    #endif

    MenuCtrl_PushML2_P( ID_PKTSPEZIAL , MENU_SUB , &Menu_PKTSpezial  , PKTSPEZIAL_de , PKTSPEZIAL_en  );
    MenuCtrl_PushML2_P( ID_PKTCONNECT , MENU_SUB , &Menu_PKTConnect  , PKTCONNECT_de , PKTCONNECT_en  );
    MenuCtrl_PushML2_P( ID_PKTSETUP   , MENU_SUB , NOFUNC            , PKTSETUP_de   , PKTSETUP_en    );
    MenuCtrl_PushML2_P( ID_PKTINFO    , MENU_ITEM ,&PKT_Info         , PKTINFO_de    , PKTINFO_en     );


    #ifdef DEBUG_PARAMSET
    MenuCtrl_Push_P( 0  , MENU_ITEM, &paramsetDEBUG , DEBUG_PARAMSET_Text  );
    #endif
}



//--------------------------------------------------------------
//--------------------------------------------------------------
void _DefMenu_Main_NO( void )
{
#ifdef USE_FOLLOWME_STEP2
    MenuCtrl_PushML2_P( ID_DEBUG_GPS  , MENU_ITEM, &Debug_GPS     , PKTGPS_de     , PKTGPS_en      );
#endif

    MenuCtrl_PushML2_P( ID_SEARCHMK  , MENU_ITEM, NOFUNC          , SEARCHMK_de   , SEARCHMK_en    );

    #ifdef USE_MAINMENU_SEPARATOR
    MenuCtrl_PushSeparator();   // MENUE TRENNLINIE
    #endif

    #ifdef USE_OSDDATA
    MenuCtrl_PushML2_P( ID_OSDDATA   , MENU_SUB , &Menu_OSDData   , OSDDATA_de    , OSDDATA_en     );
    #endif

    #ifdef USE_MAINMENU_SEPARATOR
    MenuCtrl_PushSeparator();   // MENUE TRENNLINIE
    #endif

  //MenuCtrl_PushML2_P( ID_PKTSPEZIAL, MENU_SUB , &Menu_PKTSpezial, PKTSPEZIAL_de , PKTSPEZIAL_en  );
    MenuCtrl_PushML2_P( ID_PKTCONNECT, MENU_SUB , &Menu_PKTConnect, PKTCONNECT_de , PKTCONNECT_en  );
    MenuCtrl_PushML2_P( ID_PKTSETUP  , MENU_SUB , NOFUNC          , PKTSETUP_de   , PKTSETUP_en    );
    MenuCtrl_PushML2_P( ID_PKTINFO   , MENU_ITEM, &PKT_Info       , PKTINFO_de    , PKTINFO_en     );


    #ifdef DEBUG_PARAMSET
    MenuCtrl_Push_P( 0  , MENU_ITEM, &paramsetDEBUG , DEBUG_PARAMSET_Text  );
    #endif
}



//--------------------------------------------------------------
//--------------------------------------------------------------
void _ConfigMenu_Main( void )
{
    MenuCtrl_Create();

    MenuCtrl_SetTitle( titlemain );
    //MenuCtrl_SetShowBatt( true );

    //-----------
    // Tasten
    //-----------
    MenuCtrl_SetKey( KEY_ESC       , strGet(OFF), &PKT_SwitchOff );

    MenuCtrl_SetKey( KEY_ENTER_LONG , NOTEXT, &Menu_PKTConnect );

    if     ( MKVersion.isNC )   _DefMenu_Main_NC();
    else if( MKVersion.isFC )   _DefMenu_Main_FC();
    else                        _DefMenu_Main_NO();
}



//--------------------------------------------------------------
//--------------------------------------------------------------
void Menu_Main( void )
{
    uint8_t itemid;
    uint8_t UseBT = Config.UseBT;                       // merkt sich Bluetooth Einstellung falls durch Setup geaendert

    uart1_flush();
    ADC_Init();                                         // ADC für Lipomessung // MartinR hierher verschoben
    get_key_press(KEY_ALL);

    strncpy( &titlemain[5], PKTSWVersion, 12);          // baue Titel mit PKT-Versionsnummer zusammen

    MenuCtrl_ShowLevel( true );                         // zeige Menuelevel in der Titelzeile aller Menues
    _ConfigMenu_Main();                                 // initialisiert das Menu je nach Hardware (NO,FC,NC) verschieden


    //---------------
    // Control
    //---------------
    while( true )
    {
        MenuCtrl_Control( MENUCTRL_EVENT );             // wartet nicht auf Event, springt direkt zurueck (wegen evtl. BT-Aenderung)

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

        //--------------
        // ID_SEARCHMK
        //--------------
        if( itemid == ID_SEARCHMK )                     // neuer Hardware Modus?
        {
            if( searchMK(true) )                        // true = zeige MK_Info() an
            {
                MenuCtrl_Destroy();                     // Menu verwerfen...
                _ConfigMenu_Main();                     // ...und neues Menu initialisieren (je nach Hardware: NO,FC,NC)
            }
        }

        //--------------
        // ID_MKINFO
        //--------------
        if( itemid == ID_MKINFO )
        {
            if( MK_Info( 0, true) )                     // neuer Hardware Modus? (in MK_Info() kann man eine Neusuche des MK starten)  (true = mit Settings-Refresh)
            {
                MenuCtrl_Destroy();                     // Menu verwerfen...
                _ConfigMenu_Main();                     // ...und neues Menu initialisieren (je nach Hardware: NO,FC,NC)
            }
        }

        //--------------
        // ID_PKTSETUP
        //--------------
        if( itemid == ID_PKTSETUP )
        {
            Setup_MAIN();
        }


        //--------------
        // Bluetooth geaendert?
        //--------------
        if( UseBT != Config.UseBT )                     // falls sich im PKT-Setup die Einstellung bzgl. installiertem Bluetooth Modul
        {                                               //   geaendert hat werden ggf. andere Menuepunkte angezeigt (Tracking, FollowMe)
            MenuCtrl_Destroy();                         // Menu verwerfen...
            _ConfigMenu_Main();                         // ...und neues Menu initialisieren (je nach Hardware: NO,FC,NC)
            UseBT = Config.UseBT;
        }
    }

    MenuCtrl_Destroy();
}