1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-21 15:25:17 +03:00

Add support for pwr-on and power-off speed

This commit is contained in:
Raphael Coeffic 2019-08-14 23:37:08 +02:00
parent 8d9a7c22e6
commit 995888ae41
32 changed files with 927 additions and 739 deletions

View file

@ -148,7 +148,8 @@ enum Capability {
HasBatMeterRange, HasBatMeterRange,
DangerousFunctions, DangerousFunctions,
HasModelCategories, HasModelCategories,
HasSwitchableJack HasSwitchableJack,
PwrButtonPress
}; };
class EEPROMInterface class EEPROMInterface

View file

@ -170,6 +170,9 @@ class GeneralSettings {
int gyroMax; int gyroMax;
int gyroOffset; int gyroOffset;
unsigned int pwrOnSpeed;
unsigned int pwrOffSpeed;
bool switchPositionAllowedTaranis(int index) const; bool switchPositionAllowedTaranis(int index) const;
bool switchSourceAllowedTaranis(int index) const; bool switchSourceAllowedTaranis(int index) const;
bool isPotAvailable(int index) const; bool isPotAvailable(int index) const;

View file

@ -2404,7 +2404,16 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type
if (version < 218) internalField.Append(new UnsignedField<8>(this, generalData.rotarySteps)); if (version < 218) internalField.Append(new UnsignedField<8>(this, generalData.rotarySteps));
internalField.Append(new UnsignedField<8>(this, generalData.countryCode)); internalField.Append(new UnsignedField<2>(this, generalData.countryCode));
if (version >= 219 && IS_HORUS_OR_TARANIS(board)) {
internalField.Append(new UnsignedField<2>(this, generalData.pwrOnSpeed, "Power On Speed"));
internalField.Append(new UnsignedField<4>(this, generalData.pwrOffSpeed, "Power Off Speed"));
}
else {
internalField.Append(new SpareBitsField<6>(this));
}
internalField.Append(new UnsignedField<1>(this, generalData.imperial)); internalField.Append(new UnsignedField<1>(this, generalData.imperial));
if (version >= 218) { if (version >= 218) {
internalField.Append(new BoolField<1>(this, generalData.jitterFilter)); internalField.Append(new BoolField<1>(this, generalData.jitterFilter));

View file

@ -734,6 +734,8 @@ int OpenTxFirmware::getCapability(::Capability capability)
return IS_HORUS(board); return IS_HORUS(board);
case HasSwitchableJack: case HasSwitchableJack:
return IS_TARANIS_XLITES(board); return IS_TARANIS_XLITES(board);
case PwrButtonPress:
return IS_HORUS_OR_TARANIS(board) && (board!=Board::BOARD_TARANIS_X9D) && (board!=Board::BOARD_TARANIS_X9DP);
default: default:
return 0; return 0;
} }

View file

@ -255,6 +255,17 @@ ui(new Ui::GeneralSetup)
ui->splashScreenChkB->setChecked(!generalSettings.splashMode); ui->splashScreenChkB->setChecked(!generalSettings.splashMode);
} }
if (!firmware->getCapability(PwrButtonPress)) {
ui->pwrOnSpeedLabel->hide();
ui->pwrOnSpeed->hide();
ui->pwrOffSpeedLabel->hide();
ui->pwrOffSpeed->hide();
}
else if (!IS_TARANIS(firmware->getBoard())) {
ui->pwrOnSpeedLabel->hide();
ui->pwrOnSpeed->hide();
}
setValues(); setValues();
lock = false; lock = false;
@ -441,6 +452,9 @@ void GeneralSetupPanel::setValues()
ui->vBatMinDSB->setValue((double)(generalSettings.vBatMin + 90) / 10); ui->vBatMinDSB->setValue((double)(generalSettings.vBatMin + 90) / 10);
ui->vBatMaxDSB->setValue((double)(generalSettings.vBatMax + 120) / 10); ui->vBatMaxDSB->setValue((double)(generalSettings.vBatMax + 120) / 10);
} }
ui->pwrOnSpeed->setValue(generalSettings.pwrOnSpeed);
ui->pwrOffSpeed->setValue(generalSettings.pwrOffSpeed);
} }
void GeneralSetupPanel::on_faimode_CB_stateChanged(int) void GeneralSetupPanel::on_faimode_CB_stateChanged(int)
@ -493,6 +507,17 @@ void GeneralSetupPanel::on_splashScreenDuration_currentIndexChanged(int index)
emit modified(); emit modified();
} }
void GeneralSetupPanel::on_pwrOnSpeed_valueChanged()
{
generalSettings.pwrOnSpeed = ui->pwrOnSpeed->value();
emit modified();
}
void GeneralSetupPanel::on_pwrOffSpeed_valueChanged()
{
generalSettings.pwrOffSpeed = ui->pwrOffSpeed->value();
emit modified();
}
void GeneralSetupPanel::on_beepVolume_SL_valueChanged() void GeneralSetupPanel::on_beepVolume_SL_valueChanged()
{ {

View file

@ -88,6 +88,8 @@ class GeneralSetupPanel : public GeneralPanel
void on_vBatMaxDSB_editingFinished(); void on_vBatMaxDSB_editingFinished();
void on_contrastSB_editingFinished(); void on_contrastSB_editingFinished();
void on_pwrOnSpeed_valueChanged();
void on_pwrOffSpeed_valueChanged();
private: private:
Ui::GeneralSetup *ui; Ui::GeneralSetup *ui;

File diff suppressed because it is too large Load diff

View file

@ -771,7 +771,14 @@ PACK(struct RadioData {
NOBACKUP(uint32_t globalTimer); NOBACKUP(uint32_t globalTimer);
NOBACKUP(uint8_t bluetoothBaudrate:4); NOBACKUP(uint8_t bluetoothBaudrate:4);
NOBACKUP(uint8_t bluetoothMode:4); NOBACKUP(uint8_t bluetoothMode:4);
NOBACKUP(uint8_t countryCode); NOBACKUP(uint8_t countryCode:2);
#if defined(PCBHORUS) || defined(PCBTARANIS)
NOBACKUP(uint8_t pwrOnSpeed:2);
NOBACKUP(uint8_t pwrOffSpeed:2);
NOBACKUP(uint8_t spareCC:2);
#else
NOBACKUP(uint8_t spareCC:6);
#endif
NOBACKUP(uint8_t imperial:1); NOBACKUP(uint8_t imperial:1);
NOBACKUP(uint8_t jitterFilter:1); /* 0 - active */ NOBACKUP(uint8_t jitterFilter:1); /* 0 - active */
NOBACKUP(uint8_t disableRssiPoweroffAlarm:1); NOBACKUP(uint8_t disableRssiPoweroffAlarm:1);

View file

@ -87,6 +87,8 @@ enum {
CASE_PWM_BACKLIGHT(ITEM_RADIO_SETUP_BACKLIGHT_BRIGHTNESS_ON) CASE_PWM_BACKLIGHT(ITEM_RADIO_SETUP_BACKLIGHT_BRIGHTNESS_ON)
ITEM_RADIO_SETUP_FLASH_BEEP, ITEM_RADIO_SETUP_FLASH_BEEP,
CASE_SPLASH_PARAM(ITEM_RADIO_SETUP_DISABLE_SPLASH) CASE_SPLASH_PARAM(ITEM_RADIO_SETUP_DISABLE_SPLASH)
CASE_PWR_BUTTON_PRESS(ITEM_RADIO_SETUP_PWR_ON_SPEED)
CASE_PWR_BUTTON_PRESS(ITEM_RADIO_SETUP_PWR_OFF_SPEED)
CASE_PXX2(ITEM_RADIO_SETUP_OWNER_ID) CASE_PXX2(ITEM_RADIO_SETUP_OWNER_ID)
CASE_GPS(ITEM_RADIO_SETUP_TIMEZONE) CASE_GPS(ITEM_RADIO_SETUP_TIMEZONE)
ITEM_RADIO_SETUP_ADJUST_RTC, ITEM_RADIO_SETUP_ADJUST_RTC,
@ -155,7 +157,8 @@ void menuRadioSetup(event_t event)
CASE_PWM_BACKLIGHT(0) CASE_PWM_BACKLIGHT(0)
0, 0,
CASE_SPLASH_PARAM(0) CASE_SPLASH_PARAM(0)
CASE_PWR_BUTTON_PRESS(0)
CASE_PWR_BUTTON_PRESS(0)
CASE_PXX2(0) /* owner registration ID */ CASE_PXX2(0) /* owner registration ID */
CASE_GPS(0) CASE_GPS(0)
@ -506,6 +509,20 @@ void menuRadioSetup(event_t event)
} }
#endif #endif
#if defined(PWR_BUTTON_PRESS)
case ITEM_RADIO_SETUP_PWR_ON_SPEED:
lcdDrawTextAlignedLeft(y, STR_PWR_ON_SPEED);
lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.pwrOnSpeed, attr|LEFT);
if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.pwrOnSpeed, 0, 3);
break;
case ITEM_RADIO_SETUP_PWR_OFF_SPEED:
lcdDrawTextAlignedLeft(y, STR_PWR_OFF_SPEED);
lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.pwrOffSpeed, attr|LEFT);
if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.pwrOffSpeed, 0, 3);
break;
#endif
#if defined(PXX2) #if defined(PXX2)
case ITEM_RADIO_SETUP_OWNER_ID: case ITEM_RADIO_SETUP_OWNER_ID:
editSingleName(RADIO_SETUP_2ND_COLUMN, y, STR_OWNER_ID, g_eeGeneral.ownerRegistrationID, PXX2_LEN_REGISTRATION_ID, event, attr); editSingleName(RADIO_SETUP_2ND_COLUMN, y, STR_OWNER_ID, g_eeGeneral.ownerRegistrationID, PXX2_LEN_REGISTRATION_ID, event, attr);

