Subversion Repositories Projects

Compare Revisions

Ignore whitespace Rev 2135 → Rev 2136

/Transportables_Koptertool/PKT/GPL_PKT_V3_85f/mksettings/mkparameters.c
0,0 → 1,2692
/*****************************************************************************
* 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 mkparameters.c
//#
//# 16.07.2015 Cebra
//# - add: Erweiterung SingleWpControlChannel; (FC2.11a)
//# MenuKeyChannel; (FC2.11a)
//#
//# 09.04.2015 Cebra
//# - add: Erweiterung paramEditItemTable und ID_MENU_KAMERA_Items[] um neue Parameter (FC2.09j)
//# param_ServoNickFailsave, param_ServoRollFailsave, param_Servo3Failsave, param_Servo4Failsave, param_Servo5Failsave
//#
//# 26.01.2015 Cebra
//# - add: Comming Home Ausrichtung hinzugefügt,
//# neue Einstellungen ab FC 209a im Wert ServoCompInvert, Bit4 + Bit5
//#
//# 26.09.2014 Cebra
//# - add: im Menü Höhe -> param_Hoehe_TiltCompensation, FC207d
//#
//# 04.06.2014 OG
//# - chg: MK_Parameters_MenuMain() eine Menue-Trennlinie hinter Favoriten eingefuegt
//#
//# 14.05.2014 OG
//# - chg: include "mkbase.h" geaendert auf "../mk/mkbase.h"
//#
//# 11.05.2014 OG
//# - chg: Menu_Favoriten() umgestellt auf MenuCtrl_SetTitleFromParentItem()
//# - chg: Menu_EditCategory() umgestellt auf MenuCtrl_SetTitleFromParentItem()
//#
//# 10.05.2014 OG
//# - del: editDisableDeclCalc() - wurde ersetzt durch eine Transform-Funktion
//# in paramset.c und wird jetzt von editGeneric() bearbeitet
//#
//# 07.05.2014 OG
//# - chg: Menu_Favoriten() - uebernimmt den gegebenen Menuetitel vom
//# uebergeordneten Eintrag aus mkparameters_messages.h (also Multilanguage)
//# - chg: fav_add() - erweitert um Menue-Separatoren (Trennlinien) aufzunehmen
//# - chg: Menu_EditCategory() umgestellt auf MenuCtrl_PushSeparatorID()
//#
//# 06.05.2014 OG
//# - add: Favoriten-Verwaltung implementiert (Aenderungen an verschiedenen Funktionen)
//#
//# 18.04.2014 OG
//# - fix: im ID_MENU_NAVICTRL fehlten param_NaviStickThreshold ("GPS Stick-Schwelle")
//# und param_NaviGpsMinSat ("Min. Sat")
//#
//# 17.04.2014 OG
//# - add: param_Servo3OnValue, param_Servo3OffValue, param_Servo4OnValue
//# param_Servo4OffValue
//# - add: param_NaviMaxFlyingRange, param_NaviDescendRange
//# - chg: Menu_EditCategory() blendet ggf. doppelt aufeinanderfolgenden
//# Menue-Separatoren aus
//#
//# 30.03.2014 OG
//# - chg: Sprache Hollaendisch vollstaendig entfernt
//# - chg: MenuCtrl_PushML_P() umgestellt auf MenuCtrl_PushML2_P()
//#
//# 29.03.2014 OG
//# - chg: versch. Funktioionen del: MenuCtrl_SetShowBatt() wegen Aenderung Default auf true
//# - add: Unterstuetzung fuer Rev. 100
//# (param_AutoPhotoDistance, param_AutoPhotoAtitudes, param_SingleWpSpeed)
//#
//# 27.03.2014 OG
//# kompletter neuer Code fuer ein erstes Release
//#
//# 23.02.2014 OG
//# - chg: MK_Parameters_Menu() umbenannt zu MK_Parameters()
//#
//# 20.02.2014 OG
//# - chg: MK_Parameters_Menu() meldet "nicht verfügbar"
//#
//# 12.02.2014 OG - NEU
//############################################################################
 
 
#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 <avr/eeprom.h>
#include <util/delay.h>
#include <string.h>
#include <util/atomic.h>
 
//#include "../lipo/lipo.h"
#include "../main.h"
#include "../lipo/lipo.h"
#include "../lcd/lcd.h"
#include "../uart/usart.h"
#include "../utils/menuctrl.h"
#include "../utils/xutils.h"
 
#include "../uart/uart1.h"
#include "../mk-data-structs.h"
//#include "../menu.h"
#include "../timer/timer.h"
#include "../eeprom/eeprom.h"
#include "../messages.h"
#include "../pkt/pkt.h"
#include "../mk/mkbase.h"
#include "paramset.h"
#include "mkparameters.h"
#include "mkparameters_messages.h"
 
 
//#############################################################################################
//# Strukturen; Forward-Deklarationen
//#############################################################################################
 
#define DEBUG_PARAMEDIT // schaltet zusaetzliche Debug-Ausgaben ein
 
#define EOF 255 // End Of File (bzw. end of Table...)
 
#define SEPARATOR 254 // ID fuer einen Separator in einem Menue (Trennlinie)
 
 
#define SCREEN_REFRESH 1 // neuzeichnen/refresh der Anzeige
#define SCREEN_REDRAW 2 // neuzeichnen/refresh der Anzeige
 
 
//--------------------------------------------
// editGenericCode_t
// deklariert ein einzelnes Code-Zeichen fuer Edit-Generic
//--------------------------------------------
typedef struct
{
unsigned char code; // z.B. '0', '1', 'v', 'P', 'C' ... (einzelnes Zeichen aus paramEditItem_t.format )
unsigned char min;
unsigned char max;
const char *shortText_de; //
const char *shortText_en;
const char *longText_de;
const char *longText_en;
} editGenericCode_t;
 
 
 
//---------------------------------------------
//----- globale Modulvariablen
//---------------------------------------------
 
editGenericCode_t genericCode; // Daten eines einzelnen Code-Zeichen (im RAM)
paramEditItem_t paramEditItem; // RAM Buffer: fuer ein Element von paramEditDef
char paramEditFormat[MKPARAM_STRBUFFER_LEN]; // RAM Buffer: fuer 'str' von paramEdit (Format; editGeneric)
char mkparam_strValueBuffer[MKPARAM_STRBUFFER_LEN]; // Anzeige eines Values als Klartext; Kurz (fuer das Menue) oder Lang (in der Edit-Funktion)
 
 
 
//#############################################################################################
//#
//#############################################################################################
 
static const char GENERIC_SHORT_VALUE_de[] PROGMEM = "%3u"; // nur Wert anzeigen - min/max wird uebergeordnet definiert
#define GENERIC_SHORT_VALUE_en GENERIC_SHORT_VALUE_de
#define GENERIC_LONG_VALUE_de GENERIC_SHORT_VALUE_de
#define GENERIC_LONG_VALUE_en GENERIC_SHORT_VALUE_de
//
//static const char GENERIC_SHORT_VALUE_ACCZ_de[] PROGMEM = "%4u"; // nur Wert anzeigen - min/max wird uebergeordnet definiert
//#define GENERIC_SHORT_VALUE_ACCZ_en GENERIC_SHORT_VALUE_ACCZ_de
//#define GENERIC_LONG_VALUE_ACCZ_de GENERIC_SHORT_VALUE_ACCZ_de
//#define GENERIC_LONG_VALUE_ACCZ_en GENERIC_SHORT_VALUE_ACCZ_de
 
 
static const char GENERIC_SHORT_NO_de[] PROGMEM = " N";
#define GENERIC_SHORT_NO_en GENERIC_SHORT_NO_de
static const char GENERIC_LONG_NO_de[] PROGMEM = "Nein";
static const char GENERIC_LONG_NO_en[] PROGMEM = "No";
 
static const char GENERIC_SHORT_YES_de[] PROGMEM = " J";
static const char GENERIC_SHORT_YES_en[] PROGMEM = " Y";
static const char GENERIC_LONG_YES_de[] PROGMEM = "Ja";
static const char GENERIC_LONG_YES_en[] PROGMEM = "Yes";
 
static const char GENERIC_SHORT_POTI_de[] PROGMEM = " P%u";
#define GENERIC_SHORT_POTI_en GENERIC_SHORT_POTI_de
static const char GENERIC_LONG_POTI_de[] PROGMEM = "Poti %u";
#define GENERIC_LONG_POTI_en GENERIC_LONG_POTI_de
 
static const char GENERIC_SHORT_CHANNEL_de[] PROGMEM = "C%2u";
#define GENERIC_SHORT_CHANNEL_en GENERIC_SHORT_CHANNEL_de
static const char GENERIC_LONG_CHANNEL_de[] PROGMEM = "Kanal %u";
static const char GENERIC_LONG_CHANNEL_en[] PROGMEM = "Channel %u";
 
static const char GENERIC_SHORT_SERCHANNEL_de[] PROGMEM = "S%2u";
#define GENERIC_SHORT_SERCHANNEL_en GENERIC_SHORT_SERCHANNEL_de
static const char GENERIC_LONG_SERCHANNEL_de[] PROGMEM = "Ser. Kanal %u";
static const char GENERIC_LONG_SERCHANNEL_en[] PROGMEM = "Ser. Channel %u";
 
static const char GENERIC_SHORT_AUS_de[] PROGMEM = "Aus";
static const char GENERIC_SHORT_AUS_en[] PROGMEM = "Off";
#define GENERIC_LONG_AUS_de GENERIC_SHORT_AUS_de
#define GENERIC_LONG_AUS_en GENERIC_SHORT_AUS_en
 
static const char GENERIC_SHORT_INACTIV_de[] PROGMEM = "Ina";
#define GENERIC_SHORT_INACTIV_en GENERIC_SHORT_INACTIV_de
static const char GENERIC_LONG_INACTIV_de[] PROGMEM = "Inaktiv";
#define GENERIC_LONG_INACTIV_en GENERIC_LONG_INACTIV_de
 
static const char GENERIC_SHORT_WPEVENT_de[] PROGMEM = "WPE";
#define GENERIC_SHORT_WPEVENT_en GENERIC_SHORT_WPEVENT_de
static const char GENERIC_LONG_WPEVENT_de[] PROGMEM = "WP-Event";
#define GENERIC_LONG_WPEVENT_en GENERIC_LONG_WPEVENT_de
 
static const char GENERIC_SHORT_MINIMUM_de[] PROGMEM = "Min";
#define GENERIC_SHORT_MINIMUM_en GENERIC_SHORT_MINIMUM_de
static const char GENERIC_LONG_MINIMUM_de[] PROGMEM = "Minimum";
#define GENERIC_LONG_MINIMUM_en GENERIC_LONG_MINIMUM_de
 
static const char GENERIC_SHORT_MIDDLE_de[] PROGMEM = "Mid";
#define GENERIC_SHORT_MIDDLE_en GENERIC_SHORT_MIDDLE_de
static const char GENERIC_LONG_MIDDLE_de[] PROGMEM = "Mitte";
static const char GENERIC_LONG_MIDDLE_en[] PROGMEM = "Middle";
 
static const char GENERIC_SHORT_MAXIMUM_de[] PROGMEM = "Max";
#define GENERIC_SHORT_MAXIMUM_en GENERIC_SHORT_MAXIMUM_de
static const char GENERIC_LONG_MAXIMUM_de[] PROGMEM = "Maximum";
#define GENERIC_LONG_MAXIMUM_en GENERIC_LONG_MAXIMUM_de
 
static const char GENERIC_SHORT_AN_de[] PROGMEM = " An";
static const char GENERIC_SHORT_AN_en[] PROGMEM = " On";
#define GENERIC_LONG_AN_de GENERIC_SHORT_AN_de
#define GENERIC_LONG_AN_en GENERIC_SHORT_AN_en
 
static const char GENERIC_SHORT_FREE_de[] PROGMEM = "Fre"; // z.b. "GPS Modus Steuerung"
#define GENERIC_SHORT_FREE_en GENERIC_SHORT_FREE_de
static const char GENERIC_LONG_FREE_de[] PROGMEM = "Free";
#define GENERIC_LONG_FREE_en GENERIC_LONG_FREE_de
 
static const char GENERIC_SHORT_CH_de[] PROGMEM = " CH"; // z.b. "GPS Modus Steuerung"
#define GENERIC_SHORT_CH_en GENERIC_SHORT_CH_de
static const char GENERIC_LONG_CH_de[] PROGMEM = "Coming Home (CH)";
#define GENERIC_LONG_CH_en GENERIC_LONG_CH_de
 
static const char GENERIC_SHORT_PH_de[] PROGMEM = " PH"; // z.b. "GPS Modus Steuerung"
#define GENERIC_SHORT_PH_en GENERIC_SHORT_PH_de
static const char GENERIC_LONG_PH_de[] PROGMEM = "Position Hold (PH)";
#define GENERIC_LONG_PH_en GENERIC_LONG_PH_de
 
static const char GENERIC_SHORT_DISABLED_de[] PROGMEM = "Dis"; // z.b. "Auto Start / Land"
#define GENERIC_SHORT_DISABLED_en GENERIC_SHORT_DISABLED_de
static const char GENERIC_LONG_DISABLED_de[] PROGMEM = "Disabled";
#define GENERIC_LONG_DISABLED_en GENERIC_LONG_DISABLED_de
 
static const char GENERIC_SHORT_OUT_de[] PROGMEM = "Ou%1u"; // z.B. Servo 3 und Servo 4
#define GENERIC_SHORT_OUT_en GENERIC_SHORT_OUT_de
static const char GENERIC_LONG_OUT_de[] PROGMEM = "Out %1u";
#define GENERIC_LONG_OUT_en GENERIC_LONG_OUT_de
 
static const char GENERIC_SHORT_CH_OR_NC_de[] PROGMEM = "kÄn";
static const char GENERIC_SHORT_CH_OR_NC_en[] PROGMEM = "nCh";
static const char GENERIC_LONG_CH_OR_NC_de[] PROGMEM = "Keine Änderung";
static const char GENERIC_LONG_CH_OR_NC_en[] PROGMEM = "no change";
 
static const char GENERIC_SHORT_CH_OR_FH_de[] PROGMEM = "FzH";
static const char GENERIC_SHORT_CH_OR_FH_en[] PROGMEM = "FtH";
static const char GENERIC_LONG_CH_OR_FH_de[] PROGMEM = "Front zu Home";
static const char GENERIC_LONG_CH_OR_FH_en[] PROGMEM = "front to home";
 
static const char GENERIC_SHORT_CH_OR_RH_de[] PROGMEM = "HzH";
static const char GENERIC_SHORT_CH_OR_RH_en[] PROGMEM = "RtH";
static const char GENERIC_LONG_CH_OR_RH_de[] PROGMEM = "Heck zu Home";
static const char GENERIC_LONG_CH_OR_RH_en[] PROGMEM = "rear to home";
 
static const char GENERIC_SHORT_CH_OR_SO_de[] PROGMEM = "wSt";
static const char GENERIC_SHORT_CH_OR_SO_en[] PROGMEM = "sOr";
static const char GENERIC_LONG_CH_OR_SO_de[] PROGMEM = "wie beim Start";
static const char GENERIC_LONG_CH_OR_SO_en[] PROGMEM = "same as start";
 
 
 
//------------------------------------------------
 
 
 
/*************************************************
//-------------
// ZUR INFO
//-------------
typedef struct
{
unsigned char code; // '0', '1', 'v', 'P', 'C' ...
unsigned char min;
unsigned char max;
const char *shortText_de;
const char *shortText_en;
const char *longText_de;
const char *longText_en;
} editGenericCode_t;
*************************************************/
 
// Anmerkung: kann bei Bedarf evtl. zu PROGMEM umschreiben
//editGenericCode_t const editGenericCode[] PROGMEM =
 
