[Taranis] A lot of new features, >100 hours work in one commit...

This commit is contained in:
bsongis
2013-11-30 11:11:14 +01:00
committed by Andre Bernet
parent 89c6bb2513
commit 4b9270182e
66 changed files with 3611 additions and 1295 deletions
+44 -57
View File
@@ -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
View File
@@ -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
View File
@@ -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))
+1
View File
@@ -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
View File
@@ -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))
+2 -2
View File
@@ -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
View File
@@ -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
View File
@@ -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); }
+1
View File
@@ -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
View File
@@ -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
View File
@@ -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 */
-1
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
File diff suppressed because it is too large Load Diff
+142 -32
View File
@@ -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
View File
@@ -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
View File
@@ -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);
+13 -9
View File
@@ -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 );
+3 -3
View File
@@ -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};
+153
View File
@@ -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
View File
@@ -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)
{
+22 -12
View File
@@ -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
View File
@@ -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 {
+21
View File
@@ -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
View File
@@ -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
View File
File diff suppressed because it is too large Load Diff
+211 -62
View File
@@ -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();
+4
View File
@@ -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
View File
@@ -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
View File
@@ -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(...)
+2 -1
View File
@@ -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)))
+2 -1
View File
@@ -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)))
+3 -1
View File
@@ -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))
+33 -16
View File
@@ -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 ;
}
+2 -1
View File
@@ -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)))
+1 -1
View File
@@ -34,7 +34,7 @@
*
*/
#include "../opentx.h"
#include "../../opentx.h"
#define PIN_ANALOG 0x0003
#define PIN_PORTA 0x0000
+3 -1
View File
@@ -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)))
+1 -1
View File
@@ -34,7 +34,7 @@
*
*/
#include "../opentx.h"
#include "../../opentx.h"
void delaysInit(void)
{
+1 -1
View File
@@ -34,7 +34,7 @@
*
*/
#include "../opentx.h"
#include "../../opentx.h"
extern Fifo<512> telemetryFifo;
+2 -3
View File
@@ -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 :
+1 -1
View File
@@ -34,7 +34,7 @@
*
*/
#include "../opentx.h"
#include "../../opentx.h"
void uartInit(uint32_t baudrate)
{
+2 -6
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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)
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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
+1 -1
View File
@@ -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!"
+1 -1
View File
@@ -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
View File
@@ -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"
+8 -8
View File
@@ -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"
+4 -4
View File
@@ -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
+4 -4
View File
@@ -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
+4 -4
View File
@@ -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
+4 -4
View File
@@ -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
+4 -4
View File
@@ -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
+4 -4
View File
@@ -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
+4 -4
View File
@@ -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
+1 -1
View File
@@ -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"
+1 -1
View File
@@ -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"