1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-25 09:15:38 +03:00

[all] Global Variables

[X9D] Scroll Bar in all menus
This commit is contained in:
bsongis 2012-10-15 19:41:19 +00:00
parent 08c7b2898f
commit cd995aa975
19 changed files with 441 additions and 189 deletions

View file

@ -193,9 +193,9 @@ CURVES = YES
# Values = YES, NO
XCURVES = YES
# Registers
# Global Vars
# Values = YES, NO
REGISTERS = NO
GVARS = NO
#------- END BUILD OPTIONS ---------------------------
@ -364,8 +364,8 @@ ifeq ($(XCURVES), YES)
CPPDEFS += -DXCURVES
endif
ifeq ($(REGISTERS), YES)
CPPDEFS += -DREGISTERS
ifeq ($(GVARS), YES)
CPPDEFS += -DGVARS
endif
# If STD-Support is enabled

View file

@ -70,23 +70,23 @@ const MenuFuncP_PROGMEM menuTabDiag[] PROGMEM = {
menuGeneralCalib
};
#define GENERAL_PARAM_OFS (2+16*FW)
#define RADIO_SETUP_2ND_COLUMN (DISPLAY_W-5*FW-MENUS_SCROLLBAR_WIDTH)
#if defined(GRAPHICS)
void displaySlider(uint8_t x, uint8_t y, uint8_t value, uint8_t attr)
{
lcd_putc(GENERAL_PARAM_OFS+2*FW+(value*FW), y, '$');
lcd_hline(GENERAL_PARAM_OFS, y+3, 5*FW-1, SOLID);
if (attr && (!(attr & BLINK) || !BLINK_ON_PHASE)) lcd_filled_rect(GENERAL_PARAM_OFS, y, 5*FW-1, FH-1);
lcd_putc(RADIO_SETUP_2ND_COLUMN+2*FW+(value*FW), y, '$');
lcd_hline(RADIO_SETUP_2ND_COLUMN, y+3, 5*FW-1, SOLID);
if (attr && (!(attr & BLINK) || !BLINK_ON_PHASE)) lcd_filled_rect(RADIO_SETUP_2ND_COLUMN, y, 5*FW-1, FH-1);
}
#define SLIDER(y, value, min, max, label, values, event, attr) { \
int8_t tmp = value; \
displaySlider(GENERAL_PARAM_OFS, y, tmp, attr); \
value = selectMenuItem(GENERAL_PARAM_OFS, y, label, NULL, tmp, min, max, attr, event); \
displaySlider(RADIO_SETUP_2ND_COLUMN, y, tmp, attr); \
value = selectMenuItem(RADIO_SETUP_2ND_COLUMN, y, label, NULL, tmp, min, max, attr, event); \
}
#else
#define SLIDER(y, value, min, max, label, values, event, attr) \
value = selectMenuItem(GENERAL_PARAM_OFS, y, label, values, value, min, max, attr, event)
value = selectMenuItem(RADIO_SETUP_2ND_COLUMN, y, label, values, value, min, max, attr, event)
#endif
enum menuGeneralSetupItems {
@ -207,7 +207,7 @@ void menuGeneralSetup(uint8_t event)
#endif
case ITEM_SETUP_BEEPER_MODE:
g_eeGeneral.beeperMode = selectMenuItem(GENERAL_PARAM_OFS, y, STR_BEEPERMODE, STR_VBEEPMODE, g_eeGeneral.beeperMode, -2, 1, attr, event);
g_eeGeneral.beeperMode = selectMenuItem(RADIO_SETUP_2ND_COLUMN, y, STR_BEEPERMODE, STR_VBEEPMODE, g_eeGeneral.beeperMode, -2, 1, attr, event);
#if defined(FRSKY)
if (attr && checkIncDec_Ret) FRSKY_setModelAlarms();
#endif
@ -220,7 +220,7 @@ void menuGeneralSetup(uint8_t event)
#if defined(AUDIO)
case ITEM_SETUP_SPEAKER_PITCH:
lcd_putsLeft( y, STR_SPKRPITCH);
lcd_outdezAtt(GENERAL_PARAM_OFS, y, g_eeGeneral.speakerPitch, attr|LEFT);
lcd_outdezAtt(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.speakerPitch, attr|LEFT);
if (attr) {
CHECK_INCDEC_GENVAR(event, g_eeGeneral.speakerPitch, 0, 20);
}
@ -232,14 +232,14 @@ void menuGeneralSetup(uint8_t event)
{
lcd_putsLeft(y, STR_SPEAKER_VOLUME);
#if defined(PCBSKY9X)
lcd_outdezAtt(GENERAL_PARAM_OFS, y, g_eeGeneral.speakerVolume, attr|LEFT);
lcd_outdezAtt(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.speakerVolume, attr|LEFT);
if (attr) {
CHECK_INCDEC_GENVAR(event, g_eeGeneral.speakerVolume, 0, NUM_VOL_LEVELS-1);
}
#else
uint8_t b ;
b = g_eeGeneral.speakerVolume+7;
lcd_outdezAtt(GENERAL_PARAM_OFS, y, b, attr|LEFT);
lcd_outdezAtt(RADIO_SETUP_2ND_COLUMN, y, b, attr|LEFT);
if (attr) {
CHECK_INCDEC_GENVAR(event, b, 0, 7);
if (checkIncDec_Ret) {
@ -254,7 +254,7 @@ void menuGeneralSetup(uint8_t event)
#if defined(HAPTIC)
case ITEM_SETUP_HAPTIC_MODE:
g_eeGeneral.hapticMode = selectMenuItem(GENERAL_PARAM_OFS, y, STR_HAPTICMODE, STR_VBEEPMODE, g_eeGeneral.hapticMode, -2, 1, attr, event);
g_eeGeneral.hapticMode = selectMenuItem(RADIO_SETUP_2ND_COLUMN, y, STR_HAPTICMODE, STR_VBEEPMODE, g_eeGeneral.hapticMode, -2, 1, attr, event);
break;
case ITEM_SETUP_HAPTIC_LENGTH:
@ -263,7 +263,7 @@ void menuGeneralSetup(uint8_t event)
case ITEM_SETUP_HAPTIC_STRENGTH:
lcd_putsLeft( y, STR_HAPTICSTRENGTH);
lcd_outdezAtt(GENERAL_PARAM_OFS, y, g_eeGeneral.hapticStrength, attr|LEFT);
lcd_outdezAtt(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.hapticStrength, attr|LEFT);
if (attr) {
CHECK_INCDEC_GENVAR(event, g_eeGeneral.hapticStrength, 0, 5);
}
@ -273,7 +273,7 @@ void menuGeneralSetup(uint8_t event)
#if defined(PCBSKY9X)
case ITEM_SETUP_BRIGHTNESS:
lcd_putsLeft(y, STR_BRIGHTNESS);
lcd_outdezAtt(GENERAL_PARAM_OFS, y, 100-g_eeGeneral.backlightBright, attr|LEFT) ;
lcd_outdezAtt(RADIO_SETUP_2ND_COLUMN, y, 100-g_eeGeneral.backlightBright, attr|LEFT) ;
if(attr) {
uint8_t b ;
b = 100 - g_eeGeneral.backlightBright;
@ -285,7 +285,7 @@ void menuGeneralSetup(uint8_t event)
case ITEM_SETUP_CONTRAST:
lcd_putsLeft( y, STR_CONTRAST);
lcd_outdezAtt(GENERAL_PARAM_OFS,y,g_eeGeneral.contrast, attr|LEFT);
lcd_outdezAtt(RADIO_SETUP_2ND_COLUMN,y,g_eeGeneral.contrast, attr|LEFT);
if(attr) {
CHECK_INCDEC_GENVAR(event, g_eeGeneral.contrast, 10, 45);
lcdSetContrast();
@ -294,34 +294,34 @@ void menuGeneralSetup(uint8_t event)
case ITEM_SETUP_BATTERY_WARNING:
lcd_putsLeft( y,STR_BATTERYWARNING);
putsVolts(GENERAL_PARAM_OFS, y, g_eeGeneral.vBatWarn, attr|LEFT);
putsVolts(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.vBatWarn, attr|LEFT);
if(attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.vBatWarn, 40, 120); //4-12V
break;
#if defined(PCBSKY9X)
case ITEM_SETUP_CAPACITY_WARNING:
lcd_putsLeft(y, STR_CAPAWARNING);
putsTelemetryValue(GENERAL_PARAM_OFS, y, g_eeGeneral.mAhWarn*50, UNIT_MAH, attr|LEFT) ;
putsTelemetryValue(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.mAhWarn*50, UNIT_MAH, attr|LEFT) ;
if(attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.mAhWarn, 0, 100);
break;
case ITEM_SETUP_TEMPERATURE_WARNING:
lcd_putsLeft(y, STR_TEMPWARNING);
putsTelemetryValue(GENERAL_PARAM_OFS, y, g_eeGeneral.temperatureWarn, UNIT_DEGREES, attr|LEFT) ;
putsTelemetryValue(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.temperatureWarn, UNIT_DEGREES, attr|LEFT) ;
if(attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.temperatureWarn, 0, 120); // 0 means no alarm
break;
#endif
case ITEM_SETUP_INACTIVITY_ALARM:
lcd_putsLeft( y,STR_INACTIVITYALARM);
lcd_outdezAtt(GENERAL_PARAM_OFS, y, g_eeGeneral.inactivityTimer, attr|LEFT);
lcd_outdezAtt(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.inactivityTimer, attr|LEFT);
lcd_putc(lcdLastPos, y, 'm');
if(attr) g_eeGeneral.inactivityTimer = checkIncDec(event, g_eeGeneral.inactivityTimer, 0, 250, EE_GENERAL); //0..250minutes
break;
#if defined(ROTARY_ENCODERS)
case ITEM_SETUP_RE_NAVIGATION:
g_eeGeneral.reNavigation = selectMenuItem(GENERAL_PARAM_OFS, y, STR_RENAVIG, STR_VRENAVIG, g_eeGeneral.reNavigation, 0, ROTARY_ENCODERS, attr, event);
g_eeGeneral.reNavigation = selectMenuItem(RADIO_SETUP_2ND_COLUMN, y, STR_RENAVIG, STR_VRENAVIG, g_eeGeneral.reNavigation, 0, ROTARY_ENCODERS, attr, event);
if (attr && checkIncDec_Ret) {
for (uint8_t i=0; i<ROTARY_ENCODERS; i++)
g_rotenc[i] = 0;
@ -332,32 +332,32 @@ void menuGeneralSetup(uint8_t event)
#endif
case ITEM_SETUP_FILTER_ADC:
g_eeGeneral.filterInput = selectMenuItem(GENERAL_PARAM_OFS, y, STR_FILTERADC, STR_VFILTERADC, g_eeGeneral.filterInput, 0, 2, attr, event);
g_eeGeneral.filterInput = selectMenuItem(RADIO_SETUP_2ND_COLUMN, y, STR_FILTERADC, STR_VFILTERADC, g_eeGeneral.filterInput, 0, 2, attr, event);
break;
case ITEM_SETUP_THROTTLE_REVERSED:
g_eeGeneral.throttleReversed = onoffMenuItem( g_eeGeneral.throttleReversed, GENERAL_PARAM_OFS, y, STR_THROTTLEREVERSE, attr, event ) ;
g_eeGeneral.throttleReversed = onoffMenuItem( g_eeGeneral.throttleReversed, RADIO_SETUP_2ND_COLUMN, y, STR_THROTTLEREVERSE, attr, event ) ;
break;
case ITEM_SETUP_MINUTE_BEEP:
g_eeGeneral.minuteBeep = onoffMenuItem( g_eeGeneral.minuteBeep, GENERAL_PARAM_OFS, y, STR_MINUTEBEEP, attr, event ) ;
g_eeGeneral.minuteBeep = onoffMenuItem( g_eeGeneral.minuteBeep, RADIO_SETUP_2ND_COLUMN, y, STR_MINUTEBEEP, attr, event ) ;
break;
case ITEM_SETUP_COUNTDOWN_BEEP:
g_eeGeneral.preBeep = onoffMenuItem( g_eeGeneral.preBeep, GENERAL_PARAM_OFS, y, STR_BEEPCOUNTDOWN, attr, event ) ;
g_eeGeneral.preBeep = onoffMenuItem( g_eeGeneral.preBeep, RADIO_SETUP_2ND_COLUMN, y, STR_BEEPCOUNTDOWN, attr, event ) ;
break;
case ITEM_SETUP_FLASH_BEEP:
g_eeGeneral.flashBeep = onoffMenuItem( g_eeGeneral.flashBeep, GENERAL_PARAM_OFS, y, STR_FLASHONBEEP, attr, event ) ;
g_eeGeneral.flashBeep = onoffMenuItem( g_eeGeneral.flashBeep, RADIO_SETUP_2ND_COLUMN, y, STR_FLASHONBEEP, attr, event ) ;
break;
case ITEM_SETUP_BACKLIGHT_MODE:
g_eeGeneral.backlightMode = selectMenuItem(GENERAL_PARAM_OFS, y, STR_BLMODE, STR_VBLMODE, g_eeGeneral.backlightMode, e_backlight_mode_off, e_backlight_mode_on, attr, event);
g_eeGeneral.backlightMode = selectMenuItem(RADIO_SETUP_2ND_COLUMN, y, STR_BLMODE, STR_VBLMODE, g_eeGeneral.backlightMode, e_backlight_mode_off, e_backlight_mode_on, attr, event);
break;
case ITEM_SETUP_BACKLIGHT_DELAY:
lcd_putsLeft( y, STR_BLDELAY);
lcd_outdezAtt(GENERAL_PARAM_OFS, y, g_eeGeneral.lightAutoOff*5, attr|LEFT);
lcd_outdezAtt(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.lightAutoOff*5, attr|LEFT);
lcd_putc(lcdLastPos, y, 's');
if(attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.lightAutoOff, 0, 600/5);
break;
@ -366,7 +366,7 @@ void menuGeneralSetup(uint8_t event)
case ITEM_SETUP_DISABLE_SPLASH:
{
uint8_t b = 1-g_eeGeneral.disableSplashScreen;
g_eeGeneral.disableSplashScreen = 1 - onoffMenuItem( b, GENERAL_PARAM_OFS, y, STR_SPLASHSCREEN, attr, event ) ;
g_eeGeneral.disableSplashScreen = 1 - onoffMenuItem( b, RADIO_SETUP_2ND_COLUMN, y, STR_SPLASHSCREEN, attr, event ) ;
break;
}
#endif
@ -374,33 +374,33 @@ void menuGeneralSetup(uint8_t event)
case ITEM_SETUP_MEMORY_WARNING:
{
uint8_t b = 1-g_eeGeneral.disableMemoryWarning;
g_eeGeneral.disableMemoryWarning = 1 - onoffMenuItem( b, GENERAL_PARAM_OFS, y, STR_MEMORYWARNING, attr, event ) ;
g_eeGeneral.disableMemoryWarning = 1 - onoffMenuItem( b, RADIO_SETUP_2ND_COLUMN, y, STR_MEMORYWARNING, attr, event ) ;
break;
}
case ITEM_SETUP_ALARM_WARNING:
{
uint8_t b = 1-g_eeGeneral.disableAlarmWarning;
g_eeGeneral.disableAlarmWarning = 1 - onoffMenuItem( b, GENERAL_PARAM_OFS, y, STR_ALARMWARNING, attr, event ) ;
g_eeGeneral.disableAlarmWarning = 1 - onoffMenuItem( b, RADIO_SETUP_2ND_COLUMN, y, STR_ALARMWARNING, attr, event ) ;
break;
}
#if defined(FRSKY)
case ITEM_SETUP_TIMEZONE:
lcd_putsLeft(y, STR_TIMEZONE);
lcd_outdezAtt(GENERAL_PARAM_OFS, y, g_eeGeneral.timezone, attr|LEFT);
lcd_outdezAtt(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.timezone, attr|LEFT);
if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.timezone, -12, 12);
break;
case ITEM_SETUP_GPSFORMAT:
g_eeGeneral.gpsFormat = selectMenuItem(GENERAL_PARAM_OFS, y, STR_GPSCOORD, STR_GPSFORMAT, g_eeGeneral.gpsFormat, 0, 1, attr, event);
g_eeGeneral.gpsFormat = selectMenuItem(RADIO_SETUP_2ND_COLUMN, y, STR_GPSCOORD, STR_GPSFORMAT, g_eeGeneral.gpsFormat, 0, 1, attr, event);
break;
#endif
case ITEM_SETUP_RX_CHANNEL_ORD:
lcd_putsLeft( y,STR_RXCHANNELORD);// RAET->AETR
for (uint8_t i=1; i<=4; i++)
putsChnLetter(GENERAL_PARAM_OFS - FW + i*FW, y, channel_order(i), attr);
putsChnLetter(RADIO_SETUP_2ND_COLUMN - FW + i*FW, y, channel_order(i), attr);
if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.templateSetup, 0, 23);
break;
@ -899,7 +899,7 @@ void menuGeneralHardware(uint8_t event)
#if defined(BLUETOOTH)
case ITEM_SETUP_HW_BT_BAUDRATE:
g_eeGeneral.btBaudrate = selectMenuItem(GENERAL_PARAM_OFS, y, STR_BAUDRATE, PSTR("\005115k 9600 19200"), g_eeGeneral.btBaudrate, 0, 2, attr, event);
g_eeGeneral.btBaudrate = selectMenuItem(RADIO_SETUP_2ND_COLUMN, y, STR_BAUDRATE, PSTR("\005115k 9600 19200"), g_eeGeneral.btBaudrate, 0, 2, attr, event);
if (attr && checkIncDec_Ret) {
btInit();
}

View file

@ -624,7 +624,7 @@ void check_mavlink() {
}
// Start of Mavlink menus <<<<<<<<<<<<<<<<<<<<<<<<<<<
void DisplayScreenIndex(uint8_t index, uint8_t count, uint8_t attr);
void displayScreenIndex(uint8_t index, uint8_t count, uint8_t attr);
enum mavlink_menu_ {
MENU_INFO = 0, //
@ -656,7 +656,7 @@ inline mavlink_menu_ operator--(mavlink_menu_ &eDOW, int) {
void mav_title(const pm_char * s, uint8_t index) {
lcd_putsAtt(0, 0, PSTR("MAVLINK"), INVERS);
lcd_putsAtt(10 * FW, 0, s, 0);
DisplayScreenIndex(index, MAX_MAVLINK_MENU, INVERS);
displayScreenIndex(index, MAX_MAVLINK_MENU, INVERS);
lcd_putcAtt(8 * FW, 0, (mav_heartbeat > 0) ? '*' : ' ', 0);
}

View file

@ -58,13 +58,26 @@ void menu_lcd_onoff(uint8_t x,uint8_t y, uint8_t value, uint8_t attr)
#endif
}
void DisplayScreenIndex(uint8_t index, uint8_t count, uint8_t attr)
void displayScreenIndex(uint8_t index, uint8_t count, uint8_t attr)
{
lcd_outdezAtt(DISPLAY_W,0,count,attr);
lcd_putcAtt(1+DISPLAY_W-FW*(count>9 ? 3 : 2),0,'/',attr);
lcd_outdezAtt(1+DISPLAY_W-FW*(count>9 ? 3 : 2),0,index+1,attr);
}
#if !defined(PCBSTD)
void displayScrollbar(uint8_t x, uint8_t y, uint8_t h, uint16_t offset, uint16_t count, uint8_t visible)
{
lcd_vlineStip(x, y, h, SOLID, WHITE);
lcd_vlineStip(x, y, h, DOTTED);
uint8_t yofs = (h * offset) / count;
uint8_t yhgt = (h * visible) / count;
if (yhgt + yofs > h)
yhgt = h - yofs;
lcd_vlineStip(x, y + yofs, yhgt, SOLID, BLACK);
}
#endif
#if defined(ROTARY_ENCODERS)
int8_t scrollRE;
int16_t p1valdiff;
@ -326,7 +339,12 @@ bool check(uint8_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTa
}
}
s_noScroll = 0;
DisplayScreenIndex(curr, menuTabSize, attr);
displayScreenIndex(curr, menuTabSize, attr);
#if defined(PCBX9D)
if (maxrow > 7)
displayScrollbar(DISPLAY_W-1, FH, DISPLAY_H-FH, s_pgOfs, maxrow, 7);
#endif
}
#if defined(ROTARY_ENCODERS)
else if (m_posVert < 0) {
@ -608,6 +626,43 @@ int8_t switchMenuItem(uint8_t x, uint8_t y, int8_t value, uint8_t attr, uint8_t
return value;
}
#if defined(GVARS)
int8_t gvarMenuItem(uint8_t x, uint8_t y, int8_t value, int8_t min, int8_t max, uint8_t attr, uint8_t event)
{
bool invers = attr&INVERS;
if (invers && event == EVT_KEY_LONG(KEY_MENU)) {
value = (value >= 126 ? REG_VALUE(value-126) : 126);
eeDirty(EE_MODEL);
}
if (value >= 126) {
putsStrIdx(attr&LEFT?x:x-FW-FWNUM, y, STR_GV, value - 126 + 1, attr);
if (invers) CHECK_INCDEC_MODELVAR(event, value, 126, 127);
}
else {
lcd_outdezAtt(x, y, value, attr);
if (invers) CHECK_INCDEC_MODELVAR(event, value, min, max);
}
return value;
}
void displayGVar(uint8_t x, uint8_t y, int8_t value)
{
if (value > 125) {
putsStrIdx(x-FW-FWNUM, y, STR_GV, value - 125, 0);
}
else {
lcd_outdezAtt(x, y, value, 0);
}
}
#else
int8_t gvarMenuItem(uint8_t x, uint8_t y, int8_t value, int8_t min, int8_t max, uint8_t attr, uint8_t event)
{
lcd_outdezAtt(x, y, value, attr);
if (attr&INVERS) CHECK_INCDEC_MODELVAR(event, value, min, max);
return value;
}
#endif
#if defined(SDCARD)
const char *s_menu[MENU_MAX_LINES];
uint8_t s_menu_item = 0;
@ -629,14 +684,7 @@ const char * displayMenu(uint8_t event)
}
if (s_menu_count > display_count) {
// scroll bar
lcd_vlineStip(DISPLAY_W-11, 16, MENU_MAX_LINES * (FH+1) + 2, SOLID, WHITE);
lcd_vlineStip(DISPLAY_W-11, 16, MENU_MAX_LINES * (FH+1) + 2, DOTTED);
uint8_t ofs = (MENU_MAX_LINES * (FH+1) * s_menu_offset) / s_menu_count;
uint8_t hgt = (MENU_MAX_LINES * (FH+1) * MENU_MAX_LINES) / s_menu_count;
if (hgt + ofs > MENU_MAX_LINES * (FH+1))
hgt = MENU_MAX_LINES * (FH+1) - ofs;
lcd_vlineStip(DISPLAY_W-11, 16 + ofs, 2 + hgt, SOLID, BLACK);
displayScrollbar(DISPLAY_W-11, 17, MENU_MAX_LINES * (FH+1), s_menu_offset, s_menu_count, MENU_MAX_LINES);
}
switch(event) {

View file

@ -45,7 +45,13 @@
typedef void (*MenuFuncP)(uint8_t event);
void DisplayScreenIndex(uint8_t index, uint8_t count, uint8_t attr);
void displayScreenIndex(uint8_t index, uint8_t count, uint8_t attr);
#if defined(PCBX9D)
#define MENUS_SCROLLBAR_WIDTH 2
#else
#define MENUS_SCROLLBAR_WIDTH 0
#endif
#if defined(SDCARD)
extern uint16_t s_pgOfs;
@ -210,6 +216,12 @@ TITLE(title)
int8_t selectMenuItem(uint8_t x, uint8_t y, const pm_char *label, const pm_char *values, int8_t value, int8_t min, int8_t max, uint8_t attr, uint8_t event);
uint8_t onoffMenuItem(uint8_t value, uint8_t x, uint8_t y, const pm_char *label, uint8_t attr, uint8_t event );
int8_t switchMenuItem(uint8_t x, uint8_t y, int8_t value, uint8_t attr, uint8_t event);
int8_t gvarMenuItem(uint8_t x, uint8_t y, int8_t value, int8_t min, int8_t max, uint8_t attr, uint8_t event);
#if defined(GVARS)
void displayGVar(uint8_t x, uint8_t y, int8_t value);
#else
#define displayGVar(x, y, v) lcd_outdez8(x, y, v)
#endif
#define WARNING_TYPE_ASTERISK 0
#define WARNING_TYPE_CONFIRM 1

View file

@ -418,7 +418,7 @@ void menuModelSelect(uint8_t event)
lcd_outdezAtt(17*FW, 0, reusableBuffer.models.eepromfree, 0);
#endif
DisplayScreenIndex(e_ModelSelect, DIM(menuTabModel), (sub == g_eeGeneral.currModel) ? INVERS : 0);
displayScreenIndex(e_ModelSelect, DIM(menuTabModel), (sub == g_eeGeneral.currModel) ? INVERS : 0);
if (sub-s_pgOfs < 1) s_pgOfs = max(0, sub-1);
else if (sub-s_pgOfs > 5) s_pgOfs = min(MAX_MODELS-7, sub-4);
@ -600,7 +600,8 @@ enum menuModelSetupItems {
#define FIELD_TIMER_MAX 2
#endif
#define MODEL_PARAM_OFS (10*FW+2)
#define MODEL_SETUP_2ND_COLUMN (DISPLAY_W-11*FW-MENUS_SCROLLBAR_WIDTH)
void menuModelSetup(uint8_t event)
{
lcd_outdezNAtt(7*FW,0,g_eeGeneral.currModel+1,INVERS+LEADING0,2);
@ -624,7 +625,7 @@ void menuModelSetup(uint8_t event)
switch(k) {
case ITEM_MODEL_NAME:
editName(MODEL_PARAM_OFS, y, g_model.name, sizeof(g_model.name), event, attr, m_posHorz);
editName(MODEL_SETUP_2ND_COLUMN, y, g_model.name, sizeof(g_model.name), event, attr, m_posHorz);
#if defined(PCBSKY9X)
memcpy(ModelNames[g_eeGeneral.currModel], g_model.name, sizeof(g_model.name));
#endif
@ -635,12 +636,12 @@ void menuModelSetup(uint8_t event)
{
TimerData *timer = &g_model.timers[k-ITEM_MODEL_TIMER1];
putsStrIdx(0*FW, y, STR_TIMER, k-ITEM_MODEL_TIMER1+1);
putsTmrMode(MODEL_PARAM_OFS, y, timer->mode, (attr && m_posHorz==0) ? blink : 0);
putsTime(15*FW, y, timer->val,
putsTmrMode(MODEL_SETUP_2ND_COLUMN, y, timer->mode, (attr && m_posHorz==0) ? blink : 0);
putsTime(MODEL_SETUP_2ND_COLUMN+5*FW-2, y, timer->val,
(attr && m_posHorz==1 ? blink:0),
(attr && m_posHorz==2 ? blink:0) );
#if defined(PCBSKY9X) || defined(PCBGRUVIN9X)
lcd_putcAtt(20*FW+1, y, g_model.timersXtra[k-ITEM_MODEL_TIMER1].remanent ? 'R' : '-', (attr && m_posHorz==3) ? blink : 0);
lcd_putcAtt(MODEL_SETUP_2ND_COLUMN+10*FW-1, y, g_model.timersXtra[k-ITEM_MODEL_TIMER1].remanent ? 'R' : '-', (attr && m_posHorz==3) ? blink : 0);
#endif
if (attr && (s_editMode>0 || p1valdiff)) {
div_t qr = div(timer->val, 60);
@ -668,15 +669,15 @@ void menuModelSetup(uint8_t event)
}
case ITEM_MODEL_EXTENDED_LIMITS:
g_model.extendedLimits = onoffMenuItem(g_model.extendedLimits, MODEL_PARAM_OFS, y, STR_ELIMITS, attr, event);
g_model.extendedLimits = onoffMenuItem(g_model.extendedLimits, MODEL_SETUP_2ND_COLUMN, y, STR_ELIMITS, attr, event);
break;
case ITEM_MODEL_EXTENDED_TRIMS:
g_model.extendedTrims = onoffMenuItem(g_model.extendedTrims, MODEL_PARAM_OFS, y, STR_ETRIMS, attr, event);
g_model.extendedTrims = onoffMenuItem(g_model.extendedTrims, MODEL_SETUP_2ND_COLUMN, y, STR_ETRIMS, attr, event);
break;
case ITEM_MODEL_TRIM_INC:
g_model.trimInc = selectMenuItem(MODEL_PARAM_OFS, y, STR_TRIMINC, STR_VTRIMINC, g_model.trimInc, 0, 4, attr, event);
g_model.trimInc = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_TRIMINC, STR_VTRIMINC, g_model.trimInc, 0, 4, attr, event);
break;
case ITEM_MODEL_THROTTLE_TRACE:
@ -685,17 +686,17 @@ void menuModelSetup(uint8_t event)
int8_t idx = 3;
if (g_model.thrTraceSrc > NUM_POTS) idx = NUM_STICKS+NUM_ROTARY_ENCODERS+NUM_STICKS+2+3+NUM_PPM+g_model.thrTraceSrc;
else if (g_model.thrTraceSrc > 0) idx = NUM_STICKS+g_model.thrTraceSrc;
putsChnRaw(MODEL_PARAM_OFS, y, idx, attr);
putsChnRaw(MODEL_SETUP_2ND_COLUMN, y, idx, attr);
if (attr) CHECK_INCDEC_MODELVAR(event, g_model.thrTraceSrc, 0, NUM_POTS+NUM_CHNOUT);
break;
}
case ITEM_MODEL_THROTTLE_TRIM:
g_model.thrTrim = onoffMenuItem(g_model.thrTrim, MODEL_PARAM_OFS, y, STR_TTRIM, attr, event);
g_model.thrTrim = onoffMenuItem(g_model.thrTrim, MODEL_SETUP_2ND_COLUMN, y, STR_TTRIM, attr, event);
break;
case ITEM_MODEL_THROTTLE_WARNING:
g_model.disableThrottleWarning = !onoffMenuItem(!g_model.disableThrottleWarning, MODEL_PARAM_OFS, y, STR_THROTTLEWARNING, attr, event);
g_model.disableThrottleWarning = !onoffMenuItem(!g_model.disableThrottleWarning, MODEL_SETUP_2ND_COLUMN, y, STR_THROTTLEWARNING, attr, event);
break;
case ITEM_MODEL_SWITCHES_WARNING:
@ -703,7 +704,7 @@ void menuModelSetup(uint8_t event)
lcd_putsLeft(y, STR_SWITCHWARNING);
uint8_t states = g_model.switchWarningStates;
char c = !(states & 1);
menu_lcd_onoff(MODEL_PARAM_OFS, y, c, attr);
menu_lcd_onoff(MODEL_SETUP_2ND_COLUMN, y, c, attr);
if (attr) {
s_editMode = 0;
switch(event) {
@ -734,7 +735,7 @@ void menuModelSetup(uint8_t event)
c = pgm_read_byte(STR_VSWITCHES - 2 + (3*i) + (i>=5 ? 6 : 0));
states >>= 1;
}
lcd_putcAtt(MODEL_PARAM_OFS+2*FW+i*FW, y, c, attr);
lcd_putcAtt(MODEL_SETUP_2ND_COLUMN+2*FW+i*FW, y, c, attr);
}
}
break;
@ -743,7 +744,7 @@ void menuModelSetup(uint8_t event)
case ITEM_MODEL_BEEP_CENTER:
lcd_putsLeft(y, STR_BEEPCTR);
for (uint8_t i=0;i<NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS;i++)
lcd_putsiAtt(MODEL_PARAM_OFS+i*FW, y, STR_RETA123, i, ((m_posHorz==i) && attr) ? BLINK|INVERS : ((g_model.beepANACenter & ((BeepANACenter)1<<i)) ? INVERS : 0 ) );
lcd_putsiAtt(MODEL_SETUP_2ND_COLUMN+i*FW, y, STR_RETA123, i, ((m_posHorz==i) && attr) ? BLINK|INVERS : ((g_model.beepANACenter & ((BeepANACenter)1<<i)) ? INVERS : 0 ) );
if (attr) {
if((event==EVT_KEY_FIRST(KEY_MENU)) || p1valdiff) {
killEvents(event);
@ -756,17 +757,17 @@ void menuModelSetup(uint8_t event)
case ITEM_MODEL_PROTOCOL:
lcd_putsLeft(y, STR_PROTO);
lcd_putsiAtt(MODEL_PARAM_OFS, y, STR_VPROTOS, protocol,
lcd_putsiAtt(MODEL_SETUP_2ND_COLUMN, y, STR_VPROTOS, protocol,
(attr && m_posHorz==0 ? (s_editMode>0 ? BLINK|INVERS : INVERS):0));
if (protocol <= PROTO_PPMSIM) {
lcd_putsiAtt(MODEL_PARAM_OFS+7*FW, y, STR_NCHANNELS, g_model.ppmNCH+2, (attr && m_posHorz==1) ? blink : 0);
lcd_putsiAtt(MODEL_SETUP_2ND_COLUMN+7*FW, y, STR_NCHANNELS, g_model.ppmNCH+2, (attr && m_posHorz==1) ? blink : 0);
}
#ifdef DSM2
else if (protocol == PROTO_DSM2) {
if (attr && m_posHorz > 1) m_posHorz = 1;
int8_t x = limit((int8_t)0, (int8_t)g_model.ppmNCH, (int8_t)2);
g_model.ppmNCH = x;
lcd_putsiAtt(MODEL_PARAM_OFS+5*FW, y, STR_DSM2MODE, x, (attr && m_posHorz==1) ? blink : 0);
lcd_putsiAtt(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_DSM2MODE, x, (attr && m_posHorz==1) ? blink : 0);
}
#endif
else if (attr) {
@ -792,11 +793,11 @@ void menuModelSetup(uint8_t event)
case ITEM_MODEL_PROTOCOL_PARAMS:
if (protocol <= PROTO_PPMSIM) {
lcd_putsLeft( y, STR_PPMFRAME);
lcd_puts(MODEL_PARAM_OFS+3*FW, y, STR_MS);
lcd_outdezAtt(MODEL_PARAM_OFS, y, (int16_t)g_model.ppmFrameLength*5 + 225, ((attr && m_posHorz==0) ? (s_editMode>0 ? BLINK|INVERS : INVERS) : 0) | PREC1|LEFT);
lcd_putc(MODEL_PARAM_OFS+8*FW+2, y, 'u');
lcd_outdezAtt(MODEL_PARAM_OFS+8*FW+2, y, (g_model.ppmDelay*50)+300, ((attr && m_posHorz==1) ? blink : 0));
lcd_putcAtt(MODEL_PARAM_OFS+10*FW, y, g_model.pulsePol ? '+' : '-', (attr && m_posHorz==2) ? INVERS : 0);
lcd_puts(MODEL_SETUP_2ND_COLUMN+3*FW, y, STR_MS);
lcd_outdezAtt(MODEL_SETUP_2ND_COLUMN, y, (int16_t)g_model.ppmFrameLength*5 + 225, ((attr && m_posHorz==0) ? (s_editMode>0 ? BLINK|INVERS : INVERS) : 0) | PREC1|LEFT);
lcd_putc(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, 'u');
lcd_outdezAtt(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, (g_model.ppmDelay*50)+300, ((attr && m_posHorz==1) ? blink : 0));
lcd_putcAtt(MODEL_SETUP_2ND_COLUMN+10*FW, y, g_model.pulsePol ? '+' : '-', (attr && m_posHorz==2) ? INVERS : 0);
if(attr && (s_editMode>0 || p1valdiff)) {
switch (m_posHorz) {
@ -818,11 +819,11 @@ void menuModelSetup(uint8_t event)
m_posHorz = 0; // limit 3 column row to 2 colums for DSM2 protocol (Rx_Num and RANGE fields)
lcd_putsLeft(y, STR_RXNUM);
lcd_outdezNAtt(MODEL_PARAM_OFS-(IS_DSM2_PROTOCOL(protocol) ? 0 : 3*FW), y, g_model.modelId, ((attr && m_posHorz==0) ? (s_editMode>0 ? BLINK|INVERS : INVERS) : 0) | LEADING0|LEFT, 2);
lcd_outdezNAtt(MODEL_SETUP_2ND_COLUMN-(IS_DSM2_PROTOCOL(protocol) ? 0 : 3*FW), y, g_model.modelId, ((attr && m_posHorz==0) ? (s_editMode>0 ? BLINK|INVERS : INVERS) : 0) | LEADING0|LEFT, 2);
#if defined(DSM2)
if (IS_DSM2_PROTOCOL(protocol)) { // RANGE CHECK
lcd_putsnAtt(MODEL_PARAM_OFS+5*FW, y, PSTR("RANGErange")+5*(s_rangecheck_mode), 5, (m_posHorz==1 ? attr : 0));
lcd_putsnAtt(MODEL_SETUP_2ND_COLUMN+5*FW, y, PSTR("RANGErange")+5*(s_rangecheck_mode), 5, (m_posHorz==1 ? attr : 0));
s_rangecheck_mode = (attr && m_posHorz==1 && s_editMode>0); // [MENU] key toggles range check mode
}
#endif
@ -832,7 +833,7 @@ void menuModelSetup(uint8_t event)
#if defined(PXX)
if (protocol == PROTO_PXX) {
lcd_putsAtt(MODEL_PARAM_OFS, y, STR_SYNCMENU, (m_posHorz==1 ? attr : 0));
lcd_putsAtt(MODEL_SETUP_2ND_COLUMN, y, STR_SYNCMENU, (m_posHorz==1 ? attr : 0));
if (attr && m_posHorz==1) {
s_editMode = false;
if (event==EVT_KEY_LONG(KEY_MENU)) {
@ -1068,9 +1069,11 @@ void menuModelPhasesAll(uint8_t event)
if (s_pgOfs != MAX_PHASES-6) return;
#endif
att = (sub==MAX_PHASES && !trimsCheckTimer) ? INVERS : 0;
lcd_putsAtt(0, 7*FH, STR_CHECKTRIMS, att);
putsFlightPhase(6*FW, 7*FH, s_perout_flight_phase+1, att);
lcd_putsLeft(7*FH+1, STR_CHECKTRIMS);
putsFlightPhase(OFS_CHECKTRIMS, 7*FH+1, s_perout_flight_phase+1);
if (sub==MAX_PHASES && !trimsCheckTimer) {
lcd_status_line();
}
}
#endif
@ -1526,15 +1529,13 @@ void menuModelExpoOne(uint8_t event)
#endif
case EXPO_FIELD_WIDTH:
lcd_putsLeft(y, STR_WEIGHT);
lcd_outdezAtt(EXPO_ONE_2ND_COLUMN+3*FW, y, ed->weight, attr|INFLIGHT((int8_t&)ed->weight));
if (attr) CHECK_INFLIGHT_INCDEC_MODELVAR(event, (int8_t&)ed->weight, 0, 100, 0, STR_DRWEIGHT);
ed->weight = gvarMenuItem(EXPO_ONE_2ND_COLUMN+3*FW, y, ed->weight, 0, 100, attr, event);
break;
case EXPO_FIELD_EXPO:
lcd_putsLeft(y, STR_EXPO);
if (ed->curveMode==MODE_EXPO || ed->curveParam==0) {
ed->curveMode = MODE_EXPO;
lcd_outdezAtt(EXPO_ONE_2ND_COLUMN+3*FW, y, ed->curveParam, attr|INFLIGHT(ed->curveParam));
if (attr) CHECK_INFLIGHT_INCDEC_MODELVAR(event, ed->curveParam, -100, 100, 0, STR_DREXPO);
ed->curveParam = gvarMenuItem(EXPO_ONE_2ND_COLUMN+3*FW, y, ed->curveParam, -100, 100, attr, event);
}
else {
lcd_putsAtt(EXPO_ONE_2ND_COLUMN, y, STR_NA, attr);
@ -1634,13 +1635,11 @@ void menuModelMixOne(uint8_t event)
break;
case MIX_FIELD_WEIGHT:
lcd_putsLeft(y, STR_WEIGHT);
lcd_outdezAtt(MIXES_2ND_COLUMN, y, md2->weight, attr|LEFT|INFLIGHT(md2->weight));
if (attr) CHECK_INFLIGHT_INCDEC_MODELVAR(event, md2->weight, -125, 125, 0, STR_MIXERWEIGHT);
md2->weight = gvarMenuItem(MIXES_2ND_COLUMN, y, md2->weight, -125, 125, attr|LEFT, event);
break;
case MIX_FIELD_OFFSET:
lcd_putsLeft(y, STR_OFFSET);
lcd_outdezAtt(MIXES_2ND_COLUMN, y, md2->sOffset, attr|LEFT|INFLIGHT(md2->sOffset));
if (attr) CHECK_INFLIGHT_INCDEC_MODELVAR(event, md2->sOffset, -125, 125, 0, STR_MIXEROFFSET);
md2->sOffset = gvarMenuItem(MIXES_2ND_COLUMN, y, md2->sOffset, -125, 125, attr|LEFT, event);
break;
case MIX_FIELD_TRIM:
{
@ -1661,10 +1660,12 @@ void menuModelMixOne(uint8_t event)
}
#if defined(CURVES)
case MIX_FIELD_CURVE:
{
int8_t curveParam = md2->curveParam;
lcd_putsLeft(y, STR_CURVE);
if (attr) {
int8_t curveParam = md2->curveParam;
if (md2->curveMode==MODE_CURVE) {
if (md2->curveMode == MODE_CURVE) {
putsCurve(MIXES_2ND_COLUMN, y, curveParam, attr);
if (attr) {
if (event==EVT_KEY_FIRST(KEY_MENU) && (curveParam<0 || curveParam>=CURVE_BASE)){
s_curveChan = (curveParam<0 ? -curveParam-1 : curveParam-CURVE_BASE);
pushMenu(menuModelCurveOne);
@ -1676,29 +1677,21 @@ void menuModelMixOne(uint8_t event)
m_posHorz = 0;
}
}
else if (s_editMode>0) {
if (m_posHorz==0) {
int8_t tmp = 0;
CHECK_INCDEC_MODELVAR(event, tmp, -1, 1);
if (tmp != 0) {
md2->curveMode = MODE_CURVE;
md2->curveParam = tmp;
}
}
else {
CHECK_INCDEC_MODELVAR(event, md2->curveParam, -100, 100);
}
}
}
if (md2->curveMode == MODE_CURVE) {
putsCurve(MIXES_2ND_COLUMN, y, md2->curveParam, attr);
}
else {
lcd_putsAtt(MIXES_2ND_COLUMN, y, PSTR("Diff"), m_posHorz==0 ? attr : 0);
lcd_outdezAtt(MIXES_2ND_COLUMN+5*FW, y, md2->curveParam, LEFT|(m_posHorz==1 ? attr : 0));
md2->curveParam = gvarMenuItem(MIXES_2ND_COLUMN+5*FW, y, curveParam, -100, 100, LEFT|(m_posHorz==1 ? attr : 0), s_editMode>0 ? event : 0);
if (attr && s_editMode>0 && m_posHorz==0) {
int8_t tmp = 0;
CHECK_INCDEC_MODELVAR(event, tmp, -1, 1);
if (tmp != 0) {
md2->curveMode = MODE_CURVE;
md2->curveParam = tmp;
}
}
}
break;
}
#endif
case MIX_FIELD_SWITCH:
md2->swtch = switchMenuItem(MIXES_2ND_COLUMN, y, md2->swtch, attr, event);
@ -1924,15 +1917,12 @@ void menuModelExpoMix(uint8_t expo, uint8_t _event)
uint8_t y = (cur-s_pgOfs)*FH;
uint8_t attr = ((s_copyMode || sub != cur) ? 0 : INVERS);
if (expo) {
lcd_outdezAtt(EXPO_LINE_WEIGHT_POS, y, ed->weight, attr | (isExpoActive(i) ? BOLD : 0));
if (attr != 0) {
CHECK_INCDEC_MODELVAR(_event, ed->weight, 0, 100);
}
ed->weight = gvarMenuItem(EXPO_LINE_WEIGHT_POS, y, ed->weight, 0, 100, attr | (isExpoActive(i) ? BOLD : 0), _event);
if (ed->curveMode == MODE_CURVE)
putsCurve(EXPO_LINE_EXPO_POS-3*FW, y, ed->curveParam);
else
lcd_outdezAtt(EXPO_LINE_EXPO_POS, y, ed->curveParam, 0);
displayGVar(EXPO_LINE_EXPO_POS, y, ed->curveParam);
#if defined(PCBSKY9X)
if (ed->name[0]) {
@ -1952,9 +1942,7 @@ void menuModelExpoMix(uint8_t expo, uint8_t _event)
putsMixerSource(4*FW+0, y, md->srcRaw, isMixActive(i) ? BOLD : 0);
lcd_outdezAtt(11*FW+3, y, md->weight, attr);
if (attr != 0)
CHECK_INCDEC_MODELVAR(_event, md->weight, -125, 125);
md->weight = gvarMenuItem(11*FW+3, y, md->weight, -125, 125, attr, _event);
#if defined(PCBSKY9X)
if (md->name[0]) {
@ -1967,7 +1955,7 @@ void menuModelExpoMix(uint8_t expo, uint8_t _event)
if (md->curveMode == MODE_CURVE)
putsCurve(12*FW+2, y, md->curveParam);
else
lcd_outdez8(15*FW+2, y, md->curveParam);
displayGVar(15*FW+2, y, md->curveParam);
}
if (md->swtch) putsSwitches(16*FW, y, md->swtch);
@ -2241,10 +2229,45 @@ void menuModelLimits(uint8_t event)
}
}
#if defined(GVARS) && defined(PCBSKY9X)
void menuModelRegisterOne(uint8_t event)
{
model_gvar_t *reg = &g_model.gvars[s_curveChan];
putsStrIdx(11*FW, 0, STR_GV, s_curveChan+1);
// TODO Translation
SUBMENU(PSTR("GLOBAL VAR"), 2, {ZCHAR|(sizeof(reg->name)-1), 0});
int8_t sub = m_posVert;
for (uint8_t i=0, k=0, y=2*FH; i<2; i++, k++, y+=FH) {
uint8_t attr = (sub==k ? (s_editMode>0 ? BLINK|INVERS : INVERS) : 0);
switch(i) {
case 0:
editName(MIXES_2ND_COLUMN, y, reg->name, sizeof(reg->name), event, attr, m_posHorz);
break;
case 1:
lcd_putsLeft(y, PSTR("Value"));
lcd_outdezAtt(MIXES_2ND_COLUMN, y, reg->value, attr|LEFT);
if (attr) CHECK_INCDEC_MODELVAR(event, reg->value, -125, 125);
break;
}
}
}
#endif
#if defined(CURVES)
#if defined(GVARS)
#define CURVE_SELECTED() (sub >= 0 && sub < MAX_CURVES)
#else
#define CURVE_SELECTED() (sub >= 0)
#endif
void menuModelCurvesAll(uint8_t event)
{
SIMPLE_MENU(STR_MENUCURVES, menuTabModel, e_CurvesAll, 1+MAX_CURVES+MAX_REGISTERS);
SIMPLE_MENU(STR_MENUCURVES, menuTabModel, e_CurvesAll, 1+MAX_CURVES+MAX_GVARS);
int8_t sub = m_posVert - 1;
@ -2258,14 +2281,16 @@ void menuModelCurvesAll(uint8_t event)
#endif
case EVT_KEY_FIRST(KEY_RIGHT):
case EVT_KEY_FIRST(KEY_MENU):
if (sub >= 0
#if defined(REGISTERS)
&& sub < MAX_CURVES
#endif
) {
if (CURVE_SELECTED()) {
s_curveChan = sub;
pushMenu(menuModelCurveOne);
}
#if defined(GVARS) && defined(PCBSKY9X)
else if (sub >= MAX_CURVES) {
s_curveChan = sub-MAX_CURVES;
pushMenu(menuModelRegisterOne);
}
#endif
break;
}
@ -2273,26 +2298,32 @@ void menuModelCurvesAll(uint8_t event)
uint8_t y = FH + i*FH;
uint8_t k = i + s_pgOfs;
uint8_t attr = (sub == k ? INVERS : 0);
#if defined(REGISTERS)
#if defined(GVARS)
if (k < MAX_CURVES) {
putsStrIdx(0, y, STR_CV, k+1, attr);
}
else {
if (attr && s_editMode>0) attr |= BLINK;
putsStrIdx(0, y, PSTR("Reg.X"), k-MAX_CURVES+1, 0);
lcd_outdezAtt(10*FW, y, g_model.registers[k-MAX_CURVES], attr);
if (attr) CHECK_INCDEC_MODELVAR(event, g_model.registers[k-MAX_CURVES], -125, 125);
#if defined(PCBSKY9X)
putsStrIdx(0, y, STR_GV, k-MAX_CURVES+1, attr);
if (sub >= MAX_CURVES) {
lcd_outdezAtt(10*FW, y, REG_VALUE(k-MAX_CURVES));
lcd_putsnAtt(12*FW, y, g_model.gvars[k-MAX_CURVES].name, sizeof(g_model.gvars[k-MAX_CURVES].name), ZCHAR);
}
#else
putsStrIdx(0, y, STR_GV, k-MAX_CURVES+1);
if (sub >= MAX_CURVES) {
if (attr && s_editMode>0) attr |= BLINK;
lcd_outdezAtt(10*FW, y, REG_VALUE(k-MAX_CURVES), attr);
if (attr) CHECK_INCDEC_MODELVAR(event, g_model.gvars[k-MAX_CURVES], -125, 125);
}
#endif
}
#else
putsStrIdx(0, y, STR_CV, k+1, attr);
#endif
}
if (sub >= 0
#if defined(REGISTERS)
&& sub < MAX_CURVES
#endif
) {
if (CURVE_SELECTED()) {
s_curveChan = sub;
DrawCurve(curveFn, 25);
}
@ -2605,7 +2636,7 @@ void menuModelFunctionSwitches(uint8_t event)
case 1:
if (sd->swtch) {
uint8_t func_displayed;
if (sd->func < 16) {
if (sd->func < FUNC_TRAINER) {
func_displayed = 0;
putsChnRaw(11*FW-2, y, NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS+NUM_STICKS+2+3+NUM_PPM+sd->func+1, attr);
}
@ -2614,8 +2645,20 @@ void menuModelFunctionSwitches(uint8_t event)
if (sd->func != FUNC_TRAINER)
putsChnRaw(13*FW-2, y, sd->func-FUNC_TRAINER, attr);
}
else
#if defined(DEBUG)
else if (sd->func == FUNC_TEST) {
func_displayed = FUNC_TEST - 16 - NUM_STICKS - MAX_GVARS + 2;
}
#endif
#if defined(GVARS)
else if (sd->func >= FUNC_GVAR_X1) {
func_displayed = FUNC_GVAR_X1 - 16 - NUM_STICKS + 1;
putsStrIdx(12*FW-2, y, STR_GV, sd->func-FUNC_GVAR_X1+1, attr);
}
#endif
else {
func_displayed = 2 + sd->func - 16 - NUM_STICKS - 1;
}
lcd_putsiAtt(5*FW-2, y, STR_VFSWFUNC, func_displayed, attr);
if (active) {
CHECK_INCDEC_MODELVAR( event, sd->func, 0, FUNC_MAX-1);
@ -2699,6 +2742,16 @@ void menuModelFunctionSwitches(uint8_t event)
val_min = -125; val_max = 125;
lcd_outdezAtt(18*FW, y, val_displayed, attr);
}
#if defined(GVARS)
else if (sd->func >= FUNC_GVAR_X1
#if defined(DEBUG)
&& sd->func != FUNC_TEST
#endif
) {
val_max = NUM_XCHNRAW-1;
putsChnRaw(17*FW, y, val_displayed+1, attr);
}
#endif
else {
if (attr) m_posHorz = ((event & EVT_KEY_MASK) == KEY_LEFT ? 1 : 3);
break;

View file

@ -374,6 +374,10 @@ enum Functions {
FUNC_BACKGND_MUSIC,
FUNC_BACKGND_MUSIC_PAUSE,
#endif
#if defined(GVARS)
FUNC_GVAR_X1,
FUNC_GVAR_X2,
#endif
#if defined(DEBUG)
FUNC_TEST, // should remain the last before MAX as not added in companion9x
#endif
@ -720,12 +724,23 @@ PACK(typedef struct t_TimerDataExtra {
#define EXTRA_MODEL_FIELDS
#endif
#if defined(REGISTERS)
#define MAX_REGISTERS 2
#define EXTRA_REGISTERS uint8_t registers[MAX_REGISTERS]
#if defined(PCBSKY9X)
PACK(typedef struct {
int8_t value;
char name[6];
}) model_gvar_t;
#define REG_VALUE(x) g_model.gvars[x].value
#else
#define MAX_REGISTERS 0
#define EXTRA_REGISTERS
typedef int8_t model_gvar_t;
#define REG_VALUE(x) g_model.gvars[x]
#endif
#if defined(GVARS)
#define MAX_GVARS 2
#define EXTRA_GVARS model_gvar_t gvars[MAX_GVARS]
#else
#define MAX_GVARS 0
#define EXTRA_GVARS
#endif
PACK(typedef struct t_ModelData {
@ -766,7 +781,7 @@ PACK(typedef struct t_ModelData {
EXTRA_MODEL_FIELDS;
EXTRA_REGISTERS;
EXTRA_GVARS;
}) ModelData;
extern EEGeneral g_eeGeneral;

View file

@ -442,13 +442,14 @@ void applyExpos(int16_t *anas)
int16_t v = anas2[ed.chn];
if((v<0 && ed.mode&1) || (v>=0 && ed.mode&2)) {
cur_chn = ed.chn;
if (ed.curveParam) {
int8_t curveParam = ed.curveParam;
if (curveParam) {
if (ed.curveMode == MODE_CURVE)
v = applyCurve(v, ed.curveParam);
v = applyCurve(v, curveParam);
else
v = expo(v, ed.curveParam);
v = expo(v, REG(curveParam, -100, 100));
}
v = ((int32_t)v * ed.weight) / 100;
v = ((int32_t)v * REG(ed.weight, 0, 100)) / 100;
anas[cur_chn] = v;
}
}
@ -929,6 +930,26 @@ void incRotaryEncoder(uint8_t idx, int8_t inc)
}
#endif
#if defined(GVARS)
int8_t REG(int8_t x, int8_t min, int8_t max)
{
int8_t result = x;
if (x >= 126) {
x -= 126;
result = REG_VALUE(x);
if (result < min) {
REG_VALUE(x) = result = min;
eeDirty(EE_MODEL);
}
if (result > max) {
REG_VALUE(x) = result = max;
eeDirty(EE_MODEL);
}
}
return result;
}
#endif
#if defined(FRSKY) || defined(PCBSKY9X)
void putsTelemetryValue(uint8_t x, uint8_t y, int16_t val, uint8_t unit, uint8_t att)
{
@ -1249,6 +1270,10 @@ void message(const pm_char *title, const pm_char *t, const char *last MESSAGE_SO
clearKeyEvents();
}
#if defined(GVARS)
int8_t *trimPtr[NUM_STICKS] = { NULL, NULL, NULL, NULL };
#endif
#if defined(PCBSTD)
uint8_t checkTrim(uint8_t event)
{
@ -1266,9 +1291,24 @@ void checkTrims()
// LH_DWN LH_UP LV_DWN LV_UP RV_DWN RV_UP RH_DWN RH_UP
uint8_t idx = CONVERT_MODE(1+k/2) - 1;
uint8_t phase = getTrimFlightPhase(s_perout_flight_phase, idx);
#if defined(GVARS)
#define TRIM_REUSED() trimPtr[idx]
int16_t before;
bool thro;
if (TRIM_REUSED()) {
before = *trimPtr[idx];
thro = false;
}
else {
before = getRawTrimValue(phase, idx);
thro = (idx==THR_STICK && g_model.thrTrim);
}
#else
#define TRIM_REUSED() 0
int16_t before = getRawTrimValue(phase, idx);
int8_t v = (s==0) ? min(32, abs(before)/4+1) : 1 << (s-1); // 1=>1 2=>2 3=>4 4=>8
bool thro = (idx==THR_STICK && g_model.thrTrim);
#endif
int8_t v = (s==0) ? min(32, abs(before)/4+1) : 1 << (s-1); // 1=>1 2=>2 3=>4 4=>8
if (thro) v = 4; // if throttle trim and trim trottle then step=4
int16_t after = (k&1) ? before + v : before - v; // positive = k&1
#if defined(PCBSKY9X)
@ -1284,7 +1324,7 @@ void checkTrims()
}
if ((before<after && after>TRIM_MAX) || (before>after && after<TRIM_MIN)) {
if (!g_model.extendedTrims) after = before;
if (!g_model.extendedTrims || TRIM_REUSED()) after = before;
}
if (after < TRIM_EXTENDED_MIN) {
@ -1294,7 +1334,14 @@ void checkTrims()
after = TRIM_EXTENDED_MAX;
}
#if defined(GVARS)
if (TRIM_REUSED())
*trimPtr[idx] = after;
else
setTrimValue(phase, idx, after);
#else
setTrimValue(phase, idx, after);
#endif
#if defined (AUDIO)
// toneFreq higher/lower according to trim position
@ -1901,6 +1948,11 @@ void evalFunctions()
for (uint8_t i=0; i<NUM_CHNOUT; i++)
safetyCh[i] = -128; // not defined
#if defined(GVARS)
for (uint8_t i=0; i<4; i++)
trimPtr[i] = NULL;
#endif
for (uint8_t i=0; i<NUM_FSW; i++) {
FuncSwData *sd = &g_model.funcSw[i];
int8_t swtch = sd->swtch;
@ -1990,7 +2042,7 @@ void evalFunctions()
}
}
#if defined(PCBSKY9X)
#if defined(PCBSKY9X) && defined(SDCARD)
if ((shrt || lng) && (activeFunctions & function_mask)) {
if (sd->func == FUNC_BACKGND_MUSIC) {
STOP_PLAY(i+1);
@ -2058,6 +2110,17 @@ void evalFunctions()
testFunc();
}
#endif
#if defined(GVARS)
else if (sd->func >= FUNC_GVAR_X1) {
if (FSW_PARAM(sd) >= MIXSRC_TrimRud-1 && FSW_PARAM(sd) <= MIXSRC_TrimAil-1) {
trimPtr[FSW_PARAM(sd)-MIXSRC_TrimRud+1] = &REG_VALUE(sd->func-FUNC_GVAR_X1);
}
else {
REG_VALUE(sd->func-FUNC_GVAR_X1) = limit((int16_t)-1250, getValue(FSW_PARAM(sd)), (int16_t)1250) / 10;
}
}
#endif
}
if (COMPLEX_SWITCH) {
@ -2279,7 +2342,10 @@ void perOut(uint8_t tick10ms)
#endif
//========== OFFSET ===============
if (apply_offset && md->sOffset) v += calc100toRESX(md->sOffset);
if (apply_offset) {
int8_t offset = REG(md->sOffset, -125, 125);
if (offset) v += calc100toRESX(offset);
}
//========== TRIMS ===============
if (!(s_perout_mode & e_perout_mode_notrims)) {
@ -2294,6 +2360,8 @@ void perOut(uint8_t tick10ms)
v += trims[mix_trim];
}
int8_t weight = REG(md->weight, -125, 125);
//========== SPEED ===============
if (s_perout_mode == e_perout_mode_normal && (md->speedUp || md->speedDown)) // there are delay values
{
@ -2307,7 +2375,7 @@ void perOut(uint8_t tick10ms)
//-100..100 => 32768 -> 100*83886/256 = 32768, For MAX we divide by 2 since it's asymmetrical
if (tick10ms) {
int32_t rate = (int32_t)DEL_MULT*2048*100*tick10ms;
if(md->weight) rate /= abs(md->weight);
if (weight) rate /= abs(weight);
act[i] = (diff>0) ? ((md->speedUp>0) ? act[i]+(rate)/((int16_t)50*md->speedUp) : (int32_t)v*DEL_MULT) :
((md->speedDown>0) ? act[i]-(rate)/((int16_t)50*md->speedDown) : (int32_t)v*DEL_MULT) ;
@ -2328,14 +2396,15 @@ void perOut(uint8_t tick10ms)
}
//========== WEIGHT ===============
int32_t dv = (int32_t)v*md->weight;
int32_t dv = (int32_t)v*weight;
//========== DIFFERENTIAL =========
if (md->curveMode == MODE_DIFFERENTIAL) {
if (md->curveParam>0 && dv<0)
dv = (dv * (100-md->curveParam)) / 100;
else if (md->curveParam<0 && dv>0)
dv = (dv * (100+md->curveParam)) / 100;
int8_t curveParam = REG(md->curveParam, -100, 100);
if (curveParam>0 && dv<0)
dv = (dv * (100-curveParam)) / 100;
else if (curveParam<0 && dv>0)
dv = (dv * (100+curveParam)) / 100;
}
int32_t *ptr = &chans[md->destCh]; // Save calculating address several times

View file

@ -661,7 +661,7 @@ extern uint8_t s_perout_mode;
void perOut(uint8_t tick10ms);
void perMain();
NOINLINE void per10ms();
NOINLINE void per10ms();
int16_t getValue(uint8_t i);
bool getSwitch(int8_t swtch, bool nc);
@ -691,6 +691,12 @@ inline bool navigationRotaryEncoder(uint8_t event)
}
#endif
#if defined(GVARS)
int8_t REG(int8_t x, int8_t min, int8_t max);
#else
#define REG(x, min, max) (x)
#endif
extern uint16_t s_timeCumTot;
extern uint16_t s_timeCumThr; //gewichtete laufzeit in 1/16 sec
extern uint16_t s_timeCum16ThrP; //gewichtete laufzeit in 1/16 sec

View file

@ -34,6 +34,8 @@
#include "../open9x.h"
#include <stdarg.h>
#if !defined(SIMU)
/*
* Outputs a character on the UART line.
*
@ -142,3 +144,5 @@ void debugTask(void* pdata)
}
}
#endif

View file

@ -36,7 +36,7 @@
#include <inttypes.h>
#if defined(DEBUG)
#if defined(DEBUG) && !defined(SIMU)
#ifdef __cplusplus
extern "C" {

View file

@ -152,6 +152,7 @@ const pm_char STR_SLOWDOWN[] PROGMEM = TR_SLOWDOWN;
const pm_char STR_SLOWUP[] PROGMEM = TR_SLOWUP;
const pm_char STR_MIXER[] PROGMEM = TR_MIXER;
const pm_char STR_CV[] PROGMEM = TR_CV;
const pm_char STR_GV[] PROGMEM = TR_GV;
const pm_char STR_ACHANNEL[] PROGMEM = TR_ACHANNEL;
const pm_char STR_RANGE[] PROGMEM = TR_RANGE;
const pm_char STR_BAR[] PROGMEM = TR_BAR;
@ -286,7 +287,7 @@ const pm_char STR_INVERT_THR[] PROGMEM = TR_INVERT_THR;
#if defined(ROTARY_ENCODERS)
const pm_char STR_BACK[] PROGMEM = TR_BACK;
const pm_char STR_MIXERWEIGHT[] PROGMEM = TR_MIXERWEIGHT;
const pm_char STR_MIXERWEIGHT[] PROGMEM = TR_MIXERWEIGHT; // TODO remove them
const pm_char STR_MIXEROFFSET[] PROGMEM = TR_MIXEROFFSET;
const pm_char STR_DRWEIGHT[] PROGMEM = TR_DRWEIGHT;
const pm_char STR_DREXPO[] PROGMEM = TR_DREXPO;

View file

@ -259,6 +259,7 @@ extern const pm_char STR_SLOWDOWN[];
extern const pm_char STR_SLOWUP[];
extern const pm_char STR_MIXER[];
extern const pm_char STR_CV[];
extern const pm_char STR_GV[];
extern const pm_char STR_ACHANNEL[];
extern const pm_char STR_RANGE[];
extern const pm_char STR_BAR[];

View file

@ -129,12 +129,17 @@
#define TR_FSW_VOLUME
#define TR_FSW_BG_MUSIC
#endif
#ifdef DEBUG
#define TR_TEST "Test\0 "
#ifdef GVARS
#define TR_FSW_ADJUST_GVAR "Adjust \0 "
#else
#define TR_TEST
#define TR_FSW_ADJUST_GVAR
#endif
#define TR_VFSWFUNC "Bezpe\201\0 ""Tren\202r\0 ""Instant Trim " TR_SOUND TR_HAPTIC "Reset\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_VALUE TR_SDCLOGS TR_FSW_VOLUME "Podsv\203tlen\204\0 " TR_FSW_BG_MUSIC TR_TEST
#ifdef DEBUG
#define TR_FSW_TEST "Test\0 "
#else
#define TR_FSW_TEST
#endif
#define TR_VFSWFUNC "Bezpe\201\0 ""Tren\202r\0 ""Instant Trim " TR_SOUND TR_HAPTIC "Reset\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_VALUE TR_SDCLOGS TR_FSW_VOLUME "Podsv\203tlen\204\0 " TR_FSW_BG_MUSIC TR_FSW_ADJUST_GVAR TR_FSW_TEST
#define LEN_VFSWRESET "\006"
#define TR_VFSWRESET "Timer1""Timer2""V\207e ""Telem."
@ -244,7 +249,8 @@
#define TR_FADEIN "P\206echod Zap"
#define TR_FADEOUT "P\206echod Vyp"
#define TR_DEFAULT "(v\212choz\204)"
#define TR_CHECKTRIMS "Kont. \002 Trimy"
#define TR_CHECKTRIMS "\003Kont.\005Trimy"
#define OFS_CHECKTRIMS (9*FW)
#define TR_SWASHTYPE "Typ Cykliky"
#define TR_COLLECTIVE "Kolektiv"
#define TR_SWASHRING "Cyklika"
@ -279,6 +285,7 @@
#define TR_SLOWUP "Zpomalen\204(+)"
#define TR_MIXER "MIXER"
#define TR_CV "CV"
#define TR_GV "GV"
#define TR_ACHANNEL "A\002Kan\200l"
#define TR_RANGE "Rozsah"
#define TR_BAR "Bar"

View file

@ -129,12 +129,17 @@
#define TR_FSW_VOLUME
#define TR_FSW_BG_MUSIC
#endif
#ifdef GVARS
#define TR_FSW_ADJUST_GVAR "Adjust \0 "
#else
#define TR_FSW_ADJUST_GVAR
#endif
#ifdef DEBUG
#define TR_TEST "Test\0 "
#define TR_FSW_TEST "Test\0 "
#else
#define TR_TEST
#define TR_FSW_TEST
#endif
#define TR_VFSWFUNC "Safety\0 ""Trainer \0 ""Instant Trim " TR_SOUND TR_HAPTIC "Reset\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_VALUE TR_SDCLOGS TR_FSW_VOLUME "Backlight\0 " TR_FSW_BG_MUSIC TR_TEST
#define TR_VFSWFUNC "Safety\0 ""Trainer \0 ""Instant Trim " TR_SOUND TR_HAPTIC "Reset\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_VALUE TR_SDCLOGS TR_FSW_VOLUME "Backlight\0 " TR_FSW_BG_MUSIC TR_FSW_ADJUST_GVAR TR_FSW_TEST
#define LEN_VFSWRESET "\006"
#define TR_VFSWRESET "Timer1""Timer2""Alle ""Telem."
@ -244,7 +249,8 @@
#define TR_FADEIN "Fade In"
#define TR_FADEOUT "Fade Out"
#define TR_DEFAULT "(Standard)"
#define TR_CHECKTRIMS "Check\005Trims"
#define TR_CHECKTRIMS "\003Check\005Trims"
#define OFS_CHECKTRIMS (9*FW)
#define TR_SWASHTYPE "Swash Type"
#define TR_COLLECTIVE "Collective"
#define TR_SWASHRING "Swash Ring"
@ -278,7 +284,8 @@
#define TR_SLOWDOWN "Langs. Unten"
#define TR_SLOWUP "Langs. Oben"
#define TR_MIXER "MIXER"
#define TR_CV "CV"
#define TR_CV "CV"
#define TR_GV "GV"
#define TR_ACHANNEL "A\002channel"
#define TR_RANGE "Range"
#define TR_BAR "Bar"

View file

@ -129,12 +129,18 @@
#define TR_FSW_VOLUME
#define TR_FSW_BG_MUSIC
#endif
#ifdef DEBUG
#define TR_TEST "Test\0"
#ifdef GVARS
#define TR_FSW_ADJUST_GVAR "Adjust \0 "
#else
#define TR_TEST
#define TR_FSW_ADJUST_GVAR
#endif
#define TR_VFSWFUNC "Safety\0 ""Trainer \0 ""Instant Trim " TR_SOUND TR_HAPTIC "Reset\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_VALUE TR_SDCLOGS TR_FSW_VOLUME "Backlight\0 " TR_FSW_BG_MUSIC TR_TEST
#ifdef DEBUG
#define TR_FSW_TEST "Test\0"
#else
#define TR_FSW_TEST
#endif
#define TR_VFSWFUNC "Safety\0 ""Trainer \0 ""Instant Trim " TR_SOUND TR_HAPTIC "Reset\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_VALUE TR_SDCLOGS TR_FSW_VOLUME "Backlight\0 " TR_FSW_BG_MUSIC TR_FSW_ADJUST_GVAR TR_FSW_TEST
#define LEN_VFSWRESET "\006"
#define TR_VFSWRESET "Timer1""Timer2""All ""Telem."
@ -244,7 +250,8 @@
#define TR_FADEIN "Fade In"
#define TR_FADEOUT "Fade Out"
#define TR_DEFAULT "(default)"
#define TR_CHECKTRIMS "Check\005Trims"
#define TR_CHECKTRIMS "\003Check\005Trims"
#define OFS_CHECKTRIMS (9*FW)
#define TR_SWASHTYPE "Swash Type"
#define TR_COLLECTIVE "Collective"
#define TR_SWASHRING "Swash Ring"
@ -279,6 +286,7 @@
#define TR_SLOWUP "Slow Up"
#define TR_MIXER "MIXER"
#define TR_CV "CV"
#define TR_GV "GV"
#define TR_ACHANNEL "A\002channel"
#define TR_RANGE "Range"
#define TR_BAR "Bar"

View file

@ -124,12 +124,17 @@
#define TR_FSW_VOLUME
#define TR_FSW_BG_MUSIC
#endif
#ifdef DEBUG
#define TR_TEST "Test\0 "
#ifdef GVARS
#define TR_FSW_ADJUST_GVAR "Adjust \0 "
#else
#define TR_TEST
#define TR_FSW_ADJUST_GVAR
#endif
#define TR_VFSWFUNC "S\200cur.\0 ""Ecolage \0 ""Trim instant." TR_SOUND TR_HAPTIC "Remise \202 0\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_VALUE TR_SDCLOGS TR_FSW_VOLUME "R\200tro\200cl.\0 " TR_FSW_BG_MUSIC TR_TEST
#ifdef DEBUG
#define TR_FSW_TEST "Test\0 "
#else
#define TR_FSW_TEST
#endif
#define TR_VFSWFUNC "S\200cur.\0 ""Ecolage \0 ""Trim instant." TR_SOUND TR_HAPTIC "Remise \202 0\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_VALUE TR_SDCLOGS TR_FSW_VOLUME "R\200tro\200cl.\0 " TR_FSW_BG_MUSIC TR_FSW_ADJUST_GVAR TR_FSW_TEST
#define LEN_VFSWRESET "\006"
#define TR_VFSWRESET "Timer1""Timer2""Timers""T\200l\200m."
@ -243,7 +248,8 @@
#define TR_FADEIN "Fondu ON"
#define TR_FADEOUT "Fondu OFF"
#define TR_DEFAULT "(d\200faut)"
#define TR_CHECKTRIMS "V\200rif\005Trims"
#define TR_CHECKTRIMS "\003V\200rif\005Trims"
#define OFS_CHECKTRIMS (9*FW)
#define TR_SWASHTYPE "Type de Plat."
#define TR_COLLECTIVE "Collectif"
#define TR_SWASHRING "Limite Cycl."
@ -277,6 +283,7 @@
#define TR_SLOWUP "Ralenti Bas"
#define TR_MIXER "MIXEUR"
#define TR_CV "CB"
#define TR_GV "GV"
#define TR_ACHANNEL "A"
#define TR_RANGE "Plage"
#define TR_BAR "Barre"

View file

@ -129,12 +129,17 @@
#define TR_FSW_VOLUME
#define TR_FSW_BG_MUSIC
#endif
#ifdef DEBUG
#define TR_TEST "Test\0 "
#ifdef GVARS
#define TR_FSW_ADJUST_GVAR "Adjust \0 "
#else
#define TR_TEST
#define TR_FSW_ADJUST_GVAR
#endif
#define TR_VFSWFUNC "Blocco\0 ""Trainer \0 ""Instant Trim " TR_SOUND TR_HAPTIC "Reset\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_VALUE TR_SDCLOGS TR_FSW_VOLUME "Backlight\0 " TR_FSW_BG_MUSIC TR_TEST
#ifdef DEBUG
#define TR_FSW_TEST "Test\0 "
#else
#define TR_FSW_TEST
#endif
#define TR_VFSWFUNC "Blocco\0 ""Trainer \0 ""Instant Trim " TR_SOUND TR_HAPTIC "Reset\0 " TR_VVARIO TR_PLAY_TRACK TR_PLAY_VALUE TR_SDCLOGS TR_FSW_VOLUME "Backlight\0 " TR_FSW_BG_MUSIC TR_FSW_ADJUST_GVAR TR_FSW_TEST
#define LEN_VFSWRESET "\006"
#define TR_VFSWRESET "Timer1""Timer2""Tutto ""Telem."
@ -244,7 +249,8 @@
#define TR_FADEIN "Diss.In"
#define TR_FADEOUT "Diss.Out"
#define TR_DEFAULT "(default)"
#define TR_CHECKTRIMS "Contr.\003 Trim"
#define TR_CHECKTRIMS "\003Contr.\004Trim"
#define OFS_CHECKTRIMS (9*FW)
#define TR_SWASHTYPE "Tipo Ciclico"
#define TR_COLLECTIVE "Collettivo"
#define TR_SWASHRING "AnelloCiclico"
@ -279,6 +285,7 @@
#define TR_SLOWUP "Rall. S\200"
#define TR_MIXER "MIXER"
#define TR_CV "CV"
#define TR_GV "GV"
#define TR_ACHANNEL "A\002ingresso"
#define TR_RANGE "Range"
#define TR_BAR "Barra"

View file

@ -124,12 +124,17 @@
#define TR_FSW_VOLUME
#define TR_FSW_BG_MUSIC
#endif
#ifdef DEBUG
#define TR_TEST "Test\0 "
#ifdef GVARS
#define TR_FSW_ADJUST_GVAR "Adjust \0 "
#else
#define TR_TEST
#define TR_FSW_ADJUST_GVAR
#endif
#define TR_VFSWFUNC "S\201kra\0 ""Trainer\0 ""S\201tt Trim " TR_SOUND TR_HAPTIC "Nollst\201ll " TR_VVARIO TR_PLAY_TRACK TR_PLAY_VALUE TR_SDCLOGS TR_FSW_VOLUME "Bakgrundsljus" TR_FSW_BG_MUSIC TR_TEST
#ifdef DEBUG
#define TR_FSW_TEST "Test\0 "
#else
#define TR_FSW_TEST
#endif
#define TR_VFSWFUNC "S\201kra\0 ""Trainer\0 ""S\201tt Trim " TR_SOUND TR_HAPTIC "Nollst\201ll " TR_VVARIO TR_PLAY_TRACK TR_PLAY_VALUE TR_SDCLOGS TR_FSW_VOLUME "Bakgrundsljus" TR_FSW_BG_MUSIC TR_FSW_ADJUST_GVAR TR_FSW_TEST
#define LEN_VFSWRESET "\006"
#define TR_VFSWRESET "Timer1""Timer2""Allt ""Telem."
@ -241,7 +246,8 @@
#define TR_FADEIN "Tona In"
#define TR_FADEOUT "Tona Ut"
#define TR_DEFAULT "Standard"
#define TR_CHECKTRIMS "Kolla\005Trimmar"
#define TR_CHECKTRIMS "\003Kolla\005Trimmar"
#define OFS_CHECKTRIMS (9*FW)
#define TR_SWASHTYPE "Swashtyp"
#define TR_COLLECTIVE "Kollektiv"
#define TR_SWASHRING "Swashring"
@ -276,6 +282,7 @@
#define TR_SLOWUP "Tr\202ghet Upp"
#define TR_MIXER "MIXAR"
#define TR_CV "KU"
#define TR_GV "GV"
#define TR_ACHANNEL "A\002kanal "
#define TR_RANGE "Omr\200de"
#define TR_BAR "Data"