editGenericCode_t editGenericCode[] =
{
{ 'v', 0, 0, GENERIC_SHORT_VALUE_de, GENERIC_SHORT_VALUE_en, GENERIC_LONG_VALUE_de, GENERIC_LONG_VALUE_en }, // nur Wert anzeigen - min/max wird uebergeordnet definiert
// { 'z', 0, 0, GENERIC_SHORT_VALUE_ACCZ_de, GENERIC_SHORT_VALUE_ACCZ_en, GENERIC_LONG_VALUE_ACCZ_de, GENERIC_LONG_VALUE_ACCZ_en }, // nur Wert anzeigen x 4- min/max wird uebergeordnet definiert
{ '0', 0, 0, GENERIC_SHORT_NO_de, GENERIC_SHORT_NO_en, GENERIC_LONG_NO_de, GENERIC_LONG_NO_en },
{ '1', 1, 1, GENERIC_SHORT_YES_de, GENERIC_SHORT_YES_en, GENERIC_LONG_YES_de, GENERIC_LONG_YES_en },
{ 'P', 255,248, GENERIC_SHORT_POTI_de, GENERIC_SHORT_POTI_en, GENERIC_LONG_POTI_de, GENERIC_LONG_POTI_en },
{ 'C', 1, 16, GENERIC_SHORT_CHANNEL_de, GENERIC_SHORT_CHANNEL_en, GENERIC_LONG_CHANNEL_de, GENERIC_LONG_CHANNEL_en },
{ 'S', 17, 28, GENERIC_SHORT_SERCHANNEL_de, GENERIC_SHORT_SERCHANNEL_en, GENERIC_LONG_SERCHANNEL_de, GENERIC_LONG_SERCHANNEL_en },
{ 'A', 0, 0, GENERIC_SHORT_AUS_de, GENERIC_SHORT_AUS_en, GENERIC_LONG_AUS_de, GENERIC_LONG_AUS_en },
{ 'I', 0, 0, GENERIC_SHORT_INACTIV_de, GENERIC_SHORT_INACTIV_en, GENERIC_LONG_INACTIV_de, GENERIC_LONG_INACTIV_en },
{ 'W', 29, 29, GENERIC_SHORT_WPEVENT_de, GENERIC_SHORT_WPEVENT_en, GENERIC_LONG_WPEVENT_de, GENERIC_LONG_WPEVENT_en },
{ 'U', 30, 30, GENERIC_SHORT_MINIMUM_de, GENERIC_SHORT_MINIMUM_en, GENERIC_LONG_MINIMUM_de, GENERIC_LONG_MINIMUM_en },
{ 'M', 31, 31, GENERIC_SHORT_MIDDLE_de, GENERIC_SHORT_MIDDLE_en, GENERIC_LONG_MIDDLE_de, GENERIC_LONG_MIDDLE_en },
{ 'X', 32, 32, GENERIC_SHORT_MAXIMUM_de, GENERIC_SHORT_MAXIMUM_en, GENERIC_LONG_MAXIMUM_de, GENERIC_LONG_MAXIMUM_en },
{ 'O', 30, 30, GENERIC_SHORT_AUS_de, GENERIC_SHORT_AUS_en, GENERIC_LONG_AUS_de, GENERIC_LONG_AUS_en }, // ein weiteres "Aus"; z.b. "Motors-Sicherheitsschalter"
{ 'N', 31, 31, GENERIC_SHORT_AN_de, GENERIC_SHORT_AN_en, GENERIC_LONG_AN_de, GENERIC_LONG_AN_en }, // z.b. "Carefree"
{ 'F', 30, 30, GENERIC_SHORT_FREE_de, GENERIC_SHORT_FREE_en, GENERIC_LONG_FREE_de, GENERIC_LONG_FREE_en }, // Free - z.b. "Carefree"
{ 'H', 31, 31, GENERIC_SHORT_CH_de, GENERIC_SHORT_CH_en, GENERIC_LONG_CH_de, GENERIC_LONG_CH_en }, // Coming Home - z.b. "Carefree"
{ 'Q', 32, 32, GENERIC_SHORT_PH_de, GENERIC_SHORT_PH_en, GENERIC_LONG_PH_de, GENERIC_LONG_PH_en }, // Positiosn Hold - z.b. "Carefree"
{ 'D', 0, 0, GENERIC_SHORT_DISABLED_de, GENERIC_SHORT_DISABLED_en, GENERIC_LONG_DISABLED_de, GENERIC_LONG_DISABLED_en }, // Inaktiv - z.b. "Auto Start / Land"
{ 'T', 247,246, GENERIC_SHORT_OUT_de, GENERIC_SHORT_OUT_en, GENERIC_LONG_OUT_de, GENERIC_LONG_OUT_en },
{ 'K', 0, 0, GENERIC_SHORT_CH_OR_NC_de, GENERIC_SHORT_CH_OR_NC_en, GENERIC_LONG_CH_OR_NC_de, GENERIC_LONG_CH_OR_NC_en }, // CommingHome Orientation,
{ 'V', 1, 1, GENERIC_SHORT_CH_OR_FH_de, GENERIC_SHORT_CH_OR_FH_en, GENERIC_LONG_CH_OR_FH_de, GENERIC_LONG_CH_OR_FH_en }, // CommingHome Orientation,
{ 'R', 2, 2, GENERIC_SHORT_CH_OR_RH_de, GENERIC_SHORT_CH_OR_RH_en, GENERIC_LONG_CH_OR_RH_de, GENERIC_LONG_CH_OR_RH_en }, // CommingHome Orientation,
{ 'G', 3, 3, GENERIC_SHORT_CH_OR_SO_de, GENERIC_SHORT_CH_OR_SO_en, GENERIC_LONG_CH_OR_SO_de, GENERIC_LONG_CH_OR_SO_en }, // CommingHome Orientation,
 
{ EOF, 0, 0, 0,0,0,0 } // END OF LIST - MUST BE THE LAST!!
};
 
 
 
 
 
 
 
//#############################################################################################
//#
//#############################################################################################
 
 
static const char GENERIC_NoYes[] PROGMEM = "01"; // Nein, Ja (z.B. (fast) alle Checkboxen)
static const char GENERIC_Value[] PROGMEM = "v"; // value mit min,max aus paramEditItem (in paramEditItemTable) (z.B. Nick/Roll P (0..20) / Min. Gas (0..247) )
static const char GENERIC_ValueACCZ[] PROGMEM = "D"; // value mit min,max aus paramEditItem (in paramEditItemTable) x 4 (ACC Z Landing pulse )
static const char GENERIC_ValuePoti[] PROGMEM = "vP"; // value, Poti (z.B. Gyro Gier P)
static const char GENERIC_ValueOutPoti[] PROGMEM = "vTP"; // value, Out, Poti (z.B. Servo 3 & 4)
static const char GENERIC_Cannel[] PROGMEM = "C"; // Channel (z.B. Gas / Gier / Nick / Roll)
static const char GENERIC_AusChSerWpeMMM[] PROGMEM = "ACSWUMX"; // Aus, Channel, Ser. Channel, WP Event, Minimum, Mitte, Maximum (z.B. Poti 1..8)
static const char GENERIC_DisChSerWpeOff[] PROGMEM = "DCSWO"; // Disabled, Channel, Ser. Channel, WP Event, Off (z.B. Motors-Sicherheitsschalter)
static const char GENERIC_DisChSerWpeOffOn[] PROGMEM = "DCSWON"; // Disabled, Channel, Ser. Channel, WP Event, Off, On (z.B. Carefree)
static const char GENERIC_DisChSerWpeFreeCHPH[] PROGMEM = "DCSWFHQ"; // Disabled, Channel, Ser. Channel, WP Event, Free, CH, PH (z.B. GPS Modus Steuerung)
static const char GENERIC_DisChSer[] PROGMEM = "DCS"; // Disabled, Channel, Ser. Channel (z.B. Auto Start / Land)
static const char GENERIC_CH_Orientation[] PROGMEM = "KVRG"; // Keine Änderung, vorne Home, Heck Home, gleiche Richtung (Comming Home Orientation
static const char GENERIC_InaChSerWpeMMM[] PROGMEM = "ICSWUMX"; // Inactiv, Channel, Ser. Channel, WP Event, Minimum, Mitte, Maximum(z.B. Menu Key Channel
 
 
 
 
/*************************************************
//-------------
// ZUR INFO
//-------------
typedef struct
{
unsigned char paramID; // paramID aus paramset.h
void (*editfunc)(unsigned char paramID, uint8_t cmd); // Edit-Funktion - z.B. editGeneric(); cmd = MKPARAM_EDIT oder MKPARAM_SHORTVALUE
const char *format; // Parameter: String (PROGMEM) (vorallem fuer editGeneric() )
unsigned char min; // Parameter: min (P1)
unsigned char max; // Parameter: max (P2)
const char *title_de; // Text in PROGMEM - Menuetext und Beschreibung im Edit-Screen
const char *title_en; // Text in PROGMEM
} paramEditItem_t;
*************************************************/
 
