diff --git a/radio/src/Makefile b/radio/src/Makefile index 4d4952764..ad5cad4d6 100644 --- a/radio/src/Makefile +++ b/radio/src/Makefile @@ -923,7 +923,7 @@ ifeq ($(PCB), TARANIS) CPPSRC += bmp.cpp gui/$(GUIDIRECTORY)/view_channels.cpp gui/$(GUIDIRECTORY)/view_about.cpp gui/$(GUIDIRECTORY)/view_text.cpp debug.cpp CPPSRC += loadboot.cpp ifeq ($(PCBREV), REV9E) - EXTRABOARDSRC += targets/taranis/top_lcd_driver.cpp + CPPSRC += targets/taranis/top_lcd_driver.cpp SRC += targets/taranis/system_stm32f4xx.c SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/misc.c SRC += $(STM32LIBPATH)/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_gpio.c diff --git a/radio/src/bitmaps/Taranis/lock.png b/radio/src/bitmaps/Taranis/lock.png new file mode 100755 index 000000000..a3b103e94 Binary files /dev/null and b/radio/src/bitmaps/Taranis/lock.png differ diff --git a/radio/src/bitmaps/Taranis/logo.bmp b/radio/src/bitmaps/Taranis/logo.bmp deleted file mode 100755 index 42e792dc8..000000000 Binary files a/radio/src/bitmaps/Taranis/logo.bmp and /dev/null differ diff --git a/radio/src/bitmaps/Taranis/sleep.png b/radio/src/bitmaps/Taranis/sleep.png new file mode 100755 index 000000000..b35df3e52 Binary files /dev/null and b/radio/src/bitmaps/Taranis/sleep.png differ diff --git a/radio/src/bitmaps/Taranis/startup.png b/radio/src/bitmaps/Taranis/startup.png new file mode 100644 index 000000000..03fac5a86 Binary files /dev/null and b/radio/src/bitmaps/Taranis/startup.png differ diff --git a/radio/src/gui/Taranis/lcd.h b/radio/src/gui/Taranis/lcd.h index a89c57dd1..caecc1ded 100755 --- a/radio/src/gui/Taranis/lcd.h +++ b/radio/src/gui/Taranis/lcd.h @@ -228,8 +228,6 @@ void lcd_bmp(coord_t x, coord_t y, const uint8_t * img, coord_t offset=0, coord_ void lcdSetRefVolt(unsigned char val); void lcd_clear(); void lcdSetContrast(); -void lcdInit(); -void lcdOff(); #if defined(REVPLUS) && !defined(SIMU) void lcdRefresh(bool wait=true); diff --git a/radio/src/main_arm.cpp b/radio/src/main_arm.cpp index 445d5f8fc..2792c325c 100644 --- a/radio/src/main_arm.cpp +++ b/radio/src/main_arm.cpp @@ -176,13 +176,6 @@ void perMain() drawStatusLine(); } -#if defined(REV9E) - uint32_t pwr_pressed_duration = pwrPressedDuration(); - if (pwr_pressed_duration > 0) { - displayShutdownProgress(pwr_pressed_duration); - } -#endif - lcdRefresh(); #if defined(REV9E) && !defined(SIMU) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 768b33ee0..b08511b0b 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -977,6 +977,10 @@ bool readonlyUnlocked() #if defined(SPLASH) void doSplash() { +#if defined(PCBTARANIS) && defined(REV9E) + bool refresh = false; +#endif + if (SPLASH_NEEDED()) { displaySplash(); @@ -997,7 +1001,8 @@ void doSplash() inputsMoved(); tmr10ms_t tgtime = get_tmr10ms() + SPLASH_TIMEOUT; - while (tgtime != get_tmr10ms()) { + + while (tgtime > get_tmr10ms()) { #if defined(SIMU) SIMU_SLEEP(1); #elif defined(CPUARM) @@ -1017,7 +1022,23 @@ void doSplash() } #endif - if (pwrCheck()==e_power_off) return; +#if defined(PCBTARANIS) && defined(REV9E) + uint32_t pwr_check = pwrCheck(); + if (pwr_check == e_power_off) { + break; + } + else if (pwr_check == e_power_press) { + refresh = true; + } + else if (pwr_check == e_power_on && refresh) { + displaySplash(); + refresh = false; + } +#else + if (pwrCheck() == e_power_off) { + return; + } +#endif #if !defined(PCBTARANIS) && !defined(PCBSTD) if (curTime < get_tmr10ms()) { @@ -1142,16 +1163,26 @@ void checkTHR() MESSAGE(STR_THROTTLEWARN, STR_THROTTLENOTIDLE, STR_PRESSANYKEYTOSKIP, AU_THROTTLE_ALERT); } #else - if (g_model.disableThrottleWarning) return; + if (g_model.disableThrottleWarning) { + return; + } + getADC(); + evalInputs(e_perout_mode_notrainer); // let do evalInputs do the job int16_t v = calibratedStick[thrchn]; - if (v<=(THRCHK_DEADBAND-1024)) return; // prevent warning if throttle input OK + if (v <= THRCHK_DEADBAND-1024) { + return; // prevent warning if throttle input OK + } // first - display warning; also deletes inputs if any have been before MESSAGE(STR_THROTTLEWARN, STR_THROTTLENOTIDLE, STR_PRESSANYKEYTOSKIP, AU_THROTTLE_ALERT); +#if defined(PCBTARANIS) && defined(REV9E) + bool refresh = false; +#endif + while (1) { SIMU_SLEEP(1); @@ -1159,10 +1190,30 @@ void checkTHR() getADC(); evalInputs(e_perout_mode_notrainer); // let do evalInputs do the job + v = calibratedStick[thrchn]; - if (pwrCheck()==e_power_off || keyDown() || v<=(THRCHK_DEADBAND-1024)) +#if defined(PCBTARANIS) && defined(REV9E) + uint32_t pwr_check = pwrCheck(); + if (pwr_check == e_power_off) { break; + } + else if (pwr_check == e_power_press) { + refresh = true; + } + else if (pwr_check == e_power_on && refresh) { + MESSAGE(STR_THROTTLEWARN, STR_THROTTLENOTIDLE, STR_PRESSANYKEYTOSKIP, AU_NONE); + refresh = false; + } +#else + if (pwrCheck() == e_power_off) { + break; + } +#endif + + if (keyDown() || v <= THRCHK_DEADBAND-1024) { + break; + } checkBacklight(); @@ -1173,8 +1224,9 @@ void checkTHR() void checkAlarm() // added by Gohst { - if (g_eeGeneral.disableAlarmWarning) + if (g_eeGeneral.disableAlarmWarning) { return; + } if (IS_SOUND_OFF()) { ALERT(STR_ALARMSWARN, STR_ALARMSDISABLED, AU_ERROR); @@ -1185,42 +1237,41 @@ void alert(const pm_char * t, const pm_char *s MESSAGE_SOUND_ARG) { MESSAGE(t, s, STR_PRESSANYKEY, sound); +#if defined(PCBTARANIS) && defined(REV9E) + bool refresh = false; +#endif + while(1) { SIMU_SLEEP(1); - if (pwrCheck() == e_power_off) { - // the radio has been powered off during the ALERT -#if defined(TARANIS) && defined(REV9E) - // TODO this is quick & dirty - lcdOff(); - BACKLIGHT_OFF(); - topLcdOff(); - SysTick->CTRL = 0; // turn off systick -#endif - pwrOff(); // turn power off now - } - if (keyDown()) return; // wait for key release checkBacklight(); wdt_reset(); -#if defined(REV9E) - static bool refresh = false; - uint32_t pwr_pressed_duration = pwrPressedDuration(); - if (refresh) { - lcdRefresh(); - refresh = false; - if (pwr_pressed_duration == 0) { - MESSAGE(t, s, STR_PRESSANYKEY, AU_NONE); - } +#if defined(PCBTARANIS) && defined(REV9E) + uint32_t pwr_check = pwrCheck(); + if (pwr_check == e_power_off) { + // TODO this is quick & dirty + lcdOff(); + BACKLIGHT_OFF(); + topLcdOff(); + SysTick->CTRL = 0; // turn off systick + pwrOff(); } - if (pwr_pressed_duration > 0) { - displayShutdownProgress(pwr_pressed_duration); + else if (pwr_check == e_power_press) { refresh = true; } + else if (pwr_check == e_power_on && refresh) { + MESSAGE(t, s, STR_PRESSANYKEY, AU_NONE); + refresh = false; + } +#else + if (pwrCheck() == e_power_off) { + pwrOff(); // turn power off now + } #endif } } @@ -2546,3 +2597,73 @@ int main(void) #endif } #endif // !SIMU + +#if defined(PCBTARANIS) && defined(REV9E) +uint32_t pwr_press_time = 0; + +uint32_t pwrPressedDuration() +{ + if (pwr_press_time == 0) { + return 0; + } + else { + return get_tmr10ms() - pwr_press_time; + } +} + +uint32_t pwrCheck() +{ + enum PwrCheckState { + PWR_CHECK_ON, + PWR_CHECK_OFF, + PWR_CHECK_PAUSED, + }; + + static uint8_t pwr_check_state = PWR_CHECK_ON; + + if (pwr_check_state == PWR_CHECK_OFF) { + return e_power_off; + } + else if (pwrPressed()) { + if (pwr_check_state == PWR_CHECK_PAUSED) { + // nothing + } + else if (pwr_press_time == 0) { + pwr_press_time = get_tmr10ms(); + } + else { + if (get_tmr10ms() - pwr_press_time > 300) { + while (1) { + lcdRefreshWait(); + lcd_clear(); + POPUP_CONFIRMATION("Confirm Shutdown"); + uint8_t evt = getEvent(false); + DISPLAY_WARNING(evt); + lcdRefresh(); + if (s_warning_result == true) { + pwr_check_state = PWR_CHECK_OFF; + return e_power_off; + } + else if (!s_warning) { + // shutdown has been cancelled + pwr_check_state = PWR_CHECK_PAUSED; + return e_power_on; + } + } + } + else { + lcdRefreshWait(); + displayShutdownProgress(pwrPressedDuration()); + lcdRefresh(); + return e_power_press; + } + } + } + else { + pwr_check_state = PWR_CHECK_ON; + pwr_press_time = 0; + } + + return e_power_on; +} +#endif diff --git a/radio/src/pwr.h b/radio/src/pwr.h index b6816d590..a8ed7a0c8 100644 --- a/radio/src/pwr.h +++ b/radio/src/pwr.h @@ -41,7 +41,8 @@ enum PowerState { e_power_on, e_power_trainer, e_power_usb, - e_power_off + e_power_off, + e_power_press, }; #endif diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp index e87dc4c28..e26bc3de9 100644 --- a/radio/src/switches.cpp +++ b/radio/src/switches.cpp @@ -611,6 +611,10 @@ void checkSwitches() uint8_t bad_pots = 0, last_bad_pots = 0xff; #endif +#if defined(PCBTARANIS) && defined(REV9E) + bool refresh = false; +#endif + #if !defined(MODULE_ALWAYS_SEND_PULSES) while (1) { @@ -621,8 +625,9 @@ void checkSwitches() #define GETADC_COUNT 1 #endif #ifdef GETADC_COUNT - for (int i=0; iCSR & (RCC_CSR_SFTRSTF | RCC_CSR_WDGRSTF))) { + tmr10ms_t start = get_tmr10ms(); + tmr10ms_t duration = 0; + uint8_t pwr_on = 0; + while (pwrPressed()) { + duration = get_tmr10ms() - start; + lcd_clear(); + if (duration < PWR_PRESS_DURATION_MIN) { + lcd_bmp(76, 0, bmp_lock, 0, 60); + } + else if (duration >= PWR_PRESS_DURATION_MAX) { + lcd_bmp(76, 0, bmp_sleep, 0, 60); + turnBacklightOff(); + } + else { + unsigned index = (duration - PWR_PRESS_DURATION_MIN) / ((PWR_PRESS_DURATION_MAX-PWR_PRESS_DURATION_MIN) / 4); + lcd_bmp(76, 0, bmp_startup, index*60, 60); + if (pwr_on != 1) { + backlightInit(); + pwr_on = 1; + } + } + lcdRefresh(); + } + if (duration < PWR_PRESS_DURATION_MIN || duration >= PWR_PRESS_DURATION_MAX) { + pwrOff(); + } + else { + lcdRefreshWait(); + } + } + else { + backlightInit(); + } + topLcdInit(); +#else + backlightInit(); +#endif } #endif diff --git a/radio/src/targets/taranis/board_taranis.h b/radio/src/targets/taranis/board_taranis.h index 7b068335d..605332f20 100644 --- a/radio/src/targets/taranis/board_taranis.h +++ b/radio/src/targets/taranis/board_taranis.h @@ -254,6 +254,7 @@ extern "C" { // Power driver void pwrInit(void); uint32_t pwrCheck(void); +void pwrOn(void); void pwrOff(void); #if defined(REV9E) uint32_t pwrPressed(void); @@ -262,6 +263,7 @@ uint32_t pwrPressedDuration(void); #define UNEXPECTED_SHUTDOWN() (g_eeGeneral.unexpectedShutdown) // Backlight driver +void backlightInit(void); #if defined(REVPLUS) void turnBacklightOn(uint8_t level, uint8_t color); void turnBacklightOff(void); @@ -331,13 +333,18 @@ void uart3Stop(void); // BT driver #define BLUETOOTH_DEFAULT_BAUDRATE 115200 #define BLUETOOTH_FACTORY_BAUDRATE 9600 -uint8_t bluetoothReady(); +uint8_t bluetoothReady(void); void bluetoothInit(uint32_t baudrate); void bluetoothWrite(const void * buffer, int len); void bluetoothWriteString(const char * str); int bluetoothRead(void * buffer, int len); void bluetoothWakeup(void); +// LCD driver +void lcdInit(void); +void lcdInitFinish(void); +void lcdOff(void); + // Top LCD driver #if defined(REV9E) void topLcdInit(void); diff --git a/radio/src/targets/taranis/bootloader/boot.cpp b/radio/src/targets/taranis/bootloader/boot.cpp index 66612198a..366544167 100755 --- a/radio/src/targets/taranis/bootloader/boot.cpp +++ b/radio/src/targets/taranis/bootloader/boot.cpp @@ -398,45 +398,21 @@ int main() #endif pwrInit(); - -#if defined(PCBSKY9X) - MATRIX->CCFG_SYSIO |= 0x000000F0L; // Disable syspins, enable B4,5,6,7 -#endif - -#if defined(PCBSKY9X) - init_SDcard(); - PIOC->PIO_PER = PIO_PC25; // Enable bit C25 (USB-detect) - start_timer0(); -#endif - -#if defined(PCBTARANIS) delaysInit(); //needed for lcdInit() -#endif lcdInit(); + backlightInit(); -#if defined(PCBSKY9X) - extern uint8_t OptrexDisplay; - OptrexDisplay = 1; -#endif lcd_clear(); lcd_putsLeft(0, BOOTLOADER_TITLE); lcd_invert_line(0); lcdRefresh(); -#if defined(REVPLUS) - turnBacklightOn(0, 0); -#endif keysInit(); i2cInit(); __enable_irq(); init10msTimer(); -#if defined(PCBSKY9X) - EblockAddress = -1; - init_spi(); -#endif - #if defined(PCBTARANIS) // SD card detect pin sdInit(); diff --git a/radio/src/targets/taranis/lcd_driver.cpp b/radio/src/targets/taranis/lcd_driver.cpp index b4ef70b11..4ad229b7e 100644 --- a/radio/src/targets/taranis/lcd_driver.cpp +++ b/radio/src/targets/taranis/lcd_driver.cpp @@ -251,8 +251,7 @@ void lcdRefresh() } #endif -/**Init the Backlight GPIO */ -static void LCD_BL_Config() +void backlightInit() { GPIO_InitTypeDef GPIO_InitStructure; @@ -269,8 +268,8 @@ static void LCD_BL_Config() BACKLIGHT_TIMER->PSC = (PERI2_FREQUENCY * TIMER_MULT_APB2) / 50000 - 1; // 20us * 100 = 2ms => 500Hz BACKLIGHT_TIMER->CCMR1 = TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2 ; // PWM BACKLIGHT_TIMER->CCER = TIM_CCER_CC1E | TIM_CCER_CC2E ; - BACKLIGHT_TIMER->CCR1 = 0 ; - BACKLIGHT_TIMER->CCR2 = 80 ; + BACKLIGHT_TIMER->CCR2 = 0 ; + BACKLIGHT_TIMER->CCR1 = 100 ; BACKLIGHT_TIMER->EGR = 0 ; BACKLIGHT_TIMER->CR1 = TIM_CR1_CEN ; // Counter enable #elif defined(REVPLUS) @@ -288,7 +287,7 @@ static void LCD_BL_Config() BACKLIGHT_TIMER->CCMR2 = TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2 ; // PWM BACKLIGHT_TIMER->CCER = TIM_CCER_CC4E | TIM_CCER_CC2E ; BACKLIGHT_TIMER->CCR2 = 0 ; - BACKLIGHT_TIMER->CCR4 = 80 ; + BACKLIGHT_TIMER->CCR4 = 100 ; BACKLIGHT_TIMER->EGR = 0 ; BACKLIGHT_TIMER->CR1 = TIM_CR1_CEN ; // Counter enable #else @@ -362,7 +361,6 @@ void lcdOff() */ void lcdInit() { - LCD_BL_Config(); LCD_Hardware_Init(); if (WAS_RESET_BY_WATCHDOG()|WAS_RESET_BY_SOFTWARE()) return; //no need to reset LCD module diff --git a/radio/src/targets/taranis/pwr_driver.c b/radio/src/targets/taranis/pwr_driver.c index c0abac8df..b02ba3b14 100644 --- a/radio/src/targets/taranis/pwr_driver.c +++ b/radio/src/targets/taranis/pwr_driver.c @@ -72,17 +72,18 @@ void pwrInit() GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_Init(TRAINER_GPIO_DETECT, &GPIO_InitStructure); - // Soft power ON - GPIO_SetBits(PWR_GPIO, PWR_GPIO_PIN_ON); + pwrOn(); +} -#if defined(REV9E) - while (pwrPressed()) ; -#endif +void pwrOn() +{ + GPIO_SetBits(PWR_GPIO, PWR_GPIO_PIN_ON); } void pwrOff() { GPIO_ResetBits(PWR_GPIO, PWR_GPIO_PIN_ON); + #if defined(REV9E) // 9E needs watchdog reset because CPU is still running while the power // key is held pressed by the user @@ -107,36 +108,9 @@ uint32_t pwrPressed() { return GPIO_ReadInputDataBit(PWR_GPIO, PWR_GPIO_PIN_SWITCH) == Bit_RESET; } -#if !defined(BOOT) -uint32_t pwrPressTime = 0; -uint32_t pwrPressedDuration() -{ - if (pwrPressTime == 0) { - return 0; - } - else { - return get_tmr10ms() - pwrPressTime; - } -} -uint32_t pwrCheck() -{ - if (pwrPressed()) { - if (pwrPressTime == 0) { - pwrPressTime = get_tmr10ms(); - } - else { - if (get_tmr10ms() - pwrPressTime > 250) { - return e_power_off; - } - } - } - else { - pwrPressTime = 0; - } - return e_power_on; -} #endif -#else + +#if !defined(REV9E) uint32_t pwrCheck() { #if defined(SIMU) diff --git a/radio/src/tasks_arm.cpp b/radio/src/tasks_arm.cpp index 4b7edb2f4..2f2d8e4dc 100644 --- a/radio/src/tasks_arm.cpp +++ b/radio/src/tasks_arm.cpp @@ -159,7 +159,18 @@ void menusTask(void * pdata) { opentxInit(); +#if defined(PCBTARANIS) && defined(REV9E) + while (1) { + uint32_t pwr_check = pwrCheck(); + if (pwr_check == e_power_off) { + break; + } + else if (pwr_check == e_power_press) { + continue; + } +#else while (pwrCheck() != e_power_off) { +#endif U64 start = CoGetOSTime(); perMain(); // TODO remove completely massstorage from sky9x firmware diff --git a/radio/util/video.sh b/radio/util/video.sh new file mode 100755 index 000000000..dc65906bc --- /dev/null +++ b/radio/util/video.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +set -x +set -e + +ffmpeg -i $1 -an -vb 1000k -s 960x540 `echo $1 | sed 's/\(.*\.\)mp4/\1mov/'` +