View file

@ -20,8 +20,6 @@
#include "opentx.h" #include "opentx.h"
#define PWR_PRESS_DURATION_MIN 100 // 1s
#define PWR_PRESS_DURATION_MAX 500 // 5s
#define SLEEP_BITMAP_WIDTH 60 #define SLEEP_BITMAP_WIDTH 60
#define SLEEP_BITMAP_HEIGHT 60 #define SLEEP_BITMAP_HEIGHT 60
@ -30,9 +28,11 @@ const unsigned char bmp_sleep[] = {
#include "sleep.lbm" #include "sleep.lbm"
}; };
void drawStartupAnimation(uint32_t duration) void drawStartupAnimation(uint32_t duration, uint32_t total_duration)
{ {
uint8_t index = limit<uint8_t>(0, duration / (PWR_PRESS_DURATION_MIN / 5), 4); if (total_duration == 0) return;
uint8_t index = limit<uint8_t>(0, duration / (total_duration / 5), 4);
lcdRefreshWait(); lcdRefreshWait();
lcdClear(); lcdClear();
@ -47,9 +47,11 @@ void drawStartupAnimation(uint32_t duration)
lcdRefreshWait(); lcdRefreshWait();
} }
void drawShutdownAnimation(uint32_t duration, const char * message) void drawShutdownAnimation(uint32_t duration, uint32_t total_duration, const char * message)
{ {
uint8_t index = limit<uint8_t>(0, duration / (PWR_PRESS_SHUTDOWN_DELAY / 5), 4); if (total_duration == 0) return;
uint8_t index = limit<uint8_t>(0, duration / (total_duration / 5), 4);
lcdRefreshWait(); lcdRefreshWait();
lcdClear(); lcdClear();

View file

@ -78,6 +78,8 @@ enum MenuRadioSetupItems {
CASE_PCBX9E_PCBX9DP(ITEM_RADIO_SETUP_BACKLIGHT_COLOR) CASE_PCBX9E_PCBX9DP(ITEM_RADIO_SETUP_BACKLIGHT_COLOR)
ITEM_RADIO_SETUP_FLASH_BEEP, ITEM_RADIO_SETUP_FLASH_BEEP,
CASE_SPLASH_PARAM(ITEM_RADIO_SETUP_DISABLE_SPLASH) CASE_SPLASH_PARAM(ITEM_RADIO_SETUP_DISABLE_SPLASH)
CASE_PWR_BUTTON_PRESS(ITEM_RADIO_SETUP_PWR_ON_SPEED)
CASE_PWR_BUTTON_PRESS(ITEM_RADIO_SETUP_PWR_OFF_SPEED)
#if defined(PXX2) #if defined(PXX2)
ITEM_RADIO_SETUP_OWNER_ID, ITEM_RADIO_SETUP_OWNER_ID,
#endif #endif
@ -155,6 +157,8 @@ void menuRadioSetup(event_t event)
CASE_PCBX9E_PCBX9DP(0) // backlight color CASE_PCBX9E_PCBX9DP(0) // backlight color
0, // flash beep 0, // flash beep
CASE_SPLASH_PARAM(0) // disable splash CASE_SPLASH_PARAM(0) // disable splash
CASE_PWR_BUTTON_PRESS(0) // pwr on speed
CASE_PWR_BUTTON_PRESS(0) // pwr off speed
CASE_PXX2(0) CASE_PXX2(0)
CASE_GPS(LABEL(GPS)) CASE_GPS(LABEL(GPS))
CASE_GPS(0) // timezone CASE_GPS(0) // timezone
@ -466,6 +470,20 @@ void menuRadioSetup(event_t event)
break; break;
#endif #endif
#if defined(PWR_BUTTON_PRESS)
case ITEM_RADIO_SETUP_PWR_ON_SPEED:
lcdDrawTextAlignedLeft(y, STR_PWR_ON_SPEED);
lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.pwrOnSpeed, attr|LEFT);
if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.pwrOnSpeed, 0, 3);
break;
case ITEM_RADIO_SETUP_PWR_OFF_SPEED:
lcdDrawTextAlignedLeft(y, STR_PWR_OFF_SPEED);
lcdDrawNumber(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.pwrOffSpeed, attr|LEFT);
if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.pwrOffSpeed, 0, 3);
break;
#endif
#if defined(TELEMETRY_FRSKY) && defined(GPS) #if defined(TELEMETRY_FRSKY) && defined(GPS)
case ITEM_RADIO_SETUP_LABEL_GPS: case ITEM_RADIO_SETUP_LABEL_GPS:
lcdDrawTextAlignedLeft(y, STR_GPS); lcdDrawTextAlignedLeft(y, STR_GPS);

