From 02fa6fde094149b76ef4ae4f480896bf3cc784ad Mon Sep 17 00:00:00 2001 From: Oleg Semyonov Date: Mon, 25 Jun 2012 00:30:42 +0300 Subject: [PATCH] Optimize FlightMode switch position calculation --- flight/Modules/ManualControl/manualcontrol.c | 15 +++++---------- .../src/plugins/config/configinputwidget.cpp | 18 ++++++++---------- 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/flight/Modules/ManualControl/manualcontrol.c b/flight/Modules/ManualControl/manualcontrol.c index 7d4ab2f8f..f9afe75b0 100644 --- a/flight/Modules/ManualControl/manualcontrol.c +++ b/flight/Modules/ManualControl/manualcontrol.c @@ -862,17 +862,12 @@ static void processFlightMode(ManualControlSettingsData *settings, float flightM return; } - // Scale flightMode from [-1..+1] to [0..1] range and calculate a delta - float scaledFlightMode = (flightMode + 1.0) / 2.0; - float delta = 1.0 / (float)(settings->FlightModeNumber); - float bound = delta; + // Convert flightMode value into the switch position in the range [0..N-1] + uint8_t pos = (uint8_t)((flightMode + 1.0f) * settings->FlightModeNumber) >> 1; + if (pos >= settings->FlightModeNumber) + pos = settings->FlightModeNumber - 1; - uint8_t i; - for (i = 1; i < settings->FlightModeNumber; i++, bound += delta) { - if (scaledFlightMode < bound) - break; - } - uint8_t newMode = settings->FlightModePosition[i - 1]; + uint8_t newMode = settings->FlightModePosition[pos]; if (flightStatus.FlightMode != newMode) { flightStatus.FlightMode = newMode; diff --git a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp index 5d44a374f..b06a750f1 100644 --- a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp @@ -1148,22 +1148,20 @@ void ConfigInputWidget::moveFMSlider() // Bound and scale FlightMode from [-1..+1] to [0..1] range if (valueScaled < -1.0) valueScaled = -1.0; + else if (valueScaled > 1.0) valueScaled = 1.0; - float scaledFlightMode = (valueScaled + 1.0) / 2.0; // Display current channel value for tuning (in percents) + float scaledFlightMode = (valueScaled + 1.0) / 2.0; m_config->fmsValue->setText(QString::number(scaledFlightMode * 100.0, 'f', 0)); - // Find and display the current FlightMode using the same logic as in a flight code - float delta = 1.0 / (float)(manualSettingsDataPriv.FlightModeNumber); - float bound = delta; - int i; - for (i = 1; i < manualSettingsDataPriv.FlightModeNumber; i++, bound += delta) { - if (scaledFlightMode < bound) - break; - } - m_config->fmsSlider->setValue(i - 1); + // Convert flightMode value into the switch position in the range [0..N-1] + // This should use the same logic as flight code to be consistent + uint8_t pos = (uint8_t)((valueScaled + 1.0) * manualSettingsDataPriv.FlightModeNumber) >> 1; + if (pos >= manualSettingsDataPriv.FlightModeNumber) + pos = manualSettingsDataPriv.FlightModeNumber - 1; + m_config->fmsSlider->setValue(pos); } void ConfigInputWidget::updatePositionSlider()