//----------------------
// HINWEIS!
// Die unten stehende Aufgliederung in die verschiedenen Menue-Bereiche ist nur zur ORIENTIERUNG!
// Jede paramID wird nur EINMAL deklariert - die Zuordnung in die Menues erfolgt in den
// nachfolgenden ID_MENU_xyz_Items Strukturen!
//----------------------
paramEditItem_t const paramEditItemTable[] PROGMEM =
{
//-----------------------------------
// Menue: ID_MENU_KANAELE (Kanäle)
//-----------------------------------
{ param_Kanalbelegung_Gas , &editGeneric, GENERIC_Cannel , 0, 0, param_Kanalbelegung_Gas_de, param_Kanalbelegung_Gas_en },
{ param_Kanalbelegung_Gear , &editGeneric, GENERIC_Cannel , 0, 0, param_Kanalbelegung_Gear_de, param_Kanalbelegung_Gear_en },
{ param_Kanalbelegung_Nick , &editGeneric, GENERIC_Cannel , 0, 0, param_Kanalbelegung_Nick_de, param_Kanalbelegung_Nick_en },
{ param_Kanalbelegung_Roll , &editGeneric, GENERIC_Cannel , 0, 0, param_Kanalbelegung_Roll_de, param_Kanalbelegung_Roll_en },
{ param_Kanalbelegung_Poti1 , &editGeneric, GENERIC_AusChSerWpeMMM , 0, 0, param_Kanalbelegung_Poti1_de, param_Kanalbelegung_Poti1_en },
{ param_Kanalbelegung_Poti2 , &editGeneric, GENERIC_AusChSerWpeMMM , 0, 0, param_Kanalbelegung_Poti2_de, param_Kanalbelegung_Poti2_en },
{ param_Kanalbelegung_Poti3 , &editGeneric, GENERIC_AusChSerWpeMMM , 0, 0, param_Kanalbelegung_Poti3_de, param_Kanalbelegung_Poti3_en },
{ param_Kanalbelegung_Poti4 , &editGeneric, GENERIC_AusChSerWpeMMM , 0, 0, param_Kanalbelegung_Poti4_de, param_Kanalbelegung_Poti4_en },
{ param_Kanalbelegung_Poti5 , &editGeneric, GENERIC_AusChSerWpeMMM , 0, 0, param_Kanalbelegung_Poti5_de, param_Kanalbelegung_Poti5_en },
{ param_Kanalbelegung_Poti6 , &editGeneric, GENERIC_AusChSerWpeMMM , 0, 0, param_Kanalbelegung_Poti6_de, param_Kanalbelegung_Poti6_en },
{ param_Kanalbelegung_Poti7 , &editGeneric, GENERIC_AusChSerWpeMMM , 0, 0, param_Kanalbelegung_Poti7_de, param_Kanalbelegung_Poti7_en },
{ param_Kanalbelegung_Poti8 , &editGeneric, GENERIC_AusChSerWpeMMM , 0, 0, param_Kanalbelegung_Poti8_de, param_Kanalbelegung_Poti8_en },
{ param_MotorSafetySwitch , &editGeneric, GENERIC_DisChSerWpeOff , 0, 0, param_MotorSafetySwitch_de, param_MotorSafetySwitch_en },
{ param_GlobalConfig3_MotorSwitchMode , &editGeneric, GENERIC_NoYes , 0, 0, param_GlobalConfig3_MotorSwitchMode_de, param_GlobalConfig3_MotorSwitchMode_en },
{ param_ExtraConfig_SensitiveRc , &editGeneric, GENERIC_NoYes , 0, 0, param_ExtraConfig_SensitiveRc_de, param_ExtraConfig_SensitiveRc_en },
{ param_GlobalConfig3_SpeakAll , &editGeneric, GENERIC_NoYes , 0, 0, param_GlobalConfig3_SpeakAll_de, param_GlobalConfig3_SpeakAll_en },
 
 
//-----------------------------------
// Menue: ID_MENU_KONFIGURATION (Konfiguration)
//-----------------------------------
{ param_GlobalConfig_HoehenRegelung , &editGeneric, GENERIC_NoYes , 0, 0, param_GlobalConfig_HoehenRegelung_de, param_GlobalConfig_HoehenRegelung_en },
{ param_GlobalConfig_GpsAktiv , &editGeneric, GENERIC_NoYes , 0, 0, param_GlobalConfig_GpsAktiv_de, param_GlobalConfig_GpsAktiv_en },
{ param_GlobalConfig_KompassAktiv , &editGeneric, GENERIC_NoYes , 0, 0, param_GlobalConfig_KompassAktiv_de, param_GlobalConfig_KompassAktiv_en },
{ param_GlobalConfig_KompassFix , &editGeneric, GENERIC_NoYes , 0, 0, param_GlobalConfig_KompassFix_de, param_GlobalConfig_KompassFix_en },
// param_ExtraConfig_SensitiveRc
{ param_GlobalConfig_AchsenkopplungAktiv , &editGeneric, GENERIC_NoYes , 0, 0, param_GlobalConfig_AchsenkopplungAktiv_de, param_GlobalConfig_AchsenkopplungAktiv_en },
{ param_GlobalConfig_DrehratenBegrenzer , &editGeneric, GENERIC_NoYes , 0, 0, param_GlobalConfig_DrehratenBegrenzer_de, param_GlobalConfig_DrehratenBegrenzer_en },
{ param_GlobalConfig_HeadingHold , &editGeneric, GENERIC_NoYes , 0, 0, param_GlobalConfig_HeadingHold_de, param_GlobalConfig_HeadingHold_en },
 
 
//-----------------------------------
// Menue: ID_MENU_STICK (Stick)
//-----------------------------------
{ param_Stick_P , &editGeneric, GENERIC_Value , 0, 20, param_Stick_P_de, param_Stick_P_en },
{ param_Stick_D , &editGeneric, GENERIC_Value , 0, 20, param_Stick_D_de, param_Stick_D_en },
{ param_StickGier_P , &editGeneric, GENERIC_ValuePoti , 0, 247, param_Gyro_Gier_P_de, param_Gyro_Gier_P_en },
{ param_ExternalControl , &editGeneric, GENERIC_ValuePoti , 0, 247, param_ExternalControl_de, param_ExternalControl_en },
 
 
//-----------------------------------
// Menue: ID_MENU_LOOPING (Looping)
//-----------------------------------
{ param_BitConfig_LoopOben , &editGeneric, GENERIC_NoYes , 0, 0, param_BitConfig_LoopOben_de, param_BitConfig_LoopOben_en },
{ param_BitConfig_LoopUnten , &editGeneric, GENERIC_NoYes , 0, 0, param_BitConfig_LoopUnten_de, param_BitConfig_LoopUnten_en },
{ param_BitConfig_LoopLinks , &editGeneric, GENERIC_NoYes , 0, 0, param_BitConfig_LoopLinks_de, param_BitConfig_LoopLinks_en },
{ param_BitConfig_LoopRechts , &editGeneric, GENERIC_NoYes , 0, 0, param_BitConfig_LoopRechts_de, param_BitConfig_LoopRechts_en },
{ param_LoopGasLimit , &editGeneric, GENERIC_ValuePoti , 0, 247, param_LoopGasLimit_de, param_LoopGasLimit_en },
{ param_LoopThreshold , &editGeneric, GENERIC_Value , 0, 247, param_LoopThreshold_de, param_LoopThreshold_en },
{ param_LoopHysterese , &editGeneric, GENERIC_Value , 0, 247, param_LoopHysterese_de, param_LoopHysterese_en },
{ param_WinkelUmschlagNick , &editGeneric, GENERIC_Value , 0, 247, param_WinkelUmschlagNick_de, param_WinkelUmschlagNick_en },
{ param_WinkelUmschlagRoll , &editGeneric, GENERIC_Value , 0, 247, param_WinkelUmschlagRoll_de, param_WinkelUmschlagRoll_en },
 
 
//-----------------------------------
// Menue: ID_MENU_HOEHE (Höhe)
//-----------------------------------
{ param_GlobalConfig_HoehenRegelung , &editGeneric, GENERIC_NoYes , 0, 0, param_GlobalConfig_HoehenRegelung_de, param_GlobalConfig_HoehenRegelung_en},
{ param_ExtraConfig_HeightLimit , &editGeneric, GENERIC_NoYes , 0, 0, param_ExtraConfig_HeightLimit_de, param_ExtraConfig_HeightLimit_en },
{ param_ExtraConfig_HeightVario , &editGeneric, GENERIC_NoYes , 0, 0, param_ExtraConfig_HeightVario_de, param_ExtraConfig_HeightVario_en }, // negiertes param_ExtraConfig_HeightLimit
{ param_GlobalConfig_HoehenSchalter , &editGeneric, GENERIC_NoYes , 0, 0, param_GlobalConfig_HoehenSchalter_de, param_GlobalConfig_HoehenSchalter_en},
{ param_ExtraConfig_VarioBeep , &editGeneric, GENERIC_NoYes , 0, 0, param_ExtraConfig_VarioBeep_de, param_ExtraConfig_VarioBeep_en },
{ param_HoeheChannel , &editGeneric, GENERIC_DisChSerWpeOffOn, 0, 0, param_HoeheChannel_de, param_HoeheChannel_en },
{ param_Hoehe_MinGas , &editGeneric, GENERIC_Value , 0, 247, param_Hoehe_MinGas_de, param_Hoehe_MinGas_en },
{ param_Hoehe_P , &editGeneric, GENERIC_ValuePoti , 0, 247, param_Hoehe_P_de, param_Hoehe_P_en },
{ param_Luftdruck_D , &editGeneric, GENERIC_ValuePoti , 0, 247, param_Luftdruck_D_de, param_Luftdruck_D_en },
{ param_Hoehe_ACC_Wirkung , &editGeneric, GENERIC_ValuePoti , 0, 247, param_Hoehe_ACC_Wirkung_de, param_Hoehe_ACC_Wirkung_en },
{ param_MaxAltitude , &editGeneric, GENERIC_ValuePoti , 0, 247, param_MaxAltitude_de, param_MaxAltitude_en },
{ param_Hoehe_Verstaerkung , &editGeneric, GENERIC_Value , 0, 247, param_Hoehe_Verstaerkung_de, param_Hoehe_Verstaerkung_en },
{ param_Hoehe_HoverBand , &editGeneric, GENERIC_Value , 0, 247, param_Hoehe_HoverBand_de, param_Hoehe_HoverBand_en },
{ param_Hoehe_GPS_Z , &editGeneric, GENERIC_ValuePoti , 0, 247, param_Hoehe_GPS_Z_de, param_Hoehe_GPS_Z_en },
{ param_Hoehe_TiltCompensation , &editGeneric, GENERIC_ValuePoti , 0, 247, param_Hoehe_Tilt_Comp_de, param_Hoehe_Tilt_Comp_en },
{ param_Hoehe_StickNeutralPoint , &editGeneric, GENERIC_Value , 0, 160, param_Hoehe_StickNeutralPoint_de, param_Hoehe_StickNeutralPoint_en },
{ param_StartLandChannel , &editGeneric, GENERIC_DisChSer , 0, 0, param_StartLandChannel_de, param_StartLandChannel_en },
{ param_LandingSpeed , &editGeneric, GENERIC_Value , 0, 247, param_LandingSpeed_de, param_LandingSpeed_en },
{ param_LandingPulse , &editACCZLandingPulse, GENERIC_ValueACCZ , 0, 0, param_LandingPulse_de, param_LandingPulse_en },
 
 
//-----------------------------------
// Menue: ID_MENU_KAMERA (Kamera)
//-----------------------------------
{ param_ServoNickControl , &editGeneric, GENERIC_ValuePoti , 0, 247, param_ServoNickControl_de, param_ServoNickControl_en },
{ param_ServoNickComp , &editGeneric, GENERIC_ValuePoti , 0, 247, param_ServoNickComp_de, param_ServoNickComp_en },
{ param_ServoNickFailsave , &editGeneric, GENERIC_Value , 0, 247, param_ServoNickFails_de, param_ServoNickFails_en },
{ param_GlobalConfig3_ServoNickCompOff , &editGeneric, GENERIC_NoYes , 0, 0, param_GlobalConfig3_ServoNickCompOff_de, param_GlobalConfig3_ServoNickCompOff_en }, // TODO: pruefen: ab welcher Version ist das drin ???
{ param_ServoCompInvert_SERVO_NICK_INV , &editGeneric, GENERIC_NoYes , 0, 0, param_ServoCompInvert_SVNick_de, param_ServoCompInvert_SVNick_en },
{ param_ServoCompInvert_SERVO_RELATIVE , &editGeneric, GENERIC_NoYes , 0, 0, param_ServoCompInvert_SVRelMov_de, param_ServoCompInvert_SVRelMov_en },
{ param_ServoNickMin , &editGeneric, GENERIC_Value , 0, 247, param_ServoNickMin_de, param_ServoNickMin_en },
{ param_ServoNickMax , &editGeneric, GENERIC_Value , 0, 247, param_ServoNickMax_de, param_ServoNickMax_en },
{ param_ServoFilterNick , &editGeneric, GENERIC_Value , 0, 25, param_ServoFilterNick_de, param_ServoFilterNick_en },
{ param_ServoRollControl , &editGeneric, GENERIC_ValuePoti , 0, 247, param_ServoRollControl_de, param_ServoRollControl_en },
{ param_ServoRollComp , &editGeneric, GENERIC_ValuePoti , 0, 247, param_ServoRollComp_de, param_ServoRollComp_en },
{ param_ServoRollFailsave , &editGeneric, GENERIC_Value , 0, 247, param_ServoRollFails_de, param_ServoRollFails_en },
{ param_ServoCompInvert_SERVO_ROLL_INV , &editGeneric, GENERIC_NoYes , 0, 0, param_ServoCompInvert_SVRoll_de, param_ServoCompInvert_SVRoll_en },
{ param_ServoRollMin , &editGeneric, GENERIC_Value , 0, 247, param_ServoRollMin_de, param_ServoRollMin_en },
{ param_ServoRollMax , &editGeneric, GENERIC_Value , 0, 247, param_ServoRollMax_de, param_ServoRollMax_en },
{ param_ServoFilterRoll , &editGeneric, GENERIC_Value , 0, 25, param_ServoFilterRoll_de, param_ServoFilterRoll_en },
{ param_ServoNickRefresh , &editGeneric, GENERIC_Value , 2, 8, param_ServoNickRefresh_de, param_ServoNickRefresh_en },
{ param_ServoManualControlSpeed , &editGeneric, GENERIC_Value , 0, 247, param_ServoManualControlSpeed_de, param_ServoManualControlSpeed_en },
{ param_Servo3 , &editGeneric, GENERIC_ValueOutPoti , 0, 245, param_Servo3_de, param_Servo3_en },
{ param_Servo3Failsave , &editGeneric, GENERIC_Value , 0, 247, param_Servo3Fails_de, param_Servo3Fails_en },
{ param_Servo4 , &editGeneric, GENERIC_ValueOutPoti , 0, 245, param_Servo4_de, param_Servo4_en },
{ param_Servo4Failsave , &editGeneric, GENERIC_Value , 0, 247, param_Servo4Fails_de, param_Servo4Fails_en },
{ param_Servo5 , &editGeneric, GENERIC_ValuePoti , 0, 247, param_Servo5_de, param_Servo5_en },
{ param_Servo5Failsave , &editGeneric, GENERIC_Value , 0, 247, param_Servo5Fails_de, param_Servo5Fails_en },
 
{ param_Servo3OnValue , &editGeneric, GENERIC_Value , 0, 247, param_Servo3OnValue_de, param_Servo3OnValue_en },
{ param_Servo3OffValue , &editGeneric, GENERIC_Value , 0, 247, param_Servo3OffValue_de, param_Servo3OffValue_en },
{ param_Servo4OnValue , &editGeneric, GENERIC_Value , 0, 247, param_Servo4OnValue_de, param_Servo4OnValue_en },
{ param_Servo4OffValue , &editGeneric, GENERIC_Value , 0, 247, param_Servo4OffValue_de, param_Servo4OffValue_en },
//{ param_CamOrientation , &editNA , 0 , 0, 0, param_CamOrientation_de, param_CamOrientation_en }, // wird evtl. nicht mehr unterstuetzt
 
 
//-----------------------------------
// Menue: ID_MENU_NAVICTRL (NaviCtrl)
//-----------------------------------
{ param_GlobalConfig_GpsAktiv , &editGeneric, GENERIC_NoYes , 0, 0, param_GlobalConfig_GpsAktiv_de, param_GlobalConfig_GpsAktiv_en },
{ param_NaviGpsModeChannel , &editGeneric, GENERIC_DisChSerWpeFreeCHPH , 0, 0, param_NaviGpsModeChannel_de, param_NaviGpsModeChannel_en },
{ param_NaviGpsGain , &editGeneric, GENERIC_ValuePoti , 0, 247, param_NaviGpsGain_de, param_NaviGpsGain_en },
{ param_NaviStickThreshold , &editGeneric, GENERIC_Value , 0, 247, param_NaviStickThreshold_de, param_NaviStickThreshold_en },
{ param_NaviGpsMinSat , &editGeneric, GENERIC_Value , 0, 247, param_NaviGpsMinSat_de, param_NaviGpsMinSat_en },
{ param_NaviGpsP , &editGeneric, GENERIC_ValuePoti , 0, 247, param_NaviGpsP_de, param_NaviGpsP_en },
{ param_NaviGpsI , &editGeneric, GENERIC_ValuePoti , 0, 247, param_NaviGpsI_de, param_NaviGpsI_en },
{ param_NaviGpsD , &editGeneric, GENERIC_ValuePoti , 0, 247, param_NaviGpsD_de, param_NaviGpsD_en },
{ param_NaviGpsPLimit , &editGeneric, GENERIC_ValuePoti , 0, 247, param_NaviGpsPLimit_de, param_NaviGpsPLimit_en },
{ param_NaviGpsILimit , &editGeneric, GENERIC_ValuePoti , 0, 247, param_NaviGpsILimit_de, param_NaviGpsILimit_en },
{ param_NaviGpsDLimit , &editGeneric, GENERIC_ValuePoti , 0, 247, param_NaviGpsDLimit_de, param_NaviGpsDLimit_en },
{ param_NaviGpsA , &editGeneric, GENERIC_ValuePoti , 0, 247, param_NaviGpsA_de, param_NaviGpsA_en },
{ param_NaviWindCorrection , &editGeneric, GENERIC_ValuePoti , 0, 247, param_NaviWindCorrection_de, param_NaviWindCorrection_en },
{ param_NaviAccCompensation , &editGeneric, GENERIC_ValuePoti , 0, 247, param_NaviAccCompensation_de, param_NaviAccCompensation_en },
{ param_NaviMaxFlyingRange , &editGeneric, GENERIC_Value , 0, 250, param_NaviMaxFlyingRange_de, param_NaviMaxFlyingRange_en },
{ param_NaviOperatingRadius , &editGeneric, GENERIC_ValuePoti , 0, 247, param_NaviOperatingRadius_de, param_NaviOperatingRadius_en },
{ param_NaviAngleLimitation , &editGeneric, GENERIC_ValuePoti , 0, 247, param_NaviAngleLimitation_de, param_NaviAngleLimitation_en },
{ param_NaviPH_LoginTime , &editGeneric, GENERIC_Value , 0, 247, param_NaviPH_LoginTime_de, param_NaviPH_LoginTime_en },
{ param_ExtraConfig_GpsAid , &editGeneric, GENERIC_NoYes , 0, 0, param_ExtraConfig_GpsAid_de, param_ExtraConfig_GpsAid_en },
{ param_GlobalConfig3_DphMaxRadius , &editGeneric, GENERIC_NoYes , 0, 0, param_GlobalConfig3_DphMaxRadius_de, param_GlobalConfig3_DphMaxRadius_en },
{ param_ComingHomeAltitude , &editGeneric, GENERIC_Value , 0, 247, param_ComingHomeAltitude_de, param_ComingHomeAltitude_en },
{ param_ComingHomeOrientation , &editGeneric, GENERIC_CH_Orientation , 0, 3, param_ComingHomeOrientation_de, param_ComingHomeOrientation_en },
{ param_SingleWpControlChannel , &editGeneric, GENERIC_InaChSerWpeMMM , 0, 0, param_SingleWpControlChannel_de, param_SingleWpControlChannel_en }, //ab Rev.106
{ param_MenuKeyChannel , &editGeneric, GENERIC_InaChSerWpeMMM , 0, 0, param_MenuKeyChannel_de, param_MenuKeyChannel_en },
{ param_SingleWpSpeed , &editGeneric, GENERIC_ValuePoti , 0, 247, param_SingleWpSpeed_de, param_SingleWpSpeed_en }, // ab Rev. 100
{ param_NaviDescendRange , &editGeneric, GENERIC_Value , 0, 250, param_NaviDescendRange_de, param_NaviDescendRange_en },
 
 
//-----------------------------------
// Menue: ID_MENU_AUSGAENGE (Ausgänge)
//-----------------------------------
{ param_J16Bitmask , &editBitmask, 0 , 0, 0, param_J16Bitmask_de, param_J16Bitmask_en },
{ param_J16Timing , &editGeneric, GENERIC_ValuePoti , 0, 247, param_J16Timing_de, param_J16Timing_en },
{ param_BitConfig_MotorBlink1 , &editGeneric, GENERIC_NoYes , 0, 0, param_BitConfig_MotorBlink1_de, param_BitConfig_MotorBlink1_en }, // "nur nach Start der Motoren aktiv"
{ param_BitConfig_MotorOffLed1 , &editGeneric, GENERIC_NoYes , 0, 0, param_BitConfig_MotorOffLed1_de, param_BitConfig_MotorOffLed1_en }, // nur wenn "nur nach Start der Motoren aktiv" = JA ist -> bestimmt ob LED's an oder aus sind wenn die Motoren aus sind
{ param_GlobalConfig3_UseNcForOut1 , &editGeneric, GENERIC_NoYes , 0, 0, param_GlobalConfig3_UseNcForOut1_de, param_GlobalConfig3_UseNcForOut1_en }, // "mit WP-Event verknüpfen"
{ param_NaviOut1Parameter , &editGeneric, GENERIC_ValuePoti , 0, 247, param_NaviOut1Parameter_de, param_NaviOut1Parameter_en }, // "AutoTrigger alle...[meter]" (bis Rev.98)
{ param_AutoPhotoDistance , &editGeneric, GENERIC_ValuePoti , 0, 247, param_AutoPhotoDistance_de, param_AutoPhotoDistance_en }, // "AutoTrigger alle [meter] in Distance" (ab Rev.100)
{ param_AutoPhotoAtitudes , &editGeneric, GENERIC_ValuePoti , 0, 247, param_AutoPhotoAtitudes_de, param_AutoPhotoAtitudes_en }, // "AutoTrigger alle [meter] in Altitude" (ab Rev.100)
 
{ param_J17Bitmask , &editBitmask, 0 , 0, 0, param_J17Bitmask_de, param_J17Bitmask_en },
{ param_J17Timing , &editGeneric, GENERIC_ValuePoti , 0, 247, param_J17Timing_de, param_J17Timing_en },
{ param_BitConfig_MotorBlink2 , &editGeneric, GENERIC_NoYes , 0, 0, param_BitConfig_MotorBlink2_de, param_BitConfig_MotorBlink2_en }, // "nur nach Start der Motoren aktiv"
{ param_BitConfig_MotorOffLed2 , &editGeneric, GENERIC_NoYes , 0, 0, param_BitConfig_MotorOffLed2_de, param_BitConfig_MotorOffLed2_en }, // nur wenn "nur nach Start der Motoren aktiv" = JA ist -> bestimmt ob LED's an oder aus sind wenn die Motoren aus sind
 
{ param_WARN_J16_Bitmask , &editBitmask, 0 , 0, 0, param_WARN_J16_Bitmask_de, param_WARN_J16_Bitmask_en }, // Bitmaske fuer Unterspannungswarnung
{ param_WARN_J17_Bitmask , &editBitmask, 0 , 0, 0, param_WARN_J17_Bitmask_de, param_WARN_J17_Bitmask_en }, // Bitmaske fuer Unterspannungswarnung
 
 
//-----------------------------------
// Menue: ID_MENU_VERSCHIEDENES (Verschiedenes)
//-----------------------------------
{ param_Gas_Min , &editGeneric, GENERIC_Value , 0, 247, param_Gas_Min_de, param_Gas_Min_en },
{ param_Gas_Max , &editGeneric, GENERIC_Value , 0, 247, param_Gas_Max_de, param_Gas_Max_en },
{ param_KompassWirkung , &editGeneric, GENERIC_ValuePoti , 0, 247, param_KompassWirkung_de, param_KompassWirkung_en },
//{ param_CompassOffset , &editGeneric, GENERIC_Value , 0, 255, param_CompassOffset_de, param_CompassOffset_en }, // TODO: +/- Werte sind dort kodiert
{ param_CompassOffset , &editCompassOffset, 0 , 0, 0, param_CompassOffset_de, param_CompassOffset_en }, // TODO: +/- Werte sind dort kodiert
{ param_CompassOffset_DisableDeclCalc , &editGeneric, GENERIC_NoYes , 0, 0, param_CompassOffset_DisableDeclCalc_de, param_CompassOffset_DisableDeclCalc_en }, // TODO: +/- Werte sind dort kodiert
{ param_CareFreeChannel , &editGeneric, GENERIC_DisChSerWpeOffOn , 0, 0, param_CareFreeChannel_de, param_CareFreeChannel_en },
{ param_ExtraConfig_LearnableCarefree , &editGeneric, GENERIC_NoYes , 0, 0, param_ExtraConfig_LearnableCarefree_de, param_ExtraConfig_LearnableCarefree_en },
 
{ param_UnterspannungsWarnung , &editGeneric, GENERIC_Value , 0, 247, param_UnterspannungsWarnung_de, param_UnterspannungsWarnung_en },
{ param_ComingHomeVoltage , &editGeneric, GENERIC_Value , 0, 247, param_ComingHomeVoltage_de, param_ComingHomeVoltage_en },
{ param_AutoLandingVoltage , &editGeneric, GENERIC_Value , 0, 247, param_AutoLandingVoltage_de, param_AutoLandingVoltage_en },
 
//{ param_ExtraConfig_33vReference , &editGeneric, GENERIC_NoYes , 0, 0, param_ExtraConfig_33vReference_de, param_ExtraConfig_33vReference_en }, // nicht mehr unterstuetzt!
{ param_NotGasZeit , &editGeneric, GENERIC_Value , 0, 247, param_NotGasZeit_de, param_NotGasZeit_en },
{ param_GlobalConfig3_VarioFailsafe , &editGeneric, GENERIC_NoYes , 0, 0, param_GlobalConfig3_VarioFailsafe_de, param_GlobalConfig3_VarioFailsafe_en },
{ param_NotGas , &editGeneric, GENERIC_Value , 0, 247, param_NotGas_de, param_NotGas_en },
{ param_FailSafeTime , &editGeneric, GENERIC_Value , 0, 247, param_FailSafeTime_de, param_FailSafeTime_en },
{ param_FailsafeChannel , &editGeneric, GENERIC_Value , 0, 16, param_FailsafeChannel_de, param_FailsafeChannel_en },
 
{ param_ExtraConfig_NoRcOffBeeping , &editGeneric, GENERIC_NoYes , 0, 0, param_ExtraConfig_NoRcOffBeeping_de, param_ExtraConfig_NoRcOffBeeping_en },
{ param_ExtraConfig_IgnoreMagErrAtStartup , &editGeneric, GENERIC_NoYes , 0, 0, param_ExtraConfig_IgnoreMagErrAtStartup_de, param_ExtraConfig_IgnoreMagErrAtStartup_en },
{ param_GlobalConfig3_NoSdCardNoStart , &editGeneric, GENERIC_NoYes , 0, 0, param_GlobalConfig3_NoSdCardNoStart_de, param_GlobalConfig3_NoSdCardNoStart_en },
{ param_GlobalConfig3_NoGpsFixNoStart , &editGeneric, GENERIC_NoYes , 0, 0, param_GlobalConfig3_NoGpsFixNoStart_de, param_GlobalConfig3_NoGpsFixNoStart_en },
 
 
//-----------------------------------
// Menue: ID_MENU_GYRO (Gyro)
//-----------------------------------
{ param_Gyro_P , &editGeneric, GENERIC_ValuePoti , 0, 247, param_Gyro_P_de, param_Gyro_P_en },
{ param_Gyro_Gier_P , &editGeneric, GENERIC_ValuePoti , 0, 247, param_Gyro_Gier_P_de, param_Gyro_Gier_P_en },
{ param_Gyro_I , &editGeneric, GENERIC_ValuePoti , 0, 247, param_Gyro_I_de, param_Gyro_I_en },
{ param_Gyro_Gier_I , &editGeneric, GENERIC_ValuePoti , 0, 247, param_Gyro_Gier_I_de, param_Gyro_Gier_I_en },
{ param_Gyro_D , &editGeneric, GENERIC_ValuePoti , 0, 247, param_Gyro_D_de, param_Gyro_D_en },
 
{ param_DynamicStability , &editGeneric, GENERIC_ValuePoti , 0, 247, param_DynamicStability_de, param_DynamicStability_en },
{ param_GlobalConfig_DrehratenBegrenzer , &editGeneric, GENERIC_NoYes , 0, 0, param_GlobalConfig_DrehratenBegrenzer_de, param_GlobalConfig_DrehratenBegrenzer_en },
 
{ param_GyroAccFaktor , &editGeneric, GENERIC_Value , 0, 247, param_GyroAccFaktor_de, param_GyroAccFaktor_en },
{ param_GyroAccAbgleich , &editGeneric, GENERIC_Value , 0, 247, param_GyroAccAbgleich_de, param_GyroAccAbgleich_en },
 
{ param_I_Faktor , &editGeneric, GENERIC_ValuePoti , 0, 247, param_I_Faktor_de, param_I_Faktor_en },
{ param_Driftkomp , &editGeneric, GENERIC_Value , 0, 247, param_Driftkomp_de, param_Driftkomp_en },
{ param_Gyro_Stability , &editGeneric, GENERIC_Value , 0, 247, param_Gyro_Stability_de, param_Gyro_Stability_en },
{ param_MotorSmooth , &editGeneric, GENERIC_Value , 0, 247, param_MotorSmooth_de, param_MotorSmooth_en },
 
 
//-----------------------------------
// Menue: ID_MENU_BENUTZER (Benutzer)
//-----------------------------------
{ param_UserParam1 , &editGeneric, GENERIC_ValuePoti , 0, 247, param_UserParam1_de, param_UserParam1_en },
{ param_UserParam2 , &editGeneric, GENERIC_ValuePoti , 0, 247, param_UserParam2_de, param_UserParam2_en },
{ param_UserParam3 , &editGeneric, GENERIC_ValuePoti , 0, 247, param_UserParam3_de, param_UserParam3_en },
{ param_UserParam4 , &editGeneric, GENERIC_ValuePoti , 0, 247, param_UserParam4_de, param_UserParam4_en },
{ param_UserParam5 , &editGeneric, GENERIC_ValuePoti , 0, 247, param_UserParam5_de, param_UserParam5_en },
{ param_UserParam6 , &editGeneric, GENERIC_ValuePoti , 0, 247, param_UserParam6_de, param_UserParam6_en },
{ param_UserParam7 , &editGeneric, GENERIC_ValuePoti , 0, 247, param_UserParam7_de, param_UserParam7_en },
{ param_UserParam8 , &editGeneric, GENERIC_ValuePoti , 0, 247, param_UserParam8_de, param_UserParam8_en },
 
 
//-----------------------------------
// Menue: ID_MENU_ACHSKOPPLUNG (Achskopplung)
//-----------------------------------
{ param_GlobalConfig_AchsenkopplungAktiv , &editGeneric, GENERIC_NoYes , 0, 0, param_GlobalConfig_AchsenkopplungAktiv_de, param_GlobalConfig_AchsenkopplungAktiv_en },
{ param_AchsKopplung1 , &editGeneric, GENERIC_ValuePoti , 0, 247, param_AchsKopplung1_de, param_AchsKopplung1_en },
{ param_AchsKopplung2 , &editGeneric, GENERIC_ValuePoti , 0, 247, param_AchsKopplung2_de, param_AchsKopplung2_en },
{ param_CouplingYawCorrection , &editGeneric, GENERIC_ValuePoti , 0, 247, param_CouplingYawCorrection_de, param_CouplingYawCorrection_en },
 
 
//-----------------------------------
// ENDE
//-----------------------------------
{ param_EOF, NOFUNC, 0,0,0, 0,0 } // END OF LIST - MUST BE THE LAST!!
};
 
 
/************************************************************
NICHT MEHR UNTERSTUEZT:
param_Receiver (Empfänger Typ: Hott, Jeti, Spektrum,...)
************************************************************/
 
 
 
 
 
