Cosmetics
@@ -31,10 +31,11 @@ set(CMAKE_CXX_STANDARD 11)
|
||||
add_definitions(-D_GLIBCXX_USE_C99=1) # proper to_string definition
|
||||
|
||||
set(RADIO_DIRECTORY ${PROJECT_SOURCE_DIR}/radio)
|
||||
set(RADIO_SRC_DIRECTORY ${RADIO_DIRECTORY}/src)
|
||||
set(RADIO_SRC_DIR ${RADIO_DIRECTORY}/src)
|
||||
set(COMPANION_SRC_DIRECTORY ${PROJECT_SOURCE_DIR}/companion/src)
|
||||
set(SIMU_SRC_DIRECTORY ${COMPANION_SRC_DIRECTORY}/simulation)
|
||||
set(TOOLS_DIRECTORY ${PROJECT_SOURCE_DIR}/tools)
|
||||
set(TOOLS_DIR ${PROJECT_SOURCE_DIR}/tools)
|
||||
set(LIBOPENUI_TOOLS_DIR ${RADIO_SRC_DIR}/thirdparty/libopenui/tools)
|
||||
|
||||
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
|
||||
@@ -173,15 +174,15 @@ endif()
|
||||
endif(NOT DISABLE_COMPANION)
|
||||
|
||||
# Check for a file that is typically left from a OpenTX 2.1 build and abort if found
|
||||
if (EXISTS ${RADIO_SRC_DIRECTORY}/stamp.h OR EXISTS ${RADIO_SRC_DIRECTORY}/translations/en.h)
|
||||
if (EXISTS ${RADIO_SRC_DIR}/stamp.h OR EXISTS ${RADIO_SRC_DIR}/translations/en.h)
|
||||
message(FATAL_ERROR "Source directory contains files leftover from a OpenTX 2.1 build. Please run `git clean -f` in source directory (Careful: Will remove any extra files) or do a new clean git checkout")
|
||||
endif()
|
||||
|
||||
# Windows-specific includes and libs shared by sub-projects
|
||||
if(WIN32)
|
||||
list(APPEND WIN_INCLUDE_DIRS "${RADIO_SRC_DIRECTORY}/thirdparty/windows/dirent")
|
||||
list(APPEND WIN_INCLUDE_DIRS "${RADIO_SRC_DIR}/thirdparty/windows/dirent")
|
||||
if(MSVC)
|
||||
list(APPEND WIN_INCLUDE_DIRS "${RADIO_SRC_DIRECTORY}/thirdparty/windows/msinttypes")
|
||||
list(APPEND WIN_INCLUDE_DIRS "${RADIO_SRC_DIR}/thirdparty/windows/msinttypes")
|
||||
set(WIN_PTHREAD_BASE_PATH "${WIN_EXTRA_LIBS_PATH}/pthreads/Pre-built.2" CACHE PATH "Where to find pthreads include and lib folders.")
|
||||
list(APPEND WIN_INCLUDE_DIRS "${WIN_PTHREAD_BASE_PATH}/include")
|
||||
find_file(WIN_PTHREAD_LIB pthreadVC2.lib PATHS "${WIN_PTHREAD_BASE_PATH}" PATH_SUFFIXES lib/x86 lib NO_DEFAULT_PATH)
|
||||
@@ -209,23 +210,23 @@ if(NOT GTEST_INCDIR OR NOT GTEST_SRCDIR)
|
||||
|
||||
set(GTEST_VERSION 1.8.1)
|
||||
|
||||
set(GTEST_SRCDIR "${RADIO_SRC_DIRECTORY}/tests/googletest-release-${GTEST_VERSION}/googletest")
|
||||
set(GTEST_SRCDIR "${RADIO_SRC_DIR}/tests/googletest-release-${GTEST_VERSION}/googletest")
|
||||
set(GTEST_INCDIR "${GTEST_SRCDIR}/include")
|
||||
|
||||
set(GTEST_URL "https://github.com/google/googletest/archive/release-${GTEST_VERSION}.tar.gz")
|
||||
set(GTEST_ARCHIVE "${RADIO_SRC_DIRECTORY}/tests/gtest-${GTEST_VERSION}.tar.gz")
|
||||
set(GTEST_ARCHIVE "${RADIO_SRC_DIR}/tests/gtest-${GTEST_VERSION}.tar.gz")
|
||||
|
||||
if (NOT EXISTS "${GTEST_SRCDIR}")
|
||||
file(DOWNLOAD "${GTEST_URL}" ${GTEST_ARCHIVE} SHOW_PROGRESS)
|
||||
execute_process(
|
||||
COMMAND ${CMAKE_COMMAND} -E tar -xf ${GTEST_ARCHIVE}
|
||||
WORKING_DIRECTORY ${RADIO_SRC_DIRECTORY}/tests)
|
||||
WORKING_DIRECTORY ${RADIO_SRC_DIR}/tests)
|
||||
execute_process(
|
||||
COMMAND ${CMAKE_COMMAND} -E remove -f ${GTEST_ARCHIVE})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
add_subdirectory(${RADIO_SRC_DIRECTORY})
|
||||
add_subdirectory(${RADIO_SRC_DIR})
|
||||
|
||||
if(Qt5Core_FOUND AND NOT DISABLE_COMPANION)
|
||||
add_subdirectory(${COMPANION_SRC_DIRECTORY})
|
||||
|
||||
@@ -1,4 +1,19 @@
|
||||
macro(add_bitmaps_target targetname filter width format)
|
||||
set(FONT "Roboto/Roboto-Regular")
|
||||
set(FONT_BOLD "Roboto/Roboto-Bold")
|
||||
set(FONT_OFFSET 1)
|
||||
set(CJK_FONT "Noto/NotoSansCJKsc-Regular")
|
||||
set(CJK_FONT_BOLD "Noto/NotoSansCJKsc-Bold")
|
||||
set(CJK_FONT_OFFSET -3)
|
||||
|
||||
#set(FONT "Kanit/Kanit-Regular")
|
||||
#set(FONT_BOLD "Kanit/Kanit-Bold")
|
||||
#set(FONT_OFFSET -2)
|
||||
|
||||
#set(FONT "Ubuntu/Ubuntu-Regular")
|
||||
#set(FONT_BOLD "Ubuntu/Ubuntu-Bold")
|
||||
#set(FONT_OFFSET 1)
|
||||
|
||||
macro(add_bitmaps_target targetname filter format args)
|
||||
set(bitmaps_files)
|
||||
file(GLOB bitmaps ${filter})
|
||||
foreach(bitmap ${bitmaps})
|
||||
@@ -6,21 +21,44 @@ macro(add_bitmaps_target targetname filter width format)
|
||||
set(target ${target}.lbm)
|
||||
add_custom_command(
|
||||
OUTPUT ${target}
|
||||
COMMAND ${PYTHON_EXECUTABLE} ${RADIO_DIRECTORY}/util/img2lbm.py ${bitmap} ${target} ${width} ${format} ${ARGN}
|
||||
DEPENDS ${bitmap} ${RADIO_DIRECTORY}/util/img2lbm.py
|
||||
COMMAND ${PYTHON_EXECUTABLE} ${LIBOPENUI_TOOLS_DIR}/encode-bitmap.py --format ${format} ${args} ${bitmap} ${target}
|
||||
DEPENDS ${bitmap} ${LIBOPENUI_TOOLS_DIR}/encode-bitmap.py
|
||||
)
|
||||
list(APPEND bitmaps_files ${target})
|
||||
endforeach()
|
||||
add_custom_target(${targetname} DEPENDS ${bitmaps_files})
|
||||
endmacro()
|
||||
|
||||
macro(add_truetype_font_target name size subset font offset cn_font cn_offset)
|
||||
set(target ${RADIO_SRC_DIRECTORY}/fonts/truetype/font_${name})
|
||||
macro(add_fonts_target targetname filter)
|
||||
set(fonts_files)
|
||||
file(GLOB fonts ${filter})
|
||||
foreach(font ${fonts})
|
||||
get_filename_component(target ${font} NAME_WE)
|
||||
set(target ${target}.lbm)
|
||||
add_custom_command(
|
||||
OUTPUT ${target}
|
||||
COMMAND ${PYTHON_EXECUTABLE} ${TOOLS_DIR}/encode-font.py ${font} ${target}
|
||||
DEPENDS ${font} ${TOOLS_DIR}/encode-font.py
|
||||
)
|
||||
list(APPEND fonts_files ${target})
|
||||
endforeach()
|
||||
add_custom_target(${targetname} DEPENDS ${fonts_files})
|
||||
endmacro()
|
||||
|
||||
macro(add_truetype_font_target name size subset effect)
|
||||
set(target font_${name})
|
||||
if(${effect} STREQUAL "bold")
|
||||
set(font ${FONT_BOLD})
|
||||
set(cjk_font ${CJK_FONT_BOLD})
|
||||
else()
|
||||
set(font ${FONT})
|
||||
set(cjk_font ${CJK_FONT})
|
||||
endif()
|
||||
add_custom_command(
|
||||
OUTPUT ${target}.png ${target}.specs
|
||||
COMMAND ${PYTHON_EXECUTABLE} ${TOOLS_DIRECTORY}/build-font-bitmap.py --subset ${subset} --size ${size} --font ${font}:${offset} --cn-font ${cn_font}:${cn_offset} --output ${target}
|
||||
WORKING_DIRECTORY ${RADIO_SRC_DIRECTORY}
|
||||
DEPENDS ${TOOLS_DIRECTORY}/build-font-bitmap.py ${TOOLS_DIRECTORY}/charset.py ${RADIO_SRC_DIRECTORY}/translations/cn.h.txt
|
||||
OUTPUT ${target}.png ${target}.specs ${target}.lbm
|
||||
COMMAND ${PYTHON_EXECUTABLE} ${TOOLS_DIR}/build-font-bitmap.py --subset ${subset} --size ${size} --font ${font}:${FONT_OFFSET} --cjk-font ${cjk_font}:${CJK_FONT_OFFSET} --output ${target}
|
||||
COMMAND ${PYTHON_EXECUTABLE} ${LIBOPENUI_TOOLS_DIR}/encode-bitmap.py --format 8bits --rle --size-format 2 ${target}.png ${target}.lbm
|
||||
DEPENDS ${TOOLS_DIR}/build-font-bitmap.py ${TOOLS_DIR}/charset.py ${LIBOPENUI_TOOLS_DIR}/encode-bitmap.py ${RADIO_SRC_DIR}/translations/cn.h.txt
|
||||
)
|
||||
add_custom_target(truetype_font_${name} DEPENDS ${target}.png ${target}.specs)
|
||||
set(truetype_fonts_targets ${truetype_fonts_targets} truetype_font_${name})
|
||||
|
||||
@@ -91,7 +91,7 @@ include_directories(
|
||||
${COMPANION_SRC_DIRECTORY}
|
||||
${COMPANION_SRC_DIRECTORY}/simulation
|
||||
${COMPANION_SRC_DIRECTORY}/simulation/widgets
|
||||
${RADIO_SRC_DIRECTORY}/fonts/std
|
||||
${RADIO_SRC_DIR}/fonts/std
|
||||
)
|
||||
|
||||
qt5_wrap_ui(simulation_SRCS ${simulation_UIS})
|
||||
|
||||
@@ -5,7 +5,7 @@ if(GTEST_INCDIR AND GTEST_SRCDIR AND Qt5Widgets_FOUND)
|
||||
target_include_directories(gtests-companion-lib PUBLIC ${GTEST_INCDIR} ${GTEST_INCDIR}/gtest ${GTEST_SRCDIR})
|
||||
add_definitions(-DGTESTS)
|
||||
set(TESTS_PATH ${COMPANION_SRC_DIRECTORY}/tests)
|
||||
set(RADIO_TESTS_PATH ${RADIO_SRC_DIRECTORY}/tests)
|
||||
set(RADIO_TESTS_PATH ${RADIO_SRC_DIR}/tests)
|
||||
configure_file(${TESTS_PATH}/location.h.in ${CMAKE_CURRENT_BINARY_DIR}/location.h @ONLY)
|
||||
|
||||
include_directories(${CMAKE_CURRENT_BINARY_DIR})
|
||||
|
||||
@@ -2,13 +2,13 @@ include(CMakeForceCompiler)
|
||||
include(Bitmaps)
|
||||
|
||||
set(PCB_TYPES X9LITE X7 XLITE XLITES X9D X9D+ X9E X10 X12S SKY9X 9XRPRO AR9X NV14)
|
||||
set(GUI_LANGUAGES CZ DE EN ES FR IT PT SK SE PL HU NL CN)
|
||||
set(RADIO_LANGUAGES CZ DE EN ES FR IT PT SK SE PL HU NL CN)
|
||||
set(TTS_LANGUAGES CZ DE EN ES FR IT PT SK SE PL HU NL RU)
|
||||
|
||||
set(PCB "X9D+" CACHE STRING "Radio type, one of: ${PCB_TYPES}")
|
||||
set_property(CACHE PCB PROPERTY STRINGS ${PCB_TYPES})
|
||||
set(TRANSLATIONS "EN" CACHE STRING "Radio language, one of: ${GUI_LANGUAGES}")
|
||||
set_property(CACHE TRANSLATIONS PROPERTY STRINGS ${GUI_LANGUAGES})
|
||||
set(TRANSLATIONS "EN" CACHE STRING "Radio language, one of: ${RADIO_LANGUAGES}")
|
||||
set_property(CACHE TRANSLATIONS PROPERTY STRINGS ${RADIO_LANGUAGES})
|
||||
set(SPLASH "DEFAULT" CACHE STRING "Splash (DEFAULT/OFF/FRSKY)")
|
||||
set_property(CACHE SPLASH PROPERTY STRINGS DEFAULT OFF FRSKY)
|
||||
set(PPM_UNIT "PERCENT_PREC1" CACHE STRING "PPM display unit (US/PERCENT_PREC1/PERCENT_PREC0)")
|
||||
@@ -74,7 +74,7 @@ set(GVARS_VARIANT 1)
|
||||
set(FRSKY_VARIANT 2)
|
||||
set(3POS_VARIANT 4)
|
||||
|
||||
set(FIRMWARE_DEPENDENCIES firmware_translations)
|
||||
set(RADIO_DEPENDENCIES radio_translations)
|
||||
|
||||
set(FATFS_SRC
|
||||
${FATFS_DIR}/ff.c
|
||||
@@ -123,7 +123,7 @@ endif()
|
||||
|
||||
include_directories(targets/${TARGET_DIR} ${THIRDPARTY_DIR})
|
||||
|
||||
foreach(LANGUAGE ${GUI_LANGUAGES})
|
||||
foreach(LANGUAGE ${RADIO_LANGUAGES})
|
||||
if(TRANSLATIONS STREQUAL ${LANGUAGE})
|
||||
add_definitions(-DTRANSLATIONS_${LANGUAGE} -DTRANSLATIONS="${LANGUAGE}")
|
||||
endif()
|
||||
@@ -169,7 +169,7 @@ if(NOT LUA STREQUAL NO)
|
||||
add_definitions(-DLUA_SCRIPT_LOAD_MODE="${LUA_SCRIPT_LOAD_MODE}")
|
||||
endif()
|
||||
include_directories(${LUA_DIR})
|
||||
set(FIRMWARE_DEPENDENCIES ${FIRMWARE_DEPENDENCIES} ${LUA_EXPORT})
|
||||
set(RADIO_DEPENDENCIES ${RADIO_DEPENDENCIES} ${LUA_EXPORT})
|
||||
if(LUA STREQUAL YES)
|
||||
add_definitions(-DLUA_MODEL_SCRIPTS)
|
||||
endif()
|
||||
@@ -465,7 +465,7 @@ if(NOT MSVC)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMMON_FLAGS}")
|
||||
|
||||
# these are in addition to CMAKE_CXX_FLAGS
|
||||
set(CMAKE_EXE_LINKER_FLAGS "-lm -T${RADIO_SRC_DIRECTORY}/${LINKER_SCRIPT} -Wl,-Map=firmware.map,--cref,--no-warn-mismatch,--gc-sections")
|
||||
set(CMAKE_EXE_LINKER_FLAGS "-lm -T${RADIO_SRC_DIR}/${LINKER_SCRIPT} -Wl,-Map=firmware.map,--cref,--no-warn-mismatch,--gc-sections")
|
||||
|
||||
if(SEMIHOSTING)
|
||||
add_definitions(-DSEMIHOSTING)
|
||||
@@ -487,7 +487,7 @@ if(NOT MSVC)
|
||||
if(PCB STREQUAL XLITE OR PCB STREQUAL XLITES OR PCB STREQUAL X9D OR PCB STREQUAL X9D+ OR PCB STREQUAL X9E OR PCB STREQUAL X9LITE OR PCB STREQUAL X7 OR PCB STREQUAL X3 OR PCB STREQUAL X10 OR PCB STREQUAL X12S)
|
||||
add_subdirectory(targets/common/arm/stm32/bootloader)
|
||||
include_directories(${CMAKE_CURRENT_BINARY_DIR}/targets/common/arm/stm32/bootloader)
|
||||
set(FIRMWARE_DEPENDENCIES ${FIRMWARE_DEPENDENCIES} bootloader)
|
||||
set(RADIO_DEPENDENCIES ${RADIO_DEPENDENCIES} bootloader)
|
||||
elseif(OPENRC_BOOTLOADER)
|
||||
# We fetch Mike's bootloader as it is not included inside OpenTX
|
||||
message(STATUS "Downloading Mike's bootloader: https://github.com/MikeBland/OpenRcBootloader/releases/download/V1.9/${OPENRC_BOOTLOADER}")
|
||||
@@ -503,7 +503,7 @@ if(NOT MSVC)
|
||||
|
||||
add_executable(firmware ${SRC} ${FIRMWARE_HEADERS})
|
||||
link_libraries(firmware -lstdc++)
|
||||
add_dependencies(firmware ${FIRMWARE_DEPENDENCIES})
|
||||
add_dependencies(firmware ${RADIO_DEPENDENCIES})
|
||||
|
||||
add_custom_command(
|
||||
TARGET firmware POST_BUILD
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
string(TOLOWER "${FONT}" FONT_DIR)
|
||||
add_bitmaps_target(9x_xbm_1bit ${RADIO_SRC_DIRECTORY}/bitmaps/sticks.xbm 128 1bit 4)
|
||||
add_bitmaps_target(9x_fonts_1bit ${RADIO_SRC_DIRECTORY}/fonts/${FONT_DIR}/*.png 128 "")
|
||||
add_bitmaps_target(9x_bitmaps ${RADIO_SRC_DIRECTORY}/bitmaps/128x64/*.png 128 1bit)
|
||||
set(STICKS_ARGS --rows 4)
|
||||
add_bitmaps_target(9x_xbm_1bit ${RADIO_SRC_DIR}/bitmaps/sticks.xbm 1bit "${STICKS_ARGS}") # 1bit format, 1byte size, split into 4 rows
|
||||
add_bitmaps_target(9x_bitmaps ${RADIO_SRC_DIR}/bitmaps/128x64/*.png 1bit "") # 1bit format, 1byte size, 1 row
|
||||
add_fonts_target(9x_fonts_1bit ${RADIO_SRC_DIR}/fonts/${FONT_DIR}/*.png)
|
||||
add_dependencies(9x_bitmaps 9x_fonts_1bit 9x_xbm_1bit)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
string(TOLOWER "${FONT}" FONT_DIR)
|
||||
add_bitmaps_target(taranis_xbm ${RADIO_SRC_DIRECTORY}/bitmaps/sticks.xbm 128 1bit 4)
|
||||
add_bitmaps_target(taranis_fonts ${RADIO_SRC_DIRECTORY}/fonts/${FONT_DIR}/*.png 128 "")
|
||||
add_bitmaps_target(taranis_bitmaps ${RADIO_SRC_DIRECTORY}/bitmaps/212x64/*.png 212 4bits)
|
||||
set(STICKS_ARGS --rows 4)
|
||||
add_bitmaps_target(taranis_xbm ${RADIO_SRC_DIR}/bitmaps/sticks.xbm 1bit "${STICKS_ARGS}") # 1bit format, 1byte size, split into 4 rows
|
||||
add_fonts_target(taranis_fonts ${RADIO_SRC_DIR}/fonts/${FONT_DIR}/*.png)
|
||||
add_bitmaps_target(taranis_bitmaps ${RADIO_SRC_DIR}/bitmaps/212x64/*.png 4bits "")
|
||||
add_dependencies(taranis_bitmaps taranis_fonts taranis_xbm)
|
||||
|
||||
@@ -1,27 +1,32 @@
|
||||
set(BITMAP_SIZE_ARGS --size-format 2)
|
||||
set(BITMAP_ARGS ${BITMAP_SIZE_ARGS})
|
||||
set(MASK_ARGS ${BITMAP_SIZE_ARGS})
|
||||
|
||||
if(PCB STREQUAL NV14)
|
||||
set(BITMAP_TARGET_PREFIX nv14)
|
||||
set(BITMAP_FMT_SUFFIX "")
|
||||
elseif(PCB STREQUAL X12S)
|
||||
set(BITMAP_TARGET_PREFIX x12s)
|
||||
set(BITMAP_FMT_SUFFIX "")
|
||||
else()
|
||||
set(BITMAP_TARGET_PREFIX x10)
|
||||
set(BITMAP_FMT_SUFFIX "-R")
|
||||
set(BITMAP_ARGS ${BITMAP_ARGS} --reverse)
|
||||
endif()
|
||||
|
||||
add_bitmaps_target(${BITMAP_TARGET_PREFIX}_bitmaps "${RADIO_SRC_DIRECTORY}/bitmaps/colorlcd/bmp_*.png" 480 "5/6/5${BITMAP_FMT_SUFFIX}")
|
||||
add_bitmaps_target(${BITMAP_TARGET_PREFIX}_calibration_bitmaps "${RADIO_SRC_DIRECTORY}/bitmaps/colorlcd/calibration/bmp_*.png" 480 "5/6/5${BITMAP_FMT_SUFFIX}")
|
||||
add_bitmaps_target(${BITMAP_TARGET_PREFIX}_button_bitmaps "${RADIO_SRC_DIRECTORY}/bitmaps/colorlcd/button/alpha_*.png" 480 "4/4/4/4${BITMAP_FMT_SUFFIX}")
|
||||
add_bitmaps_target(${BITMAP_TARGET_PREFIX}_alpha_bitmaps "${RADIO_SRC_DIRECTORY}/bitmaps/colorlcd/alpha_*.png" 480 "4/4/4/4${BITMAP_FMT_SUFFIX}")
|
||||
add_bitmaps_target(${BITMAP_TARGET_PREFIX}_alpha_calibration_bitmaps "${RADIO_SRC_DIRECTORY}/bitmaps/colorlcd/calibration/alpha_*.png" 480 "4/4/4/4${BITMAP_FMT_SUFFIX}")
|
||||
add_bitmaps_target(${BITMAP_TARGET_PREFIX}_masks ${RADIO_SRC_DIRECTORY}/bitmaps/colorlcd/mask_*.png 480 8bits)
|
||||
add_bitmaps_target(${BITMAP_TARGET_PREFIX}_slider_masks "${RADIO_SRC_DIRECTORY}/bitmaps/colorlcd/slider/*.png" 480 8bits)
|
||||
add_bitmaps_target(${BITMAP_TARGET_PREFIX}_layouts_masks "${RADIO_SRC_DIRECTORY}/gui/colorlcd/layouts/*.png" 480 8bits)
|
||||
add_bitmaps_target(${BITMAP_TARGET_PREFIX}_themes_bitmaps "${RADIO_SRC_DIRECTORY}/gui/colorlcd/themes/*.png" 480 "5/6/5${BITMAP_FMT_SUFFIX}")
|
||||
add_bitmaps_target(${BITMAP_TARGET_PREFIX}_fonts ${RADIO_SRC_DIRECTORY}/fonts/truetype/*.png 480 8bits rle)
|
||||
add_bitmaps_target(${BITMAP_TARGET_PREFIX}_volume_masks ${RADIO_SRC_DIRECTORY}/bitmaps/colorlcd/volume/*.png 480 8bits)
|
||||
add_bitmaps_target(${BITMAP_TARGET_PREFIX}_bootloader_bitmaps ${RADIO_SRC_DIRECTORY}/bitmaps/colorlcd/bootloader/bmp_*.png 480 "5/6/5${BITMAP_FMT_SUFFIX}" rle)
|
||||
add_bitmaps_target(${BITMAP_TARGET_PREFIX}_bootloader_icons ${RADIO_SRC_DIRECTORY}/bitmaps/colorlcd/bootloader/icon_*.png 480 8bits)
|
||||
set(BITMAP_RLE_ARGS ${BITMAP_ARGS} --rle)
|
||||
set(MASK_RLE_ARGS ${MASK_ARGS} --rle)
|
||||
|
||||
add_bitmaps_target(${BITMAP_TARGET_PREFIX}_bitmaps "${RADIO_SRC_DIR}/bitmaps/colorlcd/bmp_*.png" "5/6/5" "${BITMAP_ARGS}")
|
||||
add_bitmaps_target(${BITMAP_TARGET_PREFIX}_calibration_bitmaps "${RADIO_SRC_DIR}/bitmaps/colorlcd/calibration/bmp_*.png" "5/6/5" "${BITMAP_ARGS}")
|
||||
add_bitmaps_target(${BITMAP_TARGET_PREFIX}_button_bitmaps "${RADIO_SRC_DIR}/bitmaps/colorlcd/button/alpha_*.png" "4/4/4/4" "${BITMAP_ARGS}")
|
||||
add_bitmaps_target(${BITMAP_TARGET_PREFIX}_alpha_bitmaps "${RADIO_SRC_DIR}/bitmaps/colorlcd/alpha_*.png" "4/4/4/4" "${BITMAP_ARGS}")
|
||||
add_bitmaps_target(${BITMAP_TARGET_PREFIX}_alpha_calibration_bitmaps "${RADIO_SRC_DIR}/bitmaps/colorlcd/calibration/alpha_*.png" "4/4/4/4" "${BITMAP_ARGS}")
|
||||
add_bitmaps_target(${BITMAP_TARGET_PREFIX}_masks ${RADIO_SRC_DIR}/bitmaps/colorlcd/mask_*.png 8bits "${MASK_ARGS}")
|
||||
add_bitmaps_target(${BITMAP_TARGET_PREFIX}_slider_masks "${RADIO_SRC_DIR}/bitmaps/colorlcd/slider/*.png" 8bits "${MASK_ARGS}")
|
||||
add_bitmaps_target(${BITMAP_TARGET_PREFIX}_layouts_masks "${RADIO_SRC_DIR}/gui/colorlcd/layouts/*.png" 8bits "${MASK_ARGS}")
|
||||
add_bitmaps_target(${BITMAP_TARGET_PREFIX}_themes_bitmaps "${RADIO_SRC_DIR}/gui/colorlcd/themes/*.png" "5/6/5" "${BITMAPS_ARGS}")
|
||||
add_bitmaps_target(${BITMAP_TARGET_PREFIX}_fonts ${RADIO_SRC_DIR}/fonts/truetype/*.png 8bits "${MASK_RLE_ARGS}")
|
||||
add_bitmaps_target(${BITMAP_TARGET_PREFIX}_volume_masks ${RADIO_SRC_DIR}/bitmaps/colorlcd/volume/*.png 8bits "${MASK_ARGS}")
|
||||
add_bitmaps_target(${BITMAP_TARGET_PREFIX}_bootloader_bitmaps ${RADIO_SRC_DIR}/bitmaps/colorlcd/bootloader/bmp_*.png "5/6/5" "${BITMAP_RLE_ARGS}")
|
||||
add_bitmaps_target(${BITMAP_TARGET_PREFIX}_bootloader_icons ${RADIO_SRC_DIR}/bitmaps/colorlcd/bootloader/icon_*.png 8bits "${MASK_ARGS}")
|
||||
|
||||
add_dependencies(${BITMAP_TARGET_PREFIX}_bitmaps ${BITMAP_TARGET_PREFIX}_calibration_bitmaps ${BITMAP_TARGET_PREFIX}_button_bitmaps ${BITMAP_TARGET_PREFIX}_alpha_bitmaps
|
||||
${BITMAP_TARGET_PREFIX}_alpha_calibration_bitmaps ${BITMAP_TARGET_PREFIX}_masks ${BITMAP_TARGET_PREFIX}_slider_masks ${BITMAP_TARGET_PREFIX}_layouts_masks
|
||||
|
||||
@@ -1 +1,14 @@
|
||||
add_subdirectory(truetype)
|
||||
add_truetype_font_target(9 9 all none)
|
||||
add_truetype_font_target(13 13 all none)
|
||||
add_truetype_font_target(15 15 all none)
|
||||
add_truetype_font_target(16 16 all none)
|
||||
add_truetype_font_target(16en 16 en none)
|
||||
add_truetype_font_target(bold16 16 all bold)
|
||||
add_truetype_font_target(17 17 all none)
|
||||
add_truetype_font_target(17en 17 en none)
|
||||
add_truetype_font_target(bold17 17 all bold)
|
||||
add_truetype_font_target(24 24 all none)
|
||||
add_truetype_font_target(32 32 all bold)
|
||||
add_truetype_font_target(64 64 all bold)
|
||||
|
||||
add_custom_target(truetype_fonts DEPENDS ${truetype_fonts_targets})
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
set(FONT "Roboto/Roboto-Regular")
|
||||
set(FONT_BOLD "Roboto/Roboto-Bold")
|
||||
set(FONT_OFFSET 1)
|
||||
set(CN_FONT "Noto/NotoSansCJKsc-Regular")
|
||||
set(CN_FONT_BOLD "Noto/NotoSansCJKsc-Bold")
|
||||
set(CN_FONT_OFFSET -3)
|
||||
|
||||
#set(FONT "Kanit/Kanit-Regular")
|
||||
#set(FONT_BOLD "Kanit/Kanit-Bold")
|
||||
#set(FONT_OFFSET -2)
|
||||
|
||||
#set(FONT "Ubuntu/Ubuntu-Regular")
|
||||
#set(FONT_BOLD "Ubuntu/Ubuntu-Bold")
|
||||
#set(FONT_OFFSET 1)
|
||||
|
||||
add_truetype_font_target(9 9 "all" ${FONT} ${FONT_OFFSET} ${CN_FONT} ${CN_FONT_OFFSET})
|
||||
add_truetype_font_target(13 13 "all" ${FONT} ${FONT_OFFSET} ${CN_FONT} ${CN_FONT_OFFSET})
|
||||
add_truetype_font_target(15 15 "all" ${FONT} ${FONT_OFFSET} ${CN_FONT} ${CN_FONT_OFFSET})
|
||||
add_truetype_font_target(16 16 "all" ${FONT} ${FONT_OFFSET} ${CN_FONT} ${CN_FONT_OFFSET})
|
||||
add_truetype_font_target(16en 16 "en" ${FONT} ${FONT_OFFSET} ${CN_FONT} ${CN_FONT_OFFSET})
|
||||
add_truetype_font_target(bold16 16 "all" ${FONT_BOLD} ${FONT_OFFSET} ${CN_FONT_BOLD} ${CN_FONT_OFFSET})
|
||||
add_truetype_font_target(17 17 "all" ${FONT} ${FONT_OFFSET} ${CN_FONT} ${CN_FONT_OFFSET})
|
||||
add_truetype_font_target(17en 17 "en" ${FONT} ${FONT_OFFSET} ${CN_FONT} ${CN_FONT_OFFSET})
|
||||
add_truetype_font_target(bold17 17 "all" ${FONT_BOLD} ${FONT_OFFSET} ${CN_FONT_BOLD} ${CN_FONT_OFFSET})
|
||||
add_truetype_font_target(24 24 "all" ${FONT} ${FONT_OFFSET} ${CN_FONT} ${CN_FONT_OFFSET})
|
||||
add_truetype_font_target(32 32 "all" ${FONT_BOLD} ${FONT_OFFSET} ${CN_FONT_BOLD} ${CN_FONT_OFFSET})
|
||||
add_truetype_font_target(64 64 "all" ${FONT_BOLD} ${FONT_OFFSET} ${CN_FONT_BOLD} ${CN_FONT_OFFSET})
|
||||
|
||||
add_custom_target(truetype_fonts DEPENDS ${truetype_fonts_targets})
|
||||
|
Before Width: | Height: | Size: 52 KiB |
@@ -1 +0,0 @@
|
||||
17,0,5,14,23,34,44,48,54,60,67,76,80,85,90,97,106,115,124,133,142,151,160,169,178,187,192,196,204,213,221,229,235,245,255,265,275,284,293,303,314,319,328,338,346,359,370,380,390,400,409,418,427,437,447,460,470,479,488,493,500,505,512,519,525,534,543,551,560,568,574,583,592,597,603,611,616,629,638,647,656,665,671,679,685,694,702,713,721,729,737,747,752,760,760,760,760,760,760,760,760,760,760,760,760,760,760,760,760,760,760,760,760,760,760,768,776,785,791,799,809,818,828,837,847,856,865,873,881,889,895,903,911,920,925,934,943,952,961,971,977,986,995,1005,1014,1023,1032,1042,1047,1056,1067,1077,1087,1097,1107,1116,1127,1136,1145,1155,1164,1173,1181,1189,1194,1203,1211,1219,1227,1237,1247,1256,1264,1275,1284,1293,1302,1312,1321,1331,1340,1350,1360,1369,1377,1387,1396,1406,1415,1429,1443,1457,1471,1485,1499,1513,1527,1541,1555,1569,1583,1597,1611,1625,1639,1653,1667,1681,1695,1709,1723,1737,1751,1765,1779,1793,1807,1821,1835,1849,1863,1877,1891,1905,1919,1933,1947,1961,1975,1989,2003,2017,2031,2045,2059,2073,2087,2101,2115,2129,2143,2157,2171,2185,2199,2213,2227,2241,2255,2269,2283,2297,2311,2325,2339,2353,2367,2381,2395,2409,2423,2437,2451,2465,2479,2493,2507,2521,2535,2549,2563,2577,2591,2605,2619,2633,2647,2661,2675,2689,2703,2717,2731,2745,2759,2773,2787,2801,2815,2829,2843,2857,2871,2885,2899,2913,2927,2941,2955,2969,2983,2997,3011,3025,3039,3053,3067,3081,3095,3109,3123,3137,3151,3165,3179,3193,3207,3221,3235,3249,3263,3277,3291,3305,3319,3333,3347,3361,3375,3389,3403,3417,3431,3445,3459,3473,3487,3501,3515,3529,3543,3557,3571,3585,3599,3613,3627,3641,3655,3669,3683,3697,3711,3725,3739,3753,3767,3781,3795,3809,3823,3837,3851,3865,3879,3893,3907,3921
|
||||
|
Before Width: | Height: | Size: 64 KiB |
@@ -1 +0,0 @@
|
||||
19,0,5,16,26,38,49,53,60,67,75,85,89,95,100,108,118,128,138,148,158,168,178,188,198,208,213,218,227,237,246,255,262,273,284,295,306,316,326,338,350,356,366,377,387,402,414,426,437,449,460,470,480,491,502,517,528,539,549,554,562,567,575,583,589,599,609,618,628,637,644,654,664,669,675,684,689,704,714,724,734,744,751,760,766,776,785,798,807,816,825,837,842,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,860,869,879,886,895,906,916,928,938,949,959,969,978,987,996,1003,1012,1021,1031,1037,1047,1057,1067,1077,1088,1095,1105,1115,1126,1137,1147,1158,1169,1175,1185,1197,1209,1220,1231,1242,1252,1264,1274,1284,1295,1305,1315,1324,1333,1339,1349,1358,1367,1376,1387,1398,1408,1418,1430,1440,1450,1460,1471,1481,1492,1502,1513,1524,1534,1543,1555,1565,1577,1587,1603,1619,1635,1651,1667,1683,1699,1715,1731,1747,1763,1779,1795,1811,1827,1843,1859,1875,1891,1907,1923,1939,1955,1971,1987,2003,2019,2035,2051,2067,2083,2099,2115,2131,2147,2163,2179,2195,2211,2227,2243,2259,2275,2291,2307,2323,2339,2355,2371,2387,2403,2419,2435,2451,2467,2483,2499,2515,2531,2547,2563,2579,2595,2611,2627,2643,2659,2675,2691,2707,2723,2739,2755,2771,2787,2803,2819,2835,2851,2867,2883,2899,2915,2931,2947,2963,2979,2995,3011,3027,3043,3059,3075,3091,3107,3123,3139,3155,3171,3187,3203,3219,3235,3251,3267,3283,3299,3315,3331,3347,3363,3379,3395,3411,3427,3443,3459,3475,3491,3507,3523,3539,3555,3571,3587,3603,3619,3635,3651,3667,3683,3699,3715,3731,3747,3763,3779,3795,3811,3827,3843,3859,3875,3891,3907,3923,3939,3955,3971,3987,4003,4019,4035,4051,4067,4083,4099,4115,4131,4147,4163,4179,4195,4211,4227,4243,4259,4275,4291,4307,4323,4339,4355,4371,4387,4403,4419,4435,4451
|
||||
|
Before Width: | Height: | Size: 75 KiB |
@@ -1 +0,0 @@
|
||||
20,0,6,17,27,40,51,55,62,69,77,88,93,99,105,113,123,133,143,153,163,173,183,193,203,213,218,223,233,243,253,262,269,281,292,304,316,327,337,349,362,368,378,390,400,415,428,440,452,464,475,486,497,509,521,537,549,560,571,577,585,591,599,608,614,624,634,644,655,665,672,682,692,697,703,713,718,734,744,755,765,776,783,793,800,810,819,833,842,851,860,872,877,887,900,913,926,939,952,965,978,991,1004,1019,1034,1049,1064,1079,1094,1109,1124,1139,1154,1169,1184,1194,1204,1214,1221,1231,1243,1253,1265,1276,1288,1298,1309,1319,1329,1339,1346,1355,1364,1374,1380,1390,1401,1411,1421,1433,1440,1451,1462,1474,1485,1496,1507,1519,1525,1536,1549,1561,1573,1585,1597,1608,1621,1631,1641,1653,1663,1673,1683,1693,1699,1709,1719,1728,1737,1749,1761,1772,1782,1795,1806,1817,1828,1840,1850,1862,1872,1884,1896,1907,1917,1929,1940,1952,1963,1980,1997,2014,2031,2048,2065,2082,2099,2116,2133,2150,2167,2184,2201,2218,2235,2252,2269,2286,2303,2320,2337,2354,2371,2388,2405,2422,2439,2456,2473,2490,2507,2524,2541,2558,2575,2592,2609,2626,2643,2660,2677,2694,2711,2728,2745,2762,2779,2796,2813,2830,2847,2864,2881,2898,2915,2932,2949,2966,2983,3000,3017,3034,3051,3068,3085,3102,3119,3136,3153,3170,3187,3204,3221,3238,3255,3272,3289,3306,3323,3340,3357,3374,3391,3408,3425,3442,3459,3476,3493,3510,3527,3544,3561,3578,3595,3612,3629,3646,3663,3680,3697,3714,3731,3748,3765,3782,3799,3816,3833,3850,3867,3884,3901,3918,3935,3952,3969,3986,4003,4020,4037,4054,4071,4088,4105,4122,4139,4156,4173,4190,4207,4224,4241,4258,4275,4292,4309,4326,4343,4360,4377,4394,4411,4428,4445,4462,4479,4496,4513,4530,4547,4564,4581,4598,4615,4632,4649,4666,4683,4700,4717,4734,4751,4768,4785,4802,4819,4836,4853,4870,4887,4904,4921,4938,4955,4972,4989,5006
|
||||
|
Before Width: | Height: | Size: 16 KiB |
@@ -1 +0,0 @@
|
||||
20,0,6,17,27,40,51,55,62,69,77,88,93,99,105,113,123,133,143,153,163,173,183,193,203,213,218,223,233,243,253,262,269,281,292,304,316,327,337,349,362,368,378,390,400,415,428,440,452,464,475,486,497,509,521,537,549,560,571,577,585,591,599,608,614,624,634,644,655,665,672,682,692,697,703,713,718,734,744,755,765,776,783,793,800,810,819,833,842,851,860,872,877,887,900,913,926,939,952,965,978,991,1004,1019,1034,1049,1064,1079,1094,1109,1124,1139,1154,1169,1184
|
||||
|
Before Width: | Height: | Size: 78 KiB |
@@ -1 +0,0 @@
|
||||
21,0,6,18,29,43,55,59,66,73,82,93,98,104,110,118,129,140,151,162,173,184,195,206,217,228,234,239,249,260,270,280,288,301,313,326,339,350,361,374,388,394,405,417,428,444,458,471,483,496,508,520,532,545,557,574,586,598,610,616,624,630,639,648,655,666,677,687,698,708,715,726,737,743,750,760,766,782,793,804,815,826,833,843,850,861,871,885,895,905,915,928,934,944,957,970,983,996,1009,1022,1035,1048,1061,1076,1091,1106,1121,1136,1151,1166,1181,1196,1211,1226,1241,1251,1261,1272,1279,1289,1302,1313,1326,1337,1350,1361,1373,1383,1393,1403,1410,1420,1430,1441,1447,1458,1469,1480,1491,1503,1511,1522,1534,1547,1559,1571,1583,1596,1602,1613,1627,1640,1653,1666,1679,1691,1705,1716,1727,1740,1751,1762,1772,1782,1788,1799,1809,1819,1829,1842,1855,1866,1877,1891,1903,1915,1927,1940,1951,1964,1975,1988,2001,2012,2022,2035,2046,2059,2070,2088,2106,2124,2142,2160,2178,2196,2214,2232,2250,2268,2286,2304,2322,2340,2358,2376,2394,2412,2430,2448,2466,2484,2502,2520,2538,2556,2574,2592,2610,2628,2646,2664,2682,2700,2718,2736,2754,2772,2790,2808,2826,2844,2862,2880,2898,2916,2934,2952,2970,2988,3006,3024,3042,3060,3078,3096,3114,3132,3150,3168,3186,3204,3222,3240,3258,3276,3294,3312,3330,3348,3366,3384,3402,3420,3438,3456,3474,3492,3510,3528,3546,3564,3582,3600,3618,3636,3654,3672,3690,3708,3726,3744,3762,3780,3798,3816,3834,3852,3870,3888,3906,3924,3942,3960,3978,3996,4014,4032,4050,4068,4086,4104,4122,4140,4158,4176,4194,4212,4230,4248,4266,4284,4302,4320,4338,4356,4374,4392,4410,4428,4446,4464,4482,4500,4518,4536,4554,4572,4590,4608,4626,4644,4662,4680,4698,4716,4734,4752,4770,4788,4806,4824,4842,4860,4878,4896,4914,4932,4950,4968,4986,5004,5022,5040,5058,5076,5094,5112,5130,5148,5166,5184,5202,5220,5238,5256,5274,5292
|
||||
|
Before Width: | Height: | Size: 16 KiB |
@@ -1 +0,0 @@
|
||||
21,0,6,18,29,43,55,59,66,73,82,93,98,104,110,118,129,140,151,162,173,184,195,206,217,228,234,239,249,260,270,280,288,301,313,326,339,350,361,374,388,394,405,417,428,444,458,471,483,496,508,520,532,545,557,574,586,598,610,616,624,630,639,648,655,666,677,687,698,708,715,726,737,743,750,760,766,782,793,804,815,826,833,843,850,861,871,885,895,905,915,928,934,944,957,970,983,996,1009,1022,1035,1048,1061,1076,1091,1106,1121,1136,1151,1166,1181,1196,1211,1226,1241
|
||||
|
Before Width: | Height: | Size: 114 KiB |
@@ -1 +0,0 @@
|
||||
28,0,8,24,39,58,74,80,90,100,112,127,133,141,149,160,175,190,205,220,235,250,265,280,295,310,317,324,338,353,367,380,390,407,423,440,457,472,487,505,524,532,547,564,578,600,619,637,654,672,688,704,720,737,754,777,794,810,826,834,845,853,865,877,886,901,916,930,945,959,969,984,999,1006,1014,1028,1035,1058,1073,1088,1103,1118,1128,1142,1151,1166,1179,1199,1212,1225,1238,1256,1263,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1277,1291,1305,1320,1329,1343,1360,1375,1393,1408,1425,1440,1456,1470,1484,1498,1508,1521,1534,1549,1557,1572,1587,1602,1617,1634,1644,1659,1675,1692,1708,1724,1740,1757,1765,1780,1799,1817,1834,1851,1868,1884,1903,1918,1933,1950,1965,1980,1994,2008,2016,2031,2045,2058,2071,2088,2105,2120,2134,2153,2169,2185,2201,2218,2233,2250,2265,2282,2299,2314,2328,2346,2361,2379,2394,2419,2444,2469,2494,2519,2544,2569,2594,2619,2644,2669,2694,2719,2744,2769,2794,2819,2844,2869,2894,2919,2944,2969,2994,3019,3044,3069,3094,3119,3144,3169,3194,3219,3244,3269,3294,3319,3344,3369,3394,3419,3444,3469,3494,3519,3544,3569,3594,3619,3644,3669,3694,3719,3744,3769,3794,3819,3844,3869,3894,3919,3944,3969,3994,4019,4044,4069,4094,4119,4144,4169,4194,4219,4244,4269,4294,4319,4344,4369,4394,4419,4444,4469,4494,4519,4544,4569,4594,4619,4644,4669,4694,4719,4744,4769,4794,4819,4844,4869,4894,4919,4944,4969,4994,5019,5044,5069,5094,5119,5144,5169,5194,5219,5244,5269,5294,5319,5344,5369,5394,5419,5444,5469,5494,5519,5544,5569,5594,5619,5644,5669,5694,5719,5744,5769,5794,5819,5844,5869,5894,5919,5944,5969,5994,6019,6044,6069,6094,6119,6144,6169,6194,6219,6244,6269,6294,6319,6344,6369,6394,6419,6444,6469,6494,6519,6544,6569,6594,6619,6644,6669,6694,6719,6744,6769,6794,6819,6844,6869
|
||||
|
Before Width: | Height: | Size: 145 KiB |
@@ -1 +0,0 @@
|
||||
36,0,10,31,51,76,98,105,118,131,147,166,175,189,200,214,234,254,274,294,314,334,354,374,394,414,425,435,453,473,491,508,522,545,567,589,611,630,649,672,696,707,726,748,767,797,821,845,867,891,913,934,955,978,1000,1029,1051,1072,1093,1103,1119,1129,1144,1160,1172,1191,1211,1229,1249,1268,1281,1301,1320,1330,1342,1361,1371,1400,1419,1439,1459,1479,1492,1510,1522,1541,1559,1584,1602,1620,1638,1660,1670,1688,1688,1688,1688,1688,1688,1688,1688,1688,1688,1688,1688,1688,1688,1688,1688,1688,1688,1688,1688,1688,1688,1707,1726,1745,1759,1777,1800,1819,1843,1863,1886,1905,1927,1946,1964,1982,1996,2014,2032,2051,2063,2082,2102,2121,2140,2163,2178,2197,2218,2240,2262,2283,2304,2327,2339,2358,2382,2406,2429,2452,2474,2495,2519,2538,2557,2580,2599,2618,2636,2655,2666,2685,2703,2721,2739,2762,2784,2803,2822,2846,2867,2888,2909,2932,2951,2974,2993,3016,3038,3057,3076,3100,3120,3144,3164,3197,3230,3263,3296,3329,3362,3395,3428,3461,3494,3527,3560,3593,3626,3659,3692,3725,3758,3791,3824,3857,3890,3923,3956,3989,4022,4055,4088,4121,4154,4187,4220,4253,4286,4319,4352,4385,4418,4451,4484,4517,4550,4583,4616,4649,4682,4715,4748,4781,4814,4847,4880,4913,4946,4979,5012,5045,5078,5111,5144,5177,5210,5243,5276,5309,5342,5375,5408,5441,5474,5507,5540,5573,5606,5639,5672,5705,5738,5771,5804,5837,5870,5903,5936,5969,6002,6035,6068,6101,6134,6167,6200,6233,6266,6299,6332,6365,6398,6431,6464,6497,6530,6563,6596,6629,6662,6695,6728,6761,6794,6827,6860,6893,6926,6959,6992,7025,7058,7091,7124,7157,7190,7223,7256,7289,7322,7355,7388,7421,7454,7487,7520,7553,7586,7619,7652,7685,7718,7751,7784,7817,7850,7883,7916,7949,7982,8015,8048,8081,8114,8147,8180,8213,8246,8279,8312,8345,8378,8411,8444,8477,8510,8543,8576,8609,8642,8675,8708,8741,8774,8807,8840,8873,8906,8939,8972,9005,9038,9071
|
||||
|
Before Width: | Height: | Size: 281 KiB |
@@ -1 +0,0 @@
|
||||
68,0,19,59,97,146,189,201,225,249,279,315,332,358,378,404,442,480,518,556,594,632,670,708,746,784,804,822,856,894,929,962,988,1033,1075,1118,1161,1198,1235,1280,1327,1347,1384,1427,1463,1521,1568,1614,1657,1703,1745,1786,1827,1871,1914,1971,2013,2054,2094,2113,2143,2162,2191,2221,2244,2280,2318,2353,2391,2427,2451,2489,2526,2544,2565,2601,2619,2676,2713,2751,2789,2827,2852,2886,2909,2946,2980,3029,3063,3097,3131,3174,3192,3227,3227,3227,3227,3227,3227,3227,3227,3227,3227,3227,3227,3227,3227,3227,3227,3227,3227,3227,3227,3227,3227,3263,3299,3335,3361,3396,3441,3477,3523,3561,3605,3642,3684,3720,3754,3789,3816,3850,3884,3920,3942,3979,4017,4054,4091,4136,4164,4201,4242,4285,4327,4367,4408,4453,4475,4512,4559,4605,4649,4693,4736,4777,4824,4861,4897,4942,4979,5015,5050,5086,5107,5144,5178,5212,5246,5291,5334,5371,5408,5455,5496,5536,5576,5621,5657,5702,5738,5783,5826,5863,5899,5945,5983,6029,6067,6132,6197,6262,6327,6392,6457,6522,6587,6652,6717,6782,6847,6912,6977,7042,7107,7172,7237,7302,7367,7432,7497,7562,7627,7692,7757,7822,7887,7952,8017,8082,8147,8212,8277,8342,8407,8472,8537,8602,8667,8732,8797,8862,8927,8992,9057,9122,9187,9252,9317,9382,9447,9512,9577,9642,9707,9772,9837,9902,9967,10032,10097,10162,10227,10292,10357,10422,10487,10552,10617,10682,10747,10812,10877,10942,11007,11072,11137,11202,11267,11332,11397,11462,11527,11592,11657,11722,11787,11852,11917,11982,12047,12112,12177,12242,12307,12372,12437,12502,12567,12632,12697,12762,12827,12892,12957,13022,13087,13152,13217,13282,13347,13412,13477,13542,13607,13672,13737,13802,13867,13932,13997,14062,14127,14192,14257,14322,14387,14452,14517,14582,14647,14712,14777,14842,14907,14972,15037,15102,15167,15232,15297,15362,15427,15492,15557,15622,15687,15752,15817,15882,15947,16012,16077,16142,16207,16272,16337,16402,16467,16532,16597,16662,16727,16792,16857,16922,16987,17052,17117,17182,17247,17312,17377,17442,17507,17572,17637,17702
|
||||
|
Before Width: | Height: | Size: 36 KiB |
@@ -1 +0,0 @@
|
||||
13,0,4,11,18,26,33,36,41,46,51,58,61,65,69,74,81,88,95,102,109,116,123,130,137,144,148,151,157,163,169,175,180,187,194,201,208,215,221,229,237,241,247,254,260,269,277,285,292,300,307,314,321,328,335,344,351,358,365,369,374,378,383,389,393,399,406,412,419,425,430,437,443,447,452,458,462,471,477,484,491,498,503,509,513,519,525,533,539,545,551,559,563,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,569,575,581,587,592,598,605,611,619,626,633,639,646,652,658,664,669,675,681,687,691,697,704,710,716,723,728,735,742,749,756,763,770,777,781,788,796,804,811,818,825,832,840,846,852,859,865,871,877,883,887,893,899,905,911,918,925,932,938,946,953,960,967,974,980,987,993,1000,1007,1014,1020,1028,1035,1043,1050,1060,1070,1080,1090,1100,1110,1120,1130,1140,1150,1160,1170,1180,1190,1200,1210,1220,1230,1240,1250,1260,1270,1280,1290,1300,1310,1320,1330,1340,1350,1360,1370,1380,1390,1400,1410,1420,1430,1440,1450,1460,1470,1480,1490,1500,1510,1520,1530,1540,1550,1560,1570,1580,1590,1600,1610,1620,1630,1640,1650,1660,1670,1680,1690,1700,1710,1720,1730,1740,1750,1760,1770,1780,1790,1800,1810,1820,1830,1840,1850,1860,1870,1880,1890,1900,1910,1920,1930,1940,1950,1960,1970,1980,1990,2000,2010,2020,2030,2040,2050,2060,2070,2080,2090,2100,2110,2120,2130,2140,2150,2160,2170,2180,2190,2200,2210,2220,2230,2240,2250,2260,2270,2280,2290,2300,2310,2320,2330,2340,2350,2360,2370,2380,2390,2400,2410,2420,2430,2440,2450,2460,2470,2480,2490,2500,2510,2520,2530,2540,2550,2560,2570,2580,2590,2600,2610,2620,2630,2640,2650,2660,2670,2680,2690,2700,2710,2720,2730,2740,2750,2760,2770,2780,2790,2800,2810,2820,2830,2840
|
||||
|
Before Width: | Height: | Size: 72 KiB |
@@ -1 +0,0 @@
|
||||
20,0,6,17,28,41,53,57,64,71,80,90,95,103,109,117,128,139,150,161,172,183,194,205,216,227,233,239,249,260,270,279,287,299,311,323,335,345,355,367,380,386,396,408,418,434,447,460,472,485,497,508,519,531,543,558,570,581,592,598,607,613,621,630,637,647,658,668,679,689,696,707,717,723,730,740,746,761,771,782,793,804,811,821,828,838,848,861,871,881,891,903,909,919,932,945,958,971,984,997,1010,1023,1036,1051,1066,1081,1096,1111,1126,1141,1156,1171,1186,1201,1216,1226,1236,1246,1254,1264,1276,1286,1299,1310,1322,1332,1344,1354,1364,1374,1382,1392,1402,1412,1419,1429,1440,1450,1460,1472,1480,1490,1501,1513,1525,1536,1547,1559,1566,1576,1589,1602,1614,1626,1638,1649,1662,1672,1682,1694,1704,1714,1724,1734,1740,1750,1760,1770,1780,1792,1804,1814,1824,1837,1848,1859,1870,1882,1892,1904,1914,1926,1938,1948,1958,1971,1982,1995,2006,2023,2040,2057,2074,2091,2108,2125,2142,2159,2176,2193,2210,2227,2244,2261,2278,2295,2312,2329,2346,2363,2380,2397,2414,2431,2448,2465,2482,2499,2516,2533,2550,2567,2584,2601,2618,2635,2652,2669,2686,2703,2720,2737,2754,2771,2788,2805,2822,2839,2856,2873,2890,2907,2924,2941,2958,2975,2992,3009,3026,3043,3060,3077,3094,3111,3128,3145,3162,3179,3196,3213,3230,3247,3264,3281,3298,3315,3332,3349,3366,3383,3400,3417,3434,3451,3468,3485,3502,3519,3536,3553,3570,3587,3604,3621,3638,3655,3672,3689,3706,3723,3740,3757,3774,3791,3808,3825,3842,3859,3876,3893,3910,3927,3944,3961,3978,3995,4012,4029,4046,4063,4080,4097,4114,4131,4148,4165,4182,4199,4216,4233,4250,4267,4284,4301,4318,4335,4352,4369,4386,4403,4420,4437,4454,4471,4488,4505,4522,4539,4556,4573,4590,4607,4624,4641,4658,4675,4692,4709,4726,4743,4760,4777,4794,4811,4828,4845,4862,4879,4896,4913,4930,4947,4964,4981,4998,5015,5032,5049
|
||||
|
Before Width: | Height: | Size: 74 KiB |
@@ -1 +0,0 @@
|
||||
21,0,6,18,29,43,56,60,67,74,83,94,100,108,114,123,134,145,156,167,178,189,200,211,222,233,239,245,255,266,276,286,294,307,319,332,345,356,367,380,394,400,411,423,434,450,463,476,488,501,513,525,537,550,563,579,591,603,615,621,630,636,645,654,661,672,683,693,704,715,723,734,745,751,758,769,775,791,802,813,824,835,843,853,860,871,881,895,905,915,925,938,944,954,967,980,993,1006,1019,1032,1045,1058,1071,1086,1101,1116,1131,1146,1161,1176,1191,1206,1221,1236,1251,1262,1273,1284,1292,1302,1315,1326,1339,1350,1363,1374,1386,1397,1407,1417,1425,1435,1445,1456,1463,1474,1485,1496,1507,1520,1529,1540,1552,1565,1577,1589,1601,1614,1621,1632,1645,1658,1671,1684,1697,1709,1722,1733,1744,1757,1768,1779,1789,1800,1807,1818,1828,1838,1848,1861,1874,1885,1896,1909,1921,1933,1945,1958,1969,1982,1993,2006,2019,2030,2041,2054,2065,2078,2089,2107,2125,2143,2161,2179,2197,2215,2233,2251,2269,2287,2305,2323,2341,2359,2377,2395,2413,2431,2449,2467,2485,2503,2521,2539,2557,2575,2593,2611,2629,2647,2665,2683,2701,2719,2737,2755,2773,2791,2809,2827,2845,2863,2881,2899,2917,2935,2953,2971,2989,3007,3025,3043,3061,3079,3097,3115,3133,3151,3169,3187,3205,3223,3241,3259,3277,3295,3313,3331,3349,3367,3385,3403,3421,3439,3457,3475,3493,3511,3529,3547,3565,3583,3601,3619,3637,3655,3673,3691,3709,3727,3745,3763,3781,3799,3817,3835,3853,3871,3889,3907,3925,3943,3961,3979,3997,4015,4033,4051,4069,4087,4105,4123,4141,4159,4177,4195,4213,4231,4249,4267,4285,4303,4321,4339,4357,4375,4393,4411,4429,4447,4465,4483,4501,4519,4537,4555,4573,4591,4609,4627,4645,4663,4681,4699,4717,4735,4753,4771,4789,4807,4825,4843,4861,4879,4897,4915,4933,4951,4969,4987,5005,5023,5041,5059,5077,5095,5113,5131,5149,5167,5185,5203,5221,5239,5257,5275,5293,5311
|
||||
@@ -273,7 +273,7 @@ void lcdDrawChar(coord_t x, coord_t y, const unsigned char c, LcdFlags flags)
|
||||
#endif
|
||||
{
|
||||
#if !defined(BOOT)
|
||||
q = (c < 0xC0) ? &font_5x7[(c-0x20)*5] : &font_5x7_extra[(c-0xC0)*5];
|
||||
q = (c < 0x80) ? &font_5x7[(c-0x20)*5] : &font_5x7_extra[(c-0x80)*5];
|
||||
#else
|
||||
q = &font_5x7[(c-0x20)*5];
|
||||
#endif
|
||||
@@ -291,7 +291,7 @@ uint8_t getTextWidth(const char * s, uint8_t len, LcdFlags flags)
|
||||
{
|
||||
uint8_t width = 0;
|
||||
for (int i=0; len==0 || i<len; ++i) {
|
||||
unsigned char c = (flags & ZCHAR) ? zchar2char(*s) : *s;
|
||||
unsigned char c = *s;
|
||||
if (!c) {
|
||||
break;
|
||||
}
|
||||
@@ -323,17 +323,7 @@ void lcdDrawSizedText(coord_t x, coord_t y, const char * s, uint8_t len, LcdFlag
|
||||
|
||||
bool setx = false;
|
||||
while (len--) {
|
||||
unsigned char c;
|
||||
switch (flags & ZCHAR) {
|
||||
#if !defined(BOOT)
|
||||
case ZCHAR:
|
||||
c = zchar2char(*s);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
c = *s;
|
||||
break;
|
||||
}
|
||||
unsigned char c = *s;
|
||||
|
||||
if (setx) {
|
||||
x = c;
|
||||
@@ -419,7 +409,7 @@ void lcdDrawTextAtIndex(coord_t x, coord_t y, const char * s,uint8_t idx, LcdFla
|
||||
{
|
||||
uint8_t length;
|
||||
length = *(s++);
|
||||
lcdDrawSizedText(x, y, s+length*idx, length, flags & ~ZCHAR);
|
||||
lcdDrawSizedText(x, y, s+length*idx, length, flags);
|
||||
}
|
||||
|
||||
void lcdDrawHexNumber(coord_t x, coord_t y, uint32_t val, LcdFlags flags)
|
||||
@@ -688,8 +678,8 @@ void drawSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att)
|
||||
else if (idx <= MIXSRC_LAST_INPUT) {
|
||||
lcdDrawChar(x+2, y+1, CHR_INPUT, TINSIZE);
|
||||
lcdDrawSolidFilledRect(x, y, 7, 7);
|
||||
if (ZEXIST(g_model.inputNames[idx-MIXSRC_FIRST_INPUT]))
|
||||
lcdDrawSizedText(x+8, y, g_model.inputNames[idx-MIXSRC_FIRST_INPUT], LEN_INPUT_NAME, ZCHAR|att);
|
||||
if (g_model.inputNames[idx-MIXSRC_FIRST_INPUT][0])
|
||||
lcdDrawSizedText(x+8, y, g_model.inputNames[idx-MIXSRC_FIRST_INPUT], LEN_INPUT_NAME, att);
|
||||
else
|
||||
lcdDrawNumber(x+8, y, idx, att|LEADING0|LEFT, 2);
|
||||
}
|
||||
@@ -712,14 +702,14 @@ void drawSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att)
|
||||
#endif
|
||||
else if (idx <= MIXSRC_LAST_POT) {
|
||||
idx = idx - MIXSRC_Rud;
|
||||
if (ZEXIST(g_eeGeneral.anaNames[idx])) {
|
||||
if (g_eeGeneral.anaNames[idx][0]) {
|
||||
if (idx < MIXSRC_FIRST_POT-MIXSRC_Rud )
|
||||
lcdDrawChar(x, y, '\307', att); // stick symbol
|
||||
lcdDrawChar(x, y, '\207', att); // stick symbol
|
||||
else if (idx <= MIXSRC_LAST_POT-MIXSRC_Rud )
|
||||
lcdDrawChar(x, y, '\310', att); // pot symbol
|
||||
lcdDrawChar(x, y, '\210', att); // pot symbol
|
||||
else
|
||||
lcdDrawChar(x, y, '\311', att); // slider symbol
|
||||
lcdDrawSizedText(lcdNextPos, y, g_eeGeneral.anaNames[idx], LEN_ANA_NAME, ZCHAR|att);
|
||||
lcdDrawChar(x, y, '\211', att); // slider symbol
|
||||
lcdDrawSizedText(lcdNextPos, y, g_eeGeneral.anaNames[idx], LEN_ANA_NAME, att);
|
||||
}
|
||||
else {
|
||||
lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx + 1, att);
|
||||
@@ -728,8 +718,8 @@ void drawSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att)
|
||||
else if (idx >= MIXSRC_FIRST_SWITCH && idx <= MIXSRC_LAST_SWITCH) {
|
||||
idx = idx-MIXSRC_FIRST_SWITCH;
|
||||
if (ZEXIST(g_eeGeneral.switchNames[idx])) {
|
||||
lcdDrawChar(x, y, '\312', att); //switch symbol
|
||||
lcdDrawSizedText(lcdNextPos, y, g_eeGeneral.switchNames[idx], LEN_SWITCH_NAME, ZCHAR|att);
|
||||
lcdDrawChar(x, y, '\212', att); //switch symbol
|
||||
lcdDrawSizedText(lcdNextPos, y, g_eeGeneral.switchNames[idx], LEN_SWITCH_NAME, att);
|
||||
}
|
||||
else {
|
||||
lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx + MIXSRC_FIRST_SWITCH - MIXSRC_Rud + 1, att);
|
||||
@@ -745,7 +735,7 @@ void drawSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att)
|
||||
drawStringWithIndex(x, y, STR_CH, idx-MIXSRC_CH1+1, att);
|
||||
if (ZEXIST(g_model.limitData[idx-MIXSRC_CH1].name) && (att & STREXPANDED)) {
|
||||
lcdDrawChar(lcdLastRightPos, y, ' ', att|SMLSIZE);
|
||||
lcdDrawSizedText(lcdLastRightPos+3, y, g_model.limitData[idx-MIXSRC_CH1].name, LEN_CHANNEL_NAME, ZCHAR|att|SMLSIZE);
|
||||
lcdDrawSizedText(lcdLastRightPos+3, y, g_model.limitData[idx-MIXSRC_CH1].name, LEN_CHANNEL_NAME, att|SMLSIZE);
|
||||
}
|
||||
}
|
||||
else if (idx <= MIXSRC_LAST_GVAR) {
|
||||
@@ -756,7 +746,7 @@ void drawSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att)
|
||||
}
|
||||
else if (idx <= MIXSRC_LAST_TIMER) {
|
||||
if(ZEXIST(g_model.timers[idx-MIXSRC_FIRST_TIMER].name)) {
|
||||
lcdDrawSizedText(x, y, g_model.timers[idx-MIXSRC_FIRST_TIMER].name, LEN_TIMER_NAME, ZCHAR|att);
|
||||
lcdDrawSizedText(x, y, g_model.timers[idx-MIXSRC_FIRST_TIMER].name, LEN_TIMER_NAME, att);
|
||||
}
|
||||
else {
|
||||
lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx-MIXSRC_Rud+1-MAX_LOGICAL_SWITCHES-MAX_TRAINER_CHANNELS-MAX_OUTPUT_CHANNELS-MAX_GVARS, att);
|
||||
@@ -765,7 +755,7 @@ void drawSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att)
|
||||
else {
|
||||
idx -= MIXSRC_FIRST_TELEM;
|
||||
div_t qr = div(idx, 3);
|
||||
lcdDrawSizedText(x, y, g_model.telemetrySensors[qr.quot].label, TELEM_LABEL_LEN, ZCHAR|att);
|
||||
lcdDrawSizedText(x, y, g_model.telemetrySensors[qr.quot].label, TELEM_LABEL_LEN, att);
|
||||
if (qr.rem) lcdDrawChar(lcdLastRightPos, y, qr.rem==2 ? '+' : '-', att);
|
||||
}
|
||||
}
|
||||
@@ -783,7 +773,7 @@ void drawModelName(coord_t x, coord_t y, char *name, uint8_t id, LcdFlags att)
|
||||
drawStringWithIndex(x, y, STR_MODEL, id+1, att|LEADING0);
|
||||
}
|
||||
else {
|
||||
lcdDrawSizedText(x, y, name, sizeof(g_model.header.name), ZCHAR|att);
|
||||
lcdDrawSizedText(x, y, name, sizeof(g_model.header.name), att);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -995,7 +985,7 @@ void lcdDrawHorizontalLine(coord_t x, coord_t y, coord_t w, uint8_t pat, LcdFlag
|
||||
uint8_t *p = &displayBuf[ y / 8 * LCD_W + x ];
|
||||
uint8_t msk = bfBit<uint8_t>(y % 8);
|
||||
while (w--) {
|
||||
if(pat&1) {
|
||||
if(pat & 1) {
|
||||
lcdMaskPoint(p, msk, att);
|
||||
pat = (pat >> 1) | 0x80;
|
||||
}
|
||||
|
||||
@@ -113,7 +113,7 @@ void menuModelExpoOne(event_t event)
|
||||
|
||||
case EXPO_FIELD_WEIGHT:
|
||||
lcdDrawTextAlignedLeft(y, STR_WEIGHT);
|
||||
ed->weight = GVAR_MENU_ITEM(EXPO_ONE_2ND_COLUMN, y, ed->weight, MIN_EXPO_WEIGHT, 100, RIGHT | attr, 0, event);
|
||||
ed->weight = GVAR_MENU_ITEM(EXPO_ONE_2ND_COLUMN, y, ed->weight, -100, 100, RIGHT | attr, 0, event);
|
||||
break;
|
||||
|
||||
case EXPO_FIELD_OFFSET:
|
||||
|
||||
@@ -249,7 +249,7 @@ void menuModelExpoOne(event_t event)
|
||||
|
||||
case EXPO_FIELD_WEIGHT:
|
||||
lcdDrawTextAlignedLeft(y, STR_WEIGHT);
|
||||
ed->weight = GVAR_MENU_ITEM(EXPO_ONE_2ND_COLUMN, y, ed->weight, MIN_EXPO_WEIGHT, 100, attr, 0, event);
|
||||
ed->weight = GVAR_MENU_ITEM(EXPO_ONE_2ND_COLUMN, y, ed->weight, -100, 100, attr, 0, event);
|
||||
break;
|
||||
|
||||
case EXPO_FIELD_EXPO:
|
||||
@@ -410,7 +410,7 @@ void menuModelMixOne(event_t event)
|
||||
drawFieldLabel(COLUMN_X, y, STR_OFFSET);
|
||||
u_int8int16_t offset;
|
||||
MD_OFFSET_TO_UNION(md2, offset);
|
||||
offset.word = GVAR_MENU_ITEM(COLUMN_X+MIXES_2ND_COLUMN, y, offset.word, GV_RANGELARGE_OFFSET_NEG, GV_RANGELARGE_OFFSET, attr|LEFT, 0, event);
|
||||
offset.word = GVAR_MENU_ITEM(COLUMN_X+MIXES_2ND_COLUMN, y, offset.word, MIX_OFFSET_MIN, MIX_OFFSET_MAX, attr|LEFT, 0, event);
|
||||
MD_UNION_TO_OFFSET(offset, md2);
|
||||
drawOffsetBar(COLUMN_X+MIXES_2ND_COLUMN+22, y, md2);
|
||||
break;
|
||||
@@ -771,7 +771,7 @@ void menuModelExpoMix(uint8_t expo, event_t event)
|
||||
if (menuVerticalOffset < cur && cur-menuVerticalOffset < 8) {
|
||||
uint8_t attr = ((s_copyMode || sub != cur) ? 0 : INVERS);
|
||||
if (expo) {
|
||||
ed->weight = GVAR_MENU_ITEM(EXPO_LINE_WEIGHT_POS, y, ed->weight, MIN_EXPO_WEIGHT, 100, attr | (isExpoActive(i) ? BOLD : 0), 0, event);
|
||||
ed->weight = GVAR_MENU_ITEM(EXPO_LINE_WEIGHT_POS, y, ed->weight, -100, 100, attr | (isExpoActive(i) ? BOLD : 0), 0, event);
|
||||
displayExpoLine(y, ed);
|
||||
if (ed->mode!=3) {
|
||||
lcdDrawChar(EXPO_LINE_SIDE_POS, y, ed->mode == 2 ? 126 : 127);
|
||||
|
||||
@@ -125,7 +125,7 @@ void menuModelMixOne(event_t event)
|
||||
lcdDrawTextAlignedLeft(y, STR_OFFSET);
|
||||
u_int8int16_t offset;
|
||||
MD_OFFSET_TO_UNION(md2, offset);
|
||||
offset.word = GVAR_MENU_ITEM(MIXES_2ND_COLUMN, y, offset.word, GV_RANGELARGE_OFFSET_NEG, GV_RANGELARGE_OFFSET, attr|LEFT, 0, event);
|
||||
offset.word = GVAR_MENU_ITEM(MIXES_2ND_COLUMN, y, offset.word, MIX_OFFSET_MIN, MIX_OFFSET_MAX, attr|LEFT, 0, event);
|
||||
MD_UNION_TO_OFFSET(offset, md2);
|
||||
drawOffsetBar(MIXES_2ND_COLUMN+22, y, md2);
|
||||
break;
|
||||
|
||||
@@ -181,7 +181,7 @@ void menuModelLimitsOne(event_t event)
|
||||
#if defined(PPM_LIMITS_SYMETRICAL)
|
||||
case ITEM_OUTPUTONE_SYMETRICAL:
|
||||
lcdDrawTextAlignedLeft(y, TR_LIMITS_HEADERS_SUBTRIMMODE);
|
||||
lcdDrawChar(LIMITS_ONE_2ND_COLUMN, y, ld->symetrical ? '=' : '\306', attr);
|
||||
lcdDrawChar(LIMITS_ONE_2ND_COLUMN, y, ld->symetrical ? '=' : '\206', attr);
|
||||
if (active) {
|
||||
CHECK_INCDEC_MODELVAR_ZERO(event, ld->symetrical, 1);
|
||||
}
|
||||
@@ -326,7 +326,7 @@ void menuModelLimits(event_t event)
|
||||
break;
|
||||
|
||||
case ITEM_OUTPUTS_SYMETRICAL:
|
||||
lcdDrawChar(LCD_W-FW, y, ld->symetrical ? '=' : '\306', 0);
|
||||
lcdDrawChar(LCD_W-FW, y, ld->symetrical ? '=' : '\206', 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -124,7 +124,7 @@ void drawGVarValue(coord_t x, coord_t y, uint8_t gvar, gvar_t value, LcdFlags fl
|
||||
|
||||
int16_t editGVarFieldValue(coord_t x, coord_t y, int16_t value, int16_t min, int16_t max, LcdFlags attr, uint8_t editflags, event_t event)
|
||||
{
|
||||
uint16_t delta = GV_GET_GV1_VALUE(max);
|
||||
uint16_t delta = GV_GET_GV1_VALUE(min, max);
|
||||
bool invers = (attr & INVERS);
|
||||
|
||||
// TRACE("editGVarFieldValue(val=%d min=%d max=%d)", value, min, max);
|
||||
|
||||
@@ -209,7 +209,7 @@ void getCharPattern(PatternData * pattern, unsigned char c, LcdFlags flags)
|
||||
else {
|
||||
pattern->width = 5;
|
||||
pattern->height = 7;
|
||||
pattern->data = (c < 0xC0) ? &font_5x7[(c-0x20)*5] : &font_5x7_extra[(c-0xC0)*5];
|
||||
pattern->data = (c < 0x80) ? &font_5x7[(c-0x20)*5] : &font_5x7_extra[(c-0x80)*5];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -244,7 +244,7 @@ uint8_t getTextWidth(const char * s, uint8_t len, LcdFlags flags)
|
||||
{
|
||||
uint8_t width = 0;
|
||||
for (int i=0; len==0 || i<len; ++i) {
|
||||
unsigned char c = (flags & ZCHAR) ? zchar2char(*s) : *s;
|
||||
unsigned char c = *s;
|
||||
if (!c) {
|
||||
break;
|
||||
}
|
||||
@@ -275,11 +275,7 @@ void lcdDrawSizedText(coord_t x, coord_t y, const char * s, uint8_t len, LcdFlag
|
||||
#endif
|
||||
|
||||
while (len--) {
|
||||
#if defined(BOOT)
|
||||
unsigned char c = *s;
|
||||
#else
|
||||
unsigned char c = (flags & ZCHAR) ? zchar2char(*s) : *s;
|
||||
#endif
|
||||
|
||||
if (setx) {
|
||||
x = c;
|
||||
@@ -376,7 +372,7 @@ void lcdDrawTextAlignedLeft(coord_t y, const char * s)
|
||||
void lcdDrawTextAtIndex(coord_t x, coord_t y, const char * s,uint8_t idx, LcdFlags flags)
|
||||
{
|
||||
uint8_t length = *(s++);
|
||||
lcdDrawSizedText(x, y, s+length*idx, length, flags & ~ZCHAR);
|
||||
lcdDrawSizedText(x, y, s+length*idx, length, flags);
|
||||
}
|
||||
|
||||
void lcdDrawHexNumber(coord_t x, coord_t y, uint32_t val, LcdFlags flags)
|
||||
@@ -596,7 +592,7 @@ void drawSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att)
|
||||
lcdDrawChar(x+2, y+1, CHR_INPUT, TINSIZE);
|
||||
lcdDrawFilledRect(x, y, 7, 7);
|
||||
if (ZEXIST(g_model.inputNames[idx-MIXSRC_FIRST_INPUT]))
|
||||
lcdDrawSizedText(x+8, y, g_model.inputNames[idx-MIXSRC_FIRST_INPUT], LEN_INPUT_NAME, ZCHAR|att);
|
||||
lcdDrawSizedText(x+8, y, g_model.inputNames[idx-MIXSRC_FIRST_INPUT], LEN_INPUT_NAME, att);
|
||||
else
|
||||
lcdDrawNumber(x+8, y, idx, att|LEADING0|LEFT, 2);
|
||||
}
|
||||
@@ -619,23 +615,23 @@ void drawSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att)
|
||||
|
||||
else if (idx <= MIXSRC_LAST_POT) {
|
||||
idx = idx-MIXSRC_Rud;
|
||||
if (ZEXIST(g_eeGeneral.anaNames[idx])) {
|
||||
if (g_eeGeneral.anaNames[idx][0]) {
|
||||
if (idx < MIXSRC_FIRST_POT-MIXSRC_Rud )
|
||||
lcdDrawChar(x, y, '\307', att); //stick symbol
|
||||
lcdDrawChar(x, y, '\207', att); //stick symbol
|
||||
else if (idx < MIXSRC_FIRST_SLIDER-MIXSRC_Rud )
|
||||
lcdDrawChar(x, y, '\310', att); //pot symbol
|
||||
lcdDrawChar(x, y, '\210', att); //pot symbol
|
||||
else
|
||||
lcdDrawChar(x, y, '\311', att); //slider symbol
|
||||
lcdDrawSizedText(lcdNextPos, y, g_eeGeneral.anaNames[idx], LEN_ANA_NAME, ZCHAR|att);
|
||||
lcdDrawChar(x, y, '\211', att); //slider symbol
|
||||
lcdDrawSizedText(lcdNextPos, y, g_eeGeneral.anaNames[idx], LEN_ANA_NAME, att);
|
||||
}
|
||||
else
|
||||
lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx+1, att);
|
||||
}
|
||||
else if (idx >= MIXSRC_FIRST_SWITCH && idx <= MIXSRC_LAST_SWITCH) {
|
||||
idx = idx - MIXSRC_FIRST_SWITCH;
|
||||
if (ZEXIST(g_eeGeneral.switchNames[idx])) {
|
||||
lcdDrawChar(x, y, '\312', att); //switch symbol
|
||||
lcdDrawSizedText(lcdNextPos, y, g_eeGeneral.switchNames[idx], LEN_SWITCH_NAME, ZCHAR|att);
|
||||
if (g_eeGeneral.switchNames[idx][0]) {
|
||||
lcdDrawChar(x, y, '\212', att); //switch symbol
|
||||
lcdDrawSizedText(lcdNextPos, y, g_eeGeneral.switchNames[idx], LEN_SWITCH_NAME, att);
|
||||
}
|
||||
else {
|
||||
lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx + MIXSRC_FIRST_SWITCH - MIXSRC_Rud + 1, att);
|
||||
@@ -651,7 +647,7 @@ void drawSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att)
|
||||
drawStringWithIndex(x, y, STR_CH, idx-MIXSRC_CH1+1, att);
|
||||
if (ZEXIST(g_model.limitData[idx-MIXSRC_CH1].name) && (att & STREXPANDED)) {
|
||||
lcdDrawChar(lcdLastRightPos, y, ' ', att|SMLSIZE);
|
||||
lcdDrawSizedText(lcdLastRightPos+3, y, g_model.limitData[idx-MIXSRC_CH1].name, LEN_CHANNEL_NAME, ZCHAR|att|SMLSIZE);
|
||||
lcdDrawSizedText(lcdLastRightPos+3, y, g_model.limitData[idx-MIXSRC_CH1].name, LEN_CHANNEL_NAME, att|SMLSIZE);
|
||||
}
|
||||
}
|
||||
else if (idx <= MIXSRC_LAST_GVAR) {
|
||||
@@ -662,7 +658,7 @@ void drawSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att)
|
||||
}
|
||||
else if (idx <= MIXSRC_LAST_TIMER) {
|
||||
if(ZEXIST(g_model.timers[idx-MIXSRC_FIRST_TIMER].name)) {
|
||||
lcdDrawSizedText(x, y, g_model.timers[idx-MIXSRC_FIRST_TIMER].name, LEN_TIMER_NAME, ZCHAR|att);
|
||||
lcdDrawSizedText(x, y, g_model.timers[idx-MIXSRC_FIRST_TIMER].name, LEN_TIMER_NAME, att);
|
||||
}
|
||||
else {
|
||||
lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx-MIXSRC_Rud+1-MAX_LOGICAL_SWITCHES-MAX_TRAINER_CHANNELS-MAX_OUTPUT_CHANNELS-MAX_GVARS, att);
|
||||
@@ -671,7 +667,7 @@ void drawSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att)
|
||||
else {
|
||||
idx -= MIXSRC_FIRST_TELEM;
|
||||
div_t qr = div(idx, 3);
|
||||
lcdDrawSizedText(x, y, g_model.telemetrySensors[qr.quot].label, TELEM_LABEL_LEN, ZCHAR|att);
|
||||
lcdDrawSizedText(x, y, g_model.telemetrySensors[qr.quot].label, TELEM_LABEL_LEN, att);
|
||||
if (qr.rem) lcdDrawChar(lcdLastRightPos, y, qr.rem==2 ? '+' : '-', att);
|
||||
}
|
||||
}
|
||||
@@ -689,7 +685,7 @@ void drawModelName(coord_t x, coord_t y, char *name, uint8_t id, LcdFlags att)
|
||||
drawStringWithIndex(x, y, STR_MODEL, id+1, att|LEADING0);
|
||||
}
|
||||
else {
|
||||
lcdDrawSizedText(x, y, name, sizeof(g_model.header.name), ZCHAR|att);
|
||||
lcdDrawSizedText(x, y, name, sizeof(g_model.header.name), att);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -120,7 +120,7 @@ void menuModelExpoOne(event_t event)
|
||||
|
||||
case EXPO_FIELD_WEIGHT:
|
||||
lcdDrawTextAlignedLeft(y, STR_WEIGHT);
|
||||
ed->weight = GVAR_MENU_ITEM(EXPO_ONE_2ND_COLUMN, y, ed->weight, MIN_EXPO_WEIGHT, 100, LEFT|attr, 0, event);
|
||||
ed->weight = GVAR_MENU_ITEM(EXPO_ONE_2ND_COLUMN, y, ed->weight, -100, 100, LEFT|attr, 0, event);
|
||||
break;
|
||||
|
||||
case EXPO_FIELD_OFFSET:
|
||||
|
||||
@@ -124,7 +124,7 @@ void menuModelMixOne(event_t event)
|
||||
lcdDrawTextAlignedLeft(y, STR_OFFSET);
|
||||
u_int8int16_t offset;
|
||||
MD_OFFSET_TO_UNION(md2, offset);
|
||||
offset.word = GVAR_MENU_ITEM(MIXES_2ND_COLUMN, y, offset.word, GV_RANGELARGE_OFFSET_NEG, GV_RANGELARGE_OFFSET, attr|LEFT, 0, event);
|
||||
offset.word = GVAR_MENU_ITEM(MIXES_2ND_COLUMN, y, offset.word, MIX_OFFSET_MIN, MIX_OFFSET_MAX, attr|LEFT, 0, event);
|
||||
MD_UNION_TO_OFFSET(offset, md2);
|
||||
drawOffsetBar(MIXES_2ND_COLUMN+35, y, md2);
|
||||
break;
|
||||
|
||||
@@ -227,7 +227,7 @@ void menuModelLimits(event_t event)
|
||||
|
||||
#if defined(PPM_LIMITS_SYMETRICAL)
|
||||
case ITEM_LIMITS_SYMETRICAL:
|
||||
lcdDrawChar(LCD_W-FW-MENUS_SCROLLBAR_WIDTH, y, ld->symetrical ? '=' : '\306', attr);
|
||||
lcdDrawChar(LCD_W-FW-MENUS_SCROLLBAR_WIDTH, y, ld->symetrical ? '=' : '\206', attr);
|
||||
if (active) {
|
||||
CHECK_INCDEC_MODELVAR_ZERO(event, ld->symetrical, 1);
|
||||
}
|
||||
|
||||
@@ -124,7 +124,7 @@ void drawGVarValue(coord_t x, coord_t y, uint8_t gvar, gvar_t value, LcdFlags fl
|
||||
|
||||
int16_t editGVarFieldValue(coord_t x, coord_t y, int16_t value, int16_t min, int16_t max, LcdFlags attr, uint8_t editflags, event_t event)
|
||||
{
|
||||
uint16_t delta = GV_GET_GV1_VALUE(max);
|
||||
uint16_t delta = GV_GET_GV1_VALUE(min, max);
|
||||
bool invers = (attr & INVERS);
|
||||
|
||||
// TRACE("editGVarFieldValue(val=%d min=%d max=%d)", value, min, max);
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
include_directories(
|
||||
${RADIO_SRC_DIRECTORY}/gui/colorlcd
|
||||
${RADIO_SRC_DIRECTORY}/gui/colorlcd/layouts
|
||||
${RADIO_SRC_DIRECTORY}/fonts/truetype
|
||||
${RADIO_SRC_DIRECTORY}/thirdparty/libopenui/src
|
||||
${RADIO_SRC_DIR}/gui/colorlcd
|
||||
${RADIO_SRC_DIR}/gui/colorlcd/layouts
|
||||
${CMAKE_CURRENT_BINARY_DIR}/fonts
|
||||
${RADIO_SRC_DIR}/thirdparty/libopenui/src
|
||||
)
|
||||
|
||||
file(GLOB THEMES_SRC RELATIVE ${RADIO_SRC_DIRECTORY}/gui/colorlcd ${RADIO_SRC_DIRECTORY}/gui/colorlcd/themes/*.cpp)
|
||||
file(GLOB LAYOUTS_SRC RELATIVE ${RADIO_SRC_DIRECTORY}/gui/colorlcd ${RADIO_SRC_DIRECTORY}/gui/colorlcd/layouts/*.cpp)
|
||||
file(GLOB WIDGETS_SRC RELATIVE ${RADIO_SRC_DIRECTORY}/gui/colorlcd ${RADIO_SRC_DIRECTORY}/gui/colorlcd/widgets/*.cpp)
|
||||
file(GLOB THEMES_SRC RELATIVE ${RADIO_SRC_DIR}/gui/colorlcd ${RADIO_SRC_DIR}/gui/colorlcd/themes/*.cpp)
|
||||
file(GLOB LAYOUTS_SRC RELATIVE ${RADIO_SRC_DIR}/gui/colorlcd ${RADIO_SRC_DIR}/gui/colorlcd/layouts/*.cpp)
|
||||
file(GLOB WIDGETS_SRC RELATIVE ${RADIO_SRC_DIR}/gui/colorlcd ${RADIO_SRC_DIR}/gui/colorlcd/widgets/*.cpp)
|
||||
|
||||
set(GUI_SRC
|
||||
${GUI_SRC}
|
||||
@@ -86,7 +86,7 @@ set(SRC
|
||||
)
|
||||
|
||||
# includes libopenui
|
||||
include(${RADIO_SRC_DIRECTORY}/thirdparty/libopenui/src/CMakeLists.txt)
|
||||
include(${RADIO_SRC_DIR}/thirdparty/libopenui/src/CMakeLists.txt)
|
||||
include_directories(gui/libopenui)
|
||||
add_definitions(-DLIBOPENUI)
|
||||
foreach(LIBOPENUI_FILE ${LIBOPENUI_SRC})
|
||||
|
||||
@@ -1,83 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) OpenTX
|
||||
*
|
||||
* Based on code named
|
||||
* th9x - http://code.google.com/p/th9x
|
||||
* er9x - http://code.google.com/p/er9x
|
||||
* gruvin9x - http://code.google.com/p/gruvin9x
|
||||
*
|
||||
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
|
||||
*
|
||||
* 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 "choice.h"
|
||||
#include "menu.h"
|
||||
#include "draw_functions.h"
|
||||
#include "strhelpers.h"
|
||||
#include "opentx.h"
|
||||
|
||||
extern const uint8_t LBM_DROPDOWN[];
|
||||
|
||||
CustomCurveChoice::CustomCurveChoice(Window * parent, const rect_t &rect, int16_t vmin, int16_t vmax,
|
||||
std::function<int16_t()> getValue, std::function<void(int16_t)> setValue, LcdFlags flags) :
|
||||
FormField(parent, rect),
|
||||
vmin(vmin),
|
||||
vmax(vmax),
|
||||
getValue(std::move(getValue)),
|
||||
setValue(std::move(setValue)),
|
||||
flags(flags)
|
||||
{
|
||||
}
|
||||
|
||||
void CustomCurveChoice::paint(BitmapBuffer * dc)
|
||||
{
|
||||
bool hasFocus = this->hasFocus();
|
||||
char s[8];
|
||||
int16_t value = getValue();
|
||||
LcdFlags textColor = 0;
|
||||
LcdFlags lineColor = DISABLE_COLOR;
|
||||
if (hasFocus) {
|
||||
textColor = FOCUS_BGCOLOR;
|
||||
lineColor = FOCUS_BGCOLOR;
|
||||
}
|
||||
dc->drawText(3, 2, getCurveString(s, value), flags | textColor);
|
||||
dc->drawSolidRect(0, 0, rect.w, rect.h, 1, lineColor);
|
||||
dc->drawBitmapPattern(rect.w - 14, (rect.h - 5) / 2, LBM_DROPDOWN, lineColor);
|
||||
}
|
||||
|
||||
#if defined(HARDWARE_TOUCH)
|
||||
bool CustomCurveChoice::onTouchEnd(coord_t x, coord_t y)
|
||||
{
|
||||
auto menu = new Menu();
|
||||
auto value = getValue();
|
||||
int count = 0;
|
||||
int current = -1;
|
||||
char s[8];
|
||||
|
||||
for (int i = vmin; i <= vmax; ++i) {
|
||||
menu->addLine(getCurveString(s, i), [=]() {
|
||||
setValue(i);
|
||||
});
|
||||
|
||||
if (value == i) {
|
||||
current = count;
|
||||
}
|
||||
++count;
|
||||
}
|
||||
|
||||
if (current >= 0) {
|
||||
menu->select(current);
|
||||
}
|
||||
|
||||
setFocus();
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
@@ -1,52 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) OpenTX
|
||||
*
|
||||
* Based on code named
|
||||
* th9x - http://code.google.com/p/th9x
|
||||
* er9x - http://code.google.com/p/er9x
|
||||
* gruvin9x - http://code.google.com/p/gruvin9x
|
||||
*
|
||||
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef _CHOICE_H_
|
||||
#define _CHOICE_H_
|
||||
|
||||
#include "form.h"
|
||||
#include <string>
|
||||
|
||||
class CustomCurveChoice : public FormField {
|
||||
public:
|
||||
CustomCurveChoice(Window * parent, const rect_t & rect, int16_t vmin, int16_t vmax, std::function<int16_t()> getValue, std::function<void(int16_t)> setValue, LcdFlags flags = 0);
|
||||
|
||||
#if defined(DEBUG_WINDOWS)
|
||||
std::string getName() override
|
||||
{
|
||||
return "CustomCurveChoice";
|
||||
}
|
||||
#endif
|
||||
|
||||
void paint(BitmapBuffer * dc) override;
|
||||
|
||||
#if defined(HARDWARE_TOUCH)
|
||||
bool onTouchEnd(coord_t x, coord_t y) override;
|
||||
#endif
|
||||
|
||||
protected:
|
||||
int16_t vmin;
|
||||
int16_t vmax;
|
||||
std::function<int16_t()> getValue;
|
||||
std::function<void(int16_t)> setValue;
|
||||
LcdFlags flags;
|
||||
};
|
||||
|
||||
#endif // _CHOICE_H_
|
||||
@@ -186,9 +186,15 @@ void drawGVarValue(BitmapBuffer * dc, coord_t x, coord_t y, uint8_t gvar, gvar_t
|
||||
drawValueWithUnit(dc, x, y, value, g_model.gvars[gvar].unit ? UNIT_PERCENT : UNIT_RAW, flags);
|
||||
}
|
||||
|
||||
void drawValueOrGVar(BitmapBuffer * dc, coord_t x, coord_t y, gvar_t value, LcdFlags flags)
|
||||
void drawValueOrGVar(BitmapBuffer * dc, coord_t x, coord_t y, gvar_t value, gvar_t vmin, gvar_t vmax, LcdFlags flags)
|
||||
{
|
||||
dc->drawNumber(x, y, value, flags, 0, nullptr, "%");
|
||||
if (GV_IS_GV_VALUE(value, vmin, vmax)) {
|
||||
int index = GV_INDEX_CALC_DELTA(value, GV_GET_GV1_VALUE(vmin, vmax));
|
||||
dc->drawText(x, y, getGVarString(index), flags);
|
||||
}
|
||||
else {
|
||||
dc->drawNumber(x, y, value, flags, 0, nullptr, "%");
|
||||
}
|
||||
}
|
||||
|
||||
void drawSleepBitmap()
|
||||
@@ -249,13 +255,13 @@ void drawCurveRef(BitmapBuffer * dc, coord_t x, coord_t y, const CurveRef & curv
|
||||
if (curve.value != 0) {
|
||||
switch (curve.type) {
|
||||
case CURVE_REF_DIFF:
|
||||
dc->drawText(x, y, "D", flags);
|
||||
drawValueOrGVar(dc, lcdNextPos + 1, y + 2, curve.value, LEFT|SMLSIZE|flags);
|
||||
x = dc->drawText(x, y, "D", flags);
|
||||
drawValueOrGVar(dc, x + 1, y + 2, curve.value, -100, 100, LEFT | SMLSIZE | flags);
|
||||
break;
|
||||
|
||||
case CURVE_REF_EXPO:
|
||||
dc->drawText(x, y, "E", flags);
|
||||
drawValueOrGVar(dc, lcdNextPos + 1, y + 2, curve.value, LEFT|SMLSIZE|flags);
|
||||
x = dc->drawText(x, y, "E", flags);
|
||||
drawValueOrGVar(dc, x + 1, y + 2, curve.value, -100, 100, LEFT | SMLSIZE | flags);
|
||||
break;
|
||||
|
||||
case CURVE_REF_FUNC:
|
||||
@@ -494,11 +500,11 @@ void drawSourceCustomValue(BitmapBuffer * dc, coord_t x, coord_t y, source_t sou
|
||||
#if defined(INTERNAL_GPS)
|
||||
else if (source == MIXSRC_TX_GPS) {
|
||||
if (gpsData.fix) {
|
||||
drawGPSPosition(x, y, gpsData.longitude, gpsData.latitude, flags);
|
||||
drawGPSPosition(dc, x, y, gpsData.longitude, gpsData.latitude, flags);
|
||||
}
|
||||
else {
|
||||
lcdDrawText(x, y, "sats: ", flags);
|
||||
dc->drawNumber(lcdNextPos, y, gpsData.numSat, flags);
|
||||
x = dc->drawText(x, y, "sats: ", flags);
|
||||
dc->drawNumber(x, y, gpsData.numSat, flags);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -534,10 +540,9 @@ void drawValueWithUnit(BitmapBuffer * dc, coord_t x, coord_t y, int val, uint8_t
|
||||
|
||||
void drawHexNumber(BitmapBuffer * dc, coord_t x, coord_t y, uint32_t val, LcdFlags flags)
|
||||
{
|
||||
for (int i=12; i>=0; i-=4) {
|
||||
char c = (val >> i) & 0xf;
|
||||
c = c>9 ? c+'A'-10 : c+'0';
|
||||
dc->drawSizedText(x, y, &c, 1, flags);
|
||||
x = lcdNextPos;
|
||||
for (int i = 12; i >= 0; i -= 4) {
|
||||
char c = (val >> i) & 0x0F;
|
||||
c += (c >= 10 ? 'A' - 10 : '0');
|
||||
x = dc->drawSizedText(x, y, &c, 1, flags);
|
||||
}
|
||||
}
|
||||
@@ -62,10 +62,11 @@ void drawVerticalTrimPosition(BitmapBuffer * dc, coord_t x, coord_t y, int16_t d
|
||||
void drawVerticalSlider(BitmapBuffer * dc, coord_t x, coord_t y, int len, int val, int min, int max, uint8_t steps, uint32_t options);
|
||||
void drawHorizontalSlider(BitmapBuffer * dc, coord_t x, coord_t y, int len, int val, int min, int max, uint8_t steps, uint32_t options);
|
||||
void drawSlider(coord_t x, coord_t y, int len, int val, int min, int max, uint8_t steps, uint32_t options);
|
||||
void drawValueOrGVar(BitmapBuffer * dc, coord_t x, coord_t y, gvar_t gvar, LcdFlags flags = 0);
|
||||
void drawValueOrGVar(BitmapBuffer * dc, coord_t x, coord_t y, gvar_t value, gvar_t vmin, gvar_t vmax, LcdFlags flags = 0);
|
||||
void drawGVarValue(BitmapBuffer * dc, coord_t x, coord_t y, uint8_t gvar, gvar_t value, LcdFlags flags = 0);
|
||||
void drawSourceCustomValue(BitmapBuffer * dc, coord_t x, coord_t y, source_t source, int32_t value, LcdFlags flags);
|
||||
void drawSensorCustomValue(BitmapBuffer * dc, coord_t x, coord_t y, uint8_t sensor, int32_t value, LcdFlags flags=0);
|
||||
void drawSensorCustomValue(BitmapBuffer * dc, coord_t x, coord_t y, uint8_t sensor, int32_t value, LcdFlags flags = 0);
|
||||
void drawGPSPosition(BitmapBuffer * dc, coord_t x, coord_t y, int32_t longitude, int32_t latitude, LcdFlags flags = 0);
|
||||
void drawDate(BitmapBuffer * dc, coord_t x, coord_t y, TelemetryItem & telemetryItem, LcdFlags flags = 0);
|
||||
void drawValueWithUnit(BitmapBuffer * dc, coord_t x, coord_t y, int val, uint8_t unit, LcdFlags flags = 0);
|
||||
void drawHexNumber(BitmapBuffer * dc, coord_t x, coord_t y, uint32_t val, LcdFlags flags = 0);
|
||||
|
||||
@@ -33,8 +33,8 @@ const uint8_t __alpha_button_off[] {
|
||||
Bitmap ALPHA_BUTTON_OFF(BMP_ARGB4444, (const uint16_t*)__alpha_button_off);
|
||||
|
||||
|
||||
FabButton::FabButton(Window * parent, coord_t x, coord_t y, uint8_t icon, std::function<uint8_t(void)> pressHandler, uint8_t flags):
|
||||
Button(parent, { x - 34, y - 34, 68, 68 }, pressHandler, flags),
|
||||
FabButton::FabButton(FormGroup * parent, coord_t x, coord_t y, uint8_t icon, std::function<uint8_t(void)> pressHandler, WindowFlags windowFlags):
|
||||
Button(parent, { x - 34, y - 34, 68, 68 }, pressHandler, windowFlags),
|
||||
icon(icon)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
class FabButton: public Button {
|
||||
public:
|
||||
FabButton(Window * parent, coord_t x, coord_t y, uint8_t icon, std::function<uint8_t(void)> pressHandler, uint8_t flags=0);
|
||||
FabButton(FormGroup * parent, coord_t x, coord_t y, uint8_t icon, std::function<uint8_t(void)> pressHandler, WindowFlags windowFlags = 0);
|
||||
|
||||
#if defined(DEBUG_WINDOWS)
|
||||
std::string getName() override
|
||||
|
||||
@@ -0,0 +1,119 @@
|
||||
/*
|
||||
* Copyright (C) OpenTX
|
||||
*
|
||||
* Source:
|
||||
* https://github.com/opentx/libopenui
|
||||
*
|
||||
* This file is a part of libopenui library.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library 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
|
||||
* Lesser General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef _GVAR_NUMBEREDIT_H_
|
||||
#define _GVAR_NUMBEREDIT_H_
|
||||
|
||||
#include "form.h"
|
||||
#include "numberedit.h"
|
||||
#include "gvars.h"
|
||||
|
||||
constexpr coord_t GVAR_BUTTON_WIDTH = 30;
|
||||
|
||||
#if !defined(GVARS)
|
||||
typedef NumberEdit GVarNumberEdit;
|
||||
#else
|
||||
class GVarNumberEdit: public FormGroup
|
||||
{
|
||||
public:
|
||||
GVarNumberEdit(FormGroup * parent, const rect_t & rect, int32_t vmin, int32_t vmax, std::function<int32_t()> getValue, std::function<void(int32_t)> setValue) :
|
||||
FormGroup(parent, rect, FORWARD_SCROLL | FORM_FORWARD_FOCUS),
|
||||
vmin(vmin),
|
||||
vmax(vmax),
|
||||
getValue(getValue),
|
||||
setValue(setValue)
|
||||
{
|
||||
update();
|
||||
}
|
||||
|
||||
void switchGVarMode()
|
||||
{
|
||||
int32_t value = getValue();
|
||||
setValue(GV_IS_GV_VALUE(value, vmin, vmax) ? GET_GVAR(value, vmin, vmax, mixerCurrentFlightMode) : GV_GET_GV1_VALUE(vmin, vmax));
|
||||
update();
|
||||
}
|
||||
|
||||
void setSuffix(std::string value)
|
||||
{
|
||||
suffix = std::move(value);
|
||||
update();
|
||||
}
|
||||
|
||||
#if defined(HARDWARE_KEYS)
|
||||
void onEvent(event_t event) override
|
||||
{
|
||||
if (event == EVT_KEY_LONG(KEY_ENTER)) {
|
||||
killEvents(event);
|
||||
switchGVarMode();
|
||||
field->setFocus();
|
||||
}
|
||||
else {
|
||||
FormGroup::onEvent(event);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
protected:
|
||||
FormField * field = nullptr;
|
||||
int32_t vmin;
|
||||
int32_t vmax;
|
||||
std::function<int32_t()> getValue;
|
||||
std::function<void(int32_t)> setValue;
|
||||
std::string suffix;
|
||||
|
||||
void update()
|
||||
{
|
||||
clear();
|
||||
|
||||
// The main field
|
||||
int32_t value = getValue();
|
||||
if (GV_IS_GV_VALUE(value, vmin, vmax)) {
|
||||
auto result = new Choice(this, {0, 0, width() - GVAR_BUTTON_WIDTH, height()}, nullptr, -MAX_GVARS, MAX_GVARS - 1,
|
||||
[=]() {
|
||||
uint16_t gvar1 = GV_GET_GV1_VALUE(vmin, vmax);
|
||||
return GV_INDEX_CALC_DELTA(getValue(), gvar1);
|
||||
},
|
||||
[=](int idx) {
|
||||
uint16_t gvar1 = GV_GET_GV1_VALUE(vmin, vmax);
|
||||
if (idx < 0)
|
||||
setValue(GV_CALC_VALUE_IDX_NEG(idx, gvar1));
|
||||
else
|
||||
setValue(GV_CALC_VALUE_IDX_POS(idx, gvar1));
|
||||
});
|
||||
result->setTextHandler([=](int32_t value) {
|
||||
return getGVarString(value);
|
||||
});
|
||||
field = result;
|
||||
}
|
||||
else {
|
||||
auto result = new NumberEdit(this, {0, 0, width() - GVAR_BUTTON_WIDTH, height()}, vmin, vmax, getValue, setValue);
|
||||
result->setSuffix(suffix);
|
||||
field = result;
|
||||
}
|
||||
|
||||
// The GVAR button
|
||||
new TextButton(this, {width() - GVAR_BUTTON_WIDTH, 0, GVAR_BUTTON_WIDTH, height()}, STR_GV, [=]() {
|
||||
switchGVarMode();
|
||||
return 0;
|
||||
}, BUTTON_BACKGROUND | FORM_DETACHED);
|
||||
}
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif // _GVAR_NUMBEREDIT_H_
|
||||
@@ -40,14 +40,14 @@ class CurveEditWindow : public Page {
|
||||
|
||||
void buildHeader(Window * window)
|
||||
{
|
||||
new StaticText(window, {PAGE_TITLE_LEFT, PAGE_TITLE_TOP, LCD_W - PAGE_TITLE_LEFT, PAGE_LINE_HEIGHT}, STR_MENUCURVE, MENU_COLOR);
|
||||
new StaticText(window, {PAGE_TITLE_LEFT, PAGE_TITLE_TOP, LCD_W - PAGE_TITLE_LEFT, PAGE_LINE_HEIGHT}, STR_MENUCURVE, 0, MENU_COLOR);
|
||||
char s[16];
|
||||
strAppendStringWithIndex(s, STR_CV, index + 1);
|
||||
new StaticText(window, {PAGE_TITLE_LEFT, PAGE_TITLE_TOP + PAGE_LINE_HEIGHT, LCD_W - PAGE_TITLE_LEFT, PAGE_LINE_HEIGHT}, s, MENU_COLOR);
|
||||
new StaticText(window, {PAGE_TITLE_LEFT, PAGE_TITLE_TOP + PAGE_LINE_HEIGHT, LCD_W - PAGE_TITLE_LEFT, PAGE_LINE_HEIGHT}, s, 0, MENU_COLOR);
|
||||
}
|
||||
|
||||
#if LCD_W > LCD_H
|
||||
void buildBody(Window * window)
|
||||
void buildBody(FormWindow * window)
|
||||
{
|
||||
coord_t curveWidth = window->height() - 2 * PAGE_PADDING;
|
||||
|
||||
@@ -125,7 +125,7 @@ class CurveEditWindow : public Page {
|
||||
grid.nextLine();
|
||||
}
|
||||
#else
|
||||
void buildBody(Window * window)
|
||||
void buildBody(FormWindow * window)
|
||||
{
|
||||
FormGridLayout grid;
|
||||
grid.setMarginLeft(20);
|
||||
@@ -204,7 +204,7 @@ class CurveEditWindow : public Page {
|
||||
|
||||
class CurveButton : public Button {
|
||||
public:
|
||||
CurveButton(Window * parent, const rect_t &rect, uint8_t index) :
|
||||
CurveButton(FormGroup * parent, const rect_t &rect, uint8_t index) :
|
||||
Button(parent, rect),
|
||||
index(index)
|
||||
{
|
||||
@@ -269,7 +269,7 @@ void ModelCurvesPage::build(FormWindow * window, int8_t focusIndex)
|
||||
|
||||
if (isCurveUsed(index)) {
|
||||
// Curve label
|
||||
new StaticText(window, grid.getLabelSlot(), getCurveString(1 + index), BUTTON_BACKGROUND | CENTERED);
|
||||
new StaticText(window, grid.getLabelSlot(), getCurveString(1 + index), BUTTON_BACKGROUND, CENTERED);
|
||||
|
||||
// Curve drawing
|
||||
Button * button = new CurveButton(window, grid.getFieldSlot(), index);
|
||||
@@ -326,6 +326,5 @@ void ModelCurvesPage::build(FormWindow * window, int8_t focusIndex)
|
||||
}
|
||||
}
|
||||
|
||||
window->setLastField();
|
||||
window->setInnerHeight(grid.getWindowHeight());
|
||||
}
|
||||
|
||||
@@ -71,9 +71,6 @@ void ModelFlightModesPage::build(FormWindow * window)
|
||||
|
||||
for (int i = 0; i < MAX_FLIGHT_MODES; i++) {
|
||||
auto group = new FlightModeGroup(window, i, { 2, y, LCD_W - 10, 0 });
|
||||
if (i == 0) {
|
||||
window->setFirstField(group);
|
||||
}
|
||||
|
||||
FormGridLayout grid;
|
||||
grid.setMarginRight(15);
|
||||
@@ -87,8 +84,7 @@ void ModelFlightModesPage::build(FormWindow * window)
|
||||
|
||||
// Flight mode name
|
||||
new StaticText(group, grid.getLabelSlot(true), STR_NAME);
|
||||
auto nameEdit = new TextEdit(group, grid.getFieldSlot(), g_model.flightModeData[i].name, LEN_FLIGHT_MODE_NAME);
|
||||
group->setFirstField(nameEdit);
|
||||
new TextEdit(group, grid.getFieldSlot(), g_model.flightModeData[i].name, LEN_FLIGHT_MODE_NAME);
|
||||
grid.nextLine();
|
||||
|
||||
// Flight mode switch
|
||||
@@ -121,29 +117,26 @@ void ModelFlightModesPage::build(FormWindow * window)
|
||||
"+7"
|
||||
"=8"
|
||||
"+8";
|
||||
for (int t=0; t<NUM_TRIMS; t++) {
|
||||
for (int t = 0; t < NUM_TRIMS; t++) {
|
||||
// TODO isTrimModeAvailable to avoid +{{CURRENT}}
|
||||
new Choice(group, grid.getFieldSlot(NUM_TRIMS, t), STR_VTRIMS_MODES, -1, 2*MAX_FLIGHT_MODES-1,
|
||||
GET_DEFAULT(g_model.flightModeData[i].trim[t].mode==TRIM_MODE_NONE ? -1 : g_model.flightModeData[i].trim[t].mode),
|
||||
SET_DEFAULT(g_model.flightModeData[i].trim[t].mode),
|
||||
STDSIZE);
|
||||
SET_DEFAULT(g_model.flightModeData[i].trim[t].mode));
|
||||
}
|
||||
grid.nextLine();
|
||||
|
||||
// Flight mode fade in / out
|
||||
new StaticText(group, grid.getLabelSlot(true), "Fade in/out");
|
||||
auto edit = new NumberEdit(group, grid.getFieldSlot(2, 0), 0, DELAY_MAX,
|
||||
new NumberEdit(group, grid.getFieldSlot(2, 0), 0, DELAY_MAX,
|
||||
GET_DEFAULT(g_model.flightModeData[i].fadeIn),
|
||||
SET_VALUE(g_model.flightModeData[i].fadeIn, newValue),
|
||||
PREC1);
|
||||
edit = new NumberEdit(group, grid.getFieldSlot(2, 1), 0, DELAY_MAX,
|
||||
new NumberEdit(group, grid.getFieldSlot(2, 1), 0, DELAY_MAX,
|
||||
GET_DEFAULT(g_model.flightModeData[i].fadeOut),
|
||||
SET_VALUE(g_model.flightModeData[i].fadeOut, newValue),
|
||||
PREC1);
|
||||
grid.nextLine();
|
||||
|
||||
group->setLastField(FormField::getCurrentField());
|
||||
|
||||
grid.spacer();
|
||||
coord_t height = grid.getWindowHeight();
|
||||
group->setHeight(height);
|
||||
@@ -154,7 +147,7 @@ void ModelFlightModesPage::build(FormWindow * window)
|
||||
sprintf(label, "Check FM Trims");
|
||||
// TODO rather use a centered slot?
|
||||
// TODO dynamic text with FM index for the button text
|
||||
auto button = new TextButton(window, { 60, y + 5, LCD_W - 120, PAGE_LINE_HEIGHT }, label,
|
||||
new TextButton(window, { 60, y + 5, LCD_W - 120, PAGE_LINE_HEIGHT }, label,
|
||||
[&]() -> uint8_t {
|
||||
if (trimsCheckTimer)
|
||||
trimsCheckTimer = 0;
|
||||
@@ -164,5 +157,4 @@ void ModelFlightModesPage::build(FormWindow * window)
|
||||
});
|
||||
|
||||
window->setInnerHeight(y + 40);
|
||||
window->setLastField(button);
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
#define TEXT_LEFT_MARGIN 2
|
||||
#define GVAR_NAME_SIZE 50
|
||||
|
||||
GVarButton::GVarButton(Window * parent, const rect_t &rect, uint8_t gvar) :
|
||||
GVarButton::GVarButton(FormGroup * parent, const rect_t &rect, uint8_t gvar) :
|
||||
Button(parent, rect),
|
||||
gvarIdx(gvar)
|
||||
{
|
||||
@@ -56,6 +56,7 @@ void GVarButton::checkEvents()
|
||||
void GVarButton::paint(BitmapBuffer * dc)
|
||||
{
|
||||
GVarData * gvar = &g_model.gvars[gvarIdx];
|
||||
|
||||
// The bounding rect
|
||||
int nameRectW = TEXT_LEFT_MARGIN + GVAR_NAME_SIZE;
|
||||
coord_t x = TEXT_LEFT_MARGIN;
|
||||
@@ -115,7 +116,7 @@ void GVarButton::paint(BitmapBuffer * dc)
|
||||
}
|
||||
}
|
||||
|
||||
dc->drawSolidRect(0, 0, rect.w, rect.h, 2, hasFocus() ? SCROLLBOX_COLOR : CURVE_AXIS_COLOR);
|
||||
dc->drawSolidRect(0, 0, rect.w, rect.h, 2, hasFocus() ? FOCUS_BGCOLOR : DISABLE_COLOR);
|
||||
}
|
||||
|
||||
void GVarButton::drawFlightMode(BitmapBuffer * dc, coord_t x, coord_t y, int fm, LcdFlags attr)
|
||||
@@ -164,11 +165,9 @@ bool GVarRenderer::isUpdated()
|
||||
return true;
|
||||
}
|
||||
|
||||
const std::string GVarEditWindow::unitPercent = "%";
|
||||
|
||||
void GVarEditWindow::buildHeader(Window * window)
|
||||
{
|
||||
new StaticText(window, {PAGE_TITLE_LEFT, PAGE_TITLE_TOP, LCD_W - PAGE_TITLE_LEFT, PAGE_LINE_HEIGHT}, STR_GLOBAL_VAR, MENU_COLOR);
|
||||
new StaticText(window, {PAGE_TITLE_LEFT, PAGE_TITLE_TOP, LCD_W - PAGE_TITLE_LEFT, PAGE_LINE_HEIGHT}, STR_GLOBAL_VAR, 0, MENU_COLOR);
|
||||
gVarInHeader = new GVarRenderer(window, {PAGE_TITLE_LEFT, PAGE_TITLE_TOP + PAGE_LINE_HEIGHT, LCD_W - PAGE_TITLE_LEFT, PAGE_LINE_HEIGHT}, index);
|
||||
}
|
||||
|
||||
@@ -176,9 +175,8 @@ void GVarEditWindow::checkEvents()
|
||||
{
|
||||
Page::checkEvents();
|
||||
if (gVarInHeader && gVarInHeader->isUpdated()) {
|
||||
for (int fm = 0; fm < MAX_FLIGHT_MODES; fm++) {
|
||||
if (!values[fm]) continue;
|
||||
values[fm]->invalidate();
|
||||
for (auto & value : values) {
|
||||
value->invalidate();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -188,9 +186,9 @@ void GVarEditWindow::setProperties(int onlyForFlightMode)
|
||||
GVarData * gvar = &g_model.gvars[index];
|
||||
int32_t minValue = GVAR_MIN + gvar->min;
|
||||
int32_t maxValue = GVAR_MAX - gvar->max;
|
||||
std::string suffix;
|
||||
LcdFlags prec = gvar->prec ? PREC1 : 0;
|
||||
if (gvar->unit) suffix = GVarEditWindow::unitPercent;
|
||||
const char * suffix = gvar->unit ? "%" : "";
|
||||
|
||||
// TODO needed? LcdFlags prec = gvar->prec ? PREC1 : 0;
|
||||
if (min && max) {
|
||||
min->setMax(maxValue);
|
||||
max->setMin(minValue);
|
||||
@@ -208,8 +206,6 @@ void GVarEditWindow::setProperties(int onlyForFlightMode)
|
||||
for (int fm = 0; fm < MAX_FLIGHT_MODES; fm++) {
|
||||
if (onlyForFlightMode >= 0 && fm != onlyForFlightMode)
|
||||
continue;
|
||||
if (!values[fm])
|
||||
continue;
|
||||
fmData = &g_model.flightModeData[fm];
|
||||
|
||||
// custom value
|
||||
@@ -232,7 +228,7 @@ void GVarEditWindow::setProperties(int onlyForFlightMode)
|
||||
}
|
||||
|
||||
values[fm]->setSuffix(suffix);
|
||||
//TODO values[fm]->setLcdFlags(prec);
|
||||
// TODO values[fm]->setLcdFlags(prec);
|
||||
values[fm]->invalidate();
|
||||
}
|
||||
if (gVarInHeader) gVarInHeader->invalidate();
|
||||
@@ -309,20 +305,19 @@ void GVarEditWindow::buildBody(FormWindow * window)
|
||||
if (flightMode > 0) {
|
||||
auto cb = new CheckBox(window, grid.getFieldSlot(2, 0),
|
||||
[=] { return fmData->gvars[index] <= GVAR_MAX; }, [=](uint8_t checked) {
|
||||
if (!values[flightMode])
|
||||
return;
|
||||
fmData->gvars[index] = checked ? 0 : GVAR_MAX + 1;
|
||||
setProperties(flightMode);
|
||||
});
|
||||
cb->setLabel(STR_OWN);
|
||||
}
|
||||
|
||||
values[flightMode] = new NumberEdit(window, grid.getFieldSlot(2, 1), GVAR_MIN + gvar->min, GVAR_MAX + MAX_FLIGHT_MODES - 1,
|
||||
GET_SET_DEFAULT(fmData->gvars[index]));
|
||||
grid.nextLine();
|
||||
}
|
||||
|
||||
setProperties();
|
||||
window->setLastField();
|
||||
|
||||
window->setInnerHeight(grid.getWindowHeight());
|
||||
}
|
||||
|
||||
@@ -337,8 +332,9 @@ void ModelGVarsPage::rebuild(FormWindow * window)
|
||||
void ModelGVarsPage::build(FormWindow * window)
|
||||
{
|
||||
FormGridLayout grid;
|
||||
grid.spacer(8);
|
||||
grid.spacer(PAGE_PADDING);
|
||||
grid.setLabelWidth(70);
|
||||
|
||||
for (uint8_t index = 0; index < MAX_GVARS; index++) {
|
||||
Button * button = new GVarButton(window, grid.getLineSlot(), index);
|
||||
button->setPressHandler([=]() -> uint8_t {
|
||||
@@ -350,13 +346,14 @@ void ModelGVarsPage::build(FormWindow * window)
|
||||
});
|
||||
});
|
||||
menu->addLine(STR_CLEAR, [=]() {
|
||||
for (int i = 0; i < MAX_FLIGHT_MODES; i++) {
|
||||
g_model.flightModeData[i].gvars[index] = 0;
|
||||
for (auto & flightMode : g_model.flightModeData) {
|
||||
flightMode.gvars[index] = 0;
|
||||
}
|
||||
storageDirty(EE_MODEL);
|
||||
});
|
||||
return 0;
|
||||
});
|
||||
|
||||
grid.nextLine(button->getHeight());
|
||||
}
|
||||
window->setInnerHeight(grid.getWindowHeight());
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
|
||||
class GVarButton : public Button {
|
||||
public:
|
||||
GVarButton(Window * parent, const rect_t & rect, uint8_t gvar);
|
||||
GVarButton(FormGroup * parent, const rect_t & rect, uint8_t gvar);
|
||||
void checkEvents() override;
|
||||
void paint(BitmapBuffer * dc) override;
|
||||
|
||||
@@ -72,27 +72,24 @@ class GVarEditWindow : public Page {
|
||||
Page(ICON_MODEL_GVARS),
|
||||
index(gvarIndex)
|
||||
{
|
||||
values = new NumberEdit*[MAX_FLIGHT_MODES];
|
||||
buildHeader(&header);
|
||||
buildBody(&body);
|
||||
}
|
||||
|
||||
~GVarEditWindow()
|
||||
~GVarEditWindow() override
|
||||
{
|
||||
delete[] values;
|
||||
}
|
||||
|
||||
void checkEvents() override;
|
||||
|
||||
protected:
|
||||
uint8_t index;
|
||||
NumberEdit * min = nullptr;
|
||||
NumberEdit * max = nullptr;
|
||||
NumberEdit * values[MAX_FLIGHT_MODES] = {};
|
||||
GVarRenderer * gVarInHeader;
|
||||
void buildHeader(Window * window);
|
||||
void buildBody(FormWindow * window);
|
||||
void setProperties(int onlyForFlightMode = -1);
|
||||
NumberEdit* min;
|
||||
NumberEdit* max;
|
||||
NumberEdit** values;
|
||||
GVarRenderer * gVarInHeader;
|
||||
static const std::string unitPercent;
|
||||
};
|
||||
#endif
|
||||
@@ -36,7 +36,7 @@ void ModelHeliPage::build(FormWindow * window)
|
||||
|
||||
// Swash type
|
||||
new StaticText(window, grid.getLabelSlot(), STR_SWASHTYPE);
|
||||
auto first = new Choice(window, grid.getFieldSlot(), STR_VSWASHTYPE, 0, SWASH_TYPE_MAX, GET_SET_DEFAULT(g_model.swashR.type));
|
||||
new Choice(window, grid.getFieldSlot(), STR_VSWASHTYPE, 0, SWASH_TYPE_MAX, GET_SET_DEFAULT(g_model.swashR.type));
|
||||
grid.nextLine();
|
||||
|
||||
// Swash ring
|
||||
@@ -71,8 +71,7 @@ void ModelHeliPage::build(FormWindow * window)
|
||||
|
||||
// Collective weight
|
||||
new StaticText(window, grid.getLabelSlot(), STR_WEIGHT);
|
||||
auto last = new NumberEdit(window, grid.getFieldSlot(), -100, 100, GET_SET_DEFAULT(g_model.swashR.collectiveWeight));
|
||||
FormField::link(last, first);
|
||||
new NumberEdit(window, grid.getFieldSlot(), -100, 100, GET_SET_DEFAULT(g_model.swashR.collectiveWeight));
|
||||
|
||||
grid.nextLine();
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
|
||||
#include "model_inputs.h"
|
||||
#include "opentx.h"
|
||||
#include "gvar_numberedit.h"
|
||||
|
||||
#define SET_DIRTY() storageDirty(EE_MODEL)
|
||||
|
||||
@@ -95,7 +96,7 @@ class InputEditWindow: public Page {
|
||||
Page(ICON_MODEL_INPUTS),
|
||||
input(input),
|
||||
index(index),
|
||||
preview(this, {LCD_W - 158, 0, 158, 158},
|
||||
preview(this, {INPUT_EDIT_CURVE_LEFT, INPUT_EDIT_CURVE_TOP, INPUT_EDIT_CURVE_WIDTH, INPUT_EDIT_CURVE_HEIGHT},
|
||||
[=](int x) -> int {
|
||||
ExpoData * line = expoAddress(index);
|
||||
int16_t anas[MAX_INPUTS] = {0};
|
||||
@@ -106,6 +107,11 @@ class InputEditWindow: public Page {
|
||||
return getValue(expoAddress(index)->srcRaw);
|
||||
})
|
||||
{
|
||||
#if LCD_W > LCD_H
|
||||
body.setWidth(LCD_W - 170);
|
||||
#else
|
||||
body.setRect({0, INPUT_EDIT_CURVE_TOP + INPUT_EDIT_CURVE_HEIGHT, LCD_W, LCD_H - INPUT_EDIT_CURVE_TOP - INPUT_EDIT_CURVE_HEIGHT});
|
||||
#endif
|
||||
buildBody(&body);
|
||||
buildHeader(&header);
|
||||
}
|
||||
@@ -115,68 +121,60 @@ class InputEditWindow: public Page {
|
||||
uint8_t index;
|
||||
Curve preview;
|
||||
Choice * trimChoice = nullptr;
|
||||
Window * updateCurvesWindow = nullptr;
|
||||
Choice * curveTypeChoice = nullptr;
|
||||
FormGroup * curveParamField = nullptr;
|
||||
|
||||
void buildHeader(Window * window) {
|
||||
new StaticText(window, {PAGE_TITLE_LEFT, PAGE_TITLE_TOP, LCD_W - PAGE_TITLE_LEFT, PAGE_LINE_HEIGHT}, STR_MENUINPUTS, MENU_COLOR);
|
||||
new StaticText(window, {PAGE_TITLE_LEFT, PAGE_TITLE_TOP + PAGE_LINE_HEIGHT, LCD_W - PAGE_TITLE_LEFT, PAGE_LINE_HEIGHT}, getSourceString(MIXSRC_FIRST_INPUT + input), MENU_COLOR);
|
||||
void buildHeader(Window * window)
|
||||
{
|
||||
new StaticText(window, {PAGE_TITLE_LEFT, PAGE_TITLE_TOP, LCD_W - PAGE_TITLE_LEFT, PAGE_LINE_HEIGHT}, STR_MENUINPUTS, 0, MENU_COLOR);
|
||||
new StaticText(window, {PAGE_TITLE_LEFT, PAGE_TITLE_TOP + PAGE_LINE_HEIGHT, LCD_W - PAGE_TITLE_LEFT, PAGE_LINE_HEIGHT}, getSourceString(MIXSRC_FIRST_INPUT + input), 0, MENU_COLOR);
|
||||
}
|
||||
|
||||
void updateCurves() {
|
||||
FormGridLayout grid;
|
||||
grid.setLabelWidth(INPUT_EDIT_LABELS_WIDTH);
|
||||
// TODO share this code with MIXER
|
||||
void updateCurveParamField(ExpoData * line)
|
||||
{
|
||||
curveParamField->clear();
|
||||
|
||||
updateCurvesWindow->clear();
|
||||
|
||||
ExpoData * line = expoAddress(index) ;
|
||||
|
||||
new StaticText(updateCurvesWindow, grid.getLabelSlot(), STR_CURVE);
|
||||
curveTypeChoice = new Choice(updateCurvesWindow, grid.getFieldSlot(2, 0), "\004DiffExpoFuncCstm", 0, CURVE_REF_CUSTOM,
|
||||
GET_DEFAULT(line->curve.type),
|
||||
[=](int32_t newValue) {
|
||||
line->curve.type = newValue;
|
||||
line->curve.value = 0;
|
||||
SET_DIRTY();
|
||||
updateCurves();
|
||||
curveTypeChoice->setFocus();
|
||||
});
|
||||
const rect_t rect = {0, 0, curveParamField->width(), curveParamField->height()};
|
||||
|
||||
switch (line->curve.type) {
|
||||
case CURVE_REF_DIFF:
|
||||
case CURVE_REF_EXPO: {
|
||||
// TODO GVAR
|
||||
NumberEdit * edit = new NumberEdit(updateCurvesWindow, grid.getFieldSlot(2, 1), -100, 100,
|
||||
GET_SET_DEFAULT(line->curve.value));
|
||||
case CURVE_REF_EXPO:
|
||||
{
|
||||
GVarNumberEdit * edit = new GVarNumberEdit(curveParamField, rect, -100, 100, GET_SET_DEFAULT(line->curve.value));
|
||||
edit->setSuffix("%");
|
||||
break;
|
||||
}
|
||||
|
||||
case CURVE_REF_FUNC:
|
||||
new Choice(updateCurvesWindow, grid.getFieldSlot(2, 1), STR_VCURVEFUNC, 0, CURVE_BASE-1, GET_SET_DEFAULT(line->curve.value));
|
||||
new Choice(curveParamField, rect, STR_VCURVEFUNC, 0, CURVE_BASE - 1, GET_SET_DEFAULT(line->curve.value));
|
||||
break;
|
||||
|
||||
case CURVE_REF_CUSTOM:
|
||||
#warning "TODO Custom Curve Choice"
|
||||
// new CustomCurveChoice(updateCurvesWindow, grid.getFieldSlot(2, 1), -MAX_CURVES, MAX_CURVES, GET_SET_DEFAULT(line->curve.value));
|
||||
{
|
||||
auto choice = new Choice(curveParamField, rect, nullptr, -MAX_CURVES, MAX_CURVES, GET_SET_DEFAULT(line->curve.value));
|
||||
choice->setTextHandler([](int value) {
|
||||
return getCurveString(value);
|
||||
});
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void buildBody(FormWindow * window)
|
||||
{
|
||||
NumberEdit * edit;
|
||||
|
||||
FormGridLayout grid;
|
||||
grid.setLabelWidth(INPUT_EDIT_LABELS_WIDTH);
|
||||
grid.spacer(PAGE_PADDING);
|
||||
|
||||
ExpoData * line = expoAddress(index) ;
|
||||
|
||||
grid.setMarginRight(163);
|
||||
#if LCD_W > LCD_H
|
||||
grid.setMarginRight(180);
|
||||
#endif
|
||||
|
||||
// Input Name
|
||||
new StaticText(window, grid.getLabelSlot(), STR_INPUTNAME);
|
||||
auto name = new TextEdit(window, grid.getFieldSlot(), g_model.inputNames[line->chn], sizeof(g_model.inputNames[line->chn]));
|
||||
window->setFirstField(name);
|
||||
new TextEdit(window, grid.getFieldSlot(), g_model.inputNames[line->chn], sizeof(g_model.inputNames[line->chn]));
|
||||
grid.nextLine();
|
||||
|
||||
// Switch
|
||||
@@ -196,10 +194,6 @@ class InputEditWindow: public Page {
|
||||
});
|
||||
grid.nextLine();
|
||||
|
||||
#if LCD_H > LCD_W
|
||||
grid.setMarginRight(10);
|
||||
#endif
|
||||
|
||||
// Name
|
||||
new StaticText(window, grid.getLabelSlot(), STR_EXPONAME);
|
||||
new TextEdit(window, grid.getFieldSlot(), line->name, sizeof(line->name));
|
||||
@@ -232,15 +226,14 @@ class InputEditWindow: public Page {
|
||||
|
||||
// Weight
|
||||
new StaticText(window, grid.getLabelSlot(), STR_WEIGHT);
|
||||
// TODO GVAR ?
|
||||
edit = new NumberEdit(window, grid.getFieldSlot(), -100, 100, GET_SET_DEFAULT(line->weight));
|
||||
edit->setSuffix("%");
|
||||
auto gvar = new GVarNumberEdit(window, grid.getFieldSlot(), -100, 100, GET_SET_DEFAULT(line->weight));
|
||||
gvar->setSuffix("%");
|
||||
grid.nextLine();
|
||||
|
||||
// Offset
|
||||
new StaticText(window, grid.getLabelSlot(), STR_OFFSET);
|
||||
edit = new NumberEdit(window, grid.getFieldSlot(), -100, 100, GET_SET_DEFAULT(line->offset));
|
||||
edit->setSuffix("%");
|
||||
gvar = new GVarNumberEdit(window, grid.getFieldSlot(), -100, 100, GET_SET_DEFAULT(line->offset));
|
||||
gvar->setSuffix("%");
|
||||
grid.nextLine();
|
||||
|
||||
// Trim
|
||||
@@ -253,21 +246,27 @@ class InputEditWindow: public Page {
|
||||
});
|
||||
grid.nextLine();
|
||||
|
||||
// grid.setMarginRight(10);
|
||||
|
||||
// Curve
|
||||
updateCurvesWindow = new Window(window, { 0, grid.getWindowHeight(), LCD_W - 162, 0 });
|
||||
updateCurves();
|
||||
grid.addWindow(updateCurvesWindow);
|
||||
new StaticText(&body, grid.getLabelSlot(), STR_CURVE);
|
||||
new Choice(&body, grid.getFieldSlot(2, 0), "\004DiffExpoFuncCstm", 0, CURVE_REF_CUSTOM,
|
||||
GET_DEFAULT(line->curve.type),
|
||||
[=](int32_t newValue) {
|
||||
line->curve.type = newValue;
|
||||
line->curve.value = 0;
|
||||
SET_DIRTY();
|
||||
updateCurveParamField(line);
|
||||
});
|
||||
curveParamField = new FormGroup(&body, grid.getFieldSlot(2, 1), FORM_FORWARD_FOCUS);
|
||||
updateCurveParamField(line);
|
||||
grid.nextLine();
|
||||
|
||||
// Flight modes
|
||||
new StaticText(window, grid.getLabelSlot(), STR_FLMODE);
|
||||
TextButton * flightmode = nullptr;
|
||||
for (uint8_t i=0; i<MAX_FLIGHT_MODES; i++) {
|
||||
char fm[2] = { char('0' + i), '\0'};
|
||||
if (i > 0 && (i % 4) == 0)
|
||||
grid.nextLine();
|
||||
flightmode = new TextButton(window, grid.getFieldSlot(4, i % 4), fm,
|
||||
new TextButton(window, grid.getFieldSlot(4, i % 4), fm,
|
||||
[=]() -> uint8_t {
|
||||
BFBIT_FLIP(line->flightModes, bfBit<uint32_t>(i));
|
||||
SET_DIRTY();
|
||||
@@ -276,7 +275,7 @@ class InputEditWindow: public Page {
|
||||
bfSingleBitGet(line->flightModes, i) ? 0 : BUTTON_CHECKED);
|
||||
}
|
||||
grid.nextLine();
|
||||
window->setLastField(flightmode);
|
||||
|
||||
window->setInnerHeight(grid.getWindowHeight());
|
||||
}
|
||||
};
|
||||
@@ -319,12 +318,12 @@ void CommonInputOrMixButton::paint(BitmapBuffer * dc)
|
||||
|
||||
class InputLineButton : public CommonInputOrMixButton {
|
||||
public:
|
||||
InputLineButton(Window * parent, const rect_t & rect, uint8_t index):
|
||||
InputLineButton(FormGroup * parent, const rect_t & rect, uint8_t index):
|
||||
CommonInputOrMixButton(parent, rect, index)
|
||||
{
|
||||
const ExpoData & line = g_model.expoData[index];
|
||||
if (line.swtch || line.curve.value != 0 || line.flightModes) {
|
||||
setHeight(getHeight() + 20);
|
||||
setHeight(getHeight() + PAGE_LINE_HEIGHT);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -338,7 +337,7 @@ class InputLineButton : public CommonInputOrMixButton {
|
||||
const ExpoData & line = g_model.expoData[index];
|
||||
|
||||
// first line ...
|
||||
drawValueOrGVar(dc, FIELD_PADDING_LEFT, FIELD_PADDING_TOP, line.weight);
|
||||
drawValueOrGVar(dc, FIELD_PADDING_LEFT, FIELD_PADDING_TOP, line.weight, -100, 100);
|
||||
drawSource(dc, 60, FIELD_PADDING_TOP, line.srcRaw);
|
||||
|
||||
if (line.name[0]) {
|
||||
@@ -348,7 +347,7 @@ class InputLineButton : public CommonInputOrMixButton {
|
||||
|
||||
// second line ...
|
||||
if (line.swtch) {
|
||||
dc->drawMask(3, PAGE_LINE_HEIGHT + FIELD_PADDING_TOP, mixerSetupSwitchIcon, DEFAULT_COLOR);
|
||||
dc->drawMask(3, PAGE_LINE_HEIGHT + FIELD_PADDING_TOP + 2, mixerSetupSwitchIcon, DEFAULT_COLOR);
|
||||
drawSwitch(dc, 21, PAGE_LINE_HEIGHT + FIELD_PADDING_TOP, line.swtch);
|
||||
}
|
||||
|
||||
@@ -394,9 +393,9 @@ void ModelInputsPage::build(FormWindow * window, int8_t focusIndex)
|
||||
|
||||
int inputIndex = 0;
|
||||
ExpoData * line = g_model.expoData;
|
||||
for (uint8_t input=0; input<MAX_INPUTS; input++) {
|
||||
for (uint8_t input = 0; input < MAX_INPUTS; input++) {
|
||||
if (inputIndex < MAX_EXPOS && line->chn == input && EXPO_VALID(line)) {
|
||||
new StaticText(window, grid.getLabelSlot(), getSourceString(MIXSRC_FIRST_INPUT + input), BUTTON_BACKGROUND | CENTERED);
|
||||
new StaticText(window, grid.getLabelSlot(), getSourceString(MIXSRC_FIRST_INPUT + input), BUTTON_BACKGROUND, CENTERED);
|
||||
while (inputIndex < MAX_EXPOS && line->chn == input && EXPO_VALID(line)) {
|
||||
Button * button = new InputLineButton(window, grid.getFieldSlot(), inputIndex);
|
||||
if (focusIndex == inputIndex)
|
||||
@@ -497,7 +496,7 @@ void ModelInputsPage::build(FormWindow * window, int8_t focusIndex)
|
||||
|
||||
grid.nextLine();
|
||||
|
||||
window->setLastField();
|
||||
// window->setLastField();
|
||||
window->setInnerHeight(grid.getWindowHeight());
|
||||
}
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ class ModelInputsPage: public PageTab {
|
||||
|
||||
class CommonInputOrMixButton : public Button {
|
||||
public:
|
||||
CommonInputOrMixButton(Window * parent, const rect_t & rect, uint8_t index):
|
||||
CommonInputOrMixButton(FormGroup * parent, const rect_t & rect, uint8_t index):
|
||||
Button(parent, rect),
|
||||
index(index)
|
||||
{
|
||||
|
||||
@@ -64,14 +64,14 @@ class LogicalSwitchEditPage: public Page {
|
||||
{
|
||||
Page::checkEvents();
|
||||
if (active != isActive()) {
|
||||
headerSwitchName->setFlags(isActive() ? BOLD|HIGHLIGHT_COLOR : MENU_COLOR);
|
||||
headerSwitchName->setTextFlags(isActive() ? BOLD|HIGHLIGHT_COLOR : MENU_COLOR);
|
||||
active = !active;
|
||||
}
|
||||
}
|
||||
|
||||
void buildHeader(Window * window) {
|
||||
new StaticText(window, { PAGE_TITLE_LEFT, PAGE_TITLE_TOP, LCD_W - PAGE_TITLE_LEFT, PAGE_LINE_HEIGHT }, STR_MENULOGICALSWITCHES, MENU_COLOR);
|
||||
headerSwitchName = new StaticText(window, { PAGE_TITLE_LEFT, PAGE_TITLE_TOP + PAGE_LINE_HEIGHT, LCD_W - PAGE_TITLE_LEFT, PAGE_LINE_HEIGHT }, getSwitchPositionName(SWSRC_SW1 + index), MENU_COLOR);
|
||||
new StaticText(window, { PAGE_TITLE_LEFT, PAGE_TITLE_TOP, LCD_W - PAGE_TITLE_LEFT, PAGE_LINE_HEIGHT }, STR_MENULOGICALSWITCHES, 0, MENU_COLOR);
|
||||
headerSwitchName = new StaticText(window, { PAGE_TITLE_LEFT, PAGE_TITLE_TOP + PAGE_LINE_HEIGHT, LCD_W - PAGE_TITLE_LEFT, PAGE_LINE_HEIGHT }, getSwitchPositionName(SWSRC_SW1 + index), 0, MENU_COLOR);
|
||||
}
|
||||
|
||||
void updateLogicalSwitchOneWindow(FormField * functionChoice)
|
||||
@@ -82,8 +82,6 @@ class LogicalSwitchEditPage: public Page {
|
||||
LogicalSwitchData * cs = lswAddress(index);
|
||||
uint8_t cstate = lswFamily(cs->func);
|
||||
|
||||
FormField::setCurrentField(functionChoice);
|
||||
|
||||
if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY) {
|
||||
new StaticText(logicalSwitchOneWindow, grid.getLabelSlot(), STR_V1);
|
||||
auto choice = new SwitchChoice(logicalSwitchOneWindow, grid.getFieldSlot(), SWSRC_FIRST_IN_LOGICAL_SWITCHES, SWSRC_LAST_IN_LOGICAL_SWITCHES, GET_SET_DEFAULT(cs->v1));
|
||||
@@ -190,7 +188,7 @@ class LogicalSwitchEditPage: public Page {
|
||||
}
|
||||
grid.nextLine();
|
||||
|
||||
FormField::link(FormField::getCurrentField(), functionChoice);
|
||||
// FormField::link(FormField::getCurrentField(), functionChoice);
|
||||
}
|
||||
|
||||
void buildBody(FormWindow * window)
|
||||
@@ -237,7 +235,7 @@ static constexpr coord_t col3 = ((LCD_W - 100) / 3) * 2 + col1;
|
||||
|
||||
class LogicalSwitchButton : public Button {
|
||||
public:
|
||||
LogicalSwitchButton(Window * parent, const rect_t & rect, int lsIndex):
|
||||
LogicalSwitchButton(FormGroup * parent, const rect_t & rect, int lsIndex):
|
||||
Button(parent, rect),
|
||||
lsIndex(lsIndex),
|
||||
active(isActive())
|
||||
@@ -362,7 +360,7 @@ void ModelLogicalSwitchesPage::build(FormWindow * window, int8_t focusIndex)
|
||||
grid.spacer(button->height() + 5);
|
||||
}
|
||||
else {
|
||||
new StaticText(window, grid.getLabelSlot(), getSwitchPositionName(SWSRC_SW1 + i), BUTTON_BACKGROUND | CENTERED);
|
||||
new StaticText(window, grid.getLabelSlot(), getSwitchPositionName(SWSRC_SW1 + i), BUTTON_BACKGROUND, CENTERED);
|
||||
|
||||
auto button = new LogicalSwitchButton(window, grid.getFieldSlot(), i);
|
||||
button->setPressHandler([=]() {
|
||||
@@ -401,6 +399,6 @@ void ModelLogicalSwitchesPage::build(FormWindow * window, int8_t focusIndex)
|
||||
|
||||
grid.nextLine();
|
||||
|
||||
window->setLastField();
|
||||
// window->setLastField();
|
||||
window->setInnerHeight(grid.getWindowHeight());
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#include "libopenui.h"
|
||||
#include "bitfield.h"
|
||||
#include "model_inputs.h"
|
||||
#include "gvar_numberedit.h"
|
||||
|
||||
#define SET_DIRTY() storageDirty(EE_MODEL)
|
||||
|
||||
@@ -67,52 +68,15 @@ class MixEditWindow : public Page {
|
||||
protected:
|
||||
uint8_t channel;
|
||||
uint8_t mixIndex;
|
||||
Window * updateCurvesWindow = nullptr;
|
||||
Choice * curveTypeChoice = nullptr;
|
||||
FormGroup * curveParamField = nullptr;
|
||||
|
||||
void buildHeader(Window * window)
|
||||
{
|
||||
new StaticText(window, {PAGE_TITLE_LEFT, PAGE_TITLE_TOP, LCD_W - PAGE_TITLE_LEFT, PAGE_LINE_HEIGHT}, STR_MIXER, MENU_COLOR);
|
||||
new StaticText(window, {PAGE_TITLE_LEFT, PAGE_TITLE_TOP + PAGE_LINE_HEIGHT, LCD_W - PAGE_TITLE_LEFT, PAGE_LINE_HEIGHT}, getSourceString(MIXSRC_CH1 + channel), MENU_COLOR);
|
||||
new StaticText(window, {PAGE_TITLE_LEFT, PAGE_TITLE_TOP, LCD_W - PAGE_TITLE_LEFT, PAGE_LINE_HEIGHT}, STR_MIXER, 0, MENU_COLOR);
|
||||
new StaticText(window, {PAGE_TITLE_LEFT, PAGE_TITLE_TOP + PAGE_LINE_HEIGHT, LCD_W - PAGE_TITLE_LEFT, PAGE_LINE_HEIGHT}, getSourceString(MIXSRC_CH1 + channel), 0, MENU_COLOR);
|
||||
}
|
||||
|
||||
void updateCurves()
|
||||
{
|
||||
FormGridLayout grid;
|
||||
updateCurvesWindow->clear();
|
||||
|
||||
MixData * line = mixAddress(mixIndex);
|
||||
|
||||
new StaticText(updateCurvesWindow, grid.getLabelSlot(), STR_CURVE);
|
||||
curveTypeChoice = new Choice(updateCurvesWindow, grid.getFieldSlot(2, 0), "\004DiffExpoFuncCstm", 0, CURVE_REF_CUSTOM,
|
||||
GET_DEFAULT(line->curve.type),
|
||||
[=](int32_t newValue) {
|
||||
line->curve.type = newValue;
|
||||
line->curve.value = 0;
|
||||
SET_DIRTY();
|
||||
updateCurves();
|
||||
curveTypeChoice->setFocus();
|
||||
});
|
||||
|
||||
switch (line->curve.type) {
|
||||
case CURVE_REF_DIFF:
|
||||
case CURVE_REF_EXPO: {
|
||||
// TODO GVAR
|
||||
NumberEdit * edit = new NumberEdit(updateCurvesWindow, grid.getFieldSlot(2, 1), -100, 100,
|
||||
GET_SET_DEFAULT(line->curve.value));
|
||||
edit->setSuffix("%");
|
||||
break;
|
||||
}
|
||||
case CURVE_REF_FUNC:
|
||||
new Choice(updateCurvesWindow, grid.getFieldSlot(2, 1), STR_VCURVEFUNC, 0, CURVE_BASE - 1, GET_SET_DEFAULT(line->curve.value));
|
||||
break;
|
||||
case CURVE_REF_CUSTOM:
|
||||
//new CustomCurveChoice(updateCurvesWindow, grid.getFieldSlot(2, 1), -MAX_CURVES, MAX_CURVES, GET_SET_DEFAULT(line->curve.value));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void buildBody(Window * window)
|
||||
void buildBody(FormWindow * window)
|
||||
{
|
||||
FormGridLayout grid;
|
||||
grid.spacer(8);
|
||||
@@ -131,15 +95,14 @@ class MixEditWindow : public Page {
|
||||
|
||||
// Weight
|
||||
new StaticText(window, grid.getLabelSlot(), STR_WEIGHT);
|
||||
// TODO GVAR ?
|
||||
NumberEdit * edit = new NumberEdit(window, grid.getFieldSlot(), -100, 100, GET_SET_DEFAULT(mix->weight));
|
||||
edit->setSuffix("%");
|
||||
auto gvar = new GVarNumberEdit(window, grid.getFieldSlot(), MIX_WEIGHT_MIN, MIX_WEIGHT_MAX, GET_SET_DEFAULT(mix->weight));
|
||||
gvar->setSuffix("%");
|
||||
grid.nextLine();
|
||||
|
||||
// Offset
|
||||
new StaticText(window, grid.getLabelSlot(), STR_OFFSET);
|
||||
edit = new NumberEdit(window, grid.getFieldSlot(), GV_RANGELARGE_OFFSET_NEG, GV_RANGELARGE_OFFSET, GET_SET_DEFAULT(mix->offset));
|
||||
edit->setSuffix("%");
|
||||
gvar = new GVarNumberEdit(window, grid.getFieldSlot(), MIX_OFFSET_MIN, MIX_OFFSET_MAX, GET_SET_DEFAULT(mix->offset));
|
||||
gvar->setSuffix("%");
|
||||
grid.nextLine();
|
||||
|
||||
// Trim
|
||||
@@ -148,9 +111,18 @@ class MixEditWindow : public Page {
|
||||
grid.nextLine();
|
||||
|
||||
// Curve
|
||||
updateCurvesWindow = new Window(window, {0, grid.getWindowHeight(), LCD_W, 0});
|
||||
updateCurves();
|
||||
grid.addWindow(updateCurvesWindow);
|
||||
new StaticText(&body, grid.getLabelSlot(), STR_CURVE);
|
||||
new Choice(&body, grid.getFieldSlot(2, 0), "\004DiffExpoFuncCstm", 0, CURVE_REF_CUSTOM,
|
||||
GET_DEFAULT(mix->curve.type),
|
||||
[=](int32_t newValue) {
|
||||
mix->curve.type = newValue;
|
||||
mix->curve.value = 0;
|
||||
SET_DIRTY();
|
||||
updateCurveParamField(mix);
|
||||
});
|
||||
curveParamField = new FormGroup(&body, grid.getFieldSlot(2, 1), FORM_FORWARD_FOCUS);
|
||||
updateCurveParamField(mix);
|
||||
grid.nextLine();
|
||||
|
||||
// Flight modes
|
||||
new StaticText(window, grid.getLabelSlot(), STR_FLMODE);
|
||||
@@ -175,7 +147,7 @@ class MixEditWindow : public Page {
|
||||
|
||||
// Warning
|
||||
new StaticText(window, grid.getLabelSlot(), STR_MIXWARNING);
|
||||
edit = new NumberEdit(window, grid.getFieldSlot(2, 0), 0, 3, GET_SET_DEFAULT(mix->mixWarn));
|
||||
auto edit = new NumberEdit(window, grid.getFieldSlot(2, 0), 0, 3, GET_SET_DEFAULT(mix->mixWarn));
|
||||
edit->setZeroText(STR_OFF);
|
||||
grid.nextLine();
|
||||
|
||||
@@ -224,11 +196,42 @@ class MixEditWindow : public Page {
|
||||
|
||||
window->setInnerHeight(grid.getWindowHeight());
|
||||
}
|
||||
|
||||
// TODO share this code with INPUT
|
||||
void updateCurveParamField(MixData * line)
|
||||
{
|
||||
curveParamField->clear();
|
||||
|
||||
const rect_t rect = {0, 0, curveParamField->width(), curveParamField->height()};
|
||||
|
||||
switch (line->curve.type) {
|
||||
case CURVE_REF_DIFF:
|
||||
case CURVE_REF_EXPO:
|
||||
{
|
||||
GVarNumberEdit * edit = new GVarNumberEdit(curveParamField, rect, -100, 100, GET_SET_DEFAULT(line->curve.value));
|
||||
edit->setSuffix("%");
|
||||
break;
|
||||
}
|
||||
|
||||
case CURVE_REF_FUNC:
|
||||
new Choice(curveParamField, rect, STR_VCURVEFUNC, 0, CURVE_BASE - 1, GET_SET_DEFAULT(line->curve.value));
|
||||
break;
|
||||
|
||||
case CURVE_REF_CUSTOM:
|
||||
{
|
||||
auto choice = new Choice(curveParamField, rect, nullptr, -MAX_CURVES, MAX_CURVES, GET_SET_DEFAULT(line->curve.value));
|
||||
choice->setTextHandler([](int value) {
|
||||
return getCurveString(value);
|
||||
});
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
class MixLineButton : public CommonInputOrMixButton {
|
||||
public:
|
||||
MixLineButton(Window * parent, const rect_t &rect, uint8_t index) :
|
||||
MixLineButton(FormGroup * parent, const rect_t &rect, uint8_t index) :
|
||||
CommonInputOrMixButton(parent, rect, index)
|
||||
{
|
||||
const MixData & mix = g_model.mixData[index];
|
||||
@@ -247,11 +250,11 @@ class MixLineButton : public CommonInputOrMixButton {
|
||||
const MixData & line = g_model.mixData[index];
|
||||
|
||||
// first line ...
|
||||
drawValueOrGVar(dc, FIELD_PADDING_LEFT, FIELD_PADDING_TOP, line.weight);
|
||||
drawValueOrGVar(dc, FIELD_PADDING_LEFT, FIELD_PADDING_TOP, line.weight, MIX_WEIGHT_MIN, MIX_WEIGHT_MAX);
|
||||
drawSource(dc, 60, FIELD_PADDING_TOP, line.srcRaw);
|
||||
|
||||
if (line.name[0]) {
|
||||
dc->drawBitmap(146, FIELD_PADDING_TOP, mixerSetupLabelBitmap);
|
||||
dc->drawBitmap(146, 2 + FIELD_PADDING_TOP, mixerSetupLabelBitmap);
|
||||
dc->drawSizedText(166, FIELD_PADDING_TOP, line.name, sizeof(line.name));
|
||||
}
|
||||
|
||||
@@ -330,7 +333,7 @@ void ModelMixesPage::build(FormWindow * window, int8_t focusMixIndex)
|
||||
MixData * mix = g_model.mixData;
|
||||
for (uint8_t ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++) {
|
||||
if (mixIndex < MAX_MIXERS && mix->srcRaw > 0 && mix->destCh == ch) {
|
||||
new StaticText(window, grid.getLabelSlot(), getSourceString(MIXSRC_CH1 + ch), BUTTON_BACKGROUND | CENTERED);
|
||||
new StaticText(window, grid.getLabelSlot(), getSourceString(MIXSRC_CH1 + ch), BUTTON_BACKGROUND, CENTERED);
|
||||
uint8_t count = 0;
|
||||
while (mixIndex < MAX_MIXERS && mix->srcRaw > 0 && mix->destCh == ch) {
|
||||
Button * button = new MixLineButton(window, grid.getFieldSlot(), mixIndex);
|
||||
@@ -436,7 +439,6 @@ void ModelMixesPage::build(FormWindow * window, int8_t focusMixIndex)
|
||||
|
||||
grid.nextLine();
|
||||
|
||||
window->setLastField();
|
||||
window->setInnerHeight(grid.getWindowHeight());
|
||||
}
|
||||
|
||||
|
||||
@@ -39,11 +39,11 @@ class OutputEditWindow : public Page {
|
||||
|
||||
void buildHeader(Window * window)
|
||||
{
|
||||
new StaticText(window, {PAGE_TITLE_LEFT, PAGE_TITLE_TOP, LCD_W - PAGE_TITLE_LEFT, PAGE_LINE_HEIGHT}, STR_MENULIMITS, MENU_COLOR);
|
||||
new StaticText(window, {PAGE_TITLE_LEFT, PAGE_TITLE_TOP + PAGE_LINE_HEIGHT, LCD_W - PAGE_TITLE_LEFT, PAGE_LINE_HEIGHT}, getSourceString(MIXSRC_CH1 + channel), MENU_COLOR);
|
||||
new StaticText(window, {PAGE_TITLE_LEFT, PAGE_TITLE_TOP, LCD_W - PAGE_TITLE_LEFT, PAGE_LINE_HEIGHT}, STR_MENULIMITS, 0, MENU_COLOR);
|
||||
new StaticText(window, {PAGE_TITLE_LEFT, PAGE_TITLE_TOP + PAGE_LINE_HEIGHT, LCD_W - PAGE_TITLE_LEFT, PAGE_LINE_HEIGHT}, getSourceString(MIXSRC_CH1 + channel), 0, MENU_COLOR);
|
||||
}
|
||||
|
||||
void buildBody(Window * window)
|
||||
void buildBody(FormWindow * window)
|
||||
{
|
||||
FormGridLayout grid;
|
||||
grid.spacer(8);
|
||||
@@ -109,7 +109,7 @@ class OutputEditWindow : public Page {
|
||||
|
||||
class OutputLineButton : public Button {
|
||||
public:
|
||||
OutputLineButton(Window * parent, const rect_t &rect, LimitData * output) :
|
||||
OutputLineButton(FormGroup * parent, const rect_t &rect, LimitData * output) :
|
||||
Button(parent, rect),
|
||||
output(output)
|
||||
{
|
||||
@@ -171,7 +171,7 @@ void ModelOutputsPage::build(FormWindow * window, int8_t focusChannel)
|
||||
LimitData * output = limitAddress(ch);
|
||||
|
||||
// Channel label
|
||||
new StaticText(window, grid.getLabelSlot(), getSourceString(MIXSRC_CH1 + ch), BUTTON_BACKGROUND | CENTERED);
|
||||
new StaticText(window, grid.getLabelSlot(), getSourceString(MIXSRC_CH1 + ch), BUTTON_BACKGROUND, CENTERED);
|
||||
|
||||
// Channel settings
|
||||
Button * button = new OutputLineButton(window, grid.getFieldSlot(), output);
|
||||
@@ -213,7 +213,6 @@ void ModelOutputsPage::build(FormWindow * window, int8_t focusChannel)
|
||||
|
||||
grid.nextLine();
|
||||
|
||||
window->setLastField();
|
||||
window->setInnerHeight(grid.getWindowHeight());
|
||||
}
|
||||
|
||||
|
||||
@@ -36,6 +36,7 @@ class ChannelFailsafeBargraph: public Window {
|
||||
void checkEvents() override
|
||||
{
|
||||
invalidate();
|
||||
Window::checkEvents();
|
||||
}
|
||||
|
||||
void paint(BitmapBuffer * dc) override
|
||||
@@ -63,10 +64,10 @@ class ChannelFailsafeBargraph: public Window {
|
||||
uint8_t channel;
|
||||
};
|
||||
|
||||
class FailSafeBody : public Window {
|
||||
class FailSafeBody : public FormGroup {
|
||||
public:
|
||||
FailSafeBody(Window * parent, const rect_t &rect, uint8_t moduleIdx) :
|
||||
Window(parent, rect),
|
||||
FailSafeBody(FormGroup * parent, const rect_t & rect, uint8_t moduleIdx) :
|
||||
FormGroup(parent, rect),
|
||||
moduleIdx(moduleIdx)
|
||||
{
|
||||
build();
|
||||
@@ -75,6 +76,7 @@ class FailSafeBody : public Window {
|
||||
void checkEvents() override
|
||||
{
|
||||
invalidate();
|
||||
FormGroup::checkEvents();
|
||||
}
|
||||
|
||||
void build()
|
||||
@@ -118,7 +120,7 @@ class FailSafeBody : public Window {
|
||||
|
||||
class FailSafeFooter : public Window {
|
||||
public:
|
||||
FailSafeFooter(Window * parent, const rect_t &rect) :
|
||||
FailSafeFooter(Window * parent, const rect_t & rect) :
|
||||
Window(parent, rect)
|
||||
{
|
||||
}
|
||||
@@ -128,18 +130,14 @@ class FailSafeFooter : public Window {
|
||||
}
|
||||
};
|
||||
|
||||
class FailSafePage : public PageTab {
|
||||
class FailSafePage : public Page {
|
||||
public:
|
||||
explicit FailSafePage(uint8_t moduleIdx) :
|
||||
PageTab("FAILSAFE", ICON_STATS_ANALOGS),
|
||||
Page(ICON_STATS_ANALOGS),
|
||||
moduleIdx(moduleIdx)
|
||||
{
|
||||
}
|
||||
|
||||
void build(FormWindow * window) override
|
||||
{
|
||||
new FailSafeBody(window, {0, 0, LCD_W, window->height() - footerHeight}, moduleIdx );
|
||||
new FailSafeFooter(window, {0, window->height() - footerHeight, LCD_W, footerHeight});
|
||||
new FailSafeBody(&body, {0, 0, LCD_W, height() - footerHeight}, moduleIdx);
|
||||
new FailSafeFooter(&body, {0, height() - footerHeight, LCD_W, footerHeight});
|
||||
}
|
||||
|
||||
protected:
|
||||
@@ -147,12 +145,6 @@ class FailSafePage : public PageTab {
|
||||
uint8_t moduleIdx;
|
||||
};
|
||||
|
||||
FailSafeMenu::FailSafeMenu(uint8_t moduleIdx) :
|
||||
TabsGroup(ICON_MODEL)
|
||||
{
|
||||
addTab(new FailSafePage(moduleIdx));
|
||||
}
|
||||
|
||||
class RegisterDialog: public Dialog {
|
||||
public:
|
||||
explicit RegisterDialog(uint8_t moduleIdx):
|
||||
@@ -206,7 +198,7 @@ class RegisterDialog: public Dialog {
|
||||
if (!rxName && reusableBuffer.moduleSetup.pxx2.registerStep >= REGISTER_RX_NAME_RECEIVED) {
|
||||
rect_t rect = waiting->getRect();
|
||||
waiting->deleteLater();
|
||||
FormField::clearCurrentField();
|
||||
|
||||
rxName = new TextEdit(this, rect, reusableBuffer.moduleSetup.pxx2.registerRxName, PXX2_LEN_RX_NAME);
|
||||
rect = exitButton->getRect();
|
||||
auto okButton = new TextButton(this, rect, "OK",
|
||||
@@ -334,7 +326,7 @@ void BindWaitDialog::checkEvents()
|
||||
|
||||
class ReceiverButton: public TextButton {
|
||||
public:
|
||||
ReceiverButton(Window * parent, rect_t rect, uint8_t moduleIdx, uint8_t receiverIdx):
|
||||
ReceiverButton(FormGroup * parent, rect_t rect, uint8_t moduleIdx, uint8_t receiverIdx):
|
||||
TextButton(parent, rect, STR_BIND, [=]() {
|
||||
if (g_model.moduleData[moduleIdx].pxx2.receiverName[receiverIdx][0] == '\0') {
|
||||
startBind();
|
||||
@@ -428,10 +420,10 @@ class ReceiverButton: public TextButton {
|
||||
uint8_t receiverIdx;
|
||||
};
|
||||
|
||||
class ModuleWindow : public Window {
|
||||
class ModuleWindow : public FormGroup {
|
||||
public:
|
||||
ModuleWindow(Window * parent, const rect_t &rect, uint8_t moduleIdx) :
|
||||
Window(parent, rect, FORWARD_SCROLL),
|
||||
ModuleWindow(FormWindow * parent, const rect_t &rect, uint8_t moduleIdx) :
|
||||
FormGroup(parent, rect, FORWARD_SCROLL | FORM_FORWARD_FOCUS),
|
||||
moduleIdx(moduleIdx)
|
||||
{
|
||||
update();
|
||||
@@ -446,7 +438,6 @@ class ModuleWindow : public Window {
|
||||
uint8_t moduleIdx;
|
||||
Choice * moduleChoice = nullptr;
|
||||
Choice * rfChoice = nullptr;
|
||||
FormField * lastField = nullptr; // moduleChoice is always the firstField
|
||||
TextButton * bindButton = nullptr;
|
||||
TextButton * rangeButton = nullptr;
|
||||
TextButton * registerButton = nullptr;
|
||||
@@ -488,12 +479,7 @@ class ModuleWindow : public Window {
|
||||
{
|
||||
FormGridLayout grid;
|
||||
grid.setLabelWidth(175);
|
||||
|
||||
FormField * previousField = moduleChoice ? moduleChoice->getPreviousField() : moduleChoice->getCurrentField();
|
||||
FormField * nextField = lastField ? lastField->getNextField() : nullptr;
|
||||
|
||||
clear();
|
||||
FormField::clearCurrentField();
|
||||
|
||||
// Module Type
|
||||
new StaticText(this, grid.getLabelSlot(true), STR_MODE);
|
||||
@@ -510,7 +496,6 @@ class ModuleWindow : public Window {
|
||||
moduleChoice->setAvailableHandler([=](int8_t moduleType) {
|
||||
return moduleIdx == INTERNAL_MODULE ? isInternalModuleAvailable(moduleType) : isExternalModuleAvailable(moduleType);
|
||||
});
|
||||
FormField::link(previousField, moduleChoice);
|
||||
|
||||
// Module parameters
|
||||
if (isModuleXJT(moduleIdx)) {
|
||||
@@ -754,7 +739,7 @@ class ModuleWindow : public Window {
|
||||
if (g_model.moduleData[moduleIdx].failsafeMode == FAILSAFE_CUSTOM) {
|
||||
new TextButton(this, grid.getFieldSlot(2, 1), STR_SET,
|
||||
[=]() -> uint8_t {
|
||||
new FailSafeMenu(moduleIdx);
|
||||
new FailSafePage(moduleIdx);
|
||||
return 1;
|
||||
});
|
||||
}
|
||||
@@ -812,10 +797,6 @@ class ModuleWindow : public Window {
|
||||
|
||||
getParent()->moveWindowsTop(top(), adjustHeight());
|
||||
getParent()->invalidate(); // TODO should be automatically done
|
||||
|
||||
lastField = FormField::getCurrentField();
|
||||
if (nextField)
|
||||
FormField::link(lastField, nextField);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -860,8 +841,7 @@ void ModelSetupPage::build(FormWindow * window)
|
||||
|
||||
// Model name
|
||||
new StaticText(window, grid.getLabelSlot(), STR_MODELNAME);
|
||||
auto first = new TextEdit(window, grid.getFieldSlot(), g_model.header.name, sizeof(g_model.header.name));
|
||||
window->setFirstField(first);
|
||||
new TextEdit(window, grid.getFieldSlot(), g_model.header.name, sizeof(g_model.header.name));
|
||||
grid.nextLine();
|
||||
|
||||
// Bitmap
|
||||
@@ -891,8 +871,7 @@ void ModelSetupPage::build(FormWindow * window)
|
||||
// Timer name
|
||||
new StaticText(window, grid.getLabelSlot(true), STR_NAME);
|
||||
grid.nextLine();
|
||||
auto nameEdit = new TextEdit(group, timerGrid.getSlot(), timer->name, LEN_TIMER_NAME);
|
||||
group->setFirstField(nameEdit);
|
||||
new TextEdit(group, timerGrid.getSlot(), timer->name, LEN_TIMER_NAME);
|
||||
timerGrid.nextLine();
|
||||
|
||||
// Timer mode
|
||||
@@ -924,8 +903,7 @@ void ModelSetupPage::build(FormWindow * window)
|
||||
// Timer persistent
|
||||
new StaticText(window, grid.getLabelSlot(true), STR_PERSISTENT);
|
||||
grid.nextLine();
|
||||
auto persistentChoice = new Choice(group, timerGrid.getSlot(), STR_VPERSISTENT, 0, 2, GET_SET_DEFAULT(timer->persistent));
|
||||
group->setLastField(persistentChoice);
|
||||
new Choice(group, timerGrid.getSlot(), STR_VPERSISTENT, 0, 2, GET_SET_DEFAULT(timer->persistent));
|
||||
timerGrid.nextLine();
|
||||
|
||||
coord_t height = timerGrid.getWindowHeight() - 1;
|
||||
@@ -1019,10 +997,6 @@ void ModelSetupPage::build(FormWindow * window)
|
||||
button->setText(getSwitchWarningString(i));
|
||||
return newstate > 0;
|
||||
});
|
||||
if (i == 0)
|
||||
group->setFirstField(button);
|
||||
else if (i == NUM_SWITCHES - 1)
|
||||
group->setLastField(button);
|
||||
}
|
||||
grid.addWindow(group);
|
||||
}
|
||||
@@ -1037,17 +1011,13 @@ void ModelSetupPage::build(FormWindow * window)
|
||||
if (i > 0 && (i % 6) == 0)
|
||||
centerGrid.nextLine();
|
||||
|
||||
auto button = new TextButton(group, centerGrid.getSlot(6, i % 6), getStringAtIndex(s, STR_RETA123, i),
|
||||
[=]() -> uint8_t {
|
||||
BFBIT_FLIP(g_model.beepANACenter, bfBit<BeepANACenter>(i));
|
||||
SET_DIRTY();
|
||||
return bfSingleBitGet<BeepANACenter>(g_model.beepANACenter, i);
|
||||
},
|
||||
bfSingleBitGet(g_model.beepANACenter, i) ? BUTTON_CHECKED : 0);
|
||||
if (i == 0)
|
||||
group->setFirstField(button);
|
||||
else if (i == NUM_STICKS + NUM_POTS + NUM_SLIDERS - 1)
|
||||
group->setLastField(button);
|
||||
new TextButton(group, centerGrid.getSlot(6, i % 6), getStringAtIndex(s, STR_RETA123, i),
|
||||
[=]() -> uint8_t {
|
||||
BFBIT_FLIP(g_model.beepANACenter, bfBit<BeepANACenter>(i));
|
||||
SET_DIRTY();
|
||||
return bfSingleBitGet<BeepANACenter>(g_model.beepANACenter, i);
|
||||
},
|
||||
bfSingleBitGet(g_model.beepANACenter, i) ? BUTTON_CHECKED : 0);
|
||||
}
|
||||
grid.addWindow(group);
|
||||
}
|
||||
@@ -1071,8 +1041,6 @@ void ModelSetupPage::build(FormWindow * window)
|
||||
grid.addWindow(new ModuleWindow(window, {0, grid.getWindowHeight(), LCD_W, 0}, EXTERNAL_MODULE));
|
||||
}
|
||||
|
||||
FormField::link(FormField::getCurrentField(), first);
|
||||
|
||||
grid.nextLine();
|
||||
|
||||
window->setInnerHeight(grid.getWindowHeight());
|
||||
|
||||
@@ -20,14 +20,6 @@
|
||||
|
||||
#include "tabsgroup.h"
|
||||
|
||||
class FailSafeMenu: public TabsGroup {
|
||||
public:
|
||||
FailSafeMenu(uint8_t moduleIndex);
|
||||
};
|
||||
|
||||
class TextButton;
|
||||
class ModuleWindow;
|
||||
|
||||
class ModelSetupPage: public PageTab {
|
||||
public:
|
||||
ModelSetupPage();
|
||||
|
||||
@@ -50,7 +50,7 @@ class SensorSourceChoice : public SourceChoice {
|
||||
|
||||
class SensorButton : public Button {
|
||||
public:
|
||||
SensorButton(Window * parent, const rect_t &rect, uint8_t index, uint8_t number) :
|
||||
SensorButton(FormGroup * parent, const rect_t &rect, uint8_t index, uint8_t number) :
|
||||
Button(parent, rect),
|
||||
index(index),
|
||||
number(number)
|
||||
@@ -121,13 +121,13 @@ class SensorEditWindow : public Page {
|
||||
|
||||
protected:
|
||||
uint8_t index;
|
||||
Window * sensorParametersWindow = nullptr;
|
||||
FormWindow * sensorParametersWindow = nullptr;
|
||||
|
||||
void buildHeader(Window * window)
|
||||
{
|
||||
new StaticText(window, {PAGE_TITLE_LEFT, PAGE_TITLE_TOP, LCD_W - PAGE_TITLE_LEFT, PAGE_LINE_HEIGHT}, STR_SENSOR + std::to_string(index + 1), MENU_COLOR);
|
||||
new StaticText(window, {PAGE_TITLE_LEFT, PAGE_TITLE_TOP, LCD_W - PAGE_TITLE_LEFT, PAGE_LINE_HEIGHT}, STR_SENSOR + std::to_string(index + 1), 0, MENU_COLOR);
|
||||
// dynamic display of sensor value ?
|
||||
//new StaticText(window, {70, 28, 100, 20}, "SF" + std::to_string(index), MENU_COLOR);
|
||||
//new StaticText(window, {70, 28, 100, 20}, "SF" + std::to_string(index), 0, MENU_COLOR);
|
||||
}
|
||||
|
||||
void updateSensorParametersWindow()
|
||||
@@ -164,9 +164,9 @@ class SensorEditWindow : public Page {
|
||||
}
|
||||
else {
|
||||
new StaticText(sensorParametersWindow, grid.getLabelSlot(), STR_ID);
|
||||
auto hex = new NumberEdit(sensorParametersWindow, grid.getFieldSlot(2, 0), 0, 0xffff, GET_SET_DEFAULT(sensor->id));
|
||||
auto hex = new NumberEdit(sensorParametersWindow, grid.getFieldSlot(2, 0), 0, 0xFFFF, GET_SET_DEFAULT(sensor->id));
|
||||
hex->setDisplayHandler([](BitmapBuffer * dc, LcdFlags flags, int32_t value) {
|
||||
drawHexNumber(dc, 2, 2, value, 0);
|
||||
drawHexNumber(dc, FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value, 0);
|
||||
});
|
||||
new NumberEdit(sensorParametersWindow, grid.getFieldSlot(2, 1), 0, 0xff, GET_SET_DEFAULT(sensor->instance));
|
||||
grid.nextLine();
|
||||
@@ -329,8 +329,7 @@ class SensorEditWindow : public Page {
|
||||
|
||||
// Sensor name
|
||||
new StaticText(window, grid.getLabelSlot(), STR_NAME);
|
||||
auto edit = new TextEdit(window, grid.getFieldSlot(), sensor->label, sizeof(sensor->label));
|
||||
window->setFirstField(edit);
|
||||
new TextEdit(window, grid.getFieldSlot(), sensor->label, sizeof(sensor->label));
|
||||
grid.nextLine();
|
||||
|
||||
// Type
|
||||
@@ -349,7 +348,7 @@ class SensorEditWindow : public Page {
|
||||
});
|
||||
grid.nextLine();
|
||||
|
||||
sensorParametersWindow = new Window(window, {0, grid.getWindowHeight(), LCD_W, 0});
|
||||
sensorParametersWindow = new FormWindow(window, {0, grid.getWindowHeight(), LCD_W, 0});
|
||||
updateSensorParametersWindow();
|
||||
grid.addWindow(sensorParametersWindow);
|
||||
|
||||
@@ -394,7 +393,7 @@ void ModelTelemetryPage::build(FormWindow * window, int8_t focusSensorIndex)
|
||||
{
|
||||
FormGridLayout grid;
|
||||
grid.spacer(8);
|
||||
grid.setLabelWidth(250);
|
||||
grid.setLabelWidth(170);
|
||||
|
||||
this->window = window;
|
||||
|
||||
@@ -411,7 +410,7 @@ void ModelTelemetryPage::build(FormWindow * window, int8_t focusSensorIndex)
|
||||
edit->setDisplayHandler([](BitmapBuffer * dc, LcdFlags flags, int32_t value) {
|
||||
dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, g_model.rssiAlarms.getWarningRssi(), flags);
|
||||
});
|
||||
window->setFirstField(edit);
|
||||
// window->setFirstField(edit);
|
||||
grid.nextLine();
|
||||
|
||||
new StaticText(window, grid.getLabelSlot(true), STR_CRITICALALARM);
|
||||
@@ -432,9 +431,9 @@ void ModelTelemetryPage::build(FormWindow * window, int8_t focusSensorIndex)
|
||||
// Sensors columns titles
|
||||
uint8_t sensorsCount = getTelemetrySensorsCount();
|
||||
if (sensorsCount > 0) {
|
||||
new StaticText(window, {SENSOR_COL2, grid.getWindowHeight() + 3, SENSOR_COL3 - SENSOR_COL2, PAGE_LINE_HEIGHT}, STR_VALUE, SMLSIZE | TEXT_DISABLE_COLOR);
|
||||
new StaticText(window, {SENSOR_COL2, grid.getWindowHeight() + 3, SENSOR_COL3 - SENSOR_COL2, PAGE_LINE_HEIGHT}, STR_VALUE, 0, SMLSIZE | TEXT_DISABLE_COLOR);
|
||||
if (!g_model.ignoreSensorIds && !IS_SPEKTRUM_PROTOCOL()) {
|
||||
new StaticText(window, {SENSOR_COL3, grid.getWindowHeight() + 3, LCD_W - SENSOR_COL3, PAGE_LINE_HEIGHT}, STR_ID, SMLSIZE | TEXT_DISABLE_COLOR);
|
||||
new StaticText(window, {SENSOR_COL3, grid.getWindowHeight() + 3, LCD_W - SENSOR_COL3, PAGE_LINE_HEIGHT}, STR_ID, 0, SMLSIZE | TEXT_DISABLE_COLOR);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -479,12 +478,8 @@ void ModelTelemetryPage::build(FormWindow * window, int8_t focusSensorIndex)
|
||||
}
|
||||
}
|
||||
|
||||
grid.setLabelWidth(250);
|
||||
|
||||
// Autodiscover button
|
||||
auto rect = grid.getLabelSlot(true);
|
||||
rect.w -= MENUS_MARGIN_LEFT;
|
||||
auto discover = new TextButton(window, rect, STR_DISCOVER_SENSORS);
|
||||
auto discover = new TextButton(window, grid.getFieldSlot(2, 0), STR_DISCOVER_SENSORS);
|
||||
discover->setPressHandler([=]() {
|
||||
allowNewSensors = !allowNewSensors;
|
||||
if (allowNewSensors) {
|
||||
@@ -498,7 +493,7 @@ void ModelTelemetryPage::build(FormWindow * window, int8_t focusSensorIndex)
|
||||
});
|
||||
|
||||
// New sensor button
|
||||
new TextButton(window, grid.getFieldSlot(), STR_TELEMETRY_NEWSENSOR,
|
||||
new TextButton(window, grid.getFieldSlot(2, 1), STR_TELEMETRY_NEWSENSOR,
|
||||
[=]() -> uint8_t {
|
||||
int idx = availableTelemetryIndex();
|
||||
if (idx >= 0)
|
||||
@@ -509,7 +504,6 @@ void ModelTelemetryPage::build(FormWindow * window, int8_t focusSensorIndex)
|
||||
});
|
||||
grid.nextLine();
|
||||
|
||||
grid.setLabelWidth(PAGE_PADDING + PAGE_INDENT_WIDTH);
|
||||
if (sensorsCount > 0) {
|
||||
// Delete all sensors button
|
||||
new TextButton(window, grid.getFieldSlot(), STR_DELETE_ALL_SENSORS,
|
||||
@@ -525,7 +519,7 @@ void ModelTelemetryPage::build(FormWindow * window, int8_t focusSensorIndex)
|
||||
}
|
||||
|
||||
// Ignore instance button
|
||||
grid.setLabelWidth(250);
|
||||
grid.setLabelWidth(170);
|
||||
new StaticText(window, grid.getLabelSlot(true), STR_IGNORE_INSTANCE);
|
||||
new CheckBox(window, grid.getFieldSlot(), GET_SET_DEFAULT(g_model.ignoreSensorIds));
|
||||
grid.nextLine();
|
||||
@@ -557,8 +551,5 @@ void ModelTelemetryPage::build(FormWindow * window, int8_t focusSensorIndex)
|
||||
new Choice(window, grid.getFieldSlot(3, 2), STR_VVARIOCENTER, 0, 1, GET_SET_DEFAULT(g_model.varioData.centerSilent));
|
||||
grid.nextLine();
|
||||
|
||||
grid.nextLine();
|
||||
|
||||
window->setLastField();
|
||||
window->setInnerHeight(grid.getWindowHeight());
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
#include "opentx.h"
|
||||
|
||||
PageHeader::PageHeader(Page * parent, uint8_t icon):
|
||||
Window(parent, { 0, 0, LCD_W, MENU_HEADER_HEIGHT }, OPAQUE),
|
||||
FormGroup(parent, { 0, 0, LCD_W, MENU_HEADER_HEIGHT }, OPAQUE),
|
||||
icon(icon)
|
||||
#if defined(HARDWARE_TOUCH)
|
||||
, back(this, { 0, 0, MENU_HEADER_BUTTON_WIDTH, MENU_HEADER_BUTTON_WIDTH }, ICON_BACK,
|
||||
@@ -35,6 +35,13 @@ PageHeader::PageHeader(Page * parent, uint8_t icon):
|
||||
{
|
||||
}
|
||||
|
||||
PageHeader::~PageHeader()
|
||||
{
|
||||
#if defined(HARDWARE_TOUCH)
|
||||
back.detach();
|
||||
#endif
|
||||
}
|
||||
|
||||
void PageHeader::paint(BitmapBuffer * dc)
|
||||
{
|
||||
static_cast<ThemeBase *>(theme)->drawMenuBackground(dc, getIcon(), "");
|
||||
@@ -47,7 +54,7 @@ Page::Page(unsigned icon):
|
||||
body(this, { 0, MENU_HEADER_HEIGHT, LCD_W, LCD_H - MENU_HEADER_HEIGHT }),
|
||||
previousFocus(focusWindow)
|
||||
{
|
||||
setFocus();
|
||||
clearFocus();
|
||||
}
|
||||
|
||||
Page::~Page()
|
||||
|
||||
@@ -25,10 +25,12 @@
|
||||
|
||||
class Page;
|
||||
|
||||
class PageHeader: public Window {
|
||||
class PageHeader: public FormGroup {
|
||||
public:
|
||||
PageHeader(Page * parent, uint8_t icon);
|
||||
|
||||
~PageHeader();
|
||||
|
||||
void paint(BitmapBuffer * dc) override;
|
||||
|
||||
uint8_t getIcon() const
|
||||
|
||||
@@ -169,6 +169,5 @@ void RadioHardwarePage::build(FormWindow * window)
|
||||
});
|
||||
grid.nextLine();
|
||||
|
||||
window->setLastField();
|
||||
window->setInnerHeight(grid.getWindowHeight());
|
||||
}
|
||||
|
||||
@@ -28,19 +28,11 @@ RadioSdManagerPage::RadioSdManagerPage() :
|
||||
{
|
||||
}
|
||||
|
||||
void RadioSdManagerPage::rebuild(FormWindow *window)
|
||||
{
|
||||
coord_t scrollPosition = window->getScrollPositionY();
|
||||
window->clear();
|
||||
build(window);
|
||||
window->setScrollPositionY(scrollPosition);
|
||||
}
|
||||
|
||||
// TODO elsewhere
|
||||
extern bool compare_nocase(const std::string &first, const std::string &second);
|
||||
|
||||
|
||||
char *getFullPath(const std::string &filename)
|
||||
char * getFullPath(const std::string &filename)
|
||||
{
|
||||
static char full_path[FF_MAX_LFN + 1]; // TODO optimize that!
|
||||
f_getcwd(full_path, FF_MAX_LFN);
|
||||
@@ -118,7 +110,7 @@ class FlashModuleDialog: public FullScreenDialog
|
||||
Progress progress;
|
||||
};
|
||||
|
||||
void RadioSdManagerPage::build(FormWindow *window)
|
||||
void RadioSdManagerPage::build(FormWindow * window)
|
||||
{
|
||||
FormGridLayout grid;
|
||||
grid.spacer(PAGE_PADDING);
|
||||
@@ -224,7 +216,10 @@ void RadioSdManagerPage::build(FormWindow *window)
|
||||
});
|
||||
menu->addLine(STR_DELETE_FILE, [=]() {
|
||||
f_unlink(getFullPath(name));
|
||||
rebuild(window);
|
||||
// coord_t scrollPosition = window->getScrollPositionY();
|
||||
window->clear();
|
||||
build(window);
|
||||
// window->setScrollPositionY(scrollPosition);
|
||||
});
|
||||
}
|
||||
return 0;
|
||||
@@ -236,7 +231,6 @@ void RadioSdManagerPage::build(FormWindow *window)
|
||||
}
|
||||
}
|
||||
|
||||
window->setLastField();
|
||||
window->setInnerHeight(grid.getWindowHeight());
|
||||
preview->setHeight(max(window->height(), grid.getWindowHeight()));
|
||||
}
|
||||
|
||||
@@ -25,22 +25,22 @@
|
||||
|
||||
#define SET_DIRTY() storageDirty(EE_GENERAL)
|
||||
|
||||
class DateTimeWindow : public Window {
|
||||
class DateTimeWindow : public FormGroup {
|
||||
public:
|
||||
DateTimeWindow(Window * parent, const rect_t &rect) :
|
||||
Window(parent, rect, FORWARD_SCROLL)
|
||||
DateTimeWindow(FormGroup * parent, const rect_t & rect) :
|
||||
FormGroup(parent, rect, FORWARD_SCROLL | FORM_FORWARD_FOCUS)
|
||||
{
|
||||
build();
|
||||
}
|
||||
|
||||
~DateTimeWindow()
|
||||
~DateTimeWindow() override
|
||||
{
|
||||
deleteChildren();
|
||||
}
|
||||
|
||||
void checkEvents() override
|
||||
{
|
||||
Window::checkEvents();
|
||||
FormGroup::checkEvents();
|
||||
|
||||
if (get_tmr10ms() - lastRefresh > 100) {
|
||||
invalidate();
|
||||
@@ -48,14 +48,8 @@ class DateTimeWindow : public Window {
|
||||
}
|
||||
}
|
||||
|
||||
FormField * getFirstField()
|
||||
{
|
||||
return firstField;
|
||||
}
|
||||
|
||||
protected:
|
||||
tmr10ms_t lastRefresh = 0;
|
||||
FormField * firstField = nullptr;
|
||||
|
||||
void build()
|
||||
{
|
||||
@@ -63,7 +57,7 @@ class DateTimeWindow : public Window {
|
||||
|
||||
// Date
|
||||
new StaticText(this, grid.getLabelSlot(), STR_DATE);
|
||||
firstField = new NumberEdit(this, grid.getFieldSlot(3, 0), 2018, 2100,
|
||||
new NumberEdit(this, grid.getFieldSlot(3, 0), 2018, 2100,
|
||||
[=]() -> int32_t {
|
||||
struct gtm t;
|
||||
gettime(&t);
|
||||
@@ -114,8 +108,7 @@ class DateTimeWindow : public Window {
|
||||
});
|
||||
grid.nextLine();
|
||||
|
||||
|
||||
//Time
|
||||
// Time
|
||||
new StaticText(this, grid.getLabelSlot(), STR_TIME);
|
||||
auto hour = new NumberEdit(this, grid.getFieldSlot(3, 0), 0, 24,
|
||||
[=]() -> int32_t {
|
||||
@@ -164,6 +157,7 @@ class DateTimeWindow : public Window {
|
||||
seconds->setDisplayHandler([](BitmapBuffer * dc, LcdFlags flags, int32_t value) {
|
||||
dc->drawNumber(FIELD_PADDING_LEFT, FIELD_PADDING_TOP, value, flags | LEADING0, 2);
|
||||
});
|
||||
|
||||
grid.nextLine();
|
||||
getParent()->moveWindowsTop(top(), adjustHeight());
|
||||
}
|
||||
@@ -182,7 +176,6 @@ void RadioSetupPage::build(FormWindow * window)
|
||||
// Date and Time
|
||||
auto timeWindow = new DateTimeWindow(window, {0, grid.getWindowHeight(), LCD_W, 0});
|
||||
grid.addWindow(timeWindow);
|
||||
window->setFirstField(timeWindow->getFirstField());
|
||||
|
||||
// Batt meter range - Range 3.0v to 16v
|
||||
new StaticText(window, grid.getLabelSlot(), STR_BATTERY_RANGE);
|
||||
@@ -251,22 +244,23 @@ void RadioSetupPage::build(FormWindow * window)
|
||||
grid.nextLine();
|
||||
|
||||
#if defined(VARIO)
|
||||
new Subtitle(window, grid.getLabelSlot(), STR_VARIO);
|
||||
grid.nextLine();
|
||||
{
|
||||
new Subtitle(window, grid.getLabelSlot(), STR_VARIO);
|
||||
grid.nextLine();
|
||||
|
||||
// Vario volume
|
||||
new StaticText(window, grid.getLabelSlot(true), TR_VOLUME);
|
||||
new Slider(window, grid.getFieldSlot(), -2, +2, GET_SET_DEFAULT(g_eeGeneral.varioVolume));
|
||||
grid.nextLine();
|
||||
|
||||
new StaticText(window, grid.getLabelSlot(true), STR_PITCH_AT_ZERO);
|
||||
edit = new NumberEdit(window, grid.getFieldSlot(), VARIO_FREQUENCY_ZERO-400, VARIO_FREQUENCY_ZERO+400,
|
||||
GET_DEFAULT(VARIO_FREQUENCY_ZERO+(g_eeGeneral.varioPitch*10)),
|
||||
SET_VALUE(g_eeGeneral.varioPitch, (newValue - VARIO_FREQUENCY_ZERO) / 10));
|
||||
edit->setStep(10);
|
||||
edit->setSuffix("Hz");
|
||||
grid.nextLine();
|
||||
// Vario volume
|
||||
new StaticText(window, grid.getLabelSlot(true), TR_VOLUME);
|
||||
new Slider(window, grid.getFieldSlot(), -2, +2, GET_SET_DEFAULT(g_eeGeneral.varioVolume));
|
||||
grid.nextLine();
|
||||
|
||||
new StaticText(window, grid.getLabelSlot(true), STR_PITCH_AT_ZERO);
|
||||
edit = new NumberEdit(window, grid.getFieldSlot(), VARIO_FREQUENCY_ZERO - 400, VARIO_FREQUENCY_ZERO + 400,
|
||||
GET_DEFAULT(VARIO_FREQUENCY_ZERO + (g_eeGeneral.varioPitch * 10)),
|
||||
SET_VALUE(g_eeGeneral.varioPitch, (newValue - VARIO_FREQUENCY_ZERO) / 10));
|
||||
edit->setStep(10);
|
||||
edit->setSuffix("Hz");
|
||||
grid.nextLine();
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(HAPTIC)
|
||||
@@ -465,6 +459,5 @@ void RadioSetupPage::build(FormWindow * window)
|
||||
});
|
||||
grid.nextLine();
|
||||
|
||||
FormField::link(FormField::getCurrentField(), timeWindow->getFirstField());
|
||||
window->setInnerHeight(grid.getWindowHeight());
|
||||
}
|
||||
@@ -155,7 +155,7 @@ void RadioToolsPage::rebuild(FormWindow * window)
|
||||
*ext = '\0';
|
||||
label = getBasename(path);
|
||||
}
|
||||
new StaticText(window, grid.getLabelSlot(), "lua", BUTTON_BACKGROUND | CENTERED);
|
||||
new StaticText(window, grid.getLabelSlot(), "lua", BUTTON_BACKGROUND, CENTERED);
|
||||
new TextButton(window, grid.getFieldSlot(1), label, [=]() -> uint8_t {
|
||||
f_chdir("/SCRIPTS/TOOLS/");
|
||||
//luaExec(path);
|
||||
@@ -170,7 +170,7 @@ void RadioToolsPage::rebuild(FormWindow * window)
|
||||
#if defined(PXX2)
|
||||
// PXX2 modules tools
|
||||
if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[INTERNAL_MODULE].information.modelID, MODULE_OPTION_SPECTRUM_ANALYSER)) {
|
||||
new StaticText(window, grid.getLabelSlot(), "access", BUTTON_BACKGROUND | CENTERED);
|
||||
new StaticText(window, grid.getLabelSlot(), "access", BUTTON_BACKGROUND, CENTERED);
|
||||
new TextButton(window, grid.getFieldSlot(1), STR_SPECTRUM_ANALYSER_INT, [=]() -> uint8_t {
|
||||
new RadioSpectrumAnalyser(INTERNAL_MODULE);
|
||||
return 0;
|
||||
@@ -179,7 +179,7 @@ void RadioToolsPage::rebuild(FormWindow * window)
|
||||
}
|
||||
|
||||
if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[INTERNAL_MODULE].information.modelID, MODULE_OPTION_POWER_METER)) {
|
||||
new StaticText(window, grid.getLabelSlot(), "access", BUTTON_BACKGROUND | CENTERED);
|
||||
new StaticText(window, grid.getLabelSlot(), "access", BUTTON_BACKGROUND, CENTERED);
|
||||
new TextButton(window, grid.getFieldSlot(1), STR_POWER_METER_INT, [=]() -> uint8_t {
|
||||
// new RadioPowerMeter(INTERNAL_MODULE);
|
||||
return 0;
|
||||
@@ -188,7 +188,7 @@ void RadioToolsPage::rebuild(FormWindow * window)
|
||||
}
|
||||
|
||||
if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[EXTERNAL_MODULE].information.modelID, MODULE_OPTION_SPECTRUM_ANALYSER)) {
|
||||
new StaticText(window, grid.getLabelSlot(), "access", BUTTON_BACKGROUND | CENTERED);
|
||||
new StaticText(window, grid.getLabelSlot(), "access", BUTTON_BACKGROUND, CENTERED);
|
||||
new TextButton(window, grid.getFieldSlot(1), STR_SPECTRUM_ANALYSER_EXT, [=]() -> uint8_t {
|
||||
new RadioSpectrumAnalyser(EXTERNAL_MODULE);
|
||||
return 0;
|
||||
@@ -197,7 +197,7 @@ void RadioToolsPage::rebuild(FormWindow * window)
|
||||
}
|
||||
|
||||
if (isPXX2ModuleOptionAvailable(reusableBuffer.hardwareAndSettings.modules[EXTERNAL_MODULE].information.modelID, MODULE_OPTION_POWER_METER)) {
|
||||
new StaticText(window, grid.getLabelSlot(), "access", BUTTON_BACKGROUND | CENTERED);
|
||||
new StaticText(window, grid.getLabelSlot(), "access", BUTTON_BACKGROUND, CENTERED);
|
||||
new TextButton(window, grid.getFieldSlot(1), STR_POWER_METER_EXT, [=]() -> uint8_t {
|
||||
// new RadioPowerMeter(EXTERNAL_MODULE);
|
||||
return 0;
|
||||
|
||||
@@ -42,14 +42,10 @@ void RadioTrainerPage::build(FormWindow * window)
|
||||
for (uint8_t i=0; i<NUM_STICKS; i++) {
|
||||
uint8_t chan = channelOrder(i+1);
|
||||
TrainerMix * td = &g_eeGeneral.trainer.mix[chan-1];
|
||||
|
||||
new StaticText(window, grid.getLabelSlot(), TEXT_AT_INDEX(STR_VSRCRAW, (i + 1)));
|
||||
auto mode = new Choice(window, grid.getFieldSlot(3,0), STR_TRNMODE, 0, 2, GET_SET_DEFAULT(td->mode));
|
||||
if(i == 0) {
|
||||
window->setFirstField(mode);
|
||||
}
|
||||
auto perc = new NumberEdit(window, grid.getFieldSlot(3, 1), -125, 125, GET_SET_DEFAULT(td->studWeight));
|
||||
perc->setSuffix("%");
|
||||
new Choice(window, grid.getFieldSlot(3,0), STR_TRNMODE, 0, 2, GET_SET_DEFAULT(td->mode));
|
||||
auto weight = new NumberEdit(window, grid.getFieldSlot(3, 1), -125, 125, GET_SET_DEFAULT(td->studWeight));
|
||||
weight->setSuffix("%");
|
||||
new Choice(window, grid.getFieldSlot(3,2), STR_TRNCHN, 0, 3, GET_SET_DEFAULT(td->srcChn));
|
||||
grid.nextLine();
|
||||
}
|
||||
@@ -66,11 +62,11 @@ void RadioTrainerPage::build(FormWindow * window)
|
||||
|
||||
// Trainer calibration
|
||||
new StaticText(window, grid.getLabelSlot(), STR_CAL);
|
||||
for (int i=0; i<4; i++) {
|
||||
#if defined (PPM_UNIT_PERCENT_PREC1)
|
||||
auto calib = new NumberEdit(window, grid.getFieldSlot(4,i), 0 , 0, [=]() { return (ppmInput[i]-g_eeGeneral.trainer.calib[i])*2; }, nullptr, LEFT|PREC1);
|
||||
for (int i = 0; i < NUM_STICKS; i++) {
|
||||
#if defined (PPM_UNIT_PERCENT_PREC1)
|
||||
auto calib = new NumberEdit(window, grid.getFieldSlot(4, i), 0 , 0, [=]() { return (ppmInput[i]-g_eeGeneral.trainer.calib[i]) * 2; }, nullptr, LEFT|PREC1);
|
||||
#else
|
||||
auto calib = new NumberEdit(window, grid.getFieldSlot(4,i), 0 , 0, [=]() { return (ppmInput[i]-g_eeGeneral.trainer.calib[i])/5; }, nullptr, LEFT);
|
||||
auto calib = new NumberEdit(window, grid.getFieldSlot(4, i), 0 , 0, [=]() { return (ppmInput[i]-g_eeGeneral.trainer.calib[i]) / 5; }, nullptr, LEFT);
|
||||
#endif
|
||||
calib->setWindowFlags(REFRESH_ALWAYS);
|
||||
|
||||
|
||||
@@ -149,7 +149,7 @@ void ScreenSetupPage::build(FormWindow * window)
|
||||
grid.nextLine();
|
||||
|
||||
// Dynamic options window...
|
||||
optionsWindow = new Window(window, {0, grid.getWindowHeight(), LCD_W, 0}, FORWARD_SCROLL);
|
||||
optionsWindow = new FormGroup(window, {0, grid.getWindowHeight(), LCD_W, 0}, FORWARD_SCROLL);
|
||||
grid.addWindow(optionsWindow);
|
||||
updateLayoutOptions();
|
||||
}
|
||||
@@ -158,7 +158,7 @@ void ScreenSetupPage::updateLayoutOptions()
|
||||
{
|
||||
FormGridLayout grid;
|
||||
optionsWindow->clear();
|
||||
FormField::setCurrentField(setupWidgetsButton); // next field will be linked to this button
|
||||
// FormField::setCurrentField(setupWidgetsButton); // next field will be linked to this button
|
||||
|
||||
auto screen = customScreens[pageIndex];
|
||||
|
||||
@@ -203,5 +203,5 @@ void ScreenSetupPage::updateLayoutOptions()
|
||||
optionsWindow->adjustHeight();
|
||||
optionsWindow->getParent()->adjustInnerHeight();
|
||||
|
||||
FormField::link(FormField::getCurrentField(), layoutChoice);
|
||||
// FormField::link(FormField::getCurrentField(), layoutChoice);
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@ class ScreenSetupPage: public PageTab {
|
||||
protected:
|
||||
ScreenMenu * menu;
|
||||
uint8_t pageIndex;
|
||||
Window * optionsWindow = nullptr;
|
||||
FormGroup * optionsWindow = nullptr;
|
||||
TextButton * setupWidgetsButton = nullptr;
|
||||
FormField * layoutChoice = nullptr;
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ class SpecialFunctionEditPage : public Page {
|
||||
protected:
|
||||
CustomFunctionData * functions;
|
||||
uint8_t index;
|
||||
Window * specialFunctionOneWindow = nullptr;
|
||||
FormWindow * specialFunctionOneWindow = nullptr;
|
||||
StaticText * headerSF = nullptr;
|
||||
bool active = false;
|
||||
|
||||
@@ -51,7 +51,7 @@ class SpecialFunctionEditPage : public Page {
|
||||
Page::checkEvents();
|
||||
if (active != isActive()) {
|
||||
invalidate();
|
||||
headerSF->setFlags(isActive() ? BOLD|HIGHLIGHT_COLOR : MENU_COLOR);
|
||||
headerSF->setTextFlags(isActive() ? BOLD|HIGHLIGHT_COLOR : MENU_COLOR);
|
||||
active = !active;
|
||||
}
|
||||
}
|
||||
@@ -70,7 +70,7 @@ class SpecialFunctionEditPage : public Page {
|
||||
CustomFunctionData * cfn = &functions[index];
|
||||
uint8_t func = CFN_FUNC(cfn);
|
||||
|
||||
FormField::setCurrentField(previousField);
|
||||
// FormField::setCurrentField(previousField);
|
||||
|
||||
// Func param
|
||||
switch (func) {
|
||||
@@ -199,7 +199,7 @@ class SpecialFunctionEditPage : public Page {
|
||||
});
|
||||
}
|
||||
|
||||
FormField::link(FormField::getCurrentField(), nextField);
|
||||
// FormField::link(FormField::getCurrentField(), nextField);
|
||||
}
|
||||
|
||||
void buildBody(FormWindow * window)
|
||||
@@ -235,7 +235,7 @@ class SpecialFunctionEditPage : public Page {
|
||||
});
|
||||
grid.nextLine();
|
||||
|
||||
specialFunctionOneWindow = new Window(window, {0, grid.getWindowHeight(), LCD_W, 0});
|
||||
specialFunctionOneWindow = new FormWindow(window, {0, grid.getWindowHeight(), LCD_W, 0});
|
||||
updateSpecialFunctionOneWindow(functionChoice, switchChoice);
|
||||
grid.addWindow(specialFunctionOneWindow);
|
||||
}
|
||||
@@ -438,7 +438,7 @@ void SpecialFunctionsPage::build(FormWindow * window, int8_t focusIndex)
|
||||
grid.spacer(button->height() + 5);
|
||||
}
|
||||
else {
|
||||
new StaticText(window, grid.getLabelSlot(), s, BUTTON_BACKGROUND | CENTERED);
|
||||
new StaticText(window, grid.getLabelSlot(), s, BUTTON_BACKGROUND, CENTERED);
|
||||
|
||||
auto button = new SpecialFunctionButton(window, grid.getFieldSlot(), functions, i);
|
||||
button->setPressHandler([=]() {
|
||||
@@ -494,6 +494,6 @@ void SpecialFunctionsPage::build(FormWindow * window, int8_t focusIndex)
|
||||
|
||||
grid.nextLine();
|
||||
|
||||
window->setLastField();
|
||||
// window->setLastField();
|
||||
window->setInnerHeight(grid.getWindowHeight());
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
#include "opentx.h" // TODO for constants...
|
||||
|
||||
TabsGroupHeader::TabsGroupHeader(TabsGroup * parent, uint8_t icon):
|
||||
Window(parent, { 0, 0, LCD_W, MENU_BODY_TOP }, OPAQUE),
|
||||
FormGroup(parent, { 0, 0, LCD_W, MENU_BODY_TOP }, OPAQUE),
|
||||
#if defined(HARDWARE_TOUCH)
|
||||
back(this, { 0, 0, MENU_HEADER_BUTTON_WIDTH, MENU_HEADER_BUTTON_WIDTH }, ICON_BACK,
|
||||
[=]() -> uint8_t {
|
||||
@@ -41,6 +41,14 @@ TabsGroupHeader::TabsGroupHeader(TabsGroup * parent, uint8_t icon):
|
||||
{
|
||||
}
|
||||
|
||||
TabsGroupHeader::~TabsGroupHeader()
|
||||
{
|
||||
#if defined(HARDWARE_TOUCH)
|
||||
back.detach();
|
||||
#endif
|
||||
carousel.detach();
|
||||
}
|
||||
|
||||
void TabsGroupHeader::paint(BitmapBuffer * dc)
|
||||
{
|
||||
static_cast<ThemeBase *>(theme)->drawMenuBackground(dc, icon, title);
|
||||
@@ -123,14 +131,15 @@ void TabsGroup::removeAllTabs()
|
||||
void TabsGroup::setVisibleTab(PageTab * tab)
|
||||
{
|
||||
if (tab != currentTab) {
|
||||
setFocus();
|
||||
FormField::clearCurrentField();
|
||||
clearFocus();
|
||||
body.clear();
|
||||
#if defined(HARDWARE_TOUCH)
|
||||
Keyboard::hide();
|
||||
#endif
|
||||
currentTab = tab;
|
||||
tab->build(&body);
|
||||
if (!focusWindow)
|
||||
setFocus();
|
||||
header.setTitle(tab->title.c_str());
|
||||
invalidate();
|
||||
}
|
||||
|
||||
@@ -109,12 +109,14 @@ class TabsCarousel: public Window {
|
||||
uint8_t currentIndex = 0;
|
||||
};
|
||||
|
||||
class TabsGroupHeader: public Window {
|
||||
class TabsGroupHeader: public FormGroup {
|
||||
friend class TabsGroup;
|
||||
|
||||
public:
|
||||
TabsGroupHeader(TabsGroup * menu, uint8_t icon);
|
||||
|
||||
~TabsGroupHeader();
|
||||
|
||||
#if defined(DEBUG_WINDOWS)
|
||||
std::string getName() override
|
||||
{
|
||||
|
||||
@@ -131,7 +131,7 @@ int getMainViewsCount()
|
||||
ViewMain * ViewMain::instance = nullptr;
|
||||
|
||||
ViewMain::ViewMain(bool icons):
|
||||
Window(&mainWindow, { 0, 0, LCD_W, LCD_H })
|
||||
FormWindow(&mainWindow, { 0, 0, LCD_W, LCD_H })
|
||||
{
|
||||
instance = this;
|
||||
focusWindow = this;
|
||||
|
||||
@@ -21,9 +21,9 @@
|
||||
#ifndef _VIEW_MAIN_H_
|
||||
#define _VIEW_MAIN_H_
|
||||
|
||||
#include "window.h"
|
||||
#include "form.h"
|
||||
|
||||
class ViewMain: public Window {
|
||||
class ViewMain: public FormWindow {
|
||||
public:
|
||||
explicit ViewMain(bool icons = true);
|
||||
|
||||
|
||||
@@ -206,7 +206,7 @@ void gvarWeightItem(coord_t x, coord_t y, MixData * md, LcdFlags attr, event_t e
|
||||
{
|
||||
u_int8int16_t weight;
|
||||
MD_WEIGHT_TO_UNION(md, weight);
|
||||
weight.word = GVAR_MENU_ITEM(x, y, weight.word, GV_RANGELARGE_WEIGHT_NEG, GV_RANGELARGE_WEIGHT, attr, 0, event);
|
||||
weight.word = GVAR_MENU_ITEM(x, y, weight.word, MIX_WEIGHT_MIN, MIX_WEIGHT_MAX, attr, 0, event);
|
||||
MD_UNION_TO_WEIGHT(weight, md);
|
||||
}
|
||||
|
||||
@@ -220,7 +220,7 @@ void drawGVarName(coord_t x, coord_t y, int8_t idx, LcdFlags flags)
|
||||
void editStickHardwareSettings(coord_t x, coord_t y, int idx, event_t event, LcdFlags flags)
|
||||
{
|
||||
lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, idx+1, 0);
|
||||
if (ZEXIST(g_eeGeneral.anaNames[idx]) || (flags && s_editMode > 0))
|
||||
if (g_eeGeneral.anaNames[idx][0] || (flags && s_editMode > 0))
|
||||
editName(x, y, g_eeGeneral.anaNames[idx], LEN_ANA_NAME, event, flags);
|
||||
else
|
||||
lcdDrawMMM(x, y, flags);
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
#include "opentx.h"
|
||||
|
||||
MenuHandlerFunc menuHandlers[5];
|
||||
uint8_t menuEvent = 0;
|
||||
event_t menuEvent = 0;
|
||||
uint8_t menuVerticalPositions[4];
|
||||
uint8_t menuLevel = 0;
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ extern uint8_t menuCalibrationState;
|
||||
extern MenuHandlerFunc menuHandlers[5];
|
||||
extern uint8_t menuVerticalPositions[4];
|
||||
extern uint8_t menuLevel;
|
||||
extern uint8_t menuEvent;
|
||||
extern event_t menuEvent;
|
||||
|
||||
void chainMenu(MenuHandlerFunc newMenu);
|
||||
void pushMenu(MenuHandlerFunc newMenu);
|
||||
|
||||
@@ -36,9 +36,10 @@ void drawCurve(coord_t offset)
|
||||
do {
|
||||
point_t point = getPoint(i);
|
||||
i++;
|
||||
if (point.x == 0) break;
|
||||
lcdDrawFilledRect(point.x-offset, point.y-1, 3, 3, SOLID, FORCE); // do markup square
|
||||
} while (1);
|
||||
if (point.x == 0)
|
||||
break;
|
||||
lcdDrawFilledRect(point.x - offset, point.y - 1, 3, 3, SOLID, FORCE); // do markup square
|
||||
} while (true);
|
||||
}
|
||||
|
||||
void menuModelCurvesAll(event_t event)
|
||||
|
||||
@@ -413,7 +413,7 @@ void menuModelExposAll(event_t event)
|
||||
if (cur-menuVerticalOffset >= 0 && cur-menuVerticalOffset < NUM_BODY_LINES) {
|
||||
LcdFlags attr = ((s_copyMode || sub != cur) ? 0 : INVERS);
|
||||
|
||||
GVAR_MENU_ITEM(EXPO_LINE_WEIGHT_POS, y, ed->weight, MIN_EXPO_WEIGHT, 100, RIGHT | attr | (isExpoActive(i) ? BOLD : 0), 0, 0);
|
||||
GVAR_MENU_ITEM(EXPO_LINE_WEIGHT_POS, y, ed->weight, -100, 100, RIGHT | attr | (isExpoActive(i) ? BOLD : 0), 0, 0);
|
||||
displayExpoLine(y, ed);
|
||||
|
||||
if (s_copyMode) {
|
||||
|
||||
@@ -398,7 +398,7 @@ void menuRadioHardware(event_t event)
|
||||
uint8_t shift = (2*idx);
|
||||
uint8_t mask = (0x03 << shift);
|
||||
lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, NUM_STICKS+idx+1, menuHorizontalPosition < 0 ? attr : 0);
|
||||
if (ZEXIST(g_eeGeneral.anaNames[NUM_STICKS+idx]) || (attr && s_editMode > 0 && menuHorizontalPosition == 0))
|
||||
if (g_eeGeneral.anaNames[NUM_STICKS+idx][0] || (attr && s_editMode > 0 && menuHorizontalPosition == 0))
|
||||
editName(HW_SETTINGS_COLUMN1, y, g_eeGeneral.anaNames[NUM_STICKS+idx], LEN_ANA_NAME, event, attr && menuHorizontalPosition == 0);
|
||||
else
|
||||
lcdDrawMMM(HW_SETTINGS_COLUMN1, y, menuHorizontalPosition==0 ? attr : 0);
|
||||
|
||||
@@ -49,9 +49,9 @@
|
||||
#define GET_GVAR_PREC1(x, ...) (x*10)
|
||||
#endif
|
||||
|
||||
#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))
|
||||
#define GV_IS_GV_VALUE(x,min,max) ((max>GV1_SMALL || min<-GV1_SMALL) ? (x>GV_RANGELARGE || x<GV_RANGELARGE_NEG) : (x>max) || (x<min))
|
||||
#define GV_GET_GV1_VALUE(vmin, vmax) ((vmax<=GV_RANGESMALL && vmin>=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))
|
||||
#define GV_IS_GV_VALUE(x,min,max) ((max>GV1_SMALL || min<-GV1_SMALL) ? (x>GV_RANGELARGE || x<GV_RANGELARGE_NEG) : (x>max) || (x<min))
|
||||
|
||||
#define GV_INDEX_CALC_DELTA(x,delta) ((x&(delta*2-1)) - delta)
|
||||
|
||||
@@ -63,12 +63,12 @@
|
||||
#define GV_RANGELARGE (GV1_LARGE - (RESERVE_RANGE_FOR_GVARS+1))
|
||||
#define GV_RANGELARGE_NEG (-GV1_LARGE + (RESERVE_RANGE_FOR_GVARS+1))
|
||||
|
||||
// the define GV1_LARGE marks the highest bit value used for this variables
|
||||
// because this would give too big numbers for ARM, we limit it further for
|
||||
// offset and weight
|
||||
#define GV_RANGELARGE_WEIGHT (GV_RANGE_WEIGHT)
|
||||
#define GV_RANGELARGE_WEIGHT_NEG (-GV_RANGE_WEIGHT)
|
||||
#define GV_RANGELARGE_OFFSET (GV_RANGE_OFFSET)
|
||||
#define GV_RANGELARGE_OFFSET_NEG (-GV_RANGE_OFFSET)
|
||||
// the define GV1_LARGE marks the highest bit value used for this variables
|
||||
// because this would give too big numbers for ARM, we limit it further for
|
||||
// offset and weight
|
||||
constexpr int32_t MIX_WEIGHT_MAX = 500;
|
||||
constexpr int32_t MIX_WEIGHT_MIN = -500;
|
||||
constexpr int32_t MIX_OFFSET_MAX = 500;
|
||||
constexpr int32_t MIX_OFFSET_MIN = -500;
|
||||
|
||||
#endif // _GVARS_H_
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
macro(add_lua_export_target target)
|
||||
add_custom_command(
|
||||
OUTPUT lua_exports_${target}.inc
|
||||
COMMAND ${CMAKE_C_COMPILER} -E ${ARGN} -DEXPORT ${RADIO_SRC_DIRECTORY}/dataconstants.h > lua_exports_${target}.txt
|
||||
COMMAND ${CMAKE_C_COMPILER} -E ${ARGN} -DEXPORT ${RADIO_SRC_DIR}/dataconstants.h > lua_exports_${target}.txt
|
||||
COMMAND ${PYTHON_EXECUTABLE} ${RADIO_DIRECTORY}/util/luaexport.py ${VERSION} lua_exports_${target}.txt lua_exports_${target}.inc lua_fields_${target}.txt
|
||||
)
|
||||
add_custom_target(lua_export_${target} DEPENDS lua_exports_${target}.inc)
|
||||
@@ -10,9 +10,9 @@ endmacro(add_lua_export_target)
|
||||
|
||||
set(LUA_INCLUDES
|
||||
-DCPUARM -DLUA -DLUA_INPUTS -DLUA_EXPORT_GENERATION -DSIMU
|
||||
-I${RADIO_SRC_DIRECTORY}/targets/${TARGET_DIR}
|
||||
-I${RADIO_SRC_DIRECTORY}/thirdparty
|
||||
-I${RADIO_SRC_DIRECTORY}/targets/common/arm/stm32
|
||||
-I${RADIO_SRC_DIR}/targets/${TARGET_DIR}
|
||||
-I${RADIO_SRC_DIR}/thirdparty
|
||||
-I${RADIO_SRC_DIR}/targets/common/arm/stm32
|
||||
)
|
||||
|
||||
if(PYTHONINTERP_FOUND)
|
||||
|
||||
@@ -746,11 +746,11 @@ void displayLuaError(const char * title)
|
||||
if (lua_warning_info[0]) {
|
||||
char * split = strstr(lua_warning_info, ": ");
|
||||
if (split) {
|
||||
lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y+FH+3, lua_warning_info, split-lua_warning_info, SMLSIZE);
|
||||
lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y+2*FH+2, split+2, lua_warning_info+LUA_WARNING_INFO_LEN-split, SMLSIZE);
|
||||
// TODO lcd.drawSizedText(WARNING_LINE_X, WARNING_LINE_Y+FH+3, lua_warning_info, split-lua_warning_info, SMLSIZE);
|
||||
// TODO lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y+2*FH+2, split+2, lua_warning_info+LUA_WARNING_INFO_LEN-split, SMLSIZE);
|
||||
}
|
||||
else {
|
||||
lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y+FH+3, lua_warning_info, 40, SMLSIZE);
|
||||
// TODO lcdDrawSizedText(WARNING_LINE_X, WARNING_LINE_Y+FH+3, lua_warning_info, 40, SMLSIZE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -177,7 +177,7 @@ void applyExpos(int16_t * anas, uint8_t mode, uint8_t ovwrIdx, int16_t ovwrValue
|
||||
}
|
||||
|
||||
//========== WEIGHT ===============
|
||||
int32_t weight = GET_GVAR_PREC1(ed->weight, MIN_EXPO_WEIGHT, 100, mixerCurrentFlightMode);
|
||||
int32_t weight = GET_GVAR_PREC1(ed->weight, -100, 100, mixerCurrentFlightMode);
|
||||
v = div_and_round((int32_t)v * weight, 1000);
|
||||
|
||||
//========== OFFSET ===============
|
||||
|
||||
@@ -110,7 +110,6 @@ enum CurveRefType {
|
||||
CURVE_REF_CUSTOM
|
||||
};
|
||||
|
||||
#define MIN_EXPO_WEIGHT -100
|
||||
#define EXPO_VALID(ed) ((ed)->mode)
|
||||
#define EXPO_MODE_ENABLE(ed, v) (((v)<0 && ((ed)->mode&1)) || ((v)>=0 && ((ed)->mode&2)))
|
||||
|
||||
@@ -145,7 +144,6 @@ enum CurveRefType {
|
||||
|
||||
#define GV1_SMALL 128
|
||||
#define GV1_LARGE 1024
|
||||
#define GV_RANGE_WEIGHT 500
|
||||
#define GV_RANGE_OFFSET 500
|
||||
#define DELAY_MAX 250 /* 25 seconds */
|
||||
#define SLOW_MAX 250 /* 25 seconds */
|
||||
|
||||
@@ -332,13 +332,13 @@ char * getSwitchPositionName(char * dest, swsrc_t idx)
|
||||
if (idx <= SWSRC_LAST_SWITCH) {
|
||||
div_t swinfo = switchInfo(idx);
|
||||
s = getSwitchName(s, idx);
|
||||
*s++ = "\300-\301"[swinfo.rem];
|
||||
*s++ = "\200-\201"[swinfo.rem];
|
||||
*s = '\0';
|
||||
}
|
||||
#endif // PCBSKY9X
|
||||
|
||||
#if NUM_XPOTS > 0
|
||||
else if (idx <= SWSRC_LAST_MULTIPOS_SWITCH) {
|
||||
else if (idx <= SWSRC_LAST_MULTIPOS_SWITCH) {
|
||||
div_t swinfo = div(int(idx - SWSRC_FIRST_MULTIPOS_SWITCH), XPOTS_MULTIPOS_COUNT);
|
||||
char temp[LEN_ANA_NAME+1];
|
||||
getSourceString(temp, MIXSRC_FIRST_POT+swinfo.quot);
|
||||
@@ -348,7 +348,7 @@ char * getSwitchPositionName(char * dest, swsrc_t idx)
|
||||
#endif
|
||||
|
||||
#if defined(PCBSKY9X)
|
||||
else if (idx <= SWSRC_REa) {
|
||||
else if (idx <= SWSRC_REa) {
|
||||
getStringAtIndex(s, STR_VSWITCHES, IDX_TRIMS_IN_STR_VSWITCHES+idx-SWSRC_FIRST_TRIM);
|
||||
}
|
||||
#else
|
||||
@@ -393,12 +393,12 @@ char * getSourceString(char * dest, mixsrc_t idx)
|
||||
else if (idx <= MIXSRC_LAST_INPUT) {
|
||||
idx -= MIXSRC_FIRST_INPUT;
|
||||
*dest = '\314';
|
||||
if (ZEXIST(g_model.inputNames[idx])) {
|
||||
zchar2str(dest+1, g_model.inputNames[idx], LEN_INPUT_NAME);
|
||||
dest[LEN_INPUT_NAME+1] = '\0';
|
||||
if (strlen(g_model.inputNames[idx])) {
|
||||
memset(dest + 1, 0, LEN_INPUT_NAME);
|
||||
strncpy(dest + 1, g_model.inputNames[idx], LEN_INPUT_NAME);
|
||||
}
|
||||
else {
|
||||
strAppendUnsigned(dest+1, idx+1, 2);
|
||||
strAppendUnsigned(dest + 1, idx + 1, 2);
|
||||
}
|
||||
}
|
||||
#if defined(LUA_INPUTS)
|
||||
@@ -417,7 +417,7 @@ char * getSourceString(char * dest, mixsrc_t idx)
|
||||
#endif
|
||||
else if (idx <= MIXSRC_LAST_POT) {
|
||||
idx -= MIXSRC_Rud;
|
||||
if (ZEXIST(g_eeGeneral.anaNames[idx])) {
|
||||
if (g_eeGeneral.anaNames[idx][0]) {
|
||||
zchar2str(dest, g_eeGeneral.anaNames[idx], LEN_ANA_NAME);
|
||||
dest[LEN_ANA_NAME] = '\0';
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ set(ARCH ARM)
|
||||
set(STM32USB_DIR ${THIRDPARTY_DIR}/STM32_USB-Host-Device_Lib_V2.2.0/Libraries)
|
||||
add_definitions(-DSTM32 -DLUA_INPUTS -DVARIO)
|
||||
|
||||
include_directories(${RADIO_SRC_DIRECTORY}/targets/common/arm/stm32)
|
||||
include_directories(${RADIO_SRC_DIR}/targets/common/arm/stm32)
|
||||
include_directories(${STM32USB_DIR}/STM32_USB_OTG_Driver/inc)
|
||||
include_directories(${STM32USB_DIR}/STM32_USB_Device_Library/Core/inc)
|
||||
include_directories(${STM32USB_DIR}/STM32_USB_Device_Library/Class/msc/inc)
|
||||
|
||||
@@ -128,12 +128,12 @@ remove_definitions(-DCLI)
|
||||
remove_definitions(-DUSB_SERIAL)
|
||||
add_definitions(-DBOOT)
|
||||
|
||||
set(CMAKE_EXE_LINKER_FLAGS "-mcpu=${MCU} -mthumb -nostartfiles -lm -T${RADIO_SRC_DIRECTORY}/targets/${TARGET_DIR}/stm32_ramboot.ld -Wl,-Map=bootloader.map,--cref,--no-warn-mismatch,--gc-sections")
|
||||
set(CMAKE_EXE_LINKER_FLAGS "-mcpu=${MCU} -mthumb -nostartfiles -lm -T${RADIO_SRC_DIR}/targets/${TARGET_DIR}/stm32_ramboot.ld -Wl,-Map=bootloader.map,--cref,--no-warn-mismatch,--gc-sections")
|
||||
# use smaller nano libc
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --specs=nano.specs")
|
||||
|
||||
add_executable(bootloader ${BOOTLOADER_SRC})
|
||||
add_dependencies(bootloader ${BITMAPS_TARGET} firmware_translations)
|
||||
add_dependencies(bootloader ${BITMAPS_TARGET} translations)
|
||||
|
||||
add_custom_command(
|
||||
TARGET bootloader POST_BUILD
|
||||
|
||||
@@ -80,7 +80,7 @@ endif()
|
||||
add_definitions(-DPCBREV=${PCBREV})
|
||||
add_definitions(-DPCBREV_${PCBREV})
|
||||
|
||||
set(FIRMWARE_DEPENDENCIES ${FIRMWARE_DEPENDENCIES} ${BITMAPS_TARGET})
|
||||
set(RADIO_DEPENDENCIES ${RADIO_DEPENDENCIES} ${BITMAPS_TARGET} truetype_fonts)
|
||||
|
||||
add_definitions(-DPCBHORUS -DSTM32F429_439xx -DSDRAM -DCOLORLCD -DHARDWARE_KEYS)
|
||||
add_definitions(-DEEPROM_VARIANT=0 -DAUDIO -DVOICE -DRTCLOCK)
|
||||
|
||||
@@ -136,5 +136,11 @@ enum LcdColorIndex
|
||||
#endif
|
||||
|
||||
constexpr uint32_t INPUT_EDIT_LABELS_WIDTH = 120;
|
||||
constexpr coord_t INPUT_EDIT_CURVE_WIDTH = 158;
|
||||
constexpr coord_t INPUT_EDIT_CURVE_HEIGHT = LCD_H - MENU_HEADER_HEIGHT;
|
||||
constexpr coord_t INPUT_EDIT_CURVE_LEFT = LCD_W - 158;
|
||||
constexpr coord_t INPUT_EDIT_CURVE_TOP = MENU_HEADER_HEIGHT;
|
||||
|
||||
constexpr int CJK_FIRST_LETTER_INDEX = 187;
|
||||
|
||||
#endif // _LIBOPENUI_CONFIG_H_
|
||||
|
||||
@@ -53,7 +53,7 @@ set(LUA_EXPORT lua_export_x10)
|
||||
set(TOUCH_DRIVER touch_driver.cpp)
|
||||
set(HARDWARE_TOUCH YES)
|
||||
|
||||
set(FIRMWARE_DEPENDENCIES ${FIRMWARE_DEPENDENCIES} ${BITMAPS_TARGET})
|
||||
set(RADIO_DEPENDENCIES ${RADIO_DEPENDENCIES} ${BITMAPS_TARGET} truetype_fonts)
|
||||
|
||||
set(HARDWARE_TOUCH ON)
|
||||
set(SOFTWARE_KEYBOARD ON)
|
||||
@@ -67,11 +67,11 @@ if(NOT UNEXPECTED_SHUTDOWN)
|
||||
add_definitions(-DNO_UNEXPECTED_SHUTDOWN)
|
||||
endif()
|
||||
|
||||
include_directories(${RADIO_SRC_DIRECTORY}/fonts/colorlcd gui/${GUI_DIR} gui/${GUI_DIR}/layouts)
|
||||
include_directories(${RADIO_SRC_DIR}/fonts/colorlcd gui/${GUI_DIR} gui/${GUI_DIR}/layouts)
|
||||
|
||||
file(GLOB THEMES_SRC RELATIVE ${RADIO_SRC_DIRECTORY}/gui/colorlcd ${RADIO_SRC_DIRECTORY}/gui/colorlcd/themes/*.cpp)
|
||||
file(GLOB LAYOUTS_SRC RELATIVE ${RADIO_SRC_DIRECTORY}/gui/colorlcd ${RADIO_SRC_DIRECTORY}/gui/colorlcd/layouts/*.cpp)
|
||||
file(GLOB WIDGETS_SRC RELATIVE ${RADIO_SRC_DIRECTORY}/gui/colorlcd ${RADIO_SRC_DIRECTORY}/gui/colorlcd/widgets/*.cpp)
|
||||
file(GLOB THEMES_SRC RELATIVE ${RADIO_SRC_DIR}/gui/colorlcd ${RADIO_SRC_DIR}/gui/colorlcd/themes/*.cpp)
|
||||
file(GLOB LAYOUTS_SRC RELATIVE ${RADIO_SRC_DIR}/gui/colorlcd ${RADIO_SRC_DIR}/gui/colorlcd/layouts/*.cpp)
|
||||
file(GLOB WIDGETS_SRC RELATIVE ${RADIO_SRC_DIR}/gui/colorlcd ${RADIO_SRC_DIR}/gui/colorlcd/widgets/*.cpp)
|
||||
|
||||
if(DISK_CACHE)
|
||||
set(SRC ${SRC} disk_cache.cpp)
|
||||
|
||||
@@ -134,5 +134,11 @@ enum LcdColorIndex
|
||||
#endif
|
||||
|
||||
constexpr uint32_t INPUT_EDIT_LABELS_WIDTH = 80;
|
||||
constexpr coord_t INPUT_EDIT_CURVE_WIDTH = LCD_W;
|
||||
constexpr coord_t INPUT_EDIT_CURVE_HEIGHT = 158;
|
||||
constexpr coord_t INPUT_EDIT_CURVE_LEFT = 0;
|
||||
constexpr coord_t INPUT_EDIT_CURVE_TOP = MENU_HEADER_HEIGHT;
|
||||
|
||||
constexpr int CJK_FIRST_LETTER_INDEX = 187;
|
||||
|
||||
#endif // _LIBOPENUI_CONFIG_H_
|
||||
|
||||
@@ -40,7 +40,7 @@ if(Qt5Widgets_FOUND)
|
||||
qt5_wrap_cpp(SIMULATOR_SRC ${COMPANION_SRC_DIRECTORY}/simulation/simulatorinterface.h opentxsimulator.h)
|
||||
list(APPEND SIMULATOR_SRC ${SIMU_SRC} opentxsimulator.cpp)
|
||||
add_library(${SIMULATOR_TARGET} SHARED ${SIMULATOR_SRC})
|
||||
add_dependencies(${SIMULATOR_TARGET} ${FIRMWARE_DEPENDENCIES})
|
||||
add_dependencies(${SIMULATOR_TARGET} ${RADIO_DEPENDENCIES})
|
||||
target_compile_definitions(${SIMULATOR_TARGET} PUBLIC ${APP_COMMON_DEFINES}) # set in top-level CMakeLists
|
||||
target_link_libraries(${SIMULATOR_TARGET} ${SDL_LIBRARY} Qt5::Core)
|
||||
add_custom_target(libsimulator DEPENDS ${SIMULATOR_TARGET})
|
||||
@@ -96,8 +96,8 @@ if(FOX_FOUND)
|
||||
if(SIMU_DISKIO)
|
||||
set(SIMU_SRC ${SIMU_SRC} ${FATFS_DIR}/FatFs/ff.c ${FATFS_DIR}/option/ccsbcs.c)
|
||||
endif()
|
||||
add_executable(simu WIN32 ${SIMU_SRC} ${RADIO_SRC_DIRECTORY}/simu.cpp)
|
||||
add_dependencies(simu ${FIRMWARE_DEPENDENCIES})
|
||||
add_executable(simu WIN32 ${SIMU_SRC} ${RADIO_SRC_DIR}/simu.cpp)
|
||||
add_dependencies(simu ${RADIO_DEPENDENCIES})
|
||||
target_include_directories(simu PUBLIC ${FOX_INCLUDE_DIR} )
|
||||
target_link_libraries(simu ${FOX_LIBRARY} pthread ${SDL_LIBRARY})
|
||||
target_compile_definitions(simu PUBLIC -DSIMU)
|
||||
|
||||
@@ -7,7 +7,7 @@ set(EEPROM EEPROM_RAW)
|
||||
set(GUI_DIR 128x64)
|
||||
set(NAVIGATION_TYPE 9x)
|
||||
set(TARGET_DIR sky9x)
|
||||
set(FIRMWARE_DEPENDENCIES ${FIRMWARE_DEPENDENCIES} 9x_bitmaps)
|
||||
set(RADIO_DEPENDENCIES ${RADIO_DEPENDENCIES} 9x_bitmaps)
|
||||
set(PPM_LIMITS_SYMETRICAL YES)
|
||||
set(PXX1 YES)
|
||||
|
||||
|
||||