1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-01-19 04:52:12 +01:00

Merge branch 'next' of bitbucket.org:librepilot/librepilot into filnet/LP-29_osgearth_integration

Conflicts:
	artwork/3D Model/boards/coptercontrol/coptercontrol.3ds
	artwork/3D Model/multi/easy_quad/easy_quad_x.3ds
	artwork/3D Model/multi/mikrokopter/mk_l4-me.3ds
	artwork/3D Model/multi/ricoo/ricoo.3ds
	artwork/3D Model/multi/test_quad/test_quad_x.3ds
	ground/gcs/src/share/models/boards/coptercontrol/coptercontrol.3ds
	ground/gcs/src/share/models/multi/easy_quad/easy_quad_x.3ds
	ground/gcs/src/share/models/multi/mikrokopter/mk_l4-me.3ds
	ground/gcs/src/share/models/multi/ricoo/ricoo.3ds
	ground/gcs/src/share/models/multi/test_quad/test_quad_x.3ds
This commit is contained in:
Philippe Renon 2015-09-19 14:42:38 +02:00
commit 18725597f4
26 changed files with 1818 additions and 654 deletions

View File

@ -93,7 +93,7 @@ $(foreach var, $(SANITIZE_DEPRECATED_VARS), $(eval $(call SANITIZE_VAR,$(var),de
# Make sure this isn't being run as root unless installing (no whoami on Windows, but that is ok here)
ifeq ($(shell whoami 2>/dev/null),root)
ifeq ($(filter install,$(MAKECMDGOALS)),)
ifeq ($(filter install uninstall,$(MAKECMDGOALS)),)
ifndef FAKEROOTKEY
$(error You should not be running this as root)
endif

View File

@ -10,7 +10,8 @@
* pass it to ManualControl
*
* @file receiver.c
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2014.
* @author The LibrePilot Project, http://www.librepilot.org Copyright (C) 2015.
* The OpenPilot Team, http://www.openpilot.org Copyright (C) 2014.
* @brief Receiver module. Handles safety R/C link and flight mode.
*
* @see The GNU Public License (GPL) Version 3
@ -206,6 +207,7 @@ static void receiverTask(__attribute__((unused)) void *parameters)
// this includes not even registering it if not used
AccessoryDesiredCreateInstance();
AccessoryDesiredCreateInstance();
AccessoryDesiredCreateInstance();
// Whenever the configuration changes, make sure it is safe to fly
@ -377,6 +379,10 @@ static void receiverTask(__attribute__((unused)) void *parameters)
valid_input_detected &= validInputRange(settings.ChannelMin.Accessory2,
settings.ChannelMax.Accessory2, cmd.Channel[MANUALCONTROLSETTINGS_CHANNELGROUPS_ACCESSORY2]);
}
if (settings.ChannelGroups.Accessory3 != MANUALCONTROLSETTINGS_CHANNELGROUPS_NONE) {
valid_input_detected &= validInputRange(settings.ChannelMin.Accessory3,
settings.ChannelMax.Accessory3, cmd.Channel[MANUALCONTROLSETTINGS_CHANNELGROUPS_ACCESSORY3]);
}
// Implement hysteresis loop on connection status
if (valid_input_detected && (++connected_count > 10)) {
@ -436,6 +442,13 @@ static void receiverTask(__attribute__((unused)) void *parameters)
AlarmsSet(SYSTEMALARMS_ALARM_RECEIVER, SYSTEMALARMS_ALARM_WARNING);
}
}
// Set Accessory 3
if (settings.ChannelGroups.Accessory3 != MANUALCONTROLSETTINGS_CHANNELGROUPS_NONE) {
accessory.AccessoryVal = settings.FailsafeChannel.Accessory3;
if (AccessoryDesiredInstSet(3, &accessory) != 0) {
AlarmsSet(SYSTEMALARMS_ALARM_RECEIVER, SYSTEMALARMS_ALARM_WARNING);
}
}
} else if (valid_input_detected) {
AlarmsClear(SYSTEMALARMS_ALARM_RECEIVER);
@ -545,6 +558,17 @@ static void receiverTask(__attribute__((unused)) void *parameters)
AlarmsSet(SYSTEMALARMS_ALARM_RECEIVER, SYSTEMALARMS_ALARM_WARNING);
}
}
// Set Accessory 3
if (settings.ChannelGroups.Accessory3 != MANUALCONTROLSETTINGS_CHANNELGROUPS_NONE) {
accessory.AccessoryVal = scaledChannel[MANUALCONTROLSETTINGS_CHANNELGROUPS_ACCESSORY3];
#ifdef USE_INPUT_LPF
applyLPF(&accessory.AccessoryVal, MANUALCONTROLSETTINGS_RESPONSETIME_ACCESSORY3, &settings.ResponseTime, settings.Deadband, dT);
#endif
if (AccessoryDesiredInstSet(3, &accessory) != 0) {
AlarmsSet(SYSTEMALARMS_ALARM_RECEIVER, SYSTEMALARMS_ALARM_WARNING);
}
}
}
// Update cmd object

View File

@ -598,7 +598,8 @@ static bool PIOS_MPU6000_HandleData()
queue_data->sample[0].z = -1 - (GET_SENSOR_DATA(mpu6000_data, Accel_Z));
queue_data->sample[1].z = -1 - (GET_SENSOR_DATA(mpu6000_data, Gyro_Z));
const int16_t temp = GET_SENSOR_DATA(mpu6000_data, Temperature);
queue_data->temperature = 3500 + ((float)(temp + 512)) * (1.0f / 3.4f);
// Temperature in degrees C = (TEMP_OUT Register Value as a signed quantity)/340 + 36.53
queue_data->temperature = 3653 + (temp * 100) / 340;
BaseType_t higherPriorityTaskWoken;
xQueueSendToBackFromISR(dev->queue, (void *)queue_data, &higherPriorityTaskWoken);

View File

@ -532,6 +532,13 @@ Typical value is 50% for + or X configuration on quads.</string>
<property name="leftMargin">
<number>0</number>
</property>
<item row="2" column="2">
<widget class="QComboBox" name="rcOutputCurveBox2">
<property name="toolTip">
<string>Select output curve for Accessory1 RcInput</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="rcOutputChannelBox1">
<property name="sizePolicy">
@ -752,13 +759,6 @@ margin:1px;</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QComboBox" name="rcOutputCurveBox2">
<property name="toolTip">
<string>Select output curve for Accessory1 RcInput</string>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QComboBox" name="rcOutputCurveBox3">
<property name="toolTip">
@ -766,6 +766,55 @@ margin:1px;</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_11">
<property name="minimumSize">
<size>
<width>90</width>
<height>0</height>
</size>
</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;
font: bold 12px;
margin:1px;</string>
</property>
<property name="text">
<string>Accessory3</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QComboBox" name="rcOutputChannelBox4">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>Select output channel for Accessory3 RcInput</string>
</property>
</widget>
</item>
<item row="4" column="2">
<widget class="QComboBox" name="rcOutputCurveBox4">
<property name="toolTip">
<string>Select output curve for Accessory3 RcInput</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="0" column="4">
@ -805,6 +854,9 @@ margin:1px;</string>
<property name="fieldGrowthPolicy">
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
</property>
<property name="formAlignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
<property name="verticalSpacing">
<number>6</number>
</property>
@ -857,6 +909,12 @@ margin:1px;</string>
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Assign your motor output channels using the drawing above as a reference. Respect propeller rotation.</string>
</property>
@ -881,6 +939,12 @@ margin:1px;</string>
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Assign your motor output channels using the drawing above as a reference. Respect propeller rotation.</string>
</property>
@ -905,6 +969,12 @@ margin:1px;</string>
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Assign your motor output channels using the drawing above as a reference. Respect propeller rotation.</string>
</property>
@ -952,6 +1022,9 @@ margin:1px;</string>
<property name="fieldGrowthPolicy">
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
</property>
<property name="formAlignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
<property name="verticalSpacing">
<number>6</number>
</property>
@ -971,6 +1044,12 @@ margin:1px;</string>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="multiMotorChannelBox1">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Assign your motor output channels using the drawing above as a reference. Respect propeller rotation.</string>
</property>
@ -992,6 +1071,12 @@ margin:1px;</string>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="multiMotorChannelBox2">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Assign your motor output channels using the drawing above as a reference. Respect propeller rotation.</string>
</property>
@ -1013,6 +1098,12 @@ margin:1px;</string>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="multiMotorChannelBox3">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Assign your motor output channels using the drawing above as a reference. Respect propeller rotation.</string>
</property>
@ -1034,6 +1125,12 @@ margin:1px;</string>
</item>
<item row="3" column="1">
<widget class="QComboBox" name="multiMotorChannelBox4">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Assign your motor output channels using the drawing above as a reference. Respect propeller rotation.</string>
</property>

View File

