Merge branch 'next' into corvuscorax/OP-947_stateestimator-module
Conflicts: flight/modules/AltitudeHold/altitudehold.c ground/openpilotgcs/share/openpilotgcs/pfd/default/AltitudeScale.qml ground/openpilotgcs/share/openpilotgcs/pfd/default/PfdIndicators.qml ground/openpilotgcs/share/openpilotgcs/pfd/default/SpeedScale.qml ground/openpilotgcs/src/plugins/pfd/pfdgadgetwidget.cpp
@ -16,6 +16,7 @@ Ed Faulkner
|
||||
Darren Furniss
|
||||
Frederic Goddeeris
|
||||
Daniel Godin
|
||||
Anthony Gomez
|
||||
Bani Greyling
|
||||
Nuno Guedes
|
||||
Erik Gustavsson
|
||||
@ -27,6 +28,7 @@ Ryan Hunt
|
||||
Mark James
|
||||
Sami Korhonen
|
||||
Thorsten Klose
|
||||
Ricky King
|
||||
Hallvard Kristiansen
|
||||
Edouard Lafargue
|
||||
Mike Labranche
|
||||
@ -36,12 +38,14 @@ David Llama
|
||||
Matt Lipski
|
||||
Les Newell
|
||||
Ken Northup
|
||||
Ben Matthews
|
||||
Greg Matthews
|
||||
Guy McCaldin
|
||||
Gary Mortimer
|
||||
Alessio Morale
|
||||
Cathy Moss
|
||||
Angus Peart
|
||||
John Pike
|
||||
Dmytro Poplavskiy
|
||||
Eric Price
|
||||
Richard Querin
|
||||
@ -58,6 +62,7 @@ Oleg Semyonov
|
||||
Stacey Sheldon
|
||||
Troy Schultz
|
||||
Dr. Erhard Siegl
|
||||
Dusty Anne Smith
|
||||
Mike Smith
|
||||
Alex Sowa
|
||||
Pete Stapley
|
||||
@ -69,6 +74,7 @@ Jasper van Loenen
|
||||
Vassilis Varveropoulos
|
||||
Kevin Vertucio
|
||||
Alex Vrubel
|
||||
Mike Walters
|
||||
Brian Webb
|
||||
Justin Welander
|
||||
Mat Wellington
|
||||
|
35
WHATSNEW.txt
@ -127,6 +127,12 @@ KNOWN ISSUES:
|
||||
- Sensor calibration is not final. It will be reworked completely to
|
||||
increase its accuracy and make it easier to use.
|
||||
|
||||
- Until the calibration is reworked, default attitude estimation algorithm
|
||||
used by Revo is a complimentary filter with magnetometers disabled. Hence
|
||||
Revo does not use them yet to correct yaw drift. Magnetometers can be
|
||||
enabled, but you should properly calibrate them first. That's the reason
|
||||
why they are disabled by default.
|
||||
|
||||
- AltitudeHold mode is enabled, but it is not officially supported. Do
|
||||
not expect it to work perfectly and be considered production quality.
|
||||
You may play with it and report your issues and suggestions at your own
|
||||
@ -169,16 +175,17 @@ Due to major rework of all code and integration of Revo code into mainline
|
||||
list above. Some of them can be found using this link:
|
||||
http://progress.openpilot.org/issues/?filter=10860
|
||||
|
||||
OP-678, OP-693, OP-719, OP-726, OP-727, OP-747, OP-761, OP-769, OP-770,
|
||||
OP-772, OP-784, OP-792, OP-804, OP-807, OP-812, OP-816, OP-817, OP-820,
|
||||
OP-821, OP-843, OP-846, OP-854, OP-855, OP-856, OP-861, OP-864, OP-867,
|
||||
OP-871, OP-873, OP-874, OP-875, OP-879, OP-885, OP-886, OP-888, OP-889,
|
||||
OP-890, OP-891, OP-892, OP-893, OP-894, OP-895, OP-896, OP-897, OP-898,
|
||||
OP-899, OP-900, OP-903, OP-905, OP-906, OP-907, OP-910, OP-912, OP-917,
|
||||
OP-920, OP-925, OP-926, OP-928, OP-935, OP-936, OP-939, OP-952, OP-955,
|
||||
OP-957, OP-958, OP-965, OP-968, OP-969, OP-970, OP-976, OP-977, OP-980,
|
||||
OP-981, OP-982, OP-983, OP-987, OP-988, OP-989, OP-990, OP-991, OP-993
|
||||
OP-997, OP-998, OP-999
|
||||
OP-678, OP-693, OP-719, OP-726, OP-727, OP-747, OP-761, OP-769, OP-770,
|
||||
OP-772, OP-784, OP-792, OP-804, OP-807, OP-812, OP-816, OP-817, OP-820,
|
||||
OP-821, OP-843, OP-846, OP-854, OP-855, OP-856, OP-861, OP-864, OP-867,
|
||||
OP-871, OP-873, OP-874, OP-875, OP-879, OP-885, OP-886, OP-888, OP-889,
|
||||
OP-890, OP-891, OP-892, OP-893, OP-894, OP-895, OP-896, OP-897, OP-898,
|
||||
OP-899, OP-900, OP-903, OP-905, OP-906, OP-907, OP-910, OP-912, OP-917,
|
||||
OP-920, OP-925, OP-926, OP-928, OP-935, OP-936, OP-939, OP-952, OP-955,
|
||||
OP-957, OP-958, OP-965, OP-968, OP-969, OP-970, OP-977, OP-979, OP-980,
|
||||
OP-981, OP-982, OP-983, OP-988, OP-989, OP-990, OP-991, OP-993, OP-997,
|
||||
OP-998, OP-999, OP-1000, OP-1002, OP-1005, OP-1007, OP-1008, OP-1009, OP-1010,
|
||||
OP-1011, OP-1012, OP-1013, OP-1015, OP-1016, OP-1021
|
||||
|
||||
Short summary of changes. For a complete list see the git log.
|
||||
|
||||
@ -228,6 +235,10 @@ Flight code changes:
|
||||
- Cyr's attitude patch is ported from CC3D to Revo;
|
||||
- added magnetometer options (mags are disabled by default for Revo complimenary filter);
|
||||
- advance camera stabilisation is now officially released;
|
||||
- Revo alarm led now distinguish between Critical(lit led), Error(blink fast), Warning(blink slowly) Alarm condition
|
||||
- Revo alarm led flash fast(like in Error Alarm) during calibration using complementary attitude estimation.
|
||||
- Redo gyro bias zero after calibration parameters changes
|
||||
- Do not raise GPS alarm if a gps port is not configured.
|
||||
- fixed numerous internal firmware bugs (too many to list here).
|
||||
|
||||
GCS code changes:
|
||||
@ -255,6 +266,10 @@ GCS code changes:
|
||||
- anti-aliased scope plugin;
|
||||
- numerous code fixes and cleanups (too many to list here);
|
||||
- USB HID code is replaced by new cross-platform hidapi library to fix old Linux/OSX problems.
|
||||
- Adds GUI to set Altitude Hold filter parameters.
|
||||
- Adds configurable units for velocity/speed and altitude in QML PFD. Units are configured in settings panel.
|
||||
- Reduces precision of the PDOP value in the PFD display to 1 decimal.
|
||||
- Remove deprecated powerlog
|
||||
|
||||
Common parts:
|
||||
- added simple toolchain install make targets;
|
||||
|
@ -110,6 +110,7 @@ int32_t configuration_check()
|
||||
}
|
||||
break;
|
||||
case MANUALCONTROLSETTINGS_FLIGHTMODEPOSITION_ALTITUDEHOLD:
|
||||
case MANUALCONTROLSETTINGS_FLIGHTMODEPOSITION_ALTITUDEVARIO:
|
||||
if (coptercontrol) {
|
||||
severity = SYSTEMALARMS_ALARM_ERROR;
|
||||
} else if (!PIOS_TASK_MONITOR_IsRunning(TASKINFO_RUNNING_ALTITUDEHOLD)) { // Revo supports altitude hold
|
||||
|
@ -72,7 +72,8 @@ void baro_airspeedGetETASV3(AirspeedSensorData *airspeedSensor, AirspeedSettings
|
||||
// Calibrate sensor by averaging zero point value
|
||||
if (calibrationCount <= CALIBRATION_IDLE_MS / airspeedSettings->SamplePeriod) {
|
||||
calibrationCount++;
|
||||
calibrationCount2++;
|
||||
calibrationSum = 0;
|
||||
calibrationCount2 = 0;
|
||||
return;
|
||||
} else if (calibrationCount <= (CALIBRATION_IDLE_MS + CALIBRATION_COUNT_MS) / airspeedSettings->SamplePeriod) {
|
||||
calibrationCount++;
|
||||
@ -81,6 +82,9 @@ void baro_airspeedGetETASV3(AirspeedSensorData *airspeedSensor, AirspeedSettings
|
||||
if (calibrationCount > (CALIBRATION_IDLE_MS + CALIBRATION_COUNT_MS) / airspeedSettings->SamplePeriod) {
|
||||
airspeedSettings->ZeroPoint = (int16_t)(((float)calibrationSum) / calibrationCount2);
|
||||
AirspeedSettingsZeroPointSet(&airspeedSettings->ZeroPoint);
|
||||
calibrationCount = 0;
|
||||
calibrationSum = 0;
|
||||
calibrationCount2 = 0;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -139,11 +139,15 @@ static void altitudeHoldTask(__attribute__((unused)) void *parameters)
|
||||
BaroSensorConnectQueue(queue);
|
||||
FlightStatusConnectQueue(queue);
|
||||
AccelStateConnectQueue(queue);
|
||||
|
||||
bool altitudeHoldFlightMode = false;
|
||||
BaroSensorAltitudeGet(&smoothed_altitude);
|
||||
running = false;
|
||||
enum init_state { WAITING_BARO, WAITIING_INIT, INITED } init = WAITING_BARO;
|
||||
|
||||
uint8_t flightMode;
|
||||
FlightStatusFlightModeGet(&flightMode);
|
||||
// initialize enable flag
|
||||
altitudeHoldFlightMode = flightMode == FLIGHTSTATUS_FLIGHTMODE_ALTITUDEHOLD || flightMode == FLIGHTSTATUS_FLIGHTMODE_ALTITUDEVARIO;
|
||||
// Main task loop
|
||||
bool baro_updated = false;
|
||||
while (1) {
|
||||
@ -161,10 +165,9 @@ static void altitudeHoldTask(__attribute__((unused)) void *parameters)
|
||||
|
||||
init = (init == WAITING_BARO) ? WAITIING_INIT : init;
|
||||
} else if (ev.obj == FlightStatusHandle()) {
|
||||
FlightStatusData flightStatus;
|
||||
FlightStatusGet(&flightStatus);
|
||||
|
||||
if (flightStatus.FlightMode == FLIGHTSTATUS_FLIGHTMODE_ALTITUDEHOLD && !running) {
|
||||
FlightStatusFlightModeGet(&flightMode);
|
||||
altitudeHoldFlightMode = flightMode == FLIGHTSTATUS_FLIGHTMODE_ALTITUDEHOLD || flightMode == FLIGHTSTATUS_FLIGHTMODE_ALTITUDEVARIO;
|
||||
if (altitudeHoldFlightMode && !running) {
|
||||
// Copy the current throttle as a starting point for integral
|
||||
StabilizationDesiredThrottleGet(&throttleIntegral);
|
||||
switchThrottle = throttleIntegral;
|
||||
@ -175,7 +178,7 @@ static void altitudeHoldTask(__attribute__((unused)) void *parameters)
|
||||
AltHoldSmoothedData altHold;
|
||||
AltHoldSmoothedGet(&altHold);
|
||||
starting_altitude = altHold.Altitude;
|
||||
} else if (flightStatus.FlightMode != FLIGHTSTATUS_FLIGHTMODE_ALTITUDEHOLD) {
|
||||
} else if (!altitudeHoldFlightMode) {
|
||||
running = false;
|
||||
lastAltitudeHoldDesiredUpdate = PIOS_DELAY_GetRaw();
|
||||
}
|
||||
@ -348,11 +351,10 @@ static void altitudeHoldTask(__attribute__((unused)) void *parameters)
|
||||
|
||||
AltHoldSmoothedGet(&altHold);
|
||||
|
||||
// Verify that we are in altitude hold mode
|
||||
FlightStatusData flightStatus;
|
||||
FlightStatusGet(&flightStatus);
|
||||
if (flightStatus.FlightMode != FLIGHTSTATUS_FLIGHTMODE_ALTITUDEHOLD ||
|
||||
flightStatus.Armed != FLIGHTSTATUS_ARMED_ARMED) {
|
||||
// Verify that we are in altitude hold mode
|
||||
uint8_t armed;
|
||||
FlightStatusArmedGet(&armed);
|
||||
if (!altitudeHoldFlightMode || armed != FLIGHTSTATUS_ARMED_ARMED) {
|
||||
running = false;
|
||||
}
|
||||
|
||||
|
@ -77,10 +77,12 @@
|
||||
#include "CoordinateConversions.h"
|
||||
|
||||
// Private constants
|
||||
#define STACK_SIZE_BYTES 2048
|
||||
#define TASK_PRIORITY (tskIDLE_PRIORITY + 3)
|
||||
#define FAILSAFE_TIMEOUT_MS 10
|
||||
#define STACK_SIZE_BYTES 2048
|
||||
#define TASK_PRIORITY (tskIDLE_PRIORITY + 3)
|
||||
#define FAILSAFE_TIMEOUT_MS 10
|
||||
|
||||
#define CALIBRATION_DELAY 4000
|
||||
#define CALIBRATION_DURATION 6000
|
||||
// low pass filter configuration to calculate offset
|
||||
// of barometric altitude sensor
|
||||
// reasoning: updates at: 10 Hz, tau= 300 s settle time
|
||||
@ -326,6 +328,7 @@ static int32_t updateAttitudeComplementary(bool first_run)
|
||||
static uint8_t init = 0;
|
||||
static float gyro_bias[3] = { 0, 0, 0 };
|
||||
static bool magCalibrated = true;
|
||||
static uint32_t initStartupTime = 0;
|
||||
|
||||
// Wait until the AttitudeRaw object is updated, if a timeout then go to failsafe
|
||||
if (xQueueReceive(gyroQueue, &ev, FAILSAFE_TIMEOUT_MS / portTICK_RATE_MS) != pdTRUE ||
|
||||
@ -403,11 +406,28 @@ static int32_t updateAttitudeComplementary(bool first_run)
|
||||
|
||||
timeval = PIOS_DELAY_GetRaw();
|
||||
|
||||
// wait calibration_delay only at powerup
|
||||
if (xTaskGetTickCount() < 3000) {
|
||||
initStartupTime = 0;
|
||||
} else {
|
||||
initStartupTime = xTaskGetTickCount() - CALIBRATION_DELAY;
|
||||
}
|
||||
|
||||
// Zero gyro bias
|
||||
// This is really needed after updating calibration settings.
|
||||
GyrosBiasData zeroGyrosBias;
|
||||
GyrosBiasGet(&zeroGyrosBias);
|
||||
zeroGyrosBias.x = 0;
|
||||
zeroGyrosBias.y = 0;
|
||||
zeroGyrosBias.z = 0;
|
||||
GyrosBiasSet(&zeroGyrosBias);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ((xTaskGetTickCount() < 10000) && (xTaskGetTickCount() > 4000)) {
|
||||
// For first 7 seconds use accels to get gyro bias
|
||||
if ((xTaskGetTickCount() - initStartupTime < CALIBRATION_DURATION + CALIBRATION_DELAY) &&
|
||||
(xTaskGetTickCount() - initStartupTime > CALIBRATION_DELAY)) {
|
||||
// For first CALIBRATION_DURATION seconds after CALIBRATION_DELAY from startup
|
||||
// Zero gyro bias assuming it is steady, smoothing the gyro input value applying rollPitchBiasRate.
|
||||
attitudeSettings.AccelKp = 1.0f;
|
||||
attitudeSettings.AccelKi = 0.0f;
|
||||
attitudeSettings.YawBiasRate = 0.23f;
|
||||
@ -469,12 +489,6 @@ static int32_t updateAttitudeComplementary(bool first_run)
|
||||
accel_mag = accels_filtered[0] * accels_filtered[0] + accels_filtered[1] * accels_filtered[1] + accels_filtered[2] * accels_filtered[2];
|
||||
accel_mag = sqrtf(accel_mag);
|
||||
|
||||
// TODO! check accel vector magnitude value for correctness
|
||||
|
||||
accel_err[0] /= accel_mag;
|
||||
accel_err[1] /= accel_mag;
|
||||
accel_err[2] /= accel_mag;
|
||||
|
||||
float grot_mag;
|
||||
if (accel_filter_enabled) {
|
||||
grot_mag = sqrtf(grot_filtered[0] * grot_filtered[0] + grot_filtered[1] * grot_filtered[1] + grot_filtered[2] * grot_filtered[2]);
|
||||
@ -482,7 +496,7 @@ static int32_t updateAttitudeComplementary(bool first_run)
|
||||
grot_mag = 1.0f;
|
||||
}
|
||||
|
||||
// TODO! check grot_mag value for correctness.
|
||||
// TODO! check grot_mag & accel vector magnitude values for correctness.
|
||||
|
||||
accel_err[0] /= (accel_mag * grot_mag);
|
||||
accel_err[1] /= (accel_mag * grot_mag);
|
||||
@ -644,8 +658,9 @@ static int32_t updateAttitudeComplementary(bool first_run)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (variance_error) {
|
||||
if (!init && flightStatus.Armed == FLIGHTSTATUS_ARMED_DISARMED) {
|
||||
AlarmsSet(SYSTEMALARMS_ALARM_ATTITUDE, SYSTEMALARMS_ALARM_ERROR);
|
||||
} else if (variance_error) {
|
||||
AlarmsSet(SYSTEMALARMS_ALARM_ATTITUDE, SYSTEMALARMS_ALARM_CRITICAL);
|
||||
} else {
|
||||
AlarmsClear(SYSTEMALARMS_ALARM_ATTITUDE);
|
||||
|
@ -116,8 +116,6 @@ int32_t GPSStart(void)
|
||||
PIOS_TASK_MONITOR_RegisterTask(TASKINFO_RUNNING_GPS, gpsTaskHandle);
|
||||
return 0;
|
||||
}
|
||||
|
||||
AlarmsSet(SYSTEMALARMS_ALARM_GPS, SYSTEMALARMS_ALARM_ERROR);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
@ -41,6 +41,7 @@ typedef enum { FLIGHTMODE_UNDEFINED = 0, FLIGHTMODE_MANUAL = 1, FLIGHTMODE_STABI
|
||||
(x == FLIGHTSTATUS_FLIGHTMODE_STABILIZED2) ? FLIGHTMODE_STABILIZED : \
|
||||
(x == FLIGHTSTATUS_FLIGHTMODE_STABILIZED3) ? FLIGHTMODE_STABILIZED : \
|
||||
(x == FLIGHTSTATUS_FLIGHTMODE_ALTITUDEHOLD) ? FLIGHTMODE_GUIDANCE : \
|
||||
(x == FLIGHTSTATUS_FLIGHTMODE_ALTITUDEVARIO) ? FLIGHTMODE_GUIDANCE : \
|
||||
(x == FLIGHTSTATUS_FLIGHTMODE_VELOCITYCONTROL) ? FLIGHTMODE_GUIDANCE : \
|
||||
(x == FLIGHTSTATUS_FLIGHTMODE_POSITIONHOLD) ? FLIGHTMODE_GUIDANCE : \
|
||||
(x == FLIGHTSTATUS_FLIGHTMODE_PATHPLANNER) ? FLIGHTMODE_GUIDANCE : \
|
||||
@ -116,6 +117,7 @@ int32_t ManualControlInitialize();
|
||||
((int)MANUALCONTROLSETTINGS_FLIGHTMODEPOSITION_STABILIZED2 == (int)FLIGHTSTATUS_FLIGHTMODE_STABILIZED2) && \
|
||||
((int)MANUALCONTROLSETTINGS_FLIGHTMODEPOSITION_STABILIZED3 == (int)FLIGHTSTATUS_FLIGHTMODE_STABILIZED3) && \
|
||||
((int)MANUALCONTROLSETTINGS_FLIGHTMODEPOSITION_ALTITUDEHOLD == (int)FLIGHTSTATUS_FLIGHTMODE_ALTITUDEHOLD) && \
|
||||
((int)MANUALCONTROLSETTINGS_FLIGHTMODEPOSITION_ALTITUDEVARIO == (int)FLIGHTSTATUS_FLIGHTMODE_ALTITUDEVARIO) && \
|
||||
((int)MANUALCONTROLSETTINGS_FLIGHTMODEPOSITION_VELOCITYCONTROL == (int)FLIGHTSTATUS_FLIGHTMODE_VELOCITYCONTROL) && \
|
||||
((int)MANUALCONTROLSETTINGS_FLIGHTMODEPOSITION_POSITIONHOLD == (int)FLIGHTSTATUS_FLIGHTMODE_POSITIONHOLD) && \
|
||||
((int)MANUALCONTROLSETTINGS_FLIGHTMODEPOSITION_PATHPLANNER == (int)FLIGHTSTATUS_FLIGHTMODE_PATHPLANNER) && \
|
||||
|
@ -459,6 +459,7 @@ static void manualControlTask(__attribute__((unused)) void *parameters)
|
||||
case FLIGHTMODE_GUIDANCE:
|
||||
switch (flightStatus.FlightMode) {
|
||||
case FLIGHTSTATUS_FLIGHTMODE_ALTITUDEHOLD:
|
||||
case FLIGHTSTATUS_FLIGHTMODE_ALTITUDEVARIO:
|
||||
altitudeHoldDesired(&cmd, lastFlightMode != flightStatus.FlightMode);
|
||||
break;
|
||||
case FLIGHTSTATUS_FLIGHTMODE_POSITIONHOLD:
|
||||
@ -819,17 +820,24 @@ static void altitudeHoldDesired(ManualControlCommandData *cmd, bool changed)
|
||||
uint8_t throttleRate;
|
||||
uint8_t throttleExp;
|
||||
|
||||
static uint8_t flightMode;
|
||||
static portTickType lastSysTimeAH;
|
||||
static bool zeroed = false;
|
||||
portTickType thisSysTime;
|
||||
float dT;
|
||||
|
||||
AltitudeHoldDesiredData altitudeHoldDesiredData;
|
||||
FlightStatusFlightModeGet(&flightMode);
|
||||
|
||||
AltitudeHoldDesiredData altitudeHoldDesiredData;
|
||||
AltitudeHoldDesiredGet(&altitudeHoldDesiredData);
|
||||
|
||||
AltitudeHoldSettingsThrottleExpGet(&throttleExp);
|
||||
AltitudeHoldSettingsThrottleRateGet(&throttleRate);
|
||||
if (flightMode == FLIGHTSTATUS_FLIGHTMODE_ALTITUDEHOLD) {
|
||||
throttleExp = 128;
|
||||
throttleRate = 0;
|
||||
} else {
|
||||
AltitudeHoldSettingsThrottleExpGet(&throttleExp);
|
||||
AltitudeHoldSettingsThrottleRateGet(&throttleRate);
|
||||
}
|
||||
|
||||
StabilizationSettingsData stabSettings;
|
||||
StabilizationSettingsGet(&stabSettings);
|
||||
@ -850,12 +858,13 @@ static void altitudeHoldDesired(ManualControlCommandData *cmd, bool changed)
|
||||
zeroed = false;
|
||||
} else if (cmd->Throttle > DEADBAND_HIGH && zeroed) {
|
||||
// being the two band symmetrical I can divide by DEADBAND_LOW to scale it to a value betweeon 0 and 1
|
||||
// then apply an "exp" f(x,k) = (k∙x∙x∙x + x∙(256−k)) / 256
|
||||
// then apply an "exp" f(x,k) = (k*x*x*x + x*(256−k)) / 256
|
||||
altitudeHoldDesiredData.Altitude += (throttleExp * powf((cmd->Throttle - DEADBAND_HIGH) / (DEADBAND_LOW), 3) + (256 - throttleExp)) / 256 * throttleRate * dT;
|
||||
} else if (cmd->Throttle < DEADBAND_LOW && zeroed) {
|
||||
altitudeHoldDesiredData.Altitude -= (throttleExp * powf((DEADBAND_LOW - (cmd->Throttle < 0 ? 0 : cmd->Throttle)) / DEADBAND_LOW, 3) + (256 - throttleExp)) / 256 * throttleRate * dT;
|
||||
} else if (cmd->Throttle >= DEADBAND_LOW && cmd->Throttle <= DEADBAND_HIGH) {
|
||||
} else if (cmd->Throttle >= DEADBAND_LOW && cmd->Throttle <= DEADBAND_HIGH && (throttleRate != 0)) {
|
||||
// Require the stick to enter the dead band before they can move height
|
||||
// Vario is not "engaged" when throttleRate == 0
|
||||
zeroed = true;
|
||||
}
|
||||
|
||||
|
@ -167,7 +167,7 @@ static void systemTask(__attribute__((unused)) void *parameters)
|
||||
{
|
||||
/* start the delayed callback scheduler */
|
||||
CallbackSchedulerStart();
|
||||
|
||||
uint8_t cycleCount = 0;
|
||||
/* create all modules thread */
|
||||
MODULE_TASKCREATE_ALL;
|
||||
|
||||
@ -204,6 +204,7 @@ static void systemTask(__attribute__((unused)) void *parameters)
|
||||
while (1) {
|
||||
// Update the system statistics
|
||||
updateStats();
|
||||
cycleCount = cycleCount > 0 ? cycleCount - 1 : 7;
|
||||
|
||||
// Update the system alarms
|
||||
updateSystemAlarms();
|
||||
@ -220,26 +221,33 @@ static void systemTask(__attribute__((unused)) void *parameters)
|
||||
|
||||
// Flash the heartbeat LED
|
||||
#if defined(PIOS_LED_HEARTBEAT)
|
||||
PIOS_LED_Toggle(PIOS_LED_HEARTBEAT);
|
||||
uint8_t armingStatus;
|
||||
FlightStatusArmedGet(&armingStatus);
|
||||
if ((armingStatus == FLIGHTSTATUS_ARMED_ARMED && (cycleCount & 0x1)) ||
|
||||
(armingStatus != FLIGHTSTATUS_ARMED_ARMED && (cycleCount & 0x4))) {
|
||||
PIOS_LED_On(PIOS_LED_HEARTBEAT);
|
||||
} else {
|
||||
PIOS_LED_Off(PIOS_LED_HEARTBEAT);
|
||||
}
|
||||
|
||||
DEBUG_MSG("+ 0x%08x\r\n", 0xDEADBEEF);
|
||||
#endif /* PIOS_LED_HEARTBEAT */
|
||||
|
||||
// Turn on the error LED if an alarm is set
|
||||
#if defined(PIOS_LED_ALARM)
|
||||
if (AlarmsHasWarnings()) {
|
||||
if (AlarmsHasCritical()) {
|
||||
PIOS_LED_On(PIOS_LED_ALARM);
|
||||
} else if ((AlarmsHasErrors() && (cycleCount & 0x1)) ||
|
||||
(!AlarmsHasErrors() && AlarmsHasWarnings() && (cycleCount & 0x4))) {
|
||||
PIOS_LED_On(PIOS_LED_ALARM);
|
||||
} else {
|
||||
PIOS_LED_Off(PIOS_LED_ALARM);
|
||||
}
|
||||
#endif /* PIOS_LED_ALARM */
|
||||
|
||||
FlightStatusData flightStatus;
|
||||
FlightStatusGet(&flightStatus);
|
||||
|
||||
UAVObjEvent ev;
|
||||
int delayTime = flightStatus.Armed == FLIGHTSTATUS_ARMED_ARMED ?
|
||||
SYSTEM_UPDATE_PERIOD_MS / portTICK_RATE_MS / (LED_BLINK_RATE_HZ * 2) :
|
||||
SYSTEM_UPDATE_PERIOD_MS / portTICK_RATE_MS;
|
||||
int delayTime = SYSTEM_UPDATE_PERIOD_MS / portTICK_RATE_MS / (LED_BLINK_RATE_HZ * 2);
|
||||
|
||||
if (xQueueReceive(objectPersistenceQueue, &ev, delayTime) == pdTRUE) {
|
||||
// If object persistence is updated call the callback
|
||||
@ -468,14 +476,14 @@ static void updateStats()
|
||||
idleCounter = 0;
|
||||
}
|
||||
#if !defined(ARCH_POSIX) && !defined(ARCH_WIN32)
|
||||
if(pios_uavo_settings_fs_id){
|
||||
if (pios_uavo_settings_fs_id) {
|
||||
PIOS_FLASHFS_GetStats(pios_uavo_settings_fs_id, &fsStats);
|
||||
stats.SysSlotsFree = fsStats.num_free_slots;
|
||||
stats.SysSlotsFree = fsStats.num_free_slots;
|
||||
stats.SysSlotsActive = fsStats.num_active_slots;
|
||||
}
|
||||
if(pios_user_fs_id){
|
||||
if (pios_user_fs_id) {
|
||||
PIOS_FLASHFS_GetStats(pios_user_fs_id, &fsStats);
|
||||
stats.UsrSlotsFree = fsStats.num_free_slots;
|
||||
stats.UsrSlotsFree = fsStats.num_free_slots;
|
||||
stats.UsrSlotsActive = fsStats.num_active_slots;
|
||||
}
|
||||
#endif
|
||||
|
@ -1164,7 +1164,8 @@ out_exit:
|
||||
* @return 0 if success or error code
|
||||
* @retval -1 if fs_id is not a valid filesystem instance
|
||||
*/
|
||||
int32_t PIOS_FLASHFS_GetStats(uintptr_t fs_id, struct PIOS_FLASHFS_Stats *stats){
|
||||
int32_t PIOS_FLASHFS_GetStats(uintptr_t fs_id, struct PIOS_FLASHFS_Stats *stats)
|
||||
{
|
||||
PIOS_Assert(stats);
|
||||
struct logfs_state *logfs = (struct logfs_state *)fs_id;
|
||||
|
||||
@ -1172,7 +1173,7 @@ int32_t PIOS_FLASHFS_GetStats(uintptr_t fs_id, struct PIOS_FLASHFS_Stats *stats)
|
||||
return -1;
|
||||
}
|
||||
stats->num_active_slots = logfs->num_active_slots;
|
||||
stats->num_free_slots = logfs->num_free_slots;
|
||||
stats->num_free_slots = logfs->num_free_slots;
|
||||
return 0;
|
||||
}
|
||||
#endif /* PIOS_INCLUDE_FLASH */
|
||||
|
@ -29,9 +29,9 @@
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
struct PIOS_FLASHFS_Stats{
|
||||
uint16_t num_free_slots; /* slots in free state */
|
||||
uint16_t num_active_slots; /* slots in active state */
|
||||
struct PIOS_FLASHFS_Stats {
|
||||
uint16_t num_free_slots; /* slots in free state */
|
||||
uint16_t num_active_slots; /* slots in active state */
|
||||
};
|
||||
|
||||
int32_t PIOS_FLASHFS_Format(uintptr_t fs_id);
|
||||
|
@ -53,9 +53,9 @@ struct pios_usb_dev {
|
||||
xSemaphoreHandle statusCheckSemaphore;
|
||||
#endif
|
||||
};
|
||||
|
||||
#ifdef PIOS_INCLUDE_FREERTOS
|
||||
static void raiseDisconnectionCallbacks(void);
|
||||
|
||||
#endif
|
||||
/**
|
||||
* @brief Validate the usb device structure
|
||||
* @returns true if valid device or false otherwise
|
||||
@ -170,30 +170,33 @@ uint32_t usb_found;
|
||||
bool PIOS_USB_CheckAvailable(__attribute__((unused)) uint32_t id)
|
||||
{
|
||||
struct pios_usb_dev *usb_dev = (struct pios_usb_dev *)pios_usb_id;
|
||||
static bool lastStatus = false;
|
||||
|
||||
if (!PIOS_USB_validate(usb_dev)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
usb_found = ((usb_dev->cfg->vsense.gpio->IDR & usb_dev->cfg->vsense.init.GPIO_Pin) != 0) ^ usb_dev->cfg->vsense_active_low;
|
||||
|
||||
// Please note that checks of transfer_possible and the reconnection handling is
|
||||
// suppressed for non freertos mode (aka bootloader) as this is causing problems detecting connection and
|
||||
// broken communications.
|
||||
#ifdef PIOS_INCLUDE_FREERTOS
|
||||
static bool lastStatus = false;
|
||||
bool status = usb_found != 0 && transfer_possible ? 1 : 0;
|
||||
bool reconnect = false;
|
||||
#ifdef PIOS_INCLUDE_FREERTOS
|
||||
if (xSemaphoreTakeFromISR(usb_dev->statusCheckSemaphore, NULL) == pdTRUE) {
|
||||
#endif
|
||||
reconnect = (lastStatus && !status);
|
||||
lastStatus = status;
|
||||
#ifdef PIOS_INCLUDE_FREERTOS
|
||||
xSemaphoreGiveFromISR(usb_dev->statusCheckSemaphore, NULL);
|
||||
}
|
||||
#endif
|
||||
reconnect = (lastStatus && !status);
|
||||
lastStatus = status;
|
||||
xSemaphoreGiveFromISR(usb_dev->statusCheckSemaphore, NULL);
|
||||
}
|
||||
if (reconnect) {
|
||||
raiseDisconnectionCallbacks();
|
||||
}
|
||||
|
||||
return status;
|
||||
|
||||
#else
|
||||
return usb_found;
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
@ -212,7 +215,7 @@ void PIOS_USB_RegisterDisconnectionCallback(void (*disconnectionCB)(void))
|
||||
}
|
||||
PIOS_Assert(0);
|
||||
}
|
||||
|
||||
#ifdef PIOS_INCLUDE_FREERTOS
|
||||
static void raiseDisconnectionCallbacks(void)
|
||||
{
|
||||
uint32_t i = 0;
|
||||
@ -221,7 +224,7 @@ static void raiseDisconnectionCallbacks(void)
|
||||
(disconnection_cb_list[i++])();
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
/*
|
||||
*
|
||||
* Provide STM32 USB OTG BSP layer API
|
||||
|
@ -1781,32 +1781,6 @@
|
||||
</data>
|
||||
</default>
|
||||
</OPMapGadget>
|
||||
<PFDGadget>
|
||||
<raw>
|
||||
<configInfo>
|
||||
<locked>false</locked>
|
||||
<version>0.0.0</version>
|
||||
</configInfo>
|
||||
<data>
|
||||
<beSmooth>false</beSmooth>
|
||||
<dialFile>%%DATAPATH%%pfd/default/pfd.svg</dialFile>
|
||||
<hqFonts>false</hqFonts>
|
||||
<useOpenGLFlag>false</useOpenGLFlag>
|
||||
</data>
|
||||
</raw>
|
||||
<smooth>
|
||||
<configInfo>
|
||||
<locked>false</locked>
|
||||
<version>0.0.0</version>
|
||||
</configInfo>
|
||||
<data>
|
||||
<beSmooth>true</beSmooth>
|
||||
<dialFile>%%DATAPATH%%pfd/default/pfd.svg</dialFile>
|
||||
<hqFonts>false</hqFonts>
|
||||
<useOpenGLFlag>false</useOpenGLFlag>
|
||||
</data>
|
||||
</smooth>
|
||||
</PFDGadget>
|
||||
<PfdQmlGadget>
|
||||
<NoTerrain>
|
||||
<configInfo>
|
||||
@ -1816,12 +1790,14 @@
|
||||
<data>
|
||||
<actualPositionUsed>false</actualPositionUsed>
|
||||
<altitude>2000</altitude>
|
||||
<altitudeFactor>1</altitudeFactor>
|
||||
<cacheOnly>false</cacheOnly>
|
||||
<earthFile>%%DATAPATH%%pfd/default/readymap.earth</earthFile>
|
||||
<latitude>46.6715</latitude>
|
||||
<longitude>10.1589</longitude>
|
||||
<openGLEnabled>true</openGLEnabled>
|
||||
<qmlFile>%%DATAPATH%%pfd/default/Pfd.qml</qmlFile>
|
||||
<speedFactor>1</speedFactor>
|
||||
<terrainEnabled>false</terrainEnabled>
|
||||
</data>
|
||||
</NoTerrain>
|
||||
@ -2802,11 +2778,47 @@
|
||||
<type>splitter</type>
|
||||
</side0>
|
||||
<side1>
|
||||
<classId>PFDGadget</classId>
|
||||
<gadget>
|
||||
<activeConfiguration>raw</activeConfiguration>
|
||||
</gadget>
|
||||
<type>uavGadget</type>
|
||||
<side0>
|
||||
<side0>
|
||||
<classId>DialGadget</classId>
|
||||
<gadget>
|
||||
<activeConfiguration>Deluxe Attitude</activeConfiguration>
|
||||
</gadget>
|
||||
<type>uavGadget</type>
|
||||
</side0>
|
||||
<side1>
|
||||
<classId>DialGadget</classId>
|
||||
<gadget>
|
||||
<activeConfiguration>Deluxe Baro Altimeter</activeConfiguration>
|
||||
</gadget>
|
||||
<type>uavGadget</type>
|
||||
</side1>
|
||||
<splitterOrientation>2</splitterOrientation>
|
||||
<splitterSizes>@Variant(AAAACQAAAAA=)</splitterSizes>
|
||||
<type>splitter</type>
|
||||
</side0>
|
||||
<side1>
|
||||
<side0>
|
||||
<classId>DialGadget</classId>
|
||||
<gadget>
|
||||
<activeConfiguration>Deluxe Compass</activeConfiguration>
|
||||
</gadget>
|
||||
<type>uavGadget</type>
|
||||
</side0>
|
||||
<side1>
|
||||
<classId>DialGadget</classId>
|
||||
<gadget>
|
||||
<activeConfiguration>Deluxe Climbrate</activeConfiguration>
|
||||
</gadget>
|
||||
<type>uavGadget</type>
|
||||
</side1>
|
||||
<splitterOrientation>2</splitterOrientation>
|
||||
<splitterSizes>@Variant(AAAACQAAAAA=)</splitterSizes>
|
||||
<type>splitter</type>
|
||||
</side1>
|
||||
<splitterOrientation>1</splitterOrientation>
|
||||
<splitterSizes>@Variant(AAAACQAAAAA=)</splitterSizes>
|
||||
<type>splitter</type>
|
||||
</side1>
|
||||
<splitterOrientation>2</splitterOrientation>
|
||||
<splitterSizes>@Variant(AAAACQAAAAIAAAACAAABLwAAAAIAAAHf)</splitterSizes>
|
||||
|
@ -5,13 +5,16 @@
|
||||
<Description>Default configuration</Description>
|
||||
<Details>Default configuration built to work on all screen sizes</Details>
|
||||
<ExpertMode>false</ExpertMode>
|
||||
<LastPreferenceCategory></LastPreferenceCategory>
|
||||
<LastPreferencePage></LastPreferencePage>
|
||||
<SaveSettingsOnExit>true</SaveSettingsOnExit>
|
||||
<SettingsWindowHeight>600</SettingsWindowHeight>
|
||||
<SettingsWindowWidth>800</SettingsWindowWidth>
|
||||
<StyleSheet>default</StyleSheet>
|
||||
<UDPMirror>false</UDPMirror>
|
||||
<Settings>
|
||||
<LastPreferenceCategory>Environment</LastPreferenceCategory>
|
||||
<LastPreferencePage>General</LastPreferencePage>
|
||||
<WindowHeight>600</WindowHeight>
|
||||
<WindowWidth>800</WindowWidth>
|
||||
<SplitterPosition>150</SplitterPosition>
|
||||
</Settings>
|
||||
</General>
|
||||
<IPconnection>
|
||||
<Current>
|
||||
@ -1819,33 +1822,7 @@
|
||||
<useOpenGL>true</useOpenGL>
|
||||
</data>
|
||||
</default>
|
||||
</OPMapGadget>
|
||||
<PFDGadget>
|
||||
<raw>
|
||||
<configInfo>
|
||||
<locked>false</locked>
|
||||
<version>0.0.0</version>
|
||||
</configInfo>
|
||||
<data>
|
||||
<beSmooth>false</beSmooth>
|
||||
<dialFile>%%DATAPATH%%pfd/default/pfd.svg</dialFile>
|
||||
<hqFonts>false</hqFonts>
|
||||
<useOpenGLFlag>false</useOpenGLFlag>
|
||||
</data>
|
||||
</raw>
|
||||
<smooth>
|
||||
<configInfo>
|
||||
<locked>false</locked>
|
||||
<version>0.0.0</version>
|
||||
</configInfo>
|
||||
<data>
|
||||
<beSmooth>true</beSmooth>
|
||||
<dialFile>%%DATAPATH%%pfd/default/pfd.svg</dialFile>
|
||||
<hqFonts>false</hqFonts>
|
||||
<useOpenGLFlag>false</useOpenGLFlag>
|
||||
</data>
|
||||
</smooth>
|
||||
</PFDGadget>
|
||||
</OPMapGadget>
|
||||
<PfdQmlGadget>
|
||||
<NoTerrain>
|
||||
<configInfo>
|
||||
@ -1855,12 +1832,14 @@
|
||||
<data>
|
||||
<actualPositionUsed>false</actualPositionUsed>
|
||||
<altitude>2000</altitude>
|
||||
<altitudeFactor>1</altitudeFactor>
|
||||
<cacheOnly>false</cacheOnly>
|
||||
<earthFile>%%DATAPATH%%pfd/default/readymap.earth</earthFile>
|
||||
<latitude>46.6715</latitude>
|
||||
<longitude>10.1589</longitude>
|
||||
<openGLEnabled>true</openGLEnabled>
|
||||
<qmlFile>%%DATAPATH%%pfd/default/Pfd.qml</qmlFile>
|
||||
<speedFactor>1</speedFactor>
|
||||
<terrainEnabled>false</terrainEnabled>
|
||||
</data>
|
||||
</NoTerrain>
|
||||
@ -2783,11 +2762,47 @@
|
||||
<type>splitter</type>
|
||||
</side0>
|
||||
<side1>
|
||||
<classId>PFDGadget</classId>
|
||||
<gadget>
|
||||
<activeConfiguration>raw</activeConfiguration>
|
||||
</gadget>
|
||||
<type>uavGadget</type>
|
||||
<side0>
|
||||
<side0>
|
||||
<classId>DialGadget</classId>
|
||||
<gadget>
|
||||
<activeConfiguration>Deluxe Attitude</activeConfiguration>
|
||||
</gadget>
|
||||
<type>uavGadget</type>
|
||||
</side0>
|
||||
<side1>
|
||||
<classId>DialGadget</classId>
|
||||
<gadget>
|
||||
<activeConfiguration>Deluxe Baro Altimeter</activeConfiguration>
|
||||
</gadget>
|
||||
<type>uavGadget</type>
|
||||
</side1>
|
||||
<splitterOrientation>2</splitterOrientation>
|
||||
<splitterSizes>@Variant(AAAACQAAAAA=)</splitterSizes>
|
||||
<type>splitter</type>
|
||||
</side0>
|
||||
<side1>
|
||||
<side0>
|
||||
<classId>DialGadget</classId>
|
||||
<gadget>
|
||||
<activeConfiguration>Deluxe Compass</activeConfiguration>
|
||||
</gadget>
|
||||
<type>uavGadget</type>
|
||||
</side0>
|
||||
<side1>
|
||||
<classId>DialGadget</classId>
|
||||
<gadget>
|
||||
<activeConfiguration>Deluxe Climbrate</activeConfiguration>
|
||||
</gadget>
|
||||
<type>uavGadget</type>
|
||||
</side1>
|
||||
<splitterOrientation>2</splitterOrientation>
|
||||
<splitterSizes>@Variant(AAAACQAAAAA=)</splitterSizes>
|
||||
<type>splitter</type>
|
||||
</side1>
|
||||
<splitterOrientation>1</splitterOrientation>
|
||||
<splitterSizes>@Variant(AAAACQAAAAA=)</splitterSizes>
|
||||
<type>splitter</type>
|
||||
</side1>
|
||||
<splitterOrientation>2</splitterOrientation>
|
||||
<splitterSizes>@Variant(AAAACQAAAAIAAAACAAABLwAAAAIAAAHf)</splitterSizes>
|
||||
|
@ -1797,33 +1797,7 @@
|
||||
<useOpenGL>true</useOpenGL>
|
||||
</data>
|
||||
</default>
|
||||
</OPMapGadget>
|
||||
<PFDGadget>
|
||||
<raw>
|
||||
<configInfo>
|
||||
<locked>false</locked>
|
||||
<version>0.0.0</version>
|
||||
</configInfo>
|
||||
<data>
|
||||
<beSmooth>false</beSmooth>
|
||||
<dialFile>%%DATAPATH%%pfd/default/pfd.svg</dialFile>
|
||||
<hqFonts>false</hqFonts>
|
||||
<useOpenGLFlag>false</useOpenGLFlag>
|
||||
</data>
|
||||
</raw>
|
||||
<smooth>
|
||||
<configInfo>
|
||||
<locked>false</locked>
|
||||
<version>0.0.0</version>
|
||||
</configInfo>
|
||||
<data>
|
||||
<beSmooth>true</beSmooth>
|
||||
<dialFile>%%DATAPATH%%pfd/default/pfd.svg</dialFile>
|
||||
<hqFonts>false</hqFonts>
|
||||
<useOpenGLFlag>false</useOpenGLFlag>
|
||||
</data>
|
||||
</smooth>
|
||||
</PFDGadget>
|
||||
</OPMapGadget>
|
||||
<PfdQmlGadget>
|
||||
<NoTerrain>
|
||||
<configInfo>
|
||||
@ -1833,12 +1807,14 @@
|
||||
<data>
|
||||
<actualPositionUsed>false</actualPositionUsed>
|
||||
<altitude>2000</altitude>
|
||||
<altitudeFactor>1</altitudeFactor>
|
||||
<cacheOnly>false</cacheOnly>
|
||||
<earthFile>%%DATAPATH%%pfd/default/readymap.earth</earthFile>
|
||||
<latitude>46.6715</latitude>
|
||||
<longitude>10.1589</longitude>
|
||||
<openGLEnabled>true</openGLEnabled>
|
||||
<qmlFile>%%DATAPATH%%pfd/default/Pfd.qml</qmlFile>
|
||||
<speedFactor>1</speedFactor>
|
||||
<terrainEnabled>false</terrainEnabled>
|
||||
</data>
|
||||
</NoTerrain>
|
||||
@ -2785,11 +2761,47 @@
|
||||
<type>splitter</type>
|
||||
</side0>
|
||||
<side1>
|
||||
<classId>PFDGadget</classId>
|
||||
<gadget>
|
||||
<activeConfiguration>raw</activeConfiguration>
|
||||
</gadget>
|
||||
<type>uavGadget</type>
|
||||
<side0>
|
||||
<side0>
|
||||
<classId>DialGadget</classId>
|
||||
<gadget>
|
||||
<activeConfiguration>Deluxe Attitude</activeConfiguration>
|
||||
</gadget>
|
||||
<type>uavGadget</type>
|
||||
</side0>
|
||||
<side1>
|
||||
<classId>DialGadget</classId>
|
||||
<gadget>
|
||||
<activeConfiguration>Deluxe Baro Altimeter</activeConfiguration>
|
||||
</gadget>
|
||||
<type>uavGadget</type>
|
||||
</side1>
|
||||
<splitterOrientation>2</splitterOrientation>
|
||||
<splitterSizes>@Variant(AAAACQAAAAA=)</splitterSizes>
|
||||
<type>splitter</type>
|
||||
</side0>
|
||||
<side1>
|
||||
<side0>
|
||||
<classId>DialGadget</classId>
|
||||
<gadget>
|
||||
<activeConfiguration>Deluxe Compass</activeConfiguration>
|
||||
</gadget>
|
||||
<type>uavGadget</type>
|
||||
</side0>
|
||||
<side1>
|
||||
<classId>DialGadget</classId>
|
||||
<gadget>
|
||||
<activeConfiguration>Deluxe Climbrate</activeConfiguration>
|
||||
</gadget>
|
||||
<type>uavGadget</type>
|
||||
</side1>
|
||||
<splitterOrientation>2</splitterOrientation>
|
||||
<splitterSizes>@Variant(AAAACQAAAAA=)</splitterSizes>
|
||||
<type>splitter</type>
|
||||
</side1>
|
||||
<splitterOrientation>1</splitterOrientation>
|
||||
<splitterSizes>@Variant(AAAACQAAAAA=)</splitterSizes>
|
||||
<type>splitter</type>
|
||||
</side1>
|
||||
<splitterOrientation>2</splitterOrientation>
|
||||
<splitterSizes>@Variant(AAAACQAAAAIAAAACAAABLwAAAAIAAAHf)</splitterSizes>
|
||||
|
@ -12,7 +12,7 @@
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
id="svg4745"
|
||||
inkscape:version="0.48.0 r9654"
|
||||
inkscape:version="0.48.4 r9939"
|
||||
sodipodi:docname="attitude.svg"
|
||||
x="0px"
|
||||
y="0px"
|
||||
@ -1205,17 +1205,17 @@
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1366"
|
||||
inkscape:window-height="691"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1017"
|
||||
id="namedview2585"
|
||||
showgrid="false"
|
||||
inkscape:zoom="1.3107546"
|
||||
inkscape:cx="78.320852"
|
||||
inkscape:cx="-40.694561"
|
||||
inkscape:cy="152.84311"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-x="-8"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer5" />
|
||||
inkscape:current-layer="background-7" />
|
||||
|
||||
|
||||
|
||||
@ -7558,7 +7558,12 @@
|
||||
</g></g><g
|
||||
inkscape:label="#g3668"
|
||||
id="background-7"
|
||||
transform="translate(0.86376266,-0.30754896)"><linearGradient
|
||||
transform="translate(0.86376266,-0.30754896)"><path
|
||||
style="fill:#666666;fill-opacity:1"
|
||||
d="m -0.65625,-1.28125 0,315.84375 315.84375,0 0,-315.84375 -315.84375,0 z m 158.1875,8.6875 c 81.95231,0 148.40625,66.618251 148.40625,148.78125 0,82.163 -66.45394,148.75 -148.40625,148.75 -81.952311,0 -148.375,-66.587 -148.375,-148.75 0,-82.162999 66.422689,-148.78125 148.375,-148.78125 z"
|
||||
transform="translate(-0.86376266,0.30754188)"
|
||||
id="rect4658"
|
||||
inkscape:connector-curvature="0" /><linearGradient
|
||||
gradientTransform="matrix(1,0,0,-1,8.48,-242.9702)"
|
||||
y2="-218.92889"
|
||||
x2="43.533401"
|
||||
@ -7676,9 +7681,9 @@
|
||||
id="stop31876" /></linearGradient><polygon
|
||||
style="fill:url(#linearGradient32725)"
|
||||
id="polygon5292-4"
|
||||
points="18.698,19.935 15.317,19.935 13.626,17.006 15.317,14.078 18.698,14.078 20.389,17.006 " /><polygon
|
||||
points="13.626,17.006 15.317,14.078 18.698,14.078 20.389,17.006 18.698,19.935 15.317,19.935 " /><polygon
|
||||
id="polygon5294-9"
|
||||
points="18.563,19.701 15.452,19.701 13.897,17.006 15.452,14.312 18.563,14.312 20.119,17.006 " /></g></g></g><g
|
||||
points="13.897,17.006 15.452,14.312 18.563,14.312 20.119,17.006 18.563,19.701 15.452,19.701 " /></g></g></g><g
|
||||
id="g5296-3"><g
|
||||
id="g5300-1"><g
|
||||
id="g5302-5"><g
|
||||
@ -7756,9 +7761,9 @@
|
||||
id="stop31904" /></linearGradient><polygon
|
||||
style="fill:url(#linearGradient32731)"
|
||||
id="polygon5329-5"
|
||||
points="296.494,19.935 293.112,19.935 291.422,17.006 293.112,14.078 296.494,14.078 298.186,17.006 " /><polygon
|
||||
points="291.422,17.006 293.112,14.078 296.494,14.078 298.186,17.006 296.494,19.935 293.112,19.935 " /><polygon
|
||||
id="polygon5331-8"
|
||||
points="296.358,19.701 293.248,19.701 291.692,17.006 293.248,14.312 296.358,14.312 297.914,17.006 " /></g></g></g><g
|
||||
points="291.692,17.006 293.248,14.312 296.358,14.312 297.914,17.006 296.358,19.701 293.248,19.701 " /></g></g></g><g
|
||||
id="g5333-3"><g
|
||||
id="g5337-8"><g
|
||||
id="g5339-4"><g
|
||||
@ -7836,9 +7841,9 @@
|
||||
id="stop31932" /></linearGradient><polygon
|
||||
style="fill:url(#linearGradient32737)"
|
||||
id="polygon5366-5"
|
||||
points="296.493,297.73 293.112,297.73 291.421,294.803 293.112,291.874 296.493,291.874 298.185,294.803 " /><polygon
|
||||
points="291.421,294.803 293.112,291.874 296.493,291.874 298.185,294.803 296.493,297.73 293.112,297.73 " /><polygon
|
||||
id="polygon5368-1"
|
||||
points="296.358,297.496 293.247,297.496 291.692,294.803 293.247,292.107 296.358,292.107 297.913,294.803 " /></g></g></g><g
|
||||
points="291.692,294.803 293.247,292.107 296.358,292.107 297.913,294.803 296.358,297.496 293.247,297.496 " /></g></g></g><g
|
||||
id="g5370-2"><g
|
||||
id="g5374-6"><g
|
||||
id="g5376-0"><g
|
||||
@ -7916,9 +7921,9 @@
|
||||
id="stop31960" /></linearGradient><polygon
|
||||
style="fill:url(#linearGradient32743)"
|
||||
id="polygon5403-5"
|
||||
points="18.699,297.73 15.318,297.73 13.626,294.803 15.318,291.874 18.699,291.874 20.39,294.803 " /><polygon
|
||||
points="13.626,294.803 15.318,291.874 18.699,291.874 20.39,294.803 18.699,297.73 15.318,297.73 " /><polygon
|
||||
id="polygon5405-8"
|
||||
points="18.564,297.496 15.453,297.496 13.898,294.803 15.453,292.107 18.564,292.107 20.119,294.803 " /></g></g></g><path
|
||||
points="13.898,294.803 15.453,292.107 18.564,292.107 20.119,294.803 18.564,297.496 15.453,297.496 " /></g></g></g><path
|
||||
style="fill:url(#linearGradient32745)"
|
||||
d="m 155.90562,5.680375 c -82.97305,0 -150.25,67.276952 -150.25,150.249995 0,82.97304 67.27695,150.21875 150.25,150.21875 82.97304,0 150.25,-67.24571 150.25,-150.21875 0,-82.973043 -67.27696,-150.249995 -150.25,-150.249995 z m 0,5.6875 c 79.84215,0 144.5625,64.720349 144.5625,144.562495 0,79.84215 -64.72035,144.5625 -144.5625,144.5625 -79.84215,0 -144.5625,-64.72035 -144.5625,-144.5625 0,-79.842146 64.72035,-144.562495 144.5625,-144.562495 z"
|
||||
id="circle5418-9"
|
||||
|
Before Width: | Height: | Size: 518 KiB After Width: | Height: | Size: 518 KiB |
@ -24,10 +24,10 @@ Item {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
// The altitude scale represents 30 meters,
|
||||
// move it in 0..5m range
|
||||
anchors.verticalCenterOffset: -height/30 * (PositionState.Down-Math.floor(PositionState.Down/5)*5)
|
||||
anchors.verticalCenterOffset: -height/30 * (PositionState.Down-Math.floor(PositionState.Down/5*qmlWidget.altitudeFactor)*5)
|
||||
anchors.left: parent.left
|
||||
|
||||
property int topNumber: 15-Math.floor(PositionState.Down/5)*5
|
||||
property int topNumber: 15-Math.floor(PositionState.Down/5*qmlWidget.altitudeFactor)*5
|
||||
|
||||
// Altitude numbers
|
||||
Column {
|
||||
@ -52,7 +52,6 @@ Item {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
SvgElementImage {
|
||||
id: altitude_window
|
||||
clip: true
|
||||
@ -69,7 +68,7 @@ Item {
|
||||
|
||||
Text {
|
||||
id: altitude_text
|
||||
text: Math.floor(-PositionState.Down).toFixed()
|
||||
text: Math.floor(-PositionState.Down * qmlWidget.altitudeFactor).toFixed()
|
||||
color: "white"
|
||||
font {
|
||||
family: "Arial"
|
||||
@ -78,4 +77,26 @@ Item {
|
||||
anchors.centerIn: parent
|
||||
}
|
||||
}
|
||||
|
||||
SvgElementImage {
|
||||
id: altitude_unit
|
||||
elementName: "altitude-unit"
|
||||
sceneSize: sceneItem.sceneSize
|
||||
clip: true
|
||||
|
||||
x: Math.floor(scaledBounds.x * sceneItem.width)
|
||||
y: Math.floor(scaledBounds.y * sceneItem.height)
|
||||
|
||||
Text {
|
||||
id: altitude_unit_text
|
||||
text: qmlWidget.altitudeUnit
|
||||
color: "white"
|
||||
font {
|
||||
family: "Arial"
|
||||
pixelSize: parent.height
|
||||
}
|
||||
anchors.right: parent.right
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -31,7 +31,7 @@ Item {
|
||||
|
||||
Text {
|
||||
id: gps_text
|
||||
text: "GPS: " + GPSPositionSensor.Satellites + "\nPDP: " + GPSPositionSensor.PDOP
|
||||
text: "GPS: " + GPSPositionSensor.Satellites + "\nPDP: " + Math.round(GPSPositionSensor.PDOP*10)/10
|
||||
color: "white"
|
||||
font.family: "Arial"
|
||||
font.pixelSize: telemetry_status.height * 0.75
|
||||
|
@ -3,8 +3,8 @@ import Qt 4.7
|
||||
Item {
|
||||
id: sceneItem
|
||||
property variant sceneSize
|
||||
property real groundSpeed : 3.6 * Math.sqrt(Math.pow(VelocityState.North,2)+
|
||||
Math.pow(VelocityState.East,2))
|
||||
property real groundSpeed : qmlWidget.speedFactor * Math.sqrt(Math.pow(VelocityState.North,2)+
|
||||
Math.pow(VelocityActual.State,2))
|
||||
|
||||
SvgElementImage {
|
||||
id: speed_bg
|
||||
@ -58,7 +58,6 @@ Item {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
SvgElementImage {
|
||||
id: speed_window
|
||||
clip: true
|
||||
@ -82,4 +81,25 @@ Item {
|
||||
anchors.centerIn: parent
|
||||
}
|
||||
}
|
||||
|
||||
SvgElementImage {
|
||||
id: speed_unit
|
||||
elementName: "speed-unit"
|
||||
sceneSize: sceneItem.sceneSize
|
||||
clip: true
|
||||
|
||||
x: Math.floor(scaledBounds.x * sceneItem.width)
|
||||
y: Math.floor(scaledBounds.y * sceneItem.height)
|
||||
|
||||
Text {
|
||||
id: speed_unit_text
|
||||
text: qmlWidget.speedUnit
|
||||
color: "white"
|
||||
font {
|
||||
family: "Arial"
|
||||
pixelSize: parent.height
|
||||
}
|
||||
anchors.right: parent.right
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -14,8 +14,8 @@
|
||||
height="707.56323"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.3.1 r9886"
|
||||
sodipodi:docname="pfd-11.svg"
|
||||
inkscape:version="0.48.4 r9939"
|
||||
sodipodi:docname="pfd.svg"
|
||||
style="display:inline"
|
||||
inkscape:export-filename="C:\Users\Nuno\Desktop\OpenPilot\PFD\PFD-4.png"
|
||||
inkscape:export-xdpi="71.993568"
|
||||
@ -1616,15 +1616,15 @@
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1.1617336"
|
||||
inkscape:cx="415.72223"
|
||||
inkscape:cy="353.78162"
|
||||
inkscape:cx="613.40088"
|
||||
inkscape:cy="388.21292"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="svg2"
|
||||
inkscape:current-layer="foreground"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1017"
|
||||
inkscape:window-x="-4"
|
||||
inkscape:window-y="-4"
|
||||
inkscape:window-x="-8"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1"
|
||||
showguides="false"
|
||||
inkscape:guide-bbox="true"
|
||||
@ -1953,8 +1953,7 @@
|
||||
id="layer3"
|
||||
inkscape:label="foreground"
|
||||
style="display:inline"
|
||||
transform="translate(230.4171,-2.5493479)"
|
||||
sodipodi:insensitive="true">
|
||||
transform="translate(230.4171,-2.5493479)">
|
||||
<g
|
||||
id="g4306"
|
||||
transform="translate(101.68019,0)">
|
||||
@ -1980,7 +1979,7 @@
|
||||
</g>
|
||||
<g
|
||||
id="g4314"
|
||||
transform="translate(19.192898,-0.66496591)">
|
||||
transform="translate(19.192898,0)">
|
||||
<rect
|
||||
transform="translate(-230.4171,2.5493479)"
|
||||
y="567.56323"
|
||||
@ -2003,7 +2002,7 @@
|
||||
</g>
|
||||
<g
|
||||
id="g4322"
|
||||
transform="translate(184.16754,-1.0101525)">
|
||||
transform="translate(184.16754,0)">
|
||||
<rect
|
||||
transform="translate(-230.4171,2.5493479)"
|
||||
y="567.56323"
|
||||
@ -2048,6 +2047,14 @@
|
||||
height="450"
|
||||
x="-147.23766"
|
||||
y="131.33096" />
|
||||
<rect
|
||||
inkscape:label="#rect3715"
|
||||
y="582.7168"
|
||||
x="-146.92119"
|
||||
height="18"
|
||||
width="109.31937"
|
||||
id="speed-unit"
|
||||
style="fill:none;stroke:none" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
inkscape:label="#rect6927"
|
||||
@ -2068,6 +2075,21 @@
|
||||
x="-163.69627"
|
||||
y="131.33096" />
|
||||
</g>
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccccccc"
|
||||
id="altitude-window"
|
||||
d="m 725.72624,337.87741 -94.64401,0 0,9.26319 -12.72112,9.26318 12.72112,9.26318 -0.10207,9.26319 94.7461,0 0,-37.05274 z"
|
||||
style="fill:#000000;fill-opacity:0.78431373;stroke:#ffffff;stroke-width:2.18486142;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
|
||||
inkscape:label="#rect6927" />
|
||||
<rect
|
||||
inkscape:label="#rect3715"
|
||||
y="583.00885"
|
||||
x="617.78217"
|
||||
height="18"
|
||||
width="109.31937"
|
||||
id="altitude-unit"
|
||||
style="fill:none;stroke:none;display:inline" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:0.15686275;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
|
||||
d="m -15.423661,592.19188 0,96.40626 88.90625,0 0.50508,0.007 430.628851,0 0.17857,0 88.6875,0 0,-96.41369 -65.125,0 -23.78125,23.78125 0.23331,-0.70982 -432.045811,0 0,0 -23.0625,-23.071 -65.125,0 z"
|
||||
@ -2080,7 +2102,7 @@
|
||||
transform="matrix(0.53532208,0,0,0.53532208,250.40617,503.97463)">
|
||||
<path
|
||||
transform="translate(0.08444214,0)"
|
||||
d="m 589.99999,195.93361 a 20.714285,20.714285 0 1 1 -41.42857,0 20.714285,20.714285 0 1 1 41.42857,0 z"
|
||||
d="m 589.99999,195.93361 c 0,11.44018 -9.2741,20.71428 -20.71428,20.71428 -11.44019,0 -20.71429,-9.2741 -20.71429,-20.71428 0,-11.44018 9.2741,-20.71429 20.71429,-20.71429 11.44018,0 20.71428,9.27411 20.71428,20.71429 z"
|
||||
sodipodi:ry="20.714285"
|
||||
sodipodi:rx="20.714285"
|
||||
sodipodi:cy="195.93361"
|
||||
@ -2142,7 +2164,7 @@
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
transform="translate(-2.6785714,0.71428572)"
|
||||
d="m 591.60716,426.20148 a 5.8035712,5.8035712 0 1 1 -11.60714,0 5.8035712,5.8035712 0 1 1 11.60714,0 z"
|
||||
d="m 591.60716,426.20148 c 0,3.20522 -2.59835,5.80357 -5.80357,5.80357 -3.20523,0 -5.80357,-2.59835 -5.80357,-5.80357 0,-3.20523 2.59834,-5.80357 5.80357,-5.80357 3.20522,0 5.80357,2.59834 5.80357,5.80357 z"
|
||||
sodipodi:ry="5.8035712"
|
||||
sodipodi:rx="5.8035712"
|
||||
sodipodi:cy="426.20148"
|
||||
@ -2167,16 +2189,9 @@
|
||||
inkscape:label="#path7548"
|
||||
style="fill:#525652;fill-opacity:1;stroke:#262020;stroke-width:0.28871548px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
|
||||
d="m 272.8475,677.71861 0,2.67964 9.06747,0 0,1.41651 0,0.0271 0,1.41651 -9.06747,0 0,2.67964 -4.11419,-4.11419 4.11419,-4.10518 z"
|
||||
id="path5386"
|
||||
id="path5386-1"
|
||||
sodipodi:nodetypes="cccccccccc"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccccccc"
|
||||
id="altitude-window"
|
||||
d="m 725.72624,337.87741 -94.64401,0 0,9.26319 -12.72112,9.26318 12.72112,9.26318 -0.10207,9.26319 94.7461,0 0,-37.05274 z"
|
||||
style="fill:#000000;fill-opacity:0.78431373;stroke:#ffffff;stroke-width:2.18486142;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
|
||||
inkscape:label="#rect6927" />
|
||||
<g
|
||||
id="g5266">
|
||||
<circle
|
||||
@ -2263,30 +2278,6 @@
|
||||
x="651.09412"
|
||||
y="122.98123"
|
||||
style="font-size:22px;font-weight:bold;fill:#ffffff;stroke:none;-inkscape-font-specification:Sans Bold">ALT</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:14px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
|
||||
x="-67.905884"
|
||||
y="596.9812"
|
||||
id="text3699-9"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan3701-4"
|
||||
x="-67.905884"
|
||||
y="596.9812"
|
||||
style="font-size:18px;font-weight:normal;fill:#ffffff;stroke:none;-inkscape-font-specification:Sans">m/s</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:14px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
|
||||
x="710.81567"
|
||||
y="595.98126"
|
||||
id="text3699-8"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan3701-8"
|
||||
x="710.81567"
|
||||
y="595.98126"
|
||||
style="font-size:18px;font-weight:normal;fill:#ffffff;stroke:none;-inkscape-font-specification:Sans">m</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
@ -4706,7 +4697,8 @@
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer24"
|
||||
inkscape:label="rect2816">
|
||||
inkscape:label="rect2816"
|
||||
style="display:inline">
|
||||
<path
|
||||
style="fill:#453e3e;fill-opacity:1;stroke:#000000;stroke-width:4.08031273;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
|
||||
d="m -115.54603,-47.690063 c -2.50791,0 -4.54785,1.99743 -4.54785,4.50534 l 0,807.009363 c 0,2.5079 2.03994,4.54785 4.54785,4.54785 l 807.00936,0 c 2.5079,0 4.50534,-2.03995 4.50534,-4.54785 l 0,-807.009363 c 0,-2.50791 -1.99744,-4.50534 -4.50534,-4.50534 l -807.00936,0 z M 289.34,11.395529 c 150.15374,0 271.88009,59.618653 272.02085,133.162711 l 0.21252,48.57516 -0.38253,374.99409 C 556.30557,639.62843 436.47945,673.69951 289.34,673.69951 c -147.13944,0 -266.965554,-34.07108 -271.850844,-105.57202 l -0.21251,0 0,-374.99409 0.0425,-48.58122 C 17.459906,71.008112 139.18627,11.395529 289.34,11.395529 z"
|
||||
|
Before Width: | Height: | Size: 189 KiB After Width: | Height: | Size: 188 KiB |
@ -13562,24 +13562,6 @@ Move the %1 stick.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PowerlogPlugin</name>
|
||||
<message>
|
||||
<location filename="../../../src/plugins/powerlog/powerlogplugin.cpp" line="+295"/>
|
||||
<source>Log filename</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>PowerLog-%0.csv</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>Comma Separated Values (*.csv)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QmlViewGadgetFactory</name>
|
||||
<message>
|
||||
|
@ -13563,24 +13563,6 @@ Move the %1 stick.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PowerlogPlugin</name>
|
||||
<message>
|
||||
<location filename="../../../src/plugins/powerlog/powerlogplugin.cpp" line="+295"/>
|
||||
<source>Log filename</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>PowerLog-%0.csv</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>Comma Separated Values (*.csv)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QmlViewGadgetFactory</name>
|
||||
<message>
|
||||
|
@ -14000,24 +14000,6 @@ Bougez le manche %1.</translation>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PowerlogPlugin</name>
|
||||
<message>
|
||||
<location filename="../../../src/plugins/powerlog/powerlogplugin.cpp" line="+295"/>
|
||||
<source>Log filename</source>
|
||||
<translation>Fichier de journal</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>PowerLog-%0.csv</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>Comma Separated Values (*.csv)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QmlViewGadgetFactory</name>
|
||||
<message>
|
||||
|
@ -13585,24 +13585,6 @@ Move the %1 stick.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PowerlogPlugin</name>
|
||||
<message>
|
||||
<location filename="../../../src/plugins/powerlog/powerlogplugin.cpp" line="+295"/>
|
||||
<source>Log filename</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>PowerLog-%0.csv</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>Comma Separated Values (*.csv)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QmlViewGadgetFactory</name>
|
||||
<message>
|
||||
|
@ -13565,24 +13565,6 @@ Move the %1 stick.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PowerlogPlugin</name>
|
||||
<message>
|
||||
<location filename="../../../src/plugins/powerlog/powerlogplugin.cpp" line="+295"/>
|
||||
<source>Log filename</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>PowerLog-%0.csv</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>Comma Separated Values (*.csv)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QmlViewGadgetFactory</name>
|
||||
<message>
|
||||
|
@ -110,6 +110,11 @@ ConfigOutputWidget::ConfigOutputWidget(QWidget *parent) : ConfigTaskWidget(paren
|
||||
updateEnableControls();
|
||||
}
|
||||
|
||||
ConfigOutputWidget::~ConfigOutputWidget()
|
||||
{
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
void ConfigOutputWidget::enableControls(bool enable)
|
||||
{
|
||||
ConfigTaskWidget::enableControls(enable);
|
||||
@ -120,11 +125,6 @@ void ConfigOutputWidget::enableControls(bool enable)
|
||||
ui->channelOutTest->setEnabled(enable);
|
||||
}
|
||||
|
||||
ConfigOutputWidget::~ConfigOutputWidget()
|
||||
{
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
/**
|
||||
Toggles the channel testing mode by making the GCS take over
|
||||
the ActuatorCommand objects
|
||||
@ -242,6 +242,8 @@ void ConfigOutputWidget::refreshWidgetsValues(UAVObject *obj)
|
||||
{
|
||||
Q_UNUSED(obj);
|
||||
|
||||
bool dirty = isDirty();
|
||||
|
||||
// Get Actuator Settings
|
||||
ActuatorSettings *actuatorSettings = ActuatorSettings::GetInstance(getObjectManager());
|
||||
Q_ASSERT(actuatorSettings);
|
||||
@ -353,6 +355,8 @@ void ConfigOutputWidget::refreshWidgetsValues(UAVObject *obj)
|
||||
int neutral = actuatorSettingsData.ChannelNeutral[outputChannelForm->index()];
|
||||
outputChannelForm->neutral(neutral);
|
||||
}
|
||||
|
||||
setDirty(dirty);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -90,9 +90,7 @@ ConfigStabilizationWidget::ConfigStabilizationWidget(QWidget *parent) : ConfigTa
|
||||
|
||||
connect(this, SIGNAL(widgetContentsChanged(QWidget *)), this, SLOT(processLinkedWidgets(QWidget *)));
|
||||
|
||||
// Link by default
|
||||
ui->checkBox_7->setChecked(true);
|
||||
ui->checkBox_8->setChecked(true);
|
||||
connect(this, SIGNAL(autoPilotConnected()), this, SLOT(onBoardConnected()));
|
||||
|
||||
disableMouseWheelEvents();
|
||||
updateEnableControls();
|
||||
@ -103,7 +101,6 @@ ConfigStabilizationWidget::~ConfigStabilizationWidget()
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
|
||||
void ConfigStabilizationWidget::refreshWidgetsValues(UAVObject *o)
|
||||
{
|
||||
ConfigTaskWidget::refreshWidgetsValues(o);
|
||||
@ -194,3 +191,14 @@ void ConfigStabilizationWidget::processLinkedWidgets(QWidget *widget)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ConfigStabilizationWidget::onBoardConnected()
|
||||
{
|
||||
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
|
||||
UAVObjectUtilManager *utilMngr = pm->getObject<UAVObjectUtilManager>();
|
||||
|
||||
Q_ASSERT(utilMngr);
|
||||
|
||||
// If Revolution board enable misc tab, otherwise disable it
|
||||
ui->AltitudeHold->setEnabled((utilMngr->getBoardModel() & 0xff00) == 0x0900);
|
||||
}
|
||||
|
@ -58,6 +58,7 @@ private slots:
|
||||
void realtimeUpdatesSlot(bool value);
|
||||
void linkCheckBoxes(bool value);
|
||||
void processLinkedWidgets(QWidget *);
|
||||
void onBoardConnected();
|
||||
};
|
||||
|
||||
#endif // ConfigStabilizationWidget_H
|
||||
|
@ -6,7 +6,7 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>983</width>
|
||||
<width>820</width>
|
||||
<height>736</height>
|
||||
</rect>
|
||||
</property>
|
||||
@ -456,11 +456,23 @@
|
||||
<property name="spacing">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<property name="margin">
|
||||
<number>12</number>
|
||||
<property name="leftMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QTabWidget" name="tabWidget">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
@ -508,7 +520,16 @@
|
||||
<string>Basic</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="margin">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
@ -606,8 +627,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>953</width>
|
||||
<height>653</height>
|
||||
<width>778</width>
|
||||
<height>659</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
@ -644,8 +665,17 @@
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_7" rowstretch="0,0">
|
||||
<property name="margin">
|
||||
<number>12</number>
|
||||
<property name="leftMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<item row="0" column="4">
|
||||
<widget class="QPushButton" name="pushButton">
|
||||
@ -2684,8 +2714,17 @@ border-radius: 5;</string>
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_19">
|
||||
<property name="margin">
|
||||
<number>12</number>
|
||||
<property name="leftMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="horizontalSpacing">
|
||||
<number>6</number>
|
||||
@ -6060,8 +6099,17 @@ border-radius: 5;</string>
|
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_20">
|
||||
<property name="margin">
|
||||
<number>12</number>
|
||||
<property name="leftMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="horizontalSpacing">
|
||||
<number>6</number>
|
||||
@ -8610,8 +8658,17 @@ border-radius: 5;</string>
|
||||
<string>Integral</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_11">
|
||||
<property name="margin">
|
||||
<number>12</number>
|
||||
<property name="leftMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="lowThrottleZeroIntegral_8">
|
||||
@ -8719,7 +8776,16 @@ border-radius: 5;</string>
|
||||
<string>Advanced</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_10">
|
||||
<property name="margin">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
@ -8801,9 +8867,9 @@ border-radius: 5;</string>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>936</width>
|
||||
<height>702</height>
|
||||
<y>-117</y>
|
||||
<width>778</width>
|
||||
<height>762</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="autoFillBackground">
|
||||
@ -9357,8 +9423,17 @@ border-radius: 5;</string>
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_18">
|
||||
<property name="margin">
|
||||
<number>12</number>
|
||||
<property name="leftMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="horizontalSpacing">
|
||||
<number>6</number>
|
||||
@ -12706,8 +12781,17 @@ border-radius: 5;</string>
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_16">
|
||||
<property name="margin">
|
||||
<number>12</number>
|
||||
<property name="leftMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="horizontalSpacing">
|
||||
<number>6</number>
|
||||
@ -16032,12 +16116,21 @@ border-radius: 5;</string>
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_17">
|
||||
<property name="leftMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="horizontalSpacing">
|
||||
<number>4</number>
|
||||
</property>
|
||||
<property name="margin">
|
||||
<number>12</number>
|
||||
</property>
|
||||
<item row="0" column="0">
|
||||
<widget class="QCheckBox" name="checkBox_2">
|
||||
<property name="toolTip">
|
||||
@ -18719,7 +18812,16 @@ border-radius: 5;</string>
|
||||
<string>Expert</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||
<property name="margin">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
@ -18805,15 +18907,24 @@ border-radius: 5;</string>
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>953</width>
|
||||
<height>653</height>
|
||||
<width>792</width>
|
||||
<height>645</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_9">
|
||||
<property name="spacing">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="margin">
|
||||
<property name="leftMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<item>
|
||||
@ -18837,8 +18948,17 @@ border-radius: 5;</string>
|
||||
<string>Weak Leveling / Axis Lock</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_5">
|
||||
<property name="margin">
|
||||
<number>12</number>
|
||||
<property name="leftMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<item row="0" column="0">
|
||||
<spacer name="horizontalSpacer_13">
|
||||
@ -21451,8 +21571,17 @@ border-radius: 5;</string>
|
||||
<string>Integral Limits</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_9">
|
||||
<property name="margin">
|
||||
<number>12</number>
|
||||
<property name="leftMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="horizontalSpacing">
|
||||
<number>6</number>
|
||||
@ -24403,8 +24532,17 @@ border-radius: 5;</string>
|
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<property name="margin">
|
||||
<number>12</number>
|
||||
<property name="leftMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<item row="0" column="0">
|
||||
<spacer name="horizontalSpacer_40">
|
||||
@ -26852,6 +26990,3876 @@ border-radius: 5;</string>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="AltitudeHold">
|
||||
<attribute name="title">
|
||||
<string>Altitude Hold</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_5">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QScrollArea" name="scrollArea_4">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
</property>
|
||||
<property name="widgetResizable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<widget class="QWidget" name="scrollAreaWidgetContents_4">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>792</width>
|
||||
<height>645</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_23">
|
||||
<item row="0" column="0">
|
||||
<widget class="QGroupBox" name="RateStabilizationGroup_11">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="palette">
|
||||
<palette>
|
||||
<active>
|
||||
<colorrole role="WindowText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Button">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.869318000000000" endx="0.507000000000000" endy="0.096590900000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>243</red>
|
||||
<green>243</green>
|
||||
<blue>243</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="1.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>250</red>
|
||||
<green>250</green>
|
||||
<blue>250</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Light">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Midlight">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>251</red>
|
||||
<green>251</green>
|
||||
<blue>251</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Dark">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>124</red>
|
||||
<green>124</green>
|
||||
<blue>124</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Mid">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>165</red>
|
||||
<green>165</green>
|
||||
<blue>165</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Text">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="BrightText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Base">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.869318000000000" endx="0.507000000000000" endy="0.096590900000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>243</red>
|
||||
<green>243</green>
|
||||
<blue>243</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="1.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>250</red>
|
||||
<green>250</green>
|
||||
<blue>250</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Window">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.869318000000000" endx="0.507000000000000" endy="0.096590900000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>243</red>
|
||||
<green>243</green>
|
||||
<blue>243</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="1.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>250</red>
|
||||
<green>250</green>
|
||||
<blue>250</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Shadow">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="AlternateBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>251</red>
|
||||
<green>251</green>
|
||||
<blue>251</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>220</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</active>
|
||||
<inactive>
|
||||
<colorrole role="WindowText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Button">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.869318000000000" endx="0.507000000000000" endy="0.096590900000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>243</red>
|
||||
<green>243</green>
|
||||
<blue>243</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="1.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>250</red>
|
||||
<green>250</green>
|
||||
<blue>250</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Light">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Midlight">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>251</red>
|
||||
<green>251</green>
|
||||
<blue>251</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Dark">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>124</red>
|
||||
<green>124</green>
|
||||
<blue>124</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Mid">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>165</red>
|
||||
<green>165</green>
|
||||
<blue>165</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Text">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="BrightText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Base">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.869318000000000" endx="0.507000000000000" endy="0.096590900000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>243</red>
|
||||
<green>243</green>
|
||||
<blue>243</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="1.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>250</red>
|
||||
<green>250</green>
|
||||
<blue>250</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Window">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.869318000000000" endx="0.507000000000000" endy="0.096590900000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>243</red>
|
||||
<green>243</green>
|
||||
<blue>243</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="1.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>250</red>
|
||||
<green>250</green>
|
||||
<blue>250</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Shadow">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="AlternateBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>251</red>
|
||||
<green>251</green>
|
||||
<blue>251</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>220</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</inactive>
|
||||
<disabled>
|
||||
<colorrole role="WindowText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>124</red>
|
||||
<green>124</green>
|
||||
<blue>124</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Button">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.869318000000000" endx="0.507000000000000" endy="0.096590900000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>243</red>
|
||||
<green>243</green>
|
||||
<blue>243</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="1.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>250</red>
|
||||
<green>250</green>
|
||||
<blue>250</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Light">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Midlight">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>251</red>
|
||||
<green>251</green>
|
||||
<blue>251</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Dark">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>124</red>
|
||||
<green>124</green>
|
||||
<blue>124</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Mid">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>165</red>
|
||||
<green>165</green>
|
||||
<blue>165</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Text">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>124</red>
|
||||
<green>124</green>
|
||||
<blue>124</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="BrightText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>124</red>
|
||||
<green>124</green>
|
||||
<blue>124</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Base">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.869318000000000" endx="0.507000000000000" endy="0.096590900000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>243</red>
|
||||
<green>243</green>
|
||||
<blue>243</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="1.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>250</red>
|
||||
<green>250</green>
|
||||
<blue>250</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Window">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.869318000000000" endx="0.507000000000000" endy="0.096590900000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>243</red>
|
||||
<green>243</green>
|
||||
<blue>243</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="1.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>250</red>
|
||||
<green>250</green>
|
||||
<blue>250</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Shadow">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="AlternateBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>248</red>
|
||||
<green>248</green>
|
||||
<blue>248</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>220</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</disabled>
|
||||
</palette>
|
||||
</property>
|
||||
<property name="title">
|
||||
<string>Tuning</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="flat">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_21">
|
||||
<property name="leftMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="horizontalSpacing">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<item row="0" column="1">
|
||||
<spacer name="horizontalSpacer_49">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>497</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="QPushButton" name="pushButton_7">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Reset all values to GCS defaults</string>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Default</string>
|
||||
</property>
|
||||
<property name="objrelation" stdset="0">
|
||||
<stringlist>
|
||||
<string>objname:AltitudeHoldSettings</string>
|
||||
<string>button:default</string>
|
||||
<string>buttongroup:99</string>
|
||||
</stringlist>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" colspan="3">
|
||||
<widget class="QGroupBox" name="RateStabilizationGroup_12">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>140</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="palette">
|
||||
<palette>
|
||||
<active>
|
||||
<colorrole role="WindowText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Button">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="0">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Light">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Midlight">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>251</red>
|
||||
<green>251</green>
|
||||
<blue>251</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Dark">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>124</red>
|
||||
<green>124</green>
|
||||
<blue>124</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Mid">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>165</red>
|
||||
<green>165</green>
|
||||
<blue>165</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Text">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="BrightText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Base">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="0">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Window">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="0">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Shadow">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="AlternateBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>251</red>
|
||||
<green>251</green>
|
||||
<blue>251</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>220</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</active>
|
||||
<inactive>
|
||||
<colorrole role="WindowText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Button">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="0">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Light">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Midlight">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>251</red>
|
||||
<green>251</green>
|
||||
<blue>251</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Dark">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>124</red>
|
||||
<green>124</green>
|
||||
<blue>124</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Mid">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>165</red>
|
||||
<green>165</green>
|
||||
<blue>165</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Text">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="BrightText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Base">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="0">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Window">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="0">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Shadow">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="AlternateBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>251</red>
|
||||
<green>251</green>
|
||||
<blue>251</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>220</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</inactive>
|
||||
<disabled>
|
||||
<colorrole role="WindowText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>124</red>
|
||||
<green>124</green>
|
||||
<blue>124</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Button">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="0">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Light">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Midlight">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>251</red>
|
||||
<green>251</green>
|
||||
<blue>251</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Dark">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>124</red>
|
||||
<green>124</green>
|
||||
<blue>124</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Mid">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>165</red>
|
||||
<green>165</green>
|
||||
<blue>165</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Text">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>124</red>
|
||||
<green>124</green>
|
||||
<blue>124</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="BrightText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>124</red>
|
||||
<green>124</green>
|
||||
<blue>124</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Base">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="0">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Window">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="0">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Shadow">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="AlternateBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>248</red>
|
||||
<green>248</green>
|
||||
<blue>248</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>220</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</disabled>
|
||||
</palette>
|
||||
</property>
|
||||
<property name="autoFillBackground">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">QGroupBox{border: 0px;}</string>
|
||||
</property>
|
||||
<property name="title">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="flat">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_13" columnstretch="0,0,0,0">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_54">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Integral</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_56">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>69</width>
|
||||
<height>16</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Proportional</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="label_25">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>58</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Derivative</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<widget class="QSlider" name="AltKpSlider">
|
||||
<property name="maximum">
|
||||
<number>100</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>50</number>
|
||||
</property>
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="tickPosition">
|
||||
<enum>QSlider::TicksBelow</enum>
|
||||
</property>
|
||||
<property name="objrelation" stdset="0">
|
||||
<stringlist>
|
||||
<string>objname:AltitudeHoldSettings</string>
|
||||
<string>fieldname:Kp</string>
|
||||
<string>scale:0.001</string>
|
||||
<string>haslimits:yes</string>
|
||||
<string>buttongroup:99</string>
|
||||
</stringlist>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="2">
|
||||
<widget class="QSlider" name="AltKiSlider">
|
||||
<property name="maximum">
|
||||
<number>100</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>50</number>
|
||||
</property>
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="tickPosition">
|
||||
<enum>QSlider::TicksBelow</enum>
|
||||
</property>
|
||||
<property name="objrelation" stdset="0">
|
||||
<stringlist>
|
||||
<string>objname:AltitudeHoldSettings</string>
|
||||
<string>fieldname:Ki</string>
|
||||
<string>scale:0.001</string>
|
||||
<string>haslimits:yes</string>
|
||||
<string>buttongroup:99</string>
|
||||
</stringlist>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="2">
|
||||
<widget class="QSlider" name="AltKdSlider">
|
||||
<property name="maximum">
|
||||
<number>100</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>50</number>
|
||||
</property>
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="tickPosition">
|
||||
<enum>QSlider::TicksBelow</enum>
|
||||
</property>
|
||||
<property name="objrelation" stdset="0">
|
||||
<stringlist>
|
||||
<string>objname:AltitudeHoldSettings</string>
|
||||
<string>fieldname:Kd</string>
|
||||
<string>scale:0.001</string>
|
||||
<string>haslimits:yes</string>
|
||||
<string>buttongroup:99</string>
|
||||
</stringlist>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<spacer name="horizontalSpacer_53">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Fixed</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>10</width>
|
||||
<height>10</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="QLabel" name="label_55">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>16</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="palette">
|
||||
<palette>
|
||||
<active>
|
||||
<colorrole role="WindowText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Button">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.000000000000000" endx="0.507000000000000" endy="0.772000000000000" type="LinearGradient" spread="ReflectSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.208955000000000">
|
||||
<color alpha="255">
|
||||
<red>74</red>
|
||||
<green>74</green>
|
||||
<blue>74</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="0.786070000000000">
|
||||
<color alpha="255">
|
||||
<red>36</red>
|
||||
<green>36</green>
|
||||
<blue>36</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Light">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>58</red>
|
||||
<green>58</green>
|
||||
<blue>58</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Midlight">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>48</red>
|
||||
<green>48</green>
|
||||
<blue>48</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Dark">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>19</red>
|
||||
<green>19</green>
|
||||
<blue>19</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Mid">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>26</red>
|
||||
<green>26</green>
|
||||
<blue>26</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Text">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="BrightText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Base">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.000000000000000" endx="0.507000000000000" endy="0.772000000000000" type="LinearGradient" spread="ReflectSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.208955000000000">
|
||||
<color alpha="255">
|
||||
<red>74</red>
|
||||
<green>74</green>
|
||||
<blue>74</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="0.786070000000000">
|
||||
<color alpha="255">
|
||||
<red>36</red>
|
||||
<green>36</green>
|
||||
<blue>36</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Window">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.000000000000000" endx="0.507000000000000" endy="0.772000000000000" type="LinearGradient" spread="ReflectSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.208955000000000">
|
||||
<color alpha="255">
|
||||
<red>74</red>
|
||||
<green>74</green>
|
||||
<blue>74</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="0.786070000000000">
|
||||
<color alpha="255">
|
||||
<red>36</red>
|
||||
<green>36</green>
|
||||
<blue>36</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Shadow">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="AlternateBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>19</red>
|
||||
<green>19</green>
|
||||
<blue>19</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>220</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</active>
|
||||
<inactive>
|
||||
<colorrole role="WindowText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Button">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.000000000000000" endx="0.507000000000000" endy="0.772000000000000" type="LinearGradient" spread="ReflectSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.208955000000000">
|
||||
<color alpha="255">
|
||||
<red>74</red>
|
||||
<green>74</green>
|
||||
<blue>74</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="0.786070000000000">
|
||||
<color alpha="255">
|
||||
<red>36</red>
|
||||
<green>36</green>
|
||||
<blue>36</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Light">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>58</red>
|
||||
<green>58</green>
|
||||
<blue>58</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Midlight">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>48</red>
|
||||
<green>48</green>
|
||||
<blue>48</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Dark">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>19</red>
|
||||
<green>19</green>
|
||||
<blue>19</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Mid">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>26</red>
|
||||
<green>26</green>
|
||||
<blue>26</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Text">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="BrightText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Base">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.000000000000000" endx="0.507000000000000" endy="0.772000000000000" type="LinearGradient" spread="ReflectSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.208955000000000">
|
||||
<color alpha="255">
|
||||
<red>74</red>
|
||||
<green>74</green>
|
||||
<blue>74</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="0.786070000000000">
|
||||
<color alpha="255">
|
||||
<red>36</red>
|
||||
<green>36</green>
|
||||
<blue>36</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Window">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.000000000000000" endx="0.507000000000000" endy="0.772000000000000" type="LinearGradient" spread="ReflectSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.208955000000000">
|
||||
<color alpha="255">
|
||||
<red>74</red>
|
||||
<green>74</green>
|
||||
<blue>74</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="0.786070000000000">
|
||||
<color alpha="255">
|
||||
<red>36</red>
|
||||
<green>36</green>
|
||||
<blue>36</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Shadow">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="AlternateBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>19</red>
|
||||
<green>19</green>
|
||||
<blue>19</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>220</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</inactive>
|
||||
<disabled>
|
||||
<colorrole role="WindowText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Button">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.000000000000000" endx="0.507000000000000" endy="0.772000000000000" type="LinearGradient" spread="ReflectSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.208955000000000">
|
||||
<color alpha="255">
|
||||
<red>74</red>
|
||||
<green>74</green>
|
||||
<blue>74</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="0.786070000000000">
|
||||
<color alpha="255">
|
||||
<red>36</red>
|
||||
<green>36</green>
|
||||
<blue>36</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Light">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>58</red>
|
||||
<green>58</green>
|
||||
<blue>58</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Midlight">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>48</red>
|
||||
<green>48</green>
|
||||
<blue>48</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Dark">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>19</red>
|
||||
<green>19</green>
|
||||
<blue>19</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Mid">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>26</red>
|
||||
<green>26</green>
|
||||
<blue>26</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Text">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="BrightText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Base">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.000000000000000" endx="0.507000000000000" endy="0.772000000000000" type="LinearGradient" spread="ReflectSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.208955000000000">
|
||||
<color alpha="255">
|
||||
<red>74</red>
|
||||
<green>74</green>
|
||||
<blue>74</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="0.786070000000000">
|
||||
<color alpha="255">
|
||||
<red>36</red>
|
||||
<green>36</green>
|
||||
<blue>36</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Window">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.000000000000000" endx="0.507000000000000" endy="0.772000000000000" type="LinearGradient" spread="ReflectSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.208955000000000">
|
||||
<color alpha="255">
|
||||
<red>74</red>
|
||||
<green>74</green>
|
||||
<blue>74</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="0.786070000000000">
|
||||
<color alpha="255">
|
||||
<red>36</red>
|
||||
<green>36</green>
|
||||
<blue>36</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Shadow">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="AlternateBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>39</red>
|
||||
<green>39</green>
|
||||
<blue>39</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>220</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</disabled>
|
||||
</palette>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="autoFillBackground">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255));
|
||||
color: rgb(255, 255, 255);
|
||||
border-radius: 5;</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Altitude</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="3">
|
||||
<widget class="QSpinBox" name="AltKp">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>50</width>
|
||||
<height>22</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>50</width>
|
||||
<height>22</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="focusPolicy">
|
||||
<enum>Qt::StrongFocus</enum>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>100</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>51</number>
|
||||
</property>
|
||||
<property name="objrelation" stdset="0">
|
||||
<stringlist>
|
||||
<string>objname:AltitudeHoldSettings</string>
|
||||
<string>fieldname:Kp</string>
|
||||
<string>scale:0.001</string>
|
||||
<string>haslimits:yes</string>
|
||||
<string>buttongroup:99</string>
|
||||
</stringlist>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="3">
|
||||
<widget class="QSpinBox" name="AltKi">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>50</width>
|
||||
<height>22</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>50</width>
|
||||
<height>22</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="focusPolicy">
|
||||
<enum>Qt::StrongFocus</enum>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>100</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>51</number>
|
||||
</property>
|
||||
<property name="objrelation" stdset="0">
|
||||
<stringlist>
|
||||
<string>objname:AltitudeHoldSettings</string>
|
||||
<string>fieldname:Ki</string>
|
||||
<string>scale:0.001</string>
|
||||
<string>haslimits:yes</string>
|
||||
<string>buttongroup:99</string>
|
||||
</stringlist>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="3">
|
||||
<widget class="QSpinBox" name="AltKd">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>50</width>
|
||||
<height>22</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>50</width>
|
||||
<height>22</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="focusPolicy">
|
||||
<enum>Qt::StrongFocus</enum>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>100</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>51</number>
|
||||
</property>
|
||||
<property name="objrelation" stdset="0">
|
||||
<stringlist>
|
||||
<string>objname:AltitudeHoldSettings</string>
|
||||
<string>fieldname:Kd</string>
|
||||
<string>scale:0.001</string>
|
||||
<string>haslimits:yes</string>
|
||||
<string>buttongroup:99</string>
|
||||
</stringlist>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QGroupBox" name="RateStabilizationGroup_13">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="palette">
|
||||
<palette>
|
||||
<active>
|
||||
<colorrole role="WindowText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Button">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.869318000000000" endx="0.507000000000000" endy="0.096590900000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>243</red>
|
||||
<green>243</green>
|
||||
<blue>243</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="1.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>250</red>
|
||||
<green>250</green>
|
||||
<blue>250</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Light">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Midlight">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>251</red>
|
||||
<green>251</green>
|
||||
<blue>251</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Dark">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>124</red>
|
||||
<green>124</green>
|
||||
<blue>124</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Mid">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>165</red>
|
||||
<green>165</green>
|
||||
<blue>165</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Text">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="BrightText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Base">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.869318000000000" endx="0.507000000000000" endy="0.096590900000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>243</red>
|
||||
<green>243</green>
|
||||
<blue>243</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="1.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>250</red>
|
||||
<green>250</green>
|
||||
<blue>250</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Window">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.869318000000000" endx="0.507000000000000" endy="0.096590900000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>243</red>
|
||||
<green>243</green>
|
||||
<blue>243</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="1.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>250</red>
|
||||
<green>250</green>
|
||||
<blue>250</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Shadow">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="AlternateBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>251</red>
|
||||
<green>251</green>
|
||||
<blue>251</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>220</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</active>
|
||||
<inactive>
|
||||
<colorrole role="WindowText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Button">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.869318000000000" endx="0.507000000000000" endy="0.096590900000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>243</red>
|
||||
<green>243</green>
|
||||
<blue>243</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="1.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>250</red>
|
||||
<green>250</green>
|
||||
<blue>250</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Light">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Midlight">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>251</red>
|
||||
<green>251</green>
|
||||
<blue>251</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Dark">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>124</red>
|
||||
<green>124</green>
|
||||
<blue>124</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Mid">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>165</red>
|
||||
<green>165</green>
|
||||
<blue>165</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Text">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="BrightText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Base">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.869318000000000" endx="0.507000000000000" endy="0.096590900000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>243</red>
|
||||
<green>243</green>
|
||||
<blue>243</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="1.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>250</red>
|
||||
<green>250</green>
|
||||
<blue>250</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Window">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.869318000000000" endx="0.507000000000000" endy="0.096590900000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>243</red>
|
||||
<green>243</green>
|
||||
<blue>243</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="1.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>250</red>
|
||||
<green>250</green>
|
||||
<blue>250</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Shadow">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="AlternateBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>251</red>
|
||||
<green>251</green>
|
||||
<blue>251</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>220</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</inactive>
|
||||
<disabled>
|
||||
<colorrole role="WindowText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>124</red>
|
||||
<green>124</green>
|
||||
<blue>124</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Button">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.869318000000000" endx="0.507000000000000" endy="0.096590900000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>243</red>
|
||||
<green>243</green>
|
||||
<blue>243</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="1.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>250</red>
|
||||
<green>250</green>
|
||||
<blue>250</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Light">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Midlight">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>251</red>
|
||||
<green>251</green>
|
||||
<blue>251</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Dark">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>124</red>
|
||||
<green>124</green>
|
||||
<blue>124</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Mid">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>165</red>
|
||||
<green>165</green>
|
||||
<blue>165</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Text">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>124</red>
|
||||
<green>124</green>
|
||||
<blue>124</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="BrightText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>124</red>
|
||||
<green>124</green>
|
||||
<blue>124</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Base">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.869318000000000" endx="0.507000000000000" endy="0.096590900000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>243</red>
|
||||
<green>243</green>
|
||||
<blue>243</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="1.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>250</red>
|
||||
<green>250</green>
|
||||
<blue>250</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Window">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.869318000000000" endx="0.507000000000000" endy="0.096590900000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>243</red>
|
||||
<green>243</green>
|
||||
<blue>243</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="1.000000000000000">
|
||||
<color alpha="255">
|
||||
<red>250</red>
|
||||
<green>250</green>
|
||||
<blue>250</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Shadow">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="AlternateBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>248</red>
|
||||
<green>248</green>
|
||||
<blue>248</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>220</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</disabled>
|
||||
</palette>
|
||||
</property>
|
||||
<property name="title">
|
||||
<string>Vario Altitude</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="flat">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_22">
|
||||
<property name="leftMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="horizontalSpacing">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<item row="1" column="0" colspan="3">
|
||||
<widget class="QGroupBox" name="RateStabilizationGroup_14">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>140</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="palette">
|
||||
<palette>
|
||||
<active>
|
||||
<colorrole role="WindowText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Button">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="0">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Light">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Midlight">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>251</red>
|
||||
<green>251</green>
|
||||
<blue>251</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Dark">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>124</red>
|
||||
<green>124</green>
|
||||
<blue>124</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Mid">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>165</red>
|
||||
<green>165</green>
|
||||
<blue>165</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Text">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="BrightText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Base">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="0">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Window">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="0">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Shadow">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="AlternateBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>251</red>
|
||||
<green>251</green>
|
||||
<blue>251</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>220</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</active>
|
||||
<inactive>
|
||||
<colorrole role="WindowText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Button">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="0">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Light">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Midlight">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>251</red>
|
||||
<green>251</green>
|
||||
<blue>251</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Dark">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>124</red>
|
||||
<green>124</green>
|
||||
<blue>124</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Mid">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>165</red>
|
||||
<green>165</green>
|
||||
<blue>165</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Text">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="BrightText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Base">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="0">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Window">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="0">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Shadow">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="AlternateBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>251</red>
|
||||
<green>251</green>
|
||||
<blue>251</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>220</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</inactive>
|
||||
<disabled>
|
||||
<colorrole role="WindowText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>124</red>
|
||||
<green>124</green>
|
||||
<blue>124</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Button">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="0">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Light">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Midlight">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>251</red>
|
||||
<green>251</green>
|
||||
<blue>251</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Dark">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>124</red>
|
||||
<green>124</green>
|
||||
<blue>124</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Mid">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>165</red>
|
||||
<green>165</green>
|
||||
<blue>165</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Text">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>124</red>
|
||||
<green>124</green>
|
||||
<blue>124</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="BrightText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>124</red>
|
||||
<green>124</green>
|
||||
<blue>124</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Base">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="0">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Window">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="0">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Shadow">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="AlternateBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>248</red>
|
||||
<green>248</green>
|
||||
<blue>248</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>220</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</disabled>
|
||||
</palette>
|
||||
</property>
|
||||
<property name="autoFillBackground">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">QGroupBox{border: 0px;}</string>
|
||||
</property>
|
||||
<property name="title">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="flat">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_15" columnstretch="0,0,0,0">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item row="2" column="2">
|
||||
<widget class="QSlider" name="AltThrRateSlider_2">
|
||||
<property name="maximum">
|
||||
<number>10</number>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<number>1</number>
|
||||
</property>
|
||||
<property name="pageStep">
|
||||
<number>1</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="tickPosition">
|
||||
<enum>QSlider::TicksBelow</enum>
|
||||
</property>
|
||||
<property name="tickInterval">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="objrelation" stdset="0">
|
||||
<stringlist>
|
||||
<string>objname:AltitudeHoldSettings</string>
|
||||
<string>fieldname:ThrottleRate</string>
|
||||
<string>haslimits:no</string>
|
||||
<string>scale:0.5</string>
|
||||
<string>buttongroup:99</string>
|
||||
</stringlist>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<spacer name="horizontalSpacer_57">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Fixed</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>10</width>
|
||||
<height>10</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_61">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>69</width>
|
||||
<height>16</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Exponential</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="3">
|
||||
<widget class="QDoubleSpinBox" name="AltThrExp_2">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>50</width>
|
||||
<height>22</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>50</width>
|
||||
<height>22</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="focusPolicy">
|
||||
<enum>Qt::StrongFocus</enum>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string><html><head/><body><p>Throttle exponential value.</p></body></html></string>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="decimals">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>256.000000000000000</double>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<double>1.000000000000000</double>
|
||||
</property>
|
||||
<property name="value">
|
||||
<double>128.000000000000000</double>
|
||||
</property>
|
||||
<property name="objrelation" stdset="0">
|
||||
<stringlist>
|
||||
<string>objname:AltitudeHoldSettings</string>
|
||||
<string>fieldname:ThrottleExp</string>
|
||||
<string>haslimits:no</string>
|
||||
<string>scale:1</string>
|
||||
<string>buttongroup:99</string>
|
||||
</stringlist>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_63">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Max Vertical Velocity</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="3">
|
||||
<widget class="QDoubleSpinBox" name="AltThrRate_2">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>50</width>
|
||||
<height>22</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>50</width>
|
||||
<height>22</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="focusPolicy">
|
||||
<enum>Qt::StrongFocus</enum>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string><html><head/><body><p>Maximum allowed vertical velocity in m/s.</p></body></html></string>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="decimals">
|
||||
<number>1</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>5.000000000000000</double>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<double>0.100000000000000</double>
|
||||
</property>
|
||||
<property name="value">
|
||||
<double>2.500000000000000</double>
|
||||
</property>
|
||||
<property name="objrelation" stdset="0">
|
||||
<stringlist>
|
||||
<string>objname:AltitudeHoldSettings</string>
|
||||
<string>fieldname:ThrottleRate</string>
|
||||
<string>haslimits:no</string>
|
||||
<string>scale:1</string>
|
||||
<string>buttongroup:99</string>
|
||||
</stringlist>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<widget class="QSlider" name="AltThrExpSlider_2">
|
||||
<property name="maximum">
|
||||
<number>256</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>128</number>
|
||||
</property>
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="tickPosition">
|
||||
<enum>QSlider::TicksBelow</enum>
|
||||
</property>
|
||||
<property name="objrelation" stdset="0">
|
||||
<stringlist>
|
||||
<string>objname:AltitudeHoldSettings</string>
|
||||
<string>fieldname:ThrottleExp</string>
|
||||
<string>haslimits:no</string>
|
||||
<string>scale:1</string>
|
||||
<string>buttongroup:99</string>
|
||||
</stringlist>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="QLabel" name="label_64">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>16</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="palette">
|
||||
<palette>
|
||||
<active>
|
||||
<colorrole role="WindowText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Button">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.000000000000000" endx="0.507000000000000" endy="0.772000000000000" type="LinearGradient" spread="ReflectSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.208955000000000">
|
||||
<color alpha="255">
|
||||
<red>74</red>
|
||||
<green>74</green>
|
||||
<blue>74</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="0.786070000000000">
|
||||
<color alpha="255">
|
||||
<red>36</red>
|
||||
<green>36</green>
|
||||
<blue>36</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Light">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>58</red>
|
||||
<green>58</green>
|
||||
<blue>58</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Midlight">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>48</red>
|
||||
<green>48</green>
|
||||
<blue>48</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Dark">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>19</red>
|
||||
<green>19</green>
|
||||
<blue>19</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Mid">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>26</red>
|
||||
<green>26</green>
|
||||
<blue>26</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Text">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="BrightText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Base">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.000000000000000" endx="0.507000000000000" endy="0.772000000000000" type="LinearGradient" spread="ReflectSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.208955000000000">
|
||||
<color alpha="255">
|
||||
<red>74</red>
|
||||
<green>74</green>
|
||||
<blue>74</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="0.786070000000000">
|
||||
<color alpha="255">
|
||||
<red>36</red>
|
||||
<green>36</green>
|
||||
<blue>36</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Window">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.000000000000000" endx="0.507000000000000" endy="0.772000000000000" type="LinearGradient" spread="ReflectSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.208955000000000">
|
||||
<color alpha="255">
|
||||
<red>74</red>
|
||||
<green>74</green>
|
||||
<blue>74</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="0.786070000000000">
|
||||
<color alpha="255">
|
||||
<red>36</red>
|
||||
<green>36</green>
|
||||
<blue>36</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Shadow">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="AlternateBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>19</red>
|
||||
<green>19</green>
|
||||
<blue>19</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>220</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</active>
|
||||
<inactive>
|
||||
<colorrole role="WindowText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Button">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.000000000000000" endx="0.507000000000000" endy="0.772000000000000" type="LinearGradient" spread="ReflectSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.208955000000000">
|
||||
<color alpha="255">
|
||||
<red>74</red>
|
||||
<green>74</green>
|
||||
<blue>74</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="0.786070000000000">
|
||||
<color alpha="255">
|
||||
<red>36</red>
|
||||
<green>36</green>
|
||||
<blue>36</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Light">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>58</red>
|
||||
<green>58</green>
|
||||
<blue>58</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Midlight">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>48</red>
|
||||
<green>48</green>
|
||||
<blue>48</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Dark">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>19</red>
|
||||
<green>19</green>
|
||||
<blue>19</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Mid">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>26</red>
|
||||
<green>26</green>
|
||||
<blue>26</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Text">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="BrightText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Base">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.000000000000000" endx="0.507000000000000" endy="0.772000000000000" type="LinearGradient" spread="ReflectSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.208955000000000">
|
||||
<color alpha="255">
|
||||
<red>74</red>
|
||||
<green>74</green>
|
||||
<blue>74</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="0.786070000000000">
|
||||
<color alpha="255">
|
||||
<red>36</red>
|
||||
<green>36</green>
|
||||
<blue>36</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Window">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.000000000000000" endx="0.507000000000000" endy="0.772000000000000" type="LinearGradient" spread="ReflectSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.208955000000000">
|
||||
<color alpha="255">
|
||||
<red>74</red>
|
||||
<green>74</green>
|
||||
<blue>74</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="0.786070000000000">
|
||||
<color alpha="255">
|
||||
<red>36</red>
|
||||
<green>36</green>
|
||||
<blue>36</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Shadow">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="AlternateBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>19</red>
|
||||
<green>19</green>
|
||||
<blue>19</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>220</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</inactive>
|
||||
<disabled>
|
||||
<colorrole role="WindowText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Button">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.000000000000000" endx="0.507000000000000" endy="0.772000000000000" type="LinearGradient" spread="ReflectSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.208955000000000">
|
||||
<color alpha="255">
|
||||
<red>74</red>
|
||||
<green>74</green>
|
||||
<blue>74</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="0.786070000000000">
|
||||
<color alpha="255">
|
||||
<red>36</red>
|
||||
<green>36</green>
|
||||
<blue>36</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Light">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>58</red>
|
||||
<green>58</green>
|
||||
<blue>58</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Midlight">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>48</red>
|
||||
<green>48</green>
|
||||
<blue>48</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Dark">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>19</red>
|
||||
<green>19</green>
|
||||
<blue>19</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Mid">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>26</red>
|
||||
<green>26</green>
|
||||
<blue>26</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Text">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="BrightText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ButtonText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Base">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.000000000000000" endx="0.507000000000000" endy="0.772000000000000" type="LinearGradient" spread="ReflectSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.208955000000000">
|
||||
<color alpha="255">
|
||||
<red>74</red>
|
||||
<green>74</green>
|
||||
<blue>74</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="0.786070000000000">
|
||||
<color alpha="255">
|
||||
<red>36</red>
|
||||
<green>36</green>
|
||||
<blue>36</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Window">
|
||||
<brush brushstyle="LinearGradientPattern">
|
||||
<gradient startx="0.507000000000000" starty="0.000000000000000" endx="0.507000000000000" endy="0.772000000000000" type="LinearGradient" spread="ReflectSpread" coordinatemode="ObjectBoundingMode">
|
||||
<gradientstop position="0.208955000000000">
|
||||
<color alpha="255">
|
||||
<red>74</red>
|
||||
<green>74</green>
|
||||
<blue>74</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
<gradientstop position="0.786070000000000">
|
||||
<color alpha="255">
|
||||
<red>36</red>
|
||||
<green>36</green>
|
||||
<blue>36</blue>
|
||||
</color>
|
||||
</gradientstop>
|
||||
</gradient>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="Shadow">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="AlternateBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>39</red>
|
||||
<green>39</green>
|
||||
<blue>39</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipBase">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>220</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
<colorrole role="ToolTipText">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>0</red>
|
||||
<green>0</green>
|
||||
<blue>0</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</disabled>
|
||||
</palette>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="autoFillBackground">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255));
|
||||
color: rgb(255, 255, 255);
|
||||
border-radius: 5;</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Throttle Stick Response</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<spacer name="horizontalSpacer_52">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>497</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="QPushButton" name="pushButton_8">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Reset all values to GCS defaults</string>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Default</string>
|
||||
</property>
|
||||
<property name="objrelation" stdset="0">
|
||||
<stringlist>
|
||||
<string>objname:AltitudeHoldSettings</string>
|
||||
<string>button:default</string>
|
||||
<string>buttongroup:99</string>
|
||||
</stringlist>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QGroupBox" name="groupBox_8">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>60</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="title">
|
||||
<string>Instant Update</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_14">
|
||||
<item>
|
||||
<widget class="QCheckBox" name="realTimeUpdates_7">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>136</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string><html><head/><body><p>Enabling this feature mean that any changes made to the sliders will be instantly sent and used by the Flight Controller, useful for two person tuning where one normally flies and ones changes the GCS.</p></body></html></string>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Update flight controller in real time</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<spacer name="verticalSpacer_4">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Expanding</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
|
@ -41,6 +41,7 @@ QT_END_NAMESPACE
|
||||
namespace Core {
|
||||
class CORE_EXPORT IOptionsPage : public QObject {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
IOptionsPage(QObject *parent = 0) :
|
||||
QObject(parent),
|
||||
@ -51,6 +52,7 @@ public:
|
||||
{
|
||||
m_icon = icon;
|
||||
}
|
||||
|
||||
QIcon icon()
|
||||
{
|
||||
return m_icon;
|
||||
@ -63,22 +65,31 @@ public:
|
||||
{
|
||||
return "";
|
||||
};
|
||||
|
||||
virtual QString trName() const
|
||||
{
|
||||
return "";
|
||||
};
|
||||
|
||||
virtual QString category() const
|
||||
{
|
||||
return "DefaultCategory";
|
||||
};
|
||||
|
||||
virtual QString trCategory() const
|
||||
{
|
||||
return "DefaultCategory";
|
||||
};
|
||||
|
||||
virtual QWidget *createPage(QWidget *parent) = 0;
|
||||
|
||||
virtual void apply() = 0;
|
||||
virtual void finish() = 0;
|
||||
|
||||
public slots:
|
||||
virtual void updateState()
|
||||
{};
|
||||
|
||||
private:
|
||||
QIcon m_icon;
|
||||
};
|
||||
|
@ -99,6 +99,7 @@ Q_DECLARE_METATYPE(::PageData) SettingsDialog::SettingsDialog(QWidget *parent, c
|
||||
QSettings *settings = ICore::instance()->settings();
|
||||
|
||||
settings->beginGroup("General");
|
||||
settings->beginGroup("Settings");
|
||||
|
||||
// restore last displayed category and page
|
||||
// this is done only if no category or page was provided through the constructor
|
||||
@ -112,30 +113,26 @@ Q_DECLARE_METATYPE(::PageData) SettingsDialog::SettingsDialog(QWidget *parent, c
|
||||
}
|
||||
|
||||
// restore window size
|
||||
int windowWidth = settings->value("SettingsWindowWidth", 0).toInt();
|
||||
int windowHeight = settings->value("SettingsWindowHeight", 0).toInt();
|
||||
int windowWidth = settings->value("WindowWidth", 0).toInt();
|
||||
int windowHeight = settings->value("WindowHeight", 0).toInt();
|
||||
qDebug() << "SettingsDialog window width :" << windowWidth << ", height:" << windowHeight;
|
||||
if (windowWidth > 0 && windowHeight > 0) {
|
||||
resize(windowWidth, windowHeight);
|
||||
}
|
||||
|
||||
// restore splitter size
|
||||
int size0 = settings->value("SettingsSplitterSize0", 0).toInt();
|
||||
int size1 = settings->value("SettingsSplitterSize1", 0).toInt();
|
||||
qDebug() << "SettingsDialog splitter size0:" << size0 << ", size1:" << size1;
|
||||
int splitterPosition = settings->value("SplitterPosition", 350).toInt();
|
||||
qDebug() << "SettingsDialog splitter position:" << splitterPosition;
|
||||
QList<int> sizes;
|
||||
if (size0 > 0 && size1 > 0) {
|
||||
sizes << size0 << size1;
|
||||
} else {
|
||||
sizes << 150 << 300;
|
||||
}
|
||||
sizes << splitterPosition << 400;
|
||||
splitter->setSizes(sizes);
|
||||
|
||||
settings->endGroup();
|
||||
settings->endGroup();
|
||||
|
||||
// all extra space must go to the option page and none to the tree
|
||||
splitter->setStretchFactor(splitter->indexOf(pageTree), 0);
|
||||
splitter->setStretchFactor(splitter->indexOf(layoutWidget), 1);
|
||||
splitter->setStretchFactor(0, 0);
|
||||
splitter->setStretchFactor(1, 1);
|
||||
|
||||
buttonBox->button(QDialogButtonBox::Ok)->setDefault(true);
|
||||
|
||||
@ -146,14 +143,15 @@ Q_DECLARE_METATYPE(::PageData) SettingsDialog::SettingsDialog(QWidget *parent, c
|
||||
connect(this, SIGNAL(settingsDialogShown(Core::Internal::SettingsDialog *)), m_instanceManager,
|
||||
SLOT(settingsDialogShown(Core::Internal::SettingsDialog *)));
|
||||
connect(this, SIGNAL(settingsDialogRemoved()), m_instanceManager, SLOT(settingsDialogRemoved()));
|
||||
connect(this, SIGNAL(categoryItemSelected()), this, SLOT(categoryItemSelectedShowChildInstead()),
|
||||
Qt::QueuedConnection);
|
||||
|
||||
// needs to be queued to be able to change the selection from the selection change signal call
|
||||
connect(this, SIGNAL(categoryItemSelected()), this, SLOT(onCategorySelected()), Qt::QueuedConnection);
|
||||
|
||||
splitter->setCollapsible(0, false);
|
||||
splitter->setCollapsible(1, false);
|
||||
pageTree->header()->setVisible(false);
|
||||
|
||||
connect(pageTree, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(pageSelected()));
|
||||
connect(pageTree, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(onItemSelected()));
|
||||
|
||||
QList<Core::IOptionsPage *> pluginPages;
|
||||
QList<Core::IOptionsPage *> gadgetPages;
|
||||
@ -168,10 +166,11 @@ Q_DECLARE_METATYPE(::PageData) SettingsDialog::SettingsDialog(QWidget *parent, c
|
||||
}
|
||||
}
|
||||
|
||||
// the plugin options page list sorted by untranslated names to facilitate access to the language settings when GCS
|
||||
// is not running in a language understood by the user.
|
||||
// the plugin options page list is sorted by untranslated category and names
|
||||
// this is done to facilitate access to the language settings when GCS is not running in a language understood by the user.
|
||||
qStableSort(pluginPages.begin(), pluginPages.end(), compareOptionsPageByCategoryAndId);
|
||||
// the plugin options page list sorted is sorted by translated names
|
||||
|
||||
// the plugin options page list is sorted by translated names
|
||||
qStableSort(gadgetPages.begin(), gadgetPages.end(), compareOptionsPageByCategoryAndNameTr);
|
||||
|
||||
// will hold the initially selected item if any
|
||||
@ -181,14 +180,14 @@ Q_DECLARE_METATYPE(::PageData) SettingsDialog::SettingsDialog(QWidget *parent, c
|
||||
foreach(IOptionsPage * page, pluginPages) {
|
||||
QTreeWidgetItem *item = addPage(page);
|
||||
|
||||
// to automatically expand all plugin categories, uncomment next line
|
||||
// item->parent()->setExpanded(true);
|
||||
// automatically expand all plugin categories
|
||||
item->parent()->setExpanded(true);
|
||||
if (page->id() == initialPage && page->category() == initialCategory) {
|
||||
initialItem = item;
|
||||
}
|
||||
}
|
||||
|
||||
// insert separator bewteen plugin and gadget pages
|
||||
// insert separator between plugin and gadget pages
|
||||
QTreeWidgetItem *separator = new QTreeWidgetItem(pageTree);
|
||||
separator->setFlags(separator->flags() & ~Qt::ItemIsSelectable & ~Qt::ItemIsEnabled);
|
||||
separator->setText(0, QString(30, 0xB7));
|
||||
@ -288,7 +287,7 @@ QTreeWidgetItem *SettingsDialog::addPage(IOptionsPage *page)
|
||||
return item;
|
||||
}
|
||||
|
||||
void SettingsDialog::pageSelected()
|
||||
void SettingsDialog::onItemSelected()
|
||||
{
|
||||
QTreeWidgetItem *item = pageTree->currentItem();
|
||||
|
||||
@ -296,10 +295,23 @@ void SettingsDialog::pageSelected()
|
||||
return;
|
||||
}
|
||||
|
||||
if (pageTree->indexOfTopLevelItem(item) >= 0) {
|
||||
if (item->childCount() == 1) {
|
||||
// single child : category will not be expanded
|
||||
item = item->child(0);
|
||||
} else if (item->childCount() > 1) {
|
||||
// multiple children : expand category and select 1st child
|
||||
emit categoryItemSelected();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// get user data
|
||||
PageData data = item->data(0, Qt::UserRole).value<PageData>();
|
||||
int index = data.index;
|
||||
m_currentCategory = data.category;
|
||||
m_currentPage = data.id;
|
||||
|
||||
// check if we are looking at a place holder or not
|
||||
QWidget *widget = dynamic_cast<QLabel *>(stackedPages->widget(index));
|
||||
if (widget) {
|
||||
@ -310,25 +322,27 @@ void SettingsDialog::pageSelected()
|
||||
IOptionsPage *page = m_pages.at(index);
|
||||
stackedPages->insertWidget(index, page->createPage(stackedPages));
|
||||
}
|
||||
|
||||
IOptionsPage *page = m_pages.at(index);
|
||||
page->updateState();
|
||||
|
||||
stackedPages->setCurrentIndex(index);
|
||||
// If user selects a toplevel item, select the first child for them
|
||||
// I.e. Top level items are not really selectable
|
||||
if ((pageTree->indexOfTopLevelItem(item) >= 0) && (item->childCount() > 0)) {
|
||||
emit categoryItemSelected();
|
||||
}
|
||||
}
|
||||
|
||||
void SettingsDialog::categoryItemSelectedShowChildInstead()
|
||||
void SettingsDialog::onCategorySelected()
|
||||
{
|
||||
QTreeWidgetItem *item = pageTree->currentItem();
|
||||
|
||||
item->setExpanded(true);
|
||||
pageTree->setCurrentItem(item->child(0), 0, QItemSelectionModel::SelectCurrent);
|
||||
if (item->childCount() > 1) {
|
||||
item->setExpanded(true);
|
||||
pageTree->setCurrentItem(item->child(0), 0, QItemSelectionModel::SelectCurrent);
|
||||
}
|
||||
}
|
||||
|
||||
void SettingsDialog::deletePage()
|
||||
{
|
||||
QTreeWidgetItem *item = pageTree->currentItem();
|
||||
|
||||
PageData data = item->data(0, Qt::UserRole).value<PageData>();
|
||||
QString category = data.category;
|
||||
|
||||
@ -339,9 +353,9 @@ void SettingsDialog::deletePage()
|
||||
parentItem->removeChild(item);
|
||||
if (parentItem->childCount() == 1) {
|
||||
parentItem->child(0)->setHidden(true);
|
||||
pageTree->setCurrentItem(parentItem, 0, QItemSelectionModel::SelectCurrent);
|
||||
}
|
||||
}
|
||||
pageSelected();
|
||||
}
|
||||
|
||||
// TODO duplicates a lot of the addPage code...
|
||||
@ -453,16 +467,18 @@ void SettingsDialog::done(int val)
|
||||
QSettings *settings = ICore::instance()->settings();
|
||||
|
||||
settings->beginGroup("General");
|
||||
settings->beginGroup("Settings");
|
||||
|
||||
settings->setValue("LastPreferenceCategory", m_currentCategory);
|
||||
settings->setValue("LastPreferencePage", m_currentPage);
|
||||
settings->setValue("SettingsWindowWidth", this->width());
|
||||
settings->setValue("SettingsWindowHeight", this->height());
|
||||
QList<int> sizes = splitter->sizes();
|
||||
qDebug() << "SettingsDialog splitter saving size0:" << sizes[0] << ", size1:" << sizes[1];
|
||||
settings->setValue("SettingsSplitterSize0", sizes[0]);
|
||||
settings->setValue("SettingsSplitterSize1", sizes[1]);
|
||||
|
||||
settings->setValue("WindowWidth", this->width());
|
||||
settings->setValue("WindowHeight", this->height());
|
||||
|
||||
QList<int> sizes = splitter->sizes();
|
||||
settings->setValue("SplitterPosition", sizes[0]);
|
||||
|
||||
settings->endGroup();
|
||||
settings->endGroup();
|
||||
|
||||
QDialog::done(val);
|
||||
|
@ -62,11 +62,11 @@ public slots:
|
||||
void done(int);
|
||||
|
||||
private slots:
|
||||
void pageSelected();
|
||||
void onItemSelected();
|
||||
void onCategorySelected();
|
||||
void accept();
|
||||
void reject();
|
||||
void apply();
|
||||
void categoryItemSelectedShowChildInstead();
|
||||
|
||||
private:
|
||||
QList<Core::IOptionsPage *> m_pages;
|
||||
|
@ -303,23 +303,31 @@ void UAVGadgetInstanceManager::removeAllGadgets()
|
||||
}
|
||||
|
||||
|
||||
bool UAVGadgetInstanceManager::canDeleteConfiguration(IUAVGadgetConfiguration *config)
|
||||
bool UAVGadgetInstanceManager::isConfigurationActive(IUAVGadgetConfiguration *config)
|
||||
{
|
||||
// to be able to delete a configuration, no instance must be using it
|
||||
// check if there is gadget currently using the configuration
|
||||
foreach(IUAVGadget * gadget, m_gadgetInstances) {
|
||||
if (gadget->activeConfiguration() == config) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// and it cannot be the only configuration
|
||||
foreach(IUAVGadgetConfiguration * c, m_configurations) {
|
||||
if (c != config && c->classId() == config->classId()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
UAVGadgetInstanceManager::DeleteStatus UAVGadgetInstanceManager::canDeleteConfiguration(IUAVGadgetConfiguration *config)
|
||||
{
|
||||
// to be able to delete a configuration, no instance must be using it
|
||||
if (isConfigurationActive(config)) {
|
||||
return UAVGadgetInstanceManager::KO_ACTIVE;
|
||||
}
|
||||
// and it cannot be the only configuration
|
||||
QList<IUAVGadgetConfiguration *> *configs = provisionalConfigurations(config->classId());
|
||||
if (configs->count() <= 1) {
|
||||
return UAVGadgetInstanceManager::KO_LONE;
|
||||
}
|
||||
return UAVGadgetInstanceManager::OK;
|
||||
}
|
||||
|
||||
void UAVGadgetInstanceManager::deleteConfiguration(IUAVGadgetConfiguration *config)
|
||||
{
|
||||
m_provisionalDeletes.append(config);
|
||||
@ -504,6 +512,30 @@ QList<IUAVGadgetConfiguration *> *UAVGadgetInstanceManager::configurations(QStri
|
||||
return configs;
|
||||
}
|
||||
|
||||
QList<IUAVGadgetConfiguration *> *UAVGadgetInstanceManager::provisionalConfigurations(QString classId) const
|
||||
{
|
||||
QList<IUAVGadgetConfiguration *> *configs = new QList<IUAVGadgetConfiguration *>;
|
||||
// add current configurations
|
||||
foreach(IUAVGadgetConfiguration * config, m_configurations) {
|
||||
if (config->classId() == classId) {
|
||||
configs->append(config);
|
||||
}
|
||||
}
|
||||
// add provisional configurations
|
||||
foreach(IUAVGadgetConfiguration * config, m_provisionalConfigs) {
|
||||
if (config->classId() == classId) {
|
||||
configs->append(config);
|
||||
}
|
||||
}
|
||||
// remove provisional configurations
|
||||
foreach(IUAVGadgetConfiguration * config, m_provisionalDeletes) {
|
||||
if (config->classId() == classId) {
|
||||
configs->removeOne(config);
|
||||
}
|
||||
}
|
||||
return configs;
|
||||
}
|
||||
|
||||
int UAVGadgetInstanceManager::indexForConfig(QList<IUAVGadgetConfiguration *> configurations,
|
||||
QString classId, QString configName)
|
||||
{
|
||||
|
@ -53,22 +53,30 @@ class IUAVGadgetFactory;
|
||||
class CORE_EXPORT UAVGadgetInstanceManager : public QObject {
|
||||
Q_OBJECT
|
||||
public:
|
||||
enum DeleteStatus { OK, KO_ACTIVE, KO_LONE };
|
||||
|
||||
explicit UAVGadgetInstanceManager(QObject *parent = 0);
|
||||
~UAVGadgetInstanceManager();
|
||||
|
||||
void readSettings(QSettings *qs);
|
||||
void saveSettings(QSettings *qs);
|
||||
|
||||
IUAVGadget *createGadget(QString classId, QWidget *parent, bool loadDefaultConfiguration = true);
|
||||
void removeGadget(IUAVGadget *gadget);
|
||||
void removeAllGadgets();
|
||||
bool canDeleteConfiguration(IUAVGadgetConfiguration *config);
|
||||
|
||||
bool isConfigurationActive(IUAVGadgetConfiguration *config);
|
||||
DeleteStatus canDeleteConfiguration(IUAVGadgetConfiguration *config);
|
||||
void deleteConfiguration(IUAVGadgetConfiguration *config);
|
||||
void cloneConfiguration(IUAVGadgetConfiguration *config);
|
||||
void applyChanges(IUAVGadgetConfiguration *config);
|
||||
void configurationNameEdited(QString text, bool hasText = true);
|
||||
|
||||
QStringList classIds() const
|
||||
{
|
||||
return m_classIdNameMap.keys();
|
||||
}
|
||||
|
||||
QStringList configurationNames(QString classId) const;
|
||||
QString gadgetName(QString classId) const;
|
||||
QIcon gadgetIcon(QString classId) const;
|
||||
@ -84,10 +92,6 @@ public slots:
|
||||
void settingsDialogRemoved();
|
||||
|
||||
private:
|
||||
IUAVGadgetFactory *factory(QString classId) const;
|
||||
void createOptionsPages();
|
||||
QList<IUAVGadgetConfiguration *> *configurations(QString classId) const;
|
||||
QString suggestName(QString classId, QString name);
|
||||
QList<IUAVGadget *> m_gadgetInstances;
|
||||
QList<IUAVGadgetFactory *> m_factories;
|
||||
QList<IUAVGadgetConfiguration *> m_configurations;
|
||||
@ -100,8 +104,18 @@ private:
|
||||
QList<IOptionsPage *> m_provisionalOptionsPages;
|
||||
Core::Internal::SettingsDialog *m_settingsDialog;
|
||||
ExtensionSystem::PluginManager *m_pm;
|
||||
int indexForConfig(QList<IUAVGadgetConfiguration *> configurations,
|
||||
QString classId, QString configName);
|
||||
|
||||
IUAVGadgetFactory *factory(QString classId) const;
|
||||
|
||||
void createOptionsPages();
|
||||
|
||||
QList<IUAVGadgetConfiguration *> *configurations(QString classId) const;
|
||||
QList<IUAVGadgetConfiguration *> *provisionalConfigurations(QString classId) const;
|
||||
|
||||
QString suggestName(QString classId, QString name);
|
||||
|
||||
int indexForConfig(QList<IUAVGadgetConfiguration *> configurations, QString classId, QString configName);
|
||||
|
||||
void readConfigs_1_1_0(QSettings *qs);
|
||||
void readConfigs_1_2_0(QSettings *qs);
|
||||
};
|
||||
|
@ -51,18 +51,8 @@ UAVGadgetOptionsPageDecorator::UAVGadgetOptionsPageDecorator(IOptionsPage *page,
|
||||
QWidget *UAVGadgetOptionsPageDecorator::createPage(QWidget *parent)
|
||||
{
|
||||
m_page = new Ui_TopOptionsPage();
|
||||
QWidget *w = new QWidget(parent);
|
||||
QWidget *w = new QWidget(parent);
|
||||
m_page->setupUi(w);
|
||||
if (m_config->locked()) {
|
||||
m_page->deleteButton->hide();
|
||||
m_page->lockCheckBox->hide();
|
||||
m_page->nameLineEdit->setDisabled(true);
|
||||
}
|
||||
if (!m_instanceManager->canDeleteConfiguration(m_config)) {
|
||||
m_page->deleteButton->setDisabled(true);
|
||||
}
|
||||
m_page->lockCheckBox->hide(); //
|
||||
m_page->nameLineEdit->setText(m_id);
|
||||
|
||||
QWidget *wi = m_optionsPage->createPage(w);
|
||||
wi->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
|
||||
@ -73,6 +63,8 @@ QWidget *UAVGadgetOptionsPageDecorator::createPage(QWidget *parent)
|
||||
m_page->configurationBox->hide();
|
||||
}
|
||||
|
||||
updateState();
|
||||
|
||||
connect(m_page->cloneButton, SIGNAL(clicked()), this, SLOT(cloneConfiguration()));
|
||||
connect(m_page->deleteButton, SIGNAL(clicked()), this, SLOT(deleteConfiguration()));
|
||||
connect(m_page->nameLineEdit, SIGNAL(textEdited(QString)), this, SLOT(textEdited(QString)));
|
||||
@ -92,6 +84,35 @@ void UAVGadgetOptionsPageDecorator::finish()
|
||||
m_optionsPage->finish();
|
||||
}
|
||||
|
||||
void UAVGadgetOptionsPageDecorator::updateState()
|
||||
{
|
||||
if (m_config->locked()) {
|
||||
m_page->deleteButton->hide();
|
||||
m_page->lockCheckBox->hide();
|
||||
m_page->nameLineEdit->setDisabled(true);
|
||||
}
|
||||
switch (m_instanceManager->canDeleteConfiguration(m_config)) {
|
||||
case UAVGadgetInstanceManager::OK:
|
||||
m_page->deleteButton->setEnabled(true);
|
||||
m_page->deleteButton->setToolTip(tr("Delete this configuration"));
|
||||
break;
|
||||
case UAVGadgetInstanceManager::KO_ACTIVE:
|
||||
m_page->deleteButton->setEnabled(false);
|
||||
m_page->deleteButton->setToolTip(tr("Cannot delete a configuration currently in use"));
|
||||
break;
|
||||
case UAVGadgetInstanceManager::KO_LONE:
|
||||
m_page->deleteButton->setEnabled(false);
|
||||
m_page->deleteButton->setToolTip(tr("Cannot delete the last configuration"));
|
||||
break;
|
||||
default:
|
||||
m_page->deleteButton->setEnabled(false);
|
||||
m_page->deleteButton->setToolTip(tr("DON'T KNOW !"));
|
||||
break;
|
||||
}
|
||||
m_page->lockCheckBox->hide();
|
||||
m_page->nameLineEdit->setText(m_id);
|
||||
}
|
||||
|
||||
void UAVGadgetOptionsPageDecorator::cloneConfiguration()
|
||||
{
|
||||
m_instanceManager->cloneConfiguration(m_config);
|
||||
|
@ -67,6 +67,7 @@ public:
|
||||
signals:
|
||||
|
||||
public slots:
|
||||
void updateState();
|
||||
|
||||
private slots:
|
||||
void cloneConfiguration();
|
||||
|
@ -1,11 +0,0 @@
|
||||
<plugin name="PFDGadget" version="1.0.0" compatVersion="1.0.0">
|
||||
<vendor>The OpenPilot Project</vendor>
|
||||
<copyright>(C) 2010 Edouard Lafargue</copyright>
|
||||
<license>The GNU Public License (GPL) Version 3</license>
|
||||
<description>The Primary Flight Display gadget</description>
|
||||
<url>http://www.openpilot.org</url>
|
||||
<dependencyList>
|
||||
<dependency name="Core" version="1.0.0"/>
|
||||
<dependency name="UAVObjects" version="1.0.0"/>
|
||||
</dependencyList>
|
||||
</plugin>
|
@ -1,394 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="1038.8931"
|
||||
height="707.56323"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.47 r22583"
|
||||
sodipodi:docname="pfd-default.svg"
|
||||
style="display:inline"
|
||||
inkscape:export-filename="H:\Documents\Hobbies\OpenPilot\SVN\artwork\PFD-2.png"
|
||||
inkscape:export-xdpi="269.53"
|
||||
inkscape:export-ydpi="269.53">
|
||||
<defs
|
||||
id="defs4">
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 353.78162 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="1038.8931 : 353.78162 : 1"
|
||||
inkscape:persp3d-origin="519.44653 : 235.85441 : 1"
|
||||
id="perspective49" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.49497475"
|
||||
inkscape:cx="386.89507"
|
||||
inkscape:cy="316.00835"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer7"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:window-height="725"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true"
|
||||
inkscape:snap-grids="false"
|
||||
inkscape:snap-to-guides="true"
|
||||
inkscape:snap-smooth-nodes="false"
|
||||
inkscape:snap-global="false">
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="1060.7625,922.28538"
|
||||
id="guide5941" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="519.447,353.69582"
|
||||
id="guide6851" />
|
||||
<sodipodi:guide
|
||||
orientation="-0.70710678,0.70710678"
|
||||
position="519.447,353.69582"
|
||||
id="guide6897" />
|
||||
<sodipodi:guide
|
||||
orientation="0.70710678,0.70710678"
|
||||
position="519.447,353.69582"
|
||||
id="guide6899" />
|
||||
<sodipodi:guide
|
||||
orientation="0.70710678,0.70710678"
|
||||
position="407.55996,-15.60171"
|
||||
id="guide6916" />
|
||||
<sodipodi:guide
|
||||
orientation="-0.70710678,0.70710678"
|
||||
position="732.46291,91.541146"
|
||||
id="guide6918" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="341.53388,18.198896"
|
||||
id="guide6920" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="519.70281,477.96972"
|
||||
id="guide4338" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="519.447,353.69582"
|
||||
id="guide4372" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="732.46291,91.541146"
|
||||
id="guide3257" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="156.82618,353.69582"
|
||||
id="guide4225" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="-378.30213,170.71578"
|
||||
id="guide5917" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer7"
|
||||
inkscape:label="Background"
|
||||
style="display:inline"
|
||||
transform="translate(230.4171,-2.5493479)">
|
||||
<rect
|
||||
transform="translate(0,-252.36218)"
|
||||
style="fill:#453e3e;fill-opacity:1;stroke:#060000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;display:inline"
|
||||
id="background"
|
||||
width="1033.8402"
|
||||
height="702.51031"
|
||||
x="-227.89064"
|
||||
y="261.44824"
|
||||
inkscape:label="#rect6231"
|
||||
ry="10" />
|
||||
<g
|
||||
style="font-size:40px;font-style:normal;font-weight:normal;text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
|
||||
id="text3627">
|
||||
<path
|
||||
d="m -39.769348,292.21622 24.667969,0 0,3.32031 -10.351563,0 0,25.83984 -3.964844,0 0,-25.83984 -10.351562,0 0,-3.32031"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3636" />
|
||||
<path
|
||||
d="m 6.7540894,308.17325 0,13.20312 -3.59375,0 0,-13.08593 c -1.84e-5,-2.0703 -0.4036638,-3.61978 -1.2109375,-4.64844 -0.8073081,-1.02863 -2.01824434,-1.54295 -3.6328125,-1.54297 -1.9401158,2e-5 -3.4700622,0.61851 -4.5898438,1.85547 -1.1197995,1.23699 -1.6796947,2.92319 -1.6796875,5.05859 l 0,12.36328 -3.6132811,0 0,-30.39062 3.6132811,0 0,11.91406 c 0.8593669,-1.31508 1.8684805,-2.29816 3.0273438,-2.94922 1.1718635,-0.65102 2.5195184,-0.97654 4.04296871,-0.97656 2.51300399,2e-5 4.41404379,0.78127 5.70312499,2.34375 1.2890412,1.5495 1.9335718,3.83465 1.9335938,6.85547"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3638" />
|
||||
<path
|
||||
d="m 32.672058,309.54044 0,1.75781 -16.523437,0 c 0.156243,2.47396 0.89843,4.36198 2.226562,5.66406 1.341136,1.28907 3.203114,1.9336 5.585938,1.93359 1.380193,1e-5 2.714827,-0.16926 4.003906,-0.50781 1.302064,-0.33854 2.591125,-0.84635 3.867187,-1.52344 l 0,3.39844 c -1.289082,0.54688 -2.610696,0.96354 -3.964843,1.25 -1.354183,0.28646 -2.72788,0.42969 -4.121094,0.42969 -3.489594,0 -6.256518,-1.01563 -8.300781,-3.04688 -2.031254,-2.03124 -3.046878,-4.77863 -3.046875,-8.24218 -3e-6,-3.58072 0.963538,-6.41926 2.890625,-8.51563 1.940097,-2.10935 4.550771,-3.16404 7.832031,-3.16406 2.942692,2e-5 5.266909,0.95054 6.972656,2.85156 1.718728,1.88804 2.578103,4.45965 2.578125,7.71485 m -3.59375,-1.05469 c -0.02606,-1.96613 -0.579445,-3.53514 -1.660156,-4.70703 -1.067725,-1.17186 -2.486994,-1.7578 -4.257813,-1.75782 -2.005219,2e-5 -3.61329,0.56643 -4.824218,1.69922 -1.197924,1.13283 -1.888027,2.72788 -2.070313,4.78516 l 12.8125,-0.0195"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3640" />
|
||||
<path
|
||||
d="m 51.246277,302.86075 c -0.403662,-0.23436 -0.84637,-0.40363 -1.328125,-0.50781 -0.468765,-0.11717 -0.989598,-0.17577 -1.5625,-0.17579 -2.031262,2e-5 -3.59376,0.66409 -4.6875,1.99219 -1.080737,1.31512 -1.621101,3.20965 -1.621094,5.6836 l 0,11.52343 -3.613281,0 0,-21.875 3.613281,0 0,3.39844 c 0.7552,-1.3281 1.738272,-2.31118 2.949219,-2.94922 1.210926,-0.65102 2.682279,-0.97654 4.414062,-0.97656 0.247381,2e-5 0.520819,0.0195 0.820313,0.0586 0.299463,0.0261 0.631494,0.0716 0.996094,0.13672 l 0.01953,3.69141"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3642" />
|
||||
<path
|
||||
d="m 72.906433,309.54044 0,1.75781 -16.523437,0 c 0.156243,2.47396 0.89843,4.36198 2.226562,5.66406 1.341136,1.28907 3.203114,1.9336 5.585938,1.93359 1.380193,1e-5 2.714827,-0.16926 4.003906,-0.50781 1.302064,-0.33854 2.591125,-0.84635 3.867187,-1.52344 l 0,3.39844 c -1.289082,0.54688 -2.610696,0.96354 -3.964843,1.25 -1.354183,0.28646 -2.72788,0.42969 -4.121094,0.42969 -3.489594,0 -6.256518,-1.01563 -8.300781,-3.04688 -2.031254,-2.03124 -3.046878,-4.77863 -3.046875,-8.24218 -3e-6,-3.58072 0.963538,-6.41926 2.890625,-8.51563 1.940097,-2.10935 4.550771,-3.16404 7.832031,-3.16406 2.942692,2e-5 5.266909,0.95054 6.972656,2.85156 1.718728,1.88804 2.578103,4.45965 2.578125,7.71485 m -3.59375,-1.05469 c -0.02606,-1.96613 -0.579445,-3.53514 -1.660156,-4.70703 -1.067725,-1.17186 -2.486994,-1.7578 -4.257813,-1.75782 -2.005219,2e-5 -3.61329,0.56643 -4.824218,1.69922 -1.197924,1.13283 -1.888027,2.72788 -2.070313,4.78516 l 12.8125,-0.0195"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3644" />
|
||||
<path
|
||||
d="m 89.449402,299.50137 3.59375,0 4.492187,17.07032 4.472661,-17.07032 4.23828,0 4.49218,17.07032 4.47266,-17.07032 3.59375,0 -5.72266,21.875 -4.23828,0 -4.70703,-17.92968 -4.726561,17.92968 -4.238281,0 -5.722656,-21.875"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3646" />
|
||||
<path
|
||||
d="m 134.21503,310.38028 c -2.90366,10e-6 -4.91538,0.33204 -6.03516,0.99609 -1.1198,0.66408 -1.67969,1.79689 -1.67969,3.39844 0,1.27605 0.41666,2.29167 1.25,3.04688 0.84635,0.74219 1.99218,1.11328 3.4375,1.11328 1.99218,0 3.58723,-0.70312 4.78516,-2.10938 1.21092,-1.41926 1.81639,-3.30077 1.81641,-5.64453 l 0,-0.80078 -3.57422,0 m 7.16797,-1.48438 0,12.48047 -3.59375,0 0,-3.32031 c -0.82033,1.32813 -1.84247,2.3112 -3.06641,2.94922 -1.22397,0.625 -2.72137,0.9375 -4.49219,0.9375 -2.23959,0 -4.02344,-0.625 -5.35156,-1.875 -1.31511,-1.26302 -1.97266,-2.94921 -1.97266,-5.05859 0,-2.46093 0.82031,-4.3164 2.46094,-5.56641 1.65364,-1.24999 4.11457,-1.87499 7.38281,-1.875 l 5.03907,0 0,-0.35156 c -2e-5,-1.65363 -0.5469,-2.92967 -1.64063,-3.82813 -1.08074,-0.91144 -2.60418,-1.36717 -4.57031,-1.36719 -1.25001,2e-5 -2.46746,0.14976 -3.65235,0.44922 -1.1849,0.2995 -2.32422,0.74872 -3.41796,1.34766 l 0,-3.32031 c 1.31509,-0.50779 2.59113,-0.8854 3.82812,-1.13282 1.23697,-0.26039 2.4414,-0.3906 3.61328,-0.39062 3.16405,2e-5 5.52733,0.82033 7.08985,2.46094 1.56248,1.64064 2.34372,4.12762 2.34375,7.46093"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3648" />
|
||||
<path
|
||||
d="m 162.75018,300.1459 0,3.39844 c -1.01564,-0.52081 -2.07033,-0.91144 -3.16406,-1.17187 -1.09376,-0.2604 -2.22657,-0.39061 -3.39844,-0.39063 -1.78386,2e-5 -3.125,0.27346 -4.02343,0.82031 -0.88543,0.5469 -1.32814,1.36721 -1.32813,2.46094 -1e-5,0.83335 0.319,1.4909 0.95703,1.97266 0.63802,0.46876 1.92057,0.91798 3.84766,1.34765 l 1.23047,0.27344 c 2.55207,0.54689 4.36196,1.32163 5.42968,2.32422 1.08072,0.98959 1.62108,2.37631 1.6211,4.16016 -2e-5,2.03125 -0.80731,3.63932 -2.42188,4.82422 -1.60157,1.18489 -3.8086,1.77734 -6.62109,1.77734 -1.17188,0 -2.39584,-0.11719 -3.67188,-0.35156 -1.26302,-0.22136 -2.59766,-0.5599 -4.0039,-1.01563 l 0,-3.71094 c 1.32812,0.69011 2.63671,1.21095 3.92578,1.5625 1.28905,0.33855 2.56509,0.50782 3.82812,0.50782 1.6927,0 2.99478,-0.28646 3.90625,-0.85938 0.91145,-0.58593 1.36718,-1.40624 1.36719,-2.46094 -1e-5,-0.97655 -0.33204,-1.72525 -0.99609,-2.24609 -0.65106,-0.52082 -2.08986,-1.02213 -4.31641,-1.50391 l -1.25,-0.29296 c -2.22657,-0.46874 -3.83464,-1.18489 -4.82422,-2.14844 -0.98958,-0.97655 -1.48437,-2.31119 -1.48437,-4.00391 0,-2.05727 0.72916,-3.64581 2.1875,-4.76562 1.45833,-1.11977 3.52864,-1.67967 6.21094,-1.67969 1.32811,2e-5 2.57811,0.0977 3.75,0.29297 1.17185,0.19533 2.25258,0.4883 3.24218,0.8789"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3650" />
|
||||
<path
|
||||
d="m 192.34003,310.38028 c -2.90366,10e-6 -4.91538,0.33204 -6.03516,0.99609 -1.1198,0.66408 -1.67969,1.79689 -1.67969,3.39844 0,1.27605 0.41666,2.29167 1.25,3.04688 0.84635,0.74219 1.99218,1.11328 3.4375,1.11328 1.99218,0 3.58723,-0.70312 4.78516,-2.10938 1.21092,-1.41926 1.81639,-3.30077 1.81641,-5.64453 l 0,-0.80078 -3.57422,0 m 7.16797,-1.48438 0,12.48047 -3.59375,0 0,-3.32031 c -0.82033,1.32813 -1.84247,2.3112 -3.06641,2.94922 -1.22397,0.625 -2.72137,0.9375 -4.49219,0.9375 -2.23959,0 -4.02344,-0.625 -5.35156,-1.875 -1.31511,-1.26302 -1.97266,-2.94921 -1.97266,-5.05859 0,-2.46093 0.82031,-4.3164 2.46094,-5.56641 1.65364,-1.24999 4.11457,-1.87499 7.38281,-1.875 l 5.03907,0 0,-0.35156 c -2e-5,-1.65363 -0.5469,-2.92967 -1.64063,-3.82813 -1.08074,-0.91144 -2.60418,-1.36717 -4.57031,-1.36719 -1.25001,2e-5 -2.46746,0.14976 -3.65235,0.44922 -1.1849,0.2995 -2.32422,0.74872 -3.41796,1.34766 l 0,-3.32031 c 1.31509,-0.50779 2.59113,-0.8854 3.82812,-1.13282 1.23697,-0.26039 2.4414,-0.3906 3.61328,-0.39062 3.16405,2e-5 5.52733,0.82033 7.08985,2.46094 1.56248,1.64064 2.34372,4.12762 2.34375,7.46093"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3652" />
|
||||
<path
|
||||
d="m 223.14081,318.09512 0,11.60157 -3.61328,0 0,-30.19532 3.61328,0 0,3.32032 c 0.7552,-1.30207 1.70572,-2.26561 2.85156,-2.89063 1.15884,-0.638 2.53905,-0.95701 4.14063,-0.95703 2.65623,2e-5 4.81117,1.05471 6.46484,3.16406 1.66664,2.10939 2.49998,4.88283 2.5,8.32031 -2e-5,3.43751 -0.83336,6.21095 -2.5,8.32032 -1.65367,2.10937 -3.80861,3.16406 -6.46484,3.16406 -1.60158,0 -2.98179,-0.3125 -4.14063,-0.9375 -1.14584,-0.63802 -2.09636,-1.60807 -2.85156,-2.91016 m 12.22656,-7.63672 c -2e-5,-2.64321 -0.54689,-4.71352 -1.64062,-6.21093 -1.08075,-1.5104 -2.57163,-2.26561 -4.47266,-2.26563 -1.90105,2e-5 -3.39845,0.75523 -4.49219,2.26563 -1.08074,1.49741 -1.6211,3.56772 -1.62109,6.21093 -10e-6,2.64324 0.54035,4.72006 1.62109,6.23047 1.09374,1.4974 2.59114,2.2461 4.49219,2.2461 1.90103,0 3.39191,-0.7487 4.47266,-2.2461 1.09373,-1.51041 1.6406,-3.58723 1.64062,-6.23047"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3654" />
|
||||
<path
|
||||
d="m 257.73065,302.86075 c -0.40366,-0.23436 -0.84637,-0.40363 -1.32812,-0.50781 -0.46877,-0.11717 -0.9896,-0.17577 -1.5625,-0.17579 -2.03126,2e-5 -3.59376,0.66409 -4.6875,1.99219 -1.08074,1.31512 -1.6211,3.20965 -1.6211,5.6836 l 0,11.52343 -3.61328,0 0,-21.875 3.61328,0 0,3.39844 c 0.7552,-1.3281 1.73828,-2.31118 2.94922,-2.94922 1.21093,-0.65102 2.68228,-0.97654 4.41406,-0.97656 0.24739,2e-5 0.52082,0.0195 0.82032,0.0586 0.29946,0.0261 0.63149,0.0716 0.99609,0.13672 l 0.0195,3.69141"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3656" />
|
||||
<path
|
||||
d="m 269.15643,302.0209 c -1.92709,2e-5 -3.45053,0.75523 -4.57031,2.26563 -1.1198,1.49741 -1.67969,3.5547 -1.67969,6.17187 0,2.6172 0.55338,4.681 1.66016,6.19141 1.11978,1.4974 2.64973,2.2461 4.58984,2.24609 1.91405,1e-5 3.43098,-0.7552 4.55078,-2.26562 1.11978,-1.51041 1.67967,-3.5677 1.67969,-6.17188 -2e-5,-2.59113 -0.55991,-4.64191 -1.67969,-6.15234 -1.1198,-1.52342 -2.63673,-2.28514 -4.55078,-2.28516 m 0,-3.04687 c 3.12499,2e-5 5.57941,1.01565 7.36328,3.04687 1.78384,2.03127 2.67576,4.84377 2.67579,8.4375 -3e-5,3.58074 -0.89195,6.39324 -2.67579,8.4375 -1.78387,2.03125 -4.23829,3.04688 -7.36328,3.04688 -3.13803,0 -5.59896,-1.01563 -7.38281,-3.04688 -1.77084,-2.04426 -2.65625,-4.85676 -2.65625,-8.4375 0,-3.59373 0.88541,-6.40623 2.65625,-8.4375 1.78385,-2.03122 4.24478,-3.04685 7.38281,-3.04687"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3658" />
|
||||
<path
|
||||
d="m 300.83612,310.4584 c -2e-5,-2.64321 -0.54689,-4.71352 -1.64062,-6.21093 -1.08075,-1.5104 -2.57163,-2.26561 -4.47266,-2.26563 -1.90105,2e-5 -3.39845,0.75523 -4.49219,2.26563 -1.08074,1.49741 -1.6211,3.56772 -1.62109,6.21093 -10e-6,2.64324 0.54035,4.72006 1.62109,6.23047 1.09374,1.4974 2.59114,2.2461 4.49219,2.2461 1.90103,0 3.39191,-0.7487 4.47266,-2.2461 1.09373,-1.51041 1.6406,-3.58723 1.64062,-6.23047 m -12.22656,-7.63671 c 0.7552,-1.30207 1.70572,-2.26561 2.85156,-2.89063 1.15884,-0.638 2.53905,-0.95701 4.14063,-0.95703 2.65623,2e-5 4.81117,1.05471 6.46484,3.16406 1.66664,2.10939 2.49998,4.88283 2.5,8.32031 -2e-5,3.43751 -0.83336,6.21095 -2.5,8.32032 -1.65367,2.10937 -3.80861,3.16406 -6.46484,3.16406 -1.60158,0 -2.98179,-0.3125 -4.14063,-0.9375 -1.14584,-0.63802 -2.09636,-1.60807 -2.85156,-2.91016 l 0,3.28125 -3.61328,0 0,-30.39062 3.61328,0 0,11.83594"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3660" />
|
||||
<path
|
||||
d="m 310.52362,290.98575 3.59375,0 0,30.39062 -3.59375,0 0,-30.39062"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3662" />
|
||||
<path
|
||||
d="m 340.32831,309.54044 0,1.75781 -16.52344,0 c 0.15624,2.47396 0.89843,4.36198 2.22656,5.66406 1.34114,1.28907 3.20312,1.9336 5.58594,1.93359 1.38019,1e-5 2.71483,-0.16926 4.00391,-0.50781 1.30206,-0.33854 2.59112,-0.84635 3.86718,-1.52344 l 0,3.39844 c -1.28908,0.54688 -2.61069,0.96354 -3.96484,1.25 -1.35418,0.28646 -2.72788,0.42969 -4.12109,0.42969 -3.4896,0 -6.25652,-1.01563 -8.30078,-3.04688 -2.03126,-2.03124 -3.04688,-4.77863 -3.04688,-8.24218 0,-3.58072 0.96354,-6.41926 2.89063,-8.51563 1.94009,-2.10935 4.55077,-3.16404 7.83203,-3.16406 2.94269,2e-5 5.26691,0.95054 6.97265,2.85156 1.71873,1.88804 2.57811,4.45965 2.57813,7.71485 m -3.59375,-1.05469 c -0.0261,-1.96613 -0.57945,-3.53514 -1.66016,-4.70703 -1.06772,-1.17186 -2.48699,-1.7578 -4.25781,-1.75782 -2.00522,2e-5 -3.61329,0.56643 -4.82422,1.69922 -1.19792,1.13283 -1.88803,2.72788 -2.07031,4.78516 l 12.8125,-0.0195"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3664" />
|
||||
<path
|
||||
d="m 363.258,303.70059 c 0.89841,-1.61456 1.97263,-2.80597 3.22265,-3.57422 1.24998,-0.7682 2.72133,-1.15232 4.41406,-1.15234 2.27862,2e-5 4.03643,0.8008 5.27344,2.40234 1.23695,1.58856 1.85544,3.85419 1.85547,6.79688 l 0,13.20312 -3.61328,0 0,-13.08593 c -3e-5,-2.09634 -0.37113,-3.65233 -1.11328,-4.66797 -0.74222,-1.01561 -1.87503,-1.52342 -3.39844,-1.52344 -1.862,2e-5 -3.33336,0.61851 -4.41406,1.85547 -1.08075,1.23699 -1.62112,2.92319 -1.6211,5.05859 l 0,12.36328 -3.61328,0 0,-13.08593 c -10e-6,-2.10936 -0.37111,-3.66535 -1.11328,-4.66797 -0.7422,-1.01561 -1.88803,-1.52342 -3.4375,-1.52344 -1.83595,2e-5 -3.29428,0.62502 -4.375,1.875 -1.08074,1.23699 -1.6211,2.91668 -1.62109,5.03906 l 0,12.36328 -3.61328,0 0,-21.875 3.61328,0 0,3.39844 c 0.8203,-1.34113 1.80337,-2.33071 2.94922,-2.96875 1.14582,-0.638 2.50649,-0.95701 4.08203,-0.95703 1.58852,2e-5 2.93618,0.40367 4.04297,1.21094 1.11977,0.80731 1.94659,1.97918 2.48047,3.51562"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3666" />
|
||||
<path
|
||||
d="m 397.9455,290.98575 3.59375,0 0,30.39062 -3.59375,0 0,-30.39062"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3668" />
|
||||
<path
|
||||
d="m 417.51581,302.0209 c -1.9271,2e-5 -3.45053,0.75523 -4.57031,2.26563 -1.1198,1.49741 -1.6797,3.5547 -1.67969,6.17187 -10e-6,2.6172 0.55338,4.681 1.66015,6.19141 1.11979,1.4974 2.64973,2.2461 4.58985,2.24609 1.91405,1e-5 3.43097,-0.7552 4.55078,-2.26562 1.11977,-1.51041 1.67967,-3.5677 1.67969,-6.17188 -2e-5,-2.59113 -0.55992,-4.64191 -1.67969,-6.15234 -1.11981,-1.52342 -2.63673,-2.28514 -4.55078,-2.28516 m 0,-3.04687 c 3.12498,2e-5 5.57941,1.01565 7.36328,3.04687 1.78383,2.03127 2.67576,4.84377 2.67578,8.4375 -2e-5,3.58074 -0.89195,6.39324 -2.67578,8.4375 -1.78387,2.03125 -4.2383,3.04688 -7.36328,3.04688 -3.13803,0 -5.59897,-1.01563 -7.38281,-3.04688 -1.77084,-2.04426 -2.65626,-4.85676 -2.65625,-8.4375 -10e-6,-3.59373 0.88541,-6.40623 2.65625,-8.4375 1.78384,-2.03122 4.24478,-3.04685 7.38281,-3.04687"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3670" />
|
||||
<path
|
||||
d="m 443.43378,310.38028 c -2.90366,10e-6 -4.91538,0.33204 -6.03516,0.99609 -1.1198,0.66408 -1.67969,1.79689 -1.67969,3.39844 0,1.27605 0.41666,2.29167 1.25,3.04688 0.84635,0.74219 1.99218,1.11328 3.4375,1.11328 1.99218,0 3.58723,-0.70312 4.78516,-2.10938 1.21092,-1.41926 1.81639,-3.30077 1.81641,-5.64453 l 0,-0.80078 -3.57422,0 m 7.16797,-1.48438 0,12.48047 -3.59375,0 0,-3.32031 c -0.82033,1.32813 -1.84247,2.3112 -3.06641,2.94922 -1.22397,0.625 -2.72137,0.9375 -4.49219,0.9375 -2.23959,0 -4.02344,-0.625 -5.35156,-1.875 -1.31511,-1.26302 -1.97266,-2.94921 -1.97266,-5.05859 0,-2.46093 0.82031,-4.3164 2.46094,-5.56641 1.65364,-1.24999 4.11457,-1.87499 7.38281,-1.875 l 5.03907,0 0,-0.35156 c -2e-5,-1.65363 -0.5469,-2.92967 -1.64063,-3.82813 -1.08074,-0.91144 -2.60418,-1.36717 -4.57031,-1.36719 -1.25001,2e-5 -2.46746,0.14976 -3.65235,0.44922 -1.1849,0.2995 -2.32422,0.74872 -3.41796,1.34766 l 0,-3.32031 c 1.31509,-0.50779 2.59113,-0.8854 3.82812,-1.13282 1.23697,-0.26039 2.4414,-0.3906 3.61328,-0.39062 3.16405,2e-5 5.52733,0.82033 7.08985,2.46094 1.56248,1.64064 2.34372,4.12762 2.34375,7.46093"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3672" />
|
||||
<path
|
||||
d="m 472.41815,302.82169 0,-11.83594 3.59375,0 0,30.39062 -3.59375,0 0,-3.28125 c -0.75522,1.30209 -1.71225,2.27214 -2.87109,2.91016 -1.14585,0.625 -2.52606,0.9375 -4.14063,0.9375 -2.64323,0 -4.79818,-1.05469 -6.46484,-3.16406 -1.65365,-2.10937 -2.48047,-4.88281 -2.48047,-8.32032 0,-3.43748 0.82682,-6.21092 2.48047,-8.32031 1.66666,-2.10935 3.82161,-3.16404 6.46484,-3.16406 1.61457,2e-5 2.99478,0.31903 4.14063,0.95703 1.15884,0.62502 2.11587,1.58856 2.87109,2.89063 m -12.24609,7.63671 c -10e-6,2.64324 0.54036,4.72006 1.62109,6.23047 1.09374,1.4974 2.59114,2.2461 4.49219,2.2461 1.90103,0 3.39842,-0.7487 4.49219,-2.2461 1.09373,-1.51041 1.6406,-3.58723 1.64062,-6.23047 -2e-5,-2.64321 -0.54689,-4.71352 -1.64062,-6.21093 -1.09377,-1.5104 -2.59116,-2.26561 -4.49219,-2.26563 -1.90105,2e-5 -3.39845,0.75523 -4.49219,2.26563 -1.08073,1.49741 -1.6211,3.56772 -1.62109,6.21093"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3674" />
|
||||
<path
|
||||
d="m 483.41425,299.50137 3.59375,0 0,21.875 -3.59375,0 0,-21.875 m 0,-8.51562 3.59375,0 0,4.55078 -3.59375,0 0,-4.55078"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3676" />
|
||||
<path
|
||||
d="m 512.69159,308.17325 0,13.20312 -3.59375,0 0,-13.08593 c -2e-5,-2.0703 -0.40366,-3.61978 -1.21094,-4.64844 -0.80731,-1.02863 -2.01824,-1.54295 -3.63281,-1.54297 -1.94012,2e-5 -3.47006,0.61851 -4.58984,1.85547 -1.1198,1.23699 -1.6797,2.92319 -1.67969,5.05859 l 0,12.36328 -3.61328,0 0,-21.875 3.61328,0 0,3.39844 c 0.85937,-1.31508 1.86848,-2.29816 3.02734,-2.94922 1.17187,-0.65102 2.51952,-0.97654 4.04297,-0.97656 2.513,2e-5 4.41404,0.78127 5.70313,2.34375 1.28904,1.5495 1.93357,3.83465 1.93359,6.85547"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3678" />
|
||||
<path
|
||||
d="m 534.29315,310.18497 c -2e-5,-2.60416 -0.54038,-4.62238 -1.62109,-6.05469 -1.06773,-1.43227 -2.57163,-2.14842 -4.51172,-2.14844 -1.92709,2e-5 -3.431,0.71617 -4.51172,2.14844 -1.06771,1.43231 -1.60157,3.45053 -1.60156,6.05469 -10e-6,2.59115 0.53385,4.60287 1.60156,6.03515 1.08072,1.4323 2.58463,2.14844 4.51172,2.14844 1.94009,0 3.44399,-0.71614 4.51172,-2.14844 1.08071,-1.43228 1.62107,-3.444 1.62109,-6.03515 m 3.59375,8.47656 c -2e-5,3.72396 -0.82684,6.49088 -2.48047,8.30078 -1.65366,1.82291 -4.18621,2.73437 -7.59765,2.73438 -1.26303,-10e-6 -2.45444,-0.0977 -3.57422,-0.29297 -1.1198,-0.1823 -2.20704,-0.46876 -3.26172,-0.85938 l 0,-3.49609 c 1.05468,0.57291 2.09635,0.99609 3.125,1.26953 1.02864,0.27343 2.07681,0.41015 3.14453,0.41016 2.35676,-10e-6 4.12108,-0.6185 5.29297,-1.85547 1.17186,-1.22396 1.75779,-3.07943 1.75781,-5.56641 l 0,-1.77734 c -0.7422,1.28906 -1.69272,2.2526 -2.85156,2.89062 -1.15887,0.63802 -2.54559,0.95703 -4.16016,0.95703 -2.6823,0 -4.84375,-1.02213 -6.48437,-3.0664 -1.64063,-2.04427 -2.46094,-4.7526 -2.46094,-8.125 0,-3.38541 0.82031,-6.10025 2.46094,-8.14453 1.64062,-2.04425 3.80207,-3.06639 6.48437,-3.06641 1.61457,2e-5 3.00129,0.31903 4.16016,0.95703 1.15884,0.63804 2.10936,1.60158 2.85156,2.89063 l 0,-3.32032 3.59375,0 0,19.16016"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3680" />
|
||||
<path
|
||||
d="m 561.57831,293.29044 0,6.21093 7.40234,0 0,2.79297 -7.40234,0 0,11.875 c -10e-6,1.78386 0.24088,2.92969 0.72265,3.4375 0.49479,0.50782 1.49088,0.76172 2.98829,0.76172 l 3.6914,0 0,3.00781 -3.6914,0 c -2.77345,0 -4.68751,-0.51432 -5.74219,-1.54297 -1.05469,-1.04166 -1.58204,-2.92968 -1.58203,-5.66406 l 0,-11.875 -2.63672,0 0,-2.79297 2.63672,0 0,-6.21093 3.61328,0"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3682" />
|
||||
<path
|
||||
d="m 591.91034,308.17325 0,13.20312 -3.59375,0 0,-13.08593 c -2e-5,-2.0703 -0.40366,-3.61978 -1.21094,-4.64844 -0.80731,-1.02863 -2.01824,-1.54295 -3.63281,-1.54297 -1.94012,2e-5 -3.47006,0.61851 -4.58984,1.85547 -1.1198,1.23699 -1.6797,2.92319 -1.67969,5.05859 l 0,12.36328 -3.61328,0 0,-30.39062 3.61328,0 0,11.91406 c 0.85937,-1.31508 1.86848,-2.29816 3.02734,-2.94922 1.17187,-0.65102 2.51952,-0.97654 4.04297,-0.97656 2.513,2e-5 4.41404,0.78127 5.70313,2.34375 1.28904,1.5495 1.93357,3.83465 1.93359,6.85547"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3684" />
|
||||
<path
|
||||
d="m 617.82831,309.54044 0,1.75781 -16.52344,0 c 0.15624,2.47396 0.89843,4.36198 2.22656,5.66406 1.34114,1.28907 3.20312,1.9336 5.58594,1.93359 1.38019,1e-5 2.71483,-0.16926 4.00391,-0.50781 1.30206,-0.33854 2.59112,-0.84635 3.86718,-1.52344 l 0,3.39844 c -1.28908,0.54688 -2.61069,0.96354 -3.96484,1.25 -1.35418,0.28646 -2.72788,0.42969 -4.12109,0.42969 -3.4896,0 -6.25652,-1.01563 -8.30078,-3.04688 -2.03126,-2.03124 -3.04688,-4.77863 -3.04688,-8.24218 0,-3.58072 0.96354,-6.41926 2.89063,-8.51563 1.94009,-2.10935 4.55077,-3.16404 7.83203,-3.16406 2.94269,2e-5 5.26691,0.95054 6.97265,2.85156 1.71873,1.88804 2.57811,4.45965 2.57813,7.71485 m -3.59375,-1.05469 c -0.0261,-1.96613 -0.57945,-3.53514 -1.66016,-4.70703 -1.06772,-1.17186 -2.48699,-1.7578 -4.25781,-1.75782 -2.00522,2e-5 -3.61329,0.56643 -4.82422,1.69922 -1.19792,1.13283 -1.88803,2.72788 -2.07031,4.78516 l 12.8125,-0.0195"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3686" />
|
||||
<path
|
||||
d="m -18.773254,345.4584 0,10.95704 4.960937,0 c 1.835923,1e-5 3.255192,-0.47525 4.2578126,-1.42579 1.0025861,-0.9505 1.5038877,-2.30466 1.5039063,-4.0625 -1.86e-5,-1.74476 -0.5013202,-3.09242 -1.5039063,-4.04296 -1.0026206,-0.9505 -2.4218896,-1.42576 -4.2578126,-1.42579 l -4.960937,0 m -3.945313,-3.24218 8.90625,0 c 3.268213,3e-5 5.7356586,0.74221 7.4023439,2.22656 1.6796655,1.47138 2.5195085,3.63284 2.5195312,6.48437 -2.27e-5,2.87763 -0.8398657,5.0521 -2.5195312,6.52344 -1.6666853,1.47137 -4.1341309,2.20705 -7.4023439,2.20703 l -4.960937,0 0,11.71875 -3.945313,0 0,-29.16015"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3688" />
|
||||
<path
|
||||
d="m 1.4220581,342.21622 16.7578129,0 0,3.32031 -12.8125004,0 0,8.59375 11.5625004,0 0,3.32031 -11.5625004,0 0,13.92578 -3.9453125,0 0,-29.16015"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3690" />
|
||||
<path
|
||||
d="m 28.414246,345.4584 0,22.67579 4.765625,0 c 4.02342,0 6.966126,-0.91146 8.828125,-2.73438 1.874976,-1.82291 2.812475,-4.70051 2.8125,-8.63281 -2.5e-5,-3.90623 -0.937524,-6.7643 -2.8125,-8.57422 -1.861999,-1.82289 -4.804705,-2.73435 -8.828125,-2.73438 l -4.765625,0 m -3.945313,-3.24218 8.105469,0 c 5.651024,3e-5 9.798155,1.17841 12.441406,3.53515 2.643202,2.34378 3.964815,6.01565 3.964844,11.01563 -2.9e-5,5.02605 -1.328152,8.71745 -3.984375,11.07422 -2.656272,2.35677 -6.796893,3.53515 -12.421875,3.53515 l -8.105469,0 0,-29.16015"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3692" />
|
||||
<path
|
||||
d="m 77.769714,360.38028 c -2.903656,10e-6 -4.915373,0.33204 -6.035156,0.99609 -1.119798,0.66408 -1.679693,1.79689 -1.679687,3.39844 -6e-6,1.27605 0.41666,2.29167 1.25,3.04688 0.846346,0.74219 1.992178,1.11328 3.4375,1.11328 1.992174,0 3.587225,-0.70312 4.785156,-2.10938 1.210921,-1.41926 1.816389,-3.30077 1.816406,-5.64453 l 0,-0.80078 -3.574219,0 m 7.167969,-1.48438 0,12.48047 -3.59375,0 0,-3.32031 c -0.820329,1.32813 -1.842463,2.3112 -3.066406,2.94922 -1.223971,0.625 -2.721366,0.9375 -4.492188,0.9375 -2.23959,0 -4.023443,-0.625 -5.351562,-1.875 -1.315107,-1.26302 -1.972659,-2.94921 -1.972656,-5.05859 -3e-6,-2.46093 0.820309,-4.3164 2.460937,-5.56641 1.653639,-1.24999 4.114574,-1.87499 7.382813,-1.875 l 5.039062,0 0,-0.35156 c -1.7e-5,-1.65363 -0.546892,-2.92967 -1.640625,-3.82813 -1.080744,-0.91144 -2.60418,-1.36717 -4.570312,-1.36719 -1.25001,2e-5 -2.467457,0.14976 -3.652344,0.44922 -1.184902,0.2995 -2.324224,0.74872 -3.417969,1.34766 l 0,-3.32031 c 1.315099,-0.50779 2.591139,-0.8854 3.828125,-1.13282 1.23697,-0.26039 2.441396,-0.3906 3.613281,-0.39062 3.164048,2e-5 5.527327,0.82033 7.089844,2.46094 1.56248,1.64064 2.343729,4.12762 2.34375,7.46093"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3694" />
|
||||
<path
|
||||
d="m 105.03534,352.86075 c -0.40366,-0.23436 -0.84637,-0.40363 -1.32813,-0.50781 -0.46876,-0.11717 -0.98959,-0.17577 -1.5625,-0.17579 -2.03126,2e-5 -3.593756,0.66409 -4.687496,1.99219 -1.080737,1.31512 -1.621101,3.20965 -1.621093,5.6836 l 0,11.52343 -3.613282,0 0,-21.875 3.613282,0 0,3.39844 c 0.7552,-1.3281 1.738272,-2.31118 2.949218,-2.94922 1.210926,-0.65102 2.682281,-0.97654 4.414061,-0.97656 0.24738,2e-5 0.52082,0.0195 0.82031,0.0586 0.29947,0.0261 0.6315,0.0716 0.9961,0.13672 l 0.0195,3.69141"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3696" />
|
||||
<path
|
||||
d="m 112.39862,343.29044 0,6.21093 7.40234,0 0,2.79297 -7.40234,0 0,11.875 c -10e-6,1.78386 0.24088,2.92969 0.72266,3.4375 0.49478,0.50782 1.49087,0.76172 2.98828,0.76172 l 3.6914,0 0,3.00781 -3.6914,0 c -2.77345,0 -4.68751,-0.51432 -5.74219,-1.54297 -1.05469,-1.04166 -1.58203,-2.92968 -1.58203,-5.66406 l 0,-11.875 -2.63672,0 0,-2.79297 2.63672,0 0,-6.21093 3.61328,0"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3698" />
|
||||
<path
|
||||
d="m 122.45721,349.50137 3.59375,0 4.49219,17.07032 4.47266,-17.07032 4.23828,0 4.49219,17.07032 4.47265,-17.07032 3.59375,0 -5.72265,21.875 -4.23828,0 -4.70704,-17.92968 -4.72656,17.92968 -4.23828,0 -5.72266,-21.875"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3700" />
|
||||
<path
|
||||
d="m 165.758,352.0209 c -1.9271,2e-5 -3.45053,0.75523 -4.57032,2.26563 -1.1198,1.49741 -1.67969,3.5547 -1.67968,6.17187 -1e-5,2.6172 0.55337,4.681 1.66015,6.19141 1.11978,1.4974 2.64973,2.2461 4.58985,2.24609 1.91404,1e-5 3.43097,-0.7552 4.55078,-2.26562 1.11977,-1.51041 1.67967,-3.5677 1.67968,-6.17188 -1e-5,-2.59113 -0.55991,-4.64191 -1.67968,-6.15234 -1.11981,-1.52342 -2.63674,-2.28514 -4.55078,-2.28516 m 0,-3.04687 c 3.12498,2e-5 5.5794,1.01565 7.36328,3.04687 1.78383,2.03127 2.67576,4.84377 2.67578,8.4375 -2e-5,3.58074 -0.89195,6.39324 -2.67578,8.4375 -1.78388,2.03125 -4.2383,3.04688 -7.36328,3.04688 -3.13803,0 -5.59897,-1.01563 -7.38282,-3.04688 -1.77083,-2.04426 -2.65625,-4.85676 -2.65625,-8.4375 0,-3.59373 0.88542,-6.40623 2.65625,-8.4375 1.78385,-2.03122 4.24479,-3.04685 7.38282,-3.04687"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3702" />
|
||||
<path
|
||||
d="m 194.41034,352.86075 c -0.40366,-0.23436 -0.84637,-0.40363 -1.32813,-0.50781 -0.46876,-0.11717 -0.98959,-0.17577 -1.5625,-0.17579 -2.03126,2e-5 -3.59376,0.66409 -4.6875,1.99219 -1.08073,1.31512 -1.6211,3.20965 -1.62109,5.6836 l 0,11.52343 -3.61328,0 0,-21.875 3.61328,0 0,3.39844 c 0.7552,-1.3281 1.73827,-2.31118 2.94922,-2.94922 1.21093,-0.65102 2.68228,-0.97654 4.41406,-0.97656 0.24738,2e-5 0.52082,0.0195 0.82031,0.0586 0.29947,0.0261 0.6315,0.0716 0.9961,0.13672 l 0.0195,3.69141"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3704" />
|
||||
<path
|
||||
d="m 198.08221,340.98575 3.61329,0 0,17.94922 10.72265,-9.4336 4.58985,0 -11.60157,10.23438 12.08985,11.64062 -4.6875,0 -11.11328,-10.68359 0,10.68359 -3.61329,0 0,-30.39062"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3706" />
|
||||
<path
|
||||
d="m 222.34003,366.41544 4.12109,0 0,3.35937 -3.20312,6.25 -2.51954,0 1.60157,-6.25 0,-3.35937"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3708" />
|
||||
<path
|
||||
d="m 250.36737,368.09512 0,11.60157 -3.61328,0 0,-30.19532 3.61328,0 0,3.32032 c 0.7552,-1.30207 1.70572,-2.26561 2.85156,-2.89063 1.15885,-0.638 2.53905,-0.95701 4.14063,-0.95703 2.65623,2e-5 4.81118,1.05471 6.46484,3.16406 1.66665,2.10939 2.49998,4.88283 2.5,8.32031 -2e-5,3.43751 -0.83335,6.21095 -2.5,8.32032 -1.65366,2.10937 -3.80861,3.16406 -6.46484,3.16406 -1.60158,0 -2.98178,-0.3125 -4.14063,-0.9375 -1.14584,-0.63802 -2.09636,-1.60807 -2.85156,-2.91016 m 12.22656,-7.63672 c -2e-5,-2.64321 -0.54689,-4.71352 -1.64062,-6.21093 -1.08075,-1.5104 -2.57163,-2.26561 -4.47266,-2.26563 -1.90105,2e-5 -3.39845,0.75523 -4.49219,2.26563 -1.08073,1.49741 -1.6211,3.56772 -1.62109,6.21093 -1e-5,2.64324 0.54036,4.72006 1.62109,6.23047 1.09374,1.4974 2.59114,2.2461 4.49219,2.2461 1.90103,0 3.39191,-0.7487 4.47266,-2.2461 1.09373,-1.51041 1.6406,-3.58723 1.64062,-6.23047"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3710" />
|
||||
<path
|
||||
d="m 272.28143,340.98575 3.59375,0 0,30.39062 -3.59375,0 0,-30.39062"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3712" />
|
||||
<path
|
||||
d="m 302.08612,359.54044 0,1.75781 -16.52344,0 c 0.15625,2.47396 0.89843,4.36198 2.22657,5.66406 1.34113,1.28907 3.20311,1.9336 5.58593,1.93359 1.3802,1e-5 2.71483,-0.16926 4.00391,-0.50781 1.30206,-0.33854 2.59112,-0.84635 3.86719,-1.52344 l 0,3.39844 c -1.28909,0.54688 -2.6107,0.96354 -3.96485,1.25 -1.35418,0.28646 -2.72788,0.42969 -4.12109,0.42969 -3.48959,0 -6.25652,-1.01563 -8.30078,-3.04688 -2.03126,-2.03124 -3.04688,-4.77863 -3.04688,-8.24218 0,-3.58072 0.96354,-6.41926 2.89063,-8.51563 1.9401,-2.10935 4.55077,-3.16404 7.83203,-3.16406 2.94269,2e-5 5.26691,0.95054 6.97266,2.85156 1.71872,1.88804 2.5781,4.45965 2.57812,7.71485 m -3.59375,-1.05469 c -0.0261,-1.96613 -0.57944,-3.53514 -1.66016,-4.70703 -1.06772,-1.17186 -2.48699,-1.7578 -4.25781,-1.75782 -2.00522,2e-5 -3.61329,0.56643 -4.82422,1.69922 -1.19792,1.13283 -1.88802,2.72788 -2.07031,4.78516 l 12.8125,-0.0195"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3714" />
|
||||
<path
|
||||
d="m 317.92596,360.38028 c -2.90365,10e-6 -4.91537,0.33204 -6.03515,0.99609 -1.1198,0.66408 -1.6797,1.79689 -1.67969,3.39844 -10e-6,1.27605 0.41666,2.29167 1.25,3.04688 0.84635,0.74219 1.99218,1.11328 3.4375,1.11328 1.99218,0 3.58723,-0.70312 4.78516,-2.10938 1.21092,-1.41926 1.81639,-3.30077 1.8164,-5.64453 l 0,-0.80078 -3.57422,0 m 7.16797,-1.48438 0,12.48047 -3.59375,0 0,-3.32031 c -0.82033,1.32813 -1.84246,2.3112 -3.0664,2.94922 -1.22397,0.625 -2.72137,0.9375 -4.49219,0.9375 -2.23959,0 -4.02344,-0.625 -5.35156,-1.875 -1.31511,-1.26302 -1.97266,-2.94921 -1.97266,-5.05859 0,-2.46093 0.82031,-4.3164 2.46094,-5.56641 1.65364,-1.24999 4.11457,-1.87499 7.38281,-1.875 l 5.03906,0 0,-0.35156 c -10e-6,-1.65363 -0.54689,-2.92967 -1.64062,-3.82813 -1.08075,-0.91144 -2.60418,-1.36717 -4.57031,-1.36719 -1.25001,2e-5 -2.46746,0.14976 -3.65235,0.44922 -1.1849,0.2995 -2.32422,0.74872 -3.41797,1.34766 l 0,-3.32031 c 1.3151,-0.50779 2.59114,-0.8854 3.82813,-1.13282 1.23697,-0.26039 2.44139,-0.3906 3.61328,-0.39062 3.16405,2e-5 5.52733,0.82033 7.08984,2.46094 1.56248,1.64064 2.34373,4.12762 2.34375,7.46093"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3716" />
|
||||
<path
|
||||
d="m 346.46112,350.1459 0,3.39844 c -1.01564,-0.52081 -2.07033,-0.91144 -3.16406,-1.17187 -1.09377,-0.2604 -2.22658,-0.39061 -3.39844,-0.39063 -1.78386,2e-5 -3.12501,0.27346 -4.02344,0.82031 -0.88542,0.5469 -1.32813,1.36721 -1.32812,2.46094 -10e-6,0.83335 0.319,1.4909 0.95703,1.97266 0.63801,0.46876 1.92056,0.91798 3.84766,1.34765 l 1.23046,0.27344 c 2.55207,0.54689 4.36197,1.32163 5.42969,2.32422 1.08071,0.98959 1.62108,2.37631 1.6211,4.16016 -2e-5,2.03125 -0.80731,3.63932 -2.42188,4.82422 -1.60158,1.18489 -3.80861,1.77734 -6.62109,1.77734 -1.17189,0 -2.39584,-0.11719 -3.67188,-0.35156 -1.26302,-0.22136 -2.59766,-0.5599 -4.0039,-1.01563 l 0,-3.71094 c 1.32812,0.69011 2.63671,1.21095 3.92578,1.5625 1.28905,0.33855 2.56509,0.50782 3.82812,0.50782 1.6927,0 2.99478,-0.28646 3.90625,-0.85938 0.91145,-0.58593 1.36717,-1.40624 1.36719,-2.46094 -2e-5,-0.97655 -0.33205,-1.72525 -0.99609,-2.24609 -0.65106,-0.52082 -2.08986,-1.02213 -4.31641,-1.50391 l -1.25,-0.29296 c -2.22657,-0.46874 -3.83464,-1.18489 -4.82422,-2.14844 -0.98959,-0.97655 -1.48438,-2.31119 -1.48437,-4.00391 -10e-6,-2.05727 0.72916,-3.64581 2.1875,-4.76562 1.45832,-1.11977 3.52863,-1.67967 6.21093,-1.67969 1.32812,2e-5 2.57811,0.0977 3.75,0.29297 1.17186,0.19533 2.25259,0.4883 3.24219,0.8789"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3718" />
|
||||
<path
|
||||
d="m 372.08612,359.54044 0,1.75781 -16.52344,0 c 0.15625,2.47396 0.89843,4.36198 2.22657,5.66406 1.34113,1.28907 3.20311,1.9336 5.58593,1.93359 1.3802,1e-5 2.71483,-0.16926 4.00391,-0.50781 1.30206,-0.33854 2.59112,-0.84635 3.86719,-1.52344 l 0,3.39844 c -1.28909,0.54688 -2.6107,0.96354 -3.96485,1.25 -1.35418,0.28646 -2.72788,0.42969 -4.12109,0.42969 -3.48959,0 -6.25652,-1.01563 -8.30078,-3.04688 -2.03126,-2.03124 -3.04688,-4.77863 -3.04688,-8.24218 0,-3.58072 0.96354,-6.41926 2.89063,-8.51563 1.9401,-2.10935 4.55077,-3.16404 7.83203,-3.16406 2.94269,2e-5 5.26691,0.95054 6.97266,2.85156 1.71872,1.88804 2.5781,4.45965 2.57812,7.71485 m -3.59375,-1.05469 c -0.0261,-1.96613 -0.57944,-3.53514 -1.66016,-4.70703 -1.06772,-1.17186 -2.48699,-1.7578 -4.25781,-1.75782 -2.00522,2e-5 -3.61329,0.56643 -4.82422,1.69922 -1.19792,1.13283 -1.88802,2.72788 -2.07031,4.78516 l 12.8125,-0.0195"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3720" />
|
||||
<path
|
||||
d="m 406.46112,350.34122 0,3.35937 c -1.01564,-0.55988 -2.03778,-0.97654 -3.06641,-1.25 -1.01564,-0.28644 -2.04428,-0.42967 -3.08593,-0.42969 -2.33074,2e-5 -4.14064,0.74221 -5.42969,2.22657 -1.28907,1.47137 -1.9336,3.54168 -1.93359,6.21093 -10e-6,2.66928 0.64452,4.7461 1.93359,6.23047 1.28905,1.47136 3.09895,2.20704 5.42969,2.20703 1.04165,1e-5 2.07029,-0.13671 3.08593,-0.41015 1.02863,-0.28646 2.05077,-0.70963 3.06641,-1.26953 l 0,3.32031 c -1.00262,0.46875 -2.04429,0.82031 -3.125,1.05469 -1.06772,0.23437 -2.20704,0.35156 -3.41797,0.35156 -3.29428,0 -5.91146,-1.03516 -7.85156,-3.10547 -1.94011,-2.07031 -2.91016,-4.86327 -2.91016,-8.37891 0,-3.56769 0.97656,-6.37368 2.92969,-8.41796 1.96614,-2.04425 4.65494,-3.06639 8.06641,-3.06641 1.10675,2e-5 2.18748,0.11721 3.24218,0.35156 1.05467,0.22138 2.07681,0.55992 3.06641,1.01563"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3722" />
|
||||
<path
|
||||
d="m 430.93378,358.17325 0,13.20312 -3.59375,0 0,-13.08593 c -2e-5,-2.0703 -0.40367,-3.61978 -1.21094,-4.64844 -0.80731,-1.02863 -2.01824,-1.54295 -3.63281,-1.54297 -1.94012,2e-5 -3.47007,0.61851 -4.58985,1.85547 -1.1198,1.23699 -1.67969,2.92319 -1.67968,5.05859 l 0,12.36328 -3.61329,0 0,-30.39062 3.61329,0 0,11.91406 c 0.85936,-1.31508 1.86848,-2.29816 3.02734,-2.94922 1.17186,-0.65102 2.51952,-0.97654 4.04297,-0.97656 2.513,2e-5 4.41404,0.78127 5.70312,2.34375 1.28904,1.5495 1.93357,3.83465 1.9336,6.85547"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3724" />
|
||||
<path
|
||||
d="m 456.85175,359.54044 0,1.75781 -16.52344,0 c 0.15624,2.47396 0.89843,4.36198 2.22656,5.66406 1.34114,1.28907 3.20311,1.9336 5.58594,1.93359 1.38019,1e-5 2.71483,-0.16926 4.0039,-0.50781 1.30207,-0.33854 2.59113,-0.84635 3.86719,-1.52344 l 0,3.39844 c -1.28908,0.54688 -2.61069,0.96354 -3.96484,1.25 -1.35418,0.28646 -2.72788,0.42969 -4.1211,0.42969 -3.48959,0 -6.25651,-1.01563 -8.30078,-3.04688 -2.03125,-2.03124 -3.04687,-4.77863 -3.04687,-8.24218 0,-3.58072 0.96354,-6.41926 2.89062,-8.51563 1.9401,-2.10935 4.55077,-3.16404 7.83203,-3.16406 2.9427,2e-5 5.26691,0.95054 6.97266,2.85156 1.71873,1.88804 2.5781,4.45965 2.57813,7.71485 m -3.59375,-1.05469 c -0.0261,-1.96613 -0.57945,-3.53514 -1.66016,-4.70703 -1.06773,-1.17186 -2.48699,-1.7578 -4.25781,-1.75782 -2.00522,2e-5 -3.61329,0.56643 -4.82422,1.69922 -1.19793,1.13283 -1.88803,2.72788 -2.07031,4.78516 l 12.8125,-0.0195"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3726" />
|
||||
<path
|
||||
d="m 478.49237,350.34122 0,3.35937 c -1.01564,-0.55988 -2.03778,-0.97654 -3.06641,-1.25 -1.01564,-0.28644 -2.04428,-0.42967 -3.08593,-0.42969 -2.33074,2e-5 -4.14064,0.74221 -5.42969,2.22657 -1.28907,1.47137 -1.9336,3.54168 -1.93359,6.21093 -10e-6,2.66928 0.64452,4.7461 1.93359,6.23047 1.28905,1.47136 3.09895,2.20704 5.42969,2.20703 1.04165,1e-5 2.07029,-0.13671 3.08593,-0.41015 1.02863,-0.28646 2.05077,-0.70963 3.06641,-1.26953 l 0,3.32031 c -1.00262,0.46875 -2.04429,0.82031 -3.125,1.05469 -1.06772,0.23437 -2.20704,0.35156 -3.41797,0.35156 -3.29428,0 -5.91146,-1.03516 -7.85156,-3.10547 -1.94011,-2.07031 -2.91016,-4.86327 -2.91016,-8.37891 0,-3.56769 0.97656,-6.37368 2.92969,-8.41796 1.96614,-2.04425 4.65494,-3.06639 8.06641,-3.06641 1.10675,2e-5 2.18748,0.11721 3.24218,0.35156 1.05467,0.22138 2.07681,0.55992 3.06641,1.01563"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3728" />
|
||||
<path
|
||||
d="m 484.64471,340.98575 3.61329,0 0,17.94922 10.72265,-9.4336 4.58985,0 -11.60157,10.23438 12.08985,11.64062 -4.6875,0 -11.11328,-10.68359 0,10.68359 -3.61329,0 0,-30.39062"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3730" />
|
||||
<path
|
||||
d="m 529.8205,373.40762 c -1.01564,2.60417 -2.00522,4.30338 -2.96875,5.09766 -0.96356,0.79426 -2.25262,1.1914 -3.86719,1.19141 l -2.8711,0 0,-3.00782 2.10938,0 c 0.98958,0 1.7578,-0.23438 2.30469,-0.70312 0.54686,-0.46876 1.15233,-1.57553 1.8164,-3.32031 l 0.64453,-1.64063 -8.84765,-21.52344 3.80859,0 6.83594,17.10938 6.83594,-17.10938 3.80859,0 -9.60937,23.90625"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3732" />
|
||||
<path
|
||||
d="m 552.86737,352.0209 c -1.92709,2e-5 -3.45053,0.75523 -4.57031,2.26563 -1.1198,1.49741 -1.6797,3.5547 -1.67969,6.17187 -1e-5,2.6172 0.55338,4.681 1.66016,6.19141 1.11978,1.4974 2.64973,2.2461 4.58984,2.24609 1.91405,1e-5 3.43097,-0.7552 4.55078,-2.26562 1.11978,-1.51041 1.67967,-3.5677 1.67969,-6.17188 -2e-5,-2.59113 -0.55991,-4.64191 -1.67969,-6.15234 -1.11981,-1.52342 -2.63673,-2.28514 -4.55078,-2.28516 m 0,-3.04687 c 3.12499,2e-5 5.57941,1.01565 7.36328,3.04687 1.78383,2.03127 2.67576,4.84377 2.67578,8.4375 -2e-5,3.58074 -0.89195,6.39324 -2.67578,8.4375 -1.78387,2.03125 -4.23829,3.04688 -7.36328,3.04688 -3.13803,0 -5.59896,-1.01563 -7.38281,-3.04688 -1.77084,-2.04426 -2.65625,-4.85676 -2.65625,-8.4375 0,-3.59373 0.88541,-6.40623 2.65625,-8.4375 1.78385,-2.03122 4.24478,-3.04685 7.38281,-3.04687"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3734" />
|
||||
<path
|
||||
d="m 568.47284,362.74356 0,-13.24219 3.59375,0 0,13.10547 c -10e-6,2.07032 0.40364,3.62631 1.21094,4.66797 0.80728,1.02865 2.01822,1.54297 3.63281,1.54297 1.94009,0 3.47004,-0.61849 4.58984,-1.85547 1.1328,-1.23697 1.6992,-2.92317 1.69922,-5.05859 l 0,-12.40235 3.59375,0 0,21.875 -3.59375,0 0,-3.35937 c -0.87241,1.32813 -1.88804,2.31771 -3.04687,2.96875 -1.14585,0.63802 -2.48048,0.95703 -4.00391,0.95703 -2.51303,0 -4.42058,-0.78125 -5.72266,-2.34375 -1.30208,-1.5625 -1.95312,-3.84765 -1.95312,-6.85547 m 9.04297,-13.76953 0,0"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3736" />
|
||||
<path
|
||||
d="m 606.91034,352.86075 c -0.40366,-0.23436 -0.84637,-0.40363 -1.32813,-0.50781 -0.46876,-0.11717 -0.98959,-0.17577 -1.5625,-0.17579 -2.03126,2e-5 -3.59376,0.66409 -4.6875,1.99219 -1.08073,1.31512 -1.6211,3.20965 -1.62109,5.6836 l 0,11.52343 -3.61328,0 0,-21.875 3.61328,0 0,3.39844 c 0.7552,-1.3281 1.73827,-2.31118 2.94922,-2.94922 1.21093,-0.65102 2.68228,-0.97654 4.41406,-0.97656 0.24738,2e-5 0.52082,0.0195 0.82031,0.0586 0.29947,0.0261 0.6315,0.0716 0.9961,0.13672 l 0.0195,3.69141"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3738" />
|
||||
<path
|
||||
d="m 176.89081,400.34122 0,3.35937 c -1.01565,-0.55988 -2.03778,-0.97654 -3.06641,-1.25 -1.01564,-0.28644 -2.04428,-0.42967 -3.08594,-0.42969 -2.33074,2e-5 -4.14063,0.74221 -5.42968,2.22657 -1.28907,1.47137 -1.9336,3.54168 -1.9336,6.21093 0,2.66928 0.64453,4.7461 1.9336,6.23047 1.28905,1.47136 3.09894,2.20704 5.42968,2.20703 1.04166,1e-5 2.0703,-0.13671 3.08594,-0.41015 1.02863,-0.28646 2.05076,-0.70963 3.06641,-1.26953 l 0,3.32031 c -1.00262,0.46875 -2.04429,0.82031 -3.125,1.05469 -1.06773,0.23437 -2.20705,0.35156 -3.41797,0.35156 -3.29428,0 -5.91147,-1.03516 -7.85156,-3.10547 -1.94011,-2.07031 -2.91016,-4.86327 -2.91016,-8.37891 0,-3.56769 0.97656,-6.37368 2.92969,-8.41796 1.96614,-2.04425 4.65494,-3.06639 8.0664,-3.06641 1.10676,2e-5 2.18749,0.11721 3.24219,0.35156 1.05467,0.22138 2.07681,0.55992 3.06641,1.01563"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3740" />
|
||||
<path
|
||||
d="m 191.65643,402.0209 c -1.92709,2e-5 -3.45053,0.75523 -4.57031,2.26563 -1.1198,1.49741 -1.67969,3.5547 -1.67969,6.17187 0,2.6172 0.55338,4.681 1.66016,6.19141 1.11978,1.4974 2.64973,2.2461 4.58984,2.24609 1.91405,1e-5 3.43098,-0.7552 4.55078,-2.26562 1.11978,-1.51041 1.67967,-3.5677 1.67969,-6.17188 -2e-5,-2.59113 -0.55991,-4.64191 -1.67969,-6.15234 -1.1198,-1.52342 -2.63673,-2.28514 -4.55078,-2.28516 m 0,-3.04687 c 3.12499,2e-5 5.57941,1.01565 7.36328,3.04687 1.78384,2.03127 2.67576,4.84377 2.67579,8.4375 -3e-5,3.58074 -0.89195,6.39324 -2.67579,8.4375 -1.78387,2.03125 -4.23829,3.04688 -7.36328,3.04688 -3.13803,0 -5.59896,-1.01563 -7.38281,-3.04688 -1.77084,-2.04426 -2.65625,-4.85676 -2.65625,-8.4375 0,-3.59373 0.88541,-6.40623 2.65625,-8.4375 1.78385,-2.03122 4.24478,-3.04685 7.38281,-3.04687"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3742" />
|
||||
<path
|
||||
d="m 225.81659,408.17325 0,13.20312 -3.59375,0 0,-13.08593 c -2e-5,-2.0703 -0.40366,-3.61978 -1.21094,-4.64844 -0.80731,-1.02863 -2.01824,-1.54295 -3.63281,-1.54297 -1.94012,2e-5 -3.47006,0.61851 -4.58984,1.85547 -1.1198,1.23699 -1.6797,2.92319 -1.67969,5.05859 l 0,12.36328 -3.61328,0 0,-21.875 3.61328,0 0,3.39844 c 0.85937,-1.31508 1.86848,-2.29816 3.02734,-2.94922 1.17187,-0.65102 2.51952,-0.97654 4.04297,-0.97656 2.513,2e-5 4.41404,0.78127 5.70313,2.34375 1.28904,1.5495 1.93357,3.83465 1.93359,6.85547"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3744" />
|
||||
<path
|
||||
d="m 250.6994,399.50137 0,21.875 -3.61328,0 0,-19.08203 -9.86328,0 0,19.08203 -3.61328,0 0,-19.08203 -3.4375,0 0,-2.79297 3.4375,0 0,-1.52343 c -10e-6,-2.38279 0.55989,-4.1406 1.67969,-5.27344 1.1328,-1.14581 2.86457,-1.71872 5.19531,-1.71875 l 3.61328,0 0,2.98828 -3.4375,0 c -1.28907,3e-5 -2.18751,0.26044 -2.69531,0.78125 -0.4948,0.52086 -0.7422,1.45836 -0.74219,2.8125 l 0,1.93359 13.47656,0 m -3.61328,-8.47656 3.61328,0 0,4.55078 -3.61328,0 0,-4.55078"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3746" />
|
||||
<path
|
||||
d="m 272.65253,410.18497 c -2e-5,-2.60416 -0.54039,-4.62238 -1.6211,-6.05469 -1.06772,-1.43227 -2.57163,-2.14842 -4.51172,-2.14844 -1.92709,2e-5 -3.43099,0.71617 -4.51171,2.14844 -1.06772,1.43231 -1.60157,3.45053 -1.60157,6.05469 0,2.59115 0.53385,4.60287 1.60157,6.03515 1.08072,1.4323 2.58462,2.14844 4.51171,2.14844 1.94009,0 3.444,-0.71614 4.51172,-2.14844 1.08071,-1.43228 1.62108,-3.444 1.6211,-6.03515 m 3.59375,8.47656 c -2e-5,3.72396 -0.82685,6.49088 -2.48047,8.30078 -1.65367,1.82291 -4.18621,2.73437 -7.59766,2.73438 -1.26303,-10e-6 -2.45443,-0.0977 -3.57422,-0.29297 -1.1198,-0.1823 -2.20703,-0.46876 -3.26172,-0.85938 l 0,-3.49609 c 1.05469,0.57291 2.09635,0.99609 3.125,1.26953 1.02864,0.27343 2.07682,0.41015 3.14454,0.41016 2.35675,-10e-6 4.12107,-0.6185 5.29296,-1.85547 1.17186,-1.22396 1.7578,-3.07943 1.75782,-5.56641 l 0,-1.77734 c -0.74221,1.28906 -1.69273,2.2526 -2.85157,2.89062 -1.15886,0.63802 -2.54558,0.95703 -4.16015,0.95703 -2.6823,0 -4.84376,-1.02213 -6.48438,-3.0664 -1.64062,-2.04427 -2.46094,-4.7526 -2.46093,-8.125 -10e-6,-3.38541 0.82031,-6.10025 2.46093,-8.14453 1.64062,-2.04425 3.80208,-3.06639 6.48438,-3.06641 1.61457,2e-5 3.00129,0.31903 4.16015,0.95703 1.15884,0.63804 2.10936,1.60158 2.85157,2.89063 l 0,-3.32032 3.59375,0 0,19.16016"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3748" />
|
||||
<path
|
||||
d="m 283.27753,412.74356 0,-13.24219 3.59375,0 0,13.10547 c -1e-5,2.07032 0.40364,3.62631 1.21093,4.66797 0.80729,1.02865 2.01822,1.54297 3.63282,1.54297 1.94009,0 3.47003,-0.61849 4.58984,-1.85547 1.1328,-1.23697 1.6992,-2.92317 1.69922,-5.05859 l 0,-12.40235 3.59375,0 0,21.875 -3.59375,0 0,-3.35937 c -0.87241,1.32813 -1.88804,2.31771 -3.04688,2.96875 -1.14584,0.63802 -2.48048,0.95703 -4.0039,0.95703 -2.51303,0 -4.42058,-0.78125 -5.72266,-2.34375 -1.30209,-1.5625 -1.95313,-3.84765 -1.95312,-6.85547 m 9.04297,-13.76953 0,0"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3750" />
|
||||
<path
|
||||
d="m 321.71503,402.86075 c -0.40367,-0.23436 -0.84637,-0.40363 -1.32813,-0.50781 -0.46876,-0.11717 -0.9896,-0.17577 -1.5625,-0.17579 -2.03126,2e-5 -3.59376,0.66409 -4.6875,1.99219 -1.08074,1.31512 -1.6211,3.20965 -1.62109,5.6836 l 0,11.52343 -3.61328,0 0,-21.875 3.61328,0 0,3.39844 c 0.7552,-1.3281 1.73827,-2.31118 2.94922,-2.94922 1.21092,-0.65102 2.68228,-0.97654 4.41406,-0.97656 0.24738,2e-5 0.52082,0.0195 0.82031,0.0586 0.29947,0.0261 0.6315,0.0716 0.9961,0.13672 l 0.0195,3.69141"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3752" />
|
||||
<path
|
||||
d="m 335.46503,410.38028 c -2.90366,10e-6 -4.91538,0.33204 -6.03516,0.99609 -1.1198,0.66408 -1.67969,1.79689 -1.67969,3.39844 0,1.27605 0.41666,2.29167 1.25,3.04688 0.84635,0.74219 1.99218,1.11328 3.4375,1.11328 1.99218,0 3.58723,-0.70312 4.78516,-2.10938 1.21092,-1.41926 1.81639,-3.30077 1.81641,-5.64453 l 0,-0.80078 -3.57422,0 m 7.16797,-1.48438 0,12.48047 -3.59375,0 0,-3.32031 c -0.82033,1.32813 -1.84247,2.3112 -3.06641,2.94922 -1.22397,0.625 -2.72137,0.9375 -4.49219,0.9375 -2.23959,0 -4.02344,-0.625 -5.35156,-1.875 -1.31511,-1.26302 -1.97266,-2.94921 -1.97266,-5.05859 0,-2.46093 0.82031,-4.3164 2.46094,-5.56641 1.65364,-1.24999 4.11457,-1.87499 7.38281,-1.875 l 5.03907,0 0,-0.35156 c -2e-5,-1.65363 -0.5469,-2.92967 -1.64063,-3.82813 -1.08074,-0.91144 -2.60418,-1.36717 -4.57031,-1.36719 -1.25001,2e-5 -2.46746,0.14976 -3.65235,0.44922 -1.1849,0.2995 -2.32422,0.74872 -3.41796,1.34766 l 0,-3.32031 c 1.31509,-0.50779 2.59113,-0.8854 3.82812,-1.13282 1.23697,-0.26039 2.4414,-0.3906 3.61328,-0.39062 3.16405,2e-5 5.52733,0.82033 7.08985,2.46094 1.56248,1.64064 2.34372,4.12762 2.34375,7.46093"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3754" />
|
||||
<path
|
||||
d="m 353.60956,393.29044 0,6.21093 7.40234,0 0,2.79297 -7.40234,0 0,11.875 c -10e-6,1.78386 0.24088,2.92969 0.72265,3.4375 0.49479,0.50782 1.49088,0.76172 2.98829,0.76172 l 3.6914,0 0,3.00781 -3.6914,0 c -2.77345,0 -4.68751,-0.51432 -5.74219,-1.54297 -1.05469,-1.04166 -1.58204,-2.92968 -1.58203,-5.66406 l 0,-11.875 -2.63672,0 0,-2.79297 2.63672,0 0,-6.21093 3.61328,0"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3756" />
|
||||
<path
|
||||
d="m 365.758,399.50137 3.59375,0 0,21.875 -3.59375,0 0,-21.875 m 0,-8.51562 3.59375,0 0,4.55078 -3.59375,0 0,-4.55078"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3758" />
|
||||
<path
|
||||
d="m 385.32831,402.0209 c -1.9271,2e-5 -3.45053,0.75523 -4.57031,2.26563 -1.1198,1.49741 -1.6797,3.5547 -1.67969,6.17187 -10e-6,2.6172 0.55338,4.681 1.66015,6.19141 1.11979,1.4974 2.64973,2.2461 4.58985,2.24609 1.91405,1e-5 3.43097,-0.7552 4.55078,-2.26562 1.11977,-1.51041 1.67967,-3.5677 1.67969,-6.17188 -2e-5,-2.59113 -0.55992,-4.64191 -1.67969,-6.15234 -1.11981,-1.52342 -2.63673,-2.28514 -4.55078,-2.28516 m 0,-3.04687 c 3.12498,2e-5 5.57941,1.01565 7.36328,3.04687 1.78383,2.03127 2.67576,4.84377 2.67578,8.4375 -2e-5,3.58074 -0.89195,6.39324 -2.67578,8.4375 -1.78387,2.03125 -4.2383,3.04688 -7.36328,3.04688 -3.13803,0 -5.59897,-1.01563 -7.38281,-3.04688 -1.77084,-2.04426 -2.65626,-4.85676 -2.65625,-8.4375 -10e-6,-3.59373 0.88541,-6.40623 2.65625,-8.4375 1.78384,-2.03122 4.24478,-3.04685 7.38281,-3.04687"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3760" />
|
||||
<path
|
||||
d="m 419.48846,408.17325 0,13.20312 -3.59375,0 0,-13.08593 c -10e-6,-2.0703 -0.40366,-3.61978 -1.21093,-4.64844 -0.80731,-1.02863 -2.01825,-1.54295 -3.63282,-1.54297 -1.94011,2e-5 -3.47006,0.61851 -4.58984,1.85547 -1.1198,1.23699 -1.67969,2.92319 -1.67969,5.05859 l 0,12.36328 -3.61328,0 0,-21.875 3.61328,0 0,3.39844 c 0.85937,-1.31508 1.86848,-2.29816 3.02735,-2.94922 1.17186,-0.65102 2.51952,-0.97654 4.04297,-0.97656 2.513,2e-5 4.41404,0.78127 5.70312,2.34375 1.28904,1.5495 1.93357,3.83465 1.93359,6.85547"
|
||||
style="fill:#ffffff;fill-opacity:1"
|
||||
id="path3762" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 51 KiB |
@ -1,22 +0,0 @@
|
||||
TEMPLATE = lib
|
||||
TARGET = PFDGadget
|
||||
QT += svg
|
||||
QT += opengl
|
||||
include(../../openpilotgcsplugin.pri)
|
||||
include(../../plugins/coreplugin/coreplugin.pri)
|
||||
include(pfd_dependencies.pri)
|
||||
HEADERS += pfdplugin.h
|
||||
HEADERS += pfdgadget.h
|
||||
HEADERS += pfdgadgetwidget.h
|
||||
HEADERS += pfdgadgetfactory.h
|
||||
HEADERS += pfdgadgetconfiguration.h
|
||||
HEADERS += pfdgadgetoptionspage.h
|
||||
SOURCES += pfdplugin.cpp
|
||||
SOURCES += pfdgadget.cpp
|
||||
SOURCES += pfdgadgetfactory.cpp
|
||||
SOURCES += pfdgadgetwidget.cpp
|
||||
SOURCES += pfdgadgetconfiguration.cpp
|
||||
SOURCES += pfdgadgetoptionspage.cpp
|
||||
OTHER_FILES += PFDGadget.pluginspec
|
||||
FORMS += pfdgadgetoptionspage.ui
|
||||
RESOURCES += pfd.qrc
|
@ -1,5 +0,0 @@
|
||||
<RCC>
|
||||
<qresource prefix="/pfd">
|
||||
<file>images/pfd-default.svg</file>
|
||||
</qresource>
|
||||
</RCC>
|
@ -1 +0,0 @@
|
||||
include(../../plugins/uavobjects/uavobjects.pri)
|
@ -1,57 +0,0 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
*
|
||||
* @file pfdgadget.cpp
|
||||
* @author Edouard Lafargue Copyright (C) 2010.
|
||||
* @addtogroup GCSPlugins GCS Plugins
|
||||
* @{
|
||||
* @addtogroup OPMapPlugin Primary Flight Display Plugin
|
||||
* @{
|
||||
* @brief The Primary Flight Display Gadget
|
||||
*****************************************************************************/
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "pfdgadget.h"
|
||||
#include "pfdgadgetwidget.h"
|
||||
#include "pfdgadgetconfiguration.h"
|
||||
|
||||
PFDGadget::PFDGadget(QString classId, PFDGadgetWidget *widget, QWidget *parent) :
|
||||
IUAVGadget(classId, parent),
|
||||
m_widget(widget)
|
||||
{}
|
||||
|
||||
PFDGadget::~PFDGadget()
|
||||
{
|
||||
delete m_widget;
|
||||
}
|
||||
|
||||
/*
|
||||
This is called when a configuration is loaded, and updates the plugin's settings.
|
||||
Careful: the plugin is already drawn before the loadConfiguration method is called the
|
||||
first time, so you have to be careful not to assume all the plugin values are initialized
|
||||
the first time you use them
|
||||
*/
|
||||
void PFDGadget::loadConfiguration(IUAVGadgetConfiguration *config)
|
||||
{
|
||||
PFDGadgetConfiguration *m = qobject_cast<PFDGadgetConfiguration *>(config);
|
||||
|
||||
m_widget->setHqFonts(m->getHqFonts());
|
||||
m_widget->setDialFile(m->dialFile());
|
||||
m_widget->enableOpenGL(m->useOpenGL());
|
||||
m_widget->enableSmoothUpdates(m->getBeSmooth());
|
||||
m_widget->connectNeedles();
|
||||
}
|
@ -1,58 +0,0 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
*
|
||||
* @file pfdgadget.h
|
||||
* @author Edouard Lafargue Copyright (C) 2010.
|
||||
* @addtogroup GCSPlugins GCS Plugins
|
||||
* @{
|
||||
* @addtogroup OPMapPlugin Primary Flight Display Plugin
|
||||
* @{
|
||||
* @brief The Primary Flight Display Gadget
|
||||
*****************************************************************************/
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef PFDGADGET_H_
|
||||
#define PFDGADGET_H_
|
||||
|
||||
#include <coreplugin/iuavgadget.h>
|
||||
#include "pfdgadgetwidget.h"
|
||||
|
||||
class IUAVGadget;
|
||||
class QWidget;
|
||||
class QString;
|
||||
class PFDGadgetWidget;
|
||||
|
||||
using namespace Core;
|
||||
|
||||
class PFDGadget : public Core::IUAVGadget {
|
||||
Q_OBJECT
|
||||
public:
|
||||
PFDGadget(QString classId, PFDGadgetWidget *widget, QWidget *parent = 0);
|
||||
~PFDGadget();
|
||||
|
||||
QWidget *widget()
|
||||
{
|
||||
return m_widget;
|
||||
}
|
||||
void loadConfiguration(IUAVGadgetConfiguration *config);
|
||||
|
||||
private:
|
||||
PFDGadgetWidget *m_widget;
|
||||
};
|
||||
|
||||
|
||||
#endif // PFDGADGET_H_
|
@ -1,77 +0,0 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
*
|
||||
* @file pfdgadgetconfiguration.cpp
|
||||
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
|
||||
* @addtogroup GCSPlugins GCS Plugins
|
||||
* @{
|
||||
* @addtogroup OPMapPlugin Primary Flight Display Plugin
|
||||
* @{
|
||||
* @brief The Primary Flight Display Gadget
|
||||
*****************************************************************************/
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "pfdgadgetconfiguration.h"
|
||||
#include "utils/pathutils.h"
|
||||
|
||||
/**
|
||||
* Loads a saved configuration or defaults if non exist.
|
||||
*
|
||||
*/
|
||||
PFDGadgetConfiguration::PFDGadgetConfiguration(QString classId, QSettings *qSettings, QObject *parent) :
|
||||
IUAVGadgetConfiguration(classId, parent),
|
||||
m_defaultDial("Unknown"),
|
||||
beSmooth(true)
|
||||
{
|
||||
// if a saved configuration exists load it
|
||||
if (qSettings != 0) {
|
||||
QString dialFile = qSettings->value("dialFile").toString();
|
||||
useOpenGLFlag = qSettings->value("useOpenGLFlag").toBool();
|
||||
hqFonts = qSettings->value("hqFonts").toBool();
|
||||
beSmooth = qSettings->value("beSmooth").toBool();
|
||||
m_defaultDial = Utils::PathUtils().InsertDataPath(dialFile);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Clones a configuration.
|
||||
*
|
||||
*/
|
||||
IUAVGadgetConfiguration *PFDGadgetConfiguration::clone()
|
||||
{
|
||||
PFDGadgetConfiguration *m = new PFDGadgetConfiguration(this->classId());
|
||||
|
||||
m->m_defaultDial = m_defaultDial;
|
||||
m->useOpenGLFlag = useOpenGLFlag;
|
||||
m->hqFonts = hqFonts;
|
||||
m->beSmooth = beSmooth;
|
||||
return m;
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves a configuration.
|
||||
*
|
||||
*/
|
||||
void PFDGadgetConfiguration::saveConfig(QSettings *qSettings) const
|
||||
{
|
||||
QString dialFile = Utils::PathUtils().RemoveDataPath(m_defaultDial);
|
||||
|
||||
qSettings->setValue("dialFile", dialFile);
|
||||
qSettings->setValue("useOpenGLFlag", useOpenGLFlag);
|
||||
qSettings->setValue("hqFonts", hqFonts);
|
||||
qSettings->setValue("beSmooth", beSmooth);
|
||||
}
|
@ -1,86 +0,0 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
*
|
||||
* @file pfdgadgetconfiguration.h
|
||||
* @author Edouard Lafargue Copyright (C) 2010.
|
||||
* @addtogroup GCSPlugins GCS Plugins
|
||||
* @{
|
||||
* @addtogroup OPMapPlugin Primary Flight Display Plugin
|
||||
* @{
|
||||
* @brief The Primary Flight Display Gadget
|
||||
*****************************************************************************/
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef PFDGADGETCONFIGURATION_H
|
||||
#define PFDGADGETCONFIGURATION_H
|
||||
|
||||
#include <coreplugin/iuavgadgetconfiguration.h>
|
||||
|
||||
using namespace Core;
|
||||
|
||||
class PFDGadgetConfiguration : public IUAVGadgetConfiguration {
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit PFDGadgetConfiguration(QString classId, QSettings *qSettings = 0, QObject *parent = 0);
|
||||
|
||||
// set dial configuration functions
|
||||
void setDialFile(QString dialFile)
|
||||
{
|
||||
m_defaultDial = dialFile;
|
||||
}
|
||||
void setUseOpenGL(bool flag)
|
||||
{
|
||||
useOpenGLFlag = flag;
|
||||
}
|
||||
void setHqFonts(bool flag)
|
||||
{
|
||||
hqFonts = flag;
|
||||
}
|
||||
void setBeSmooth(bool flag)
|
||||
{
|
||||
beSmooth = flag;
|
||||
}
|
||||
|
||||
// get dial configuration functions
|
||||
QString dialFile()
|
||||
{
|
||||
return m_defaultDial;
|
||||
}
|
||||
bool useOpenGL()
|
||||
{
|
||||
return useOpenGLFlag;
|
||||
}
|
||||
bool getHqFonts()
|
||||
{
|
||||
return hqFonts;
|
||||
}
|
||||
bool getBeSmooth()
|
||||
{
|
||||
return beSmooth;
|
||||
}
|
||||
|
||||
void saveConfig(QSettings *settings) const;
|
||||
IUAVGadgetConfiguration *clone();
|
||||
|
||||
private:
|
||||
QString m_defaultDial; // The name of the dial's SVG source file
|
||||
bool useOpenGLFlag;
|
||||
bool hqFonts;
|
||||
bool beSmooth;
|
||||
};
|
||||
|
||||
#endif // PFDGADGETCONFIGURATION_H
|
@ -1,58 +0,0 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
*
|
||||
* @file pfdgadgetfactory.cpp
|
||||
* @author Edouard Lafargue Copyright (C) 2010.
|
||||
* @addtogroup GCSPlugins GCS Plugins
|
||||
* @{
|
||||
* @addtogroup OPMapPlugin Primary Flight Display Plugin
|
||||
* @{
|
||||
* @brief The Primary Flight Display Gadget
|
||||
*****************************************************************************/
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#include "pfdgadgetfactory.h"
|
||||
#include "pfdgadgetwidget.h"
|
||||
#include "pfdgadget.h"
|
||||
#include "pfdgadgetconfiguration.h"
|
||||
#include "pfdgadgetoptionspage.h"
|
||||
#include <coreplugin/iuavgadget.h>
|
||||
|
||||
PFDGadgetFactory::PFDGadgetFactory(QObject *parent) :
|
||||
IUAVGadgetFactory(QString("PFDGadget"),
|
||||
tr("Primary Flight Display"),
|
||||
parent)
|
||||
{}
|
||||
|
||||
PFDGadgetFactory::~PFDGadgetFactory()
|
||||
{}
|
||||
|
||||
Core::IUAVGadget *PFDGadgetFactory::createGadget(QWidget *parent)
|
||||
{
|
||||
PFDGadgetWidget *gadgetWidget = new PFDGadgetWidget(parent);
|
||||
|
||||
return new PFDGadget(QString("PFDGadget"), gadgetWidget, parent);
|
||||
}
|
||||
|
||||
IUAVGadgetConfiguration *PFDGadgetFactory::createConfiguration(QSettings *qSettings)
|
||||
{
|
||||
return new PFDGadgetConfiguration(QString("PFDGadget"), qSettings);
|
||||
}
|
||||
|
||||
IOptionsPage *PFDGadgetFactory::createOptionsPage(IUAVGadgetConfiguration *config)
|
||||
{
|
||||
return new PFDGadgetOptionsPage(qobject_cast<PFDGadgetConfiguration *>(config));
|
||||
}
|
@ -1,51 +0,0 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
*
|
||||
* @file pfdgadgetfactory.h
|
||||
* @author Edouard Lafargue Copyright (C) 2010.
|
||||
* @addtogroup GCSPlugins GCS Plugins
|
||||
* @{
|
||||
* @addtogroup OPMapPlugin Primary Flight Display Plugin
|
||||
* @{
|
||||
* @brief The Primary Flight Display Gadget
|
||||
*****************************************************************************/
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef PFDGADGETFACTORY_H_
|
||||
#define PFDGADGETFACTORY_H_
|
||||
|
||||
#include <coreplugin/iuavgadgetfactory.h>
|
||||
|
||||
namespace Core {
|
||||
class IUAVGadget;
|
||||
class IUAVGadgetFactory;
|
||||
}
|
||||
|
||||
using namespace Core;
|
||||
|
||||
class PFDGadgetFactory : public IUAVGadgetFactory {
|
||||
Q_OBJECT
|
||||
public:
|
||||
PFDGadgetFactory(QObject *parent = 0);
|
||||
~PFDGadgetFactory();
|
||||
|
||||
Core::IUAVGadget *createGadget(QWidget *parent);
|
||||
IUAVGadgetConfiguration *createConfiguration(QSettings *qSettings);
|
||||
IOptionsPage *createOptionsPage(IUAVGadgetConfiguration *config);
|
||||
};
|
||||
|
||||
#endif // PFDGADGETFACTORY_H_
|
@ -1,85 +0,0 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
*
|
||||
* @file pfdgadgetoptionspage.cpp
|
||||
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
|
||||
* @addtogroup GCSPlugins GCS Plugins
|
||||
* @{
|
||||
* @addtogroup OPMapPlugin Primary Flight Display Plugin
|
||||
* @{
|
||||
* @brief The Primary Flight Display Gadget
|
||||
*****************************************************************************/
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "pfdgadgetoptionspage.h"
|
||||
#include "pfdgadgetconfiguration.h"
|
||||
#include "ui_pfdgadgetoptionspage.h"
|
||||
#include "extensionsystem/pluginmanager.h"
|
||||
#include "uavobjectmanager.h"
|
||||
#include "uavdataobject.h"
|
||||
|
||||
|
||||
#include <QFileDialog>
|
||||
#include <QtAlgorithms>
|
||||
#include <QStringList>
|
||||
|
||||
PFDGadgetOptionsPage::PFDGadgetOptionsPage(PFDGadgetConfiguration *config, QObject *parent) :
|
||||
IOptionsPage(parent),
|
||||
m_config(config)
|
||||
{}
|
||||
|
||||
// creates options page widget (uses the UI file)
|
||||
QWidget *PFDGadgetOptionsPage::createPage(QWidget *parent)
|
||||
{
|
||||
Q_UNUSED(parent);
|
||||
|
||||
options_page = new Ui::PFDGadgetOptionsPage();
|
||||
// main widget
|
||||
QWidget *optionsPageWidget = new QWidget;
|
||||
// main layout
|
||||
options_page->setupUi(optionsPageWidget);
|
||||
|
||||
|
||||
// Restore the contents from the settings:
|
||||
options_page->svgSourceFile->setExpectedKind(Utils::PathChooser::File);
|
||||
options_page->svgSourceFile->setPromptDialogFilter(tr("SVG image (*.svg)"));
|
||||
options_page->svgSourceFile->setPromptDialogTitle(tr("Choose SVG image"));
|
||||
options_page->svgSourceFile->setPath(m_config->dialFile());
|
||||
options_page->useOpenGL->setChecked(m_config->useOpenGL());
|
||||
options_page->hqText->setChecked(m_config->getHqFonts());
|
||||
options_page->smoothUpdates->setChecked(m_config->getBeSmooth());
|
||||
|
||||
return optionsPageWidget;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the user presses apply or OK.
|
||||
*
|
||||
* Saves the current values
|
||||
*
|
||||
*/
|
||||
void PFDGadgetOptionsPage::apply()
|
||||
{
|
||||
m_config->setDialFile(options_page->svgSourceFile->path());
|
||||
m_config->setUseOpenGL(options_page->useOpenGL->checkState());
|
||||
m_config->setHqFonts(options_page->hqText->checkState());
|
||||
m_config->setBeSmooth(options_page->smoothUpdates->checkState());
|
||||
}
|
||||
|
||||
|
||||
void PFDGadgetOptionsPage::finish()
|
||||
{}
|
@ -1,64 +0,0 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
*
|
||||
* @file pfdgadgetoptionspage.h
|
||||
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
|
||||
* @addtogroup GCSPlugins GCS Plugins
|
||||
* @{
|
||||
* @addtogroup OPMapPlugin Primary Flight Display Plugin
|
||||
* @{
|
||||
* @brief The Primary Flight Display Gadget
|
||||
*****************************************************************************/
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef PFDGADGETOPTIONSPAGE_H
|
||||
#define PFDGADGETOPTIONSPAGE_H
|
||||
|
||||
#include "coreplugin/dialogs/ioptionspage.h"
|
||||
#include "QString"
|
||||
#include <QStringList>
|
||||
#include <QDebug>
|
||||
|
||||
namespace Core {
|
||||
class IUAVGadgetConfiguration;
|
||||
}
|
||||
|
||||
class PFDGadgetConfiguration;
|
||||
|
||||
namespace Ui {
|
||||
class PFDGadgetOptionsPage;
|
||||
}
|
||||
|
||||
using namespace Core;
|
||||
|
||||
class PFDGadgetOptionsPage : public IOptionsPage {
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit PFDGadgetOptionsPage(PFDGadgetConfiguration *config, QObject *parent = 0);
|
||||
|
||||
QWidget *createPage(QWidget *parent);
|
||||
void apply();
|
||||
void finish();
|
||||
|
||||
private:
|
||||
Ui::PFDGadgetOptionsPage *options_page;
|
||||
PFDGadgetConfiguration *m_config;
|
||||
|
||||
private slots:
|
||||
};
|
||||
|
||||
#endif // PFDGADGETOPTIONSPAGE_H
|
@ -1,150 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>PFDGadgetOptionsPage</class>
|
||||
<widget class="QWidget" name="PFDGadgetOptionsPage">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>430</width>
|
||||
<height>306</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<property name="margin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QScrollArea" name="scrollArea">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Plain</enum>
|
||||
</property>
|
||||
<property name="widgetResizable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<widget class="QWidget" name="scrollAreaWidgetContents">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>430</width>
|
||||
<height>306</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="margin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout" stretch="0,0">
|
||||
<property name="spacing">
|
||||
<number>10</number>
|
||||
</property>
|
||||
<property name="sizeConstraint">
|
||||
<enum>QLayout::SetMaximumSize</enum>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>10</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>PFD SVG: </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="Utils::PathChooser" name="svgSourceFile" native="true">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<item>
|
||||
<widget class="QCheckBox" name="useOpenGL">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Use OpenGL for rendering</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="hqText">
|
||||
<property name="text">
|
||||
<string>High Quality text (OpenGL)</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||
<item>
|
||||
<widget class="QCheckBox" name="smoothUpdates">
|
||||
<property name="text">
|
||||
<string>Smooth updates</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::MinimumExpanding</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>Utils::PathChooser</class>
|
||||
<extends>QWidget</extends>
|
||||
<header>utils/pathchooser.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
@ -1,1133 +0,0 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
*
|
||||
* @file pfdgadgetwidget.cpp
|
||||
* @author Edouard Lafargue Copyright (C) 2010.
|
||||
* @addtogroup GCSPlugins GCS Plugins
|
||||
* @{
|
||||
* @addtogroup OPMapPlugin Primary Flight Display Plugin
|
||||
* @{
|
||||
* @brief The Primary Flight Display Gadget
|
||||
*****************************************************************************/
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "pfdgadgetwidget.h"
|
||||
#include <utils/stylehelper.h>
|
||||
#include <utils/cachedsvgitem.h>
|
||||
#include <iostream>
|
||||
#include <QDebug>
|
||||
#include <QPainter>
|
||||
#include <QtOpenGL/QGLWidget>
|
||||
#include <cmath>
|
||||
|
||||
PFDGadgetWidget::PFDGadgetWidget(QWidget *parent) : QGraphicsView(parent)
|
||||
{
|
||||
setMinimumSize(64, 64);
|
||||
setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
|
||||
setScene(new QGraphicsScene(this));
|
||||
// setRenderHint(QPainter::SmoothPixmapTransform);
|
||||
|
||||
setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
|
||||
// setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
|
||||
// setRenderHints(QPainter::TextAntialiasing);
|
||||
// setRenderHints(QPainter::HighQualityAntialiasing);
|
||||
|
||||
m_renderer = new QSvgRenderer();
|
||||
|
||||
attitudeObj = NULL;
|
||||
headingObj = NULL;
|
||||
gcsBatteryObj = NULL;
|
||||
gpsObj = NULL;
|
||||
compassBandWidth = 0;
|
||||
pfdError = true;
|
||||
hqFonts = false;
|
||||
rollTarget = 0;
|
||||
rollValue = 0;
|
||||
pitchTarget = 0;
|
||||
pitchValue = 0;
|
||||
headingTarget = 0;
|
||||
headingValue = 0;
|
||||
groundspeedTarget = 0;
|
||||
groundspeedValue = 0;
|
||||
altitudeTarget = 0;
|
||||
altitudeValue = 0;
|
||||
|
||||
// This timer mechanism makes needles rotate smoothly
|
||||
connect(&dialTimer, SIGNAL(timeout()), this, SLOT(moveNeedles()));
|
||||
dialTimer.start(30);
|
||||
|
||||
connect(&skyDialTimer, SIGNAL(timeout()), this, SLOT(moveSky()));
|
||||
skyDialTimer.start(30);
|
||||
}
|
||||
|
||||
PFDGadgetWidget::~PFDGadgetWidget()
|
||||
{
|
||||
skyDialTimer.stop();
|
||||
dialTimer.stop();
|
||||
}
|
||||
|
||||
void PFDGadgetWidget::setToolTipPrivate()
|
||||
{
|
||||
static qint32 updateRate = 0;
|
||||
UAVObject::Metadata mdata = attitudeObj->getMetadata();
|
||||
|
||||
if (mdata.flightTelemetryUpdatePeriod != updateRate) {
|
||||
this->setToolTip("Current refresh rate:" + QString::number(mdata.flightTelemetryUpdatePeriod) + " miliseconds" + "\nIf you want to change it please edit the AttitudeState metadata on the object browser.");
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Enables/Disables OpenGL
|
||||
*/
|
||||
void PFDGadgetWidget::enableOpenGL(bool flag)
|
||||
{
|
||||
if (flag) {
|
||||
setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));
|
||||
} else {
|
||||
setViewport(new QWidget);
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Connects the widget to the relevant UAVObjects
|
||||
|
||||
Should only be called after the PFD artwork is loaded.
|
||||
We want: AttitudeState, FlightBattery, Location.
|
||||
|
||||
*/
|
||||
void PFDGadgetWidget::connectNeedles()
|
||||
{
|
||||
if (attitudeObj != NULL) {
|
||||
disconnect(attitudeObj, SIGNAL(objectUpdated(UAVObject *)), this, SLOT(updateAttitude(UAVObject *)));
|
||||
}
|
||||
|
||||
if (headingObj != NULL) {
|
||||
disconnect(headingObj, SIGNAL(objectUpdated(UAVObject *)), this, SLOT(updateHeading(UAVObject *)));
|
||||
}
|
||||
|
||||
if (gcsBatteryObj != NULL) {
|
||||
disconnect(gcsBatteryObj, SIGNAL(objectUpdated(UAVObject *)), this, SLOT(updateBattery(UAVObject *)));
|
||||
}
|
||||
|
||||
if (gpsObj != NULL) {
|
||||
disconnect(gpsObj, SIGNAL(objectUpdated(UAVObject *)), this, SLOT(updateGPS(UAVObject *)));
|
||||
}
|
||||
|
||||
// Safeguard: if artwork did not load properly, don't go further
|
||||
if (pfdError) {
|
||||
return;
|
||||
}
|
||||
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
|
||||
UAVObjectManager *objManager = pm->getObject<UAVObjectManager>();
|
||||
|
||||
airspeedObj = dynamic_cast<UAVDataObject *>(objManager->getObject("AirspeedState"));
|
||||
if (airspeedObj != NULL) {
|
||||
connect(airspeedObj, SIGNAL(objectUpdated(UAVObject *)), this, SLOT(updateAirspeed(UAVObject *)));
|
||||
} else {
|
||||
qDebug() << "Error: Object is unknown (AirspeedState).";
|
||||
}
|
||||
|
||||
groundspeedObj = dynamic_cast<UAVDataObject *>(objManager->getObject("VelocityState"));
|
||||
if (groundspeedObj != NULL) {
|
||||
connect(groundspeedObj, SIGNAL(objectUpdated(UAVObject *)), this, SLOT(updateGroundspeed(UAVObject *)));
|
||||
} else {
|
||||
qDebug() << "Error: Object is unknown (VelocityState).";
|
||||
}
|
||||
|
||||
altitudeObj = dynamic_cast<UAVDataObject *>(objManager->getObject("PositionState"));
|
||||
if (altitudeObj != NULL) {
|
||||
connect(altitudeObj, SIGNAL(objectUpdated(UAVObject *)), this, SLOT(updateAltitude(UAVObject *)));
|
||||
} else {
|
||||
qDebug() << "Error: Object is unknown (PositionState).";
|
||||
}
|
||||
|
||||
attitudeObj = dynamic_cast<UAVDataObject *>(objManager->getObject("AttitudeState"));
|
||||
if (attitudeObj != NULL) {
|
||||
connect(attitudeObj, SIGNAL(objectUpdated(UAVObject *)), this, SLOT(updateAttitude(UAVObject *)));
|
||||
} else {
|
||||
qDebug() << "Error: Object is unknown (AttitudeState).";
|
||||
}
|
||||
|
||||
headingObj = dynamic_cast<UAVDataObject *>(objManager->getObject("PositionState"));
|
||||
if (headingObj != NULL) {
|
||||
connect(headingObj, SIGNAL(objectUpdated(UAVObject *)), this, SLOT(updateHeading(UAVObject *)));
|
||||
} else {
|
||||
qDebug() << "Error: Object is unknown (PositionState).";
|
||||
}
|
||||
|
||||
if (gcsGPSStats) {
|
||||
gpsObj = dynamic_cast<UAVDataObject *>(objManager->getObject("GPSPositionSensor"));
|
||||
if (gpsObj != NULL) {
|
||||
connect(gpsObj, SIGNAL(objectUpdated(UAVObject *)), this, SLOT(updateGPS(UAVObject *)));
|
||||
} else {
|
||||
qDebug() << "Error: Object is unknown (GPSPositionSensor).";
|
||||
}
|
||||
}
|
||||
|
||||
if (gcsTelemetryArrow || gcsTelemetryStats) {
|
||||
// Only register if the PFD wants link stats/status
|
||||
gcsTelemetryObj = dynamic_cast<UAVDataObject *>(objManager->getObject("GCSTelemetryStats"));
|
||||
if (gcsTelemetryObj != NULL) {
|
||||
connect(gcsTelemetryObj, SIGNAL(objectUpdated(UAVObject *)), this, SLOT(updateLinkStatus(UAVObject *)));
|
||||
} else {
|
||||
qDebug() << "Error: Object is unknown (GCSTelemetryStats).";
|
||||
}
|
||||
}
|
||||
|
||||
if (gcsBatteryStats) { // Only register if the PFD wants battery display
|
||||
gcsBatteryObj = dynamic_cast<UAVDataObject *>(objManager->getObject("FlightBatteryState"));
|
||||
if (gcsBatteryObj != NULL) {
|
||||
connect(gcsBatteryObj, SIGNAL(objectUpdated(UAVObject *)), this, SLOT(updateBattery(UAVObject *)));
|
||||
} else {
|
||||
qDebug() << "Error: Object is unknown (FlightBatteryState).";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
\brief Updates the GPS stats
|
||||
*/
|
||||
void PFDGadgetWidget::updateGPS(UAVObject *object1)
|
||||
{
|
||||
UAVObjectField *field = object1->getField(QString("Satellites"));
|
||||
UAVObjectField *field1 = object1->getField(QString("PDOP"));
|
||||
|
||||
if (field && field1) {
|
||||
QString s = QString("GPS: ") + field->getValue().toString() + "\nPDP: "
|
||||
+ field1->getValue().toString();
|
||||
if (s != satString) {
|
||||
gcsGPSStats->setPlainText(s);
|
||||
satString = s;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Updates the link stats
|
||||
*/
|
||||
void PFDGadgetWidget::updateLinkStatus(UAVObject *object1)
|
||||
{
|
||||
// TODO: find a way to avoid updating the graphics if the value
|
||||
// has not changed since the last update
|
||||
// Double check that the field exists:
|
||||
QString st = QString("Status");
|
||||
QString tdr = QString("TxDataRate");
|
||||
QString rdr = QString("RxDataRate");
|
||||
UAVObjectField *field = object1->getField(st);
|
||||
UAVObjectField *field2 = object1->getField(tdr);
|
||||
UAVObjectField *field3 = object1->getField(rdr);
|
||||
|
||||
if (field && field2 && field3) {
|
||||
QString s = field->getValue().toString();
|
||||
if (m_renderer->elementExists("gcstelemetry-" + s) && gcsTelemetryArrow) {
|
||||
gcsTelemetryArrow->setElementId("gcstelemetry-" + s);
|
||||
} else { // Safeguard
|
||||
gcsTelemetryArrow->setElementId("gcstelemetry-Disconnected");
|
||||
}
|
||||
double v1 = field2->getDouble();
|
||||
double v2 = field3->getDouble();
|
||||
s.sprintf("%.0f/%.0f", v1, v2);
|
||||
if (gcsTelemetryStats) {
|
||||
gcsTelemetryStats->setPlainText(s);
|
||||
}
|
||||
} else {
|
||||
qDebug() << "UpdateLinkStatus: Wrong field, maybe an issue with object disconnection ?";
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Reads the updated attitude and computes the new display position
|
||||
|
||||
Resolution is 1 degree roll & 1/7.5 degree pitch.
|
||||
*/
|
||||
void PFDGadgetWidget::updateAttitude(UAVObject *object1)
|
||||
{
|
||||
setToolTipPrivate();
|
||||
UAVObjectField *rollField = object1->getField(QString("Roll"));
|
||||
UAVObjectField *yawField = object1->getField(QString("Yaw"));
|
||||
UAVObjectField *pitchField = object1->getField(QString("Pitch"));
|
||||
if (rollField && yawField && pitchField) {
|
||||
// These factors assume some things about the PFD SVG, namely:
|
||||
// - Roll, Pitch and Heading value in degrees
|
||||
// - Pitch lines are 300px high for a +20/-20 range, which means
|
||||
// 7.5 pixels per pitch degree.
|
||||
// TODO: loosen this constraint and only require a +/- 20 deg range,
|
||||
// and compute the height from the SVG element.
|
||||
// Also: keep the integer value only, to avoid unnecessary redraws
|
||||
rollTarget = -floor(rollField->getDouble() * 10) / 10;
|
||||
if ((rollTarget - rollValue) > 180) {
|
||||
rollValue += 360;
|
||||
} else if (((rollTarget - rollValue) < -180)) {
|
||||
rollValue -= 360;
|
||||
}
|
||||
pitchTarget = floor(pitchField->getDouble() * 7.5);
|
||||
|
||||
// These factors assume some things about the PFD SVG, namely:
|
||||
// - Heading value in degrees
|
||||
// - "Scale" element is 540 degrees wide
|
||||
|
||||
// Corvus Corax: "If you want a smooth transition between two angles, It is usually solved that by substracting
|
||||
// one from another, and if the result is >180 or <-180 I substract (respectively add) 360 degrees
|
||||
// to it. That way you always get the "shorter difference" to turn in."
|
||||
double fac = compassBandWidth / 540;
|
||||
headingTarget = yawField->getDouble() * (-fac);
|
||||
if (headingTarget != headingTarget) {
|
||||
headingTarget = headingValue; // NaN checking.
|
||||
}
|
||||
if ((headingValue - headingTarget) / fac > 180) {
|
||||
headingTarget += 360 * fac;
|
||||
} else if (((headingValue - headingTarget) / fac < -180)) {
|
||||
headingTarget -= 360 * fac;
|
||||
}
|
||||
headingTarget = floor(headingTarget * 10) / 10; // Avoid stupid redraws
|
||||
|
||||
if (!dialTimer.isActive()) {
|
||||
dialTimer.start(); // Rearm the dial Timer which might be stopped.
|
||||
}
|
||||
} else {
|
||||
qDebug() << "Unable to get one of the fields for attitude update";
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Updates the compass reading and speed dial.
|
||||
|
||||
This also updates speed & altitude according to PositionState data.
|
||||
|
||||
Note: the speed dial shows the ground speed at the moment, because
|
||||
there is no airspeed by default. Should become configurable in a future
|
||||
gadget release (TODO)
|
||||
*/
|
||||
void PFDGadgetWidget::updateHeading(UAVObject *object)
|
||||
{
|
||||
Q_UNUSED(object);
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Called by updates to @PositionState to compute groundspeed from velocity
|
||||
*/
|
||||
void PFDGadgetWidget::updateGroundspeed(UAVObject *object)
|
||||
{
|
||||
UAVObjectField *northField = object->getField("North");
|
||||
UAVObjectField *eastField = object->getField("East");
|
||||
|
||||
if (northField && eastField) {
|
||||
double val = floor(sqrt(pow(northField->getDouble(), 2) + pow(eastField->getDouble(), 2)) * 10) / 10;
|
||||
groundspeedTarget = 3.6 * val * speedScaleHeight / 30;
|
||||
|
||||
if (!dialTimer.isActive()) {
|
||||
dialTimer.start(); // Rearm the dial Timer which might be stopped.
|
||||
}
|
||||
} else {
|
||||
qDebug() << "UpdateHeading: Wrong field, maybe an issue with object disconnection ?";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
\brief Called by updates to @AirspeedState
|
||||
*/
|
||||
void PFDGadgetWidget::updateAirspeed(UAVObject *object)
|
||||
{
|
||||
UAVObjectField *airspeedField = object->getField("CalibratedAirspeed");
|
||||
|
||||
if (airspeedField) {
|
||||
airspeedTarget = airspeedField->getDouble();
|
||||
|
||||
if (!dialTimer.isActive()) {
|
||||
dialTimer.start(); // Rearm the dial Timer which might be stopped.
|
||||
}
|
||||
} else {
|
||||
qDebug() << "UpdateHeading: Wrong field, maybe an issue with object disconnection ?";
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
\brief Called by the @ref PositionState updates to show altitude
|
||||
*/
|
||||
void PFDGadgetWidget::updateAltitude(UAVObject *object)
|
||||
{
|
||||
UAVObjectField *downField = object->getField("Down");
|
||||
|
||||
if (downField) {
|
||||
altitudeTarget = -downField->getDouble();
|
||||
|
||||
if (!dialTimer.isActive()) {
|
||||
dialTimer.start(); // Rearm the dial Timer which might be stopped.
|
||||
}
|
||||
} else {
|
||||
qDebug() << "Unable to get field for altitude update. Obj: " << object->getName();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
\brief Called by the UAVObject which got updated
|
||||
*/
|
||||
void PFDGadgetWidget::updateBattery(UAVObject *object1)
|
||||
{
|
||||
// Double check that the field exists:
|
||||
QString voltage = QString("Voltage");
|
||||
QString current = QString("Current");
|
||||
QString energy = QString("ConsumedEnergy");
|
||||
UAVObjectField *field = object1->getField(voltage);
|
||||
UAVObjectField *field2 = object1->getField(current);
|
||||
UAVObjectField *field3 = object1->getField(energy);
|
||||
|
||||
if (field && field2 && field3) {
|
||||
QString s = QString();
|
||||
double v0 = field->getDouble();
|
||||
double v1 = field2->getDouble();
|
||||
double v2 = field3->getDouble();
|
||||
s.sprintf("%.2fV\n%.2fA\n%.0fmAh", v0, v1, v2);
|
||||
if (s != batString) {
|
||||
gcsBatteryStats->setPlainText(s);
|
||||
batString = s;
|
||||
}
|
||||
} else {
|
||||
qDebug() << "UpdateBattery: Wrong field, maybe an issue with object disconnection ?";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
\brief Sets up the PFD from the SVG master file.
|
||||
|
||||
Initializes the display, and does all the one-time calculations.
|
||||
*/
|
||||
void PFDGadgetWidget::setDialFile(QString dfn)
|
||||
{
|
||||
QGraphicsScene *l_scene = scene();
|
||||
|
||||
setBackgroundBrush(QBrush(Utils::StyleHelper::baseColor()));
|
||||
if (QFile::exists(dfn) && m_renderer->load(dfn) && m_renderer->isValid()) {
|
||||
/* The PFD element IDs are fixed, not like with the analog dial.
|
||||
- Background: background
|
||||
- Foreground: foreground (contains all fixed elements, including plane)
|
||||
- earth/sky : world
|
||||
- Roll scale: rollscale
|
||||
- compass frame: compass (part of the foreground)
|
||||
- compass band : compass-band
|
||||
- Home point: homewaypoint
|
||||
- Next point: nextwaypoint
|
||||
- Home point bearing: homewaypoint-bearing
|
||||
- Next point bearing: nextwaypoint-bearing
|
||||
- Speed rectangle (left side): speed-bg
|
||||
- Speed scale: speed-scale.
|
||||
- Black speed window: speed-window.
|
||||
- Altitude rectangle (right site): altitude-bg.
|
||||
- Altitude scale: altitude-scale.
|
||||
- Black altitude window: altitude-window.
|
||||
- GCS Telemetry status arrow: gcstelemetry-XXXX
|
||||
- Telemetry link rate: linkrate
|
||||
- GPS status text: gps-txt
|
||||
- Battery stats: battery-txt
|
||||
*/
|
||||
l_scene->clear(); // Deletes all items contained in the scene as well.
|
||||
m_background = new CachedSvgItem();
|
||||
// All other items will be clipped to the shape of the background
|
||||
m_background->setFlags(QGraphicsItem::ItemClipsChildrenToShape |
|
||||
QGraphicsItem::ItemClipsToShape);
|
||||
m_background->setSharedRenderer(m_renderer);
|
||||
m_background->setElementId("background");
|
||||
l_scene->addItem(m_background);
|
||||
|
||||
m_world = new CachedSvgItem();
|
||||
m_world->setParentItem(m_background);
|
||||
m_world->setSharedRenderer(m_renderer);
|
||||
m_world->setElementId("world");
|
||||
l_scene->addItem(m_world);
|
||||
|
||||
// red Roll scale: rollscale
|
||||
m_rollscale = new CachedSvgItem();
|
||||
m_rollscale->setSharedRenderer(m_renderer);
|
||||
m_rollscale->setElementId("rollscale");
|
||||
l_scene->addItem(m_rollscale);
|
||||
|
||||
// Home point:
|
||||
m_homewaypoint = new CachedSvgItem();
|
||||
// Next point:
|
||||
m_nextwaypoint = new CachedSvgItem();
|
||||
// Home point bearing:
|
||||
m_homepointbearing = new CachedSvgItem();
|
||||
// Next point bearing:
|
||||
m_nextpointbearing = new CachedSvgItem();
|
||||
|
||||
QGraphicsSvgItem *m_foreground = new CachedSvgItem();
|
||||
m_foreground->setParentItem(m_background);
|
||||
m_foreground->setSharedRenderer(m_renderer);
|
||||
m_foreground->setElementId("foreground");
|
||||
l_scene->addItem(m_foreground);
|
||||
|
||||
////////////////////
|
||||
// Compass
|
||||
////////////////////
|
||||
// Get the default location of the Compass:
|
||||
QMatrix compassMatrix = m_renderer->matrixForElement("compass");
|
||||
qreal startX = compassMatrix.mapRect(m_renderer->boundsOnElement("compass")).x();
|
||||
qreal startY = compassMatrix.mapRect(m_renderer->boundsOnElement("compass")).y();
|
||||
// Then once we have the initial location, we can put it
|
||||
// into a QGraphicsSvgItem which we will display at the same
|
||||
// place: we do this so that the heading scale can be clipped to
|
||||
// the compass dial region.
|
||||
m_compass = new CachedSvgItem();
|
||||
m_compass->setSharedRenderer(m_renderer);
|
||||
m_compass->setElementId("compass");
|
||||
m_compass->setFlags(QGraphicsItem::ItemClipsChildrenToShape |
|
||||
QGraphicsItem::ItemClipsToShape);
|
||||
l_scene->addItem(m_compass);
|
||||
QTransform matrix;
|
||||
matrix.translate(startX, startY);
|
||||
m_compass->setTransform(matrix, false);
|
||||
|
||||
// Now place the compass scale inside:
|
||||
m_compassband = new CachedSvgItem();
|
||||
m_compassband->setSharedRenderer(m_renderer);
|
||||
m_compassband->setElementId("compass-band");
|
||||
m_compassband->setParentItem(m_compass);
|
||||
l_scene->addItem(m_compassband);
|
||||
matrix.reset();
|
||||
// Note: the compass band has to be a path, which means all text elements have to be
|
||||
// converted, ortherwise boundsOnElement does not compute the height correctly
|
||||
// if the highest element is a text element. This is a Qt Bug as far as I can tell.
|
||||
|
||||
// compass-scale is the while bottom line inside the band: using the band's width
|
||||
// includes half the width of the letters, which causes errors:
|
||||
compassBandWidth = m_renderer->boundsOnElement("compass-scale").width();
|
||||
|
||||
////////////////////
|
||||
// Speed
|
||||
////////////////////
|
||||
// Speedometer on the left hand:
|
||||
//
|
||||
compassMatrix = m_renderer->matrixForElement("speed-bg");
|
||||
startX = compassMatrix.mapRect(m_renderer->boundsOnElement("speed-bg")).x();
|
||||
startY = compassMatrix.mapRect(m_renderer->boundsOnElement("speed-bg")).y();
|
||||
QGraphicsSvgItem *verticalbg = new CachedSvgItem();
|
||||
verticalbg->setSharedRenderer(m_renderer);
|
||||
verticalbg->setElementId("speed-bg");
|
||||
verticalbg->setFlags(QGraphicsItem::ItemClipsChildrenToShape |
|
||||
QGraphicsItem::ItemClipsToShape);
|
||||
l_scene->addItem(verticalbg);
|
||||
matrix.reset();
|
||||
matrix.translate(startX, startY);
|
||||
verticalbg->setTransform(matrix, false);
|
||||
|
||||
// Note: speed-scale should contain exactly 6 major ticks
|
||||
// for 30km/h
|
||||
m_speedscale = new QGraphicsItemGroup();
|
||||
m_speedscale->setParentItem(verticalbg);
|
||||
|
||||
QGraphicsSvgItem *speedscalelines = new CachedSvgItem();
|
||||
speedscalelines->setSharedRenderer(m_renderer);
|
||||
speedscalelines->setElementId("speed-scale");
|
||||
speedScaleHeight = m_renderer->matrixForElement("speed-scale").mapRect(
|
||||
m_renderer->boundsOnElement("speed-scale")).height();
|
||||
startX = compassMatrix.mapRect(m_renderer->boundsOnElement("speed-bg")).width();
|
||||
startX -= m_renderer->matrixForElement("speed-scale").mapRect(
|
||||
m_renderer->boundsOnElement("speed-scale")).width();
|
||||
matrix.reset();
|
||||
matrix.translate(startX, 0);
|
||||
speedscalelines->setTransform(matrix, false);
|
||||
// Quick way to reposition the item before putting it in the group:
|
||||
speedscalelines->setParentItem(verticalbg);
|
||||
m_speedscale->addToGroup(speedscalelines); // (reparents the item)
|
||||
|
||||
// Add the scale text elements:
|
||||
QGraphicsTextItem *speed0 = new QGraphicsTextItem("0");
|
||||
speed0->setDefaultTextColor(QColor("White"));
|
||||
speed0->setFont(QFont("Arial", (int)speedScaleHeight / 30));
|
||||
if (hqFonts) {
|
||||
speed0->setCacheMode(QGraphicsItem::DeviceCoordinateCache);
|
||||
}
|
||||
matrix.reset();
|
||||
matrix.translate(compassMatrix.mapRect(m_renderer->boundsOnElement("speed-bg")).width() / 10, -speedScaleHeight / 30);
|
||||
speed0->setTransform(matrix, false);
|
||||
speed0->setParentItem(verticalbg);
|
||||
m_speedscale->addToGroup(speed0);
|
||||
for (int i = 0; i < 6; i++) {
|
||||
speed0 = new QGraphicsTextItem("");
|
||||
speed0->setDefaultTextColor(QColor("White"));
|
||||
speed0->setFont(QFont("Arial", (int)speedScaleHeight / 30));
|
||||
speed0->setPlainText(QString().setNum(i * 5 + 1));
|
||||
if (hqFonts) {
|
||||
speed0->setCacheMode(QGraphicsItem::DeviceCoordinateCache);
|
||||
}
|
||||
matrix.translate(0, speedScaleHeight / 6);
|
||||
speed0->setTransform(matrix, false);
|
||||
speed0->setParentItem(verticalbg);
|
||||
m_speedscale->addToGroup(speed0);
|
||||
}
|
||||
// Now vertically center the speed scale on the speed background
|
||||
QRectF rectB = verticalbg->boundingRect();
|
||||
QRectF rectN = speedscalelines->boundingRect();
|
||||
m_speedscale->setPos(0, rectB.height() / 2 - rectN.height() / 2 - rectN.height() / 6);
|
||||
|
||||
// Isolate the speed window and put it above the speed scale
|
||||
compassMatrix = m_renderer->matrixForElement("speed-window");
|
||||
startX = compassMatrix.mapRect(m_renderer->boundsOnElement("speed-window")).x();
|
||||
startY = compassMatrix.mapRect(m_renderer->boundsOnElement("speed-window")).y();
|
||||
qreal speedWindowHeight = compassMatrix.mapRect(m_renderer->boundsOnElement("speed-window")).height();
|
||||
QGraphicsSvgItem *speedwindow = new CachedSvgItem();
|
||||
speedwindow->setSharedRenderer(m_renderer);
|
||||
speedwindow->setElementId("speed-window");
|
||||
speedwindow->setFlags(QGraphicsItem::ItemClipsChildrenToShape |
|
||||
QGraphicsItem::ItemClipsToShape);
|
||||
l_scene->addItem(speedwindow);
|
||||
matrix.reset();
|
||||
matrix.translate(startX, startY);
|
||||
speedwindow->setTransform(matrix, false);
|
||||
|
||||
// Last create a Text Item at the location of the speed window
|
||||
// and save it for future updates:
|
||||
m_speedtext = new QGraphicsTextItem("0000");
|
||||
m_speedtext->setDefaultTextColor(QColor("White"));
|
||||
m_speedtext->setFont(QFont("Arial", (int)speedWindowHeight / 2));
|
||||
if (hqFonts) {
|
||||
m_speedtext->setCacheMode(QGraphicsItem::DeviceCoordinateCache);
|
||||
}
|
||||
m_speedtext->setParentItem(speedwindow);
|
||||
|
||||
////////////////////
|
||||
// Altitude
|
||||
////////////////////
|
||||
// Right hand, very similar to speed
|
||||
compassMatrix = m_renderer->matrixForElement("altitude-bg");
|
||||
startX = compassMatrix.mapRect(m_renderer->boundsOnElement("altitude-bg")).x();
|
||||
startY = compassMatrix.mapRect(m_renderer->boundsOnElement("altitude-bg")).y();
|
||||
verticalbg = new CachedSvgItem();
|
||||
verticalbg->setSharedRenderer(m_renderer);
|
||||
verticalbg->setElementId("altitude-bg");
|
||||
verticalbg->setFlags(QGraphicsItem::ItemClipsChildrenToShape |
|
||||
QGraphicsItem::ItemClipsToShape);
|
||||
l_scene->addItem(verticalbg);
|
||||
matrix.reset();
|
||||
matrix.translate(startX, startY);
|
||||
verticalbg->setTransform(matrix, false);
|
||||
|
||||
// Note: altitude-scale should contain exactly 6 major ticks
|
||||
// for 30 meters
|
||||
m_altitudescale = new QGraphicsItemGroup();
|
||||
m_altitudescale->setParentItem(verticalbg);
|
||||
|
||||
QGraphicsSvgItem *altitudescalelines = new CachedSvgItem();
|
||||
altitudescalelines->setSharedRenderer(m_renderer);
|
||||
altitudescalelines->setElementId("altitude-scale");
|
||||
altitudeScaleHeight = m_renderer->matrixForElement("altitude-scale").mapRect(
|
||||
m_renderer->boundsOnElement("altitude-scale")).height();
|
||||
// Quick way to reposition the item before putting it in the group:
|
||||
altitudescalelines->setParentItem(verticalbg);
|
||||
m_altitudescale->addToGroup(altitudescalelines); // (reparents the item)
|
||||
|
||||
// Add the scale text elements:
|
||||
speed0 = new QGraphicsTextItem("XXXX");
|
||||
speed0->setDefaultTextColor(QColor("White"));
|
||||
speed0->setFont(QFont("Arial", (int)altitudeScaleHeight / 30));
|
||||
if (hqFonts) {
|
||||
speed0->setCacheMode(QGraphicsItem::DeviceCoordinateCache);
|
||||
}
|
||||
matrix.reset();
|
||||
matrix.translate(m_renderer->matrixForElement("altitude-scale").mapRect(m_renderer->boundsOnElement("altitude-scale")).width()
|
||||
+ m_renderer->matrixForElement("altitude-bg").mapRect(m_renderer->boundsOnElement("altitude-bg")).width() / 10, -altitudeScaleHeight / 30);
|
||||
speed0->setTransform(matrix, false);
|
||||
speed0->setParentItem(verticalbg);
|
||||
m_altitudescale->addToGroup(speed0);
|
||||
for (int i = 0; i < 6; i++) {
|
||||
speed0 = new QGraphicsTextItem("XXXX");
|
||||
speed0->setDefaultTextColor(QColor("White"));
|
||||
speed0->setFont(QFont("Arial", (int)altitudeScaleHeight / 30));
|
||||
speed0->setPlainText(QString().setNum(i * 5 + 1));
|
||||
if (hqFonts) {
|
||||
speed0->setCacheMode(QGraphicsItem::DeviceCoordinateCache);
|
||||
}
|
||||
matrix.translate(0, altitudeScaleHeight / 6);
|
||||
speed0->setTransform(matrix, false);
|
||||
speed0->setParentItem(verticalbg);
|
||||
m_altitudescale->addToGroup(speed0);
|
||||
}
|
||||
// Now vertically center the speed scale on the speed background
|
||||
rectB = verticalbg->boundingRect();
|
||||
rectN = altitudescalelines->boundingRect();
|
||||
m_altitudescale->setPos(0, rectB.height() / 2 - rectN.height() / 2 - rectN.height() / 6);
|
||||
|
||||
// Isolate the Altitude window and put it above the altitude scale
|
||||
compassMatrix = m_renderer->matrixForElement("altitude-window");
|
||||
startX = compassMatrix.mapRect(m_renderer->boundsOnElement("altitude-window")).x();
|
||||
startY = compassMatrix.mapRect(m_renderer->boundsOnElement("altitude-window")).y();
|
||||
qreal altitudeWindowHeight = compassMatrix.mapRect(m_renderer->boundsOnElement("altitude-window")).height();
|
||||
QGraphicsSvgItem *altitudewindow = new CachedSvgItem();
|
||||
altitudewindow->setSharedRenderer(m_renderer);
|
||||
altitudewindow->setElementId("altitude-window");
|
||||
altitudewindow->setFlags(QGraphicsItem::ItemClipsChildrenToShape |
|
||||
QGraphicsItem::ItemClipsToShape);
|
||||
l_scene->addItem(altitudewindow);
|
||||
matrix.reset();
|
||||
matrix.translate(startX, startY);
|
||||
altitudewindow->setTransform(matrix, false);
|
||||
|
||||
// Last create a Text Item at the location of the speed window
|
||||
// and save it for future updates:
|
||||
m_altitudetext = new QGraphicsTextItem("0000");
|
||||
m_altitudetext->setDefaultTextColor(QColor("White"));
|
||||
m_altitudetext->setFont(QFont("Arial", (int)altitudeWindowHeight / 2));
|
||||
if (hqFonts) {
|
||||
m_altitudetext->setCacheMode(QGraphicsItem::DeviceCoordinateCache);
|
||||
}
|
||||
m_altitudetext->setParentItem(altitudewindow);
|
||||
startX = compassMatrix.mapRect(m_renderer->boundsOnElement("altitude-window")).width() / 10;
|
||||
matrix.reset();
|
||||
matrix.translate(startX, 0);
|
||||
m_altitudetext->setTransform(matrix, false);
|
||||
|
||||
////////////////
|
||||
// GCS Telemetry Indicator
|
||||
////////////////
|
||||
if (m_renderer->elementExists("gcstelemetry-Disconnected")) {
|
||||
compassMatrix = m_renderer->matrixForElement("gcstelemetry-Disconnected");
|
||||
startX = compassMatrix.mapRect(m_renderer->boundsOnElement("gcstelemetry-Disconnected")).x();
|
||||
startY = compassMatrix.mapRect(m_renderer->boundsOnElement("gcstelemetry-Disconnected")).y();
|
||||
gcsTelemetryArrow = new CachedSvgItem();
|
||||
gcsTelemetryArrow->setSharedRenderer(m_renderer);
|
||||
gcsTelemetryArrow->setElementId("gcstelemetry-Disconnected");
|
||||
l_scene->addItem(gcsTelemetryArrow);
|
||||
matrix.reset();
|
||||
matrix.translate(startX, startY);
|
||||
gcsTelemetryArrow->setTransform(matrix, false);
|
||||
} else {
|
||||
gcsTelemetryArrow = NULL;
|
||||
}
|
||||
|
||||
if (m_renderer->elementExists("linkrate")) {
|
||||
compassMatrix = m_renderer->matrixForElement("linkrate");
|
||||
startX = compassMatrix.mapRect(m_renderer->boundsOnElement("linkrate")).x();
|
||||
startY = compassMatrix.mapRect(m_renderer->boundsOnElement("linkrate")).y();
|
||||
qreal linkRateHeight = compassMatrix.mapRect(m_renderer->boundsOnElement("linkrate")).height();
|
||||
gcsTelemetryStats = new QGraphicsTextItem();
|
||||
gcsTelemetryStats->setDefaultTextColor(QColor("White"));
|
||||
gcsTelemetryStats->setFont(QFont("Arial", (int)linkRateHeight));
|
||||
if (hqFonts) {
|
||||
gcsTelemetryStats->setCacheMode(QGraphicsItem::DeviceCoordinateCache);
|
||||
}
|
||||
l_scene->addItem(gcsTelemetryStats);
|
||||
matrix.reset();
|
||||
matrix.translate(startX, startY - linkRateHeight / 2);
|
||||
gcsTelemetryStats->setTransform(matrix, false);
|
||||
} else {
|
||||
gcsTelemetryStats = NULL;
|
||||
}
|
||||
|
||||
|
||||
////////////////
|
||||
// GCS Battery Indicator
|
||||
////////////////
|
||||
/* (to be used the day I add a green/yellow/red indicator)
|
||||
compassMatrix = m_renderer->matrixForElement("gcstelemetry-Disconnected");
|
||||
startX = compassMatrix.mapRect(m_renderer->boundsOnElement("gcstelemetry-Disconnected")).x();
|
||||
startY = compassMatrix.mapRect(m_renderer->boundsOnElement("gcstelemetry-Disconnected")).y();
|
||||
gcsTelemetryArrow = new CachedSvgItem();
|
||||
gcsTelemetryArrow->setSharedRenderer(m_renderer);
|
||||
gcsTelemetryArrow->setElementId("gcstelemetry-Disconnected");
|
||||
l_scene->addItem(gcsTelemetryArrow);
|
||||
matrix.reset();
|
||||
matrix.translate(startX,startY);
|
||||
gcsTelemetryArrow->setTransform(matrix,false);
|
||||
*/
|
||||
|
||||
if (m_renderer->elementExists("battery-txt")) {
|
||||
compassMatrix = m_renderer->matrixForElement("battery-txt");
|
||||
startX = compassMatrix.mapRect(m_renderer->boundsOnElement("battery-txt")).x();
|
||||
startY = compassMatrix.mapRect(m_renderer->boundsOnElement("battery-txt")).y();
|
||||
qreal batStatHeight = compassMatrix.mapRect(m_renderer->boundsOnElement("battery-txt")).height();
|
||||
gcsBatteryStats = new QGraphicsTextItem("Battery");
|
||||
gcsBatteryStats->setDefaultTextColor(QColor("White"));
|
||||
gcsBatteryStats->setFont(QFont("Arial", (int)batStatHeight));
|
||||
if (hqFonts) {
|
||||
gcsBatteryStats->setCacheMode(QGraphicsItem::DeviceCoordinateCache);
|
||||
}
|
||||
l_scene->addItem(gcsBatteryStats);
|
||||
matrix.reset();
|
||||
matrix.translate(startX, startY - batStatHeight / 2);
|
||||
gcsBatteryStats->setTransform(matrix, false);
|
||||
} else {
|
||||
gcsBatteryStats = NULL;
|
||||
}
|
||||
|
||||
////////////////
|
||||
// GCS GPS Indicator
|
||||
////////////////
|
||||
/* (to be used the day I add a green/yellow/red indicator)
|
||||
compassMatrix = m_renderer->matrixForElement("gcstelemetry-Disconnected");
|
||||
startX = compassMatrix.mapRect(m_renderer->boundsOnElement("gcstelemetry-Disconnected")).x();
|
||||
startY = compassMatrix.mapRect(m_renderer->boundsOnElement("gcstelemetry-Disconnected")).y();
|
||||
gcsTelemetryArrow = new CachedSvgItem();
|
||||
gcsTelemetryArrow->setSharedRenderer(m_renderer);
|
||||
gcsTelemetryArrow->setElementId("gcstelemetry-Disconnected");
|
||||
l_scene->addItem(gcsTelemetryArrow);
|
||||
matrix.reset();
|
||||
matrix.translate(startX,startY);
|
||||
gcsTelemetryArrow->setTransform(matrix,false);
|
||||
*/
|
||||
|
||||
if (m_renderer->elementExists("gps-txt")) {
|
||||
compassMatrix = m_renderer->matrixForElement("gps-txt");
|
||||
startX = compassMatrix.mapRect(m_renderer->boundsOnElement("gps-txt")).x();
|
||||
startY = compassMatrix.mapRect(m_renderer->boundsOnElement("gps-txt")).y();
|
||||
qreal gpsStatHeight = compassMatrix.mapRect(m_renderer->boundsOnElement("gps-txt")).height();
|
||||
gcsGPSStats = new QGraphicsTextItem("GPS");
|
||||
gcsGPSStats->setDefaultTextColor(QColor("White"));
|
||||
gcsGPSStats->setFont(QFont("Arial", (int)gpsStatHeight));
|
||||
if (hqFonts) {
|
||||
gcsGPSStats->setCacheMode(QGraphicsItem::DeviceCoordinateCache);
|
||||
}
|
||||
l_scene->addItem(gcsGPSStats);
|
||||
matrix.reset();
|
||||
matrix.translate(startX, startY - gpsStatHeight / 2);
|
||||
gcsGPSStats->setTransform(matrix, false);
|
||||
} else {
|
||||
gcsGPSStats = NULL;
|
||||
}
|
||||
|
||||
l_scene->setSceneRect(m_background->boundingRect());
|
||||
|
||||
/////////////////
|
||||
// Item placement
|
||||
/////////////////
|
||||
|
||||
// Now Initialize the center for all transforms of the relevant elements to the
|
||||
// center of the background:
|
||||
|
||||
// 1) Move the center of the needle to the center of the background.
|
||||
rectB = m_background->boundingRect();
|
||||
rectN = m_world->boundingRect();
|
||||
m_world->setPos(rectB.width() / 2 - rectN.width() / 2, rectB.height() / 2 - rectN.height() / 2);
|
||||
// 2) Put the transform origin point of the needle at its center.
|
||||
m_world->setTransformOriginPoint(rectN.width() / 2, rectN.height() / 2);
|
||||
|
||||
rectN = m_rollscale->boundingRect();
|
||||
m_rollscale->setPos(rectB.width() / 2 - rectN.width() / 2, rectB.height() / 2 - rectN.height() / 2);
|
||||
m_rollscale->setTransformOriginPoint(rectN.width() / 2, rectN.height() / 2);
|
||||
|
||||
// Also to the same init for the compass:
|
||||
rectB = m_compass->boundingRect();
|
||||
rectN = m_compassband->boundingRect();
|
||||
m_compassband->setPos(rectB.width() / 2 - rectN.width() / 2, rectB.height() / 2 - rectN.height() / 2);
|
||||
m_compassband->setTransformOriginPoint(rectN.width() / 2, rectN.height() / 2);
|
||||
|
||||
// Last: we just loaded the dial file which is by default valid for a "zero" value
|
||||
// of the needles, so we have to reset the needles too upon dial file loading, otherwise
|
||||
// we would end up with an offset when we change a dial file and the needle value
|
||||
// is not zero at that time.
|
||||
rollValue = 0;
|
||||
pitchValue = 0;
|
||||
headingValue = 0;
|
||||
groundspeedValue = 0;
|
||||
altitudeValue = 0;
|
||||
pfdError = false;
|
||||
if (!dialTimer.isActive()) {
|
||||
dialTimer.start(); // Rearm the dial Timer which might be stopped.
|
||||
}
|
||||
} else { qDebug() << "Error on PFD artwork file.";
|
||||
m_renderer->load(QString(":/pfd/images/pfd-default.svg"));
|
||||
l_scene->clear(); // This also deletes all items contained in the scene.
|
||||
m_background = new CachedSvgItem();
|
||||
m_background->setSharedRenderer(m_renderer);
|
||||
l_scene->addItem(m_background);
|
||||
pfdError = true; }
|
||||
}
|
||||
|
||||
void PFDGadgetWidget::paint()
|
||||
{
|
||||
// update();
|
||||
}
|
||||
|
||||
void PFDGadgetWidget::paintEvent(QPaintEvent *event)
|
||||
{
|
||||
// Skip painting until the dial file is loaded
|
||||
if (!m_renderer->isValid()) {
|
||||
qDebug() << "Dial file not loaded, not rendering";
|
||||
return;
|
||||
}
|
||||
QGraphicsView::paintEvent(event);
|
||||
}
|
||||
|
||||
// This event enables the dial to be dynamically resized
|
||||
// whenever the gadget is resized, taking advantage of the vector
|
||||
// nature of SVG dials.
|
||||
void PFDGadgetWidget::resizeEvent(QResizeEvent *event)
|
||||
{
|
||||
Q_UNUSED(event);
|
||||
fitInView(m_background, Qt::KeepAspectRatio);
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
\brief Update method for the vertical scales
|
||||
*/
|
||||
void PFDGadgetWidget::moveVerticalScales() {}
|
||||
|
||||
void PFDGadgetWidget::moveSky()
|
||||
{
|
||||
int dialCount = 2; // Gets decreased by one for each element
|
||||
|
||||
// which has finished moving
|
||||
// qDebug() << "MoveSky";
|
||||
/// TODO: optimize!!!
|
||||
if (pfdError) {
|
||||
// skyDialTimer.stop();
|
||||
return;
|
||||
}
|
||||
|
||||
// In some instances, it can happen that the rollValue & target are
|
||||
// invalid inside the UAVObjects, and become a "nan" value, which freezes
|
||||
// the PFD and the whole GCS: for this reason, we check this here.
|
||||
// The strange check below works, it is a workaround because "isnan(double)"
|
||||
// is not supported on every compiler.
|
||||
if (rollTarget != rollTarget || pitchTarget != pitchTarget) {
|
||||
return;
|
||||
}
|
||||
//////
|
||||
// Roll
|
||||
//////
|
||||
if (rollValue != rollTarget) {
|
||||
double rollDiff;
|
||||
if ((abs((rollValue - rollTarget) * 10) > 5) && beSmooth) {
|
||||
rollDiff = (rollTarget - rollValue) / 2;
|
||||
} else {
|
||||
rollDiff = rollTarget - rollValue;
|
||||
dialCount--;
|
||||
}
|
||||
m_world->setRotation(m_world->rotation() + rollDiff);
|
||||
m_rollscale->setRotation(m_rollscale->rotation() + rollDiff);
|
||||
rollValue += rollDiff;
|
||||
} else {
|
||||
dialCount--;
|
||||
}
|
||||
|
||||
//////
|
||||
// Pitch
|
||||
//////
|
||||
if (pitchValue != pitchTarget) {
|
||||
double pitchDiff;
|
||||
if ((abs((pitchValue - pitchTarget) * 10) > 5) && beSmooth) {
|
||||
// if (0) {
|
||||
pitchDiff = (pitchTarget - pitchValue) / 2;
|
||||
} else {
|
||||
pitchDiff = pitchTarget - pitchValue;
|
||||
dialCount--;
|
||||
}
|
||||
QPointF opd = QPointF(0, pitchDiff);
|
||||
m_world->setTransform(QTransform::fromTranslate(opd.x(), opd.y()), true);
|
||||
QPointF oop = m_world->transformOriginPoint();
|
||||
m_world->setTransformOriginPoint((oop.x() - opd.x()), (oop.y() - opd.y()));
|
||||
pitchValue += pitchDiff;
|
||||
} else {
|
||||
dialCount--;
|
||||
}
|
||||
|
||||
if (dialCount) {
|
||||
scene()->update(sceneRect());
|
||||
}
|
||||
// if (!dialCount)
|
||||
// skyDialTimer.stop();
|
||||
}
|
||||
|
||||
|
||||
// Take an input value and move the elements accordingly.
|
||||
// Movement is smooth, starts fast and slows down when
|
||||
// approaching the target.
|
||||
//
|
||||
void PFDGadgetWidget::moveNeedles()
|
||||
{
|
||||
int dialCount = 3; // Gets decreased by one for each element
|
||||
|
||||
// which has finished moving
|
||||
|
||||
// qDebug() << "MoveNeedles";
|
||||
/// TODO: optimize!!!
|
||||
|
||||
if (pfdError) {
|
||||
dialTimer.stop();
|
||||
return;
|
||||
}
|
||||
|
||||
//////
|
||||
// Heading
|
||||
//
|
||||
// If you want a smooth transition between two angles, It is usually solved that by substracting
|
||||
// one from another, and if the result is >180 or <-180 I substract (respectively add) 360 degrees
|
||||
// to it. That way you always get the "shorter difference" to turn in.
|
||||
//////
|
||||
if (headingValue != headingTarget) {
|
||||
double headingDiff;
|
||||
if ((abs((headingValue - headingTarget) * 10) > 5) && beSmooth) {
|
||||
headingDiff = (headingTarget - headingValue) / 5;
|
||||
} else {
|
||||
headingDiff = headingTarget - headingValue;
|
||||
dialCount--;
|
||||
}
|
||||
double threshold = 180 * compassBandWidth / 540;
|
||||
// Note: rendering can jump oh so very slightly when crossing the 180 degree
|
||||
// boundary, should not impact actual useability of the display.
|
||||
if ((headingValue + headingDiff) >= threshold) {
|
||||
// We went over 180°: activate a -360 degree offset
|
||||
headingDiff -= 2 * threshold;
|
||||
headingTarget -= 2 * threshold;
|
||||
} else if ((headingValue + headingDiff) < -threshold) {
|
||||
// We went under -180°: remove the -360 degree offset
|
||||
headingDiff += 2 * threshold;
|
||||
headingTarget += 2 * threshold;
|
||||
}
|
||||
QPointF opd = QPointF(headingDiff, 0);
|
||||
m_compassband->setTransform(QTransform::fromTranslate(opd.x(), opd.y()), true);
|
||||
headingValue += headingDiff;
|
||||
} else {
|
||||
dialCount--;
|
||||
}
|
||||
|
||||
//////
|
||||
// Airspeed
|
||||
//////
|
||||
if (airspeedValue != airspeedTarget) {
|
||||
if ((abs(airspeedValue - airspeedTarget) > speedScaleHeight / 100) && beSmooth) {
|
||||
airspeedValue += (airspeedTarget - airspeedValue) / 2;
|
||||
} else {
|
||||
airspeedValue = airspeedTarget;
|
||||
dialCount--;
|
||||
}
|
||||
|
||||
float airspeed_kph = airspeedValue * 3.6;
|
||||
float airspeed_kph_scale = airspeed_kph * speedScaleHeight / 30;
|
||||
|
||||
qreal x = m_speedscale->transform().dx();
|
||||
// opd = QPointF(x,fmod(airspeed_kph,speedScaleHeight/6));
|
||||
// fmod does rounding errors!! the formula below works better:
|
||||
QPointF opd = QPointF(x, airspeed_kph_scale - floor(airspeed_kph_scale / speedScaleHeight * 6) * speedScaleHeight / 6);
|
||||
m_speedscale->setTransform(QTransform::fromTranslate(opd.x(), opd.y()), false);
|
||||
|
||||
double speedText = airspeed_kph;
|
||||
QString s = QString().sprintf("%.0f", speedText);
|
||||
m_speedtext->setPlainText(s);
|
||||
|
||||
// Now update the text elements inside the scale:
|
||||
// (Qt documentation states that the list has the same order
|
||||
// as the item add order in the QGraphicsItemGroup)
|
||||
QList <QGraphicsItem *> textList = m_speedscale->childItems();
|
||||
qreal val = 5 * floor(airspeed_kph_scale / speedScaleHeight * 6) + 20;
|
||||
foreach(QGraphicsItem * item, textList) {
|
||||
if (QGraphicsTextItem * text = qgraphicsitem_cast<QGraphicsTextItem *>(item)) {
|
||||
QString s = (val < 0) ? QString() : QString().sprintf("%.0f", val);
|
||||
if (text->toPlainText() == s) {
|
||||
break; // This should happen at element one if is has not changed, indicating
|
||||
}
|
||||
// that it's not necessary to do the rest of the list
|
||||
text->setPlainText(s);
|
||||
val -= 5;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
dialCount--;
|
||||
}
|
||||
|
||||
//////
|
||||
// Groundspeed
|
||||
//////
|
||||
if (groundspeedValue != groundspeedTarget) {
|
||||
groundspeedValue = groundspeedTarget;
|
||||
qreal x = m_speedscale->transform().dx();
|
||||
// opd = QPointF(x,fmod(groundspeedValue,speedScaleHeight/6));
|
||||
// fmod does rounding errors!! the formula below works better:
|
||||
QPointF opd = QPointF(x, groundspeedValue - floor(groundspeedValue / speedScaleHeight * 6) * speedScaleHeight / 6);
|
||||
m_speedscale->setTransform(QTransform::fromTranslate(opd.x(), opd.y()), false);
|
||||
|
||||
double speedText = groundspeedValue / speedScaleHeight * 30;
|
||||
QString s = QString().sprintf("%.0f", speedText);
|
||||
m_speedtext->setPlainText(s);
|
||||
|
||||
// Now update the text elements inside the scale:
|
||||
// (Qt documentation states that the list has the same order
|
||||
// as the item add order in the QGraphicsItemGroup)
|
||||
QList <QGraphicsItem *> textList = m_speedscale->childItems();
|
||||
qreal val = 5 * floor(groundspeedValue / speedScaleHeight * 6) + 20;
|
||||
foreach(QGraphicsItem * item, textList) {
|
||||
if (QGraphicsTextItem * text = qgraphicsitem_cast<QGraphicsTextItem *>(item)) {
|
||||
QString s = (val < 0) ? QString() : QString().sprintf("%.0f", val);
|
||||
if (text->toPlainText() == s) {
|
||||
break; // This should happen at element one if is has not changed, indicating
|
||||
}
|
||||
// that it's not necessary to do the rest of the list
|
||||
text->setPlainText(s);
|
||||
val -= 5;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//////
|
||||
// Altitude
|
||||
//////
|
||||
if (altitudeValue != altitudeTarget) {
|
||||
if ((abs(altitudeValue - altitudeTarget) > altitudeScaleHeight / 100) && beSmooth) {
|
||||
altitudeValue += (altitudeTarget - altitudeValue) / 2;
|
||||
} else {
|
||||
altitudeValue = altitudeTarget;
|
||||
dialCount--;
|
||||
}
|
||||
|
||||
// The altitude scale represents 30 meters
|
||||
float altitudeValue_scale = floor(altitudeValue * 10) / 10 * altitudeScaleHeight / 30;
|
||||
|
||||
qreal x = m_altitudescale->transform().dx();
|
||||
// opd = QPointF(x,fmod(altitudeValue,altitudeScaleHeight/6));
|
||||
// fmod does rounding errors!! the formula below works better:
|
||||
QPointF opd = QPointF(x, altitudeValue_scale - floor(altitudeValue_scale / altitudeScaleHeight * 6) * altitudeScaleHeight / 6);
|
||||
m_altitudescale->setTransform(QTransform::fromTranslate(opd.x(), opd.y()), false);
|
||||
|
||||
double altitudeText = altitudeValue;
|
||||
QString s = QString().sprintf("%.0f", altitudeText);
|
||||
m_altitudetext->setPlainText(s);
|
||||
|
||||
// Now update the text elements inside the scale:
|
||||
// (Qt documentation states that the list has the same order
|
||||
// as the item add order in the QGraphicsItemGroup)
|
||||
QList <QGraphicsItem *> textList = m_altitudescale->childItems();
|
||||
qreal val = 5 * floor(altitudeValue_scale / altitudeScaleHeight * 6) + 20;
|
||||
foreach(QGraphicsItem * item, textList) {
|
||||
if (QGraphicsTextItem * text = qgraphicsitem_cast<QGraphicsTextItem *>(item)) {
|
||||
QString s = (val < 0) ? QString() : QString().sprintf("%.0f", val);
|
||||
if (text->toPlainText() == s) {
|
||||
break; // This should happen at element one if is has not changed, indicating
|
||||
}
|
||||
// that it's not necessary to do the rest of the list
|
||||
text->setPlainText(s);
|
||||
val -= 5;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
dialCount--;
|
||||
}
|
||||
|
||||
if (!dialCount) {
|
||||
dialTimer.stop();
|
||||
} else {
|
||||
scene()->update(sceneRect());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@}
|
||||
@}
|
||||
*/
|
@ -1,160 +0,0 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
*
|
||||
* @file pfdgadgetwidget.h
|
||||
* @author Edouard Lafargue Copyright (C) 2010.
|
||||
* @addtogroup GCSPlugins GCS Plugins
|
||||
* @{
|
||||
* @addtogroup OPMapPlugin Primary Flight Display Plugin
|
||||
* @{
|
||||
* @brief The Primary Flight Display Gadget
|
||||
*****************************************************************************/
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef PFDGADGETWIDGET_H_
|
||||
#define PFDGADGETWIDGET_H_
|
||||
|
||||
#include "pfdgadgetconfiguration.h"
|
||||
#include "extensionsystem/pluginmanager.h"
|
||||
#include "uavobjectmanager.h"
|
||||
#include "uavobject.h"
|
||||
#include <QGraphicsView>
|
||||
#include <QtSvg/QSvgRenderer>
|
||||
#include <QtSvg/QGraphicsSvgItem>
|
||||
|
||||
#include <QFile>
|
||||
#include <QTimer>
|
||||
|
||||
class PFDGadgetWidget : public QGraphicsView {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
PFDGadgetWidget(QWidget *parent = 0);
|
||||
~PFDGadgetWidget();
|
||||
void setDialFile(QString dfn);
|
||||
void paint();
|
||||
// Sets up needle/UAVObject connections:
|
||||
void connectNeedles();
|
||||
void enableOpenGL(bool flag);
|
||||
void setHqFonts(bool flag)
|
||||
{
|
||||
hqFonts = flag;
|
||||
}
|
||||
void enableSmoothUpdates(bool flag)
|
||||
{
|
||||
beSmooth = flag;
|
||||
}
|
||||
|
||||
|
||||
public slots:
|
||||
void updateAttitude(UAVObject *object1);
|
||||
void updateHeading(UAVObject *object1);
|
||||
void updateGPS(UAVObject *object1);
|
||||
void updateGroundspeed(UAVObject *object1);
|
||||
void updateAirspeed(UAVObject *object1);
|
||||
void updateAltitude(UAVObject *object1);
|
||||
void updateBattery(UAVObject *object1);
|
||||
void updateLinkStatus(UAVObject *object1);
|
||||
|
||||
protected:
|
||||
void paintEvent(QPaintEvent *event);
|
||||
void resizeEvent(QResizeEvent *event);
|
||||
|
||||
|
||||
private slots:
|
||||
void moveNeedles();
|
||||
void moveVerticalScales();
|
||||
void moveSky();
|
||||
void setToolTipPrivate();
|
||||
private:
|
||||
QSvgRenderer *m_renderer;
|
||||
|
||||
// Background: background
|
||||
QGraphicsSvgItem *m_background;
|
||||
// earth/sky : world
|
||||
QGraphicsSvgItem *m_world;
|
||||
// Roll scale: rollscale
|
||||
QGraphicsSvgItem *m_rollscale;
|
||||
// Compass dial:
|
||||
QGraphicsSvgItem *m_compass;
|
||||
// Compass band:
|
||||
QGraphicsSvgItem *m_compassband;
|
||||
// Home point:
|
||||
QGraphicsSvgItem *m_homewaypoint;
|
||||
// Next point:
|
||||
QGraphicsSvgItem *m_nextwaypoint;
|
||||
// Home point bearing:
|
||||
QGraphicsSvgItem *m_homepointbearing;
|
||||
// Next point bearing:
|
||||
QGraphicsSvgItem *m_nextpointbearing;
|
||||
// Speed scale:
|
||||
QGraphicsItemGroup *m_speedscale;
|
||||
// Speed indicator text:
|
||||
QGraphicsTextItem *m_speedtext;
|
||||
// Vertical altitude scale:
|
||||
QGraphicsItemGroup *m_altitudescale;
|
||||
// Altitude indicator text:
|
||||
QGraphicsTextItem *m_altitudetext;
|
||||
// GCS link status Arrow
|
||||
QGraphicsSvgItem *gcsTelemetryArrow;
|
||||
QGraphicsTextItem *gcsTelemetryStats;
|
||||
QGraphicsTextItem *gcsBatteryStats;
|
||||
QGraphicsTextItem *gcsGPSStats;
|
||||
|
||||
// The Value and target variables
|
||||
// are expressed in degrees
|
||||
double rollTarget;
|
||||
double rollValue;
|
||||
double pitchTarget;
|
||||
double pitchValue;
|
||||
double headingTarget;
|
||||
double headingValue;
|
||||
double groundspeedTarget;
|
||||
double groundspeedValue;
|
||||
double airspeedTarget;
|
||||
double airspeedValue;
|
||||
double altitudeTarget;
|
||||
double altitudeValue;
|
||||
|
||||
qreal compassBandWidth;
|
||||
qreal speedScaleHeight;
|
||||
qreal altitudeScaleHeight;
|
||||
|
||||
// Name of the fields to read when an update is received:
|
||||
UAVDataObject *airspeedObj;
|
||||
UAVDataObject *altitudeObj;
|
||||
UAVDataObject *attitudeObj;
|
||||
UAVDataObject *groundspeedObj;
|
||||
UAVDataObject *headingObj;
|
||||
UAVDataObject *gpsObj;
|
||||
UAVDataObject *gcsTelemetryObj;
|
||||
UAVDataObject *gcsBatteryObj;
|
||||
|
||||
// Rotation timer
|
||||
QTimer dialTimer;
|
||||
QTimer skyDialTimer;
|
||||
|
||||
QString satString;
|
||||
QString batString;
|
||||
|
||||
// Flag to check for pfd Error
|
||||
bool pfdError;
|
||||
// Flag to enable better rendering of fonts in OpenGL
|
||||
bool hqFonts;
|
||||
bool beSmooth;
|
||||
};
|
||||
#endif /* PFDGADGETWIDGET_H_ */
|
@ -1,65 +0,0 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
*
|
||||
* @file pfdplugin.h
|
||||
* @author Edouard Lafargue Copyright (C) 2010.
|
||||
* @addtogroup GCSPlugins GCS Plugins
|
||||
* @{
|
||||
* @addtogroup OPMapPlugin Primary Flight Display Plugin
|
||||
* @{
|
||||
* @brief The Primary Flight Display Gadget
|
||||
*****************************************************************************/
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "pfdplugin.h"
|
||||
#include "pfdgadgetfactory.h"
|
||||
#include <QDebug>
|
||||
#include <QtPlugin>
|
||||
#include <QStringList>
|
||||
#include <extensionsystem/pluginmanager.h>
|
||||
|
||||
|
||||
PFDPlugin::PFDPlugin()
|
||||
{
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
PFDPlugin::~PFDPlugin()
|
||||
{
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
bool PFDPlugin::initialize(const QStringList & args, QString *errMsg)
|
||||
{
|
||||
Q_UNUSED(args);
|
||||
Q_UNUSED(errMsg);
|
||||
mf = new PFDGadgetFactory(this);
|
||||
addAutoReleasedObject(mf);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void PFDPlugin::extensionsInitialized()
|
||||
{
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
void PFDPlugin::shutdown()
|
||||
{
|
||||
// Do nothing
|
||||
}
|
||||
Q_EXPORT_PLUGIN(PFDPlugin)
|
@ -1,46 +0,0 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
*
|
||||
* @file pfdplugin.h
|
||||
* @author Edouard Lafargue Copyright (C) 2010.
|
||||
* @addtogroup GCSPlugins GCS Plugins
|
||||
* @{
|
||||
* @addtogroup OPMapPlugin Primary Flight Display Plugin
|
||||
* @{
|
||||
* @brief The Primary Flight Display Gadget
|
||||
*****************************************************************************/
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef PFDPLUGIN_H_
|
||||
#define PFDPLUGIN_H_
|
||||
|
||||
#include <extensionsystem/iplugin.h>
|
||||
|
||||
class PFDGadgetFactory;
|
||||
|
||||
class PFDPlugin : public ExtensionSystem::IPlugin {
|
||||
public:
|
||||
PFDPlugin();
|
||||
~PFDPlugin();
|
||||
|
||||
void extensionsInitialized();
|
||||
bool initialize(const QStringList & arguments, QString *errorString);
|
||||
void shutdown();
|
||||
private:
|
||||
PFDGadgetFactory *mf;
|
||||
};
|
||||
#endif /* PFDPLUGIN_H_ */
|
@ -46,6 +46,10 @@ void PfdQmlGadget::loadConfiguration(IUAVGadgetConfiguration *config)
|
||||
m_widget->setLatitude(m->latitude());
|
||||
m_widget->setLongitude(m->longitude());
|
||||
m_widget->setAltitude(m->altitude());
|
||||
m_widget->setSpeedFactor(m->speedFactor());
|
||||
m_widget->setSpeedUnit(m->speedUnit());
|
||||
m_widget->setAltitudeFactor(m->altitudeFactor());
|
||||
m_widget->setAltitudeUnit(m->altitudeUnit());
|
||||
|
||||
// setting OSGEARTH_CACHE_ONLY seems to work the most reliably
|
||||
// between osgEarth versions I tried
|
||||
|
@ -31,8 +31,18 @@ PfdQmlGadgetConfiguration::PfdQmlGadgetConfiguration(QString classId, QSettings
|
||||
m_latitude(0),
|
||||
m_longitude(0),
|
||||
m_altitude(0),
|
||||
m_cacheOnly(false)
|
||||
m_cacheOnly(false),
|
||||
m_speedFactor(1.0),
|
||||
m_altitudeFactor(1.0)
|
||||
{
|
||||
m_speedMap[1.0] = "m/s";
|
||||
m_speedMap[3.6] = "km/h";
|
||||
m_speedMap[2.2369] = "mph";
|
||||
m_speedMap[1.9438] = "knots";
|
||||
|
||||
m_altitudeMap[1.0] = "m";
|
||||
m_altitudeMap[3.2808] = "ft";
|
||||
|
||||
// if a saved configuration exists load it
|
||||
if (qSettings != 0) {
|
||||
m_qmlFile = qSettings->value("qmlFile").toString();
|
||||
@ -48,6 +58,8 @@ PfdQmlGadgetConfiguration::PfdQmlGadgetConfiguration(QString classId, QSettings
|
||||
m_longitude = qSettings->value("longitude").toDouble();
|
||||
m_altitude = qSettings->value("altitude").toDouble();
|
||||
m_cacheOnly = qSettings->value("cacheOnly").toBool();
|
||||
m_speedFactor = qSettings->value("speedFactor").toDouble();
|
||||
m_altitudeFactor = qSettings->value("altitudeFactor").toDouble();
|
||||
}
|
||||
}
|
||||
|
||||
@ -68,6 +80,8 @@ IUAVGadgetConfiguration *PfdQmlGadgetConfiguration::clone()
|
||||
m->m_longitude = m_longitude;
|
||||
m->m_altitude = m_altitude;
|
||||
m->m_cacheOnly = m_cacheOnly;
|
||||
m->m_speedFactor = m_speedFactor;
|
||||
m->m_altitudeFactor = m_altitudeFactor;
|
||||
|
||||
return m;
|
||||
}
|
||||
@ -91,4 +105,6 @@ void PfdQmlGadgetConfiguration::saveConfig(QSettings *qSettings) const
|
||||
qSettings->setValue("longitude", m_longitude);
|
||||
qSettings->setValue("altitude", m_altitude);
|
||||
qSettings->setValue("cacheOnly", m_cacheOnly);
|
||||
qSettings->setValue("speedFactor", m_speedFactor);
|
||||
qSettings->setValue("altitudeFactor", m_altitudeFactor);
|
||||
}
|
||||
|
@ -18,6 +18,7 @@
|
||||
#define PFDQMLGADGETCONFIGURATION_H
|
||||
|
||||
#include <coreplugin/iuavgadgetconfiguration.h>
|
||||
#include <QMap>
|
||||
|
||||
using namespace Core;
|
||||
|
||||
@ -62,6 +63,14 @@ public:
|
||||
{
|
||||
m_cacheOnly = flag;
|
||||
}
|
||||
void setSpeedFactor(double factor)
|
||||
{
|
||||
m_speedFactor = factor;
|
||||
}
|
||||
void setAltitudeFactor(double factor)
|
||||
{
|
||||
m_altitudeFactor = factor;
|
||||
}
|
||||
|
||||
QString qmlFile() const
|
||||
{
|
||||
@ -99,6 +108,34 @@ public:
|
||||
{
|
||||
return m_cacheOnly;
|
||||
}
|
||||
double speedFactor() const
|
||||
{
|
||||
return m_speedFactor;
|
||||
}
|
||||
double altitudeFactor() const
|
||||
{
|
||||
return m_altitudeFactor;
|
||||
}
|
||||
|
||||
QString speedUnit() const
|
||||
{
|
||||
return m_speedMap[m_speedFactor];
|
||||
}
|
||||
|
||||
QString altitudeUnit() const
|
||||
{
|
||||
return m_altitudeMap[m_altitudeFactor];
|
||||
}
|
||||
|
||||
QMapIterator<double, QString> speedMapIterator()
|
||||
{
|
||||
return QMapIterator<double, QString>(m_speedMap);
|
||||
}
|
||||
|
||||
QMapIterator<double, QString> altitudeMapIterator()
|
||||
{
|
||||
return QMapIterator<double, QString>(m_altitudeMap);
|
||||
}
|
||||
|
||||
void saveConfig(QSettings *settings) const;
|
||||
IUAVGadgetConfiguration *clone();
|
||||
@ -113,6 +150,10 @@ private:
|
||||
double m_longitude;
|
||||
double m_altitude;
|
||||
bool m_cacheOnly;
|
||||
double m_speedFactor;
|
||||
double m_altitudeFactor;
|
||||
QMap<double, QString> m_speedMap;
|
||||
QMap<double, QString> m_altitudeMap;
|
||||
};
|
||||
|
||||
#endif // PfdQmlGADGETCONFIGURATION_H
|
||||
|
@ -22,7 +22,7 @@
|
||||
|
||||
PfdQmlGadgetFactory::PfdQmlGadgetFactory(QObject *parent) :
|
||||
IUAVGadgetFactory(QString("PfdQmlGadget"),
|
||||
tr("PFD (qml)"),
|
||||
tr("PFD"),
|
||||
parent)
|
||||
{}
|
||||
|
||||
|
@ -62,6 +62,21 @@ QWidget *PfdQmlGadgetOptionsPage::createPage(QWidget *parent)
|
||||
options_page->altitude->setText(QString::number(m_config->altitude()));
|
||||
options_page->useOnlyCache->setChecked(m_config->cacheOnly());
|
||||
|
||||
// Setup units combos
|
||||
QMapIterator<double, QString> iter = m_config->speedMapIterator();
|
||||
while (iter.hasNext()) {
|
||||
iter.next();
|
||||
options_page->speedUnitCombo->addItem(iter.value(), iter.key());
|
||||
}
|
||||
options_page->speedUnitCombo->setCurrentIndex(options_page->speedUnitCombo->findData(m_config->speedFactor()));
|
||||
|
||||
iter = m_config->altitudeMapIterator();
|
||||
while (iter.hasNext()) {
|
||||
iter.next();
|
||||
options_page->altUnitCombo->addItem(iter.value(), iter.key());
|
||||
}
|
||||
options_page->altUnitCombo->setCurrentIndex(options_page->altUnitCombo->findData(m_config->altitudeFactor()));
|
||||
|
||||
#ifndef USE_OSG
|
||||
options_page->showTerrain->setChecked(false);
|
||||
options_page->showTerrain->setVisible(false);
|
||||
@ -93,6 +108,9 @@ void PfdQmlGadgetOptionsPage::apply()
|
||||
m_config->setLongitude(options_page->longitude->text().toDouble());
|
||||
m_config->setAltitude(options_page->altitude->text().toDouble());
|
||||
m_config->setCacheOnly(options_page->useOnlyCache->isChecked());
|
||||
|
||||
m_config->setSpeedFactor(options_page->speedUnitCombo->itemData(options_page->speedUnitCombo->currentIndex()).toDouble());
|
||||
m_config->setAltitudeFactor(options_page->altUnitCombo->itemData(options_page->altUnitCombo->currentIndex()).toDouble());
|
||||
}
|
||||
|
||||
void PfdQmlGadgetOptionsPage::finish()
|
||||
|
@ -6,8 +6,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>457</width>
|
||||
<height>436</height>
|
||||
<width>636</width>
|
||||
<height>558</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
@ -19,11 +19,11 @@
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_4">
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="margin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item row="0" column="0">
|
||||
<item>
|
||||
<widget class="QScrollArea" name="scrollArea">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
@ -39,15 +39,15 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>457</width>
|
||||
<height>436</height>
|
||||
<width>636</width>
|
||||
<height>558</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_3">
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<property name="margin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item row="0" column="0">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout" stretch="0,0">
|
||||
<property name="spacing">
|
||||
<number>10</number>
|
||||
@ -77,7 +77,7 @@
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="1" column="0" colspan="2">
|
||||
<item>
|
||||
<widget class="QCheckBox" name="useOpenGL">
|
||||
<property name="text">
|
||||
<string>Use OpenGL</string>
|
||||
@ -87,7 +87,45 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0" colspan="2">
|
||||
<item>
|
||||
<layout class="QFormLayout" name="formLayout_2">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_6">
|
||||
<property name="text">
|
||||
<string>Speed Unit:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_7">
|
||||
<property name="text">
|
||||
<string>Altitude Unit:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QComboBox" name="speedUnitCombo">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>150</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QComboBox" name="altUnitCombo">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>150</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="showTerrain">
|
||||
<property name="title">
|
||||
<string>Show Terrain:</string>
|
||||
@ -223,7 +261,7 @@
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<item>
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
|
@ -39,7 +39,11 @@ PfdQmlGadgetWidget::PfdQmlGadgetWidget(QWidget *parent) :
|
||||
m_actualPositionUsed(false),
|
||||
m_latitude(46.671478),
|
||||
m_longitude(10.158932),
|
||||
m_altitude(2000)
|
||||
m_altitude(2000),
|
||||
m_speedUnit("m/s"),
|
||||
m_speedFactor(1.0),
|
||||
m_altitudeUnit("m"),
|
||||
m_altitudeFactor(1.0)
|
||||
{
|
||||
setMinimumSize(64, 64);
|
||||
setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
|
||||
@ -121,6 +125,38 @@ void PfdQmlGadgetWidget::setTerrainEnabled(bool arg)
|
||||
}
|
||||
}
|
||||
|
||||
void PfdQmlGadgetWidget::setSpeedUnit(QString unit)
|
||||
{
|
||||
if (m_speedUnit != unit) {
|
||||
m_speedUnit = unit;
|
||||
emit speedUnitChanged(unit);
|
||||
}
|
||||
}
|
||||
|
||||
void PfdQmlGadgetWidget::setSpeedFactor(double factor)
|
||||
{
|
||||
if (m_speedFactor != factor) {
|
||||
m_speedFactor = factor;
|
||||
emit speedFactorChanged(factor);
|
||||
}
|
||||
}
|
||||
|
||||
void PfdQmlGadgetWidget::setAltitudeUnit(QString unit)
|
||||
{
|
||||
if (m_altitudeUnit != unit) {
|
||||
m_altitudeUnit = unit;
|
||||
emit altitudeUnitChanged(unit);
|
||||
}
|
||||
}
|
||||
|
||||
void PfdQmlGadgetWidget::setAltitudeFactor(double factor)
|
||||
{
|
||||
if (m_altitudeFactor != factor) {
|
||||
m_altitudeFactor = factor;
|
||||
emit altitudeFactorChanged(factor);
|
||||
}
|
||||
}
|
||||
|
||||
void PfdQmlGadgetWidget::setOpenGLEnabled(bool arg)
|
||||
{
|
||||
if (m_openGLEnabled != arg) {
|
||||
|
@ -26,6 +26,11 @@ class PfdQmlGadgetWidget : public QDeclarativeView {
|
||||
|
||||
Q_PROPERTY(bool actualPositionUsed READ actualPositionUsed WRITE setActualPositionUsed NOTIFY actualPositionUsedChanged)
|
||||
|
||||
Q_PROPERTY(QString speedUnit READ speedUnit WRITE setSpeedUnit NOTIFY speedUnitChanged)
|
||||
Q_PROPERTY(double speedFactor READ speedFactor WRITE setSpeedFactor NOTIFY speedFactorChanged)
|
||||
Q_PROPERTY(QString altitudeUnit READ altitudeUnit WRITE setAltitudeUnit NOTIFY altitudeUnitChanged)
|
||||
Q_PROPERTY(double altitudeFactor READ altitudeFactor WRITE setAltitudeFactor NOTIFY altitudeFactorChanged)
|
||||
|
||||
// pre-defined fallback position
|
||||
Q_PROPERTY(double latitude READ latitude WRITE setLatitude NOTIFY latitudeChanged)
|
||||
Q_PROPERTY(double longitude READ longitude WRITE setLongitude NOTIFY longitudeChanged)
|
||||
@ -45,6 +50,23 @@ public:
|
||||
return m_terrainEnabled && m_openGLEnabled;
|
||||
}
|
||||
|
||||
QString speedUnit() const
|
||||
{
|
||||
return m_speedUnit;
|
||||
}
|
||||
double speedFactor() const
|
||||
{
|
||||
return m_speedFactor;
|
||||
}
|
||||
QString altitudeUnit() const
|
||||
{
|
||||
return m_altitudeUnit;
|
||||
}
|
||||
double altitudeFactor() const
|
||||
{
|
||||
return m_altitudeFactor;
|
||||
}
|
||||
|
||||
bool actualPositionUsed() const
|
||||
{
|
||||
return m_actualPositionUsed;
|
||||
@ -65,6 +87,12 @@ public:
|
||||
public slots:
|
||||
void setEarthFile(QString arg);
|
||||
void setTerrainEnabled(bool arg);
|
||||
|
||||
void setSpeedUnit(QString unit);
|
||||
void setSpeedFactor(double factor);
|
||||
void setAltitudeUnit(QString unit);
|
||||
void setAltitudeFactor(double factor);
|
||||
|
||||
void setOpenGLEnabled(bool arg);
|
||||
|
||||
void setLatitude(double arg);
|
||||
@ -82,6 +110,11 @@ signals:
|
||||
void longitudeChanged(double arg);
|
||||
void altitudeChanged(double arg);
|
||||
|
||||
void speedUnitChanged(QString arg);
|
||||
void speedFactorChanged(double arg);
|
||||
void altitudeUnitChanged(QString arg);
|
||||
void altitudeFactorChanged(double arg);
|
||||
|
||||
private:
|
||||
QString m_qmlFileName;
|
||||
QString m_earthFile;
|
||||
@ -92,6 +125,11 @@ private:
|
||||
double m_latitude;
|
||||
double m_longitude;
|
||||
double m_altitude;
|
||||
|
||||
QString m_speedUnit;
|
||||
double m_speedFactor;
|
||||
QString m_altitudeUnit;
|
||||
double m_altitudeFactor;
|
||||
};
|
||||
|
||||
#endif /* PFDQMLGADGETWIDGET_H_ */
|
||||
|
@ -132,12 +132,6 @@ plugin_gpsdisplay.depends = plugin_coreplugin
|
||||
plugin_gpsdisplay.depends += plugin_uavobjects
|
||||
SUBDIRS += plugin_gpsdisplay
|
||||
|
||||
# Primary Flight Display (PFD) gadget
|
||||
plugin_pfd.subdir = pfd
|
||||
plugin_pfd.depends = plugin_coreplugin
|
||||
plugin_pfd.depends += plugin_uavobjects
|
||||
SUBDIRS += plugin_pfd
|
||||
|
||||
# QML viewer gadget
|
||||
plugin_qmlview.subdir = qmlview
|
||||
plugin_qmlview.depends = plugin_coreplugin
|
||||
@ -150,7 +144,7 @@ plugin_pathactioneditor.depends = plugin_coreplugin
|
||||
plugin_pathactioneditor.depends += plugin_uavobjects
|
||||
SUBDIRS += plugin_pathactioneditor
|
||||
|
||||
# Primary Flight Display (PFD) gadget, QML version
|
||||
# Primary Flight Display (PFD) gadget
|
||||
plugin_pfdqml.subdir = pfdqml
|
||||
plugin_pfdqml.depends = plugin_coreplugin
|
||||
plugin_pfdqml.depends += plugin_uavobjects
|
||||
@ -244,8 +238,3 @@ plugin_setupwizard.depends += plugin_config
|
||||
plugin_setupwizard.depends += plugin_uploader
|
||||
SUBDIRS += plugin_setupwizard
|
||||
|
||||
# Junsi Powerlog plugin
|
||||
#plugin_powerlog.subdir = powerlog
|
||||
#plugin_powerlog.depends = plugin_coreplugin
|
||||
#plugin_powerlog.depends += plugin_rawhid
|
||||
#SUBDIRS += plugin_powerlog
|
||||
|
@ -1,11 +0,0 @@
|
||||
<plugin name="PowerLog" version="1.0.0" compatVersion="1.0.0">
|
||||
<vendor>The OpenPilot Project</vendor>
|
||||
<copyright>(C) 2010 OpenPilot</copyright>
|
||||
<license>The GNU Public License (GPL) Version 3</license>
|
||||
<description>A plugin that downloads the log from a Junsi PowerLog6S to a file</description>
|
||||
<url>http://www.openpilot.org</url>
|
||||
<dependencyList>
|
||||
<dependency name="Core" version="1.0.0"/>
|
||||
<dependency name="opHID" version="1.0.0"/>
|
||||
</dependencyList>
|
||||
</plugin>
|
@ -1,11 +0,0 @@
|
||||
TEMPLATE = lib
|
||||
TARGET = PowerLog
|
||||
DEFINES += POWERLOG_LIBRARY
|
||||
include(../../openpilotgcsplugin.pri)
|
||||
include(powerlog_dependencies.pri)
|
||||
HEADERS += powerlogplugin.h
|
||||
|
||||
SOURCES += powerlogplugin.cpp
|
||||
|
||||
OTHER_FILES += PowerLog.pluginspec
|
||||
|
@ -1,2 +0,0 @@
|
||||
include(../../plugins/coreplugin/coreplugin.pri)
|
||||
include(../../plugins/rawhid/opHID.pri)
|
@ -1,369 +0,0 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
*
|
||||
* @file powerlogplugin.cpp
|
||||
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
|
||||
* @see The GNU Public License (GPL) Version 3
|
||||
* @brief Junsi Powerlog utility Plugin
|
||||
* @addtogroup GCSPlugins GCS Plugins
|
||||
* @{
|
||||
* @addtogroup PowerLog
|
||||
* @{
|
||||
*
|
||||
*****************************************************************************/
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include "powerlogplugin.h"
|
||||
#include "rawhid/usbmonitor.h"
|
||||
#include <QDebug>
|
||||
#include <QtPlugin>
|
||||
#include <QThread>
|
||||
#include <QStringList>
|
||||
#include <QDir>
|
||||
#include <QFileDialog>
|
||||
#include <QList>
|
||||
#include <QErrorMessage>
|
||||
#include <QWriteLocker>
|
||||
#include <QDateTime>
|
||||
|
||||
#include <extensionsystem/pluginmanager.h>
|
||||
#include <QKeySequence>
|
||||
|
||||
|
||||
/**
|
||||
* Sets the file to use for logging and takes the parent plugin
|
||||
* to connect to stop logging signal
|
||||
* @param[in] file File name to write to
|
||||
* @param[in] parent plugin
|
||||
*/
|
||||
bool PowerlogThread::openFile(QString file, PowerlogPlugin *parent)
|
||||
{
|
||||
logFile.setFileName(file);
|
||||
logFile.open(QIODevice::WriteOnly);
|
||||
fileStream.setDevice(&logFile);
|
||||
|
||||
connect(parent, SIGNAL(stopLoggingSignal()), this, SLOT(stopLogging()));
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
/**
|
||||
* Get all logs from Powerlog
|
||||
*/
|
||||
void PowerlogThread::run()
|
||||
{
|
||||
// TODO: pop up a dialog here!
|
||||
|
||||
qDebug() << "Connect a Junsi PowerLog 6S and watch the logging output";
|
||||
opHID_hidapi hidHandle;
|
||||
int numDevices = hidHandle.open(1, 0x0483, 0x5750, 0, 0); // 0xff9c,0x0001);
|
||||
if (numDevices == 0) {
|
||||
numDevices = hidHandle.open(1, 0x0483, 0, 0, 0);
|
||||
}
|
||||
|
||||
qDebug() << numDevices << " device(s) opened";
|
||||
if (numDevices == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
// hidHandle.mytest(0);
|
||||
|
||||
char buf[BUF_LEN];
|
||||
buf[0] = 2;
|
||||
buf[1] = 0;
|
||||
|
||||
fileStream << "Interval,Current,Volt,Cap,Cell1,Cell2,Cell3,Cell4,Cell5,Cell6,RPM,Temp0,Temp1,Temp2,Temp3,Period,Pulse\n";
|
||||
|
||||
while (int received = hidHandle.receive(0, buf, BUF_LEN, 3500)) {
|
||||
ShowInf(buf);
|
||||
fileStream.flush(); // Just to be sure...
|
||||
}
|
||||
|
||||
stopLogging();
|
||||
}
|
||||
|
||||
/**
|
||||
* Pass this command to the correct thread then close the file
|
||||
*/
|
||||
void PowerlogThread::stopLogging()
|
||||
{
|
||||
QWriteLocker locker(&lock);
|
||||
|
||||
fileStream.flush();
|
||||
logFile.close();
|
||||
quit();
|
||||
}
|
||||
|
||||
/**
|
||||
* Formats the content of the buffer we just read and write
|
||||
* to the logfile
|
||||
*/
|
||||
void PowerlogThread::ShowInf(char *pBuf)
|
||||
{
|
||||
POWERLOG_HID_PACK Inf;
|
||||
int i;
|
||||
int Count;
|
||||
|
||||
Count = 0;
|
||||
Inf.Len = pBuf[Count];
|
||||
Count += sizeof(Inf.Len);
|
||||
|
||||
Inf.Type = pBuf[Count];
|
||||
Count += sizeof(Inf.Type);
|
||||
|
||||
Inf.Interval = *((DWORD *)&pBuf[Count]);
|
||||
fileStream << QString::number(Inf.Interval) << ",";
|
||||
|
||||
Count += sizeof(Inf.Interval);
|
||||
|
||||
Inf.LogState = pBuf[Count];
|
||||
Count += sizeof(Inf.LogState);
|
||||
|
||||
if (((Inf.Type == TYPE_DATA_ONLINE) || (Inf.Type == TYPE_DATA_OFFLINE)) && (Inf.Len == 0x29)) { // 0x27
|
||||
Inf.Current = *((SHORT *)&pBuf[Count]);
|
||||
Count += sizeof(Inf.Current);
|
||||
GetShowValue(QString("Current"), Inf.Current, 5, 2);
|
||||
|
||||
Inf.Volt = *((USHORT *)&pBuf[Count]);
|
||||
Count += sizeof(Inf.Volt);
|
||||
GetShowValue(QString("Voltage"), Inf.Volt, 5, 2);
|
||||
|
||||
Inf.Cap = *((DWORD *)&pBuf[Count]);
|
||||
Count += sizeof(Inf.Cap);
|
||||
GetShowValue(QString("Cap"), Inf.Cap, 6, 0);
|
||||
|
||||
for (i = 0; i < 6; i++) {
|
||||
Inf.Cell[i] = *((SHORT *)&pBuf[Count]);
|
||||
Count += sizeof(Inf.Cell[i]);
|
||||
}
|
||||
GetShowValue(QString("Cell 1"), Inf.Cell[0], 5, 3);
|
||||
GetShowValue(QString("Cell 2"), Inf.Cell[1], 5, 3);
|
||||
GetShowValue(QString("Cell 3"), Inf.Cell[2], 5, 3);
|
||||
GetShowValue(QString("Cell 4"), Inf.Cell[3], 5, 3);
|
||||
GetShowValue(QString("Cell 5"), Inf.Cell[4], 5, 3);
|
||||
GetShowValue(QString("Cell 6"), Inf.Cell[5], 5, 3);
|
||||
|
||||
Inf.RPM = *((USHORT *)&pBuf[Count]);
|
||||
Count += sizeof(Inf.RPM);
|
||||
GetShowValue(QString("RPM"), Inf.RPM, 6, 0);
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
Inf.Temp[i] = *((SHORT *)&pBuf[Count]);
|
||||
Count += sizeof(Inf.Temp[i]);
|
||||
}
|
||||
GetShowValue(QString("Int Temp0"), Inf.Temp[0], 4, 1);
|
||||
|
||||
if (Inf.Temp[1] == 0x7fff) {
|
||||
fileStream << "0.0,";
|
||||
} else {
|
||||
GetShowValue(QString("Ext temp1"), Inf.Temp[1], 4, 1);
|
||||
}
|
||||
|
||||
if (Inf.Temp[2] == 0x7fff) {
|
||||
fileStream << "0.0,";
|
||||
} else {
|
||||
GetShowValue(QString("Ext temp2"), Inf.Temp[2], 4, 1);
|
||||
}
|
||||
|
||||
if (Inf.Temp[3] == 0x7fff) {
|
||||
fileStream << "0.0,";
|
||||
} else {
|
||||
GetShowValue(QString("Ext temp3"), Inf.Temp[3], 4, 1);
|
||||
}
|
||||
|
||||
Inf.Period = *((USHORT *)&pBuf[Count]);
|
||||
Count += sizeof(Inf.Period);
|
||||
GetShowValue(QString("Period:"), Inf.Period, 6, 0);
|
||||
|
||||
Inf.Pulse = *((USHORT *)&pBuf[Count]);
|
||||
Count += sizeof(Inf.Pulse);
|
||||
GetShowValue(QString("Pulse:"), Inf.Pulse, 6, 0);
|
||||
|
||||
fileStream << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Formats a numeric value
|
||||
*/
|
||||
void PowerlogThread::GetShowValue(QString label, DWORD Value, WORD Len, WORD Dot)
|
||||
{
|
||||
QString out;
|
||||
|
||||
if (Value < 0) {
|
||||
fileStream << "-";
|
||||
Value = -Value;
|
||||
}
|
||||
|
||||
if (Dot == 1) {
|
||||
fileStream << Value / 10 << "." << Value % 10; // printf("%ld.%01lu",Value/10,Value%10);
|
||||
} else if (Dot == 2) {
|
||||
fileStream << Value / 100 << "." << Value % 100; // printf("%ld.%02lu",Value/100,Value%100);
|
||||
} else if (Dot == 3) {
|
||||
fileStream << Value / 1000 << "." << Value % 1000; // printf("%ld.%03lu",Value/1000,Value%1000);
|
||||
} else if (Dot == 4) {
|
||||
fileStream << Value / 10000 << "." << Value % 10000; // printf("%ld.%04lu",Value/10000,Value%10000);
|
||||
} else {
|
||||
fileStream << Value; // printf("%ld",Value);
|
||||
}
|
||||
fileStream << out << ",";
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************
|
||||
Logging plugin
|
||||
********************************/
|
||||
|
||||
|
||||
PowerlogPlugin::PowerlogPlugin() :
|
||||
devSerialNumber(""),
|
||||
logging(false),
|
||||
loggingThread(NULL)
|
||||
{}
|
||||
|
||||
PowerlogPlugin::~PowerlogPlugin()
|
||||
{}
|
||||
|
||||
/**
|
||||
* Add Powerlog plugin entry to File menu
|
||||
*/
|
||||
bool PowerlogPlugin::initialize(const QStringList & args, QString *errMsg)
|
||||
{
|
||||
Q_UNUSED(args);
|
||||
Q_UNUSED(errMsg);
|
||||
|
||||
|
||||
// Add Menu entry
|
||||
Core::ActionManager *am = Core::ICore::instance()->actionManager();
|
||||
Core::ActionContainer *ac = am->actionContainer(Core::Constants::M_TOOLS);
|
||||
|
||||
// Command to start logging
|
||||
cmd = am->registerAction(new QAction(this),
|
||||
"PowerlogPlugin.Transfer",
|
||||
QList<int>() <<
|
||||
Core::Constants::C_GLOBAL_ID);
|
||||
cmd->action()->setText("Receive from PowerLog6S...");
|
||||
|
||||
ac->menu()->addSeparator();
|
||||
ac->appendGroup("Utilities");
|
||||
ac->addAction(cmd, "Utilities");
|
||||
|
||||
connect(cmd->action(), SIGNAL(triggered(bool)), this, SLOT(receiveLog()));
|
||||
|
||||
// At this stage we know that other plugins we depend upon are
|
||||
// initialized, in prticular the USB Monitor is now running:
|
||||
USBMonitor *mon = USBMonitor::instance();
|
||||
connect(mon, SIGNAL(deviceDiscovered(USBPortInfo)), this, SLOT(devConnected(USBPortInfo)));
|
||||
connect(mon, SIGNAL(deviceRemoved(USBPortInfo)), this, SLOT(devRemoved(USBPortInfo)));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* The action that is triggered by the menu item which opens the
|
||||
* file and begins log reception if successful
|
||||
*/
|
||||
void PowerlogPlugin::receiveLog()
|
||||
{
|
||||
if (logging) {
|
||||
loggingThread->stopLogging();
|
||||
logging = false;
|
||||
cmd->action()->setText("Receive from PowerLog6S...");
|
||||
} else {
|
||||
QString fileName = QFileDialog::getSaveFileName(NULL, tr("Log filename"),
|
||||
tr("PowerLog-%0.csv").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd_hh-mm-ss")),
|
||||
tr("Comma Separated Values (*.csv)"));
|
||||
if (fileName.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
loggingThread = new PowerlogThread();
|
||||
if (loggingThread->openFile(fileName, this)) {
|
||||
loggingThread->start();
|
||||
cmd->action()->setText("Stop PowerLog6S reception");
|
||||
logging = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Device connected, check whether it is a powerlog & act accordingly
|
||||
*/
|
||||
void PowerlogPlugin::devConnected(USBPortInfo port)
|
||||
{
|
||||
if (devSerialNumber.length() > 0) {
|
||||
return;
|
||||
}
|
||||
if ((port.vendorID == 0x0483) && (port.productID == 0x5750)) {
|
||||
devSerialNumber = port.serialNumber;
|
||||
cmd->action()->setEnabled(true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Device Removed, check whether it is a powerlog & act accordingly.
|
||||
As when the device is removed, we don't get the info on the device,
|
||||
we have to list all available remaining devices and check if the serial
|
||||
number of our device is missing...
|
||||
*/
|
||||
void PowerlogPlugin::devRemoved(USBPortInfo port)
|
||||
{
|
||||
bool foundDevice;
|
||||
|
||||
QList<USBPortInfo> ports = USBMonitor::instance()->availableDevices();
|
||||
foreach(USBPortInfo port, ports) {
|
||||
if ((port.vendorID == 0x0483) && (port.productID == 0x5750) &&
|
||||
(devSerialNumber == port.serialNumber)) {
|
||||
foundDevice = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!foundDevice) {
|
||||
devSerialNumber = QString("");
|
||||
cmd->action()->setEnabled(false);
|
||||
// Also stop logging in case we were logging:
|
||||
if (loggingThread) {
|
||||
loggingThread->stopLogging();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void PowerlogPlugin::extensionsInitialized()
|
||||
{
|
||||
cmd->action()->setEnabled(false);
|
||||
QList<USBPortInfo> ports = USBMonitor::instance()->availableDevices();
|
||||
foreach(USBPortInfo port, ports) {
|
||||
if ((port.vendorID == 0x0483) && (port.productID == 0x5750)) {
|
||||
devSerialNumber = port.serialNumber;
|
||||
cmd->action()->setEnabled(true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PowerlogPlugin::shutdown()
|
||||
{
|
||||
// Do nothing
|
||||
}
|
||||
Q_EXPORT_PLUGIN(PowerlogPlugin)
|
||||
|
||||
/**
|
||||
* @}
|
||||
* @}
|
||||
*/
|
@ -1,135 +0,0 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file powerlogplugin.h
|
||||
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
|
||||
* @see The GNU Public License (GPL) Version 3
|
||||
* @addtogroup GCSPlugins GCS Plugins
|
||||
* @{
|
||||
* @addtogroup powerlogplugin
|
||||
* @{
|
||||
*****************************************************************************/
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef POWERLOGPLUGIN_H_
|
||||
#define POWERLOGPLUGIN_H_
|
||||
|
||||
#include <coreplugin/icore.h>
|
||||
#include <coreplugin/coreconstants.h>
|
||||
#include <coreplugin/actionmanager/actionmanager.h>
|
||||
#include <coreplugin/iconnection.h>
|
||||
#include <extensionsystem/iplugin.h>
|
||||
#include "opHID/inc/opHID_usbmon.h"
|
||||
#include "opHID/inc/opHID_hidapi.h"
|
||||
|
||||
#include <QThread>
|
||||
#include <QReadWriteLock>
|
||||
#include <QFile>
|
||||
|
||||
using namespace std;
|
||||
|
||||
typedef unsigned long ULONG; // 4 Bytes
|
||||
typedef short SHORT;
|
||||
typedef unsigned short USHORT; // 2 Bytes
|
||||
typedef unsigned char BYTE; // 1 Byte
|
||||
typedef unsigned short WORD; // 2 Bytes
|
||||
typedef unsigned long DWORD; // 4 Bytes
|
||||
|
||||
|
||||
#define BUF_LEN 64
|
||||
struct POWERLOG_HID_PACK {
|
||||
BYTE Len;
|
||||
BYTE Type;
|
||||
DWORD Interval;
|
||||
BYTE LogState;
|
||||
SHORT Current;
|
||||
USHORT Volt;
|
||||
DWORD Cap;
|
||||
SHORT Cell[6];
|
||||
USHORT RPM;
|
||||
SHORT Temp[4];
|
||||
USHORT Period;
|
||||
USHORT Pulse;
|
||||
};
|
||||
|
||||
enum {
|
||||
TYPE_DATA_ONLINE = 0x10,
|
||||
TYPE_DATA_OFFLINE = 0x11,
|
||||
TYPE_ORDER = 0x20,
|
||||
};
|
||||
|
||||
|
||||
class PowerlogPlugin;
|
||||
|
||||
class PowerlogThread : public QThread {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
bool openFile(QString file, PowerlogPlugin *parent);
|
||||
|
||||
private slots:
|
||||
|
||||
public slots:
|
||||
void stopLogging();
|
||||
|
||||
protected:
|
||||
void run();
|
||||
QReadWriteLock lock;
|
||||
QFile logFile;
|
||||
QTextStream fileStream;
|
||||
|
||||
private:
|
||||
void ShowInf(char *pBuf);
|
||||
void GetShowValue(QString label, DWORD Value, WORD Len, WORD Dot);
|
||||
};
|
||||
|
||||
|
||||
class PowerlogPlugin : public ExtensionSystem::IPlugin {
|
||||
Q_OBJECT
|
||||
|
||||
|
||||
public:
|
||||
PowerlogPlugin();
|
||||
~PowerlogPlugin();
|
||||
|
||||
void extensionsInitialized();
|
||||
bool initialize(const QStringList & arguments, QString *errorString);
|
||||
void shutdown();
|
||||
|
||||
void setPowerlogMenuTitle(QString str);
|
||||
|
||||
|
||||
signals:
|
||||
void stopLoggingSignal(void);
|
||||
|
||||
protected:
|
||||
|
||||
private slots:
|
||||
void receiveLog();
|
||||
void devConnected(USBPortInfo);
|
||||
void devRemoved(USBPortInfo);
|
||||
|
||||
private:
|
||||
Core::Command *cmd;
|
||||
QString devSerialNumber;
|
||||
PowerlogThread *loggingThread;
|
||||
bool logging;
|
||||
};
|
||||
#endif /* POWERLOGPLUGIN_H_ */
|
||||
/**
|
||||
* @}
|
||||
* @}
|
||||
*/
|
@ -13,7 +13,7 @@ VOL_NAME="OpenPilot"
|
||||
rm -f "${TEMP_FILE}"
|
||||
rm -f "${OUT_FILE}"
|
||||
|
||||
# if the file doesn't exist, try to create folder
|
||||
# if an OpenPilot volume is already mounted, unmount it
|
||||
if [ ! -f "/Volumes/${VOL_NAME}" ]
|
||||
then
|
||||
hdiutil unmount "/Volumes/${VOL_NAME}"
|
||||
|
@ -98,11 +98,25 @@
|
||||
!define MUI_ICON "${NSIS_DATA_TREE}\resources\openpilot.ico"
|
||||
!define MUI_HEADERIMAGE
|
||||
!define MUI_HEADERIMAGE_BITMAP "${NSIS_DATA_TREE}\resources\header.bmp"
|
||||
!define MUI_HEADERIMAGE_BITMAP_NOSTRETCH
|
||||
!define MUI_WELCOMEFINISHPAGE_BITMAP "${NSIS_DATA_TREE}\resources\welcome.bmp"
|
||||
!define MUI_WELCOMEFINISHPAGE_BITMAP_NOSTRETCH
|
||||
!define MUI_UNWELCOMEFINISHPAGE_BITMAP "${NSIS_DATA_TREE}\resources\welcome.bmp"
|
||||
!define MUI_UNWELCOMEFINISHPAGE_BITMAP_NOSTRETCH
|
||||
|
||||
!define HEADER_BGCOLOR "0x8C8C8C"
|
||||
!define HEADER_FGCOLOR "0x343434"
|
||||
|
||||
!macro SetHeaderColors un
|
||||
Function ${un}SetHeaderColors
|
||||
GetDlgItem $r3 $HWNDPARENT 1034
|
||||
SetCtlColors $r3 ${HEADER_BGCOLOR} ${HEADER_FGCOLOR}
|
||||
GetDlgItem $r3 $HWNDPARENT 1037
|
||||
SetCtlColors $r3 ${HEADER_BGCOLOR} ${HEADER_FGCOLOR}
|
||||
GetDlgItem $r3 $HWNDPARENT 1038
|
||||
SetCtlColors $r3 ${HEADER_BGCOLOR} ${HEADER_FGCOLOR}
|
||||
FunctionEnd
|
||||
!macroend
|
||||
|
||||
!insertmacro SetHeaderColors ""
|
||||
!insertmacro SetHeaderColors "un."
|
||||
|
||||
;--------------------------------
|
||||
; Language selection dialog settings
|
||||
@ -122,6 +136,8 @@
|
||||
;--------------------------------
|
||||
; Pages
|
||||
|
||||
!define MUI_PAGE_CUSTOMFUNCTION_PRE "SetHeaderColors"
|
||||
|
||||
!insertmacro MUI_PAGE_WELCOME
|
||||
!insertmacro MUI_PAGE_LICENSE "$(LicenseFile)"
|
||||
!insertmacro MUI_PAGE_COMPONENTS
|
||||
@ -129,6 +145,8 @@
|
||||
!insertmacro MUI_PAGE_INSTFILES
|
||||
!insertmacro MUI_PAGE_FINISH
|
||||
|
||||
!define MUI_PAGE_CUSTOMFUNCTION_PRE "un.SetHeaderColors"
|
||||
|
||||
!insertmacro MUI_UNPAGE_WELCOME
|
||||
!insertmacro MUI_UNPAGE_CONFIRM
|
||||
!insertmacro MUI_UNPAGE_COMPONENTS
|
||||
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 151 KiB After Width: | Height: | Size: 151 KiB |
@ -1,9 +1,9 @@
|
||||
<xml>
|
||||
<object name="AltitudeHoldSettings" singleinstance="true" settings="true">
|
||||
<description>Settings for the @ref AltitudeHold module</description>
|
||||
<field name="Kp" units="throttle/m" type="float" elements="1" defaultvalue="0.03"/>
|
||||
<field name="Ki" units="throttle/m" type="float" elements="1" defaultvalue="0.00"/>
|
||||
<field name="Kd" units="throttle/m" type="float" elements="1" defaultvalue="0.03"/>
|
||||
<field name="Kp" units="throttle/m" type="float" elements="1" defaultvalue="0.0001"/>
|
||||
<field name="Ki" units="throttle/m" type="float" elements="1" defaultvalue="0"/>
|
||||
<field name="Kd" units="throttle/m" type="float" elements="1" defaultvalue="0.05"/>
|
||||
<field name="Ka" units="throttle/(m/s^2)" type="float" elements="1" defaultvalue="0.005"/>
|
||||
<field name="PressureNoise" units="m" type="float" elements="1" defaultvalue="0.4"/>
|
||||
<field name="AccelNoise" units="m/s^2" type="float" elements="1" defaultvalue="5"/>
|
||||
|
@ -4,7 +4,7 @@
|
||||
<field name="Armed" units="" type="enum" elements="1" options="Disarmed,Arming,Armed" defaultvalue="Disarmed"/>
|
||||
|
||||
<!-- Note these enumerated values should be the same as ManualControlSettings -->
|
||||
<field name="FlightMode" units="" type="enum" elements="1" options="Manual,Stabilized1,Stabilized2,Stabilized3,Autotune,AltitudeHold,VelocityControl,PositionHold,ReturnToBase,Land,PathPlanner,POI"/>
|
||||
<field name="FlightMode" units="" type="enum" elements="1" options="Manual,Stabilized1,Stabilized2,Stabilized3,Autotune,AltitudeHold,AltitudeVario,VelocityControl,PositionHold,ReturnToBase,Land,PathPlanner,POI"/>
|
||||
|
||||
<access gcs="readwrite" flight="readwrite"/>
|
||||
<telemetrygcs acked="false" updatemode="manual" period="0"/>
|
||||
|
@ -43,31 +43,31 @@
|
||||
units=""
|
||||
type="enum"
|
||||
elements="6"
|
||||
options="Manual,Stabilized1,Stabilized2,Stabilized3,Autotune,AltitudeHold,VelocityControl,PositionHold,ReturnToBase,Land,PathPlanner,POI"
|
||||
options="Manual,Stabilized1,Stabilized2,Stabilized3,Autotune,AltitudeHold,AltitudeVario,VelocityControl,PositionHold,ReturnToBase,Land,PathPlanner,POI"
|
||||
defaultvalue="Stabilized1,Stabilized2,Stabilized3,AltitudeHold,PositionHold,Manual"
|
||||
limits="\
|
||||
%0401NE:Autotune:AltitudeHold:VelocityControl:PositionHold:ReturnToBase:Land:PathPlanner:POI,\
|
||||
%0402NE:Autotune:AltitudeHold:VelocityControl:PositionHold:ReturnToBase:Land:PathPlanner:POI,\
|
||||
%0401NE:Autotune:AltitudeVario:AltitudeHold:VelocityControl:PositionHold:ReturnToBase:Land:PathPlanner:POI,\
|
||||
%0402NE:Autotune:AltitudeVario:AltitudeHold:VelocityControl:PositionHold:ReturnToBase:Land:PathPlanner:POI,\
|
||||
%0903NE:Autotune:VelocityControl:PositionHold:ReturnToBase:Land:PathPlanner:POI;\
|
||||
\
|
||||
%0401NE:Autotune:AltitudeHold:VelocityControl:PositionHold:ReturnToBase:Land:PathPlanner:POI,\
|
||||
%0402NE:Autotune:AltitudeHold:VelocityControl:PositionHold:ReturnToBase:Land:PathPlanner:POI,\
|
||||
%0401NE:Autotune:AltitudeVario:AltitudeHold:VelocityControl:PositionHold:ReturnToBase:Land:PathPlanner:POI,\
|
||||
%0402NE:Autotune:AltitudeVario:AltitudeHold:VelocityControl:PositionHold:ReturnToBase:Land:PathPlanner:POI,\
|
||||
%0903NE:Autotune:VelocityControl:PositionHold:ReturnToBase:Land:PathPlanner:POI;\
|
||||
\
|
||||
%0401NE:Autotune:AltitudeHold:VelocityControl:PositionHold:ReturnToBase:Land:PathPlanner:POI,\
|
||||
%0402NE:Autotune:AltitudeHold:VelocityControl:PositionHold:ReturnToBase:Land:PathPlanner:POI,\
|
||||
%0401NE:Autotune:AltitudeVario:AltitudeHold:VelocityControl:PositionHold:ReturnToBase:Land:PathPlanner:POI,\
|
||||
%0402NE:Autotune:AltitudeVario:AltitudeHold:VelocityControl:PositionHold:ReturnToBase:Land:PathPlanner:POI,\
|
||||
%0903NE:Autotune:VelocityControl:PositionHold:ReturnToBase:Land:PathPlanner:POI;\
|
||||
\
|
||||
%0401NE:Autotune:AltitudeHold:VelocityControl:PositionHold:ReturnToBase:Land:PathPlanner:POI,\
|
||||
%0402NE:Autotune:AltitudeHold:VelocityControl:PositionHold:ReturnToBase:Land:PathPlanner:POI,\
|
||||
%0401NE:Autotune:AltitudeVario:AltitudeHold:VelocityControl:PositionHold:ReturnToBase:Land:PathPlanner:POI,\
|
||||
%0402NE:Autotune:AltitudeVario:AltitudeHold:VelocityControl:PositionHold:ReturnToBase:Land:PathPlanner:POI,\
|
||||
%0903NE:Autotune:VelocityControl:PositionHold:ReturnToBase:Land:PathPlanner:POI;\
|
||||
\
|
||||
%0401NE:Autotune:AltitudeHold:VelocityControl:PositionHold:ReturnToBase:Land:PathPlanner:POI,\
|
||||
%0402NE:Autotune:AltitudeHold:VelocityControl:PositionHold:ReturnToBase:Land:PathPlanner:POI,\
|
||||
%0401NE:Autotune:AltitudeVario:AltitudeHold:VelocityControl:PositionHold:ReturnToBase:Land:PathPlanner:POI,\
|
||||
%0402NE:Autotune:AltitudeVario:AltitudeHold:VelocityControl:PositionHold:ReturnToBase:Land:PathPlanner:POI,\
|
||||
%0903NE:Autotune:VelocityControl:PositionHold:ReturnToBase:Land:PathPlanner:POI;\
|
||||
\
|
||||
%0401NE:Autotune:AltitudeHold:VelocityControl:PositionHold:ReturnToBase:Land:PathPlanner:POI,\
|
||||
%0402NE:Autotune:AltitudeHold:VelocityControl:PositionHold:ReturnToBase:Land:PathPlanner:POI,\
|
||||
%0401NE:Autotune:AltitudeVario:AltitudeHold:VelocityControl:PositionHold:ReturnToBase:Land:PathPlanner:POI,\
|
||||
%0402NE:Autotune:AltitudeVario:AltitudeHold:VelocityControl:PositionHold:ReturnToBase:Land:PathPlanner:POI,\
|
||||
%0903NE:Autotune:VelocityControl:PositionHold:ReturnToBase:Land:PathPlanner:POI"/>
|
||||
|
||||
<field name="ArmedTimeout" units="ms" type="uint16" elements="1" defaultvalue="30000"/>
|
||||
|