Commit f752bf09 authored by Gus Grubba's avatar Gus Grubba

Merge pull request #3299 from dogmaphobic/supportForNewESPFirmware

Support for new esp firmware
parents 9c023cdf 5a07b8ee
...@@ -145,6 +145,8 @@ ...@@ -145,6 +145,8 @@
<file alias="TelemRSSI.svg">src/ui/toolbar/Images/TelemRSSI.svg</file> <file alias="TelemRSSI.svg">src/ui/toolbar/Images/TelemRSSI.svg</file>
<file alias="Yield.svg">src/ui/toolbar/Images/Yield.svg</file> <file alias="Yield.svg">src/ui/toolbar/Images/Yield.svg</file>
<file alias="CogWheel.svg">src/MissionManager/CogWheel.svg</file> <file alias="CogWheel.svg">src/MissionManager/CogWheel.svg</file>
<file alias="StationMode.svg">src/AutoPilotPlugins/Common/Images/StationMode.svg</file>
<file alias="APMode.svg">src/AutoPilotPlugins/Common/Images/APMode.svg</file>
</qresource> </qresource>
<qresource prefix="/res"> <qresource prefix="/res">
<file alias="AntennaRC">resources/Antenna_RC.svg</file> <file alias="AntennaRC">resources/Antenna_RC.svg</file>
......
/*===================================================================== /*=====================================================================
QGroundControl Open Source Ground Control Station QGroundControl Open Source Ground Control Station
(c) 2009, 2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org> (c) 2009, 2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
This file is part of the QGROUNDCONTROL project This file is part of the QGROUNDCONTROL project
QGROUNDCONTROL is free software: you can redistribute it and/or modify QGROUNDCONTROL is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
QGROUNDCONTROL is distributed in the hope that it will be useful, QGROUNDCONTROL is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>. along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
======================================================================*/ ======================================================================*/
/// @file /// @file
...@@ -30,6 +30,9 @@ ...@@ -30,6 +30,9 @@
#include "QGCApplication.h" #include "QGCApplication.h"
#include "UAS.h" #include "UAS.h"
#include <QHostAddress>
#include <QtEndian>
QGC_LOGGING_CATEGORY(ESP8266ComponentControllerLog, "ESP8266ComponentControllerLog") QGC_LOGGING_CATEGORY(ESP8266ComponentControllerLog, "ESP8266ComponentControllerLog")
#define MAX_RETRIES 5 #define MAX_RETRIES 5
...@@ -74,6 +77,21 @@ ESP8266ComponentController::version() ...@@ -74,6 +77,21 @@ ESP8266ComponentController::version()
return versionString; return versionString;
} }
//-----------------------------------------------------------------------------
QString
ESP8266ComponentController::wifiIPAddress()
{
if(_ipAddress.isEmpty()) {
if(parameterExists(MAV_COMP_ID_UDP_BRIDGE, "WIFI_IPADDRESS")) {
QHostAddress address(qFromBigEndian(getParameterFact(MAV_COMP_ID_UDP_BRIDGE, "WIFI_IPADDRESS")->rawValue().toUInt()));
_ipAddress = address.toString();
} else {
_ipAddress = "192.168.4.1";
}
}
return _ipAddress;
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
QString QString
ESP8266ComponentController::wifiSSID() ESP8266ComponentController::wifiSSID()
...@@ -152,6 +170,94 @@ ESP8266ComponentController::setWifiPassword(QString password) ...@@ -152,6 +170,94 @@ ESP8266ComponentController::setWifiPassword(QString password)
f4->setRawValue(QVariant(u)); f4->setRawValue(QVariant(u));
} }
//-----------------------------------------------------------------------------
QString
ESP8266ComponentController::wifiSSIDSta()
{
if(!parameterExists(MAV_COMP_ID_UDP_BRIDGE, "WIFI_SSIDSTA1")) {
return QString();
}
uint32_t s1 = getParameterFact(MAV_COMP_ID_UDP_BRIDGE, "WIFI_SSIDSTA1")->rawValue().toUInt();
uint32_t s2 = getParameterFact(MAV_COMP_ID_UDP_BRIDGE, "WIFI_SSIDSTA2")->rawValue().toUInt();
uint32_t s3 = getParameterFact(MAV_COMP_ID_UDP_BRIDGE, "WIFI_SSIDSTA3")->rawValue().toUInt();
uint32_t s4 = getParameterFact(MAV_COMP_ID_UDP_BRIDGE, "WIFI_SSIDSTA4")->rawValue().toUInt();
char tmp[20];
memcpy(&tmp[0], &s1, sizeof(uint32_t));
memcpy(&tmp[4], &s2, sizeof(uint32_t));
memcpy(&tmp[8], &s3, sizeof(uint32_t));
memcpy(&tmp[12], &s4, sizeof(uint32_t));
return QString(tmp);
}
//-----------------------------------------------------------------------------
void
ESP8266ComponentController::setWifiSSIDSta(QString ssid)
{
if(parameterExists(MAV_COMP_ID_UDP_BRIDGE, "WIFI_SSIDSTA1")) {
char tmp[20];
memset(tmp, 0, sizeof(tmp));
std::string sid = ssid.toStdString();
strncpy(tmp, sid.c_str(), sizeof(tmp));
Fact* f1 = getParameterFact(MAV_COMP_ID_UDP_BRIDGE, "WIFI_SSIDSTA1");
Fact* f2 = getParameterFact(MAV_COMP_ID_UDP_BRIDGE, "WIFI_SSIDSTA2");
Fact* f3 = getParameterFact(MAV_COMP_ID_UDP_BRIDGE, "WIFI_SSIDSTA3");
Fact* f4 = getParameterFact(MAV_COMP_ID_UDP_BRIDGE, "WIFI_SSIDSTA4");
uint32_t u;
memcpy(&u, &tmp[0], sizeof(uint32_t));
f1->setRawValue(QVariant(u));
memcpy(&u, &tmp[4], sizeof(uint32_t));
f2->setRawValue(QVariant(u));
memcpy(&u, &tmp[8], sizeof(uint32_t));
f3->setRawValue(QVariant(u));
memcpy(&u, &tmp[12], sizeof(uint32_t));
f4->setRawValue(QVariant(u));
}
}
//-----------------------------------------------------------------------------
QString
ESP8266ComponentController::wifiPasswordSta()
{
if(!parameterExists(MAV_COMP_ID_UDP_BRIDGE, "WIFI_PWDSTA1")) {
return QString();
}
uint32_t s1 = getParameterFact(MAV_COMP_ID_UDP_BRIDGE, "WIFI_PWDSTA1")->rawValue().toUInt();
uint32_t s2 = getParameterFact(MAV_COMP_ID_UDP_BRIDGE, "WIFI_PWDSTA2")->rawValue().toUInt();
uint32_t s3 = getParameterFact(MAV_COMP_ID_UDP_BRIDGE, "WIFI_PWDSTA3")->rawValue().toUInt();
uint32_t s4 = getParameterFact(MAV_COMP_ID_UDP_BRIDGE, "WIFI_PWDSTA4")->rawValue().toUInt();
char tmp[20];
memcpy(&tmp[0], &s1, sizeof(uint32_t));
memcpy(&tmp[4], &s2, sizeof(uint32_t));
memcpy(&tmp[8], &s3, sizeof(uint32_t));
memcpy(&tmp[12], &s4, sizeof(uint32_t));
return QString(tmp);
}
//-----------------------------------------------------------------------------
void
ESP8266ComponentController::setWifiPasswordSta(QString password)
{
if(parameterExists(MAV_COMP_ID_UDP_BRIDGE, "WIFI_PWDSTA1")) {
char tmp[20];
memset(tmp, 0, sizeof(tmp));
std::string pwd = password.toStdString();
strncpy(tmp, pwd.c_str(), sizeof(tmp));
Fact* f1 = getParameterFact(MAV_COMP_ID_UDP_BRIDGE, "WIFI_PWDSTA1");
Fact* f2 = getParameterFact(MAV_COMP_ID_UDP_BRIDGE, "WIFI_PWDSTA2");
Fact* f3 = getParameterFact(MAV_COMP_ID_UDP_BRIDGE, "WIFI_PWDSTA3");
Fact* f4 = getParameterFact(MAV_COMP_ID_UDP_BRIDGE, "WIFI_PWDSTA4");
uint32_t u;
memcpy(&u, &tmp[0], sizeof(uint32_t));
f1->setRawValue(QVariant(u));
memcpy(&u, &tmp[4], sizeof(uint32_t));
f2->setRawValue(QVariant(u));
memcpy(&u, &tmp[8], sizeof(uint32_t));
f3->setRawValue(QVariant(u));
memcpy(&u, &tmp[12], sizeof(uint32_t));
f4->setRawValue(QVariant(u));
}
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
int int
ESP8266ComponentController::baudIndex() ESP8266ComponentController::baudIndex()
......
/*===================================================================== /*=====================================================================
QGroundControl Open Source Ground Control Station QGroundControl Open Source Ground Control Station
(c) 2009, 2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org> (c) 2009, 2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
This file is part of the QGROUNDCONTROL project This file is part of the QGROUNDCONTROL project
QGROUNDCONTROL is free software: you can redistribute it and/or modify QGROUNDCONTROL is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
QGROUNDCONTROL is distributed in the hope that it will be useful, QGROUNDCONTROL is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>. along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
======================================================================*/ ======================================================================*/
...@@ -45,28 +45,34 @@ namespace Ui { ...@@ -45,28 +45,34 @@ namespace Ui {
class ESP8266ComponentController : public FactPanelController class ESP8266ComponentController : public FactPanelController
{ {
Q_OBJECT Q_OBJECT
public: public:
ESP8266ComponentController (); ESP8266ComponentController ();
~ESP8266ComponentController (); ~ESP8266ComponentController ();
Q_PROPERTY(int componentID READ componentID CONSTANT) Q_PROPERTY(int componentID READ componentID CONSTANT)
Q_PROPERTY(QString version READ version NOTIFY versionChanged) Q_PROPERTY(QString version READ version NOTIFY versionChanged)
Q_PROPERTY(QString wifiSSID READ wifiSSID WRITE setWifiSSID NOTIFY wifiSSIDChanged) Q_PROPERTY(QString wifiIPAddress READ wifiIPAddress CONSTANT)
Q_PROPERTY(QString wifiPassword READ wifiPassword WRITE setWifiPassword NOTIFY wifiPasswordChanged) Q_PROPERTY(QString wifiSSID READ wifiSSID WRITE setWifiSSID NOTIFY wifiSSIDChanged)
Q_PROPERTY(QStringList wifiChannels READ wifiChannels CONSTANT) Q_PROPERTY(QString wifiPassword READ wifiPassword WRITE setWifiPassword NOTIFY wifiPasswordChanged)
Q_PROPERTY(QStringList baudRates READ baudRates CONSTANT) Q_PROPERTY(QString wifiSSIDSta READ wifiSSIDSta WRITE setWifiSSIDSta NOTIFY wifiSSIDStaChanged)
Q_PROPERTY(int baudIndex READ baudIndex WRITE setBaudIndex NOTIFY baudIndexChanged) Q_PROPERTY(QString wifiPasswordSta READ wifiPasswordSta WRITE setWifiPasswordSta NOTIFY wifiPasswordStaChanged)
Q_PROPERTY(bool busy READ busy NOTIFY busyChanged) Q_PROPERTY(QStringList wifiChannels READ wifiChannels CONSTANT)
Q_PROPERTY(Vehicle* vehicle READ vehicle CONSTANT) Q_PROPERTY(QStringList baudRates READ baudRates CONSTANT)
Q_PROPERTY(int baudIndex READ baudIndex WRITE setBaudIndex NOTIFY baudIndexChanged)
Q_PROPERTY(bool busy READ busy NOTIFY busyChanged)
Q_PROPERTY(Vehicle* vehicle READ vehicle CONSTANT)
Q_INVOKABLE void restoreDefaults(); Q_INVOKABLE void restoreDefaults();
Q_INVOKABLE void reboot (); Q_INVOKABLE void reboot ();
int componentID () { return MAV_COMP_ID_UDP_BRIDGE; } int componentID () { return MAV_COMP_ID_UDP_BRIDGE; }
QString version (); QString version ();
QString wifiIPAddress ();
QString wifiSSID (); QString wifiSSID ();
QString wifiPassword (); QString wifiPassword ();
QString wifiSSIDSta ();
QString wifiPasswordSta ();
QStringList wifiChannels () { return _channels; } QStringList wifiChannels () { return _channels; }
QStringList baudRates () { return _baudRates; } QStringList baudRates () { return _baudRates; }
int baudIndex (); int baudIndex ();
...@@ -75,14 +81,18 @@ public: ...@@ -75,14 +81,18 @@ public:
void setWifiSSID (QString id); void setWifiSSID (QString id);
void setWifiPassword (QString pwd); void setWifiPassword (QString pwd);
void setWifiSSIDSta (QString id);
void setWifiPasswordSta (QString pwd);
void setBaudIndex (int idx); void setBaudIndex (int idx);
signals: signals:
void versionChanged (); void versionChanged ();
void wifiSSIDChanged (); void wifiSSIDChanged ();
void wifiPasswordChanged (); void wifiPasswordChanged ();
void baudIndexChanged (); void wifiSSIDStaChanged ();
void busyChanged (); void wifiPasswordStaChanged ();
void baudIndexChanged ();
void busyChanged ();
private slots: private slots:
void _processTimeout (); void _processTimeout ();
...@@ -100,6 +110,7 @@ private: ...@@ -100,6 +110,7 @@ private:
QTimer _timer; QTimer _timer;
QStringList _channels; QStringList _channels;
QStringList _baudRates; QStringList _baudRates;
QString _ipAddress;
enum { enum {
WAIT_FOR_NOTHING, WAIT_FOR_NOTHING,
......
...@@ -25,6 +25,7 @@ FactPanel { ...@@ -25,6 +25,7 @@ FactPanel {
property Fact wifiHostPort: controller.getParameterFact(esp8266.componentID, "WIFI_UDP_HPORT") property Fact wifiHostPort: controller.getParameterFact(esp8266.componentID, "WIFI_UDP_HPORT")
property Fact wifiClientPort: controller.getParameterFact(esp8266.componentID, "WIFI_UDP_CPORT") property Fact wifiClientPort: controller.getParameterFact(esp8266.componentID, "WIFI_UDP_CPORT")
property Fact uartBaud: controller.getParameterFact(esp8266.componentID, "UART_BAUDRATE") property Fact uartBaud: controller.getParameterFact(esp8266.componentID, "UART_BAUDRATE")
property Fact wifiMode: controller.getParameterFact(esp8266.componentID, "WIFI_MODE", false) //-- Don't bitch if missing
Column { Column {
anchors.fill: parent anchors.fill: parent
...@@ -33,18 +34,30 @@ FactPanel { ...@@ -33,18 +34,30 @@ FactPanel {
labelText: qsTr("Firmware Version:") labelText: qsTr("Firmware Version:")
valueText: esp8266.version valueText: esp8266.version
} }
VehicleSummaryRow {
labelText: qsTr("WiFi Mode:")
valueText: wifiMode ? (wifiMode.value === 0 ? "AP Mode" : "Station Mode") : "AP Mode"
}
VehicleSummaryRow { VehicleSummaryRow {
labelText: qsTr("WiFi Channel:") labelText: qsTr("WiFi Channel:")
valueText: wifiChannel ? wifiChannel.valueString : "" valueText: wifiChannel ? wifiChannel.valueString : ""
} }
VehicleSummaryRow { VehicleSummaryRow {
labelText: qsTr("WiFi SSID:") labelText: qsTr("WiFi AP SSID:")
valueText: esp8266.wifiSSID valueText: esp8266.wifiSSID
} }
VehicleSummaryRow { VehicleSummaryRow {
labelText: qsTr("WiFi Password:") labelText: qsTr("WiFi AP Password:")
valueText: esp8266.wifiPassword valueText: esp8266.wifiPassword
} }
VehicleSummaryRow {
labelText: qsTr("WiFi STA SSID:")
valueText: esp8266.wifiSSIDSta
}
VehicleSummaryRow {
labelText: qsTr("WiFi STA Password:")
valueText: esp8266.wifiPasswordSta
}
VehicleSummaryRow { VehicleSummaryRow {
labelText: qsTr("UART Baud Rate:") labelText: qsTr("UART Baud Rate:")
valueText: uartBaud ? uartBaud.valueString : "" valueText: uartBaud ? uartBaud.valueString : ""
......
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 59.671 87.808" style="enable-background:new 0 0 59.671 87.808;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;stroke:#FFFFFF;}
.st1{fill:none;stroke:#FFFFFF;stroke-width:3;stroke-linecap:round;}
.st2{fill:none;stroke:#FFFFFF;stroke-width:3;}
.st3{fill:#FFFFFF;stroke:#FFFFFF;stroke-width:3;}
.st4{fill:#FFFFFF;}
</style>
<sodipodi:namedview bordercolor="#666666" borderopacity="1.0" id="base" inkscape:current-layer="layer1" inkscape:cx="282.69484" inkscape:cy="221.0125" inkscape:document-units="px" inkscape:guide-bbox="true" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:window-height="1017" inkscape:window-maximized="1" inkscape:window-width="1920" inkscape:window-x="-8" inkscape:window-y="-8" inkscape:zoom="2.8" pagecolor="#ffffff" showgrid="true" showguides="true">
<sodipodi:guide id="guide2985" orientation="1,0" position="250,420"></sodipodi:guide>
<inkscape:grid empspacing="10" enabled="true" id="grid2987" snapvisiblegridlinesonly="true" type="xygrid" visible="true">
</inkscape:grid>
<sodipodi:guide id="guide2989" orientation="0,1" position="270,250"></sodipodi:guide>
</sodipodi:namedview>
<g>
<defs>
<inkscape:path-effect copytype="repeated" effect="skeletal" fuse_tolerance="0" id="path-effect4881" is_visible="true" normal_offset="0" pattern="M 0,0 1,0" prop_scale="1" prop_units="false" scale_y_rel="false" spacing="0" tang_offset="0" vertical_pattern="false">
</inkscape:path-effect>
<inkscape:path-effect bendpath="m 110,180 140,0" effect="bend_path" id="path-effect3765" is_visible="true" prop_scale="1" scale_y_rel="false" vertical="false">
</inkscape:path-effect>
</defs>
<g>
<g>
<path id="path2991_3_" sodipodi:cx="110" sodipodi:cy="110" sodipodi:rx="20" sodipodi:ry="20" sodipodi:type="arc" class="st0" d="
M18.734,7.918c-0.169,0.83-1.147,1.355-2.178,1.136c-1.031-0.218-1.679-1.087-1.455-1.906c0.225-0.819,1.193-1.288,2.168-1.081
C18.245,6.273,18.903,7.087,18.734,7.918z"/>
<path id="path3761_3_" sodipodi:cx="110" sodipodi:cy="110" sodipodi:end="6.4866523" sodipodi:open="true" sodipodi:rx="50" sodipodi:ry="50" sodipodi:start="1.374765" sodipodi:type="arc" class="st1" d="
M17.012,12.188c-3.308-0.136-5.924-2.602-5.69-5.147c0.234-2.545,2.84-4.234,5.668-4.091s5.181,2.08,5.427,4.618
c0.059,0.614-0.023,1.229-0.256,1.807"/>
<path id="path2991-6_3_" inkscape:transform-center-x="-140.5" inkscape:transform-center-y="-140.5" sodipodi:cx="110" sodipodi:cy="110" sodipodi:rx="20" sodipodi:ry="20" sodipodi:type="arc" class="st0" d="
M43.115,9.054c-1.031,0.218-2.009-0.306-2.178-1.136c-0.169-0.83,0.489-1.644,1.464-1.851c0.976-0.207,1.944,0.263,2.168,1.081
C44.794,7.967,44.146,8.835,43.115,9.054z"/>
<path id="path3761-1_3_" inkscape:transform-center-x="-140.5" inkscape:transform-center-y="-140.50478" sodipodi:cx="110" sodipodi:cy="110" sodipodi:end="6.4866523" sodipodi:open="true" sodipodi:rx="50" sodipodi:ry="50" sodipodi:start="1.374765" sodipodi:type="arc" class="st1" d="
M37.498,9.343c-0.942-2.394,0.618-4.969,3.233-5.979c2.615-1.011,5.647-0.216,7.03,1.977c1.384,2.192,0.25,5.149-2.807,6.362
c-0.74,0.293-1.54,0.46-2.34,0.488"/>
<path id="path2991-9_3_" sodipodi:cx="110" sodipodi:cy="110" sodipodi:rx="20" sodipodi:ry="20" sodipodi:type="arc" class="st0" d="
M45.245,29.041c-0.169-0.83,0.806-1.701,2.171-1.99s2.647,0.103,2.872,0.921s-0.737,1.765-2.158,2.066
C46.71,30.34,45.415,29.872,45.245,29.041z"/>
<path id="path3761-2_3_" sodipodi:cx="110" sodipodi:cy="110" sodipodi:end="6.4866523" sodipodi:open="true" sodipodi:rx="50" sodipodi:ry="50" sodipodi:start="1.374765" sodipodi:type="arc" class="st1" d="
M45.334,24.432c3.764-1.233,7.892-0.762,9.499,1.362c1.607,2.124-0.252,5.327-4.451,6.802c-4.199,1.475-8.784,0.445-9.957-1.921
c-0.284-0.572-0.359-1.188-0.237-1.809"/>
<path id="path2991-6-9_3_" inkscape:transform-center-x="140.5" inkscape:transform-center-y="140.50002" sodipodi:cx="110" sodipodi:cy="110" sodipodi:rx="20" sodipodi:ry="20" sodipodi:type="arc" class="st0" d="
M12.254,27.051c1.365,0.289,2.341,1.159,2.171,1.99c-0.169,0.83-1.465,1.298-2.885,0.997c-1.42-0.301-2.382-1.247-2.158-2.066
C9.608,27.154,10.889,26.762,12.254,27.051z"/>
<path id="path3761-1-5_3_" inkscape:transform-center-x="140.5" inkscape:transform-center-y="140.50476" sodipodi:cx="110" sodipodi:cy="110" sodipodi:end="6.4866523" sodipodi:open="true" sodipodi:rx="50" sodipodi:ry="50" sodipodi:start="1.374765" sodipodi:type="arc" class="st1" d="
M19.49,28.9c0.476,2.566-2.624,4.715-7.081,4.356c-4.457-0.359-8.169-3.149-8.159-5.762c0.01-2.613,3.343-4.056,7.313-3.651
c0.96,0.098,1.916,0.303,2.825,0.604"/>
</g>
<path class="st2" d="M11.897,28.545C23.883,24.596,34.911,17.522,42.758,7.56"/>
<path class="st2" d="M47.777,28.545C35.791,24.596,24.763,17.522,16.915,7.56"/>
<path class="st3" d="M38.681,19.141c0.453,3.364-3.496,6.665-8.845,6.665s-9.299-3.302-8.845-6.665
c0.453-3.364,4.404-5.613,8.845-5.613C34.276,13.527,38.228,15.777,38.681,19.141z"/>
</g>
</g>
<path class="st4" d="M27.003,55.688c0.762-0.793,1.69-1.182,2.785-1.166c1.095,0.016,2.039,0.405,2.833,1.166
c0.793,0.762,1.19,1.69,1.19,2.785s-0.397,2.039-1.19,2.833c-0.762,0.793-1.69,1.19-2.785,1.19s-2.039-0.397-2.833-1.19
c-0.793-0.762-1.19-1.698-1.19-2.809S26.209,56.45,27.003,55.688z M13.006,71.352c1.047,0,1.968,0.397,2.761,1.19
c3.872,3.84,8.554,5.761,14.045,5.761s10.172-1.92,14.045-5.761c0.793-0.793,1.73-1.182,2.809-1.166s2.015,0.405,2.809,1.166
c0.793,0.793,1.19,1.722,1.19,2.785s-0.397,1.992-1.19,2.785c-3.555,3.555-7.713,5.959-12.473,7.213s-9.53,1.254-14.306,0
s-8.942-3.658-12.497-7.213c-0.793-0.793-1.19-1.722-1.19-2.785s0.397-1.992,1.19-2.785C10.99,71.749,11.927,71.352,13.006,71.352z
M38.238,62.925c1.079,0,2.015,0.397,2.809,1.19c0.793,0.793,1.19,1.73,1.19,2.809s-0.397,2.015-1.19,2.809
c-2.031,2.031-4.412,3.404-7.141,4.118s-5.459,0.714-8.189,0s-5.11-2.087-7.141-4.118c-0.793-0.793-1.19-1.73-1.19-2.809
s0.397-2.015,1.19-2.809c0.793-0.793,1.73-1.19,2.809-1.19s2.015,0.397,2.809,1.19c1.555,1.555,3.428,2.333,5.618,2.333
s4.063-0.778,5.618-2.333C36.223,63.322,37.159,62.925,38.238,62.925z"/>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 59.671 87.808" style="enable-background:new 0 0 59.671 87.808;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;stroke:#FFFFFF;}
.st1{fill:none;stroke:#FFFFFF;stroke-width:3;stroke-linecap:round;}
.st2{fill:none;stroke:#FFFFFF;stroke-width:3;}
.st3{fill:#FFFFFF;stroke:#FFFFFF;stroke-width:3;}
.st4{fill:#FFFFFF;}
</style>
<sodipodi:namedview bordercolor="#666666" borderopacity="1.0" id="base" inkscape:current-layer="layer1" inkscape:cx="282.69484" inkscape:cy="221.0125" inkscape:document-units="px" inkscape:guide-bbox="true" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:window-height="1017" inkscape:window-maximized="1" inkscape:window-width="1920" inkscape:window-x="-8" inkscape:window-y="-8" inkscape:zoom="2.8" pagecolor="#ffffff" showgrid="true" showguides="true">
<sodipodi:guide id="guide2985" orientation="1,0" position="250,420"></sodipodi:guide>
<inkscape:grid empspacing="10" enabled="true" id="grid2987" snapvisiblegridlinesonly="true" type="xygrid" visible="true">
</inkscape:grid>
<sodipodi:guide id="guide2989" orientation="0,1" position="270,250"></sodipodi:guide>
</sodipodi:namedview>
<g>
<defs>
<inkscape:path-effect copytype="repeated" effect="skeletal" fuse_tolerance="0" id="path-effect4881" is_visible="true" normal_offset="0" pattern="M 0,0 1,0" prop_scale="1" prop_units="false" scale_y_rel="false" spacing="0" tang_offset="0" vertical_pattern="false">
</inkscape:path-effect>
<inkscape:path-effect bendpath="m 110,180 140,0" effect="bend_path" id="path-effect3765" is_visible="true" prop_scale="1" scale_y_rel="false" vertical="false">
</inkscape:path-effect>
</defs>
<g>
<g>
<path id="path2991_3_" sodipodi:cx="110" sodipodi:cy="110" sodipodi:rx="20" sodipodi:ry="20" sodipodi:type="arc" class="st0" d="
M18.734,7.918c-0.169,0.83-1.147,1.355-2.178,1.136c-1.031-0.218-1.679-1.087-1.455-1.906c0.225-0.819,1.193-1.288,2.168-1.081
C18.245,6.273,18.903,7.087,18.734,7.918z"/>
<path id="path3761_3_" sodipodi:cx="110" sodipodi:cy="110" sodipodi:end="6.4866523" sodipodi:open="true" sodipodi:rx="50" sodipodi:ry="50" sodipodi:start="1.374765" sodipodi:type="arc" class="st1" d="
M17.012,12.188c-3.308-0.136-5.924-2.602-5.69-5.147c0.234-2.545,2.84-4.234,5.668-4.091s5.181,2.08,5.427,4.618
c0.059,0.614-0.023,1.229-0.256,1.807"/>
<path id="path2991-6_3_" inkscape:transform-center-x="-140.5" inkscape:transform-center-y="-140.5" sodipodi:cx="110" sodipodi:cy="110" sodipodi:rx="20" sodipodi:ry="20" sodipodi:type="arc" class="st0" d="
M43.115,9.054c-1.031,0.218-2.009-0.306-2.178-1.136c-0.169-0.83,0.489-1.644,1.464-1.851c0.976-0.207,1.944,0.263,2.168,1.081
C44.794,7.967,44.146,8.835,43.115,9.054z"/>
<path id="path3761-1_3_" inkscape:transform-center-x="-140.5" inkscape:transform-center-y="-140.50478" sodipodi:cx="110" sodipodi:cy="110" sodipodi:end="6.4866523" sodipodi:open="true" sodipodi:rx="50" sodipodi:ry="50" sodipodi:start="1.374765" sodipodi:type="arc" class="st1" d="
M37.498,9.343c-0.942-2.394,0.618-4.969,3.233-5.979c2.615-1.011,5.647-0.216,7.03,1.977c1.384,2.192,0.25,5.149-2.807,6.362
c-0.74,0.293-1.54,0.46-2.34,0.488"/>
<path id="path2991-9_3_" sodipodi:cx="110" sodipodi:cy="110" sodipodi:rx="20" sodipodi:ry="20" sodipodi:type="arc" class="st0" d="
M45.245,29.041c-0.169-0.83,0.806-1.701,2.171-1.99s2.647,0.103,2.872,0.921s-0.737,1.765-2.158,2.066
C46.71,30.34,45.415,29.872,45.245,29.041z"/>
<path id="path3761-2_3_" sodipodi:cx="110" sodipodi:cy="110" sodipodi:end="6.4866523" sodipodi:open="true" sodipodi:rx="50" sodipodi:ry="50" sodipodi:start="1.374765" sodipodi:type="arc" class="st1" d="
M45.334,24.432c3.764-1.233,7.892-0.762,9.499,1.362c1.607,2.124-0.252,5.327-4.451,6.802c-4.199,1.475-8.784,0.445-9.957-1.921
c-0.284-0.572-0.359-1.188-0.237-1.809"/>
<path id="path2991-6-9_3_" inkscape:transform-center-x="140.5" inkscape:transform-center-y="140.50002" sodipodi:cx="110" sodipodi:cy="110" sodipodi:rx="20" sodipodi:ry="20" sodipodi:type="arc" class="st0" d="
M12.254,27.051c1.365,0.289,2.341,1.159,2.171,1.99c-0.169,0.83-1.465,1.298-2.885,0.997c-1.42-0.301-2.382-1.247-2.158-2.066
C9.608,27.154,10.889,26.762,12.254,27.051z"/>
<path id="path3761-1-5_3_" inkscape:transform-center-x="140.5" inkscape:transform-center-y="140.50476" sodipodi:cx="110" sodipodi:cy="110" sodipodi:end="6.4866523" sodipodi:open="true" sodipodi:rx="50" sodipodi:ry="50" sodipodi:start="1.374765" sodipodi:type="arc" class="st1" d="
M19.49,28.9c0.476,2.566-2.624,4.715-7.081,4.356c-4.457-0.359-8.169-3.149-8.159-5.762c0.01-2.613,3.343-4.056,7.313-3.651
c0.96,0.098,1.916,0.303,2.825,0.604"/>
</g>
<path class="st2" d="M11.897,28.545C23.883,24.596,34.911,17.522,42.758,7.56"/>
<path class="st2" d="M47.777,28.545C35.791,24.596,24.763,17.522,16.915,7.56"/>
<path class="st3" d="M38.681,19.141c0.453,3.364-3.496,6.665-8.845,6.665s-9.299-3.302-8.845-6.665
c0.453-3.364,4.404-5.613,8.845-5.613C34.276,13.527,38.228,15.777,38.681,19.141z"/>
</g>
</g>
<path class="st4" d="M32.668,85.099c-0.762,0.793-1.69,1.182-2.785,1.166s-2.039-0.405-2.833-1.166
c-0.793-0.762-1.19-1.69-1.19-2.785s0.397-2.039,1.19-2.833c0.762-0.793,1.69-1.19,2.785-1.19s2.039,0.397,2.833,1.19
c0.793,0.762,1.19,1.698,1.19,2.809S33.462,84.337,32.668,85.099z M46.665,69.435c-1.047,0-1.968-0.397-2.761-1.19
c-3.872-3.84-8.554-5.761-14.045-5.761s-10.172,1.92-14.045,5.761c-0.793,0.793-1.73,1.182-2.809,1.166s-2.015-0.405-2.809-1.166
c-0.793-0.793-1.19-1.722-1.19-2.785s0.397-1.992,1.19-2.785c3.555-3.555,7.713-5.959,12.473-7.213s9.53-1.254,14.306,0
s8.942,3.658,12.497,7.213c0.793,0.793,1.19,1.722,1.19,2.785s-0.397,1.992-1.19,2.785C48.68,69.038,47.744,69.435,46.665,69.435z
M21.432,77.862c-1.079,0-2.015-0.397-2.809-1.19c-0.793-0.793-1.19-1.73-1.19-2.809s0.397-2.015,1.19-2.809
c2.031-2.031,4.412-3.404,7.141-4.118s5.459-0.714,8.189,0s5.11,2.087,7.141,4.118c0.793,0.793,1.19,1.73,1.19,2.809
s-0.397,2.015-1.19,2.809c-0.793,0.793-1.73,1.19-2.809,1.19s-2.015-0.397-2.809-1.19c-1.555-1.555-3.428-2.333-5.618-2.333
s-4.063,0.778-5.618,2.333C23.448,77.465,22.512,77.862,21.432,77.862z"/>
</svg>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment