diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 962673616..186263aa4 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -265,7 +265,7 @@ elseif(PCB STREQUAL SKY9X OR PCB STREQUAL 9XRPRO OR PCB STREQUAL AR9X) add_definitions(-DEEPROM_VARIANT=0) set(GUI_SRC ${GUI_SRC} ${9X_GUI_SRC} menu_general_hardware.cpp view_telemetry.cpp view_text.cpp view_about.cpp) set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} core_cm3.c board_lowlevel.c crt.c vectors_sam3s.c) - set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} lcd_driver.cpp + set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} lcd_driver.cpp pwr_driver.cpp usb/device/core/USBD_UDP.c usb/device/core/USBDDriver.c usb/device/massstorage/MSDDriver.c usb/device/massstorage/MSDDStateMachine.c usb/device/massstorage/MSDLun.c usb/device/massstorage/MSDDriverDescriptors.c usb/device/massstorage/SBCMethods.c usb/common/core/USBEndpointDescriptor.c @@ -278,7 +278,6 @@ elseif(PCB STREQUAL SKY9X OR PCB STREQUAL 9XRPRO OR PCB STREQUAL AR9X) board_sky9x.cpp telemetry_driver.cpp serial2_driver.cpp - pwr_driver.cpp adc_driver.cpp eeprom_driver.cpp pulses_driver.cpp diff --git a/radio/src/targets/simu/simpgmspace.cpp b/radio/src/targets/simu/simpgmspace.cpp index e0b5e8b51..8802d2c92 100644 --- a/radio/src/targets/simu/simpgmspace.cpp +++ b/radio/src/targets/simu/simpgmspace.cpp @@ -1310,15 +1310,18 @@ int lcdRestoreBackupBuffer() } #endif -#if defined(PWR_BUTTON_DELAY) -uint32_t pwrPressed() { return false; } -#elif defined(PCBTARANIS) || defined(PCBFLAMENCO) || defined(PCBHORUS) +uint32_t pwroffPressed() { return false; } + +#if defined(CPUARM) && !defined(PWR_BUTTON_DELAY) uint32_t pwrCheck() { return true; } #endif +#if defined(CPUARM) +void pwrOff() { } +#endif + #if defined(CPUSTM32) void pwrInit() { } -void pwrOff() { } int usbPlugged() { return false; } void USART_DeInit(USART_TypeDef* ) { } ErrorStatus RTC_SetTime(uint32_t RTC_Format, RTC_TimeTypeDef* RTC_TimeStruct) { return SUCCESS; } diff --git a/radio/src/targets/sky9x/board_sky9x.h b/radio/src/targets/sky9x/board_sky9x.h index 258cde686..085ad9c3f 100644 --- a/radio/src/targets/sky9x/board_sky9x.h +++ b/radio/src/targets/sky9x/board_sky9x.h @@ -264,6 +264,7 @@ void btPushByte(uint8_t data); void pwrInit(); void pwrOff(); uint32_t pwrCheck(); +uint32_t pwroffPressed(); #define UNEXPECTED_SHUTDOWN() (g_eeGeneral.unexpectedShutdown) // EEPROM driver diff --git a/radio/src/targets/sky9x/pwr_driver.cpp b/radio/src/targets/sky9x/pwr_driver.cpp index 60d3f4f00..268ed2f92 100644 --- a/radio/src/targets/sky9x/pwr_driver.cpp +++ b/radio/src/targets/sky9x/pwr_driver.cpp @@ -1,24 +1,33 @@ -/* - * 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 "../../opentx.h" +/* + * 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 "opentx.h" + +uint32_t pwroffPressed() +{ +#if defined(SIMU) || defined(REVA) + return false; +#else + return !(PIOC->PIO_PDSR & PIO_PC17); +#endif +} uint32_t pwrCheck() { @@ -32,7 +41,7 @@ uint32_t pwrCheck() else return e_power_on; #elif defined(REVB) - if (PIOC->PIO_PDSR & PIO_PC17) + if (!pwroffPressed()) return e_power_on; else if (usbPlugged()) return e_power_usb; @@ -41,7 +50,7 @@ uint32_t pwrCheck() else return e_power_off; #else - if (PIOC->PIO_PDSR & PIO_PC17) + if (!pwroffPressed()) return e_power_on; else if (PIOA->PIO_PDSR & PIO_PA8) return e_power_trainer; diff --git a/radio/src/targets/taranis/board_taranis.h b/radio/src/targets/taranis/board_taranis.h index d9ca59219..92f3bc580 100644 --- a/radio/src/targets/taranis/board_taranis.h +++ b/radio/src/targets/taranis/board_taranis.h @@ -286,6 +286,9 @@ void pwrOff(void); #if defined(REV9E) uint32_t pwrPressed(void); uint32_t pwrPressedDuration(void); +#define pwroffPressed() pwrPressed() +#else +uint32_t pwroffPressed(void); #endif #define UNEXPECTED_SHUTDOWN() (g_eeGeneral.unexpectedShutdown) diff --git a/radio/src/targets/taranis/pwr_driver.c b/radio/src/targets/taranis/pwr_driver.c index d76484560..13d8400ee 100644 --- a/radio/src/targets/taranis/pwr_driver.c +++ b/radio/src/targets/taranis/pwr_driver.c @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -18,7 +18,7 @@ * GNU General Public License for more details. */ -#include "../../pwr.h" +#include "pwr.h" #include "board_taranis.h" void pwrInit() @@ -43,12 +43,12 @@ void pwrInit() GPIO_InitStructure.GPIO_Pin = INTMODULE_PWR_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_Init(INTMODULE_PWR_GPIO, &GPIO_InitStructure); - + GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN); GPIO_InitStructure.GPIO_Pin = EXTMODULE_PWR_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_Init(EXTMODULE_PWR_GPIO, &GPIO_InitStructure); - + GPIO_InitStructure.GPIO_Pin = TRAINER_GPIO_PIN_DETECT; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_Init(TRAINER_GPIO_DETECT, &GPIO_InitStructure); @@ -71,7 +71,7 @@ void pwrOff() while(1) { wdt_reset(); #if defined(REV9E) - // 9E needs watchdog reset because CPU is still running while + // 9E needs watchdog reset because CPU is still running while // the power key is held pressed by the user. // The power key should be released by now, but we must make sure if (!pwrPressed()) { @@ -87,7 +87,7 @@ void pwrOff() } #endif } - //this function must not return! + // this function must not return! } #if defined(REV9E) @@ -95,20 +95,21 @@ uint32_t pwrPressed() { return GPIO_ReadInputDataBit(PWR_GPIO, PWR_SWITCH_GPIO_PIN) == Bit_RESET; } +#else +uint32_t pwroffPressed() +{ + return GPIO_ReadInputDataBit(PWR_GPIO, PWR_SWITCH_GPIO_PIN) != Bit_RESET; +} #endif #if !defined(REV9E) uint32_t pwrCheck() { -#if defined(SIMU) - return e_power_on; -#else - if (GPIO_ReadInputDataBit(PWR_GPIO, PWR_SWITCH_GPIO_PIN) == Bit_RESET) + if (!pwroffPressed()) return e_power_on; else if (usbPlugged()) return e_power_usb; else return e_power_off; -#endif } #endif diff --git a/radio/src/tasks_arm.cpp b/radio/src/tasks_arm.cpp index 3e36f72c9..903cd3198 100644 --- a/radio/src/tasks_arm.cpp +++ b/radio/src/tasks_arm.cpp @@ -91,6 +91,32 @@ uint16_t stackAvailable() } #endif +volatile uint16_t timeForcePowerOffPressed = 0; + +void resetForcePowerOffRequest() +{ + timeForcePowerOffPressed = 0; +} + +bool isForcePowerOffRequested() +{ + if (pwroffPressed()) { + if (timeForcePowerOffPressed == 0) { + timeForcePowerOffPressed = get_tmr10ms(); + } + else { + uint16_t delay = (uint16_t)get_tmr10ms() - timeForcePowerOffPressed; + if (delay > 1000/*10s*/) { + return true; + } + } + } + else { + resetForcePowerOffRequest(); + } + return false; +} + uint32_t nextMixerTime[NUM_MODULES]; void mixerTask(void * pdata) @@ -111,6 +137,10 @@ void mixerTask(void * pdata) CoTickDelay(1); + if (isForcePowerOffRequested()) { + pwrOff(); + } + uint32_t now = CoGetOSTime(); bool run = false; if ((now - lastRunTime) > 10) { // run at least every 20ms @@ -160,7 +190,7 @@ void mixerTask(void * pdata) void scheduleNextMixerCalculation(uint8_t module, uint16_t delay) { - // Schedule next mixer calculation time, + // Schedule next mixer calculation time, // for now assume mixer calculation takes 2 ms. nextMixerTime[module] = (uint32_t)CoGetOSTime() + (delay)/2 - 1/*2ms*/; DEBUG_TIMER_STOP(debugTimerMixerCalcToUsage); @@ -197,6 +227,8 @@ void menusTask(void * pdata) CoTickDelay(MENU_TASK_PERIOD_TICKS - runtime); } + resetForcePowerOffRequest(); + #if defined(SIMU) if (main_thread_running == 0) break;