//#############################################################################################
//# Menue's und Menuezuordnung
//#############################################################################################
 
//-----------------------------------
// Menue ID's: Parameters Hauptmenue
//-----------------------------------
#define ID_MENU_FAVORITEN 1 // fuer spaeter reserviert....
#define ID_MENU_KANAELE 2
#define ID_MENU_KONFIGURATION 3
#define ID_MENU_STICK 4
#define ID_MENU_LOOPING 5
#define ID_MENU_HOEHE 6
#define ID_MENU_KAMERA 7
#define ID_MENU_NAVICTRL 8
#define ID_MENU_AUSGAENGE 9
#define ID_MENU_VERSCHIEDENES 10
#define ID_MENU_GYRO 11
#define ID_MENU_BENUTZER 12
#define ID_MENU_ACHSKOPPLUNG 13
#define ID_MENU_MIXERSETUP 14 // nicht verwendet / unterstuetzt
#define ID_MENU_EASYSETUP 15
 
#define ID_MENU_TEST 66 // TEST / DEBUG
 
 
//-----------------------------------
// Zuordnungen von paramID's zu den jeweiligen Menue's
//
// Eintrag "SEPARATOR" - damit wird eine Trennlinie
// im Menue dargestellt
//-----------------------------------
 
//-------------------------------
// Menue: ID_MENU_KANAELE
//-------------------------------
unsigned char const ID_MENU_KANAELE_Items[] =
{
param_Kanalbelegung_Gas,
param_Kanalbelegung_Gear,
param_Kanalbelegung_Nick,
param_Kanalbelegung_Roll,
param_Kanalbelegung_Poti1,
param_Kanalbelegung_Poti2,
param_Kanalbelegung_Poti3,
param_Kanalbelegung_Poti4,
param_Kanalbelegung_Poti5,
param_Kanalbelegung_Poti6,
param_Kanalbelegung_Poti7,
param_Kanalbelegung_Poti8,
SEPARATOR,
param_MotorSafetySwitch,
param_GlobalConfig3_MotorSwitchMode,
SEPARATOR,
param_ExtraConfig_SensitiveRc,
param_GlobalConfig3_SpeakAll,
 
 
EOF // *** MUST BE THE LAST! ***
};
 
 
//-------------------------------
// Menue: ID_MENU_KONFIGURATION
//-------------------------------
unsigned char const ID_MENU_KONFIGURATION_Items[] =
{
param_GlobalConfig_HoehenRegelung,
param_GlobalConfig_GpsAktiv,
param_GlobalConfig_KompassAktiv,
param_GlobalConfig_KompassFix,
param_ExtraConfig_SensitiveRc,
param_GlobalConfig_AchsenkopplungAktiv,
param_GlobalConfig_DrehratenBegrenzer,
param_GlobalConfig_HeadingHold,
 
EOF // *** MUST BE THE LAST! ***
};
 
 
//-------------------------------
// Menue: ID_MENU_STICK
//-------------------------------
unsigned char const ID_MENU_STICK_Items[] =
{
param_Stick_P,
param_Stick_D,
param_StickGier_P,
SEPARATOR,
param_ExternalControl,
 
EOF // *** MUST BE THE LAST! ***
};
 
 
//-------------------------------
// Menue: ID_MENU_LOOPING
//-------------------------------
unsigned char const ID_MENU_LOOPING_Items[] =
{
param_BitConfig_LoopOben,
param_BitConfig_LoopUnten,
param_BitConfig_LoopLinks,
param_BitConfig_LoopRechts,
SEPARATOR,
param_LoopGasLimit,
param_LoopThreshold,
param_LoopHysterese,
param_WinkelUmschlagNick,
param_WinkelUmschlagRoll,
 
EOF // *** MUST BE THE LAST! ***
};
 
 
//-------------------------------
// Menue: ID_MENU_HOEHE
//-------------------------------
unsigned char const ID_MENU_HOEHE_Items[] =
{
param_GlobalConfig_HoehenRegelung,
param_ExtraConfig_HeightLimit,
param_ExtraConfig_HeightVario,
param_GlobalConfig_HoehenSchalter,
param_ExtraConfig_VarioBeep,
SEPARATOR,
param_HoeheChannel,
param_Hoehe_Verstaerkung,
param_Hoehe_MinGas,
param_Hoehe_HoverBand,
param_Hoehe_P,
param_Hoehe_GPS_Z,
param_Hoehe_TiltCompensation,
param_Luftdruck_D,
param_Hoehe_StickNeutralPoint,
param_Hoehe_ACC_Wirkung,
param_MaxAltitude,
SEPARATOR,
param_StartLandChannel,
param_LandingSpeed,
param_LandingPulse,
EOF // *** MUST BE THE LAST! ***
};
 
 
 
