diff --git a/CMakeLists.txt b/CMakeLists.txt index af2fa2faf..baa7bbbe1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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}) diff --git a/cmake/Bitmaps.cmake b/cmake/Bitmaps.cmake index 65387b6d1..d7c846a30 100644 --- a/cmake/Bitmaps.cmake +++ b/cmake/Bitmaps.cmake @@ -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}) diff --git a/companion/src/simulation/CMakeLists.txt b/companion/src/simulation/CMakeLists.txt index 50d2da532..5245d48a4 100644 --- a/companion/src/simulation/CMakeLists.txt +++ b/companion/src/simulation/CMakeLists.txt @@ -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}) diff --git a/companion/src/tests/CMakeLists.txt b/companion/src/tests/CMakeLists.txt index e66b41fd2..aecb746c3 100644 --- a/companion/src/tests/CMakeLists.txt +++ b/companion/src/tests/CMakeLists.txt @@ -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}) diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index be450e615..cc42f4238 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -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 diff --git a/radio/src/bitmaps/128x64/CMakeLists.txt b/radio/src/bitmaps/128x64/CMakeLists.txt index 9119629ff..4b77fe48d 100644 --- a/radio/src/bitmaps/128x64/CMakeLists.txt +++ b/radio/src/bitmaps/128x64/CMakeLists.txt @@ -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) diff --git a/radio/src/bitmaps/212x64/CMakeLists.txt b/radio/src/bitmaps/212x64/CMakeLists.txt index c7e4b0fec..8e2a11e53 100644 --- a/radio/src/bitmaps/212x64/CMakeLists.txt +++ b/radio/src/bitmaps/212x64/CMakeLists.txt @@ -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) diff --git a/radio/src/bitmaps/colorlcd/CMakeLists.txt b/radio/src/bitmaps/colorlcd/CMakeLists.txt index 3c1efead4..cf4ce2259 100644 --- a/radio/src/bitmaps/colorlcd/CMakeLists.txt +++ b/radio/src/bitmaps/colorlcd/CMakeLists.txt @@ -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 diff --git a/radio/src/fonts/CMakeLists.txt b/radio/src/fonts/CMakeLists.txt index 7564a4cc8..34b670f69 100644 --- a/radio/src/fonts/CMakeLists.txt +++ b/radio/src/fonts/CMakeLists.txt @@ -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}) diff --git a/radio/src/fonts/truetype/CMakeLists.txt b/radio/src/fonts/truetype/CMakeLists.txt deleted file mode 100644 index fbe50a3dc..000000000 --- a/radio/src/fonts/truetype/CMakeLists.txt +++ /dev/null @@ -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}) diff --git a/radio/src/fonts/truetype/font_13.png b/radio/src/fonts/truetype/font_13.png deleted file mode 100644 index 220e1b160..000000000 Binary files a/radio/src/fonts/truetype/font_13.png and /dev/null differ diff --git a/radio/src/fonts/truetype/font_13.specs b/radio/src/fonts/truetype/font_13.specs deleted file mode 100644 index 15cd8bd98..000000000 --- a/radio/src/fonts/truetype/font_13.specs +++ /dev/null @@ -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 \ No newline at end of file diff --git a/radio/src/fonts/truetype/font_15.png b/radio/src/fonts/truetype/font_15.png deleted file mode 100644 index 67d6128af..000000000 Binary files a/radio/src/fonts/truetype/font_15.png and /dev/null differ diff --git a/radio/src/fonts/truetype/font_15.specs b/radio/src/fonts/truetype/font_15.specs deleted file mode 100644 index a6063ad69..000000000 --- a/radio/src/fonts/truetype/font_15.specs +++ /dev/null @@ -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 \ No newline at end of file diff --git a/radio/src/fonts/truetype/font_16.png b/radio/src/fonts/truetype/font_16.png deleted file mode 100644 index 004f1d3a2..000000000 Binary files a/radio/src/fonts/truetype/font_16.png and /dev/null differ diff --git a/radio/src/fonts/truetype/font_16.specs b/radio/src/fonts/truetype/font_16.specs deleted file mode 100644 index 3545b87f2..000000000 --- a/radio/src/fonts/truetype/font_16.specs +++ /dev/null @@ -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 \ No newline at end of file diff --git a/radio/src/fonts/truetype/font_16en.png b/radio/src/fonts/truetype/font_16en.png deleted file mode 100644 index 53f533f46..000000000 Binary files a/radio/src/fonts/truetype/font_16en.png and /dev/null differ diff --git a/radio/src/fonts/truetype/font_16en.specs b/radio/src/fonts/truetype/font_16en.specs deleted file mode 100644 index c4434ae6e..000000000 --- a/radio/src/fonts/truetype/font_16en.specs +++ /dev/null @@ -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 \ No newline at end of file diff --git a/radio/src/fonts/truetype/font_17.png b/radio/src/fonts/truetype/font_17.png deleted file mode 100644 index 0b5571da5..000000000 Binary files a/radio/src/fonts/truetype/font_17.png and /dev/null differ diff --git a/radio/src/fonts/truetype/font_17.specs b/radio/src/fonts/truetype/font_17.specs deleted file mode 100644 index 217abc7e4..000000000 --- a/radio/src/fonts/truetype/font_17.specs +++ /dev/null @@ -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 \ No newline at end of file diff --git a/radio/src/fonts/truetype/font_17en.png b/radio/src/fonts/truetype/font_17en.png deleted file mode 100644 index 2cc2fc837..000000000 Binary files a/radio/src/fonts/truetype/font_17en.png and /dev/null differ diff --git a/radio/src/fonts/truetype/font_17en.specs b/radio/src/fonts/truetype/font_17en.specs deleted file mode 100644 index 5e339e5f3..000000000 --- a/radio/src/fonts/truetype/font_17en.specs +++ /dev/null @@ -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 \ No newline at end of file diff --git a/radio/src/fonts/truetype/font_24.png b/radio/src/fonts/truetype/font_24.png deleted file mode 100644 index 6edfa6a29..000000000 Binary files a/radio/src/fonts/truetype/font_24.png and /dev/null differ diff --git a/radio/src/fonts/truetype/font_24.specs b/radio/src/fonts/truetype/font_24.specs deleted file mode 100644 index d6e8977f8..000000000 --- a/radio/src/fonts/truetype/font_24.specs +++ /dev/null @@ -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 \ No newline at end of file diff --git a/radio/src/fonts/truetype/font_32.png b/radio/src/fonts/truetype/font_32.png deleted file mode 100644 index 05e2cac8d..000000000 Binary files a/radio/src/fonts/truetype/font_32.png and /dev/null differ diff --git a/radio/src/fonts/truetype/font_32.specs b/radio/src/fonts/truetype/font_32.specs deleted file mode 100644 index cc561b311..000000000 --- a/radio/src/fonts/truetype/font_32.specs +++ /dev/null @@ -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 \ No newline at end of file diff --git a/radio/src/fonts/truetype/font_64.png b/radio/src/fonts/truetype/font_64.png deleted file mode 100644 index 8055127f3..000000000 Binary files a/radio/src/fonts/truetype/font_64.png and /dev/null differ diff --git a/radio/src/fonts/truetype/font_64.specs b/radio/src/fonts/truetype/font_64.specs deleted file mode 100644 index b03b35475..000000000 --- a/radio/src/fonts/truetype/font_64.specs +++ /dev/null @@ -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 \ No newline at end of file diff --git a/radio/src/fonts/truetype/font_9.png b/radio/src/fonts/truetype/font_9.png deleted file mode 100644 index 487ddd958..000000000 Binary files a/radio/src/fonts/truetype/font_9.png and /dev/null differ diff --git a/radio/src/fonts/truetype/font_9.specs b/radio/src/fonts/truetype/font_9.specs deleted file mode 100644 index 9272333e9..000000000 --- a/radio/src/fonts/truetype/font_9.specs +++ /dev/null @@ -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 \ No newline at end of file diff --git a/radio/src/fonts/truetype/font_bold16.png b/radio/src/fonts/truetype/font_bold16.png deleted file mode 100644 index 3e7df2bab..000000000 Binary files a/radio/src/fonts/truetype/font_bold16.png and /dev/null differ diff --git a/radio/src/fonts/truetype/font_bold16.specs b/radio/src/fonts/truetype/font_bold16.specs deleted file mode 100644 index 0ada56731..000000000 --- a/radio/src/fonts/truetype/font_bold16.specs +++ /dev/null @@ -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 \ No newline at end of file diff --git a/radio/src/fonts/truetype/font_bold17.png b/radio/src/fonts/truetype/font_bold17.png deleted file mode 100644 index a3c831b5b..000000000 Binary files a/radio/src/fonts/truetype/font_bold17.png and /dev/null differ diff --git a/radio/src/fonts/truetype/font_bold17.specs b/radio/src/fonts/truetype/font_bold17.specs deleted file mode 100644 index 20bff47c6..000000000 --- a/radio/src/fonts/truetype/font_bold17.specs +++ /dev/null @@ -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 \ No newline at end of file diff --git a/radio/src/gui/128x64/lcd.cpp b/radio/src/gui/128x64/lcd.cpp index 938010928..8b4241e68 100644 --- a/radio/src/gui/128x64/lcd.cpp +++ b/radio/src/gui/128x64/lcd.cpp @@ -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= 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(y % 8); while (w--) { - if(pat&1) { + if(pat & 1) { lcdMaskPoint(p, msk, att); pat = (pat >> 1) | 0x80; } diff --git a/radio/src/gui/128x64/model_input_edit.cpp b/radio/src/gui/128x64/model_input_edit.cpp index c2e27f738..6a45d7e10 100644 --- a/radio/src/gui/128x64/model_input_edit.cpp +++ b/radio/src/gui/128x64/model_input_edit.cpp @@ -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: diff --git a/radio/src/gui/128x64/model_inputs_mixes.cpp b/radio/src/gui/128x64/model_inputs_mixes.cpp index 7a49d67c2..5e6bd1d02 100644 --- a/radio/src/gui/128x64/model_inputs_mixes.cpp +++ b/radio/src/gui/128x64/model_inputs_mixes.cpp @@ -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); diff --git a/radio/src/gui/128x64/model_mix_edit.cpp b/radio/src/gui/128x64/model_mix_edit.cpp index 2a87faa7d..a1329d8b3 100644 --- a/radio/src/gui/128x64/model_mix_edit.cpp +++ b/radio/src/gui/128x64/model_mix_edit.cpp @@ -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; diff --git a/radio/src/gui/128x64/model_outputs.cpp b/radio/src/gui/128x64/model_outputs.cpp index a069e2362..03bcb443d 100644 --- a/radio/src/gui/128x64/model_outputs.cpp +++ b/radio/src/gui/128x64/model_outputs.cpp @@ -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; } } diff --git a/radio/src/gui/128x64/widgets.cpp b/radio/src/gui/128x64/widgets.cpp index 6b4090208..89e82999a 100644 --- a/radio/src/gui/128x64/widgets.cpp +++ b/radio/src/gui/128x64/widgets.cpp @@ -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); diff --git a/radio/src/gui/212x64/lcd.cpp b/radio/src/gui/212x64/lcd.cpp index 5ec6170bf..f948c1523 100644 --- a/radio/src/gui/212x64/lcd.cpp +++ b/radio/src/gui/212x64/lcd.cpp @@ -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= 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); } } diff --git a/radio/src/gui/212x64/model_input_edit.cpp b/radio/src/gui/212x64/model_input_edit.cpp index 715393cc4..f99e31cd4 100644 --- a/radio/src/gui/212x64/model_input_edit.cpp +++ b/radio/src/gui/212x64/model_input_edit.cpp @@ -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: diff --git a/radio/src/gui/212x64/model_mix_edit.cpp b/radio/src/gui/212x64/model_mix_edit.cpp index 1d0dcf9eb..8cc35395f 100644 --- a/radio/src/gui/212x64/model_mix_edit.cpp +++ b/radio/src/gui/212x64/model_mix_edit.cpp @@ -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; diff --git a/radio/src/gui/212x64/model_outputs.cpp b/radio/src/gui/212x64/model_outputs.cpp index f3f776285..c3e5337c6 100644 --- a/radio/src/gui/212x64/model_outputs.cpp +++ b/radio/src/gui/212x64/model_outputs.cpp @@ -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); } diff --git a/radio/src/gui/212x64/widgets.cpp b/radio/src/gui/212x64/widgets.cpp index c2bc5c9b5..1a272b811 100644 --- a/radio/src/gui/212x64/widgets.cpp +++ b/radio/src/gui/212x64/widgets.cpp @@ -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); diff --git a/radio/src/gui/colorlcd/CMakeLists.txt b/radio/src/gui/colorlcd/CMakeLists.txt index 22424afb7..a7136f7d2 100644 --- a/radio/src/gui/colorlcd/CMakeLists.txt +++ b/radio/src/gui/colorlcd/CMakeLists.txt @@ -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}) diff --git a/radio/src/gui/colorlcd/custom_curve_choice.cpp b/radio/src/gui/colorlcd/custom_curve_choice.cpp deleted file mode 100644 index 095c9476f..000000000 --- a/radio/src/gui/colorlcd/custom_curve_choice.cpp +++ /dev/null @@ -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 getValue, std::function 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 diff --git a/radio/src/gui/colorlcd/custom_curve_choice.h b/radio/src/gui/colorlcd/custom_curve_choice.h deleted file mode 100644 index 1d6df4715..000000000 --- a/radio/src/gui/colorlcd/custom_curve_choice.h +++ /dev/null @@ -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 - -class CustomCurveChoice : public FormField { - public: - CustomCurveChoice(Window * parent, const rect_t & rect, int16_t vmin, int16_t vmax, std::function getValue, std::function 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 getValue; - std::function setValue; - LcdFlags flags; -}; - -#endif // _CHOICE_H_ diff --git a/radio/src/gui/colorlcd/draw_functions.cpp b/radio/src/gui/colorlcd/draw_functions.cpp index cfed077c2..663dda933 100644 --- a/radio/src/gui/colorlcd/draw_functions.cpp +++ b/radio/src/gui/colorlcd/draw_functions.cpp @@ -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); } } \ No newline at end of file diff --git a/radio/src/gui/colorlcd/draw_functions.h b/radio/src/gui/colorlcd/draw_functions.h index fc1eaa236..8452a7652 100644 --- a/radio/src/gui/colorlcd/draw_functions.h +++ b/radio/src/gui/colorlcd/draw_functions.h @@ -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); diff --git a/radio/src/gui/colorlcd/fab_button.cpp b/radio/src/gui/colorlcd/fab_button.cpp index 70d5f41a2..791b6f0fa 100644 --- a/radio/src/gui/colorlcd/fab_button.cpp +++ b/radio/src/gui/colorlcd/fab_button.cpp @@ -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 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 pressHandler, WindowFlags windowFlags): + Button(parent, { x - 34, y - 34, 68, 68 }, pressHandler, windowFlags), icon(icon) { } diff --git a/radio/src/gui/colorlcd/fab_button.h b/radio/src/gui/colorlcd/fab_button.h index 344474c55..5da0baa3a 100644 --- a/radio/src/gui/colorlcd/fab_button.h +++ b/radio/src/gui/colorlcd/fab_button.h @@ -24,7 +24,7 @@ class FabButton: public Button { public: - FabButton(Window * parent, coord_t x, coord_t y, uint8_t icon, std::function pressHandler, uint8_t flags=0); + FabButton(FormGroup * parent, coord_t x, coord_t y, uint8_t icon, std::function pressHandler, WindowFlags windowFlags = 0); #if defined(DEBUG_WINDOWS) std::string getName() override diff --git a/radio/src/gui/colorlcd/gvar_numberedit.h b/radio/src/gui/colorlcd/gvar_numberedit.h new file mode 100644 index 000000000..f97eee284 --- /dev/null +++ b/radio/src/gui/colorlcd/gvar_numberedit.h @@ -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 getValue, std::function 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 getValue; + std::function 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_ diff --git a/radio/src/gui/colorlcd/model_curves.cpp b/radio/src/gui/colorlcd/model_curves.cpp index 2e052ee6f..ea6ed8189 100644 --- a/radio/src/gui/colorlcd/model_curves.cpp +++ b/radio/src/gui/colorlcd/model_curves.cpp @@ -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()); } diff --git a/radio/src/gui/colorlcd/model_flightmodes.cpp b/radio/src/gui/colorlcd/model_flightmodes.cpp index 4de3fe53f..0c73cffa6 100644 --- a/radio/src/gui/colorlcd/model_flightmodes.cpp +++ b/radio/src/gui/colorlcd/model_flightmodes.cpp @@ -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; tsetLastField(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); } diff --git a/radio/src/gui/colorlcd/model_gvars.cpp b/radio/src/gui/colorlcd/model_gvars.cpp index b78f74b71..eca3bdbbf 100644 --- a/radio/src/gui/colorlcd/model_gvars.cpp +++ b/radio/src/gui/colorlcd/model_gvars.cpp @@ -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()); diff --git a/radio/src/gui/colorlcd/model_gvars.h b/radio/src/gui/colorlcd/model_gvars.h index 21d61ee7d..50b5ffc45 100644 --- a/radio/src/gui/colorlcd/model_gvars.h +++ b/radio/src/gui/colorlcd/model_gvars.h @@ -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 \ No newline at end of file diff --git a/radio/src/gui/colorlcd/model_heli.cpp b/radio/src/gui/colorlcd/model_heli.cpp index 43d2984eb..27cdf9bf2 100644 --- a/radio/src/gui/colorlcd/model_heli.cpp +++ b/radio/src/gui/colorlcd/model_heli.cpp @@ -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(); diff --git a/radio/src/gui/colorlcd/model_inputs.cpp b/radio/src/gui/colorlcd/model_inputs.cpp index 054b05c34..44d5eb89b 100644 --- a/radio/src/gui/colorlcd/model_inputs.cpp +++ b/radio/src/gui/colorlcd/model_inputs.cpp @@ -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 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(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; inputchn == 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()); } diff --git a/radio/src/gui/colorlcd/model_inputs.h b/radio/src/gui/colorlcd/model_inputs.h index f1c0b9b3c..3e931c925 100644 --- a/radio/src/gui/colorlcd/model_inputs.h +++ b/radio/src/gui/colorlcd/model_inputs.h @@ -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) { diff --git a/radio/src/gui/colorlcd/model_logical_switches.cpp b/radio/src/gui/colorlcd/model_logical_switches.cpp index 36694b5f6..7d524e44e 100644 --- a/radio/src/gui/colorlcd/model_logical_switches.cpp +++ b/radio/src/gui/colorlcd/model_logical_switches.cpp @@ -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()); } diff --git a/radio/src/gui/colorlcd/model_mixes.cpp b/radio/src/gui/colorlcd/model_mixes.cpp index 989fd139a..65d7d5f85 100644 --- a/radio/src/gui/colorlcd/model_mixes.cpp +++ b/radio/src/gui/colorlcd/model_mixes.cpp @@ -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()); } diff --git a/radio/src/gui/colorlcd/model_outputs.cpp b/radio/src/gui/colorlcd/model_outputs.cpp index 132285355..916580a31 100644 --- a/radio/src/gui/colorlcd/model_outputs.cpp +++ b/radio/src/gui/colorlcd/model_outputs.cpp @@ -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()); } diff --git a/radio/src/gui/colorlcd/model_setup.cpp b/radio/src/gui/colorlcd/model_setup.cpp index dcc097fcb..1d1f38239 100644 --- a/radio/src/gui/colorlcd/model_setup.cpp +++ b/radio/src/gui/colorlcd/model_setup.cpp @@ -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(i)); - SET_DIRTY(); - return bfSingleBitGet(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(i)); + SET_DIRTY(); + return bfSingleBitGet(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()); diff --git a/radio/src/gui/colorlcd/model_setup.h b/radio/src/gui/colorlcd/model_setup.h index 0e3abbaf6..94cfcfe30 100644 --- a/radio/src/gui/colorlcd/model_setup.h +++ b/radio/src/gui/colorlcd/model_setup.h @@ -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(); diff --git a/radio/src/gui/colorlcd/model_telemetry.cpp b/radio/src/gui/colorlcd/model_telemetry.cpp index 6ae4135d5..0f8db612b 100644 --- a/radio/src/gui/colorlcd/model_telemetry.cpp +++ b/radio/src/gui/colorlcd/model_telemetry.cpp @@ -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()); } diff --git a/radio/src/gui/colorlcd/page.cpp b/radio/src/gui/colorlcd/page.cpp index c41bcf24a..095120e69 100644 --- a/radio/src/gui/colorlcd/page.cpp +++ b/radio/src/gui/colorlcd/page.cpp @@ -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(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() diff --git a/radio/src/gui/colorlcd/page.h b/radio/src/gui/colorlcd/page.h index 03c714cf5..a7226ca17 100644 --- a/radio/src/gui/colorlcd/page.h +++ b/radio/src/gui/colorlcd/page.h @@ -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 diff --git a/radio/src/gui/colorlcd/radio_hardware.cpp b/radio/src/gui/colorlcd/radio_hardware.cpp index 694e07a83..211f20e47 100644 --- a/radio/src/gui/colorlcd/radio_hardware.cpp +++ b/radio/src/gui/colorlcd/radio_hardware.cpp @@ -169,6 +169,5 @@ void RadioHardwarePage::build(FormWindow * window) }); grid.nextLine(); - window->setLastField(); window->setInnerHeight(grid.getWindowHeight()); } diff --git a/radio/src/gui/colorlcd/radio_sdmanager.cpp b/radio/src/gui/colorlcd/radio_sdmanager.cpp index 1eb32e855..d5a6981ee 100644 --- a/radio/src/gui/colorlcd/radio_sdmanager.cpp +++ b/radio/src/gui/colorlcd/radio_sdmanager.cpp @@ -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())); } diff --git a/radio/src/gui/colorlcd/radio_setup.cpp b/radio/src/gui/colorlcd/radio_setup.cpp index 227ef1c3e..c42f3547d 100644 --- a/radio/src/gui/colorlcd/radio_setup.cpp +++ b/radio/src/gui/colorlcd/radio_setup.cpp @@ -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()); } \ No newline at end of file diff --git a/radio/src/gui/colorlcd/radio_tools.cpp b/radio/src/gui/colorlcd/radio_tools.cpp index 5b337e50d..066cc1456 100644 --- a/radio/src/gui/colorlcd/radio_tools.cpp +++ b/radio/src/gui/colorlcd/radio_tools.cpp @@ -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; diff --git a/radio/src/gui/colorlcd/radio_trainer.cpp b/radio/src/gui/colorlcd/radio_trainer.cpp index 3d2a12f20..10a516949 100644 --- a/radio/src/gui/colorlcd/radio_trainer.cpp +++ b/radio/src/gui/colorlcd/radio_trainer.cpp @@ -42,14 +42,10 @@ void RadioTrainerPage::build(FormWindow * window) for (uint8_t i=0; imode)); - 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); diff --git a/radio/src/gui/colorlcd/screen_setup.cpp b/radio/src/gui/colorlcd/screen_setup.cpp index ea784e423..0429a9f5f 100644 --- a/radio/src/gui/colorlcd/screen_setup.cpp +++ b/radio/src/gui/colorlcd/screen_setup.cpp @@ -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); } diff --git a/radio/src/gui/colorlcd/screen_setup.h b/radio/src/gui/colorlcd/screen_setup.h index f37757391..b7f4d51b9 100644 --- a/radio/src/gui/colorlcd/screen_setup.h +++ b/radio/src/gui/colorlcd/screen_setup.h @@ -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; diff --git a/radio/src/gui/colorlcd/special_functions.cpp b/radio/src/gui/colorlcd/special_functions.cpp index 47637aee0..bceeffef4 100644 --- a/radio/src/gui/colorlcd/special_functions.cpp +++ b/radio/src/gui/colorlcd/special_functions.cpp @@ -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()); } diff --git a/radio/src/gui/colorlcd/tabsgroup.cpp b/radio/src/gui/colorlcd/tabsgroup.cpp index 95813c445..ad115b9d0 100644 --- a/radio/src/gui/colorlcd/tabsgroup.cpp +++ b/radio/src/gui/colorlcd/tabsgroup.cpp @@ -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(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(); } diff --git a/radio/src/gui/colorlcd/tabsgroup.h b/radio/src/gui/colorlcd/tabsgroup.h index 8f36bd2bd..36f614171 100644 --- a/radio/src/gui/colorlcd/tabsgroup.h +++ b/radio/src/gui/colorlcd/tabsgroup.h @@ -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 { diff --git a/radio/src/gui/colorlcd/view_main.cpp b/radio/src/gui/colorlcd/view_main.cpp index 8c6821da8..7922b588c 100644 --- a/radio/src/gui/colorlcd/view_main.cpp +++ b/radio/src/gui/colorlcd/view_main.cpp @@ -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; diff --git a/radio/src/gui/colorlcd/view_main.h b/radio/src/gui/colorlcd/view_main.h index aab82bc83..dc1227075 100644 --- a/radio/src/gui/colorlcd/view_main.h +++ b/radio/src/gui/colorlcd/view_main.h @@ -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); diff --git a/radio/src/gui/common/stdlcd/draw_functions.cpp b/radio/src/gui/common/stdlcd/draw_functions.cpp index cf96389db..63467dc20 100644 --- a/radio/src/gui/common/stdlcd/draw_functions.cpp +++ b/radio/src/gui/common/stdlcd/draw_functions.cpp @@ -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); diff --git a/radio/src/gui/common/stdlcd/menus.cpp b/radio/src/gui/common/stdlcd/menus.cpp index b3e2b6f59..46a59fb76 100644 --- a/radio/src/gui/common/stdlcd/menus.cpp +++ b/radio/src/gui/common/stdlcd/menus.cpp @@ -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; diff --git a/radio/src/gui/common/stdlcd/menus.h b/radio/src/gui/common/stdlcd/menus.h index 77745e349..1a9ed30a9 100644 --- a/radio/src/gui/common/stdlcd/menus.h +++ b/radio/src/gui/common/stdlcd/menus.h @@ -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); diff --git a/radio/src/gui/common/stdlcd/model_curves.cpp b/radio/src/gui/common/stdlcd/model_curves.cpp index dee4ecdf2..70a7ef68a 100644 --- a/radio/src/gui/common/stdlcd/model_curves.cpp +++ b/radio/src/gui/common/stdlcd/model_curves.cpp @@ -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) diff --git a/radio/src/gui/common/stdlcd/model_inputs.cpp b/radio/src/gui/common/stdlcd/model_inputs.cpp index edf245654..a00fb46b8 100644 --- a/radio/src/gui/common/stdlcd/model_inputs.cpp +++ b/radio/src/gui/common/stdlcd/model_inputs.cpp @@ -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) { diff --git a/radio/src/gui/common/stdlcd/radio_hardware.cpp b/radio/src/gui/common/stdlcd/radio_hardware.cpp index eb73fbd7a..e3a02fbc1 100644 --- a/radio/src/gui/common/stdlcd/radio_hardware.cpp +++ b/radio/src/gui/common/stdlcd/radio_hardware.cpp @@ -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); diff --git a/radio/src/gvars.h b/radio/src/gvars.h index ced4c528a..3988b8796 100644 --- a/radio/src/gvars.h +++ b/radio/src/gvars.h @@ -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 || xmax) || (x=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 || xmax) || (x 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) diff --git a/radio/src/lua/interface.cpp b/radio/src/lua/interface.cpp index 49e933cba..6bf3658d8 100644 --- a/radio/src/lua/interface.cpp +++ b/radio/src/lua/interface.cpp @@ -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); } } } diff --git a/radio/src/mixer.cpp b/radio/src/mixer.cpp index e5b4d25b6..11c19c9ee 100644 --- a/radio/src/mixer.cpp +++ b/radio/src/mixer.cpp @@ -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 =============== diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 2dd4c7f6e..4141f6987 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -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 */ diff --git a/radio/src/strhelpers.cpp b/radio/src/strhelpers.cpp index 2243db273..f6d6c7f00 100644 --- a/radio/src/strhelpers.cpp +++ b/radio/src/strhelpers.cpp @@ -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'; } diff --git a/radio/src/targets/common/arm/stm32/CMakeLists.txt b/radio/src/targets/common/arm/stm32/CMakeLists.txt index c050f9e94..e8d9e49af 100644 --- a/radio/src/targets/common/arm/stm32/CMakeLists.txt +++ b/radio/src/targets/common/arm/stm32/CMakeLists.txt @@ -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) diff --git a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt b/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt index 7488f21a7..36eefc6cd 100644 --- a/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt +++ b/radio/src/targets/common/arm/stm32/bootloader/CMakeLists.txt @@ -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 diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index 00d1ff616..a98da9d62 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -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) diff --git a/radio/src/targets/horus/libopenui_config.h b/radio/src/targets/horus/libopenui_config.h index d13c282d3..26f6ea973 100644 --- a/radio/src/targets/horus/libopenui_config.h +++ b/radio/src/targets/horus/libopenui_config.h @@ -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_ diff --git a/radio/src/targets/nv14/CMakeLists.txt b/radio/src/targets/nv14/CMakeLists.txt index a3ea73c28..e9948fa32 100644 --- a/radio/src/targets/nv14/CMakeLists.txt +++ b/radio/src/targets/nv14/CMakeLists.txt @@ -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) diff --git a/radio/src/targets/nv14/libopenui_config.h b/radio/src/targets/nv14/libopenui_config.h index cfa1f84ee..37ea83eef 100644 --- a/radio/src/targets/nv14/libopenui_config.h +++ b/radio/src/targets/nv14/libopenui_config.h @@ -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_ diff --git a/radio/src/targets/simu/CMakeLists.txt b/radio/src/targets/simu/CMakeLists.txt index c30f38c03..523d38c81 100644 --- a/radio/src/targets/simu/CMakeLists.txt +++ b/radio/src/targets/simu/CMakeLists.txt @@ -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) diff --git a/radio/src/targets/sky9x/CMakeLists.txt b/radio/src/targets/sky9x/CMakeLists.txt index 08b120ad8..f1081e5b1 100644 --- a/radio/src/targets/sky9x/CMakeLists.txt +++ b/radio/src/targets/sky9x/CMakeLists.txt @@ -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) diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index c3539e08b..08ff86af8 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -311,4 +311,4 @@ if(INTERNAL_MODULE_PXX1) add_definitions(-DINTERNAL_MODULE_PXX1) endif() -set(FIRMWARE_DEPENDENCIES ${FIRMWARE_DEPENDENCIES} ${BITMAPS_TARGET}) +set(RADIO_DEPENDENCIES ${RADIO_DEPENDENCIES} ${BITMAPS_TARGET}) diff --git a/radio/src/tests/CMakeLists.txt b/radio/src/tests/CMakeLists.txt index 316f7a16c..97516f0c3 100644 --- a/radio/src/tests/CMakeLists.txt +++ b/radio/src/tests/CMakeLists.txt @@ -5,9 +5,9 @@ if(GTEST_INCDIR AND GTEST_SRCDIR AND Qt5Widgets_FOUND) target_include_directories(gtests-radio-lib PUBLIC ${GTEST_INCDIR} ${GTEST_INCDIR}/gtest ${GTEST_SRCDIR}) add_definitions(-DSIMU -DGTESTS) remove_definitions(-DCLI) - set(TESTS_PATH ${RADIO_SRC_DIRECTORY}/tests) + set(TESTS_PATH ${RADIO_SRC_DIR}/tests) set(TESTS_BUILD_PATH ${CMAKE_CURRENT_BINARY_DIR}) - configure_file(${RADIO_SRC_DIRECTORY}/tests/location.h.in ${CMAKE_CURRENT_BINARY_DIR}/location.h @ONLY) + configure_file(${RADIO_SRC_DIR}/tests/location.h.in ${CMAKE_CURRENT_BINARY_DIR}/location.h @ONLY) include_directories(${CMAKE_CURRENT_BINARY_DIR}) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS_DEBUG} -O0") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_DEBUG} -O0 ${WARNING_FLAGS}") @@ -45,7 +45,7 @@ if(GTEST_INCDIR AND GTEST_SRCDIR AND Qt5Widgets_FOUND) set(RADIO_SRC ${RADIO_SRC} ../${FILE}) endforeach() - file(GLOB TEST_SRC_FILES ${RADIO_SRC_DIRECTORY}/tests/*.cpp) + file(GLOB TEST_SRC_FILES ${RADIO_SRC_DIR}/tests/*.cpp) if(MINGW) # struct packing breaks on MinGW w/out -mno-ms-bitfields: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52991 & http://stackoverflow.com/questions/24015852/struct-packing-and-alignment-with-mingw @@ -53,7 +53,7 @@ if(GTEST_INCDIR AND GTEST_SRCDIR AND Qt5Widgets_FOUND) endif() add_executable(gtests-radio EXCLUDE_FROM_ALL ${TEST_SRC_FILES} ${CMAKE_CURRENT_SOURCE_DIR}/location.h ${RADIO_SRC} ../targets/simu/simpgmspace.cpp ../targets/simu/simueeprom.cpp ../targets/simu/simufatfs.cpp) - add_dependencies(gtests-radio ${FIRMWARE_DEPENDENCIES} gtests-radio-lib) + add_dependencies(gtests-radio ${RADIO_DEPENDENCIES} gtests-radio-lib) if(PCB STREQUAL X12S OR PCB STREQUAL X10) add_dependencies(gtests-radio ${HORUS_MODEL_FILES}) endif() diff --git a/radio/src/thirdparty/libopenui b/radio/src/thirdparty/libopenui index 56d28bd1b..3951b5574 160000 --- a/radio/src/thirdparty/libopenui +++ b/radio/src/thirdparty/libopenui @@ -1 +1 @@ -Subproject commit 56d28bd1be2c24804c507dadd10a4fd2d5247c1f +Subproject commit 3951b557499ce1e1878f07e25a0708b94266f092 diff --git a/radio/src/translations/CMakeLists.txt b/radio/src/translations/CMakeLists.txt index 14dcb772a..5d7155a38 100644 --- a/radio/src/translations/CMakeLists.txt +++ b/radio/src/translations/CMakeLists.txt @@ -10,11 +10,11 @@ foreach(translation ${translations}) if(PYTHONINTERP_FOUND) add_custom_command( OUTPUT ${target} - COMMAND ${PYTHON_EXECUTABLE} ${TOOLS_DIRECTORY}/encode-translation.py ${translation} ${target} ${language} - DEPENDS ${translation} ${TOOLS_DIRECTORY}/encode-translation.py ${TOOLS_DIRECTORY}/charset.py + COMMAND ${PYTHON_EXECUTABLE} ${TOOLS_DIR}/encode-translation.py ${translation} ${target} ${language} + DEPENDS ${translation} ${TOOLS_DIR}/encode-translation.py ${TOOLS_DIR}/charset.py ) endif() list(APPEND translations_files ${target}) endforeach() -add_custom_target(firmware_translations DEPENDS ${translations_files}) +add_custom_target(radio_translations DEPENDS ${translations_files}) diff --git a/radio/src/translations/untranslated.h b/radio/src/translations/untranslated.h index 8b85a1df6..61c8540f7 100644 --- a/radio/src/translations/untranslated.h +++ b/radio/src/translations/untranslated.h @@ -30,41 +30,41 @@ #if defined(PCBX12S) - #define TR_POTS_VSRCRAW "\310S1\0""\3106P\0""\310S2\0""\313L1\0""\313L2\0""\311LS\0""\311RS\0""\310JSx""\310JSy" - #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0""\312SI\0""\312SJ\0" + #define TR_POTS_VSRCRAW "\210S1\0""\2106P\0""\210S2\0""\213L1\0""\213L2\0""\211LS\0""\211RS\0""\210JSx""\210JSy" + #define TR_SW_VSRCRAW "\212SA\0""\212SB\0""\212SC\0""\212SD\0""\212SE\0""\212SF\0""\212SG\0""\212SH\0""\212SI\0""\212SJ\0" #elif defined(PCBX10) - #define TR_POTS_VSRCRAW "\310S1\0""\3106P\0""\310S2\0""\310EX1""\310EX2""\311LS\0""\311RS\0""\310JSx""\310JSy" - #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0""\312SI\0""\312SJ\0" + #define TR_POTS_VSRCRAW "\210S1\0""\2106P\0""\210S2\0""\210EX1""\210EX2""\211LS\0""\211RS\0""\210JSx""\210JSy" + #define TR_SW_VSRCRAW "\212SA\0""\212SB\0""\212SC\0""\212SD\0""\212SE\0""\212SF\0""\212SG\0""\212SH\0""\212SI\0""\212SJ\0" #elif defined(PCBX9E) - #define TR_POTS_VSRCRAW "\310F1\0""\310F2\0""\310F3\0""\310F4\0""\311S1\0""\311S2\0""\311LS\0""\311RS\0" - #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0""\312SI\0""\312SJ\0""\312SK\0""\312SL\0""\312SM\0""\312SN\0""\312SO\0""\312SP\0""\312SQ\0""\312SR\0" + #define TR_POTS_VSRCRAW "\210F1\0""\210F2\0""\210F3\0""\210F4\0""\211S1\0""\211S2\0""\211LS\0""\211RS\0" + #define TR_SW_VSRCRAW "\212SA\0""\212SB\0""\212SC\0""\212SD\0""\212SE\0""\212SF\0""\212SG\0""\212SH\0""\212SI\0""\212SJ\0""\212SK\0""\212SL\0""\212SM\0""\212SN\0""\212SO\0""\212SP\0""\212SQ\0""\212SR\0" #elif defined(PCBXLITES) - #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" - #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0" + #define TR_POTS_VSRCRAW "\210S1\0""\210S2\0" + #define TR_SW_VSRCRAW "\212SA\0""\212SB\0""\212SC\0""\212SD\0""\212SE\0""\212SF\0" #elif defined(PCBXLITE) - #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" - #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0" + #define TR_POTS_VSRCRAW "\210S1\0""\210S2\0" + #define TR_SW_VSRCRAW "\212SA\0""\212SB\0""\212SC\0""\212SD\0" #elif defined(RADIO_X7) - #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" - #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SF\0""\312SH\0""\312SI\0""\312SJ\0" + #define TR_POTS_VSRCRAW "\210S1\0""\210S2\0" + #define TR_SW_VSRCRAW "\212SA\0""\212SB\0""\212SC\0""\212SD\0""\212SF\0""\212SH\0""\212SI\0""\212SJ\0" #elif defined(RADIO_T12) - #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" - #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SG\0""\312SH\0""\312SI\0""\312SJ\0" + #define TR_POTS_VSRCRAW "\210S1\0""\210S2\0" + #define TR_SW_VSRCRAW "\212SA\0""\212SB\0""\212SC\0""\212SD\0""\212SG\0""\212SH\0""\212SI\0""\212SJ\0" #elif defined(PCBX9LITE) - #define TR_POTS_VSRCRAW "\310S1\0" - #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0" + #define TR_POTS_VSRCRAW "\210S1\0" + #define TR_SW_VSRCRAW "\212SA\0""\212SB\0""\212SC\0""\212SD\0""\212SE\0" #elif defined(PCBX9DP) && PCBREV >= 2019 - #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0""\310S3\0""\311LS\0""\311RS\0" - #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0""\312SI\0" + #define TR_POTS_VSRCRAW "\210S1\0""\210S2\0""\210S3\0""\211LS\0""\211RS\0" + #define TR_SW_VSRCRAW "\212SA\0""\212SB\0""\212SC\0""\212SD\0""\212SE\0""\212SF\0""\212SG\0""\212SH\0""\212SI\0" #elif defined(PCBTARANIS) - #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0""\310S3\0""\311LS\0""\311RS\0" - #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0" + #define TR_POTS_VSRCRAW "\210S1\0""\210S2\0""\210S3\0""\211LS\0""\211RS\0" + #define TR_SW_VSRCRAW "\212SA\0""\212SB\0""\212SC\0""\212SD\0""\212SE\0""\212SF\0""\212SG\0""\212SH\0" #elif defined(PCBSKY9X) #define TR_POTS_VSRCRAW "P1\0 ""P2\0 ""P3\0 " #define TR_SW_VSRCRAW "3POS" "THR\0""RUD\0""ELE\0""AIL\0""GEA\0""TRN\0" #elif defined(PCBNV14) - #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" - #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0" + #define TR_POTS_VSRCRAW "\210S1\0""\210S2\0" + #define TR_SW_VSRCRAW "\212SA\0""\212SB\0""\212SC\0""\212SD\0""\212SE\0""\212SF\0""\212SG\0""\212SH\0" #endif #if defined(PCBFRSKY) || defined(PCBFLYSKY) diff --git a/radio/util/img2lbm.py b/radio/util/img2lbm.py deleted file mode 100755 index d526a01d3..000000000 --- a/radio/util/img2lbm.py +++ /dev/null @@ -1,275 +0,0 @@ -#!/usr/bin/env python - -from __future__ import division, print_function - -import sys -import os.path -from PIL import Image - - -class RLE_encoder: - RLE_BYTE = 0 - RLE_SEQ = 1 - - def __init__(self, out): - self.state = self.RLE_BYTE - self.count = 0 - self.prev_byte = None - self.out = out - - def eq_prev_byte(self, in_byte): - if self.prev_byte is None: - return False - return in_byte == self.prev_byte - - def encode_byte(self, in_byte): - if self.state == self.RLE_BYTE: - self.out(in_byte) - if self.eq_prev_byte(in_byte): - self.state = self.RLE_SEQ - self.count = 0 - else: - self.prev_byte = in_byte - - elif self.state == self.RLE_SEQ: - if self.eq_prev_byte(in_byte): - self.count += 1 - if self.count == 255: - self.out(self.count) - self.prev_byte = None - self.state = self.RLE_BYTE - else: - self.out(self.count) - self.out(in_byte) - self.prev_byte = in_byte - self.state = self.RLE_BYTE - - def encode_end(self): - if self.state == self.RLE_SEQ: - self.out(self.count) - - -class DummyEncoder: - def __init__(self, out): - self.out = out - - def encode_byte(self, in_byte): - self.out(in_byte) - - def encode_end(self): - pass - - -def write_size(f, width, height): - if lcd_width > 255: - f.write("%d,%d,%d,%d,\n" % (width % 256, width // 256, height % 256, height // 256)) - else: - f.write("%d,%d,\n" % (width, height)) - - -def F_writeValue(f): - def writeValue(value): - f.write("0x%02x," % value) - return writeValue - - -def F_getPixelCoord(): - def getCoord(x, y): - return x, y - return getCoord - - -def F_getPixelCoord_R(w, h): - def getCoord(x, y): - return w-x-1, h-y-1 - return getCoord - - -def main(): - global lcd_width - - image = Image.open(sys.argv[1]) - width, height = image.size - - image_fmt = image.format - output_filename = sys.argv[2] - - with open(output_filename, "w") as f: - lcd_width = int(sys.argv[3]) - - if len(sys.argv) > 4: - s = sys.argv[4].split('-') - what = s[0] - pixel_coord = F_getPixelCoord() - if (len(s) > 1) and (s[1] == 'R'): - pixel_coord = F_getPixelCoord_R(width,height) - else: - for s in ("03x05", "04x06", "05x07", "08x10", "10x14", "22x38"): - if s in sys.argv[2]: - what = s - break - - extension = os.path.splitext(output_filename)[1] - out = F_writeValue(f) - - if extension == ".rle" or ((len(sys.argv) > 5) and (sys.argv[5] == "rle")): - encoder = RLE_encoder(out) - else: - encoder = DummyEncoder(out) - - if what == "1bit": - rows = 1 - if len(sys.argv) > 5: - rows = int(sys.argv[5]) - image = image.convert(mode='1') - write_size(f, width, height // rows) - for y in range(0, height, 8): - for x in range(width): - value = 0 - for z in range(8): - if y + z < height: - if image_fmt == 'XBM': - if image.getpixel((x, y + z)) > 0: - value += 1 << z - else: - if image.getpixel((x, y + z)) == 0: - value += 1 << z - encoder.encode_byte(value) - f.write("\n") - encoder.encode_end() - elif what == "4bits": - colors = [] - write_size(f, width, height) - image = image.convert(mode='L') - for y in range(0, height, 2): - for x in range(width): - value = 0xFF - gray1 = image.getpixel((x, y)) - if y + 1 < height: - gray2 = image.getpixel((x, y + 1)) - else: - gray2 = 255 - for i in range(4): - if gray1 & (1 << (4 + i)): - value -= 1 << i - if gray2 & (1 << (4 + i)): - value -= 1 << (4 + i) - encoder.encode_byte(value) - f.write("\n") - encoder.encode_end() - elif what == "8bits": - colors = [] - write_size(f, width, height) - image = image.convert(mode='L') - for y in range(height): - for x in range(width): - value = image.getpixel((x, y)) - value = 0x0f - (value >> 4) - encoder.encode_byte(value) - f.write("\n") - encoder.encode_end() - elif what == "4/4/4/4": - constant = sys.argv[2].upper()[:-4] - values = [] - write_size(f, width, height) - for y in range(height): - for x in range(width): - pixel = image.getpixel(pixel_coord(x, y)) - val = ((pixel[3] // 16) << 12) + ((pixel[0] // 16) << 8) + ((pixel[1] // 16) << 4) + ((pixel[2] // 16) << 0) - encoder.encode_byte(val & 255) - encoder.encode_byte(val >> 8) - encoder.encode_end() - # f.write("\n};\n") - # if extension != ".rle": - # f.write("const Bitmap %s(BMP_ARGB4444, %d, %d, (uint16_t*)__%s);\n" % (constant, width, height, constant)) - elif what == "5/6/5": - constant = sys.argv[2].upper()[:-4] - values = [] - write_size(f, width, height) - for y in range(height): - for x in range(width): - pixel = image.getpixel(pixel_coord(x, y)) - val = ((pixel[0] >> 3) << 11) + ((pixel[1] >> 2) << 5) + ((pixel[2] >> 3) << 0) - encoder.encode_byte(val & 255) - encoder.encode_byte(val >> 8) - encoder.encode_end() - #f.write("\n};\n") - #if extension != ".rle": - # f.write("const Bitmap %s(BMP_RGB565, %d, %d, (uint16_t*)__%s);\n" % (constant, width, height, constant)) - elif what == "03x05": - image = image.convert(mode='L') - for y in range(0, height, 5): - for x in range(width): - value = 0 - for z in range(5): - if image.getpixel((x, y + z)) == 0: - value += 1 << z - f.write("0x%02x," % value) - f.write("\n") - elif what == "04x06": - image = image.convert(mode='L') - for y in range(0, height, 7): - for x in range(width): - value = 0 - for z in range(7): - if image.getpixel((x, y + z)) == 0: - value += 1 << z - if value == 0x7f: - value = 0xff - f.write("0x%02x," % value) - f.write("\n") - elif what == "05x07": - image = image.convert(mode='L') - for y in range(0, height, 8): - for x in range(width): - value = 0 - for z in range(8): - if image.getpixel((x, y + z)) == 0: - value += 1 << z - f.write("0x%02x," % value) - f.write("\n") - elif what == "08x10": - image = image.convert(mode='L') - for y in range(0, height, 12): - for x in range(width): - skip = True - for l in range(0, 12, 8): - value = 0 - for z in range(8): - if l + z < 12: - if image.getpixel((x, y + l + z)) == 0: - value += 1 << z - else: - skip = False - if skip and l == 8: - value = 0xff - f.write("0x%02x," % value) - f.write("\n") - elif what == "10x14": - image = image.convert(mode='L') - for y in range(0, height, 16): - for x in range(width): - for l in range(0, 16, 8): - value = 0 - for z in range(8): - if image.getpixel((x, y + l + z)) == 0: - value += 1 << z - f.write("0x%02x," % value) - f.write("\n") - elif what == "22x38": - image = image.convert(mode='L') - for y in range(0, height, 40): - for x in range(width): - for l in range(0, 40, 8): - value = 0 - for z in range(8): - if image.getpixel((x, y + l + z)) == 0: - value += 1 << z - f.write("0x%02x," % value) - f.write("\n") - else: - print("wrong argument", sys.argv[4]) - - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/tools/build-font-bitmap.py b/tools/build-font-bitmap.py index 2adcc3dca..44976daac 100755 --- a/tools/build-font-bitmap.py +++ b/tools/build-font-bitmap.py @@ -8,20 +8,20 @@ from charset import get_chars, special_chars, extra_chars class FontBitmap: - def __init__(self, chars, font_size, font_name, cn_font_name, foreground, background): + def __init__(self, chars, font_size, font_name, cjk_font_name, foreground, background): self.chars = chars self.font_size = font_size self.foreground = foreground self.background = background - self.font, self.font_offset = self.load_font(font_name) - self.cn_font, self.cn_font_offset = self.load_font(cn_font_name) + self.cjk_font, self.cjk_font_offset = self.load_font(cjk_font_name) self.extra_bitmap = self.load_extra_bitmap() def load_extra_bitmap(self): try: - extra_filename = 'fonts/extra_%dpx.png' % self.font_size - extra_image = Image.open(extra_filename) + tools_path = os.path.dirname(os.path.realpath(__file__)) + path = os.path.join(tools_path, "../radio/src/fonts", "extra_%dpx.png" % self.font_size) + extra_image = Image.open(path) return extra_image.convert('RGB') except IOError: return None @@ -30,9 +30,11 @@ class FontBitmap: # print(font_name) font_name, font_offset = font_name.split(":") for ext in (".ttf", ".otf"): - path = 'fonts/' + font_name + ext + tools_path = os.path.dirname(os.path.realpath(__file__)) + path = os.path.join(tools_path, "../radio/src/fonts", font_name + ext) if os.path.exists(path): return ImageFont.truetype(path, self.font_size), int(font_offset) + print("Font file %s not found" % font_name) def get_char_width(self, c): if c in extra_chars: @@ -48,7 +50,7 @@ class FontBitmap: elif c == " ": return 4 elif c in special_chars["cn"]: - w, h = self.cn_font.getsize(c) + w, h = self.cjk_font.getsize(c) return w + 1 else: w, h = self.font.getsize(c) @@ -80,9 +82,11 @@ class FontBitmap: elif c == " ": pass elif c in special_chars["cn"]: - draw.text((width + 1, self.cn_font_offset), c, fill=self.foreground, font=self.cn_font) + offset = self.cjk_font.getoffset(c)[0] + draw.text((width - offset, self.cjk_font_offset), c, fill=self.foreground, font=self.cjk_font) else: - draw.text((width + 1, self.font_offset), c, fill=self.foreground, font=self.font) + offset = self.font.getoffset(c)[0] + draw.text((width - offset, self.font_offset), c, fill=self.foreground, font=self.font) width += self.get_char_width(c) @@ -100,10 +104,10 @@ def main(): parser.add_argument('--subset', help="Subset", default="all") parser.add_argument('--size', type=int, help="Font size") parser.add_argument('--font', help="Font name") - parser.add_argument('--cn-font', help="Chinese font name") + parser.add_argument('--cjk-font', help="CJK font name") args = parser.parse_args() - font = FontBitmap(get_chars(args.subset), args.size, args.font, args.cn_font, (0, 0, 0), (255, 255, 255)) + font = FontBitmap(get_chars(args.subset), args.size, args.font, args.cjk_font, (0, 0, 0), (255, 255, 255)) font.generate(args.output) diff --git a/tools/encode-font.py b/tools/encode-font.py new file mode 100755 index 000000000..f5758bc43 --- /dev/null +++ b/tools/encode-font.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python + + +import sys +import argparse +from PIL import Image + + +class FontEncoder: + def __init__(self, filename): + self.f = open(filename, "w") + + def write(self, value): + self.f.write("0x%02x," % value) + # + # def write_size(self, width, height): + # self.f.write("%d,%d,\n" % (width, height)) + + def encode(self, image, step): + image = image.convert(mode='L') + width, height = image.size + for y in range(0, height, step): + for x in range(width): + for l in range(0, step, 8): + value = 0 + for z in range(min(8, step)): + # print(y + l + z) + if image.getpixel((x, y + l + z)) == 0: + value += 1 << z + if step < 8 and value == 0x7f: + value = 0xff + self.write(value) + # self.f.write("\n") + + def encode_special(self, image, step): + image = image.convert(mode='L') + width, height = image.size + for y in range(0, height, step): + for x in range(width): + skip = True + for l in range(0, step, 8): + value = 0 + for z in range(min(8, step)): + if l + z < 12: + if image.getpixel((x, y + l + z)) == 0: + value += 1 << z + else: + skip = False + if skip and l == 8: + value = 0xff + self.write(value) + + +def main(): + parser = argparse.ArgumentParser(description='Fonts encoder') + parser.add_argument('input', action="store", help="Input file name") + parser.add_argument('output', action="store", help="Output file name") + args = parser.parse_args() + + image = Image.open(args.input) + output = args.output + + for s in ("03x05", "04x06", "05x07", "08x10", "10x14", "22x38"): + if s in args.input: + size = s + break + + encoder = FontEncoder(output) + + if size == "03x05": + encoder.encode(image, 5) + elif size == "04x06": + encoder.encode(image, 7) + elif size == "05x07": + encoder.encode(image, 8) + elif size == "08x10": + encoder.encode_special(image, 12) + elif size == "10x14": + encoder.encode(image, 16) + elif size == "22x38": + encoder.encode(image, 40) + else: + print("Unknown size", sys.argv[4]) + + +if __name__ == "__main__": + main()