View file

@ -20,8 +20,6 @@
#include "opentx.h" #include "opentx.h"
#define PWR_PRESS_DURATION_MIN 100 // 1s
#define PWR_PRESS_DURATION_MAX 500 // 5s
#define ANIMATIONS_BITMAP_WIDTH 60 #define ANIMATIONS_BITMAP_WIDTH 60
#define ANIMATIONS_BITMAP_HEIGHT 60 #define ANIMATIONS_BITMAP_HEIGHT 60
@ -42,9 +40,11 @@ const unsigned char bmp_sleep[] = {
#include "sleep.lbm" #include "sleep.lbm"
}; };
void drawStartupAnimation(uint32_t duration) void drawStartupAnimation(uint32_t duration, uint32_t total_duration)
{ {
uint8_t index = limit<uint8_t>(0, duration / (PWR_PRESS_DURATION_MIN / 5), 4); if (total_duration == 0) return;
uint8_t index = limit<uint8_t>(0, duration / (total_duration / 5), 4);
lcdRefreshWait(); lcdRefreshWait();
lcdClear(); lcdClear();
@ -57,9 +57,11 @@ void drawStartupAnimation(uint32_t duration)
lcdRefresh(); lcdRefresh();
} }
void drawShutdownAnimation(uint32_t duration, const char * message) void drawShutdownAnimation(uint32_t duration, uint32_t total_duration, const char * message)
{ {
uint8_t index = limit<uint8_t>(0, duration / (PWR_PRESS_SHUTDOWN_DELAY / 4), 3); if (total_duration == 0) return;
uint8_t index = limit<uint8_t>(0, duration / (total_duration / 4), 3);
lcdRefreshWait(); lcdRefreshWait();
lcdClear(); lcdClear();

View file

@ -66,6 +66,7 @@ enum menuRadioSetupItems {
ITEM_SETUP_BRIGHTNESS, ITEM_SETUP_BRIGHTNESS,
ITEM_SETUP_DIM_LEVEL, ITEM_SETUP_DIM_LEVEL,
ITEM_SETUP_FLASH_BEEP, ITEM_SETUP_FLASH_BEEP,
CASE_PWR_BUTTON_PRESS(ITEM_SETUP_PWR_OFF_SPEED)
CASE_GPS(ITEM_SETUP_LABEL_GPS) CASE_GPS(ITEM_SETUP_LABEL_GPS)
CASE_GPS(ITEM_SETUP_TIMEZONE) CASE_GPS(ITEM_SETUP_TIMEZONE)
CASE_GPS(ITEM_SETUP_ADJUST_RTC) CASE_GPS(ITEM_SETUP_ADJUST_RTC)
@ -114,6 +115,7 @@ bool menuRadioSetup(event_t event)
CASE_HAPTIC(LABEL(HAPTIC)) CASE_HAPTIC(0) CASE_HAPTIC(0) CASE_HAPTIC(0) CASE_HAPTIC(LABEL(HAPTIC)) CASE_HAPTIC(0) CASE_HAPTIC(0) CASE_HAPTIC(0)
LABEL(ALARMS), 0, 0, 0, 0, LABEL(ALARMS), 0, 0, 0, 0,
LABEL(BACKLIGHT), 0, 0, 0, 0, 0, LABEL(BACKLIGHT), 0, 0, 0, 0, 0,
CASE_PWR_BUTTON_PRESS(0)
CASE_GPS(LABEL(GPS)) CASE_GPS(0) CASE_GPS(0) CASE_GPS(0) CASE_GPS(LABEL(GPS)) CASE_GPS(0) CASE_GPS(0) CASE_GPS(0)
CASE_PXX1(0) 0, 0, FAI_CHOICE_ROW 0, 0, 0, 0, 1/*to force edit mode*/ }); // Country code - Voice Language - Units - Fai choice - Play delay - USB mode - Chan order - Mode (1 to 4) CASE_PXX1(0) 0, 0, FAI_CHOICE_ROW 0, 0, 0, 0, 1/*to force edit mode*/ }); // Country code - Voice Language - Units - Fai choice - Play delay - USB mode - Chan order - Mode (1 to 4)
@ -380,6 +382,13 @@ bool menuRadioSetup(event_t event)
g_eeGeneral.blOffBright = editSlider(RADIO_SETUP_2ND_COLUMN, y, event, g_eeGeneral.blOffBright, BACKLIGHT_LEVEL_MIN, BACKLIGHT_LEVEL_MAX, attr); g_eeGeneral.blOffBright = editSlider(RADIO_SETUP_2ND_COLUMN, y, event, g_eeGeneral.blOffBright, BACKLIGHT_LEVEL_MIN, BACKLIGHT_LEVEL_MAX, attr);
break; break;
#if defined(PWR_BUTTON_PRESS)
case ITEM_SETUP_PWR_OFF_SPEED:
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_PWR_OFF_SPEED);
g_eeGeneral.pwrOffSpeed = editSlider(RADIO_SETUP_2ND_COLUMN, y, event, g_eeGeneral.pwrOffSpeed, 0, 3, attr);
break;
#endif
case ITEM_SETUP_LABEL_GPS: case ITEM_SETUP_LABEL_GPS:
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_GPS); lcdDrawText(MENUS_MARGIN_LEFT, y, STR_GPS);
break; break;