//-------------------------------
// Menue: ID_MENU_KAMERA
//-------------------------------
unsigned char const ID_MENU_KAMERA_Items[] =
{
param_ServoNickControl,
param_ServoNickComp,
param_ServoNickFailsave,
param_GlobalConfig3_ServoNickCompOff, // erst ab FC-Rev 96
param_ServoCompInvert_SERVO_NICK_INV,
param_ServoCompInvert_SERVO_RELATIVE,
param_ServoNickMin,
param_ServoNickMax,
param_ServoFilterNick,
SEPARATOR,
param_ServoRollControl,
param_ServoRollComp,
param_ServoRollFailsave,
param_ServoCompInvert_SERVO_ROLL_INV,
param_ServoRollMin,
param_ServoRollMax,
param_ServoFilterRoll,
SEPARATOR,
param_ServoNickRefresh,
param_ServoManualControlSpeed,
param_Servo3,
param_Servo3Failsave,
param_Servo4,
param_Servo4Failsave,
param_Servo5,
param_Servo5Failsave,
SEPARATOR,
param_Servo3OnValue,
param_Servo3OffValue,
param_Servo4OnValue,
param_Servo4OffValue,
 
EOF // *** MUST BE THE LAST! ***
};
 
 
 
//-------------------------------
// Menue: ID_MENU_NAVICTRL
//-------------------------------
unsigned char const ID_MENU_NAVICTRL_Items[] =
{
param_GlobalConfig_GpsAktiv,
param_NaviGpsModeChannel,
param_NaviGpsGain,
param_NaviStickThreshold,
param_NaviGpsMinSat,
param_NaviGpsP,
param_NaviGpsPLimit,
param_NaviGpsI,
param_NaviGpsILimit,
param_NaviGpsD,
param_NaviGpsDLimit,
param_NaviGpsA,
SEPARATOR,
param_NaviWindCorrection,
param_NaviAccCompensation,
param_NaviMaxFlyingRange,
param_NaviOperatingRadius,
param_NaviAngleLimitation,
param_NaviPH_LoginTime,
param_ExtraConfig_GpsAid,
param_GlobalConfig3_DphMaxRadius,
SEPARATOR,
param_ComingHomeAltitude,
param_ComingHomeOrientation,
SEPARATOR,
param_SingleWpControlChannel,
param_MenuKeyChannel,
param_SingleWpSpeed,
SEPARATOR,
param_NaviDescendRange,
 
EOF // *** MUST BE THE LAST! ***
};
 
 
//-------------------------------
// Menue: ID_MENU_AUSGAENGE
//-------------------------------
unsigned char const ID_MENU_AUSGAENGE_Items[] =
{
param_J16Bitmask, // LED 1 Bitmaske
param_J16Timing,
param_BitConfig_MotorBlink1,
param_BitConfig_MotorOffLed1,
param_GlobalConfig3_UseNcForOut1,
param_NaviOut1Parameter,
param_AutoPhotoDistance,
param_AutoPhotoAtitudes,
SEPARATOR,
param_J17Bitmask, // LED 2 Bitmaske
param_J17Timing,
param_BitConfig_MotorBlink2,
param_BitConfig_MotorOffLed2,
SEPARATOR,
param_WARN_J16_Bitmask,
param_WARN_J17_Bitmask,
 
EOF // *** MUST BE THE LAST! ***
};
 
 
//-------------------------------
// Menue: ID_MENU_VERSCHIEDENES
//-------------------------------
unsigned char const ID_MENU_VERSCHIEDENES_Items[] =
{
param_Gas_Min,
param_Gas_Max,
param_KompassWirkung,
param_CompassOffset,
param_CompassOffset_DisableDeclCalc,
param_CareFreeChannel,
param_ExtraConfig_LearnableCarefree,
SEPARATOR,
param_UnterspannungsWarnung,
param_ComingHomeVoltage,
param_AutoLandingVoltage,
SEPARATOR,
param_NotGasZeit,
param_GlobalConfig3_VarioFailsafe, // Nutze "Vario-Höhe" für "Not-Gas" -> beeinflusst 'param_NotGas' bzgl. "%"
param_NotGas,
param_FailSafeTime,
param_FailsafeChannel,
param_ExtraConfig_NoRcOffBeeping,
SEPARATOR,
param_ExtraConfig_IgnoreMagErrAtStartup,
param_GlobalConfig3_NoSdCardNoStart,
param_GlobalConfig3_NoGpsFixNoStart,
 
EOF // *** MUST BE THE LAST! ***
};
 
 
//-------------------------------
// Menue: ID_MENU_GYRO
//-------------------------------
unsigned char const ID_MENU_GYRO_Items[] =
{
param_Gyro_P,
param_Gyro_I,
param_Gyro_D,
param_Gyro_Gier_P,
param_Gyro_Gier_I,
SEPARATOR,
param_DynamicStability,
param_GlobalConfig_DrehratenBegrenzer,
SEPARATOR,
param_GyroAccFaktor,
param_GyroAccAbgleich,
SEPARATOR,
param_I_Faktor,
param_Driftkomp,
param_Gyro_Stability,
param_MotorSmooth,
 
EOF // *** MUST BE THE LAST! ***
};
 
 
//-------------------------------
// Menue: ID_MENU_BENUTZER
//-------------------------------
unsigned char const ID_MENU_BENUTZER_Items[] =
{
param_UserParam1,
param_UserParam2,
param_UserParam3,
param_UserParam4,
param_UserParam5,
param_UserParam6,
param_UserParam7,
param_UserParam8,
 
EOF // *** MUST BE THE LAST! ***
};
 
 
//-------------------------------
// Menue: ID_MENU_ACHSKOPPLUNG
//-------------------------------
unsigned char const ID_MENU_ACHSKOPPLUNG_Items[] =
{
param_GlobalConfig_AchsenkopplungAktiv,
param_AchsKopplung1,
param_AchsKopplung2,
param_CouplingYawCorrection,
 
EOF // *** MUST BE THE LAST! ***
};
 
 
//-------------------------------
// Menue: ID_MENU_EASYSETUP
//-------------------------------
unsigned char const ID_MENU_EASYSETUP_Items[] =
{
param_GlobalConfig_HoehenRegelung,
param_HoeheChannel,
param_Hoehe_StickNeutralPoint,
param_StartLandChannel,
SEPARATOR,
param_GlobalConfig_GpsAktiv,
param_NaviGpsModeChannel,
param_ExtraConfig_GpsAid,
param_ComingHomeAltitude,
SEPARATOR,
param_CareFreeChannel,
param_ExtraConfig_LearnableCarefree,
 
EOF // *** MUST BE THE LAST! ***
};
 
 
 
 
//#############################################################################################
//# Error-Handling
//#############################################################################################
//# mittels des auf dem PKT angezeigten Errocodes (z.B. "E32") kann man hier schauen was bzw.
//# wo (in welcher Funktion) der Fehler aufgetreten ist.
//#
//# Im Menue wird der Fehlercode rechts bei den Values dargestellt (dabei ertönen immer wieder
//# Fehler-Beep's).
//# In der Vollbildanzeige wird zusaetzlich ein uebergebener Wert (value) angezeigt - im Code
//# kann man ermitteln was der Wert darstellt.
//#############################################################################################
 
#define E01_PARAMID_MENUEDITCATEGORY 1 // Menu_EditCategory() - FEHLER: paramEditItem (=paramID) nicht in Tabelle paramEditItemTable gefunden
 
#define E11_PARAMID_EDITGENERIC 11 // editGeneric() - FEHLER: paramEditItem (=paramID) nicht in Tabelle paramEditItemTable gefunden
#define E12_PARAMID_EDITBITMASK 12 // editBitmask() - FEHLER: paramEditItem (=paramID) nicht in Tabelle paramEditItemTable gefunden
 
#define E30_CODECHAR_NOT_FOUND 30 // find_genericCode() - FEHLER: Code-Zeichen nicht in Tabelle editGenericCode gefunden
#define E31_PARAMEDIT_ITEM_NOT_FOUND 31 // find_genericCodeByValue() - FEHLER: paramEditItem (=paramID) nicht in Tabelle paramEditItemTable gefunden
#define E32_CODECHAR_NOT_FOUND 32 // find_genericCodeByValue() - FEHLER: Code-Zeichen nicht in Tabelle editGenericCode gefunden
#define E33_VALUE_NOT_IN_FORMAT 33 // find_genericCodeByValue() - FEHLER: Ende des Format-Strings erreicht - fuer das gegebene value konnte kein passender Code im Format-String gefunden werden
 
#define E41_VALUE_MIN_MAX_RANGE 41 // strValueGeneric() - FEHLER: fuer die Range von 'v' (Value) wurde max < min angegeben bei Generic -> nicht unterstuetzt
 
 
 
 
//--------------------------------------------------------------
// _error( errorcode, value, showscreen)
//
// zeigt Fehlermeldungen an
//
// PARAMETER:
// errorcode : siehe Error-defines
// value : zusaetzlicher Anzeigeparameter (nur in Screen-Anzeige)
// showscreen: true = Fehlermeldung wird vollstaendig angezeigt.
// - er Screen wird dabei geloescht
// - Ende mit Taste 'Ende'
// - langer Fehler-Beep
//
// false = es wird nur der Buffer mkparam_strValueBuffer
// mit dem Fehlercode befuellt
// - Anzeige im Menue ganz recht als "Enn"
// - kurzer Fehler-Beep der jedoch bei jeder
// Aktion im Menue zu hoeren ist
// => dann auf Anzeige "Enn" achten!
//--------------------------------------------------------------
void _error( uint8_t errorcode, uint8_t value, uint8_t showscreen)
{
xsnprintf_P( mkparam_strValueBuffer, MKPARAM_STRBUFFER_LEN, PSTR("E%02u"), errorcode); // in mkparam_strValueBuffer ausgeben fuer das Menue
 
if( showscreen )
{
lcd_cls();
 
lcdx_printp_center( 1, PSTR(" ERROR "), MINVERS, 0,-3);
lcdx_printp_center( 2, PSTR("mkparameters.c"), MNORMAL, 0,0);
 
lcd_printf_at_P( 0, 4, MNORMAL, PSTR("Code : E%02u"), errorcode );
lcd_printf_at_P( 0, 5, MNORMAL, PSTR("Value: %3u"), value );
 
lcd_printp_at(11, 7, strGet(ENDE), MNORMAL );
 
set_beep( 500, 0x000f, BeepNormal); // Beep Error
 
while( !get_key_press(1 << KEY_ESC) )
{
//--------------------------------
// Anmerkung: OG 25.03.2014
//
// Ohne diese Verzoegerung funkioniert die Update-Erkennung via PKT-UpdateTool
// meist nicht - ist das PKT zu schnell?
// Kann man evtl. das PKT-UpdateTool diesbezueglich mal ueberpruefen ob man
// Timings/Timeout's anpassen kann?
//
// Hinweis dazu: PKT_CtrlHook() bzw. die dort enthaltene Update-Anforderungspruefung
// ist in den letzten Wochen beschleunigt geworden da unnoetiger Code fuer nicht
// benoetigte Bildschirmausgaben entfernt wurde - das ist grundsaetzlich fuer das PKT
// besser.
//
// Um das nachzustellen:
// Unten das Delay auskommentieren und einen Fehler in Menu_EditCategory() provozieren
// indem "paramID = 0;" einkommentiert wird (ist dort beschrieben)
// Dann den Fehlerscreen im PKT anzeigen lassen und ein Update via PKT-UpdateTool initiieren,
//--------------------------------
_delay_ms(150);
 
PKT_CtrlHook();
}
}
else
{
// kurzer Fehler-Beep - der kann wiederholt im Menue auftreten bei jedem Refresh des Menues
set_beep( 160, 0x000f, BeepNormal); // Beep Error
}
}
 
 
 
 
//#############################################################################################
//# Edit-Funktionen
//#############################################################################################
 
 
//--------------------------------------------------------------
// ok = find_paramEditItem( paramID )
//
// sucht in paramEditItemTable (PROGMEM) eine paramID und
// kopiert den Eintrag in das RAM
//
// PARAMETER:
// paramID
//
// RUECKGABE:
// true = paramID gefunden
// false = nicht gefunden (Fehler)
//
// -- globale Modulvariablen --
// Ergebnisse in:
//
// paramEditItem : der gefundene Eintrag vom Typ paramEditItem_t (im RAM)
// paramEditFormat: der Format-String paramEditItem.format im RAM
//--------------------------------------------------------------
unsigned char find_paramEditItem( unsigned char paramID )
{
unsigned char id;
unsigned char *p;
 
p = (unsigned char *) paramEditItemTable;
 
while( true )
{
id = pgm_read_byte(p); // die aktuelle paramID aus paramEditDef
 
if( id == paramID || id == param_EOF )
break;
 
p += sizeof( paramEditItem_t );
}
 
//-----
// wenn die gesuchte paramID nicht gefunden wurde steht
// im RAM-Buffer paramEdit.paramID == param_EOF !!
//-----
memcpy_P ( &paramEditItem , p, sizeof(paramEditItem_t) ); // die Struktur -> in den RAM-Buffer kopieren (Zugriff: paramEditItem)
strncpy_P( paramEditFormat, paramEditItem.format, MKPARAM_STRBUFFER_LEN); // format String -> in den RAM-Buffer kopieren (Zugriff: paramEditFormat)
 
return( id!=param_EOF );
}
 
 
 
//--------------------------------------------------------------
// ptrP = paramEditItemTitle()
//
// gibt einen Zeiger in PROGMEM auf den Titel/Bezeichnung eines
// paramID's in der richtigen Sprache zurueck
//
// ACHTUNG! paramEditItem muss vorher initialisert worden sein!
//--------------------------------------------------------------
/*
const char * paramEditItemTitle( void )
{
if( Config.DisplayLanguage == 0 )
return( paramEditItem.title_de );
else
return( paramEditItem.title_en );
}
*/
 
 
 
//--------------------------------------------------------------
// print_paramEditItemTitle()
//
// gibt Titel/Bezeichnung auf den Bildschirm bei x=0, y=2 aus
//
// ACHTUNG! paramEditItem muss vorher initialisert worden sein!
//--------------------------------------------------------------
void print_paramEditItemTitle( void )
{
lcd_printp_at( 0, 2, (Config.DisplayLanguage == 0 ? paramEditItem.title_de : paramEditItem.title_en ), MNORMAL); // Bezeichnung des paramID's
}
 
 
 
//--------------------------------------------------------------
// ok = find_genericCode( code )
//
// Ergebnis steht in: (globale Modulvariablen)
// genericCode
//--------------------------------------------------------------
unsigned char find_genericCode( unsigned char code )
{
unsigned char codeIdx;
 
codeIdx = 0;
while( (editGenericCode[codeIdx].code != code ) && (editGenericCode[codeIdx].code != EOF) )
codeIdx++;
 
//-----------------------------
// find_genericCode() - FEHLER: Code-Zeichen nicht in Tabelle editGenericCode gefunden
//-----------------------------
if( editGenericCode[codeIdx].code == EOF )
{
_error( E30_CODECHAR_NOT_FOUND, code, false);
return false;
}
 
memcpy( &genericCode, &editGenericCode[codeIdx], sizeof(editGenericCode_t) ); // die gefundene Struktur in den RAM-Buffer kopieren
 
return true;
}
 
 
 
