[Taranis] A lot of new features, >100 hours work in one commit...
This commit is contained in:
+44
-57
@@ -246,6 +246,10 @@ GVARS = NO
|
||||
# Values = NO, POT1, POT2, POT3,
|
||||
3POS = NO
|
||||
|
||||
# Menu Lock modes
|
||||
# Values = NO, READONLY, NOMENUS
|
||||
MENUS_LOCK == NO
|
||||
|
||||
#------- END BUILD OPTIONS ---------------------------
|
||||
|
||||
# Define programs and commands.
|
||||
@@ -256,19 +260,21 @@ SVNREV = $(shell sh -c "svnversion | egrep -o '[[:digit:]]+[[:alpha:]]*$$'")
|
||||
|
||||
SRC =
|
||||
CPPSRC =
|
||||
INCDIRS = . translations
|
||||
EXTRAINCDIRS =
|
||||
|
||||
# MCU name
|
||||
ifneq ($(PCB), $(filter $(PCB), STD 9X 9XR STD128 9X128 9XR128 9X2561 9XR2561 GRUVIN9X MEGA2560 SKY9X TARANIS))
|
||||
$(error Sorry, the PCB $(PCB) is not supported yet in openTx)
|
||||
endif
|
||||
|
||||
GVARS_VARIANT = +1
|
||||
FRSKY_VARIANT = +2
|
||||
3POS_VARIANT = +4
|
||||
MAVLINK_VARIANT = +8
|
||||
M128_VARIANT = +32768
|
||||
M2561_VARIANT = +16384
|
||||
EEPROM_VARIANT = 0
|
||||
GVARS_VARIANT = +1
|
||||
FRSKY_VARIANT = +2
|
||||
3POS_VARIANT = +4
|
||||
MAVLINK_VARIANT = +8
|
||||
M128_VARIANT = +32768
|
||||
M2561_VARIANT = +16384
|
||||
EEPROM_VARIANT = 0
|
||||
|
||||
ifeq ($(PCB), $(filter $(PCB), STD 9X 9XR))
|
||||
# 9x/9xr radio
|
||||
@@ -278,7 +284,7 @@ ifeq ($(PCB), $(filter $(PCB), STD 9X 9XR))
|
||||
OPT = s
|
||||
SDCARD = NO
|
||||
THR_TRACE = NO
|
||||
EXTRAINCDIRS = targets/stock
|
||||
INCDIRS += targets/stock
|
||||
CPPDEFS = -DF_CPU=$(F_CPU)UL -DPCBSTD -DCPUM64 -DEEPROM_VARIANT=$(shell echo ${EEPROM_VARIANT} | bc)
|
||||
BOARDSRC = targets/stock/board_stock.cpp
|
||||
EXTRABOARDSRC = targets/stock/lcd_driver.cpp
|
||||
@@ -338,7 +344,7 @@ ifeq ($(PCB), $(filter $(PCB), STD128 9X128 9XR128))
|
||||
THR_TRACE = NO
|
||||
EEPROM_VARIANT += ${M128_VARIANT}
|
||||
CPPDEFS = -DF_CPU=$(F_CPU)UL -DPCBSTD -DCPUM128 -DEEPROM_VARIANT=$(shell echo ${EEPROM_VARIANT} | bc)
|
||||
EXTRAINCDIRS = targets/stock
|
||||
INCDIRS += targets/stock
|
||||
BOARDSRC = targets/stock/board_stock.cpp
|
||||
EXTRABOARDSRC = targets/stock/lcd_driver.cpp
|
||||
EEPROMSRC = eeprom_common.cpp eeprom_rlc.cpp
|
||||
@@ -397,7 +403,7 @@ ifeq ($(PCB), $(filter $(PCB), 9X2561))
|
||||
THR_TRACE = YES
|
||||
EEPROM_VARIANT += ${M2561_VARIANT}
|
||||
CPPDEFS = -DF_CPU=$(F_CPU)UL -DPCBSTD -DCPUM2561 -DEEPROM_VARIANT=$(shell echo ${EEPROM_VARIANT} | bc)
|
||||
EXTRAINCDIRS = targets/stock
|
||||
INCDIRS += targets/stock
|
||||
BOARDSRC = targets/stock/board_stock.cpp
|
||||
EXTRABOARDSRC = targets/stock/lcd_driver.cpp
|
||||
EEPROMSRC = eeprom_common.cpp eeprom_rlc.cpp
|
||||
@@ -457,7 +463,7 @@ ifeq ($(PCB), GRUVIN9X)
|
||||
SDCARD = NO
|
||||
BUZZER = NO
|
||||
THR_TRACE = YES
|
||||
EXTRAINCDIRS = targets/gruvin9x targets/stock FatFs FatFs/option
|
||||
INCDIRS += targets/gruvin9x targets/stock FatFs FatFs/option
|
||||
BOARDSRC = targets/gruvin9x/board_gruvin9x.cpp
|
||||
EXTRABOARDSRC = targets/stock/lcd_driver.cpp
|
||||
EEPROMSRC = eeprom_common.cpp eeprom_rlc.cpp
|
||||
@@ -495,7 +501,7 @@ ifeq ($(PCB), MEGA2560)
|
||||
CPPDEFS = -DF_CPU=$(F_CPU)UL -DPCBMEGA2560 -DCPUM2560 -DEEPROM_VARIANT=0 -DAUDIO -DRTCLOCK
|
||||
SDCARD = YES
|
||||
THR_TRACE = YES
|
||||
EXTRAINCDIRS = targets/mega2560 targets/stock FatFs FatFs/option
|
||||
INCDIRS += targets/mega2560 targets/stock FatFs FatFs/option
|
||||
BOARDSRC = targets/mega2560/board_mega2560.cpp
|
||||
EXTRABOARDSRC = targets/mega2560/lcd_driver_ST7565R.cpp
|
||||
EEPROMSRC = eeprom_common.cpp eeprom_rlc.cpp
|
||||
@@ -535,7 +541,7 @@ ifeq ($(PCB), SKY9X)
|
||||
BUZZER = NO
|
||||
THR_TRACE = YES
|
||||
CPPDEFS += -DPCBSKY9X -DCPUARM -DEEPROM_VARIANT=0 -DAUDIO -DHAPTIC -DPXX -DDSM2 -DDSM2_PPM -DROTARY_ENCODERS=1
|
||||
EXTRAINCDIRS = targets/sky9x CoOS/kernel CoOS/portable
|
||||
INCDIRS += targets/sky9x CoOS/kernel CoOS/portable
|
||||
BOARDSRC = targets/sky9x/board_sky9x.cpp
|
||||
EXTRABOARDSRC = targets/sky9x/lcd_driver.cpp
|
||||
SRC += targets/sky9x/core_cm3.c targets/sky9x/board_lowlevel.c targets/sky9x/crt.c targets/sky9x/vectors_sam3s.c
|
||||
@@ -551,7 +557,7 @@ ifeq ($(PCB), SKY9X)
|
||||
|
||||
ifeq ($(SDCARD), YES)
|
||||
CPPDEFS += -DVOICE
|
||||
EXTRAINCDIRS += FatFs FatFs/option
|
||||
INCDIRS += FatFs FatFs/option
|
||||
EXTRABOARDSRC += FatFs/ff.c FatFs/fattime.c FatFs/option/ccsbcs.c targets/sky9x/diskio.cpp
|
||||
endif
|
||||
|
||||
@@ -596,18 +602,18 @@ ifeq ($(PCB), TARANIS)
|
||||
THR_TRACE = YES
|
||||
EXT = FRSKY
|
||||
CPPDEFS += -DPCBTARANIS -DCPUARM -DEEPROM_VARIANT=0 -DAUDIO -DPXX
|
||||
EXTRAINCDIRS = targets/taranis CoOS/kernel CoOS/portable
|
||||
INCDIRS += targets/taranis CoOS/kernel CoOS/portable
|
||||
EXTRAINCDIRS += targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/inc targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F2xx/Include targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/include
|
||||
EXTRAINCDIRS += targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_OTG_Driver/inc targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Core/inc
|
||||
EXTRAINCDIRS += targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Class/msc/inc targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Class/hid/inc
|
||||
BOARDSRC = targets/taranis/board_taranis.cpp
|
||||
EXTRABOARDSRC += targets/taranis/lcd_driver.cpp targets/taranis/aspi.cpp targets/taranis/i2c.c
|
||||
SRC += CoOS/kernel/core.c CoOS/kernel/hook.c CoOS/kernel/task.c CoOS/kernel/event.c CoOS/kernel/time.c CoOS/kernel/timer.c CoOS/kernel/flag.c CoOS/kernel/mutex.c CoOS/kernel/serviceReq.c CoOS/portable/GCC/port.c CoOS/portable/arch.c
|
||||
EEPROMSRC = eeprom_common.cpp eeprom_rlc.cpp # TODO later eeprom_conversions.cpp
|
||||
EEPROMSRC = eeprom_common.cpp eeprom_rlc.cpp eeprom_conversions.cpp
|
||||
PULSESSRC = protocols/pulses_arm.cpp protocols/ppm_arm.cpp protocols/pxx_arm.cpp
|
||||
CPPSRC += audio_arm.cpp
|
||||
CPPSRC += targets/taranis/pwr_driver.cpp targets/taranis/pulses_driver.cpp targets/taranis/keys_driver.cpp targets/taranis/adc_driver.cpp targets/taranis/trainer_driver.cpp targets/taranis/audio_driver.cpp targets/taranis/delays.cpp targets/taranis/uart_driver.cpp targets/taranis/sport_driver.cpp
|
||||
CPPSRC += bmp.cpp gui/view_channels.cpp gui/view_about.cpp
|
||||
CPPSRC += bmp.cpp gui/view_channels.cpp gui/view_about.cpp gui/view_text.cpp
|
||||
SRC += targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/CMSIS/Device/ST/STM32F2xx/Source/Templates/system_stm32f2xx.c
|
||||
SRC += targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/src/misc.c
|
||||
SRC += targets/taranis/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries/STM32F2xx_StdPeriph_Driver/src/stm32f2xx_gpio.c
|
||||
@@ -631,11 +637,12 @@ ifeq ($(PCB), TARANIS)
|
||||
SRC += targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_msc_bot.c
|
||||
SRC += targets/taranis/STM32_USB-Host-Device_Lib_V2.1.0/Libraries/STM32_USB_Device_Library/Class/msc/src/usbd_msc_core.c
|
||||
EXTRABOARDSRC += targets/taranis/usbd_usr.cpp targets/taranis/usbd_storage_msd.cpp
|
||||
SRC += targets/sky9x/syscalls.c
|
||||
|
||||
ifeq ($(SDCARD), YES)
|
||||
EXTRABOARDSRC += FatFs/ff.c FatFs/fattime.c FatFs/option/ccsbcs.c targets/taranis/diskio.cpp
|
||||
CPPDEFS += -DVOICE
|
||||
EXTRAINCDIRS += FatFs FatFs/option
|
||||
INCDIRS += FatFs FatFs/option
|
||||
endif
|
||||
|
||||
ifeq ($(RTCLOCK), YES)
|
||||
@@ -645,7 +652,6 @@ ifeq ($(PCB), TARANIS)
|
||||
|
||||
ifeq ($(DEBUG), YES)
|
||||
CPPSRC += debug.cpp
|
||||
SRC += targets/sky9x/syscalls.c
|
||||
endif
|
||||
|
||||
ifeq ($(DSM2), PPM)
|
||||
@@ -696,12 +702,6 @@ CPPSRC += opentx.cpp $(PULSESSRC) stamp.cpp gui/menus.cpp gui/menu_model.cpp gui
|
||||
# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run.
|
||||
DBGFMT = dwarf-2
|
||||
|
||||
# List any extra directories to look for include files here.
|
||||
# Each directory must be seperated by a space.
|
||||
# Use forward slashes for directory separators.
|
||||
# For a directory that has spaces, enclose it in quotes.
|
||||
EXTRAINCDIRS += . translations
|
||||
|
||||
CPPDEFS += -DTRANSLATIONS_$(TRANSLATIONS)
|
||||
|
||||
# TTS language
|
||||
@@ -780,8 +780,10 @@ endif
|
||||
|
||||
ifneq ($(FONT), STD)
|
||||
CPPDEFS += -DFONT_$(FONT)
|
||||
EXTRAINCDIRS += fonts/$(shell sh -c "echo $(FONT) | tr '[:upper:]' '[:lower:]'")
|
||||
INCDIRS += fonts/$(shell sh -c "echo $(FONT) | tr '[:upper:]' '[:lower:]'")
|
||||
endif
|
||||
|
||||
INCDIRS += fonts/std
|
||||
|
||||
ifeq ($(THR_TRACE), YES)
|
||||
CPPDEFS += -DTHRTRACE
|
||||
@@ -800,6 +802,14 @@ ifeq ($(GVARS), YES)
|
||||
EEPROM_VARIANT += ${GVARS_VARIANT}
|
||||
endif
|
||||
|
||||
ifeq ($(MENUS_LOCK), READONLY)
|
||||
CPPDEFS += -DMENUS_LOCK=1
|
||||
endif
|
||||
|
||||
ifeq ($(MENUS_LOCK), NOMENUS)
|
||||
CPPDEFS += -DMENUS_LOCK=2
|
||||
endif
|
||||
|
||||
ifeq ($(CORRECT_NEGATIVE_VALUES), YES)
|
||||
CPPDEFS += -DCORRECT_NEGATIVE_SHIFTS
|
||||
endif
|
||||
@@ -978,33 +988,17 @@ CPPFLAGS += $(CPPDEFS)
|
||||
CPPFLAGS += -Wall
|
||||
CPPFLAGS += -fno-exceptions
|
||||
CPPFLAGS += -Wno-strict-aliasing
|
||||
EXTRAINCDIRS += fonts/std
|
||||
CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
|
||||
INCFLAGS = $(patsubst %,-I%,$(INCDIRS))
|
||||
EXTRAINCFLAGS = $(patsubst %,-I%,$(EXTRAINCDIRS))
|
||||
|
||||
MATH_LIB = -lm
|
||||
|
||||
#---------------- External Memory Options ----------------
|
||||
|
||||
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
||||
# used for variables (.data/.bss) and heap (malloc()).
|
||||
#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
|
||||
|
||||
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
|
||||
# only used for heap (malloc()).
|
||||
#EXTMEMOPTS = -Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x80ffff
|
||||
|
||||
EXTMEMOPTS =
|
||||
|
||||
|
||||
|
||||
#---------------- Linker Options ----------------
|
||||
# -Wl,...: tell GCC to pass this to linker.
|
||||
# -Map: create map file
|
||||
# --cref: add cross reference to map file
|
||||
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
|
||||
LDFLAGS += $(EXTMEMOPTS)
|
||||
LDFLAGS += $(MATH_LIB)
|
||||
#LDFLAGS += -T linker_script.x
|
||||
|
||||
# Define Messages
|
||||
# English
|
||||
@@ -1022,8 +1016,8 @@ MSG_CLEANING = Cleaning project:
|
||||
# Combine all necessary flags and optional flags.
|
||||
# Add target processor to flags.
|
||||
|
||||
ARMCPPFLAGS = -c -mcpu=$(MCU) -mthumb -fomit-frame-pointer -fverbose-asm -Wa,-ahlms=opentx.lst -DRUN_FROM_FLASH=1 -O$(OPT) $(CPPFLAGS) $(GENDEPFLAGS)
|
||||
AVRCPPFLAGS = -mmcu=$(MCU) -I. -x c++ -O$(OPT) $(CPPFLAGS) $(GENDEPFLAGS) -fwhole-program
|
||||
ARMCPPFLAGS = -c -mcpu=$(MCU) -mthumb -fomit-frame-pointer -fverbose-asm -Wa,-ahlms=opentx.lst -DRUN_FROM_FLASH=1 -O$(OPT) $(CPPFLAGS) $(INCFLAGS) $(EXTRAINCFLAGS) $(GENDEPFLAGS)
|
||||
AVRCPPFLAGS = -mmcu=$(MCU) -I. -x c++ -O$(OPT) $(CPPFLAGS) $(INCFLAGS) $(EXTRAINCFLAGS) $(GENDEPFLAGS) -fwhole-program
|
||||
|
||||
ifeq ($(ARCH), AVR)
|
||||
GCCVERSIONGTE462 := $(shell expr 4.6.2 \<= `$(CC) -dumpversion`)
|
||||
@@ -1047,7 +1041,7 @@ all: begin gccversion sizebefore build sizeafter end
|
||||
|
||||
# Change the build target to build a HEX file or a library.
|
||||
ifeq ($(ARCH), AVR)
|
||||
build: stamp_header tra lbm allsrc.cpp elf remallsrc hex
|
||||
build: stamp_header tra lbm allsrc.cpp elf remallsrc hex
|
||||
else
|
||||
build: stamp_header tra lbm allsrc.cpp elf remallsrc bin
|
||||
endif
|
||||
@@ -1176,7 +1170,6 @@ sizeafter:
|
||||
gccversion :
|
||||
@$(CC) --version
|
||||
|
||||
# gruvin: added extra include and lib paths to get simu working on my Mac
|
||||
FOXINC=-I/usr/local/include/fox-1.6 -I/usr/include/fox-1.6 \
|
||||
-I$(FOXPATH)/include \
|
||||
-I/opt/local/include/fox-1.6
|
||||
@@ -1187,7 +1180,7 @@ FOXLIB=-L/usr/local/lib \
|
||||
-Wl,-rpath,$(FOXPATH)/src/.libs
|
||||
|
||||
simu: stamp_header $(BOARDSRC) $(CPPSRC) Makefile simu.cpp simpgmspace.cpp *.h tra lbm eeprom.bin
|
||||
g++ $(CPPFLAGS) simu.cpp $(BOARDSRC) $(CPPSRC) simpgmspace.cpp -MD -DSIMU -O0 -o simu $(FOXINC) $(FOXLIB) -pthread
|
||||
g++ $(CPPFLAGS) $(INCFLAGS) simu.cpp $(BOARDSRC) $(CPPSRC) simpgmspace.cpp -MD -DSIMU -O0 -o simu $(FOXINC) $(FOXLIB) -pthread -fexceptions
|
||||
|
||||
eeprom.bin:
|
||||
dd if=/dev/zero of=$@ bs=1 count=2048
|
||||
@@ -1327,12 +1320,6 @@ GTEST_DIR = ../gtest-1.6.0
|
||||
# Where to find user code.
|
||||
USER_DIR = ./
|
||||
|
||||
# Flags passed to the preprocessor.
|
||||
CPPFLAGS += -I$(GTEST_DIR)/include
|
||||
|
||||
# Flags passed to the C++ compiler.
|
||||
CXXFLAGS += -g -Wall -Wextra
|
||||
|
||||
# All Google Test headers. Usually you shouldn't change this
|
||||
# definition.
|
||||
GTEST_HEADERS = $(GTEST_DIR)/include/gtest/*.h \
|
||||
@@ -1351,11 +1338,11 @@ GTEST_SRCS_ = $(GTEST_DIR)/src/*.cc $(GTEST_DIR)/src/*.h $(GTEST_HEADERS)
|
||||
# conservative and not optimized. This is fine as Google Test
|
||||
# compiles fast and for ordinary users its source rarely changes.
|
||||
gtest-all.o : $(GTEST_SRCS_)
|
||||
$(CXX) $(CPPFLAGS) -I$(GTEST_DIR) $(CXXFLAGS) -c \
|
||||
$(CXX) $(CPPFLAGS) -I$(GTEST_DIR) -c \
|
||||
$(GTEST_DIR)/src/gtest-all.cc
|
||||
|
||||
gtest_main.o : $(GTEST_SRCS_)
|
||||
$(CXX) $(CPPFLAGS) -I$(GTEST_DIR) $(CXXFLAGS) -c \
|
||||
$(CXX) $(CPPFLAGS) -I$(GTEST_DIR) -c \
|
||||
$(GTEST_DIR)/src/gtest_main.cc
|
||||
|
||||
gtest.a : gtest-all.o
|
||||
|
||||
+36
-9
@@ -82,10 +82,24 @@ const char * audioFilenames[] = {
|
||||
"warning3",
|
||||
"midtrim",
|
||||
"endtrim",
|
||||
"midpot",
|
||||
"midstck1",
|
||||
"midstck2",
|
||||
"midstck3",
|
||||
"midstck4",
|
||||
#if defined(PCBTARANIS)
|
||||
"midpot1",
|
||||
"midpot2",
|
||||
"midslid1",
|
||||
"midslid2",
|
||||
#else
|
||||
"midpot1",
|
||||
"midpot2",
|
||||
"midpot3",
|
||||
#endif
|
||||
"mixwarn1",
|
||||
"mixwarn2",
|
||||
"mixwarn3",
|
||||
"timer00",
|
||||
"timer10",
|
||||
"timer20",
|
||||
"timer30",
|
||||
@@ -152,11 +166,9 @@ inline uint8_t getAvailableFiles(char *prefix, FILINFO &info, char *filename)
|
||||
void refreshModelAudioFiles()
|
||||
{
|
||||
FILINFO info;
|
||||
#if _USE_LFN
|
||||
TCHAR lfn[_MAX_LFN + 1];
|
||||
info.lfname = lfn;
|
||||
info.lfsize = sizeof(lfn);
|
||||
#endif
|
||||
|
||||
char filename[AUDIO_FILENAME_MAXLEN+1] = SOUNDS_PATH "/";
|
||||
strncpy(filename+SOUNDS_PATH_LNG_OFS, currentLanguagePack->id, 2);
|
||||
@@ -822,7 +834,18 @@ void audioEvent(uint8_t e, uint16_t f)
|
||||
audioQueue.play(BEEP_DEFAULT_FREQ, 200, 20, PLAY_NOW);
|
||||
break;
|
||||
// pot/stick center
|
||||
case AU_POT_STICK_MIDDLE:
|
||||
case AU_STICK1_MIDDLE:
|
||||
case AU_STICK2_MIDDLE:
|
||||
case AU_STICK3_MIDDLE:
|
||||
case AU_STICK4_MIDDLE:
|
||||
case AU_POT1_MIDDLE:
|
||||
case AU_POT2_MIDDLE:
|
||||
#if defined(PCBTARANIS)
|
||||
case AU_SLIDER1_MIDDLE:
|
||||
case AU_SLIDER2_MIDDLE:
|
||||
#else
|
||||
case AU_POT3_MIDDLE:
|
||||
#endif
|
||||
audioQueue.play(BEEP_DEFAULT_FREQ+1500, 80, 20, PLAY_NOW);
|
||||
break;
|
||||
// mix warning 1
|
||||
@@ -837,17 +860,21 @@ void audioEvent(uint8_t e, uint16_t f)
|
||||
case AU_MIX_WARNING_3:
|
||||
audioQueue.play(BEEP_DEFAULT_FREQ+1680, 48, 32, PLAY_REPEAT(2));
|
||||
break;
|
||||
// time <= 10 seconds left
|
||||
// timer == 0
|
||||
case AU_TIMER_00:
|
||||
audioQueue.play(BEEP_DEFAULT_FREQ+150, 240, 20, PLAY_NOW);
|
||||
break;
|
||||
// timer <= 10 seconds left
|
||||
case AU_TIMER_LT10:
|
||||
audioQueue.play(BEEP_DEFAULT_FREQ+150, 120, 20, PLAY_NOW);
|
||||
break;
|
||||
// time 20 seconds left
|
||||
// timer 20 seconds left
|
||||
case AU_TIMER_20:
|
||||
audioQueue.play(BEEP_DEFAULT_FREQ, 120, 20, PLAY_REPEAT(1)|PLAY_NOW);
|
||||
audioQueue.play(BEEP_DEFAULT_FREQ+150, 120, 20, PLAY_REPEAT(1)|PLAY_NOW);
|
||||
break;
|
||||
// time 30 seconds left
|
||||
// timer 30 seconds left
|
||||
case AU_TIMER_30:
|
||||
audioQueue.play(BEEP_DEFAULT_FREQ, 120, 20, PLAY_REPEAT(2)|PLAY_NOW);
|
||||
audioQueue.play(BEEP_DEFAULT_FREQ+150, 120, 20, PLAY_REPEAT(2)|PLAY_NOW);
|
||||
break;
|
||||
#if defined(PCBTARANIS)
|
||||
case AU_A1_ORANGE:
|
||||
|
||||
+3
-2
@@ -249,10 +249,11 @@ void audioStart();
|
||||
#define AUDIO_ERROR() AUDIO_BUZZER(audioEvent(AU_ERROR), beep(4))
|
||||
#define AUDIO_TIMER_30() AUDIO_BUZZER(audioEvent(AU_TIMER_30), { beepAgain=2; beep(2); })
|
||||
#define AUDIO_TIMER_20() AUDIO_BUZZER(audioEvent(AU_TIMER_20), { beepAgain=1; beep(2); })
|
||||
#define AUDIO_TIMER_LT10(x) AUDIO_BUZZER(audioEvent(AU_TIMER_LT10), beep(2))
|
||||
#define AUDIO_TIMER_LT10(m, x) do { if (m==COUNTDOWN_VOICE) playNumber(x, 0, 0, 0); else AUDIO_BUZZER(audioEvent(AU_TIMER_LT10), beep(2)); } while(0)
|
||||
#define AUDIO_TIMER_00(m) do { if (m==COUNTDOWN_VOICE) playNumber(0, 0, 0, 0); else AUDIO_BUZZER(audioEvent(AU_TIMER_00), beep(3)); } while(0)
|
||||
#define AUDIO_INACTIVITY() AUDIO_BUZZER(audioEvent(AU_INACTIVITY), beep(3))
|
||||
#define AUDIO_MIX_WARNING(x) AUDIO_BUZZER(audioEvent(AU_MIX_WARNING_1+x-1), beep(1))
|
||||
#define AUDIO_POT_STICK_MIDDLE() AUDIO_BUZZER(audioEvent(AU_POT_STICK_MIDDLE), beep(2))
|
||||
#define AUDIO_POT_MIDDLE(x) AUDIO_BUZZER(audioEvent(AU_STICK1_MIDDLE+x), beep(2))
|
||||
#define AUDIO_VARIO_UP() audioEvent(AU_KEYPAD_UP)
|
||||
#define AUDIO_VARIO_DOWN() audioEvent(AU_KEYPAD_DOWN)
|
||||
#define AUDIO_TRIM_MIDDLE(f) AUDIO_BUZZER(audioEvent(AU_TRIM_MIDDLE, f), beep(2))
|
||||
|
||||
@@ -242,6 +242,7 @@ void audioQueue::event(uint8_t e, uint8_t f)
|
||||
BEEP_DEFAULT_FREQ + 50, 6, 0, 0, // MIX_WARNING_1
|
||||
BEEP_DEFAULT_FREQ + 52, 6, 3, PLAY_REPEAT(1), // MIX_WARNING_2
|
||||
BEEP_DEFAULT_FREQ + 54, 6, 3, PLAY_REPEAT(2), // MIX_WARNING_3
|
||||
BEEP_DEFAULT_FREQ + 50, 30, 3, PLAY_NOW, // TIMER_00
|
||||
BEEP_DEFAULT_FREQ + 50, 15, 3, PLAY_NOW, // TIMER_LT10
|
||||
BEEP_DEFAULT_FREQ + 50, 15, 3, PLAY_REPEAT(1)|PLAY_NOW, // TIMER_20
|
||||
BEEP_DEFAULT_FREQ + 50, 15, 3, PLAY_REPEAT(2)|PLAY_NOW, // TIMER_30
|
||||
|
||||
+5
-4
@@ -136,11 +136,12 @@ void audioDefevent(uint8_t e);
|
||||
#define AUDIO_INACTIVITY() VOICE_AUDIO_BUZZER(PUSH_SYSTEM_PROMPT(AU_INACTIVITY), audioDefevent(AU_INACTIVITY), beep(3))
|
||||
#define AUDIO_ERROR_MESSAGE(e) VOICE_AUDIO_BUZZER(PUSH_SYSTEM_PROMPT((e)), audioDefevent(AU_ERROR), beep(4))
|
||||
#define AUDIO_TIMER_MINUTE(t) VOICE_AUDIO_BUZZER(playDuration(t), audioDefevent(AU_WARNING1), beep(2))
|
||||
#define AUDIO_TIMER_30() VOICE_AUDIO_BUZZER(PUSH_SYSTEM_PROMPT(AU_TIMER_30+1/*to avoid renumbering*/), audioDefevent(AU_TIMER_30), { beepAgain=2; beep(2); })
|
||||
#define AUDIO_TIMER_20() VOICE_AUDIO_BUZZER(PUSH_SYSTEM_PROMPT(AU_TIMER_20+1/*to avoid renumbering*/), audioDefevent(AU_TIMER_20), { beepAgain=1; beep(2); })
|
||||
#define AUDIO_TIMER_LT10(x) AUDIO_BUZZER(audioDefevent(AU_TIMER_LT10), beep(2))
|
||||
#define AUDIO_TIMER_30() VOICE_AUDIO_BUZZER(PUSH_SYSTEM_PROMPT(AU_TIMER_30), audioDefevent(AU_TIMER_30), { beepAgain=2; beep(2); })
|
||||
#define AUDIO_TIMER_20() VOICE_AUDIO_BUZZER(PUSH_SYSTEM_PROMPT(AU_TIMER_20), audioDefevent(AU_TIMER_20), { beepAgain=1; beep(2); })
|
||||
#define AUDIO_TIMER_LT10(m, x) AUDIO_BUZZER(audioDefevent(AU_TIMER_LT10), beep(2))
|
||||
#define AUDIO_TIMER_00(m) AUDIO_BUZZER(audioDefevent(AU_TIMER_00), beep(3))
|
||||
#define AUDIO_MIX_WARNING(x) AUDIO_BUZZER(audioDefevent(AU_MIX_WARNING_1+x-1), beep(1))
|
||||
#define AUDIO_POT_STICK_MIDDLE() AUDIO_BUZZER(audioDefevent(AU_POT_STICK_MIDDLE), beep(2))
|
||||
#define AUDIO_POT_MIDDLE(x) AUDIO_BUZZER(audioDefevent(AU_POT_MIDDLE), beep(2))
|
||||
#define AUDIO_VARIO_UP() audioDefevent(AU_KEYPAD_UP)
|
||||
#define AUDIO_VARIO_DOWN() audioDefevent(AU_KEYPAD_DOWN)
|
||||
#define AUDIO_TRIM_MIDDLE(f) AUDIO_BUZZER(audio.event(AU_TRIM_MIDDLE, f), beep(2))
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
102,8,
|
||||
0xff,0xff,0x00,0x00,0xff,0xff,0x1c,0x1c,0x6b,0xff,0xb6,0x22,0xbf,0xff,0xc0,0x80,0xff,0xff,0xe8,0xe8,0xbf,0xff,0xc0,0x80,0x6b,0xff,0xb6,0x22,0xff,0xff,0x1c,0x1c,0xff,0xff,0x00,0x00,0xff,0xff,0x38,0x38,0xbb,0xff,0x7c,0x38,0x7d,0xff,0xfe,0x7c,0xff,0xff,0xfe,0xfe,0xff,0xff,0x00,0x00,0xff,0xff,0x50,0x50,0xff,0xff,0x20,0x20,0xff,0xff,0x50,0x50,0xff,0xff,0x38,0x38,0xbb,0xff,0x7c,0x38,0x7d,0xff,0xfe,0x7c,0xff,0xff,0xfe,0xfe,0xff,0xff,0x00,0x00,0xff,0xff,0x40,0x40,0xff,0xff,0x40,0x40,0xff,0xff,0x40,0x40,0xff,0xff,0x38,0x38,0xbb,0xff,0x7c,0x38,0x7d,0xff,0xfe,0x7c,0xff,0xff,0xfe,0xfe,0xff,0xff,0x00,0x00,0xff,0xff,0x50,0x50,0xff,0xff,0x50,0x50,0xff,0xff,0x50,0x50,0xff,0xff,0x38,0x38,0xbb,0xff,0x7c,0x38,0x7d,0xff,0xfe,0x7c,0xff,0xff,0xfe,0xfe,0xff,0xff,0x00,0x00,0xff,0xff,0x54,0x54,0xff,0xff,0x54,0x54,0xff,0xff,0x54,0x54,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x7f,0xff,0xc1,0x41,0x41,0xff,0xfd,0x7d,0x7d,0xff,0xfd,0x7d,0x7d,0xff,0xfd,0x7d,0x7d,0xff,0xfd,0x7d,0x7d,0xfd,0xfb,0x7b,0x79,0xfb,0xc7,0x47,0x43,0xff,0xff,0x7f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x7f,0xff,0xff,0x7f,0x7f,0xe3,0xff,0x77,0x63,0xdd,0xff,0x63,0x41,0xdd,0xff,0x41,0x41,0xdd,0xff,0x63,0x41,0xe3,0xff,0x77,0x63,0xff,0xff,0x7f,0x7f,0xff,0xff,0x7f,0x7f,0xff,0xff,0xff,0xff,0xfd,0xff,0x43,0x41,0xff,0xff,0x7d,0x7d,0xff,0xff,0x73,0x73,0xff,0xff,0x7d,0x7d,0xdd,0xff,0x63,0x41,0xff,0xff,0x5f,0x5f,0xff,0xff,0x59,0x59,0xdd,0xff,0x63,0x41,0xff,0xff,0x79,0x79,0xff,0xff,0xff,0xff,0xff,0xff,0x79,0x79,0xdd,0xff,0x63,0x41,0xff,0xff,0x59,0x59,0xff,0xff,0x5f,0x5f,0xf5,0xff,0x5b,0x51,0xff,0xff,0x55,0x55,0xff,0xff,0x55,0x55,0xff,0xff,0x55,0x55,0xd7,0xff,0x6d,0x45,0xff,0xff,0xff,0xff,0xff,0xff,0x63,0x63,0xff,0xff,0x63,0x63,0xff,0xff,0x77,0x77,0xff,0xff,0x73,0x73,0xff,0xff,0x65,0x65,0xfd,0xff,0x57,0x55,0xff,0xff,0x77,0x77,0xff,0xff,0x63,0x63,0xeb,0xff,0x77,0x63,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x7f,0xff,0xff,0x7f,0x7f,0xff,0xff,0x7f,0x7f,0xff,0xff,0x7f,0x7f,0xff,0xff,0x51,0x51,0xff,0xff,0x7f,0x7f,0xff,0xff,0x7f,0x7f,0xff,0xff,0x7f,0x7f,0xff,0xff,0x7f,0x7f,0xff,0xff,0xff,0xff,
|
||||
111,8,
|
||||
0xff,0xff,0x00,0x00,0xff,0xff,0x1c,0x1c,0x6b,0xff,0xb6,0x22,0xbf,0xff,0xc0,0x80,0xff,0xff,0xe8,0xe8,0xbf,0xff,0xc0,0x80,0x6b,0xff,0xb6,0x22,0xff,0xff,0x1c,0x1c,0xff,0xff,0x00,0x00,0xff,0xff,0x38,0x38,0xbb,0xff,0x7c,0x38,0x7d,0xff,0xfe,0x7c,0xff,0xff,0xfe,0xfe,0xff,0xff,0x00,0x00,0xff,0xff,0x50,0x50,0xff,0xff,0x20,0x20,0xff,0xff,0x50,0x50,0xff,0xff,0x38,0x38,0xbb,0xff,0x7c,0x38,0x7d,0xff,0xfe,0x7c,0xff,0xff,0xfe,0xfe,0xff,0xff,0x00,0x00,0xff,0xff,0x40,0x40,0xff,0xff,0x40,0x40,0xff,0xff,0x40,0x40,0xff,0xff,0x38,0x38,0xbb,0xff,0x7c,0x38,0x7d,0xff,0xfe,0x7c,0xff,0xff,0xfe,0xfe,0xff,0xff,0x00,0x00,0xff,0xff,0x50,0x50,0xff,0xff,0x50,0x50,0xff,0xff,0x50,0x50,0xff,0xff,0x38,0x38,0xbb,0xff,0x7c,0x38,0x7d,0xff,0xfe,0x7c,0xff,0xff,0xfe,0xfe,0xff,0xff,0x00,0x00,0xff,0xff,0x54,0x54,0xff,0xff,0x54,0x54,0xff,0xff,0x54,0x54,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x7f,0xff,0xc1,0x41,0x41,0xff,0xfd,0x7d,0x7d,0xff,0xfd,0x7d,0x7d,0xff,0xfd,0x7d,0x7d,0xff,0xfd,0x7d,0x7d,0xfd,0xfb,0x7b,0x79,0xfb,0xc7,0x47,0x43,0xff,0xff,0x7f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x7f,0xff,0xff,0x7f,0x7f,0xe3,0xff,0x77,0x63,0xdd,0xff,0x63,0x41,0xdd,0xff,0x41,0x41,0xdd,0xff,0x63,0x41,0xe3,0xff,0x77,0x63,0xff,0xff,0x7f,0x7f,0xff,0xff,0x7f,0x7f,0xff,0xff,0xff,0xff,0xfd,0xff,0x43,0x41,0xff,0xff,0x7d,0x7d,0xff,0xff,0x73,0x73,0xff,0xff,0x7d,0x7d,0xdd,0xff,0x63,0x41,0xff,0xff,0x5f,0x5f,0xff,0xff,0x59,0x59,0xdd,0xff,0x63,0x41,0xff,0xff,0x79,0x79,0xff,0xff,0xff,0xff,0xff,0xff,0x79,0x79,0xdd,0xff,0x63,0x41,0xff,0xff,0x59,0x59,0xff,0xff,0x5f,0x5f,0xf5,0xff,0x5b,0x51,0xff,0xff,0x55,0x55,0xff,0xff,0x55,0x55,0xff,0xff,0x55,0x55,0xd7,0xff,0x6d,0x45,0xff,0xff,0xff,0xff,0xff,0xff,0x63,0x63,0xff,0xff,0x63,0x63,0xff,0xff,0x77,0x77,0xff,0xff,0x73,0x73,0xff,0xff,0x65,0x65,0xfd,0xff,0x57,0x55,0xff,0xff,0x77,0x77,0xff,0xff,0x63,0x63,0xeb,0xff,0x77,0x63,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x7f,0xff,0xff,0x7f,0x7f,0xff,0xff,0x7f,0x7f,0xff,0xff,0x7f,0x7f,0xff,0xff,0x51,0x51,0xff,0xff,0x7f,0x7f,0xff,0xff,0x7f,0x7f,0xff,0xff,0x7f,0x7f,0xff,0xff,0x7f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0x40,0x40,0xff,0xff,0x20,0x20,0xff,0xff,0x10,0x10,0xff,0xff,0x08,0x08,0xff,0xff,0x10,0x10,0xff,0xff,0x08,0x08,0xff,0xff,0x06,0x06,0xff,0xff,0x18,0x18,0xff,0xff,0xe0,0xe0,
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 502 B |
+8
-2
@@ -36,7 +36,7 @@
|
||||
|
||||
#include "opentx.h"
|
||||
|
||||
const pm_char * bmpLoad(uint8_t *dest, const char *filename, const xcoord_t width, const uint8_t height)
|
||||
const pm_char * bmpLoad(bmp_ptr_t &bmp, const char *filename, const xcoord_t width, const uint8_t height)
|
||||
{
|
||||
FIL bmpFile;
|
||||
UINT read;
|
||||
@@ -147,10 +147,16 @@ const pm_char * bmpLoad(uint8_t *dest, const char *filename, const xcoord_t widt
|
||||
}
|
||||
}
|
||||
|
||||
if (bmp == NULL) {
|
||||
bmp = (uint8_t *)malloc(2+w*((h+7)/8)*4);
|
||||
}
|
||||
|
||||
uint8_t *dest = bmp;
|
||||
|
||||
*dest++ = w;
|
||||
*dest++ = h;
|
||||
|
||||
memset(dest, 0, w*(h/8)*4);
|
||||
memset(dest, 0, w*((h+7)/8)*4);
|
||||
|
||||
uint32_t n;
|
||||
|
||||
|
||||
+3
-2
@@ -87,8 +87,9 @@ void beep(uint8_t val);
|
||||
#define AUDIO_WARNING1() beep(3)
|
||||
#define AUDIO_ERROR() beep(4)
|
||||
#define AUDIO_MIX_WARNING(x) beep(1)
|
||||
#define AUDIO_POT_STICK_MIDDLE() beep(2)
|
||||
#define AUDIO_TIMER_LT10(x) beep(2)
|
||||
#define AUDIO_POT_MIDDLE(x) beep(2)
|
||||
#define AUDIO_TIMER_LT10(m, x) beep(2)
|
||||
#define AUDIO_TIMER_00(m) beep(3)
|
||||
#define AUDIO_VARIO_UP() _beep(1)
|
||||
#define AUDIO_VARIO_DOWN() _beep(1)
|
||||
#define AUDIO_TRIM(event, f) { if (!IS_KEY_FIRST(event)) warble = true; beep(1); }
|
||||
|
||||
@@ -55,6 +55,7 @@ void eeReadAll();
|
||||
bool eeModelExists(uint8_t id);
|
||||
void eeLoadModelName(uint8_t id, char *name);
|
||||
void eeLoadModel(uint8_t id);
|
||||
bool eeConvert();
|
||||
|
||||
#if defined(CPUARM)
|
||||
extern ModelHeader modelHeaders[MAX_MODELS];
|
||||
|
||||
+413
-161
@@ -36,55 +36,100 @@
|
||||
|
||||
#include "opentx.h"
|
||||
|
||||
PACK(typedef struct {
|
||||
uint8_t mode; // 0=end, 1=pos, 2=neg, 3=both
|
||||
uint8_t chn;
|
||||
int8_t swtch;
|
||||
uint16_t phases;
|
||||
int8_t weight;
|
||||
uint8_t curveMode;
|
||||
char name[LEN_EXPOMIX_NAME];
|
||||
uint8_t spare[2];
|
||||
int8_t curveParam;
|
||||
}) ExpoData_v215;
|
||||
|
||||
PACK(typedef struct {
|
||||
int8_t min;
|
||||
int8_t max;
|
||||
int8_t ppmCenter;
|
||||
int16_t offset:14;
|
||||
uint16_t symetrical:1;
|
||||
uint16_t revert:1;
|
||||
#if defined(PCBTARANIS)
|
||||
char name[LEN_CHANNEL_NAME];
|
||||
#endif
|
||||
}) LimitData_v215;
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
PACK(typedef struct {
|
||||
uint8_t destCh;
|
||||
uint16_t phases;
|
||||
uint8_t curveMode:1; // O=curve, 1=differential
|
||||
uint8_t noExpo:1;
|
||||
int8_t carryTrim:3;
|
||||
uint8_t mltpx:2; // multiplex method: 0 means +=, 1 means *=, 2 means :=
|
||||
uint8_t spare:1;
|
||||
int8_t weight;
|
||||
int8_t swtch;
|
||||
int8_t curveParam;
|
||||
uint8_t mixWarn; // mixer warning
|
||||
uint8_t delayUp;
|
||||
uint8_t delayDown;
|
||||
uint8_t speedUp;
|
||||
uint8_t speedDown;
|
||||
uint8_t srcRaw;
|
||||
int8_t sOffset;
|
||||
char name[LEN_EXPOMIX_NAME];
|
||||
}) MixData_v212;
|
||||
uint8_t curveMode:1; // O=curve, 1=differential
|
||||
uint8_t noExpo:1;
|
||||
int8_t carryTrim:3;
|
||||
uint8_t mltpx:2; // multiplex method: 0 means +=, 1 means *=, 2 means :=
|
||||
uint8_t spare1:1;
|
||||
int16_t weight;
|
||||
int8_t swtch;
|
||||
int8_t curveParam;
|
||||
uint8_t mixWarn:4; // mixer warning
|
||||
uint8_t srcVariant:4;
|
||||
uint8_t delayUp;
|
||||
uint8_t delayDown;
|
||||
uint8_t speedUp;
|
||||
uint8_t speedDown;
|
||||
uint8_t srcRaw;
|
||||
int16_t offset;
|
||||
char name[LEN_EXPOMIX_NAME];
|
||||
uint8_t spare2[2];
|
||||
}) MixData_v215;
|
||||
#else
|
||||
PACK(typedef struct {
|
||||
uint8_t destCh;
|
||||
uint16_t phases;
|
||||
uint8_t curveMode:1; // O=curve, 1=differential
|
||||
uint8_t noExpo:1;
|
||||
int8_t carryTrim:3;
|
||||
uint8_t mltpx:2; // multiplex method: 0 means +=, 1 means *=, 2 means :=
|
||||
uint8_t spare:1;
|
||||
int16_t weight;
|
||||
int8_t swtch;
|
||||
int8_t curveParam;
|
||||
uint8_t mixWarn:4; // mixer warning
|
||||
uint8_t srcVariant:4;
|
||||
uint8_t delayUp;
|
||||
uint8_t delayDown;
|
||||
uint8_t speedUp;
|
||||
uint8_t speedDown;
|
||||
uint8_t srcRaw;
|
||||
int16_t offset;
|
||||
char name[LEN_EXPOMIX_NAME];
|
||||
}) MixData_v215;
|
||||
#endif
|
||||
|
||||
PACK(typedef struct {
|
||||
int8_t mode; // timer trigger source -> off, abs, stk, stk%, sw/!sw, !m_sw/!m_sw
|
||||
uint16_t val;
|
||||
}) TimerData_v212;
|
||||
uint16_t start:12;
|
||||
uint16_t countdownBeep:1;
|
||||
uint16_t minuteBeep:1;
|
||||
uint16_t persistent:1;
|
||||
uint16_t spare:1;
|
||||
uint16_t value;
|
||||
}) TimerData_v215;
|
||||
|
||||
PACK(typedef struct {
|
||||
uint16_t persistent:1;
|
||||
uint16_t value:15;
|
||||
}) TimerDataExtra_v212;
|
||||
TRIMS_ARRAY;
|
||||
int8_t swtch; // swtch of phase[0] is not used
|
||||
char name[LEN_FP_NAME];
|
||||
uint8_t fadeIn;
|
||||
uint8_t fadeOut;
|
||||
ROTARY_ENCODER_ARRAY;
|
||||
gvar_t gvars[5];
|
||||
}) PhaseData_v215;
|
||||
|
||||
PACK(typedef struct {
|
||||
FrSkyChannelData channels[2];
|
||||
FrSkyRSSIAlarm rssiAlarms[2];
|
||||
uint8_t usrProto; // Protocol in FrSky user data, 0=None, 1=FrSky hub, 2=WS HowHigh
|
||||
uint8_t voltsSource;
|
||||
uint8_t blades; // How many blades for RPMs, 0=2 blades, 1=3 blades
|
||||
uint8_t currentSource;
|
||||
FrSkyBarData bars[4];
|
||||
uint8_t lines[4*2*2];
|
||||
uint8_t varioSource;
|
||||
uint8_t varioCenterMin;
|
||||
uint8_t varioCenterMax;
|
||||
uint8_t spare[4];
|
||||
}) FrSkyData_v212;
|
||||
|
||||
PACK(typedef struct {
|
||||
char name[LEN_MODEL_NAME]; // must be first for eeLoadModelName
|
||||
TimerData_v212 timers[MAX_TIMERS];
|
||||
ModelHeader header;
|
||||
TimerData_v215 timers[MAX_TIMERS];
|
||||
uint8_t protocol:3;
|
||||
uint8_t thrTrim:1; // Enable Throttle Trim
|
||||
int8_t ppmNCH:4;
|
||||
@@ -93,157 +138,364 @@ PACK(typedef struct {
|
||||
uint8_t pulsePol:1;
|
||||
uint8_t extendedLimits:1;
|
||||
uint8_t extendedTrims:1;
|
||||
uint8_t spare1:1;
|
||||
uint8_t throttleReversed:1;
|
||||
int8_t ppmDelay;
|
||||
BeepANACenter beepANACenter; // 1<<0->A1.. 1<<6->A7
|
||||
MixData_v212 mixData[MAX_MIXERS];
|
||||
LimitData limitData[NUM_CHNOUT];
|
||||
ExpoData expoData[MAX_EXPOS];
|
||||
BeepANACenter beepANACenter; // 1<<0->A1.. 1<<6->A7
|
||||
MixData_v215 mixData[MAX_MIXERS];
|
||||
LimitData_v215 limitData[NUM_CHNOUT];
|
||||
ExpoData_v215 expoData[32];
|
||||
|
||||
CURVTYPE curves[MAX_CURVES];
|
||||
int16_t curves[16];
|
||||
int8_t points[NUM_POINTS];
|
||||
|
||||
CustomSwData customSw[NUM_CSW];
|
||||
CustomFnData funcSw[NUM_CFN];
|
||||
CustomFnData funcSw[NUM_CFN];
|
||||
SwashRingData swashR;
|
||||
PhaseData phaseData[MAX_PHASES];
|
||||
PhaseData_v215 phaseData[MAX_PHASES];
|
||||
|
||||
int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5ms increments
|
||||
uint8_t thrTraceSrc;
|
||||
uint8_t modelId;
|
||||
|
||||
uint8_t switchWarningStates;
|
||||
swstate_t switchWarningStates;
|
||||
|
||||
FrSkyData_v212 frsky;
|
||||
char gvar_names[5][LEN_GVAR_NAME];
|
||||
|
||||
TimerDataExtra_v212 timersXtra[MAX_TIMERS];
|
||||
TELEMETRY_DATA
|
||||
|
||||
}) ModelData_v212;
|
||||
ROTARY_ENCODER_ARRAY_EXTRA
|
||||
|
||||
MODELDATA_EXTRA
|
||||
|
||||
}) ModelData_v215;
|
||||
|
||||
void ConvertGeneralSettings_215_to_216(EEGeneral &settings)
|
||||
{
|
||||
settings.version = 216;
|
||||
}
|
||||
|
||||
void ConvertModel_215_to_216(ModelData &model)
|
||||
{
|
||||
// Virtual inputs added instead of Expo/DR
|
||||
// LUA scripts added
|
||||
// GVARS: now 9 GVARS, popup param added
|
||||
// Curves: structure changed, 32 curves
|
||||
// Limits: min and max with PREC1
|
||||
// Custom Functions: play repeat * 5
|
||||
// Custom Switches: better precision for x when A comes from telemetry
|
||||
// Main View: altitude in top bar
|
||||
// Mixes: GVARS in weight moved from 512 to 4096 and -512 to -4096, because GVARS may be used in limits [-1250:1250]
|
||||
|
||||
TRACE("Model conversion from v215 to v216");
|
||||
|
||||
assert(sizeof(ModelData_v215) <= sizeof(ModelData));
|
||||
|
||||
ModelData_v215 oldModel;
|
||||
memcpy(&oldModel, &model, sizeof(oldModel));
|
||||
memset(&model, 0, sizeof(ModelData));
|
||||
|
||||
memcpy(&g_model.header, &oldModel.header, sizeof(g_model.header));
|
||||
for (uint8_t i=0; i<2; i++) {
|
||||
g_model.timers[i].mode = oldModel.timers[i].mode;
|
||||
g_model.timers[i].start = oldModel.timers[i].start;
|
||||
g_model.timers[i].minuteBeep = oldModel.timers[i].minuteBeep;
|
||||
g_model.timers[i].persistent = oldModel.timers[i].persistent;
|
||||
g_model.timers[i].countdownBeep = oldModel.timers[i].countdownBeep;
|
||||
g_model.timers[i].value = oldModel.timers[i].value;
|
||||
}
|
||||
g_model.protocol = oldModel.protocol;
|
||||
g_model.thrTrim = oldModel.thrTrim;
|
||||
g_model.trimInc = oldModel.trimInc;
|
||||
g_model.disableThrottleWarning = oldModel.disableThrottleWarning;
|
||||
g_model.extendedLimits = oldModel.extendedLimits;
|
||||
g_model.extendedTrims = oldModel.extendedTrims;
|
||||
g_model.throttleReversed = oldModel.throttleReversed;
|
||||
g_model.beepANACenter = oldModel.beepANACenter;
|
||||
|
||||
for (uint8_t i=0; i<64; i++) {
|
||||
#if defined(PCBTARANIS)
|
||||
g_model.mixData[i].destCh = oldModel.mixData[i].destCh;
|
||||
g_model.mixData[i].phases = oldModel.mixData[i].phases;
|
||||
g_model.mixData[i].mltpx = oldModel.mixData[i].mltpx;
|
||||
g_model.mixData[i].weight = oldModel.mixData[i].weight;
|
||||
g_model.mixData[i].swtch = oldModel.mixData[i].swtch;
|
||||
if (oldModel.mixData[i].curveMode==0/*differential*/) {
|
||||
g_model.mixData[i].curve.type = CURVE_REF_DIFF;
|
||||
g_model.mixData[i].curve.value = oldModel.mixData[i].curveParam;
|
||||
}
|
||||
else if (oldModel.mixData[i].curveParam <= 6) {
|
||||
g_model.mixData[i].curve.type = CURVE_REF_FUNC;
|
||||
g_model.mixData[i].curve.value = oldModel.mixData[i].curveParam;
|
||||
}
|
||||
else {
|
||||
g_model.mixData[i].curve.type = CURVE_REF_CUSTOM;
|
||||
g_model.mixData[i].curve.value = oldModel.mixData[i].curveParam - 6;
|
||||
}
|
||||
g_model.mixData[i].mixWarn = oldModel.mixData[i].mixWarn;
|
||||
g_model.mixData[i].delayUp = oldModel.mixData[i].delayUp;
|
||||
g_model.mixData[i].delayDown = oldModel.mixData[i].delayDown;
|
||||
g_model.mixData[i].speedUp = oldModel.mixData[i].speedUp;
|
||||
g_model.mixData[i].speedDown = oldModel.mixData[i].speedDown;
|
||||
g_model.mixData[i].srcRaw = oldModel.mixData[i].srcRaw;
|
||||
if (g_model.mixData[i].srcRaw > 4 || oldModel.mixData[i].noExpo)
|
||||
g_model.mixData[i].srcRaw += MAX_INPUTS + MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS;
|
||||
g_model.mixData[i].offset = oldModel.mixData[i].offset;
|
||||
memcpy(g_model.mixData[i].name, oldModel.mixData[i].name, LEN_EXPOMIX_NAME);
|
||||
#else
|
||||
memcpy(&g_model.mixData[i], &oldModel.mixData[i], sizeof(g_model.mixData[i]));
|
||||
#endif
|
||||
if (g_model.mixData[i].weight <= -508)
|
||||
g_model.mixData[i].weight = g_model.mixData[i].weight + 512 - 4096;
|
||||
else if (g_model.mixData[i].weight >= 507)
|
||||
g_model.mixData[i].weight = g_model.mixData[i].weight - 512 + 4096;
|
||||
else
|
||||
g_model.mixData[i].offset = g_model.mixData[i].offset * g_model.mixData[i].weight / 100;
|
||||
}
|
||||
for (uint8_t i=0; i<32; i++) {
|
||||
g_model.limitData[i].min = 10 * oldModel.limitData[i].min;
|
||||
g_model.limitData[i].max = 10 * oldModel.limitData[i].max;
|
||||
g_model.limitData[i].ppmCenter = oldModel.limitData[i].ppmCenter;
|
||||
g_model.limitData[i].offset = oldModel.limitData[i].offset;
|
||||
g_model.limitData[i].symetrical = oldModel.limitData[i].symetrical;
|
||||
g_model.limitData[i].revert = oldModel.limitData[i].revert;
|
||||
#if defined(PCBTARANIS)
|
||||
memcpy(&g_model.limitData[i].name, &oldModel.limitData[i].name, LEN_CHANNEL_NAME);
|
||||
#endif
|
||||
}
|
||||
int indexes[NUM_STICKS] = { 0, 0, 0, 0 };
|
||||
for (uint8_t i=0; i<32; i++) {
|
||||
if (oldModel.expoData[i].mode) {
|
||||
#if defined(PCBTARANIS)
|
||||
uint8_t chn = oldModel.expoData[i].chn;
|
||||
if (!oldModel.expoData[i].swtch && !oldModel.expoData[i].phases) {
|
||||
indexes[chn] = -1;
|
||||
}
|
||||
else if (indexes[chn] != -1) {
|
||||
indexes[chn] = i+1;
|
||||
}
|
||||
for (uint8_t j=chn+1; j<NUM_STICKS; j++) {
|
||||
indexes[j] = i+1;
|
||||
}
|
||||
g_model.expoData[i].srcRaw = MIXSRC_Rud+chn;
|
||||
g_model.expoData[i].chn = chn;
|
||||
g_model.expoData[i].swtch = oldModel.expoData[i].swtch;
|
||||
g_model.expoData[i].phases = oldModel.expoData[i].phases;
|
||||
g_model.expoData[i].weight = oldModel.expoData[i].weight;
|
||||
memcpy(&g_model.expoData[i].name, &oldModel.expoData[i].name, LEN_EXPOMIX_NAME);
|
||||
if (oldModel.expoData[i].curveMode==0/*expo*/) {
|
||||
g_model.expoData[i].curve.type = CURVE_REF_EXPO;
|
||||
g_model.expoData[i].curve.value = oldModel.expoData[i].curveParam;
|
||||
}
|
||||
else if (oldModel.expoData[i].curveParam <= 6) {
|
||||
g_model.expoData[i].curve.type = CURVE_REF_FUNC;
|
||||
g_model.expoData[i].curve.value = oldModel.expoData[i].curveParam;
|
||||
}
|
||||
else {
|
||||
g_model.expoData[i].curve.type = CURVE_REF_CUSTOM;
|
||||
g_model.expoData[i].curve.value = oldModel.expoData[i].curveParam - 7;
|
||||
}
|
||||
#else
|
||||
memcpy(&g_model.expoData[i], &oldModel.expoData[i], sizeof(g_model.expoData[i]));
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
#if defined(PCBTARANIS)
|
||||
for (int i=NUM_STICKS-1; i>=0; i--) {
|
||||
int idx = indexes[i];
|
||||
if (idx >= 0) {
|
||||
ExpoData *expo = expoAddress(idx);
|
||||
memmove(expo+1, expo, (MAX_EXPOS-(idx+1))*sizeof(ExpoData));
|
||||
memclear(expo, sizeof(ExpoData));
|
||||
expo->srcRaw = MIXSRC_Rud + i;
|
||||
expo->chn = i;
|
||||
expo->weight = 100;
|
||||
expo->curve.type = CURVE_REF_EXPO;
|
||||
}
|
||||
for (int c=0; c<4; c++) {
|
||||
g_model.inputNames[i][c] = char2idx(STR_VSRCRAW[1+STR_VSRCRAW[0]*(i+1)+c]);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
for (uint8_t i=0; i<16; i++) {
|
||||
#if defined(PCBTARANIS)
|
||||
int8_t *cur = &oldModel.points[i==0 ? 0 : 5*i+oldModel.curves[i-1]];
|
||||
int8_t *nxt = &oldModel.points[5+5*i+oldModel.curves[i]];
|
||||
uint8_t size = nxt - cur;
|
||||
if ((size & 1) == 0) {
|
||||
g_model.curves[i].type = CURVE_TYPE_CUSTOM;
|
||||
g_model.curves[i].points = (size / 2) - 4;
|
||||
}
|
||||
else {
|
||||
g_model.curves[i].points = size-5;
|
||||
}
|
||||
#else
|
||||
g_model.curves[i] = oldModel.curves[i];
|
||||
#endif
|
||||
}
|
||||
for (uint16_t i=0; i<512; i++) {
|
||||
g_model.points[i] = oldModel.points[i];
|
||||
}
|
||||
for (uint8_t i=0; i<32; i++) {
|
||||
g_model.customSw[i] = oldModel.customSw[i];
|
||||
#if defined(PCBTARANIS)
|
||||
CustomSwData * cs = &g_model.customSw[i];
|
||||
uint8_t cstate = cswFamily(cs->func);
|
||||
if (cstate == CS_VOFS || cstate == CS_VCOMP || cstate == CS_VDIFF) {
|
||||
if (cs->v1 > 0) cs->v1 += MAX_INPUTS + MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS;
|
||||
if (cs->v1 > MIXSRC_GVAR1+4) cs->v1 += 4;
|
||||
}
|
||||
if (cstate == CS_VOFS || cstate == CS_VDIFF) {
|
||||
if (cs->v1 >= MIXSRC_FIRST_TELEM) {
|
||||
switch (cs->v1) {
|
||||
case MIXSRC_FIRST_TELEM + TELEM_TM1-1:
|
||||
case MIXSRC_FIRST_TELEM + TELEM_TM2-1:
|
||||
cs->v2 = (cs->v2+128) * 3;
|
||||
break;
|
||||
case MIXSRC_FIRST_TELEM + TELEM_ALT-1:
|
||||
case MIXSRC_FIRST_TELEM + TELEM_GPSALT-1:
|
||||
case MIXSRC_FIRST_TELEM + TELEM_MIN_ALT-1:
|
||||
case MIXSRC_FIRST_TELEM + TELEM_MAX_ALT-1:
|
||||
cs->v2 = (cs->v2+128) * 8 - 500;
|
||||
break;
|
||||
case MIXSRC_FIRST_TELEM + TELEM_RPM-1:
|
||||
case MIXSRC_FIRST_TELEM + TELEM_MAX_RPM-1:
|
||||
cs->v2 = (cs->v2+128) * 50;
|
||||
break;
|
||||
case MIXSRC_FIRST_TELEM + TELEM_T1-1:
|
||||
case MIXSRC_FIRST_TELEM + TELEM_T2-1:
|
||||
case MIXSRC_FIRST_TELEM + TELEM_MAX_T1-1:
|
||||
case MIXSRC_FIRST_TELEM + TELEM_MAX_T2-1:
|
||||
cs->v2 = (cs->v2+128) + 30;
|
||||
break;
|
||||
case MIXSRC_FIRST_TELEM + TELEM_CELL-1:
|
||||
case MIXSRC_FIRST_TELEM + TELEM_HDG-1:
|
||||
cs->v2 = (cs->v2+128) * 2;
|
||||
break;
|
||||
case MIXSRC_FIRST_TELEM + TELEM_DIST-1:
|
||||
case MIXSRC_FIRST_TELEM + TELEM_MAX_DIST-1:
|
||||
cs->v2 = (cs->v2+128) * 8;
|
||||
break;
|
||||
case MIXSRC_FIRST_TELEM + TELEM_CURRENT-1:
|
||||
case MIXSRC_FIRST_TELEM + TELEM_POWER-1:
|
||||
cs->v2 = (cs->v2+128) * 5;
|
||||
break;
|
||||
case MIXSRC_FIRST_TELEM + TELEM_CONSUMPTION-1:
|
||||
cs->v2 = (cs->v2+128) * 20;
|
||||
break;
|
||||
default:
|
||||
cs->v2 += 128;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (cstate == CS_VCOMP) {
|
||||
if (cs->v2 > 0) cs->v2 += MAX_INPUTS + MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS;
|
||||
if (cs->v2 > MIXSRC_GVAR1+4) cs->v2 += 4;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
for (uint8_t i=0; i<32; i++) {
|
||||
g_model.funcSw[i] = oldModel.funcSw[i];
|
||||
CustomFnData *sd = &g_model.funcSw[i];
|
||||
if (CFN_FUNC(sd) == FUNC_PLAY_VALUE || CFN_FUNC(sd) == FUNC_VOLUME || (CFN_FUNC(sd) >= FUNC_ADJUST_GV1 && CFN_FUNC(sd) <= FUNC_ADJUST_GVLAST && CFN_GVAR_MODE(sd) == FUNC_ADJUST_GVAR_SOURCE)) {
|
||||
#if defined(PCBTARANIS)
|
||||
CFN_PARAM(sd) += 1 + MAX_INPUTS + MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS;
|
||||
#endif
|
||||
if (CFN_PARAM(sd) > MIXSRC_GVAR1+4) CFN_PARAM(sd) += 4;
|
||||
}
|
||||
if (HAS_REPEAT_PARAM(sd))
|
||||
CFN_PLAY_REPEAT(sd) *= 5;
|
||||
}
|
||||
|
||||
g_model.swashR = oldModel.swashR;
|
||||
#if defined(PCBTARANIS)
|
||||
if (g_model.swashR.collectiveSource > 0) g_model.swashR.collectiveSource += MAX_INPUTS + MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS;
|
||||
if (g_model.swashR.collectiveSource > MIXSRC_GVAR1+4) g_model.swashR.collectiveSource += 4;
|
||||
#endif
|
||||
|
||||
for (uint8_t i=0; i<9; i++) {
|
||||
memcpy(&g_model.phaseData[i], &oldModel.phaseData[i], sizeof(oldModel.phaseData[i])); // the last 4 gvars will remain blank
|
||||
}
|
||||
g_model.thrTraceSrc = oldModel.thrTraceSrc;
|
||||
g_model.switchWarningStates = oldModel.switchWarningStates;
|
||||
for (uint8_t i=0; i<5; i++) {
|
||||
memcpy(g_model.gvars[i].name, oldModel.gvar_names[i], LEN_GVAR_NAME);
|
||||
}
|
||||
g_model.frsky = oldModel.frsky;
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
g_model.externalModule = oldModel.externalModule;
|
||||
g_model.trainerMode = oldModel.trainerMode;
|
||||
memcpy(g_model.curveNames, oldModel.curveNames, sizeof(g_model.curveNames));
|
||||
#endif
|
||||
|
||||
memcpy(g_model.moduleData, oldModel.moduleData, sizeof(g_model.moduleData));
|
||||
}
|
||||
|
||||
bool eeConvert()
|
||||
{
|
||||
return false;
|
||||
const char *msg = NULL;
|
||||
|
||||
if (g_eeGeneral.version == 212) {
|
||||
g_eeGeneral.optrexDisplay = 0;
|
||||
g_eeGeneral.backlightBright = 0;
|
||||
g_eeGeneral.contrast = 25;
|
||||
ALERT(STR_EEPROMWARN, PSTR("EEprom Data v212"), AU_BAD_EEPROM);
|
||||
if (g_eeGeneral.version == 215) {
|
||||
msg = PSTR("EEprom Data v215");
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
|
||||
int conversionVersionStart = g_eeGeneral.version;
|
||||
|
||||
// Information to the user and wait for key press
|
||||
g_eeGeneral.optrexDisplay = 0;
|
||||
g_eeGeneral.backlightMode = e_backlight_mode_on;
|
||||
g_eeGeneral.backlightBright = 0;
|
||||
g_eeGeneral.contrast = 25;
|
||||
ALERT(STR_EEPROMWARN, msg, AU_BAD_EEPROM);
|
||||
|
||||
// Message
|
||||
MESSAGE(STR_EEPROMWARN, PSTR("EEPROM Converting"), NULL, AU_EEPROM_FORMATTING); // TODO translations
|
||||
|
||||
if (g_eeGeneral.version == 212) {
|
||||
memmove(((uint8_t*)&g_eeGeneral)+3, ((uint8_t*)&g_eeGeneral)+1, 81);
|
||||
g_eeGeneral.variant = 0;
|
||||
g_eeGeneral.version = 213;
|
||||
// General Settings conversion
|
||||
#if defined(PCBTARANIS)
|
||||
theFile.openRlc(0);
|
||||
theFile.readRlc((uint8_t*)&g_eeGeneral, sizeof(g_eeGeneral));
|
||||
#else
|
||||
#warning "TODO openRlc for sky9x"
|
||||
#endif
|
||||
if (g_eeGeneral.version == 215) ConvertGeneralSettings_215_to_216(g_eeGeneral);
|
||||
s_eeDirtyMsk = EE_GENERAL;
|
||||
eeCheck(true);
|
||||
|
||||
Eeprom32_source_address = (uint8_t *)&g_eeGeneral ; // Get data from here
|
||||
Eeprom32_data_size = sizeof(g_eeGeneral) ; // This much
|
||||
Eeprom32_file_index = 0 ; // This file system entry
|
||||
Eeprom32_process_state = E32_BLANKCHECK ;
|
||||
eeWaitFinished();
|
||||
lcd_rect(60, 6*FH+4, 132, 3);
|
||||
|
||||
for (uint8_t id=0; id<MAX_MODELS; id++) {
|
||||
uint16_t size = File_system[id+1].size;
|
||||
if (size >= 256) {
|
||||
ModelData_v212 oldModel;
|
||||
memset(&oldModel, 0, sizeof(oldModel));
|
||||
if (size > sizeof(oldModel)) {
|
||||
size = sizeof(oldModel) ;
|
||||
}
|
||||
read32_eeprom_data((File_system[id+1].block_no << 12) + sizeof(struct t_eeprom_header), (uint8_t *)&oldModel, size);
|
||||
|
||||
memcpy(g_model.header.name, oldModel.name, 10);
|
||||
for (uint8_t i=0; i<2; i++) {
|
||||
g_model.timers[i].mode = oldModel.timers[i].mode;
|
||||
g_model.timers[i].start = oldModel.timers[i].val;
|
||||
g_model.timers[i].persistent = oldModel.timersXtra[i].persistent;
|
||||
g_model.timers[i].value = oldModel.timersXtra[i].value;
|
||||
}
|
||||
g_model.protocol = oldModel.protocol;
|
||||
g_model.thrTrim = oldModel.thrTrim;
|
||||
g_model.moduleData[0].channelsCount = oldModel.ppmNCH*2;
|
||||
g_model.trimInc = oldModel.trimInc;
|
||||
g_model.disableThrottleWarning = oldModel.disableThrottleWarning;
|
||||
g_model.moduleData[0].ppmPulsePol = oldModel.pulsePol;
|
||||
g_model.extendedLimits = oldModel.extendedLimits;
|
||||
g_model.extendedTrims = oldModel.extendedTrims;
|
||||
g_model.moduleData[0].ppmDelay = oldModel.ppmDelay;
|
||||
g_model.beepANACenter = oldModel.beepANACenter;
|
||||
for (uint8_t i=0; i<64; i++) {
|
||||
g_model.mixData[i].destCh = oldModel.mixData[i].destCh;
|
||||
g_model.mixData[i].phases = oldModel.mixData[i].phases;
|
||||
g_model.mixData[i].curveMode = oldModel.mixData[i].curveMode;
|
||||
g_model.mixData[i].noExpo = oldModel.mixData[i].noExpo;
|
||||
g_model.mixData[i].carryTrim = oldModel.mixData[i].carryTrim;
|
||||
g_model.mixData[i].mltpx = oldModel.mixData[i].mltpx;
|
||||
g_model.mixData[i].weight = oldModel.mixData[i].weight;
|
||||
g_model.mixData[i].swtch = oldModel.mixData[i].swtch;
|
||||
g_model.mixData[i].curveParam = oldModel.mixData[i].curveParam;
|
||||
g_model.mixData[i].mixWarn = oldModel.mixData[i].mixWarn;
|
||||
g_model.mixData[i].delayUp = oldModel.mixData[i].delayUp;
|
||||
g_model.mixData[i].delayDown = oldModel.mixData[i].delayDown;
|
||||
g_model.mixData[i].speedUp = oldModel.mixData[i].speedUp;
|
||||
g_model.mixData[i].speedDown = oldModel.mixData[i].speedDown;
|
||||
g_model.mixData[i].srcRaw = oldModel.mixData[i].srcRaw;
|
||||
g_model.mixData[i].offset = oldModel.mixData[i].sOffset;
|
||||
memcpy(g_model.mixData[i].name, oldModel.mixData[i].name, 6);
|
||||
}
|
||||
for (uint8_t i=0; i<32; i++) {
|
||||
g_model.limitData[i] = oldModel.limitData[i];
|
||||
}
|
||||
for (uint8_t i=0; i<32; i++) {
|
||||
g_model.expoData[i] = oldModel.expoData[i];
|
||||
}
|
||||
for (uint8_t i=0; i<16; i++) {
|
||||
g_model.curves[i] = oldModel.curves[i];
|
||||
}
|
||||
for (uint16_t i=0; i<512; i++) {
|
||||
g_model.points[i] = oldModel.points[i];
|
||||
}
|
||||
for (uint8_t i=0; i<32; i++) {
|
||||
g_model.customSw[i] = oldModel.customSw[i];
|
||||
}
|
||||
for (uint8_t i=0; i<32; i++) {
|
||||
g_model.funcSw[i] = oldModel.funcSw[i];
|
||||
}
|
||||
g_model.swashR = oldModel.swashR;
|
||||
for (uint8_t i=0; i<9; i++) {
|
||||
g_model.phaseData[i].swtch = oldModel.phaseData[i].swtch;
|
||||
g_model.phaseData[i].fadeIn = oldModel.phaseData[i].fadeIn;
|
||||
g_model.phaseData[i].fadeOut = oldModel.phaseData[i].fadeOut;
|
||||
memcpy(g_model.phaseData[i].name, oldModel.phaseData[i].name, 6);
|
||||
memcpy(g_model.phaseData[i].trim, oldModel.phaseData[i].trim, 4*sizeof(int16_t));
|
||||
memcpy(g_model.phaseData[i].rotaryEncoders, oldModel.phaseData[i].rotaryEncoders, 1*sizeof(int16_t));
|
||||
}
|
||||
g_model.moduleData[0].ppmFrameLength = oldModel.ppmFrameLength;
|
||||
g_model.thrTraceSrc = oldModel.thrTraceSrc;
|
||||
g_model.header.modelId = oldModel.modelId;
|
||||
g_model.switchWarningStates = oldModel.switchWarningStates;
|
||||
g_model.frsky.usrProto = oldModel.frsky.usrProto;
|
||||
g_model.frsky.voltsSource = oldModel.frsky.voltsSource;
|
||||
g_model.frsky.blades = oldModel.frsky.blades;
|
||||
g_model.frsky.currentSource = oldModel.frsky.currentSource;
|
||||
g_model.frsky.varioSource = oldModel.frsky.varioSource;
|
||||
g_model.frsky.varioCenterMax = oldModel.frsky.varioCenterMax;
|
||||
g_model.frsky.varioCenterMin = oldModel.frsky.varioCenterMin;
|
||||
for (uint8_t i=0; i<2; i++) {
|
||||
g_model.frsky.channels[i] = oldModel.frsky.channels[i];
|
||||
g_model.frsky.rssiAlarms[i] = oldModel.frsky.rssiAlarms[i];
|
||||
}
|
||||
|
||||
Eeprom32_source_address = (uint8_t *)&g_model ; // Get data from here
|
||||
Eeprom32_data_size = sizeof(g_model) ; // This much
|
||||
Eeprom32_file_index = g_eeGeneral.currModel + 1 ; // This file system entry
|
||||
Eeprom32_process_state = E32_BLANKCHECK ;
|
||||
eeWaitFinished();
|
||||
// Models conversion
|
||||
uint8_t currModel = g_eeGeneral.currModel;
|
||||
for (uint8_t id=0; id<MAX_MODELS; id++) {
|
||||
lcd_hline(61, 6*FH+5, 10+id*2, FORCE);
|
||||
// lcd_putsnAtt(61, 7*FH)
|
||||
lcdRefresh();
|
||||
if (eeModelExists(id)) {
|
||||
// TODO loadModel without anything else
|
||||
#if defined(PCBTARANIS)
|
||||
theFile.openRlc(FILE_MODEL(id));
|
||||
theFile.readRlc((uint8_t*)&g_model, sizeof(g_model));
|
||||
#else
|
||||
#warning "TODO openRlc for sky9x"
|
||||
#endif
|
||||
int version = conversionVersionStart;
|
||||
if (version == 215) {
|
||||
version = 216;
|
||||
ConvertModel_215_to_216(g_model);
|
||||
}
|
||||
g_eeGeneral.currModel = id;
|
||||
s_eeDirtyMsk = EE_MODEL;
|
||||
eeCheck(true);
|
||||
}
|
||||
|
||||
}
|
||||
g_eeGeneral.currModel = currModel;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
+4
-6
@@ -332,7 +332,7 @@ bool eeLoadGeneral()
|
||||
}
|
||||
|
||||
if (g_eeGeneral.version != EEPROM_VER) {
|
||||
TRACE_DEBUG("EEPROM version %d (%d) instead of %d (%d)\n", g_eeGeneral.version, g_eeGeneral.variant, EEPROM_VER, EEPROM_VARIANT);
|
||||
TRACE("EEPROM version %d instead of %d", g_eeGeneral.version, EEPROM_VER);
|
||||
if (!eeConvert())
|
||||
return false;
|
||||
}
|
||||
@@ -387,6 +387,9 @@ void eeLoadModel(uint8_t id)
|
||||
activeFnSwitches = 0;
|
||||
activeFunctions = 0;
|
||||
memclear(lastFunctionTime, sizeof(lastFunctionTime));
|
||||
#if defined(CPUARM)
|
||||
evalFunctionsFirstTime = true;
|
||||
#endif
|
||||
|
||||
for (uint8_t i=0; i<MAX_TIMERS; i++) {
|
||||
if (g_model.timers[i].persistent) {
|
||||
@@ -459,11 +462,6 @@ void eeReadAll()
|
||||
|
||||
ALERT(STR_EEPROMWARN, STR_BADEEPROMDATA, AU_BAD_EEPROM);
|
||||
|
||||
if (pwrCheck() == e_power_off) {
|
||||
// the radio has been powered off during the ALERT
|
||||
pwrOff(); // turn power off now
|
||||
}
|
||||
|
||||
MESSAGE(STR_EEPROMWARN, STR_EEPROMFORMATTING, NULL, AU_EEPROM_FORMATTING);
|
||||
|
||||
/* we remove all models */
|
||||
|
||||
@@ -58,7 +58,6 @@ extern uint32_t Eeprom32_data_size ;
|
||||
extern void end_spi(); // TODO not public
|
||||
extern void ee32_process( void ) ;
|
||||
extern bool eeLoadGeneral( void ) ;
|
||||
extern bool eeConvert();
|
||||
extern void eeWaitFinished();
|
||||
|
||||
extern void eeDeleteModel( uint8_t id ) ;
|
||||
|
||||
+16
-11
@@ -881,12 +881,17 @@ bool eeLoadGeneral()
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef SIMU
|
||||
printf("EEPROM version %d (%d) instead of %d (%d)\n", g_eeGeneral.version, g_eeGeneral.variant, EEPROM_VER, EEPROM_VARIANT);
|
||||
fflush(stdout);
|
||||
#endif
|
||||
|
||||
#if defined(CPUARM)
|
||||
if (g_eeGeneral.version != EEPROM_VER) {
|
||||
TRACE("EEPROM version %d instead of %d", g_eeGeneral.version, EEPROM_VER);
|
||||
if (!eeConvert())
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
#else
|
||||
TRACE("EEPROM version %d (%d) instead of %d (%d)", g_eeGeneral.version, g_eeGeneral.variant, EEPROM_VER, EEPROM_VARIANT);
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
void eeLoadModelName(uint8_t id, char *name)
|
||||
@@ -947,6 +952,9 @@ void eeLoadModel(uint8_t id)
|
||||
activeFnSwitches = 0;
|
||||
activeFunctions = 0;
|
||||
memclear(lastFunctionTime, sizeof(lastFunctionTime));
|
||||
#if defined(CPUARM)
|
||||
evalFunctionsFirstTime = true;
|
||||
#endif
|
||||
|
||||
#if !defined(PCBSTD)
|
||||
for (uint8_t i=0; i<MAX_TIMERS; i++) {
|
||||
@@ -956,6 +964,8 @@ void eeLoadModel(uint8_t id)
|
||||
}
|
||||
#endif
|
||||
|
||||
LOAD_MODEL_CURVES();
|
||||
|
||||
resumeMixerCalculations();
|
||||
// TODO pulses should be started after mixer calculations ...
|
||||
|
||||
@@ -968,7 +978,7 @@ void eeLoadModel(uint8_t id)
|
||||
#endif
|
||||
|
||||
LOAD_MODEL_BITMAP();
|
||||
|
||||
LUA_LOAD_MODEL_SCRIPTS();
|
||||
SEND_FAILSAFE_1S();
|
||||
}
|
||||
}
|
||||
@@ -984,11 +994,6 @@ void eeReadAll()
|
||||
|
||||
ALERT(STR_EEPROMWARN, STR_BADEEPROMDATA, AU_BAD_EEPROM);
|
||||
|
||||
if (pwrCheck() == e_power_off) {
|
||||
// the radio has been powered off during the ALERT
|
||||
pwrOff();
|
||||
}
|
||||
|
||||
MESSAGE(STR_EEPROMWARN, STR_EEPROMFORMATTING, NULL, AU_EEPROM_FORMATTING);
|
||||
|
||||
EeFsFormat();
|
||||
|
||||
@@ -1 +1 @@
|
||||
0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x11,0x0e,0x12,0x1f,0x10,0x19,0x15,0x13,0x11,0x15,0x1f,0x07,0x04,0x1f,0x17,0x15,0x1d,0x1f,0x15,0x1d,0x01,0x1d,0x03,0x1f,0x15,0x1f,0x17,0x15,0x1f,
|
||||
0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x11,0x0e,0x12,0x1f,0x10,0x19,0x15,0x13,0x11,0x15,0x1f,0x07,0x04,0x1f,0x17,0x15,0x1d,0x1f,0x15,0x1d,0x01,0x1d,0x03,0x1f,0x15,0x1f,0x17,0x15,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x1f,0x11,
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 154 B After Width: | Height: | Size: 222 B |
+4
-4
@@ -763,10 +763,10 @@ TEST(Curves, LinearIntpol)
|
||||
for (int8_t i=-2; i<=2; i++) {
|
||||
g_model.points[2+i] = 50*i;
|
||||
}
|
||||
EXPECT_EQ(intpol(-1024, 0), -1024);
|
||||
EXPECT_EQ(intpol(0, 0), 0);
|
||||
EXPECT_EQ(intpol(1024, 0), 1024);
|
||||
EXPECT_EQ(intpol(-192, 0), -192);
|
||||
EXPECT_EQ(applyCustomCurve(-1024, 0), -1024);
|
||||
EXPECT_EQ(applyCustomCurve(0, 0), 0);
|
||||
EXPECT_EQ(applyCustomCurve(1024, 0), 1024);
|
||||
EXPECT_EQ(applyCustomCurve(-192, 0), -192);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
|
||||
+54
-27
@@ -491,7 +491,7 @@ void menuGeneralSetup(uint8_t event)
|
||||
case ITEM_SETUP_BRIGHTNESS:
|
||||
lcd_putsLeft(y, STR_BRIGHTNESS);
|
||||
lcd_outdezAtt(RADIO_SETUP_2ND_COLUMN, y, 100-g_eeGeneral.backlightBright, attr|LEFT) ;
|
||||
if(attr) {
|
||||
if (attr) {
|
||||
uint8_t b = 100 - g_eeGeneral.backlightBright;
|
||||
CHECK_INCDEC_GENVAR(event, b, 0, 100);
|
||||
g_eeGeneral.backlightBright = 100 - b;
|
||||
@@ -599,7 +599,7 @@ void menuGeneralSetup(uint8_t event)
|
||||
|
||||
case ITEM_SETUP_STICK_MODE:
|
||||
lcd_putcAtt(2*FW, y, '1'+g_eeGeneral.stickMode, attr);
|
||||
for (uint8_t i=0; i<4; i++) putsMixerSource((6+4*i)*FW, y, pgm_read_byte(modn12x3 + 4*g_eeGeneral.stickMode + i), 0);
|
||||
for (uint8_t i=0; i<4; i++) putsMixerSource((6+4*i)*FW, y, MIXSRC_Rud + pgm_read_byte(modn12x3 + 4*g_eeGeneral.stickMode + i), 0);
|
||||
if (attr && s_editMode>0) {
|
||||
CHECK_INCDEC_GENVAR(event, g_eeGeneral.stickMode, 0, 3);
|
||||
}
|
||||
@@ -651,7 +651,7 @@ inline bool isFilenameLower(bool isfile, const char * fn, const char * line)
|
||||
|
||||
void onSdManagerMenu(const char *result)
|
||||
{
|
||||
char lfn[SD_SCREEN_FILE_LENGTH];
|
||||
TCHAR lfn[_MAX_LFN + 1];
|
||||
|
||||
uint8_t index = m_posVert-1-s_pgOfs;
|
||||
if (result == STR_SD_INFO) {
|
||||
@@ -661,7 +661,7 @@ void onSdManagerMenu(const char *result)
|
||||
POPUP_CONFIRMATION(PSTR("Confirm Format?"));
|
||||
}
|
||||
else if (result == STR_DELETE_FILE) {
|
||||
f_getcwd(lfn, SD_SCREEN_FILE_LENGTH);
|
||||
f_getcwd(lfn, _MAX_LFN);
|
||||
strcat_P(lfn, PSTR("/"));
|
||||
strcat(lfn, reusableBuffer.sdmanager.lines[index]);
|
||||
f_unlink(lfn);
|
||||
@@ -673,13 +673,13 @@ void onSdManagerMenu(const char *result)
|
||||
}
|
||||
#if defined(CPUARM)
|
||||
/* TODO else if (result == STR_LOAD_FILE) {
|
||||
f_getcwd(lfn, SD_SCREEN_FILE_LENGTH);
|
||||
f_getcwd(lfn, _MAX_LFN);
|
||||
strcat(lfn, "/");
|
||||
strcat(lfn, reusableBuffer.sdmanager.lines[index]);
|
||||
POPUP_WARNING(eeLoadModelSD(lfn));
|
||||
} */
|
||||
else if (result == STR_PLAY_FILE) {
|
||||
f_getcwd(lfn, SD_SCREEN_FILE_LENGTH);
|
||||
f_getcwd(lfn, _MAX_LFN);
|
||||
strcat(lfn, "/");
|
||||
strcat(lfn, reusableBuffer.sdmanager.lines[index]);
|
||||
audioQueue.playFile(lfn, PLAY_BACKGROUND, 255);
|
||||
@@ -697,21 +697,31 @@ void onSdManagerMenu(const char *result)
|
||||
memcpy(modelHeaders[g_eeGeneral.currModel].bitmap, g_model.header.bitmap, sizeof(g_model.header.bitmap));
|
||||
eeDirty(EE_MODEL);
|
||||
}
|
||||
#if defined(LUA)
|
||||
else if (result == STR_EXECUTE_FILE) {
|
||||
f_getcwd(lfn, _MAX_LFN);
|
||||
strcat(lfn, "/");
|
||||
strcat(lfn, reusableBuffer.sdmanager.lines[index]);
|
||||
luaExec(lfn);
|
||||
}
|
||||
else if (result == STR_VIEW_TEXT) {
|
||||
f_getcwd(lfn, _MAX_LFN);
|
||||
strcat(lfn, "/");
|
||||
strcat(lfn, reusableBuffer.sdmanager.lines[index]);
|
||||
pushMenuTextView(lfn);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
void menuGeneralSdManager(uint8_t event)
|
||||
void menuGeneralSdManager(uint8_t _event)
|
||||
{
|
||||
FILINFO fno;
|
||||
DIR dir;
|
||||
char *fn; /* This function is assuming non-Unicode cfg. */
|
||||
#if _USE_LFN
|
||||
TCHAR lfn[_MAX_LFN + 1];
|
||||
fno.lfname = lfn;
|
||||
fno.lfsize = sizeof(lfn);
|
||||
#else
|
||||
char lfn[SD_SCREEN_FILE_LENGTH];
|
||||
#endif
|
||||
|
||||
#if defined(SDCARD)
|
||||
if (s_warning_result) {
|
||||
@@ -734,12 +744,13 @@ void menuGeneralSdManager(uint8_t event)
|
||||
}
|
||||
#endif
|
||||
|
||||
uint8_t event = ((READ_ONLY() && EVT_KEY_MASK(_event) == KEY_ENTER) ? 0 : _event);
|
||||
SIMPLE_MENU(SD_IS_HC() ? STR_SDHC_CARD : STR_SD_CARD, menuTabDiag, e_Sd, 1+reusableBuffer.sdmanager.count);
|
||||
|
||||
if (s_editMode > 0)
|
||||
s_editMode = 0;
|
||||
|
||||
switch(event) {
|
||||
switch(_event) {
|
||||
case EVT_ENTRY:
|
||||
f_chdir(ROOT_PATH);
|
||||
reusableBuffer.sdmanager.offset = 65535;
|
||||
@@ -747,10 +758,12 @@ void menuGeneralSdManager(uint8_t event)
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
case EVT_KEY_LONG(KEY_MENU):
|
||||
killEvents(event);
|
||||
// MENU_ADD_ITEM(STR_SD_INFO); TODO: Implement
|
||||
MENU_ADD_ITEM(STR_SD_FORMAT);
|
||||
menuHandler = onSdManagerMenu;
|
||||
if (!READ_ONLY()) {
|
||||
killEvents(_event);
|
||||
// MENU_ADD_ITEM(STR_SD_INFO); TODO: Implement
|
||||
MENU_ADD_ITEM(STR_SD_FORMAT);
|
||||
menuHandler = onSdManagerMenu;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
@@ -772,13 +785,13 @@ void menuGeneralSdManager(uint8_t event)
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!IS_ROTARY_BREAK(event) || m_posVert==0)
|
||||
if (!IS_ROTARY_BREAK(_event) || m_posVert==0)
|
||||
break;
|
||||
// no break;
|
||||
}
|
||||
|
||||
case EVT_KEY_LONG(KEY_ENTER):
|
||||
killEvents(event);
|
||||
killEvents(_event);
|
||||
#if !defined(PCBTARANIS)
|
||||
if (m_posVert == 0) {
|
||||
MENU_ADD_ITEM(STR_SD_INFO);
|
||||
@@ -799,14 +812,24 @@ void menuGeneralSdManager(uint8_t event)
|
||||
MENU_ADD_ITEM(STR_PLAY_FILE);
|
||||
}
|
||||
#if defined(PCBTARANIS)
|
||||
else if (!strcasecmp(ext, BITMAPS_EXT)) {
|
||||
else if (!strcasecmp(ext, BITMAPS_EXT) && !READ_ONLY()) {
|
||||
MENU_ADD_ITEM(STR_ASSIGN_BITMAP);
|
||||
}
|
||||
else if (!strcasecmp(ext, TEXT_EXT)) {
|
||||
MENU_ADD_ITEM(STR_VIEW_TEXT);
|
||||
}
|
||||
#endif
|
||||
#if defined(LUA)
|
||||
else if (!strcasecmp(ext, SCRIPTS_EXT)) {
|
||||
MENU_ADD_ITEM(STR_EXECUTE_FILE);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
MENU_ADD_ITEM(STR_DELETE_FILE);
|
||||
// MENU_ADD_ITEM(STR_RENAME_FILE); TODO: Implement
|
||||
// MENU_ADD_ITEM(STR_COPY_FILE); TODO: Implement
|
||||
if (!READ_ONLY()) {
|
||||
MENU_ADD_ITEM(STR_DELETE_FILE);
|
||||
// MENU_ADD_ITEM(STR_RENAME_FILE); TODO: Implement
|
||||
// MENU_ADD_ITEM(STR_COPY_FILE); TODO: Implement
|
||||
}
|
||||
}
|
||||
menuHandler = onSdManagerMenu;
|
||||
break;
|
||||
@@ -915,8 +938,10 @@ void menuGeneralSdManager(uint8_t event)
|
||||
if (!strcasecmp(ext, BITMAPS_EXT)) {
|
||||
if (sdBitmapIdx != m_posVert) {
|
||||
sdBitmapIdx = m_posVert;
|
||||
if (bmpLoad(sdBitmap, reusableBuffer.sdmanager.lines[index], MODEL_BITMAP_WIDTH, MODEL_BITMAP_HEIGHT))
|
||||
uint8_t *dest = sdBitmap;
|
||||
if (bmpLoad(dest, reusableBuffer.sdmanager.lines[index], MODEL_BITMAP_WIDTH, MODEL_BITMAP_HEIGHT)) {
|
||||
memcpy(sdBitmap, logo_taranis, MODEL_BITMAP_SIZE);
|
||||
}
|
||||
}
|
||||
lcd_bmp(22*FW+2, 2*FH+FH/2, sdBitmap);
|
||||
}
|
||||
@@ -953,7 +978,7 @@ void menuGeneralTrainer(uint8_t event)
|
||||
uint8_t chan = channel_order(i);
|
||||
volatile TrainerMix *td = &g_eeGeneral.trainer.mix[chan-1];
|
||||
|
||||
putsMixerSource(0, y, chan, (m_posVert==i && m_posHorz<0) ? INVERS : 0);
|
||||
putsMixerSource(0, y, MIXSRC_Rud-1+chan, (m_posVert==i && m_posHorz<0) ? INVERS : 0);
|
||||
|
||||
for (uint8_t j=0; j<3; j++) {
|
||||
|
||||
@@ -1088,7 +1113,7 @@ void menuGeneralDiagAna(uint8_t event)
|
||||
putsStrIdx(x, y, PSTR("A"), i+1);
|
||||
lcd_putc(x+2*FWNUM, y, ':');
|
||||
lcd_outhex4(x+3*FW-1, y, anaIn(i));
|
||||
lcd_outdez8(x+10*FW-1, y, (int16_t)calibratedStick[CONVERT_MODE(i+1)-1]*25/256);
|
||||
lcd_outdez8(x+10*FW-1, y, (int16_t)calibratedStick[CONVERT_MODE(i)]*25/256);
|
||||
}
|
||||
|
||||
#if !defined(CPUARM)
|
||||
@@ -1243,7 +1268,9 @@ void menuCommonCalib(uint8_t event)
|
||||
switch (reusableBuffer.calib.state) {
|
||||
case 0:
|
||||
// START CALIBRATION
|
||||
lcd_putsLeft(3*FH, STR_MENUTOSTART);
|
||||
if (!READ_ONLY()) {
|
||||
lcd_putsLeft(3*FH, STR_MENUTOSTART);
|
||||
}
|
||||
break;
|
||||
|
||||
case 1:
|
||||
@@ -1296,7 +1323,7 @@ void menuGeneralCalib(uint8_t event)
|
||||
{
|
||||
SIMPLE_MENU(STR_MENUCALIBRATION, menuTabDiag, e_Calib, 1);
|
||||
|
||||
menuCommonCalib(event);
|
||||
menuCommonCalib(READ_ONLY() ? 0 : event);
|
||||
}
|
||||
|
||||
void menuFirstCalib(uint8_t event)
|
||||
|
||||
+842
-257
File diff suppressed because it is too large
Load Diff
+142
-32
@@ -58,10 +58,10 @@ void menu_lcd_onoff(uint8_t x, uint8_t y, uint8_t value, LcdFlags attr)
|
||||
|
||||
void displayScreenIndex(uint8_t index, uint8_t count, uint8_t attr)
|
||||
{
|
||||
lcd_outdezAtt(LCD_W,0,count,attr);
|
||||
lcd_outdezAtt(LCD_W, 0, count, attr);
|
||||
xcoord_t x = 1+LCD_W-FW*(count>9 ? 3 : 2);
|
||||
lcd_putcAtt(x,0,'/',attr);
|
||||
lcd_outdezAtt(x,0,index+1,attr);
|
||||
lcd_putcAtt(x, 0, '/', attr);
|
||||
lcd_outdezAtt(x, 0, index+1, attr);
|
||||
}
|
||||
|
||||
#if !defined(CPUM64)
|
||||
@@ -85,6 +85,25 @@ int16_t p1valdiff;
|
||||
int8_t p2valdiff;
|
||||
#endif
|
||||
|
||||
uint8_t switchToMix(uint8_t source)
|
||||
{
|
||||
#if defined(PCBTARANIS)
|
||||
if (source <= 5*3)
|
||||
return MIXSRC_FIRST_SWITCH + (source-1) / 3;
|
||||
else if (source <= 17)
|
||||
return MIXSRC_SF;
|
||||
else if (source <= 20)
|
||||
return MIXSRC_SG;
|
||||
else
|
||||
return MIXSRC_SH;
|
||||
#else
|
||||
if (source <= 3)
|
||||
return MIXSRC_3POS;
|
||||
else
|
||||
return MIXSRC_FIRST_SWITCH - 3 + source;
|
||||
#endif
|
||||
}
|
||||
|
||||
int8_t checkIncDec_Ret;
|
||||
|
||||
#if defined(CPUARM)
|
||||
@@ -167,7 +186,7 @@ int16_t checkIncDec(uint8_t event, int16_t val, int16_t i_min, int16_t i_max, ui
|
||||
AUDIO_KEYPAD_DOWN();
|
||||
}
|
||||
|
||||
if (i_min==0 && i_max==1 && (event==EVT_KEY_BREAK(KEY_ENTER) || IS_ROTARY_BREAK(event))) {
|
||||
if (!READ_ONLY() && i_min==0 && i_max==1 && (event==EVT_KEY_BREAK(KEY_ENTER) || IS_ROTARY_BREAK(event))) {
|
||||
s_editMode = 0;
|
||||
newval = !val;
|
||||
}
|
||||
@@ -214,28 +233,16 @@ int16_t checkIncDec(uint8_t event, int16_t val, int16_t i_min, int16_t i_max, ui
|
||||
#if defined(AUTOSOURCE)
|
||||
if (i_flags & INCDEC_SOURCE) {
|
||||
if (s_editMode>0) {
|
||||
int8_t source = getMovedSource();
|
||||
int8_t source = GET_MOVED_SOURCE(i_min, i_max);
|
||||
if (source) {
|
||||
newval = MIXSRC_Rud - 1 + source;
|
||||
newval = source;
|
||||
}
|
||||
#if defined(AUTOSWITCH)
|
||||
source = abs(getMovedSwitch());
|
||||
if (source) {
|
||||
#if defined(PCBTARANIS)
|
||||
if (source <= 5*3)
|
||||
newval = MIXSRC_FIRST_SWITCH + (source-1) / 3;
|
||||
else if (source <= 17)
|
||||
newval = MIXSRC_SF;
|
||||
else if (source <= 20)
|
||||
newval = MIXSRC_SG;
|
||||
else
|
||||
newval = MIXSRC_SH;
|
||||
#else
|
||||
if (source <= 3)
|
||||
newval = MIXSRC_3POS;
|
||||
else
|
||||
newval = MIXSRC_FIRST_SWITCH - 3 + source;
|
||||
#endif
|
||||
else {
|
||||
uint8_t swtch = abs(getMovedSwitch());
|
||||
if (swtch) {
|
||||
newval = switchToMix(swtch);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -321,6 +328,35 @@ void title(const pm_char * s)
|
||||
uint8_t scrollbar_X = LCD_W-1;
|
||||
#endif
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
bool modelHasNotes()
|
||||
{
|
||||
FILINFO info;
|
||||
TCHAR lfn[_MAX_LFN + 1];
|
||||
info.lfname = lfn;
|
||||
info.lfsize = sizeof(lfn);
|
||||
|
||||
char filename[sizeof(MODELS_PATH)+1+sizeof(g_model.header.name)+sizeof(TEXT_EXT)] = MODELS_PATH "/";
|
||||
char *buf = strcat_modelname(&filename[sizeof(MODELS_PATH)], g_eeGeneral.currModel);
|
||||
strcpy(buf, TEXT_EXT);
|
||||
|
||||
return (f_stat(filename, &info) == FR_OK);
|
||||
}
|
||||
|
||||
void onLongMenuPress(const char *result)
|
||||
{
|
||||
if (result == STR_VIEW_CHANNELS) {
|
||||
pushMenu(menuChannelsView);
|
||||
}
|
||||
else if (result == STR_VIEW_NOTES) {
|
||||
char filename[sizeof(MODELS_PATH)+1+sizeof(g_model.header.name)+sizeof(TEXT_EXT)] = MODELS_PATH "/";
|
||||
char *buf = strcat_modelname(&filename[sizeof(MODELS_PATH)], g_eeGeneral.currModel);
|
||||
strcpy(buf, TEXT_EXT);
|
||||
pushMenuTextView(filename);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
bool check(check_event_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTabSize, const pm_uint8_t *horTab, uint8_t horTabMax, vertpos_t maxrow)
|
||||
{
|
||||
vertpos_t l_posVert = m_posVert;
|
||||
@@ -366,9 +402,16 @@ bool check(check_event_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t
|
||||
switch(event) {
|
||||
case EVT_KEY_LONG(KEY_MENU):
|
||||
if (menuTab == menuTabModel) {
|
||||
pushMenu(menuChannelsView);
|
||||
killEvents(event);
|
||||
return false;
|
||||
if (modelHasNotes()) {
|
||||
MENU_ADD_SD_ITEM(STR_VIEW_CHANNELS);
|
||||
MENU_ADD_ITEM(STR_VIEW_NOTES);
|
||||
menuHandler = onLongMenuPress;
|
||||
}
|
||||
else {
|
||||
pushMenu(menuChannelsView);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -501,7 +544,7 @@ bool check(check_event_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t
|
||||
|
||||
case EVT_ROTARY_BREAK:
|
||||
if (s_editMode > 1) break;
|
||||
if (m_posHorz < 0 && maxcol > 0) {
|
||||
if (m_posHorz < 0 && maxcol > 0 && READ_ONLY_UNLOCKED()) {
|
||||
l_posHorz = 0;
|
||||
break;
|
||||
}
|
||||
@@ -518,8 +561,11 @@ bool check(check_event_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t
|
||||
#if !defined(PCBTARANIS)
|
||||
case EVT_KEY_FIRST(KEY_ENTER):
|
||||
#endif
|
||||
if (!menuTab || l_posVert>0)
|
||||
s_editMode = (s_editMode<=0);
|
||||
if (!menuTab || l_posVert>0) {
|
||||
if (READ_ONLY_UNLOCKED()) {
|
||||
s_editMode = (s_editMode<=0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
#if defined(ROTARY_ENCODER_NAVIGATION)
|
||||
@@ -757,7 +803,7 @@ bool check(check_event_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t
|
||||
|
||||
#if LCD_W >= 212
|
||||
if (maxrow > LCD_LINES-1 && scrollbar_X)
|
||||
displayScrollbar(scrollbar_X, FH, LCD_H-FH, s_pgOfs, maxrow, LCD_LINES-1);
|
||||
displayScrollbar(scrollbar_X, FH, LCD_H-FH, s_pgOfs, menuTab ? maxrow : maxrow+1, LCD_LINES-1);
|
||||
#endif
|
||||
|
||||
#else
|
||||
@@ -844,7 +890,11 @@ void displayBox()
|
||||
{
|
||||
lcd_filled_rect(10, 16, LCD_W-20, 40, SOLID, ERASE);
|
||||
lcd_rect(10, 16, LCD_W-20, 40);
|
||||
#if defined(CPUARM)
|
||||
lcd_putsn(WARNING_LINE_X, WARNING_LINE_Y, s_warning, WARNING_LINE_LEN);
|
||||
#else
|
||||
lcd_puts(WARNING_LINE_X, WARNING_LINE_Y, s_warning);
|
||||
#endif
|
||||
// could be a place for a s_warning_info
|
||||
}
|
||||
|
||||
@@ -891,7 +941,7 @@ void displayWarning(uint8_t event)
|
||||
}
|
||||
}
|
||||
|
||||
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, LcdFlags attr, uint8_t event)
|
||||
select_menu_value_t selectMenuItem(uint8_t x, uint8_t y, const pm_char *label, const pm_char *values, select_menu_value_t value, select_menu_value_t min, select_menu_value_t max, LcdFlags attr, uint8_t event)
|
||||
{
|
||||
lcd_putsColumnLeft(x, y, label);
|
||||
if (values) lcd_putsiAtt(x, y, values, value-min, attr);
|
||||
@@ -924,7 +974,14 @@ int16_t gvarMenuItem(uint8_t x, uint8_t y, int16_t value, int16_t min, int16_t m
|
||||
bool invers = (attr & INVERS);
|
||||
if (invers && event == EVT_KEY_LONG(KEY_ENTER)) {
|
||||
s_editMode = !s_editMode;
|
||||
#if defined(CPUARM)
|
||||
if (attr & PREC1)
|
||||
value = (GV_IS_GV_VALUE(value, min, max) ? GET_GVAR(value, min, max, s_perout_flight_phase)*10 : delta);
|
||||
else
|
||||
value = (GV_IS_GV_VALUE(value, min, max) ? GET_GVAR(value, min, max, s_perout_flight_phase) : delta);
|
||||
#else
|
||||
value = (GV_IS_GV_VALUE(value, min, max) ? GET_GVAR(value, min, max, s_perout_flight_phase) : delta);
|
||||
#endif
|
||||
eeDirty(EE_MODEL);
|
||||
}
|
||||
if (GV_IS_GV_VALUE(value, min, max)) {
|
||||
@@ -933,6 +990,10 @@ int16_t gvarMenuItem(uint8_t x, uint8_t y, int16_t value, int16_t min, int16_t m
|
||||
else
|
||||
x -= 2*FW+FWNUM;
|
||||
|
||||
#if defined(CPUARM)
|
||||
attr &= ~PREC1;
|
||||
#endif
|
||||
|
||||
int8_t idx = (int16_t) GV_INDEX_CALC_DELTA(value, delta);
|
||||
if (invers) {
|
||||
CHECK_INCDEC_MODELVAR(event, idx, -MAX_GVARS, MAX_GVARS-1);
|
||||
@@ -1107,6 +1168,22 @@ void drawStatusLine()
|
||||
#if defined(CPUARM)
|
||||
bool isSourceAvailable(int16_t source)
|
||||
{
|
||||
#if defined(PCBTARANIS)
|
||||
if (source>=MIXSRC_FIRST_INPUT && source<=MIXSRC_LAST_INPUT) {
|
||||
return ZEXIST(g_model.inputNames[source-MIXSRC_FIRST_INPUT]);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(LUA_MODEL_SCRIPTS)
|
||||
if (source>=MIXSRC_FIRST_LUA && source<=MIXSRC_LAST_LUA) {
|
||||
div_t qr = div(source-MIXSRC_FIRST_LUA, MAX_SCRIPT_OUTPUTS);
|
||||
return (scriptInternalData[qr.quot].state==SCRIPT_OK && qr.rem<scriptInternalData[qr.quot].outputsCount);
|
||||
}
|
||||
#elif defined(PCBTARANIS)
|
||||
if (source>=MIXSRC_FIRST_LUA && source<=MIXSRC_LAST_LUA)
|
||||
return false;
|
||||
#endif
|
||||
|
||||
#if !defined(HELI)
|
||||
if (source>=MIXSRC_CYC1 && source<=MIXSRC_CYC3)
|
||||
return false;
|
||||
@@ -1135,8 +1212,41 @@ bool isSourceAvailable(int16_t source)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool isSourceP1Available(int16_t source)
|
||||
bool isInputSourceAvailable(int16_t source)
|
||||
{
|
||||
return isSourceAvailable(source+1);
|
||||
if (source>=MIXSRC_Rud && source<=MIXSRC_MAX)
|
||||
return true;
|
||||
|
||||
if (source>=MIXSRC_TrimRud && source<MIXSRC_SW1)
|
||||
return true;
|
||||
|
||||
if (source>=MIXSRC_FIRST_CH && source<=MIXSRC_LAST_CH)
|
||||
return true;
|
||||
|
||||
if (source>=MIXSRC_FIRST_TELEM && source<=MIXSRC_LAST_TELEM)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool isSwitchAvailable(int16_t swtch)
|
||||
{
|
||||
if (swtch < 0) {
|
||||
if (swtch <= -SWSRC_ON)
|
||||
return false;
|
||||
#if defined(PCBTARANIS)
|
||||
else if (swtch == -SWSRC_SF0 || swtch == -SWSRC_SF2 || swtch == -SWSRC_SH0 || swtch == -SWSRC_SH2)
|
||||
return false;
|
||||
#endif
|
||||
else
|
||||
swtch = -swtch;
|
||||
}
|
||||
|
||||
if (swtch>=SWSRC_FIRST_CSW && swtch<=SWSRC_LAST_CSW) {
|
||||
CustomSwData * cs = cswAddress(swtch-SWSRC_FIRST_CSW);
|
||||
return (cs->func != CS_OFF);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
+24
-5
@@ -188,7 +188,12 @@ int8_t checkIncDecGen(uint8_t event, int8_t i_val, int8_t i_min, int8_t i_max);
|
||||
#define CHECK_INCDEC_MODELVAR_ZERO(event, var, max) \
|
||||
var = checkIncDecModelZero(event,var,max)
|
||||
|
||||
#if defined(AUTOSWITCH)
|
||||
#if defined(CPUARM)
|
||||
bool isSwitchAvailable(int16_t swtch);
|
||||
#define AUTOSWITCH_ENTER_LONG() (attr && event==EVT_KEY_LONG(KEY_ENTER))
|
||||
#define CHECK_INCDEC_MODELSWITCH(event, var, min, max) \
|
||||
var = checkIncDec(event,var,min,max,EE_MODEL|INCDEC_SWITCH|NO_INCDEC_MARKS, isSwitchAvailable)
|
||||
#elif defined(AUTOSWITCH)
|
||||
#define AUTOSWITCH_ENTER_LONG() (attr && event==EVT_KEY_LONG(KEY_ENTER))
|
||||
#define CHECK_INCDEC_MODELSWITCH(event, var, min, max) \
|
||||
var = checkIncDec(event,var,min,max,EE_MODEL|INCDEC_SWITCH)
|
||||
@@ -199,7 +204,7 @@ int8_t checkIncDecGen(uint8_t event, int8_t i_val, int8_t i_min, int8_t i_max);
|
||||
|
||||
#if defined(CPUARM)
|
||||
bool isSourceAvailable(int16_t source);
|
||||
bool isSourceP1Available(int16_t source);
|
||||
bool isInputSourceAvailable(int16_t source);
|
||||
#define CHECK_INCDEC_MODELSOURCE(event, var, min, max) \
|
||||
var = checkIncDec(event,var,min,max,EE_MODEL|INCDEC_SOURCE|NO_INCDEC_MARKS, isSourceAvailable)
|
||||
#elif defined(AUTOSOURCE)
|
||||
@@ -246,11 +251,11 @@ void title(const pm_char * s);
|
||||
TITLE(title)
|
||||
|
||||
#define SUBMENU_NOTITLE(lines_count, ...) { \
|
||||
static const pm_uint8_t mstate_tab[] PROGMEM = __VA_ARGS__; \
|
||||
MENU_TAB(__VA_ARGS__); \
|
||||
if (!check(event,0,NULL,0,mstate_tab,DIM(mstate_tab)-1,(lines_count)-1)) return; }
|
||||
|
||||
#define SUBMENU(title, lines_count, ...) \
|
||||
static const pm_uint8_t mstate_tab[] PROGMEM = __VA_ARGS__; \
|
||||
MENU_TAB(__VA_ARGS__); \
|
||||
if (!check(event,0,NULL,0,mstate_tab,DIM(mstate_tab)-1,(lines_count)-1)) return; \
|
||||
TITLE(title)
|
||||
|
||||
@@ -261,7 +266,13 @@ void title(const pm_char * s);
|
||||
SIMPLE_SUBMENU_NOTITLE(lines_count); \
|
||||
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, LcdFlags attr, uint8_t event);
|
||||
#if defined(CPUARM)
|
||||
typedef int select_menu_value_t;
|
||||
#else
|
||||
typedef int8_t select_menu_value_t;
|
||||
#endif
|
||||
|
||||
select_menu_value_t selectMenuItem(uint8_t x, uint8_t y, const pm_char *label, const pm_char *values, select_menu_value_t value, select_menu_value_t min, select_menu_value_t max, LcdFlags attr, uint8_t event);
|
||||
uint8_t onoffMenuItem(uint8_t value, uint8_t x, uint8_t y, const pm_char *label, LcdFlags attr, uint8_t event );
|
||||
int8_t switchMenuItem(uint8_t x, uint8_t y, int8_t value, LcdFlags attr, uint8_t event);
|
||||
|
||||
@@ -287,6 +298,11 @@ extern const pm_char * s_global_warning;
|
||||
|
||||
#define WARNING_LINE_X 16
|
||||
#define WARNING_LINE_Y 3*FH
|
||||
#if LCD_W >= 212
|
||||
#define WARNING_LINE_LEN 30
|
||||
#else
|
||||
#define WARNING_LINE_LEN 20
|
||||
#endif
|
||||
|
||||
void displayBox();
|
||||
void displayPopup(const pm_char * pstr);
|
||||
@@ -339,7 +355,10 @@ void displayWarning(uint8_t event);
|
||||
#define drawStatusLine()
|
||||
#endif
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
void menuChannelsView(uint8_t event);
|
||||
void pushMenuTextView(const char *filename);
|
||||
#endif
|
||||
|
||||
#define LABEL(...) (uint8_t)-1
|
||||
|
||||
|
||||
+65
-29
@@ -114,6 +114,7 @@
|
||||
#define ICON_TRAINEE 71, 11
|
||||
#define ICON_USB 81, 11
|
||||
#define ICON_REBOOT 91, 11
|
||||
#define ICON_ALTITUDE 102, 9
|
||||
#endif
|
||||
|
||||
void drawPotsBars()
|
||||
@@ -135,15 +136,15 @@ void drawStick(uint8_t centrex, int16_t xval, int16_t yval)
|
||||
|
||||
void doMainScreenGraphics()
|
||||
{
|
||||
int16_t calibStickVert = calibratedStick[CONVERT_MODE(1+1)-1];
|
||||
if (g_model.throttleReversed && CONVERT_MODE(1+1)-1 == THR_STICK)
|
||||
int16_t calibStickVert = calibratedStick[CONVERT_MODE(1)];
|
||||
if (g_model.throttleReversed && CONVERT_MODE(1) == THR_STICK)
|
||||
calibStickVert = -calibStickVert;
|
||||
drawStick(LBOX_CENTERX, calibratedStick[CONVERT_MODE(0+1)-1], calibStickVert);
|
||||
drawStick(LBOX_CENTERX, calibratedStick[CONVERT_MODE(0)], calibStickVert);
|
||||
|
||||
calibStickVert = calibratedStick[CONVERT_MODE(2+1)-1];
|
||||
if (g_model.throttleReversed && CONVERT_MODE(2+1)-1 == THR_STICK)
|
||||
calibStickVert = calibratedStick[CONVERT_MODE(2)];
|
||||
if (g_model.throttleReversed && CONVERT_MODE(2) == THR_STICK)
|
||||
calibStickVert = -calibStickVert;
|
||||
drawStick(RBOX_CENTERX, calibratedStick[CONVERT_MODE(3+1)-1], calibStickVert);
|
||||
drawStick(RBOX_CENTERX, calibratedStick[CONVERT_MODE(3)], calibStickVert);
|
||||
|
||||
#if !defined(PCBTARANIS)
|
||||
drawPotsBars();
|
||||
@@ -156,7 +157,7 @@ void displayTrims(uint8_t phase)
|
||||
static xcoord_t x[4] = {TRIM_LH_X, TRIM_LV_X, TRIM_RV_X, TRIM_RH_X};
|
||||
static uint8_t vert[4] = {0,1,1,0};
|
||||
uint8_t xm, ym;
|
||||
xm = x[CONVERT_MODE(i+1)-1];
|
||||
xm = x[CONVERT_MODE(i)];
|
||||
|
||||
uint8_t att = ROUND;
|
||||
int16_t val = getTrimValue(phase, i);
|
||||
@@ -210,9 +211,6 @@ void displaySliders()
|
||||
#define BAR_Y 1
|
||||
#define BAR_W 184
|
||||
#define BAR_H 9
|
||||
#define BAR_BATT_X BAR_X+18
|
||||
#define BAR_RSSI_X BAR_X+42
|
||||
#define BAR_A1_X BAR_X+69
|
||||
#define BAR_NOTIFS_X BAR_X+133
|
||||
#define BAR_VOLUME_X BAR_X+147
|
||||
#define BAR_TIME_X BAR_X+168
|
||||
@@ -232,15 +230,19 @@ void displayTopBarGauge(xcoord_t x, int count, bool blinking=false)
|
||||
|
||||
void displayTopBar()
|
||||
{
|
||||
uint8_t batt_icon_x;
|
||||
uint8_t altitude_icon_x;
|
||||
|
||||
/* Tx voltage */
|
||||
putsVBat(BAR_BATT_X, BAR_Y+1, 0);
|
||||
lcd_rect(BAR_BATT_X+FW, BAR_Y+1, 13, 7);
|
||||
lcd_vline(BAR_BATT_X+FW+13, BAR_Y+2, 5);
|
||||
putsVBat(BAR_X+2, BAR_Y+1, LEFT);
|
||||
batt_icon_x = lcdLastPos;
|
||||
lcd_rect(batt_icon_x+FW, BAR_Y+1, 13, 7);
|
||||
lcd_vline(batt_icon_x+FW+13, BAR_Y+2, 5);
|
||||
|
||||
if (frskyData.rssi[0].value > 0) {
|
||||
/* RSSI */
|
||||
LCD_ICON(BAR_RSSI_X, BAR_Y, ICON_RSSI);
|
||||
lcd_rect(BAR_RSSI_X+10, BAR_Y+1, 13, 7);
|
||||
LCD_ICON(batt_icon_x+3*FW+3, BAR_Y, ICON_RSSI);
|
||||
lcd_rect(batt_icon_x+5*FW, BAR_Y+1, 13, 7);
|
||||
|
||||
/* Rx voltage */
|
||||
lcdint_t voltage = 0;
|
||||
@@ -258,7 +260,17 @@ void displayTopBar()
|
||||
voltage = frskyData.hub.cellsSum;
|
||||
}
|
||||
if (voltage > 0) {
|
||||
putsTelemetryChannel(BAR_A1_X, BAR_Y+1, channel, voltage, LEFT);
|
||||
putsTelemetryChannel(batt_icon_x+7*FW+2, BAR_Y+1, channel, voltage, LEFT);
|
||||
altitude_icon_x = lcdLastPos+1;
|
||||
}
|
||||
else {
|
||||
altitude_icon_x = batt_icon_x+7*FW+3;
|
||||
}
|
||||
|
||||
/* Altitude */
|
||||
if (g_model.frsky.altitudeDisplayed && frskyData.hub.baroAltitudeOffset) {
|
||||
LCD_ICON(altitude_icon_x, BAR_Y, ICON_ALTITUDE);
|
||||
putsTelemetryValue(altitude_icon_x+2*FW-1, BAR_Y+1, TELEMETRY_ALT_BP, UNIT_METERS, LEFT);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -288,9 +300,10 @@ void displayTopBar()
|
||||
x -= 12;
|
||||
}
|
||||
|
||||
/* SD ICON, not really needed
|
||||
if (sdMounted()) {
|
||||
LCD_NOTIF_ICON(x, ICON_SD);
|
||||
}
|
||||
} */
|
||||
|
||||
/* Audio volume */
|
||||
if (requiredSpeakerVolume == 0)
|
||||
@@ -314,11 +327,11 @@ void displayTopBar()
|
||||
|
||||
/* The inside of the Batt gauge */
|
||||
int count = 10 * (g_vbat100mV - g_eeGeneral.vBatMin - 90) / (30 + g_eeGeneral.vBatMax - g_eeGeneral.vBatMin);
|
||||
displayTopBarGauge(BAR_BATT_X+FW, count, g_vbat100mV <= g_eeGeneral.vBatWarn);
|
||||
displayTopBarGauge(batt_icon_x+FW, count, g_vbat100mV <= g_eeGeneral.vBatWarn);
|
||||
|
||||
/* The inside of the RSSI gauge */
|
||||
if (frskyData.rssi[0].value > 0) {
|
||||
displayTopBarGauge(BAR_RSSI_X+10, frskyData.rssi[0].value / 10, frskyData.rssi[0].value < getRssiAlarmValue(0));
|
||||
displayTopBarGauge(batt_icon_x+5*FW, frskyData.rssi[0].value / 10, frskyData.rssi[0].value < getRssiAlarmValue(0));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -358,7 +371,7 @@ void displayTimers()
|
||||
// Main timer
|
||||
if (g_model.timers[0].mode) {
|
||||
TimerState & timerState = timersStates[0];
|
||||
uint8_t att = DBLSIZE | (timerState.state==TMR_BEEPING ? BLINK|INVERS : 0);
|
||||
uint8_t att = DBLSIZE | (timerState.val<0 ? BLINK|INVERS : 0);
|
||||
putsTime(12*FW+2+10*FWNUM-4, FH*2, timerState.val, att, att);
|
||||
putsTmrMode(timerState.val >= 0 ? 9*FW-FW/2+3 : 9*FW-FW/2-4, FH*3, g_model.timers[0].mode, STRCONDENSED);
|
||||
}
|
||||
@@ -525,7 +538,7 @@ void menuMainView(uint8_t event)
|
||||
break;
|
||||
#endif
|
||||
|
||||
#if !defined(READONLY)
|
||||
#if MENUS_LOCK != 2/*no menus*/
|
||||
#if !defined(PCBTARANIS)
|
||||
case EVT_KEY_LONG(KEY_MENU):// go to last menu
|
||||
pushMenu(lastPopMenu());
|
||||
@@ -594,12 +607,14 @@ void menuMainView(uint8_t event)
|
||||
return;
|
||||
|
||||
case EVT_KEY_FIRST(KEY_EXIT):
|
||||
if (timersStates[0].state==TMR_BEEPING) {
|
||||
timersStates[0].state = TMR_STOPPED;
|
||||
}
|
||||
else if (s_global_warning) {
|
||||
if (s_global_warning) {
|
||||
s_global_warning = NULL;
|
||||
}
|
||||
#if defined(GVARS) && !defined(PCBSTD)
|
||||
else if (s_gvar_timer > 0) {
|
||||
s_gvar_timer = 0;
|
||||
}
|
||||
#endif
|
||||
#if !defined(PCBTARANIS)
|
||||
else if (view == VIEW_TIMER2) {
|
||||
resetTimer(1);
|
||||
@@ -652,18 +667,18 @@ void menuMainView(uint8_t event)
|
||||
// TODO simplify this + reuse code in checkSwitches() + Menu MODELSETUP
|
||||
switch(i) {
|
||||
case 5:
|
||||
sw = getValue(MIXSRC_SF-1) > 0 ? 3*i+2 : 3*i+1;
|
||||
sw = getValue(MIXSRC_SF) > 0 ? 3*i+2 : 3*i+1;
|
||||
break;
|
||||
case 6:
|
||||
val = getValue(MIXSRC_SG-1);
|
||||
val = getValue(MIXSRC_SG);
|
||||
sw = ((val < 0) ? 3*i : ((val == 0) ? 3*i+1 : 3*i+2));
|
||||
break;
|
||||
case 7:
|
||||
sw = getValue(MIXSRC_SH-1) > 0 ? 3*i+1 : 3*i;
|
||||
sw = getValue(MIXSRC_SH) > 0 ? 3*i+1 : 3*i;
|
||||
break;
|
||||
default:
|
||||
{
|
||||
val = getValue(MIXSRC_SA+i-1);
|
||||
val = getValue(MIXSRC_SA+i);
|
||||
sw = ((val < 0) ? 3*i+1 : ((val == 0) ? 3*i+2 : 3*i+3));
|
||||
break;
|
||||
}
|
||||
@@ -822,6 +837,27 @@ void menuMainView(uint8_t event)
|
||||
s_warning = NULL;
|
||||
}
|
||||
|
||||
#if defined(GVARS) && !defined(PCBSTD)
|
||||
else if (s_gvar_timer > 0) {
|
||||
s_gvar_timer--;
|
||||
#if LCD_W >= 212
|
||||
lcd_filled_rect(BITMAP_X, BITMAP_Y, 64, 32, SOLID, ERASE);
|
||||
lcd_rect(BITMAP_X, BITMAP_Y, 64, 32);
|
||||
putsStrIdx(BITMAP_X+FW, BITMAP_Y+FH-1, STR_GV, s_gvar_last+1);
|
||||
lcd_putsnAtt(BITMAP_X+4*FW+FW/2, BITMAP_Y+FH-1, g_model.gvars[s_gvar_last].name, LEN_GVAR_NAME, ZCHAR);
|
||||
lcd_putsAtt(BITMAP_X+FW, BITMAP_Y+2*FH+3, PSTR("[\010]"), BOLD);
|
||||
lcd_outdezAtt(BITMAP_X+5*FW+FW/2, BITMAP_Y+2*FH+3, GVAR_VALUE(s_gvar_last, s_perout_flight_phase), BOLD);
|
||||
#else
|
||||
s_warning = STR_GLOBAL_VAR;
|
||||
displayBox();
|
||||
lcd_putsnAtt(16, 5*FH, g_model.gvars[s_gvar_last].name, LEN_GVAR_NAME, ZCHAR);
|
||||
lcd_putsAtt(16+7*FW, 5*FH, PSTR("[\010]"), BOLD);
|
||||
lcd_outdezAtt(16+7*FW+4*FW+FW/2, 5*FH, GVAR_VALUE(s_gvar_last, s_perout_flight_phase), BOLD);
|
||||
s_warning = NULL;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(DSM2)
|
||||
if (dsm2Flag == DSM2_BIND_FLAG) // Issue 98
|
||||
lcd_putsAtt(15*FW, 0, PSTR("BIND"), 0);
|
||||
|
||||
@@ -84,9 +84,9 @@ void menuStatisticsView(uint8_t event)
|
||||
}
|
||||
|
||||
#if defined(CPUARM)
|
||||
#define MENU_DEBUG_COL_OFS (13*FW)
|
||||
#define MENU_DEBUG_COL_OFS (11*FW-2)
|
||||
#else
|
||||
#define MENU_DEBUG_COL_OFS (14*FW)
|
||||
#define MENU_DEBUG_COL_OFS (14*FW)
|
||||
#endif
|
||||
|
||||
void menuStatisticsDebug(uint8_t event)
|
||||
@@ -167,18 +167,22 @@ void menuStatisticsDebug(uint8_t event)
|
||||
putsTelemetryValue(MENU_DEBUG_COL_OFS, 4*FH, Coproc_temp, UNIT_DEGREES, 0);
|
||||
putsTelemetryValue(20*FW+2, 4*FH, Coproc_maxtemp, UNIT_DEGREES, 0);
|
||||
}
|
||||
#elif defined(PCBTARANIS) && !defined(SIMU)
|
||||
lcd_putsLeft(4*FH, "Free Mem");
|
||||
lcd_outdezAtt(MENU_DEBUG_COL_OFS, 4*FH, 0x20020000 - (unsigned int)heap, LEFT);
|
||||
#endif
|
||||
|
||||
#if defined(CPUARM)
|
||||
lcd_putsLeft(5*FH, STR_TMIXMAXMS);
|
||||
lcd_outdezAtt(MENU_DEBUG_COL_OFS, 5*FH, (maxMixerDuration)/20, PREC2);
|
||||
|
||||
lcd_outdezAtt(MENU_DEBUG_COL_OFS, 5*FH, (maxMixerDuration)/20, PREC2|LEFT);
|
||||
lcd_puts(lcdLastPos, 5*FH, "ms");
|
||||
lcd_putsLeft(6*FH, STR_FREESTACKMINB);
|
||||
lcd_outdezAtt(13*FW, 6*FH, stack_free(0), UNSIGN);
|
||||
lcd_putc(13*FW, 6*FH, '/');
|
||||
lcd_outdezAtt(13*FW+FWNUM, 6*FH, stack_free(1), UNSIGN|LEFT);
|
||||
lcd_putc(lcdLastPos, 6*FH, '/');
|
||||
lcd_outdezAtt(lcdLastPos+FWNUM, 6*FH, stack_free(2), UNSIGN|LEFT);
|
||||
lcd_putsAtt(MENU_DEBUG_COL_OFS-1, 6*FH+1, "[Main]", SMLSIZE);
|
||||
lcd_outdezAtt(lcdLastPos, 6*FH, stack_free(0), UNSIGN|LEFT);
|
||||
lcd_putsAtt(lcdLastPos+2, 6*FH+1, "[Mix]", SMLSIZE);
|
||||
lcd_outdezAtt(lcdLastPos, 6*FH, stack_free(1), UNSIGN|LEFT);
|
||||
lcd_putsAtt(lcdLastPos+2, 6*FH+1, "[Audio]", SMLSIZE);
|
||||
lcd_outdezAtt(lcdLastPos, 6*FH, stack_free(2), UNSIGN|LEFT);
|
||||
#else
|
||||
lcd_putsLeft(1*FH, STR_TMR1LATMAXUS);
|
||||
lcd_outdez8(MENU_DEBUG_COL_OFS , 1*FH, g_tmr1Latency_max/2 );
|
||||
|
||||
@@ -113,7 +113,7 @@ void displayGpsCoord(uint8_t y, char direction, int16_t bp, int16_t ap)
|
||||
if (!direction) direction = '-';
|
||||
lcd_outdezAtt(TELEM_2ND_COLUMN, y, bp / 100, LEFT); // ddd before '.'
|
||||
lcd_putc(lcdLastPos, y, '@');
|
||||
uint8_t mn = bp % 100;
|
||||
uint8_t mn = bp % 100; // TODO div_t
|
||||
if (g_eeGeneral.gpsFormat == 0) {
|
||||
lcd_putc(lcdLastPos+FWNUM, y, direction);
|
||||
lcd_outdezNAtt(lcdLastPos+FW+FW+1, y, mn, LEFT|LEADING0, 2); // mm before '.'
|
||||
@@ -220,7 +220,7 @@ void menuTelemetryFrsky(uint8_t event)
|
||||
uint8_t y = barHeight+6+i*(barHeight+6);
|
||||
lcd_putsiAtt(0, y+barHeight-5, STR_VTELEMCHNS, source, 0);
|
||||
lcd_rect(25, y, BAR_WIDTH+1, barHeight+2);
|
||||
getvalue_t value = getValue(MIXSRC_FIRST_TELEM+source-2);
|
||||
getvalue_t value = getValue(MIXSRC_FIRST_TELEM+source-1);
|
||||
#if LCD_W >= 212
|
||||
putsTelemetryChannel(27+BAR_WIDTH, y+barHeight-6, source-1, value, LEFT);
|
||||
#endif
|
||||
@@ -305,7 +305,7 @@ void menuTelemetryFrsky(uint8_t event)
|
||||
}
|
||||
if (field) {
|
||||
fields_count++;
|
||||
getvalue_t value = getValue(MIXSRC_FIRST_TELEM+field-2);
|
||||
getvalue_t value = getValue(MIXSRC_FIRST_TELEM+field-1);
|
||||
uint8_t att = (i==3 ? NO_UNIT : DBLSIZE|NO_UNIT);
|
||||
#if LCD_W >= 212
|
||||
xcoord_t pos[] = {0, 71, 143, 214};
|
||||
|
||||
@@ -0,0 +1,153 @@
|
||||
/*
|
||||
* Authors (alphabetical order)
|
||||
* - Andre Bernet <bernet.andre@gmail.com>
|
||||
* - Andreas Weitl
|
||||
* - Bertrand Songis <bsongis@gmail.com>
|
||||
* - Bryan J. Rentoul (Gruvin) <gruvin@gmail.com>
|
||||
* - Cameron Weeks <th9xer@gmail.com>
|
||||
* - Erez Raviv
|
||||
* - Gabriel Birkus
|
||||
* - Jean-Pierre Parisy
|
||||
* - Karl Szmutny
|
||||
* - Michael Blandford
|
||||
* - Michal Hlavinka
|
||||
* - Pat Mackenzie
|
||||
* - Philip Moss
|
||||
* - Rob Thomson
|
||||
* - Romolo Manfredini <romolo.manfredini@gmail.com>
|
||||
* - Thomas Husterer
|
||||
*
|
||||
* opentx is based on code named
|
||||
* gruvin9x by Bryan J. Rentoul: http://code.google.com/p/gruvin9x/,
|
||||
* er9x by Erez Raviv: http://code.google.com/p/er9x/,
|
||||
* and the original (and ongoing) project by
|
||||
* Thomas Husterer, th9x: http://code.google.com/p/th9x/
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "../opentx.h"
|
||||
|
||||
#define TEXT_FILENAME_MAXLEN 40
|
||||
#define TEXT_FILE_MAXSIZE 1000
|
||||
|
||||
char s_text_file[TEXT_FILENAME_MAXLEN];
|
||||
char s_text_screen[LCD_LINES-1][LCD_COLS+1];
|
||||
|
||||
void readTextFile(int & lines_count)
|
||||
{
|
||||
FIL file;
|
||||
int result;
|
||||
char c;
|
||||
unsigned int sz;
|
||||
int line_length = 0;
|
||||
int escape = 0;
|
||||
char escape_chars[2];
|
||||
int current_line = 0;
|
||||
|
||||
memset(s_text_screen, 0, sizeof(s_text_screen));
|
||||
|
||||
result = f_open(&file, s_text_file, FA_OPEN_EXISTING | FA_READ);
|
||||
if (result == FR_OK) {
|
||||
for (int i=0; i<TEXT_FILE_MAXSIZE && f_read(&file, &c, 1, &sz)==FR_OK && sz==1 && (lines_count==0 || current_line-s_pgOfs<LCD_LINES-1); i++) {
|
||||
if (c == '\n') {
|
||||
++current_line;
|
||||
line_length = 0;
|
||||
escape = 0;
|
||||
}
|
||||
else if (c!='\r' && current_line>=s_pgOfs && current_line-s_pgOfs<LCD_LINES-1 && line_length<LCD_COLS) {
|
||||
if (c=='\\' && escape==0) {
|
||||
escape = 1;
|
||||
continue;
|
||||
}
|
||||
else if (c!='\\' && escape>0 && escape<3) {
|
||||
escape_chars[escape-1] = c;
|
||||
if (escape == 2 && !strncmp(escape_chars, "up", 2)) {
|
||||
c = '\300';
|
||||
}
|
||||
else if (escape == 2 && !strncmp(escape_chars, "dn", 2)) {
|
||||
c = '\301';
|
||||
}
|
||||
else {
|
||||
escape++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
escape = 0;
|
||||
s_text_screen[current_line-s_pgOfs][line_length++] = c;
|
||||
}
|
||||
}
|
||||
f_close(&file);
|
||||
}
|
||||
|
||||
if (lines_count == 0) {
|
||||
lines_count = current_line;
|
||||
}
|
||||
}
|
||||
|
||||
void menuTextView(uint8_t event)
|
||||
{
|
||||
static int lines_count;
|
||||
|
||||
switch (event) {
|
||||
case EVT_ENTRY:
|
||||
s_pgOfs = 0;
|
||||
lines_count = 0;
|
||||
readTextFile(lines_count);
|
||||
break;
|
||||
|
||||
case EVT_KEY_BREAK(KEY_UP):
|
||||
if (s_pgOfs == 0)
|
||||
break;
|
||||
else
|
||||
s_pgOfs--;
|
||||
// no break;
|
||||
|
||||
case EVT_KEY_BREAK(KEY_DOWN):
|
||||
if (event == EVT_KEY_BREAK(KEY_DOWN)) {
|
||||
if (s_pgOfs+LCD_LINES-1 >= lines_count)
|
||||
break;
|
||||
else
|
||||
++s_pgOfs;
|
||||
}
|
||||
readTextFile(lines_count);
|
||||
break;
|
||||
|
||||
case EVT_KEY_BREAK(KEY_EXIT):
|
||||
popMenu();
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i=0; i<LCD_LINES-1; i++) {
|
||||
lcd_puts(0, i*FH+FH+1, s_text_screen[i]);
|
||||
}
|
||||
|
||||
char *title = s_text_file;
|
||||
#if defined(SIMU)
|
||||
if (!strncmp(title, "./", 2)) title += 2;
|
||||
#else
|
||||
// TODO?
|
||||
#endif
|
||||
lcd_puts(LCD_W/2-strlen(title)*FW/2, 0, title);
|
||||
lcd_invert_line(0);
|
||||
|
||||
if (lines_count > LCD_LINES-1) {
|
||||
displayScrollbar(LCD_W-1, FH, LCD_H-FH, s_pgOfs, lines_count, LCD_LINES-1);
|
||||
}
|
||||
}
|
||||
|
||||
void pushMenuTextView(const char *filename)
|
||||
{
|
||||
if (strlen(filename) < TEXT_FILENAME_MAXLEN) {
|
||||
strcpy(s_text_file, filename);
|
||||
pushMenu(menuTextView);
|
||||
}
|
||||
}
|
||||
+152
-11
@@ -40,6 +40,10 @@ uint8_t displayBuf[DISPLAY_BUF_SIZE];
|
||||
#define DISPLAY_END (displayBuf+DISPLAY_PLAN_SIZE)
|
||||
#define ASSERT_IN_DISPLAY(p) assert((p) >= displayBuf && (p) < DISPLAY_END)
|
||||
|
||||
#if defined(LUA)
|
||||
bool lcd_locked = false;
|
||||
#endif
|
||||
|
||||
void lcd_clear()
|
||||
{
|
||||
memset(displayBuf, 0, sizeof(displayBuf));
|
||||
@@ -251,6 +255,17 @@ void lcd_putcAtt(xcoord_t x, uint8_t y, const unsigned char c, LcdFlags flags)
|
||||
LCD_BYTE_FILTER(p+1, b << ym8, 0);
|
||||
else
|
||||
LCD_BYTE_FILTER(p+1, 0xff, b << ym8);
|
||||
#if defined(CPUARM)
|
||||
if (ym8) {
|
||||
uint8_t *r = p+1 + LCD_W;
|
||||
if (r<DISPLAY_END) {
|
||||
if (inv)
|
||||
LCD_BYTE_FILTER(r, b >> (8-ym8), 0);
|
||||
else
|
||||
LCD_BYTE_FILTER(r, 0xff, b >> (8-ym8));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -458,8 +473,9 @@ void lcd_outdezNAtt(xcoord_t x, uint8_t y, lcdint_t val, LcdFlags flags, uint8_t
|
||||
else {
|
||||
x--;
|
||||
lcd_plot(x, y+6);
|
||||
if ((flags&INVERS) && ((~flags & BLINK) || BLINK_ON_PHASE))
|
||||
if ((flags&INVERS) && ((~flags & BLINK) || BLINK_ON_PHASE)) {
|
||||
lcd_vline(x, y, 8);
|
||||
}
|
||||
x--;
|
||||
}
|
||||
}
|
||||
@@ -583,6 +599,55 @@ void lcd_hline(xcoord_t x, uint8_t y, xcoord_t w, LcdFlags att)
|
||||
lcd_hlineStip(x, y, w, 0xff, att);
|
||||
}
|
||||
|
||||
#if defined(CPUARM)
|
||||
void lcd_line(int x1, int y1, int x2, int y2, LcdFlags att)
|
||||
{
|
||||
int i,dx,dy,sdx,sdy,dxabs,dyabs,x,y,px,py;
|
||||
|
||||
dx=x2-x1; /* the horizontal distance of the line */
|
||||
dy=y2-y1; /* the vertical distance of the line */
|
||||
dxabs=abs(dx);
|
||||
dyabs=abs(dy);
|
||||
sdx=sgn(dx);
|
||||
sdy=sgn(dy);
|
||||
x=dyabs>>1;
|
||||
y=dxabs>>1;
|
||||
px=x1;
|
||||
py=y1;
|
||||
|
||||
// VGA[(py<<8)+(py<<6)+px]=color;
|
||||
|
||||
if (dxabs>=dyabs) /* the line is more horizontal than vertical */
|
||||
{
|
||||
for(i=0;i<dxabs;i++)
|
||||
{
|
||||
y+=dyabs;
|
||||
if (y>=dxabs)
|
||||
{
|
||||
y-=dxabs;
|
||||
py+=sdy;
|
||||
}
|
||||
px+=sdx;
|
||||
lcd_plot(px,py,att);
|
||||
}
|
||||
}
|
||||
else /* the line is more vertical than horizontal */
|
||||
{
|
||||
for(i=0;i<dyabs;i++)
|
||||
{
|
||||
x+=dxabs;
|
||||
if (x>=dyabs)
|
||||
{
|
||||
x-=dyabs;
|
||||
px+=sdx;
|
||||
}
|
||||
py+=sdy;
|
||||
lcd_plot(px,py,att);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CPUM64)
|
||||
void lcd_vlineStip(xcoord_t x, int8_t y, int8_t h, uint8_t pat)
|
||||
{
|
||||
@@ -620,6 +685,11 @@ void lcd_vlineStip(xcoord_t x, int8_t y, int8_t h, uint8_t pat)
|
||||
void lcd_vlineStip(xcoord_t x, int8_t y, int8_t h, uint8_t pat, LcdFlags att)
|
||||
{
|
||||
if (x >= LCD_W) return;
|
||||
#if defined(CPUARM)
|
||||
// should never happen on 9X
|
||||
if (y >= LCD_H) return;
|
||||
#endif
|
||||
|
||||
if (h<0) { y+=h; h=-h; }
|
||||
if (y<0) { h+=y; y=0; }
|
||||
if (y+h > LCD_H) { h = LCD_H - y; }
|
||||
@@ -704,12 +774,12 @@ void lcdDrawTelemetryTopBar()
|
||||
uint8_t att = (g_vbat100mV < g_eeGeneral.vBatWarn ? BLINK : 0);
|
||||
putsVBat(16*FW+2,0,att);
|
||||
if (g_model.timers[0].mode) {
|
||||
att = (timersStates[0].state==TMR_BEEPING ? BLINK : 0);
|
||||
att = (timersStates[0].val<0 ? BLINK : 0);
|
||||
putsTime(22*FW+5*FWNUM+1, 0, timersStates[0].val, att, att);
|
||||
lcd_putsiAtt(18*FW+2, 1, STR_VTELEMCHNS, TELEM_TM1, SMLSIZE);
|
||||
}
|
||||
if (g_model.timers[1].mode) {
|
||||
att = (timersStates[1].state==TMR_BEEPING ? BLINK : 0);
|
||||
att = (timersStates[1].val<0 ? BLINK : 0);
|
||||
putsTime(31*FW+5*FWNUM+1, 0, timersStates[1].val, att, att);
|
||||
lcd_putsiAtt(27*FW+2, 1, STR_VTELEMCHNS, TELEM_TM2, SMLSIZE);
|
||||
}
|
||||
@@ -722,7 +792,7 @@ void lcdDrawTelemetryTopBar()
|
||||
uint8_t att = (g_vbat100mV < g_eeGeneral.vBatWarn ? BLINK : 0);
|
||||
putsVBat(14*FW,0,att);
|
||||
if (g_model.timers[0].mode) {
|
||||
att = (timersStates[0].state==TMR_BEEPING ? BLINK : 0);
|
||||
att = (timersStates[0].val<0 ? BLINK : 0);
|
||||
putsTime(17*FW+5*FWNUM+1, 0, timersStates[0].val, att, att);
|
||||
}
|
||||
lcd_invert_line(0);
|
||||
@@ -828,18 +898,50 @@ void putsStrIdx(xcoord_t x, uint8_t y, const pm_char *str, uint8_t idx, LcdFlags
|
||||
void putsMixerSource(xcoord_t x, uint8_t y, uint8_t idx, LcdFlags att)
|
||||
{
|
||||
#if defined(PCBTARANIS)
|
||||
if (idx < MIXSRC_SW1)
|
||||
lcd_putsiAtt(x, y, STR_VSRCRAW, idx, att);
|
||||
else if (idx < MIXSRC_PPM1)
|
||||
if (idx == 0) {
|
||||
lcd_putsiAtt(x, y, STR_VSRCRAW, 0, att);
|
||||
}
|
||||
else if (idx <= MIXSRC_LAST_INPUT) {
|
||||
lcd_putcAtt(x+2, y+1, 'I', TINSIZE);
|
||||
lcd_filled_rect(x, y, 7, 7);
|
||||
if (ZEXIST(g_model.inputNames[idx-MIXSRC_FIRST_INPUT]))
|
||||
lcd_putsnAtt(x+8, y, g_model.inputNames[idx-MIXSRC_FIRST_INPUT], 4, ZCHAR|att);
|
||||
else
|
||||
lcd_outdezNAtt(x+8, y, idx, att|LEADING0|LEFT, 2);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
else if (idx <= MIXSRC_LAST_LUA) {
|
||||
div_t qr = div(idx-MIXSRC_FIRST_LUA, MAX_SCRIPT_OUTPUTS);
|
||||
#if defined(LUA_MODEL_SCRIPTS)
|
||||
if (qr.quot < MAX_SCRIPTS && qr.rem < scriptInternalData[qr.quot].outputsCount) {
|
||||
lcd_putcAtt(x+2, y+1, '1'+qr.quot, TINSIZE);
|
||||
lcd_filled_rect(x, y, 7, 7);
|
||||
lcd_putsnAtt(x+8, y, scriptInternalData[qr.quot].outputs[qr.rem].name, att & STREXPANDED ? 9 : 4, att);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
putsStrIdx(x, y, "LUA", qr.quot+1, att);
|
||||
lcd_putcAtt(lcdLastPos, y, 'a'+qr.rem, att);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
else if (idx < MIXSRC_SW1)
|
||||
lcd_putsiAtt(x, y, STR_VSRCRAW, idx-MIXSRC_Rud+1, att);
|
||||
else if (idx <= MIXSRC_LAST_CSW)
|
||||
putsSwitches(x, y, SWSRC_SW1+idx-MIXSRC_SW1, att);
|
||||
#else
|
||||
if (idx < MIXSRC_THR)
|
||||
lcd_putsiAtt(x, y, STR_VSRCRAW, idx, att);
|
||||
else if (idx < MIXSRC_PPM1)
|
||||
else if (idx < MIXSRC_FIRST_PPM)
|
||||
putsSwitches(x, y, idx-MIXSRC_THR+1+3*(1/*+EXTRA_3POS*/), att);
|
||||
#endif
|
||||
else if (idx < MIXSRC_CH1)
|
||||
putsStrIdx(x, y, STR_PPM, idx-MIXSRC_PPM1+1, att);
|
||||
putsStrIdx(x, y, STR_PPM, idx-MIXSRC_FIRST_PPM+1, att);
|
||||
else if (idx <= MIXSRC_LAST_CH) {
|
||||
putsStrIdx(x, y, STR_CH, idx-MIXSRC_CH1+1, att);
|
||||
#if defined(PCBTARANIS)
|
||||
@@ -857,9 +959,9 @@ void putsMixerSource(xcoord_t x, uint8_t y, uint8_t idx, LcdFlags att)
|
||||
lcd_putsiAtt(x, y, STR_VTELEMCHNS, idx-MIXSRC_FIRST_TELEM+1, att);
|
||||
}
|
||||
|
||||
void putsChnLetter(xcoord_t x, uint8_t y, uint8_t idx, LcdFlags attr)
|
||||
void putsChnLetter(xcoord_t x, uint8_t y, uint8_t idx, LcdFlags att)
|
||||
{
|
||||
lcd_putsiAtt(x, y, STR_RETA123, idx-1, attr);
|
||||
lcd_putsiAtt(x, y, STR_RETA123, idx-1, att);
|
||||
}
|
||||
|
||||
void putsModelName(xcoord_t x, uint8_t y, char *name, uint8_t id, LcdFlags att)
|
||||
@@ -933,6 +1035,44 @@ void putsFlightPhase(xcoord_t x, uint8_t y, int8_t idx, LcdFlags att)
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
void putsCurveRef(xcoord_t x, uint8_t y, CurveRef &curve, LcdFlags att)
|
||||
{
|
||||
if (curve.value != 0) {
|
||||
switch (curve.type) {
|
||||
case CURVE_REF_DIFF:
|
||||
lcd_putcAtt(x, y, 'D', att);
|
||||
lcd_outdezAtt(x+FW, y, curve.value, LEFT|att);
|
||||
break;
|
||||
|
||||
case CURVE_REF_EXPO:
|
||||
lcd_putcAtt(x, y, 'E', att);
|
||||
lcd_outdezAtt(x+FW, y, curve.value, LEFT|att);
|
||||
break;
|
||||
|
||||
case CURVE_REF_FUNC:
|
||||
lcd_putsiAtt(x, y, STR_VCURVEFUNC, curve.value, att);
|
||||
break;
|
||||
|
||||
case CURVE_REF_CUSTOM:
|
||||
putsCurve(x, y, curve.value, att);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void putsCurve(xcoord_t x, uint8_t y, int8_t idx, LcdFlags att)
|
||||
{
|
||||
if (idx == 0) return lcd_putsiAtt(x, y, STR_MMMINV, 0, att);
|
||||
|
||||
if (idx < 0) {
|
||||
lcd_putcAtt(x-1*FW, y, '!', att);
|
||||
idx = -idx;
|
||||
}
|
||||
|
||||
putsStrIdx(x, y, STR_CV, idx, att);
|
||||
}
|
||||
#else
|
||||
void putsCurve(xcoord_t x, uint8_t y, int8_t idx, LcdFlags att)
|
||||
{
|
||||
if (idx < 0) {
|
||||
@@ -944,6 +1084,7 @@ void putsCurve(xcoord_t x, uint8_t y, int8_t idx, LcdFlags att)
|
||||
else
|
||||
putsStrIdx(x, y, STR_CV, idx-CURVE_BASE+1, att);
|
||||
}
|
||||
#endif
|
||||
|
||||
void putsTmrMode(xcoord_t x, uint8_t y, int8_t mode, LcdFlags att)
|
||||
{
|
||||
|
||||
@@ -57,16 +57,13 @@
|
||||
#define lcdint_t int16_t
|
||||
#endif
|
||||
|
||||
#if LCD_H > 64
|
||||
#define LCD_LINES 9
|
||||
#else
|
||||
#define LCD_LINES 8
|
||||
#endif
|
||||
|
||||
#define FW 6
|
||||
#define FWNUM 5
|
||||
#define FH 8
|
||||
|
||||
#define LCD_LINES (LCD_H/FH)
|
||||
#define LCD_COLS (LCD_W/FW)
|
||||
|
||||
/* lcd common flags */
|
||||
#define BLINK 0x01
|
||||
|
||||
@@ -85,8 +82,8 @@
|
||||
/* lcd puts flags */
|
||||
/* no 0x80 here because of "GV"1 which is aligned LEFT */
|
||||
/* no 0x10 here because of "MODEL"01 which uses LEADING0 */
|
||||
#define STRCONDENSED 0x10 /* means that THRm will be displayed as THR */
|
||||
#define BSS 0x20
|
||||
#define STRCONDENSED 0x40 /* means that THRm will be displayed as THR */
|
||||
#define ZCHAR 0x80
|
||||
|
||||
/* lcd outdez flags */
|
||||
@@ -121,9 +118,9 @@
|
||||
#endif
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
#define GREY(x) ((x) * 0x1000)
|
||||
#define GREY_DEFAULT GREY(11)
|
||||
#define GREY_MASK(x) ((x) & 0xF000)
|
||||
#define GREY(x) ((x) * 0x1000)
|
||||
#define GREY_DEFAULT GREY(11)
|
||||
#define GREY_MASK(x) ((x) & 0xF000)
|
||||
#endif
|
||||
|
||||
#if defined(CPUARM)
|
||||
@@ -172,6 +169,9 @@ void putsModelName(xcoord_t x, uint8_t y, char *name, uint8_t id, LcdFlags att);
|
||||
void putsSwitches(xcoord_t x, uint8_t y, int8_t swtch, LcdFlags att=0);
|
||||
void putsMixerSource(xcoord_t x, uint8_t y, uint8_t idx, LcdFlags att=0);
|
||||
void putsFlightPhase(xcoord_t x, uint8_t y, int8_t idx, LcdFlags att=0);
|
||||
#if defined(PCBTARANIS)
|
||||
void putsCurveRef(xcoord_t x, uint8_t y, CurveRef &curve, LcdFlags att);
|
||||
#endif
|
||||
void putsCurve(xcoord_t x, uint8_t y, int8_t idx, LcdFlags att=0);
|
||||
void putsTmrMode(xcoord_t x, uint8_t y, int8_t mode, LcdFlags att);
|
||||
void putsTrimMode(xcoord_t x, uint8_t y, uint8_t phase, uint8_t idx, LcdFlags att);
|
||||
@@ -206,6 +206,9 @@ void lcd_vline(xcoord_t x, int8_t y, int8_t h);
|
||||
#else
|
||||
void lcd_vlineStip(xcoord_t x, int8_t y, int8_t h, uint8_t pat, LcdFlags att=0);
|
||||
#endif
|
||||
#if defined(CPUARM)
|
||||
void lcd_line(int x1, int y1, int x2, int y2, LcdFlags att=0);
|
||||
#endif
|
||||
|
||||
void lcd_rect(xcoord_t x, uint8_t y, xcoord_t w, uint8_t h, uint8_t pat=SOLID, LcdFlags att=0);
|
||||
void lcd_filled_rect(xcoord_t x, int8_t y, xcoord_t w, uint8_t h, uint8_t pat=SOLID, LcdFlags att=0);
|
||||
@@ -238,11 +241,11 @@ void lcdSetRefVolt(unsigned char val);
|
||||
void lcdInit();
|
||||
void lcd_clear();
|
||||
void lcdSetContrast();
|
||||
|
||||
void lcdRefresh();
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
const pm_char * bmpLoad(uint8_t *dest, const char *filename, const xcoord_t width, const uint8_t height);
|
||||
typedef uint8_t * bmp_ptr_t;
|
||||
const pm_char * bmpLoad(bmp_ptr_t &dest, const char *filename, const xcoord_t width, const uint8_t height);
|
||||
#endif
|
||||
|
||||
#define BLINK_ON_PHASE (g_blinkTmr10ms & (1<<6))
|
||||
@@ -252,6 +255,13 @@ void lcdRefresh();
|
||||
extern uint8_t lcd_buf[DISPLAY_BUF_SIZE];
|
||||
#endif
|
||||
|
||||
#if defined(LUA)
|
||||
extern bool lcd_locked;
|
||||
#define LCD_LOCKED() lcd_locked
|
||||
#else
|
||||
#define LCD_LOCKED() 0
|
||||
#endif
|
||||
|
||||
#define LCD_BYTE_FILTER_PLAN(p, keep, add) *(p) = (*(p) & (keep)) | (add)
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
|
||||
+1
-1
@@ -149,7 +149,7 @@ const pm_char * openLogs()
|
||||
#if defined(PCBTARANIS)
|
||||
f_puts("Rud,Ele,Thr,Ail,S1,S2,LS,RS,SA,SB,SC,SD,SE,SF,SG,SH\n", &g_oLogFile);
|
||||
#else
|
||||
f_puts("Rud,Ele,Thr,Ail,P1,P2,P3,THR,RUD,ELE,3POS,AIL,GEA,TRN\n", &g_oLogFile);
|
||||
f_puts("Rud,Ele,Thr,Ail,P1,P2,P3,THR,RUD,ELE,ID0,ID1,ID2,AIL,GEA,TRN\n", &g_oLogFile);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -48,6 +48,18 @@ lcdint_t applyChannelRatio(uint8_t channel, lcdint_t val)
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
double gpsToDouble(bool neg, int16_t bp, int16_t ap)
|
||||
{
|
||||
double result = ap;
|
||||
result /= 10000;
|
||||
result += (bp % 100);
|
||||
result /= 60;
|
||||
result += (bp / 100);
|
||||
return neg?-result:result;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(FRSKY_HUB)
|
||||
void extractLatitudeLongitude(uint32_t * latitude, uint32_t * longitude)
|
||||
{
|
||||
@@ -58,8 +70,17 @@ void extractLatitudeLongitude(uint32_t * latitude, uint32_t * longitude)
|
||||
*longitude = ((uint32_t)(qr.quot) * 1000000) + (((uint32_t)(qr.rem) * 10000 + frskyData.hub.gpsLongitude_ap) * 5) / 3;
|
||||
}
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
double pilotLatitude;
|
||||
double pilotLongitude;
|
||||
#endif
|
||||
|
||||
void getGpsPilotPosition()
|
||||
{
|
||||
#if defined(PCBTARANIS)
|
||||
pilotLatitude = gpsToDouble(frskyData.hub.gpsLatitudeNS=='S', frskyData.hub.gpsLatitude_bp, frskyData.hub.gpsLatitude_ap);
|
||||
pilotLongitude = gpsToDouble(frskyData.hub.gpsLongitudeEW=='W', frskyData.hub.gpsLongitude_bp, frskyData.hub.gpsLongitude_ap);
|
||||
#endif
|
||||
extractLatitudeLongitude(&frskyData.hub.pilotLatitude, &frskyData.hub.pilotLongitude);
|
||||
uint32_t lat = frskyData.hub.pilotLatitude / 10000;
|
||||
uint32_t angle2 = (lat*lat) / 10000;
|
||||
|
||||
+253
-131
@@ -52,65 +52,90 @@
|
||||
#define BEEP_VAL ( (g_eeGeneral.warnOpts & WARN_BVAL_BIT) >>3 )
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
#define EEPROM_VER 215
|
||||
#define EEPROM_VER 216
|
||||
#elif defined(PCBSKY9X)
|
||||
#define EEPROM_VER 215
|
||||
#define EEPROM_VER 216
|
||||
#elif defined(CPUM2560) || defined(CPUM2561)
|
||||
#define EEPROM_VER 214
|
||||
#elif defined(CPUM128)
|
||||
#define EEPROM_VER 215
|
||||
#elif defined(CPUM128)
|
||||
#define EEPROM_VER 216
|
||||
#else
|
||||
#define EEPROM_VER 213
|
||||
#define EEPROM_VER 214
|
||||
#endif
|
||||
|
||||
#ifndef PACK
|
||||
#define PACK( __Declaration__ ) __Declaration__ __attribute__((__packed__))
|
||||
#endif
|
||||
|
||||
#if defined(CPUARM)
|
||||
#define MAX_MODELS 60
|
||||
#define NUM_CHNOUT 32 // number of real output channels CH1-CH32
|
||||
#define MAX_PHASES 9
|
||||
#define MAX_MIXERS 64
|
||||
#define MAX_EXPOS 32
|
||||
#define NUM_CSW 32 // number of custom switches
|
||||
#define NUM_CFN 32 // number of functions assigned to switches
|
||||
#if defined(PCBTARANIS)
|
||||
#define MAX_MODELS 60
|
||||
#define NUM_CHNOUT 32 // number of real output channels CH1-CH32
|
||||
#define MAX_PHASES 9
|
||||
#define MAX_MIXERS 64
|
||||
#define MAX_EXPOS 64
|
||||
#define NUM_CSW 32 // number of custom switches
|
||||
#define NUM_CFN 32 // number of functions assigned to switches
|
||||
#define MAX_SCRIPTS 3
|
||||
#define MAX_INPUTS 32
|
||||
#elif defined(CPUARM)
|
||||
#define MAX_MODELS 60
|
||||
#define NUM_CHNOUT 32 // number of real output channels CH1-CH32
|
||||
#define MAX_PHASES 9
|
||||
#define MAX_MIXERS 64
|
||||
#define MAX_EXPOS 32
|
||||
#define NUM_CSW 32 // number of custom switches
|
||||
#define NUM_CFN 32 // number of functions assigned to switches
|
||||
#elif defined(CPUM2560) || defined(CPUM2561)
|
||||
#define MAX_MODELS 30
|
||||
#define NUM_CHNOUT 16 // number of real output channels CH1-CH16
|
||||
#define MAX_PHASES 6
|
||||
#define MAX_MIXERS 32
|
||||
#define MAX_EXPOS 16
|
||||
#define NUM_CSW 15 // number of custom switches
|
||||
#define NUM_CFN 24 // number of functions assigned to switches
|
||||
#define MAX_MODELS 30
|
||||
#define NUM_CHNOUT 16 // number of real output channels CH1-CH16
|
||||
#define MAX_PHASES 6
|
||||
#define MAX_MIXERS 32
|
||||
#define MAX_EXPOS 16
|
||||
#define NUM_CSW 15 // number of custom switches
|
||||
#define NUM_CFN 24 // number of functions assigned to switches
|
||||
#elif defined(CPUM128)
|
||||
#define MAX_MODELS 30
|
||||
#define NUM_CHNOUT 16 // number of real output channels CH1-CH16
|
||||
#define MAX_PHASES 5
|
||||
#define MAX_MIXERS 32
|
||||
#define MAX_EXPOS 14
|
||||
#define NUM_CSW 15 // number of custom switches
|
||||
#define NUM_CFN 24 // number of functions assigned to switches
|
||||
#define MAX_MODELS 30
|
||||
#define NUM_CHNOUT 16 // number of real output channels CH1-CH16
|
||||
#define MAX_PHASES 5
|
||||
#define MAX_MIXERS 32
|
||||
#define MAX_EXPOS 14
|
||||
#define NUM_CSW 15 // number of custom switches
|
||||
#define NUM_CFN 24 // number of functions assigned to switches
|
||||
#else
|
||||
#define MAX_MODELS 16
|
||||
#define NUM_CHNOUT 16 // number of real output channels CH1-CH16
|
||||
#define MAX_PHASES 5
|
||||
#define MAX_MIXERS 32
|
||||
#define MAX_EXPOS 14
|
||||
#define NUM_CSW 12 // number of custom switches
|
||||
#define NUM_CFN 16 // number of functions assigned to switches
|
||||
#define MAX_MODELS 16
|
||||
#define NUM_CHNOUT 16 // number of real output channels CH1-CH16
|
||||
#define MAX_PHASES 5
|
||||
#define MAX_MIXERS 32
|
||||
#define MAX_EXPOS 14
|
||||
#define NUM_CSW 12 // number of custom switches
|
||||
#define NUM_CFN 16 // number of functions assigned to switches
|
||||
#endif
|
||||
|
||||
#define MAX_TIMERS 2
|
||||
#define MAX_TIMERS 2
|
||||
|
||||
#if defined(CPUARM)
|
||||
#if defined(PCBTARANIS)
|
||||
enum CurveType {
|
||||
CURVE_TYPE_STANDARD,
|
||||
CURVE_TYPE_CUSTOM,
|
||||
CURVE_TYPE_LAST = CURVE_TYPE_CUSTOM
|
||||
};
|
||||
PACK(typedef struct t_CurveInfo {
|
||||
uint8_t type:3;
|
||||
uint8_t smooth:1;
|
||||
uint8_t spare:4;
|
||||
int8_t points;
|
||||
}) CurveInfo;
|
||||
#define MAX_CURVES 32
|
||||
#define NUM_POINTS 512
|
||||
#define CURVDATA CurveInfo
|
||||
#elif defined(CPUARM)
|
||||
#define MAX_CURVES 16
|
||||
#define NUM_POINTS 512
|
||||
#define CURVTYPE int16_t
|
||||
#define CURVDATA int16_t
|
||||
#else
|
||||
#define MAX_CURVES 8
|
||||
#define NUM_POINTS (112-MAX_CURVES)
|
||||
#define CURVTYPE int8_t
|
||||
#define CURVDATA int8_t
|
||||
#endif
|
||||
|
||||
#if defined(PCBTARANIS) || defined(PCBSKY9X)
|
||||
@@ -122,8 +147,14 @@
|
||||
typedef int16_t gvar_t;
|
||||
|
||||
#if !defined(PCBSTD)
|
||||
typedef char gvar_name_t[6];
|
||||
#define GVAR_MAX 1024
|
||||
#define LEN_GVAR_NAME 6
|
||||
#define GVAR_MAX 1024
|
||||
#define GVAR_LIMIT 500
|
||||
PACK(typedef struct {
|
||||
char name[LEN_GVAR_NAME];
|
||||
uint8_t popup:1;
|
||||
uint8_t spare:7;
|
||||
}) global_gvar_t;
|
||||
#endif
|
||||
|
||||
#define RESERVE_RANGE_FOR_GVARS 10
|
||||
@@ -139,8 +170,12 @@ typedef int16_t gvar_t;
|
||||
#define MODEL_GVARS_DATA
|
||||
#define PHASE_GVARS_DATA
|
||||
#else
|
||||
#define MAX_GVARS 5
|
||||
#define MODEL_GVARS_DATA gvar_name_t gvarsNames[MAX_GVARS];
|
||||
#if defined(CPUARM)
|
||||
#define MAX_GVARS 9
|
||||
#else
|
||||
#define MAX_GVARS 5
|
||||
#endif
|
||||
#define MODEL_GVARS_DATA global_gvar_t gvars[MAX_GVARS];
|
||||
#define PHASE_GVARS_DATA gvar_t gvars[MAX_GVARS]
|
||||
#define GVAR_VALUE(x, p) g_model.phaseData[p].gvars[x]
|
||||
#endif
|
||||
@@ -224,26 +259,34 @@ PACK(typedef struct t_ModuleData {
|
||||
|
||||
#define SET_DEFAULT_PPM_FRAME_LENGTH(idx) g_model.moduleData[idx].ppmFrameLength = 4 * max((int8_t)0, g_model.moduleData[idx].channelsCount)
|
||||
|
||||
#define MAX_SCRIPT_INPUTS 10
|
||||
#define MAX_SCRIPT_OUTPUTS 6
|
||||
PACK(typedef struct t_ScriptData {
|
||||
char file[10];
|
||||
char name[10];
|
||||
int8_t inputs[MAX_SCRIPT_INPUTS];
|
||||
}) ScriptData;
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
enum ModuleIndex {
|
||||
INTERNAL_MODULE,
|
||||
EXTERNAL_MODULE,
|
||||
TRAINER_MODULE
|
||||
};
|
||||
#define MODELDATA_BITMAP char bitmap[LEN_BITMAP_NAME];
|
||||
#define MODELDATA_EXTRA uint8_t externalModule; uint8_t trainerMode; ModuleData moduleData[NUM_MODULES+1]; char curveNames[MAX_CURVES][6];
|
||||
#define LIMITDATA_EXTRA char name[LEN_CHANNEL_NAME];
|
||||
#define swstate_t uint16_t
|
||||
enum ModuleIndex {
|
||||
INTERNAL_MODULE,
|
||||
EXTERNAL_MODULE,
|
||||
TRAINER_MODULE
|
||||
};
|
||||
#define MODELDATA_BITMAP char bitmap[LEN_BITMAP_NAME];
|
||||
#define MODELDATA_EXTRA uint8_t externalModule; uint8_t trainerMode; ModuleData moduleData[NUM_MODULES+1]; char curveNames[MAX_CURVES][6]; ScriptData scriptsData[MAX_SCRIPTS]; char inputNames[MAX_INPUTS][4];
|
||||
#define LIMITDATA_EXTRA char name[LEN_CHANNEL_NAME]; int8_t curve;
|
||||
#define swstate_t uint16_t
|
||||
#elif defined(PCBSKY9X)
|
||||
#define MODELDATA_BITMAP
|
||||
#define MODELDATA_EXTRA ModuleData moduleData[NUM_MODULES];
|
||||
#define LIMITDATA_EXTRA
|
||||
#define swstate_t uint8_t
|
||||
#define MODELDATA_BITMAP
|
||||
#define MODELDATA_EXTRA ModuleData moduleData[NUM_MODULES];
|
||||
#define LIMITDATA_EXTRA
|
||||
#define swstate_t uint8_t
|
||||
#else
|
||||
#define MODELDATA_BITMAP
|
||||
#define MODELDATA_EXTRA
|
||||
#define LIMITDATA_EXTRA
|
||||
#define swstate_t uint8_t
|
||||
#define MODELDATA_BITMAP
|
||||
#define MODELDATA_EXTRA
|
||||
#define LIMITDATA_EXTRA
|
||||
#define swstate_t uint8_t
|
||||
#endif
|
||||
|
||||
enum BacklightMode {
|
||||
@@ -255,9 +298,9 @@ enum BacklightMode {
|
||||
};
|
||||
|
||||
#if defined(FSPLASH) || defined(XSPLASH)
|
||||
#define SPLASH_MODE uint8_t splashMode:3
|
||||
#define SPLASH_MODE uint8_t splashMode:3
|
||||
#else
|
||||
#define SPLASH_MODE uint8_t splashMode:1; uint8_t spare4:2
|
||||
#define SPLASH_MODE uint8_t splashMode:1; uint8_t spare4:2
|
||||
#endif
|
||||
|
||||
#define ALTERNATE_VIEW 0x10
|
||||
@@ -306,35 +349,59 @@ PACK(typedef struct t_EEGeneral {
|
||||
|
||||
EXTRA_GENERAL_FIELDS
|
||||
|
||||
swstate_t switchUnlockStates;
|
||||
|
||||
}) EEGeneral;
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
#define LEN_MODEL_NAME 12
|
||||
#define LEN_BITMAP_NAME 10
|
||||
#define LEN_EXPOMIX_NAME 8
|
||||
#define LEN_FP_NAME 10
|
||||
#define LEN_CHANNEL_NAME 6
|
||||
#define LEN_MODEL_NAME 12
|
||||
#define LEN_BITMAP_NAME 10
|
||||
#define LEN_EXPOMIX_NAME 8
|
||||
#define LEN_FP_NAME 10
|
||||
#define LEN_CHANNEL_NAME 6
|
||||
#elif defined(PCBSKY9X)
|
||||
#define LEN_MODEL_NAME 10
|
||||
#define LEN_EXPOMIX_NAME 6
|
||||
#define LEN_FP_NAME 6
|
||||
#define LEN_MODEL_NAME 10
|
||||
#define LEN_EXPOMIX_NAME 6
|
||||
#define LEN_FP_NAME 6
|
||||
#else
|
||||
#define LEN_MODEL_NAME 10
|
||||
#define LEN_FP_NAME 6
|
||||
#define LEN_MODEL_NAME 10
|
||||
#define LEN_FP_NAME 6
|
||||
#endif
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
enum CurveRefType {
|
||||
CURVE_REF_DIFF,
|
||||
CURVE_REF_EXPO,
|
||||
CURVE_REF_FUNC,
|
||||
CURVE_REF_CUSTOM
|
||||
};
|
||||
PACK(typedef struct t_CurveRef {
|
||||
uint8_t type;
|
||||
int8_t value;
|
||||
}) CurveRef;
|
||||
#else
|
||||
#define MODE_DIFFERENTIAL 0
|
||||
#define MODE_EXPO 0
|
||||
#define MODE_CURVE 1
|
||||
#endif
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
PACK(typedef struct t_ExpoData {
|
||||
uint8_t mode; // 0=end, 1=pos, 2=neg, 3=both
|
||||
uint8_t srcRaw;
|
||||
uint16_t scale;
|
||||
uint8_t chn;
|
||||
int8_t swtch;
|
||||
uint16_t phases;
|
||||
int8_t weight;
|
||||
uint8_t curveMode;
|
||||
int8_t carryTrim;
|
||||
char name[LEN_EXPOMIX_NAME];
|
||||
int8_t offset;
|
||||
CurveRef curve;
|
||||
uint8_t spare[2];
|
||||
int8_t curveParam;
|
||||
}) ExpoData;
|
||||
#define MIN_EXPO_WEIGHT -100
|
||||
#define EXPO_VALID(ed) ((ed)->srcRaw)
|
||||
#define EXPO_MODE_ENABLE(ed, v) (true)
|
||||
#elif defined(CPUARM)
|
||||
PACK(typedef struct t_ExpoData {
|
||||
uint8_t mode; // 0=end, 1=pos, 2=neg, 3=both
|
||||
@@ -346,6 +413,9 @@ PACK(typedef struct t_ExpoData {
|
||||
char name[LEN_EXPOMIX_NAME];
|
||||
int8_t curveParam;
|
||||
}) ExpoData;
|
||||
#define MIN_EXPO_WEIGHT 0
|
||||
#define EXPO_VALID(ed) ((ed)->mode)
|
||||
#define EXPO_MODE_ENABLE(ed, v) ((v<0 && (ed->mode&1)) || (v>=0 && (ed->mode&2)))
|
||||
#elif defined(CPUM2560) || defined(CPUM2561)
|
||||
PACK(typedef struct t_ExpoData {
|
||||
uint8_t mode:2; // 0=end, 1=pos, 2=neg, 3=both
|
||||
@@ -357,6 +427,9 @@ PACK(typedef struct t_ExpoData {
|
||||
uint8_t weight;
|
||||
int8_t curveParam;
|
||||
}) ExpoData;
|
||||
#define MIN_EXPO_WEIGHT 0
|
||||
#define EXPO_VALID(ed) ((ed)->mode)
|
||||
#define EXPO_MODE_ENABLE(ed, v) ((v<0 && (ed->mode&1)) || (v>=0 && (ed->mode&2)))
|
||||
#else
|
||||
PACK(typedef struct t_ExpoData {
|
||||
uint8_t mode:2; // 0=end, 1=pos, 2=neg, 3=both
|
||||
@@ -367,11 +440,32 @@ PACK(typedef struct t_ExpoData {
|
||||
uint8_t weight; // One spare bit here (used for GVARS)
|
||||
int8_t curveParam;
|
||||
}) ExpoData;
|
||||
#define MIN_EXPO_WEIGHT 0
|
||||
#define EXPO_VALID(ed) ((ed)->mode)
|
||||
#define EXPO_MODE_ENABLE(ed, v) ((v<0 && (ed->mode&1)) || (v>=0 && (ed->mode&2)))
|
||||
#endif
|
||||
|
||||
#if defined(CPUARM)
|
||||
#define limit_min_max_t int16_t
|
||||
#define LIMIT_MAX(lim) (GV_IS_GV_VALUE(lim->max+1000, 0, 1250) ? GET_GVAR(lim->max+1000, 0, 125, s_perout_flight_phase)*10 : lim->max+1000)
|
||||
#define LIMIT_MIN(lim) (GV_IS_GV_VALUE(lim->min-1000, -1250, 0) ? GET_GVAR(lim->min-1000, -125, 0, s_perout_flight_phase)*10 : lim->min-1000)
|
||||
#define LIMIT_OFS(lim) (GV_IS_GV_VALUE(lim->offset, -1000, 1000) ? GET_GVAR(lim->offset, -100, 100, s_perout_flight_phase)*10 : lim->offset)
|
||||
#define LIMIT_MAX_RESX(lim) calc1000toRESX(LIMIT_MAX(lim))
|
||||
#define LIMIT_MIN_RESX(lim) calc1000toRESX(LIMIT_MIN(lim))
|
||||
#define LIMIT_OFS_RESX(lim) calc1000toRESX(LIMIT_OFS(lim))
|
||||
#else
|
||||
#define limit_min_max_t int8_t
|
||||
#define LIMIT_MAX(lim) (lim->max+100)
|
||||
#define LIMIT_MIN(lim) (lim->min-100)
|
||||
#define LIMIT_OFS(lim) (lim->offset)
|
||||
#define LIMIT_MAX_RESX(lim) calc100toRESX(LIMIT_MAX(lim))
|
||||
#define LIMIT_MIN_RESX(lim) calc100toRESX(LIMIT_MIN(lim))
|
||||
#define LIMIT_OFS_RESX(lim) calc1000toRESX(LIMIT_OFS(lim))
|
||||
#endif
|
||||
|
||||
PACK(typedef struct t_LimitData {
|
||||
int8_t min;
|
||||
int8_t max;
|
||||
limit_min_max_t min;
|
||||
limit_min_max_t max;
|
||||
int8_t ppmCenter;
|
||||
int16_t offset:14;
|
||||
uint16_t symetrical:1;
|
||||
@@ -392,10 +486,6 @@ PACK(typedef struct t_LimitData {
|
||||
#define MLTPX_MUL 1
|
||||
#define MLTPX_REP 2
|
||||
|
||||
#define MODE_DIFFERENTIAL 0
|
||||
#define MODE_EXPO 0
|
||||
#define MODE_CURVE 1
|
||||
|
||||
#if defined(CPUARM)
|
||||
#define DELAY_STEP 10
|
||||
#define SLOW_STEP 10
|
||||
@@ -405,14 +495,10 @@ PACK(typedef struct t_LimitData {
|
||||
PACK(typedef struct t_MixData {
|
||||
uint8_t destCh;
|
||||
uint16_t phases;
|
||||
uint8_t curveMode:1; // O=curve, 1=differential
|
||||
uint8_t noExpo:1;
|
||||
int8_t carryTrim:3;
|
||||
uint8_t mltpx:2; // multiplex method: 0 means +=, 1 means *=, 2 means :=
|
||||
uint8_t spare1:1;
|
||||
uint8_t mltpx; // multiplex method: 0 means +=, 1 means *=, 2 means :=
|
||||
int16_t weight;
|
||||
int8_t swtch;
|
||||
int8_t curveParam;
|
||||
CurveRef curve;
|
||||
uint8_t mixWarn:4; // mixer warning
|
||||
uint8_t srcVariant:4;
|
||||
uint8_t delayUp;
|
||||
@@ -422,13 +508,13 @@ PACK(typedef struct t_MixData {
|
||||
uint8_t srcRaw;
|
||||
int16_t offset;
|
||||
char name[LEN_EXPOMIX_NAME];
|
||||
uint8_t spare2[2];
|
||||
uint8_t spare[2];
|
||||
}) MixData;
|
||||
#else
|
||||
PACK(typedef struct t_MixData {
|
||||
uint8_t destCh;
|
||||
uint16_t phases;
|
||||
uint8_t curveMode:1; // O=curve, 1=differential
|
||||
uint8_t curveMode:1;
|
||||
uint8_t noExpo:1;
|
||||
int8_t carryTrim:3;
|
||||
uint8_t mltpx:2; // multiplex method: 0 means +=, 1 means *=, 2 means :=
|
||||
@@ -554,6 +640,7 @@ PACK( union u_int8int16_t {
|
||||
#define MAX_CSW_DURATION 120 /*60s*/
|
||||
#define MAX_CSW_DELAY 120 /*60s*/
|
||||
#define MAX_CSW_ANDSW MAX_SWITCH
|
||||
typedef int16_t csw_telemetry_value_t;
|
||||
PACK(typedef struct t_CustomSwData { // Custom Switches data
|
||||
int16_t v1;
|
||||
int16_t v2;
|
||||
@@ -563,6 +650,7 @@ PACK(typedef struct t_CustomSwData { // Custom Switches data
|
||||
int8_t andsw;
|
||||
}) CustomSwData;
|
||||
#else
|
||||
typedef uint8_t csw_telemetry_value_t;
|
||||
#define MAX_CSW_ANDSW 15
|
||||
PACK(typedef struct t_CustomSwData { // Custom Switches data
|
||||
int8_t v1; //input
|
||||
@@ -621,9 +709,9 @@ enum Functions {
|
||||
};
|
||||
|
||||
#if defined(VOICE)
|
||||
#define HAS_REPEAT_PARAM() (CFN_FUNC(sd) == FUNC_PLAY_SOUND || (CFN_FUNC(sd) >= FUNC_PLAY_TRACK && CFN_FUNC(sd) <= FUNC_PLAY_VALUE))
|
||||
#define HAS_REPEAT_PARAM(sd) (CFN_FUNC(sd) == FUNC_PLAY_SOUND || (CFN_FUNC(sd) >= FUNC_PLAY_TRACK && CFN_FUNC(sd) <= FUNC_PLAY_VALUE))
|
||||
#else
|
||||
#define HAS_REPEAT_PARAM() (CFN_FUNC(sd) == FUNC_PLAY_SOUND)
|
||||
#define HAS_REPEAT_PARAM(sd) (CFN_FUNC(sd) == FUNC_PLAY_SOUND)
|
||||
#endif
|
||||
|
||||
enum ResetFunctionParam {
|
||||
@@ -670,15 +758,18 @@ PACK(typedef struct t_CustomFnData { // Function Switches data
|
||||
uint8_t mode:2;
|
||||
uint8_t active:6;
|
||||
}) CustomFnData;
|
||||
#define CFN_FUNC(p) ((p)->func)
|
||||
#define CFN_ACTIVE(p) ((p)->active)
|
||||
#define CFN_CH_NUMBER(p) (CFN_FUNC(p))
|
||||
#define CFN_PLAY_REPEAT(p) ((p)->active)
|
||||
#define CFN_GVAR_MODE(p) ((p)->mode)
|
||||
#define CFN_PARAM(p) ((p)->param.composite.val)
|
||||
#define CFN_RESET(p) { p->active = 0; memset(&(p)->param, 0, sizeof((p)->param)); }
|
||||
#define CFN_EMPTY(p) (!(p)->swtch)
|
||||
#define CFN_FUNC(p) ((p)->func)
|
||||
#define CFN_ACTIVE(p) ((p)->active)
|
||||
#define CFN_CH_NUMBER(p) (CFN_FUNC(p))
|
||||
#define CFN_PLAY_REPEAT(p) ((p)->active)
|
||||
#define CFN_PLAY_REPEAT_MUL 1
|
||||
#define CFN_PLAY_REPEAT_NOSTART 0b111111
|
||||
#define CFN_GVAR_MODE(p) ((p)->mode)
|
||||
#define CFN_PARAM(p) ((p)->param.composite.val)
|
||||
#define CFN_RESET(p) (p->active = 0, memset(&(p)->param, 0, sizeof((p)->param)))
|
||||
#else
|
||||
PACK(typedef struct t_CustomFnData { // Function Switches data
|
||||
PACK(typedef struct t_CustomFnData {
|
||||
int8_t swtch; // input
|
||||
union {
|
||||
struct {
|
||||
@@ -699,13 +790,14 @@ PACK(typedef struct t_CustomFnData { // Function Switches data
|
||||
} internal;
|
||||
uint8_t param;
|
||||
}) CustomFnData;
|
||||
#define CFN_FUNC(p) ((p)->internal.func_param.func)
|
||||
#define CFN_ACTIVE(p) ((p)->internal.func_param_enable.active)
|
||||
#define CFN_CH_NUMBER(p) ((p)->internal.func_safety.func)
|
||||
#define CFN_PLAY_REPEAT(p) ((p)->internal.func_param.param)
|
||||
#define CFN_GVAR_MODE(p) ((p)->internal.func_param_enable.param)
|
||||
#define CFN_PARAM(p) ((p)->param)
|
||||
#define CFN_RESET(p) {(p)->internal.func_param_enable.active = 0; CFN_PARAM(p) = 0;}
|
||||
#define CFN_FUNC(p) ((p)->internal.func_param.func)
|
||||
#define CFN_ACTIVE(p) ((p)->internal.func_param_enable.active)
|
||||
#define CFN_CH_NUMBER(p) ((p)->internal.func_safety.func)
|
||||
#define CFN_PLAY_REPEAT(p) ((p)->internal.func_param.param)
|
||||
#define CFN_PLAY_REPEAT_MUL 10
|
||||
#define CFN_GVAR_MODE(p) ((p)->internal.func_param_enable.param)
|
||||
#define CFN_PARAM(p) ((p)->param)
|
||||
#define CFN_RESET(p) ((p)->internal.func_param_enable.active = 0, CFN_PARAM(p) = 0)
|
||||
#endif
|
||||
|
||||
enum TelemetryUnit {
|
||||
@@ -791,6 +883,8 @@ enum TelemetrySource {
|
||||
TELEM_MAX_T2,
|
||||
TELEM_MAX_SPEED,
|
||||
TELEM_MAX_DIST,
|
||||
// TODO TELEM_MIN_CELL,
|
||||
// TODO TELEM_MIN_VFAS,
|
||||
TELEM_MAX_CURRENT,
|
||||
TELEM_MAX_POWER,
|
||||
TELEM_ACC,
|
||||
@@ -874,7 +968,8 @@ enum FrskySource {
|
||||
PACK(typedef struct t_FrSkyData {
|
||||
FrSkyChannelData channels[2];
|
||||
uint8_t usrProto; // Protocol in FrSky user data, 0=None, 1=FrSky hub, 2=WS HowHigh, 3=Halcyon
|
||||
uint8_t voltsSource;
|
||||
uint8_t voltsSource:7;
|
||||
uint8_t altitudeDisplayed:1;
|
||||
uint8_t blades; // How many blades for RPMs, 0=2 blades, 1=3 blades
|
||||
uint8_t currentSource;
|
||||
uint8_t screensType;
|
||||
@@ -1032,7 +1127,8 @@ enum SwitchSources {
|
||||
SWSRC_TRN,
|
||||
#endif
|
||||
|
||||
SWSRC_SW1,
|
||||
SWSRC_FIRST_CSW,
|
||||
SWSRC_SW1 = SWSRC_FIRST_CSW,
|
||||
SWSRC_SW2,
|
||||
SWSRC_SW3,
|
||||
SWSRC_SW4,
|
||||
@@ -1071,33 +1167,50 @@ enum SwitchSources {
|
||||
|
||||
enum MixSources {
|
||||
MIXSRC_NONE,
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
MIXSRC_FIRST_INPUT,
|
||||
MIXSRC_LAST_INPUT = MIXSRC_FIRST_INPUT+MAX_INPUTS-1,
|
||||
|
||||
MIXSRC_FIRST_LUA,
|
||||
MIXSRC_LAST_LUA = MIXSRC_FIRST_LUA+(MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS)-1,
|
||||
#endif
|
||||
|
||||
MIXSRC_Rud,
|
||||
MIXSRC_Ele,
|
||||
MIXSRC_Thr,
|
||||
MIXSRC_Ail,
|
||||
|
||||
MIXSRC_Pot1,
|
||||
MIXSRC_FIRST_POT,
|
||||
#if defined(PCBTARANIS)
|
||||
MIXSRC_S1 = MIXSRC_Pot1,
|
||||
MIXSRC_S1 = MIXSRC_FIRST_POT,
|
||||
MIXSRC_S2,
|
||||
MIXSRC_S3,
|
||||
MIXSRC_S4,
|
||||
MIXSRC_LAST_POT = MIXSRC_S4,
|
||||
#else
|
||||
MIXSRC_P1 = MIXSRC_Pot1,
|
||||
MIXSRC_P1 = MIXSRC_FIRST_POT,
|
||||
MIXSRC_P2,
|
||||
#if !defined(EXTRA_3POS)
|
||||
#if defined(EXTRA_3POS)
|
||||
MIXSRC_LAST_POT = MIXSRC_P2,
|
||||
#else
|
||||
MIXSRC_P3,
|
||||
MIXSRC_LAST_POT = MIXSRC_P3,
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(PCBSKY9X)
|
||||
MIXSRC_REa,
|
||||
MIXSRC_LAST_ROTARY_ENCODER = MIXSRC_REa,
|
||||
#elif defined(PCBGRUVIN9X) || defined(PCBMEGA2560)
|
||||
MIXSRC_REa,
|
||||
MIXSRC_REb,
|
||||
#if ROTARY_ENCODERS > 2
|
||||
MIXSRC_REc,
|
||||
MIXSRC_REd,
|
||||
MIXSRC_LAST_ROTARY_ENCODER = MIXSRC_REd,
|
||||
#else
|
||||
MIXSRC_LAST_ROTARY_ENCODER = MIXSRC_REb,
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -1135,17 +1248,19 @@ enum MixSources {
|
||||
MIXSRC_GEA,
|
||||
MIXSRC_TRN,
|
||||
#endif
|
||||
MIXSRC_SW1,
|
||||
MIXSRC_FIRST_CSW,
|
||||
MIXSRC_SW1 = MIXSRC_FIRST_CSW,
|
||||
MIXSRC_SW9 = MIXSRC_SW1 + 8,
|
||||
MIXSRC_SWA,
|
||||
MIXSRC_SWB,
|
||||
MIXSRC_SWC,
|
||||
MIXSRC_LAST_CSW = MIXSRC_SW1+NUM_CSW-1,
|
||||
MIXSRC_LAST_CSW = MIXSRC_FIRST_CSW+NUM_CSW-1,
|
||||
|
||||
MIXSRC_PPM1,
|
||||
MIXSRC_LAST_PPM = MIXSRC_PPM1 + 7,
|
||||
MIXSRC_FIRST_PPM,
|
||||
MIXSRC_LAST_PPM = MIXSRC_FIRST_PPM + 7,
|
||||
|
||||
MIXSRC_CH1,
|
||||
MIXSRC_FIRST_CH,
|
||||
MIXSRC_CH1 = MIXSRC_FIRST_CH,
|
||||
MIXSRC_CH2,
|
||||
MIXSRC_CH3,
|
||||
MIXSRC_CH4,
|
||||
@@ -1170,7 +1285,10 @@ enum MixSources {
|
||||
MIXSRC_LAST_TELEM = MIXSRC_FIRST_TELEM+NUM_TELEMETRY-1
|
||||
};
|
||||
|
||||
#define MIXSRC_LAST MIXSRC_LAST_CH
|
||||
#define MIXSRC_FIRST (MIXSRC_NONE+1)
|
||||
#define MIXSRC_LAST MIXSRC_LAST_CH
|
||||
#define INPUTSRC_FIRST MIXSRC_Rud
|
||||
#define INPUTSRC_LAST MIXSRC_LAST_TELEM
|
||||
|
||||
#define MIN_POINTS 3
|
||||
#define MAX_POINTS 17
|
||||
@@ -1181,15 +1299,19 @@ enum MixSources {
|
||||
#define TMRMODE_THR_REL 3
|
||||
#define TMRMODE_THR_TRG 4
|
||||
|
||||
#define COUNTDOWN_SILENT 0
|
||||
#define COUNTDOWN_BEEPS 1
|
||||
#define COUNTDOWN_VOICE 2
|
||||
|
||||
#if defined(CPUARM) || defined(CPUM2560)
|
||||
PACK(typedef struct t_TimerData {
|
||||
int8_t mode; // timer trigger source -> off, abs, stk, stk%, sw/!sw, !m_sw/!m_sw
|
||||
uint16_t start:12;
|
||||
uint16_t countdownBeep:1;
|
||||
uint16_t minuteBeep:1;
|
||||
uint16_t persistent:1;
|
||||
uint16_t spare:1;
|
||||
uint16_t value;
|
||||
int8_t mode; // timer trigger source -> off, abs, stk, stk%, sw/!sw, !m_sw/!m_sw
|
||||
uint16_t start;
|
||||
uint8_t countdownBeep:2;
|
||||
uint8_t minuteBeep:1;
|
||||
uint8_t persistent:1;
|
||||
uint8_t spare:4;
|
||||
uint16_t value;
|
||||
}) TimerData;
|
||||
#else
|
||||
PACK(typedef struct t_TimerData {
|
||||
@@ -1258,11 +1380,11 @@ enum FailsafeModes {
|
||||
};
|
||||
|
||||
#if defined(FRSKY) || !defined(PCBSTD)
|
||||
#define TELEMETRY_DATA FrSkyData frsky;
|
||||
#define TELEMETRY_DATA FrSkyData frsky;
|
||||
#elif defined(MAVLINK)
|
||||
#define TELEMETRY_DATA MavlinkData mavlink;
|
||||
#define TELEMETRY_DATA MavlinkData mavlink;
|
||||
#else
|
||||
#define TELEMETRY_DATA
|
||||
#define TELEMETRY_DATA
|
||||
#endif
|
||||
|
||||
#if defined(CPUARM) || defined(PCBGRUVIN9X) || defined(PCBMEGA2560)
|
||||
@@ -1282,20 +1404,20 @@ PACK(typedef struct t_ModelData {
|
||||
TimerData timers[MAX_TIMERS];
|
||||
uint8_t protocol:3;
|
||||
uint8_t thrTrim:1; // Enable Throttle Trim
|
||||
int8_t ppmNCH:4;
|
||||
int8_t ppmNCH:4; /* spare on ARM */
|
||||
uint8_t trimInc:3; // Trim Increments
|
||||
uint8_t disableThrottleWarning:1;
|
||||
uint8_t pulsePol:1;
|
||||
uint8_t pulsePol:1; /* spare on ARM */
|
||||
uint8_t extendedLimits:1;
|
||||
uint8_t extendedTrims:1;
|
||||
uint8_t throttleReversed:1;
|
||||
int8_t ppmDelay;
|
||||
int8_t ppmDelay; /* spare on ARM */
|
||||
BeepANACenter beepANACenter; // 1<<0->A1.. 1<<6->A7
|
||||
MixData mixData[MAX_MIXERS];
|
||||
LimitData limitData[NUM_CHNOUT];
|
||||
ExpoData expoData[MAX_EXPOS];
|
||||
|
||||
CURVTYPE curves[MAX_CURVES];
|
||||
CURVDATA curves[MAX_CURVES];
|
||||
int8_t points[NUM_POINTS];
|
||||
|
||||
CustomSwData customSw[NUM_CSW];
|
||||
|
||||
+844
-287
File diff suppressed because it is too large
Load Diff
+211
-62
@@ -42,11 +42,7 @@
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
#define IF_9X(x)
|
||||
#else
|
||||
#define IF_9X(x) x,
|
||||
#endif
|
||||
// TODO change all IF_xxx by CASE_xxx when used with a comma!
|
||||
|
||||
#if defined(PCBSKY9X)
|
||||
#define IF_PCBSKY9X(x) x,
|
||||
@@ -55,11 +51,17 @@
|
||||
#endif
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
#define IF_PCBTARANIS() true
|
||||
#define IS_PCBTARANIS() true
|
||||
#define IF_PCBTARANIS(x) (x)
|
||||
#define CASE_PCBTARANIS(x) x,
|
||||
#define IF_9X(x) (0)
|
||||
#define CASE_9X(x)
|
||||
#else
|
||||
#define IF_PCBTARANIS() false
|
||||
#define IS_PCBTARANIS() false
|
||||
#define IF_PCBTARANIS(x) (0)
|
||||
#define CASE_PCBTARANIS(x)
|
||||
#define IF_9X(x) (x)
|
||||
#define CASE_9X(x) x,
|
||||
#endif
|
||||
|
||||
#if defined(CPUARM)
|
||||
@@ -68,6 +70,12 @@
|
||||
#define IF_CPUARM(x)
|
||||
#endif
|
||||
|
||||
#if defined(LUA)
|
||||
#define IF_LUA(x) x,
|
||||
#else
|
||||
#define IF_LUA(x)
|
||||
#endif
|
||||
|
||||
#if defined(BATTGRAPH) || defined(PCBTARANIS)
|
||||
#define IF_BATTGRAPH(x) x,
|
||||
#else
|
||||
@@ -474,6 +482,13 @@ enum EnumKeys {
|
||||
#define LOAD_MODEL_BITMAP()
|
||||
#endif
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
void loadCurves();
|
||||
#define LOAD_MODEL_CURVES() loadCurves()
|
||||
#else
|
||||
#define LOAD_MODEL_CURVES()
|
||||
#endif
|
||||
|
||||
// TODO elsewhere ...
|
||||
#if defined(DSM2)
|
||||
#define DSM2_BIND_FLAG 0x80
|
||||
@@ -549,13 +564,12 @@ extern const pm_uint8_t modn12x3[];
|
||||
extern uint8_t stickMode;
|
||||
|
||||
//convert from mode 1 to mode stickMode
|
||||
//NOTICE! => 1..4 -> 1..4
|
||||
#define CONVERT_MODE(x) (((x)<=4) ? pgm_read_byte(modn12x3 + 4*stickMode + (x)-1) : (x) )
|
||||
|
||||
//NOTICE! => 0..3 -> 0..3
|
||||
#define RUD_STICK 0
|
||||
#define ELE_STICK 1
|
||||
#define THR_STICK 2
|
||||
#define AIL_STICK 3
|
||||
#define CONVERT_MODE(x) (((x)<=AIL_STICK) ? pgm_read_byte(modn12x3 + 4*stickMode + (x)) : (x) )
|
||||
|
||||
extern uint8_t channel_order(uint8_t x);
|
||||
|
||||
@@ -752,7 +766,12 @@ extern uint8_t pxxFlag[NUM_MODULES];
|
||||
#define LEN_STD_CHARS 40
|
||||
#define ZCHAR_MAX (LEN_STD_CHARS + LEN_SPECIAL_CHARS)
|
||||
|
||||
extern char idx2char(int8_t idx);
|
||||
char idx2char(int8_t idx);
|
||||
#if defined(PCBTARANIS)
|
||||
int8_t char2idx(char c);
|
||||
void str2zchar(char *dest, const char *src, int size);
|
||||
void zchar2str(char *dest, const char *src, int size);
|
||||
#endif
|
||||
|
||||
extern uint8_t s_evt;
|
||||
#define putEvent(evt) s_evt = evt
|
||||
@@ -816,6 +835,12 @@ extern uint8_t s_perout_flight_phase;
|
||||
#define bitfield_channels_t uint16_t
|
||||
#endif
|
||||
|
||||
#if defined(CPUARM) && !defined(SIMU)
|
||||
extern unsigned char *heap;
|
||||
extern int _end;
|
||||
extern unsigned char *_estack;
|
||||
#endif
|
||||
|
||||
void perOut(uint8_t mode, uint8_t tick10ms);
|
||||
void perMain();
|
||||
NOINLINE void per10ms();
|
||||
@@ -825,8 +850,15 @@ bool getSwitch(int8_t swtch);
|
||||
|
||||
extern swstate_t switches_states;
|
||||
int8_t getMovedSwitch();
|
||||
#if defined(AUTOSOURCE)
|
||||
int8_t getMovedSource();
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
#define GET_MOVED_SOURCE_PARAMS uint8_t min
|
||||
int8_t getMovedSource(GET_MOVED_SOURCE_PARAMS);
|
||||
#define GET_MOVED_SOURCE(min, max) getMovedSource(min)
|
||||
#else
|
||||
#define GET_MOVED_SOURCE_PARAMS
|
||||
int8_t getMovedSource();
|
||||
#define GET_MOVED_SOURCE(min, max) getMovedSource()
|
||||
#endif
|
||||
|
||||
#if defined(FLIGHT_MODES)
|
||||
@@ -865,6 +897,9 @@ extern void setTrimValue(uint8_t phase, uint8_t idx, int16_t trim);
|
||||
void setGVarValue(uint8_t x, int16_t value, int8_t phase);
|
||||
#define GET_GVAR(x, min, max, p) getGVarValue(x, min, max, p)
|
||||
#define SET_GVAR(idx, val, p) setGVarValue(idx, val, p)
|
||||
#define GVAR_DISPLAY_TIME 100 /*1 second*/;
|
||||
extern uint8_t s_gvar_timer;
|
||||
extern uint8_t s_gvar_last;
|
||||
#endif
|
||||
#else
|
||||
#define GET_GVAR(x, ...) (x)
|
||||
@@ -872,17 +907,17 @@ extern void setTrimValue(uint8_t phase, uint8_t idx, int16_t trim);
|
||||
|
||||
#if defined(CPUARM)
|
||||
#define GV1_SMALL 128
|
||||
// define here range for ARM based controllers; could be nearly unlimited, but could cause problems in mixer calculation (overflows)
|
||||
#define GV1_LARGE 512
|
||||
#define GV1_LARGE 4096
|
||||
#define GV_GET_GV1_VALUE(max) ( (max<=GV_RANGESMALL && min>=GV_RANGESMALL_NEG) ? GV1_SMALL : GV1_LARGE )
|
||||
#define GV_INDEX_CALCULATION(x,max) ( (max<=GV_RANGESMALL && min>=GV_RANGESMALL_NEG) ? (uint8_t) x-GV1_SMALL : ((x&(GV1_LARGE*2-1))-GV1_LARGE) )
|
||||
#else
|
||||
#define GV1_SMALL 128
|
||||
#define GV1_LARGE 256
|
||||
#define GV_GET_GV1_VALUE(max) ( (max<=GV_RANGESMALL) ? GV1_SMALL : GV1_LARGE )
|
||||
#define GV_INDEX_CALCULATION(x,max) ( (max<=GV1_SMALL) ? (uint8_t) x-GV1_SMALL : ((x&(GV1_LARGE*2-1))-GV1_LARGE) )
|
||||
#endif
|
||||
|
||||
#define GV_IS_GV_VALUE(x,min,max) ( (x>max) || (x<min) )
|
||||
#define GV_GET_GV1_VALUE(max) ( (max<=GV_RANGESMALL) ? GV1_SMALL : GV1_LARGE )
|
||||
#define GV_INDEX_CALCULATION(x,max) ( (max<=GV1_SMALL) ? (uint8_t) x-GV1_SMALL : \
|
||||
( (x&(GV1_LARGE*2-1))-GV1_LARGE ) )
|
||||
#define GV_INDEX_CALC_DELTA(x,delta) ((x&(delta*2-1)) - delta)
|
||||
|
||||
#define GV_CALC_VALUE_IDX_POS(idx,delta) (-delta+idx)
|
||||
@@ -924,10 +959,10 @@ extern volatile GETSWITCH_RECURSIVE_TYPE s_last_switch_value;
|
||||
extern int16_t csLastValue[NUM_CSW];
|
||||
#define CS_LAST_VALUE_INIT -32768
|
||||
|
||||
#define TMR_OFF 0
|
||||
#define TMR_RUNNING 1
|
||||
#define TMR_BEEPING 2
|
||||
#define TMR_STOPPED 3
|
||||
#define TMR_OFF 0
|
||||
#define TMR_RUNNING 1
|
||||
#define TMR_NEGATIVE 2
|
||||
#define TMR_STOPPED 3
|
||||
void resetTimer(uint8_t idx);
|
||||
void resetAll();
|
||||
|
||||
@@ -951,7 +986,7 @@ extern uint16_t lastMixerDuration;
|
||||
#endif
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
static inline uint16_t getTmr2MHz() { return 0; }
|
||||
static inline uint16_t getTmr2MHz() { return TIM3->CNT; }
|
||||
#elif defined(PCBSKY9X)
|
||||
static inline uint16_t getTmr2MHz() { return TC1->TC_CHANNEL[0].TC_CV; }
|
||||
#else
|
||||
@@ -974,6 +1009,16 @@ extern uint16_t lastMixerDuration;
|
||||
void doSplash();
|
||||
#endif
|
||||
|
||||
#if MENUS_LOCK == 1
|
||||
extern bool readonly;
|
||||
extern bool readonlyUnlocked();
|
||||
#define READ_ONLY() readonly
|
||||
#define READ_ONLY_UNLOCKED() readonlyUnlocked()
|
||||
#else
|
||||
#define READ_ONLY() false
|
||||
#define READ_ONLY_UNLOCKED() true
|
||||
#endif
|
||||
|
||||
void checkLowEEPROM();
|
||||
void checkTHR();
|
||||
void checkSwitches();
|
||||
@@ -1090,39 +1135,38 @@ void checkModelIdUnique(uint8_t id);
|
||||
#endif
|
||||
|
||||
#if defined(CPUARM)
|
||||
inline int16_t calc100to256_16Bits(register int16_t x) // @@@2 open.20.fsguruh: return x*2.56
|
||||
|
||||
inline int divRoundClosest(const int n, const int d)
|
||||
{
|
||||
return ((int16_t) x * 256) / 100;
|
||||
return ((n < 0) ^ (d < 0)) ? ((n - d/2)/d) : ((n + d/2)/d);
|
||||
}
|
||||
|
||||
inline int16_t calc100to256(register int8_t x) // @@@2 open.20.fsguruh: return x*2.56
|
||||
#define calc100to256_16Bits(x) calc100to256(x)
|
||||
#define calc100toRESX_16Bits(x) calc100toRESX(x)
|
||||
|
||||
inline int calc100to256(register int x)
|
||||
{
|
||||
return ((int16_t) x * 256) / 100;
|
||||
return divRoundClosest(x*256, 100);
|
||||
}
|
||||
|
||||
inline int16_t calc100toRESX_16Bits(register int16_t x) // @@@ open.20.fsguruh
|
||||
inline int calc100toRESX(register int x)
|
||||
{
|
||||
return x * 1024 / 100;
|
||||
return divRoundClosest(x*RESX, 100);
|
||||
}
|
||||
|
||||
inline int32_t calc100toRESX(register int8_t x)
|
||||
inline int calc1000toRESX(register int x)
|
||||
{
|
||||
return x * 1024 / 100;
|
||||
return divRoundClosest(x*RESX, 1000);
|
||||
}
|
||||
|
||||
inline int16_t calc1000toRESX(register int32_t x) // improve calc time by Pat MacKenzie
|
||||
inline int calcRESXto1000(register int x)
|
||||
{
|
||||
return x * 1024 / 1000;
|
||||
return divRoundClosest(x*1000, RESX);
|
||||
}
|
||||
|
||||
inline int16_t calcRESXto1000(register int32_t x)
|
||||
inline int calcRESXto100(register int x)
|
||||
{
|
||||
return x * 1000 / 1024;
|
||||
}
|
||||
|
||||
inline int16_t calcRESXto100(register int32_t x)
|
||||
{
|
||||
return x * 100 / 1024;
|
||||
return divRoundClosest(x*100, RESX);
|
||||
}
|
||||
|
||||
#else
|
||||
@@ -1154,20 +1198,35 @@ extern int16_t ex_chans[NUM_CHNOUT]; // Outputs (before LIMITS) of th
|
||||
extern int16_t channelOutputs[NUM_CHNOUT];
|
||||
extern uint16_t BandGap;
|
||||
|
||||
#if defined(CPUARM)
|
||||
#define NUM_INPUTS (NUM_STICKS)
|
||||
#if defined(PCBTARANIS)
|
||||
#define NUM_INPUTS (MAX_INPUTS)
|
||||
#else
|
||||
#define NUM_INPUTS (NUM_STICKS)
|
||||
#endif
|
||||
|
||||
extern int16_t expo(int16_t x, int16_t k);
|
||||
extern int16_t intpol(int16_t, uint8_t);
|
||||
extern int16_t applyCurve(int16_t, int8_t);
|
||||
extern void applyExpos(int16_t *anas, uint8_t mode);
|
||||
extern int16_t applyLimits(uint8_t channel, int32_t value);
|
||||
int intpol(int x, uint8_t idx);
|
||||
int expo(int x, int k);
|
||||
int applyCurve(int x, int8_t idx);
|
||||
|
||||
extern uint16_t anaIn(uint8_t chan);
|
||||
extern int16_t thrAnaIn(uint8_t chan);
|
||||
#if defined(PCBTARANIS)
|
||||
int applyCustomCurve(int x, uint8_t idx);
|
||||
#else
|
||||
#define applyCustomCurve(x, idx) intpol(x, idx)
|
||||
#endif
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
#define APPLY_EXPOS_EXTRA_PARAMS_INC , uint8_t ovwrIdx=0, int16_t ovwrValue=0
|
||||
#define APPLY_EXPOS_EXTRA_PARAMS , uint8_t ovwrIdx, int16_t ovwrValue
|
||||
#else
|
||||
#define APPLY_EXPOS_EXTRA_PARAMS_INC
|
||||
#define APPLY_EXPOS_EXTRA_PARAMS
|
||||
#endif
|
||||
|
||||
void applyExpos(int16_t *anas, uint8_t mode APPLY_EXPOS_EXTRA_PARAMS_INC);
|
||||
int16_t applyLimits(uint8_t channel, int32_t value);
|
||||
|
||||
uint16_t anaIn(uint8_t chan);
|
||||
int16_t thrAnaIn(uint8_t chan);
|
||||
extern int16_t calibratedStick[NUM_STICKS+NUM_POTS];
|
||||
|
||||
#define FLASH_DURATION 20 /*200ms*/
|
||||
@@ -1177,25 +1236,32 @@ extern uint16_t lightOffCounter;
|
||||
extern uint8_t flashCounter;
|
||||
extern uint8_t mixWarning;
|
||||
|
||||
extern PhaseData *phaseAddress(uint8_t idx);
|
||||
extern ExpoData *expoAddress(uint8_t idx);
|
||||
extern MixData *mixAddress(uint8_t idx);
|
||||
extern LimitData *limitAddress(uint8_t idx);
|
||||
extern int8_t *curveAddress(uint8_t idx);
|
||||
extern CustomSwData *cswAddress(uint8_t idx);
|
||||
PhaseData *phaseAddress(uint8_t idx);
|
||||
ExpoData *expoAddress(uint8_t idx);
|
||||
MixData *mixAddress(uint8_t idx);
|
||||
LimitData *limitAddress(uint8_t idx);
|
||||
int8_t *curveAddress(uint8_t idx);
|
||||
CustomSwData *cswAddress(uint8_t idx);
|
||||
|
||||
#if !defined(PCBTARANIS)
|
||||
struct CurveInfo {
|
||||
int8_t *crv;
|
||||
uint8_t points;
|
||||
bool custom;
|
||||
};
|
||||
extern CurveInfo curveInfo(uint8_t idx);
|
||||
#endif
|
||||
|
||||
extern void deleteExpoMix(uint8_t expo, uint8_t idx);
|
||||
extern int8_t s_currCh;
|
||||
uint8_t getExpoMixCount(uint8_t expo);
|
||||
void deleteExpoMix(uint8_t expo, uint8_t idx);
|
||||
void insertExpoMix(uint8_t expo, uint8_t idx);
|
||||
void applyDefaultTemplate();
|
||||
|
||||
extern void incSubtrim(uint8_t idx, int16_t inc);
|
||||
extern void instantTrim();
|
||||
extern void moveTrimsToOffsets();
|
||||
void incSubtrim(uint8_t idx, int16_t inc);
|
||||
void instantTrim();
|
||||
void copyTrimsToOffset(uint8_t ch);
|
||||
void moveTrimsToOffsets();
|
||||
|
||||
#if defined(CPUARM)
|
||||
#define ACTIVE_PHASES_TYPE uint16_t
|
||||
@@ -1255,6 +1321,10 @@ extern MASK_CFN_TYPE activeFnSwitches;
|
||||
extern MASK_FUNC_TYPE activeFunctions;
|
||||
extern tmr10ms_t lastFunctionTime[NUM_CFN];
|
||||
|
||||
#if defined(CPUARM)
|
||||
extern bool evalFunctionsFirstTime;
|
||||
#endif
|
||||
|
||||
inline bool isFunctionActive(uint8_t func)
|
||||
{
|
||||
return activeFunctions & ((MASK_FUNC_TYPE)1 << (func-FUNC_TRAINER));
|
||||
@@ -1319,10 +1389,30 @@ enum AUDIO_SOUNDS {
|
||||
#if defined(CPUARM)
|
||||
AU_TRIM_END,
|
||||
#endif
|
||||
AU_POT_STICK_MIDDLE,
|
||||
#if defined(PCBTARANIS)
|
||||
AU_STICK1_MIDDLE,
|
||||
AU_STICK2_MIDDLE,
|
||||
AU_STICK3_MIDDLE,
|
||||
AU_STICK4_MIDDLE,
|
||||
AU_POT1_MIDDLE,
|
||||
AU_POT2_MIDDLE,
|
||||
AU_SLIDER1_MIDDLE,
|
||||
AU_SLIDER2_MIDDLE,
|
||||
#elif defined(CPUARM)
|
||||
AU_STICK1_MIDDLE,
|
||||
AU_STICK2_MIDDLE,
|
||||
AU_STICK3_MIDDLE,
|
||||
AU_STICK4_MIDDLE,
|
||||
AU_POT1_MIDDLE,
|
||||
AU_POT2_MIDDLE,
|
||||
AU_POT3_MIDDLE,
|
||||
#else
|
||||
AU_POT_MIDDLE,
|
||||
#endif
|
||||
AU_MIX_WARNING_1,
|
||||
AU_MIX_WARNING_2,
|
||||
AU_MIX_WARNING_3,
|
||||
AU_TIMER_00,
|
||||
AU_TIMER_LT10,
|
||||
AU_TIMER_20,
|
||||
AU_TIMER_30,
|
||||
@@ -1395,6 +1485,58 @@ enum AUDIO_SOUNDS {
|
||||
#include "rtc.h"
|
||||
#endif
|
||||
|
||||
#if defined(LUA)
|
||||
struct ScriptInput {
|
||||
const char *name;
|
||||
uint8_t type;
|
||||
int16_t min;
|
||||
int16_t max;
|
||||
int16_t def;
|
||||
};
|
||||
struct ScriptOutput {
|
||||
const char *name;
|
||||
int16_t value;
|
||||
};
|
||||
enum ScriptState {
|
||||
SCRIPT_OK,
|
||||
SCRIPT_NOFILE,
|
||||
SCRIPT_SYNTAX_ERROR,
|
||||
SCRIPT_KILLED,
|
||||
SCRIPT_LEAK
|
||||
};
|
||||
struct ScriptInternalData {
|
||||
uint8_t state;
|
||||
int run;
|
||||
uint8_t instructions;
|
||||
uint8_t memory;
|
||||
uint8_t inputsCount;
|
||||
ScriptInput inputs[MAX_SCRIPT_INPUTS];
|
||||
uint8_t outputsCount;
|
||||
ScriptOutput outputs[MAX_SCRIPT_OUTPUTS];
|
||||
};
|
||||
#define LUASTATE_STANDALONE_SCRIPT_RUNNING 1
|
||||
#define LUASTATE_RELOAD_MODEL_SCRIPTS 2
|
||||
extern uint8_t luaState;
|
||||
extern ScriptInternalData scriptInternalData[MAX_SCRIPTS];
|
||||
extern ScriptInternalData standaloneScript;
|
||||
void luaInit();
|
||||
void luaTask(uint8_t evt);
|
||||
void luaExec(const char *filename);
|
||||
void luaLoadModelScript(uint8_t index);
|
||||
void luaLoadModelScripts();
|
||||
#define luaGetMemUsed(idx) scriptInternalData[idx].memory
|
||||
#define luaGetCpuUsed(idx) scriptInternalData[idx].instructions
|
||||
#define LUA_INIT()
|
||||
#define LUA_RESET() luaInit()
|
||||
#define LUA_LOAD_MODEL_SCRIPTS() luaState |= LUASTATE_RELOAD_MODEL_SCRIPTS
|
||||
#define LUA_LOAD_MODEL_SCRIPT(idx) luaState |= LUASTATE_RELOAD_MODEL_SCRIPTS
|
||||
#else
|
||||
#define LUA_INIT()
|
||||
#define LUA_RESET()
|
||||
#define LUA_LOAD_MODEL_SCRIPTS()
|
||||
#define LUA_LOAD_MODEL_SCRIPT(idx)
|
||||
#endif
|
||||
|
||||
#if defined(CPUARM)
|
||||
extern uint8_t requiredSpeakerVolume;
|
||||
#endif
|
||||
@@ -1483,12 +1625,14 @@ extern uint8_t barsThresholds[THLD_MAX];
|
||||
#endif
|
||||
|
||||
#if defined(FRSKY)
|
||||
uint8_t maxTelemValue(uint8_t channel);
|
||||
csw_telemetry_value_t minTelemValue(uint8_t channel);
|
||||
csw_telemetry_value_t maxTelemValue(uint8_t channel);
|
||||
#else
|
||||
#define minTelemValue(channel) 255
|
||||
#define maxTelemValue(channel) 255
|
||||
#endif
|
||||
|
||||
getvalue_t convertTelemValue(uint8_t channel, uint8_t value);
|
||||
getvalue_t convertTelemValue(uint8_t channel, csw_telemetry_value_t value);
|
||||
getvalue_t convertCswTelemValue(CustomSwData * cs);
|
||||
|
||||
#if defined(FRSKY) || defined(CPUARM)
|
||||
@@ -1512,6 +1656,11 @@ extern const pm_uint8_t bchunit_ar[];
|
||||
#define EARTH_RADIUSKM ((uint32_t)6371)
|
||||
#define EARTH_RADIUS ((uint32_t)111194)
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
double gpsToDouble(bool neg, int16_t bp, int16_t ap);
|
||||
extern double pilotLatitude;
|
||||
extern double pilotLongitude;
|
||||
#endif
|
||||
void getGpsPilotPosition();
|
||||
void getGpsDistance();
|
||||
void varioWakeup();
|
||||
|
||||
@@ -46,11 +46,15 @@
|
||||
#define SOUNDS_PATH_LNG_OFS (sizeof(SOUNDS_PATH)-3)
|
||||
#define SYSTEM_SOUNDS_PATH SOUNDS_PATH "/SYSTEM" // no trailing slash = important
|
||||
#define BITMAPS_PATH ROOT_PATH "BMP"
|
||||
#define SCRIPTS_PATH ROOT_PATH "SCRIPTS"
|
||||
|
||||
#define MODELS_EXT ".bin"
|
||||
#define LOGS_EXT ".csv"
|
||||
#define SOUNDS_EXT ".wav"
|
||||
#define BITMAPS_EXT ".bmp"
|
||||
#define SCRIPTS_EXT ".lua"
|
||||
#define MIXES_EXT ".mix"
|
||||
#define TEXT_EXT ".txt"
|
||||
|
||||
extern FATFS g_FATFS_Obj;
|
||||
|
||||
|
||||
+4
-20
@@ -297,14 +297,16 @@ void *main_thread(void *)
|
||||
g_menuStack[0] = menuMainView;
|
||||
g_menuStack[1] = menuModelSelect;
|
||||
|
||||
eeReadAll(); // load general setup and selected model
|
||||
|
||||
#if defined(CPUARM) && defined(SDCARD)
|
||||
refreshSystemAudioFiles();
|
||||
#endif
|
||||
|
||||
eeReadAll(); // load general setup and selected model
|
||||
|
||||
if (g_eeGeneral.backlightMode != e_backlight_mode_off) backlightOn(); // on Tx start turn the light on
|
||||
|
||||
LUA_INIT();
|
||||
|
||||
if (main_thread_running == 1) {
|
||||
opentxStart();
|
||||
}
|
||||
@@ -335,16 +337,6 @@ void *main_thread(void *)
|
||||
#define getcwd _getcwd
|
||||
#endif
|
||||
|
||||
#if defined(LUA)
|
||||
extern void luaTask(void * pdata);
|
||||
void *lua_thread(void *)
|
||||
{
|
||||
luaTask(NULL);
|
||||
return NULL;
|
||||
}
|
||||
pthread_t lua_thread_pid;
|
||||
#endif
|
||||
|
||||
pthread_t main_thread_pid;
|
||||
void StartMainThread(bool tests)
|
||||
{
|
||||
@@ -355,20 +347,12 @@ void StartMainThread(bool tests)
|
||||
|
||||
main_thread_running = (tests ? 1 : 2);
|
||||
pthread_create(&main_thread_pid, NULL, &main_thread, NULL);
|
||||
|
||||
#if defined(LUA)
|
||||
pthread_create(&lua_thread_pid, NULL, &lua_thread, NULL);
|
||||
#endif
|
||||
}
|
||||
|
||||
void StopMainThread()
|
||||
{
|
||||
main_thread_running = 0;
|
||||
pthread_join(main_thread_pid, NULL);
|
||||
|
||||
#if defined(LUA)
|
||||
pthread_join(lua_thread_pid, NULL);
|
||||
#endif
|
||||
}
|
||||
|
||||
pthread_t eeprom_thread_pid;
|
||||
|
||||
+3
-3
@@ -357,7 +357,7 @@ void eeprom_read_block (void *pointer_ram, const void *pointer_eeprom, size_t si
|
||||
#define wdt_reset() sleep(1/*ms*/)
|
||||
#define boardInit()
|
||||
|
||||
#define OS_MutexID int
|
||||
#define OS_MutexID pthread_mutex_t
|
||||
#define OS_FlagID int
|
||||
#define OS_TID int
|
||||
#define OS_TCID int
|
||||
@@ -372,8 +372,8 @@ void eeprom_read_block (void *pointer_ram, const void *pointer_eeprom, size_t si
|
||||
#define CoExitISR(...)
|
||||
#define CoStartTmr(...)
|
||||
#define CoWaitForSingleFlag(...) 0
|
||||
#define CoEnterMutexSection(...)
|
||||
#define CoLeaveMutexSection(...)
|
||||
#define CoEnterMutexSection(m) pthread_mutex_lock(&(m))
|
||||
#define CoLeaveMutexSection(m) pthread_mutex_unlock(&(m))
|
||||
#define CoTickDelay(...)
|
||||
#define CoCreateFlag(...) 0
|
||||
#define UART3_Configure(...)
|
||||
|
||||
@@ -160,7 +160,8 @@ void sdPoll10ms();
|
||||
#endif
|
||||
|
||||
// Keys driver
|
||||
#define KEYS_PRESSED() (~PINL) // used only for DBLKEYS code.
|
||||
#define TRIMS_PRESSED() (~PINJ)
|
||||
#define KEYS_PRESSED() (~PINL) // used only for DBLKEYS code.
|
||||
#define DBLKEYS_PRESSED_RGT_LFT(i) ((in & ((1<<INP_L_KEY_RGT) + (1<<INP_L_KEY_LFT))) == ((1<<INP_L_KEY_RGT) + (1<<INP_L_KEY_LFT)))
|
||||
#define DBLKEYS_PRESSED_UP_DWN(i) ((in & ((1<<INP_L_KEY_UP) + (1<<INP_L_KEY_DWN))) == ((1<<INP_L_KEY_UP) + (1<<INP_L_KEY_DWN)))
|
||||
#define DBLKEYS_PRESSED_RGT_UP(i) ((in & ((1<<INP_L_KEY_RGT) + (1<<INP_L_KEY_UP))) == ((1<<INP_L_KEY_RGT) + (1<<INP_L_KEY_UP)))
|
||||
|
||||
@@ -163,7 +163,8 @@ void sdPoll10ms();
|
||||
#endif
|
||||
|
||||
// Keys driver
|
||||
#define KEYS_PRESSED() (~PINL) // used only for DBLKEYS code
|
||||
#define TRIMS_PRESSED() (~PINJ)
|
||||
#define KEYS_PRESSED() (~PINL) // used only for DBLKEYS code.
|
||||
#define DBLKEYS_PRESSED_RGT_LFT(i) ((in & ((1<<INP_L_KEY_RGT) + (1<<INP_L_KEY_LFT))) == ((1<<INP_L_KEY_RGT) + (1<<INP_L_KEY_LFT)))
|
||||
#define DBLKEYS_PRESSED_UP_DWN(i) ((in & ((1<<INP_L_KEY_UP) + (1<<INP_L_KEY_DWN))) == ((1<<INP_L_KEY_UP) + (1<<INP_L_KEY_DWN)))
|
||||
#define DBLKEYS_PRESSED_RGT_UP(i) ((in & ((1<<INP_L_KEY_RGT) + (1<<INP_L_KEY_UP))) == ((1<<INP_L_KEY_RGT) + (1<<INP_L_KEY_UP)))
|
||||
|
||||
@@ -155,7 +155,9 @@ void setSticksGain(uint8_t gains);
|
||||
|
||||
// Keys driver
|
||||
extern uint32_t readKeys();
|
||||
#define KEYS_PRESSED() (~readKeys())
|
||||
extern uint32_t readTrims();
|
||||
#define TRIMS_PRESSED() (readTrims())
|
||||
#define KEYS_PRESSED() (~readKeys())
|
||||
#define DBLKEYS_PRESSED_RGT_LFT(i) ((in & (0x20 + 0x40)) == (0x20 + 0x40))
|
||||
#define DBLKEYS_PRESSED_UP_DWN(i) ((in & (0x10 + 0x08)) == (0x10 + 0x08))
|
||||
#define DBLKEYS_PRESSED_RGT_UP(i) ((in & (0x20 + 0x10)) == (0x20 + 0x10))
|
||||
|
||||
@@ -45,14 +45,18 @@
|
||||
#include <stdarg.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <errno.h>
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Exported variables
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
#undef errno
|
||||
extern int errno ;
|
||||
extern int _end ;
|
||||
extern int errno;
|
||||
extern int _end;
|
||||
extern int _estack;
|
||||
|
||||
#define RAM_END (unsigned char *)&_estack
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
@@ -61,23 +65,36 @@ extern void _exit( int status ) ;
|
||||
extern void _kill( int pid, int sig ) ;
|
||||
extern int _getpid ( void ) ;
|
||||
|
||||
extern caddr_t _sbrk ( int incr )
|
||||
unsigned char *heap = (unsigned char *)&_end;
|
||||
extern caddr_t _sbrk(int nbytes)
|
||||
{
|
||||
static unsigned char *heap = NULL ;
|
||||
unsigned char *prev_heap ;
|
||||
|
||||
if ( heap == NULL )
|
||||
{
|
||||
heap = (unsigned char *)&_end ;
|
||||
}
|
||||
prev_heap = heap;
|
||||
|
||||
heap += incr ;
|
||||
|
||||
return (caddr_t) prev_heap ;
|
||||
if (heap + nbytes < RAM_END-4096) {
|
||||
unsigned char *prev_heap = heap;
|
||||
heap += nbytes;
|
||||
return (caddr_t) prev_heap;
|
||||
}
|
||||
else {
|
||||
errno = ENOMEM;
|
||||
return ((void*)-1);
|
||||
}
|
||||
}
|
||||
|
||||
extern int link( char *old, char *nw )
|
||||
extern int _gettimeofday(void *p1, void *p2)
|
||||
{
|
||||
return 0 ;
|
||||
}
|
||||
|
||||
extern int _link( char *old, char *nw )
|
||||
{
|
||||
return -1 ;
|
||||
}
|
||||
|
||||
extern int _unlink (const char *path)
|
||||
{
|
||||
return -1 ;
|
||||
}
|
||||
|
||||
extern int _open(const char *name, int flags, int mode)
|
||||
{
|
||||
return -1 ;
|
||||
}
|
||||
|
||||
@@ -208,7 +208,8 @@ void backlightFade();
|
||||
#define INP_G_RuddDR 0
|
||||
|
||||
// Keys driver
|
||||
#define KEYS_PRESSED() (~PINB)
|
||||
#define TRIMS_PRESSED() (~PIND)
|
||||
#define KEYS_PRESSED() (~PINB)
|
||||
#define DBLKEYS_PRESSED_RGT_LFT(i) ((in & ((1<<INP_B_KEY_RGT) + (1<<INP_B_KEY_LFT))) == ((1<<INP_B_KEY_RGT) + (1<<INP_B_KEY_LFT)))
|
||||
#define DBLKEYS_PRESSED_UP_DWN(i) ((in & ((1<<INP_B_KEY_UP) + (1<<INP_B_KEY_DWN))) == ((1<<INP_B_KEY_UP) + (1<<INP_B_KEY_DWN)))
|
||||
#define DBLKEYS_PRESSED_RGT_UP(i) ((in & ((1<<INP_B_KEY_RGT) + (1<<INP_B_KEY_UP))) == ((1<<INP_B_KEY_RGT) + (1<<INP_B_KEY_UP)))
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "../opentx.h"
|
||||
#include "../../opentx.h"
|
||||
|
||||
#define PIN_ANALOG 0x0003
|
||||
#define PIN_PORTA 0x0000
|
||||
|
||||
@@ -124,7 +124,9 @@ void stop_trainer_capture();
|
||||
// Keys driver
|
||||
void keysInit();
|
||||
uint32_t readKeys();
|
||||
#define KEYS_PRESSED() (~readKeys())
|
||||
uint32_t readTrims();
|
||||
#define TRIMS_PRESSED() (readTrims())
|
||||
#define KEYS_PRESSED() (~readKeys())
|
||||
#define DBLKEYS_PRESSED_RGT_LFT(i) ((in & ((2<<KEY_PLUS) + (2<<KEY_MINUS))) == ((2<<KEY_PLUS) + (2<<KEY_MINUS)))
|
||||
#define DBLKEYS_PRESSED_UP_DWN(i) ((in & ((2<<KEY_MENU) + (2<<KEY_PAGE))) == ((2<<KEY_MENU) + (2<<KEY_PAGE)))
|
||||
#define DBLKEYS_PRESSED_RGT_UP(i) ((in & ((2<<KEY_ENTER) + (2<<KEY_MINUS))) == ((2<<KEY_ENTER) + (2<<KEY_MINUS)))
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "../opentx.h"
|
||||
#include "../../opentx.h"
|
||||
|
||||
void delaysInit(void)
|
||||
{
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "../opentx.h"
|
||||
#include "../../opentx.h"
|
||||
|
||||
extern Fifo<512> telemetryFifo;
|
||||
|
||||
|
||||
@@ -32,9 +32,6 @@
|
||||
/* Entry Point */
|
||||
ENTRY(Reset_Handler)
|
||||
|
||||
/* Highest address of the user mode stack */
|
||||
_estack = 0x20020000; /* end of 128K SRAM */
|
||||
|
||||
/* Generate a link error if heap and stack don't fit into RAM */
|
||||
_Min_Heap_Size = 0; /* required amount of heap */
|
||||
_Min_Stack_Size = 0x200; /* required amount of stack */
|
||||
@@ -144,6 +141,8 @@ SECTIONS
|
||||
. = ALIGN(4);
|
||||
} >RAM
|
||||
|
||||
PROVIDE ( _estack = ORIGIN(RAM) + LENGTH(RAM) );
|
||||
|
||||
/* MEMORY_bank1 section, code must be located here explicitly */
|
||||
/* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */
|
||||
.memory_b1_text :
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "../opentx.h"
|
||||
#include "../../opentx.h"
|
||||
|
||||
void uartInit(uint32_t baudrate)
|
||||
{
|
||||
|
||||
@@ -646,7 +646,7 @@ void resetTelemetry()
|
||||
frskyData.hub.gpsFix = -1;
|
||||
#endif
|
||||
|
||||
#ifdef SIMU
|
||||
#if defined(SIMU)
|
||||
frskyData.analog[0].set(120);
|
||||
frskyData.analog[1].set(240);
|
||||
frskyData.rssi[0].value = 75;
|
||||
@@ -669,12 +669,8 @@ void resetTelemetry()
|
||||
|
||||
frskyData.hub.cellsCount = 6;
|
||||
|
||||
#if 0 // defined(FRSKY_SPORT)
|
||||
frskyData.hub.baroAltitudeOffset = 500 * 100;
|
||||
frskyData.hub.baroAltitude = 50 * 100;
|
||||
#else
|
||||
frskyData.hub.baroAltitude_bp = 50;
|
||||
#endif
|
||||
|
||||
frskyData.hub.gpsAltitude_bp = 50;
|
||||
|
||||
frskyData.hub.minAltitude = 10;
|
||||
|
||||
+71
-33
@@ -87,7 +87,7 @@ MixData* setDest(uint8_t dch, uint8_t src, bool clear=false)
|
||||
return mix;
|
||||
}
|
||||
|
||||
void md_SetWeight(MixData* md, int8_t weight)
|
||||
void mixSetWeight(MixData* md, int8_t weight)
|
||||
{
|
||||
u_int8int16_t tmp;
|
||||
tmp.word=weight;
|
||||
@@ -95,10 +95,35 @@ void md_SetWeight(MixData* md, int8_t weight)
|
||||
// MD_SETWEIGHT(md,weight); doesn't matter here in code cost compiler optimizes this anyway
|
||||
}
|
||||
|
||||
#if defined(PCBTARANIS)
|
||||
void clearInputs()
|
||||
{
|
||||
memset(g_model.expoData, 0, sizeof(g_model.expoData)); // clear all expos
|
||||
}
|
||||
|
||||
void defaultInputs()
|
||||
{
|
||||
clearInputs();
|
||||
|
||||
for (int i=0; i<NUM_STICKS; i++) {
|
||||
s_currCh = i+1;
|
||||
insertExpoMix(1, i);
|
||||
for (int c=0; c<4; c++) {
|
||||
g_model.inputNames[i][c] = char2idx(STR_VSRCRAW[1+STR_VSRCRAW[0]*(expoAddress(i)->srcRaw-MIXSRC_Rud+1)+c]);
|
||||
}
|
||||
}
|
||||
eeDirty(EE_MODEL);
|
||||
}
|
||||
#define TMPL_INPUT(x) (MIXSRC_FIRST_INPUT+channel_order(x)-1)
|
||||
#else
|
||||
#define clearInputs()
|
||||
#define defaultInputs()
|
||||
#define TMPL_INPUT(x) (MIXSRC_Rud+x-1)
|
||||
#endif
|
||||
|
||||
void clearMixes()
|
||||
{
|
||||
memset(g_model.mixData, 0, sizeof(g_model.mixData)); // clear all mixes
|
||||
eeDirty(EE_MODEL);
|
||||
}
|
||||
|
||||
void clearCurves()
|
||||
@@ -136,8 +161,10 @@ void applyTemplate(uint8_t idx)
|
||||
//ICC(vSTK) -> STK
|
||||
#define ICC(x) icc[(x)-1]
|
||||
uint8_t icc[4] = {0};
|
||||
for (uint8_t i=0; i<4; i++) //generate inverse array
|
||||
for(uint8_t j=0; j<4; j++) if(CC(i+1)==j+1) icc[j]=i;
|
||||
for (uint8_t i=0; i<4; i++) { //generate inverse array
|
||||
for(uint8_t j=0; j<4; j++)
|
||||
if(CC(i+1)==j+1) icc[j]=i;
|
||||
}
|
||||
|
||||
switch (idx) {
|
||||
case TMPL_CLEAR_MIXES:
|
||||
@@ -150,17 +177,15 @@ void applyTemplate(uint8_t idx)
|
||||
switch (idx) {
|
||||
// Simple 4-Ch
|
||||
case TMPL_SIMPLE_4CH:
|
||||
setDest(ICC(STK_RUD), MIXSRC_Rud);
|
||||
setDest(ICC(STK_ELE), MIXSRC_Ele);
|
||||
setDest(ICC(STK_THR), MIXSRC_Thr);
|
||||
setDest(ICC(STK_AIL), MIXSRC_Ail);
|
||||
clearInputs();
|
||||
applyDefaultTemplate();
|
||||
break;
|
||||
|
||||
// Sticky-T-Cut
|
||||
case TMPL_STI_THR_CUT:
|
||||
md=setDest(ICC(STK_THR), MIXSRC_MAX); md_SetWeight(md, -100); md->swtch=SWSRC_SWC; md->mltpx=MLTPX_REP;
|
||||
md=setDest(ICC(STK_THR), MIXSRC_MAX); mixSetWeight(md, -100); md->swtch=SWSRC_SWC; md->mltpx=MLTPX_REP;
|
||||
md=setDest(13, MIXSRC_CH14); // md->weight= 100; done by setDest anyway
|
||||
md=setDest(13, MIXSRC_MAX); md_SetWeight(md, -100); md->swtch=SWSRC_SWB; md->mltpx=MLTPX_REP;
|
||||
md=setDest(13, MIXSRC_MAX); mixSetWeight(md, -100); md->swtch=SWSRC_SWB; md->mltpx=MLTPX_REP;
|
||||
md=setDest(13, MIXSRC_MAX); /* md->weight= 100;*/ md->swtch=SWSRC_THR; md->mltpx=MLTPX_REP;
|
||||
setSwitch(11, CS_VNEG, STK_THR, -99);
|
||||
setSwitch(12, CS_VPOS, MIXSRC_CH14, 0);
|
||||
@@ -168,29 +193,34 @@ void applyTemplate(uint8_t idx)
|
||||
|
||||
// V-Tail
|
||||
case TMPL_V_TAIL:
|
||||
setDest(ICC(STK_RUD), MIXSRC_Rud, true);
|
||||
md=setDest(ICC(STK_RUD), MIXSRC_Ele); md_SetWeight(md, -100);
|
||||
setDest(ICC(STK_ELE), MIXSRC_Rud, true);
|
||||
setDest(ICC(STK_ELE), MIXSRC_Ele);
|
||||
defaultInputs();
|
||||
setDest(ICC(STK_RUD), TMPL_INPUT(STK_RUD), true);
|
||||
md=setDest(ICC(STK_RUD), TMPL_INPUT(STK_ELE)); mixSetWeight(md, -100);
|
||||
setDest(ICC(STK_ELE), TMPL_INPUT(STK_RUD), true);
|
||||
setDest(ICC(STK_ELE), TMPL_INPUT(STK_ELE));
|
||||
break;
|
||||
|
||||
// Elevon\\Delta
|
||||
case TMPL_ELEVON_DELTA:
|
||||
defaultInputs();
|
||||
#if defined(PCBTARANIS)
|
||||
#warning "Templates below are not implemented (only V-TAIL has been done). Feel free to help!"
|
||||
#endif
|
||||
setDest(ICC(STK_ELE), MIXSRC_Ele, true);
|
||||
setDest(ICC(STK_ELE), MIXSRC_Ail);
|
||||
setDest(ICC(STK_AIL), MIXSRC_Ele, true);
|
||||
md=setDest(ICC(STK_AIL), MIXSRC_Ail); md_SetWeight(md, -100);
|
||||
md=setDest(ICC(STK_AIL), MIXSRC_Ail); mixSetWeight(md, -100);
|
||||
break;
|
||||
|
||||
// eCCPM
|
||||
case TMPL_ECCPM:
|
||||
md=setDest(ICC(STK_ELE), MIXSRC_Ele, true); md->weight= 72;
|
||||
md=setDest(ICC(STK_ELE), MIXSRC_Thr); md->weight= 55;
|
||||
md=setDest(ICC(STK_AIL), MIXSRC_Ele, true); md_SetWeight(md, -36);
|
||||
md=setDest(ICC(STK_AIL), MIXSRC_Ele, true); mixSetWeight(md, -36);
|
||||
md=setDest(ICC(STK_AIL), MIXSRC_Ail); md->weight= 62;
|
||||
md=setDest(ICC(STK_AIL), MIXSRC_Thr); md->weight= 55;
|
||||
md=setDest(5, MIXSRC_Ele, true); md_SetWeight(md, -36);
|
||||
md=setDest(5, MIXSRC_Ail); md_SetWeight(md, -62);
|
||||
md=setDest(5, MIXSRC_Ele, true); mixSetWeight(md, -36);
|
||||
md=setDest(5, MIXSRC_Ail); mixSetWeight(md, -62);
|
||||
md=setDest(5, MIXSRC_Thr); md->weight= 55;
|
||||
break;
|
||||
|
||||
@@ -208,30 +238,38 @@ void applyTemplate(uint8_t idx)
|
||||
md=setDest(3, MIXSRC_Rud); // md->weight=100;
|
||||
|
||||
// throttle
|
||||
md=setDest(4, MIXSRC_Thr); md->swtch=SWSRC_ID0; md->curveMode=MODE_CURVE; md->curveParam=CV(1); md->carryTrim=TRIM_OFF;
|
||||
md=setDest(4, MIXSRC_Thr); md->swtch=SWSRC_ID1; md->curveMode=MODE_CURVE; md->curveParam=CV(2); md->carryTrim=TRIM_OFF;
|
||||
md=setDest(4, MIXSRC_Thr); md->swtch=SWSRC_ID2; md->curveMode=MODE_CURVE; md->curveParam=CV(3); md->carryTrim=TRIM_OFF;
|
||||
md=setDest(4, MIXSRC_MAX); md_SetWeight(md, -100); md->swtch=SWSRC_THR; md->mltpx=MLTPX_REP;
|
||||
#if defined(PCBTARANIS)
|
||||
// TODO
|
||||
#else
|
||||
md=setDest(4, MIXSRC_Thr); md->swtch=SWSRC_ID0; mixSetCurve(md, 0); md->carryTrim=TRIM_OFF;
|
||||
md=setDest(4, MIXSRC_Thr); md->swtch=SWSRC_ID1; mixSetCurve(md, 1); md->carryTrim=TRIM_OFF;
|
||||
md=setDest(4, MIXSRC_Thr); md->swtch=SWSRC_ID2; mixSetCurve(md, 2); md->carryTrim=TRIM_OFF;
|
||||
#endif
|
||||
md=setDest(4, MIXSRC_MAX); mixSetWeight(md, -100); md->swtch=SWSRC_THR; md->mltpx=MLTPX_REP;
|
||||
|
||||
// gyro gain
|
||||
md=setDest(5, MIXSRC_MAX); md->weight= 30; md->swtch=-SWSRC_GEA;
|
||||
md=setDest(5, MIXSRC_MAX); md_SetWeight(md, -30); md->swtch= SWSRC_GEA;
|
||||
md=setDest(5, MIXSRC_MAX); mixSetWeight(md, -30); md->swtch= SWSRC_GEA;
|
||||
|
||||
// collective
|
||||
md=setDest(10, MIXSRC_Thr); /*md->weight= 100;*/ md->swtch=SWSRC_ID0; md->curveMode=MODE_CURVE; md->curveParam=CV(4); md->carryTrim=TRIM_OFF;
|
||||
md=setDest(10, MIXSRC_Thr); /*md->weight= 100;*/ md->swtch=SWSRC_ID1; md->curveMode=MODE_CURVE; md->curveParam=CV(5); md->carryTrim=TRIM_OFF;
|
||||
md=setDest(10, MIXSRC_Thr); /*md->weight= 100;*/ md->swtch=SWSRC_ID2; md->curveMode=MODE_CURVE; md->curveParam=CV(6); md->carryTrim=TRIM_OFF;
|
||||
#if defined(PCBTARANIS)
|
||||
// TODO
|
||||
#else
|
||||
md=setDest(10, MIXSRC_Thr); /*md->weight= 100;*/ md->swtch=SWSRC_ID0; mixSetCurve(md, 3); md->carryTrim=TRIM_OFF;
|
||||
md=setDest(10, MIXSRC_Thr); /*md->weight= 100;*/ md->swtch=SWSRC_ID1; mixSetCurve(md, 4); md->carryTrim=TRIM_OFF;
|
||||
md=setDest(10, MIXSRC_Thr); /*md->weight= 100;*/ md->swtch=SWSRC_ID2; mixSetCurve(md, 5); md->carryTrim=TRIM_OFF;
|
||||
#endif
|
||||
|
||||
g_model.swashR.collectiveSource = MIXSRC_CH11;
|
||||
g_model.swashR.type = SWASH_TYPE_120;
|
||||
|
||||
//Set up Curves
|
||||
setCurve(CURVE5(1), heli_ar1);
|
||||
setCurve(CURVE5(2), heli_ar2);
|
||||
setCurve(CURVE5(3), heli_ar3);
|
||||
setCurve(CURVE5(4), heli_ar4);
|
||||
setCurve(CURVE5(5), heli_ar5);
|
||||
setCurve(CURVE5(6), heli_ar5);
|
||||
// curves
|
||||
setCurve(0, heli_ar1);
|
||||
setCurve(1, heli_ar2);
|
||||
setCurve(2, heli_ar3);
|
||||
setCurve(3, heli_ar4);
|
||||
setCurve(4, heli_ar5);
|
||||
setCurve(5, heli_ar5);
|
||||
break;
|
||||
|
||||
// Servo Test
|
||||
|
||||
+6
-10
@@ -68,10 +68,13 @@
|
||||
#define STK_P3 7
|
||||
|
||||
#define CV(x) (CURVE_BASE+(x)-1)
|
||||
#define CC(x) (channel_order(x)) //need to invert this to work with dest
|
||||
#define CC(x) (MIXSRC_Rud - 1 + channel_order(x)) // need to invert this to work with dest
|
||||
|
||||
#define CURVE5(x) ((x)-1)
|
||||
#define CURVE9(x) (MAX_CURVE5+(x)-1)
|
||||
#if defined(PCBTARANIS)
|
||||
#define mixSetCurve(mix, idx) mix->curve.type=CURVE_REF_CUSTOM; mix->curve.value=idx
|
||||
#else
|
||||
#define mixSetCurve(mix, idx) mix->curveMode=MODE_CURVE; mix->curveParam=CURVE_BASE+idx
|
||||
#endif
|
||||
|
||||
enum Templates {
|
||||
TMPL_CLEAR_MIXES,
|
||||
@@ -89,13 +92,6 @@ void clearMixes();
|
||||
void clearCurves();
|
||||
void applyTemplate(uint8_t idx);
|
||||
|
||||
#ifdef TEMPLATES
|
||||
inline void applyDefaultTemplate()
|
||||
{
|
||||
applyTemplate(TMPL_SIMPLE_4CH);
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif //TEMPLATES_H
|
||||
|
||||
|
||||
|
||||
+30
-6
@@ -100,6 +100,7 @@ const pm_char STR_OPEN9X[] PROGMEM =
|
||||
#if defined(CPUARM)
|
||||
ISTR(VLCD)
|
||||
ISTR(VUNITSSYSTEM)
|
||||
ISTR(VBEEPCOUNTDOWN)
|
||||
#endif
|
||||
#if defined(PXX)
|
||||
ISTR(COUNTRYCODES)
|
||||
@@ -247,9 +248,6 @@ const pm_char STR_TMR1LATMAXUS[] PROGMEM = TR_TMR1LATMAXUS;
|
||||
const pm_char STR_TMR1LATMINUS[] PROGMEM = TR_TMR1LATMINUS;
|
||||
const pm_char STR_TMR1JITTERUS[] PROGMEM = TR_TMR1JITTERUS;
|
||||
const pm_char STR_TMIXMAXMS[] PROGMEM = TR_TMIXMAXMS;
|
||||
#ifdef DEBUG
|
||||
const pm_char STR_T10MSUS[] PROGMEM = TR_T10MSUS;
|
||||
#endif
|
||||
const pm_char STR_FREESTACKMINB[] PROGMEM = TR_FREESTACKMINB;
|
||||
const pm_char STR_MENUTORESET[] PROGMEM = TR_MENUTORESET;
|
||||
const pm_char STR_PPM[] PROGMEM = TR_PPM;
|
||||
@@ -288,7 +286,7 @@ const pm_char STR_MENUFLIGHTPHASES[] PROGMEM = TR_MENUFLIGHTPHASES;
|
||||
const pm_char STR_MENUHELISETUP[] PROGMEM = TR_MENUHELISETUP;
|
||||
#endif
|
||||
|
||||
const pm_char STR_MENUDREXPO[] PROGMEM = TR_MENUDREXPO;
|
||||
const pm_char STR_MENUINPUTS[] PROGMEM = TR_MENUINPUTS;
|
||||
const pm_char STR_MENULIMITS[] PROGMEM = TR_MENULIMITS;
|
||||
const pm_char STR_MENUCURVES[] PROGMEM = TR_MENUCURVES;
|
||||
const pm_char STR_MENUCURVE[] PROGMEM = TR_MENUCURVE;
|
||||
@@ -296,6 +294,11 @@ const pm_char STR_MENUCUSTOMSWITCH[] PROGMEM = TR_MENUCUSTOMSWITCH;
|
||||
const pm_char STR_MENUCUSTOMSWITCHES[] PROGMEM = TR_MENUCUSTOMSWITCHES;
|
||||
const pm_char STR_MENUCUSTOMFUNC[] PROGMEM = TR_MENUCUSTOMFUNC;
|
||||
|
||||
#if defined(LUA)
|
||||
const pm_char STR_MENUCUSTOMSCRIPTS[] PROGMEM = "CUSTOM SCRIPTS";
|
||||
const pm_char STR_MENUCUSTOMSCRIPT[] PROGMEM = "CUSTOM SCRIPT";
|
||||
#endif
|
||||
|
||||
#if defined(FRSKY)
|
||||
const pm_char STR_MENUTELEMETRY[] PROGMEM = TR_MENUTELEMETRY;
|
||||
const pm_char STR_LIMIT[] PROGMEM = TR_LIMIT;
|
||||
@@ -366,6 +369,7 @@ const pm_char STR_INSERT_AFTER[] PROGMEM = TR_INSERT_AFTER;
|
||||
const pm_char STR_COPY[] PROGMEM = TR_COPY;
|
||||
const pm_char STR_MOVE[] PROGMEM = TR_MOVE;
|
||||
const pm_char STR_PASTE[] PROGMEM = TR_PASTE;
|
||||
const pm_char STR_INSERT[] PROGMEM = TR_INSERT;
|
||||
const pm_char STR_DELETE[] PROGMEM = TR_DELETE;
|
||||
const pm_char STR_RESET_FLIGHT[] PROGMEM = TR_RESET_FLIGHT;
|
||||
const pm_char STR_RESET_TIMER1[] PROGMEM = TR_RESET_TIMER1;
|
||||
@@ -375,7 +379,7 @@ const pm_char STR_STATISTICS[] PROGMEM = TR_STATISTICS;
|
||||
const pm_char STR_ABOUT_US[] PROGMEM = TR_ABOUT_US;
|
||||
#endif
|
||||
|
||||
const pm_char STR_RESET[] PROGMEM = TR_RESET;
|
||||
const pm_char STR_RESET_BTN[] PROGMEM = TR_RESET_BTN;
|
||||
|
||||
#if defined(SDCARD)
|
||||
const pm_char STR_BACKUP_MODEL[] PROGMEM = TR_BACKUP_MODEL;
|
||||
@@ -415,8 +419,10 @@ const pm_char STR_SDHC_CARD[] PROGMEM = TR_SDHC_CARD;
|
||||
const pm_char STR_NO_SOUNDS_ON_SD[] PROGMEM = TR_NO_SOUNDS_ON_SD;
|
||||
const pm_char STR_NO_MODELS_ON_SD[] PROGMEM = TR_NO_MODELS_ON_SD;
|
||||
const pm_char STR_NO_BITMAPS_ON_SD[] PROGMEM = TR_NO_BITMAPS_ON_SD;
|
||||
const pm_char STR_NO_SCRIPTS_ON_SD[] PROGMEM = "No Scripts on SD"; // TODO TR_NO_BITMAPS_ON_SD;
|
||||
const pm_char STR_PLAY_FILE[] PROGMEM = TR_PLAY_FILE;
|
||||
const pm_char STR_ASSIGN_BITMAP[] PROGMEM = TR_ASSIGN_BITMAP;
|
||||
const pm_char STR_EXECUTE_FILE[] PROGMEM = "Execute";
|
||||
const pm_char STR_DELETE_FILE[] PROGMEM = TR_DELETE_FILE;
|
||||
const pm_char STR_COPY_FILE[] PROGMEM = TR_COPY_FILE;
|
||||
const pm_char STR_RENAME_FILE[] PROGMEM = TR_RENAME_FILE;
|
||||
@@ -442,6 +448,7 @@ const pm_char STR_ROTARY_ENCODER[] PROGMEM = TR_ROTARY_ENCODER;
|
||||
const pm_char STR_DATE[] PROGMEM = TR_DATE;
|
||||
const pm_char STR_CHANNELS_MONITOR[] PROGMEM = TR_CHANNELS_MONITOR;
|
||||
const pm_char STR_PATH_TOO_LONG[] PROGMEM = "Path too long";
|
||||
const pm_char STR_VIEW_TEXT[] PROGMEM = "View text";
|
||||
|
||||
#if LCD_W >= 212
|
||||
const pm_char STR_MODELNAME[] PROGMEM = TR_MODELNAME;
|
||||
@@ -466,6 +473,24 @@ const pm_char STR_PATH_TOO_LONG[] PROGMEM = "Path too long";
|
||||
const pm_char STR_CHANNELRANGE[] PROGMEM = TR_CHANNELRANGE;
|
||||
const pm_char STR_LOWALARM[] PROGMEM = TR_LOWALARM;
|
||||
const pm_char STR_CRITICALALARM[] PROGMEM = TR_CRITICALALARM;
|
||||
const pm_char STR_ENABLE_POPUP[] PROGMEM = "Enable Popup";
|
||||
const pm_char STR_DISABLE_POPUP[] PROGMEM = "Disable Popup";
|
||||
const pm_char STR_CURVE_PRESET[] PROGMEM = "Preset...";
|
||||
const pm_char STR_PRESET[] PROGMEM = "Preset";
|
||||
const pm_char STR_MIRROR[] PROGMEM = "Mirror";
|
||||
const pm_char STR_CLEAR[] PROGMEM = "Clear";
|
||||
const pm_char STR_RESET[] PROGMEM = "Reset";
|
||||
const pm_char STR_COPY_TRIMS_TO_OFFSET[] = "Copy Trims To Offset";
|
||||
const pm_char STR_TOP_BAR[] PROGMEM = "Top Bar";
|
||||
const pm_char STR_ALTITUDE[] PROGMEM = INDENT "Altitude";
|
||||
const pm_char STR_SCALE[] PROGMEM = "Scale";
|
||||
const pm_char STR_VIEW_CHANNELS[] PROGMEM = "View Channels";
|
||||
const pm_char STR_VIEW_NOTES[] PROGMEM = "View Notes";
|
||||
#endif
|
||||
|
||||
#if MENUS_LOCK == 1
|
||||
const pm_char STR_UNLOCKED[] PROGMEM = TR_UNLOCKED;
|
||||
const pm_char STR_MODS_FORBIDDEN[] PROGMEM = TR_MODS_FORBIDDEN;
|
||||
#endif
|
||||
|
||||
#if defined(PCBTARANIS) || defined(DSM2)
|
||||
@@ -636,4 +661,3 @@ const pm_uchar font_10x14_extra[] PROGMEM = {
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
+29
-8
@@ -150,11 +150,8 @@ extern const pm_char STR_OPEN9X[];
|
||||
#endif
|
||||
#if defined(CPUARM)
|
||||
#define OFS_VUNITSSYSTEM (OFS_VLCD + sizeof(TR_VLCD))
|
||||
#else
|
||||
#define OFS_VUNITSSYSTEM (OFS_VLCD)
|
||||
#endif
|
||||
#if defined(CPUARM)
|
||||
#define OFS_COUNTRYCODES (OFS_VUNITSSYSTEM + sizeof(TR_VUNITSSYSTEM))
|
||||
#define OFS_VBEEPCOUNTDOWN (OFS_VUNITSSYSTEM + sizeof(TR_VUNITSSYSTEM))
|
||||
#define OFS_COUNTRYCODES (OFS_VBEEPCOUNTDOWN + sizeof(TR_VBEEPCOUNTDOWN))
|
||||
#else
|
||||
#define OFS_COUNTRYCODES (OFS_VUNITSSYSTEM)
|
||||
#endif
|
||||
@@ -251,6 +248,7 @@ extern const pm_char STR_OPEN9X[];
|
||||
#if defined(CPUARM)
|
||||
#define STR_VLCD (STR_OPEN9X + OFS_VLCD)
|
||||
#define STR_VUNITSSYSTEM (STR_OPEN9X + OFS_VUNITSSYSTEM)
|
||||
#define STR_VBEEPCOUNTDOWN (STR_OPEN9X + OFS_VBEEPCOUNTDOWN)
|
||||
#endif
|
||||
|
||||
#if defined(PXX)
|
||||
@@ -397,7 +395,6 @@ extern const pm_char STR_TMR1LATMAXUS[];
|
||||
extern const pm_char STR_TMR1LATMINUS[];
|
||||
extern const pm_char STR_TMR1JITTERUS[];
|
||||
extern const pm_char STR_TMIXMAXMS[];
|
||||
extern const pm_char STR_T10MSUS[];
|
||||
extern const pm_char STR_FREESTACKMINB[];
|
||||
extern const pm_char STR_MENUTORESET[];
|
||||
extern const pm_char STR_PPM[];
|
||||
@@ -430,13 +427,15 @@ extern const pm_char STR_MENUSETUP[];
|
||||
extern const pm_char STR_MENUFLIGHTPHASE[];
|
||||
extern const pm_char STR_MENUFLIGHTPHASES[];
|
||||
extern const pm_char STR_MENUHELISETUP[];
|
||||
extern const pm_char STR_MENUDREXPO[];
|
||||
extern const pm_char STR_MENUINPUTS[];
|
||||
extern const pm_char STR_MENULIMITS[];
|
||||
extern const pm_char STR_MENUCURVES[];
|
||||
extern const pm_char STR_MENUCURVE[];
|
||||
extern const pm_char STR_MENUCUSTOMSWITCH[];
|
||||
extern const pm_char STR_MENUCUSTOMSWITCHES[];
|
||||
extern const pm_char STR_MENUCUSTOMFUNC[];
|
||||
extern const pm_char STR_MENUCUSTOMSCRIPTS[];
|
||||
extern const pm_char STR_MENUCUSTOMSCRIPT[];
|
||||
extern const pm_char STR_MENUTELEMETRY[];
|
||||
extern const pm_char STR_MENUTEMPLATES[];
|
||||
extern const pm_char STR_MENUSTAT[];
|
||||
@@ -506,6 +505,7 @@ extern const pm_char STR_CURRENT[];
|
||||
extern const pm_char STR_COPY[];
|
||||
extern const pm_char STR_MOVE[];
|
||||
extern const pm_char STR_PASTE[];
|
||||
extern const pm_char STR_INSERT[];
|
||||
extern const pm_char STR_DELETE[];
|
||||
extern const pm_char STR_RESET_FLIGHT[];
|
||||
extern const pm_char STR_RESET_TIMER1[];
|
||||
@@ -515,7 +515,7 @@ extern const pm_char STR_CURRENT[];
|
||||
extern const pm_char STR_ABOUT_US[];
|
||||
#endif
|
||||
|
||||
extern const pm_char STR_RESET[];
|
||||
extern const pm_char STR_RESET_BTN[];
|
||||
|
||||
#if defined(SDCARD)
|
||||
extern const pm_char STR_BACKUP_MODEL[];
|
||||
@@ -568,8 +568,10 @@ extern const pm_char STR_SDHC_CARD[];
|
||||
extern const pm_char STR_NO_SOUNDS_ON_SD[];
|
||||
extern const pm_char STR_NO_MODELS_ON_SD[];
|
||||
extern const pm_char STR_NO_BITMAPS_ON_SD[];
|
||||
extern const pm_char STR_NO_SCRIPTS_ON_SD[];
|
||||
extern const pm_char STR_PLAY_FILE[];
|
||||
extern const pm_char STR_ASSIGN_BITMAP[];
|
||||
extern const pm_char STR_EXECUTE_FILE[];
|
||||
extern const pm_char STR_DELETE_FILE[];
|
||||
extern const pm_char STR_COPY_FILE[];
|
||||
extern const pm_char STR_RENAME_FILE[];
|
||||
@@ -595,6 +597,7 @@ extern const pm_char STR_ROTARY_ENCODER[];
|
||||
extern const pm_char STR_DATE[];
|
||||
extern const pm_char STR_CHANNELS_MONITOR[];
|
||||
extern const pm_char STR_PATH_TOO_LONG[];
|
||||
extern const pm_char STR_VIEW_TEXT[];
|
||||
|
||||
#if defined(VOICE) && defined(CPUARM)
|
||||
struct LanguagePack {
|
||||
@@ -648,6 +651,24 @@ extern const pm_char STR_PATH_TOO_LONG[];
|
||||
extern const pm_char STR_CHANNELRANGE[];
|
||||
extern const pm_char STR_LOWALARM[];
|
||||
extern const pm_char STR_CRITICALALARM[];
|
||||
extern const pm_char STR_ENABLE_POPUP[];
|
||||
extern const pm_char STR_DISABLE_POPUP[];
|
||||
extern const pm_char STR_CURVE_PRESET[];
|
||||
extern const pm_char STR_PRESET[];
|
||||
extern const pm_char STR_MIRROR[];
|
||||
extern const pm_char STR_CLEAR[];
|
||||
extern const pm_char STR_RESET[];
|
||||
extern const pm_char STR_COPY_TRIMS_TO_OFFSET[];
|
||||
extern const pm_char STR_TOP_BAR[];
|
||||
extern const pm_char STR_ALTITUDE[];
|
||||
extern const pm_char STR_SCALE[];
|
||||
extern const pm_char STR_VIEW_CHANNELS[];
|
||||
extern const pm_char STR_VIEW_NOTES[];
|
||||
#endif
|
||||
|
||||
#if MENUS_LOCK == 1
|
||||
extern const pm_char STR_UNLOCKED[];
|
||||
extern const pm_char STR_MODS_FORBIDDEN[];
|
||||
#endif
|
||||
|
||||
#if defined(PCBTARANIS) || defined(DSM2)
|
||||
|
||||
@@ -530,7 +530,7 @@
|
||||
// Alignment
|
||||
|
||||
|
||||
#define TR_MENUDREXPO "DR/EXPO"
|
||||
#define TR_MENUINPUTS "DR/EXPO"
|
||||
#define TR_MENULIMITS "LIMITY"
|
||||
|
||||
|
||||
@@ -684,7 +684,7 @@
|
||||
|
||||
// Taranis column headers
|
||||
#define TR_PHASES_HEADERS { " Jm\202no ", " Sp\204na\201 ", " Trimy ", " P\206echod Zap ", " P\206echod Vyp " }
|
||||
#define TR_LIMITS_HEADERS { " Jm\202no ", " Subtrim ", " Min ", " Max ", " Sm\203r ", " St\206ed PPM ", " Symetrick\202 " }
|
||||
#define TR_LIMITS_HEADERS { " Jm\202no ", " Subtrim ", " Min ", " Max ", " Sm\203r ", " Curve ", " St\206ed PPM ", " Symetrick\202 " }
|
||||
#define TR_CSW_HEADERS { " Funkce ", " Hodnota 1 ", " Hodnota 2 ", " AND Sp\204na\201 ", " Trv\200n\204 ", " Zpo\217d\203n\204 " }
|
||||
|
||||
//Taranis About screen
|
||||
|
||||
@@ -530,7 +530,7 @@
|
||||
// Alignment
|
||||
|
||||
|
||||
#define TR_MENUDREXPO "DR/EXPO"
|
||||
#define TR_MENUINPUTS "DR/EXPO"
|
||||
#define TR_MENULIMITS "LIMITY"
|
||||
|
||||
|
||||
@@ -684,7 +684,7 @@
|
||||
|
||||
// Taranis column headers
|
||||
#define TR_PHASES_HEADERS { " Jméno ", " Spínač ", " Trimy ", " Přechod Zap ", " Přechod Vyp " }
|
||||
#define TR_LIMITS_HEADERS { " Jméno ", " Subtrim ", " Min ", " Max ", " Směr ", " Střed PPM ", " Symetrické " }
|
||||
#define TR_LIMITS_HEADERS { " Jméno ", " Subtrim ", " Min ", " Max ", " Směr ", " Curve ", " Střed PPM ", " Symetrické " }
|
||||
#define TR_CSW_HEADERS { " Funkce ", " Hodnota 1 ", " Hodnota 2 ", " AND Spínač ", " Trvání ", " Zpoždění " }
|
||||
|
||||
//Taranis About screen
|
||||
|
||||
@@ -646,7 +646,7 @@
|
||||
#define TR_BYTES "bytes"
|
||||
#define TR_MODULE_BIND "[Bind]"
|
||||
#define TR_MODULE_RANGE "[Range]"
|
||||
#define TR_RESET "[Reset]"
|
||||
#define TR_RESET_BTN "[Reset]"
|
||||
#define TR_SET "[Set]"
|
||||
#define TR_TRAINER "----Trainer Buchse Einst.------" //DSC Buchse Funktion
|
||||
#define TR_ANTENNAPROBLEM CENTER "TX Antennen Problem!"
|
||||
|
||||
@@ -646,7 +646,7 @@
|
||||
#define TR_BYTES "bytes"
|
||||
#define TR_MODULE_BIND "[Bind]"
|
||||
#define TR_MODULE_RANGE "[Range]"
|
||||
#define TR_RESET "[Reset]"
|
||||
#define TR_RESET_BTN "[Reset]"
|
||||
#define TR_SET "[Set]"
|
||||
#define TR_TRAINER "----Trainer Buchse Einst.------" //DSC Buchse Funktion
|
||||
#define TR_ANTENNAPROBLEM CENTER "TX Antennen Problem!"
|
||||
|
||||
+26
-9
@@ -74,6 +74,9 @@
|
||||
#define LEN_VTRIMINC TR("\006","\013")
|
||||
#define TR_VTRIMINC TR("Expo ""ExFine""Fine ""Medium""Coarse","Exponential""Extra Fine ""Fine ""Medium ""Coarse ")
|
||||
|
||||
#define LEN_VBEEPCOUNTDOWN "\006"
|
||||
#define TR_VBEEPCOUNTDOWN "SilentBeeps\0Voice\0"
|
||||
|
||||
#define LEN_RETA123 "\001"
|
||||
|
||||
#if defined(PCBGRUVIN9X)
|
||||
@@ -384,7 +387,11 @@
|
||||
#define TR_MODELNAME "Model Name"
|
||||
#define TR_PHASENAME "Mode Name"
|
||||
#define TR_MIXNAME "Mix Name"
|
||||
#define TR_EXPONAME "Expo Name"
|
||||
#if defined(PCBTARANIS)
|
||||
#define TR_EXPONAME "Line Name"
|
||||
#else
|
||||
#define TR_EXPONAME "Expo Name"
|
||||
#endif
|
||||
#define TR_BITMAP "Model Image"
|
||||
#define TR_TIMER TR("Timer","Timer ")
|
||||
#define TR_ELIMITS TR("E.Limits","Extended Limits")
|
||||
@@ -490,13 +497,13 @@
|
||||
#define TR_TMR1JITTERUS "Tmr1 Jitter\006us"
|
||||
|
||||
#if defined(CPUARM)
|
||||
#define TR_TMIXMAXMS "Tmix max\012ms"
|
||||
#define TR_TMIXMAXMS "Tmix max"
|
||||
#define TR_FREESTACKMINB "Free Stack"
|
||||
#else
|
||||
#define TR_TMIXMAXMS "Tmix max\014ms"
|
||||
#define TR_FREESTACKMINB "Free Stack\010b"
|
||||
#endif
|
||||
|
||||
#define TR_T10MSUS "T10ms\016us"
|
||||
#define TR_FREESTACKMINB "Free Stack\010b"
|
||||
#define TR_MENUTORESET CENTER TR_ENTER " to reset"
|
||||
#define TR_PPM "PPM"
|
||||
#define TR_CH "CH"
|
||||
@@ -526,11 +533,14 @@
|
||||
#define TR_MENUFLIGHTPHASES "FLIGHT MODES"
|
||||
#define TR_MENUHELISETUP "HELI SETUP"
|
||||
|
||||
#if defined(PPM_CENTER_ADJUSTABLE) || defined(PPM_LIMITS_SYMETRICAL) // The right menu titles for the gurus ...
|
||||
#define TR_MENUDREXPO "STICKS"
|
||||
#if defined(PCBTARANIS)
|
||||
#define TR_MENUINPUTS "INPUTS"
|
||||
#define TR_MENULIMITS "SERVOS"
|
||||
#elif defined(PPM_CENTER_ADJUSTABLE) || defined(PPM_LIMITS_SYMETRICAL) // The right menu titles for the gurus ...
|
||||
#define TR_MENUINPUTS "STICKS"
|
||||
#define TR_MENULIMITS "SERVOS"
|
||||
#else
|
||||
#define TR_MENUDREXPO "DR/EXPO"
|
||||
#define TR_MENUINPUTS "DR/EXPO"
|
||||
#define TR_MENULIMITS "LIMITS"
|
||||
#endif
|
||||
|
||||
@@ -633,6 +643,7 @@
|
||||
#define TR_MOVE "Move"
|
||||
#define TR_PASTE "Paste"
|
||||
#define TR_DELETE "Delete"
|
||||
#define TR_INSERT "Insert"
|
||||
#define TR_RESET_FLIGHT "Reset Flight"
|
||||
#define TR_RESET_TIMER1 "Reset Timer1"
|
||||
#define TR_RESET_TIMER2 "Reset Timer2"
|
||||
@@ -646,7 +657,7 @@
|
||||
#define TR_BYTES "bytes"
|
||||
#define TR_MODULE_BIND "[Bind]"
|
||||
#define TR_MODULE_RANGE "[Range]"
|
||||
#define TR_RESET "[Reset]"
|
||||
#define TR_RESET_BTN "[Reset]"
|
||||
#define TR_SET "[Set]"
|
||||
#define TR_TRAINER "Trainer"
|
||||
#define TR_ANTENNAPROBLEM CENTER "TX Antenna problem!"
|
||||
@@ -686,7 +697,7 @@
|
||||
|
||||
// Taranis column headers
|
||||
#define TR_PHASES_HEADERS { " Name ", " Switch ", " Trims ", " Fade In ", " Fade Out " }
|
||||
#define TR_LIMITS_HEADERS { " Name ", " Subtrim ", " Min ", " Max ", " Direction ", " PPM Center ", " Subtrim mode " }
|
||||
#define TR_LIMITS_HEADERS { " Name ", " Subtrim ", " Min ", " Max ", " Direction ", " Curve ", " PPM Center ", " Subtrim mode " }
|
||||
#define TR_CSW_HEADERS { " Function ", " V1 ", " V2 ", " AND Switch ", " Duration ", " Delay " }
|
||||
|
||||
// About screen
|
||||
@@ -745,3 +756,9 @@
|
||||
#define TR_WAV_VOLUME "Wav Volume"
|
||||
#define TR_VARIO_VOLUME "Vario Volume"
|
||||
#define TR_BG_VOLUME "Bg Volume"
|
||||
|
||||
#define TR_TOP_BAR "Top Bar"
|
||||
#define TR_ALTITUDE INDENT "Altitude"
|
||||
#define TR_MODS_FORBIDDEN "Modifications forbidden!"
|
||||
#define TR_UNLOCKED "Unlocked"
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/*
|
||||
/*
|
||||
* Authors (alphabetical order)
|
||||
* - Bertrand Songis <bsongis@gmail.com>
|
||||
* - Bernet Andre <bernet.andre@gmail.com>
|
||||
@@ -527,10 +527,10 @@
|
||||
#define TR_MENUHELISETUP "CONF. HELI"
|
||||
|
||||
#if defined(PPM_CENTER_ADJUSTABLE) || defined(PPM_LIMITS_SYMETRICAL) // The right menu titles for the gurus ...
|
||||
#define TR_MENUDREXPO "STICKS"
|
||||
#define TR_MENUINPUTS "STICKS"
|
||||
#define TR_MENULIMITS "SERVOS"
|
||||
#else
|
||||
#define TR_MENUDREXPO "DR/EXPO"
|
||||
#define TR_MENUINPUTS "DR/EXPO"
|
||||
#define TR_MENULIMITS "LIMITES"
|
||||
#endif
|
||||
|
||||
@@ -610,7 +610,7 @@
|
||||
#define TR_SD_TYPE "Tipo:"
|
||||
#define TR_SD_SPEED "Velocidad:"
|
||||
#define TR_SD_SECTORS "Sectores:"
|
||||
#define TR_SD_SIZE "Tamaño:"
|
||||
#define TR_SD_SIZE "Tama\201o:"
|
||||
#define TR_TYPE "Tipo"
|
||||
#define TR_GLOBAL_VARS "Global Variables"
|
||||
#define TR_GLOBAL_VAR "Global Variable"
|
||||
@@ -646,10 +646,10 @@
|
||||
#define TR_BYTES "bytes"
|
||||
#define TR_MODULE_BIND "[Enlace]"
|
||||
#define TR_MODULE_RANGE "[Limites]"
|
||||
#define TR_RESET "[Reset]"
|
||||
#define TR_RESET_BTN "[Reset]"
|
||||
#define TR_SET "[Ajuste]"
|
||||
#define TR_TRAINER "Aprendiz"
|
||||
#define TR_ANTENNAPROBLEM CENTER "¡Problema antena TX!"
|
||||
#define TR_ANTENNAPROBLEM CENTER "¡Problema antena TX!"
|
||||
#define TR_MODELIDUSED TR("ID en uso", "ID modelo en uso")
|
||||
#define TR_MODULE INDENT "Modulo"
|
||||
#define TR_CHANNELRANGE INDENT "Gama de canales"
|
||||
@@ -684,7 +684,7 @@
|
||||
|
||||
// Taranis column headers
|
||||
#define TR_PHASES_HEADERS { " Nombre ", " Interrup.", " Trims ", " Aparecer ", " Desparecer " }
|
||||
#define TR_LIMITS_HEADERS { " Nombre ", " Compensacion", " Min ", " Max ", " Direccion ", " Centrado PPM ", " Simetrica " }
|
||||
#define TR_LIMITS_HEADERS { " Nombre ", " Compensacion", " Min ", " Max ", " Direccion ", " Curve ", " Centrado PPM ", " Simetrica " }
|
||||
#define TR_CSW_HEADERS { " Funcion ", " V1 ", " V2 ", " AND Interrup. ", " Duracion ", " Retardo " }
|
||||
|
||||
//Taranis About screen
|
||||
@@ -742,4 +742,4 @@
|
||||
#define TR_BEEP_VOLUME "Volumen Beep"
|
||||
#define TR_WAV_VOLUME "Volumen Wav"
|
||||
#define TR_VARIO_VOLUME "Volumen Vario"
|
||||
#define TR_BG_VOLUME "Volumen Bg"
|
||||
#define TR_BG_VOLUME "Volumen Bg"
|
||||
|
||||
@@ -527,10 +527,10 @@
|
||||
#define TR_MENUHELISETUP "CONF. HELI"
|
||||
|
||||
#if defined(PPM_CENTER_ADJUSTABLE) || defined(PPM_LIMITS_SYMETRICAL) // The right menu titles for the gurus ...
|
||||
#define TR_MENUDREXPO "STICKS"
|
||||
#define TR_MENUINPUTS "STICKS"
|
||||
#define TR_MENULIMITS "SERVOS"
|
||||
#else
|
||||
#define TR_MENUDREXPO "DR/EXPO"
|
||||
#define TR_MENUINPUTS "DR/EXPO"
|
||||
#define TR_MENULIMITS "LIMITES"
|
||||
#endif
|
||||
|
||||
@@ -646,7 +646,7 @@
|
||||
#define TR_BYTES "bytes"
|
||||
#define TR_MODULE_BIND "[Enlace]"
|
||||
#define TR_MODULE_RANGE "[Limites]"
|
||||
#define TR_RESET "[Reset]"
|
||||
#define TR_RESET_BTN "[Reset]"
|
||||
#define TR_SET "[Ajuste]"
|
||||
#define TR_TRAINER "Aprendiz"
|
||||
#define TR_ANTENNAPROBLEM CENTER "¡Problema antena TX!"
|
||||
@@ -684,7 +684,7 @@
|
||||
|
||||
// Taranis column headers
|
||||
#define TR_PHASES_HEADERS { " Nombre ", " Interrup.", " Trims ", " Aparecer ", " Desparecer " }
|
||||
#define TR_LIMITS_HEADERS { " Nombre ", " Compensacion", " Min ", " Max ", " Direccion ", " Centrado PPM ", " Simetrica " }
|
||||
#define TR_LIMITS_HEADERS { " Nombre ", " Compensacion", " Min ", " Max ", " Direccion ", " Curve ", " Centrado PPM ", " Simetrica " }
|
||||
#define TR_CSW_HEADERS { " Funcion ", " V1 ", " V2 ", " AND Interrup. ", " Duracion ", " Retardo " }
|
||||
|
||||
//Taranis About screen
|
||||
|
||||
@@ -527,10 +527,10 @@
|
||||
#define TR_MENUHELISETUP TR("CONF.HELI","CONFIGURATION HELICO")
|
||||
|
||||
#if defined(PPM_CENTER_ADJUSTABLE) || defined(PPM_LIMITS_SYMETRICAL) // The right menu titles for the gurus ...
|
||||
#define TR_MENUDREXPO "MANCHES"
|
||||
#define TR_MENUINPUTS "MANCHES"
|
||||
#define TR_MENULIMITS "SORTIES"
|
||||
#else
|
||||
#define TR_MENUDREXPO "DR/EXPO"
|
||||
#define TR_MENUINPUTS "DR/EXPO"
|
||||
#define TR_MENULIMITS "LIMITES"
|
||||
#endif
|
||||
|
||||
@@ -646,7 +646,7 @@
|
||||
#define TR_BYTES "bytes"
|
||||
#define TR_MODULE_BIND "[Bind]"
|
||||
#define TR_MODULE_RANGE "[Port.]"
|
||||
#define TR_RESET "[RAZ]"
|
||||
#define TR_RESET_BTN "[RAZ]"
|
||||
#define TR_SET "[D\200f.]"
|
||||
#define TR_TRAINER "Ecolage"
|
||||
#define TR_ANTENNAPROBLEM CENTER "Antenne radio d\200fectueuse!"
|
||||
@@ -684,7 +684,7 @@
|
||||
|
||||
// Taranis column headers
|
||||
#define TR_PHASES_HEADERS { " Nom ", " Inter ", " Trims ", " Fondu ON ", " Fondu OFF " }
|
||||
#define TR_LIMITS_HEADERS { " Nom ", " Subtrim ", " Min ", " Max ", " Direction ", " Neutre PPM ", " Mode subtrim " }
|
||||
#define TR_LIMITS_HEADERS { " Nom ", " Subtrim ", " Min ", " Max ", " Direction ", " Curve ", " Neutre PPM ", " Mode subtrim " }
|
||||
#define TR_CSW_HEADERS { " Fonction ", " V1 ", " V2 ", " ET suppl. ", " Dur\200e ", " D\200lai " }
|
||||
|
||||
//Taranis About screen
|
||||
|
||||
@@ -527,10 +527,10 @@
|
||||
#define TR_MENUHELISETUP TR("CONF.HELI","CONFIGURATION HELICO")
|
||||
|
||||
#if defined(PPM_CENTER_ADJUSTABLE) || defined(PPM_LIMITS_SYMETRICAL) // The right menu titles for the gurus ...
|
||||
#define TR_MENUDREXPO "MANCHES"
|
||||
#define TR_MENUINPUTS "MANCHES"
|
||||
#define TR_MENULIMITS "SORTIES"
|
||||
#else
|
||||
#define TR_MENUDREXPO "DR/EXPO"
|
||||
#define TR_MENUINPUTS "DR/EXPO"
|
||||
#define TR_MENULIMITS "LIMITES"
|
||||
#endif
|
||||
|
||||
@@ -646,7 +646,7 @@
|
||||
#define TR_BYTES "bytes"
|
||||
#define TR_MODULE_BIND "[Bind]"
|
||||
#define TR_MODULE_RANGE "[Port.]"
|
||||
#define TR_RESET "[RAZ]"
|
||||
#define TR_RESET_BTN "[RAZ]"
|
||||
#define TR_SET "[Déf.]"
|
||||
#define TR_TRAINER "Ecolage"
|
||||
#define TR_ANTENNAPROBLEM CENTER "Antenne radio défectueuse!"
|
||||
@@ -684,7 +684,7 @@
|
||||
|
||||
// Taranis column headers
|
||||
#define TR_PHASES_HEADERS { " Nom ", " Inter ", " Trims ", " Fondu ON ", " Fondu OFF " }
|
||||
#define TR_LIMITS_HEADERS { " Nom ", " Subtrim ", " Min ", " Max ", " Direction ", " Neutre PPM ", " Mode subtrim " }
|
||||
#define TR_LIMITS_HEADERS { " Nom ", " Subtrim ", " Min ", " Max ", " Direction ", " Curve ", " Neutre PPM ", " Mode subtrim " }
|
||||
#define TR_CSW_HEADERS { " Fonction ", " V1 ", " V2 ", " ET suppl. ", " Durée ", " Délai " }
|
||||
|
||||
//Taranis About screen
|
||||
|
||||
@@ -527,10 +527,10 @@
|
||||
#define TR_MENUHELISETUP "SETUP ELI"
|
||||
|
||||
#if defined(PPM_CENTER_ADJUSTABLE) || defined(PPM_LIMITS_SYMETRICAL) // The right menu titles for the gurus ...
|
||||
#define TR_MENUDREXPO "STICK"
|
||||
#define TR_MENUINPUTS "STICK"
|
||||
#define TR_MENULIMITS "USCITE"
|
||||
#else
|
||||
#define TR_MENUDREXPO "DR/ESPO"
|
||||
#define TR_MENUINPUTS "DR/ESPO"
|
||||
#define TR_MENULIMITS "LIMITI"
|
||||
#endif
|
||||
|
||||
@@ -646,7 +646,7 @@
|
||||
#define TR_BYTES "bytes"
|
||||
#define TR_MODULE_BIND "[Bind]"
|
||||
#define TR_MODULE_RANGE "[Range]"
|
||||
#define TR_RESET "[Reset]"
|
||||
#define TR_RESET_BTN "[Reset]"
|
||||
#define TR_SET "[Set]"
|
||||
#define TR_TRAINER TR("Trainer","Maestro/Allievo")
|
||||
#define TR_ANTENNAPROBLEM CENTER "Problemi antenna TX!"
|
||||
@@ -684,7 +684,7 @@
|
||||
|
||||
// Taranis column headers
|
||||
#define TR_PHASES_HEADERS { " Nome ", " Switch ", " Trims ", " Fade In ", " Fade Out " }
|
||||
#define TR_LIMITS_HEADERS { " Nome ", " Offset ", " Min ", " Max ", " Direzione ", " Centro PPM ", " Simmetria " }
|
||||
#define TR_LIMITS_HEADERS { " Nome ", " Offset ", " Min ", " Max ", " Direzione ", " Curve ", " Centro PPM ", " Simmetria " }
|
||||
#define TR_CSW_HEADERS { " Funzione ", " V1 ", " V2 ", " AND Switch ", " Durata ", " Ritardo " }
|
||||
|
||||
//Taranis About screen
|
||||
|
||||
@@ -527,10 +527,10 @@
|
||||
#define TR_MENUHELISETUP "SETUP ELI"
|
||||
|
||||
#if defined(PPM_CENTER_ADJUSTABLE) || defined(PPM_LIMITS_SYMETRICAL) // The right menu titles for the gurus ...
|
||||
#define TR_MENUDREXPO "STICK"
|
||||
#define TR_MENUINPUTS "STICK"
|
||||
#define TR_MENULIMITS "USCITE"
|
||||
#else
|
||||
#define TR_MENUDREXPO "DR/ESPO"
|
||||
#define TR_MENUINPUTS "DR/ESPO"
|
||||
#define TR_MENULIMITS "LIMITI"
|
||||
#endif
|
||||
|
||||
@@ -646,7 +646,7 @@
|
||||
#define TR_BYTES "bytes"
|
||||
#define TR_MODULE_BIND "[Bind]"
|
||||
#define TR_MODULE_RANGE "[Range]"
|
||||
#define TR_RESET "[Reset]"
|
||||
#define TR_RESET_BTN "[Reset]"
|
||||
#define TR_SET "[Set]"
|
||||
#define TR_TRAINER TR("Trainer","Maestro/Allievo")
|
||||
#define TR_ANTENNAPROBLEM CENTER "Problemi antenna TX!"
|
||||
@@ -684,7 +684,7 @@
|
||||
|
||||
// Taranis column headers
|
||||
#define TR_PHASES_HEADERS { " Nome ", " Switch ", " Trims ", " Fade In ", " Fade Out " }
|
||||
#define TR_LIMITS_HEADERS { " Nome ", " Offset ", " Min ", " Max ", " Direzione ", " Centro PPM ", " Simmetria " }
|
||||
#define TR_LIMITS_HEADERS { " Nome ", " Offset ", " Min ", " Max ", " Direzione ", " Curve ", " Centro PPM ", " Simmetria " }
|
||||
#define TR_CSW_HEADERS { " Funzione ", " V1 ", " V2 ", " AND Switch ", " Durata ", " Ritardo " }
|
||||
|
||||
//Taranis About screen
|
||||
|
||||
@@ -527,10 +527,10 @@
|
||||
#define TR_MENUHELISETUP "HELI SETUP"
|
||||
|
||||
#if defined(PPM_CENTER_ADJUSTABLE) || defined(PPM_LIMITS_SYMETRICAL) // The right menu titles for the gurus ...
|
||||
#define TR_MENUDREXPO "STICKS"
|
||||
#define TR_MENUINPUTS "STICKS"
|
||||
#define TR_MENULIMITS "SAIDAS"
|
||||
#else
|
||||
#define TR_MENUDREXPO "DR/EXPO"
|
||||
#define TR_MENUINPUTS "DR/EXPO"
|
||||
#define TR_MENULIMITS "LIMITES"
|
||||
#endif
|
||||
|
||||
@@ -646,7 +646,7 @@
|
||||
#define TR_BYTES "bytes"
|
||||
#define TR_MODULE_BIND "[Bind]"
|
||||
#define TR_MODULE_RANGE "[Range]"
|
||||
#define TR_RESET "[Reset]"
|
||||
#define TR_RESET_BTN "[Reset]"
|
||||
#define TR_SET "[Set]"
|
||||
#define TR_TRAINER "Trainer"
|
||||
#define TR_ANTENNAPROBLEM CENTER "TX Antenna problem!"
|
||||
@@ -684,7 +684,7 @@
|
||||
|
||||
// Taranis column headers
|
||||
#define TR_PHASES_HEADERS { " Name ", " Switch ", " Trims ", " Fade In ", " Fade Out " }
|
||||
#define TR_LIMITS_HEADERS { " Name ", " Offset ", " Min ", " Max ", " Direction ", " PPM Center ", " Symmetrical " }
|
||||
#define TR_LIMITS_HEADERS { " Name ", " Offset ", " Min ", " Max ", " Direction ", " Curve ", " PPM Center ", " Symmetrical " }
|
||||
#define TR_CSW_HEADERS { " Function ", " V1 ", " V2 ", " AND Switch ", " Duration ", " Delay " }
|
||||
|
||||
//Taranis About screen
|
||||
|
||||
@@ -527,10 +527,10 @@
|
||||
#define TR_MENUHELISETUP "HELI SETUP"
|
||||
|
||||
#if defined(PPM_CENTER_ADJUSTABLE) || defined(PPM_LIMITS_SYMETRICAL) // The right menu titles for the gurus ...
|
||||
#define TR_MENUDREXPO "STICKS"
|
||||
#define TR_MENUINPUTS "STICKS"
|
||||
#define TR_MENULIMITS "SAIDAS"
|
||||
#else
|
||||
#define TR_MENUDREXPO "DR/EXPO"
|
||||
#define TR_MENUINPUTS "DR/EXPO"
|
||||
#define TR_MENULIMITS "LIMITES"
|
||||
#endif
|
||||
|
||||
@@ -646,7 +646,7 @@
|
||||
#define TR_BYTES "bytes"
|
||||
#define TR_MODULE_BIND "[Bind]"
|
||||
#define TR_MODULE_RANGE "[Range]"
|
||||
#define TR_RESET "[Reset]"
|
||||
#define TR_RESET_BTN "[Reset]"
|
||||
#define TR_SET "[Set]"
|
||||
#define TR_TRAINER "Trainer"
|
||||
#define TR_ANTENNAPROBLEM CENTER "TX Antenna problem!"
|
||||
@@ -684,7 +684,7 @@
|
||||
|
||||
// Taranis column headers
|
||||
#define TR_PHASES_HEADERS { " Name ", " Switch ", " Trims ", " Fade In ", " Fade Out " }
|
||||
#define TR_LIMITS_HEADERS { " Name ", " Offset ", " Min ", " Max ", " Direction ", " PPM Center ", " Symmetrical " }
|
||||
#define TR_LIMITS_HEADERS { " Name ", " Offset ", " Min ", " Max ", " Direction ", " Curve ", " PPM Center ", " Symmetrical " }
|
||||
#define TR_CSW_HEADERS { " Function ", " V1 ", " V2 ", " AND Switch ", " Duration ", " Delay " }
|
||||
|
||||
//Taranis About screen
|
||||
|
||||
@@ -646,7 +646,7 @@
|
||||
#define TR_BYTES "bytes"
|
||||
#define TR_MODULE_BIND "[Bind]"
|
||||
#define TR_MODULE_RANGE "[Testa]"
|
||||
#define TR_RESET "[Nollst\201ll]"
|
||||
#define TR_RESET_BTN "[Nollst\201ll]"
|
||||
#define TR_SET "[Spara]"
|
||||
#define TR_TRAINER "Trainer"
|
||||
#define TR_ANTENNAPROBLEM CENTER "Fel p\200 TX-antennen"
|
||||
|
||||
@@ -646,7 +646,7 @@
|
||||
#define TR_BYTES "bytes"
|
||||
#define TR_MODULE_BIND "[Bind]"
|
||||
#define TR_MODULE_RANGE "[Testa]"
|
||||
#define TR_RESET "[Nollställ]"
|
||||
#define TR_RESET_BTN "[Nollställ]"
|
||||
#define TR_SET "[Spara]"
|
||||
#define TR_TRAINER "Trainer"
|
||||
#define TR_ANTENNAPROBLEM CENTER "Fel på TX-antennen"
|
||||
|
||||
Reference in New Issue
Block a user