View file

@ -391,8 +391,10 @@ void drawSleepBitmap()
} }
#define SHUTDOWN_CIRCLE_DIAMETER 150 #define SHUTDOWN_CIRCLE_DIAMETER 150
void drawShutdownAnimation(uint32_t duration, const char * message) void drawShutdownAnimation(uint32_t duration, uint32_t total_duration, const char * message)
{ {
if (total_duration == 0) return;
static uint32_t lastDuration = 0xffffffff; static uint32_t lastDuration = 0xffffffff;
static const BitmapBuffer * shutdown = BitmapBuffer::load(getThemePath("shutdown.bmp")); static const BitmapBuffer * shutdown = BitmapBuffer::load(getThemePath("shutdown.bmp"));
@ -404,7 +406,7 @@ void drawShutdownAnimation(uint32_t duration, const char * message)
} }
else { else {
lcdRestoreBackupBuffer(); lcdRestoreBackupBuffer();
int quarter = duration / (PWR_PRESS_SHUTDOWN_DELAY / 5); int quarter = duration / (total_duration / 5);
if (quarter >= 1) lcdDrawBitmapPattern(LCD_W/2, (LCD_H-SHUTDOWN_CIRCLE_DIAMETER)/2, LBM_SHUTDOWN_CIRCLE, TEXT_COLOR, 0, SHUTDOWN_CIRCLE_DIAMETER/2); if (quarter >= 1) lcdDrawBitmapPattern(LCD_W/2, (LCD_H-SHUTDOWN_CIRCLE_DIAMETER)/2, LBM_SHUTDOWN_CIRCLE, TEXT_COLOR, 0, SHUTDOWN_CIRCLE_DIAMETER/2);
if (quarter >= 2) lcdDrawBitmapPattern(LCD_W/2, LCD_H/2, LBM_SHUTDOWN_CIRCLE, TEXT_COLOR, SHUTDOWN_CIRCLE_DIAMETER/2, SHUTDOWN_CIRCLE_DIAMETER/2); if (quarter >= 2) lcdDrawBitmapPattern(LCD_W/2, LCD_H/2, LBM_SHUTDOWN_CIRCLE, TEXT_COLOR, SHUTDOWN_CIRCLE_DIAMETER/2, SHUTDOWN_CIRCLE_DIAMETER/2);
if (quarter >= 3) lcdDrawBitmapPattern((LCD_W-SHUTDOWN_CIRCLE_DIAMETER)/2, LCD_H/2, LBM_SHUTDOWN_CIRCLE, TEXT_COLOR, SHUTDOWN_CIRCLE_DIAMETER, SHUTDOWN_CIRCLE_DIAMETER/2); if (quarter >= 3) lcdDrawBitmapPattern((LCD_W-SHUTDOWN_CIRCLE_DIAMETER)/2, LCD_H/2, LBM_SHUTDOWN_CIRCLE, TEXT_COLOR, SHUTDOWN_CIRCLE_DIAMETER, SHUTDOWN_CIRCLE_DIAMETER/2);
@ -413,7 +415,7 @@ void drawShutdownAnimation(uint32_t duration, const char * message)
} }
else { else {
lcd->clear(); lcd->clear();
int quarter = duration / (PWR_PRESS_SHUTDOWN_DELAY / 5); int quarter = duration / (total_duration / 5);
for (int i=1; i<=4; i++) { for (int i=1; i<=4; i++) {
if (quarter >= i) { if (quarter >= i) {
lcd->drawSolidFilledRect(LCD_W / 2 - 70 + 24 * i, LCD_H / 2 - 10, 20, 20, TEXT_BGCOLOR); lcd->drawSolidFilledRect(LCD_W / 2 - 70 + 24 * i, LCD_H / 2 - 10, 20, 20, TEXT_BGCOLOR);

View file

@ -69,7 +69,7 @@ int16_t editGVarFieldValue(coord_t x, coord_t y, int16_t value, int16_t min, int
void drawMenuTemplate(const char * title, uint8_t icon, const uint8_t * icons=nullptr, uint32_t options=0); void drawMenuTemplate(const char * title, uint8_t icon, const uint8_t * icons=nullptr, uint32_t options=0);
void drawSplash(); void drawSplash();
void drawSleepBitmap(); void drawSleepBitmap();
void drawShutdownAnimation(uint32_t duration, const char * message); void drawShutdownAnimation(uint32_t duration, uint32_t total_duration, const char * message);
// Main view standard widgets // Main view standard widgets
void drawTopBar(); void drawTopBar();

View file

@ -36,8 +36,8 @@ inline void drawTimer(coord_t x, coord_t y, int32_t tme, LcdFlags att = 0)
drawTimer(x, y, tme, att, att); drawTimer(x, y, tme, att, att);
} }
void drawStartupAnimation(uint32_t duration); void drawStartupAnimation(uint32_t duration, uint32_t total_duration);
void drawShutdownAnimation(uint32_t duration, const char * message); void drawShutdownAnimation(uint32_t duration, uint32_t total_duration, const char * message);
void drawSleepBitmap(); void drawSleepBitmap();
#endif // _COMMON_DRAW_FUNCTIONS_H_ #endif // _COMMON_DRAW_FUNCTIONS_H_

View file

@ -1728,8 +1728,17 @@ void copyTrimsToOffset(uint8_t ch)
storageDirty(EE_MODEL); storageDirty(EE_MODEL);
} }
const uint8_t _pwrOnOffDuration_lookup[] = {
200, // 2s
100, // 1s
50, // 0.5s
0, // none
};
#if defined(STARTUP_ANIMATION) #if defined(STARTUP_ANIMATION)
#define PWR_PRESS_DURATION_MIN 100 // 1s
#define PWR_PRESS_DURATION_MIN() (_pwrOnOffDuration_lookup[g_eeGeneral.pwrOnSpeed & 3])
#define PWR_PRESS_DURATION_MAX 500 // 5s #define PWR_PRESS_DURATION_MAX 500 // 5s
void runStartupAnimation() void runStartupAnimation()
@ -1740,8 +1749,8 @@ void runStartupAnimation()
while (pwrPressed()) { while (pwrPressed()) {
duration = get_tmr10ms() - start; duration = get_tmr10ms() - start;
if (duration < PWR_PRESS_DURATION_MIN) { if (duration < PWR_PRESS_DURATION_MIN()) {
drawStartupAnimation(duration); drawStartupAnimation(duration, PWR_PRESS_DURATION_MIN());
} }
else if (duration >= PWR_PRESS_DURATION_MAX) { else if (duration >= PWR_PRESS_DURATION_MAX) {
drawSleepBitmap(); drawSleepBitmap();
@ -1754,7 +1763,7 @@ void runStartupAnimation()
} }
} }
if (duration < PWR_PRESS_DURATION_MIN || duration >= PWR_PRESS_DURATION_MAX) { if (duration < PWR_PRESS_DURATION_MIN() || duration >= PWR_PRESS_DURATION_MAX) {
boardOff(); boardOff();
} }
} }
@ -2025,6 +2034,9 @@ int main()
#if !defined(SIMU) #if !defined(SIMU)
#if defined(PWR_BUTTON_PRESS) #if defined(PWR_BUTTON_PRESS)
#define PWR_PRESS_SHUTDOWN_DELAY() (_pwrOnOffDuration_lookup[g_eeGeneral.pwrOffSpeed & 3])
uint32_t pwr_press_time = 0; uint32_t pwr_press_time = 0;
uint32_t pwrPressedDuration() uint32_t pwrPressedDuration()
@ -2070,7 +2082,7 @@ uint32_t pwrCheck()
if (g_eeGeneral.backlightMode != e_backlight_mode_off) { if (g_eeGeneral.backlightMode != e_backlight_mode_off) {
BACKLIGHT_ENABLE(); BACKLIGHT_ENABLE();
} }
if (get_tmr10ms() - pwr_press_time > PWR_PRESS_SHUTDOWN_DELAY) { if (get_tmr10ms() - pwr_press_time > (uint32_t)PWR_PRESS_SHUTDOWN_DELAY()) {
#if defined(SHUTDOWN_CONFIRMATION) #if defined(SHUTDOWN_CONFIRMATION)
while (1) { while (1) {
#else #else
@ -2100,7 +2112,7 @@ uint32_t pwrCheck()
return e_power_off; return e_power_off;
} }
else { else {
drawShutdownAnimation(pwrPressedDuration(), message); drawShutdownAnimation(pwrPressedDuration(), PWR_PRESS_SHUTDOWN_DELAY(), message);
return e_power_press; return e_power_press;
} }
} }

View file

@ -127,6 +127,12 @@
#define CASE_SPLASH(x) #define CASE_SPLASH(x)
#endif #endif
#if defined(PWR_BUTTON_PRESS)
#define CASE_PWR_BUTTON_PRESS(x) x,
#else
#define CASE_PWR_BUTTON_PRESS(x)
#endif
#if defined(TELEMETRY_FRSKY) #if defined(TELEMETRY_FRSKY)
#define CASE_FRSKY(x) x, #define CASE_FRSKY(x) x,
#else #else
@ -293,8 +299,6 @@ void memswap(void * a, void * b, uint8_t size);
#define pwrOffPressed() (!pwrPressed()) #define pwrOffPressed() (!pwrPressed())
#endif #endif
#define PWR_PRESS_SHUTDOWN_DELAY 300 // 3s
#define GET_LOWRES_POT_POSITION(i) (getValue(MIXSRC_FIRST_POT+(i)) >> 4) #define GET_LOWRES_POT_POSITION(i) (getValue(MIXSRC_FIRST_POT+(i)) >> 4)
#define SAVE_POT_POSITION(i) g_model.potsWarnPosition[i] = GET_LOWRES_POT_POSITION(i) #define SAVE_POT_POSITION(i) g_model.potsWarnPosition[i] = GET_LOWRES_POT_POSITION(i)

View file

@ -213,6 +213,17 @@ int main()
pwrInit(); pwrInit();
pwrOff(); pwrOff();
// wait a bit for the inputs to stabilize...
// ... otherwise the bootloader cannot be started
// when the power on delay is cut to 0.
for (int i=0; i<5000;i++)
readTrims();
// avoid booting after DFU bootloader
if (!pwrPressed()) {
boardOff();
}
// LHR & RHL trims not pressed simultanously // LHR & RHL trims not pressed simultanously
if (readTrims() != BOOTLOADER_KEYS) { if (readTrims() != BOOTLOADER_KEYS) {
// Start main application // Start main application

View file

@ -236,6 +236,8 @@ const char STR_MENULOGICALSWITCH[] = TR_MENULOGICALSWITCH;
const char STR_MENULOGICALSWITCHES[] = TR_MENULOGICALSWITCHES; const char STR_MENULOGICALSWITCHES[] = TR_MENULOGICALSWITCHES;
const char STR_MENUCUSTOMFUNC[] = TR_MENUCUSTOMFUNC; const char STR_MENUCUSTOMFUNC[] = TR_MENUCUSTOMFUNC;
const char STR_SPLASHSCREEN[] = TR_SPLASHSCREEN; const char STR_SPLASHSCREEN[] = TR_SPLASHSCREEN;
const char STR_PWR_ON_SPEED[] = TR_PWR_ON_SPEED;
const char STR_PWR_OFF_SPEED[] = TR_PWR_OFF_SPEED;
const char STR_THROTTLEWARNING[] = TR_THROTTLEWARNING; const char STR_THROTTLEWARNING[] = TR_THROTTLEWARNING;
const char STR_SWITCHWARNING[] = TR_SWITCHWARNING; const char STR_SWITCHWARNING[] = TR_SWITCHWARNING;
const char STR_POTWARNINGSTATE[] = TR_POTWARNINGSTATE; const char STR_POTWARNINGSTATE[] = TR_POTWARNINGSTATE;

View file

@ -296,6 +296,10 @@ extern const char STR_BLOFFBRIGHTNESS[];
#endif #endif
extern const char STR_SPLASHSCREEN[]; extern const char STR_SPLASHSCREEN[];
#if defined(PWR_BUTTON_PRESS)
extern const char STR_PWR_ON_SPEED[];
extern const char STR_PWR_OFF_SPEED[];
#endif
extern const char STR_THROTTLEWARNING[]; extern const char STR_THROTTLEWARNING[];
extern const char STR_SWITCHWARNING[]; extern const char STR_SWITCHWARNING[];
extern const char STR_POTWARNINGSTATE[]; extern const char STR_POTWARNINGSTATE[];

View file

@ -591,6 +591,8 @@
#define TR_BLOFFBRIGHTNESS TR3(INDENT"Jas Vyp.", INDENT"Jas Vyp.", INDENT"Jas vypnutého LCD") #define TR_BLOFFBRIGHTNESS TR3(INDENT"Jas Vyp.", INDENT"Jas Vyp.", INDENT"Jas vypnutého LCD")
#define TR_BLCOLOR INDENT "Barva" #define TR_BLCOLOR INDENT "Barva"
#define TR_SPLASHSCREEN TR("úvodní logo", "Zobrazit úvodní logo") #define TR_SPLASHSCREEN TR("úvodní logo", "Zobrazit úvodní logo")
#define TR_PWR_ON_SPEED "Pwr On speed"
#define TR_PWR_OFF_SPEED "Pwr Off speed"
#define TR_THROTTLEWARNING TR("* Plyn", INDENT "Kontrola plynu") #define TR_THROTTLEWARNING TR("* Plyn", INDENT "Kontrola plynu")
#define TR_SWITCHWARNING TR("* Spínače", INDENT "Polohy spínačů") #define TR_SWITCHWARNING TR("* Spínače", INDENT "Polohy spínačů")
#define TR_POTWARNINGSTATE TR("* Pot&Slid.", INDENT "Kontrola Pot&Slid.") #define TR_POTWARNINGSTATE TR("* Pot&Slid.", INDENT "Kontrola Pot&Slid.")

View file

@ -602,6 +602,8 @@
#define TR_BLOFFBRIGHTNESS INDENT "Aus-Helligkeit" #define TR_BLOFFBRIGHTNESS INDENT "Aus-Helligkeit"
#define TR_BLCOLOR INDENT "Farbe" #define TR_BLCOLOR INDENT "Farbe"
#define TR_SPLASHSCREEN TR("Startbild Ein", "Startbild Anzeigedauer") #define TR_SPLASHSCREEN TR("Startbild Ein", "Startbild Anzeigedauer")
#define TR_PWR_ON_SPEED "Pwr On speed"
#define TR_PWR_OFF_SPEED "Pwr Off speed"
#define TR_THROTTLEWARNING TR("Gasalarm", INDENT "Gas Alarm") #define TR_THROTTLEWARNING TR("Gasalarm", INDENT "Gas Alarm")
#define TR_SWITCHWARNING TR("Sch. Alarm", INDENT "Schalter-Alarm") #define TR_SWITCHWARNING TR("Sch. Alarm", INDENT "Schalter-Alarm")
#define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders") #define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders")

View file

@ -593,6 +593,8 @@
#define TR_BLOFFBRIGHTNESS INDENT "OFF brightness" #define TR_BLOFFBRIGHTNESS INDENT "OFF brightness"
#define TR_BLCOLOR INDENT "Color" #define TR_BLCOLOR INDENT "Color"
#define TR_SPLASHSCREEN "Splash screen" #define TR_SPLASHSCREEN "Splash screen"
#define TR_PWR_ON_SPEED "Pwr On speed"
#define TR_PWR_OFF_SPEED "Pwr Off speed"
#define TR_THROTTLEWARNING TR(INDENT "T-Warning", INDENT "Throttle state") #define TR_THROTTLEWARNING TR(INDENT "T-Warning", INDENT "Throttle state")
#define TR_SWITCHWARNING TR(INDENT "S-Warning", INDENT "Switch positions") #define TR_SWITCHWARNING TR(INDENT "S-Warning", INDENT "Switch positions")
#define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders") #define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders")

View file

@ -613,6 +613,8 @@
#define TR_BLOFFBRIGHTNESS INDENT"MENOS Brillo" #define TR_BLOFFBRIGHTNESS INDENT"MENOS Brillo"
#define TR_BLCOLOR INDENT "Color" #define TR_BLCOLOR INDENT "Color"
#define TR_SPLASHSCREEN "Ptalla.inicio" #define TR_SPLASHSCREEN "Ptalla.inicio"
#define TR_PWR_ON_SPEED "Pwr On speed"
#define TR_PWR_OFF_SPEED "Pwr Off speed"
#define TR_THROTTLEWARNING TR("Aviso-A", INDENT "Aviso Acelerador") #define TR_THROTTLEWARNING TR("Aviso-A", INDENT "Aviso Acelerador")
#define TR_SWITCHWARNING TR("Aviso-I", INDENT "Aviso Intrptor") #define TR_SWITCHWARNING TR("Aviso-I", INDENT "Aviso Intrptor")
#define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders") #define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders")

View file

@ -605,6 +605,8 @@
#define TR_BLOFFBRIGHTNESS INDENT"OFF Brightness" #define TR_BLOFFBRIGHTNESS INDENT"OFF Brightness"
#define TR_BLCOLOR INDENT "Color" #define TR_BLCOLOR INDENT "Color"
#define TR_SPLASHSCREEN "Splash screen" #define TR_SPLASHSCREEN "Splash screen"
#define TR_PWR_ON_SPEED "Pwr On speed"
#define TR_PWR_OFF_SPEED "Pwr Off speed"
#define TR_THROTTLEWARNING TR("T-Warning", INDENT "Throttle Warning") #define TR_THROTTLEWARNING TR("T-Warning", INDENT "Throttle Warning")
#define TR_SWITCHWARNING TR("S-Warning", INDENT "Switch Warning") #define TR_SWITCHWARNING TR("S-Warning", INDENT "Switch Warning")
#define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders") #define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders")

View file

@ -611,6 +611,8 @@
#define TR_BLOFFBRIGHTNESS INDENT "Luminosité OFF" #define TR_BLOFFBRIGHTNESS INDENT "Luminosité OFF"
#define TR_BLCOLOR INDENT "Couleur" #define TR_BLCOLOR INDENT "Couleur"
#define TR_SPLASHSCREEN "Logo d'accueil" #define TR_SPLASHSCREEN "Logo d'accueil"
#define TR_PWR_ON_SPEED "Pwr On speed"
#define TR_PWR_OFF_SPEED "Pwr Off speed"
#define TR_THROTTLEWARNING TR(INDENT "Alerte gaz", INDENT "Alerte gaz") #define TR_THROTTLEWARNING TR(INDENT "Alerte gaz", INDENT "Alerte gaz")
#define TR_SWITCHWARNING TR(INDENT "Alerte int", INDENT "Pos. interrupteurs") #define TR_SWITCHWARNING TR(INDENT "Alerte int", INDENT "Pos. interrupteurs")
#define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders") #define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders")

View file

@ -612,6 +612,8 @@
#define TR_BLOFFBRIGHTNESS TR(INDENT"Lumin. OFF",INDENT"Luminosità OFF") #define TR_BLOFFBRIGHTNESS TR(INDENT"Lumin. OFF",INDENT"Luminosità OFF")
#define TR_BLCOLOR INDENT "Colore" #define TR_BLCOLOR INDENT "Colore"
#define TR_SPLASHSCREEN TR("Schermo avvio", "Schermata di avvio") #define TR_SPLASHSCREEN TR("Schermo avvio", "Schermata di avvio")
#define TR_PWR_ON_SPEED "Pwr On speed"
#define TR_PWR_OFF_SPEED "Pwr Off speed"
#define TR_THROTTLEWARNING TR("All. Mot.", INDENT "Allarme Motore") #define TR_THROTTLEWARNING TR("All. Mot.", INDENT "Allarme Motore")
#define TR_SWITCHWARNING TR("Avv. Int.", INDENT "Avviso Interr.") #define TR_SWITCHWARNING TR("Avv. Int.", INDENT "Avviso Interr.")
#define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders") #define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders")

View file

@ -596,6 +596,8 @@ TR_GYR_VSRCRAW
#define TR_BLOFFBRIGHTNESS INDENT "Uit-Helderheid" #define TR_BLOFFBRIGHTNESS INDENT "Uit-Helderheid"
#define TR_BLCOLOR INDENT "Kleur" #define TR_BLCOLOR INDENT "Kleur"
#define TR_SPLASHSCREEN "Startscherm Aan" #define TR_SPLASHSCREEN "Startscherm Aan"
#define TR_PWR_ON_SPEED "Pwr On speed"
#define TR_PWR_OFF_SPEED "Pwr Off speed"
#define TR_THROTTLEWARNING TR(INDENT "T-Warning", INDENT "Throttle Status") #define TR_THROTTLEWARNING TR(INDENT "T-Warning", INDENT "Throttle Status")
#define TR_SWITCHWARNING TR(INDENT "S-Warning", INDENT "Switch Posities") #define TR_SWITCHWARNING TR(INDENT "S-Warning", INDENT "Switch Posities")
#define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders") #define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders")

View file

@ -612,6 +612,8 @@
#define TR_BLOFFBRIGHTNESS INDENT"Jasność wył." #define TR_BLOFFBRIGHTNESS INDENT"Jasność wył."
#define TR_BLCOLOR INDENT "Color" #define TR_BLCOLOR INDENT "Color"
#define TR_SPLASHSCREEN "Logo ekranu" #define TR_SPLASHSCREEN "Logo ekranu"
#define TR_PWR_ON_SPEED "Pwr On speed"
#define TR_PWR_OFF_SPEED "Pwr Off speed"
#define TR_THROTTLEWARNING TR(INDENT"OstrzGaz", INDENT "OstrzeżenieGaz") #define TR_THROTTLEWARNING TR(INDENT"OstrzGaz", INDENT "OstrzeżenieGaz")
#define TR_SWITCHWARNING TR(INDENT "OstrzPrzeł", INDENT "PozycjaPrzeł") #define TR_SWITCHWARNING TR(INDENT "OstrzPrzeł", INDENT "PozycjaPrzeł")
#define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders") #define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders")

View file

@ -598,6 +598,8 @@
#define TR_BLOFFBRIGHTNESS INDENT "OFF Brightness" #define TR_BLOFFBRIGHTNESS INDENT "OFF Brightness"
#define TR_BLCOLOR INDENT "Color" #define TR_BLCOLOR INDENT "Color"
#define TR_SPLASHSCREEN "Splash screen" #define TR_SPLASHSCREEN "Splash screen"
#define TR_PWR_ON_SPEED "Pwr On speed"
#define TR_PWR_OFF_SPEED "Pwr Off speed"
#define TR_THROTTLEWARNING TR("Avisa Acel", INDENT "Avisa Acel") #define TR_THROTTLEWARNING TR("Avisa Acel", INDENT "Avisa Acel")
#define TR_SWITCHWARNING TR("Avisa Chav", INDENT "Avisa Chav") #define TR_SWITCHWARNING TR("Avisa Chav", INDENT "Avisa Chav")
#define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders") #define TR_POTWARNINGSTATE TR(INDENT "Pot&Slid.", INDENT "Pots & sliders")

View file

@ -610,6 +610,8 @@
#define TR_BLONBRIGHTNESS INDENT "På Ljusstyrka" #define TR_BLONBRIGHTNESS INDENT "På Ljusstyrka"
#define TR_BLOFFBRIGHTNESS INDENT "Av Ljusstyrka" #define TR_BLOFFBRIGHTNESS INDENT "Av Ljusstyrka"
#define TR_SPLASHSCREEN "Startbild" #define TR_SPLASHSCREEN "Startbild"
#define TR_PWR_ON_SPEED "Pwr On speed"
#define TR_PWR_OFF_SPEED "Pwr Off speed"
#define TR_BLCOLOR INDENT "Color" #define TR_BLCOLOR INDENT "Color"
#define TR_THROTTLEWARNING TR("Gasvarning", INDENT "Gasvarning") #define TR_THROTTLEWARNING TR("Gasvarning", INDENT "Gasvarning")
#define TR_SWITCHWARNING TR("Bryt.varn.", INDENT "Brytarvarning") #define TR_SWITCHWARNING TR("Bryt.varn.", INDENT "Brytarvarning")