//--------------------------------------------------------------
// ok = find_genericCode( paramID, &v, &min, &max, pFormat)
//
// PARAMETER:
// paramID
// *v
// *min
// *max
// *pFormat
//
// Ergebnis steht in: (globale Modulvariablen)
// paramEditItem
// paramEditFormat: der zugehoerige Format-String
// genericCode
//--------------------------------------------------------------
unsigned char find_genericCodeByValue( unsigned char paramID, unsigned char *v, unsigned char *min, unsigned char *max )
{
unsigned char codeIdx;
char *pFormat;
 
 
//-------------------------------------------------
// 1. finde paramID in der paramEditItem-Tabelle
//
// sollte der RAM-Buffer paramEditItem bereits das
// gesuchte enthalten dann ok
//-------------------------------------------------
if( paramEditItem.paramID != paramID )
find_paramEditItem( paramID );
 
//---
// FEHLER: paramEditItem nicht in Tabelle paramEditItemTable gefunden
//---
if( paramEditItem.paramID == param_EOF )
{
_error( E31_PARAMEDIT_ITEM_NOT_FOUND, paramID, false);
return false;
}
 
pFormat = paramEditFormat; // Zeiger auf das erste Zeichen vom Format-String (z.B. "DCSWFHQ")
*v = paramGet( paramID ); // der aktuelle Wert des paraID
 
while( true )
{
//------
// suche editGenericCode mittels aktuelles Zeichens *pFormat
//------
codeIdx = 0;
while( (editGenericCode[codeIdx].code != *pFormat) && (editGenericCode[codeIdx].code != EOF) )
codeIdx++;
 
 
//------
// FEHLER: Code-Zeichen nicht in Tabelle editGenericCode gefunden
//------
if( editGenericCode[codeIdx].code == EOF )
{
_error( E32_CODECHAR_NOT_FOUND, *pFormat, false);
return false;
}
 
 
//------
// suche den Value-Bereich (min/max) fuer das Code-Zeichen
//------
if( editGenericCode[codeIdx].code == 'v' )
{
// bei code 'v' kommt min/max aus paramEditItem
*min = paramEditItem.min;
*max = paramEditItem.max;
}
else
{
// ansonsten kommt min/max aus dem Code selber
*min = editGenericCode[codeIdx].min;
*max = editGenericCode[codeIdx].max;
}
 
// value gefunden (innerhalb von min/max)?
// beruecksichtigt 'gedrehte' min/max (z.B. Poti1..8)
if( (*min <= *max && *v >= *min && *v <= *max) || (*min > *max && *v >= *max && *v <= *min) )
{
// gefunden - Schleife verlassen
break;
}
 
 
//------
// naechstes Code-Zeichen aus der Format-Maske
//------
pFormat++;
 
 
//------
// FEHLER: Ende des Format-Strings erreicht - fuer das gegebene value konnte kein passender Code im Format-String gefunden werden
//------
if( *pFormat == 0 ) // Ende des Format-Strings erreicht - Fehler...
{
_error( E33_VALUE_NOT_IN_FORMAT, *v, false);
return false;
}
}
 
memcpy( &genericCode, &editGenericCode[codeIdx], sizeof(editGenericCode_t) ); // die gefundene Struktur in den RAM-Buffer kopieren
 
genericCode.min = *min; // ggf. min/max ueberschreiben durch min/max von paramEditItem
genericCode.max = *max;
 
return true;
}
 
 
 
//--------------------------------------------------------------
//--------------------------------------------------------------
const char * get_genericCodeText( uint8_t cmd )
{
if( cmd == MKPARAM_LONGVALUE )
{
if( Config.DisplayLanguage == 0 ) return genericCode.longText_de;
else return genericCode.longText_en;
}
else
{
if( Config.DisplayLanguage == 0 ) return genericCode.shortText_de;
else return genericCode.shortText_en;
}
return 0;
}
 
 
 
//--------------------------------------------------------------
// ok = strValueGeneric( paramID, cmd )
//
// erstellt die String Representation des Wertes von paramID
// im Buffer mkparam_strValueBuffer.
//
// Mit 'cmd' wird gesteuert ob es der Lang-Text oder der
// Kurztext (3 Zeichen) ist.
//
// PARAMETER:
// paramID:
// cmd: MKPARAM_SHORTVALUE oder MKPARAM_LONGVALUE
//--------------------------------------------------------------
uint8_t strValueGeneric( unsigned char paramID, uint8_t cmd )
{
unsigned char v;
unsigned char min;
unsigned char max;
 
if( find_genericCodeByValue( paramID, &v, &min, &max) )
{
//-------------------
// value gefunden!
//-------------------
if( genericCode.code == 'v' ) // Code 'v' (Value) - keine Umrechnung von min/max
{
if( max < min )
{
// max < min bei 'v' (Value) wird aktuell nicht unterstuezt da
// kein Beispiel vorhanden ist was damit ggf. gemeint ist.
// Wenn das irgendwann benoetigt wird muss das hier gecoded werden.
// Bis dahin wird das als Fehler angesehen (ggf. vertippt beim coden).
_error( E41_VALUE_MIN_MAX_RANGE, v, false);
return false;
}
}
else // alles andere ausser 'v' - der Wert wird in die Range von min/max umgerechnet
{
if( min <= max )
v = v-min;
else
v = min-v; // OG Notiz: v = 248 = 8 # 248 = 8, 255 = 1 # min 255 max = 248
v++; // fuer Anzeige +1: statt '0' eine '1' anzeigen - Beispiel: statt "Poti0" zeige "Poti1"
}
 
 
//-------------------
// ertstelle String
//-------------------
xsnprintf_P( mkparam_strValueBuffer, MKPARAM_STRBUFFER_LEN, get_genericCodeText(cmd), v); // erzeuge den Ausgabestring in mkparam_strValueBuffer
 
return true;
}
 
return false;
}
 
 
 
 
//--------------------------------------------------------------
// ok = getGenericNextValue( paramID, vInc )
//
// PARAMETER:
//--------------------------------------------------------------
uint8_t getGenericNextValue( unsigned char paramID, int8_t vInc )
{
int v; // value von paramID - signed int: damit -1 und >255 ausgewertet werden kann
unsigned char value; // zum holen von v via find_genericCodeByValue()
unsigned char min;
unsigned char max;
unsigned char codeIdx;
char *pFormat;
 
 
if( find_genericCodeByValue( paramID, &value, &min, &max) )
{
v = (int)value; // value vom paramID wird gecastet auf int um -1 und >255 fuer edit zu erkennen
 
//------------------------------------------------------
// Pointer auf das Zeichen im Format-String ermitteln
//------------------------------------------------------
pFormat = paramEditFormat;
while( *pFormat != genericCode.code ) pFormat++;
 
 
if( min > max ) // 'umgedrehte' min/max Werte wie bei Poti1..8
vInc = vInc * -1;
 
 
v = v + vInc;
 
 
//------------------------------------------------------
// min/max Grenzen des Code-Zeichens ueberschritten?
//------------------------------------------------------
if( (min <= max && v < min) || (min > max && v > min) )
{
if( pFormat == paramEditFormat ) // Anfang vom Code-String? -> dann gehe zum Ende (letztes Zeichen)
{
while( *(pFormat+1) ) pFormat++;
}
else
{
pFormat--; // vorheriges Format-Zeichen = vorheriger Code
}
 
 
codeIdx = 0; // code-Zeichen suchen in Tabelle editGenericCode
while( (editGenericCode[codeIdx].code != *pFormat) && (editGenericCode[codeIdx].code != EOF) )
codeIdx++;
 
if( editGenericCode[codeIdx].code == EOF ) // Fehler? -> exit
{
return false;
}
 
if( editGenericCode[codeIdx].code == 'v' )
v = paramEditItem.max;
else
v = editGenericCode[codeIdx].max;
 
}
else if( (min <= max && v > max) || (min > max && v < max) )
{
pFormat++; // naechstes Format-Zeichen = naechster Code
if( *pFormat == 0 ) // Ende des Format-Strings?
pFormat = paramEditFormat;
 
codeIdx = 0; // code-Zeichen suchen in Tabelle editGenericCode
while( (editGenericCode[codeIdx].code != *pFormat) && (editGenericCode[codeIdx].code != EOF) )
codeIdx++;
 
if( editGenericCode[codeIdx].code == EOF ) // Fehler? -> exit
{
return false;
}
 
if( editGenericCode[codeIdx].code == 'v' )
v = paramEditItem.min;
else
v = editGenericCode[codeIdx].min;
}
 
 
//------------------------------------------------------
// neuen Wert setzen
//------------------------------------------------------
paramSet( paramID, (unsigned char)v );
 
return true;
 
} // end: if( find_genericCode( paramID, &v, &min, &max) )
 
 
return false;
}
 
 
 
//--------------------------------------------------------------
// editGeneric( paramID, cmd )
//
// PARAMETER:
// cmd: MKPARAM_EDIT oder MKPARAM_SHORTVALUE oder MKPARAM_LONGVALUE
//--------------------------------------------------------------
void editGeneric( unsigned char paramID, uint8_t cmd )
{
unsigned char v_org;
uint8_t redraw;
int8_t vInc;
 
if( cmd != MKPARAM_EDIT )
{
// wenn cmd = MKPARAM_SHORTVALUE oder MKPARAM_LONGVALUE
strValueGeneric( paramID, cmd); // Ergebnis in: mkparam_strValueBuffer
return;
}
 
find_paramEditItem( paramID );
 
//------------------------
// editGeneric() - FEHLER: paramEditItem (=paramID) nicht in Tabelle paramEditItemTable gefunden
//------------------------
if( paramEditItem.paramID == param_EOF )
{
_error( E11_PARAMID_EDITGENERIC, paramID, true);
return;
}
 
lcd_cls();
 
v_org = paramGet( paramID );
redraw = SCREEN_REDRAW;
vInc = 0; // 0, +1, -1 (inc/dec)
 
while( true )
{
//-----------------------
// Anzeige: Titel, usw..
//-----------------------
if( redraw == SCREEN_REDRAW )
{
lcd_frect( 0, 0, 127, 7, 1); // Headline: Box fill
lcdx_printp_at( 1, 0, PSTR("Ändern"), MINVERS, 0,0); // Titel
lcd_printp_at( 0, 7, strGet(KEYLINE2), MNORMAL); // Keyline: <- -> Ende OK
lcd_printp_at(11, 7, strGet(KEYCANCEL), MNORMAL); // Keyline: "Abbr." statt "Ende" einsetzen
 
print_paramEditItemTitle(); // Bezeichnung des paramID's anzeigen
 
redraw = SCREEN_REFRESH;
}
 
 
//---------------
// LiPo Anzeigen
//---------------
show_Lipo(); // LiPo anzeigen
 
 
//-----------------------
// Anzeige: nur Wert
//-----------------------
if( redraw == SCREEN_REFRESH )
{
strValueGeneric( paramID, MKPARAM_LONGVALUE); // Lang-Text des Values anzeigen
// nach strValueGeneric() ist auch genericCode initialisiert!
lcd_printf_at_P( 0, 4, MNORMAL, PSTR("> %18s"), mkparam_strValueBuffer );
 
 
// DEBUG...
#ifdef DEBUG_PARAMEDIT
//lcd_printf_at_P( 16, 1, MNORMAL, PSTR("%c %3u"), genericCode.code, paramGet(paramID) );
#endif
 
//lcd_printf_at_P( 16, 4, MNORMAL, PSTR("= %03u"), v );
 
 
if( abs(genericCode.max-genericCode.min) <= 20 )
_delay_ms( 200 ); // Verzoegerung
 
vInc = 0;
redraw = 0;
}
 
 
//-----------------
// TASTEN
//-----------------
if( get_key_press(1 << KEY_ESC) ) // Key: Cancel
{
paramSet( paramID, v_org ); // org. Wert wieder herstellen
break;
}
 
if( get_key_press(1 << KEY_ENTER) ) // Key: OK
{
break;
}
 
if( get_key_press(1 << KEY_PLUS) || get_key_long_rpt_sp( (1 << KEY_PLUS),2) ) // Key: rechts / +1
{
vInc = +1;
}
 
 
if( get_key_press(1 << KEY_MINUS) || get_key_long_rpt_sp( (1 << KEY_MINUS),2) ) // Key: links / -1
{
vInc = -1;
}
 
if( vInc != 0 )
{
getGenericNextValue( paramID, vInc );
redraw = SCREEN_REFRESH;
}
 
 
//------------------------------------------
// Pruefe PKT-Update oder andere PKT-Aktion
//------------------------------------------
if( PKT_CtrlHook() ) // Update vom Updatetool angefordert?
{
lcd_cls();
redraw = SCREEN_REDRAW;
}
 
} // end: while( true )
 
}
 
 
 
//--------------------------------------------------------------
// editBitmask( paramID, cmd )
//
// PARAMETER:
// paramID: die paramID
// cmd: MKPARAM_EDIT oder MKPARAM_SHORTVALUE oder MKPARAM_LONGVALUE
//--------------------------------------------------------------
void editBitmask( unsigned char paramID, uint8_t cmd )
{
unsigned char v;
uint8_t redraw;
uint8_t i;
int8_t pos;
 
find_paramEditItem( paramID );
 
//-----------------------
// editBitmask() - FEHLER: paramEditItem (=paramID) nicht in Tabelle paramEditItemTable gefunden
//-----------------------
if( paramEditItem.paramID == param_EOF )
{
_error( E12_PARAMID_EDITBITMASK, paramID, (cmd==MKPARAM_EDIT) );
return;
}
 
 
//-----------------------
// nur Rueckgabe des Wertes in mkparam_strValueBuffer ?
//-----------------------
if( cmd != MKPARAM_EDIT )
{
v = paramGet( paramID );
xsnprintf_P( mkparam_strValueBuffer, MKPARAM_STRBUFFER_LEN, PSTR("%03u"), v); // erzeuge den Ausgabestring in mkparam_strValueBuffer
return;
}
 
 
lcd_cls();
 
v = paramGet( paramID );
redraw = SCREEN_REDRAW;
pos = 0;
 
while( true )
{
//-----------------------
// Anzeige: Titel, usw..
//-----------------------
if( redraw == SCREEN_REDRAW )
{
lcd_frect( 0, 0, 127, 7, 1); // Headline: Box fill
lcdx_printp_at( 1, 0, PSTR("Ändern"), MINVERS, 0,0); // Titel
lcd_printp_at( 1, 7, PSTR("0/1 \x19 OK"), MNORMAL); // Keyline: -> 0/1 OK
lcd_printp_at( 11, 7, strGet(KEYCANCEL), MNORMAL); // Keyline: "Abbr." bzw "Cancel"
lcdx_printp_at( 7, 6, PSTR("\x18"), MNORMAL, -2,2); // Keyline langer Tastendruck: -> 0/1 OK
 
if( (paramID == param_J16Bitmask) || (paramID == param_J17Bitmask) )
{
lcdx_printp_at( 10, 5, PSTR("(Bit1=Idle)"), MNORMAL, 0,2); //
}
 
print_paramEditItemTitle(); // Bezeichnung des paramID's (Stelle x=0, y=2)
 
redraw = SCREEN_REFRESH;
}
 
 
//---------------
// LiPo Anzeigen
//---------------
show_Lipo(); // LiPo anzeigen
 
 
//-----------------------
// Anzeige: nur Wert
//-----------------------
if( redraw == SCREEN_REFRESH )
{
for(i = 0; i < 8; i++)
{
lcd_putc( 8-i, 4, ( (v & (1 << i)) ? '1' : '0'), MNORMAL);
}
 
lcd_frect( 0, (8*5), 125-(11*6), 7, 0); // clear: Eingabemarkierung
lcd_printp_at (pos+1, 5,PSTR("\x12"), MNORMAL); // Eingabemarkierung (Pfeil nach oben)
 
lcd_printf_at_P( 15, 4, MNORMAL, PSTR("= %03u"), v ); // Anzeige des aktuellen Wertes Dezimal
 
// _delay_ms( 200 ); // Verzoegerung
redraw = 0;
}
 
 
//-----------------
// TASTEN
//-----------------
if( get_key_short(1 << KEY_ESC) ) // Key: Cancel
{
break; // verlassen
}
 
if (get_key_short(1 << KEY_ENTER)) // Key: OK
{
paramSet( paramID, v ); // Wert speichern
break; // und verlassen
}
 
if( get_key_short(1 << KEY_PLUS) )
{
if(pos == 7) pos = 0;
else pos++;
redraw = SCREEN_REFRESH;
}
 
if( get_key_long(1 << KEY_PLUS) )
{
if(pos == 0) pos = 7;
else pos--;
redraw = SCREEN_REFRESH;
}
 
 
if( get_key_short (1 << KEY_MINUS) )
{
v ^= (1<<(7-pos));
redraw = SCREEN_REFRESH;
}
 
 
//------------------------------------------
// evtl. weitere lange Tasten abfangen, da es
// ansonsten ggf. Nebeneffekte bzgl. dem Menue
// beim verlassen der Funktion gibt
//------------------------------------------
get_key_long_rpt_sp( KEY_ALL,2);
 
 
//------------------------------------------
// Pruefe PKT-Update oder andere PKT-Aktion
//------------------------------------------
if( PKT_CtrlHook() ) // Update vom Updatetool angefordert?
{
lcd_cls();
redraw = SCREEN_REDRAW;
}
 
} // end: while( true )
}
 
 
 
