diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index eb3750447..a8c38ff42 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -1345,12 +1345,11 @@ void registerOpenTxFirmwares() registerOpenTxFirmware(firmware); addOpenTxRfOptions(firmware, FLEX); - // TX16S is unavailable until finalized - /* Radiomaster TX16S board + /* Radiomaster TX16S board */ firmware = new OpenTxFirmware("opentx-tx16s", Firmware::tr("Radiomaster TX16s / TX16s Hall / TX16s Masterfire"), BOARD_RADIOMASTER_TX16S); addOpenTxFrskyOptions(firmware); firmware->addOption("bluetooth", Firmware::tr("Support for bluetooth module")); - registerOpenTxFirmware(firmware);*/ + registerOpenTxFirmware(firmware); /* 9XR-Pro */ firmware = new OpenTxFirmware("opentx-9xrpro", Firmware::tr("Turnigy 9XR-PRO"), BOARD_9XRPRO); diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 20852450c..989457f92 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -359,6 +359,13 @@ endif() add_definitions(-DPOPUP_LEVEL=${POPUP_LEVEL}) +if(INTERNAL_MODULE_MULTI) + set(DEFAULT_TEMPLATE_SETUP 21 CACHE STRING "") +else() + set(DEFAULT_TEMPLATE_SETUP 0 CACHE STRING "") +endif() +add_definitions(-DDEFAULT_TEMPLATE_SETUP=${DEFAULT_TEMPLATE_SETUP}) + set(SRC ${SRC} opentx.cpp @@ -418,7 +425,6 @@ endif() set(SRC ${SRC} ${FIRMWARE_SRC}) - ##### firmware target ##### option(FIRMWARE_TARGET "Configure Firmware target (can be turned of for compiling Companion only)" ON) diff --git a/radio/src/gui/480x272/lcd.cpp b/radio/src/gui/480x272/lcd.cpp index bad85fbc5..34e8831d8 100644 --- a/radio/src/gui/480x272/lcd.cpp +++ b/radio/src/gui/480x272/lcd.cpp @@ -422,7 +422,11 @@ void lcdDrawPoint(coord_t x, coord_t y, LcdFlags att) { display_t * p = PIXEL_PTR(x, y); display_t color = lcdColorTable[COLOR_IDX(att)]; +#if defined(PCBX10) + if (p >= displayBuf && x < LCD_W) { // x10 screen is reversed, so overflow are happening the other way around +#else if (p < DISPLAY_END) { +#endif *p = color; } } diff --git a/radio/src/gui/480x272/radio_diaganas.cpp b/radio/src/gui/480x272/radio_diaganas.cpp index 88f82d748..ae452f7ae 100644 --- a/radio/src/gui/480x272/radio_diaganas.cpp +++ b/radio/src/gui/480x272/radio_diaganas.cpp @@ -19,6 +19,10 @@ */ #include "opentx.h" +#if defined(RADIO_TX16S) +#include "tp_gt911.h" +#include +#endif constexpr coord_t LEFT_NAME_COLUMN = MENUS_MARGIN_LEFT; constexpr coord_t RIGHT_NAME_COLUMN = LCD_W / 2; @@ -28,6 +32,16 @@ bool menuRadioDiagAnalogs(event_t event) { SIMPLE_SUBMENU(STR_MENU_RADIO_ANALOGS, ICON_MODEL_SETUP, 0); +#if defined(HARDWARE_TOUCH) + if (event == EVT_ENTRY || event == EVT_ENTRY_UP) { + touchPanelInit(); + } + else if (menuEvent) { + touchPanelDeInit(); + return false; + } +#endif + for (uint8_t i = 0; i < NUM_ANALOGS; i++) { coord_t y = MENU_HEADER_HEIGHT + 1 + (i / 2) * FH; uint8_t x = i & 1 ? LCD_W / 2 + 10 : LEFT_NAME_COLUMN; @@ -48,9 +62,24 @@ bool menuRadioDiagAnalogs(event_t event) #endif } -#if (NUM_PWMSTICKS > 0) && !defined(SIMU) +#if defined(SIMU) || NUM_PWMSTICKS > 0 lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + 8 * FH, STICKS_PWM_ENABLED() ? "Sticks: PWM" : "Sticks: ANA"); #endif +#if defined(HARDWARE_TOUCH) + if (HAS_TOUCH_PANEL()) { + lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + 7 * FH, STR_TOUCH_PANEL); + } + + if (touchPanelEvent) { + touchPanelRead(); + lcdDrawNumber(lcdNextPos + 1, MENU_CONTENT_TOP + 7 * FH, touchState.x); + lcdDrawText(lcdNextPos, MENU_CONTENT_TOP + 7 * FH, ", "); + lcdDrawNumber(lcdNextPos + 1, MENU_CONTENT_TOP + 7 * FH, touchState.y); + lcdDrawLine(touchState.x - 10, touchState.y - 8, touchState.x + 10, touchState.y + 8, SOLID); + lcdDrawLine(touchState.x - 10, touchState.y + 8, touchState.x + 10, touchState.y - 8, SOLID); + } +#endif + return true; } diff --git a/radio/src/gui/480x272/themes/darkblue.cpp b/radio/src/gui/480x272/themes/darkblue.cpp index 0b8e21306..05a8b2e1f 100644 --- a/radio/src/gui/480x272/themes/darkblue.cpp +++ b/radio/src/gui/480x272/themes/darkblue.cpp @@ -51,7 +51,7 @@ class DarkblueTheme: public Theme lcdColorTable[TRIM_BGCOLOR_INDEX] = RGB(32, 34, 42); lcdColorTable[TRIM_SHADOW_COLOR_INDEX] = RGB(100, 100, 100); lcdColorTable[MAINVIEW_PANES_COLOR_INDEX] = GREY; - lcdColorTable[MAINVIEW_GRAPHICS_COLOR_INDEX] = WHITE; + lcdColorTable[MAINVIEW_GRAPHICS_COLOR_INDEX] = BLUE; lcdColorTable[HEADER_BGCOLOR_INDEX] = BLACK; lcdColorTable[HEADER_ICON_BGCOLOR_INDEX] = BLACK; lcdColorTable[HEADER_CURRENT_BGCOLOR_INDEX] = RGB(10, 78, 121); @@ -266,4 +266,7 @@ class DarkblueTheme: public Theme BitmapBuffer * DarkblueTheme::menuIconNormal[MENUS_ICONS_COUNT] = { NULL }; BitmapBuffer * DarkblueTheme::menuIconSelected[MENUS_ICONS_COUNT] = { NULL }; -const DarkblueTheme darkblueTheme; +DarkblueTheme darkblueTheme; +#if defined(DEFAULT_THEME_DARKBLUE) + Theme * theme = &darkblueTheme; +#endif \ No newline at end of file diff --git a/radio/src/gui/480x272/themes/default.cpp b/radio/src/gui/480x272/themes/default.cpp index 5ecd5bfbd..b90ccd1a2 100644 --- a/radio/src/gui/480x272/themes/default.cpp +++ b/radio/src/gui/480x272/themes/default.cpp @@ -353,4 +353,6 @@ BitmapBuffer * DefaultTheme::menuIconSelected[MENUS_ICONS_COUNT] = { NULL }; BitmapBuffer * DefaultTheme::currentMenuBackground = NULL; DefaultTheme defaultTheme; -Theme * theme = &defaultTheme; +#if defined(DEFAULT_THEME_DEFAULT) + Theme * theme = &defaultTheme; +#endif diff --git a/radio/src/gui/480x272/topbar.cpp b/radio/src/gui/480x272/topbar.cpp index 487e70a9b..81b1f643a 100644 --- a/radio/src/gui/480x272/topbar.cpp +++ b/radio/src/gui/480x272/topbar.cpp @@ -91,15 +91,18 @@ void drawTopBar() /* Tx battery */ uint8_t bars = GET_TXBATT_BARS(5); #if defined(USB_CHARGER) - if(usbChargerLed()) + if (usbChargerLed() && BLINK_ON_PHASE) { lcdDrawBitmapPattern(LCD_W-130, 24, LBM_TOPMENU_TXBATT_CHARGING, MENU_TITLE_COLOR); - else -#endif - lcdDrawBitmapPattern(LCD_W-130, 24, LBM_TOPMENU_TXBATT, MENU_TITLE_COLOR); - for (unsigned int i = 0; i < 5; i++) { - lcdDrawSolidFilledRect(LCD_W-122+4*i, 30, 2, 8, i >= bars ? MENU_TITLE_DISABLE_COLOR : MENU_TITLE_COLOR); } - + else { +#endif + lcdDrawBitmapPattern(LCD_W - 130, 24, LBM_TOPMENU_TXBATT, MENU_TITLE_COLOR); + for (unsigned int i = 0; i < 5; i++) { + lcdDrawSolidFilledRect(LCD_W - 122 + 4 * i, 30, 2, 8, i >= bars ? MENU_TITLE_DISABLE_COLOR : MENU_TITLE_COLOR); + } +#if defined(USB_CHARGER) + } +#endif topbar->refresh(); #if 0 diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index 07a093fdf..1ae1a45cc 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -739,12 +739,12 @@ bool isTrainerModeAvailable(int mode) return g_eeGeneral.auxSerialMode == UART_MODE_SBUS_TRAINER; #endif -#if defined(PCBX9E) - if (mode == TRAINER_MODE_MASTER_BLUETOOTH || mode == TRAINER_MODE_SLAVE_BLUETOOTH) - return false; -#elif defined(BLUETOOTH) +#if defined(BLUETOOTH) && !defined(PCBX9E) if (g_eeGeneral.bluetoothMode != BLUETOOTH_TRAINER && (mode == TRAINER_MODE_MASTER_BLUETOOTH || mode == TRAINER_MODE_SLAVE_BLUETOOTH)) return false; +#elif !defined(PCBSKY9X) + if (mode == TRAINER_MODE_MASTER_BLUETOOTH || mode == TRAINER_MODE_SLAVE_BLUETOOTH) + return false; #endif #if defined(PCBXLITE) && !defined(PCBXLITES) diff --git a/radio/src/gui/navigation/navigation_horus.cpp b/radio/src/gui/navigation/navigation_horus.cpp index b8729c8a3..d62d07810 100644 --- a/radio/src/gui/navigation/navigation_horus.cpp +++ b/radio/src/gui/navigation/navigation_horus.cpp @@ -316,9 +316,9 @@ bool check(event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, uint8_t if (menuTab && !menuCalibrationState) { int cc = curr; switch (event) { -#if defined(PCBX12S) +#if defined(KEYS_GPIO_REG_PGUP) case EVT_KEY_FIRST(KEY_PGDN): -#elif defined(PCBX10) +#else case EVT_KEY_BREAK(KEY_PGDN): #endif if (s_editMode>0) @@ -328,8 +328,9 @@ bool check(event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, uint8_t cc = 0; break; +#if defined(KEYS_GPIO_REG_PGUP) case EVT_KEY_FIRST(KEY_PGUP): -#if defined(PCBX10) +#else case EVT_KEY_LONG(KEY_PGDN): #endif if (s_editMode>0) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index ea70e0b7b..eeb2d2ef2 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -293,9 +293,7 @@ void generalDefault() g_eeGeneral.stickMode = DEFAULT_MODE - 1; #endif -#if defined(FRSKY_RELEASE) - g_eeGeneral.templateSetup = 17; /* TAER */ -#endif + g_eeGeneral.templateSetup = DEFAULT_TEMPLATE_SETUP; g_eeGeneral.backlightMode = e_backlight_mode_all; g_eeGeneral.lightAutoOff = 2; diff --git a/radio/src/targets/common/arm/stm32/adc_driver.cpp b/radio/src/targets/common/arm/stm32/adc_driver.cpp index 3972ab86c..6360b9676 100644 --- a/radio/src/targets/common/arm/stm32/adc_driver.cpp +++ b/radio/src/targets/common/arm/stm32/adc_driver.cpp @@ -25,7 +25,7 @@ #elif defined(RADIO_T16) const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, 1,1,1, -1,1, -1,1}; #elif defined(RADIO_TX16S) - const int8_t adcDirection[NUM_ANALOGS] = {-1,1,-1,1, 1,1,1, -1,1, -1,1}; + const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, 1,1,1, -1,1, -1,1}; #elif defined(PCBX10) const int8_t adcDirection[NUM_ANALOGS] = {1,-1,1,-1, -1,1,-1, 1,1, 1, -1}; #elif defined(PCBX9E) diff --git a/radio/src/targets/horus/CMakeLists.txt b/radio/src/targets/horus/CMakeLists.txt index 601d82dfb..a02abfa12 100644 --- a/radio/src/targets/horus/CMakeLists.txt +++ b/radio/src/targets/horus/CMakeLists.txt @@ -61,10 +61,12 @@ if (PCB STREQUAL X10) add_definitions(-DRADIO_FAMILY_T16) option(INTERNAL_MODULE_MULTI "Support for MULTI internal module" ON) option(BLUETOOTH "Support for bluetooth module" OFF) + set(HARDWARE_TOUCH YES) + set(USB_CHARGER YES) + set(DEFAULT_THEME "DARKBLUE") if (NOT BLUETOOTH) set(AUX_SERIAL ON) endif() - set(USB_CHARGER YES) else() set(FLAVOUR x10) option(INTERNAL_MODULE_PXX1 "Support for PXX1 internal module" ON) @@ -114,6 +116,12 @@ add_definitions(-DEEPROM_VARIANT=0 -DAUDIO -DVOICE -DRTCLOCK) add_definitions(-DGPS_USART_BAUDRATE=${INTERNAL_GPS_BAUDRATE}) add_definitions(-DPWR_BUTTON_${PWR_BUTTON}) +if(DEFAULT_THEME) + add_definitions(-DDEFAULT_THEME_${DEFAULT_THEME}) +else() + add_definitions(-DDEFAULT_THEME_DEFAULT) +endif() + if(NOT UNEXPECTED_SHUTDOWN) add_definitions(-DNO_UNEXPECTED_SHUTDOWN) endif() @@ -207,6 +215,13 @@ set(TARGET_SRC ../common/arm/stm32/rotary_encoder_driver.cpp ) +if(HARDWARE_TOUCH) + set(TARGET_SRC ${TARGET_SRC} + tp_gt911.cpp + ) + add_definitions(-DHARDWARE_TOUCH) +endif() + if(USB_CHARGER) set(TARGET_SRC ${TARGET_SRC} usb_charger_driver.cpp) add_definitions(-DUSB_CHARGER) diff --git a/radio/src/targets/horus/board.cpp b/radio/src/targets/horus/board.cpp index 61a429a70..15b14ac2f 100644 --- a/radio/src/targets/horus/board.cpp +++ b/radio/src/targets/horus/board.cpp @@ -103,9 +103,11 @@ void boardInit() HAPTIC_RCC_AHB1Periph | INTMODULE_RCC_AHB1Periph | EXTMODULE_RCC_AHB1Periph | - I2C_TOUCH_RCC_AHB1Periph | + I2C_RCC_AHB1Periph | GPS_RCC_AHB1Periph | - SPORT_UPDATE_RCC_AHB1Periph, + SPORT_UPDATE_RCC_AHB1Periph | + TOUCH_INT_RCC_AHB1Periph | + TOUCH_RST_RCC_AHB1Periph, ENABLE); RCC_APB1PeriphClockCmd(ROTARY_ENCODER_RCC_APB1Periph | @@ -119,7 +121,7 @@ void boardInit() AUDIO_RCC_APB1Periph | INTMODULE_RCC_APB1Periph | EXTMODULE_RCC_APB1Periph | - I2C_TOUCH_RCC_APB1Periph | + I2C_RCC_APB1Periph | GPS_RCC_APB1Periph | BACKLIGHT_RCC_APB1Periph, ENABLE); @@ -189,6 +191,10 @@ void boardInit() ledInit(); +#if defined(USB_CHARGER) + usbChargerInit(); +#endif + #if HAS_SPORT_UPDATE_CONNECTOR() sportUpdateInit(); #endif @@ -235,8 +241,14 @@ void boardOff() pwrOff(); } +#if defined (RADIO_TX16S) + #define BATTERY_DIVIDER 1495 +#else + #define BATTERY_DIVIDER 1629 +#endif + uint16_t getBatteryVoltage() { int32_t instant_vbat = anaIn(TX_VOLTAGE); // using filtered ADC value on purpose - return (uint16_t)((instant_vbat * (1000 + g_eeGeneral.txVoltageCalibration)) / 1629); + return (uint16_t)((instant_vbat * (1000 + g_eeGeneral.txVoltageCalibration)) / BATTERY_DIVIDER); } diff --git a/radio/src/targets/horus/bootloader/boot_menu.cpp b/radio/src/targets/horus/bootloader/boot_menu.cpp index 9e6ceaf47..d64f2c7f8 100644 --- a/radio/src/targets/horus/bootloader/boot_menu.cpp +++ b/radio/src/targets/horus/bootloader/boot_menu.cpp @@ -64,7 +64,7 @@ static void bootloaderDrawFooter() void bootloaderDrawScreen(BootloaderState st, int opt, const char* str) { // clear screen - lcdDrawSolidFilledRect(0, 0, LCD_W-1, LCD_H-1, TEXT_BGCOLOR); + lcdDrawSolidFilledRect(0, 0, LCD_W, LCD_H, TEXT_BGCOLOR); if (st == ST_START) { diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index ed5422834..063daae68 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -182,10 +182,17 @@ #define TRIMS_GPIO_REG_LSU GPIOB->IDR #define TRIMS_GPIO_PIN_LSU GPIO_Pin_13 // PB.13 #elif defined(PCBX10) - #define TRIMS_GPIO_REG_LHL GPIOB->IDR - #define TRIMS_GPIO_PIN_LHL GPIO_Pin_8 // PB.08 - #define TRIMS_GPIO_REG_LHR GPIOB->IDR - #define TRIMS_GPIO_PIN_LHR GPIO_Pin_9 // PB.09 + #if defined(RADIO_TX16S) + #define TRIMS_GPIO_REG_LHL GPIOA->IDR + #define TRIMS_GPIO_PIN_LHL GPIO_Pin_6 // PA.06 + #define TRIMS_GPIO_REG_LHR GPIOC->IDR + #define TRIMS_GPIO_PIN_LHR GPIO_Pin_4 // PC.04 + #else + #define TRIMS_GPIO_REG_LHL GPIOB->IDR + #define TRIMS_GPIO_PIN_LHL GPIO_Pin_8 // PB.08 + #define TRIMS_GPIO_REG_LHR GPIOB->IDR + #define TRIMS_GPIO_PIN_LHR GPIO_Pin_9 // PB.09 + #endif #define TRIMS_GPIO_REG_LVD GPIOG->IDR #define TRIMS_GPIO_PIN_LVD GPIO_Pin_12 // PG.12 #define TRIMS_GPIO_REG_LVU GPIOJ->IDR @@ -226,14 +233,21 @@ #define KEYS_GPIOI_PINS (KEYS_GPIO_PIN_PGDN | KEYS_GPIO_PIN_LEFT | KEYS_GPIO_PIN_DOWN | SWITCHES_GPIO_PIN_A_L | GPIO_Pin_4) #define KEYS_GPIOJ_PINS (SWITCHES_GPIO_PIN_D_H | TRIMS_GPIO_PIN_RVU | TRIMS_GPIO_PIN_LVD | TRIMS_GPIO_PIN_LVU | TRIMS_GPIO_PIN_RSD) #elif defined(PCBX10) - #define KEYS_GPIOB_PINS (GPIO_Pin_12 | GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13 | GPIO_Pin_8 | GPIO_Pin_9) -#if defined(RADIO_TX16S) - #define KEYS_GPIOC_PINS (GPIO_Pin_13) -#endif + #if defined(RADIO_TX16S) + #define KEYS_GPIOB_PINS (GPIO_Pin_12 | GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13) + #else + #define KEYS_GPIOB_PINS (GPIO_Pin_12 | GPIO_Pin_15 | GPIO_Pin_14 | GPIO_Pin_13 | GPIO_Pin_8 | GPIO_Pin_9) + #endif #define KEYS_GPIOD_PINS (GPIO_Pin_11 | GPIO_Pin_3 | GPIO_Pin_7 | GPIO_Pin_13) #define KEYS_GPIOE_PINS (GPIO_Pin_3) #define KEYS_GPIOG_PINS (SWITCHES_GPIO_PIN_D_L | SWITCHES_GPIO_PIN_G_H | SWITCHES_GPIO_PIN_G_L | SWITCHES_GPIO_PIN_H | TRIMS_GPIO_PIN_LVD) +#if defined(RADIO_TX16S) + #define KEYS_GPIOA_PINS (GPIO_Pin_6) + #define KEYS_GPIOC_PINS (GPIO_Pin_4 | GPIO_Pin_13) + #define KEYS_GPIOH_PINS (GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15) +#else #define KEYS_GPIOH_PINS (GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15) +#endif #define KEYS_GPIOI_PINS (GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_11 | GPIO_Pin_15) #define KEYS_GPIOJ_PINS (SWITCHES_GPIO_PIN_D_H | TRIMS_GPIO_PIN_LVU | TRIMS_GPIO_PIN_RVD | TRIMS_GPIO_PIN_RVU | GPIO_Pin_8) #endif @@ -306,7 +320,9 @@ #define ADC_DMA_Stream DMA2_Stream0 #define ADC_SET_DMA_FLAGS() ADC_DMA->LIFCR = (DMA_LIFCR_CTCIF0 | DMA_LIFCR_CHTIF0 | DMA_LIFCR_CTEIF0 | DMA_LIFCR_CDMEIF0 | DMA_LIFCR_CFEIF0) #define ADC_TRANSFER_COMPLETE() (ADC_DMA->LISR & DMA_LISR_TCIF0) - #if defined(RADIO_FAMILY_T16) + #if defined(RADIO_TX16S) + #define ADC_VREF_PREC2 330 + #elif defined(RADIO_T16) #define ADC_VREF_PREC2 300 #else #define ADC_VREF_PREC2 250 @@ -325,6 +341,7 @@ #define USB_CHARGER_RCC_AHB1Periph RCC_AHB1Periph_GPIOG #define USB_CHARGER_GPIO GPIOG #define USB_CHARGER_GPIO_PIN GPIO_Pin_11 // PG.11 +#define USB_USBDet_GPIO_PIN GPIO_Pin_13 // PG.13 #else #define USB_CHARGER_RCC_AHB1Periph 0 #endif @@ -620,11 +637,34 @@ #define AUDIO_MUTE_DELAY 500 // ms #endif -// I2C Bus #if defined(RADIO_TX16S) -#define I2C_RCC_AHB1Periph 0 -#define I2C_RCC_APB1Periph 0 +// Only slight noise with 868MHz > 1W, if complaints later remove and set AUDIO_UNMUTE_DELAY to 150 + #undef AUDIO_MUTE_GPIO_PIN +#endif + +// Touch +#if defined(HARDWARE_TOUCH) + #define TOUCH_INT_RCC_AHB1Periph RCC_AHB1Periph_GPIOH + #define TOUCH_INT_GPIO GPIOH + #define TOUCH_INT_GPIO_PIN GPIO_Pin_2 // PH.02 + + #define TOUCH_RST_RCC_AHB1Periph RCC_AHB1Periph_GPIOF + #define TOUCH_RST_GPIO GPIOF + #define TOUCH_RST_GPIO_PIN GPIO_Pin_10 // PF.10 + + #define TOUCH_INT_EXTI_LINE1 EXTI_Line2 + #define TOUCH_INT_EXTI_IRQn1 EXTI2_IRQn + #define TOUCH_INT_EXTI_IRQHandler1 EXTI2_IRQHandler + #define TOUCH_INT_EXTI_PortSource EXTI_PortSourceGPIOH + #define TOUCH_INT_EXTI_PinSource1 EXTI_PinSource2 + + #define TOUCH_INT_STATUS() (GPIO_ReadInputDataBit(TOUCH_INT_GPIO, TOUCH_INT_GPIO_PIN)) #else + #define TOUCH_INT_RCC_AHB1Periph 0 + #define TOUCH_RST_RCC_AHB1Periph 0 +#endif + +// I2C Bus #define I2C_RCC_AHB1Periph RCC_AHB1Periph_GPIOB #define I2C_RCC_APB1Periph RCC_APB1Periph_I2C1 #define I2C I2C1 @@ -635,7 +675,6 @@ #define I2C_SCL_GPIO_PinSource GPIO_PinSource8 #define I2C_SDA_GPIO_PinSource GPIO_PinSource9 #define I2C_SPEED 400000 -#endif // Haptic #define HAPTIC_PWM @@ -828,24 +867,6 @@ #define TIMER_2MHz_RCC_APB1Periph RCC_APB1Periph_TIM7 #define TIMER_2MHz_TIMER TIM7 -// Touch -#if defined(HARDWARE_TOUCH) -#define I2C_TOUCH_RCC_AHB1Periph RCC_AHB1Periph_GPIOB -#define I2C_TOUCH_RCC_APB1Periph RCC_APB1Periph_I2C1 -#define I2C_TOUCH I2C1 -#define I2C_TOUCH_GPIO GPIOB -#define I2C_TOUCH_SCL_GPIO_PIN GPIO_Pin_8 // PB.08 -#define I2C_TOUCH_SDA_GPIO_PIN GPIO_Pin_7 // PB.07 - -#define I2C_TOUCH_RESET_GPIO GPIOF -#define I2C_TOUCH_RESET_GPIO_PIN GPIO_Pin_10 // PF.10 -#define I2C_TOUCH_INT_GPIO GPIOH -#define I2C_TOUCH_INT_GPIO_PIN GPIO_Pin_2 // PH.02 -#else -#define I2C_TOUCH_RCC_AHB1Periph 0 -#define I2C_TOUCH_RCC_APB1Periph 0 -#endif - // Bluetooth #define STORAGE_BLUETOOTH #if defined(BLUETOOTH) diff --git a/radio/src/targets/horus/keys_driver.cpp b/radio/src/targets/horus/keys_driver.cpp old mode 100644 new mode 100755 index 0b02a6a03..7433ee58f --- a/radio/src/targets/horus/keys_driver.cpp +++ b/radio/src/targets/horus/keys_driver.cpp @@ -204,16 +204,39 @@ void keysInit() GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; +#if defined(KEYS_GPIOA_PINS) + INIT_KEYS_PINS(GPIOA); +#endif + +#if defined(KEYS_GPIOB_PINS) INIT_KEYS_PINS(GPIOB); +#endif #if defined(KEYS_GPIOC_PINS) INIT_KEYS_PINS(GPIOC); #endif +#if defined(KEYS_GPIOD_PINS) INIT_KEYS_PINS(GPIOD); +#endif + +#if defined(KEYS_GPIOE_PINS) INIT_KEYS_PINS(GPIOE); +#endif + +#if defined(KEYS_GPIOG_PINS) INIT_KEYS_PINS(GPIOG); +#endif + +#if defined(KEYS_GPIOH_PINS) INIT_KEYS_PINS(GPIOH); +#endif + +#if defined(KEYS_GPIOI_PINS) INIT_KEYS_PINS(GPIOI); +#endif + +#if defined(KEYS_GPIOJ_PINS) INIT_KEYS_PINS(GPIOJ); +#endif } diff --git a/radio/src/targets/horus/tp_gt911.cpp b/radio/src/targets/horus/tp_gt911.cpp new file mode 100644 index 000000000..5c4929e95 --- /dev/null +++ b/radio/src/targets/horus/tp_gt911.cpp @@ -0,0 +1,412 @@ +/* + * 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 "tp_gt911.h" + +uint8_t touchGT911Flag = 0; +uint8_t touchPanelEvent = 0; +struct TouchData touchData; +struct TouchState touchState; + +void GT911_INT_Change(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + GPIO_InitStructure.GPIO_Pin = TOUCH_INT_GPIO_PIN; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_Init(TOUCH_INT_GPIO, &GPIO_InitStructure); +} + +uint8_t GT911_Send_Cfg(uint8_t mode) +{ + uint8_t buf[2]; + uint8_t i = 0; + buf[0] = 0; + buf[1] = mode; + for (i = 0; i < sizeof(GT911_Cfg); i++) + buf[0] += GT911_Cfg[i];//check sum + + buf[0] = (~buf[0]) + 1; + gt911WriteRegister(GT_CFGS_REG, (uint8_t *) GT911_Cfg, sizeof(GT911_Cfg));// + gt911WriteRegister(GT_CHECK_REG, buf, 2);//write checksum + return 0; +} + +static void I2C_Config(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + RCC_AHB1PeriphClockCmd(I2C_RCC_AHB1Periph, ENABLE); + GPIO_InitStructure.GPIO_Pin = I2C_SCL_GPIO_PIN | I2C_SDA_GPIO_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(I2C_GPIO, &GPIO_InitStructure); + + GPIO_SetBits(I2C_GPIO, I2C_SCL_GPIO_PIN | I2C_SDA_GPIO_PIN); +} + +static void TOUCH_AF_ExtiStop(void) +{ + SYSCFG_EXTILineConfig(TOUCH_INT_EXTI_PortSource, TOUCH_INT_EXTI_PinSource1); + + EXTI_InitTypeDef EXTI_InitStructure; + EXTI_StructInit(&EXTI_InitStructure); + EXTI_InitStructure.EXTI_Line = TOUCH_INT_EXTI_LINE1; + EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; + EXTI_InitStructure.EXTI_LineCmd = DISABLE; + EXTI_Init(&EXTI_InitStructure); + + + NVIC_InitTypeDef NVIC_InitStructure; + NVIC_InitStructure.NVIC_IRQChannel = TOUCH_INT_EXTI_IRQn1; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 9; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /* Not used as 4 bits are used for the pre-emption priority. */; + NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE; + NVIC_Init(&NVIC_InitStructure); +} + +static void TOUCH_AF_ExtiConfig(void) +{ + SYSCFG_EXTILineConfig(TOUCH_INT_EXTI_PortSource, TOUCH_INT_EXTI_PinSource1); + + EXTI_InitTypeDef EXTI_InitStructure; + EXTI_StructInit(&EXTI_InitStructure); + EXTI_InitStructure.EXTI_Line = TOUCH_INT_EXTI_LINE1; + EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; + EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; + EXTI_InitStructure.EXTI_LineCmd = ENABLE; + EXTI_Init(&EXTI_InitStructure); + + + NVIC_InitTypeDef NVIC_InitStructure; + NVIC_InitStructure.NVIC_IRQChannel = TOUCH_INT_EXTI_IRQn1; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 9; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /* Not used as 4 bits are used for the pre-emption priority. */; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); +} + +static void TOUCH_AF_GPIOConfig(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + GPIO_InitStructure.GPIO_Pin = TOUCH_RST_GPIO_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(TOUCH_RST_GPIO, &GPIO_InitStructure); + + GPIO_ResetBits(TOUCH_RST_GPIO, TOUCH_RST_GPIO_PIN); + + GPIO_InitStructure.GPIO_Pin = TOUCH_INT_GPIO_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(TOUCH_INT_GPIO, &GPIO_InitStructure); + + GPIO_ResetBits(TOUCH_INT_GPIO, TOUCH_INT_GPIO_PIN); +} + +void SDA_IN(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + GPIO_InitStructure.GPIO_Pin = I2C_SDA_GPIO_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(I2C_GPIO, &GPIO_InitStructure); +} + +void SDA_OUT(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + GPIO_InitStructure.GPIO_Pin = I2C_SDA_GPIO_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(I2C_GPIO, &GPIO_InitStructure); +} + +void I2C_Start(void) +{ + SDA_OUT(); + I2C_SDA_H(); + I2C_SCL_H(); + delay_us(2); + I2C_SDA_L();//START:when CLK is high,DATA change form high to low + delay_us(2); + I2C_SCL_L();// + delay_us(2); +} + +void I2C_Stop(void) +{ + SDA_OUT(); + I2C_SCL_L(); + I2C_SDA_L();//STOP:when CLK is high DATA change form low to high + delay_us(2); + I2C_SCL_H(); + I2C_SDA_H();// + delay_us(2); +} + +uint8_t I2C_Wait_Ack(void) +{ + uint8_t ucErrTime = 0; + SDA_IN(); + I2C_SDA_H(); + delay_us(2); + I2C_SCL_H(); + while (READ_SDA) { + ucErrTime++; + if (ucErrTime > 166) { + I2C_Stop(); + return 1; + } + delay_us(1); + } + I2C_SDA_L(); + I2C_SCL_L(); + return 0; +} + +void I2C_Ack(void) +{ + I2C_SCL_L(); + SDA_OUT(); + I2C_SDA_L(); + delay_us(2); + I2C_SCL_H(); + delay_us(2); + I2C_SCL_L(); +} + +void I2C_NAck(void) +{ + I2C_SCL_L(); + SDA_OUT(); + I2C_SDA_H(); + delay_us(2); + I2C_SCL_H(); + delay_us(2); + I2C_SCL_L(); +} + +void I2C_Send_Byte(uint8_t txd) +{ + uint8_t t; + + SDA_OUT(); + I2C_SCL_L(); + for (t = 0; t < 8; t++) { + if ((txd & 0x80) >> 7) + I2C_SDA_H(); + else + I2C_SDA_L(); + txd <<= 1; + delay_us(1); + I2C_SCL_H(); + delay_us(2); + I2C_SCL_L(); + delay_us(1); + } +} + +uint8_t I2C_Read_Byte(unsigned char ack) +{ + unsigned char i, receive = 0; + + SDA_IN(); + for (i = 0; i < 8; i++) { + I2C_SCL_L(); + delay_us(2); + I2C_SCL_H(); + receive <<= 1; + if (READ_SDA)receive++; + delay_us(1); + } + if (!ack) + I2C_NAck(); + else + I2C_Ack(); + return receive; +} + +uint8_t gt911WriteRegister(uint16_t reg, uint8_t * buf, uint8_t len) +{ + { + uint8_t i; + uint8_t ret = 0; + + I2C_Start(); + I2C_Send_Byte(GT_CMD_WR); //send cmd + I2C_Wait_Ack(); + I2C_Send_Byte(reg >> 8); //send hi + I2C_Wait_Ack(); + I2C_Send_Byte(reg & 0XFF); //send low + I2C_Wait_Ack(); + for (i = 0; i < len; i++) { + I2C_Send_Byte(buf[i]); + ret = I2C_Wait_Ack(); + if (ret)break; + } + I2C_Stop(); + + return ret; + } +} + +void gt911ReadRegister(u16 reg, uint8_t * buf, uint8_t len) +{ + uint8_t i; + + I2C_Start(); + I2C_Send_Byte(GT_CMD_WR); //send addr + I2C_Wait_Ack(); + I2C_Send_Byte(reg >> 8); //send hi + I2C_Wait_Ack(); + I2C_Send_Byte(reg & 0XFF); //send low + I2C_Wait_Ack(); + I2C_Start(); + I2C_Send_Byte(GT_CMD_RD); //send rd + I2C_Wait_Ack(); + + for (i = 0; i < len; i++) { + buf[i] = I2C_Read_Byte(i == (len - 1) ? 0 : 1); //send data + } + I2C_Stop(); +} + +void touchPanelDeInit(void) +{ + TOUCH_AF_ExtiStop(); +} + +bool touchPanelInit(void) +{ + uint8_t tmp[4] = {0}; + + TRACE("Touchpanel init start ..."); + + TOUCH_AF_GPIOConfig(); //SET RST=OUT INT=OUT INT=LOW + I2C_Config(); + + TPRST_LOW(); + TPINT_HIGH(); + delay_us(200); + + TPRST_HIGH(); + delay_ms(6); + + TPINT_LOW(); + delay_ms(55); + + GT911_INT_Change(); //Set INT INPUT INT=LOW + + delay_ms(50); + + TRACE("Reading Touch registry"); + gt911ReadRegister(GT_PID_REG, tmp, 4); + + if (strcmp((char *) tmp, "911") == 0) //ID==9147 + { + TRACE("GT911 chip detected"); + tmp[0] = 0X02; + gt911WriteRegister(GT_CTRL_REG, tmp, 1); + gt911ReadRegister(GT_CFGS_REG, tmp, 1); + + TRACE("Chip config Ver:%x\r\n",tmp[0]); + if (tmp[0] < GT911_CFG_NUMER) //Config ver + { + TRACE("Sending new config %d", GT911_CFG_NUMER); + GT911_Send_Cfg(1); + } + + delay_ms(10); + tmp[0] = 0X00; + gt911WriteRegister(GT_CTRL_REG, tmp, 1); //end reset + touchGT911Flag = true; + + TOUCH_AF_ExtiConfig(); + + return true; + } + TRACE("GT911 chip NOT FOUND"); + return false; +} + +void touchPanelRead() +{ + uint8_t state = 0; + gt911ReadRegister(GT911_READ_XY_REG, &state, 1); + + touchPanelEvent = false; + + if ((state & 0x80u) == 0x00) { + // not ready + return; + } + + uint8_t pointsCount = (state & 0x0Fu); + + if (pointsCount > 0 && pointsCount < GT911_MAX_TP) { + gt911ReadRegister(GT911_READ_XY_REG + 1, touchData.data, pointsCount * sizeof(TouchPoint)); + if (touchData.pointsCount == 0) { + touchState.event = TE_DOWN; + touchState.startX = touchState.x = touchData.points[0].x; + touchState.startY = touchState.y = touchData.points[0].y; + } + else { + touchState.deltaX = touchData.points[0].x - touchState.x; + touchState.deltaY = touchData.points[0].y - touchState.y; + if (touchState.event == TE_SLIDE || abs(touchState.deltaX) >= SLIDE_RANGE || abs(touchState.deltaY) >= SLIDE_RANGE) { + touchState.event = TE_SLIDE; + touchState.x = touchData.points[0].x; + touchState.y = touchData.points[0].y; + } + } + touchData.pointsCount = pointsCount; + } + else { + if (touchData.pointsCount > 0) { + touchData.pointsCount = 0; + if (touchState.event == TE_SLIDE) + touchState.event = TE_SLIDE_END; + else + touchState.event = TE_UP; + } + } + + uint8_t zero = 0; + gt911WriteRegister(GT911_READ_XY_REG, &zero, 1); +} + +extern "C" void TOUCH_INT_EXTI_IRQHandler1(void) +{ + if (EXTI_GetITStatus(TOUCH_INT_EXTI_LINE1) != RESET) { + TRACE("TI"); + touchPanelEvent = 1; + EXTI_ClearITPendingBit(TOUCH_INT_EXTI_LINE1); + } +} diff --git a/radio/src/targets/horus/tp_gt911.h b/radio/src/targets/horus/tp_gt911.h new file mode 100644 index 000000000..2b5f7d32c --- /dev/null +++ b/radio/src/targets/horus/tp_gt911.h @@ -0,0 +1,296 @@ +/* + * 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 _FT5X06_H_ +#define _FT5X06_H_ + +#include "opentx.h" +#include "touch.h" + +#define HAS_TOUCH_PANEL() touchGT911Flag == true + +bool touchPanelInit(); +void touchPanelDeInit(); + +extern uint8_t touchGT911Flag; +extern uint8_t touchPanelEvent; + +uint8_t gt911WriteRegister(uint16_t reg, uint8_t * buf, uint8_t len); +void gt911ReadRegister(uint16_t reg, uint8_t * buf, uint8_t len); +void touchPanelRead(); + +#define GT911_MAX_TP 5 +#define GT911_CFG_NUMER 0x6A + +//GT911 param table +const uint8_t GT911_Cfg[] = +{ + GT911_CFG_NUMER, // 0x8047 Config version + 0xE0, // 0x8048 X output map : x 480 + 0x01, + 0x10, // 0x804A Y ouptut max : y 272 + 0x01, + GT911_MAX_TP, // 0x804C Touch number + 0x3C, // 0x804D Module switch 1 : bit4= xy change Int mode + 0x20, // 0x804E Module switch 2 + 0x22, // 0x804F Shake_Count + 0x0A, // 0x8050 Filter + 0x28, // 0x8051 Larger touch + 0x0F, // 0x8052 Noise reduction + 0x5A, // 0x8053 Screen touch level + 0x3C, // 0x8054 Screen touch leave + 0x03, // 0x8055 Low power control + 0x05, // 0x8056 Refresh rate + 0x00, // 0x8057 X threshold + 0x00, // 0x8058 Y threshold + 0x00, // 0x8059 Reserved + 0x00, // 0x805A Reserved + 0x11, // 0x805B Space (top, bottom) + 0x11, // 0x805C Space (left, right) + 0x08, // 0x805D Mini filter + 0x18, // 0x805E Strech R0 + 0x1A, // 0x805F Strech R1 + 0x1E, // 0x8060 Strech R2 + 0x14, // 0x8061 Strech RM + 0x87, // 0x8062 Drv groupA num + 0x29, // 0x8063 Drv groupB num + 0x0A, // 0x8064 Sensor num + 0xCF, // 0x8065 FreqA factor + 0xD1, // 0x8066 FreqB factor + 0xB2, // 0x8067 Panel bit freq + 0x04, + 0x00, // 0x8069 Reserved + 0x00, + 0x00, // 0x806B Panel tx gain + 0xD8, // 0x806C Panel rx gain + 0x02, // 0x806D Panel dump shift + 0x1D, // 0x806E Drv frame control + 0x00, // 0x806F Charging level up + 0x01, // 0x8070 Module switch 3 + 0x00, // 0x8071 Gesture distance + 0x00, // 0x8072 Gesture long press time + 0x00, // 0x8073 X/Y slope adjust + 0x00, // 0x8074 Gesture control + 0x00, // 0x8075 Gesture switch 1 + 0x00, // 0x8076 Gesture switch 2 + 0x00, // 0x8077 Gesture refresh rate + 0x00, // 0x8078 Gesture touch level + 0x00, // 0x8079 New green wake up level + 0xB4, // 0x807A Freq hopping start + 0xEF, // 0x807B Freq hopping end + 0x94, // 0x807C Noise detect time + 0xD5, // 0x807D Hopping flag + 0x02, // 0x807E Hopping flag + 0x07, // 0x807F Noise threshold + 0x00, // 0x8080 Nois min threshold old + 0x00, // 0x8081 Reserved + 0x04, // 0x8082 Hopping sensor group + 0x6E, // 0x8083 Hopping Seg1 normalize + 0xB9, // 0x8084 Hopping Seg1 factor + 0x00, // 0x8085 Main clock adjust + 0x6A, // 0x8086 Hopping Seg2 normalize + 0xC4, // 0x8087 Hopping Seg2 factor + 0x00, // 0x8088 Reserved + 0x66, // 0x8089 Hopping Seg3 normalize + 0xCF, // 0x808A Hopping Seg3 factor + 0x00, // 0x808B Reserved + 0x62, // 0x808C Hopping Seg4 normalize + 0xDB, // 0x808D Hopping Seg4 factor + 0x00, // 0x808E Reserved + 0x5E, // 0x808F Hopping Seg5 normalize + 0xE8, // 0x8090 Hopping Seg5 factor + 0x00, // 0x8091 Reserved + 0x5E, // 0x8092 Hopping Seg6 normalize + 0x00, // 0x8093 Key1 + 0x00, // 0x8094 Key2 + 0x00, // 0x8095 Key3 + 0x00, // 0x8096 Key4 + 0x00, // 0x8097 Key area + 0x00, // 0x8098 Key touch level + 0x00, // 0x8099 Key leave level + 0x00, // 0x809A Key sens + 0x00, // 0x809B Key sens + 0x00, // 0x809C Key restrain + 0x00, // 0x809D Key restrain time + 0x00, // 0x809E Large gesture touch + 0x00, // 0x809F Reserved + 0x00, // 0x80A0 Reserved + 0x00, // 0x80A1 Hotknot noise map + 0x00, // 0x80A2 Link threshold + 0x00, // 0x80A3 Pxy threshold + 0x00, // 0x80A4 GHot dump shift + 0x00, // 0x80A5 GHot rx gain + 0x00, // 0x80A6 Freg gain + 0x00, // 0x80A7 Freg gain 1 + 0x00, // 0x80A8 Freg gain 2 + 0x00, // 0x80A9 Freg gain 3 + 0x00, // 0x80AA Reserved + 0x00, // 0x80AB Reserved + 0x00, // 0x80AC Reserved + 0x00, // 0x80AD Reserved + 0x00, // 0x80AE Reserved + 0x00, // 0x80AF Reserved + 0x00, // 0x80B0 Reserved + 0x00, // 0x80B1 Reserved + 0x00, // 0x80B2 Reserved + 0x00, // 0x80B3 Combine dis + 0x00, // 0x80B4 Split set + 0x00, // 0x80B5 Reserved + 0x00, // 0x80B6 Reserved + 0x14, // 0x80B7 Sensor CH0 + 0x12, // 0x80B8 Sensor CH1 + 0x10, // 0x80B9 Sensor CH2 + 0x0E, // 0x80BA Sensor CH3 + 0x0C, // 0x80BB Sensor CH4 + 0x0A, // 0x80BC Sensor CH5 + 0x08, // 0x80BD Sensor CH6 + 0x06, // 0x80BE Sensor CH7 + 0x04, // 0x80BF Sensor CH8 + 0x02, // 0x80C0 Sensor CH9 + 0xFF, // 0x80C1 Sensor CH10 + 0xFF, // 0x80C2 Sensor CH11 + 0xFF, // 0x80C3 Sensor CH12 + 0xFF, // 0x80C4 Sensor CH13 + 0x00, // 0x80C5 Reserved + 0x00, // 0x80C6 Reserved + 0x00, // 0x80C7 Reserved + 0x00, // 0x80C8 Reserved + 0x00, // 0x80C9 Reserved + 0x00, // 0x80CA Reserved + 0x00, // 0x80CB Reserved + 0x00, // 0x80CC Reserved + 0x00, // 0x80CD Reserved + 0x00, // 0x80CE Reserved + 0x00, // 0x80CF Reserved + 0x00, // 0x80D0 Reserved + 0x00, // 0x80D1 Reserved + 0x00, // 0x80D2 Reserved + 0x00, // 0x80D3 Reserved + 0x00, // 0x80D4 Reserved + 0x28, // 0x80D5 Driver CH0 + 0x26, // 0x80D6 Driver CH1 + 0x24, // 0x80D7 Driver CH2 + 0x22, // 0x80D8 Driver CH3 + 0x21, // 0x80D9 Driver CH4 + 0x20, // 0x80DA Driver CH5 + 0x1F, // 0x80DB Driver CH6 + 0x1E, // 0x80DC Driver CH7 + 0x1D, // 0x80DD Driver CH8 + 0x0C, // 0x80DE Driver CH9 + 0x0A, // 0x80DF Driver CH10 + 0x08, // 0x80E0 Driver CH11 + 0x06, // 0x80E1 Driver CH12 + 0x04, // 0x80E2 Driver CH13 + 0x02, // 0x80E3 Driver CH14 + 0x00, // 0x80E4 Driver CH15 + 0xFF, // 0x80E5 Driver CH16 + 0xFF, // 0x80E6 Driver CH17 + 0xFF, // 0x80E7 Driver CH18 + 0xFF, // 0x80E8 Driver CH19 + 0xFF, // 0x80E9 Driver CH20 + 0xFF, // 0x80EA Driver CH21 + 0xFF, // 0x80EB Driver CH22 + 0xFF, // 0x80EC Driver CH23 + 0xFF, // 0x80ED Driver CH24 + 0xFF, // 0x80EE Driver CH25 + 0x00, // 0x80EF Reserved + 0x00, // 0x80F0 Reserved + 0x00, // 0x80F1 Reserved + 0x00, // 0x80F2 Reserved + 0x00, // 0x80F3 Reserved + 0x00, // 0x80F4 Reserved + 0x00, // 0x80F5 Reserved + 0x00, // 0x80F6 Reserved + 0x00, // 0x80F7 Reserved + 0x00, // 0x80F8 Reserved + 0x00, // 0x80F9 Reserved + 0x00, // 0x80FA Reserved + 0x00, // 0x80FB Reserved + 0x00, // 0x80FC Reserved + 0x00, // 0x80FD Reserved + 0x00 // 0x80FE Reserved +}; + +//I2C +#define GT_CMD_WR 0X28 +#define GT_CMD_RD 0X29 + +#define SLAVE_Write_Address 0X28 + +//GT9147 +#define GT_CTRL_REG 0X8040 +#define GT_CFGS_REG 0X8047 +#define GT_CHECK_REG 0X80FF +#define GT_PID_REG 0X8140 + +#define GT_GSTID_REG 0X814E +#define GT_TP1_REG 0X8150 +#define GT_TP2_REG 0X8158 +#define GT_TP3_REG 0X8160 +#define GT_TP4_REG 0X8168 +#define GT_TP5_REG 0X8170 + +#define GT911_READ_XY_REG 0x814E +#define GT911_CLEARBUF_REG 0x814E +#define GT911_CONFIG_REG 0x8047 +#define GT911_COMMAND_REG 0x8040 +#define GT911_PRODUCT_ID_REG 0x8140 +#define GT911_VENDOR_ID_REG 0x814A +#define GT911_CONFIG_VERSION_REG 0x8047 +#define GT911_CONFIG_CHECKSUM_REG 0x80FF +#define GT911_FIRMWARE_VERSION_REG 0x8144 + +PACK(typedef struct +{ + uint8_t track; + uint16_t x; + uint16_t y; + uint16_t size; + uint8_t reserved; +}) TouchPoint; + +PACK(struct TouchData +{ + uint8_t pointsCount; + union + { + TouchPoint points[GT911_MAX_TP]; + uint8_t data[GT911_MAX_TP * sizeof(TouchPoint)]; + }; +}); + +extern struct TouchData touchData; + +#define TPRST_LOW() do { TOUCH_RST_GPIO->BSRRH = TOUCH_RST_GPIO_PIN; } while(0) +#define TPRST_HIGH() do { TOUCH_RST_GPIO->BSRRL = TOUCH_RST_GPIO_PIN; } while(0) + +#define TPINT_LOW() do { TOUCH_INT_GPIO->BSRRH = TOUCH_INT_GPIO_PIN; } while(0) +#define TPINT_HIGH() do { TOUCH_INT_GPIO->BSRRL = TOUCH_INT_GPIO_PIN; } while(0) + + +#define I2C_SCL_L() do { I2C_GPIO->BSRRH = I2C_SCL_GPIO_PIN; } while(0) +#define I2C_SCL_H() do { I2C_GPIO->BSRRL = I2C_SCL_GPIO_PIN; } while(0) + +#define I2C_SDA_L() do { I2C_GPIO->BSRRH = I2C_SDA_GPIO_PIN; } while(0) +#define I2C_SDA_H() do { I2C_GPIO->BSRRL = I2C_SDA_GPIO_PIN; } while(0) + +#define READ_SDA GPIO_ReadInputDataBit(I2C_GPIO, I2C_SDA_GPIO_PIN) + +#endif // _FT5X06_H_ diff --git a/radio/src/targets/horus/usb_charger_driver.cpp b/radio/src/targets/horus/usb_charger_driver.cpp index 3ba915318..be27276f0 100644 --- a/radio/src/targets/horus/usb_charger_driver.cpp +++ b/radio/src/targets/horus/usb_charger_driver.cpp @@ -23,7 +23,7 @@ void usbChargerInit() { GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.GPIO_Pin = USB_CHARGER_RCC_AHB1Periph; + GPIO_InitStructure.GPIO_Pin = USB_CHARGER_GPIO_PIN | USB_USBDet_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; @@ -33,6 +33,6 @@ void usbChargerInit() bool usbChargerLed() { - return GPIO_ReadInputDataBit(USB_CHARGER_GPIO, USB_CHARGER_GPIO_PIN) == Bit_RESET; + return GPIO_ReadInputDataBit(USB_CHARGER_GPIO, USB_USBDet_GPIO_PIN) == 0 ? 0 : GPIO_ReadInputDataBit(USB_CHARGER_GPIO, USB_CHARGER_GPIO_PIN) == Bit_RESET; } diff --git a/radio/src/targets/simu/simpgmspace.cpp b/radio/src/targets/simu/simpgmspace.cpp index 1aadf6e30..73a4948ca 100644 --- a/radio/src/targets/simu/simpgmspace.cpp +++ b/radio/src/targets/simu/simpgmspace.cpp @@ -580,6 +580,7 @@ int usbPlugged() { return false; } int getSelectedUsbMode() { return USB_JOYSTICK_MODE; } void setSelectedUsbMode(int mode) {} void delay_ms(uint32_t ms) { } +void delay_us(uint16_t us) { } // GPIO fake functions void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF) { } diff --git a/radio/src/touch.h b/radio/src/touch.h new file mode 100644 index 000000000..fbb70e3fe --- /dev/null +++ b/radio/src/touch.h @@ -0,0 +1,50 @@ +/* + * 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 _TOUCH_H_ +#define _TOUCH_H_ + +enum TouchEvent +{ + TE_NONE, + TE_DOWN, + TE_UP, + TE_SLIDE, + TE_SLIDE_END +}; + +struct TouchState +{ + unsigned char event; + short x; + short y; + short startX; + short startY; + short deltaX; + short deltaY; + short lastDeltaX; + short lastDeltaY; +}; + +constexpr uint8_t SLIDE_RANGE = 6; + +extern TouchState touchState; + +#endif // _TOUCH_H_ \ No newline at end of file diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 24f18e058..4f43e33d1 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -320,6 +320,8 @@ const char STR_RESET_BTN[] = TR_RESET_BTN; const char STR_DEBUG[] = TR_DEBUG; const char STR_KEYS_BTN[] = TR_KEYS_BTN; const char STR_ANALOGS_BTN[] = TR_ANALOGS_BTN; +const char STR_TOUCH_NOTFOUND[] = TR_TOUCH_NOTFOUND; +const char STR_TOUCH_EXIT[] = TR_TOUCH_EXIT; const char STR_CALIBRATION[] = TR_CALIBRATION; const char STR_NO_TOOLS[] = TR_NO_TOOLS; const char STR_NORMAL[] = TR_NORMAL; @@ -588,6 +590,7 @@ const char STR_EXIT[] = TR_EXIT; const char STR_MODULE_RANGE[] = TR_MODULE_RANGE; const char STR_RECEIVER_OPTIONS[] = TR_RECEIVER_OPTIONS; const char STR_SPORT_UPDATE_POWER_MODE[] = TR_SPORT_UPDATE_POWER_MODE; +const char STR_TOUCH_PANEL[] = TR_TOUCH_PANEL; #if defined(PCBHORUS) const char STR_ASSIGN_SPLASH[] = TR_ASSIGN_SPLASH; diff --git a/radio/src/translations.h b/radio/src/translations.h index 179972304..6b0038118 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -169,6 +169,7 @@ extern const char STR_VSENSORTYPES[]; extern const char STR_VFORMULAS[]; extern const char STR_VPREC[]; extern const char STR_VCELLINDEX[]; +extern const char STR_TOUCH_PANEL[]; #if defined(BLUETOOTH) extern const char STR_BLUETOOTH[]; @@ -496,6 +497,8 @@ extern const char STR_RESET_BTN[]; extern const char STR_DEBUG[]; extern const char STR_KEYS_BTN[]; extern const char STR_ANALOGS_BTN[]; +extern const char STR_TOUCH_NOTFOUND[]; +extern const char STR_TOUCH_EXIT[]; extern const char STR_CALIBRATION[]; extern const char STR_NO_TOOLS[]; extern const char STR_NORMAL[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 3b4beb3dd..08ae06de2 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -917,6 +917,8 @@ #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("SW","Přepínače")) #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogy")) +#define TR_TOUCH_NOTFOUND "Touch hardware not found" +#define TR_TOUCH_EXIT "Touch screen to exit" #define TR_CALIBRATION "Kalibrace" #define TR_SET BUTTON("Nast") #define TR_TRAINER "Trenér" @@ -990,6 +992,7 @@ #define LEN_SPORT_UPDATE_POWER_MODES "\004" #define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " #define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens" +#define TR_TOUCH_PANEL "Touch panel:" // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Název" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 79974e4a1..62478e7ed 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -919,6 +919,8 @@ #define TR_DEBUG "Testen" #define TR_KEYS_BTN BUTTON(TR("SW","Switches")) #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) +#define TR_TOUCH_NOTFOUND "Touch hardware not found" +#define TR_TOUCH_EXIT "Touch screen to exit" #define TR_CALIBRATION "Kalibrieren" #define TR_SET BUTTON("Set") #define TR_TRAINER "DSC Buchse PPM In/Out" @@ -996,6 +998,7 @@ #define LEN_SPORT_UPDATE_POWER_MODES "\004" #define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " #define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens" +#define TR_TOUCH_PANEL "Touch panel:" // Horus and Taranis specific column headers #define TR_PHASES_HEADERS_NAME "Name " diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 55efa2cf3..72363c477 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -918,6 +918,8 @@ #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("Keys", "Switches")) #define TR_ANALOGS_BTN BUTTON(TR("Anas", "Analogs")) +#define TR_TOUCH_NOTFOUND "Touch hardware not found" +#define TR_TOUCH_EXIT "Touch screen to exit" #define TR_CALIBRATION "Calibration" #define TR_SET BUTTON("Set") #define TR_TRAINER "Trainer" @@ -995,6 +997,7 @@ #define LEN_SPORT_UPDATE_POWER_MODES "\004" #define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " #define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens" +#define TR_TOUCH_PANEL "Touch panel:" // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Name" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 456f35f01..b022314fa 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -918,8 +918,10 @@ #define TR_DEL_BUTTON BUTTON(TR("Del", "Borrar")) #define TR_RESET_BTN "[Reset]" #define TR_DEBUG "Debug" -#define TR_KEYS_BTN BUTTON(TR("SW", "Switches")) -#define TR_ANALOGS_BTN BUTTON(TR("Analog", "Analogs")) +#define TR_KEYS_BTN BUTTON(TR("SW","Switches")) +#define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) +#define TR_TOUCH_NOTFOUND "Touch hardware not found" +#define TR_TOUCH_EXIT "Touch screen to exit" #define TR_CALIBRATION "Calibración" #define TR_SET "[Ajuste]" #define TR_TRAINER "Entrenador" @@ -994,6 +996,7 @@ #define LEN_SPORT_UPDATE_POWER_MODES "\004" #define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " #define TR_NO_TELEMETRY_SCREENS TR("No hay pant. telemetría", "No hay pantallas de telemetría") +#define TR_TOUCH_PANEL "Touch panel:" // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Nombre" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 933ad7103..afaef5c33 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -936,6 +936,8 @@ #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("SW","Switches")) #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) +#define TR_TOUCH_NOTFOUND "Touch hardware not found" +#define TR_TOUCH_EXIT "Touch screen to exit" #define TR_CALIBRATION "Calibration" #define TR_SET "[Set]" #define TR_TRAINER "Trainer" @@ -1009,6 +1011,7 @@ #define LEN_SPORT_UPDATE_POWER_MODES "\004" #define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " #define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens" +#define TR_TOUCH_PANEL "Touch panel:" // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Name" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 4a8e95e9d..422205dd5 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -938,6 +938,8 @@ #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("Btns","Inters")) #define TR_ANALOGS_BTN BUTTON(TR("Anas", "Analogs")) +#define TR_TOUCH_NOTFOUND "Touch hardware not found" +#define TR_TOUCH_EXIT "Touch screen to exit" #define TR_CALIBRATION "Calibration" #define TR_SET BUTTON("Déf") #define TR_TRAINER "Ecolage" @@ -1019,6 +1021,7 @@ #define LEN_SPORT_UPDATE_POWER_MODES "\004" #define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " #define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens" +#define TR_TOUCH_PANEL "Touch panel:" // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Nom" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index e118fcd21..750f77a7c 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -938,6 +938,8 @@ #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("SW","Interruttori")) #define TR_ANALOGS_BTN BUTTON(TR("Analogico","Analogici")) +#define TR_TOUCH_NOTFOUND "Touch hardware not found" +#define TR_TOUCH_EXIT "Touch screen to exit" #define TR_CALIBRATION TR("Calibraz.", "Calibrazione") #define TR_SET "[Set]" #define TR_TRAINER TR("Trainer", "Maestro/Allievo") @@ -1011,6 +1013,7 @@ #define LEN_SPORT_UPDATE_POWER_MODES "\004" #define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " #define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens" +#define TR_TOUCH_PANEL "Touch panel:" // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Nome" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 5425c6033..f36f75cf1 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -924,6 +924,8 @@ #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("SW","Switches")) #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) +#define TR_TOUCH_NOTFOUND "Touch hardware not found" +#define TR_TOUCH_EXIT "Touch screen to exit" #define TR_CALIBRATION "Calibration" #define TR_SET "[Set]" #define TR_TRAINER "Trainer Poort" @@ -1003,6 +1005,7 @@ #define LEN_SPORT_UPDATE_POWER_MODES "\004" #define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " #define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens" +#define TR_TOUCH_PANEL "Touch panel:" // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Name" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index d82ffc70c..5fd59c2ec 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -937,6 +937,8 @@ #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("SW","Switches")) #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) +#define TR_TOUCH_NOTFOUND "Touch hardware not found" +#define TR_TOUCH_EXIT "Touch screen to exit" #define TR_CALIBRATION "Calibration" #define TR_SET "[Set]" #define TR_TRAINER "Port Trenera" @@ -1010,6 +1012,7 @@ #define LEN_SPORT_UPDATE_POWER_MODES "\004" #define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " #define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens" +#define TR_TOUCH_PANEL "Touch panel:" // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Nazwa" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 671370d01..857bc3c35 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -927,6 +927,8 @@ #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("SW","Switches")) #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) +#define TR_TOUCH_NOTFOUND "Touch hardware not found" +#define TR_TOUCH_EXIT "Touch screen to exit" #define TR_CALIBRATION "Calibration" #define TR_SET "[Set]" #define TR_TRAINER "Trainer" @@ -1000,6 +1002,7 @@ #define LEN_SPORT_UPDATE_POWER_MODES "\004" #define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " #define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens" +#define TR_TOUCH_PANEL "Touch panel:" // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Name" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index b2fbe7ec4..feff5f1d2 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -937,6 +937,8 @@ #define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("SW","Switches")) #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) +#define TR_TOUCH_NOTFOUND "Touch hardware not found" +#define TR_TOUCH_EXIT "Touch screen to exit" #define TR_CALIBRATION "Calibration" #define TR_SET "[Spara]" #define TR_TRAINER "Trainer" @@ -1010,6 +1012,7 @@ #define LEN_SPORT_UPDATE_POWER_MODES "\004" #define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " #define TR_NO_TELEMETRY_SCREENS "No Telemetry Screens" +#define TR_TOUCH_PANEL "Touch panel:" // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Namn" diff --git a/tools/build-frsky.py b/tools/build-frsky.py index 3db1e97fb..e4478a2a8 100755 --- a/tools/build-frsky.py +++ b/tools/build-frsky.py @@ -134,7 +134,7 @@ def build(board, translation, srcdir): os.mkdir("output") path = tempfile.mkdtemp() os.chdir(path) - command = "cmake %s -DTRANSLATIONS=%s -DFRSKY_RELEASE=YES %s" % (cmake_options, translation, srcdir) + command = "cmake %s -DTRANSLATIONS=%s -DFRSKY_RELEASE=YES -DDEFAULT_TEMPLATE_SETUP=17 %s" % (cmake_options, translation, srcdir) print(command) os.system(command) os.system("make firmware -j6")