@ -2,7 +2,8 @@
******************************************************************************
*
* @file configcustomwidget.cpp
* @author E. Lafargue & The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012.
* @author The LibrePilot Project, http://www.librepilot.org Copyright (C) 2015.
* E. Lafargue & The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012.
* @addtogroup GCSPlugins GCS Plugins
* @{
* @addtogroup ConfigPlugin Config Plugin
@ -123,6 +124,24 @@ QStringList ConfigCustomWidget::getChannelDescriptions()
if (custom.Servo8 > 0 && custom.Servo8 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.Servo8 - 1] = QString("Servo8");
}
if (custom.Accessory0 > 0 && custom.Accessory0 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.Accessory0 - 1] = QString("Accessory0");
}
if (custom.Accessory1 > 0 && custom.Accessory1 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.Accessory1 - 1] = QString("Accessory1");
}
if (custom.Accessory2 > 0 && custom.Accessory2 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.Accessory2 - 1] = QString("Accessory2");
}
if (custom.Accessory3 > 0 && custom.Accessory3 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.Accessory3 - 1] = QString("Accessory3");
}
if (custom.Accessory4 > 0 && custom.Accessory4 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.Accessory4 - 1] = QString("Accessory4");
}
if (custom.Accessory5 > 0 && custom.Accessory5 <= VehicleConfig::CHANNEL_NUMELEM) {
channelDesc[custom.Accessory5 - 1] = QString("Accessory5");
}
return channelDesc;
}
@ -174,30 +193,36 @@ void ConfigCustomWidget::registerWidgets(ConfigTaskWidget &parent)
void ConfigCustomWidget::resetActuators(GUIConfigDataUnion *configData)
{
configData->custom.Motor1 = 0;
configData->custom.Motor2 = 0;
configData->custom.Motor3 = 0;
configData->custom.Motor4 = 0;
configData->custom.Motor5 = 0;
configData->custom.Motor6 = 0;
configData->custom.Motor7 = 0;
configData->custom.Motor8 = 0;
configData->custom.RevMotor1 = 0;
configData->custom.RevMotor2 = 0;
configData->custom.RevMotor3 = 0;
configData->custom.RevMotor4 = 0;
configData->custom.RevMotor5 = 0;
configData->custom.RevMotor6 = 0;
configData->custom.RevMotor7 = 0;
configData->custom.RevMotor8 = 0;
configData->custom.Servo1 = 0;
configData->custom.Servo2 = 0;
configData->custom.Servo3 = 0;
configData->custom.Servo4 = 0;
configData->custom.Servo5 = 0;
configData->custom.Servo6 = 0;
configData->custom.Servo7 = 0;
configData->custom.Servo8 = 0;
configData->custom.Motor1 = 0;
configData->custom.Motor2 = 0;
configData->custom.Motor3 = 0;
configData->custom.Motor4 = 0;
configData->custom.Motor5 = 0;
configData->custom.Motor6 = 0;
configData->custom.Motor7 = 0;
configData->custom.Motor8 = 0;
configData->custom.RevMotor1 = 0;
configData->custom.RevMotor2 = 0;
configData->custom.RevMotor3 = 0;
configData->custom.RevMotor4 = 0;
configData->custom.RevMotor5 = 0;
configData->custom.RevMotor6 = 0;
configData->custom.RevMotor7 = 0;
configData->custom.RevMotor8 = 0;
configData->custom.Servo1 = 0;
configData->custom.Servo2 = 0;
configData->custom.Servo3 = 0;
configData->custom.Servo4 = 0;
configData->custom.Servo5 = 0;
configData->custom.Servo6 = 0;
configData->custom.Servo7 = 0;
configData->custom.Servo8 = 0;
configData->custom.Accessory0 = 0;
configData->custom.Accessory1 = 0;
configData->custom.Accessory2 = 0;
configData->custom.Accessory3 = 0;
configData->custom.Accessory4 = 0;
configData->custom.Accessory5 = 0;
}
/**
@ -377,16 +402,22 @@ QString ConfigCustomWidget::updateConfigObjectsFromWidgets()
setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_CAMERAYAW);
} else if (q->currentText() == "Accessory0") {
setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_ACCESSORY0);
configData.custom.Accessory0 = channel + 1;
} else if (q->currentText() == "Accessory1") {
setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_ACCESSORY1);
configData.custom.Accessory1 = channel + 1;
} else if (q->currentText() == "Accessory2") {
setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_ACCESSORY2);
configData.custom.Accessory2 = channel + 1;
} else if (q->currentText() == "Accessory3") {
setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_ACCESSORY3);
configData.custom.Accessory3 = channel + 1;
} else if (q->currentText() == "Accessory4") {
setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_ACCESSORY4);
configData.custom.Accessory4 = channel + 1;
} else if (q->currentText() == "Accessory5") {
setMixerType(mixer, channel, VehicleConfig::MIXERTYPE_ACCESSORY5);
configData.custom.Accessory5 = channel + 1;
}
setMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_THROTTLECURVE1,
m_aircraft->customMixerTable->item(1, channel)->text().toDouble());

View File

@ -2,7 +2,8 @@
******************************************************************************
*
* @file configmultirotorwidget.cpp
* @author E. Lafargue & The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012.
* @author The LibrePilot Project, http://www.librepilot.org Copyright (C) 2015.
* E. Lafargue & The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012.
* @addtogroup GCSPlugins GCS Plugins
* @{
* @addtogroup ConfigPlugin Config Plugin
@ -120,6 +121,9 @@ QStringList ConfigMultiRotorWidget::getChannelDescriptions()
if (multi.Accessory2 > 0 && multi.Accessory2 <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) {
channelDesc[multi.Accessory2 - 1] = QString("Accessory2");
}
if (multi.Accessory3 > 0 && multi.Accessory3 <= ConfigMultiRotorWidget::CHANNEL_NUMELEM) {
channelDesc[multi.Accessory3 - 1] = QString("Accessory3");
}
return channelDesc;
}
@ -136,6 +140,7 @@ ConfigMultiRotorWidget::ConfigMultiRotorWidget(QWidget *parent) :
m_aircraft->rcOutputCurveBox1->addItems(mixerCurveList);
m_aircraft->rcOutputCurveBox2->addItems(mixerCurveList);
m_aircraft->rcOutputCurveBox3->addItems(mixerCurveList);
m_aircraft->rcOutputCurveBox4->addItems(mixerCurveList);
// Setup the Multirotor picture in the Quad settings interface
m_aircraft->quadShape->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
@ -332,9 +337,11 @@ void ConfigMultiRotorWidget::registerWidgets(ConfigTaskWidget &parent)
parent.addWidget(m_aircraft->rcOutputChannelBox1);
parent.addWidget(m_aircraft->rcOutputChannelBox2);
parent.addWidget(m_aircraft->rcOutputChannelBox3);
parent.addWidget(m_aircraft->rcOutputChannelBox4);
parent.addWidget(m_aircraft->rcOutputCurveBox1);
parent.addWidget(m_aircraft->rcOutputCurveBox2);
parent.addWidget(m_aircraft->rcOutputCurveBox3);
parent.addWidget(m_aircraft->rcOutputCurveBox4);
}
void ConfigMultiRotorWidget::resetActuators(GUIConfigDataUnion *configData)
@ -363,6 +370,7 @@ void ConfigMultiRotorWidget::resetRcOutputs(GUIConfigDataUnion *configData)
configData->multi.Accessory0 = 0;
configData->multi.Accessory1 = 0;
configData->multi.Accessory2 = 0;
configData->multi.Accessory3 = 0;
}
void ConfigMultiRotorWidget::resetMixers()
@ -386,6 +394,7 @@ void ConfigMultiRotorWidget::updateRcCurvesUsed()
setComboCurrentIndex(m_aircraft->rcOutputCurveBox1, VehicleConfig::MIXER_THROTTLECURVE1);
setComboCurrentIndex(m_aircraft->rcOutputCurveBox2, VehicleConfig::MIXER_THROTTLECURVE1);
setComboCurrentIndex(m_aircraft->rcOutputCurveBox3, VehicleConfig::MIXER_THROTTLECURVE1);
setComboCurrentIndex(m_aircraft->rcOutputCurveBox4, VehicleConfig::MIXER_THROTTLECURVE1);
for (int channel = 0; channel < (int)ConfigMultiRotorWidget::CHANNEL_NUMELEM; channel++) {
QString mixerType = getMixerType(mixer, channel);
@ -395,6 +404,8 @@ void ConfigMultiRotorWidget::updateRcCurvesUsed()
setComboCurrentIndex(m_aircraft->rcOutputCurveBox2, VehicleConfig::MIXER_THROTTLECURVE2);
} else if (mixerType == "Accessory2" && getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_THROTTLECURVE2)) {
setComboCurrentIndex(m_aircraft->rcOutputCurveBox3, VehicleConfig::MIXER_THROTTLECURVE2);
} else if (mixerType == "Accessory3" && getMixerVectorValue(mixer, channel, VehicleConfig::MIXERVECTOR_THROTTLECURVE2)) {
setComboCurrentIndex(m_aircraft->rcOutputCurveBox4, VehicleConfig::MIXER_THROTTLECURVE2);
}
}
}
@ -511,6 +522,7 @@ void ConfigMultiRotorWidget::refreshWidgetsValues(QString frameType)
setComboCurrentIndex(m_aircraft->rcOutputChannelBox1, multi.Accessory0);
setComboCurrentIndex(m_aircraft->rcOutputChannelBox2, multi.Accessory1);
setComboCurrentIndex(m_aircraft->rcOutputChannelBox3, multi.Accessory2);
setComboCurrentIndex(m_aircraft->rcOutputChannelBox4, multi.Accessory3);
updateRcCurvesUsed();
@ -537,7 +549,7 @@ QString ConfigMultiRotorWidget::updateConfigObjectsFromWidgets()
resetMixers();
QList<QString> rcOutputList;
rcOutputList << "Accessory0" << "Accessory1" << "Accessory2";
rcOutputList << "Accessory0" << "Accessory1" << "Accessory2" << "Accessory3";
setupRcOutputs(rcOutputList);
// Curve is also common to all quads:
@ -880,7 +892,8 @@ void ConfigMultiRotorWidget::setupQuadMotor(int channel, double pitch, double ro
void ConfigMultiRotorWidget::setupRcOutputs(QList<QString> rcOutputList)
{
QList<QComboBox *> rcList;
rcList << m_aircraft->rcOutputChannelBox1 << m_aircraft->rcOutputChannelBox2 << m_aircraft->rcOutputChannelBox3;
rcList << m_aircraft->rcOutputChannelBox1 << m_aircraft->rcOutputChannelBox2
<< m_aircraft->rcOutputChannelBox3 << m_aircraft->rcOutputChannelBox4;
GUIConfigDataUnion configData = getConfigData();
resetRcOutputs(&configData);
@ -891,6 +904,7 @@ void ConfigMultiRotorWidget::setupRcOutputs(QList<QString> rcOutputList)
int curveAccessory0 = m_aircraft->rcOutputCurveBox1->currentIndex();
int curveAccessory1 = m_aircraft->rcOutputCurveBox2->currentIndex();
int curveAccessory2 = m_aircraft->rcOutputCurveBox3->currentIndex();
int curveAccessory3 = m_aircraft->rcOutputCurveBox4->currentIndex();
foreach(QString rc_output, rcOutputList) {
int index = rcList.takeFirst()->currentIndex();
@ -925,6 +939,16 @@ void ConfigMultiRotorWidget::setupRcOutputs(QList<QString> rcOutputList)
setMixerVectorValue(mixer, index - 1, VehicleConfig::MIXERVECTOR_THROTTLECURVE1, 127);
}
}
} else if (rc_output == QString("Accessory3")) {
configData.multi.Accessory3 = index;
if (index) {
setMixerType(mixer, index - 1, VehicleConfig::MIXERTYPE_ACCESSORY3);
if (curveAccessory3) {
setMixerVectorValue(mixer, index - 1, VehicleConfig::MIXERVECTOR_THROTTLECURVE2, 127);
} else {
setMixerVectorValue(mixer, index - 1, VehicleConfig::MIXERVECTOR_THROTTLECURVE1, 127);
}
}
}
}
setConfigData(configData);
@ -1196,7 +1220,7 @@ bool ConfigMultiRotorWidget::throwConfigError(int numMotors)
}
// Iterate through all instances of rcOutputChannelBox
for (int i = 0; i < 3; i++) {
for (int i = 0; i < 5; i++) {
// Find widgets with his name "rcOutputChannelBox.x", where x is an integer
QComboBox *combobox = this->findChild<QComboBox *>("rcOutputChannelBox" + QString::number(i + 1));
if (combobox) {

View File

@ -56,7 +56,8 @@ typedef struct {
uint Accessory0 : 4;
uint Accessory1 : 4;
uint Accessory2 : 4;
quint32 padding : 16; // 96 bits
uint Accessory3 : 4;
quint32 padding : 12; // 96 bits
quint32 padding1; // 128 bits
} __attribute__((packed)) multiGUISettingsStruct;
@ -106,31 +107,37 @@ typedef struct {
} __attribute__((packed)) groundGUISettingsStruct;
typedef struct {
uint Motor1 : 4;
uint Motor2 : 4;
uint Motor3 : 4;
uint Motor4 : 4;
uint Motor5 : 4;
uint Motor6 : 4;
uint Motor7 : 4;
uint Motor8 : 4; // 32 bits
uint Servo1 : 4;
uint Servo2 : 4;
uint Servo3 : 4;
uint Servo4 : 4;
uint Servo5 : 4;
uint Servo6 : 4;
uint Servo7 : 4;
uint Servo8 : 4; // 64 bits
uint RevMotor1 : 4;
uint RevMotor2 : 4;
uint RevMotor3 : 4;
uint RevMotor4 : 4;
uint RevMotor5 : 4;
uint RevMotor6 : 4;
uint RevMotor7 : 4;
uint RevMotor8 : 4; // 96 bits
quint32 padding; // 128 bits
uint Motor1 : 4;
uint Motor2 : 4;
uint Motor3 : 4;
uint Motor4 : 4;
uint Motor5 : 4;
uint Motor6 : 4;
uint Motor7 : 4;
uint Motor8 : 4; // 32 bits
uint Servo1 : 4;
uint Servo2 : 4;
uint Servo3 : 4;
uint Servo4 : 4;
uint Servo5 : 4;
uint Servo6 : 4;
uint Servo7 : 4;
uint Servo8 : 4; // 64 bits
uint RevMotor1 : 4;
uint RevMotor2 : 4;
uint RevMotor3 : 4;
uint RevMotor4 : 4;
uint RevMotor5 : 4;
uint RevMotor6 : 4;
uint RevMotor7 : 4;
uint RevMotor8 : 4; // 96 bits
uint Accessory0 : 4;
uint Accessory1 : 4;
uint Accessory2 : 4;
uint Accessory3 : 4;
uint Accessory4 : 4;
uint Accessory5 : 4;
uint padding : 8; // 128 bits
} __attribute__((packed)) customGUISettingsStruct;

View File

@ -65,7 +65,8 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) :
nextDelayedLatestActivityTick(0),
accessoryDesiredObj0(NULL),
accessoryDesiredObj1(NULL),
accessoryDesiredObj2(NULL)
accessoryDesiredObj2(NULL),
accessoryDesiredObj3(NULL)
{
manualCommandObj = ManualControlCommand::GetInstance(getObjectManager());
manualSettingsObj = ManualControlSettings::GetInstance(getObjectManager());
@ -75,6 +76,7 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) :
accessoryDesiredObj0 = AccessoryDesired::GetInstance(getObjectManager(), 0);
accessoryDesiredObj1 = AccessoryDesired::GetInstance(getObjectManager(), 1);
accessoryDesiredObj2 = AccessoryDesired::GetInstance(getObjectManager(), 2);
accessoryDesiredObj3 = AccessoryDesired::GetInstance(getObjectManager(), 3);
actuatorSettingsObj = ActuatorSettings::GetInstance(getObjectManager());
systemSettingsObj = SystemSettings::GetInstance(getObjectManager());
@ -140,6 +142,7 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) :
case ManualControlSettings::CHANNELGROUPS_ACCESSORY0:
case ManualControlSettings::CHANNELGROUPS_ACCESSORY1:
case ManualControlSettings::CHANNELGROUPS_ACCESSORY2:
case ManualControlSettings::CHANNELGROUPS_ACCESSORY3:
addWidgetBinding("ManualControlSettings", "ResponseTime", form->ui->channelResponseTime, indexRT);
++indexRT;
break;
@ -262,6 +265,11 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) :
m_txAccess2->setSharedRenderer(m_renderer);
m_txAccess2->setElementId("access2");
m_txAccess3 = new QGraphicsSvgItem();
m_txAccess3->setParentItem(m_txBackground);
m_txAccess3->setSharedRenderer(m_renderer);
m_txAccess3->setElementId("access3");
m_txFlightMode = new QGraphicsSvgItem();
m_txFlightMode->setParentItem(m_txBackground);
m_txFlightMode->setSharedRenderer(m_renderer);
@ -330,6 +338,12 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) :
orig = Matrix.mapRect(orig);
m_txAccess2Orig.translate(orig.x(), orig.y());
m_txAccess2->setTransform(m_txAccess2Orig, true);
orig = m_renderer->boundsOnElement("access3");
Matrix = m_renderer->matrixForElement("access3");
orig = Matrix.mapRect(orig);
m_txAccess3Orig.translate(orig.x(), orig.y());
m_txAccess3->setTransform(m_txAccess3Orig, true);
}
wizardUi->graphicsView->fitInView(m_txMainBody, Qt::KeepAspectRatio);
animate = new QTimer(this);
@ -343,7 +357,8 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) :
ManualControlSettings::CHANNELGROUPS_FLIGHTMODE <<
ManualControlSettings::CHANNELGROUPS_ACCESSORY0 <<
ManualControlSettings::CHANNELGROUPS_ACCESSORY1 <<
ManualControlSettings::CHANNELGROUPS_ACCESSORY2;
ManualControlSettings::CHANNELGROUPS_ACCESSORY2 <<
ManualControlSettings::CHANNELGROUPS_ACCESSORY3;
acroChannelOrder << ManualControlSettings::CHANNELGROUPS_THROTTLE <<
ManualControlSettings::CHANNELGROUPS_ROLL <<
@ -352,7 +367,8 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) :
ManualControlSettings::CHANNELGROUPS_FLIGHTMODE <<
ManualControlSettings::CHANNELGROUPS_ACCESSORY0 <<
ManualControlSettings::CHANNELGROUPS_ACCESSORY1 <<
ManualControlSettings::CHANNELGROUPS_ACCESSORY2;
ManualControlSettings::CHANNELGROUPS_ACCESSORY2 <<
ManualControlSettings::CHANNELGROUPS_ACCESSORY3;
groundChannelOrder << ManualControlSettings::CHANNELGROUPS_THROTTLE <<
ManualControlSettings::CHANNELGROUPS_YAW <<
@ -368,6 +384,7 @@ void ConfigInputWidget::resetTxControls()
m_txAccess0->setTransform(m_txAccess0Orig, false);
m_txAccess1->setTransform(m_txAccess1Orig, false);
m_txAccess2->setTransform(m_txAccess2Orig, false);
m_txAccess3->setTransform(m_txAccess3Orig, false);
m_txFlightMode->setElementId("flightModeCenter");
m_txFlightMode->setTransform(m_txFlightModeCOrig, false);
m_txArrows->setVisible(false);
@ -1133,6 +1150,9 @@ void ConfigInputWidget::setMoveFromCommand(int command)
case ManualControlSettings::CHANNELNUMBER_ACCESSORY2:
movement = moveAccess2;
break;
case ManualControlSettings::CHANNELNUMBER_ACCESSORY3:
movement = moveAccess3;
break;
default:
Q_ASSERT(0);
break;
@ -1186,6 +1206,12 @@ void ConfigInputWidget::setTxMovement(txMovements movement)
currentMovement = moveAccess2;
animate->start(100);
break;
case moveAccess3:
movePos = 0;
growing = true;
currentMovement = moveAccess3;
animate->start(100);
break;
case moveFlightMode:
movePos = 0;
growing = true;
@ -1272,6 +1298,13 @@ void ConfigInputWidget::moveTxControls()
limitMin = ACCESS_MIN_MOVE;
move = horizontal;
break;
case moveAccess3:
item = m_txAccess3;
trans = m_txAccess3Orig;
limitMax = ACCESS_MAX_MOVE;
limitMin = ACCESS_MIN_MOVE;
move = horizontal;
break;
case moveFlightMode:
item = m_txFlightMode;
move = jump;
@ -1325,6 +1358,8 @@ void ConfigInputWidget::moveTxControls()
m_txAccess1->setTransform(trans.translate(movePos * 10 * ACCESS_MAX_MOVE / STICK_MAX_MOVE, 0), false);
trans = m_txAccess2Orig;
m_txAccess2->setTransform(trans.translate(movePos * 10 * ACCESS_MAX_MOVE / STICK_MAX_MOVE, 0), false);
trans = m_txAccess3Orig;
m_txAccess3->setTransform(trans.translate(movePos * 10 * ACCESS_MAX_MOVE / STICK_MAX_MOVE, 0), false);
if (auxFlag) {
trans = m_txLeftStickOrig;
@ -1390,6 +1425,12 @@ AccessoryDesired *ConfigInputWidget::getAccessoryDesiredInstance(int instance)
}
return accessoryDesiredObj2;
case 3:
if (accessoryDesiredObj3 == NULL) {
accessoryDesiredObj3 = AccessoryDesired::GetInstance(getObjectManager(), 3);
}
return accessoryDesiredObj3;
default:
Q_ASSERT(false);
}
@ -1461,6 +1502,7 @@ void ConfigInputWidget::moveSticks()
m_txAccess0->setTransform(QTransform(m_txAccess0Orig).translate(getAccessoryDesiredValue(0) * ACCESS_MAX_MOVE * 10, 0), false);
m_txAccess1->setTransform(QTransform(m_txAccess1Orig).translate(getAccessoryDesiredValue(1) * ACCESS_MAX_MOVE * 10, 0), false);
m_txAccess2->setTransform(QTransform(m_txAccess2Orig).translate(getAccessoryDesiredValue(2) * ACCESS_MAX_MOVE * 10, 0), false);
m_txAccess3->setTransform(QTransform(m_txAccess3Orig).translate(getAccessoryDesiredValue(3) * ACCESS_MAX_MOVE * 10, 0), false);
}
void ConfigInputWidget::dimOtherControls(bool value)
@ -1475,6 +1517,7 @@ void ConfigInputWidget::dimOtherControls(bool value)
m_txAccess0->setOpacity(opac);
m_txAccess1->setOpacity(opac);
m_txAccess2->setOpacity(opac);
m_txAccess3->setOpacity(opac);
m_txFlightMode->setOpacity(opac);
}

View File

@ -2,7 +2,8 @@
******************************************************************************
*
* @file configservowidget.h
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
* @author The LibrePilot Project, http://www.librepilot.org Copyright (C) 2015.
* The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
* @addtogroup GCSPlugins GCS Plugins
* @{
* @addtogroup ConfigPlugin Config Plugin
@ -61,7 +62,7 @@ public:
~ConfigInputWidget();
enum wizardSteps { wizardWelcome, wizardChooseMode, wizardChooseType, wizardIdentifySticks, wizardIdentifyCenter, wizardIdentifyLimits, wizardIdentifyInverted, wizardFinish, wizardNone };
enum txMode { mode1, mode2, mode3, mode4 };
enum txMovements { moveLeftVerticalStick, moveRightVerticalStick, moveLeftHorizontalStick, moveRightHorizontalStick, moveAccess0, moveAccess1, moveAccess2, moveFlightMode, centerAll, moveAll, nothing };
enum txMovements { moveLeftVerticalStick, moveRightVerticalStick, moveLeftHorizontalStick, moveRightHorizontalStick, moveAccess0, moveAccess1, moveAccess2, moveAccess3, moveFlightMode, centerAll, moveAll, nothing };
enum txMovementType { vertical, horizontal, jump, mix };
enum txType { acro, heli, ground };
void startInputWizard()
@ -125,6 +126,7 @@ private:
AccessoryDesired *accessoryDesiredObj0;
AccessoryDesired *accessoryDesiredObj1;
AccessoryDesired *accessoryDesiredObj2;
AccessoryDesired *accessoryDesiredObj3;
ManualControlSettings *manualSettingsObj;
ManualControlSettings::DataFields manualSettingsData;
@ -157,6 +159,7 @@ private:
QGraphicsSvgItem *m_txAccess0;
QGraphicsSvgItem *m_txAccess1;
QGraphicsSvgItem *m_txAccess2;
QGraphicsSvgItem *m_txAccess3;
QGraphicsSvgItem *m_txFlightMode;
QGraphicsSvgItem *m_txBackground;
QGraphicsSvgItem *m_txArrows;
@ -165,6 +168,7 @@ private:
QTransform m_txAccess0Orig;
QTransform m_txAccess1Orig;
QTransform m_txAccess2Orig;
QTransform m_txAccess3Orig;
QTransform m_txFlightModeCOrig;
QTransform m_txFlightModeLOrig;
QTransform m_txFlightModeROrig;

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 424 KiB

After

Width:  |  Height:  |  Size: 424 KiB

View File

@ -79,7 +79,26 @@ bool EscPage::isSynchOrOneShotAvailable()
case SetupWizard::CONTROLLER_NANO:
case SetupWizard::CONTROLLER_CC:
case SetupWizard::CONTROLLER_CC3D:
available = getWizard()->getInputType() != SetupWizard::INPUT_PWM;
switch (getWizard()->getVehicleType()) {
case SetupWizard::VEHICLE_MULTI:
switch (getWizard()->getVehicleSubType()) {
case SetupWizard::MULTI_ROTOR_TRI_Y:
case SetupWizard::MULTI_ROTOR_QUAD_X:
case SetupWizard::MULTI_ROTOR_QUAD_H:
case SetupWizard::MULTI_ROTOR_QUAD_PLUS:
available = getWizard()->getInputType() != SetupWizard::INPUT_PWM;
break;
default:
available = false;
break;
}
break;
default:
break;
}
break;
case SetupWizard::CONTROLLER_REVO:
available = true;
break;
default:
break;

View File

@ -212,9 +212,9 @@ void OutputCalibrationPage::setupVehicle()
m_vehicleElementIds << "aileron" << "aileron-frame" << "aileron-motor" << "aileron-ail-left" << "aileron-ail-right" << "aileron-elevator" << "aileron-rudder";
m_vehicleElementTypes << FULL << FRAME << MOTOR << SERVO << SERVO << SERVO << SERVO;
m_vehicleHighlightElementIndexes << 0 << 1 << 2 << 3 << 4 << 5;
m_channelIndex << 0 << 2 << 0 << 5 << 1 << 3;
m_channelIndex << 0 << 3 << 0 << 5 << 1 << 2;
setupActuatorMinMaxAndNeutral(2, 2, 6); // should be 5 instead 6 but output 5 is not used
setupActuatorMinMaxAndNeutral(3, 3, 6); // should be 5 instead 6 but output 5 is not used
getWizard()->setActuatorSettings(m_actuatorSettings);
break;
@ -224,9 +224,9 @@ void OutputCalibrationPage::setupVehicle()
m_vehicleElementIds << "singleaileron" << "singleaileron-frame" << "singleaileron-motor" << "singleaileron-aileron" << "singleaileron-elevator" << "singleaileron-rudder";
m_vehicleElementTypes << FULL << FRAME << MOTOR << SERVO << SERVO << SERVO;
m_vehicleHighlightElementIndexes << 0 << 1 << 2 << 3 << 4;
m_channelIndex << 0 << 2 << 0 << 1 << 3;
m_channelIndex << 0 << 3 << 0 << 1 << 2;
setupActuatorMinMaxAndNeutral(2, 2, 4);
setupActuatorMinMaxAndNeutral(3, 3, 4);
getWizard()->setActuatorSettings(m_actuatorSettings);
break;
@ -236,9 +236,9 @@ void OutputCalibrationPage::setupVehicle()
m_vehicleElementIds << "elevon" << "elevon-frame" << "elevon-motor" << "elevon-left" << "elevon-right";
m_vehicleElementTypes << FULL << FRAME << MOTOR << SERVO << SERVO;
m_vehicleHighlightElementIndexes << 0 << 1 << 2 << 3;
m_channelIndex << 0 << 2 << 0 << 1;
m_channelIndex << 0 << 3 << 0 << 1;
setupActuatorMinMaxAndNeutral(2, 2, 3);
setupActuatorMinMaxAndNeutral(3, 3, 3);
getWizard()->setActuatorSettings(m_actuatorSettings);
break;
@ -248,9 +248,9 @@ void OutputCalibrationPage::setupVehicle()
m_vehicleElementIds << "vtail" << "vtail-frame" << "vtail-motor" << "vtail-ail-left" << "vtail-ail-right" << "vtail-rudder-left" << "vtail-rudder-right";
m_vehicleElementTypes << FULL << FRAME << MOTOR << SERVO << SERVO << SERVO << SERVO;
m_vehicleHighlightElementIndexes << 0 << 1 << 2 << 3 << 4 << 5;
m_channelIndex << 0 << 2 << 0 << 5 << 3 << 1;
m_channelIndex << 0 << 3 << 0 << 5 << 2 << 1;
setupActuatorMinMaxAndNeutral(2, 2, 6); // should be 5 instead 6 but output 5 is not used
setupActuatorMinMaxAndNeutral(3, 3, 6); // should be 5 instead 6 but output 5 is not used
getWizard()->setActuatorSettings(m_actuatorSettings);
break;
@ -262,9 +262,9 @@ void OutputCalibrationPage::setupVehicle()
m_vehicleElementIds << "car" << "car-frame" << "car-motor" << "car-steering";
m_vehicleElementTypes << FULL << FRAME << MOTOR << SERVO;
m_vehicleHighlightElementIndexes << 0 << 1 << 2;
m_channelIndex << 0 << 1 << 0;
m_channelIndex << 0 << 3 << 0;
setupActuatorMinMaxAndNeutral(1, 1, 2);
setupActuatorMinMaxAndNeutral(3, 3, 2);
getWizard()->setActuatorSettings(m_actuatorSettings);
break;
@ -286,9 +286,9 @@ void OutputCalibrationPage::setupVehicle()
m_vehicleElementIds << "motorbike" << "motorbike-frame" << "motorbike-motor" << "motorbike-steering";
m_vehicleElementTypes << FULL << FRAME << MOTOR << SERVO;
m_vehicleHighlightElementIndexes << 0 << 1 << 2;
m_channelIndex << 0 << 1 << 0;
m_channelIndex << 0 << 3 << 0;
setupActuatorMinMaxAndNeutral(1, 1, 2);
setupActuatorMinMaxAndNeutral(3, 3, 2);
getWizard()->setActuatorSettings(m_actuatorSettings);
break;

View File

@ -30,19 +30,19 @@
inkscape:window-height="928"
id="namedview4616"
showgrid="false"
inkscape:zoom="0.56829069"
inkscape:cx="617.05784"
inkscape:cy="502.76029"
inkscape:zoom="1.6073688"
inkscape:cx="845.3775"
inkscape:cy="601.39702"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="svg12651"
inkscape:current-layer="layer47"
fit-margin-top="15"
fit-margin-left="15"
fit-margin-right="15"
fit-margin-bottom="15"
inkscape:snap-grids="true"
showguides="false"
showguides="true"
inkscape:guide-bbox="true"
inkscape:snap-global="true"
inkscape:snap-bbox="true"
@ -40658,8 +40658,9 @@
inkscape:groupmode="layer"
id="layer13"
inkscape:label="multirotors-frames"
style="display:inline"
transform="translate(-32.46875,315.85439)">
style="display:none"
transform="translate(-32.46875,315.85439)"
sodipodi:insensitive="true">
<g
inkscape:groupmode="layer"
id="layer24"
@ -45991,8 +45992,7 @@
id="layer14"
inkscape:label="fixed-wing-frames"
style="display:inline"
transform="translate(-32.46875,315.85439)"
sodipodi:insensitive="true">
transform="translate(-32.46875,315.85439)">
<g
inkscape:groupmode="layer"
id="layer46"
@ -46281,7 +46281,7 @@
id="circle3889-7-2" />
<polygon
style="fill:#ffffff"
points="385.232,688.145 384.951,688.426 383.697,687.172 382.443,688.426 382.162,688.145 383.416,686.891 382.162,685.637 382.443,685.355 383.697,686.609 384.951,685.355 385.232,685.637 383.978,686.891 "
points="383.697,687.172 382.443,688.426 382.162,688.145 383.416,686.891 382.162,685.637 382.443,685.355 383.697,686.609 384.951,685.355 385.232,685.637 383.978,686.891 385.232,688.145 384.951,688.426 "
id="polygon3891-7-0" />
</g>
</g>
@ -46622,7 +46622,7 @@
id="circle3915-5-9" />
<polygon
style="fill:#ffffff"
points="409.938,719.207 410.22,718.926 408.966,717.672 410.22,716.418 409.938,716.137 408.685,717.391 407.431,716.137 407.149,716.418 408.403,717.672 407.149,718.926 407.431,719.207 408.685,717.953 "
points="408.966,717.672 410.22,716.418 409.938,716.137 408.685,717.391 407.431,716.137 407.149,716.418 408.403,717.672 407.149,718.926 407.431,719.207 408.685,717.953 409.938,719.207 410.22,718.926 "
id="polygon3917-2-3" />
</g>
</g>
@ -47260,7 +47260,7 @@
id="circle3808-2" />
<polygon
style="fill:#ffffff"
points="582.444,612.459 582.163,612.74 583.417,613.994 582.163,615.248 582.444,615.529 583.698,614.275 584.952,615.529 585.233,615.248 583.979,613.994 585.233,612.74 584.952,612.459 583.698,613.713 "
points="583.417,613.994 582.163,615.248 582.444,615.529 583.698,614.275 584.952,615.529 585.233,615.248 583.979,613.994 585.233,612.74 584.952,612.459 583.698,613.713 582.444,612.459 582.163,612.74 "
id="polygon3810-5" />
</g>
</g>
@ -47624,7 +47624,7 @@
id="circle3853-8" />
<polygon
style="fill:#ffffff"
points="212.52,612.367 212.801,612.086 214.055,613.34 215.309,612.086 215.59,612.367 214.336,613.621 215.59,614.875 215.309,615.156 214.055,613.901 212.801,615.156 212.52,614.875 213.773,613.621 "
points="214.055,613.34 215.309,612.086 215.59,612.367 214.336,613.621 215.59,614.875 215.309,615.156 214.055,613.901 212.801,615.156 212.52,614.875 213.773,613.621 212.52,612.367 212.801,612.086 "
id="polygon3855-7" />
</g>
</g>
@ -47664,8 +47664,8 @@
transform="translate(-424.57206,737.27388)" />
</g>
<path
style="display:inline;opacity:0.6;fill:none;stroke:#ff0000;stroke-width:2.56401658;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#DotS);marker-end:url(#Arrow2Send)"
d="m 265.22146,3082.1918 l 0,-42.6438 l -95.98891,-0.019 l 0,-266.8652"
style="display:inline;opacity:0.6;fill:none;stroke:#3232ed;stroke-width:2.56401658;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#DotS);marker-end:url(#Arrow2Send)"
d="m 278.91553,3082.1918 l 0,-32.3732 c -36.56099,0 -73.12199,-0.012 -109.68298,-0.02 l 0,-277.1358"
id="path18297-0"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
@ -47683,7 +47683,7 @@
sodipodi:nodetypes="cccc" />
<path
style="display:inline;opacity:0.6;fill:none;stroke:#ff0000;stroke-width:2.56401658;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#DotS);marker-end:url(#Arrow2Send)"
d="m 278.88006,3082.1918 l 0,-21.686 l 177.46656,-0.9169 l -0.3564,-291.1944"
d="m 266.89775,3082.1918 l 0,-21.686 l 189.44887,-0.9169 l -0.3564,-291.1944"
id="path19631-2"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
@ -47722,13 +47722,13 @@
transform="matrix(0.86182848,-0.00300837,0.00369546,1.0586653,60.05965,-689.19036)"
id="elevon-left-bg">
<polygon
points="276.907,598.968 53.208,640.88 57.043,661.355 280.743,619.442 "
points="57.043,661.355 280.743,619.442 276.907,598.968 53.208,640.88 "
id="polygon15045"
style="fill:#ffffff;fill-opacity:1"
transform="matrix(0.72121082,0.06170844,-0.10908107,0.84487279,73.505995,371.00173)" />
<polygon
style="fill:url(#linearGradient5053-3-6);fill-opacity:1"
points="277.907,598.968 54.208,640.88 58.043,661.355 281.743,619.442 "
points="58.043,661.355 281.743,619.442 277.907,598.968 54.208,640.88 "
id="polygon15149"
transform="matrix(0.72121082,0.06170844,-0.10908107,0.84487279,72.763393,371.00173)" />
<g
@ -47990,13 +47990,13 @@
transform="matrix(-0.86182848,-0.00300837,-0.00369546,1.0586653,726.01496,-689.1904)"
id="elevon-right-bg">
<polygon
points="276.907,598.968 53.208,640.88 57.043,661.355 280.743,619.442 "
points="57.043,661.355 280.743,619.442 276.907,598.968 53.208,640.88 "
id="polygon15045-6"
style="fill:#ffffff;fill-opacity:1"
transform="matrix(0.72121082,0.06170844,-0.10908107,0.84487279,73.505995,371.00173)" />
<polygon
style="fill:url(#linearGradient5055-9-1);fill-opacity:1"
points="277.907,598.968 54.208,640.88 58.043,661.355 281.743,619.442 "
points="58.043,661.355 281.743,619.442 277.907,598.968 54.208,640.88 "
id="polygon15149-3"
transform="matrix(0.72121082,0.06170844,-0.10908107,0.84487279,72.763393,371.00173)" />
<g
@ -48315,7 +48315,7 @@
id="circle3808-0-9-5" />
<polygon
style="fill:#ffffff"
points="582.444,615.529 583.698,614.275 584.952,615.529 585.233,615.248 583.979,613.994 585.233,612.74 584.952,612.459 583.698,613.713 582.444,612.459 582.163,612.74 583.417,613.994 582.163,615.248 "
points="584.952,615.529 585.233,615.248 583.979,613.994 585.233,612.74 584.952,612.459 583.698,613.713 582.444,612.459 582.163,612.74 583.417,613.994 582.163,615.248 582.444,615.529 583.698,614.275 "
id="polygon3810-1-8-8" />
</g>
</g>
@ -48411,7 +48411,7 @@
id="circle3808-0-9" />
<polygon
style="fill:#ffffff"
points="583.979,613.994 585.233,612.74 584.952,612.459 583.698,613.713 582.444,612.459 582.163,612.74 583.417,613.994 582.163,615.248 582.444,615.529 583.698,614.275 584.952,615.529 585.233,615.248 "
points="584.952,612.459 583.698,613.713 582.444,612.459 582.163,612.74 583.417,613.994 582.163,615.248 582.444,615.529 583.698,614.275 584.952,615.529 585.233,615.248 583.979,613.994 585.233,612.74 "
id="polygon3810-1-8" />
</g>
</g>
@ -48647,8 +48647,8 @@
transform="translate(1.2734359,1.2734359)"
sodipodi:nodetypes="ccccc" />
<path
style="opacity:0.6;fill:none;stroke:#ff0000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#DotS);marker-end:url(#Arrow2Send)"
d="m 711.4357,180.81019 l 20.66904,0 l 0,144.8503 l 378.00806,-0.25 l 0.01,-52.25"
style="opacity:0.6;fill:none;stroke:#3232ed;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#DotS);marker-end:url(#Arrow2Send)"
d="m 711.4357,195.81019 l 20.66904,0 l 0,129.8503 l 378.00806,-0.25 l 0.01,-52.25"
id="path16917"
inkscape:connector-curvature="0"
transform="translate(1.2734359,1.2734359)"
@ -49803,7 +49803,7 @@
cx="383.69699" />
<polygon
id="polygon3891-8"
points="383.697,687.172 382.443,688.426 382.162,688.145 383.416,686.891 382.162,685.637 382.443,685.355 383.697,686.609 384.951,685.355 385.232,685.637 383.978,686.891 385.232,688.145 384.951,688.426 "
points="385.232,688.145 384.951,688.426 383.697,687.172 382.443,688.426 382.162,688.145 383.416,686.891 382.162,685.637 382.443,685.355 383.697,686.609 384.951,685.355 385.232,685.637 383.978,686.891 "
style="fill:#ffffff" />
</g>
</g>
@ -49864,7 +49864,7 @@
cx="408.685" />
<polygon
id="polygon3917-1"
points="410.22,718.926 408.966,717.672 410.22,716.418 409.938,716.137 408.685,717.391 407.431,716.137 407.149,716.418 408.403,717.672 407.149,718.926 407.431,719.207 408.685,717.953 409.938,719.207 "
points="408.685,717.953 409.938,719.207 410.22,718.926 408.966,717.672 410.22,716.418 409.938,716.137 408.685,717.391 407.431,716.137 407.149,716.418 408.403,717.672 407.149,718.926 407.431,719.207 "
style="fill:#ffffff" />
</g>
</g>
@ -49987,7 +49987,7 @@
cx="214.054" />
<polygon
id="polygon3855-2"
points="212.801,612.086 214.055,613.34 215.309,612.086 215.59,612.367 214.336,613.621 215.59,614.875 215.309,615.156 214.055,613.901 212.801,615.156 212.52,614.875 213.773,613.621 212.52,612.367 "
points="213.773,613.621 212.52,612.367 212.801,612.086 214.055,613.34 215.309,612.086 215.59,612.367 214.336,613.621 215.59,614.875 215.309,615.156 214.055,613.901 212.801,615.156 212.52,614.875 "
style="fill:#ffffff" />
</g>
</g>
@ -50039,20 +50039,20 @@
</g>
</g>
<path
style="display:inline;opacity:0.6;fill:none;stroke:#ff0000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#DotS);marker-end:url(#Arrow2Send)"
d="m 685.05778,181.18081 l 54.68649,0 l 0,-108 l 319.75323,0"
style="display:inline;opacity:0.6;fill:none;stroke:#3232ed;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#DotS);marker-end:url(#Arrow2Send)"
d="m 685.05778,197.18081 l 54.68649,0 l 0,-124 l 319.75323,0"
id="path18297-3"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
<path
style="display:inline;opacity:0.6;fill:none;stroke:#ff0000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#DotS);marker-end:url(#Arrow2Send)"
d="m 685.05778,164.64861 l 35.68649,0 l 0,207.64993 l 374.59513,0"
d="m 685.05778,164.64861 l 38.68649,0 l 0,207.64993 l 371.59513,0"
id="path19249-2"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
<path
style="display:inline;opacity:0.6;fill:none;stroke:#ff0000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#DotS);marker-end:url(#Arrow2Send)"
d="m 685.05778,197.16194 l 17.50906,0 l -0.92443,129.55097 l 374.23249,-0.38403"
d="m 685.05778,182.16194 l 21.50906,0 l 0.0756,144.55097 l 369.23246,-0.38403"
id="path19631-4"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
@ -50069,7 +50069,7 @@
inkscape:groupmode="layer"
id="layer34"
inkscape:label="fixed-wing-two-servos"
style="display:none"
style="display:inline"
sodipodi:insensitive="true">
<g
transform="translate(-1.2734359,-1.2734402)"
@ -51461,8 +51461,8 @@
</g>
</g>
<path
style="opacity:0.6;fill:none;stroke:#ff0000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#DotS);marker-end:url(#Arrow2Send)"
d="m 683.33096,179.50208 l 31.11171,-0.0189 l 0.0563,-107.793143 l 341.81473,1.297651"
style="opacity:0.6;fill:none;stroke:#3232ed;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#DotS);marker-end:url(#Arrow2Send)"
d="m 683.33096,195.50208 l 31.11171,-0.0189 l 0.0563,-123.793143 l 341.81473,1.297651"
id="path18297"
inkscape:connector-curvature="0"
transform="translate(1.2734359,1.2734359)"
@ -51476,14 +51476,14 @@
sodipodi:nodetypes="ccc" />
<path
style="opacity:0.6;fill:none;stroke:#ff0000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#DotS);marker-end:url(#Arrow2Send)"
d="m 683.33096,162.96988 l 53.81977,0 l 0,205.64992 l 352.46187,0"
d="m 683.33096,162.96988 l 61.81977,0 l 0,205.64992 l 344.46187,0"
id="path19249"
inkscape:connector-curvature="0"
transform="translate(1.2734359,1.2734359)"
sodipodi:nodetypes="cccc" />
<path
style="opacity:0.6;fill:none;stroke:#ff0000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#DotS);marker-end:url(#Arrow2Send)"
d="m 683.33096,195.48321 l 31.13987,0 l 0,136.22396 l 346.65807,0"
d="m 683.33096,180.48321 l 46.13987,0 l 0,151.22396 l 331.65807,0"
id="path19631"
inkscape:connector-curvature="0"
transform="translate(1.2734359,1.2734359)"
@ -51501,13 +51501,14 @@
<g
inkscape:groupmode="layer"
id="layer47"
inkscape:label="ground-vehicles">
inkscape:label="ground-vehicles"
sodipodi:insensitive="true"
style="display:none">
<g
inkscape:groupmode="layer"
id="layer48"
inkscape:label="motorbike"
style="display:none"
sodipodi:insensitive="true">
style="display:none">
<g
transform="translate(665.97868,-1210.1492)"
style="display:inline"
@ -51853,7 +51854,7 @@
id="circle3853-3" />
<polygon
style="fill:#ffffff"
points="212.52,612.367 212.801,612.086 214.055,613.34 215.309,612.086 215.59,612.367 214.336,613.621 215.59,614.875 215.309,615.156 214.055,613.901 212.801,615.156 212.52,614.875 213.773,613.621 "
points="212.52,614.875 213.773,613.621 212.52,612.367 212.801,612.086 214.055,613.34 215.309,612.086 215.59,612.367 214.336,613.621 215.59,614.875 215.309,615.156 214.055,613.901 212.801,615.156 "
id="polygon3855-79" />
</g>
</g>
@ -52016,8 +52017,8 @@
d="m -15.116465,1673.5434 l 91.222621,-0.1041 l 51.576774,-65.0956 l 261.28532,-0.1041 l 63.42887,113.2472"
style="display:inline;opacity:0.6;fill:none;stroke:#ff0000;stroke-width:2.99576831;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#DotS);marker-end:url(#Arrow2Send)" />
<path
style="display:inline;opacity:0.6;fill:none;stroke:#ff0000;stroke-width:2.99576831;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#DotS);marker-end:url(#Arrow2Send)"
d="m -15.116465,1688.9734 l 91.22266,-0.1041 l 228.794525,87.1813"
style="display:inline;opacity:0.6;fill:none;stroke:#3232ed;stroke-width:2.99576831;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#DotS);marker-end:url(#Arrow2Send)"
d="m -15.116465,1721.9734 l 213.222655,-0.1041 l 106.79453,54.1813"
id="path37299-5"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" />
@ -53148,8 +53149,8 @@
d="m 650.86221,463.39425 l 364.89049,-0.4164"
style="display:inline;opacity:0.6;fill:none;stroke:#ff0000;stroke-width:2.99576831;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#DotS);marker-end:url(#Arrow2Send)" />
<path
style="display:inline;opacity:0.6;fill:none;stroke:#ff0000;stroke-width:2.99576831;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#DotS);marker-end:url(#Arrow2Send)"
d="m 650.86221,478.82431 l 95.22265,-0.1041 l 122.44529,115.7918 l 95.22265,-0.1041"
style="display:inline;opacity:0.6;fill:none;stroke:#3232ed;stroke-width:2.99576831;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#DotS);marker-end:url(#Arrow2Send)"
d="m 650.86221,511.82431 l 95.22265,-0.1041 l 122.44529,82.7918 l 95.22265,-0.1041"
id="path37299"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />

Before

Width:  |  Height:  |  Size: 3.0 MiB

After

Width:  |  Height:  |  Size: 3.0 MiB

View File

@ -1083,13 +1083,13 @@
inkscape:window-height="928"
id="namedview4099"
showgrid="false"
inkscape:zoom="0.24405855"
inkscape:cx="319.25037"
inkscape:cy="1499.6401"
inkscape:zoom="2.0277616"
inkscape:cx="306.2049"
inkscape:cy="553.84428"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="vtail"
inkscape:current-layer="g9119-8-5"
showborder="true"
inkscape:showpageshadow="false"
showguides="false"
@ -2544,18 +2544,7 @@
d="M 411.403,217.337 C 422.322,228.265 422.322,245.981 411.39,256.901 C 400.469,267.826 382.753,267.826 371.827,256.901 C 360.906,245.98 360.906,228.268 371.837,217.346 C 382.758,206.42 400.472,206.418 411.402,217.335"
id="path5397_3_-36-4"
inkscape:connector-curvature="0"
style="fill:#49494b" /></g><text
sodipodi:linespacing="125%"
id="text9115"
y="352.53461"
x="238.86888"
style="font-size:26.04472542px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Sans"
xml:space="preserve"><tspan
y="352.53461"
x="238.86888"
id="tspan9117"
sodipodi:role="line">4</tspan></text>
</g></g><g
style="fill:#49494b" /></g></g></g><g
transform="translate(-8.988326,713.05752)"
id="aileron-rudder-top"
style="fill:#ffffff;fill-opacity:1"><path
@ -2580,7 +2569,11 @@
y1="801.78497"
x1="395.849"
stroke-miterlimit="10"
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.51120001;stroke-miterlimit:10" /></g></g><g
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.51120001;stroke-miterlimit:10" /></g><path
style="opacity:0.72250001;fill:#ffffff"
inkscape:connector-curvature="0"
d="m 320.07042,1400.0854 l 2.31,-0.3081 c 0.265,1.309 0.717,2.2531 1.354,2.8271 c 0.637,0.578 1.416,0.8669 2.332,0.8669 c 1.087,0 2.005,-0.377 2.753,-1.1289 c 0.749,-0.754 1.122,-1.686 1.122,-2.799 c 0,-1.0631 -0.348,-1.938 -1.038,-2.625 c -0.693,-0.688 -1.575,-1.0331 -2.64599,-1.0331 c -0.43801,0 -0.979,0.086 -1.63001,0.2581 l 0.25601,-2.0271 c 0.15399,0.018 0.27899,0.024 0.37299,0.024 c 0.98401,0 1.87101,-0.257 2.658,-0.771 c 0.787,-0.5161 1.18001,-1.307 1.18001,-2.374 c 0,-0.848 -0.28501,-1.548 -0.85701,-2.104 c -0.574,-0.556 -1.313,-0.834 -2.223,-0.834 c -0.897,0 -1.646,0.282 -2.246,0.849 c -0.599,0.563 -0.984,1.41 -1.156,2.541 l -2.30999,-0.411 c 0.28199,-1.549 0.92299,-2.748 1.92499,-3.602 c 1.00001,-0.852 2.246,-1.275 3.735,-1.275 c 1.025,0 1.973,0.221 2.836,0.662 c 0.864,0.438 1.524,1.04 1.983,1.803 c 0.457,0.762 0.686,1.569 0.686,2.426 c 0,0.813 -0.219,1.5529 -0.65399,2.221 c -0.43601,0.6659 -1.08201,1.197 -1.93701,1.594 c 1.11,0.256 1.976,0.787 2.591,1.598 c 0.617,0.808 0.924,1.82 0.924,3.035 c 0,1.643 -0.598,3.035 -1.795,4.178 c -1.199,1.1419 -2.714,1.7129 -4.54499,1.7129 c -1.65101,0 -3.022,-0.492 -4.11301,-1.4759 c -1.092,-0.986 -1.715,-2.2611 -1.868,-3.828 z"
id="path3977-3-3-9" /></g><g
transform="translate(-67.999261,-57.002699)"
id="aileron-motor"><g
transform="matrix(0.89192721,0,0,0.89192721,44.12104,832.95269)"
@ -2612,15 +2605,18 @@
style="fill:#49494b"
inkscape:connector-curvature="0"
id="path5397_3_-36"
d="M 411.403,217.337 C 422.322,228.265 422.322,245.981 411.39,256.901 C 400.469,267.826 382.753,267.826 371.827,256.901 C 360.906,245.98 360.906,228.268 371.837,217.346 C 382.758,206.42 400.472,206.418 411.402,217.335" /></g><path
id="path3977-3-3"
d="M 444.46533,1204.0239 L 446.77533,1203.7158 C 447.04033,1205.0248 447.49233,1205.9689 448.12933,1206.5429 C 448.76633,1207.1209 449.54533,1207.4098 450.46133,1207.4098 C 451.54833,1207.4098 452.46633,1207.0328 453.21433,1206.2809 C 453.96333,1205.5269 454.33633,1204.5949 454.33633,1203.4819 C 454.33633,1202.4188 453.98833,1201.5439 453.29833,1200.8569 C 452.60533,1200.1689 451.72333,1199.8238 450.65234,1199.8238 C 450.21433,1199.8238 449.67334,1199.9098 449.02233,1200.0819 L 449.27834,1198.0548 C 449.43233,1198.0728 449.55733,1198.0788 449.65133,1198.0788 C 450.63534,1198.0788 451.52234,1197.8218 452.30933,1197.3078 C 453.09633,1196.7917 453.48934,1196.0008 453.48934,1194.9338 C 453.48934,1194.0858 453.20433,1193.3858 452.63233,1192.8298 C 452.05833,1192.2738 451.31933,1191.9958 450.40933,1191.9958 C 449.51233,1191.9958 448.76333,1192.2778 448.16333,1192.8448 C 447.56433,1193.4078 447.17933,1194.2548 447.00733,1195.3858 L 444.69734,1194.9748 C 444.97933,1193.4258 445.62033,1192.2268 446.62233,1191.3728 C 447.62234,1190.5208 448.86833,1190.0978 450.35733,1190.0978 C 451.38233,1190.0978 452.33033,1190.3188 453.19333,1190.7598 C 454.05733,1191.1978 454.71733,1191.7998 455.17633,1192.5628 C 455.63333,1193.3248 455.86233,1194.1318 455.86233,1194.9888 C 455.86233,1195.8018 455.64333,1196.5417 455.20834,1197.2098 C 454.77233,1197.8757 454.12633,1198.4068 453.27133,1198.8038 C 454.38133,1199.0598 455.24733,1199.5908 455.86233,1200.4018 C 456.47933,1201.2098 456.78633,1202.2218 456.78633,1203.4368 C 456.78633,1205.0798 456.18833,1206.4718 454.99133,1207.6148 C 453.79233,1208.7568 452.27733,1209.3278 450.44634,1209.3278 C 448.79533,1209.3278 447.42434,1208.8358 446.33333,1207.8518 C 445.24133,1206.8658 444.61833,1205.5907 444.46533,1204.0238 z"
inkscape:connector-curvature="0"
style="opacity:0.72250001;fill:#ffffff" /></g><path
style="opacity:0.72250001;fill:#ffffff"
inkscape:connector-curvature="0"
d="M 386.01238,1048.3013 L 388.32238,1047.9932 C 388.58738,1049.3022 389.03938,1050.2463 389.67638,1050.8203 C 390.31338,1051.3983 391.09238,1051.6872 392.00838,1051.6872 C 393.09538,1051.6872 394.01338,1051.3102 394.76138,1050.5583 C 395.51038,1049.8043 395.88338,1048.8723 395.88338,1047.7593 C 395.88338,1046.6962 395.53538,1045.8213 394.84538,1045.1343 C 394.15238,1044.4463 393.27038,1044.1012 392.19939,1044.1012 C 391.76138,1044.1012 391.22039,1044.1872 390.56938,1044.3593 L 390.82539,1042.3322 C 390.97938,1042.3502 391.10438,1042.3562 391.19838,1042.3562 C 392.18239,1042.3562 393.06939,1042.0992 393.85638,1041.5852 C 394.64338,1041.0691 395.03639,1040.2782 395.03639,1039.2112 C 395.03639,1038.3632 394.75138,1037.6632 394.17938,1037.1072 C 393.60538,1036.5512 392.86638,1036.2732 391.95638,1036.2732 C 391.05938,1036.2732 390.31038,1036.5552 389.71038,1037.1222 C 389.11138,1037.6852 388.72638,1038.5322 388.55438,1039.6632 L 386.24439,1039.2522 C 386.52638,1037.7032 387.16738,1036.5042 388.16938,1035.6502 C 389.16939,1034.7982 390.41538,1034.3752 391.90438,1034.3752 C 392.92938,1034.3752 393.87738,1034.5962 394.74038,1035.0372 C 395.60438,1035.4752 396.26438,1036.0772 396.72338,1036.8402 C 397.18038,1037.6022 397.40938,1038.4092 397.40938,1039.2662 C 397.40938,1040.0792 397.19038,1040.8191 396.75539,1041.4872 C 396.31938,1042.1531 395.67338,1042.6842 394.81838,1043.0812 C 395.92838,1043.3372 396.79438,1043.8682 397.40938,1044.6792 C 398.02638,1045.4872 398.33338,1046.4992 398.33338,1047.7142 C 398.33338,1049.3572 397.73538,1050.7492 396.53838,1051.8922 C 395.33938,1053.0341 393.82438,1053.6051 391.99339,1053.6051 C 390.34238,1053.6051 388.97139,1053.1131 387.88038,1052.1292 C 386.78838,1051.1432 386.16538,1049.8681 386.01238,1048.3012 z"
id="path3977-3-3-9" /><g
d="M 411.403,217.337 C 422.322,228.265 422.322,245.981 411.39,256.901 C 400.469,267.826 382.753,267.826 371.827,256.901 C 360.906,245.98 360.906,228.268 371.837,217.346 C 382.758,206.42 400.472,206.418 411.402,217.335" /></g><text
sodipodi:linespacing="125%"
id="text9115-9"
y="1207.9604"
x="443.48376"
style="font-style:normal;font-weight:normal;font-size:23px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;opacity:0.85;fill:#ffffff;fill-opacity:1;stroke:none"
xml:space="preserve"><tspan
y="1207.9604"
x="443.48376"
id="tspan9117-2"
sodipodi:role="line">4</tspan></text>
</g><g
transform="translate(-8.2713312,-306.97176)"
id="aileron-propeller"
style="fill:#000000;fill-opacity:1"><g
@ -2638,7 +2634,18 @@
d="M 388.375,1470.057 H 409.069 C 409.069,1470.057 403.881,1454.799 398.709,1454.682 C 393.533,1454.565 388.375,1470.057 388.375,1470.057 z"
id="path3575"
inkscape:connector-curvature="0"
style="fill:#000000;fill-opacity:1" /></g></g><g
style="fill:#000000;fill-opacity:1" /></g><text
sodipodi:linespacing="125%"
id="text9115-05"
y="1052.8319"
x="385.28793"
style="font-style:normal;font-weight:normal;font-size:23px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;opacity:0.85;fill:#ffffff;fill-opacity:1;stroke:none"
xml:space="preserve"><tspan
y="1052.8319"
x="385.28793"
id="tspan9117-8"
sodipodi:role="line">4</tspan></text>
</g><g
transform="translate(0,-37)"
id="aileron-rudder-up"><path
style="color:#000000;fill:#1b421b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter9921);enable-background:accumulate"
@ -2910,11 +2917,7 @@
style="fill:#49494b"
inkscape:connector-curvature="0"
id="path5397_3_-36-52-5"
d="M 411.403,217.337 C 422.322,228.265 422.322,245.981 411.39,256.901 C 400.469,267.826 382.753,267.826 371.827,256.901 C 360.906,245.98 360.906,228.268 371.837,217.346 C 382.758,206.42 400.472,206.418 411.402,217.335" /></g><path
id="path3977-3-3-7-5"
d="M 852.7528,1883.1575 L 855.0628,1882.8494 C 855.3278,1884.1584 855.7798,1885.1025 856.4168,1885.6765 C 857.0538,1886.2545 857.8328,1886.5434 858.7488,1886.5434 C 859.8358,1886.5434 860.7538,1886.1664 861.5018,1885.4145 C 862.2508,1884.6605 862.6238,1883.7285 862.6238,1882.6155 C 862.6238,1881.5524 862.2758,1880.6775 861.5858,1879.9905 C 860.8928,1879.3025 860.0108,1878.9574 858.9399,1878.9574 C 858.5018,1878.9574 857.9609,1879.0434 857.3098,1879.2155 L 857.5659,1877.1884 C 857.7198,1877.2064 857.8448,1877.2124 857.9388,1877.2124 C 858.9229,1877.2124 859.8099,1876.9554 860.5968,1876.4414 C 861.3838,1875.9253 861.7769,1875.1344 861.7769,1874.0674 C 861.7769,1873.2194 861.4918,1872.5194 860.9198,1871.9634 C 860.3458,1871.4074 859.6068,1871.1294 858.6968,1871.1294 C 857.7998,1871.1294 857.0508,1871.4114 856.4508,1871.9784 C 855.8518,1872.5414 855.4668,1873.3884 855.2948,1874.5194 L 852.9849,1874.1084 C 853.2668,1872.5594 853.9078,1871.3604 854.9098,1870.5064 C 855.9099,1869.6544 857.1558,1869.2314 858.6448,1869.2314 C 859.6698,1869.2314 860.6178,1869.4524 861.4808,1869.8934 C 862.3448,1870.3314 863.0048,1870.9334 863.4638,1871.6964 C 863.9208,1872.4584 864.1498,1873.2654 864.1498,1874.1224 C 864.1498,1874.9354 863.9308,1875.6753 863.4959,1876.3434 C 863.0598,1877.0093 862.4138,1877.5404 861.5588,1877.9374 C 862.6688,1878.1934 863.5348,1878.7244 864.1498,1879.5354 C 864.7668,1880.3434 865.0738,1881.3554 865.0738,1882.5704 C 865.0738,1884.2134 864.4758,1885.6054 863.2788,1886.7484 C 862.0798,1887.8904 860.5648,1888.4614 858.7339,1888.4614 C 857.0828,1888.4614 855.7119,1887.9694 854.6208,1886.9854 C 853.5288,1885.9994 852.9058,1884.7243 852.7528,1883.1574 z"
inkscape:connector-curvature="0"
style="opacity:0.72250001;fill:#ffffff" /><g
d="M 411.403,217.337 C 422.322,228.265 422.322,245.981 411.39,256.901 C 400.469,267.826 382.753,267.826 371.827,256.901 C 360.906,245.98 360.906,228.268 371.837,217.346 C 382.758,206.42 400.472,206.418 411.402,217.335" /></g><g
transform="translate(443.55402,-65.342581)"
id="g6340-2"><path
id="path4057-5-4"
@ -2940,11 +2943,18 @@
style="fill:#49494b"
inkscape:connector-curvature="0"
id="path5397_3_-2-7"
d="M 411.403,217.337 C 422.322,228.265 422.322,245.981 411.39,256.901 C 400.469,267.826 382.753,267.826 371.827,256.901 C 360.906,245.98 360.906,228.268 371.837,217.346 C 382.758,206.42 400.472,206.418 411.402,217.335" /></g><path
style="opacity:0.72250001;fill:#ffffff"
inkscape:connector-curvature="0"
d="M 363.37692,1817.6768 L 365.68692,1817.3687 C 365.95192,1818.6777 366.40392,1819.6218 367.04092,1820.1958 C 367.67792,1820.7738 368.45692,1821.0627 369.37292,1821.0627 C 370.45992,1821.0627 371.37792,1820.6857 372.12592,1819.9338 C 372.87492,1819.1798 373.24792,1818.2478 373.24792,1817.1348 C 373.24792,1816.0717 372.89992,1815.1968 372.20992,1814.5098 C 371.51692,1813.8218 370.63492,1813.4767 369.56392,1813.4767 C 369.12592,1813.4767 368.58492,1813.5627 367.93392,1813.7348 L 368.18992,1811.7077 C 368.34392,1811.7257 368.46892,1811.7317 368.56292,1811.7317 C 369.54692,1811.7317 370.43392,1811.4747 371.22092,1810.9607 C 372.00792,1810.4446 372.40092,1809.6537 372.40092,1808.5867 C 372.40092,1807.7387 372.11592,1807.0387 371.54392,1806.4827 C 370.96992,1805.9267 370.23092,1805.6487 369.32092,1805.6487 C 368.42392,1805.6487 367.67492,1805.9307 367.07492,1806.4977 C 366.47592,1807.0607 366.09092,1807.9077 365.91892,1809.0387 L 363.60892,1808.6277 C 363.89092,1807.0787 364.53192,1805.8797 365.53392,1805.0257 C 366.53392,1804.1737 367.77992,1803.7507 369.26892,1803.7507 C 370.29392,1803.7507 371.24192,1803.9717 372.10492,1804.4127 C 372.96892,1804.8507 373.62892,1805.4527 374.08792,1806.2157 C 374.54492,1806.9777 374.77392,1807.7847 374.77392,1808.6417 C 374.77392,1809.4547 374.55492,1810.1946 374.11992,1810.8627 C 373.68392,1811.5286 373.03792,1812.0597 372.18292,1812.4567 C 373.29292,1812.7127 374.15892,1813.2437 374.77392,1814.0547 C 375.39092,1814.8627 375.69792,1815.8747 375.69792,1817.0897 C 375.69792,1818.7327 375.09992,1820.1247 373.90292,1821.2677 C 372.70392,1822.4096 371.18892,1822.9806 369.35792,1822.9806 C 367.70692,1822.9806 366.33592,1822.4886 365.24492,1821.5047 C 364.15292,1820.5187 363.52992,1819.2436 363.37692,1817.6767 z"
id="path3977-3-3-9-7-9" /></g><g
d="M 411.403,217.337 C 422.322,228.265 422.322,245.981 411.39,256.901 C 400.469,267.826 382.753,267.826 371.827,256.901 C 360.906,245.98 360.906,228.268 371.837,217.346 C 382.758,206.42 400.472,206.418 411.402,217.335" /></g><text
sodipodi:linespacing="125%"
id="text9115-9-1-6"
y="1822.5546"
x="359.16998"
style="font-style:normal;font-weight:normal;font-size:26.06295967px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;opacity:0.85;fill:#ffffff;fill-opacity:1;stroke:none"
xml:space="preserve"><tspan
y="1822.5546"
x="359.16998"
id="tspan9117-2-6-3"
sodipodi:role="line">4</tspan></text>
</g><g
id="vtail-propeller"
transform="matrix(-0.63758198,0,0,0.63758198,1066.3515,909.70159)"
inkscape:transform-center-x="-2.4156725"><g
@ -2960,7 +2970,18 @@
style="fill:#010101"
inkscape:connector-curvature="0"
id="path3575-4-2"
d="M 388.375,1470.057 H 409.069 C 409.069,1470.057 403.881,1454.799 398.709,1454.682 C 393.533,1454.565 388.375,1470.057 388.375,1470.057 z" /></g></g><g
d="M 388.375,1470.057 H 409.069 C 409.069,1470.057 403.881,1454.799 398.709,1454.682 C 393.533,1454.565 388.375,1470.057 388.375,1470.057 z" /></g><text
sodipodi:linespacing="125%"
id="text9115-9-1-69"
y="1888.2104"
x="850.80811"
style="font-style:normal;font-weight:normal;font-size:26.06295967px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;opacity:0.85;fill:#ffffff;fill-opacity:1;stroke:none"
xml:space="preserve"><tspan
y="1888.2104"
x="850.80811"
id="tspan9117-2-6-8"
sodipodi:role="line">4</tspan></text>
</g><g
transform="translate(-67.999261,-57.002699)"
id="vtail-rudder-left"><g
transform="matrix(-1,0,0,1,772.16163,2186.5467)"
@ -3086,18 +3107,11 @@
style="fill:#49494b"
inkscape:connector-curvature="0"
id="path5397_3_-36-4-4-2"
d="M 411.403,217.337 C 422.322,228.265 422.322,245.981 411.39,256.901 C 400.469,267.826 382.753,267.826 371.827,256.901 C 360.906,245.98 360.906,228.268 371.837,217.346 C 382.758,206.42 400.472,206.418 411.402,217.335" /></g><text
xml:space="preserve"
style="font-size:26.04472542px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Sans"
x="239.17444"
y="352.68146"
id="text9115-5-5"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan9117-6-3"
x="239.17444"
y="352.68146">4</tspan></text>
</g></g><g
d="M 411.403,217.337 C 422.322,228.265 422.322,245.981 411.39,256.901 C 400.469,267.826 382.753,267.826 371.827,256.901 C 360.906,245.98 360.906,228.268 371.837,217.346 C 382.758,206.42 400.472,206.418 411.402,217.335" /></g><path
style="opacity:0.72250001;fill:#ffffff"
inkscape:connector-curvature="0"
d="m 240.38826,348.07021 l 2.61579,-0.3489 c 0.30008,1.4823 0.81192,2.5513 1.53324,3.2013 c 0.72133,0.6545 1.60345,0.9817 2.64071,0.9817 c 1.2309,0 2.27042,-0.4269 3.11744,-1.2783 c 0.84815,-0.8539 1.27053,-1.9092 1.27053,-3.1696 c 0,-1.2038 -0.39407,-2.1945 -1.17541,-2.9725 c -0.78474,-0.7791 -1.7835,-1.1698 -2.99626,-1.1698 c -0.496,0 -1.1086,0.097 -1.84579,0.2922 l 0.2899,-2.2954 c 0.17437,0.02 0.31592,0.027 0.42236,0.027 c 1.11428,0 2.1187,-0.2911 3.00987,-0.8731 c 0.89118,-0.5844 1.33622,-1.48 1.33622,-2.6883 c 0,-0.9602 -0.32274,-1.7529 -0.97046,-2.3825 c -0.64999,-0.6296 -1.48682,-0.9444 -2.51728,-0.9444 c -1.01575,0 -1.8639,0.3193 -2.54333,0.9614 c -0.67829,0.6375 -1.11426,1.5966 -1.30903,2.8774 l -2.61578,-0.4654 c 0.31932,-1.7541 1.04517,-3.1118 2.17982,-4.0789 c 1.13239,-0.9648 2.54332,-1.4438 4.22943,-1.4438 c 1.16069,0 2.23419,0.2503 3.21143,0.7497 c 0.97838,0.496 1.72575,1.1777 2.24551,2.0417 c 0.5175,0.8628 0.77681,1.7767 0.77681,2.7471 c 0,0.9206 -0.24799,1.7585 -0.74056,2.515 c -0.49373,0.7541 -1.22525,1.3555 -2.19343,1.805 c 1.25694,0.2899 2.23758,0.8912 2.93399,1.8096 c 0.69868,0.9149 1.04632,2.0609 1.04632,3.4368 c 0,1.8604 -0.67716,3.4367 -2.03262,4.731 c -1.35772,1.2931 -3.07328,1.9397 -5.14665,1.9397 c -1.86957,0 -3.42205,-0.5571 -4.65749,-1.6713 c -1.23656,-1.1165 -1.94203,-2.5604 -2.11528,-4.3347 z"
id="path3977-3-3-9-2-4" /></g></g><g
transform="matrix(0.24155639,0.04066618,-0.01522365,0.28523213,320.2016,2540.2212)"
id="g6813-1"><g
id="g5671-4-9-7"
@ -5206,11 +5220,18 @@
style="fill:#49494b"
inkscape:connector-curvature="0"
id="path5397_3_-3-1"
d="M 411.403,217.337 C 422.322,228.265 422.322,245.981 411.39,256.901 C 400.469,267.826 382.753,267.826 371.827,256.901 C 360.906,245.98 360.906,228.268 371.837,217.346 C 382.758,206.42 400.472,206.418 411.402,217.335" /></g></g><path
style="opacity:0.85;fill:#ffffff"
inkscape:connector-curvature="0"
d="M 587.80666,780.93972 L 590.11666,780.63172 C 590.38166,781.94072 590.83366,782.88472 591.47066,783.45872 C 592.10766,784.03672 592.88666,784.32572 593.80266,784.32572 C 594.88966,784.32572 595.80766,783.94872 596.55566,783.19672 C 597.30466,782.44272 597.67766,781.51072 597.67766,780.39772 C 597.67766,779.33472 597.32966,778.45972 596.63966,777.77272 C 595.94666,777.08472 595.06466,776.73972 593.99366,776.73972 C 593.55566,776.73972 593.01466,776.82572 592.36366,776.99772 L 592.61966,774.97072 C 592.77366,774.98872 592.89866,774.99472 592.99266,774.99472 C 593.97666,774.99472 594.86366,774.73772 595.65066,774.22372 C 596.43766,773.70772 596.83066,772.91672 596.83066,771.84972 C 596.83066,771.00172 596.54566,770.30172 595.97366,769.74572 C 595.39966,769.18972 594.66066,768.91172 593.75066,768.91172 C 592.85366,768.91172 592.10466,769.19372 591.50466,769.76072 C 590.90566,770.32372 590.52066,771.17072 590.34866,772.30172 L 588.03866,771.89072 C 588.32066,770.34172 588.96166,769.14272 589.96366,768.28872 C 590.96366,767.43672 592.20966,767.01372 593.69866,767.01372 C 594.72366,767.01372 595.67166,767.23472 596.53466,767.67572 C 597.39866,768.11372 598.05866,768.71572 598.51766,769.47872 C 598.97466,770.24072 599.20366,771.04772 599.20366,771.90472 C 599.20366,772.71772 598.98466,773.45772 598.54966,774.12572 C 598.11366,774.79172 597.46766,775.32272 596.61266,775.71972 C 597.72266,775.97572 598.58866,776.50672 599.20366,777.31772 C 599.82066,778.12572 600.12766,779.13772 600.12766,780.35272 C 600.12766,781.99572 599.52966,783.38772 598.33266,784.53072 C 597.13366,785.67272 595.61866,786.24372 593.78766,786.24372 C 592.13666,786.24372 590.76566,785.75172 589.67466,784.76772 C 588.58266,783.78172 587.95966,782.50672 587.80666,780.93972 z"
id="path3977-3" /></g><g
d="M 411.403,217.337 C 422.322,228.265 422.322,245.981 411.39,256.901 C 400.469,267.826 382.753,267.826 371.827,256.901 C 360.906,245.98 360.906,228.268 371.837,217.346 C 382.758,206.42 400.472,206.418 411.402,217.335" /></g></g><text
sodipodi:linespacing="125%"
id="text9115-0"
y="784.30853"
x="586.64508"
style="font-style:normal;font-weight:normal;font-size:23px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;opacity:0.85;fill:#ffffff;fill-opacity:1;stroke:none"
xml:space="preserve"><tspan
y="784.30853"
x="586.64508"
id="tspan9117-4"
sodipodi:role="line">4</tspan></text>
</g><g
id="elevon-motor-symbol"
inkscape:label="#elevon-motor-symbol"><path
style="opacity:0.425;fill:#b2c7e7"
@ -5232,11 +5253,18 @@
style="fill:#49494b"
inkscape:connector-curvature="0"
id="path5397_3_-3"
d="M 411.403,217.337 C 422.322,228.265 422.322,245.981 411.39,256.901 C 400.469,267.826 382.753,267.826 371.827,256.901 C 360.906,245.98 360.906,228.268 371.837,217.346 C 382.758,206.42 400.472,206.418 411.402,217.335" /></g><path
id="path3977-3-1"
d="M 255.67105,785.26961 L 257.98105,784.96161 C 258.24605,786.27061 258.69805,787.21461 259.33505,787.78861 C 259.97205,788.36661 260.75105,788.65561 261.66705,788.65561 C 262.75405,788.65561 263.67205,788.27861 264.42005,787.52661 C 265.16905,786.77261 265.54205,785.84061 265.54205,784.72761 C 265.54205,783.66461 265.19405,782.78961 264.50405,782.10261 C 263.81105,781.41461 262.92905,781.06961 261.85805,781.06961 C 261.42005,781.06961 260.87905,781.15561 260.22805,781.32761 L 260.48405,779.30061 C 260.63805,779.31861 260.76305,779.32461 260.85705,779.32461 C 261.84105,779.32461 262.72805,779.06761 263.51505,778.55361 C 264.30205,778.03761 264.69505,777.24661 264.69505,776.17961 C 264.69505,775.33161 264.41005,774.63161 263.83805,774.07561 C 263.26405,773.51961 262.52505,773.24161 261.61505,773.24161 C 260.71805,773.24161 259.96905,773.52361 259.36905,774.09061 C 258.77005,774.65361 258.38505,775.50061 258.21305,776.63161 L 255.90305,776.22061 C 256.18505,774.67161 256.82605,773.47261 257.82805,772.61861 C 258.82805,771.76661 260.07405,771.34361 261.56305,771.34361 C 262.58805,771.34361 263.53605,771.56461 264.39905,772.00561 C 265.26305,772.44361 265.92305,773.04561 266.38205,773.80861 C 266.83905,774.57061 267.06805,775.37761 267.06805,776.23461 C 267.06805,777.04761 266.84905,777.78761 266.41405,778.45561 C 265.97805,779.12161 265.33205,779.65261 264.47705,780.04961 C 265.58705,780.30561 266.45305,780.83661 267.06805,781.64761 C 267.68505,782.45561 267.99205,783.46761 267.99205,784.68261 C 267.99205,786.32561 267.39405,787.71761 266.19705,788.86061 C 264.99805,790.00261 263.48305,790.57361 261.65205,790.57361 C 260.00105,790.57361 258.63005,790.08161 257.53905,789.09761 C 256.44705,788.11161 255.82405,786.83661 255.67105,785.26961 z"
inkscape:connector-curvature="0"
style="opacity:0.85;fill:#ffffff" /></g></g><g
d="M 411.403,217.337 C 422.322,228.265 422.322,245.981 411.39,256.901 C 400.469,267.826 382.753,267.826 371.827,256.901 C 360.906,245.98 360.906,228.268 371.837,217.346 C 382.758,206.42 400.472,206.418 411.402,217.335" /></g><text
sodipodi:linespacing="125%"
id="text9115"
y="789.39893"
x="254.08835"
style="font-style:normal;font-weight:normal;font-size:23px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;opacity:0.85;fill:#ffffff;fill-opacity:1;stroke:none"
xml:space="preserve"><tspan
y="789.39893"
x="254.08835"
id="tspan9117"
sodipodi:role="line">4</tspan></text>
</g></g><g
transform="matrix(0,0.89177349,-0.89177349,0,1860.539,420.59648)"
id="elevon-propeller"
style="fill:#000000;fill-opacity:1"><g
@ -5797,11 +5825,7 @@
d="M 411.403,217.337 C 422.322,228.265 422.322,245.981 411.39,256.901 C 400.469,267.826 382.753,267.826 371.827,256.901 C 360.906,245.98 360.906,228.268 371.837,217.346 C 382.758,206.42 400.472,206.418 411.402,217.335"
id="path5397_3_-36-52"
inkscape:connector-curvature="0"
style="fill:#49494b" /></g><path
style="opacity:0.72250001;fill:#ffffff"
inkscape:connector-curvature="0"
d="M 440.4704,1955.4608 L 442.7804,1955.1527 C 443.0454,1956.4617 443.4974,1957.4058 444.1344,1957.9798 C 444.7714,1958.5578 445.5504,1958.8467 446.4664,1958.8467 C 447.5534,1958.8467 448.4714,1958.4697 449.2194,1957.7178 C 449.9684,1956.9638 450.3414,1956.0318 450.3414,1954.9188 C 450.3414,1953.8557 449.9934,1952.9808 449.3034,1952.2938 C 448.6104,1951.6058 447.7284,1951.2607 446.6575,1951.2607 C 446.2194,1951.2607 445.6785,1951.3467 445.0274,1951.5188 L 445.2835,1949.4917 C 445.4374,1949.5097 445.5624,1949.5157 445.6564,1949.5157 C 446.6405,1949.5157 447.5275,1949.2587 448.3144,1948.7447 C 449.1014,1948.2286 449.4945,1947.4377 449.4945,1946.3707 C 449.4945,1945.5227 449.2094,1944.8227 448.6374,1944.2667 C 448.0634,1943.7107 447.3244,1943.4327 446.4144,1943.4327 C 445.5174,1943.4327 444.7684,1943.7147 444.1684,1944.2817 C 443.5694,1944.8447 443.1844,1945.6917 443.0124,1946.8227 L 440.7025,1946.4117 C 440.9844,1944.8627 441.6254,1943.6637 442.6274,1942.8097 C 443.6275,1941.9577 444.8734,1941.5347 446.3624,1941.5347 C 447.3874,1941.5347 448.3354,1941.7557 449.1984,1942.1967 C 450.0624,1942.6347 450.7224,1943.2367 451.1814,1943.9997 C 451.6384,1944.7617 451.8674,1945.5687 451.8674,1946.4257 C 451.8674,1947.2387 451.6484,1947.9786 451.2135,1948.6467 C 450.7774,1949.3126 450.1314,1949.8437 449.2764,1950.2407 C 450.3864,1950.4967 451.2524,1951.0277 451.8674,1951.8387 C 452.4844,1952.6467 452.7914,1953.6587 452.7914,1954.8737 C 452.7914,1956.5167 452.1934,1957.9087 450.9964,1959.0517 C 449.7974,1960.1937 448.2824,1960.7647 446.4515,1960.7647 C 444.8004,1960.7647 443.4295,1960.2727 442.3384,1959.2887 C 441.2464,1958.3027 440.6234,1957.0276 440.4704,1955.4607 z"
id="path3977-3-3-7" /><g
style="fill:#49494b" /></g><g
id="g6340"><path
style="stroke:#58595b;stroke-width:0.97666031;stroke-miterlimit:10"
inkscape:connector-curvature="0"
@ -5826,11 +5850,18 @@
d="M 411.403,217.337 C 422.322,228.265 422.322,245.981 411.39,256.901 C 400.469,267.826 382.753,267.826 371.827,256.901 C 360.906,245.98 360.906,228.268 371.837,217.346 C 382.758,206.42 400.472,206.418 411.402,217.335"
id="path5397_3_-2"
inkscape:connector-curvature="0"
style="fill:#49494b" /></g><path
id="path3977-3-3-9-7"
d="M 382.0175,1799.7382 L 384.3275,1799.4301 C 384.5925,1800.7391 385.0445,1801.6832 385.6815,1802.2572 C 386.3185,1802.8352 387.0975,1803.1241 388.0135,1803.1241 C 389.1005,1803.1241 390.0185,1802.7471 390.7665,1801.9952 C 391.5155,1801.2412 391.8885,1800.3092 391.8885,1799.1962 C 391.8885,1798.1331 391.5405,1797.2582 390.8505,1796.5712 C 390.1575,1795.8832 389.2755,1795.5381 388.2045,1795.5381 C 387.7665,1795.5381 387.2255,1795.6241 386.5745,1795.7962 L 386.8305,1793.7691 C 386.9845,1793.7871 387.1095,1793.7931 387.2035,1793.7931 C 388.1875,1793.7931 389.0745,1793.5361 389.8615,1793.0221 C 390.6485,1792.506 391.0415,1791.7151 391.0415,1790.6481 C 391.0415,1789.8001 390.7565,1789.1001 390.1845,1788.5441 C 389.6105,1787.9881 388.8715,1787.7101 387.9615,1787.7101 C 387.0645,1787.7101 386.3155,1787.9921 385.7155,1788.5591 C 385.1165,1789.1221 384.7315,1789.9691 384.5595,1791.1001 L 382.2495,1790.6891 C 382.5315,1789.1401 383.1725,1787.9411 384.1745,1787.0871 C 385.1745,1786.2351 386.4205,1785.8121 387.9095,1785.8121 C 388.9345,1785.8121 389.8825,1786.0331 390.7455,1786.4741 C 391.6095,1786.9121 392.2695,1787.5141 392.7285,1788.2771 C 393.1855,1789.0391 393.4145,1789.8461 393.4145,1790.7031 C 393.4145,1791.5161 393.1955,1792.256 392.7605,1792.9241 C 392.3245,1793.59 391.6785,1794.1211 390.8235,1794.5181 C 391.9335,1794.7741 392.7995,1795.3051 393.4145,1796.1161 C 394.0315,1796.9241 394.3385,1797.9361 394.3385,1799.1511 C 394.3385,1800.7941 393.7405,1802.1861 392.5435,1803.3291 C 391.3445,1804.471 389.8295,1805.042 387.9985,1805.042 C 386.3475,1805.042 384.9765,1804.55 383.8855,1803.5661 C 382.7935,1802.5801 382.1705,1801.305 382.0175,1799.7381 z"
inkscape:connector-curvature="0"
style="opacity:0.72250001;fill:#ffffff" /></g><g
style="fill:#49494b" /></g><text
sodipodi:linespacing="125%"
id="text9115-9-1"
y="1805.3853"
x="380.32986"
style="font-style:normal;font-weight:normal;font-size:26.06295967px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;opacity:0.85;fill:#ffffff;fill-opacity:1;stroke:none"
xml:space="preserve"><tspan
y="1805.3853"
x="380.32986"
id="tspan9117-2-6"
sodipodi:role="line">4</tspan></text>
</g><g
transform="translate(-12.266231,444.46505)"
id="aileron-propeller-4"><g
id="g3577-4"
@ -5844,7 +5875,18 @@
d="M 388.375,1470.057 H 409.069 C 409.069,1470.057 403.881,1454.799 398.709,1454.682 C 393.533,1454.565 388.375,1470.057 388.375,1470.057 z"
id="path3575-4"
inkscape:connector-curvature="0"
style="fill:#010101" /></g></g><g
style="fill:#010101" /></g><text
sodipodi:linespacing="125%"
id="text9115-9-0"
y="1960.5138"
x="438.52573"
style="font-style:normal;font-weight:normal;font-size:26.06295967px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;opacity:0.85;fill:#ffffff;fill-opacity:1;stroke:none"
xml:space="preserve"><tspan
y="1960.5138"
x="438.52573"
id="tspan9117-2-2"
sodipodi:role="line">4</tspan></text>
</g><g
transform="translate(-67.999261,-57.002699)"
id="singleaileron-aileron"><g
transform="translate(-12.266231,1452.4651)"
@ -6559,18 +6601,11 @@
d="M 411.403,217.337 C 422.322,228.265 422.322,245.981 411.39,256.901 C 400.469,267.826 382.753,267.826 371.827,256.901 C 360.906,245.98 360.906,228.268 371.837,217.346 C 382.758,206.42 400.472,206.418 411.402,217.335"
id="path5397_3_-36-4-4"
inkscape:connector-curvature="0"
style="fill:#49494b" /></g><text
sodipodi:linespacing="125%"
id="text9115-5"
y="352.53461"
x="238.86888"
style="font-size:26.04472542px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Sans"
xml:space="preserve"><tspan
y="352.53461"
x="238.86888"
id="tspan9117-6"
sodipodi:role="line">4</tspan></text>
</g></g><rect
style="fill:#49494b" /></g><path
style="opacity:0.72250001;fill:#ffffff"
inkscape:connector-curvature="0"
d="m 240.38826,348.07021 l 2.61579,-0.3489 c 0.30008,1.4823 0.81192,2.5513 1.53324,3.2013 c 0.72133,0.6545 1.60345,0.9817 2.64071,0.9817 c 1.2309,0 2.27042,-0.4269 3.11744,-1.2783 c 0.84815,-0.8539 1.27053,-1.9092 1.27053,-3.1696 c 0,-1.2038 -0.39407,-2.1945 -1.17541,-2.9725 c -0.78474,-0.7791 -1.7835,-1.1698 -2.99626,-1.1698 c -0.496,0 -1.1086,0.097 -1.84579,0.2922 l 0.2899,-2.2954 c 0.17437,0.02 0.31592,0.027 0.42236,0.027 c 1.11428,0 2.1187,-0.2911 3.00987,-0.8731 c 0.89118,-0.5844 1.33622,-1.48 1.33622,-2.6883 c 0,-0.9602 -0.32274,-1.7529 -0.97046,-2.3825 c -0.64999,-0.6296 -1.48682,-0.9444 -2.51728,-0.9444 c -1.01575,0 -1.8639,0.3193 -2.54333,0.9614 c -0.67829,0.6375 -1.11426,1.5966 -1.30903,2.8774 l -2.61578,-0.4654 c 0.31932,-1.7541 1.04517,-3.1118 2.17982,-4.0789 c 1.13239,-0.9648 2.54332,-1.4438 4.22943,-1.4438 c 1.16069,0 2.23419,0.2503 3.21143,0.7497 c 0.97838,0.496 1.72575,1.1777 2.24551,2.0417 c 0.5175,0.8628 0.77681,1.7767 0.77681,2.7471 c 0,0.9206 -0.24799,1.7585 -0.74056,2.515 c -0.49373,0.7541 -1.22525,1.3555 -2.19343,1.805 c 1.25694,0.2899 2.23758,0.8912 2.93399,1.8096 c 0.69868,0.9149 1.04632,2.0609 1.04632,3.4368 c 0,1.8604 -0.67716,3.4367 -2.03262,4.731 c -1.35772,1.2931 -3.07328,1.9397 -5.14665,1.9397 c -1.86957,0 -3.42205,-0.5571 -4.65749,-1.6713 c -1.23656,-1.1165 -1.94203,-2.5604 -2.11528,-4.3347 z"
id="path3977-3-3-9-2" /></g></g><rect
id="rect3943-5"
height="7.783"
width="2.5840001"

Before

Width:  |  Height:  |  Size: 569 KiB

After

Width:  |  Height:  |  Size: 561 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 448 KiB

After

Width:  |  Height:  |  Size: 492 KiB

View File

@ -3,7 +3,7 @@
*
* @file vehicleconfigurationhelper.cpp
* @author The LibrePilot Project, http://www.librepilot.org Copyright (C) 2015.
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012.
* The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012.
* @addtogroup
* @{
* @addtogroup VehicleConfigurationHelper
@ -511,14 +511,22 @@ void VehicleConfigurationHelper::applyActuatorConfiguration()
for (quint16 i = 0; i < ActuatorSettings::BANKUPDATEFREQ_NUMELEM; i++) {
data.BankUpdateFreq[i] = servoFrequence;
data.BankMode[i] = ActuatorSettings::BANKMODE_PWM;
if (m_configSource->getControllerType() == VehicleConfigurationSource::CONTROLLER_REVO) {
if ((m_configSource->getControllerType() == VehicleConfigurationSource::CONTROLLER_CC) ||
(m_configSource->getControllerType() == VehicleConfigurationSource::CONTROLLER_CC3D)) {
// Motor output4, bank2
if (i == 1) {
data.BankUpdateFreq[i] = escFrequence;
}
} else if (m_configSource->getControllerType() == VehicleConfigurationSource::CONTROLLER_NANO) {
} else if (m_configSource->getControllerType() == VehicleConfigurationSource::CONTROLLER_REVO) {
// Motor output4, bank3
if (i == 2) {
data.BankUpdateFreq[i] = escFrequence;
}
} else if (m_configSource->getControllerType() == VehicleConfigurationSource::CONTROLLER_NANO) {
// Motor output4, bank4
if (i == 3) {
data.BankUpdateFreq[i] = escFrequence;
}
}
}
@ -548,11 +556,19 @@ void VehicleConfigurationHelper::applyActuatorConfiguration()
for (quint16 i = 0; i < ActuatorSettings::BANKUPDATEFREQ_NUMELEM; i++) {
data.BankUpdateFreq[i] = servoFrequence;
data.BankMode[i] = ActuatorSettings::BANKMODE_PWM;
if (m_configSource->getControllerType() == VehicleConfigurationSource::CONTROLLER_REVO) {
if ((m_configSource->getControllerType() == VehicleConfigurationSource::CONTROLLER_CC) ||
(m_configSource->getControllerType() == VehicleConfigurationSource::CONTROLLER_CC3D)) {
// Motor output4, bank2
if (i == 1) {
data.BankUpdateFreq[i] = escFrequence;
}
} else if (m_configSource->getControllerType() == VehicleConfigurationSource::CONTROLLER_REVO) {
// Motor output4, bank3
if (i == 1) {
data.BankUpdateFreq[i] = escFrequence;
}
} else if (m_configSource->getControllerType() == VehicleConfigurationSource::CONTROLLER_NANO) {
// Motor output4, bank4
if (i == 2) {
data.BankUpdateFreq[i] = escFrequence;
}
@ -1898,13 +1914,13 @@ void VehicleConfigurationHelper::setupDualAileron()
mixerChannelSettings channels[ActuatorSettings::CHANNELADDR_NUMELEM];
GUIConfigDataUnion guiSettings = getGUIConfigData();
// Motor (Chan 3)
channels[2].type = MIXER_TYPE_MOTOR;
channels[2].throttle1 = 100;
channels[2].throttle2 = 0;
channels[2].roll = 0;
channels[2].pitch = 0;
channels[2].yaw = 0;
// Motor (Chan 4)
channels[3].type = MIXER_TYPE_MOTOR;
channels[3].throttle1 = 100;
channels[3].throttle2 = 0;
channels[3].roll = 0;
channels[3].pitch = 0;
channels[3].yaw = 0;
// Aileron Servo 1 (Chan 1)
channels[0].type = MIXER_TYPE_SERVO;
@ -1930,19 +1946,19 @@ void VehicleConfigurationHelper::setupDualAileron()
channels[1].pitch = 100;
channels[1].yaw = 0;
// Rudder Servo (Chan 4)
channels[3].type = MIXER_TYPE_SERVO;
channels[3].throttle1 = 0;
channels[3].throttle2 = 0;
channels[3].roll = 0;
channels[3].pitch = 0;
channels[3].yaw = -100;
// Rudder Servo (Chan 3)
channels[2].type = MIXER_TYPE_SERVO;
channels[2].throttle1 = 0;
channels[2].throttle2 = 0;
channels[2].roll = 0;
channels[2].pitch = 0;
channels[2].yaw = -100;
guiSettings.fixedwing.FixedWingThrottle = 3;
guiSettings.fixedwing.FixedWingThrottle = 4;
guiSettings.fixedwing.FixedWingRoll1 = 1;
guiSettings.fixedwing.FixedWingRoll2 = 6;
guiSettings.fixedwing.FixedWingPitch1 = 2;
guiSettings.fixedwing.FixedWingYaw1 = 4;
guiSettings.fixedwing.FixedWingYaw1 = 3;
applyMixerConfiguration(channels);
applyMultiGUISettings(SystemSettings::AIRFRAMETYPE_FIXEDWING, guiSettings);
@ -1958,13 +1974,13 @@ void VehicleConfigurationHelper::setupAileron()
mixerChannelSettings channels[ActuatorSettings::CHANNELADDR_NUMELEM];
GUIConfigDataUnion guiSettings = getGUIConfigData();
// Motor (Chan 3)
channels[2].type = MIXER_TYPE_MOTOR;
channels[2].throttle1 = 100;
channels[2].throttle2 = 0;
channels[2].roll = 0;
channels[2].pitch = 0;
channels[2].yaw = 0;
// Motor (Chan 4)
channels[3].type = MIXER_TYPE_MOTOR;
channels[3].throttle1 = 100;
channels[3].throttle2 = 0;
channels[3].roll = 0;
channels[3].pitch = 0;
channels[3].yaw = 0;
// Aileron Servo (Chan 1)
channels[0].type = MIXER_TYPE_SERVO;
@ -1982,18 +1998,18 @@ void VehicleConfigurationHelper::setupAileron()
channels[1].pitch = 100;
channels[1].yaw = 0;
// Rudder Servo (Chan 4)
channels[3].type = MIXER_TYPE_SERVO;
channels[3].throttle1 = 0;
channels[3].throttle2 = 0;
channels[3].roll = 0;
channels[3].pitch = 0;
channels[3].yaw = -100;
// Rudder Servo (Chan 3)
channels[2].type = MIXER_TYPE_SERVO;
channels[2].throttle1 = 0;
channels[2].throttle2 = 0;
channels[2].roll = 0;
channels[2].pitch = 0;
channels[2].yaw = -100;
guiSettings.fixedwing.FixedWingThrottle = 3;
guiSettings.fixedwing.FixedWingThrottle = 4;
guiSettings.fixedwing.FixedWingRoll1 = 1;
guiSettings.fixedwing.FixedWingPitch1 = 2;
guiSettings.fixedwing.FixedWingYaw1 = 4;
guiSettings.fixedwing.FixedWingYaw1 = 3;
applyMixerConfiguration(channels);
applyMultiGUISettings(SystemSettings::AIRFRAMETYPE_FIXEDWING, guiSettings);
@ -2009,13 +2025,13 @@ void VehicleConfigurationHelper::setupVtail()
mixerChannelSettings channels[ActuatorSettings::CHANNELADDR_NUMELEM];
GUIConfigDataUnion guiSettings = getGUIConfigData();
// Motor (Chan 3)
channels[2].type = MIXER_TYPE_MOTOR;
channels[2].throttle1 = 100;
channels[2].throttle2 = 0;
channels[2].roll = 0;
channels[2].pitch = 0;
channels[2].yaw = 0;
// Motor (Chan 4)
channels[3].type = MIXER_TYPE_MOTOR;
channels[3].throttle1 = 100;
channels[3].throttle2 = 0;
channels[3].roll = 0;
channels[3].pitch = 0;
channels[3].yaw = 0;
// Aileron Servo (Chan 1)
channels[0].type = MIXER_TYPE_SERVO;
@ -2041,18 +2057,18 @@ void VehicleConfigurationHelper::setupVtail()
channels[1].pitch = 100;
channels[1].yaw = -100;
// Left Vtail Servo (Chan 4)
channels[3].type = MIXER_TYPE_SERVO;
channels[3].throttle1 = 0;
channels[3].throttle2 = 0;
channels[3].roll = 0;
channels[3].pitch = -100;
channels[3].yaw = -100;
// Left Vtail Servo (Chan 3)
channels[2].type = MIXER_TYPE_SERVO;
channels[2].throttle1 = 0;
channels[2].throttle2 = 0;
channels[2].roll = 0;
channels[2].pitch = -100;
channels[2].yaw = -100;
guiSettings.fixedwing.FixedWingThrottle = 3;
guiSettings.fixedwing.FixedWingThrottle = 4;
guiSettings.fixedwing.FixedWingRoll1 = 1;
guiSettings.fixedwing.FixedWingRoll2 = 6;
guiSettings.fixedwing.FixedWingPitch1 = 4; // Vtail left (top view, nose up)
guiSettings.fixedwing.FixedWingPitch1 = 3; // Vtail left (top view, nose up)
guiSettings.fixedwing.FixedWingPitch2 = 2; // Vtail right
applyMixerConfiguration(channels);
@ -2083,16 +2099,16 @@ void VehicleConfigurationHelper::setupCar()
channels[0].pitch = 0;
channels[0].yaw = 100;
// Motor (Chan 2)
channels[1].type = MIXER_TYPE_REVERSABLEMOTOR;
channels[1].throttle1 = 100;
channels[1].throttle2 = 0;
channels[1].roll = 0;
channels[1].pitch = 0;
channels[1].yaw = 0;
// Motor (Chan 4)
channels[3].type = MIXER_TYPE_REVERSABLEMOTOR;
channels[3].throttle1 = 100;
channels[3].throttle2 = 0;
channels[3].roll = 0;
channels[3].pitch = 0;
channels[3].yaw = 0;
guiSettings.ground.GroundVehicleSteering1 = 1;
guiSettings.ground.GroundVehicleThrottle2 = 2;
guiSettings.ground.GroundVehicleThrottle2 = 4;
applyMixerConfiguration(channels);
applyMultiGUISettings(SystemSettings::AIRFRAMETYPE_GROUNDVEHICLECAR, guiSettings);
@ -2149,16 +2165,16 @@ void VehicleConfigurationHelper::setupMotorcycle()
channels[0].pitch = 0;
channels[0].yaw = 100;
// Motor (Chan 2)
channels[1].type = MIXER_TYPE_MOTOR;
channels[1].throttle1 = 100;
channels[1].throttle2 = 0;
channels[1].roll = 0;
channels[1].pitch = 0;
channels[1].yaw = 0;
// Motor (Chan 4)
channels[3].type = MIXER_TYPE_MOTOR;
channels[3].throttle1 = 100;
channels[3].throttle2 = 0;
channels[3].roll = 0;
channels[3].pitch = 0;
channels[3].yaw = 0;
guiSettings.ground.GroundVehicleSteering1 = 1;
guiSettings.ground.GroundVehicleThrottle2 = 2;
guiSettings.ground.GroundVehicleThrottle2 = 4;
applyMixerConfiguration(channels);
applyMultiGUISettings(SystemSettings::AIRFRAMETYPE_GROUNDVEHICLEMOTORCYCLE, guiSettings);

View File

@ -545,7 +545,7 @@ QString DeviceWidget::getDevFirmwarePath()
fwDirectory.cd("../../../../../..");
fwDirectoryStr = fwDirectory.absolutePath();
#endif
fwDirectoryStr = fwDirectoryStr + "/fw_" + myDevice->lblBrdName->text().toLower() + "/fw_" + myDevice->lblBrdName->text().toLower() + ".opfw";
fwDirectoryStr = fwDirectoryStr + "/firmware/fw_" + myDevice->lblBrdName->text().toLower() + "/fw_" + myDevice->lblBrdName->text().toLower() + ".opfw";
return fwDirectoryStr;
}

View File

View File

@ -36,12 +36,10 @@ fi
# Tools URLs to fetch
WGET_URL="http://librepilot.github.io/tools/wget.exe"
MAKE_URL="http://librepilot.github.io/tools/make.exe"
SEVENZIP_URL="http://librepilot.github.io/tools/7za.exe"
# Expected tools paths
WGET="$TOOLS_DIR/bin/`basename \"$WGET_URL\"`"
MAKE="$TOOLS_DIR/bin/`basename \"$MAKE_URL\"`"
SEVENZIP="$TOOLS_DIR/bin/`basename \"$SEVENZIP_URL\"`"
# wget is necessary to fetch other files
WGET_NAME="`basename \"$WGET\"`"
@ -97,20 +95,9 @@ if [ ! -x "$MAKE" ]; then
fi
fi
# 7-Zip is necessary to install some SDKs
if [ ! -x "$SEVENZIP" ]; then
echo "$SCRIPT_NAME: $SEVENZIP_NAME not found, fetching from $SEVENZIP_URL"
SEVENZIP_DIR="`dirname \"$SEVENZIP\"`"
mkdir -p "$SEVENZIP_DIR"
$WGET --no-check-certificate -N --content-disposition -P "$SEVENZIP_DIR" "$SEVENZIP_URL"
if [ $? -ne 0 ]; then
echo "$SCRIPT_NAME: $SEVENZIP_NAME fetch error, hope it's in the path..."
SEVENZIP_NAME="`basename \"$SEVENZIP\"`"
SEVENZIP="$SEVENZIP_NAME"
fi
fi
# Finally we can fetch all SDKs using top level Makefile
cd "$ROOT_DIR"
./tool_install.sh 7z
echo "Run 'tools/bin/make all_sdk_install' to install the other tools"
echo " or 'tools/bin/make help' for more info on make targets"

31
make/tool_install/7z.sh Normal file
View File

@ -0,0 +1,31 @@
# tool_url="http://www.7-zip.org/a/7z920.exe"
#tool_url="http://www.7-zip.org/a/7z920.msi"
tool_url="http://librepilot.github.io/tools/7za.exe"
tool_install_name="bin/7za.exe"
tool_extract_dir="$tools_dir/bin"
bin_dir=$tool_extract_dir
no_extract=true
module_file=bin
#Override
function validate_target { [ "$uname" = Windows ]; }
# Override
function dddownload_and_extract
{
local full_tool_install_name="$tools_dir/bin/$tool_install_name"
if ! [ -e "$full_tool_install_name" ] || $force
then
download_and_verify && \
rm -rf "$full_tool_install_name" && \
mkdir -p "$(dirname "$full_tool_install_name")" && \
mv "$downloaded_file" "$full_tool_install_name"
#msiexec //i "$downloaded_file" //q INSTALLDIR="$tools_dir"
#cmd //C "$downloaded_file" /S /D="${tools_dir//\//\\}"
fi
}

View File

@ -0,0 +1,29 @@
if [ "$uname" = Linux ]
then
url_ext="linux.tar.bz2"
elif [ "$uname" = Darwin ]
then
url_ext="mac.tar.bz2"
elif [ "$uname" = Windows ]
then
url_ext="win32.zip"
depends=(7z)
fi
pkgver=4.9_2015_q2_update
pkgdate=20150609
_pkgver=${pkgver//_/-}
_pkgvershort=${_pkgver%-*}
_pkgvershort=${_pkgvershort/-q/q}
tool_url="https://launchpad.net/gcc-arm-embedded/${pkgver%%_*}/${_pkgver}/+download/${tool}-${_pkgvershort/./_}-${pkgdate}-${url_ext}"
tool_md5_url="${tool_url}/+md5"
tool_install_name="${tool}-${_pkgvershort/./_}"
if [ "$uname" = Windows ]
then
tool_extract_dir=$tools_dir/$tool_install_name
fi
bin_subdir=bin
function validate_target { true; }

View File

@ -51,6 +51,35 @@ ifndef TOP_LEVEL_MAKEFILE
$(error $(notdir $(lastword $(MAKEFILE_LIST))) should be included by the top level Makefile)
endif
##############################
#
# Already installed tools modules
#
##############################
-include $(wildcard $(TOOLS_DIR)/*.mk)
TOOL_INSTALL := $(ROOT_DIR)/tool_install.sh
TOOL_TARGETS := gcc-arm-none-eabi
TOOL_INSTALL_TARGETS := $(addsuffix _install,$(TOOL_TARGETS))
TOOL_FORCE_INSTALL_TARGETS := $(addsuffix _force_install,$(TOOL_TARGETS))
TOOL_REMOVE_TARGETS := $(addsuffix _remove,$(TOOL_TARGETS))
.PHONY: $(TOOL_INSTALL_TARGETS)
$(TOOL_INSTALL_TARGETS):
@$(ECHO) $(MSG_INSTALLING) $(@:_install=)
$(V1) $(TOOL_INSTALL) -n $(@:_install=)
.PHONY: $(TOOL_FORCE_INSTALL_TARGETS)
$(TOOL_FORCE_INSTALL_TARGETS):
@$(ECHO) $(MSG_INSTALLING) $(@:_install=)
$(V1) $(TOOL_INSTALL) -n -f $(@:_force_install=)
.PHONY: $(TOOL_REMOVE_TARGETS)
$(TOOL_REMOVE_TARGETS):
@$(ECHO) $(MSG_CLEANING) $(@:_install=)
$(V1) $(TOOL_INSTALL) -n -r $(@:_remove=)
##############################
#
# Toolchain URLs and directories
@ -59,15 +88,11 @@ endif
ifeq ($(UNAME), Linux)
ifeq ($(ARCH), x86_64)
ARM_SDK_URL := https://launchpad.net/gcc-arm-embedded/4.9/4.9-2014-q4-major/+download/gcc-arm-none-eabi-4_9-2014q4-20141203-linux.tar.bz2
ARM_SDK_MD5_URL:= https://launchpad.net/gcc-arm-embedded/4.9/4.9-2014-q4-major/+download/gcc-arm-none-eabi-4_9-2014q4-20141203-linux.tar.bz2/+md5
QT_SDK_URL := http://download.qt.io/official_releases/qt/5.4/5.4.1/qt-opensource-linux-x64-5.4.1.run
QT_SDK_MD5_URL := http://download.qt.io/official_releases/qt/5.4/5.4.1/qt-opensource-linux-x64-5.4.1.run.md5
QT_SDK_ARCH := gcc_64
OSG_URL := http://librepilot.github.io/tools/osg-3.4-linux-x64-qt-5.4.1.tar.gz
else
ARM_SDK_URL := https://launchpad.net/gcc-arm-embedded/4.9/4.9-2014-q4-major/+download/gcc-arm-none-eabi-4_9-2014q4-20141203-linux.tar.bz2
ARM_SDK_MD5_URL := https://launchpad.net/gcc-arm-embedded/4.9/4.9-2014-q4-major/+download/gcc-arm-none-eabi-4_9-2014q4-20141203-linux.tar.bz2/+md5
QT_SDK_URL := http://download.qt.io/official_releases/qt/5.4/5.4.1/qt-opensource-linux-x86-5.4.1.run
QT_SDK_MD5_URL := http://download.qt.io/official_releases/qt/5.4/5.4.1/qt-opensource-linux-x86-5.4.1.run.md5
QT_SDK_ARCH := gcc
@ -76,8 +101,6 @@ ifeq ($(UNAME), Linux)
UNCRUSTIFY_URL := http://librepilot.github.io/tools/uncrustify-0.60.tar.gz
DOXYGEN_URL := http://librepilot.github.io/tools/doxygen-1.8.3.1.src.tar.gz
else ifeq ($(UNAME), Darwin)
ARM_SDK_URL := https://launchpad.net/gcc-arm-embedded/4.9/4.9-2014-q4-major/+download/gcc-arm-none-eabi-4_9-2014q4-20141203-mac.tar.bz2
ARM_SDK_MD5_URL:= https://launchpad.net/gcc-arm-embedded/4.9/4.9-2014-q4-major/+download/gcc-arm-none-eabi-4_9-2014q4-20141203-mac.tar.bz2/+md5
QT_SDK_URL := http://download.qt.io/official_releases/qt/5.4/5.4.1/qt-opensource-mac-x64-clang-5.4.1.dmg
QT_SDK_MD5_URL := http://download.qt.io/official_releases/qt/5.4/5.4.1/qt-opensource-mac-x64-clang-5.4.1.dmg.md5
QT_SDK_ARCH := clang_64
@ -88,8 +111,6 @@ else ifeq ($(UNAME), Darwin)
DOXYGEN_URL := http://librepilot.github.io/tools/doxygen-1.8.3.1.src.tar.gz
OSG_URL :=
else ifeq ($(UNAME), Windows)
ARM_SDK_URL := https://launchpad.net/gcc-arm-embedded/4.9/4.9-2014-q4-major/+download/gcc-arm-none-eabi-4_9-2014q4-20141203-win32.zip
ARM_SDK_MD5_URL:= https://launchpad.net/gcc-arm-embedded/4.9/4.9-2014-q4-major/+download/gcc-arm-none-eabi-4_9-2014q4-20141203-win32.zip/+md5
QT_SDK_URL := http://download.qt.io/official_releases/qt/5.4/5.4.1/qt-opensource-windows-x86-mingw491_opengl-5.4.1.exe
QT_SDK_MD5_URL := http://download.qt.io/official_releases/qt/5.4/5.4.1/qt-opensource-windows-x86-mingw491_opengl-5.4.1.exe.md5
QT_SDK_ARCH := mingw491_32
@ -109,7 +130,6 @@ GTEST_URL := http://librepilot.github.io/tools/gtest-1.6.0.zip
CCACHE_URL := http://samba.org/ftp/ccache/ccache-3.2.2.tar.bz2
CCACHE_MD5_URL := http://librepilot.github.io/tools/ccache-3.2.2.tar.bz2.md5
ARM_SDK_DIR := $(TOOLS_DIR)/gcc-arm-none-eabi-4_9-2014q4
QT_SDK_DIR := $(TOOLS_DIR)/qt-5.4.1
UNCRUSTIFY_DIR := $(TOOLS_DIR)/uncrustify-0.60
DOXYGEN_DIR := $(TOOLS_DIR)/doxygen-1.8.3.1
@ -581,26 +601,14 @@ endef
# ARM SDK
#
##############################
export ARM_SDK_PREFIX := arm-none-eabi-
ARM_SDK_TOOL := gcc-arm-none-eabi
ifeq ($(UNAME), Windows)
.PHONY: arm_sdk_install
arm_sdk_install: $(ARM_SDK_TOOL)_install
# unfortunately zip package for this release is missing root directory, so adding / at the end of the path
# so that template interpret last part as directory and use the full path
$(eval $(call TOOL_INSTALL_TEMPLATE,arm_sdk,$(ARM_SDK_DIR)/,$(ARM_SDK_URL),$(ARM_SDK_MD5_URL),$(notdir $(ARM_SDK_URL))))
else
$(eval $(call TOOL_INSTALL_TEMPLATE,arm_sdk,$(ARM_SDK_DIR),$(ARM_SDK_URL),$(ARM_SDK_MD5_URL),$(notdir $(ARM_SDK_URL))))
endif
ifeq ($(shell [ -d "$(ARM_SDK_DIR)" ] && $(ECHO) "exists"), exists)
export ARM_SDK_PREFIX := $(ARM_SDK_DIR)/bin/arm-none-eabi-
else
# not installed, hope it's in the path...
# $(info $(EMPTY) WARNING $(call toprel, $(ARM_SDK_DIR)) not found (make arm_sdk_install), using system PATH)
export ARM_SDK_PREFIX ?= arm-none-eabi-
endif
.PHONY: arm_sdk_clean
arm_sdk_clean: $(ARM_SDK_TOOL)_remove
.PHONY: arm_sdk_version
arm_sdk_version:

View File

@ -34,9 +34,10 @@ udevrulesdir := /etc/udev/rules.d
INSTALL = cp -a --no-preserve=ownership
LN = ln
LN_S = ln -s
RM_RF = rm -rf
RM_F = rm -f
.PHONY: install
install:
install: uninstall
@$(ECHO) " INSTALLING GCS TO $(DESTDIR)/)"
$(V1) $(MKDIR) -p $(DESTDIR)$(bindir)
$(V1) $(MKDIR) -p $(DESTDIR)$(libdir)
@ -57,3 +58,25 @@ ifneq ($(enable-udev-rules), no)
$(V1) $(MKDIR) -p $(DESTDIR)$(udevrulesdir)
$(V1) $(INSTALL) -T $(ROOT_DIR)/package/linux/45-uav.rules $(DESTDIR)$(udevrulesdir)/45-$(ORG_SMALL_NAME).rules
endif
# uninstall target to ensure no side effects from previous installations
.PHONY: uninstall
uninstall:
@$(ECHO) " UNINSTALLING GCS FROM $(DESTDIR)/)"
# Protect against inadvertant 'rm -rf /'
ifeq ($(GCS_SMALL_NAME),)
@$(ECHO) "Error in build configuration - GCS_SMALL_NAME not defined"
exit 1
endif
ifeq ($(ORG_SMALL_NAME),)
@$(ECHO) "Error in build configuration - ORG_SMALL_NAME not defined"
exit 1
endif
# ...safe to Proceed
$(V1) $(RM_RF) $(DESTDIR)$(bindir)/$(GCS_SMALL_NAME) # Remove application
$(V1) $(RM_RF) $(DESTDIR)$(libdir)/$(GCS_SMALL_NAME) # Remove libraries
$(V1) $(RM_RF) $(DESTDIR)$(datadir)/$(GCS_SMALL_NAME) # Remove other data
$(V1) $(RM_F) $(DESTDIR)$(datadir)/applications/$(ORG_SMALL_NAME).desktop
$(V1) $(RM_F) $(DESTDIR)$(datadir)/pixmaps/$(ORG_SMALL_NAME).png
$(V1) $(RM_F) $(DESTDIR)$(udevrulesdir)/45-$(ORG_SMALL_NAME).rules

View File

@ -8,7 +8,7 @@
<field name="Yaw" units="%" type="float" elements="1"/>
<field name="Collective" units="%" type="float" elements="1"/>
<field name="Thrust" units="%" type="float" elements="1"/>
<field name="Channel" units="us" type="uint16" elements="9"/>
<field name="Channel" units="us" type="uint16" elements="10"/>
<field name="FlightModeSwitchPosition" units="" type="uint8" elements="1" defaultvalue="0"/>
<access gcs="readwrite" flight="readwrite"/>
<telemetrygcs acked="false" updatemode="manual" period="0"/>

View File

@ -2,18 +2,18 @@
<object name="ManualControlSettings" singleinstance="true" settings="true" category="Control">
<description>Settings to indicate how to decode receiver input by @ref ManualControlModule.</description>
<field name="ChannelGroups" units="Channel Group" type="enum"
elementnames="Throttle,Roll,Pitch,Yaw,FlightMode,Collective,Accessory0,Accessory1,Accessory2"
elementnames="Throttle,Roll,Pitch,Yaw,FlightMode,Collective,Accessory0,Accessory1,Accessory2,Accessory3"
options="PWM,PPM,DSM (MainPort),DSM (FlexiPort),S.Bus,SRXL,GCS,OPLink,None" defaultvalue="None"/>
<field name="ChannelNumber" units="channel" type="uint8" defaultvalue="0"
elementnames="Throttle,Roll,Pitch,Yaw,FlightMode,Collective,Accessory0,Accessory1,Accessory2"/>
elementnames="Throttle,Roll,Pitch,Yaw,FlightMode,Collective,Accessory0,Accessory1,Accessory2,Accessory3"/>
<field name="ChannelMin" units="us" type="int16" defaultvalue="1000"
elementnames="Throttle,Roll,Pitch,Yaw,FlightMode,Collective,Accessory0,Accessory1,Accessory2"/>
elementnames="Throttle,Roll,Pitch,Yaw,FlightMode,Collective,Accessory0,Accessory1,Accessory2,Accessory3"/>
<field name="ChannelNeutral" units="us" type="int16" defaultvalue="1500"
elementnames="Throttle,Roll,Pitch,Yaw,FlightMode,Collective,Accessory0,Accessory1,Accessory2"/>
elementnames="Throttle,Roll,Pitch,Yaw,FlightMode,Collective,Accessory0,Accessory1,Accessory2,Accessory3"/>
<field name="ChannelMax" units="us" type="int16" defaultvalue="2000"
elementnames="Throttle,Roll,Pitch,Yaw,FlightMode,Collective,Accessory0,Accessory1,Accessory2"/>
elementnames="Throttle,Roll,Pitch,Yaw,FlightMode,Collective,Accessory0,Accessory1,Accessory2,Accessory3"/>
<field name="ResponseTime" units="ms" type="uint16" defaultvalue="0"
elementnames="Roll,Pitch,Yaw,Collective,Accessory0,Accessory1,Accessory2"/>
elementnames="Roll,Pitch,Yaw,Collective,Accessory0,Accessory1,Accessory2,Accessory3"/>
<field name="Deadband" units="%" type="uint8" elements="1" defaultvalue="2"/>
<!-- Note the following deadband is used in AssistedControl. Use of deadband with AssistedControl is not optional and will have a hardcoded minimum. -->
@ -24,7 +24,7 @@
<field name="FlightModeNumber" units="" type="uint8" elements="1" defaultvalue="3"/>
<field name="FailsafeFlightModeSwitchPosition" units="" type="int8" elements="1" defaultvalue="-1"/>
<field name="FailsafeChannel" units="%" type="float" elementnames="Throttle,Roll,Pitch,Yaw,Collective,Accessory0,Accessory1,Accessory2" defaultvalue="-1,0,0,0,0,0,0,0" />
<field name="FailsafeChannel" units="%" type="float" elementnames="Throttle,Roll,Pitch,Yaw,Collective,Accessory0,Accessory1,Accessory2,Accessory3" defaultvalue="-1,0,0,0,0,0,0,0,0" />
<access gcs="readwrite" flight="readwrite"/>
<telemetrygcs acked="true" updatemode="onchange" period="0"/>

272
tool_install.sh Executable file
View File

@ -0,0 +1,272 @@
#!/bin/bash
# Exit if an error or an unset variable
set -e -u
# make sure unmatched glob gives empty
shopt -s nullglob
root_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
tools_dir=${TOOLS_DIR:-${root_dir}/tools}
downloads_dir=${DL_DIR:-${root_dir}/downloads}
tool_overrides_dir=$root_dir/make/tool_install
batch=${BATCH:-false}
force=false
remove=false
includes=true
for arg in "${@:1}"
do
[ "$arg" = "-r" ] && remove=true
[ "$arg" = "-f" ] && force=true
[ "$arg" = "-n" ] && includes=false
done
tool=${@: -1}
uname=$(uname)
if [[ "$uname" != [LD]* ]]
then
uname=Windows
fi
# Batch mode
if $batch
then
CURL_OPTIONS=(--silent -L)
else
CURL_OPTIONS=(-L)
fi
################################################################################
# Helper functions
################################################################################
function exit_error
{
error=$?
echo "${@}"
exit $error
}
## Downloads a file if it doesn't exist
#1 URL
#2 Output filename (optional)
#3+ Additional options to pass to curl
## Sets:
#out_file: path of the downloaded file
function download_file
{
out_file="$downloads_dir/${2:-$(basename "$1")}"
if ! [ -f "$out_file" ]
then
mkdir -p "$downloads_dir" && \
cd "$downloads_dir" && \
echo "Downloading $1" && \
curl "${CURL_OPTIONS[@]}" "${@:3}" -o "$out_file" "$1"
fi
}
## Unzips a file
#1 The file to unzip
#2 The output directory
function zip_extract
{
if [ "$uname" = Windows ]
then
7za.exe x -o"$2" "$1"
else
unzip "$1" -d "$2"
fi
}
## Extracts a 7zip file
#1 The file to extract
#2 The output directory
function sevenzip_extract
{
if [ "$uname" = Windows ]
then
7za.exe x -o"$2" "$1"
else
7zr x -o"$2" "$1"
fi
}
## Extracts a tar file
#1 The file to extract
#2 The output directory
function tar_extract
{
tar -xf "$1" -C "$2"
}
## Extracts a file
#1 File to extract
#2 Extract directory (optional)
no_extract=false # Optional
## Sets:
#out_dir: directory the file was extracted into
function extract_file
{
out_dir="${2:-.}"
echo "Extracting $1"
mkdir -p "$out_dir" && \
case "$1" in
*.zip)
zip_extract "$1" "$out_dir"
;;
*.7z)
sevenzip_extract "$1" "$out_dir"
;;
*.tar*)
tar_extract "$1" "$out_dir"
;;
*)
if $no_extract
then
cp "$1" "$out_dir"
else
return 1
fi
esac
}
################################################################################
# Default functions
################################################################################
function validate_target { false; }
function remove
{
rm -rf "$tools_dir/$tool_install_name"
rm -f "$tools_dir/$tool".{sh,mk}
}
declare -a depends=()
function install_deps
{
# Workaround for set -u and empty array
for dep in "${depends[@]:+${depends}}"
do
BATCH="$batch" "${BASH_SOURCE[0]}" "$dep"
done && \
source_includes
}
## Downloads and verifies the tool
## Required:
#tool_url: the url to download the tool from
## Optional:
#tool_md5
#tool_md5_url
function download_and_verify
{
verified=true
download_file "$tool_url" && \
downloaded_file=$out_file && \
if [ -n "${tool_md5_url:-}" ]
then
download_file "$tool_md5_url" "$(basename "$downloaded_file").md5" --silent && \
if ! ( cd "$downloads_dir" && md5sum -c "$out_file" )
then
mv -f "$downloaded_file"{,.rej} && \
mv -f "$downloaded_file".md5{,.rej} && \
verified=false
fi
elif [ -n "${tool_md5:-}" ]
then
if [[ "$tool_md5"* != "$(cd "$downloads_dir" && md5sum "$downloaded_file")" ]]
then
mv -f "$downloaded_file"{,.rej} && \
verified=false
fi
fi && \
$verified
}
function tool_is_installed { [ -e "$full_tool_install_name" ] || which "$tool" &>/dev/null; }
## Downloads and extracts the tool
## Required:
#tool_url: the url to download the tool from
#tool_install_name: the directory or file the tool will be installed as
## Optional:
#tool_extract_dir: Directory to extract into (useful if build required)
function download_and_extract
{
local full_tool_install_name="$tools_dir/$tool_install_name"
if ! tool_is_installed || $force
then
download_and_verify || exit_error "Failed to verify $downloaded_file"
rm -rf "$full_tool_install_name" && \
extract_file "$downloaded_file" "${tool_extract_dir:-$tools_dir}"
fi
}
function build_and_install { true; } # Most tools don't need this step
## Write modules that are included by this script and make
## Optional:
bin_dir=""
bin_subdir="" #
module_file=$tool
function write_modules
{
if [ -n "$bin_subdir" ]
then
bin_dir="$tools_dir/$tool_install_name/$bin_subdir"
fi
if [ -n "$bin_dir" ]
then
local new_path="$bin_dir"':${PATH}'
# Write shell module file
echo 'if [[ ":$PATH:" != *":'"$bin_dir"':"* ]]; then export PATH='"$new_path"'; fi' > "$tools_dir/$module_file".sh
# Write make module file
echo 'ifeq ($(findstring :'"$bin_dir"':,:$(PATH):),)' > "$tools_dir/$module_file".mk
echo "export PATH := $new_path" >> "$tools_dir/$module_file".mk
echo "endif" >> "$tools_dir/$module_file".mk
fi
}
function source_includes
{
if $includes
then
for module in "$tools_dir"/*.sh
do
source "$module"
done
fi
}
################################################################################
# Peform tool install
################################################################################
source_includes || exit_error "failed to source includes"
source "$tool_overrides_dir/${tool}.sh"
if $remove
then
remove || exit_error "Failed to remove ${tool}"
else
validate_target || exit_error "${tool} is not a valid target"
install_deps || exit_error "Failed to install dependencies for ${tool}"
download_and_extract || exit_error "Failed to download and extract ${tool}"
build_and_install || exit_error "Failed to build and install ${tool}"
write_modules || exit_error "Failed to write modules for ${tool}"
fi