//--------------------------------------------------------------
//--------------------------------------------------------------
void editCompassOffset( unsigned char paramID, uint8_t cmd )
{
unsigned char vu; // unsigned byte
int v; // signed
uint8_t redraw;
uint8_t bit7;
uint8_t bit8;
uint8_t lDisDeclCalc;
 
find_paramEditItem( paramID );
 
//-----------------------
// editCompassOffset() - FEHLER: paramEditItem (=paramID) nicht in Tabelle paramEditItemTable gefunden
//-----------------------
if( paramEditItem.paramID == param_EOF )
{
// TODO: Fehlercode anpassen!
_error( E12_PARAMID_EDITBITMASK, paramID, (cmd==MKPARAM_EDIT) );
return;
}
 
 
//-----------------------
// Wert ermitteln (-60 bis 60)
//-----------------------
vu = paramGet( paramID );
 
bit7 = ((vu & 0x40) ? true : false); // Bit 7: 1 = negativ; 0 = positiv
bit8 = ((vu & 0x80) ? true : false); // Bit 8 in Kombination mit Bit 7 = "Disable dec. Calc"
 
// Bit 8 == Bit 7: "Disable dec. Calc" AUS
// Bit 8 != Bit 7: "Disable dec. Calc" AN
lDisDeclCalc = ((bit8 == bit7) ? 0 : 1); // merken um das spaeter wieder in den Wert einzubauen
 
vu = (vu & (0x80 ^ 0xff)); // Bit 8 loeschen
 
if( bit7 ) // Wert negativ?
{
vu = vu - 1; // Umrechnung: 7-Bit Zweierkomplement
vu = (vu ^ 0xff); // invertieren
vu = (vu & (0x80 ^ 0xff)); // Bit 8 loeschen
v = (int)vu;
v = v * -1;
}
else // Wert ist positiv
{
v = (int)vu;
}
 
 
//-----------------------
// nur Rueckgabe des Wertes in mkparam_strValueBuffer ?
//-----------------------
if( cmd != MKPARAM_EDIT )
{
xsnprintf_P( mkparam_strValueBuffer, MKPARAM_STRBUFFER_LEN, PSTR("%3d"), v ); // erzeuge den Ausgabestring in mkparam_strValueBuffer
return;
}
 
 
//-----------------------
// Wert Editieren
//-----------------------
lcd_cls();
 
redraw = SCREEN_REDRAW;
 
while( true )
{
//-----------------------
// Anzeige: Titel, usw..
//-----------------------
if( redraw == SCREEN_REDRAW )
{
lcd_frect( 0, 0, 127, 7, 1); // Headline: Box fill
lcdx_printp_at( 1, 0, PSTR("Ändern") , MINVERS, 0,0); // Titel
lcd_printp_at( 0, 7, strGet(KEYLINE2) , MNORMAL); // Keyline: <- -> Ende OK
lcd_printp_at( 11, 7, strGet(KEYCANCEL), MNORMAL); // Keyline: "Abbr." statt "Ende" einsetzen
 
print_paramEditItemTitle(); // Bezeichnung des paramID's anzeigen
 
redraw = SCREEN_REFRESH;
}
 
 
//---------------
// LiPo Anzeigen
//---------------
show_Lipo(); // LiPo anzeigen
 
 
//-----------------------
// Anzeige: Wert
//-----------------------
if( redraw == SCREEN_REFRESH )
{
lcd_printf_at_P( 0, 4, MNORMAL, PSTR("> %3d"), v );
redraw = false;
}
 
 
//-----------------
// TASTEN
//-----------------
if( get_key_short(1 << KEY_ESC) ) // Key: Cancel
{
break; // verlassen
}
 
if( get_key_short(1 << KEY_ENTER) ) // Key: OK
{
//-------------------------------------
// signed int in unsigned byte wandeln
//-------------------------------------
if( v < 0 ) // Wert negativ?
{
// Umwandeln in 7-Bit Zweierkomplement
v = v * -1; // Wert positiv machen
vu = (unsigned char)v; // in unsigned Byte speichern
vu = (vu ^ 0xff); // invertieren
vu = vu + 1; // +1
}
else // Wert ist positiv
{
vu = (unsigned char)v; // in unsigned Byte speichern
}
 
//-------------------------------------
// "Disable declination calc" wieder einrechnen
//-------------------------------------
bit7 = ((vu & 0x40) ? true : false); // Bit 7: 1 = negativ; 0 = positiv
 
if( lDisDeclCalc ) bit8 = !bit7; // Bit 8 != Bit 7: "Disable dec. Calc" AN
else bit8 = bit7; // Bit 8 == Bit 7: "Disable dec. Calc" AUS
 
if( bit8 ) vu = (vu | 0x80); // Bit 8 setzen
else vu = (vu & (0x80 ^ 0xff)); // Bit 8 loeschen
 
//-------------------------------------
// Wert speichern
//-------------------------------------
paramSet( paramID, vu ); // Wert speichern
break; // und verlassen
} // end: KEY_ENTER
 
 
if( get_key_short(1 << KEY_MINUS) || get_key_long_rpt_sp( (1 << KEY_MINUS),2) )
{
if( v <= -60 ) v = 60;
else v = v - 1;
redraw = SCREEN_REFRESH;
}
 
 
if( get_key_short(1 << KEY_PLUS) || get_key_long_rpt_sp( (1 << KEY_PLUS),2) )
{
if( v >= 60 ) v = -60;
else v = v + 1;
redraw = SCREEN_REFRESH;
}
 
//------------------------------------------
// evtl. weitere lange Tasten abfangen, da es
// ansonsten ggf. Nebeneffekte bzgl. dem Menue
// beim verlassen der Funktion gibt
//------------------------------------------
get_key_long_rpt_sp( KEY_ALL,2);
 
 
//------------------------------------------
// Pruefe PKT-Update oder andere PKT-Aktion
//------------------------------------------
if( PKT_CtrlHook() ) // Update vom Updatetool angefordert?
{
lcd_cls();
redraw = SCREEN_REDRAW;
}
 
} // end: while( true )
}
 
//--------------------------------------------------------------
void editACCZLandingPulse( unsigned char paramID, uint8_t cmd )
{
unsigned char vu; // unsigned byte
// int v; // signed
uint8_t redraw;
// uint8_t bit7;
// uint8_t bit8;
// uint8_t lDisDeclCalc;
 
find_paramEditItem( paramID );
 
//-----------------------
// editACCZLandingPulse() - FEHLER: paramEditItem (=paramID) nicht in Tabelle paramEditItemTable gefunden
//-----------------------
if( paramEditItem.paramID == param_EOF )
{
// TODO: Fehlercode anpassen!
_error( E12_PARAMID_EDITBITMASK, paramID, (cmd==MKPARAM_EDIT) );
return;
}
 
vu = paramGet( paramID );
 
//-----------------------
// nur Rueckgabe des Wertes in mkparam_strValueBuffer ?
//-----------------------
if( cmd != MKPARAM_EDIT )
{
xsnprintf_P( mkparam_strValueBuffer, MKPARAM_STRBUFFER_LEN, PSTR("%4d"), vu*4 ); // erzeuge den Ausgabestring in mkparam_strValueBuffer
return;
}
 
 
//-----------------------
// Wert Editieren
//-----------------------
lcd_cls();
 
redraw = SCREEN_REDRAW;
 
while( true )
{
//-----------------------
// Anzeige: Titel, usw..
//-----------------------
if( redraw == SCREEN_REDRAW )
{
lcd_frect( 0, 0, 127, 7, 1); // Headline: Box fill
lcdx_printp_at( 1, 0, PSTR("Ändern") , MINVERS, 0,0); // Titel
lcd_printp_at( 0, 7, strGet(KEYLINE2) , MNORMAL); // Keyline: <- -> Ende OK
lcd_printp_at( 11, 7, strGet(KEYCANCEL), MNORMAL); // Keyline: "Abbr." statt "Ende" einsetzen
 
print_paramEditItemTitle(); // Bezeichnung des paramID's anzeigen
 
redraw = SCREEN_REFRESH;
}
 
 
//---------------
// LiPo Anzeigen
//---------------
show_Lipo(); // LiPo anzeigen
 
 
//-----------------------
// Anzeige: Wert
//-----------------------
if( redraw == SCREEN_REFRESH )
{
lcd_printf_at_P( 0, 4, MNORMAL, PSTR("> %4d"), vu *4 );
redraw = false;
}
 
 
//-----------------
// TASTEN
//-----------------
if( get_key_short(1 << KEY_ESC) ) // Key: Cancel
{
break; // verlassen
}
 
if( get_key_short(1 << KEY_ENTER) ) // Key: OK
{
// //-------------------------------------
// // signed int in unsigned byte wandeln
// //-------------------------------------
// if( v < 0 ) // Wert negativ?
// {
// // Umwandeln in 7-Bit Zweierkomplement
// v = v * -1; // Wert positiv machen
// vu = (unsigned char)v; // in unsigned Byte speichern
// vu = (vu ^ 0xff); // invertieren
// vu = vu + 1; // +1
// }
// else // Wert ist positiv
// {
// vu = (unsigned char)v; // in unsigned Byte speichern
// }
//
// //-------------------------------------
// // "Disable declination calc" wieder einrechnen
// //-------------------------------------
// bit7 = ((vu & 0x40) ? true : false); // Bit 7: 1 = negativ; 0 = positiv
//
// if( lDisDeclCalc ) bit8 = !bit7; // Bit 8 != Bit 7: "Disable dec. Calc" AN
// else bit8 = bit7; // Bit 8 == Bit 7: "Disable dec. Calc" AUS
//
// if( bit8 ) vu = (vu | 0x80); // Bit 8 setzen
// else vu = (vu & (0x80 ^ 0xff)); // Bit 8 loeschen
 
//-------------------------------------
// Wert speichern
//-------------------------------------
paramSet( paramID, vu ); // Wert speichern
break; // und verlassen
} // end: KEY_ENTER
 
 
if( get_key_short(1 << KEY_MINUS) || get_key_long_rpt_sp( (1 << KEY_MINUS),2) )
{
// if( v <= -60 ) v = 60;
// else v = v - 1;
//
if( vu < 191 ) vu = 190;
else vu = vu -1;
 
redraw = SCREEN_REFRESH;
}
 
 
if( get_key_short(1 << KEY_PLUS) || get_key_long_rpt_sp( (1 << KEY_PLUS),2) )
{
// if( v >= 60 ) v = -60;
// else v = v + 1;
if( vu >= 255 ) vu = 255;
// if( vu == 1 ) vu = 191;
else vu = vu +1;
redraw = SCREEN_REFRESH;
}
 
//------------------------------------------
// evtl. weitere lange Tasten abfangen, da es
// ansonsten ggf. Nebeneffekte bzgl. dem Menue
// beim verlassen der Funktion gibt
//------------------------------------------
get_key_long_rpt_sp( KEY_ALL,2);
 
 
//------------------------------------------
// Pruefe PKT-Update oder andere PKT-Aktion
//------------------------------------------
if( PKT_CtrlHook() ) // Update vom Updatetool angefordert?
{
lcd_cls();
redraw = SCREEN_REDRAW;
}
 
} // end: while( true )
}
 
//--------------------------------------------------------------
 
 
//--------------------------------------------------------------
// editNA( paramID, cmd )
//
// Hilfsfunktion die nur "nicht verfügbar" anzeigt wenn die
// paramID noch nicht implementiert ist
//
// PARAMETER:
// paramID: die paramID
// cmd: MKPARAM_EDIT oder MKPARAM_SHORTVALUE oder MKPARAM_LONGVALUE
//--------------------------------------------------------------
void editNA( unsigned char paramID, uint8_t cmd )
{
if( cmd != MKPARAM_EDIT )
{
strncpy_P( mkparam_strValueBuffer, PSTR("NA!"), MKPARAM_STRBUFFER_LEN); // "NA!" bzw, "not available"
return;
}
 
//PKT_Message_P( *text, error, timeout, beep, clearscreen )
PKT_Message_P( PSTR("nicht verfügbar"), false, 2000, true, true ); // "nicht verfügbar"
}
 
 
 
 
//#############################################################################################
//# TEST / DEBUG
//#############################################################################################
 
//--------------------------------------------------------------
//--------------------------------------------------------------
void editGenericTEST( unsigned char paramID )
{
lcd_cls();
 
//lcdx_printp_at( 0, 0, PSTR("NEW PARAM TEST..."), MNORMAL, 0,0);
lcd_printp_at(12, 7, strGet(ENDE), MNORMAL); // Keyline
 
find_paramEditItem( paramID ); // Ergebnis in paramEditItem (RAM)
 
if( paramEditItem.paramID == paramID )
{
lcd_printf_at_P( 0, 1, MNORMAL, PSTR("%S"), paramEditItem.title_de );
 
lcd_printf_at_P( 0, 2, MNORMAL, PSTR("format: %s"), paramEditFormat );
 
lcd_printf_at_P( 0, 3, MNORMAL, PSTR("value:%u"), paramGet(paramID) );
 
strValueGeneric( paramID, MKPARAM_LONGVALUE);
lcd_printf_at_P( 0, 4, MNORMAL, PSTR("vstr: %s"), mkparam_strValueBuffer );
 
strValueGeneric( paramID, MKPARAM_SHORTVALUE);
lcd_printf_at_P( 0, 5, MNORMAL, PSTR("vstr: %s"), mkparam_strValueBuffer );
}
 
 
if( paramEditItem.paramID == param_EOF )
{
lcd_printf_at_P( 0, 5, MNORMAL, PSTR("! ERROR !") );
}
 
 
//-----------------------------------------
// Tasten...
while( true )
{
PKT_CtrlHook();
if (get_key_press (1 << KEY_ESC))
{
break;
}
}
}
 
 
 
//--------------------------------------------------------------
//--------------------------------------------------------------
void TEST(void)
{
//editGeneric( param_Gyro_Gier_P, MKPARAM_EDIT );
editGeneric( param_Kanalbelegung_Gas, MKPARAM_EDIT );
}
 
 
 
 
//#############################################################################################
//# Menues & Favoriten
//#############################################################################################
 
 
//--------------------------------------------------------------
// fav_add()
//
// einen Favoriten hinzufuegen
//
// Aufruf durch: wird durch den Menu-Controller aufgerufen
//--------------------------------------------------------------
void fav_add( void )
{
uint8_t paramID;
uint8_t i;
 
 
//------------------------------
// welche paramID wurde gewaehlt?
//------------------------------
paramID = MenuCtrl_GetItemId(); // gewaehlter Menuepunkt bzw. paramID (0 = keine itemID)
 
 
//------------------------------
// ungueltige paramID?
//------------------------------
if( paramID==0 || paramID==EOF )
{
return; // keine gueltige paramID gewaehlt -> ZURUECK
}
 
 
//------------------------------
// Duplikatsuche bzgl. paramID
// (gilt nicht fuer SEPARATOR)
//------------------------------
if( paramID!=SEPARATOR )
{
//------------------------------
// suche Duplikate fuer paramID
//------------------------------
for( i=0; (i<MAX_MKPARAM_FAVORITES) && (Config.MKParam_Favs[i]!=paramID); i++);
 
//------------------------------
// Favoriten bereits vorhanden?
// -> exit
//------------------------------
if( Config.MKParam_Favs[i] == paramID )
{
set_beep( 300, 0x000f, BeepNormal); // Error Beep kurz
PKT_Popup_P( 400, strGet(STR_FAV_EXIST),0,0,0); // "* Fav vorhanden *" (ca. 4 sec max.)
return;
}
} // end: if( paramID!=SEPARATOR )
 
 
//------------------------------
// suche freien Speicherplatz fuer paramID
//------------------------------
for( i=0; (i<MAX_MKPARAM_FAVORITES) && (Config.MKParam_Favs[i]!=0); i++);
 
//------------------------------
// Favoriten voll?
// -> exit
//------------------------------
if( i >= MAX_MKPARAM_FAVORITES )
{
set_beep( 500, 0x000f, BeepNormal); // Error Beep lang
PKT_Popup_P( 400, strGet(STR_FAV_FULL),0,0,0); // "* Fav ist voll *" (ca. 4 sec max.)
return;
}
 
//------------------------------
// neuen Fav merken
//------------------------------
Config.MKParam_Favs[i] = paramID;
set_beep( 25, 0xffff, BeepNormal ); // kurzer Bestaetigungs-Beep
PKT_Popup_P( 400, strGet(STR_FAV_ADD),0,0,0); // "Fav hinzugefügt!" (ca. 4 sec max.)
}
 
 
 
//--------------------------------------------------------------
//--------------------------------------------------------------
void Menu_Favoriten( void )
{
uint8_t paramID;
uint8_t i;
 
//unsigned char MKParam_Favs[MAX_MKPARAM_FAVORITES]; // Array von MK-Parameter Favoriten des Benutzers
 
if( Config.MKParam_Favs[0] == 0 ) // Favoriten vorhanden
{
//PKT_Message_P( *text, error, timeout, beep, clearscreen )
PKT_Message_P( strGet(STR_FAV_NOTEXIST), false, 500, true, true ); // Anzeige "nicht verfügbar" (max. 2 Sekunden anzeigen)
return;
}
 
 
//---------------
// Create
//---------------
MenuCtrl_Create();
MenuCtrl_SetTitleFromParentItem(); // uebernimmt den Titel vom uebergeordneten Menuepunkt
MenuCtrl_ShowLevel( false );
MenuCtrl_SetDelete( true ); // Menueeintraege loeschen (langer Druck auf "OK")
MenuCtrl_SetMove( true ); // Menueeintraege verschieben (langer Druck auf hoch/runter)
//MenuCtrl_SetShowBatt( true );
//MenuCtrl_SetCycle( false );
//MenuCtrl_SetBeep( true );
 
 
//---------------
// Menu-Items
//---------------
i = 0;
while( (i<MAX_MKPARAM_FAVORITES) && (Config.MKParam_Favs[i]!=0) )
{
paramID = Config.MKParam_Favs[i];
 
if( paramID == SEPARATOR )
{
MenuCtrl_PushSeparatorID( SEPARATOR ); // Trennlinie im Menue hinzufuegen
}
else
{
find_paramEditItem( paramID );
 
//--------
// FEHLER: paramEditItem (=paramID) nicht in Tabelle paramEditItemTable gefunden - Menu_EditCategory()
//--------
if( paramEditItem.paramID == param_EOF )
{
_error( E01_PARAMID_MENUEDITCATEGORY, paramID, true);
MenuCtrl_Destroy();
return;
}
 
MenuCtrl_PushParamEdit( paramID );
 
// existiert die paramID in der Firmware des Kopters?
if( !paramExist(paramID) )
{
MenuCtrl_ItemActive( paramID, false ); // paramID deaktivieren
}
 
// DEBUG! (Simulation eines deaktivierten Fav's)
// if( i==2 ) MenuCtrl_ItemActive( paramID, false ); // paramID deaktivieren
 
} // end: else: if( paramID == SEPARATOR )
 
i++;
} // end: while(..)
 
 
 
//---------------
// Control
//---------------
while( true )
{
MenuCtrl_Control( MENUCTRL_EVENT );
if( MenuCtrl_GetKey() == KEY_ESC ) break; // KEY_ESC = Menue beenden
 
paramID = MenuCtrl_GetItemId(); // welcher Menu-Punkt (= paramID)
 
find_paramEditItem( paramID ); // Edit-Definitionen heraussuchen (initialisiert: paramEditItem)
 
paramEditItem.editfunc( paramID, MKPARAM_EDIT ); // zugeordnete Edit-Funktion aufrufen
}
 
 
//---------------
// ggf. neue Menuereihenfolge
// in der Config speichern
//---------------
for( i=0; (i<MAX_MKPARAM_FAVORITES); i++)
{
Config.MKParam_Favs[i] = MenuCtrl_GetItemIdByIndex( i );
}
 
 
//---------------
// Destroy
//---------------
MenuCtrl_Destroy();
}
 
 
 
//--------------------------------------------------------------
//--------------------------------------------------------------
void Menu_EditCategory( const unsigned char *menuitems )
{
unsigned char paramID;
unsigned char lastmenuitem = 0;
 
//---------------
// Create
//---------------
MenuCtrl_Create();
 
//---------------
// Einstellungen
//---------------
MenuCtrl_SetTitleFromParentItem(); // uebernimmt den Titel vom uebergeordneten Menuepunkt
MenuCtrl_ShowLevel( false );
//MenuCtrl_SetShowBatt( true );
//MenuCtrl_SetCycle( false );
//MenuCtrl_SetBeep( true );
 
//MenuCtrl_SetKey( uint8_t key, const char *keytext, void (*keyfunc)(void) )
MenuCtrl_SetKey( KEY_ENTER_LONG, 0, &fav_add );
 
 
//---------------
// Menuitems
//---------------
while( *menuitems != EOF )
{
paramID = *menuitems;
 
if( paramID == SEPARATOR )
{
// wenn der vorherige Menueeintrag bereits ein SEPARATOR war
// dann nicht erneut einen Separator anzeigen!
//
// Das kann ggf. passieren wenn z.B. aufgrund der FC-Revision
// alle Zwischeneintraege ausgeblendet wurden
if( lastmenuitem != SEPARATOR )
{
MenuCtrl_PushSeparatorID( SEPARATOR ); // Trennlinie im Menue hinzufuegen
lastmenuitem = paramID;
}
}
else
{
//------------------------------------------------------
// TEST / DEBUG fuer beschriebenes Problem in _error()
//
// Wenn man das dortige Problem nachstellen will kann
// man hier einen Fehlerscreen provozieren!
//------------------------------------------------------
//paramID = 0;
 
 
find_paramEditItem( paramID );
 
//--------
// FEHLER: paramEditItem (=paramID) nicht in Tabelle paramEditItemTable gefunden - Menu_EditCategory()
//--------
if( paramEditItem.paramID == param_EOF )
{
_error( E01_PARAMID_MENUEDITCATEGORY, paramID, true);
MenuCtrl_Destroy();
return;
}
 
// existiert die paramID in der Firmware des Kopters?
if( paramExist(paramEditItem.paramID) )
{
MenuCtrl_PushParamEdit( paramEditItem.paramID );
lastmenuitem = paramID;
}
}
 
menuitems++;
}
 
 
//---------------
// Control
//---------------
while( true )
{
MenuCtrl_Control( MENUCTRL_EVENT );
if( MenuCtrl_GetKey() == KEY_ESC ) break; // Menue beenden
 
paramID = MenuCtrl_GetItemId(); // welcher Menu-Punkt (= paramID)
 
find_paramEditItem( paramID ); // Edit-Definitionen heraussuchen (initialisiert: paramEditItem)
 
paramEditItem.editfunc( paramID, MKPARAM_EDIT ); // zugeordnete Edit-Funktion aufrufen
}
 
//---------------
// Destroy
//---------------
MenuCtrl_Destroy();
}
 
 
 
 
//--------------------------------------------------------------
//--------------------------------------------------------------
void MK_Parameters_MenuMain( uint8_t setting, char *settingname )
{
uint8_t itemid;
 
//---------------
// Create
//---------------
MenuCtrl_Create();
 
//---------------
// Einstellungen
//---------------
MenuCtrl_SetTitle( settingname );
MenuCtrl_ShowLevel( false );
//MenuCtrl_SetShowBatt( true );
//MenuCtrl_SetCycle( false );
//MenuCtrl_SetBeep( true );
 
//---------------
// Menuitems
//---------------
//MenuCtrl_PushML2_P( ID_MENU_TEST , MENU_ITEM, &TEST, ID_MENU_TEST_de , ID_MENU_TEST_en );
 
MenuCtrl_PushML2_P( ID_MENU_FAVORITEN , MENU_ITEM, NOFUNC, ID_MENU_FAVORITEN_de , ID_MENU_FAVORITEN_en ); // Favoriten: noch nicht implementiert...
 
MenuCtrl_PushSeparator(); // MENUE TRENNLINIE
 
MenuCtrl_PushML2_P( ID_MENU_KANAELE , MENU_ITEM, NOFUNC, ID_MENU_KANAELE_de , ID_MENU_KANAELE_en );
MenuCtrl_PushML2_P( ID_MENU_KONFIGURATION, MENU_ITEM, NOFUNC, ID_MENU_KONFIGURATION_de, ID_MENU_KONFIGURATION_en );
MenuCtrl_PushML2_P( ID_MENU_STICK , MENU_ITEM, NOFUNC, ID_MENU_STICK_de , ID_MENU_STICK_en );
MenuCtrl_PushML2_P( ID_MENU_LOOPING , MENU_ITEM, NOFUNC, ID_MENU_LOOPING_de , ID_MENU_LOOPING_en );
MenuCtrl_PushML2_P( ID_MENU_HOEHE , MENU_ITEM, NOFUNC, ID_MENU_HOEHE_de , ID_MENU_HOEHE_en );
MenuCtrl_PushML2_P( ID_MENU_KAMERA , MENU_ITEM, NOFUNC, ID_MENU_KAMERA_de , ID_MENU_KAMERA_en );
MenuCtrl_PushML2_P( ID_MENU_NAVICTRL , MENU_ITEM, NOFUNC, ID_MENU_NAVICTRL_de , ID_MENU_NAVICTRL_en );
MenuCtrl_PushML2_P( ID_MENU_AUSGAENGE , MENU_ITEM, NOFUNC, ID_MENU_AUSGAENGE_de , ID_MENU_AUSGAENGE_en );
MenuCtrl_PushML2_P( ID_MENU_VERSCHIEDENES, MENU_ITEM, NOFUNC, ID_MENU_VERSCHIEDENES_de, ID_MENU_VERSCHIEDENES_en );
MenuCtrl_PushML2_P( ID_MENU_GYRO , MENU_ITEM, NOFUNC, ID_MENU_GYRO_de , ID_MENU_GYRO_en );
MenuCtrl_PushML2_P( ID_MENU_BENUTZER , MENU_ITEM, NOFUNC, ID_MENU_BENUTZER_de , ID_MENU_BENUTZER_en );
MenuCtrl_PushML2_P( ID_MENU_ACHSKOPPLUNG , MENU_ITEM, NOFUNC, ID_MENU_ACHSKOPPLUNG_de , ID_MENU_ACHSKOPPLUNG_en );
//MenuCtrl_PushML2_P( ID_MENU_MIXERSETUP , MENU_ITEM, NOFUNC, ID_MENU_MIXERSETUP_de , ID_MENU_MIXERSETUP_en ); // nicht mehr unterstuetzt!
MenuCtrl_PushML2_P( ID_MENU_EASYSETUP , MENU_ITEM, NOFUNC, ID_MENU_EASYSETUP_de , ID_MENU_EASYSETUP_en );
 
 
//---------------
// Control
//---------------
while( true )
{
MenuCtrl_Control( MENUCTRL_EVENT );
if( MenuCtrl_GetKey() == KEY_ESC ) break;
 
itemid = MenuCtrl_GetItemId(); // welcher Menu-Punkt (ID)
 
switch( itemid )
{
case ID_MENU_FAVORITEN: Menu_Favoriten(); break;
 
case ID_MENU_KANAELE: Menu_EditCategory( ID_MENU_KANAELE_Items ); break;
case ID_MENU_KONFIGURATION: Menu_EditCategory( ID_MENU_KONFIGURATION_Items ); break;
case ID_MENU_STICK: Menu_EditCategory( ID_MENU_STICK_Items ); break;
case ID_MENU_LOOPING: Menu_EditCategory( ID_MENU_LOOPING_Items ); break;
case ID_MENU_HOEHE: Menu_EditCategory( ID_MENU_HOEHE_Items ); break;
case ID_MENU_KAMERA: Menu_EditCategory( ID_MENU_KAMERA_Items ); break;
case ID_MENU_NAVICTRL: Menu_EditCategory( ID_MENU_NAVICTRL_Items ); break;
case ID_MENU_AUSGAENGE: Menu_EditCategory( ID_MENU_AUSGAENGE_Items ); break;
case ID_MENU_VERSCHIEDENES: Menu_EditCategory( ID_MENU_VERSCHIEDENES_Items ); break;
case ID_MENU_GYRO: Menu_EditCategory( ID_MENU_GYRO_Items ); break;
case ID_MENU_BENUTZER: Menu_EditCategory( ID_MENU_BENUTZER_Items ); break;
case ID_MENU_ACHSKOPPLUNG: Menu_EditCategory( ID_MENU_ACHSKOPPLUNG_Items ); break;
case ID_MENU_EASYSETUP: Menu_EditCategory( ID_MENU_EASYSETUP_Items ); break;
 
default: //PKT_Message_P( *text, error, timeout, beep, clearscreen )
PKT_Message_P( PSTR("nicht verfügbar"), false, 200, true, true ); // Anzeige "nicht verfügbar" (max. 2 Sekunden anzeigen)
break;
}
}
 
 
//---------------
// Destroy
//---------------
MenuCtrl_Destroy();
}
 
 
 
 
 
//#############################################################################################
//# MK_Parameters() - Main-Function
//#############################################################################################
 
//--------------------------------------------------------------
// changed = MK_Parameters( setting, settingname )
//--------------------------------------------------------------
uint8_t MK_Parameters( uint8_t setting, char *settingname )
{
int changed;
unsigned char *org_parameters;
uint8_t size = paramsetSize();
 
//-----------------------------------------------------------------
// Erkennung ob Aenderungen durch den Benutzer vorgenommen wurde
// -> das aktuelle Paramset wird gespeichert um es spaeter mit
// der bearbeiteten Version via memcmp zu vergleichen
//-----------------------------------------------------------------
org_parameters = malloc( size+1 ); // +1 fuer das erste settings-byte
 
if( !org_parameters )
{
//PKT_Message_P( *text, error, timeout, beep, clearscreen )
PKT_Message_P( PSTR("NO RAM!"), true, 800, true, true ); // FEHLER! (NO RAM)
return false;
}
memcpy( org_parameters, (unsigned char *)(pRxData), size+1 ); // memcpy( dst, src, size))
 
 
//-----------------------------------------------------------------
// MK-Parameter bearbeiten
//-----------------------------------------------------------------
MK_Parameters_MenuMain( setting, settingname );
 
 
//-----------------------------------------------------------------
// Vergleich: Orginal-Daten <-> ggf. geaenderte Daten
//-----------------------------------------------------------------
changed = memcmp( org_parameters, (unsigned char *)(pRxData), size+1 );
 
free( org_parameters );
 
return( changed!=0 );
}
 
Property changes:
Added: svn:mime-type
+text/plain
\ No newline at end of property