1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2024-12-02 10:24:11 +01:00

Merge branch 'master' into OP-495_CheBuzz_HelpButtons

This commit is contained in:
David Carlson 2011-05-15 19:36:38 -07:00
commit d076418895
76 changed files with 8336 additions and 5192 deletions

View File

@ -105,6 +105,11 @@ C: Gary Mortimer and the Scorpion
D: March 2011 D: March 2011
V: http://vimeo.com/22104334 V: http://vimeo.com/22104334
M: First Y6 OpenPilot flight
C: Sami Korhonen (Sambas)
D: May 2011
V: http://www.vimeo.com/23637586
M: First CopterControl flight on a Flybarless Heli M: First CopterControl flight on a Flybarless Heli
C: ? C: ?
D: ? D: ?

View File

@ -265,8 +265,8 @@ gcs_clean: openpilotgcs_clean
.PHONY: openpilotgcs .PHONY: openpilotgcs
openpilotgcs: uavobjects_gcs openpilotgcs: uavobjects_gcs
$(V1) mkdir -p $(BUILD_DIR)/ground/$@ $(V1) mkdir -p $(BUILD_DIR)/ground/$@
$(V1) ( cd $(BUILD_DIR)/ground/$@ ; \ $(V1) ( cd $(BUILD_DIR)/ground/$@ && \
$(QMAKE) $(ROOT_DIR)/ground/openpilotgcs/openpilotgcs.pro -spec $(QT_SPEC) -r CONFIG+=$(GCS_BUILD_CONF) ; \ $(QMAKE) $(ROOT_DIR)/ground/openpilotgcs/openpilotgcs.pro -spec $(QT_SPEC) -r CONFIG+=$(GCS_BUILD_CONF) && \
$(MAKE) -w ; \ $(MAKE) -w ; \
) )
@ -290,8 +290,8 @@ openpilotgcs_clean:
.PHONY: uavobjgenerator .PHONY: uavobjgenerator
uavobjgenerator: uavobjgenerator:
$(V1) mkdir -p $(BUILD_DIR)/ground/$@ $(V1) mkdir -p $(BUILD_DIR)/ground/$@
$(V1) ( cd $(BUILD_DIR)/ground/$@ ; \ $(V1) ( cd $(BUILD_DIR)/ground/$@ && \
$(QMAKE) $(ROOT_DIR)/ground/uavobjgenerator/uavobjgenerator.pro -spec $(QT_SPEC) -r CONFIG+=debug ; \ $(QMAKE) $(ROOT_DIR)/ground/uavobjgenerator/uavobjgenerator.pro -spec $(QT_SPEC) -r CONFIG+=debug && \
$(MAKE) --no-print-directory -w ; \ $(MAKE) --no-print-directory -w ; \
) )
@ -306,7 +306,7 @@ $(UAVOBJ_OUT_DIR):
$(V1) mkdir -p $@ $(V1) mkdir -p $@
uavobjects_%: $(UAVOBJ_OUT_DIR) uavobjgenerator uavobjects_%: $(UAVOBJ_OUT_DIR) uavobjgenerator
$(V1) ( cd $(UAVOBJ_OUT_DIR) ; \ $(V1) ( cd $(UAVOBJ_OUT_DIR) && \
$(UAVOBJGENERATOR) -$* $(UAVOBJ_XML_DIR) $(ROOT_DIR) ; \ $(UAVOBJGENERATOR) -$* $(UAVOBJ_XML_DIR) $(ROOT_DIR) ; \
) )

View File

@ -0,0 +1 @@
Those icons come from the Tango set and are used in the GCS.

View File

@ -0,0 +1,443 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 9.0, SVG Export Plug-In -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
sodipodi:docbase="/home/jimmac/gfx/ximian/tango-icon-theme/scalable/mimetypes"
sodipodi:docname="application-certificate.svg"
inkscape:version="0.46"
sodipodi:version="0.32"
id="svg5105"
xml:space="preserve"
viewBox="0 0 48 48"
height="48.000000px"
width="48.000000px"
inkscape:output_extension="org.inkscape.output.svg.inkscape"><metadata
id="metadata5189">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>Certificate</dc:title><dc:creator><cc:Agent><dc:title>Jakub Steiner</dc:title></cc:Agent></dc:creator><dc:subject><rdf:Bag><rdf:li>certificate</rdf:li></rdf:Bag></dc:subject><cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/" /></cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/"><cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" /><cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" /><cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /></cc:License></rdf:RDF>
</metadata>
<defs
id="defs5187"><inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 24 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="48 : 24 : 1"
inkscape:persp3d-origin="24 : 16 : 1"
id="perspective54" /><linearGradient
id="linearGradient6684">
<stop
id="stop6686"
offset="0.0000000"
style="stop-color:#d5dbff;stop-opacity:1.0000000;" />
<stop
id="stop6688"
offset="1"
style="stop-color:#6579ff;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient6665">
<stop
style="stop-color:#000000;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop6667" />
<stop
style="stop-color:#000000;stop-opacity:0.0000000;"
offset="1.0000000"
id="stop6669" />
</linearGradient>
<linearGradient
id="linearGradient6625">
<stop
id="stop6627"
offset="0.0000000"
style="stop-color:#1d2349;stop-opacity:1.0000000;" />
<stop
style="stop-color:#4c5279;stop-opacity:1.0000000;"
offset="0.35315102"
id="stop6637" />
<stop
style="stop-color:#b3bdff;stop-opacity:1.0000000;"
offset="0.46551725"
id="stop6633" />
<stop
id="stop6635"
offset="0.64982164"
style="stop-color:#727cbe;stop-opacity:1.0000000;" />
<stop
id="stop6629"
offset="1.0000000"
style="stop-color:#323c7e;stop-opacity:1.0000000;" />
</linearGradient>
<linearGradient
id="linearGradient6617">
<stop
id="stop6619"
offset="0.0000000"
style="stop-color:#ffffff;stop-opacity:0.24742268;" />
<stop
id="stop6621"
offset="1"
style="stop-color:#ffffff;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient6604">
<stop
id="stop6606"
offset="0.0000000"
style="stop-color:#ffa196;stop-opacity:1.0000000;" />
<stop
id="stop6608"
offset="1"
style="stop-color:#ff1f06;stop-opacity:0;" />
</linearGradient>
<radialGradient
r="13.2807"
fy="20.9712"
fx="28.7891"
cy="20.9712"
cx="28.7891"
gradientUnits="userSpaceOnUse"
id="radialGradient5199"
xlink:href="#aigrd1"
inkscape:collect="always" />
<radialGradient
r="14.6944"
fy="13.5444"
fx="19.292"
cy="13.5444"
cx="19.292"
gradientUnits="userSpaceOnUse"
id="radialGradient5201"
xlink:href="#aigrd2"
inkscape:collect="always" />
<linearGradient
y2="16.7231"
x2="23.412"
y1="11.5991"
x1="18.229"
gradientUnits="userSpaceOnUse"
id="linearGradient5203"
xlink:href="#aigrd3"
inkscape:collect="always" />
<radialGradient
gradientUnits="userSpaceOnUse"
fy="20.971201"
fx="28.789101"
r="13.280700"
cy="20.971201"
cx="28.789101"
id="aigrd1">
<stop
id="stop5115"
style="stop-color:#E41E08"
offset="0" />
<stop
id="stop5117"
style="stop-color:#901505"
offset="1" />
</radialGradient>
<radialGradient
gradientUnits="userSpaceOnUse"
fy="13.544400"
fx="19.292000"
r="14.694400"
cy="13.544400"
cx="19.292000"
id="aigrd2">
<stop
id="stop5122"
style="stop-color:#E41E08"
offset="0" />
<stop
id="stop5124"
style="stop-color:#901505"
offset="1" />
</radialGradient>
<linearGradient
y2="16.723101"
x2="23.412001"
y1="11.599100"
x1="18.229000"
gradientUnits="userSpaceOnUse"
id="aigrd3">
<stop
id="stop5137"
style="stop-color:#FFFFFF"
offset="0" />
<stop
id="stop5139"
style="stop-color:#901505"
offset="1" />
</linearGradient>
<linearGradient
gradientTransform="matrix(1.135551,0.000000,0.000000,1.135551,-3.259995,-3.266773)"
y2="16.7231"
x2="23.412"
y1="11.5991"
x1="18.229"
gradientUnits="userSpaceOnUse"
id="linearGradient5274"
xlink:href="#aigrd3"
inkscape:collect="always" />
<radialGradient
gradientTransform="matrix(1.135551,0.000000,0.000000,1.135551,-4.540325,-2.077433)"
r="14.6944"
fy="13.5444"
fx="19.292"
cy="13.5444"
cx="19.292"
gradientUnits="userSpaceOnUse"
id="radialGradient5281"
xlink:href="#aigrd2"
inkscape:collect="always" />
<radialGradient
gradientTransform="matrix(1.310386,0.000000,0.000000,1.310386,-8.642682,-4.375977)"
r="13.2807"
fy="20.9712"
fx="28.7891"
cy="20.9712"
cx="28.7891"
gradientUnits="userSpaceOnUse"
id="radialGradient5284"
xlink:href="#aigrd1"
inkscape:collect="always" />
<linearGradient
gradientUnits="userSpaceOnUse"
y2="49.895073"
x2="43.140980"
y1="5.9244628"
x1="15.338736"
gradientTransform="matrix(0.975728,0.000000,0.000000,0.931033,-0.132002,1.978392)"
id="linearGradient6610"
xlink:href="#linearGradient6604"
inkscape:collect="always" />
<linearGradient
gradientUnits="userSpaceOnUse"
y2="22.783224"
x2="29.957399"
y1="9.4436626"
x1="18.570419"
gradientTransform="matrix(1.028670,0.000000,0.000000,0.972129,-1.280330,1.189340)"
id="linearGradient6623"
xlink:href="#linearGradient6617"
inkscape:collect="always" />
<linearGradient
gradientUnits="userSpaceOnUse"
y2="35.017860"
x2="38.250904"
y1="22.886259"
x1="38.506161"
gradientTransform="matrix(0.843938,0.000000,0.000000,1.184922,-1.280330,1.689340)"
id="linearGradient6631"
xlink:href="#linearGradient6625"
inkscape:collect="always" />
<radialGradient
gradientUnits="userSpaceOnUse"
r="33.156136"
fy="19.818913"
fx="24.452202"
cy="19.818913"
cx="24.452202"
gradientTransform="matrix(1.024478,0.000000,0.000000,0.976107,0.939339,-0.530329)"
id="radialGradient6663"
xlink:href="#linearGradient6665"
inkscape:collect="always" />
<radialGradient
r="33.156136"
fy="19.818913"
fx="24.452202"
cy="19.818913"
cx="24.452202"
gradientTransform="matrix(1.024478,0.000000,0.000000,0.976107,1.646447,-0.353552)"
gradientUnits="userSpaceOnUse"
id="radialGradient6675"
xlink:href="#linearGradient6665"
inkscape:collect="always" />
<radialGradient
r="14.6944"
fy="20.479359"
fx="26.887432"
cy="20.479359"
cx="26.887432"
gradientTransform="matrix(1.135551,0.000000,0.000000,1.135551,-4.540325,-2.077433)"
gradientUnits="userSpaceOnUse"
id="radialGradient6678"
xlink:href="#aigrd2"
inkscape:collect="always" />
<linearGradient
gradientUnits="userSpaceOnUse"
y2="27.403761"
x2="36.499001"
y1="35.458244"
x1="37.502811"
gradientTransform="scale(0.843938,1.184922)"
id="linearGradient6690"
xlink:href="#linearGradient6684"
inkscape:collect="always" />
</defs>
<sodipodi:namedview
inkscape:current-layer="svg5105"
inkscape:window-y="30"
inkscape:window-x="203"
inkscape:cy="20.392013"
inkscape:cx="20.303269"
inkscape:zoom="5.6568542"
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="0.16470588"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:window-width="821"
inkscape:window-height="818"
inkscape:showpageshadow="false"
showgrid="false" />
<path
style="opacity:0.48044690;color:#000000;fill:url(#radialGradient6675);fill-opacity:1.0000000;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible"
d="M 25.389110,19.305038 C 25.389110,19.305038 19.484245,27.481005 19.484245,31.228324 C 19.484245,34.975642 26.297551,32.931650 29.022873,35.656973 C 31.748195,38.382295 22.663787,45.422711 22.663787,45.422711 L 31.748195,42.924499 L 35.381959,46.785372 C 35.381959,42.129613 40.719048,38.382295 37.993726,35.543418 C 35.154848,32.704540 27.092436,33.045205 26.638216,29.297887 C 26.183995,25.550569 25.502665,19.418593 25.502665,19.418593 L 25.389110,19.305038 z "
id="path6671" />
<path
style="opacity:0.48044690;fill:url(#radialGradient6663);fill-opacity:1.0000000;fill-rule:nonzero;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
d="M 36.916160,9.3946518 C 38.237688,12.452028 40.559293,12.296470 40.616709,16.377167 C 40.649454,18.652929 42.449165,19.847910 42.449165,22.172684 C 42.449165,24.497457 38.434150,25.646156 37.066636,27.013668 C 35.699121,28.381184 37.174521,31.888095 33.464606,32.918627 C 29.789944,33.939367 27.994548,32.508375 25.669774,32.508375 C 23.344998,32.508375 17.781956,36.991063 15.730683,34.939790 C 13.679411,32.888519 13.635647,28.405831 11.857879,26.628063 C 9.9433579,24.713542 6.9184435,22.038663 6.9184435,18.619877 C 6.9184435,15.201092 8.8926489,13.396291 11.721128,10.217892 C 14.639403,6.9385873 14.729659,2.0128046 18.148445,2.0128046 C 21.567230,2.0128046 22.877627,2.9506145 25.787409,2.8770766 C 30.425746,2.7598534 30.994149,0.55375463 34.405481,2.2835766 C 37.413183,3.8087260 35.881638,7.0012699 36.916160,9.3946518 z "
id="path6639"
sodipodi:nodetypes="csssssssssssss" />
<path
id="path5112"
d="M 23.621340,18.067599 C 23.621340,18.067599 17.716475,26.243566 17.716475,29.990885 C 17.716475,33.738203 24.529781,31.694211 27.255103,34.419534 C 29.980425,37.144856 20.896017,44.185272 20.896017,44.185272 L 29.980425,41.687060 L 33.614189,45.547933 C 33.614189,40.892174 38.951278,37.144856 36.225956,34.305979 C 33.387078,31.467101 25.324666,31.807766 24.870446,28.060448 C 24.416225,24.313130 23.734895,18.181154 23.734895,18.181154 L 23.621340,18.067599 z "
style="stroke-opacity:1.0000000;stroke-miterlimit:6.5999999;stroke-width:1.0000000;stroke:#1f254f;fill-rule:nonzero;fill-opacity:1.0000000;fill:url(#linearGradient6631)" />
<path
sodipodi:nodetypes="cscccsss"
style="fill:none;fill-opacity:1.0000000;fill-rule:nonzero;stroke:url(#linearGradient6690);stroke-width:0.72112519;stroke-miterlimit:6.5999999;stroke-opacity:1.0000000"
d="M 20.803213,31.602421 C 25.355213,32.050805 28.232227,32.837946 28.609835,35.591528 C 28.939949,37.998767 24.377692,42.324487 24.377692,42.324487 L 30.221580,40.699741 L 33.062950,43.660691 C 33.725862,39.949751 37.427758,37.438687 35.741856,35.156087 C 33.627168,32.292939 26.775807,32.912620 26.448257,30.210335 C 26.120707,27.508049 18.114196,31.334950 20.803213,31.602421 z "
id="path6680" />
<path
sodipodi:nodetypes="csssssssssssss"
id="path5119"
d="M 34.935485,9.2468088 C 36.201806,12.176463 38.426426,12.027404 38.481444,15.937630 C 38.512821,18.118322 40.237349,19.263383 40.237349,21.491039 C 40.237349,23.718695 36.390061,24.819407 35.079675,26.129792 C 33.769288,27.440180 35.183053,30.800590 31.628119,31.788071 C 28.106966,32.766170 26.386573,31.394957 24.158916,31.394957 C 21.931258,31.394957 16.600611,35.690381 14.635030,33.724800 C 12.669450,31.759221 12.627514,27.463797 10.924012,25.760295 C 9.0894699,23.925753 6.1909207,21.362617 6.1909207,18.086651 C 6.1909207,14.810685 8.0826538,13.081280 10.792974,10.035658 C 13.589338,6.8933472 13.675824,2.1733389 16.951790,2.1733389 C 20.227756,2.1733389 21.483411,3.0719718 24.271637,3.0015059 C 28.716208,2.8891797 29.260866,0.77524063 32.529689,2.4327994 C 35.411745,3.8942357 33.944180,6.9534113 34.935485,9.2468088 z "
style="stroke-opacity:1.0000000;stroke-miterlimit:4.0000000;stroke-linejoin:round;stroke-linecap:round;stroke:#4c0901;fill-rule:nonzero;fill:url(#radialGradient5284)" />
<path
id="path5126"
d="M 34.976850,17.567599 C 34.976850,23.813130 29.866870,28.923109 23.621340,28.923109 C 17.375809,28.923109 12.265830,23.813130 12.265830,17.567599 C 12.265830,11.322069 17.375809,6.2120891 23.621340,6.2120891 C 29.866870,6.2120891 34.976850,11.322069 34.976850,17.567599 z "
style="stroke-miterlimit:4.0000000;stroke:none;fill-rule:nonzero;fill:url(#radialGradient6678)" />
<path
style="fill:none;fill-rule:nonzero;stroke:url(#linearGradient6610);stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
d="M 33.888971,10.030124 C 35.042232,12.698211 37.068232,12.562460 37.118338,16.123571 C 37.146913,18.109565 38.717470,19.152392 38.717470,21.181157 C 38.717470,23.209922 35.213679,24.212359 34.020288,25.405749 C 32.826895,26.599143 34.114436,29.659526 30.876896,30.558842 C 27.670121,31.449613 26.103329,30.200827 24.074563,30.200827 C 22.045797,30.200827 17.191084,34.112744 15.400995,32.322655 C 13.610908,30.532568 13.572716,26.620651 12.021307,25.069242 C 10.350558,23.398493 7.7107989,21.064201 7.7107989,18.080722 C 7.7107989,15.097243 9.4336334,13.522243 11.901968,10.748543 C 14.448666,7.8867861 14.527430,3.5881928 17.510909,3.5881928 C 20.494388,3.5881928 21.637935,4.4065934 24.177221,4.3424188 C 28.224968,4.2401214 28.720998,2.3149204 31.697971,3.8244879 C 34.322710,5.1554433 32.986173,7.9414875 33.888971,10.030124 z "
id="path6600"
sodipodi:nodetypes="csssssssssssss" />
<path
id="path6612"
d="M 23.663250,7.0524597 C 17.795434,7.0524597 13.016988,11.794692 13.016988,17.662510 C 13.016988,21.333503 15.000693,24.443138 17.833154,26.353336 C 25.073625,22.456374 23.786958,15.548148 33.440430,13.606789 C 31.841424,9.7576868 28.088842,7.0524597 23.663250,7.0524597 z "
style="color:#000000;fill:url(#linearGradient6623);fill-opacity:1.0000000;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;opacity:1.0000000" />
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -0,0 +1,91 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="48"
height="48"
id="svg2448">
<defs
id="defs2450">
<linearGradient
id="linearGradient8662">
<stop
id="stop8664"
style="stop-color:black;stop-opacity:1"
offset="0" />
<stop
id="stop8666"
style="stop-color:black;stop-opacity:0"
offset="1" />
</linearGradient>
<radialGradient
cx="24.837126"
cy="36.421127"
r="15.644737"
fx="24.837126"
fy="36.421127"
id="radialGradient1444"
xlink:href="#linearGradient8662"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.536723,0,16.87306)" />
<linearGradient
id="linearGradient2264">
<stop
id="stop2266"
style="stop-color:#d7e866;stop-opacity:1"
offset="0" />
<stop
id="stop2268"
style="stop-color:#8cab2a;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="-84.343536"
y1="-5.3878593"
x2="-91.513138"
y2="24.558243"
id="linearGradient2628"
xlink:href="#linearGradient2264"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.017301,-0.243559,0.243559,1.017301,110.52469,-7.9553513)" />
<linearGradient
id="linearGradient3400">
<stop
id="stop3402"
style="stop-color:white;stop-opacity:1"
offset="0" />
<stop
id="stop3404"
style="stop-color:white;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
x1="20.494444"
y1="6.0097799"
x2="20.494444"
y2="47.760197"
id="linearGradient3406"
xlink:href="#linearGradient3400"
gradientUnits="userSpaceOnUse" />
</defs>
<g
id="layer1">
<path
d="m 40.481863,36.421127 a 15.644737,8.3968938 0 1 1 -31.2894745,0 15.644737,8.3968938 0 1 1 31.2894745,0 z"
transform="matrix(1.214466,0,0,0.595458,-6.163846,20.31274)"
id="path8660"
style="opacity:0.20454544;color:black;fill:url(#radialGradient1444);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" />
<path
d="m 33.706448,5.4818293 c -0.559734,-0.056806 -1.116221,0.217337 -1.403811,0.7436469 L 20.049307,28.645074 12.17121,22.380993 c -0.701747,-0.383453 -1.577286,-0.136769 -1.960742,0.564978 l -3.5328714,4.535744 c -0.3834475,0.701741 -0.1254891,1.577017 0.5762529,1.960469 0,0 14.3844195,11.880283 14.4021675,11.889074 0.164469,0.08987 0.336465,0.135093 0.511297,0.157184 0.571121,0.07217 1.155595,-0.196162 1.449176,-0.733433 L 40.141725,10.519399 C 40.525176,9.8176549 40.267222,8.9423801 39.565474,8.558928 L 34.26311,5.6492257 C 34.087671,5.553362 33.893026,5.5007637 33.706448,5.4818293 z"
id="path1542"
style="fill:url(#linearGradient2628);fill-opacity:1;fill-rule:nonzero;stroke:#42770c;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" />
<path
d="M 32.938536,7.2012775 26.730268,18.60791 21.197213,28.668822 c -0.178482,0.181096 -0.123845,0.754094 -0.902701,0.952966 -0.538869,0.137595 -0.636352,-0.06289 -1.204172,-0.427914 l -6.950556,-5.492153 c -0.7733,-0.621665 -0.749753,-0.589365 -1.297288,-0.03737 L 8.0515824,27.18582 c -0.7518117,0.804672 -0.6353589,1.290849 0.3017539,1.891047 0,0 13.0781537,10.780055 13.0949407,10.788373 0.155564,0.085 0.0892,0.114145 0.757862,0.57814 0.428927,0.297637 0.807539,-0.647982 1.083435,-1.15286 L 39.190779,10.274963 C 39.55113,9.6155282 39.523767,9.624421 38.860008,9.2617466 L 34.11801,6.7472827 C 33.434075,6.3758505 33.430508,6.3800895 32.938536,7.2012775 z"
id="path1544"
style="opacity:0.4;fill:none;stroke:url(#linearGradient3406);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@ -0,0 +1,390 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.0"
width="48"
height="48"
id="svg2527">
<defs
id="defs2529">
<linearGradient
id="linearGradient8838">
<stop
id="stop8840"
style="stop-color:#000000;stop-opacity:1"
offset="0" />
<stop
id="stop8842"
style="stop-color:#000000;stop-opacity:0"
offset="1" />
</linearGradient>
<radialGradient
cx="62.625"
cy="4.625"
r="10.625"
fx="62.625"
fy="4.625"
id="radialGradient2436"
xlink:href="#linearGradient8838"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.1647059,0,0,0.7529402,-111.56471,36.517647)" />
<linearGradient
id="linearGradient3397">
<stop
id="stop3399"
style="stop-color:#aaaaaa;stop-opacity:1"
offset="0" />
<stop
id="stop3401"
style="stop-color:#8c8c8c;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="37.201294"
y1="1"
x2="37.201294"
y2="45"
id="linearGradient2517"
xlink:href="#linearGradient3397"
gradientUnits="userSpaceOnUse" />
<linearGradient
x1="63.9995"
y1="3.1001"
x2="63.9995"
y2="122.8994"
id="linearGradient3309"
gradientUnits="userSpaceOnUse">
<stop
id="stop3311"
style="stop-color:#f6f6f6;stop-opacity:1"
offset="0" />
<stop
id="stop3313"
style="stop-color:#d2d2d2;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="20.758585"
y1="1"
x2="20.758585"
y2="45.017357"
id="linearGradient2515"
xlink:href="#linearGradient3309"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient5128">
<stop
id="stop5130"
style="stop-color:#e5e5e5;stop-opacity:1"
offset="0" />
<stop
id="stop5132"
style="stop-color:#ababab;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="86.132919"
y1="105.105"
x2="84.63858"
y2="20.895"
id="linearGradient2512"
xlink:href="#linearGradient5128"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.3244803,0,0,0.3244803,3.2332655,2.5577454)" />
<radialGradient
cx="6.702713"
cy="73.615715"
r="7.228416"
fx="6.702713"
fy="73.615715"
id="radialGradient2538"
xlink:href="#linearGradient10691"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.2134617,0,0,0.4842001,1.1638028,-7.1447362)" />
<linearGradient
id="linearGradient10691">
<stop
id="stop10693"
style="stop-color:#000000;stop-opacity:1"
offset="0" />
<stop
id="stop10695"
style="stop-color:#000000;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
x1="32.036148"
y1="19"
x2="32.036148"
y2="47.012184"
id="linearGradient3326"
xlink:href="#linearGradient3309-8"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.93928017,0.34315123,-0.34315123,0.93928017,-1.7936946,-25.633934)" />
<linearGradient
x1="63.9995"
y1="3.1001"
x2="63.9995"
y2="122.8994"
id="linearGradient3309-8"
gradientUnits="userSpaceOnUse">
<stop
id="stop3311-4"
style="stop-color:#f6f6f6;stop-opacity:1"
offset="0" />
<stop
id="stop3313-8"
style="stop-color:#d2d2d2;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="25.922546"
y1="19"
x2="25.922546"
y2="47.044857"
id="linearGradient3328"
xlink:href="#linearGradient3397-1"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.93928017,0.34315123,-0.34315123,0.93928017,-1.7936946,-25.633934)" />
<linearGradient
id="linearGradient3397-1">
<stop
id="stop3399-0"
style="stop-color:#aaaaaa;stop-opacity:1"
offset="0" />
<stop
id="stop3401-3"
style="stop-color:#8c8c8c;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient5128-0">
<stop
id="stop5130-4"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop5132-4"
style="stop-color:#959595;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="86.132919"
y1="105.105"
x2="84.63858"
y2="20.895"
id="linearGradient2868"
xlink:href="#linearGradient5128-0"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.2014014,0,0,0.2014015,3.1103045,3.311705)" />
<radialGradient
cx="6.702713"
cy="73.615715"
r="7.228416"
fx="6.702713"
fy="73.615715"
id="radialGradient2411"
xlink:href="#linearGradient10691-8"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.660115,0,0,0.3458573,0.8727276,-3.9605294)" />
<linearGradient
id="linearGradient10691-8">
<stop
id="stop10693-6"
style="stop-color:#000000;stop-opacity:1"
offset="0" />
<stop
id="stop10695-0"
style="stop-color:#000000;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
x1="34"
y1="1"
x2="34"
y2="23.00024"
id="linearGradient3218"
xlink:href="#linearGradient3309-4"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-24.5,0)" />
<linearGradient
x1="63.9995"
y1="3.1001"
x2="63.9995"
y2="122.8994"
id="linearGradient3309-4"
gradientUnits="userSpaceOnUse">
<stop
id="stop3311-8"
style="stop-color:#f6f6f6;stop-opacity:1"
offset="0" />
<stop
id="stop3313-88"
style="stop-color:#d2d2d2;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="40"
y1="1"
x2="40"
y2="23.019524"
id="linearGradient3228"
xlink:href="#linearGradient3397-9"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-24.5,0)" />
<linearGradient
id="linearGradient3397-9">
<stop
id="stop3399-7"
style="stop-color:#aaaaaa;stop-opacity:1"
offset="0" />
<stop
id="stop3401-7"
style="stop-color:#8c8c8c;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="86.132919"
y1="105.105"
x2="84.63858"
y2="20.895"
id="linearGradient3241"
xlink:href="#linearGradient5128-6"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.1562313,0,0,0.1562313,2.0012016,2.1574324)" />
<linearGradient
id="linearGradient5128-6">
<stop
id="stop5130-43"
style="stop-color:#eeeeee;stop-opacity:1"
offset="0" />
<stop
id="stop5132-0"
style="stop-color:#a2a2a2;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="25"
y1="0"
x2="25"
y2="16.000105"
id="linearGradient3262"
xlink:href="#linearGradient3309-6"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-17.058189,0)" />
<linearGradient
x1="63.9995"
y1="3.1001"
x2="63.9995"
y2="122.8994"
id="linearGradient3309-6"
gradientUnits="userSpaceOnUse">
<stop
id="stop3311-2"
style="stop-color:#f6f6f6;stop-opacity:1"
offset="0" />
<stop
id="stop3313-9"
style="stop-color:#cccccc;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="21"
y1="0"
x2="21"
y2="16.004715"
id="linearGradient3264"
xlink:href="#linearGradient3397-90"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-17.058189,0)" />
<linearGradient
id="linearGradient3397-90">
<stop
id="stop3399-8"
style="stop-color:#aaaaaa;stop-opacity:1"
offset="0" />
<stop
id="stop3401-1"
style="stop-color:#8c8c8c;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="86.132919"
y1="105.105"
x2="84.63858"
y2="20.895"
id="linearGradient3260"
xlink:href="#linearGradient5128-3"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.09614231,0,0,0.09614231,1.8468935,1.9430362)" />
<linearGradient
id="linearGradient5128-3">
<stop
id="stop5130-1"
style="stop-color:#e5e5e5;stop-opacity:1"
offset="0" />
<stop
id="stop5132-1"
style="stop-color:#ababab;stop-opacity:1"
offset="1" />
</linearGradient>
</defs>
<g
transform="translate(15.999999,12)"
id="layer1">
<path
d="m 18.636572,2.5905216 c -0.703275,-0.2569307 -1.495689,0.08705 -1.752619,0.7903248 l -0.600515,1.6437399 c -0.499176,-0.013219 -0.993955,0.00248 -1.484533,0.056512 L 14.072373,3.5181351 C 13.756758,2.8391668 12.960838,2.5483897 12.28187,2.864003 L 8.3651471,4.6602954 C 7.6861782,4.9759083 7.3954033,5.7718319 7.7110151,6.4507982 l 0.726532,1.5629636 C 8.0724464,8.359396 7.744193,8.7441155 7.4266456,9.141602 L 5.8122578,8.5518108 C 5.1089821,8.2948801 4.3165666,8.6388602 4.0596381,9.3421356 L 2.5797984,13.392781 c -0.2569313,0.703275 0.1271272,1.477063 0.8304007,1.733991 l 1.6143878,0.589791 c -0.013469,0.508577 -0.010523,1.014295 0.045789,1.513885 l -1.5629633,0.726533 c -0.6789688,0.315613 -0.9697472,1.111534 -0.654132,1.790502 l 1.8363684,3.898094 c 0.3156123,0.678968 1.1115366,0.969744 1.7905029,0.654132 l 1.5629636,-0.726532 c 0.3402133,0.357549 0.7083491,0.688501 1.0984877,1.000178 l -0.6005147,1.64374 c -0.2569313,0.703275 0.1271291,1.477064 0.8304008,1.733991 l 4.0212927,1.469116 c 0.703276,0.256931 1.466338,-0.09777 1.723267,-0.801048 l 0.600515,-1.64374 c 0.508577,0.01347 1.014295,0.01052 1.513885,-0.04579 l 0.726532,1.562963 c 0.315614,0.678968 1.111534,0.969745 1.790502,0.654132 l 3.916723,-1.796292 c 0.678969,-0.315613 0.969742,-1.111538 0.654132,-1.790503 l -0.745161,-1.603039 c 0.357549,-0.340214 0.6885,-0.708349 1.000178,-1.098488 l 1.64374,0.600515 c 0.703276,0.25693 1.466338,-0.09778 1.723267,-0.801049 l 1.47984,-4.050645 c 0.256931,-0.703275 -0.09778,-1.466339 -0.801048,-1.723268 l -1.64374,-0.600514 c 0.01322,-0.499176 -0.0025,-0.993955 -0.05651,-1.484533 l 1.60304,-0.745162 C 29.20091,13.73813 29.491686,12.942208 29.176073,12.26324 L 27.339704,8.365146 C 27.024092,7.6861784 26.228168,7.3954 25.549202,7.711014 L 23.986239,8.4375465 C 23.640605,8.0724458 23.255886,7.7441924 22.858399,7.4266449 L 23.458914,5.782905 C 23.715845,5.0796306 23.361136,4.3165668 22.657865,4.0596378 L 18.636572,2.5905216 z M 17.20103,12.71252 c 1.81469,0.662968 2.74942,2.67382 2.086452,4.48851 -0.662969,1.814689 -2.673821,2.749419 -4.48851,2.086451 -1.814691,-0.662969 -2.74942,-2.673821 -2.086452,-4.48851 0.662968,-1.81469 2.673821,-2.74942 4.48851,-2.086451 z"
id="rect2576"
style="fill:url(#linearGradient3326);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3328);stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:block;overflow:visible;enable-background:accumulate" />
<path
d="m 16.000001,7.9999996 c -4.411273,0 -7.9999985,3.5887274 -7.9999985,8.0000004 0,4.411274 3.5887255,8 7.9999985,8 C 20.411274,24 24,20.411274 24,16 24,11.588727 20.411274,7.9999996 16.000001,7.9999996 z m 0,3.6923094 c 2.377844,0 4.307693,1.929846 4.307693,4.307691 0,2.377847 -1.929849,4.307693 -4.307693,4.307693 -2.377846,0 -4.307691,-1.929846 -4.307691,-4.307693 0,-2.377845 1.929845,-4.307691 4.307691,-4.307691 z"
id="path3315"
style="opacity:0.05;fill:#000000;fill-opacity:1;stroke:none" />
<path
d="m 16.000001,7.6206906 c -4.620353,0 -8.3793085,3.7589574 -8.3793085,8.3793084 0,4.620352 3.7589555,8.37931 8.3793085,8.37931 4.620353,0 8.379309,-3.758958 8.379309,-8.37931 0,-4.620351 -3.758956,-8.3793084 -8.379309,-8.3793084 z"
id="path28"
style="fill:none;stroke:url(#linearGradient2868);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none" />
</g>
<g
transform="translate(2,-1)"
id="layer1-3">
<g
id="g2486">
<path
d="M 10.1875,1.5 C 9.799134,1.5 9.5,1.7991339 9.5,2.1875 l 0,1.6875 C 8.988333,4.0322247 8.496816,4.2537684 8.03125,4.5 L 6.84375,3.3125 c -0.274616,-0.2746162 -0.725384,-0.2746162 -1,0 L 3.3125,5.84375 c -0.274616,0.2746162 -0.274616,0.7253836 0,1 L 4.5,8.03125 C 4.253769,8.4968155 4.032225,8.9883329 3.875,9.5 l -1.6875,0 C 1.799134,9.5 1.5,9.7991344 1.5,10.1875 l 0,3.625 C 1.5,14.200866 1.799134,14.5 2.1875,14.5 l 1.6875,0 c 0.157225,0.511667 0.378769,1.003185 0.625,1.46875 l -1.1875,1.1875 c -0.274616,0.274616 -0.274616,0.725384 0,1 l 2.53125,2.53125 c 0.274616,0.274616 0.725384,0.274616 1,0 L 8.03125,19.5 C 8.496816,19.746232 8.988333,19.967775 9.5,20.125 l 0,1.6875 c 0,0.388366 0.299135,0.6875 0.6875,0.6875 l 3.625,0 c 0.388366,0 0.6875,-0.299134 0.6875,-0.6875 l 0,-1.6875 c 0.511667,-0.157225 1.003185,-0.378768 1.46875,-0.625 l 1.1875,1.1875 c 0.274616,0.274616 0.725384,0.274616 1,0 l 2.53125,-2.53125 c 0.274616,-0.274616 0.274616,-0.725384 0,-1 L 19.5,15.96875 C 19.746232,15.503185 19.967775,15.011667 20.125,14.5 l 1.6875,0 c 0.388366,0 0.6875,-0.299134 0.6875,-0.6875 l 0,-3.625 C 22.5,9.7991341 22.200866,9.5 21.8125,9.5 l -1.6875,0 C 19.967775,8.9883329 19.746232,8.4968155 19.5,8.03125 l 1.1875,-1.1875 c 0.274616,-0.2746162 0.274616,-0.7253837 0,-1 L 18.15625,3.3125 c -0.274616,-0.2746162 -0.725384,-0.2746162 -1,0 L 15.96875,4.5 C 15.503185,4.2537684 15.011667,4.0322247 14.5,3.875 l 0,-1.6875 C 14.5,1.7991341 14.200866,1.5 13.8125,1.5 l -3.625,0 z M 12,9 c 1.656,0 3,1.344 3,3 0,1.656 -1.344,3 -3,3 -1.656,0 -3,-1.344 -3,-3 0,-1.656 1.344,-3 3,-3 z"
id="rect2426"
style="fill:url(#linearGradient3218);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3228);stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:block;overflow:visible;enable-background:accumulate" />
<path
d="m 12,6 c -3.3084557,-2e-7 -5.9999999,2.6915446 -5.9999999,6 0,3.308455 2.6915442,6 5.9999999,6 3.308455,-1e-6 6,-2.691545 6,-6 0,-3.3084554 -2.691545,-6 -6,-6 z m 0,2.7692308 c 1.783385,0 3.230769,1.4473842 3.230769,3.2307692 0,1.783385 -1.447384,3.230769 -3.230769,3.230769 -1.783385,0 -3.2307692,-1.447384 -3.2307692,-3.230769 0,-1.783385 1.4473842,-3.2307692 3.2307692,-3.2307692 z"
id="path3315-9"
style="opacity:0.05;fill:#000000;fill-opacity:1;stroke:none" />
<path
d="m 11.999999,5.4999995 c -3.5840997,0 -6.4999994,2.9158997 -6.4999994,6.4999995 C 5.4999996,15.5841 8.4158993,18.5 11.999999,18.5 15.584101,18.5 18.5,15.5841 18.5,11.999999 18.5,8.4158992 15.584101,5.4999995 11.999999,5.4999995 z"
id="path28-2"
style="fill:none;stroke:url(#linearGradient3241);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none" />
</g>
</g>
<g
transform="translate(3,29)"
id="layer1-0">
<g
id="g2479">
<path
d="M 6.9375,0.5 C 6.6890831,0.5 6.5,0.68908218 6.5,0.9375 l 0,1.25 C 5.9460971,2.3297005 5.448836,2.5593783 4.96875,2.84375 L 4.0625,1.9375 c -0.1756569,-0.1756579 -0.449342,-0.1756579 -0.625,0 l -1.5,1.5 c -0.175657,0.1756579 -0.175657,0.4493421 0,0.625 L 2.84375,4.96875 C 2.5593789,5.4488356 2.329701,5.9460968 2.1875,6.5 l -1.25,0 C 0.68908301,6.5 0.5,6.6890821 0.5,6.9375 l 0,2.125 c 1e-8,0.2484178 0.189083,0.4375 0.4375,0.4375 l 1.25,0 c 0.1422009,0.553903 0.371879,1.051164 0.65625,1.53125 L 1.9375,11.9375 c -0.175657,0.175658 -0.175657,0.449342 0,0.625 l 1.5,1.5 c 0.1756579,0.175658 0.449342,0.175658 0.625,0 L 4.96875,13.15625 C 5.4488361,13.440622 5.946097,13.6703 6.5,13.8125 l 0,1.25 c 1e-7,0.248418 0.189083,0.4375 0.4375,0.4375 l 2.125,0 C 9.3109176,15.5 9.5,15.310918 9.5,15.0625 l 0,-1.25 c 0.553903,-0.1422 1.051164,-0.371878 1.53125,-0.65625 l 0.90625,0.90625 c 0.175658,0.175658 0.449342,0.175658 0.625,0 l 1.5,-1.5 c 0.175658,-0.175658 0.175658,-0.449342 0,-0.625 L 13.15625,11.03125 C 13.440622,10.551164 13.6703,10.053903 13.8125,9.5 l 1.25,0 C 15.310918,9.5 15.5,9.3109174 15.5,9.0625 l 0,-2.125 C 15.5,6.6890822 15.310917,6.5 15.0625,6.5 l -1.25,0 C 13.6703,5.9460968 13.440622,5.4488356 13.15625,4.96875 L 14.0625,4.0625 c 0.175658,-0.1756579 0.175658,-0.449342 0,-0.625 l -1.5,-1.5 c -0.175658,-0.1756579 -0.449342,-0.1756579 -0.625,0 L 11.03125,2.84375 C 10.551164,2.5593783 10.053903,2.3297005 9.5,2.1875 l 0,-1.25 C 9.4999996,0.68908218 9.310918,0.5 9.0625,0.5 l -2.125,0 z M 8,6 c 1.104,0 2,0.896 2,2 0,1.104 -0.896,2 -2,2 C 6.896,10 6,9.104 6,8 6,6.896 6.896,6 8,6 z"
id="path2426"
style="fill:url(#linearGradient3262);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3264);stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:block;overflow:visible;enable-background:accumulate" />
<path
d="M 8,3.465116 C 5.4994229,3.465116 3.4651163,5.499423 3.4651163,8 3.4651163,10.500577 5.4994229,12.534884 8,12.534884 10.500576,12.534883 12.534884,10.500577 12.534884,8 12.534884,5.499423 10.500576,3.465116 8,3.465116 z M 8,5.55814 c 1.347907,0 2.44186,1.093953 2.44186,2.44186 0,1.347907 -1.093953,2.44186 -2.44186,2.44186 C 6.652093,10.44186 5.5581395,9.347907 5.5581395,8 5.5581395,6.652093 6.652093,5.55814 8,5.55814 z"
id="path3315-3"
style="opacity:0.05;fill:#000000;fill-opacity:1;stroke:none" />
<path
d="M 8.0000001,4 C 5.7943997,4 3.9999999,5.7944001 3.9999999,8.0000008 3.9999999,10.2056 5.7943997,12 8.0000001,12 10.2056,12 12,10.2056 12,8.0000008 12,5.7944001 10.2056,4 8.0000001,4 z"
id="path28-4"
style="fill:none;stroke:url(#linearGradient3260);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -0,0 +1,131 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.0"
width="48"
height="48"
id="svg3581">
<defs
id="defs3583">
<linearGradient
id="linearGradient8838">
<stop
id="stop8840"
style="stop-color:#000000;stop-opacity:1"
offset="0" />
<stop
id="stop8842"
style="stop-color:#000000;stop-opacity:0"
offset="1" />
</linearGradient>
<radialGradient
cx="62.625"
cy="4.625"
r="10.625"
fx="62.625"
fy="4.625"
id="radialGradient3534"
xlink:href="#linearGradient8838"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.1647059,0,0,0.7529402,-111.56471,36.517647)" />
<linearGradient
id="linearGradient2490-182-124">
<stop
id="stop2788"
style="stop-color:#1f4b6a;stop-opacity:1"
offset="0" />
<stop
id="stop2790"
style="stop-color:#4083c2;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="18.379412"
y1="44.980297"
x2="18.379412"
y2="3.0816143"
id="linearGradient3531"
xlink:href="#linearGradient2490-182-124"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.9584364,0,0,0.9584366,0.9975246,1.9975253)" />
<linearGradient
id="linearGradient3242-187-536">
<stop
id="stop2778"
style="stop-color:#8badea;stop-opacity:1"
offset="0" />
<stop
id="stop2780"
style="stop-color:#6396cd;stop-opacity:1"
offset="0.26238" />
<stop
id="stop2782"
style="stop-color:#3b7caf;stop-opacity:1"
offset="0.66093999" />
<stop
id="stop2784"
style="stop-color:#194c70;stop-opacity:1"
offset="1" />
</linearGradient>
<radialGradient
cx="23.895569"
cy="3.9900031"
r="20.397499"
fx="23.895569"
fy="3.9900031"
id="radialGradient3529"
xlink:href="#linearGradient3242-187-536"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0,2.2874593,-3.0194057,0,36.047437,-50.630156)" />
<linearGradient
id="linearGradient4873">
<stop
id="stop4875"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop4877"
style="stop-color:#ffffff;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
x1="63.397362"
y1="-12.489107"
x2="63.397362"
y2="5.4675598"
id="linearGradient3526"
xlink:href="#linearGradient4873"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.1153735,0,0,2.1153253,-107.57709,32.426559)" />
</defs>
<g
id="layer1">
<path
d="M 46.999997,40 C 46.999997,44.418278 36.702545,48 23.999997,48 C 11.297449,48 0.9999968,44.418278 0.9999968,40 C 0.9999968,35.581722 11.297449,32 23.999997,32 C 36.702545,32 46.999997,35.581722 46.999997,40 L 46.999997,40 z"
id="path8836"
style="opacity:0.3;fill:url(#radialGradient3534);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
<path
d="M 24.000002,5.5018088 C 13.241573,5.5018088 4.5018088,14.24157 4.5018088,25 C 4.5018088,35.75843 13.241573,44.498195 24.000002,44.498192 C 34.758427,44.498192 43.498201,35.75843 43.498191,25 C 43.498191,14.24157 34.758427,5.5018088 24.000002,5.5018088 z"
id="path2555"
style="fill:url(#radialGradient3529);fill-opacity:1;stroke:url(#linearGradient3531);stroke-width:1.003654;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<path
d="M 42.500002,24.999344 C 42.500002,35.216942 34.21666,43.5 24.000235,43.5 C 13.782875,43.5 5.5000003,35.216848 5.5000003,24.999344 C 5.5000003,14.782219 13.782875,6.5000001 24.000235,6.5000001 C 34.21666,6.5000001 42.500002,14.782219 42.500002,24.999344 L 42.500002,24.999344 z"
id="path8655"
style="opacity:0.4;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3526);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<g
transform="translate(-2.507855,0)"
id="g3538">
<path
d="M 20.507855,24.213243 C 20.766006,24.915016 21.056573,25.483856 21.675512,24.706045 C 22.442859,24.249493 25.013952,22.248288 24.756683,24.208513 C 23.93342,27.835795 22.931327,31.424931 22.165113,35.063385 C 21.363928,37.055603 23.183263,38.857649 25.082782,37.562099 C 27.101847,36.729758 28.839248,35.374018 30.614199,34.130331 C 30.372019,33.536398 30.210602,32.683218 29.541434,33.459946 C 28.662781,33.858755 26.743708,35.738993 26.387179,34.188218 C 27.125239,30.260529 28.492698,26.478234 29.366801,22.58186 C 30.171202,20.790317 28.857456,18.526637 26.890929,20.008625 C 24.534979,21.034718 22.564787,22.710882 20.507855,24.213243 z M 29.251545,11.003077 C 26.847779,10.875511 25.591007,14.750449 27.87529,15.810806 C 29.728512,16.57083 31.746339,14.670114 31.293604,12.770861 C 31.153105,11.781904 30.26521,10.96981 29.251546,11.003077 L 29.251545,11.003077 z"
id="text3482"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;opacity:0.2;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:URW Palladio L;-inkscape-font-specification:URW Palladio L Bold" />
<path
d="M 20.507855,25.213243 C 20.766006,25.915016 21.056573,26.483856 21.675512,25.706045 C 22.442859,25.249493 25.013952,23.248288 24.756683,25.208513 C 23.93342,28.835795 22.931327,32.424931 22.165113,36.063385 C 21.363928,38.055603 23.183263,39.857649 25.082782,38.562099 C 27.101847,37.729758 28.839248,36.374018 30.614199,35.130331 C 30.372019,34.536398 30.210602,33.683218 29.541434,34.459946 C 28.662781,34.858755 26.743708,36.738993 26.387179,35.188218 C 27.125239,31.260529 28.492698,27.478234 29.366801,23.58186 C 30.171202,21.790317 28.857456,19.526637 26.890929,21.008625 C 24.534979,22.034718 22.564787,23.710882 20.507855,25.213243 z M 29.251545,12.003077 C 26.847779,11.875511 25.591007,15.750449 27.87529,16.810806 C 29.728512,17.57083 31.746339,15.670114 31.293604,13.770861 C 31.153105,12.781904 30.26521,11.96981 29.251546,12.003077 L 29.251545,12.003077 z"
id="path3536"
style="font-size:40px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:URW Palladio L;-inkscape-font-specification:URW Palladio L Bold" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.2 KiB

View File

@ -0,0 +1,230 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="48"
height="48"
id="svg2474">
<metadata
id="metadata33">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs2476">
<linearGradient
id="linearGradient3533">
<stop
id="stop3535"
style="stop-color:#93b9dd;stop-opacity:1"
offset="0" />
<stop
id="stop3545"
style="stop-color:#6396cd;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3266">
<stop
id="stop3268"
style="stop-color:#387ab8;stop-opacity:1"
offset="0" />
<stop
id="stop3270"
style="stop-color:#387ab8;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3276">
<stop
id="stop3278"
style="stop-color:#6396cd;stop-opacity:1"
offset="0" />
<stop
id="stop3280"
style="stop-color:#83acd5;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
x1="108.5625"
y1="102.78125"
x2="108.5625"
y2="71.78125"
id="linearGradient5497"
xlink:href="#linearGradient5491"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-95.99949,-49.00038)" />
<linearGradient
id="linearGradient5491">
<stop
id="stop5493"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop5495"
style="stop-color:#ffffff;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
x1="102.5625"
y1="49.78125"
x2="103.5625"
y2="72.78125"
id="linearGradient5480"
xlink:href="#linearGradient5474"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-95.99949,-49.00038)" />
<linearGradient
id="linearGradient5474">
<stop
id="stop5476"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop5478"
style="stop-color:#ffffff;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
x1="118.47968"
y1="55.060318"
x2="118.47968"
y2="91.941895"
id="linearGradient4593-5-8-1-5-2"
xlink:href="#linearGradient3533"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-100.99949,-49.00038)" />
<linearGradient
x1="34.980953"
y1="53.837799"
x2="35.996098"
y2="83.57618"
id="linearGradient4593-5-8-1-5-2-3"
xlink:href="#linearGradient3533"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-5,0)" />
<radialGradient
cx="33.875"
cy="197.29688"
r="4.84375"
fx="33.875"
fy="197.29688"
id="radialGradient5147-5"
xlink:href="#linearGradient6462-6-8-548-9-2-7"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.33870968,0,130.47051)" />
<linearGradient
id="linearGradient6462-6-8-548-9-2-7">
<stop
id="stop6464-5-9-94-5-4-4"
style="stop-color:#000000;stop-opacity:1"
offset="0" />
<stop
id="stop6466-3-6-1-7-2-8"
style="stop-color:#000000;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient6462-6-8-548-9-5">
<stop
id="stop6464-5-9-94-5-8"
style="stop-color:#000000;stop-opacity:1"
offset="0" />
<stop
id="stop6466-3-6-1-7-5"
style="stop-color:#000000;stop-opacity:0"
offset="1" />
</linearGradient>
<radialGradient
cx="33.875"
cy="197.29688"
r="4.84375"
fx="33.875"
fy="197.29688"
id="radialGradient6081"
xlink:href="#linearGradient6462-6-8-548-9-5"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.33870968,0,130.47051)" />
<linearGradient
x1="42.030777"
y1="84.719109"
x2="53.808601"
y2="73.263672"
id="linearGradient4008"
xlink:href="#linearGradient3276"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-5,0)" />
<linearGradient
x1="39.843277"
y1="83.781609"
x2="50.683601"
y2="75.138672"
id="linearGradient4018"
xlink:href="#linearGradient3266"
gradientUnits="userSpaceOnUse" />
</defs>
<path
d="m 38.71875,197.29687 a 4.84375,1.640625 0 1 1 -9.6875,0 4.84375,1.640625 0 1 1 9.6875,0 z"
transform="matrix(3.3032251,0,0,1.6761866,-89.458749,-288.73764)"
id="path6460-6-4-4-3-3"
style="opacity:0.2;color:#000000;fill:url(#radialGradient5147-5);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
<path
d="M 46.405989,78.610714 A 13.125,13.125 0 0 1 33.62701,84.097034"
transform="matrix(1.0666665,0,0,1.0666665,-14.49949,-51.367037)"
id="path4010"
style="color:#000000;fill:none;stroke:url(#linearGradient4018);stroke-width:8.43750095;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
<path
d="m 38.71875,197.29687 a 4.84375,1.640625 0 1 1 -9.6875,0 4.84375,1.640625 0 1 1 9.6875,0 z"
transform="matrix(4.541935,0,0,1.9809503,-131.42005,-348.86656)"
id="path6460-6-4-4-4"
style="opacity:0.1;color:#000000;fill:url(#radialGradient6081);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
<path
d="M 35.542313,84.24974 A 13.125,13.125 0 1 1 47.171703,64.884866"
transform="matrix(1.0666665,0,0,1.0666665,-14.49949,-51.367037)"
id="path4788-6"
style="color:#000000;fill:none;stroke:#387ab8;stroke-width:8.43750095;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
<path
d="m 38.50051,9.4996196 0,11.0000004 -11,0"
id="path4847"
style="color:#000000;fill:none;stroke:#387ab8;stroke-width:7;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
<path
d="m 46.386659,78.638476 a 13.125,13.125 0 0 1 -13.412517,5.34104"
transform="matrix(1.0666665,0,0,1.0666665,-14.49949,-51.367037)"
id="path4006"
style="color:#000000;fill:none;stroke:url(#linearGradient4008);stroke-width:6.56250095;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
<path
d="m 37.320778,84.13999 a 13.125,13.125 0 1 1 9.33779,-20.123155"
transform="matrix(1.0666665,0,0,1.0666665,-14.49949,-51.367037)"
id="path4788"
style="color:#000000;fill:none;stroke:url(#linearGradient4593-5-8-1-5-2-3);stroke-width:6.56250095;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
<path
d="m 38.50051,9.4996196 0,11.0000004 -11,0"
id="path4847-1"
style="color:#000000;fill:none;stroke:url(#linearGradient4593-5-8-1-5-2);stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new" />
<path
d="m 29.740794,33.593555 c -3.674085,2.533277 -8.663315,2.652831 -12.552784,-0.06269 -5.010358,-3.498088 -6.216831,-10.333397 -2.718751,-15.34375 3.498091,-5.010353 10.3334,-6.216833 15.343751,-2.71875 1.16116,0.810688 2.10377,1.843969 2.875,3.03125 l -5.1875,0 c -1.056625,-0.01494 -2.028484,0.943269 -2.028484,2 0,1.056731 0.971859,2.014943 2.028484,2 l 11,0 c 1.062499,0.28125 2.062499,-0.71875 2,-2 l 0,-11.0000004 c 0.01671,-1.0680358 -0.963214,-2.0479629 -2.03125,-2.0312505 -0.06245,-0.00293 -0.125046,-0.00293 -0.1875,0 -0.982752,0.107995 -1.802514,1.0428108 -1.78125,2.0312505 l 0,4.0625004 c -0.9534,-1.127853 -2.06667,-2.152011 -3.28125,-3 l -0.09375,-0.0625 c -2.85203,-1.9610889 -6.0733,-2.9220479 -9.312501,-2.9687509 -5.46224,-0.07875 -10.90353,2.4568065 -14.2500005,7.2500009 -5.354351,7.669111 -3.450361,18.3019 4.2187505,23.65625 6.255407,4.367344 14.482569,3.905673 20.208772,-0.574695"
id="path4788-2"
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:0.23999999;color:#000000;fill:none;stroke:#ffffff;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans" />
<path
d="m 36.50052,13.562118 c -0.9534,-1.127853 -2.06667,-2.152011 -3.28125,-3 l -0.0937,-0.0625 c -2.85203,-1.9610889 -6.0733,-2.9220479 -9.312501,-2.9687509 -5.46224,-0.07875 -10.90354,2.4568065 -14.2500105,7.2500009 -5.354351,7.669111 -3.450361,18.3019 4.2187505,23.65625"
id="path4788-2-3"
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:0.3;color:#000000;fill:none;stroke:url(#linearGradient5480);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans" />
<path
d="M 32.53183,30.81212 C 29.03374,35.822473 22.198429,37.028952 17.18808,33.53087 12.177699,30.032787 10.971229,23.197473 14.469309,18.18712 17.96742,13.176767 24.802729,11.970287 29.81308,15.46837"
id="path4788-2-3-4"
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;opacity:0.3;color:#000000;fill:none;stroke:url(#linearGradient5497);stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans" />
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -0,0 +1,130 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.0"
width="48"
height="48"
id="svg3258">
<defs
id="defs3260">
<linearGradient
id="linearGradient8838">
<stop
id="stop8840"
style="stop-color:black;stop-opacity:1"
offset="0" />
<stop
id="stop8842"
style="stop-color:black;stop-opacity:0"
offset="1" />
</linearGradient>
<radialGradient
cx="62.625"
cy="4.625"
r="10.625"
fx="62.625"
fy="4.625"
id="radialGradient3254"
xlink:href="#linearGradient8838"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.1647059,0,0,0.7529402,-111.56471,36.517647)" />
<linearGradient
id="linearGradient2490">
<stop
id="stop2492"
style="stop-color:#791235;stop-opacity:1"
offset="0" />
<stop
id="stop2494"
style="stop-color:#dd3b27;stop-opacity:1"
offset="1" />
</linearGradient>
<linearGradient
x1="18.379412"
y1="44.980297"
x2="18.379412"
y2="3.0816143"
id="linearGradient3251"
xlink:href="#linearGradient2490"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.9584364,0,0,0.9584366,0.9975246,1.9975253)" />
<linearGradient
id="linearGradient3242">
<stop
id="stop3244"
style="stop-color:#f8b17e;stop-opacity:1"
offset="0" />
<stop
id="stop3246"
style="stop-color:#e35d4f;stop-opacity:1"
offset="0.26238" />
<stop
id="stop3248"
style="stop-color:#c6262e;stop-opacity:1"
offset="0.66093999" />
<stop
id="stop3250"
style="stop-color:#690b54;stop-opacity:1"
offset="1" />
</linearGradient>
<radialGradient
cx="23.895569"
cy="3.9900031"
r="20.397499"
fx="23.895569"
fy="3.9900031"
id="radialGradient3249"
xlink:href="#linearGradient3242"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0,2.2874593,-3.0194057,0,36.047437,-50.630156)" />
<linearGradient
id="linearGradient4873">
<stop
id="stop4875"
style="stop-color:white;stop-opacity:1"
offset="0" />
<stop
id="stop4877"
style="stop-color:white;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
x1="63.397362"
y1="-12.489107"
x2="63.397362"
y2="5.4675598"
id="linearGradient3246"
xlink:href="#linearGradient4873"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2.1153735,0,0,2.1153253,-107.57709,32.426559)" />
</defs>
<g
id="layer1">
<path
d="m 46.999997,40 c 0,4.418278 -10.297452,8 -23,8 -12.702548,0 -23.0000002,-3.581722 -23.0000002,-8 0,-4.418278 10.2974522,-8 23.0000002,-8 12.702548,0 23,3.581722 23,8 l 0,0 z"
id="path8836"
style="opacity:0.3;fill:url(#radialGradient3254);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999988;marker:none;visibility:visible;display:inline;overflow:visible" />
<path
d="M 24.000002,5.5018088 C 13.241573,5.5018088 4.5018088,14.24157 4.5018088,25 c 0,10.75843 8.7397642,19.498195 19.4981932,19.498192 10.758425,0 19.498199,-8.739762 19.498189,-19.498192 0,-10.75843 -8.739764,-19.4981912 -19.498189,-19.4981912 z"
id="path2555"
style="fill:url(#radialGradient3249);fill-opacity:1;stroke:url(#linearGradient3251);stroke-width:1.003654;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
<path
d="M 42.500002,24.999344 C 42.500002,35.216942 34.21666,43.5 24.000235,43.5 13.782875,43.5 5.5000003,35.216848 5.5000003,24.999344 c 0,-10.217125 8.2828747,-18.4993439 18.5002347,-18.4993439 10.216425,0 18.499767,8.2822189 18.499767,18.4993439 l 0,0 z"
id="path8655"
style="opacity:0.4;fill:none;stroke:url(#linearGradient3246);stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<path
d="m -33.28125,16.3125 -2.96875,2.96875 6.125,6.09375 c 0.188168,0.19054 0.188168,0.49696 0,0.6875 l -6.125,6.09375 2.96875,2.96875 6.09375,-6.09375 c 0.19054,-0.188168 0.49696,-0.188168 0.6875,0 l 6.09375,6.09375 2.96875,-2.96875 -6.09375,-6.09375 c -0.188168,-0.19054 -0.188168,-0.49696 0,-0.6875 L -17.4375,19.28125 -20.40625,16.3125 -26.5,22.40625 c -0.19054,0.188168 -0.49696,0.188168 -0.6875,0 l -6.09375,-6.09375 z"
transform="translate(50.84375,-2.1249996)"
id="path3243"
style="opacity:0.2;fill:black;fill-opacity:1;fill-rule:evenodd;stroke:none" />
<path
d="m -33.28125,16.3125 -2.96875,2.96875 6.125,6.09375 c 0.188168,0.19054 0.188168,0.49696 0,0.6875 l -6.125,6.09375 2.96875,2.96875 6.09375,-6.09375 c 0.19054,-0.188168 0.49696,-0.188168 0.6875,0 l 6.09375,6.09375 2.96875,-2.96875 -6.09375,-6.09375 c -0.188168,-0.19054 -0.188168,-0.49696 0,-0.6875 L -17.4375,19.28125 -20.40625,16.3125 -26.5,22.40625 c -0.19054,0.188168 -0.49696,0.188168 -0.6875,0 l -6.09375,-6.09375 z"
transform="translate(50.84375,-1.1249996)"
id="path3256"
style="fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

@ -399,6 +399,16 @@ size: $(OUTDIR)/$(TARGET).elf_size
docs: docs:
doxygen $(DOXYGENDIR)/doxygen.cfg doxygen $(DOXYGENDIR)/doxygen.cfg
# Install: install binary file with prefix/suffix into install directory
install: $(OUTDIR)/$(TARGET).bin
ifneq ($(INSTALL_DIR),)
@echo $(MSG_INSTALLING) $(call toprel, $<)
$(V1) mkdir -p $(INSTALL_DIR)
$(V1) $(INSTALL) $< $(INSTALL_DIR)/$(INSTALL_PFX)$(TARGET)$(INSTALL_SFX).bin
else
$(error INSTALL_DIR must be specified for $@)
endif
# Target: clean project. # Target: clean project.
clean: clean_list clean: clean_list
@ -434,6 +444,5 @@ else
-include $(shell mkdir $(OUTDIR) 2>/dev/null) $(shell mkdir $(OUTDIR)/dep 2>/dev/null) $(wildcard $(OUTDIR)/dep/*) -include $(shell mkdir $(OUTDIR) 2>/dev/null) $(shell mkdir $(OUTDIR)/dep 2>/dev/null) $(wildcard $(OUTDIR)/dep/*)
endif endif
# Listing of phony targets. # Listing of phony targets.
.PHONY : all build clean clean_list program .PHONY : all build clean clean_list program install

View File

@ -389,6 +389,16 @@ size: $(OUTDIR)/$(TARGET).elf_size
docs: docs:
doxygen $(DOXYGENDIR)/doxygen.cfg doxygen $(DOXYGENDIR)/doxygen.cfg
# Install: install binary file with prefix/suffix into install directory
install: $(OUTDIR)/$(TARGET).bin
ifneq ($(INSTALL_DIR),)
@echo $(MSG_INSTALLING) $(call toprel, $<)
$(V1) mkdir -p $(INSTALL_DIR)
$(V1) $(INSTALL) $< $(INSTALL_DIR)/$(INSTALL_PFX)$(TARGET)$(INSTALL_SFX).bin
else
$(error INSTALL_DIR must be specified for $@)
endif
# Target: clean project. # Target: clean project.
clean: clean_list clean: clean_list
@ -426,4 +436,4 @@ else
endif endif
# Listing of phony targets. # Listing of phony targets.
.PHONY : all build clean clean_list program .PHONY : all build clean clean_list program install

View File

@ -410,6 +410,16 @@ size: $(OUTDIR)/$(TARGET).elf_size
docs: docs:
doxygen $(DOXYGENDIR)/doxygen.cfg doxygen $(DOXYGENDIR)/doxygen.cfg
# Install: install binary file with prefix/suffix into install directory
install: $(OUTDIR)/$(TARGET).bin
ifneq ($(INSTALL_DIR),)
@echo $(MSG_INSTALLING) $(call toprel, $<)
$(V1) mkdir -p $(INSTALL_DIR)
$(V1) $(INSTALL) $< $(INSTALL_DIR)/$(INSTALL_PFX)$(TARGET)$(INSTALL_SFX).bin
else
$(error INSTALL_DIR must be specified for $@)
endif
# Target: clean project. # Target: clean project.
clean: begin clean_list finished end clean: begin clean_list finished end
@ -430,7 +440,6 @@ clean_list :
$(V1) $(REMOVE) $(CPPSRC:.cpp=.s) $(V1) $(REMOVE) $(CPPSRC:.cpp=.s)
$(V1) $(REMOVE) $(CPPSRCARM:.cpp=.s) $(V1) $(REMOVE) $(CPPSRCARM:.cpp=.s)
# Create output files directory # Create output files directory
# all known MS Windows OS define the ComSpec environment variable # all known MS Windows OS define the ComSpec environment variable
ifdef ComSpec ifdef ComSpec
@ -447,4 +456,4 @@ else
endif endif
# Listing of phony targets. # Listing of phony targets.
.PHONY : all build clean clean_list program .PHONY : all build clean clean_list program install

View File

@ -39,9 +39,9 @@ void error(int);
* data. This is non-intuitive for _binary_size where you * data. This is non-intuitive for _binary_size where you
* might expect its value to hold the size but you'd be wrong. * might expect its value to hold the size but you'd be wrong.
*/ */
extern void _binary_start; extern uint32_t _binary_start;
extern void _binary_end; extern uint32_t _binary_end;
extern void _binary_size; extern uint32_t _binary_size;
const uint32_t * embedded_image_start = (uint32_t *) &(_binary_start); const uint32_t * embedded_image_start = (uint32_t *) &(_binary_start);
const uint32_t * embedded_image_end = (uint32_t *) &(_binary_end); const uint32_t * embedded_image_end = (uint32_t *) &(_binary_end);
const uint32_t embedded_image_size = (uint32_t) &(_binary_size); const uint32_t embedded_image_size = (uint32_t) &(_binary_size);

View File

@ -428,10 +428,6 @@ $(eval $(call PARTIAL_COMPILE_TEMPLATE, SRC))
# Compile: create assembler files from C source files. ARM only # Compile: create assembler files from C source files. ARM only
$(eval $(call PARTIAL_COMPILE_ARM_TEMPLATE, SRCARM)) $(eval $(call PARTIAL_COMPILE_ARM_TEMPLATE, SRCARM))
# Generate Doxygen documents
docs:
doxygen $(DOXYGENDIR)/doxygen.cfg
$(OUTDIR)/$(TARGET).bin.o: $(OUTDIR)/$(TARGET).bin $(OUTDIR)/$(TARGET).bin.o: $(OUTDIR)/$(TARGET).bin
.PHONY: elf lss sym hex bin bino .PHONY: elf lss sym hex bin bino
@ -447,6 +443,20 @@ $(eval $(call SIZE_TEMPLATE, $(OUTDIR)/$(TARGET).elf))
.PHONY: size .PHONY: size
size: $(OUTDIR)/$(TARGET).elf_size size: $(OUTDIR)/$(TARGET).elf_size
# Generate Doxygen documents
docs:
doxygen $(DOXYGENDIR)/doxygen.cfg
# Install: install binary file with prefix/suffix into install directory
install: $(OUTDIR)/$(TARGET).bin
ifneq ($(INSTALL_DIR),)
@echo $(MSG_INSTALLING) $(call toprel, $<)
$(V1) mkdir -p $(INSTALL_DIR)
$(V1) $(INSTALL) $< $(INSTALL_DIR)/$(INSTALL_PFX)$(TARGET)$(INSTALL_SFX).bin
else
$(error INSTALL_DIR must be specified for $@)
endif
# Target: clean project. # Target: clean project.
clean: clean_list clean: clean_list
@ -484,4 +494,4 @@ else
endif endif
# Listing of phony targets. # Listing of phony targets.
.PHONY : all build clean clean_list program .PHONY : all build clean clean_list program install

View File

@ -450,6 +450,16 @@ size: $(OUTDIR)/$(TARGET).elf_size
docs: docs:
doxygen $(DOXYGENDIR)/doxygen.cfg doxygen $(DOXYGENDIR)/doxygen.cfg
# Install: install binary file with prefix/suffix into install directory
install: $(OUTDIR)/$(TARGET).bin
ifneq ($(INSTALL_DIR),)
@echo $(MSG_INSTALLING) $(call toprel, $<)
$(V1) mkdir -p $(INSTALL_DIR)
$(V1) $(INSTALL) $< $(INSTALL_DIR)/$(INSTALL_PFX)$(TARGET)$(INSTALL_SFX).bin
else
$(error INSTALL_DIR must be specified for $@)
endif
# Target: clean project. # Target: clean project.
clean: clean_list clean: clean_list
@ -487,4 +497,4 @@ else
endif endif
# Listing of phony targets. # Listing of phony targets.
.PHONY : all build clean clean_list program .PHONY : all build clean clean_list program install

View File

@ -446,6 +446,16 @@ size: $(OUTDIR)/$(TARGET).elf_size
docs: docs:
doxygen $(DOXYGENDIR)/doxygen.cfg doxygen $(DOXYGENDIR)/doxygen.cfg
# Install: install binary file with prefix/suffix into install directory
install: $(OUTDIR)/$(TARGET).bin
ifneq ($(INSTALL_DIR),)
@echo $(MSG_INSTALLING) $(call toprel, $<)
$(V1) mkdir -p $(INSTALL_DIR)
$(V1) $(INSTALL) $< $(INSTALL_DIR)/$(INSTALL_PFX)$(TARGET)$(INSTALL_SFX).bin
else
$(error INSTALL_DIR must be specified for $@)
endif
# Target: clean project. # Target: clean project.
clean: clean_list clean: clean_list
@ -483,5 +493,4 @@ else
endif endif
# Listing of phony targets. # Listing of phony targets.
.PHONY : all build clean clean_list program .PHONY : all build clean clean_list program install

View File

@ -205,6 +205,7 @@ SRC += $(PIOSSTM32F10X)/pios_usb_hid_prop.c
SRC += $(PIOSSTM32F10X)/pios_usb_hid_pwr.c SRC += $(PIOSSTM32F10X)/pios_usb_hid_pwr.c
## PIOS Hardware (Common) ## PIOS Hardware (Common)
SRC += $(PIOSCOMMON)/pios_flashfs_objlist.c
SRC += $(PIOSCOMMON)/pios_flash_w25x.c SRC += $(PIOSCOMMON)/pios_flash_w25x.c
SRC += $(PIOSCOMMON)/pios_adxl345.c SRC += $(PIOSCOMMON)/pios_adxl345.c
SRC += $(PIOSCOMMON)/pios_com.c SRC += $(PIOSCOMMON)/pios_com.c
@ -591,6 +592,16 @@ size: $(OUTDIR)/$(TARGET).elf_size
docs: docs:
doxygen $(DOXYGENDIR)/doxygen.cfg doxygen $(DOXYGENDIR)/doxygen.cfg
# Install: install binary file with prefix/suffix into install directory
install: $(OUTDIR)/$(TARGET).bin
ifneq ($(INSTALL_DIR),)
@echo $(MSG_INSTALLING) $(call toprel, $<)
$(V1) mkdir -p $(INSTALL_DIR)
$(V1) $(INSTALL) $< $(INSTALL_DIR)/$(INSTALL_PFX)$(TARGET)$(INSTALL_SFX).bin
else
$(error INSTALL_DIR must be specified for $@)
endif
# Target: clean project. # Target: clean project.
clean: clean_list clean: clean_list
@ -630,5 +641,4 @@ else
endif endif
# Listing of phony targets. # Listing of phony targets.
.PHONY : all build clean clean_list program gencode .PHONY : all build clean clean_list program gencode install

View File

@ -92,6 +92,7 @@ void OpenPilotInit()
#ifdef ERASE_FLASH #ifdef ERASE_FLASH
PIOS_Flash_W25X_EraseChip(); PIOS_Flash_W25X_EraseChip();
while(TRUE){};
#endif #endif
/* Initialize modules */ /* Initialize modules */

View File

@ -84,16 +84,16 @@
#define AUXUART_BAUDRATE 19200 #define AUXUART_BAUDRATE 19200
/* Alarm Thresholds */ /* Alarm Thresholds */
#define HEAP_LIMIT_WARNING 450 #define HEAP_LIMIT_WARNING 350
#define HEAP_LIMIT_CRITICAL 350 #define HEAP_LIMIT_CRITICAL 250
#define CPULOAD_LIMIT_WARNING 80 #define CPULOAD_LIMIT_WARNING 80
#define CPULOAD_LIMIT_CRITICAL 95 #define CPULOAD_LIMIT_CRITICAL 95
/* Task stack sizes */ /* Task stack sizes */
#define PIOS_ACTUATOR_STACK_SIZE 1020 #define PIOS_ACTUATOR_STACK_SIZE 1020
#define PIOS_MANUAL_STACK_SIZE 644 #define PIOS_MANUAL_STACK_SIZE 724
#define PIOS_SYSTEM_STACK_SIZE 644 #define PIOS_SYSTEM_STACK_SIZE 504
#define PIOS_STABILIZATION_STACK_SIZE 624 #define PIOS_STABILIZATION_STACK_SIZE 524
#define PIOS_TELEM_STACK_SIZE 500 #define PIOS_TELEM_STACK_SIZE 500
#define IDLE_COUNTS_PER_SEC_AT_NO_LOAD 1995998 #define IDLE_COUNTS_PER_SEC_AT_NO_LOAD 1995998

View File

@ -681,6 +681,8 @@ void PIOS_Board_Init(void) {
PIOS_Flash_W25X_Init(pios_spi_flash_accel_id); PIOS_Flash_W25X_Init(pios_spi_flash_accel_id);
PIOS_ADXL345_Attach(pios_spi_flash_accel_id); PIOS_ADXL345_Attach(pios_spi_flash_accel_id);
PIOS_FLASHFS_Init();
#if defined(PIOS_INCLUDE_SPEKTRUM) #if defined(PIOS_INCLUDE_SPEKTRUM)
/* SPEKTRUM init must come before comms */ /* SPEKTRUM init must come before comms */
PIOS_SPEKTRUM_Init(); PIOS_SPEKTRUM_Init();

View File

@ -416,6 +416,16 @@ size: $(OUTDIR)/$(TARGET).elf_size
docs: docs:
doxygen $(DOXYGENDIR)/doxygen.cfg doxygen $(DOXYGENDIR)/doxygen.cfg
# Install: install binary file with prefix/suffix into install directory
install: $(OUTDIR)/$(TARGET).bin
ifneq ($(INSTALL_DIR),)
@echo $(MSG_INSTALLING) $(call toprel, $<)
$(V1) mkdir -p $(INSTALL_DIR)
$(V1) $(INSTALL) $< $(INSTALL_DIR)/$(INSTALL_PFX)$(TARGET)$(INSTALL_SFX).bin
else
$(error INSTALL_DIR must be specified for $@)
endif
# Target: clean project. # Target: clean project.
clean: clean_list clean: clean_list
@ -450,6 +460,5 @@ else
-include $(shell mkdir $(OUTDIR) 2>/dev/null) $(shell mkdir $(OUTDIR)/dep 2>/dev/null) $(wildcard $(OUTDIR)/dep/*) -include $(shell mkdir $(OUTDIR) 2>/dev/null) $(shell mkdir $(OUTDIR)/dep 2>/dev/null) $(wildcard $(OUTDIR)/dep/*)
endif endif
# Listing of phony targets. # Listing of phony targets.
.PHONY : all build clean clean_list program .PHONY : all build clean clean_list program install

View File

@ -182,7 +182,7 @@ static void actuatorTask(void* parameters)
nMixers ++; nMixers ++;
} }
} }
if(nMixers < 2) //Nothing can fly with less than two mixers. if((nMixers < 2) && !ActuatorCommandReadOnly(dummy)) //Nothing can fly with less than two mixers.
{ {
setFailsafe(); // So that channels like PWM buzzer keep working setFailsafe(); // So that channels like PWM buzzer keep working
continue; continue;
@ -198,8 +198,12 @@ static void actuatorTask(void* parameters)
float curve2 = MixerCurve(desired.Throttle,mixerSettings.ThrottleCurve2); float curve2 = MixerCurve(desired.Throttle,mixerSettings.ThrottleCurve2);
for(int ct=0; ct < MAX_MIX_ACTUATORS; ct++) for(int ct=0; ct < MAX_MIX_ACTUATORS; ct++)
{ {
if(mixers[ct].type == MIXERSETTINGS_MIXER1TYPE_DISABLED) if(mixers[ct].type == MIXERSETTINGS_MIXER1TYPE_DISABLED) {
// Set to minimum if disabled. This is not the same as saying PWM pulse = 0 us
status[ct] = -1;
command.Channel[ct] = 0;
continue; continue;
}
status[ct] = ProcessMixer(ct, curve1, curve2, &mixerSettings, &desired, dT); status[ct] = ProcessMixer(ct, curve1, curve2, &mixerSettings, &desired, dT);
@ -400,14 +404,19 @@ static void setFailsafe()
// Reset ActuatorCommand to safe values // Reset ActuatorCommand to safe values
for (int n = 0; n < ACTUATORCOMMAND_CHANNEL_NUMELEM; ++n) for (int n = 0; n < ACTUATORCOMMAND_CHANNEL_NUMELEM; ++n)
{ {
if(mixers[n].type == MIXERSETTINGS_MIXER1TYPE_MOTOR) if(mixers[n].type == MIXERSETTINGS_MIXER1TYPE_MOTOR)
{ {
command.Channel[n] = settings.ChannelMin[n]; command.Channel[n] = settings.ChannelMin[n];
} }
else else if(mixers[n].type == MIXERSETTINGS_MIXER1TYPE_SERVO)
{ {
command.Channel[n] = settings.ChannelNeutral[n]; command.Channel[n] = settings.ChannelNeutral[n];
} }
else
{
command.Channel[n] = 0;
}
} }
// Set alarm // Set alarm

View File

@ -142,17 +142,18 @@ static void AttitudeTask(void *parameters)
FlightStatusData flightStatus; FlightStatusData flightStatus;
FlightStatusGet(&flightStatus); FlightStatusGet(&flightStatus);
if(xTaskGetTickCount() < 10000) { if(xTaskGetTickCount() < 7000) {
// For first 5 seconds use accels to get gyro bias // Force settings update to make sure rotation loaded
settingsUpdatedCb(AttitudeSettingsHandle());
// For first 7 seconds use accels to get gyro bias
accelKp = 1; accelKp = 1;
// Decrease the rate of gyro learning during init accelKi = 0.9;
accelKi = .5 / (1 + xTaskGetTickCount() / 5000); yawBiasRate = 0.23;
yawBiasRate = 0.01 / (1 + xTaskGetTickCount() / 5000);
init = 0; init = 0;
} }
else if (zero_during_arming && (flightStatus.Armed == FLIGHTSTATUS_ARMED_ARMING)) { else if (zero_during_arming && (flightStatus.Armed == FLIGHTSTATUS_ARMED_ARMING)) {
accelKi = .01; accelKi = 0.9;
yawBiasRate = 0.1; yawBiasRate = 0.23;
init = 0; init = 0;
} else if (init == 0) { } else if (init == 0) {
settingsUpdatedCb(AttitudeSettingsHandle()); settingsUpdatedCb(AttitudeSettingsHandle());

View File

@ -30,6 +30,7 @@
#include "openpilot.h" #include "openpilot.h"
#include "firmwareiap.h" #include "firmwareiap.h"
#include "firmwareiapobj.h" #include "firmwareiapobj.h"
#include "flightstatus.h"
// Private constants // Private constants
#define IAP_CMD_STEP_1 1122 #define IAP_CMD_STEP_1 1122
@ -156,6 +157,16 @@ static void FirmwareIAPCallback(UAVObjEvent* ev)
case IAP_STATE_STEP_2: case IAP_STATE_STEP_2:
if( data.Command == IAP_CMD_STEP_3 ) { if( data.Command == IAP_CMD_STEP_3 ) {
if( delta > iap_time_3_low_end && delta < iap_time_3_high_end ) { if( delta > iap_time_3_low_end && delta < iap_time_3_high_end ) {
FlightStatusData flightStatus;
FlightStatusGet(&flightStatus);
if(flightStatus.Armed != FLIGHTSTATUS_ARMED_DISARMED) {
// Abort any attempts if not disarmed
iap_state = IAP_STATE_READY;
break;
}
// we've met the three sequence of command numbers // we've met the three sequence of command numbers
// we've met the time requirements. // we've met the time requirements.
PIOS_IAP_SetRequest1(); PIOS_IAP_SetRequest1();

View File

@ -63,7 +63,7 @@ static float GravityAccel(float latitude, float longitude, float altitude);
// Private constants // Private constants
//#define FULL_COLD_RESTART // uncomment this to tell the GPS to do a FULL COLD restart //#define FULL_COLD_RESTART // uncomment this to tell the GPS to do a FULL COLD restart
//#define DISABLE_GPS_TRESHOLD // //#define DISABLE_GPS_THRESHOLD //
#define GPS_TIMEOUT_MS 500 #define GPS_TIMEOUT_MS 500
#define GPS_COMMAND_RESEND_TIMEOUT_MS 2000 #define GPS_COMMAND_RESEND_TIMEOUT_MS 2000
@ -154,7 +154,7 @@ static void gpsTask(void *parameters)
} }
#endif #endif
#ifdef DISABLE_GPS_TRESHOLD #ifdef DISABLE_GPS_THRESHOLD
PIOS_COM_SendStringNonBlocking(gpsPort, "$PMTK397,0*23\r\n"); PIOS_COM_SendStringNonBlocking(gpsPort, "$PMTK397,0*23\r\n");
#endif #endif

View File

@ -59,8 +59,8 @@
// optimisation options are changed. // optimisation options are changed.
#endif #endif
#if defined(PIOS_MANUAL_STACK_SIZE) #if defined(PIOS_SYSTEM_STACK_SIZE)
#define STACK_SIZE_BYTES PIOS_MANUAL_STACK_SIZE #define STACK_SIZE_BYTES PIOS_SYSTEM_STACK_SIZE
#else #else
#define STACK_SIZE_BYTES 924 #define STACK_SIZE_BYTES 924
#endif #endif

View File

@ -52,14 +52,13 @@ endif
FLASH_TOOL = OPENOCD FLASH_TOOL = OPENOCD
# List of modules to include # List of modules to include
MODULES = Actuator Telemetry GPS ManualControl Altitude AHRSComms Stabilization Guidance FirmwareIAP FlightPlan MODULES = Actuator Telemetry GPS ManualControl Altitude AHRSComms Stabilization Guidance FirmwareIAP
PYMODULES = FlightPlan
#MODULES = Telemetry Example #MODULES = Telemetry Example
#MODULES = Telemetry MK/MKSerial #MODULES = Telemetry MK/MKSerial
#MODULES = Telemetry #MODULES = Telemetry
#MODULES += Osd/OsdEtStd #MODULES += Osd/OsdEtStd
# MCU name, submodel and board # MCU name, submodel and board
# - MCU used for compiler-option (-mcpu) # - MCU used for compiler-option (-mcpu)
# - MODEL used for linker-script name (-T) and passed as define # - MODEL used for linker-script name (-T) and passed as define
@ -124,17 +123,19 @@ UAVOBJSYNTHDIR = $(OUTDIR)/../uavobject-synthetics/flight
# List C source files here. (C dependencies are automatically generated.) # List C source files here. (C dependencies are automatically generated.)
# use file-extension c for "c-only"-files # use file-extension c for "c-only"-files
MODNAMES = $(notdir ${MODULES}) MODNAMES = $(notdir ${MODULES} ${PYMODULES})
ifndef TESTAPP ifndef TESTAPP
## PyMite files ## PyMite files and modules
SRC += $(OUTDIR)/pmlib_img.c SRC += $(OUTDIR)/pmlib_img.c
SRC += $(OUTDIR)/pmlib_nat.c SRC += $(OUTDIR)/pmlib_nat.c
SRC += $(OUTDIR)/pmlibusr_img.c SRC += $(OUTDIR)/pmlibusr_img.c
SRC += $(OUTDIR)/pmlibusr_nat.c SRC += $(OUTDIR)/pmlibusr_nat.c
SRC += $(wildcard ${PYMITEVM}/*.c) PYSRC += $(wildcard ${PYMITEVM}/*.c)
SRC += $(wildcard ${PYMITEPLAT}/*.c) PYSRC += $(wildcard ${PYMITEPLAT}/*.c)
PYSRC += ${foreach MOD, ${PYMODULES}, ${wildcard ${OPMODULEDIR}/${MOD}/*.c}}
SRC += $(PYSRC)
## MODULES ## MODULES
SRC += ${foreach MOD, ${MODULES}, ${wildcard ${OPMODULEDIR}/${MOD}/*.c}} SRC += ${foreach MOD, ${MODULES}, ${wildcard ${OPMODULEDIR}/${MOD}/*.c}}
@ -317,7 +318,7 @@ EXTRAINCDIRS += $(RTOSSRCDIR)/portable/GCC/ARM_CM3
EXTRAINCDIRS += $(AHRSBOOTLOADERINC) EXTRAINCDIRS += $(AHRSBOOTLOADERINC)
EXTRAINCDIRS += $(PYMITEINC) EXTRAINCDIRS += $(PYMITEINC)
EXTRAINCDIRS += ${foreach MOD, ${MODULES}, $(OPMODULEDIR)/${MOD}/inc} ${OPMODULEDIR}/System/inc EXTRAINCDIRS += ${foreach MOD, ${MODULES} ${PYMODULES}, $(OPMODULEDIR)/${MOD}/inc} ${OPMODULEDIR}/System/inc
# List any extra directories to look for library files here. # List any extra directories to look for library files here.
@ -481,7 +482,7 @@ LSTFILES = $(addprefix $(OUTDIR)/, $(addsuffix .lst, $(ALLSRCBASE)))
DEPFILES = $(addprefix $(OUTDIR)/dep/, $(addsuffix .o.d, $(ALLSRCBASE))) DEPFILES = $(addprefix $(OUTDIR)/dep/, $(addsuffix .o.d, $(ALLSRCBASE)))
# Default target. # Default target.
all: gencode gccversion build all: gccversion build
ifeq ($(LOADFORMAT),ihex) ifeq ($(LOADFORMAT),ihex)
build: elf hex lss sym build: elf hex lss sym
@ -500,6 +501,8 @@ endif
# Generate intermediate code # Generate intermediate code
gencode: ${OUTDIR}/InitMods.c ${OUTDIR}/pmlib_img.c ${OUTDIR}/pmlib_nat.c ${OUTDIR}/pmlibusr_img.c ${OUTDIR}/pmlibusr_nat.c ${OUTDIR}/pmfeatures.h gencode: ${OUTDIR}/InitMods.c ${OUTDIR}/pmlib_img.c ${OUTDIR}/pmlib_nat.c ${OUTDIR}/pmlibusr_img.c ${OUTDIR}/pmlibusr_nat.c ${OUTDIR}/pmfeatures.h
$(PYSRC): gencode
# Generate code for module initialization # Generate code for module initialization
${OUTDIR}/InitMods.c: Makefile ${OUTDIR}/InitMods.c: Makefile
@echo $(MSG_MODINIT) $(call toprel, $@) @echo $(MSG_MODINIT) $(call toprel, $@)
@ -570,6 +573,16 @@ size: $(OUTDIR)/$(TARGET).elf_size
docs: docs:
doxygen $(DOXYGENDIR)/doxygen.cfg doxygen $(DOXYGENDIR)/doxygen.cfg
# Install: install binary file with prefix/suffix into install directory
install: $(OUTDIR)/$(TARGET).bin
ifneq ($(INSTALL_DIR),)
@echo $(MSG_INSTALLING) $(call toprel, $<)
$(V1) mkdir -p $(INSTALL_DIR)
$(V1) $(INSTALL) $< $(INSTALL_DIR)/$(INSTALL_PFX)$(TARGET)$(INSTALL_SFX).bin
else
$(error INSTALL_DIR must be specified for $@)
endif
# Target: clean project. # Target: clean project.
clean: clean_list clean: clean_list
@ -609,5 +622,4 @@ else
endif endif
# Listing of phony targets. # Listing of phony targets.
.PHONY : all build clean clean_list program gencode .PHONY : all build clean clean_list program gencode install

View File

@ -222,6 +222,14 @@ int8_t PIOS_Flash_W25X_WriteData(uint32_t addr, uint8_t * data, uint16_t len)
return 0; return 0;
} }
/**
* @brief Read data from a location in flash memory
* @param[in] addr Address in flash to write to
* @param[in] data Pointer to data to write from flash
* @param[in] len Length of data to write (max 256 bytes)
* @return Zero if success or error code
* @retval -1 Unable to claim SPI bus
*/
int8_t PIOS_Flash_W25X_ReadData(uint32_t addr, uint8_t * data, uint16_t len) int8_t PIOS_Flash_W25X_ReadData(uint32_t addr, uint8_t * data, uint16_t len)
{ {
if(PIOS_Flash_W25X_ClaimBus() == -1) if(PIOS_Flash_W25X_ClaimBus() == -1)

View File

@ -0,0 +1,294 @@
/**
******************************************************************************
*
* @addtogroup PIOS PIOS Core hardware abstraction layer
* @{
* @addtogroup PIOS_FLASHFS_OBJLIST Object list based flash filesystem (low ram)
* @{
*
* @file pios_flashfs_objlist.c
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
* @brief A file system for storing UAVObject in flash chip
* @see The GNU Public License (GPL) Version 3
*
*****************************************************************************/
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "openpilot.h"
#include "uavobjectmanager.h"
// Private functions
static int32_t PIOS_FLASHFS_CleabObjectTableHeader();
static int32_t PIOS_FLASHFS_GetObjAddress(uint32_t objId, uint16_t instId);
static int32_t PIOS_FLASHFS_GetNewAddress(uint32_t objId, uint16_t instId);
// Private variables
static int32_t numObjects = -1;
// Private structures
// Header for objects in the file system table
struct objectHeader {
uint32_t objMagic;
uint32_t objId;
uint32_t instId;
uint32_t address;
} __attribute__((packed));;
struct fileHeader {
uint32_t id;
uint16_t instId;
uint16_t size;
} __attribute__((packed));
#define OBJECT_TABLE_MAGIC 0x85FB3C33
#define OBJ_MAGIC 0x3015AE71
#define OBJECT_TABLE_START 0x00000010
#define OBJECT_TABLE_END 0x00001000
#define SECTOR_SIZE 0x00001000
/**
* @brief Initialize the flash object setting FS
* @return 0 if success, -1 if failure
*/
int32_t PIOS_FLASHFS_Init()
{
// Check for valid object table or create one
uint32_t object_table_magic;
if (PIOS_Flash_W25X_ReadData(0, (uint8_t *)&object_table_magic, sizeof(object_table_magic)) != 0)
return -1;
if(object_table_magic != OBJECT_TABLE_MAGIC) {
if(PIOS_FLASHFS_CleabObjectTableHeader() < 0)
return -1;
}
int32_t addr = OBJECT_TABLE_START;
struct objectHeader header;
numObjects = 0;
// Loop through header area while objects detect to count how many saved
while(addr < OBJECT_TABLE_END) {
// Read the instance data
if (PIOS_Flash_W25X_ReadData(addr, (uint8_t *)&header, sizeof(header)) != 0)
return -1;
// Counting number of valid headers
if(header.objMagic != OBJ_MAGIC)
break;
numObjects++;
addr += sizeof(header);
}
return 0;
}
/**
* @brief Erase the headers for all objects in the flash chip
* @return 0 if successful, -1 if not
*/
static int32_t PIOS_FLASHFS_CleabObjectTableHeader()
{
if(PIOS_Flash_W25X_EraseSector(OBJECT_TABLE_START) != 0)
return -1;
uint32_t object_table_magic = OBJECT_TABLE_MAGIC;
if (PIOS_Flash_W25X_WriteData(0, (uint8_t *)&object_table_magic, sizeof(object_table_magic)) != 0)
return -1;
return 0;
}
/**
* @brief Get the address of an object
* @param obj UAVObjHandle for that object
* @parma instId Instance id for that object
* @return address if successful, -1 if not found
*/
static int32_t PIOS_FLASHFS_GetObjAddress(uint32_t objId, uint16_t instId)
{
int32_t addr = OBJECT_TABLE_START;
struct objectHeader header;
// Loop through header area while objects detect to count how many saved
while(addr < OBJECT_TABLE_END) {
// Read the instance data
if (PIOS_Flash_W25X_ReadData(addr, (uint8_t *) &header, sizeof(header)) != 0)
return -1;
if(header.objMagic != OBJ_MAGIC)
break; // stop searching once hit first non-object header
else if (header.objId == objId && header.instId == instId)
break;
addr += sizeof(header);
}
if (header.objId == objId && header.instId == instId)
return header.address;
return -1;
}
/**
* @brief Returns an address for a new object and creates entry into object table
* @param[in] obj Object handle for object to be saved
* @param[in] instId The instance id of object to be saved
* @return 0 if success or error code
* @retval -1 Object not found
* @retval -2 No room in object table
* @retval -3 Unable to write entry into object table
* @retval -4 FS not initialized
*/
int32_t PIOS_FLASHFS_GetNewAddress(uint32_t objId, uint16_t instId)
{
struct objectHeader header;
if(numObjects < 0)
return -4;
// Don't worry about max size of flash chip here, other code will catch that
header.objMagic = OBJ_MAGIC;
header.objId = objId;
header.instId = instId;
header.address = OBJECT_TABLE_END + SECTOR_SIZE * numObjects;
int32_t addr = OBJECT_TABLE_START + sizeof(header) * numObjects;
// No room for this header in object table
if((addr + sizeof(header)) > OBJECT_TABLE_END)
return -2;
if(PIOS_Flash_W25X_WriteData(addr, (uint8_t *) &header, sizeof(header)) != 0)
return -3;
// This numObejcts value must stay consistent or there will be a break in the table
// and later the table will have bad values in it
numObjects++;
return header.address;
}
/**
* @brief Saves one object instance per sector
* @param[in] obj UAVObjHandle the object to save
* @param[in] instId The instance of the object to save
* @return 0 if success or -1 if failure
* @note This uses one sector on the flash chip per object so that no buffering in ram
* must be done when erasing the sector before a save
*/
int32_t PIOS_FLASHFS_ObjSave(UAVObjHandle obj, uint16_t instId, uint8_t * data)
{
uint32_t objId = UAVObjGetID(obj);
int32_t addr = PIOS_FLASHFS_GetObjAddress(objId, instId);
// Object currently not saved
if(addr < 0)
addr = PIOS_FLASHFS_GetNewAddress(objId, instId);
// Could not allocate a sector
if(addr < 0)
return -1;
struct fileHeader header = {
.id = objId,
.instId = instId,
.size = UAVObjGetNumBytes(obj)
};
if(PIOS_Flash_W25X_EraseSector(addr) != 0)
return -2;
// Save header
// This information IS redundant with the object table id. Oh well. Better safe than sorry.
if(PIOS_Flash_W25X_WriteData(addr, (uint8_t *) &header, sizeof(header)) != 0)
return -3;
// Save data
if(PIOS_Flash_W25X_WriteData(addr + sizeof(header), data, UAVObjGetNumBytes(obj)) != 0)
return -4;
return 0;
}
/**
* @brief Load one object instance per sector
* @param[in] obj UAVObjHandle the object to save
* @param[in] instId The instance of the object to save
* @return 0 if success or error code
* @retval -1 if object not in file table
* @retval -2 if unable to retrieve object header
* @retval -3 if loaded data instId or objId don't match
* @retval -4 if unable to retrieve instance data
* @note This uses one sector on the flash chip per object so that no buffering in ram
* must be done when erasing the sector before a save
*/
int32_t PIOS_FLASHFS_ObjLoad(UAVObjHandle obj, uint16_t instId, uint8_t * data)
{
uint32_t objId = UAVObjGetID(obj);
int32_t addr = PIOS_FLASHFS_GetObjAddress(objId, instId);
// Object currently not saved
if(addr < 0)
return -1;
struct fileHeader header;
// Load header
// This information IS redundant with the object table id. Oh well. Better safe than sorry.
if(PIOS_Flash_W25X_ReadData(addr, (uint8_t *) &header, sizeof(header)) != 0)
return -2;
if((header.id != objId) || (header.instId != instId))
return -3;
// Read the instance data
if (PIOS_Flash_W25X_ReadData(addr + sizeof(header), data, UAVObjGetNumBytes(obj)) != 0)
return -4;
return 0;
}
/**
* @brief Delete object from flash
* @param[in] obj UAVObjHandle the object to save
* @param[in] instId The instance of the object to save
* @return 0 if success or error code
* @retval -1 if object not in file table
* @retval -2 Erase failed
* @note To avoid buffering the file table (1k ram!) the entry in the file table
* remains but destination sector is erased. This will make the load fail as the
* file header won't match the object. At next save it goes back there.
*/
int32_t PIOS_FLASHFS_ObjDelete(UAVObjHandle obj, uint16_t instId)
{
uint32_t objId = UAVObjGetID(obj);
int32_t addr = PIOS_FLASHFS_GetObjAddress(objId, instId);
// Object currently not saved
if(addr < 0)
return -1;
if(PIOS_Flash_W25X_EraseSector(addr) != 0)
return -2;
return 0;
}

View File

@ -0,0 +1,37 @@
/**
******************************************************************************
*
* @addtogroup PIOS PIOS Core hardware abstraction layer
* @{
* @addtogroup PIOS_FLASHFS_OBJLIST Object list based flash filesystem (low ram)
* @{
*
* @file pios_flashfs_objlist.h
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
* @brief A file system for storing UAVObject in flash chip
* @see The GNU Public License (GPL) Version 3
*
*****************************************************************************/
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "openpilot.h"
#include "uavobjectmanager.h"
int32_t PIOS_FLASHFS_Init();
int32_t PIOS_FLASHFS_ObjSave(UAVObjHandle obj, uint16_t instId, uint8_t * data);
int32_t PIOS_FLASHFS_ObjLoad(UAVObjHandle obj, uint16_t instId, uint8_t * data);
int32_t PIOS_FLASHFS_ObjDelete(UAVObjHandle obj, uint16_t instId);

View File

@ -119,6 +119,7 @@
#if defined(PIOS_INCLUDE_FLASH) #if defined(PIOS_INCLUDE_FLASH)
#include <pios_flash_w25x.h> #include <pios_flash_w25x.h>
#include <pios_flashfs_objlist.h>
#endif #endif
#if defined(PIOS_INCLUDE_BL_HELPER) #if defined(PIOS_INCLUDE_BL_HELPER)

View File

@ -439,6 +439,16 @@ size: $(OUTDIR)/$(TARGET).elf_size
docs: docs:
doxygen $(DOXYGENDIR)/doxygen.cfg doxygen $(DOXYGENDIR)/doxygen.cfg
# Install: install binary file with prefix/suffix into install directory
install: $(OUTDIR)/$(TARGET).bin
ifneq ($(INSTALL_DIR),)
@echo $(MSG_INSTALLING) $(call toprel, $<)
$(V1) mkdir -p $(INSTALL_DIR)
$(V1) $(INSTALL) $< $(INSTALL_DIR)/$(INSTALL_PFX)$(TARGET)$(INSTALL_SFX).bin
else
$(error INSTALL_DIR must be specified for $@)
endif
# Target: clean project. # Target: clean project.
clean: clean_list clean: clean_list
@ -476,4 +486,4 @@ else
endif endif
# Listing of phony targets. # Listing of phony targets.
.PHONY : all build clean clean_list program .PHONY : all build clean clean_list program install

View File

@ -3125,6 +3125,54 @@
65FBE14412E7C98100176B5A /* pios_servo_priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_servo_priv.h; sourceTree = "<group>"; }; 65FBE14412E7C98100176B5A /* pios_servo_priv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_servo_priv.h; sourceTree = "<group>"; };
65FC66AA123F30F100B04F74 /* ahrs_timer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ahrs_timer.c; path = ../../AHRS/ahrs_timer.c; sourceTree = SOURCE_ROOT; }; 65FC66AA123F30F100B04F74 /* ahrs_timer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ahrs_timer.c; path = ../../AHRS/ahrs_timer.c; sourceTree = SOURCE_ROOT; };
65FC66AB123F312A00B04F74 /* ahrs_timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ahrs_timer.h; sourceTree = "<group>"; }; 65FC66AB123F312A00B04F74 /* ahrs_timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ahrs_timer.h; sourceTree = "<group>"; };
65FF4BB513791C3300146BE4 /* ahrs_slave_test.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ahrs_slave_test.c; sourceTree = "<group>"; };
65FF4BB613791C3300146BE4 /* ahrs_spi_program.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ahrs_spi_program.c; sourceTree = "<group>"; };
65FF4BB713791C3300146BE4 /* ahrs_spi_program_master.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ahrs_spi_program_master.c; sourceTree = "<group>"; };
65FF4BB813791C3300146BE4 /* ahrs_spi_program_slave.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ahrs_spi_program_slave.c; sourceTree = "<group>"; };
65FF4BB913791C3300146BE4 /* bl_fsm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bl_fsm.c; sourceTree = "<group>"; };
65FF4BBB13791C3300146BE4 /* ahrs_bl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ahrs_bl.h; sourceTree = "<group>"; };
65FF4BBC13791C3300146BE4 /* ahrs_spi_program.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ahrs_spi_program.h; sourceTree = "<group>"; };
65FF4BBD13791C3300146BE4 /* ahrs_spi_program_master.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ahrs_spi_program_master.h; sourceTree = "<group>"; };
65FF4BBE13791C3300146BE4 /* ahrs_spi_program_slave.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ahrs_spi_program_slave.h; sourceTree = "<group>"; };
65FF4BBF13791C3300146BE4 /* bl_fsm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bl_fsm.h; sourceTree = "<group>"; };
65FF4BC013791C3300146BE4 /* pios_config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_config.h; sourceTree = "<group>"; };
65FF4BC113791C3300146BE4 /* main.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = main.c; sourceTree = "<group>"; };
65FF4BC213791C3300146BE4 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; };
65FF4BC313791C3300146BE4 /* pios_board.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_board.c; sourceTree = "<group>"; };
65FF4BC613791C3300146BE4 /* pios_config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_config.h; sourceTree = "<group>"; };
65FF4BC713791C3300146BE4 /* main.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = main.c; sourceTree = "<group>"; };
65FF4BC813791C3300146BE4 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; };
65FF4BC913791C3300146BE4 /* pios_board.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_board.c; sourceTree = "<group>"; };
65FF4BCA13791C3300146BE4 /* test.bin */ = {isa = PBXFileReference; lastKnownFileType = archive.macbinary; path = test.bin; sourceTree = "<group>"; };
65FF4BCD13791C3300146BE4 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = "<group>"; };
65FF4BCE13791C3300146BE4 /* op_dfu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = op_dfu.h; sourceTree = "<group>"; };
65FF4BCF13791C3300146BE4 /* pios_config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_config.h; sourceTree = "<group>"; };
65FF4BD013791C3300146BE4 /* pios_usb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_usb.h; sourceTree = "<group>"; };
65FF4BD113791C3300146BE4 /* main.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = main.c; sourceTree = "<group>"; };
65FF4BD213791C3300146BE4 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; };
65FF4BD313791C3300146BE4 /* op_dfu.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = op_dfu.c; sourceTree = "<group>"; };
65FF4BD413791C3300146BE4 /* pios_board.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_board.c; sourceTree = "<group>"; };
65FF4BD713791C3300146BE4 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = "<group>"; };
65FF4BD813791C3300146BE4 /* op_dfu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = op_dfu.h; sourceTree = "<group>"; };
65FF4BD913791C3300146BE4 /* pios_config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_config.h; sourceTree = "<group>"; };
65FF4BDA13791C3300146BE4 /* pios_usb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_usb.h; sourceTree = "<group>"; };
65FF4BDB13791C3300146BE4 /* ssp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssp.h; sourceTree = "<group>"; };
65FF4BDC13791C3300146BE4 /* main.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = main.c; sourceTree = "<group>"; };
65FF4BDD13791C3300146BE4 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; };
65FF4BDE13791C3300146BE4 /* op_dfu.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = op_dfu.c; sourceTree = "<group>"; };
65FF4BDF13791C3300146BE4 /* pios_board.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_board.c; sourceTree = "<group>"; };
65FF4BE013791C3300146BE4 /* ssp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ssp.c; sourceTree = "<group>"; };
65FF4BE113791C3300146BE4 /* ssp_timer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ssp_timer.c; sourceTree = "<group>"; };
65FF4BE413791C3300146BE4 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = "<group>"; };
65FF4BE513791C3300146BE4 /* op_dfu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = op_dfu.h; sourceTree = "<group>"; };
65FF4BE613791C3300146BE4 /* pios_config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_config.h; sourceTree = "<group>"; };
65FF4BE713791C3300146BE4 /* pios_usb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_usb.h; sourceTree = "<group>"; };
65FF4BE813791C3300146BE4 /* main.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = main.c; sourceTree = "<group>"; };
65FF4BE913791C3300146BE4 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; };
65FF4BEA13791C3300146BE4 /* op_dfu.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = op_dfu.c; sourceTree = "<group>"; };
65FF4BEB13791C3300146BE4 /* pios_board.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_board.c; sourceTree = "<group>"; };
65FF4D5E137EDEC100146BE4 /* pios_flashfs_objlist.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pios_flashfs_objlist.c; sourceTree = "<group>"; };
65FF4D61137EFA4F00146BE4 /* pios_flashfs_objlist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pios_flashfs_objlist.h; sourceTree = "<group>"; };
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXGroup section */ /* Begin PBXGroup section */
@ -3505,6 +3553,7 @@
657CEEB5121DBC49007A1FBE /* flight */ = { 657CEEB5121DBC49007A1FBE /* flight */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
65FF4BB313791C3300146BE4 /* Bootloaders */,
65F93B9012EE09280047DB36 /* PipXtreme */, 65F93B9012EE09280047DB36 /* PipXtreme */,
65B7E6AC120DF1CD000C1123 /* AHRS */, 65B7E6AC120DF1CD000C1123 /* AHRS */,
65E6DF7012E02E8E00058553 /* CopterControl */, 65E6DF7012E02E8E00058553 /* CopterControl */,
@ -7610,6 +7659,7 @@
65E8F03711EFF25C00BBF654 /* printf-stdarg.c */, 65E8F03711EFF25C00BBF654 /* printf-stdarg.c */,
6528CCB412E406B800CF5144 /* pios_adxl345.c */, 6528CCB412E406B800CF5144 /* pios_adxl345.c */,
6512D60712ED4CB8008175E5 /* pios_flash_w25x.c */, 6512D60712ED4CB8008175E5 /* pios_flash_w25x.c */,
65FF4D5E137EDEC100146BE4 /* pios_flashfs_objlist.c */,
); );
name = Common; name = Common;
path = ../../PiOS/Common; path = ../../PiOS/Common;
@ -7634,6 +7684,7 @@
65E8F03E11EFF25C00BBF654 /* pios_debug.h */, 65E8F03E11EFF25C00BBF654 /* pios_debug.h */,
65E8F03F11EFF25C00BBF654 /* pios_delay.h */, 65E8F03F11EFF25C00BBF654 /* pios_delay.h */,
65E8F04011EFF25C00BBF654 /* pios_exti.h */, 65E8F04011EFF25C00BBF654 /* pios_exti.h */,
65FF4D61137EFA4F00146BE4 /* pios_flashfs_objlist.h */,
65E8F04111EFF25C00BBF654 /* pios_gpio.h */, 65E8F04111EFF25C00BBF654 /* pios_gpio.h */,
65E8F04211EFF25C00BBF654 /* pios_hmc5843.h */, 65E8F04211EFF25C00BBF654 /* pios_hmc5843.h */,
65E8F04311EFF25C00BBF654 /* pios_i2c.h */, 65E8F04311EFF25C00BBF654 /* pios_i2c.h */,
@ -8238,6 +8289,140 @@
path = inc; path = inc;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
65FF4BB313791C3300146BE4 /* Bootloaders */ = {
isa = PBXGroup;
children = (
65FF4BB413791C3300146BE4 /* AHRS */,
65FF4BC413791C3300146BE4 /* BootloaderUpdater */,
65FF4BCB13791C3300146BE4 /* CopterControl */,
65FF4BD513791C3300146BE4 /* OpenPilot */,
65FF4BE213791C3300146BE4 /* PipXtreme */,
);
name = Bootloaders;
path = ../../Bootloaders;
sourceTree = SOURCE_ROOT;
};
65FF4BB413791C3300146BE4 /* AHRS */ = {
isa = PBXGroup;
children = (
65FF4BB513791C3300146BE4 /* ahrs_slave_test.c */,
65FF4BB613791C3300146BE4 /* ahrs_spi_program.c */,
65FF4BB713791C3300146BE4 /* ahrs_spi_program_master.c */,
65FF4BB813791C3300146BE4 /* ahrs_spi_program_slave.c */,
65FF4BB913791C3300146BE4 /* bl_fsm.c */,
65FF4BBA13791C3300146BE4 /* inc */,
65FF4BC113791C3300146BE4 /* main.c */,
65FF4BC213791C3300146BE4 /* Makefile */,
65FF4BC313791C3300146BE4 /* pios_board.c */,
);
path = AHRS;
sourceTree = "<group>";
};
65FF4BBA13791C3300146BE4 /* inc */ = {
isa = PBXGroup;
children = (
65FF4BBB13791C3300146BE4 /* ahrs_bl.h */,
65FF4BBC13791C3300146BE4 /* ahrs_spi_program.h */,
65FF4BBD13791C3300146BE4 /* ahrs_spi_program_master.h */,
65FF4BBE13791C3300146BE4 /* ahrs_spi_program_slave.h */,
65FF4BBF13791C3300146BE4 /* bl_fsm.h */,
65FF4BC013791C3300146BE4 /* pios_config.h */,
);
path = inc;
sourceTree = "<group>";
};
65FF4BC413791C3300146BE4 /* BootloaderUpdater */ = {
isa = PBXGroup;
children = (
65FF4BC513791C3300146BE4 /* inc */,
65FF4BC713791C3300146BE4 /* main.c */,
65FF4BC813791C3300146BE4 /* Makefile */,
65FF4BC913791C3300146BE4 /* pios_board.c */,
65FF4BCA13791C3300146BE4 /* test.bin */,
);
path = BootloaderUpdater;
sourceTree = "<group>";
};
65FF4BC513791C3300146BE4 /* inc */ = {
isa = PBXGroup;
children = (
65FF4BC613791C3300146BE4 /* pios_config.h */,
);
path = inc;
sourceTree = "<group>";
};
65FF4BCB13791C3300146BE4 /* CopterControl */ = {
isa = PBXGroup;
children = (
65FF4BCC13791C3300146BE4 /* inc */,
65FF4BD113791C3300146BE4 /* main.c */,
65FF4BD213791C3300146BE4 /* Makefile */,
65FF4BD313791C3300146BE4 /* op_dfu.c */,
65FF4BD413791C3300146BE4 /* pios_board.c */,
);
path = CopterControl;
sourceTree = "<group>";
};
65FF4BCC13791C3300146BE4 /* inc */ = {
isa = PBXGroup;
children = (
65FF4BCD13791C3300146BE4 /* common.h */,
65FF4BCE13791C3300146BE4 /* op_dfu.h */,
65FF4BCF13791C3300146BE4 /* pios_config.h */,
65FF4BD013791C3300146BE4 /* pios_usb.h */,
);
path = inc;
sourceTree = "<group>";
};
65FF4BD513791C3300146BE4 /* OpenPilot */ = {
isa = PBXGroup;
children = (
65FF4BD613791C3300146BE4 /* inc */,
65FF4BDC13791C3300146BE4 /* main.c */,
65FF4BDD13791C3300146BE4 /* Makefile */,
65FF4BDE13791C3300146BE4 /* op_dfu.c */,
65FF4BDF13791C3300146BE4 /* pios_board.c */,
65FF4BE013791C3300146BE4 /* ssp.c */,
65FF4BE113791C3300146BE4 /* ssp_timer.c */,
);
path = OpenPilot;
sourceTree = "<group>";
};
65FF4BD613791C3300146BE4 /* inc */ = {
isa = PBXGroup;
children = (
65FF4BD713791C3300146BE4 /* common.h */,
65FF4BD813791C3300146BE4 /* op_dfu.h */,
65FF4BD913791C3300146BE4 /* pios_config.h */,
65FF4BDA13791C3300146BE4 /* pios_usb.h */,
65FF4BDB13791C3300146BE4 /* ssp.h */,
);
path = inc;
sourceTree = "<group>";
};
65FF4BE213791C3300146BE4 /* PipXtreme */ = {
isa = PBXGroup;
children = (
65FF4BE313791C3300146BE4 /* inc */,
65FF4BE813791C3300146BE4 /* main.c */,
65FF4BE913791C3300146BE4 /* Makefile */,
65FF4BEA13791C3300146BE4 /* op_dfu.c */,
65FF4BEB13791C3300146BE4 /* pios_board.c */,
);
path = PipXtreme;
sourceTree = "<group>";
};
65FF4BE313791C3300146BE4 /* inc */ = {
isa = PBXGroup;
children = (
65FF4BE413791C3300146BE4 /* common.h */,
65FF4BE513791C3300146BE4 /* op_dfu.h */,
65FF4BE613791C3300146BE4 /* pios_config.h */,
65FF4BE713791C3300146BE4 /* pios_usb.h */,
);
path = inc;
sourceTree = "<group>";
};
C6A0FF2B0290797F04C91782 /* Documentation */ = { C6A0FF2B0290797F04C91782 /* Documentation */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (

View File

@ -41,10 +41,10 @@
* List of event queues and the eventmask associated with the queue. * List of event queues and the eventmask associated with the queue.
*/ */
struct ObjectEventListStruct { struct ObjectEventListStruct {
xQueueHandle queue; xQueueHandle queue;
UAVObjEventCallback cb; UAVObjEventCallback cb;
int32_t eventMask; int32_t eventMask;
struct ObjectEventListStruct* next; struct ObjectEventListStruct *next;
}; };
typedef struct ObjectEventListStruct ObjectEventList; typedef struct ObjectEventListStruct ObjectEventList;
@ -52,9 +52,9 @@ typedef struct ObjectEventListStruct ObjectEventList;
* List of object instances, holds the actual data structure and instance ID * List of object instances, holds the actual data structure and instance ID
*/ */
struct ObjectInstListStruct { struct ObjectInstListStruct {
void* data; void *data;
uint16_t instId; uint16_t instId;
struct ObjectInstListStruct* next; struct ObjectInstListStruct *next;
}; };
typedef struct ObjectInstListStruct ObjectInstList; typedef struct ObjectInstListStruct ObjectInstList;
@ -62,34 +62,48 @@ typedef struct ObjectInstListStruct ObjectInstList;
* List of objects registered in the object manager * List of objects registered in the object manager
*/ */
struct ObjectListStruct { struct ObjectListStruct {
uint32_t id; /** The object ID */ uint32_t id;
const char* name; /** The object name */ /** The object ID */
int8_t isMetaobject; /** Set to 1 if this is a metaobject */ const char *name;
int8_t isSingleInstance; /** Set to 1 if this object has a single instance */ /** The object name */
int8_t isSettings; /** Set to 1 if this object is a settings object */ int8_t isMetaobject;
uint16_t numBytes; /** Number of data bytes contained in the object (for a single instance) */ /** Set to 1 if this is a metaobject */
uint16_t numInstances; /** Number of instances */ int8_t isSingleInstance;
struct ObjectListStruct* linkedObj; /** Linked object, for regular objects this is the metaobject and for metaobjects it is the parent object */ /** Set to 1 if this object has a single instance */
ObjectInstList instances; /** List of object instances, instance 0 always exists */ int8_t isSettings;
ObjectEventList* events; /** Event queues registered on the object */ /** Set to 1 if this object is a settings object */
struct ObjectListStruct* next; /** Needed by linked list library (utlist.h) */ uint16_t numBytes;
/** Number of data bytes contained in the object (for a single instance) */
uint16_t numInstances;
/** Number of instances */
struct ObjectListStruct *linkedObj;
/** Linked object, for regular objects this is the metaobject and for metaobjects it is the parent object */
ObjectInstList instances;
/** List of object instances, instance 0 always exists */
ObjectEventList *events;
/** Event queues registered on the object */
struct ObjectListStruct *next;
/** Needed by linked list library (utlist.h) */
}; };
typedef struct ObjectListStruct ObjectList; typedef struct ObjectListStruct ObjectList;
// Private functions // Private functions
static int32_t sendEvent(ObjectList* obj, uint16_t instId, UAVObjEventType event); static int32_t sendEvent(ObjectList * obj, uint16_t instId,
static ObjectInstList* createInstance(ObjectList* obj, uint16_t instId); UAVObjEventType event);
static ObjectInstList* getInstance(ObjectList* obj, uint16_t instId); static ObjectInstList *createInstance(ObjectList * obj, uint16_t instId);
static int32_t connectObj(UAVObjHandle obj, xQueueHandle queue, UAVObjEventCallback cb, int32_t eventMask); static ObjectInstList *getInstance(ObjectList * obj, uint16_t instId);
static int32_t disconnectObj(UAVObjHandle obj, xQueueHandle queue, UAVObjEventCallback cb); static int32_t connectObj(UAVObjHandle obj, xQueueHandle queue,
UAVObjEventCallback cb, int32_t eventMask);
static int32_t disconnectObj(UAVObjHandle obj, xQueueHandle queue,
UAVObjEventCallback cb);
#if defined(PIOS_INCLUDE_SDCARD) #if defined(PIOS_INCLUDE_SDCARD)
static void objectFilename(ObjectList* obj, uint8_t* filename); static void objectFilename(ObjectList * obj, uint8_t * filename);
static void customSPrintf(uint8_t* buffer, uint8_t* format, ...); static void customSPrintf(uint8_t * buffer, uint8_t * format, ...);
#endif #endif
// Private variables // Private variables
static ObjectList* objList; static ObjectList *objList;
static xSemaphoreHandle mutex; static xSemaphoreHandle mutex;
static UAVObjMetadata defMetadata; static UAVObjMetadata defMetadata;
static UAVObjStats stats; static UAVObjStats stats;
@ -101,40 +115,40 @@ static UAVObjStats stats;
*/ */
int32_t UAVObjInitialize() int32_t UAVObjInitialize()
{ {
// Initialize variables // Initialize variables
objList = NULL; objList = NULL;
memset(&stats, 0, sizeof(UAVObjStats)); memset(&stats, 0, sizeof(UAVObjStats));
// Create mutex // Create mutex
mutex = xSemaphoreCreateRecursiveMutex(); mutex = xSemaphoreCreateRecursiveMutex();
if (mutex == NULL) if (mutex == NULL)
return -1; return -1;
// Initialize default metadata structure (metadata of metaobjects) // Initialize default metadata structure (metadata of metaobjects)
defMetadata.access = ACCESS_READWRITE; defMetadata.access = ACCESS_READWRITE;
defMetadata.gcsAccess = ACCESS_READWRITE; defMetadata.gcsAccess = ACCESS_READWRITE;
defMetadata.telemetryAcked = 1; defMetadata.telemetryAcked = 1;
defMetadata.telemetryUpdateMode = UPDATEMODE_ONCHANGE; defMetadata.telemetryUpdateMode = UPDATEMODE_ONCHANGE;
defMetadata.telemetryUpdatePeriod = 0; defMetadata.telemetryUpdatePeriod = 0;
defMetadata.gcsTelemetryAcked = 1; defMetadata.gcsTelemetryAcked = 1;
defMetadata.gcsTelemetryUpdateMode = UPDATEMODE_ONCHANGE; defMetadata.gcsTelemetryUpdateMode = UPDATEMODE_ONCHANGE;
defMetadata.gcsTelemetryUpdatePeriod = 0; defMetadata.gcsTelemetryUpdatePeriod = 0;
defMetadata.loggingUpdateMode = UPDATEMODE_ONCHANGE; defMetadata.loggingUpdateMode = UPDATEMODE_ONCHANGE;
defMetadata.loggingUpdatePeriod = 0; defMetadata.loggingUpdatePeriod = 0;
// Done // Done
return 0; return 0;
} }
/** /**
* Get the statistics counters * Get the statistics counters
* @param[out] statsOut The statistics counters will be copied there * @param[out] statsOut The statistics counters will be copied there
*/ */
void UAVObjGetStats(UAVObjStats* statsOut) void UAVObjGetStats(UAVObjStats * statsOut)
{ {
xSemaphoreTakeRecursive(mutex, portMAX_DELAY); xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
memcpy(statsOut, &stats, sizeof(UAVObjStats)); memcpy(statsOut, &stats, sizeof(UAVObjStats));
xSemaphoreGiveRecursive(mutex); xSemaphoreGiveRecursive(mutex);
} }
/** /**
@ -142,9 +156,9 @@ void UAVObjGetStats(UAVObjStats* statsOut)
*/ */
void UAVObjClearStats() void UAVObjClearStats()
{ {
xSemaphoreTakeRecursive(mutex, portMAX_DELAY); xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
memset(&stats, 0, sizeof(UAVObjStats)); memset(&stats, 0, sizeof(UAVObjStats));
xSemaphoreGiveRecursive(mutex); xSemaphoreGiveRecursive(mutex);
} }
/** /**
@ -160,91 +174,85 @@ void UAVObjClearStats()
* \return Object handle, or NULL if failure. * \return Object handle, or NULL if failure.
* \return * \return
*/ */
UAVObjHandle UAVObjRegister(uint32_t id, const char* name, const char* metaName, int32_t isMetaobject, UAVObjHandle UAVObjRegister(uint32_t id, const char *name,
int32_t isSingleInstance, int32_t isSettings, uint32_t numBytes, UAVObjInitializeCallback initCb) const char *metaName, int32_t isMetaobject,
int32_t isSingleInstance, int32_t isSettings,
uint32_t numBytes,
UAVObjInitializeCallback initCb)
{ {
ObjectList* objEntry; ObjectList *objEntry;
ObjectInstList* instEntry; ObjectInstList *instEntry;
ObjectList* metaObj; ObjectList *metaObj;
// Get lock // Get lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY); xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Check that the object is not already registered // Check that the object is not already registered
LL_FOREACH(objList, objEntry) LL_FOREACH(objList, objEntry) {
{ if (objEntry->id == id) {
if (objEntry->id == id) // Already registered, ignore
{ xSemaphoreGiveRecursive(mutex);
// Already registered, ignore return NULL;
xSemaphoreGiveRecursive(mutex); }
return NULL; }
}
}
// Create and append entry // Create and append entry
objEntry = (ObjectList*)pvPortMalloc(sizeof(ObjectList)); objEntry = (ObjectList *) pvPortMalloc(sizeof(ObjectList));
if (objEntry == NULL) if (objEntry == NULL) {
{ xSemaphoreGiveRecursive(mutex);
xSemaphoreGiveRecursive(mutex); return NULL;
return NULL; }
} objEntry->id = id;
objEntry->id = id; objEntry->name = name;
objEntry->name = name; objEntry->isMetaobject = (int8_t) isMetaobject;
objEntry->isMetaobject = (int8_t)isMetaobject; objEntry->isSingleInstance = (int8_t) isSingleInstance;
objEntry->isSingleInstance = (int8_t)isSingleInstance; objEntry->isSettings = (int8_t) isSettings;
objEntry->isSettings = (int8_t)isSettings; objEntry->numBytes = numBytes;
objEntry->numBytes = numBytes; objEntry->events = NULL;
objEntry->events = NULL; objEntry->numInstances = 0;
objEntry->numInstances = 0; objEntry->instances.data = NULL;
objEntry->instances.data = NULL; objEntry->instances.instId = 0xFFFF;
objEntry->instances.instId = 0xFFFF; objEntry->instances.next = NULL;
objEntry->instances.next = NULL; objEntry->linkedObj = NULL; // will be set later
objEntry->linkedObj = NULL; // will be set later LL_APPEND(objList, objEntry);
LL_APPEND(objList, objEntry);
// Create instance zero // Create instance zero
instEntry = createInstance(objEntry, 0); instEntry = createInstance(objEntry, 0);
if ( instEntry == NULL ) if (instEntry == NULL) {
{ xSemaphoreGiveRecursive(mutex);
xSemaphoreGiveRecursive(mutex); return NULL;
return NULL; }
} // Create metaobject and update linkedObj
if (isMetaobject) {
objEntry->linkedObj = NULL; // will be set later
} else {
// Create metaobject
metaObj =
(ObjectList *) UAVObjRegister(id + 1, metaName,
NULL, 1, 1, 0,
sizeof
(UAVObjMetadata),
NULL);
// Link two objects
objEntry->linkedObj = metaObj;
metaObj->linkedObj = objEntry;
}
// Create metaobject and update linkedObj // Initialize object fields and metadata to default values
if (isMetaobject) if (initCb != NULL) {
{ initCb((UAVObjHandle) objEntry, 0);
objEntry->linkedObj = NULL; // will be set later }
} // Attempt to load object's metadata from the SD card (not done directly on the metaobject, but through the object)
else if (!objEntry->isMetaobject) {
{ UAVObjLoad((UAVObjHandle) objEntry->linkedObj, 0);
// Create metaobject }
metaObj = (ObjectList*)UAVObjRegister(id+1, metaName, NULL, 1, 1, 0, sizeof(UAVObjMetadata), NULL); // If this is a settings object, attempt to load from SD card
// Link two objects if (objEntry->isSettings) {
objEntry->linkedObj = metaObj; UAVObjLoad((UAVObjHandle) objEntry, 0);
metaObj->linkedObj = objEntry; }
} // Release lock
xSemaphoreGiveRecursive(mutex);
// Initialize object fields and metadata to default values return (UAVObjHandle) objEntry;
if ( initCb != NULL )
{
initCb((UAVObjHandle)objEntry, 0);
}
// Attempt to load object's metadata from the SD card (not done directly on the metaobject, but through the object)
if ( !objEntry->isMetaobject )
{
UAVObjLoad( (UAVObjHandle)objEntry->linkedObj, 0 );
}
// If this is a settings object, attempt to load from SD card
if ( objEntry->isSettings )
{
UAVObjLoad( (UAVObjHandle)objEntry, 0 );
}
// Release lock
xSemaphoreGiveRecursive(mutex);
return (UAVObjHandle)objEntry;
} }
/** /**
@ -254,26 +262,24 @@ UAVObjHandle UAVObjRegister(uint32_t id, const char* name, const char* metaName,
*/ */
UAVObjHandle UAVObjGetByID(uint32_t id) UAVObjHandle UAVObjGetByID(uint32_t id)
{ {
ObjectList* objEntry; ObjectList *objEntry;
// Get lock // Get lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY); xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Look for object // Look for object
LL_FOREACH(objList, objEntry) LL_FOREACH(objList, objEntry) {
{ if (objEntry->id == id) {
if (objEntry->id == id) // Release lock
{ xSemaphoreGiveRecursive(mutex);
// Release lock // Done, object found
xSemaphoreGiveRecursive(mutex); return (UAVObjHandle) objEntry;
// Done, object found }
return (UAVObjHandle)objEntry; }
}
}
// Object not found, release lock and return error // Object not found, release lock and return error
xSemaphoreGiveRecursive(mutex); xSemaphoreGiveRecursive(mutex);
return NULL; return NULL;
} }
/** /**
@ -281,28 +287,27 @@ UAVObjHandle UAVObjGetByID(uint32_t id)
* \param[in] name The name of the object * \param[in] name The name of the object
* \return The object or NULL if not found. * \return The object or NULL if not found.
*/ */
UAVObjHandle UAVObjGetByName(char* name) UAVObjHandle UAVObjGetByName(char *name)
{ {
ObjectList* objEntry; ObjectList *objEntry;
// Get lock // Get lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY); xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Look for object // Look for object
LL_FOREACH(objList, objEntry) LL_FOREACH(objList, objEntry) {
{ if (objEntry->name != NULL
if (objEntry->name != NULL && strcmp(objEntry->name, name) == 0) && strcmp(objEntry->name, name) == 0) {
{ // Release lock
// Release lock xSemaphoreGiveRecursive(mutex);
xSemaphoreGiveRecursive(mutex); // Done, object found
// Done, object found return (UAVObjHandle) objEntry;
return (UAVObjHandle)objEntry; }
} }
}
// Object not found, release lock and return error // Object not found, release lock and return error
xSemaphoreGiveRecursive(mutex); xSemaphoreGiveRecursive(mutex);
return NULL; return NULL;
} }
/** /**
@ -312,7 +317,7 @@ UAVObjHandle UAVObjGetByName(char* name)
*/ */
uint32_t UAVObjGetID(UAVObjHandle obj) uint32_t UAVObjGetID(UAVObjHandle obj)
{ {
return ((ObjectList*)obj)->id; return ((ObjectList *) obj)->id;
} }
/** /**
@ -320,9 +325,9 @@ uint32_t UAVObjGetID(UAVObjHandle obj)
* \param[in] obj The object handle * \param[in] obj The object handle
* \return The object's name * \return The object's name
*/ */
const char* UAVObjGetName(UAVObjHandle obj) const char *UAVObjGetName(UAVObjHandle obj)
{ {
return ((ObjectList*)obj)->name; return ((ObjectList *) obj)->name;
} }
/** /**
@ -332,7 +337,7 @@ const char* UAVObjGetName(UAVObjHandle obj)
*/ */
uint32_t UAVObjGetNumBytes(UAVObjHandle obj) uint32_t UAVObjGetNumBytes(UAVObjHandle obj)
{ {
return ((ObjectList*)obj)->numBytes; return ((ObjectList *) obj)->numBytes;
} }
/** /**
@ -344,7 +349,7 @@ uint32_t UAVObjGetNumBytes(UAVObjHandle obj)
*/ */
UAVObjHandle UAVObjGetLinkedObj(UAVObjHandle obj) UAVObjHandle UAVObjGetLinkedObj(UAVObjHandle obj)
{ {
return (UAVObjHandle)(((ObjectList*)obj)->linkedObj); return (UAVObjHandle) (((ObjectList *) obj)->linkedObj);
} }
/** /**
@ -354,11 +359,11 @@ UAVObjHandle UAVObjGetLinkedObj(UAVObjHandle obj)
*/ */
uint16_t UAVObjGetNumInstances(UAVObjHandle obj) uint16_t UAVObjGetNumInstances(UAVObjHandle obj)
{ {
uint32_t numInstances; uint32_t numInstances;
xSemaphoreTakeRecursive(mutex, portMAX_DELAY); xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
numInstances = ((ObjectList*)obj)->numInstances; numInstances = ((ObjectList *) obj)->numInstances;
xSemaphoreGiveRecursive(mutex); xSemaphoreGiveRecursive(mutex);
return numInstances; return numInstances;
} }
/** /**
@ -366,32 +371,29 @@ uint16_t UAVObjGetNumInstances(UAVObjHandle obj)
* \param[in] obj The object handle * \param[in] obj The object handle
* \return The instance ID or 0 if an error * \return The instance ID or 0 if an error
*/ */
uint16_t UAVObjCreateInstance(UAVObjHandle obj, UAVObjInitializeCallback initCb) uint16_t UAVObjCreateInstance(UAVObjHandle obj,
UAVObjInitializeCallback initCb)
{ {
ObjectList* objEntry; ObjectList *objEntry;
ObjectInstList* instEntry; ObjectInstList *instEntry;
// Lock // Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY); xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Create new instance // Create new instance
objEntry = (ObjectList*)obj; objEntry = (ObjectList *) obj;
instEntry = createInstance(objEntry, objEntry->numInstances); instEntry = createInstance(objEntry, objEntry->numInstances);
if ( instEntry == NULL ) if (instEntry == NULL) {
{ xSemaphoreGiveRecursive(mutex);
xSemaphoreGiveRecursive(mutex); return -1;
return -1; }
} // Initialize instance data
if (initCb != NULL) {
// Initialize instance data initCb(obj, instEntry->instId);
if ( initCb != NULL ) }
{ // Unlock
initCb(obj, instEntry->instId); xSemaphoreGiveRecursive(mutex);
} return instEntry->instId;
// Unlock
xSemaphoreGiveRecursive(mutex);
return instEntry->instId;
} }
/** /**
@ -401,7 +403,7 @@ uint16_t UAVObjCreateInstance(UAVObjHandle obj, UAVObjInitializeCallback initCb)
*/ */
int32_t UAVObjIsSingleInstance(UAVObjHandle obj) int32_t UAVObjIsSingleInstance(UAVObjHandle obj)
{ {
return ((ObjectList*)obj)->isSingleInstance; return ((ObjectList *) obj)->isSingleInstance;
} }
/** /**
@ -411,7 +413,7 @@ int32_t UAVObjIsSingleInstance(UAVObjHandle obj)
*/ */
int32_t UAVObjIsMetaobject(UAVObjHandle obj) int32_t UAVObjIsMetaobject(UAVObjHandle obj)
{ {
return ((ObjectList*)obj)->isMetaobject; return ((ObjectList *) obj)->isMetaobject;
} }
/** /**
@ -421,7 +423,7 @@ int32_t UAVObjIsMetaobject(UAVObjHandle obj)
*/ */
int32_t UAVObjIsSettings(UAVObjHandle obj) int32_t UAVObjIsSettings(UAVObjHandle obj)
{ {
return ((ObjectList*)obj)->isSettings; return ((ObjectList *) obj)->isSettings;
} }
/** /**
@ -431,41 +433,39 @@ int32_t UAVObjIsSettings(UAVObjHandle obj)
* \param[in] dataIn The byte array * \param[in] dataIn The byte array
* \return 0 if success or -1 if failure * \return 0 if success or -1 if failure
*/ */
int32_t UAVObjUnpack(UAVObjHandle obj, uint16_t instId, const uint8_t* dataIn) int32_t UAVObjUnpack(UAVObjHandle obj, uint16_t instId,
const uint8_t * dataIn)
{ {
ObjectList* objEntry; ObjectList *objEntry;
ObjectInstList* instEntry; ObjectInstList *instEntry;
// Lock // Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY); xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Cast handle to object // Cast handle to object
objEntry = (ObjectList*)obj; objEntry = (ObjectList *) obj;
// Get the instance // Get the instance
instEntry = getInstance(objEntry, instId); instEntry = getInstance(objEntry, instId);
// If the instance does not exist create it and any other instances before it // If the instance does not exist create it and any other instances before it
if ( instEntry == NULL ) if (instEntry == NULL) {
{ instEntry = createInstance(objEntry, instId);
instEntry = createInstance(objEntry, instId); if (instEntry == NULL) {
if ( instEntry == NULL ) // Error, unlock and return
{ xSemaphoreGiveRecursive(mutex);
// Error, unlock and return return -1;
xSemaphoreGiveRecursive(mutex); }
return -1; }
} // Set the data
} memcpy(instEntry->data, dataIn, objEntry->numBytes);
// Set the data // Fire event
memcpy(instEntry->data, dataIn, objEntry->numBytes); sendEvent(objEntry, instId, EV_UNPACKED);
// Fire event // Unlock
sendEvent(objEntry, instId, EV_UNPACKED); xSemaphoreGiveRecursive(mutex);
return 0;
// Unlock
xSemaphoreGiveRecursive(mutex);
return 0;
} }
/** /**
@ -475,32 +475,30 @@ int32_t UAVObjUnpack(UAVObjHandle obj, uint16_t instId, const uint8_t* dataIn)
* \param[out] dataOut The byte array * \param[out] dataOut The byte array
* \return 0 if success or -1 if failure * \return 0 if success or -1 if failure
*/ */
int32_t UAVObjPack(UAVObjHandle obj, uint16_t instId, uint8_t* dataOut) int32_t UAVObjPack(UAVObjHandle obj, uint16_t instId, uint8_t * dataOut)
{ {
ObjectList* objEntry; ObjectList *objEntry;
ObjectInstList* instEntry; ObjectInstList *instEntry;
// Lock // Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY); xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Cast handle to object // Cast handle to object
objEntry = (ObjectList*)obj; objEntry = (ObjectList *) obj;
// Get the instance // Get the instance
instEntry = getInstance(objEntry, instId); instEntry = getInstance(objEntry, instId);
if ( instEntry == NULL ) if (instEntry == NULL) {
{ // Error, unlock and return
// Error, unlock and return xSemaphoreGiveRecursive(mutex);
xSemaphoreGiveRecursive(mutex); return -1;
return -1; }
} // Pack data
memcpy(dataOut, instEntry->data, objEntry->numBytes);
// Pack data // Unlock
memcpy(dataOut, instEntry->data, objEntry->numBytes); xSemaphoreGiveRecursive(mutex);
return 0;
// Unlock
xSemaphoreGiveRecursive(mutex);
return 0;
} }
/** /**
@ -512,64 +510,52 @@ int32_t UAVObjPack(UAVObjHandle obj, uint16_t instId, uint8_t* dataOut)
* @param[in] file File to append to * @param[in] file File to append to
* @return 0 if success or -1 if failure * @return 0 if success or -1 if failure
*/ */
int32_t UAVObjSaveToFile(UAVObjHandle obj, uint16_t instId, FILEINFO* file) int32_t UAVObjSaveToFile(UAVObjHandle obj, uint16_t instId,
FILEINFO * file)
{ {
#if defined(PIOS_INCLUDE_SDCARD) #if defined(PIOS_INCLUDE_SDCARD)
uint32_t bytesWritten; uint32_t bytesWritten;
ObjectList* objEntry; ObjectList *objEntry;
ObjectInstList* instEntry; ObjectInstList *instEntry;
// Check for file system availability // Check for file system availability
if ( PIOS_SDCARD_IsMounted() == 0 ) if (PIOS_SDCARD_IsMounted() == 0) {
{ return -1;
return -1; }
} // Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Lock // Cast to object
xSemaphoreTakeRecursive(mutex, portMAX_DELAY); objEntry = (ObjectList *) obj;
// Cast to object // Get the instance information
objEntry = (ObjectList*)obj; instEntry = getInstance(objEntry, instId);
if (instEntry == NULL) {
xSemaphoreGiveRecursive(mutex);
return -1;
}
// Write the object ID
PIOS_FWRITE(file, &objEntry->id, sizeof(objEntry->id),
&bytesWritten);
// Get the instance information // Write the instance ID
instEntry = getInstance(objEntry, instId); if (!objEntry->isSingleInstance) {
if ( instEntry == NULL ) PIOS_FWRITE(file, &instEntry->instId,
{ sizeof(instEntry->instId), &bytesWritten);
xSemaphoreGiveRecursive(mutex); }
return -1; // Write the data and check that the write was successful
} PIOS_FWRITE(file, instEntry->data, objEntry->numBytes,
&bytesWritten);
// Write the object ID if (bytesWritten != objEntry->numBytes) {
PIOS_FWRITE(file,&objEntry->id,sizeof(objEntry->id),&bytesWritten); xSemaphoreGiveRecursive(mutex);
return -1;
// Write the instance ID }
if (!objEntry->isSingleInstance) // Done
{ xSemaphoreGiveRecursive(mutex);
PIOS_FWRITE(file,&instEntry->instId,sizeof(instEntry->instId),&bytesWritten);
}
// Write the data and check that the write was successful
PIOS_FWRITE(file,instEntry->data,objEntry->numBytes,&bytesWritten);
if ( bytesWritten != objEntry->numBytes )
{
xSemaphoreGiveRecursive(mutex);
return -1;
}
// Done
xSemaphoreGiveRecursive(mutex);
#endif /* PIOS_INCLUDE_SDCARD */ #endif /* PIOS_INCLUDE_SDCARD */
return 0; return 0;
} }
struct fileHeader {
uint32_t id;
uint16_t instId;
uint16_t size;
} __attribute__((packed));
#define FLASH_MASK 0x001ff000 /* Select a sector */
/** /**
* Save the data of the specified object to the file system (SD card). * Save the data of the specified object to the file system (SD card).
* If the object contains multiple instances, all of them will be saved. * If the object contains multiple instances, all of them will be saved.
@ -583,71 +569,56 @@ struct fileHeader {
int32_t UAVObjSave(UAVObjHandle obj, uint16_t instId) int32_t UAVObjSave(UAVObjHandle obj, uint16_t instId)
{ {
#if defined(PIOS_INCLUDE_FLASH_SECTOR_SETTINGS) #if defined(PIOS_INCLUDE_FLASH_SECTOR_SETTINGS)
ObjectList* objEntry = (ObjectList*)obj; ObjectList *objEntry = (ObjectList *) obj;
if(objEntry == NULL) if (objEntry == NULL)
return -1; return -1;
ObjectInstList* instEntry = getInstance(objEntry, instId); ObjectInstList *instEntry = getInstance(objEntry, instId);
if(instEntry == NULL) if (instEntry == NULL)
return -1; return -1;
if(instEntry->data == NULL) if (instEntry->data == NULL)
return -1; return -1;
if (PIOS_FLASHFS_ObjSave(obj, instId, instEntry->data) != 0)
struct fileHeader header = { return -1;
.id = objEntry->id,
.instId = instId,
.size = objEntry->numBytes
};
uint32_t addr = (objEntry->id & FLASH_MASK);
PIOS_Flash_W25X_EraseSector(addr);
PIOS_Flash_W25X_WriteData(addr, (uint8_t *) &header, sizeof(header));
PIOS_Flash_W25X_WriteData(addr + sizeof(header), instEntry->data,objEntry->numBytes);
#endif #endif
#if defined(PIOS_INCLUDE_SDCARD) #if defined(PIOS_INCLUDE_SDCARD)
FILEINFO file; FILEINFO file;
ObjectList* objEntry; ObjectList *objEntry;
uint8_t filename[14]; uint8_t filename[14];
// Check for file system availability // Check for file system availability
if ( PIOS_SDCARD_IsMounted() == 0 ) if (PIOS_SDCARD_IsMounted() == 0) {
{ return -1;
return -1; }
} // Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Lock // Cast to object
xSemaphoreTakeRecursive(mutex, portMAX_DELAY); objEntry = (ObjectList *) obj;
// Cast to object // Get filename
objEntry = (ObjectList*)obj; objectFilename(objEntry, filename);
// Get filename // Open file
objectFilename(objEntry, filename); if (PIOS_FOPEN_WRITE(filename, file)) {
xSemaphoreGiveRecursive(mutex);
// Open file return -1;
if ( PIOS_FOPEN_WRITE(filename,file) ) }
{ // Append object
xSemaphoreGiveRecursive(mutex); if (UAVObjSaveToFile(obj, instId, &file) == -1) {
return -1; PIOS_FCLOSE(file);
} xSemaphoreGiveRecursive(mutex);
return -1;
// Append object }
if ( UAVObjSaveToFile(obj, instId, &file) == -1 ) // Done, close file and unlock
{ PIOS_FCLOSE(file);
PIOS_FCLOSE(file); xSemaphoreGiveRecursive(mutex);
xSemaphoreGiveRecursive(mutex);
return -1;
}
// Done, close file and unlock
PIOS_FCLOSE(file);
xSemaphoreGiveRecursive(mutex);
#endif /* PIOS_INCLUDE_SDCARD */ #endif /* PIOS_INCLUDE_SDCARD */
return 0; return 0;
} }
/** /**
@ -655,82 +626,71 @@ int32_t UAVObjSave(UAVObjHandle obj, uint16_t instId)
* @param[in] file File to read from * @param[in] file File to read from
* @return The handle of the object loaded or NULL if a failure * @return The handle of the object loaded or NULL if a failure
*/ */
UAVObjHandle UAVObjLoadFromFile(FILEINFO* file) UAVObjHandle UAVObjLoadFromFile(FILEINFO * file)
{ {
#if defined(PIOS_INCLUDE_SDCARD) #if defined(PIOS_INCLUDE_SDCARD)
uint32_t bytesRead; uint32_t bytesRead;
ObjectList* objEntry; ObjectList *objEntry;
ObjectInstList* instEntry; ObjectInstList *instEntry;
uint32_t objId; uint32_t objId;
uint16_t instId; uint16_t instId;
UAVObjHandle obj; UAVObjHandle obj;
// Check for file system availability // Check for file system availability
if ( PIOS_SDCARD_IsMounted() == 0 ) if (PIOS_SDCARD_IsMounted() == 0) {
{ return NULL;
return NULL; }
} // Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Lock // Read the object ID
xSemaphoreTakeRecursive(mutex, portMAX_DELAY); if (PIOS_FREAD(file, &objId, sizeof(objId), &bytesRead)) {
xSemaphoreGiveRecursive(mutex);
return NULL;
}
// Get the object
obj = UAVObjGetByID(objId);
if (obj == 0) {
xSemaphoreGiveRecursive(mutex);
return NULL;
}
objEntry = (ObjectList *) obj;
// Read the object ID // Get the instance ID
if ( PIOS_FREAD(file,&objId,sizeof(objId),&bytesRead) ) instId = 0;
{ if (!objEntry->isSingleInstance) {
xSemaphoreGiveRecursive(mutex); if (PIOS_FREAD
return NULL; (file, &instId, sizeof(instId), &bytesRead)) {
} xSemaphoreGiveRecursive(mutex);
return NULL;
}
}
// Get the instance information
instEntry = getInstance(objEntry, instId);
// Get the object // If the instance does not exist create it and any other instances before it
obj = UAVObjGetByID(objId); if (instEntry == NULL) {
if ( obj == 0 ) instEntry = createInstance(objEntry, instId);
{ if (instEntry == NULL) {
xSemaphoreGiveRecursive(mutex); // Error, unlock and return
return NULL; xSemaphoreGiveRecursive(mutex);
} return NULL;
objEntry = (ObjectList*)obj; }
}
// Read the instance data
if (PIOS_FREAD
(file, instEntry->data, objEntry->numBytes, &bytesRead)) {
xSemaphoreGiveRecursive(mutex);
return NULL;
}
// Fire event
sendEvent(objEntry, instId, EV_UNPACKED);
// Get the instance ID // Unlock
instId = 0; xSemaphoreGiveRecursive(mutex);
if ( !objEntry->isSingleInstance ) return obj;
{
if ( PIOS_FREAD(file,&instId,sizeof(instId),&bytesRead) )
{
xSemaphoreGiveRecursive(mutex);
return NULL;
}
}
// Get the instance information
instEntry = getInstance(objEntry, instId);
// If the instance does not exist create it and any other instances before it
if ( instEntry == NULL )
{
instEntry = createInstance(objEntry, instId);
if ( instEntry == NULL )
{
// Error, unlock and return
xSemaphoreGiveRecursive(mutex);
return NULL;
}
}
// Read the instance data
if ( PIOS_FREAD(file,instEntry->data,objEntry->numBytes,&bytesRead) )
{
xSemaphoreGiveRecursive(mutex);
return NULL;
}
// Fire event
sendEvent(objEntry, instId, EV_UNPACKED);
// Unlock
xSemaphoreGiveRecursive(mutex);
return obj;
#else /* PIOS_INCLUDE_SDCARD */ #else /* PIOS_INCLUDE_SDCARD */
return NULL; return NULL;
#endif #endif
} }
@ -745,87 +705,70 @@ UAVObjHandle UAVObjLoadFromFile(FILEINFO* file)
int32_t UAVObjLoad(UAVObjHandle obj, uint16_t instId) int32_t UAVObjLoad(UAVObjHandle obj, uint16_t instId)
{ {
#if defined(PIOS_INCLUDE_FLASH_SECTOR_SETTINGS) #if defined(PIOS_INCLUDE_FLASH_SECTOR_SETTINGS)
ObjectList* objEntry = (ObjectList*)obj; ObjectList *objEntry = (ObjectList *) obj;
if(objEntry == NULL) if (objEntry == NULL)
return -1; return -1;
ObjectInstList* instEntry = getInstance(objEntry, instId); ObjectInstList *instEntry = getInstance(objEntry, instId);
if(instEntry == NULL) if (instEntry == NULL)
return -1; return -1;
if(instEntry->data == NULL) if (instEntry->data == NULL)
return -1; return -1;
struct fileHeader header; // Fire event on success
uint32_t addr = (objEntry->id & FLASH_MASK); if (PIOS_FLASHFS_ObjLoad(obj, instId, instEntry->data) == 0)
sendEvent(objEntry, instId, EV_UNPACKED);
PIOS_Flash_W25X_ReadData(addr, (uint8_t *) &header, sizeof(header)); else
return -1;
if(header.id != objEntry->id)
return -1;
// Read the instance data
if (PIOS_Flash_W25X_ReadData(addr + sizeof(header) ,instEntry->data, objEntry->numBytes) != 0)
return -1;
// Fire event
sendEvent(objEntry, instId, EV_UNPACKED);
#endif #endif
#if defined(PIOS_INCLUDE_SDCARD) #if defined(PIOS_INCLUDE_SDCARD)
FILEINFO file; FILEINFO file;
ObjectList* objEntry; ObjectList *objEntry;
UAVObjHandle loadedObj; UAVObjHandle loadedObj;
ObjectList* loadedObjEntry; ObjectList *loadedObjEntry;
uint8_t filename[14]; uint8_t filename[14];
// Check for file system availability // Check for file system availability
if ( PIOS_SDCARD_IsMounted() == 0 ) if (PIOS_SDCARD_IsMounted() == 0) {
{ return -1;
return -1; }
} // Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Lock // Cast to object
xSemaphoreTakeRecursive(mutex, portMAX_DELAY); objEntry = (ObjectList *) obj;
// Cast to object // Get filename
objEntry = (ObjectList*)obj; objectFilename(objEntry, filename);
// Get filename // Open file
objectFilename(objEntry, filename); if (PIOS_FOPEN_READ(filename, file)) {
xSemaphoreGiveRecursive(mutex);
// Open file return -1;
if ( PIOS_FOPEN_READ(filename,file) ) }
{ // Load object
xSemaphoreGiveRecursive(mutex); loadedObj = UAVObjLoadFromFile(&file);
return -1; if (loadedObj == 0) {
} PIOS_FCLOSE(file);
xSemaphoreGiveRecursive(mutex);
// Load object return -1;
loadedObj = UAVObjLoadFromFile(&file); }
if (loadedObj == 0) // Check that the IDs match
{ loadedObjEntry = (ObjectList *) loadedObj;
PIOS_FCLOSE(file); if (loadedObjEntry->id != objEntry->id) {
xSemaphoreGiveRecursive(mutex); PIOS_FCLOSE(file);
return -1; xSemaphoreGiveRecursive(mutex);
} return -1;
}
// Check that the IDs match // Done, close file and unlock
loadedObjEntry = (ObjectList*)loadedObj; PIOS_FCLOSE(file);
if ( loadedObjEntry->id != objEntry->id ) xSemaphoreGiveRecursive(mutex);
{
PIOS_FCLOSE(file);
xSemaphoreGiveRecursive(mutex);
return -1;
}
// Done, close file and unlock
PIOS_FCLOSE(file);
xSemaphoreGiveRecursive(mutex);
#endif /* PIOS_INCLUDE_SDCARD */ #endif /* PIOS_INCLUDE_SDCARD */
return 0; return 0;
} }
/** /**
@ -837,40 +780,32 @@ int32_t UAVObjLoad(UAVObjHandle obj, uint16_t instId)
int32_t UAVObjDelete(UAVObjHandle obj, uint16_t instId) int32_t UAVObjDelete(UAVObjHandle obj, uint16_t instId)
{ {
#if defined(PIOS_INCLUDE_FLASH_SECTOR_SETTINGS) #if defined(PIOS_INCLUDE_FLASH_SECTOR_SETTINGS)
ObjectList* objEntry = (ObjectList*)obj; PIOS_FLASHFS_ObjDelete(obj, instId);
if(objEntry == NULL)
return -1;
uint32_t addr = (objEntry->id & FLASH_MASK);
PIOS_Flash_W25X_EraseSector(addr);
#endif #endif
#if defined(PIOS_INCLUDE_SDCARD) #if defined(PIOS_INCLUDE_SDCARD)
ObjectList* objEntry; ObjectList *objEntry;
uint8_t filename[14]; uint8_t filename[14];
// Check for file system availability // Check for file system availability
if ( PIOS_SDCARD_IsMounted() == 0 ) if (PIOS_SDCARD_IsMounted() == 0) {
{ return -1;
return -1; }
} // Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Lock // Cast to object
xSemaphoreTakeRecursive(mutex, portMAX_DELAY); objEntry = (ObjectList *) obj;
// Cast to object // Get filename
objEntry = (ObjectList*)obj; objectFilename(objEntry, filename);
// Get filename // Delete file
objectFilename(objEntry, filename); PIOS_FUNLINK(filename);
// Delete file // Done
PIOS_FUNLINK(filename); xSemaphoreGiveRecursive(mutex);
// Done
xSemaphoreGiveRecursive(mutex);
#endif /* PIOS_INCLUDE_SDCARD */ #endif /* PIOS_INCLUDE_SDCARD */
return 0; return 0;
} }
/** /**
@ -879,29 +814,27 @@ int32_t UAVObjDelete(UAVObjHandle obj, uint16_t instId)
*/ */
int32_t UAVObjSaveSettings() int32_t UAVObjSaveSettings()
{ {
ObjectList* objEntry; ObjectList *objEntry;
// Get lock // Get lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY); xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Save all settings objects // Save all settings objects
LL_FOREACH(objList, objEntry) LL_FOREACH(objList, objEntry) {
{ // Check if this is a settings object
// Check if this is a settings object if (objEntry->isSettings) {
if ( objEntry->isSettings ) // Save object
{ if (UAVObjSave((UAVObjHandle) objEntry, 0) ==
// Save object -1) {
if ( UAVObjSave( (UAVObjHandle)objEntry, 0 ) == -1 ) xSemaphoreGiveRecursive(mutex);
{ return -1;
xSemaphoreGiveRecursive(mutex); }
return -1; }
} }
}
}
// Done // Done
xSemaphoreGiveRecursive(mutex); xSemaphoreGiveRecursive(mutex);
return 0; return 0;
} }
/** /**
@ -910,29 +843,27 @@ int32_t UAVObjSaveSettings()
*/ */
int32_t UAVObjLoadSettings() int32_t UAVObjLoadSettings()
{ {
ObjectList* objEntry; ObjectList *objEntry;
// Get lock // Get lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY); xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Load all settings objects // Load all settings objects
LL_FOREACH(objList, objEntry) LL_FOREACH(objList, objEntry) {
{ // Check if this is a settings object
// Check if this is a settings object if (objEntry->isSettings) {
if ( objEntry->isSettings ) // Load object
{ if (UAVObjLoad((UAVObjHandle) objEntry, 0) ==
// Load object -1) {
if ( UAVObjLoad( (UAVObjHandle)objEntry, 0 ) == -1 ) xSemaphoreGiveRecursive(mutex);
{ return -1;
xSemaphoreGiveRecursive(mutex); }
return -1; }
} }
}
}
// Done // Done
xSemaphoreGiveRecursive(mutex); xSemaphoreGiveRecursive(mutex);
return 0; return 0;
} }
/** /**
@ -941,29 +872,27 @@ int32_t UAVObjLoadSettings()
*/ */
int32_t UAVObjDeleteSettings() int32_t UAVObjDeleteSettings()
{ {
ObjectList* objEntry; ObjectList *objEntry;
// Get lock // Get lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY); xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Save all settings objects // Save all settings objects
LL_FOREACH(objList, objEntry) LL_FOREACH(objList, objEntry) {
{ // Check if this is a settings object
// Check if this is a settings object if (objEntry->isSettings) {
if ( objEntry->isSettings ) // Save object
{ if (UAVObjDelete((UAVObjHandle) objEntry, 0)
// Save object == -1) {
if ( UAVObjDelete( (UAVObjHandle)objEntry, 0 ) == -1 ) xSemaphoreGiveRecursive(mutex);
{ return -1;
xSemaphoreGiveRecursive(mutex); }
return -1; }
} }
}
}
// Done // Done
xSemaphoreGiveRecursive(mutex); xSemaphoreGiveRecursive(mutex);
return 0; return 0;
} }
/** /**
@ -972,29 +901,27 @@ int32_t UAVObjDeleteSettings()
*/ */
int32_t UAVObjSaveMetaobjects() int32_t UAVObjSaveMetaobjects()
{ {
ObjectList* objEntry; ObjectList *objEntry;
// Get lock // Get lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY); xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Save all settings objects // Save all settings objects
LL_FOREACH(objList, objEntry) LL_FOREACH(objList, objEntry) {
{ // Check if this is a settings object
// Check if this is a settings object if (objEntry->isMetaobject) {
if ( objEntry->isMetaobject ) // Save object
{ if (UAVObjSave((UAVObjHandle) objEntry, 0) ==
// Save object -1) {
if ( UAVObjSave( (UAVObjHandle)objEntry, 0 ) == -1 ) xSemaphoreGiveRecursive(mutex);
{ return -1;
xSemaphoreGiveRecursive(mutex); }
return -1; }
} }
}
}
// Done // Done
xSemaphoreGiveRecursive(mutex); xSemaphoreGiveRecursive(mutex);
return 0; return 0;
} }
/** /**
@ -1003,29 +930,27 @@ int32_t UAVObjSaveMetaobjects()
*/ */
int32_t UAVObjLoadMetaobjects() int32_t UAVObjLoadMetaobjects()
{ {
ObjectList* objEntry; ObjectList *objEntry;
// Get lock // Get lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY); xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Load all settings objects // Load all settings objects
LL_FOREACH(objList, objEntry) LL_FOREACH(objList, objEntry) {
{ // Check if this is a settings object
// Check if this is a settings object if (objEntry->isMetaobject) {
if ( objEntry->isMetaobject ) // Load object
{ if (UAVObjLoad((UAVObjHandle) objEntry, 0) ==
// Load object -1) {
if ( UAVObjLoad( (UAVObjHandle)objEntry, 0 ) == -1 ) xSemaphoreGiveRecursive(mutex);
{ return -1;
xSemaphoreGiveRecursive(mutex); }
return -1; }
} }
}
}
// Done // Done
xSemaphoreGiveRecursive(mutex); xSemaphoreGiveRecursive(mutex);
return 0; return 0;
} }
/** /**
@ -1034,29 +959,27 @@ int32_t UAVObjLoadMetaobjects()
*/ */
int32_t UAVObjDeleteMetaobjects() int32_t UAVObjDeleteMetaobjects()
{ {
ObjectList* objEntry; ObjectList *objEntry;
// Get lock // Get lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY); xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Load all settings objects // Load all settings objects
LL_FOREACH(objList, objEntry) LL_FOREACH(objList, objEntry) {
{ // Check if this is a settings object
// Check if this is a settings object if (objEntry->isMetaobject) {
if ( objEntry->isMetaobject ) // Load object
{ if (UAVObjDelete((UAVObjHandle) objEntry, 0)
// Load object == -1) {
if ( UAVObjDelete( (UAVObjHandle)objEntry, 0 ) == -1 ) xSemaphoreGiveRecursive(mutex);
{ return -1;
xSemaphoreGiveRecursive(mutex); }
return -1; }
} }
}
}
// Done // Done
xSemaphoreGiveRecursive(mutex); xSemaphoreGiveRecursive(mutex);
return 0; return 0;
} }
/** /**
@ -1065,9 +988,9 @@ int32_t UAVObjDeleteMetaobjects()
* \param[in] dataIn The object's data structure * \param[in] dataIn The object's data structure
* \return 0 if success or -1 if failure * \return 0 if success or -1 if failure
*/ */
int32_t UAVObjSetData(UAVObjHandle obj, const void* dataIn) int32_t UAVObjSetData(UAVObjHandle obj, const void *dataIn)
{ {
return UAVObjSetInstanceData(obj, 0, dataIn); return UAVObjSetInstanceData(obj, 0, dataIn);
} }
/** /**
@ -1076,9 +999,9 @@ int32_t UAVObjSetData(UAVObjHandle obj, const void* dataIn)
* \param[out] dataOut The object's data structure * \param[out] dataOut The object's data structure
* \return 0 if success or -1 if failure * \return 0 if success or -1 if failure
*/ */
int32_t UAVObjGetData(UAVObjHandle obj, void* dataOut) int32_t UAVObjGetData(UAVObjHandle obj, void *dataOut)
{ {
return UAVObjGetInstanceData(obj, 0, dataOut); return UAVObjGetInstanceData(obj, 0, dataOut);
} }
/** /**
@ -1088,47 +1011,45 @@ int32_t UAVObjGetData(UAVObjHandle obj, void* dataOut)
* \param[in] dataIn The object's data structure * \param[in] dataIn The object's data structure
* \return 0 if success or -1 if failure * \return 0 if success or -1 if failure
*/ */
int32_t UAVObjSetInstanceData(UAVObjHandle obj, uint16_t instId, const void* dataIn) int32_t UAVObjSetInstanceData(UAVObjHandle obj, uint16_t instId,
const void *dataIn)
{ {
ObjectList* objEntry; ObjectList *objEntry;
ObjectInstList* instEntry; ObjectInstList *instEntry;
UAVObjMetadata* mdata; UAVObjMetadata *mdata;
// Lock // Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY); xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Cast to object info // Cast to object info
objEntry = (ObjectList*)obj; objEntry = (ObjectList *) obj;
// Check access level // Check access level
if ( !objEntry->isMetaobject ) if (!objEntry->isMetaobject) {
{ mdata =
mdata = (UAVObjMetadata*)(objEntry->linkedObj->instances.data); (UAVObjMetadata *) (objEntry->linkedObj->instances.
if ( mdata->access == ACCESS_READONLY ) data);
{ if (mdata->access == ACCESS_READONLY) {
xSemaphoreGiveRecursive(mutex); xSemaphoreGiveRecursive(mutex);
return -1; return -1;
} }
} }
// Get instance information
instEntry = getInstance(objEntry, instId);
if (instEntry == NULL) {
// Error, unlock and return
xSemaphoreGiveRecursive(mutex);
return -1;
}
// Set data
memcpy(instEntry->data, dataIn, objEntry->numBytes);
// Get instance information // Fire event
instEntry = getInstance(objEntry, instId); sendEvent(objEntry, instId, EV_UPDATED);
if ( instEntry == NULL )
{
// Error, unlock and return
xSemaphoreGiveRecursive(mutex);
return -1;
}
// Set data // Unlock
memcpy(instEntry->data, dataIn, objEntry->numBytes); xSemaphoreGiveRecursive(mutex);
return 0;
// Fire event
sendEvent(objEntry, instId, EV_UPDATED);
// Unlock
xSemaphoreGiveRecursive(mutex);
return 0;
} }
/** /**
@ -1138,32 +1059,31 @@ int32_t UAVObjSetInstanceData(UAVObjHandle obj, uint16_t instId, const void* dat
* \param[out] dataOut The object's data structure * \param[out] dataOut The object's data structure
* \return 0 if success or -1 if failure * \return 0 if success or -1 if failure
*/ */
int32_t UAVObjGetInstanceData(UAVObjHandle obj, uint16_t instId, void* dataOut) int32_t UAVObjGetInstanceData(UAVObjHandle obj, uint16_t instId,
void *dataOut)
{ {
ObjectList* objEntry; ObjectList *objEntry;
ObjectInstList* instEntry; ObjectInstList *instEntry;
// Lock // Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY); xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Cast to object info // Cast to object info
objEntry = (ObjectList*)obj; objEntry = (ObjectList *) obj;
// Get instance information // Get instance information
instEntry = getInstance(objEntry, instId); instEntry = getInstance(objEntry, instId);
if ( instEntry == NULL ) if (instEntry == NULL) {
{ // Error, unlock and return
// Error, unlock and return xSemaphoreGiveRecursive(mutex);
xSemaphoreGiveRecursive(mutex); return -1;
return -1; }
} // Set data
memcpy(dataOut, instEntry->data, objEntry->numBytes);
// Set data // Unlock
memcpy(dataOut, instEntry->data, objEntry->numBytes); xSemaphoreGiveRecursive(mutex);
return 0;
// Unlock
xSemaphoreGiveRecursive(mutex);
return 0;
} }
/** /**
@ -1172,27 +1092,25 @@ int32_t UAVObjGetInstanceData(UAVObjHandle obj, uint16_t instId, void* dataOut)
* \param[in] dataIn The object's metadata structure * \param[in] dataIn The object's metadata structure
* \return 0 if success or -1 if failure * \return 0 if success or -1 if failure
*/ */
int32_t UAVObjSetMetadata(UAVObjHandle obj, const UAVObjMetadata* dataIn) int32_t UAVObjSetMetadata(UAVObjHandle obj, const UAVObjMetadata * dataIn)
{ {
ObjectList* objEntry; ObjectList *objEntry;
// Lock // Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY); xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Set metadata (metadata of metaobjects can not be modified) // Set metadata (metadata of metaobjects can not be modified)
objEntry = (ObjectList*)obj; objEntry = (ObjectList *) obj;
if (!objEntry->isMetaobject) if (!objEntry->isMetaobject) {
{ UAVObjSetData((UAVObjHandle) objEntry->linkedObj,
UAVObjSetData((UAVObjHandle)objEntry->linkedObj, dataIn); dataIn);
} } else {
else return -1;
{ }
return -1;
}
// Unlock // Unlock
xSemaphoreGiveRecursive(mutex); xSemaphoreGiveRecursive(mutex);
return 0; return 0;
} }
/** /**
@ -1201,27 +1119,25 @@ int32_t UAVObjSetMetadata(UAVObjHandle obj, const UAVObjMetadata* dataIn)
* \param[out] dataOut The object's metadata structure * \param[out] dataOut The object's metadata structure
* \return 0 if success or -1 if failure * \return 0 if success or -1 if failure
*/ */
int32_t UAVObjGetMetadata(UAVObjHandle obj, UAVObjMetadata* dataOut) int32_t UAVObjGetMetadata(UAVObjHandle obj, UAVObjMetadata * dataOut)
{ {
ObjectList* objEntry; ObjectList *objEntry;
// Lock // Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY); xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Get metadata // Get metadata
objEntry = (ObjectList*)obj; objEntry = (ObjectList *) obj;
if (objEntry->isMetaobject) if (objEntry->isMetaobject) {
{ memcpy(dataOut, &defMetadata, sizeof(UAVObjMetadata));
memcpy(dataOut, &defMetadata, sizeof(UAVObjMetadata)); } else {
} UAVObjGetData((UAVObjHandle) objEntry->linkedObj,
else dataOut);
{ }
UAVObjGetData((UAVObjHandle)objEntry->linkedObj, dataOut);
}
// Unlock // Unlock
xSemaphoreGiveRecursive(mutex); xSemaphoreGiveRecursive(mutex);
return 0; return 0;
} }
/** /**
@ -1234,19 +1150,20 @@ int32_t UAVObjGetMetadata(UAVObjHandle obj, UAVObjMetadata* dataOut)
*/ */
int8_t UAVObjReadOnly(UAVObjHandle obj) int8_t UAVObjReadOnly(UAVObjHandle obj)
{ {
ObjectList* objEntry; ObjectList *objEntry;
UAVObjMetadata* mdata; UAVObjMetadata *mdata;
// Cast to object info // Cast to object info
objEntry = (ObjectList*)obj; objEntry = (ObjectList *) obj;
// Check access level // Check access level
if ( !objEntry->isMetaobject ) if (!objEntry->isMetaobject) {
{ mdata =
mdata = (UAVObjMetadata*)(objEntry->linkedObj->instances.data); (UAVObjMetadata *) (objEntry->linkedObj->instances.
return mdata->access == ACCESS_READONLY; data);
} return mdata->access == ACCESS_READONLY;
return -1; }
return -1;
} }
/** /**
@ -1257,13 +1174,14 @@ int8_t UAVObjReadOnly(UAVObjHandle obj)
* \param[in] eventMask The event mask, if EV_MASK_ALL then all events are enabled (e.g. EV_UPDATED | EV_UPDATED_MANUAL) * \param[in] eventMask The event mask, if EV_MASK_ALL then all events are enabled (e.g. EV_UPDATED | EV_UPDATED_MANUAL)
* \return 0 if success or -1 if failure * \return 0 if success or -1 if failure
*/ */
int32_t UAVObjConnectQueue(UAVObjHandle obj, xQueueHandle queue, int32_t eventMask) int32_t UAVObjConnectQueue(UAVObjHandle obj, xQueueHandle queue,
int32_t eventMask)
{ {
int32_t res; int32_t res;
xSemaphoreTakeRecursive(mutex, portMAX_DELAY); xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
res = connectObj(obj, queue, 0, eventMask); res = connectObj(obj, queue, 0, eventMask);
xSemaphoreGiveRecursive(mutex); xSemaphoreGiveRecursive(mutex);
return res; return res;
} }
/** /**
@ -1274,11 +1192,11 @@ int32_t UAVObjConnectQueue(UAVObjHandle obj, xQueueHandle queue, int32_t eventMa
*/ */
int32_t UAVObjDisconnectQueue(UAVObjHandle obj, xQueueHandle queue) int32_t UAVObjDisconnectQueue(UAVObjHandle obj, xQueueHandle queue)
{ {
int32_t res; int32_t res;
xSemaphoreTakeRecursive(mutex, portMAX_DELAY); xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
res = disconnectObj(obj, queue, 0); res = disconnectObj(obj, queue, 0);
xSemaphoreGiveRecursive(mutex); xSemaphoreGiveRecursive(mutex);
return res; return res;
} }
/** /**
@ -1289,13 +1207,14 @@ int32_t UAVObjDisconnectQueue(UAVObjHandle obj, xQueueHandle queue)
* \param[in] eventMask The event mask, if EV_MASK_ALL then all events are enabled (e.g. EV_UPDATED | EV_UPDATED_MANUAL) * \param[in] eventMask The event mask, if EV_MASK_ALL then all events are enabled (e.g. EV_UPDATED | EV_UPDATED_MANUAL)
* \return 0 if success or -1 if failure * \return 0 if success or -1 if failure
*/ */
int32_t UAVObjConnectCallback(UAVObjHandle obj, UAVObjEventCallback cb, int32_t eventMask) int32_t UAVObjConnectCallback(UAVObjHandle obj, UAVObjEventCallback cb,
int32_t eventMask)
{ {
int32_t res; int32_t res;
xSemaphoreTakeRecursive(mutex, portMAX_DELAY); xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
res = connectObj(obj, 0, cb, eventMask); res = connectObj(obj, 0, cb, eventMask);
xSemaphoreGiveRecursive(mutex); xSemaphoreGiveRecursive(mutex);
return res; return res;
} }
/** /**
@ -1306,14 +1225,13 @@ int32_t UAVObjConnectCallback(UAVObjHandle obj, UAVObjEventCallback cb, int32_t
*/ */
int32_t UAVObjDisconnectCallback(UAVObjHandle obj, UAVObjEventCallback cb) int32_t UAVObjDisconnectCallback(UAVObjHandle obj, UAVObjEventCallback cb)
{ {
int32_t res; int32_t res;
xSemaphoreTakeRecursive(mutex, portMAX_DELAY); xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
res = disconnectObj(obj, 0, cb); res = disconnectObj(obj, 0, cb);
xSemaphoreGiveRecursive(mutex); xSemaphoreGiveRecursive(mutex);
return res; return res;
} }
/** /**
* Request an update of the object's data from the GCS. The call will not wait for the response, a EV_UPDATED event * Request an update of the object's data from the GCS. The call will not wait for the response, a EV_UPDATED event
* will be generated as soon as the object is updated. * will be generated as soon as the object is updated.
@ -1321,7 +1239,7 @@ int32_t UAVObjDisconnectCallback(UAVObjHandle obj, UAVObjEventCallback cb)
*/ */
void UAVObjRequestUpdate(UAVObjHandle obj) void UAVObjRequestUpdate(UAVObjHandle obj)
{ {
UAVObjRequestInstanceUpdate(obj, UAVOBJ_ALL_INSTANCES); UAVObjRequestInstanceUpdate(obj, UAVOBJ_ALL_INSTANCES);
} }
/** /**
@ -1332,9 +1250,9 @@ void UAVObjRequestUpdate(UAVObjHandle obj)
*/ */
void UAVObjRequestInstanceUpdate(UAVObjHandle obj, uint16_t instId) void UAVObjRequestInstanceUpdate(UAVObjHandle obj, uint16_t instId)
{ {
xSemaphoreTakeRecursive(mutex, portMAX_DELAY); xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
sendEvent((ObjectList*)obj, instId, EV_UPDATE_REQ); sendEvent((ObjectList *) obj, instId, EV_UPDATE_REQ);
xSemaphoreGiveRecursive(mutex); xSemaphoreGiveRecursive(mutex);
} }
/** /**
@ -1343,7 +1261,7 @@ void UAVObjRequestInstanceUpdate(UAVObjHandle obj, uint16_t instId)
*/ */
void UAVObjUpdated(UAVObjHandle obj) void UAVObjUpdated(UAVObjHandle obj)
{ {
UAVObjInstanceUpdated(obj, UAVOBJ_ALL_INSTANCES); UAVObjInstanceUpdated(obj, UAVOBJ_ALL_INSTANCES);
} }
/** /**
@ -1353,9 +1271,9 @@ void UAVObjUpdated(UAVObjHandle obj)
*/ */
void UAVObjInstanceUpdated(UAVObjHandle obj, uint16_t instId) void UAVObjInstanceUpdated(UAVObjHandle obj, uint16_t instId)
{ {
xSemaphoreTakeRecursive(mutex, portMAX_DELAY); xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
sendEvent((ObjectList*)obj, instId, EV_UPDATED_MANUAL); sendEvent((ObjectList *) obj, instId, EV_UPDATED_MANUAL);
xSemaphoreGiveRecursive(mutex); xSemaphoreGiveRecursive(mutex);
} }
/** /**
@ -1363,143 +1281,133 @@ void UAVObjInstanceUpdated(UAVObjHandle obj, uint16_t instId)
* \param iterator This function will be called once for each object, * \param iterator This function will be called once for each object,
* the object will be passed as a parameter * the object will be passed as a parameter
*/ */
void UAVObjIterate(void (*iterator)(UAVObjHandle obj)) void UAVObjIterate(void (*iterator) (UAVObjHandle obj))
{ {
ObjectList* objEntry; ObjectList *objEntry;
// Get lock // Get lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY); xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Iterate through the list and invoke iterator for each object // Iterate through the list and invoke iterator for each object
LL_FOREACH(objList, objEntry) LL_FOREACH(objList, objEntry) {
{ (*iterator) ((UAVObjHandle) objEntry);
(*iterator)((UAVObjHandle)objEntry); }
}
// Release lock // Release lock
xSemaphoreGiveRecursive(mutex); xSemaphoreGiveRecursive(mutex);
} }
/** /**
* Send an event to all event queues registered on the object. * Send an event to all event queues registered on the object.
*/ */
static int32_t sendEvent(ObjectList* obj, uint16_t instId, UAVObjEventType event) static int32_t sendEvent(ObjectList * obj, uint16_t instId,
UAVObjEventType event)
{ {
ObjectEventList* eventEntry; ObjectEventList *eventEntry;
UAVObjEvent msg; UAVObjEvent msg;
// Setup event // Setup event
msg.obj = (UAVObjHandle)obj; msg.obj = (UAVObjHandle) obj;
msg.event = event; msg.event = event;
msg.instId = instId; msg.instId = instId;
// Go through each object and push the event message in the queue (if event is activated for the queue) // Go through each object and push the event message in the queue (if event is activated for the queue)
LL_FOREACH(obj->events, eventEntry) LL_FOREACH(obj->events, eventEntry) {
{ if (eventEntry->eventMask == 0
if ( eventEntry->eventMask == 0 || (eventEntry->eventMask & event) != 0 ) || (eventEntry->eventMask & event) != 0) {
{ // Send to queue if a valid queue is registered
// Send to queue if a valid queue is registered if (eventEntry->queue != 0) {
if (eventEntry->queue != 0) if (xQueueSend(eventEntry->queue, &msg, 0) != pdTRUE) // will not block
{ {
if ( xQueueSend(eventEntry->queue, &msg, 0) != pdTRUE ) // will not block ++stats.eventErrors;
{ }
++stats.eventErrors; }
} // Invoke callback (from event task) if a valid one is registered
} if (eventEntry->cb != 0) {
// Invoke callback (from event task) if a valid one is registered if (EventCallbackDispatch(&msg, eventEntry->cb) != pdTRUE) // invoke callback from the event task, will not block
if (eventEntry->cb != 0) {
{ ++stats.eventErrors;
if ( EventCallbackDispatch(&msg, eventEntry->cb) != pdTRUE ) // invoke callback from the event task, will not block }
{ }
++stats.eventErrors; }
} }
}
}
}
// Done // Done
return 0; return 0;
} }
/** /**
* Create a new object instance, return the instance info or NULL if failure. * Create a new object instance, return the instance info or NULL if failure.
*/ */
static ObjectInstList* createInstance(ObjectList* obj, uint16_t instId) static ObjectInstList *createInstance(ObjectList * obj, uint16_t instId)
{ {
ObjectInstList* instEntry; ObjectInstList *instEntry;
int32_t n; int32_t n;
// For single instance objects, only instance zero is allowed // For single instance objects, only instance zero is allowed
if (obj->isSingleInstance && instId != 0) if (obj->isSingleInstance && instId != 0) {
{ return NULL;
return NULL; }
} // Make sure that the instance ID is within limits
if (instId >= UAVOBJ_MAX_INSTANCES) {
return NULL;
}
// Check if the instance already exists
if (getInstance(obj, instId) != NULL) {
return NULL;
}
// Create any missing instances (all instance IDs must be sequential)
for (n = obj->numInstances; n < instId; ++n) {
if (createInstance(obj, n) == NULL) {
return NULL;
}
}
// Make sure that the instance ID is within limits if (instId == 0) { /* Instance 0 ObjectInstList allocated with ObjectList element */
if (instId >= UAVOBJ_MAX_INSTANCES) instEntry = &obj->instances;
{ instEntry->data = pvPortMalloc(obj->numBytes);
return NULL; if (instEntry->data == NULL)
} return NULL;
memset(instEntry->data, 0, obj->numBytes);
instEntry->instId = instId;
} else {
// Create the actual instance
instEntry =
(ObjectInstList *)
pvPortMalloc(sizeof(ObjectInstList));
if (instEntry == NULL)
return NULL;
instEntry->data = pvPortMalloc(obj->numBytes);
if (instEntry->data == NULL)
return NULL;
memset(instEntry->data, 0, obj->numBytes);
instEntry->instId = instId;
LL_APPEND(obj->instances.next, instEntry);
}
++obj->numInstances;
// Check if the instance already exists // Fire event
if ( getInstance(obj, instId) != NULL ) UAVObjInstanceUpdated((UAVObjHandle) obj, instId);
{
return NULL;
}
// Create any missing instances (all instance IDs must be sequential) // Done
for (n = obj->numInstances; n < instId; ++n) return instEntry;
{
if ( createInstance(obj, n) == NULL )
{
return NULL;
}
}
if(instId == 0) /* Instance 0 ObjectInstList allocated with ObjectList element */
{
instEntry = &obj->instances;
instEntry->data = pvPortMalloc(obj->numBytes);
if (instEntry->data == NULL) return NULL;
memset(instEntry->data, 0, obj->numBytes);
instEntry->instId = instId;
} else
{
// Create the actual instance
instEntry = (ObjectInstList*)pvPortMalloc(sizeof(ObjectInstList));
if (instEntry == NULL) return NULL;
instEntry->data = pvPortMalloc(obj->numBytes);
if (instEntry->data == NULL) return NULL;
memset(instEntry->data, 0, obj->numBytes);
instEntry->instId = instId;
LL_APPEND(obj->instances.next, instEntry);
}
++obj->numInstances;
// Fire event
UAVObjInstanceUpdated((UAVObjHandle)obj, instId);
// Done
return instEntry;
} }
/** /**
* Get the instance information or NULL if the instance does not exist * Get the instance information or NULL if the instance does not exist
*/ */
static ObjectInstList* getInstance(ObjectList* obj, uint16_t instId) static ObjectInstList *getInstance(ObjectList * obj, uint16_t instId)
{ {
ObjectInstList* instEntry; ObjectInstList *instEntry;
// Look for specified instance ID // Look for specified instance ID
LL_FOREACH(&(obj->instances), instEntry) LL_FOREACH(&(obj->instances), instEntry) {
{ if (instEntry->instId == instId) {
if (instEntry->instId == instId) return instEntry;
{ }
return instEntry; }
} // If this point is reached then instance id was not found
} return NULL;
// If this point is reached then instance id was not found
return NULL;
} }
/** /**
@ -1510,36 +1418,35 @@ static ObjectInstList* getInstance(ObjectList* obj, uint16_t instId)
* \param[in] eventMask The event mask, if EV_MASK_ALL then all events are enabled (e.g. EV_UPDATED | EV_UPDATED_MANUAL) * \param[in] eventMask The event mask, if EV_MASK_ALL then all events are enabled (e.g. EV_UPDATED | EV_UPDATED_MANUAL)
* \return 0 if success or -1 if failure * \return 0 if success or -1 if failure
*/ */
static int32_t connectObj(UAVObjHandle obj, xQueueHandle queue, UAVObjEventCallback cb, int32_t eventMask) static int32_t connectObj(UAVObjHandle obj, xQueueHandle queue,
UAVObjEventCallback cb, int32_t eventMask)
{ {
ObjectEventList* eventEntry; ObjectEventList *eventEntry;
ObjectList* objEntry; ObjectList *objEntry;
// Check that the queue is not already connected, if it is simply update event mask // Check that the queue is not already connected, if it is simply update event mask
objEntry = (ObjectList*)obj; objEntry = (ObjectList *) obj;
LL_FOREACH(objEntry->events, eventEntry) LL_FOREACH(objEntry->events, eventEntry) {
{ if (eventEntry->queue == queue && eventEntry->cb == cb) {
if ( eventEntry->queue == queue && eventEntry->cb == cb ) // Already connected, update event mask and return
{ eventEntry->eventMask = eventMask;
// Already connected, update event mask and return return 0;
eventEntry->eventMask = eventMask; }
return 0; }
}
}
// Add queue to list // Add queue to list
eventEntry = (ObjectEventList*)pvPortMalloc(sizeof(ObjectEventList)); eventEntry =
if (eventEntry == NULL) (ObjectEventList *) pvPortMalloc(sizeof(ObjectEventList));
{ if (eventEntry == NULL) {
return -1; return -1;
} }
eventEntry->queue = queue; eventEntry->queue = queue;
eventEntry->cb = cb; eventEntry->cb = cb;
eventEntry->eventMask = eventMask; eventEntry->eventMask = eventMask;
LL_APPEND(objEntry->events, eventEntry); LL_APPEND(objEntry->events, eventEntry);
// Done // Done
return 0; return 0;
} }
/** /**
@ -1549,59 +1456,43 @@ static int32_t connectObj(UAVObjHandle obj, xQueueHandle queue, UAVObjEventCallb
* \param[in] cb The event callback * \param[in] cb The event callback
* \return 0 if success or -1 if failure * \return 0 if success or -1 if failure
*/ */
static int32_t disconnectObj(UAVObjHandle obj, xQueueHandle queue, UAVObjEventCallback cb) static int32_t disconnectObj(UAVObjHandle obj, xQueueHandle queue,
UAVObjEventCallback cb)
{ {
ObjectEventList* eventEntry; ObjectEventList *eventEntry;
ObjectList* objEntry; ObjectList *objEntry;
// Find queue and remove it // Find queue and remove it
objEntry = (ObjectList*)obj; objEntry = (ObjectList *) obj;
LL_FOREACH(objEntry->events, eventEntry) LL_FOREACH(objEntry->events, eventEntry) {
{ if ((eventEntry->queue == queue
if ( ( eventEntry->queue == queue && eventEntry->cb == cb ) ) && eventEntry->cb == cb)) {
{ LL_DELETE(objEntry->events, eventEntry);
LL_DELETE(objEntry->events, eventEntry); vPortFree(eventEntry);
vPortFree(eventEntry); return 0;
return 0; }
} }
}
// If this point is reached the queue was not found // If this point is reached the queue was not found
return -1; return -1;
} }
#if defined(PIOS_INCLUDE_SDCARD) #if defined(PIOS_INCLUDE_SDCARD)
/** /**
* Wrapper for the sprintf function * Wrapper for the sprintf function
*/ */
static void customSPrintf(uint8_t* buffer, uint8_t* format, ...) static void customSPrintf(uint8_t * buffer, uint8_t * format, ...)
{ {
va_list args; va_list args;
va_start(args, format); va_start(args, format);
vsprintf((char *)buffer, (char *)format, args); vsprintf((char *)buffer, (char *)format, args);
} }
/** /**
* Get an 8 character (plus extension) filename for the object. * Get an 8 character (plus extension) filename for the object.
*/ */
static void objectFilename(ObjectList* obj, uint8_t* filename) static void objectFilename(ObjectList * obj, uint8_t * filename)
{ {
customSPrintf(filename, (uint8_t*)"%X.obj", obj->id); customSPrintf(filename, (uint8_t *) "%X.obj", obj->id);
} }
#endif /* PIOS_INCLUDE_SDCARD */ #endif /* PIOS_INCLUDE_SDCARD */

View File

@ -21,6 +21,7 @@ alert
altitude altitude
amps amps
aquired aquired
armed
autonomous flight autonomous flight
battery battery
camera camera
@ -32,8 +33,10 @@ complete
connected connected
connection connection
control control
coptercontrol
critical critical
disabled disabled
disarmed
disconnected disconnected
feet feet
figure eight figure eight
@ -58,11 +61,13 @@ lost
low altitude low altitude
low battery low battery
low gps quality low gps quality
magic
manual flight manual flight
maxium maxium
meters meters
minimum minimum
mode mode
moved
MPH MPH
navigation navigation
OpenPilot OpenPilot
@ -122,8 +127,4 @@ hundread
thousand thousand
Upto: OpenPilot
critical
battery
point

View File

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>400</width> <width>415</width>
<height>343</height> <height>349</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -142,18 +142,6 @@
</widget> </widget>
</widget> </widget>
</item> </item>
<item>
<widget class="QCheckBox" name="zeroGyroBiasOnArming">
<property name="toolTip">
<string>If enabled, a fast recalibration of gyro zero point will be done
whenever the frame is armed. Do not move the airframe while
arming it in that case!</string>
</property>
<property name="text">
<string>Zero gyro bias upon airframe arming</string>
</property>
</widget>
</item>
<item> <item>
<widget class="QGroupBox" name="groupBox"> <widget class="QGroupBox" name="groupBox">
<property name="sizePolicy"> <property name="sizePolicy">
@ -171,86 +159,98 @@ arming it in that case!</string>
<property name="title"> <property name="title">
<string>Attitude Calibration</string> <string>Attitude Calibration</string>
</property> </property>
<widget class="QWidget" name="verticalLayoutWidget"> <layout class="QVBoxLayout" name="verticalLayout_2">
<property name="geometry"> <item>
<rect> <layout class="QVBoxLayout" name="verticalLayout_3">
<x>0</x> <property name="margin">
<y>20</y> <number>3</number>
<width>371</width> </property>
<height>111</height> <item>
</rect> <widget class="QLabel" name="label">
</property> <property name="text">
<layout class="QVBoxLayout" name="verticalLayout_3"> <string>Place aircraft flat before computing</string>
<property name="margin"> </property>
<number>3</number> </widget>
</property> </item>
<item> <item>
<widget class="QLabel" name="label"> <layout class="QHBoxLayout" name="horizontalLayout_3">
<property name="text"> <item>
<string>Place aircraft flat before computing</string> <spacer name="horizontalSpacer_3">
</property> <property name="orientation">
</widget> <enum>Qt::Horizontal</enum>
</item> </property>
<item> <property name="sizeHint" stdset="0">
<layout class="QHBoxLayout" name="horizontalLayout_3"> <size>
<item> <width>40</width>
<spacer name="horizontalSpacer_3"> <height>20</height>
<property name="orientation"> </size>
<enum>Qt::Horizontal</enum> </property>
</property> </spacer>
<property name="sizeHint" stdset="0"> </item>
<size> <item>
<width>40</width> <widget class="QLabel" name="status">
<height>20</height> <property name="text">
</size> <string>Click &quot;Zero Accel Bias&quot; to start</string>
</property> </property>
</spacer> </widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="status"> <spacer name="horizontalSpacer_2">
<property name="text"> <property name="orientation">
<string>Click &quot;Zero Accel Bias&quot; to start</string> <enum>Qt::Horizontal</enum>
</property> </property>
</widget> <property name="sizeHint" stdset="0">
</item> <size>
<item> <width>40</width>
<spacer name="horizontalSpacer_2"> <height>20</height>
<property name="orientation"> </size>
<enum>Qt::Horizontal</enum> </property>
</property> </spacer>
<property name="sizeHint" stdset="0"> </item>
<size> </layout>
<width>40</width> </item>
<height>20</height> <item>
</size> <layout class="QHBoxLayout" name="horizontalLayout">
</property> <property name="spacing">
</spacer> <number>6</number>
</item> </property>
</layout> <property name="margin">
</item> <number>4</number>
<item> </property>
<layout class="QHBoxLayout" name="horizontalLayout"> <item>
<item> <widget class="QPushButton" name="zeroBias">
<widget class="QPushButton" name="zeroBias"> <property name="toolTip">
<property name="toolTip"> <string>Launch horizontal calibration.</string>
<string>Launch horizontal calibration.</string> </property>
</property> <property name="text">
<property name="text"> <string>Zero Accel Bias</string>
<string>Zero Accel Bias</string> </property>
</property> </widget>
</widget> </item>
</item> <item>
<item> <widget class="QProgressBar" name="zeroBiasProgress">
<widget class="QProgressBar" name="zeroBiasProgress"> <property name="value">
<property name="value"> <number>0</number>
<number>0</number> </property>
</property> </widget>
</widget> </item>
</item> </layout>
</layout> </item>
</item> </layout>
</layout> </item>
</widget> </layout>
</widget>
</item>
<item>
<widget class="QCheckBox" name="zeroGyroBiasOnArming">
<property name="toolTip">
<string>If enabled, a fast recalibration of gyro zero point will be done
whenever the frame is armed. Do not move the airframe while
arming it in that case!</string>
</property>
<property name="text">
<string>Zero gyro bias upon airframe arming</string>
</property>
</widget> </widget>
</item> </item>
<item> <item>

View File

@ -265,10 +265,27 @@ void ConfigOutputWidget::runChannelTests(bool state)
mdata.gcsTelemetryAcked = false; mdata.gcsTelemetryAcked = false;
mdata.gcsTelemetryUpdateMode = UAVObject::UPDATEMODE_ONCHANGE; mdata.gcsTelemetryUpdateMode = UAVObject::UPDATEMODE_ONCHANGE;
mdata.gcsTelemetryUpdatePeriod = 100; mdata.gcsTelemetryUpdatePeriod = 100;
// Prevent stupid users from touching the minimum & maximum ranges while
// moving the sliders. Thanks Ivan for the tip :)
foreach (QSpinBox* box, outMin) {
box->setEnabled(false);
}
foreach (QSpinBox* box, outMax) {
box->setEnabled(false);
}
} }
else else
{ {
mdata = accInitialData; // Restore metadata mdata = accInitialData; // Restore metadata
foreach (QSpinBox* box, outMin) {
box->setEnabled(true);
}
foreach (QSpinBox* box, outMax) {
box->setEnabled(true);
}
} }
obj->setMetadata(mdata); obj->setMetadata(mdata);

View File

@ -7,7 +7,7 @@ Workspace1=Flight data
Icon1=:/core/images/ah.png Icon1=:/core/images/ah.png
Workspace2=Configuration Workspace2=Configuration
Icon2=:/core/images/config.png Icon2=:/core/images/config.png
Workspace3=Large Map Workspace3=Flight Planner
Icon3=:/core/images/world.png Icon3=:/core/images/world.png
Workspace4=Scopes Workspace4=Scopes
Icon4=:/core/images/scopes.png Icon4=:/core/images/scopes.png
@ -42,17 +42,125 @@ Mode1\splitter\side0\side0\type=splitter
Mode1\splitter\side0\side0\splitterOrientation=1 Mode1\splitter\side0\side0\splitterOrientation=1
Mode1\splitter\side0\side0\splitterSizes=144, 608 Mode1\splitter\side0\side0\splitterSizes=144, 608
Mode1\splitter\side0\side0\side0\type=splitter Mode1\splitter\side0\side0\side0\type=splitter
Mode1\splitter\side0\side0\side0\splitterOrientation=2
Mode1\splitter\side0\side0\side0\splitterSizes=215, 237
Mode1\splitter\side0\side0\side0\side0\type=splitter
Mode1\splitter\side0\side0\side0\side0\splitterOrientation=2
Mode1\splitter\side0\side0\side0\side0\splitterSizes=@Invalid()
Mode1\splitter\side0\side0\side0\side0\side0\type=uavGadget
Mode1\splitter\side0\side0\side0\side0\side0\classId=LineardialGadget
Mode1\splitter\side0\side0\side0\side0\side0\gadget\activeConfiguration=Flight Time
Mode1\splitter\side0\side0\side0\side0\side1\type=uavGadget
Mode1\splitter\side0\side0\side0\side0\side1\classId=LineardialGadget
Mode1\splitter\side0\side0\side0\side0\side1\gadget\activeConfiguration=GPS Sats
Mode1\splitter\side0\side0\side0\side1\type=splitter
Mode1\splitter\side0\side0\side0\side1\splitterOrientation=2
Mode1\splitter\side0\side0\side0\side1\splitterSizes=@Invalid()
Mode1\splitter\side0\side0\side0\side1\side0\type=uavGadget
Mode1\splitter\side0\side0\side0\side1\side0\classId=LineardialGadget
Mode1\splitter\side0\side0\side0\side1\side0\gadget\activeConfiguration=Flight mode
Mode1\splitter\side0\side0\side0\side1\side1\type=uavGadget
Mode1\splitter\side0\side0\side0\side1\side1\classId=LineardialGadget
Mode1\splitter\side0\side0\side0\side1\side1\gadget\activeConfiguration=Arm Status
Mode1\splitter\side0\side0\side1\type=uavGadget Mode1\splitter\side0\side0\side1\type=uavGadget
Mode1\splitter\side0\side0\side1\classId=PFDGadget
Mode1\splitter\side0\side0\side1\gadget\activeConfiguration=raw
Mode1\splitter\side0\side1\type=splitter Mode1\splitter\side0\side1\type=splitter
Mode1\splitter\side0\side1\splitterOrientation=1
Mode1\splitter\side0\side1\splitterSizes=304, 433
Mode1\splitter\side0\side1\side0\type=uavGadget
Mode1\splitter\side0\side1\side0\classId=ModelViewGadget
Mode1\splitter\side0\side1\side0\gadget\activeConfiguration=Test Quad X
Mode1\splitter\side0\side1\side1\type=splitter
Mode1\splitter\side0\side1\side1\splitterOrientation=2
Mode1\splitter\side0\side1\side1\splitterSizes=293, 64
Mode1\splitter\side0\side1\side1\side0\type=splitter
Mode1\splitter\side0\side1\side1\side0\splitterOrientation=1
Mode1\splitter\side0\side1\side1\side0\splitterSizes=291, 141
Mode1\splitter\side0\side1\side1\side0\side0\type=uavGadget
Mode1\splitter\side0\side1\side1\side0\side0\classId=SystemHealthGadget
Mode1\splitter\side0\side1\side1\side0\side0\gadget\activeConfiguration=default
Mode1\splitter\side0\side1\side1\side0\side1\type=splitter
Mode1\splitter\side0\side1\side1\side0\side1\splitterOrientation=1
Mode1\splitter\side0\side1\side1\side0\side1\splitterSizes=64, 64
Mode1\splitter\side0\side1\side1\side0\side1\side0\type=uavGadget
Mode1\splitter\side0\side1\side1\side0\side1\side0\classId=LineardialGadget
Mode1\splitter\side0\side1\side1\side0\side1\side0\gadget\activeConfiguration=Mainboard CPU
Mode1\splitter\side0\side1\side1\side0\side1\side1\type=uavGadget
Mode1\splitter\side0\side1\side1\side0\side1\side1\classId=LineardialGadget
Mode1\splitter\side0\side1\side1\side0\side1\side1\gadget\activeConfiguration=AHRS CPU
Mode1\splitter\side0\side1\side1\side1\type=splitter
Mode1\splitter\side0\side1\side1\side1\splitterOrientation=1
Mode1\splitter\side0\side1\side1\side1\splitterSizes=@Invalid()
Mode1\splitter\side0\side1\side1\side1\side0\type=uavGadget
Mode1\splitter\side0\side1\side1\side1\side0\classId=LineardialGadget
Mode1\splitter\side0\side1\side1\side1\side0\gadget\activeConfiguration=Telemetry RX Rate Horizontal
Mode1\splitter\side0\side1\side1\side1\side1\type=uavGadget
Mode1\splitter\side0\side1\side1\side1\side1\classId=LineardialGadget
Mode1\splitter\side0\side1\side1\side1\side1\gadget\activeConfiguration=Telemetry TX Rate Horizontal
Mode1\splitter\side1\type=splitter Mode1\splitter\side1\type=splitter
Mode1\splitter\side1\splitterOrientation=2 Mode1\splitter\side1\splitterOrientation=2
Mode1\splitter\side1\splitterSizes=492, 288 Mode1\splitter\side1\splitterSizes=492, 288
Mode1\splitter\side1\side0\type=uavGadget Mode1\splitter\side1\side0\type=uavGadget
Mode1\splitter\side1\side0\classId=OPMapGadget
Mode1\splitter\side1\side0\gadget\activeConfiguration=Google Sat
Mode1\splitter\side1\side1\type=splitter Mode1\splitter\side1\side1\type=splitter
Mode1\splitter\side1\side1\splitterOrientation=1 Mode1\splitter\side1\side1\splitterOrientation=1
Mode1\splitter\side1\side1\splitterSizes=441, 259 Mode1\splitter\side1\side1\splitterSizes=441, 259
Mode1\splitter\side1\side1\side0\type=splitter Mode1\splitter\side1\side1\side0\type=splitter
Mode1\splitter\side1\side1\side0\splitterOrientation=1
Mode1\splitter\side1\side1\side0\splitterSizes=277, 135
Mode1\splitter\side1\side1\side0\side0\type=splitter
Mode1\splitter\side1\side1\side0\side0\splitterOrientation=1
Mode1\splitter\side1\side1\side0\side0\splitterSizes=131, 138
Mode1\splitter\side1\side1\side0\side0\side0\type=splitter
Mode1\splitter\side1\side1\side0\side0\side0\splitterOrientation=2
Mode1\splitter\side1\side1\side0\side0\side0\splitterSizes=@Invalid()
Mode1\splitter\side1\side1\side0\side0\side0\side0\type=uavGadget
Mode1\splitter\side1\side1\side0\side0\side0\side0\classId=DialGadget
Mode1\splitter\side1\side1\side0\side0\side0\side0\gadget\activeConfiguration=Deluxe Groundspeed kph
Mode1\splitter\side1\side1\side0\side0\side0\side1\type=uavGadget
Mode1\splitter\side1\side1\side0\side0\side0\side1\classId=DialGadget
Mode1\splitter\side1\side1\side0\side0\side0\side1\gadget\activeConfiguration=Deluxe Barometer
Mode1\splitter\side1\side1\side0\side0\side1\type=splitter
Mode1\splitter\side1\side1\side0\side0\side1\splitterOrientation=2
Mode1\splitter\side1\side1\side0\side0\side1\splitterSizes=@Invalid()
Mode1\splitter\side1\side1\side0\side0\side1\side0\type=uavGadget
Mode1\splitter\side1\side1\side0\side0\side1\side0\classId=DialGadget
Mode1\splitter\side1\side1\side0\side0\side1\side0\gadget\activeConfiguration=Deluxe Attitude
Mode1\splitter\side1\side1\side0\side0\side1\side1\type=uavGadget
Mode1\splitter\side1\side1\side0\side0\side1\side1\classId=DialGadget
Mode1\splitter\side1\side1\side0\side0\side1\side1\gadget\activeConfiguration=Deluxe Compass
Mode1\splitter\side1\side1\side0\side1\type=splitter
Mode1\splitter\side1\side1\side0\side1\splitterOrientation=2
Mode1\splitter\side1\side1\side0\side1\splitterSizes=@Invalid()
Mode1\splitter\side1\side1\side0\side1\side0\type=uavGadget
Mode1\splitter\side1\side1\side0\side1\side0\classId=DialGadget
Mode1\splitter\side1\side1\side0\side1\side0\gadget\activeConfiguration=Deluxe Baro Altimeter
Mode1\splitter\side1\side1\side0\side1\side1\type=uavGadget
Mode1\splitter\side1\side1\side0\side1\side1\classId=DialGadget
Mode1\splitter\side1\side1\side0\side1\side1\gadget\activeConfiguration=Deluxe Climbrate
Mode1\splitter\side1\side1\side1\type=splitter Mode1\splitter\side1\side1\side1\type=splitter
Mode1\splitter\side1\side1\side1\splitterOrientation=1
Mode1\splitter\side1\side1\side1\splitterSizes=64, 441
Mode1\splitter\side1\side1\side1\side0\type=uavGadget
Mode1\splitter\side1\side1\side1\side0\classId=LineardialGadget
Mode1\splitter\side1\side1\side1\side0\gadget\activeConfiguration=Throttle
Mode1\splitter\side1\side1\side1\side1\type=splitter
Mode1\splitter\side1\side1\side1\side1\splitterOrientation=1
Mode1\splitter\side1\side1\side1\side1\splitterSizes=64, 376
Mode1\splitter\side1\side1\side1\side1\side0\type=uavGadget
Mode1\splitter\side1\side1\side1\side1\side0\classId=LineardialGadget
Mode1\splitter\side1\side1\side1\side1\side0\gadget\activeConfiguration=Roll Desired
Mode1\splitter\side1\side1\side1\side1\side1\type=splitter
Mode1\splitter\side1\side1\side1\side1\side1\splitterOrientation=1
Mode1\splitter\side1\side1\side1\side1\side1\splitterSizes=64, 311
Mode1\splitter\side1\side1\side1\side1\side1\side0\type=uavGadget
Mode1\splitter\side1\side1\side1\side1\side1\side0\classId=LineardialGadget
Mode1\splitter\side1\side1\side1\side1\side1\side0\gadget\activeConfiguration=Pitch Desired
Mode1\splitter\side1\side1\side1\side1\side1\side1\type=uavGadget
Mode1\splitter\side1\side1\side1\side1\side1\side1\classId=LineardialGadget
Mode1\splitter\side1\side1\side1\side1\side1\side1\gadget\activeConfiguration=Yaw Desired
Mode2\version=UAVGadgetManagerV1 Mode2\version=UAVGadgetManagerV1
Mode2\showToolbars=false Mode2\showToolbars=false
Mode2\splitter\type=splitter Mode2\splitter\type=splitter
@ -75,7 +183,7 @@ Mode2\splitter\side0\side1\side1\classId=LineardialGadget
Mode2\splitter\side0\side1\side1\gadget\activeConfiguration=Telemetry TX Rate Horizontal Mode2\splitter\side0\side1\side1\gadget\activeConfiguration=Telemetry TX Rate Horizontal
Mode2\splitter\side1\type=splitter Mode2\splitter\side1\type=splitter
Mode2\splitter\side1\splitterOrientation=2 Mode2\splitter\side1\splitterOrientation=2
Mode2\splitter\side1\splitterSizes=433, 347 Mode2\splitter\side1\splitterSizes=426, 354
Mode2\splitter\side1\side0\type=uavGadget Mode2\splitter\side1\side0\type=uavGadget
Mode2\splitter\side1\side0\classId=UAVObjectBrowser Mode2\splitter\side1\side0\classId=UAVObjectBrowser
Mode2\splitter\side1\side0\gadget\activeConfiguration=default Mode2\splitter\side1\side0\gadget\activeConfiguration=default
@ -111,11 +219,28 @@ Mode4\splitter\type=splitter
Mode4\splitter\splitterOrientation=1 Mode4\splitter\splitterOrientation=1
Mode4\splitter\splitterSizes=653, 660 Mode4\splitter\splitterSizes=653, 660
Mode4\splitter\side0\type=splitter Mode4\splitter\side0\type=splitter
Mode4\splitter\side0\splitterOrientation=2
Mode4\splitter\side0\splitterSizes=@Invalid()
Mode4\splitter\side0\side0\type=uavGadget
Mode4\splitter\side0\side0\classId=ScopeGadget
Mode4\splitter\side0\side0\gadget\activeConfiguration=Accel
Mode4\splitter\side0\side1\type=uavGadget
Mode4\splitter\side0\side1\classId=ScopeGadget
Mode4\splitter\side0\side1\gadget\activeConfiguration=Raw Gyros
Mode4\splitter\side1\type=splitter Mode4\splitter\side1\type=splitter
Mode4\splitter\side1\splitterOrientation=2 Mode4\splitter\side1\splitterOrientation=2
Mode4\splitter\side1\splitterSizes=661, 119 Mode4\splitter\side1\splitterSizes=661, 119
Mode4\splitter\side1\side0\type=splitter Mode4\splitter\side1\side0\type=splitter
Mode4\splitter\side1\side0\splitterOrientation=2
Mode4\splitter\side1\side0\splitterSizes=390, 270
Mode4\splitter\side1\side0\side0\type=uavGadget
Mode4\splitter\side1\side0\side0\classId=ScopeGadget
Mode4\splitter\side1\side0\side0\gadget\activeConfiguration=Attitude
Mode4\splitter\side1\side0\side1\type=uavGadget
Mode4\splitter\side1\side0\side1\classId=ScopeGadget
Mode4\splitter\side1\side0\side1\gadget\activeConfiguration=Uptimes
Mode4\splitter\side1\side1\type=uavGadget Mode4\splitter\side1\side1\type=uavGadget
Mode4\splitter\side1\side1\classId=LoggingGadget
Mode5\version=UAVGadgetManagerV1 Mode5\version=UAVGadgetManagerV1
Mode5\showToolbars=false Mode5\showToolbars=false
Mode5\splitter\type=splitter Mode5\splitter\type=splitter
@ -141,144 +266,19 @@ Mode5\splitter\side0\side1\side1\side0\splitterOrientation=1
Mode5\splitter\side0\side1\side1\side0\splitterSizes=@Invalid() Mode5\splitter\side0\side1\side1\side0\splitterSizes=@Invalid()
Mode5\splitter\side0\side1\side1\side0\side0\type=uavGadget Mode5\splitter\side0\side1\side1\side0\side0\type=uavGadget
Mode5\splitter\side0\side1\side1\side0\side0\classId=LineardialGadget Mode5\splitter\side0\side1\side1\side0\side0\classId=LineardialGadget
Mode5\splitter\side0\side1\side1\side0\side0\gadget\activeConfiguration=PitchDesired Mode5\splitter\side0\side1\side1\side0\side0\gadget\activeConfiguration=Pitch Desired
Mode5\splitter\side0\side1\side1\side0\side1\type=uavGadget Mode5\splitter\side0\side1\side1\side0\side1\type=uavGadget
Mode5\splitter\side0\side1\side1\side0\side1\classId=LineardialGadget Mode5\splitter\side0\side1\side1\side0\side1\classId=LineardialGadget
Mode5\splitter\side0\side1\side1\side0\side1\gadget\activeConfiguration=PitchActual Mode5\splitter\side0\side1\side1\side0\side1\gadget\activeConfiguration=PitchActual
Mode5\splitter\side0\side1\side1\side1\type=uavGadget Mode5\splitter\side0\side1\side1\side1\type=uavGadget
Mode5\splitter\side0\side1\side1\side1\classId=LineardialGadget Mode5\splitter\side0\side1\side1\side1\classId=LineardialGadget
Mode5\splitter\side0\side1\side1\side1\gadget\activeConfiguration=PitchCommand Mode5\splitter\side0\side1\side1\side1\gadget\activeConfiguration=Pitch
Mode5\splitter\side1\type=uavGadget Mode5\splitter\side1\type=uavGadget
Mode5\splitter\side1\classId=UAVObjectBrowser Mode5\splitter\side1\classId=UAVObjectBrowser
Mode5\splitter\side1\gadget\activeConfiguration=default Mode5\splitter\side1\gadget\activeConfiguration=default
Mode1\splitter\side0\side0\side0\splitterOrientation=2
Mode1\splitter\side0\side0\side0\splitterSizes=215, 237
Mode1\splitter\side0\side0\side0\side0\type=splitter
Mode1\splitter\side0\side0\side0\side1\type=splitter
Mode1\splitter\side0\side0\side0\side1\splitterOrientation=2
Mode1\splitter\side0\side0\side0\side1\splitterSizes=@Invalid()
Mode1\splitter\side0\side0\side0\side1\side0\type=uavGadget
Mode1\splitter\side0\side0\side0\side1\side0\classId=LineardialGadget
Mode1\splitter\side0\side0\side0\side1\side0\gadget\activeConfiguration=Flight mode
Mode1\splitter\side0\side0\side0\side1\side1\type=uavGadget
Mode1\splitter\side0\side0\side0\side1\side1\classId=LineardialGadget
Mode1\splitter\side0\side0\side0\side1\side1\gadget\activeConfiguration=Arm Status
Mode1\splitter\side1\side0\classId=OPMapGadget
Mode1\splitter\side1\side0\gadget\activeConfiguration=Google Sat
Mode1\splitter\side1\side1\side0\splitterOrientation=1
Mode1\splitter\side1\side1\side0\splitterSizes=277, 135
Mode1\splitter\side1\side1\side0\side0\type=splitter
Mode1\splitter\side1\side1\side0\side1\type=splitter
Mode1\splitter\side0\side1\splitterOrientation=1
Mode1\splitter\side0\side1\splitterSizes=304, 433
Mode1\splitter\side0\side1\side0\type=uavGadget
Mode1\splitter\side0\side1\side1\type=splitter
Mode1\splitter\side0\side1\side1\splitterOrientation=2
Mode1\splitter\side0\side1\side1\splitterSizes=293, 64
Mode1\splitter\side0\side1\side1\side0\type=splitter
Mode1\splitter\side0\side1\side1\side1\type=splitter
Mode1\splitter\side1\side1\side0\side0\splitterOrientation=1
Mode1\splitter\side1\side1\side0\side0\splitterSizes=131, 138
Mode1\splitter\side1\side1\side0\side0\side0\type=splitter
Mode1\splitter\side1\side1\side0\side0\side1\type=splitter
Mode1\splitter\side0\side1\side0\classId=ModelViewGadget
Mode1\splitter\side0\side1\side0\gadget\activeConfiguration=Test Quad X
Mode1\splitter\side0\side1\side1\side0\splitterOrientation=1
Mode1\splitter\side0\side1\side1\side0\splitterSizes=291, 141
Mode1\splitter\side0\side1\side1\side0\side0\type=uavGadget
Mode1\splitter\side0\side1\side1\side0\side0\classId=SystemHealthGadget
Mode1\splitter\side0\side1\side1\side0\side0\gadget\activeConfiguration=default
Mode1\splitter\side0\side1\side1\side0\side1\type=splitter
Mode1\splitter\side0\side1\side1\side1\splitterOrientation=1
Mode1\splitter\side0\side1\side1\side1\splitterSizes=@Invalid()
Mode1\splitter\side0\side1\side1\side1\side0\type=uavGadget
Mode1\splitter\side0\side1\side1\side1\side0\classId=LineardialGadget
Mode1\splitter\side0\side1\side1\side1\side0\gadget\activeConfiguration=Telemetry RX Rate Horizontal
Mode1\splitter\side0\side1\side1\side1\side1\type=uavGadget
Mode1\splitter\side0\side1\side1\side1\side1\classId=LineardialGadget
Mode1\splitter\side0\side1\side1\side1\side1\gadget\activeConfiguration=Telemetry TX Rate Horizontal
Mode1\splitter\side0\side1\side1\side0\side1\splitterOrientation=1
Mode1\splitter\side0\side1\side1\side0\side1\splitterSizes=64, 64
Mode1\splitter\side0\side1\side1\side0\side1\side0\type=uavGadget
Mode1\splitter\side0\side1\side1\side0\side1\side0\classId=LineardialGadget
Mode1\splitter\side0\side1\side1\side0\side1\side0\gadget\activeConfiguration=Mainboard CPU
Mode1\splitter\side0\side1\side1\side0\side1\side1\type=uavGadget
Mode1\splitter\side0\side1\side1\side0\side1\side1\classId=LineardialGadget
Mode1\splitter\side0\side1\side1\side0\side1\side1\gadget\activeConfiguration=AHRS CPU
Mode1\splitter\side1\side1\side0\side0\side0\splitterOrientation=2
Mode1\splitter\side1\side1\side0\side0\side0\splitterSizes=@Invalid()
Mode1\splitter\side1\side1\side0\side0\side0\side0\type=uavGadget
Mode1\splitter\side1\side1\side0\side0\side0\side0\classId=DialGadget
Mode1\splitter\side1\side1\side0\side0\side0\side0\gadget\activeConfiguration=Deluxe Groundspeed kph
Mode1\splitter\side1\side1\side0\side0\side0\side1\type=uavGadget
Mode1\splitter\side1\side1\side0\side0\side0\side1\classId=DialGadget
Mode1\splitter\side1\side1\side0\side0\side0\side1\gadget\activeConfiguration=Deluxe Barometer
Mode1\splitter\side1\side1\side0\side0\side1\splitterOrientation=2
Mode1\splitter\side1\side1\side0\side0\side1\splitterSizes=@Invalid()
Mode1\splitter\side1\side1\side0\side0\side1\side0\type=uavGadget
Mode1\splitter\side1\side1\side0\side0\side1\side0\classId=DialGadget
Mode1\splitter\side1\side1\side0\side0\side1\side0\gadget\activeConfiguration=Deluxe Attitude
Mode1\splitter\side1\side1\side0\side0\side1\side1\type=uavGadget
Mode1\splitter\side1\side1\side0\side0\side1\side1\classId=DialGadget
Mode1\splitter\side1\side1\side0\side0\side1\side1\gadget\activeConfiguration=Deluxe Compass
Mode1\splitter\side1\side1\side0\side1\splitterOrientation=2
Mode1\splitter\side1\side1\side0\side1\splitterSizes=@Invalid()
Mode1\splitter\side1\side1\side0\side1\side0\type=uavGadget
Mode1\splitter\side1\side1\side0\side1\side0\classId=DialGadget
Mode1\splitter\side1\side1\side0\side1\side0\gadget\activeConfiguration=Deluxe Baro Altimeter
Mode1\splitter\side1\side1\side0\side1\side1\type=uavGadget
Mode1\splitter\side1\side1\side0\side1\side1\classId=DialGadget
Mode1\splitter\side1\side1\side0\side1\side1\gadget\activeConfiguration=Deluxe Climbrate
Mode1\splitter\side0\side0\side0\side0\splitterOrientation=2
Mode1\splitter\side0\side0\side0\side0\splitterSizes=@Invalid()
Mode1\splitter\side0\side0\side0\side0\side0\type=uavGadget
Mode1\splitter\side0\side0\side0\side0\side0\classId=LineardialGadget
Mode1\splitter\side0\side0\side0\side0\side0\gadget\activeConfiguration=Flight Time
Mode1\splitter\side0\side0\side0\side0\side1\type=uavGadget
Mode1\splitter\side0\side0\side0\side0\side1\classId=LineardialGadget
Mode1\splitter\side0\side0\side0\side0\side1\gadget\activeConfiguration=GPS Sats
Mode1\splitter\side0\side0\side1\classId=PFDGadget
Mode1\splitter\side0\side0\side1\gadget\activeConfiguration=raw
Mode1\splitter\side1\side1\side1\splitterOrientation=1
Mode1\splitter\side1\side1\side1\splitterSizes=64, 441
Mode1\splitter\side1\side1\side1\side0\type=uavGadget
Mode1\splitter\side1\side1\side1\side0\classId=LineardialGadget
Mode1\splitter\side1\side1\side1\side0\gadget\activeConfiguration=Throttle
Mode1\splitter\side1\side1\side1\side1\type=splitter
Mode1\splitter\side1\side1\side1\side1\splitterOrientation=1
Mode1\splitter\side1\side1\side1\side1\splitterSizes=64, 376
Mode1\splitter\side1\side1\side1\side1\side0\type=uavGadget
Mode1\splitter\side1\side1\side1\side1\side0\classId=LineardialGadget
Mode1\splitter\side1\side1\side1\side1\side0\gadget\activeConfiguration=Roll
Mode1\splitter\side1\side1\side1\side1\side1\type=splitter
Mode1\splitter\side1\side1\side1\side1\side1\splitterOrientation=1
Mode1\splitter\side1\side1\side1\side1\side1\splitterSizes=64, 311
Mode1\splitter\side1\side1\side1\side1\side1\side0\type=uavGadget
Mode1\splitter\side1\side1\side1\side1\side1\side0\classId=LineardialGadget
Mode1\splitter\side1\side1\side1\side1\side1\side0\gadget\activeConfiguration=PitchActual
Mode1\splitter\side1\side1\side1\side1\side1\side1\type=uavGadget
Mode1\splitter\side1\side1\side1\side1\side1\side1\classId=LineardialGadget
Mode1\splitter\side1\side1\side1\side1\side1\side1\gadget\activeConfiguration=Yaw
Mode6\version=UAVGadgetManagerV1 Mode6\version=UAVGadgetManagerV1
Mode6\showToolbars=false Mode6\showToolbars=false
Mode6\splitter\type=splitter Mode6\splitter\type=splitter
Mode4\splitter\side0\splitterOrientation=2
Mode4\splitter\side0\splitterSizes=@Invalid()
Mode4\splitter\side0\side0\type=uavGadget
Mode4\splitter\side0\side0\classId=ScopeGadget
Mode4\splitter\side0\side0\gadget\activeConfiguration=Accel
Mode4\splitter\side0\side1\type=uavGadget
Mode4\splitter\side0\side1\classId=ScopeGadget
Mode4\splitter\side0\side1\gadget\activeConfiguration=Raw Gyros
Mode4\splitter\side1\side0\splitterOrientation=2
Mode4\splitter\side1\side0\splitterSizes=390, 270
Mode4\splitter\side1\side0\side0\type=uavGadget
Mode4\splitter\side1\side0\side0\classId=ScopeGadget
Mode4\splitter\side1\side0\side0\gadget\activeConfiguration=Attitude
Mode4\splitter\side1\side0\side1\type=uavGadget
Mode4\splitter\side1\side0\side1\classId=ScopeGadget
Mode4\splitter\side1\side0\side1\gadget\activeConfiguration=Uptimes
Mode4\splitter\side1\side1\classId=LoggingGadget
Mode6\splitter\splitterOrientation=1 Mode6\splitter\splitterOrientation=1
Mode6\splitter\splitterSizes=@Invalid() Mode6\splitter\splitterSizes=@Invalid()
Mode6\splitter\side0\type=uavGadget Mode6\splitter\side0\type=uavGadget
@ -288,9 +288,6 @@ Mode6\splitter\side1\type=splitter
Mode6\splitter\side1\splitterOrientation=2 Mode6\splitter\side1\splitterOrientation=2
Mode6\splitter\side1\splitterSizes=274, 506 Mode6\splitter\side1\splitterSizes=274, 506
Mode6\splitter\side1\side0\type=splitter Mode6\splitter\side1\side0\type=splitter
Mode6\splitter\side1\side1\type=uavGadget
Mode6\splitter\side1\side1\classId=ScopeGadget
Mode6\splitter\side1\side1\gadget\activeConfiguration=Uptimes
Mode6\splitter\side1\side0\splitterOrientation=1 Mode6\splitter\side1\side0\splitterOrientation=1
Mode6\splitter\side1\side0\splitterSizes=322, 396 Mode6\splitter\side1\side0\splitterSizes=322, 396
Mode6\splitter\side1\side0\side0\type=uavGadget Mode6\splitter\side1\side0\side0\type=uavGadget
@ -299,17 +296,16 @@ Mode6\splitter\side1\side0\side0\gadget\activeConfiguration=default
Mode6\splitter\side1\side0\side1\type=uavGadget Mode6\splitter\side1\side0\side1\type=uavGadget
Mode6\splitter\side1\side0\side1\classId=PFDGadget Mode6\splitter\side1\side0\side1\classId=PFDGadget
Mode6\splitter\side1\side0\side1\gadget\activeConfiguration=raw Mode6\splitter\side1\side0\side1\gadget\activeConfiguration=raw
Mode6\splitter\side1\side1\type=uavGadget
Mode6\splitter\side1\side1\classId=ScopeGadget
Mode6\splitter\side1\side1\gadget\activeConfiguration=Uptimes
[KeyBindings] [KeyBindings]
size=0 size=0
[%General] [%General]
SaveSettingsOnExit=true
LastPreferenceCategory=OPMapGadget
LastPreferencePage=default
SettingsWindowWidth=697
SettingsWindowHeight=476
OverrideLanguage=en_AU OverrideLanguage=en_AU
SaveSettingsOnExit=true
[UAVGadgetConfigurations] [UAVGadgetConfigurations]
configInfo\version=1.2.0 configInfo\version=1.2.0
@ -340,7 +336,7 @@ DialGadget\Attitude\data\needle3Factor=-1
DialGadget\Attitude\data\needle1Move=Rotate DialGadget\Attitude\data\needle1Move=Rotate
DialGadget\Attitude\data\needle2Move=Vertical DialGadget\Attitude\data\needle2Move=Vertical
DialGadget\Attitude\data\needle3Move=Rotate DialGadget\Attitude\data\needle3Move=Rotate
DialGadget\Attitude\data\font="MS Shell Dlg 2,8.25,-1,5,50,0,0,0,0,0" DialGadget\Attitude\data\font="Ubuntu,11,-1,5,50,0,0,0,0,0"
DialGadget\Attitude\data\useOpenGLFlag=false DialGadget\Attitude\data\useOpenGLFlag=false
DialGadget\Attitude\data\beSmooth=false DialGadget\Attitude\data\beSmooth=false
DialGadget\Attitude\configInfo\version=0.0.0 DialGadget\Attitude\configInfo\version=0.0.0
@ -369,7 +365,7 @@ DialGadget\Baro%20Altimeter\data\needle3Factor=1
DialGadget\Baro%20Altimeter\data\needle1Move=Rotate DialGadget\Baro%20Altimeter\data\needle1Move=Rotate
DialGadget\Baro%20Altimeter\data\needle2Move=Rotate DialGadget\Baro%20Altimeter\data\needle2Move=Rotate
DialGadget\Baro%20Altimeter\data\needle3Move=Rotate DialGadget\Baro%20Altimeter\data\needle3Move=Rotate
DialGadget\Baro%20Altimeter\data\font="MS Shell Dlg 2,8.25,-1,5,50,0,0,0,0,0" DialGadget\Baro%20Altimeter\data\font="Ubuntu,11,-1,5,50,0,0,0,0,0"
DialGadget\Baro%20Altimeter\data\useOpenGLFlag=false DialGadget\Baro%20Altimeter\data\useOpenGLFlag=false
DialGadget\Baro%20Altimeter\data\beSmooth=false DialGadget\Baro%20Altimeter\data\beSmooth=false
DialGadget\Baro%20Altimeter\configInfo\version=0.0.0 DialGadget\Baro%20Altimeter\configInfo\version=0.0.0
@ -398,7 +394,7 @@ DialGadget\Barometer\data\needle3Factor=1
DialGadget\Barometer\data\needle1Move=Rotate DialGadget\Barometer\data\needle1Move=Rotate
DialGadget\Barometer\data\needle2Move=Rotate DialGadget\Barometer\data\needle2Move=Rotate
DialGadget\Barometer\data\needle3Move=Rotate DialGadget\Barometer\data\needle3Move=Rotate
DialGadget\Barometer\data\font="MS Shell Dlg 2,8.25,-1,5,50,0,0,0,0,0" DialGadget\Barometer\data\font="Ubuntu,11,-1,5,50,0,0,0,0,0"
DialGadget\Barometer\data\useOpenGLFlag=false DialGadget\Barometer\data\useOpenGLFlag=false
DialGadget\Barometer\data\beSmooth=false DialGadget\Barometer\data\beSmooth=false
DialGadget\Barometer\configInfo\version=0.0.0 DialGadget\Barometer\configInfo\version=0.0.0
@ -427,7 +423,7 @@ DialGadget\Climbrate\data\needle3Factor=1
DialGadget\Climbrate\data\needle1Move=Rotate DialGadget\Climbrate\data\needle1Move=Rotate
DialGadget\Climbrate\data\needle2Move=Rotate DialGadget\Climbrate\data\needle2Move=Rotate
DialGadget\Climbrate\data\needle3Move=Rotate DialGadget\Climbrate\data\needle3Move=Rotate
DialGadget\Climbrate\data\font="MS Shell Dlg 2,8.25,-1,5,50,0,0,0,0,0" DialGadget\Climbrate\data\font="Ubuntu,11,-1,5,50,0,0,0,0,0"
DialGadget\Climbrate\data\useOpenGLFlag=false DialGadget\Climbrate\data\useOpenGLFlag=false
DialGadget\Climbrate\data\beSmooth=false DialGadget\Climbrate\data\beSmooth=false
DialGadget\Climbrate\configInfo\version=0.0.0 DialGadget\Climbrate\configInfo\version=0.0.0
@ -456,7 +452,7 @@ DialGadget\Compass\data\needle3Factor=1
DialGadget\Compass\data\needle1Move=Rotate DialGadget\Compass\data\needle1Move=Rotate
DialGadget\Compass\data\needle2Move=Rotate DialGadget\Compass\data\needle2Move=Rotate
DialGadget\Compass\data\needle3Move=Rotate DialGadget\Compass\data\needle3Move=Rotate
DialGadget\Compass\data\font="MS Shell Dlg 2,8.25,-1,5,50,0,0,0,0,0" DialGadget\Compass\data\font="Ubuntu,11,-1,5,50,0,0,0,0,0"
DialGadget\Compass\data\useOpenGLFlag=false DialGadget\Compass\data\useOpenGLFlag=false
DialGadget\Compass\data\beSmooth=false DialGadget\Compass\data\beSmooth=false
DialGadget\Compass\configInfo\version=0.0.0 DialGadget\Compass\configInfo\version=0.0.0
@ -485,7 +481,7 @@ DialGadget\Deluxe%20Attitude\data\needle3Factor=-1
DialGadget\Deluxe%20Attitude\data\needle1Move=Rotate DialGadget\Deluxe%20Attitude\data\needle1Move=Rotate
DialGadget\Deluxe%20Attitude\data\needle2Move=Vertical DialGadget\Deluxe%20Attitude\data\needle2Move=Vertical
DialGadget\Deluxe%20Attitude\data\needle3Move=Rotate DialGadget\Deluxe%20Attitude\data\needle3Move=Rotate
DialGadget\Deluxe%20Attitude\data\font="MS Shell Dlg 2,8.25,-1,5,50,0,0,0,0,0" DialGadget\Deluxe%20Attitude\data\font="Ubuntu,11,-1,5,50,0,0,0,0,0"
DialGadget\Deluxe%20Attitude\data\useOpenGLFlag=false DialGadget\Deluxe%20Attitude\data\useOpenGLFlag=false
DialGadget\Deluxe%20Attitude\data\beSmooth=false DialGadget\Deluxe%20Attitude\data\beSmooth=false
DialGadget\Deluxe%20Attitude\configInfo\version=0.0.0 DialGadget\Deluxe%20Attitude\configInfo\version=0.0.0
@ -514,7 +510,7 @@ DialGadget\Deluxe%20Baro%20Altimeter\data\needle3Factor=1
DialGadget\Deluxe%20Baro%20Altimeter\data\needle1Move=Rotate DialGadget\Deluxe%20Baro%20Altimeter\data\needle1Move=Rotate
DialGadget\Deluxe%20Baro%20Altimeter\data\needle2Move=Rotate DialGadget\Deluxe%20Baro%20Altimeter\data\needle2Move=Rotate
DialGadget\Deluxe%20Baro%20Altimeter\data\needle3Move=Rotate DialGadget\Deluxe%20Baro%20Altimeter\data\needle3Move=Rotate
DialGadget\Deluxe%20Baro%20Altimeter\data\font="MS Shell Dlg 2,8.25,-1,5,50,0,0,0,0,0" DialGadget\Deluxe%20Baro%20Altimeter\data\font="Ubuntu,11,-1,5,50,0,0,0,0,0"
DialGadget\Deluxe%20Baro%20Altimeter\data\useOpenGLFlag=false DialGadget\Deluxe%20Baro%20Altimeter\data\useOpenGLFlag=false
DialGadget\Deluxe%20Baro%20Altimeter\data\beSmooth=false DialGadget\Deluxe%20Baro%20Altimeter\data\beSmooth=false
DialGadget\Deluxe%20Baro%20Altimeter\configInfo\version=0.0.0 DialGadget\Deluxe%20Baro%20Altimeter\configInfo\version=0.0.0
@ -543,7 +539,7 @@ DialGadget\Deluxe%20Barometer\data\needle3Factor=1
DialGadget\Deluxe%20Barometer\data\needle1Move=Rotate DialGadget\Deluxe%20Barometer\data\needle1Move=Rotate
DialGadget\Deluxe%20Barometer\data\needle2Move=Rotate DialGadget\Deluxe%20Barometer\data\needle2Move=Rotate
DialGadget\Deluxe%20Barometer\data\needle3Move=Rotate DialGadget\Deluxe%20Barometer\data\needle3Move=Rotate
DialGadget\Deluxe%20Barometer\data\font="MS Shell Dlg 2,8.25,-1,5,50,0,0,0,0,0" DialGadget\Deluxe%20Barometer\data\font="Ubuntu,11,-1,5,50,0,0,0,0,0"
DialGadget\Deluxe%20Barometer\data\useOpenGLFlag=false DialGadget\Deluxe%20Barometer\data\useOpenGLFlag=false
DialGadget\Deluxe%20Barometer\data\beSmooth=false DialGadget\Deluxe%20Barometer\data\beSmooth=false
DialGadget\Deluxe%20Barometer\configInfo\version=0.0.0 DialGadget\Deluxe%20Barometer\configInfo\version=0.0.0
@ -572,7 +568,7 @@ DialGadget\Deluxe%20Climbrate\data\needle3Factor=1
DialGadget\Deluxe%20Climbrate\data\needle1Move=Rotate DialGadget\Deluxe%20Climbrate\data\needle1Move=Rotate
DialGadget\Deluxe%20Climbrate\data\needle2Move=Rotate DialGadget\Deluxe%20Climbrate\data\needle2Move=Rotate
DialGadget\Deluxe%20Climbrate\data\needle3Move=Rotate DialGadget\Deluxe%20Climbrate\data\needle3Move=Rotate
DialGadget\Deluxe%20Climbrate\data\font="MS Shell Dlg 2,8.25,-1,5,50,0,0,0,0,0" DialGadget\Deluxe%20Climbrate\data\font="Ubuntu,11,-1,5,50,0,0,0,0,0"
DialGadget\Deluxe%20Climbrate\data\useOpenGLFlag=false DialGadget\Deluxe%20Climbrate\data\useOpenGLFlag=false
DialGadget\Deluxe%20Climbrate\data\beSmooth=false DialGadget\Deluxe%20Climbrate\data\beSmooth=false
DialGadget\Deluxe%20Climbrate\configInfo\version=0.0.0 DialGadget\Deluxe%20Climbrate\configInfo\version=0.0.0
@ -601,7 +597,7 @@ DialGadget\Deluxe%20Compass\data\needle3Factor=1
DialGadget\Deluxe%20Compass\data\needle1Move=Rotate DialGadget\Deluxe%20Compass\data\needle1Move=Rotate
DialGadget\Deluxe%20Compass\data\needle2Move=Rotate DialGadget\Deluxe%20Compass\data\needle2Move=Rotate
DialGadget\Deluxe%20Compass\data\needle3Move=Rotate DialGadget\Deluxe%20Compass\data\needle3Move=Rotate
DialGadget\Deluxe%20Compass\data\font="MS Shell Dlg 2,8.25,-1,5,50,0,0,0,0,0" DialGadget\Deluxe%20Compass\data\font="Ubuntu,11,-1,5,50,0,0,0,0,0"
DialGadget\Deluxe%20Compass\data\useOpenGLFlag=false DialGadget\Deluxe%20Compass\data\useOpenGLFlag=false
DialGadget\Deluxe%20Compass\data\beSmooth=false DialGadget\Deluxe%20Compass\data\beSmooth=false
DialGadget\Deluxe%20Compass\configInfo\version=0.0.0 DialGadget\Deluxe%20Compass\configInfo\version=0.0.0
@ -630,7 +626,7 @@ DialGadget\Deluxe%20Groundspeed%20kph\data\needle3Factor=1
DialGadget\Deluxe%20Groundspeed%20kph\data\needle1Move=Rotate DialGadget\Deluxe%20Groundspeed%20kph\data\needle1Move=Rotate
DialGadget\Deluxe%20Groundspeed%20kph\data\needle2Move=Rotate DialGadget\Deluxe%20Groundspeed%20kph\data\needle2Move=Rotate
DialGadget\Deluxe%20Groundspeed%20kph\data\needle3Move=Rotate DialGadget\Deluxe%20Groundspeed%20kph\data\needle3Move=Rotate
DialGadget\Deluxe%20Groundspeed%20kph\data\font="MS Shell Dlg 2,8.25,-1,5,50,0,0,0,0,0" DialGadget\Deluxe%20Groundspeed%20kph\data\font="Ubuntu,11,-1,5,50,0,0,0,0,0"
DialGadget\Deluxe%20Groundspeed%20kph\data\useOpenGLFlag=false DialGadget\Deluxe%20Groundspeed%20kph\data\useOpenGLFlag=false
DialGadget\Deluxe%20Groundspeed%20kph\data\beSmooth=false DialGadget\Deluxe%20Groundspeed%20kph\data\beSmooth=false
DialGadget\Deluxe%20Groundspeed%20kph\configInfo\version=0.0.0 DialGadget\Deluxe%20Groundspeed%20kph\configInfo\version=0.0.0
@ -659,7 +655,7 @@ DialGadget\Deluxe%20Temperature\data\needle3Factor=1
DialGadget\Deluxe%20Temperature\data\needle1Move=Rotate DialGadget\Deluxe%20Temperature\data\needle1Move=Rotate
DialGadget\Deluxe%20Temperature\data\needle2Move=Rotate DialGadget\Deluxe%20Temperature\data\needle2Move=Rotate
DialGadget\Deluxe%20Temperature\data\needle3Move=Rotate DialGadget\Deluxe%20Temperature\data\needle3Move=Rotate
DialGadget\Deluxe%20Temperature\data\font="MS Shell Dlg 2,8.25,-1,5,50,0,0,0,0,0" DialGadget\Deluxe%20Temperature\data\font="Ubuntu,11,-1,5,50,0,0,0,0,0"
DialGadget\Deluxe%20Temperature\data\useOpenGLFlag=false DialGadget\Deluxe%20Temperature\data\useOpenGLFlag=false
DialGadget\Deluxe%20Temperature\data\beSmooth=false DialGadget\Deluxe%20Temperature\data\beSmooth=false
DialGadget\Deluxe%20Temperature\configInfo\version=0.0.0 DialGadget\Deluxe%20Temperature\configInfo\version=0.0.0
@ -688,7 +684,7 @@ DialGadget\Deluxe%20Turn%20Coordinator\data\needle3Factor=-1
DialGadget\Deluxe%20Turn%20Coordinator\data\needle1Move=Rotate DialGadget\Deluxe%20Turn%20Coordinator\data\needle1Move=Rotate
DialGadget\Deluxe%20Turn%20Coordinator\data\needle2Move=Horizontal DialGadget\Deluxe%20Turn%20Coordinator\data\needle2Move=Horizontal
DialGadget\Deluxe%20Turn%20Coordinator\data\needle3Move=Rotate DialGadget\Deluxe%20Turn%20Coordinator\data\needle3Move=Rotate
DialGadget\Deluxe%20Turn%20Coordinator\data\font="MS Shell Dlg 2,8.25,-1,5,50,0,0,0,0,0" DialGadget\Deluxe%20Turn%20Coordinator\data\font="Ubuntu,11,-1,5,50,0,0,0,0,0"
DialGadget\Deluxe%20Turn%20Coordinator\data\useOpenGLFlag=false DialGadget\Deluxe%20Turn%20Coordinator\data\useOpenGLFlag=false
DialGadget\Deluxe%20Turn%20Coordinator\data\beSmooth=false DialGadget\Deluxe%20Turn%20Coordinator\data\beSmooth=false
DialGadget\Deluxe%20Turn%20Coordinator\configInfo\version=0.0.0 DialGadget\Deluxe%20Turn%20Coordinator\configInfo\version=0.0.0
@ -717,7 +713,7 @@ DialGadget\Groundspeed%20kph\data\needle3Factor=1
DialGadget\Groundspeed%20kph\data\needle1Move=Rotate DialGadget\Groundspeed%20kph\data\needle1Move=Rotate
DialGadget\Groundspeed%20kph\data\needle2Move=Rotate DialGadget\Groundspeed%20kph\data\needle2Move=Rotate
DialGadget\Groundspeed%20kph\data\needle3Move=Rotate DialGadget\Groundspeed%20kph\data\needle3Move=Rotate
DialGadget\Groundspeed%20kph\data\font="MS Shell Dlg 2,8.25,-1,5,50,0,0,0,0,0" DialGadget\Groundspeed%20kph\data\font="Ubuntu,11,-1,5,50,0,0,0,0,0"
DialGadget\Groundspeed%20kph\data\useOpenGLFlag=false DialGadget\Groundspeed%20kph\data\useOpenGLFlag=false
DialGadget\Groundspeed%20kph\data\beSmooth=false DialGadget\Groundspeed%20kph\data\beSmooth=false
DialGadget\Groundspeed%20kph\configInfo\version=0.0.0 DialGadget\Groundspeed%20kph\configInfo\version=0.0.0
@ -746,7 +742,7 @@ DialGadget\HiContrast%20Attitude\data\needle3Factor=-1
DialGadget\HiContrast%20Attitude\data\needle1Move=Rotate DialGadget\HiContrast%20Attitude\data\needle1Move=Rotate
DialGadget\HiContrast%20Attitude\data\needle2Move=Vertical DialGadget\HiContrast%20Attitude\data\needle2Move=Vertical
DialGadget\HiContrast%20Attitude\data\needle3Move=Rotate DialGadget\HiContrast%20Attitude\data\needle3Move=Rotate
DialGadget\HiContrast%20Attitude\data\font="MS Shell Dlg 2,8.25,-1,5,50,0,0,0,0,0" DialGadget\HiContrast%20Attitude\data\font="Ubuntu,11,-1,5,50,0,0,0,0,0"
DialGadget\HiContrast%20Attitude\data\useOpenGLFlag=false DialGadget\HiContrast%20Attitude\data\useOpenGLFlag=false
DialGadget\HiContrast%20Attitude\data\beSmooth=false DialGadget\HiContrast%20Attitude\data\beSmooth=false
DialGadget\HiContrast%20Attitude\configInfo\version=0.0.0 DialGadget\HiContrast%20Attitude\configInfo\version=0.0.0
@ -775,7 +771,7 @@ DialGadget\HiContrast%20Baro%20Altimeter\data\needle3Factor=1
DialGadget\HiContrast%20Baro%20Altimeter\data\needle1Move=Rotate DialGadget\HiContrast%20Baro%20Altimeter\data\needle1Move=Rotate
DialGadget\HiContrast%20Baro%20Altimeter\data\needle2Move=Rotate DialGadget\HiContrast%20Baro%20Altimeter\data\needle2Move=Rotate
DialGadget\HiContrast%20Baro%20Altimeter\data\needle3Move=Rotate DialGadget\HiContrast%20Baro%20Altimeter\data\needle3Move=Rotate
DialGadget\HiContrast%20Baro%20Altimeter\data\font="MS Shell Dlg 2,8.25,-1,5,50,0,0,0,0,0" DialGadget\HiContrast%20Baro%20Altimeter\data\font="Ubuntu,11,-1,5,50,0,0,0,0,0"
DialGadget\HiContrast%20Baro%20Altimeter\data\useOpenGLFlag=false DialGadget\HiContrast%20Baro%20Altimeter\data\useOpenGLFlag=false
DialGadget\HiContrast%20Baro%20Altimeter\data\beSmooth=false DialGadget\HiContrast%20Baro%20Altimeter\data\beSmooth=false
DialGadget\HiContrast%20Baro%20Altimeter\configInfo\version=0.0.0 DialGadget\HiContrast%20Baro%20Altimeter\configInfo\version=0.0.0
@ -804,7 +800,7 @@ DialGadget\HiContrast%20Barometer\data\needle3Factor=1
DialGadget\HiContrast%20Barometer\data\needle1Move=Rotate DialGadget\HiContrast%20Barometer\data\needle1Move=Rotate
DialGadget\HiContrast%20Barometer\data\needle2Move=Rotate DialGadget\HiContrast%20Barometer\data\needle2Move=Rotate
DialGadget\HiContrast%20Barometer\data\needle3Move=Rotate DialGadget\HiContrast%20Barometer\data\needle3Move=Rotate
DialGadget\HiContrast%20Barometer\data\font="MS Shell Dlg 2,8.25,-1,5,50,0,0,0,0,0" DialGadget\HiContrast%20Barometer\data\font="Ubuntu,11,-1,5,50,0,0,0,0,0"
DialGadget\HiContrast%20Barometer\data\useOpenGLFlag=false DialGadget\HiContrast%20Barometer\data\useOpenGLFlag=false
DialGadget\HiContrast%20Barometer\data\beSmooth=false DialGadget\HiContrast%20Barometer\data\beSmooth=false
DialGadget\HiContrast%20Barometer\configInfo\version=0.0.0 DialGadget\HiContrast%20Barometer\configInfo\version=0.0.0
@ -833,7 +829,7 @@ DialGadget\HiContrast%20Climbrate\data\needle3Factor=1
DialGadget\HiContrast%20Climbrate\data\needle1Move=Rotate DialGadget\HiContrast%20Climbrate\data\needle1Move=Rotate
DialGadget\HiContrast%20Climbrate\data\needle2Move=Rotate DialGadget\HiContrast%20Climbrate\data\needle2Move=Rotate
DialGadget\HiContrast%20Climbrate\data\needle3Move=Rotate DialGadget\HiContrast%20Climbrate\data\needle3Move=Rotate
DialGadget\HiContrast%20Climbrate\data\font="MS Shell Dlg 2,8.25,-1,5,50,0,0,0,0,0" DialGadget\HiContrast%20Climbrate\data\font="Ubuntu,11,-1,5,50,0,0,0,0,0"
DialGadget\HiContrast%20Climbrate\data\useOpenGLFlag=false DialGadget\HiContrast%20Climbrate\data\useOpenGLFlag=false
DialGadget\HiContrast%20Climbrate\data\beSmooth=false DialGadget\HiContrast%20Climbrate\data\beSmooth=false
DialGadget\HiContrast%20Climbrate\configInfo\version=0.0.0 DialGadget\HiContrast%20Climbrate\configInfo\version=0.0.0
@ -862,7 +858,7 @@ DialGadget\HiContrast%20Compass\data\needle3Factor=1
DialGadget\HiContrast%20Compass\data\needle1Move=Rotate DialGadget\HiContrast%20Compass\data\needle1Move=Rotate
DialGadget\HiContrast%20Compass\data\needle2Move=Rotate DialGadget\HiContrast%20Compass\data\needle2Move=Rotate
DialGadget\HiContrast%20Compass\data\needle3Move=Rotate DialGadget\HiContrast%20Compass\data\needle3Move=Rotate
DialGadget\HiContrast%20Compass\data\font="MS Shell Dlg 2,8.25,-1,5,50,0,0,0,0,0" DialGadget\HiContrast%20Compass\data\font="Ubuntu,11,-1,5,50,0,0,0,0,0"
DialGadget\HiContrast%20Compass\data\useOpenGLFlag=false DialGadget\HiContrast%20Compass\data\useOpenGLFlag=false
DialGadget\HiContrast%20Compass\data\beSmooth=false DialGadget\HiContrast%20Compass\data\beSmooth=false
DialGadget\HiContrast%20Compass\configInfo\version=0.0.0 DialGadget\HiContrast%20Compass\configInfo\version=0.0.0
@ -891,7 +887,7 @@ DialGadget\HiContrast%20Groundspeed%20kph\data\needle3Factor=1
DialGadget\HiContrast%20Groundspeed%20kph\data\needle1Move=Rotate DialGadget\HiContrast%20Groundspeed%20kph\data\needle1Move=Rotate
DialGadget\HiContrast%20Groundspeed%20kph\data\needle2Move=Rotate DialGadget\HiContrast%20Groundspeed%20kph\data\needle2Move=Rotate
DialGadget\HiContrast%20Groundspeed%20kph\data\needle3Move=Rotate DialGadget\HiContrast%20Groundspeed%20kph\data\needle3Move=Rotate
DialGadget\HiContrast%20Groundspeed%20kph\data\font="MS Shell Dlg 2,8.25,-1,5,50,0,0,0,0,0" DialGadget\HiContrast%20Groundspeed%20kph\data\font="Ubuntu,11,-1,5,50,0,0,0,0,0"
DialGadget\HiContrast%20Groundspeed%20kph\data\useOpenGLFlag=false DialGadget\HiContrast%20Groundspeed%20kph\data\useOpenGLFlag=false
DialGadget\HiContrast%20Groundspeed%20kph\data\beSmooth=false DialGadget\HiContrast%20Groundspeed%20kph\data\beSmooth=false
DialGadget\HiContrast%20Groundspeed%20kph\configInfo\version=0.0.0 DialGadget\HiContrast%20Groundspeed%20kph\configInfo\version=0.0.0
@ -920,7 +916,7 @@ DialGadget\HiContrast%20Temperature\data\needle3Factor=1
DialGadget\HiContrast%20Temperature\data\needle1Move=Rotate DialGadget\HiContrast%20Temperature\data\needle1Move=Rotate
DialGadget\HiContrast%20Temperature\data\needle2Move=Rotate DialGadget\HiContrast%20Temperature\data\needle2Move=Rotate
DialGadget\HiContrast%20Temperature\data\needle3Move=Rotate DialGadget\HiContrast%20Temperature\data\needle3Move=Rotate
DialGadget\HiContrast%20Temperature\data\font="MS Shell Dlg 2,8.25,-1,5,50,0,0,0,0,0" DialGadget\HiContrast%20Temperature\data\font="Ubuntu,11,-1,5,50,0,0,0,0,0"
DialGadget\HiContrast%20Temperature\data\useOpenGLFlag=false DialGadget\HiContrast%20Temperature\data\useOpenGLFlag=false
DialGadget\HiContrast%20Temperature\data\beSmooth=false DialGadget\HiContrast%20Temperature\data\beSmooth=false
DialGadget\HiContrast%20Temperature\configInfo\version=0.0.0 DialGadget\HiContrast%20Temperature\configInfo\version=0.0.0
@ -949,7 +945,7 @@ DialGadget\Servo%20Channel%201\data\needle3Factor=1
DialGadget\Servo%20Channel%201\data\needle1Move=Rotate DialGadget\Servo%20Channel%201\data\needle1Move=Rotate
DialGadget\Servo%20Channel%201\data\needle2Move=Rotate DialGadget\Servo%20Channel%201\data\needle2Move=Rotate
DialGadget\Servo%20Channel%201\data\needle3Move=Rotate DialGadget\Servo%20Channel%201\data\needle3Move=Rotate
DialGadget\Servo%20Channel%201\data\font="MS Shell Dlg 2,8.25,-1,5,50,0,0,0,0,0" DialGadget\Servo%20Channel%201\data\font="Ubuntu,11,-1,5,50,0,0,0,0,0"
DialGadget\Servo%20Channel%201\data\useOpenGLFlag=false DialGadget\Servo%20Channel%201\data\useOpenGLFlag=false
DialGadget\Servo%20Channel%201\data\beSmooth=false DialGadget\Servo%20Channel%201\data\beSmooth=false
DialGadget\Servo%20Channel%201\configInfo\version=0.0.0 DialGadget\Servo%20Channel%201\configInfo\version=0.0.0
@ -978,7 +974,7 @@ DialGadget\Temperature\data\needle3Factor=1
DialGadget\Temperature\data\needle1Move=Rotate DialGadget\Temperature\data\needle1Move=Rotate
DialGadget\Temperature\data\needle2Move=Rotate DialGadget\Temperature\data\needle2Move=Rotate
DialGadget\Temperature\data\needle3Move=Rotate DialGadget\Temperature\data\needle3Move=Rotate
DialGadget\Temperature\data\font="MS Shell Dlg 2,8.25,-1,5,50,0,0,0,0,0" DialGadget\Temperature\data\font="Ubuntu,11,-1,5,50,0,0,0,0,0"
DialGadget\Temperature\data\useOpenGLFlag=false DialGadget\Temperature\data\useOpenGLFlag=false
DialGadget\Temperature\data\beSmooth=false DialGadget\Temperature\data\beSmooth=false
DialGadget\Temperature\configInfo\version=0.0.0 DialGadget\Temperature\configInfo\version=0.0.0
@ -1027,7 +1023,7 @@ GpsDisplayGadget\Flight%20GPS\data\defaultDataBits=3
GpsDisplayGadget\Flight%20GPS\data\defaultFlow=0 GpsDisplayGadget\Flight%20GPS\data\defaultFlow=0
GpsDisplayGadget\Flight%20GPS\data\defaultParity=0 GpsDisplayGadget\Flight%20GPS\data\defaultParity=0
GpsDisplayGadget\Flight%20GPS\data\defaultStopBits=0 GpsDisplayGadget\Flight%20GPS\data\defaultStopBits=0
GpsDisplayGadget\Flight%20GPS\data\defaultPort=Communications Port (COM1) GpsDisplayGadget\Flight%20GPS\data\defaultPort=Serial port 0
GpsDisplayGadget\Flight%20GPS\data\connectionMode=Telemetry GpsDisplayGadget\Flight%20GPS\data\connectionMode=Telemetry
GpsDisplayGadget\Flight%20GPS\configInfo\version=0.0.0 GpsDisplayGadget\Flight%20GPS\configInfo\version=0.0.0
GpsDisplayGadget\Flight%20GPS\configInfo\locked=false GpsDisplayGadget\Flight%20GPS\configInfo\locked=false
@ -1036,7 +1032,7 @@ GpsDisplayGadget\GPS%20Mouse\data\defaultDataBits=3
GpsDisplayGadget\GPS%20Mouse\data\defaultFlow=0 GpsDisplayGadget\GPS%20Mouse\data\defaultFlow=0
GpsDisplayGadget\GPS%20Mouse\data\defaultParity=0 GpsDisplayGadget\GPS%20Mouse\data\defaultParity=0
GpsDisplayGadget\GPS%20Mouse\data\defaultStopBits=0 GpsDisplayGadget\GPS%20Mouse\data\defaultStopBits=0
GpsDisplayGadget\GPS%20Mouse\data\defaultPort=Communications Port (COM1) GpsDisplayGadget\GPS%20Mouse\data\defaultPort=Serial port 0
GpsDisplayGadget\GPS%20Mouse\data\connectionMode=Serial GpsDisplayGadget\GPS%20Mouse\data\connectionMode=Serial
GpsDisplayGadget\GPS%20Mouse\configInfo\version=0.0.0 GpsDisplayGadget\GPS%20Mouse\configInfo\version=0.0.0
GpsDisplayGadget\GPS%20Mouse\configInfo\locked=false GpsDisplayGadget\GPS%20Mouse\configInfo\locked=false
@ -1239,6 +1235,40 @@ LineardialGadget\Mainboard%20CPU\data\factor=1
LineardialGadget\Mainboard%20CPU\data\useOpenGLFlag=false LineardialGadget\Mainboard%20CPU\data\useOpenGLFlag=false
LineardialGadget\Mainboard%20CPU\configInfo\version=0.0.0 LineardialGadget\Mainboard%20CPU\configInfo\version=0.0.0
LineardialGadget\Mainboard%20CPU\configInfo\locked=false LineardialGadget\Mainboard%20CPU\configInfo\locked=false
LineardialGadget\Pitch\data\dFile=%%DATAPATH%%dials/default/lineardial-vertical.svg
LineardialGadget\Pitch\data\sourceDataObject=ManualControlCommand
LineardialGadget\Pitch\data\sourceObjectField=Pitch
LineardialGadget\Pitch\data\minValue=-1
LineardialGadget\Pitch\data\maxValue=1
LineardialGadget\Pitch\data\redMin=-1
LineardialGadget\Pitch\data\redMax=1
LineardialGadget\Pitch\data\yellowMin=-0.8
LineardialGadget\Pitch\data\yellowMax=0.8
LineardialGadget\Pitch\data\greenMin=-0.5
LineardialGadget\Pitch\data\greenMax=0.5
LineardialGadget\Pitch\data\font="Andale Mono,12,-1,5,75,0,0,0,0,0"
LineardialGadget\Pitch\data\decimalPlaces=2
LineardialGadget\Pitch\data\factor=1
LineardialGadget\Pitch\data\useOpenGLFlag=false
LineardialGadget\Pitch\configInfo\version=0.0.0
LineardialGadget\Pitch\configInfo\locked=false
LineardialGadget\Pitch%20Desired\data\dFile=%%DATAPATH%%dials/default/lineardial-vertical.svg
LineardialGadget\Pitch%20Desired\data\sourceDataObject=ActuatorDesired
LineardialGadget\Pitch%20Desired\data\sourceObjectField=Pitch
LineardialGadget\Pitch%20Desired\data\minValue=-1
LineardialGadget\Pitch%20Desired\data\maxValue=1
LineardialGadget\Pitch%20Desired\data\redMin=-1
LineardialGadget\Pitch%20Desired\data\redMax=1
LineardialGadget\Pitch%20Desired\data\yellowMin=-0.8
LineardialGadget\Pitch%20Desired\data\yellowMax=0.8
LineardialGadget\Pitch%20Desired\data\greenMin=-0.5
LineardialGadget\Pitch%20Desired\data\greenMax=0.5
LineardialGadget\Pitch%20Desired\data\font="Andale Mono,12,-1,5,75,0,0,0,0,0"
LineardialGadget\Pitch%20Desired\data\decimalPlaces=2
LineardialGadget\Pitch%20Desired\data\factor=1
LineardialGadget\Pitch%20Desired\data\useOpenGLFlag=false
LineardialGadget\Pitch%20Desired\configInfo\version=0.0.0
LineardialGadget\Pitch%20Desired\configInfo\locked=false
LineardialGadget\PitchActual\data\dFile=%%DATAPATH%%dials/default/lineardial-vertical.svg LineardialGadget\PitchActual\data\dFile=%%DATAPATH%%dials/default/lineardial-vertical.svg
LineardialGadget\PitchActual\data\sourceDataObject=AttitudeActual LineardialGadget\PitchActual\data\sourceDataObject=AttitudeActual
LineardialGadget\PitchActual\data\sourceObjectField=Pitch LineardialGadget\PitchActual\data\sourceObjectField=Pitch
@ -1256,57 +1286,40 @@ LineardialGadget\PitchActual\data\factor=1
LineardialGadget\PitchActual\data\useOpenGLFlag=false LineardialGadget\PitchActual\data\useOpenGLFlag=false
LineardialGadget\PitchActual\configInfo\version=0.0.0 LineardialGadget\PitchActual\configInfo\version=0.0.0
LineardialGadget\PitchActual\configInfo\locked=false LineardialGadget\PitchActual\configInfo\locked=false
LineardialGadget\PitchCommand\data\dFile=%%DATAPATH%%dials/default/lineardial-vertical.svg
LineardialGadget\PitchCommand\data\sourceDataObject=ManualControlCommand
LineardialGadget\PitchCommand\data\sourceObjectField=Pitch
LineardialGadget\PitchCommand\data\minValue=-1
LineardialGadget\PitchCommand\data\maxValue=1
LineardialGadget\PitchCommand\data\redMin=0
LineardialGadget\PitchCommand\data\redMax=1
LineardialGadget\PitchCommand\data\yellowMin=0.1
LineardialGadget\PitchCommand\data\yellowMax=0.9
LineardialGadget\PitchCommand\data\greenMin=0.3
LineardialGadget\PitchCommand\data\greenMax=0.8
LineardialGadget\PitchCommand\data\font="Andale Mono,12,-1,5,75,0,0,0,0,0"
LineardialGadget\PitchCommand\data\decimalPlaces=2
LineardialGadget\PitchCommand\data\factor=1
LineardialGadget\PitchCommand\data\useOpenGLFlag=false
LineardialGadget\PitchCommand\configInfo\version=0.0.0
LineardialGadget\PitchCommand\configInfo\locked=false
LineardialGadget\PitchDesired\data\dFile=%%DATAPATH%%dials/default/lineardial-vertical.svg
LineardialGadget\PitchDesired\data\sourceDataObject=ActuatorDesired
LineardialGadget\PitchDesired\data\sourceObjectField=Pitch
LineardialGadget\PitchDesired\data\minValue=-1
LineardialGadget\PitchDesired\data\maxValue=1
LineardialGadget\PitchDesired\data\redMin=0
LineardialGadget\PitchDesired\data\redMax=1
LineardialGadget\PitchDesired\data\yellowMin=0.1
LineardialGadget\PitchDesired\data\yellowMax=0.9
LineardialGadget\PitchDesired\data\greenMin=0.3
LineardialGadget\PitchDesired\data\greenMax=0.8
LineardialGadget\PitchDesired\data\font="Andale Mono,12,-1,5,75,0,0,0,0,0"
LineardialGadget\PitchDesired\data\decimalPlaces=2
LineardialGadget\PitchDesired\data\factor=1
LineardialGadget\PitchDesired\data\useOpenGLFlag=false
LineardialGadget\PitchDesired\configInfo\version=0.0.0
LineardialGadget\PitchDesired\configInfo\locked=false
LineardialGadget\Roll\data\dFile=%%DATAPATH%%dials/default/lineardial-vertical.svg LineardialGadget\Roll\data\dFile=%%DATAPATH%%dials/default/lineardial-vertical.svg
LineardialGadget\Roll\data\sourceDataObject=ManualControlCommand LineardialGadget\Roll\data\sourceDataObject=ManualControlCommand
LineardialGadget\Roll\data\sourceObjectField=Roll LineardialGadget\Roll\data\sourceObjectField=Roll
LineardialGadget\Roll\data\minValue=0 LineardialGadget\Roll\data\minValue=-1
LineardialGadget\Roll\data\maxValue=1 LineardialGadget\Roll\data\maxValue=1
LineardialGadget\Roll\data\redMin=0 LineardialGadget\Roll\data\redMin=-1
LineardialGadget\Roll\data\redMax=1 LineardialGadget\Roll\data\redMax=1
LineardialGadget\Roll\data\yellowMin=0.1 LineardialGadget\Roll\data\yellowMin=-0.8
LineardialGadget\Roll\data\yellowMax=0.9 LineardialGadget\Roll\data\yellowMax=0.8
LineardialGadget\Roll\data\greenMin=0.3 LineardialGadget\Roll\data\greenMin=-0.5
LineardialGadget\Roll\data\greenMax=0.8 LineardialGadget\Roll\data\greenMax=0.5
LineardialGadget\Roll\data\font="Andale Mono,12,-1,5,75,0,0,0,0,0" LineardialGadget\Roll\data\font="Andale Mono,12,-1,5,75,0,0,0,0,0"
LineardialGadget\Roll\data\decimalPlaces=2 LineardialGadget\Roll\data\decimalPlaces=2
LineardialGadget\Roll\data\factor=1 LineardialGadget\Roll\data\factor=1
LineardialGadget\Roll\data\useOpenGLFlag=false LineardialGadget\Roll\data\useOpenGLFlag=false
LineardialGadget\Roll\configInfo\version=0.0.0 LineardialGadget\Roll\configInfo\version=0.0.0
LineardialGadget\Roll\configInfo\locked=false LineardialGadget\Roll\configInfo\locked=false
LineardialGadget\Roll%20Desired\data\dFile=%%DATAPATH%%dials/default/lineardial-vertical.svg
LineardialGadget\Roll%20Desired\data\sourceDataObject=ActuatorDesired
LineardialGadget\Roll%20Desired\data\sourceObjectField=Roll
LineardialGadget\Roll%20Desired\data\minValue=-1
LineardialGadget\Roll%20Desired\data\maxValue=1
LineardialGadget\Roll%20Desired\data\redMin=-1
LineardialGadget\Roll%20Desired\data\redMax=1
LineardialGadget\Roll%20Desired\data\yellowMin=-0.8
LineardialGadget\Roll%20Desired\data\yellowMax=0.8
LineardialGadget\Roll%20Desired\data\greenMin=-0.5
LineardialGadget\Roll%20Desired\data\greenMax=0.5
LineardialGadget\Roll%20Desired\data\font="Andale Mono,12,-1,5,75,0,0,0,0,0"
LineardialGadget\Roll%20Desired\data\decimalPlaces=2
LineardialGadget\Roll%20Desired\data\factor=1
LineardialGadget\Roll%20Desired\data\useOpenGLFlag=false
LineardialGadget\Roll%20Desired\configInfo\version=0.0.0
LineardialGadget\Roll%20Desired\configInfo\locked=false
LineardialGadget\Telemetry%20RX%20Rate%20Horizontal\data\dFile=%%DATAPATH%%dials/default/lineardial-horizontal.svg LineardialGadget\Telemetry%20RX%20Rate%20Horizontal\data\dFile=%%DATAPATH%%dials/default/lineardial-horizontal.svg
LineardialGadget\Telemetry%20RX%20Rate%20Horizontal\data\sourceDataObject=GCSTelemetryStats LineardialGadget\Telemetry%20RX%20Rate%20Horizontal\data\sourceDataObject=GCSTelemetryStats
LineardialGadget\Telemetry%20RX%20Rate%20Horizontal\data\sourceObjectField=RxDataRate LineardialGadget\Telemetry%20RX%20Rate%20Horizontal\data\sourceObjectField=RxDataRate
@ -1346,12 +1359,12 @@ LineardialGadget\Throttle\data\sourceDataObject=ManualControlCommand
LineardialGadget\Throttle\data\sourceObjectField=Throttle LineardialGadget\Throttle\data\sourceObjectField=Throttle
LineardialGadget\Throttle\data\minValue=0 LineardialGadget\Throttle\data\minValue=0
LineardialGadget\Throttle\data\maxValue=1 LineardialGadget\Throttle\data\maxValue=1
LineardialGadget\Throttle\data\redMin=0 LineardialGadget\Throttle\data\redMin=0.75
LineardialGadget\Throttle\data\redMax=1 LineardialGadget\Throttle\data\redMax=1
LineardialGadget\Throttle\data\yellowMin=0.1 LineardialGadget\Throttle\data\yellowMin=0.5
LineardialGadget\Throttle\data\yellowMax=0.9 LineardialGadget\Throttle\data\yellowMax=0.75
LineardialGadget\Throttle\data\greenMin=0.3 LineardialGadget\Throttle\data\greenMin=0
LineardialGadget\Throttle\data\greenMax=0.8 LineardialGadget\Throttle\data\greenMax=0.5
LineardialGadget\Throttle\data\font="Andale Mono,12,-1,5,75,0,0,0,0,0" LineardialGadget\Throttle\data\font="Andale Mono,12,-1,5,75,0,0,0,0,0"
LineardialGadget\Throttle\data\decimalPlaces=2 LineardialGadget\Throttle\data\decimalPlaces=2
LineardialGadget\Throttle\data\factor=1 LineardialGadget\Throttle\data\factor=1
@ -1361,20 +1374,37 @@ LineardialGadget\Throttle\configInfo\locked=false
LineardialGadget\Yaw\data\dFile=%%DATAPATH%%dials/default/lineardial-vertical.svg LineardialGadget\Yaw\data\dFile=%%DATAPATH%%dials/default/lineardial-vertical.svg
LineardialGadget\Yaw\data\sourceDataObject=ManualControlCommand LineardialGadget\Yaw\data\sourceDataObject=ManualControlCommand
LineardialGadget\Yaw\data\sourceObjectField=Yaw LineardialGadget\Yaw\data\sourceObjectField=Yaw
LineardialGadget\Yaw\data\minValue=0 LineardialGadget\Yaw\data\minValue=-1
LineardialGadget\Yaw\data\maxValue=1 LineardialGadget\Yaw\data\maxValue=1
LineardialGadget\Yaw\data\redMin=0 LineardialGadget\Yaw\data\redMin=-1
LineardialGadget\Yaw\data\redMax=1 LineardialGadget\Yaw\data\redMax=1
LineardialGadget\Yaw\data\yellowMin=0.1 LineardialGadget\Yaw\data\yellowMin=-0.8
LineardialGadget\Yaw\data\yellowMax=0.9 LineardialGadget\Yaw\data\yellowMax=0.8
LineardialGadget\Yaw\data\greenMin=0.3 LineardialGadget\Yaw\data\greenMin=-0.5
LineardialGadget\Yaw\data\greenMax=0.8 LineardialGadget\Yaw\data\greenMax=0.5
LineardialGadget\Yaw\data\font="Andale Mono,12,-1,5,75,0,0,0,0,0" LineardialGadget\Yaw\data\font="Andale Mono,12,-1,5,75,0,0,0,0,0"
LineardialGadget\Yaw\data\decimalPlaces=2 LineardialGadget\Yaw\data\decimalPlaces=2
LineardialGadget\Yaw\data\factor=1 LineardialGadget\Yaw\data\factor=1
LineardialGadget\Yaw\data\useOpenGLFlag=false LineardialGadget\Yaw\data\useOpenGLFlag=false
LineardialGadget\Yaw\configInfo\version=0.0.0 LineardialGadget\Yaw\configInfo\version=0.0.0
LineardialGadget\Yaw\configInfo\locked=false LineardialGadget\Yaw\configInfo\locked=false
LineardialGadget\Yaw%20Desired\data\dFile=%%DATAPATH%%dials/default/lineardial-vertical.svg
LineardialGadget\Yaw%20Desired\data\sourceDataObject=ActuatorDesired
LineardialGadget\Yaw%20Desired\data\sourceObjectField=Yaw
LineardialGadget\Yaw%20Desired\data\minValue=-1
LineardialGadget\Yaw%20Desired\data\maxValue=1
LineardialGadget\Yaw%20Desired\data\redMin=-1
LineardialGadget\Yaw%20Desired\data\redMax=1
LineardialGadget\Yaw%20Desired\data\yellowMin=-0.8
LineardialGadget\Yaw%20Desired\data\yellowMax=0.8
LineardialGadget\Yaw%20Desired\data\greenMin=-0.5
LineardialGadget\Yaw%20Desired\data\greenMax=0.5
LineardialGadget\Yaw%20Desired\data\font="Andale Mono,12,-1,5,75,0,0,0,0,0"
LineardialGadget\Yaw%20Desired\data\decimalPlaces=2
LineardialGadget\Yaw%20Desired\data\factor=1
LineardialGadget\Yaw%20Desired\data\useOpenGLFlag=false
LineardialGadget\Yaw%20Desired\configInfo\version=0.0.0
LineardialGadget\Yaw%20Desired\configInfo\locked=false
ModelViewGadget\Aeroquad%20%2B\data\acFilename=%%DATAPATH%%models/multi/aeroquad/aeroquad_+.3ds ModelViewGadget\Aeroquad%20%2B\data\acFilename=%%DATAPATH%%models/multi/aeroquad/aeroquad_+.3ds
ModelViewGadget\Aeroquad%20%2B\data\bgFilename=%%DATAPATH%%models/backgrounds/default_background.png ModelViewGadget\Aeroquad%20%2B\data\bgFilename=%%DATAPATH%%models/backgrounds/default_background.png
ModelViewGadget\Aeroquad%20%2B\data\enableVbo=false ModelViewGadget\Aeroquad%20%2B\data\enableVbo=false
@ -1439,24 +1469,24 @@ OPMapGadget\Google%20Sat\data\mapProvider=GoogleSatellite
OPMapGadget\Google%20Sat\data\defaultZoom=2 OPMapGadget\Google%20Sat\data\defaultZoom=2
OPMapGadget\Google%20Sat\data\defaultLatitude=0 OPMapGadget\Google%20Sat\data\defaultLatitude=0
OPMapGadget\Google%20Sat\data\defaultLongitude=0 OPMapGadget\Google%20Sat\data\defaultLongitude=0
OPMapGadget\Google%20Sat\data\useOpenGL=true OPMapGadget\Google%20Sat\data\useOpenGL=false
OPMapGadget\Google%20Sat\data\showTileGridLines=false OPMapGadget\Google%20Sat\data\showTileGridLines=false
OPMapGadget\Google%20Sat\data\accessMode=ServerAndCache OPMapGadget\Google%20Sat\data\accessMode=ServerAndCache
OPMapGadget\Google%20Sat\data\useMemoryCache=true OPMapGadget\Google%20Sat\data\useMemoryCache=true
OPMapGadget\Google%20Sat\data\uavSymbol=mapquad.png OPMapGadget\Google%20Sat\data\uavSymbol=mapquad.png
OPMapGadget\Google%20Sat\data\cacheLocation= OPMapGadget\Google%20Sat\data\cacheLocation=%%STOREPATH%%mapscache/
OPMapGadget\Google%20Sat\configInfo\version=0.0.0 OPMapGadget\Google%20Sat\configInfo\version=0.0.0
OPMapGadget\Google%20Sat\configInfo\locked=false OPMapGadget\Google%20Sat\configInfo\locked=false
OPMapGadget\Memory%20Only\data\mapProvider=GoogleMap OPMapGadget\Memory%20Only\data\mapProvider=GoogleMap
OPMapGadget\Memory%20Only\data\defaultZoom=2 OPMapGadget\Memory%20Only\data\defaultZoom=2
OPMapGadget\Memory%20Only\data\defaultLatitude=0 OPMapGadget\Memory%20Only\data\defaultLatitude=0
OPMapGadget\Memory%20Only\data\defaultLongitude=0 OPMapGadget\Memory%20Only\data\defaultLongitude=0
OPMapGadget\Memory%20Only\data\useOpenGL=true OPMapGadget\Memory%20Only\data\useOpenGL=false
OPMapGadget\Memory%20Only\data\showTileGridLines=false OPMapGadget\Memory%20Only\data\showTileGridLines=false
OPMapGadget\Memory%20Only\data\accessMode=CacheOnly OPMapGadget\Memory%20Only\data\accessMode=CacheOnly
OPMapGadget\Memory%20Only\data\useMemoryCache=true OPMapGadget\Memory%20Only\data\useMemoryCache=true
OPMapGadget\Memory%20Only\data\uavSymbol=airplanepip.png OPMapGadget\Memory%20Only\data\uavSymbol=airplanepip.png
OPMapGadget\Memory%20Only\data\cacheLocation= OPMapGadget\Memory%20Only\data\cacheLocation=%%STOREPATH%%mapscache/
OPMapGadget\Memory%20Only\configInfo\version=0.0.0 OPMapGadget\Memory%20Only\configInfo\version=0.0.0
OPMapGadget\Memory%20Only\configInfo\locked=false OPMapGadget\Memory%20Only\configInfo\locked=false
OPMapGadget\default\data\mapProvider=GoogleMap OPMapGadget\default\data\mapProvider=GoogleMap
@ -1468,7 +1498,7 @@ OPMapGadget\default\data\showTileGridLines=false
OPMapGadget\default\data\accessMode=ServerAndCache OPMapGadget\default\data\accessMode=ServerAndCache
OPMapGadget\default\data\useMemoryCache=true OPMapGadget\default\data\useMemoryCache=true
OPMapGadget\default\data\uavSymbol=mapquad.png OPMapGadget\default\data\uavSymbol=mapquad.png
OPMapGadget\default\data\cacheLocation= OPMapGadget\default\data\cacheLocation=%%STOREPATH%%mapscache/
OPMapGadget\default\configInfo\version=0.0.0 OPMapGadget\default\configInfo\version=0.0.0
OPMapGadget\default\configInfo\locked=false OPMapGadget\default\configInfo\locked=false
PFDGadget\raw\data\dialFile=%%DATAPATH%%pfd/default/pfd.svg PFDGadget\raw\data\dialFile=%%DATAPATH%%pfd/default/pfd.svg
@ -1883,16 +1913,16 @@ Uploader\default\configInfo\version=0.0.0
Uploader\default\configInfo\locked=false Uploader\default\configInfo\locked=false
[Plugins] [Plugins]
SoundNotifyPlugin\data\Current\1\SoundCollectionPath=%%DATAPATH%%sounds SoundNotifyPlugin\data\Current\1\SoundCollectionPath=
SoundNotifyPlugin\data\Current\1\CurrentLanguage=default SoundNotifyPlugin\data\Current\1\CurrentLanguage=
SoundNotifyPlugin\data\Current\1\ObjectField=Channel SoundNotifyPlugin\data\Current\1\ObjectField=
SoundNotifyPlugin\data\Current\1\DataObject=ActuatorCommand SoundNotifyPlugin\data\Current\1\DataObject=
SoundNotifyPlugin\data\Current\1\Value=Equal to SoundNotifyPlugin\data\Current\1\Value=
SoundNotifyPlugin\data\Current\1\ValueSpinBox=0 SoundNotifyPlugin\data\Current\1\ValueSpinBox=0
SoundNotifyPlugin\data\Current\1\Sound1= SoundNotifyPlugin\data\Current\1\Sound1=
SoundNotifyPlugin\data\Current\1\Sound2= SoundNotifyPlugin\data\Current\1\Sound2=
SoundNotifyPlugin\data\Current\1\Sound3= SoundNotifyPlugin\data\Current\1\Sound3=
SoundNotifyPlugin\data\Current\1\SayOrder=Never SoundNotifyPlugin\data\Current\1\SayOrder=
SoundNotifyPlugin\data\Current\1\Repeat= SoundNotifyPlugin\data\Current\1\Repeat=
SoundNotifyPlugin\data\Current\1\ExpireTimeout=0 SoundNotifyPlugin\data\Current\1\ExpireTimeout=0
SoundNotifyPlugin\data\Current\size=1 SoundNotifyPlugin\data\Current\size=1
@ -1900,9 +1930,3 @@ SoundNotifyPlugin\data\listNotifies\size=0
SoundNotifyPlugin\data\EnableSound=false SoundNotifyPlugin\data\EnableSound=false
SoundNotifyPlugin\configInfo\version=1.0.0 SoundNotifyPlugin\configInfo\version=1.0.0
SoundNotifyPlugin\configInfo\locked=false SoundNotifyPlugin\configInfo\locked=false
[IPconnection]
Current\1\HostName=
Current\1\Port=1
Current\1\UseTCP=0
Current\size=1

View File

@ -73,8 +73,10 @@ GCSControlGadgetWidget::GCSControlGadgetWidget(QWidget *parent) : QLabel(parent)
rightX = 0; rightX = 0;
rightY = 0; rightY = 0;
m_gcscontrol->widgetLeftStick->enableOpenGL(true); // No point enabling OpenGL for the joysticks, and causes
m_gcscontrol->widgetRightStick->enableOpenGL(true); // issues on some computers:
// m_gcscontrol->widgetLeftStick->enableOpenGL(true);
// m_gcscontrol->widgetRightStick->enableOpenGL(true);
} }
GCSControlGadgetWidget::~GCSControlGadgetWidget() GCSControlGadgetWidget::~GCSControlGadgetWidget()

View File

@ -40,11 +40,13 @@ OPMapGadgetConfiguration::OPMapGadgetConfiguration(QString classId, QSettings*
m_accessMode("ServerAndCache"), m_accessMode("ServerAndCache"),
m_useMemoryCache(true), m_useMemoryCache(true),
m_cacheLocation(Utils::PathUtils().GetStoragePath() + "mapscache" + QDir::separator()), m_cacheLocation(Utils::PathUtils().GetStoragePath() + "mapscache" + QDir::separator()),
m_uavSymbol(QString::fromUtf8(":/uavs/images/mapquad.png")) m_uavSymbol(QString::fromUtf8(":/uavs/images/mapquad.png")),
m_maxUpdateRate(2000) // ms
{ {
//if a saved configuration exists load it //if a saved configuration exists load it
if(qSettings != 0) { if (qSettings != 0) {
QString mapProvider = qSettings->value("mapProvider").toString(); QString mapProvider = qSettings->value("mapProvider").toString();
int zoom = qSettings->value("defaultZoom").toInt(); int zoom = qSettings->value("defaultZoom").toInt();
double latitude= qSettings->value("defaultLatitude").toDouble(); double latitude= qSettings->value("defaultLatitude").toDouble();
@ -55,16 +57,25 @@ OPMapGadgetConfiguration::OPMapGadgetConfiguration(QString classId, QSettings*
bool useMemoryCache= qSettings->value("useMemoryCache").toBool(); bool useMemoryCache= qSettings->value("useMemoryCache").toBool();
QString cacheLocation= qSettings->value("cacheLocation").toString(); QString cacheLocation= qSettings->value("cacheLocation").toString();
QString uavSymbol=qSettings->value("uavSymbol").toString(); QString uavSymbol=qSettings->value("uavSymbol").toString();
int max_update_rate = qSettings->value("maxUpdateRate").toInt();
if (!mapProvider.isEmpty()) m_mapProvider = mapProvider; if (!mapProvider.isEmpty()) m_mapProvider = mapProvider;
m_defaultZoom = zoom; m_defaultZoom = zoom;
m_defaultLatitude = latitude; m_defaultLatitude = latitude;
m_defaultLongitude = longitude; m_defaultLongitude = longitude;
m_useOpenGL = useOpenGL; m_useOpenGL = useOpenGL;
m_showTileGridLines = showTileGridLines; m_showTileGridLines = showTileGridLines;
m_uavSymbol=uavSymbol; m_uavSymbol = uavSymbol;
if (!accessMode.isEmpty()) m_accessMode = accessMode;
m_maxUpdateRate = max_update_rate;
if (m_maxUpdateRate < 100 || m_maxUpdateRate > 5000)
m_maxUpdateRate = 2000;
if (!accessMode.isEmpty())
m_accessMode = accessMode;
m_useMemoryCache = useMemoryCache; m_useMemoryCache = useMemoryCache;
if (!cacheLocation.isEmpty()) m_cacheLocation = Utils::PathUtils().InsertStoragePath(cacheLocation); if (!cacheLocation.isEmpty())
m_cacheLocation = Utils::PathUtils().InsertStoragePath(cacheLocation);
} }
} }
@ -81,7 +92,9 @@ IUAVGadgetConfiguration * OPMapGadgetConfiguration::clone()
m->m_accessMode = m_accessMode; m->m_accessMode = m_accessMode;
m->m_useMemoryCache = m_useMemoryCache; m->m_useMemoryCache = m_useMemoryCache;
m->m_cacheLocation = m_cacheLocation; m->m_cacheLocation = m_cacheLocation;
m->m_uavSymbol=m_uavSymbol; m->m_uavSymbol = m_uavSymbol;
m->m_maxUpdateRate = m_maxUpdateRate;
return m; return m;
} }
@ -96,6 +109,7 @@ void OPMapGadgetConfiguration::saveConfig(QSettings* qSettings) const {
qSettings->setValue("useMemoryCache", m_useMemoryCache); qSettings->setValue("useMemoryCache", m_useMemoryCache);
qSettings->setValue("uavSymbol", m_uavSymbol); qSettings->setValue("uavSymbol", m_uavSymbol);
qSettings->setValue("cacheLocation", Utils::PathUtils().RemoveStoragePath(m_cacheLocation)); qSettings->setValue("cacheLocation", Utils::PathUtils().RemoveStoragePath(m_cacheLocation));
qSettings->setValue("maxUpdateRate", m_maxUpdateRate);
} }
void OPMapGadgetConfiguration::setCacheLocation(QString cacheLocation){ void OPMapGadgetConfiguration::setCacheLocation(QString cacheLocation){
m_cacheLocation = cacheLocation; m_cacheLocation = cacheLocation;

View File

@ -47,6 +47,7 @@ Q_PROPERTY(QString accessMode READ accessMode WRITE setAccessMode)
Q_PROPERTY(bool useMemoryCache READ useMemoryCache WRITE setUseMemoryCache) Q_PROPERTY(bool useMemoryCache READ useMemoryCache WRITE setUseMemoryCache)
Q_PROPERTY(QString cacheLocation READ cacheLocation WRITE setCacheLocation) Q_PROPERTY(QString cacheLocation READ cacheLocation WRITE setCacheLocation)
Q_PROPERTY(QString uavSymbol READ uavSymbol WRITE setUavSymbol) Q_PROPERTY(QString uavSymbol READ uavSymbol WRITE setUavSymbol)
Q_PROPERTY(int maxUpdateRate READ maxUpdateRate WRITE setMaxUpdateRate)
public: public:
explicit OPMapGadgetConfiguration(QString classId, QSettings* qSettings = 0, QObject *parent = 0); explicit OPMapGadgetConfiguration(QString classId, QSettings* qSettings = 0, QObject *parent = 0);
@ -64,6 +65,7 @@ public:
bool useMemoryCache() const { return m_useMemoryCache; } bool useMemoryCache() const { return m_useMemoryCache; }
QString cacheLocation() const { return m_cacheLocation; } QString cacheLocation() const { return m_cacheLocation; }
QString uavSymbol() const { return m_uavSymbol; } QString uavSymbol() const { return m_uavSymbol; }
int maxUpdateRate() const { return m_maxUpdateRate; }
public slots: public slots:
void setMapProvider(QString provider) { m_mapProvider = provider; } void setMapProvider(QString provider) { m_mapProvider = provider; }
@ -76,6 +78,8 @@ public slots:
void setUseMemoryCache(bool useMemoryCache) { m_useMemoryCache = useMemoryCache; } void setUseMemoryCache(bool useMemoryCache) { m_useMemoryCache = useMemoryCache; }
void setCacheLocation(QString cacheLocation); void setCacheLocation(QString cacheLocation);
void setUavSymbol(QString symbol){m_uavSymbol=symbol;} void setUavSymbol(QString symbol){m_uavSymbol=symbol;}
void setMaxUpdateRate(int update_rate){m_maxUpdateRate = update_rate;}
private: private:
QString m_mapProvider; QString m_mapProvider;
int m_defaultZoom; int m_defaultZoom;
@ -87,7 +91,7 @@ private:
bool m_useMemoryCache; bool m_useMemoryCache;
QString m_cacheLocation; QString m_cacheLocation;
QString m_uavSymbol; QString m_uavSymbol;
int m_maxUpdateRate;
}; };
#endif // OPMAP_GADGETCONFIGURATION_H #endif // OPMAP_GADGETCONFIGURATION_H

View File

@ -49,7 +49,9 @@ OPMapGadgetOptionsPage::OPMapGadgetOptionsPage(OPMapGadgetConfiguration *config,
QWidget *OPMapGadgetOptionsPage::createPage(QWidget *parent) QWidget *OPMapGadgetOptionsPage::createPage(QWidget *parent)
{ {
m_page = new Ui::OPMapGadgetOptionsPage(); int index;
m_page = new Ui::OPMapGadgetOptionsPage();
QWidget *w = new QWidget(parent); QWidget *w = new QWidget(parent);
m_page->setupUi(w); m_page->setupUi(w);
@ -61,9 +63,22 @@ QWidget *OPMapGadgetOptionsPage::createPage(QWidget *parent)
m_page->accessModeComboBox->clear(); m_page->accessModeComboBox->clear();
m_page->accessModeComboBox->addItems(mapcontrol::Helper::AccessModeTypes()); m_page->accessModeComboBox->addItems(mapcontrol::Helper::AccessModeTypes());
int index = m_page->providerComboBox->findText(m_config->mapProvider()); index = m_page->providerComboBox->findText(m_config->mapProvider());
index = (index >= 0) ? index : 0; index = (index >= 0) ? index : 0;
m_page->providerComboBox->setCurrentIndex(index); m_page->providerComboBox->setCurrentIndex(index);
// populate the map max update rate combobox
m_page->maxUpdateRateComboBox->clear();
m_page->maxUpdateRateComboBox->addItem("100ms", 100);
m_page->maxUpdateRateComboBox->addItem("200ms", 200);
m_page->maxUpdateRateComboBox->addItem("500ms", 500);
m_page->maxUpdateRateComboBox->addItem("1 sec", 1000);
m_page->maxUpdateRateComboBox->addItem("2 sec", 2000);
m_page->maxUpdateRateComboBox->addItem("5 sec", 5000);
index = m_page->maxUpdateRateComboBox->findData(m_config->maxUpdateRate());
index = (index >= 0) ? index : 4;
m_page->maxUpdateRateComboBox->setCurrentIndex(index);
m_page->zoomSpinBox->setValue(m_config->zoom()); m_page->zoomSpinBox->setValue(m_config->zoom());
m_page->latitudeSpinBox->setValue(m_config->latitude()); m_page->latitudeSpinBox->setValue(m_config->latitude());
@ -125,6 +140,7 @@ void OPMapGadgetOptionsPage::apply()
m_config->setUseMemoryCache(m_page->checkBoxUseMemoryCache->isChecked()); m_config->setUseMemoryCache(m_page->checkBoxUseMemoryCache->isChecked());
m_config->setCacheLocation(m_page->lineEditCacheLocation->path()); m_config->setCacheLocation(m_page->lineEditCacheLocation->path());
m_config->setUavSymbol(m_page->uavSymbolComboBox->itemData(m_page->uavSymbolComboBox->currentIndex()).toString()); m_config->setUavSymbol(m_page->uavSymbolComboBox->itemData(m_page->uavSymbolComboBox->currentIndex()).toString());
m_config->setMaxUpdateRate(m_page->maxUpdateRateComboBox->itemData(m_page->maxUpdateRateComboBox->currentIndex()).toInt());
} }
void OPMapGadgetOptionsPage::finish() void OPMapGadgetOptionsPage::finish()

View File

@ -30,7 +30,7 @@
<number>5</number> <number>5</number>
</property> </property>
<item row="1" column="0"> <item row="1" column="0">
<layout class="QGridLayout" name="gridLayout_3" rowstretch="0,0,0,0,0" rowminimumheight="22,22,22,0,22"> <layout class="QGridLayout" name="gridLayout_3" rowstretch="0,0,0,0,0,0" rowminimumheight="22,22,22,0,22,0">
<item row="2" column="0"> <item row="2" column="0">
<spacer name="horizontalSpacer_4"> <spacer name="horizontalSpacer_4">
<property name="orientation"> <property name="orientation">
@ -249,6 +249,19 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="5" column="3">
<widget class="QComboBox" name="maxUpdateRateComboBox"/>
</item>
<item row="5" column="2">
<widget class="QLabel" name="label_9">
<property name="text">
<string>Default Max Update Rate </string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
</layout> </layout>
</item> </item>
<item row="8" column="0"> <item row="8" column="0">

View File

@ -66,6 +66,8 @@ const int uav_trail_time_list[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
const int uav_trail_distance_list[] = {1, 2, 5, 10, 20, 50, 100, 200, 500}; // meters const int uav_trail_distance_list[] = {1, 2, 5, 10, 20, 50, 100, 200, 500}; // meters
const int max_update_rate_list[] = {100, 200, 500, 1000, 2000, 5000}; // milliseconds
// ************************************************************************************* // *************************************************************************************
@ -89,15 +91,17 @@ OPMapGadgetWidget::OPMapGadgetWidget(QWidget *parent) : QWidget(parent)
obm = NULL; obm = NULL;
obum = NULL; obum = NULL;
prev_tile_number = 0; m_prev_tile_number = 0;
min_zoom = max_zoom = 0; m_min_zoom = m_max_zoom = 0;
m_map_mode = Normal_MapMode; m_map_mode = Normal_MapMode;
telemetry_connected = false; m_maxUpdateRate = max_update_rate_list[4]; // 2 seconds
context_menu_lat_lon = mouse_lat_lon = internals::PointLatLng(0, 0); m_telemetry_connected = false;
m_context_menu_lat_lon = m_mouse_lat_lon = internals::PointLatLng(0, 0);
setMouseTracking(true); setMouseTracking(true);
@ -123,20 +127,20 @@ OPMapGadgetWidget::OPMapGadgetWidget(QWidget *parent) : QWidget(parent)
// ************** // **************
// default home position // default home position
home_position.coord = pos_lat_lon; m_home_position.coord = pos_lat_lon;
home_position.altitude = altitude; m_home_position.altitude = altitude;
home_position.locked = false; m_home_position.locked = false;
// ************** // **************
// default magic waypoint params // default magic waypoint params
magic_waypoint.map_wp_item = NULL; m_magic_waypoint.map_wp_item = NULL;
magic_waypoint.coord = home_position.coord; m_magic_waypoint.coord = m_home_position.coord;
magic_waypoint.altitude = altitude; m_magic_waypoint.altitude = altitude;
magic_waypoint.description = "Magic waypoint"; m_magic_waypoint.description = "Magic waypoint";
magic_waypoint.locked = false; m_magic_waypoint.locked = false;
magic_waypoint.time_seconds = 0; m_magic_waypoint.time_seconds = 0;
magic_waypoint.hold_time_seconds = 0; m_magic_waypoint.hold_time_seconds = 0;
// ************** // **************
// create the widget that holds the user controls and the map // create the widget that holds the user controls and the map
@ -157,8 +161,8 @@ OPMapGadgetWidget::OPMapGadgetWidget(QWidget *parent) : QWidget(parent)
m_widget->horizontalSliderZoom->setMinimum(m_map->MinZoom()); // m_widget->horizontalSliderZoom->setMinimum(m_map->MinZoom()); //
m_widget->horizontalSliderZoom->setMaximum(m_map->MaxZoom() + max_digital_zoom); // m_widget->horizontalSliderZoom->setMaximum(m_map->MaxZoom() + max_digital_zoom); //
min_zoom = m_widget->horizontalSliderZoom->minimum(); // minimum zoom we can accept m_min_zoom = m_widget->horizontalSliderZoom->minimum(); // minimum zoom we can accept
max_zoom = m_widget->horizontalSliderZoom->maximum(); // maximum zoom we can accept m_max_zoom = m_widget->horizontalSliderZoom->maximum(); // maximum zoom we can accept
m_map->SetMouseWheelZoomType(internals::MouseWheelZoomType::MousePositionWithoutCenter); // set how the mouse wheel zoom functions m_map->SetMouseWheelZoomType(internals::MouseWheelZoomType::MousePositionWithoutCenter); // set how the mouse wheel zoom functions
m_map->SetFollowMouse(true); // we want a contiuous mouse position reading m_map->SetFollowMouse(true); // we want a contiuous mouse position reading
@ -262,10 +266,10 @@ OPMapGadgetWidget::OPMapGadgetWidget(QWidget *parent) : QWidget(parent)
connect(m_map, SIGNAL(WPInserted(int const&, WayPointItem*)), this, SLOT(WPInserted(int const&, WayPointItem*))); connect(m_map, SIGNAL(WPInserted(int const&, WayPointItem*)), this, SLOT(WPInserted(int const&, WayPointItem*)));
connect(m_map, SIGNAL(WPDeleted(int const&)), this, SLOT(WPDeleted(int const&))); connect(m_map, SIGNAL(WPDeleted(int const&)), this, SLOT(WPDeleted(int const&)));
m_map->SetCurrentPosition(home_position.coord); // set the map position m_map->SetCurrentPosition(m_home_position.coord); // set the map position
m_map->Home->SetCoord(home_position.coord); // set the HOME position m_map->Home->SetCoord(m_home_position.coord); // set the HOME position
m_map->UAV->SetUAVPos(home_position.coord, 0.0); // set the UAV position m_map->UAV->SetUAVPos(m_home_position.coord, 0.0); // set the UAV position
m_map->GPS->SetUAVPos(home_position.coord, 0.0); // set the UAV position m_map->GPS->SetUAVPos(m_home_position.coord, 0.0); // set the UAV position
// ************** // **************
// create various context menu (mouse right click menu) actions // create various context menu (mouse right click menu) actions
@ -300,13 +304,14 @@ OPMapGadgetWidget::OPMapGadgetWidget(QWidget *parent) : QWidget(parent)
// create the desired timers // create the desired timers
m_updateTimer = new QTimer(); m_updateTimer = new QTimer();
m_updateTimer->setInterval(200); m_updateTimer->setInterval(m_maxUpdateRate);
connect(m_updateTimer, SIGNAL(timeout()), this, SLOT(updatePosition())); connect(m_updateTimer, SIGNAL(timeout()), this, SLOT(updatePosition()));
m_updateTimer->start(); m_updateTimer->start();
m_statusUpdateTimer = new QTimer(); m_statusUpdateTimer = new QTimer();
m_statusUpdateTimer->setInterval(100); m_statusUpdateTimer->setInterval(200);
connect(m_statusUpdateTimer, SIGNAL(timeout()), this, SLOT(updateMousePos())); // m_statusUpdateTimer->setInterval(m_maxUpdateRate);
connect(m_statusUpdateTimer, SIGNAL(timeout()), this, SLOT(updateMousePos()));
m_statusUpdateTimer->start(); m_statusUpdateTimer->start();
// ************** // **************
@ -385,22 +390,22 @@ void OPMapGadgetWidget::contextMenuEvent(QContextMenuEvent *event)
QString s; QString s;
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
if (event->reason() != QContextMenuEvent::Mouse) if (event->reason() != QContextMenuEvent::Mouse)
return; // not a mouse click event return; // not a mouse click event
// current mouse position // current mouse position
QPoint p = m_map->mapFromGlobal(event->globalPos()); QPoint p = m_map->mapFromGlobal(event->globalPos());
context_menu_lat_lon = m_map->GetFromLocalToLatLng(p); m_context_menu_lat_lon = m_map->GetFromLocalToLatLng(p);
// context_menu_lat_lon = m_map->currentMousePosition(); // m_context_menu_lat_lon = m_map->currentMousePosition();
if (!m_map->contentsRect().contains(p)) if (!m_map->contentsRect().contains(p))
return; // the mouse click was not on the map return; // the mouse click was not on the map
// show the mouse position // show the mouse position
s = QString::number(context_menu_lat_lon.Lat(), 'f', 7) + " " + QString::number(context_menu_lat_lon.Lng(), 'f', 7); s = QString::number(m_context_menu_lat_lon.Lat(), 'f', 7) + " " + QString::number(m_context_menu_lat_lon.Lng(), 'f', 7);
m_widget->labelMousePos->setText(s); m_widget->labelMousePos->setText(s);
// find out if we have a waypoint under the mouse cursor // find out if we have a waypoint under the mouse cursor
@ -425,6 +430,13 @@ void OPMapGadgetWidget::contextMenuEvent(QContextMenuEvent *event)
menu.addSeparator(); menu.addSeparator();
QMenu maxUpdateRateSubMenu(tr("&Max Update Rate ") + "(" + QString::number(m_maxUpdateRate) + " ms)", this);
for (int i = 0; i < maxUpdateRateAct.count(); i++)
maxUpdateRateSubMenu.addAction(maxUpdateRateAct.at(i));
menu.addMenu(&maxUpdateRateSubMenu);
menu.addSeparator();
switch (m_map_mode) switch (m_map_mode)
{ {
case Normal_MapMode: s = tr(" (Normal)"); break; case Normal_MapMode: s = tr(" (Normal)"); break;
@ -612,58 +624,81 @@ void OPMapGadgetWidget::keyPressEvent(QKeyEvent* event)
// ************************************************************************************* // *************************************************************************************
// timer signals // timer signals
/** /**
Updates the UAV position on the map. It is called every 200ms Updates the UAV position on the map. It is called every 200ms
by a timer. by a timer.
TODO: consider updating upon object update, not timer. TODO: consider updating upon object update, not timer.
from Pip: No don't update on object update - had reports that peoples PC's can't cope with high update rates - have had to allow user to set map update from 100ms to 5 seconds (depending on their PC's graphics processing ability), so this needs to be kept on a timer.
*/ */
void OPMapGadgetWidget::updatePosition() void OPMapGadgetWidget::updatePosition()
{ {
if (!m_widget || !m_map) double uav_latitude, uav_longitude, uav_altitude, uav_yaw;
return; double gps_latitude, gps_longitude, gps_altitude, gps_heading;
internals::PointLatLng uav_pos;
internals::PointLatLng gps_pos;
if (!m_widget || !m_map)
return;
QMutexLocker locker(&m_map_mutex); QMutexLocker locker(&m_map_mutex);
//Pip I'm sorry, I know this was here with a purpose vvv // Pip I'm sorry, I know this was here with a purpose vvv
//if (!telemetry_connected) // from Pip: let you off :)
// return; //if (!telemetry_connected)
// return;
double latitude; // *************
double longitude; // get the current UAV details
double altitude;
// get current UAV position // get current UAV position
if (!getUAVPosition(latitude, longitude, altitude)) if (!getUAVPosition(uav_latitude, uav_longitude, uav_altitude))
return; return;
// get current UAV heading // get current UAV heading
float yaw = getUAV_Yaw(); uav_yaw = getUAV_Yaw();
internals::PointLatLng uav_pos = internals::PointLatLng(latitude, longitude); // current UAV position uav_pos = internals::PointLatLng(uav_latitude, uav_longitude);
float uav_heading_degrees = yaw; // current UAV heading
float uav_altitude_meters = altitude; // current UAV height // *************
float uav_ground_speed_meters_per_second = 0; //data.Groundspeed; // current UAV ground speed // get the current GPS details
// get current GPS position
if (!getGPSPosition(gps_latitude, gps_longitude, gps_altitude))
return;
// get current GPS heading
// gps_heading = getGPS_Heading();
gps_heading = 0;
gps_pos = internals::PointLatLng(gps_latitude, gps_longitude);
// *************
// display the UAV position
// display the UAV lat/lon position
QString str = QString str =
"lat: " + QString::number(uav_pos.Lat(), 'f', 7) + "lat: " + QString::number(uav_pos.Lat(), 'f', 7) +
" lon: " + QString::number(uav_pos.Lng(), 'f', 7) + " lon: " + QString::number(uav_pos.Lng(), 'f', 7) +
" " + QString::number(uav_heading_degrees, 'f', 1) + "deg" + " " + QString::number(uav_yaw, 'f', 1) + "deg" +
" " + QString::number(uav_altitude_meters, 'f', 1) + "m" + " " + QString::number(uav_altitude, 'f', 1) + "m";
" " + QString::number(uav_ground_speed_meters_per_second, 'f', 1) + "m/s"; // " " + QString::number(uav_ground_speed_meters_per_second, 'f', 1) + "m/s";
m_widget->labelUAVPos->setText(str); m_widget->labelUAVPos->setText(str);
m_map->UAV->SetUAVPos(uav_pos, uav_altitude_meters); // set the maps UAV position // *************
// qDebug()<<"UAVPOSITION"<<uav_pos.ToString(); // set the UAV icon position on the map
m_map->UAV->SetUAVHeading(uav_heading_degrees); // set the maps UAV heading
if (!getGPSPosition(latitude, longitude, altitude)) m_map->UAV->SetUAVPos(uav_pos, uav_altitude); // set the maps UAV position
return; // qDebug()<<"UAVPOSITION"<<uav_pos.ToString();
m_map->UAV->SetUAVHeading(uav_yaw); // set the maps UAV heading
uav_pos = internals::PointLatLng(latitude, longitude); // current UAV position // *************
m_map->GPS->SetUAVPos(uav_pos, uav_altitude_meters); // set the maps UAV position // set the GPS icon position on the map
m_map->GPS->SetUAVHeading(uav_heading_degrees); // set the maps UAV heading
m_map->GPS->SetUAVPos(gps_pos, gps_altitude); // set the maps GPS position
m_map->GPS->SetUAVHeading(gps_heading); // set the maps GPS heading
// *************
} }
/** /**
@ -672,8 +707,8 @@ void OPMapGadgetWidget::updatePosition()
*/ */
void OPMapGadgetWidget::updateMousePos() void OPMapGadgetWidget::updateMousePos()
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
QMutexLocker locker(&m_map_mutex); QMutexLocker locker(&m_map_mutex);
@ -696,14 +731,14 @@ void OPMapGadgetWidget::updateMousePos()
// find out if we have a waypoint under the mouse cursor // find out if we have a waypoint under the mouse cursor
mapcontrol::WayPointItem *wp = qgraphicsitem_cast<mapcontrol::WayPointItem *>(item); mapcontrol::WayPointItem *wp = qgraphicsitem_cast<mapcontrol::WayPointItem *>(item);
if (mouse_lat_lon == lat_lon) if (m_mouse_lat_lon == lat_lon)
return; // the mouse has not moved return; // the mouse has not moved
mouse_lat_lon = lat_lon; // yes it has! m_mouse_lat_lon = lat_lon; // yes it has!
internals::PointLatLng home_lat_lon = m_map->Home->Coord(); internals::PointLatLng home_lat_lon = m_map->Home->Coord();
QString s = QString::number(mouse_lat_lon.Lat(), 'f', 7) + " " + QString::number(mouse_lat_lon.Lng(), 'f', 7); QString s = QString::number(m_mouse_lat_lon.Lat(), 'f', 7) + " " + QString::number(m_mouse_lat_lon.Lng(), 'f', 7);
if (wp) if (wp)
{ {
s += " wp[" + QString::number(wp->Number()) + "]"; s += " wp[" + QString::number(wp->Number()) + "]";
@ -718,8 +753,8 @@ void OPMapGadgetWidget::updateMousePos()
{ {
s += " home"; s += " home";
double dist = distance(home_lat_lon, mouse_lat_lon); double dist = distance(home_lat_lon, m_mouse_lat_lon);
double bear = bearing(home_lat_lon, mouse_lat_lon); double bear = bearing(home_lat_lon, m_mouse_lat_lon);
s += " " + QString::number(dist * 1000, 'f', 1) + "m"; s += " " + QString::number(dist * 1000, 'f', 1) + "m";
s += " " + QString::number(bear, 'f', 1) + "deg"; s += " " + QString::number(bear, 'f', 1) + "deg";
} }
@ -753,22 +788,22 @@ void OPMapGadgetWidget::updateMousePos()
*/ */
void OPMapGadgetWidget::zoomChanged(double zoomt, double zoom, double zoomd) void OPMapGadgetWidget::zoomChanged(double zoomt, double zoom, double zoomd)
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
QString s = "tot:" + QString::number(zoomt, 'f', 1) + " rea:" + QString::number(zoom, 'f', 1) + " dig:" + QString::number(zoomd, 'f', 1); QString s = "tot:" + QString::number(zoomt, 'f', 1) + " rea:" + QString::number(zoom, 'f', 1) + " dig:" + QString::number(zoomd, 'f', 1);
m_widget->labelMapZoom->setText(s); m_widget->labelMapZoom->setText(s);
int i_zoom = (int)(zoomt + 0.5); int i_zoom = (int)(zoomt + 0.5);
if (i_zoom < min_zoom) i_zoom = min_zoom; if (i_zoom < m_min_zoom) i_zoom = m_min_zoom;
else else
if (i_zoom > max_zoom) i_zoom = max_zoom; if (i_zoom > m_max_zoom) i_zoom = m_max_zoom;
if (m_widget->horizontalSliderZoom->value() != i_zoom) if (m_widget->horizontalSliderZoom->value() != i_zoom)
m_widget->horizontalSliderZoom->setValue(i_zoom); // set the GUI zoom slider position m_widget->horizontalSliderZoom->setValue(i_zoom); // set the GUI zoom slider position
int index0_zoom = i_zoom - min_zoom; // zoom level starting at index level '0' int index0_zoom = i_zoom - m_min_zoom; // zoom level starting at index level '0'
if (index0_zoom < zoomAct.count()) if (index0_zoom < zoomAct.count())
zoomAct.at(index0_zoom)->setChecked(true); // set the right-click context menu zoom level zoomAct.at(index0_zoom)->setChecked(true); // set the right-click context menu zoom level
} }
@ -779,8 +814,8 @@ void OPMapGadgetWidget::OnMapDrag()
void OPMapGadgetWidget::OnCurrentPositionChanged(internals::PointLatLng point) void OPMapGadgetWidget::OnCurrentPositionChanged(internals::PointLatLng point)
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
QString coord_str = QString::number(point.Lat(), 'f', 7) + " " + QString::number(point.Lng(), 'f', 7) + " "; QString coord_str = QString::number(point.Lat(), 'f', 7) + " " + QString::number(point.Lng(), 'f', 7) + " ";
m_widget->labelMapPos->setText(coord_str); m_widget->labelMapPos->setText(coord_str);
@ -791,8 +826,8 @@ void OPMapGadgetWidget::OnCurrentPositionChanged(internals::PointLatLng point)
*/ */
void OPMapGadgetWidget::OnTilesStillToLoad(int number) void OPMapGadgetWidget::OnTilesStillToLoad(int number)
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
// if (prev_tile_number < number || m_widget->progressBarMap->maximum() < number) // if (prev_tile_number < number || m_widget->progressBarMap->maximum() < number)
// m_widget->progressBarMap->setMaximum(number); // m_widget->progressBarMap->setMaximum(number);
@ -804,7 +839,7 @@ void OPMapGadgetWidget::OnTilesStillToLoad(int number)
// m_widget->labelNumTilesToLoad->setText(QString::number(number)); // m_widget->labelNumTilesToLoad->setText(QString::number(number));
prev_tile_number = number; m_prev_tile_number = number;
} }
/** /**
@ -812,8 +847,8 @@ void OPMapGadgetWidget::OnTilesStillToLoad(int number)
*/ */
void OPMapGadgetWidget::OnTileLoadStart() void OPMapGadgetWidget::OnTileLoadStart()
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
m_widget->progressBarMap->setVisible(true); m_widget->progressBarMap->setVisible(true);
} }
@ -826,8 +861,8 @@ void OPMapGadgetWidget::OnTileLoadStart()
void OPMapGadgetWidget::OnTileLoadComplete() void OPMapGadgetWidget::OnTileLoadComplete()
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
m_widget->progressBarMap->setVisible(false); m_widget->progressBarMap->setVisible(false);
} }
@ -878,11 +913,11 @@ void OPMapGadgetWidget::WPValuesChanged(WayPointItem *waypoint)
case MagicWaypoint_MapMode: case MagicWaypoint_MapMode:
// update our copy of the magic waypoint // update our copy of the magic waypoint
if (magic_waypoint.map_wp_item && magic_waypoint.map_wp_item == waypoint) if (m_magic_waypoint.map_wp_item && m_magic_waypoint.map_wp_item == waypoint)
{ {
magic_waypoint.coord = waypoint->Coord(); m_magic_waypoint.coord = waypoint->Coord();
magic_waypoint.altitude = waypoint->Altitude(); m_magic_waypoint.altitude = waypoint->Altitude();
magic_waypoint.description = waypoint->Description(); m_magic_waypoint.description = waypoint->Description();
// move the UAV to the magic waypoint position // move the UAV to the magic waypoint position
// moveToMagicWaypointPosition(); // moveToMagicWaypointPosition();
@ -930,8 +965,8 @@ void OPMapGadgetWidget::on_toolButtonMapHome_clicked()
void OPMapGadgetWidget::on_toolButtonMapUAV_clicked() void OPMapGadgetWidget::on_toolButtonMapUAV_clicked()
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
QMutexLocker locker(&m_map_mutex); QMutexLocker locker(&m_map_mutex);
@ -940,16 +975,16 @@ void OPMapGadgetWidget::on_toolButtonMapUAV_clicked()
void OPMapGadgetWidget::on_toolButtonMapUAVheading_clicked() void OPMapGadgetWidget::on_toolButtonMapUAVheading_clicked()
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
followUAVheadingAct->toggle(); followUAVheadingAct->toggle();
} }
void OPMapGadgetWidget::on_horizontalSliderZoom_sliderMoved(int position) void OPMapGadgetWidget::on_horizontalSliderZoom_sliderMoved(int position)
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
QMutexLocker locker(&m_map_mutex); QMutexLocker locker(&m_map_mutex);
@ -982,7 +1017,7 @@ void OPMapGadgetWidget::on_toolButtonMoveToWP_clicked()
void OPMapGadgetWidget::onTelemetryConnect() void OPMapGadgetWidget::onTelemetryConnect()
{ {
telemetry_connected = true; m_telemetry_connected = true;
if (!obum) return; if (!obum) return;
@ -998,14 +1033,14 @@ void OPMapGadgetWidget::onTelemetryConnect()
setHome(internals::PointLatLng(LLA[0], LLA[1])); setHome(internals::PointLatLng(LLA[0], LLA[1]));
if (m_map) if (m_map)
m_map->SetCurrentPosition(home_position.coord); // set the map position m_map->SetCurrentPosition(m_home_position.coord); // set the map position
// *********************** // ***********************
} }
void OPMapGadgetWidget::onTelemetryDisconnect() void OPMapGadgetWidget::onTelemetryDisconnect()
{ {
telemetry_connected = false; m_telemetry_connected = false;
} }
// Updates the Home position icon whenever the HomePosition object is updated // Updates the Home position icon whenever the HomePosition object is updated
@ -1027,8 +1062,8 @@ void OPMapGadgetWidget::homePositionUpdated(UAVObject *hp)
*/ */
void OPMapGadgetWidget::setHome(QPointF pos) void OPMapGadgetWidget::setHome(QPointF pos)
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
double latitude = pos.x(); double latitude = pos.x();
double longitude = pos.y(); double longitude = pos.y();
@ -1051,8 +1086,8 @@ void OPMapGadgetWidget::setHome(QPointF pos)
*/ */
void OPMapGadgetWidget::setHome(internals::PointLatLng pos_lat_lon) void OPMapGadgetWidget::setHome(internals::PointLatLng pos_lat_lon)
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
if (pos_lat_lon.Lat() != pos_lat_lon.Lat() || pos_lat_lon.Lng() != pos_lat_lon.Lng()) if (pos_lat_lon.Lat() != pos_lat_lon.Lat() || pos_lat_lon.Lng() != pos_lat_lon.Lng())
return;; // nan prevention return;; // nan prevention
@ -1074,9 +1109,9 @@ void OPMapGadgetWidget::setHome(internals::PointLatLng pos_lat_lon)
// ********* // *********
home_position.coord = internals::PointLatLng(latitude, longitude); m_home_position.coord = internals::PointLatLng(latitude, longitude);
m_map->Home->SetCoord(home_position.coord); m_map->Home->SetCoord(m_home_position.coord);
m_map->Home->RefreshPos(); m_map->Home->RefreshPos();
// move the magic waypoint to keep it within the safe area boundry // move the magic waypoint to keep it within the safe area boundry
@ -1089,52 +1124,74 @@ void OPMapGadgetWidget::setHome(internals::PointLatLng pos_lat_lon)
*/ */
void OPMapGadgetWidget::goHome() void OPMapGadgetWidget::goHome()
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
followUAVpositionAct->setChecked(false); followUAVpositionAct->setChecked(false);
internals::PointLatLng home_pos = home_position.coord; // get the home location internals::PointLatLng home_pos = m_home_position.coord; // get the home location
m_map->SetCurrentPosition(home_pos); // center the map onto the home location m_map->SetCurrentPosition(home_pos); // center the map onto the home location
} }
void OPMapGadgetWidget::zoomIn() void OPMapGadgetWidget::zoomIn()
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
int zoom = m_map->ZoomTotal() + 1; int zoom = m_map->ZoomTotal() + 1;
if (zoom < min_zoom) zoom = min_zoom; if (zoom < m_min_zoom) zoom = m_min_zoom;
else else
if (zoom > max_zoom) zoom = max_zoom; if (zoom > m_max_zoom) zoom = m_max_zoom;
m_map->SetZoom(zoom); m_map->SetZoom(zoom);
} }
void OPMapGadgetWidget::zoomOut() void OPMapGadgetWidget::zoomOut()
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
int zoom = m_map->ZoomTotal() - 1; int zoom = m_map->ZoomTotal() - 1;
if (zoom < min_zoom) zoom = min_zoom; if (zoom < m_min_zoom) zoom = m_min_zoom;
else else
if (zoom > max_zoom) zoom = max_zoom; if (zoom > m_max_zoom) zoom = m_max_zoom;
m_map->SetZoom(zoom); m_map->SetZoom(zoom);
} }
void OPMapGadgetWidget::setMaxUpdateRate(int update_rate)
{
if (!m_widget || !m_map)
return;
int list_size = sizeof(max_update_rate_list) / sizeof(max_update_rate_list[0]);
int min_rate = max_update_rate_list[0];
int max_rate = max_update_rate_list[list_size - 1];
if (update_rate < min_rate) update_rate = min_rate;
else
if (update_rate > max_rate) update_rate = max_rate;
m_maxUpdateRate = update_rate;
if (m_updateTimer)
m_updateTimer->setInterval(m_maxUpdateRate);
// if (m_statusUpdateTimer)
// m_statusUpdateTimer->setInterval(m_maxUpdateRate);
}
void OPMapGadgetWidget::setZoom(int zoom) void OPMapGadgetWidget::setZoom(int zoom)
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
if (zoom < min_zoom) zoom = min_zoom; if (zoom < m_min_zoom) zoom = m_min_zoom;
else else
if (zoom > max_zoom) zoom = max_zoom; if (zoom > m_max_zoom) zoom = m_max_zoom;
internals::MouseWheelZoomType::Types zoom_type = m_map->GetMouseWheelZoomType(); internals::MouseWheelZoomType::Types zoom_type = m_map->GetMouseWheelZoomType();
m_map->SetMouseWheelZoomType(internals::MouseWheelZoomType::ViewCenter); m_map->SetMouseWheelZoomType(internals::MouseWheelZoomType::ViewCenter);
@ -1146,8 +1203,8 @@ void OPMapGadgetWidget::setZoom(int zoom)
void OPMapGadgetWidget::setPosition(QPointF pos) void OPMapGadgetWidget::setPosition(QPointF pos)
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
double latitude = pos.y(); double latitude = pos.y();
double longitude = pos.x(); double longitude = pos.x();
@ -1168,48 +1225,48 @@ void OPMapGadgetWidget::setPosition(QPointF pos)
void OPMapGadgetWidget::setMapProvider(QString provider) void OPMapGadgetWidget::setMapProvider(QString provider)
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
m_map->SetMapType(mapcontrol::Helper::MapTypeFromString(provider)); m_map->SetMapType(mapcontrol::Helper::MapTypeFromString(provider));
} }
void OPMapGadgetWidget::setAccessMode(QString accessMode) void OPMapGadgetWidget::setAccessMode(QString accessMode)
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
m_map->configuration->SetAccessMode(mapcontrol::Helper::AccessModeFromString(accessMode)); m_map->configuration->SetAccessMode(mapcontrol::Helper::AccessModeFromString(accessMode));
} }
void OPMapGadgetWidget::setUseOpenGL(bool useOpenGL) void OPMapGadgetWidget::setUseOpenGL(bool useOpenGL)
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
m_map->SetUseOpenGL(useOpenGL); m_map->SetUseOpenGL(useOpenGL);
} }
void OPMapGadgetWidget::setShowTileGridLines(bool showTileGridLines) void OPMapGadgetWidget::setShowTileGridLines(bool showTileGridLines)
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
m_map->SetShowTileGridLines(showTileGridLines); m_map->SetShowTileGridLines(showTileGridLines);
} }
void OPMapGadgetWidget::setUseMemoryCache(bool useMemoryCache) void OPMapGadgetWidget::setUseMemoryCache(bool useMemoryCache)
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
m_map->configuration->SetUseMemoryCache(useMemoryCache); m_map->configuration->SetUseMemoryCache(useMemoryCache);
} }
void OPMapGadgetWidget::setCacheLocation(QString cacheLocation) void OPMapGadgetWidget::setCacheLocation(QString cacheLocation)
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
cacheLocation = cacheLocation.simplified(); // remove any surrounding spaces cacheLocation = cacheLocation.simplified(); // remove any surrounding spaces
@ -1235,8 +1292,8 @@ void OPMapGadgetWidget::setCacheLocation(QString cacheLocation)
void OPMapGadgetWidget::setMapMode(opMapModeType mode) void OPMapGadgetWidget::setMapMode(opMapModeType mode)
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
if (mode != Normal_MapMode && mode != MagicWaypoint_MapMode) if (mode != Normal_MapMode && mode != MagicWaypoint_MapMode)
mode = Normal_MapMode; // fix error mode = Normal_MapMode; // fix error
@ -1268,12 +1325,12 @@ void OPMapGadgetWidget::setMapMode(opMapModeType mode)
hideMagicWaypointControls(); hideMagicWaypointControls();
// delete the magic waypoint from the map // delete the magic waypoint from the map
if (magic_waypoint.map_wp_item) if (m_magic_waypoint.map_wp_item)
{ {
magic_waypoint.coord = magic_waypoint.map_wp_item->Coord(); m_magic_waypoint.coord = m_magic_waypoint.map_wp_item->Coord();
magic_waypoint.altitude = magic_waypoint.map_wp_item->Altitude(); m_magic_waypoint.altitude = m_magic_waypoint.map_wp_item->Altitude();
magic_waypoint.description = magic_waypoint.map_wp_item->Description(); m_magic_waypoint.description = m_magic_waypoint.map_wp_item->Description();
magic_waypoint.map_wp_item = NULL; m_magic_waypoint.map_wp_item = NULL;
} }
m_map->WPDeleteAll(); m_map->WPDeleteAll();
@ -1320,10 +1377,10 @@ void OPMapGadgetWidget::setMapMode(opMapModeType mode)
m_waypoint_list_mutex.unlock(); m_waypoint_list_mutex.unlock();
// restore the magic waypoint on the map // restore the magic waypoint on the map
magic_waypoint.map_wp_item = m_map->WPCreate(magic_waypoint.coord, magic_waypoint.altitude, magic_waypoint.description); m_magic_waypoint.map_wp_item = m_map->WPCreate(m_magic_waypoint.coord, m_magic_waypoint.altitude, m_magic_waypoint.description);
magic_waypoint.map_wp_item->setZValue(10 + magic_waypoint.map_wp_item->Number()); m_magic_waypoint.map_wp_item->setZValue(10 + m_magic_waypoint.map_wp_item->Number());
magic_waypoint.map_wp_item->SetShowNumber(false); m_magic_waypoint.map_wp_item->SetShowNumber(false);
magic_waypoint.map_wp_item->picture.load(QString::fromUtf8(":/opmap/images/waypoint_marker3.png")); m_magic_waypoint.map_wp_item->picture.load(QString::fromUtf8(":/opmap/images/waypoint_marker3.png"));
break; break;
} }
@ -1334,8 +1391,10 @@ void OPMapGadgetWidget::setMapMode(opMapModeType mode)
void OPMapGadgetWidget::createActions() void OPMapGadgetWidget::createActions()
{ {
if (!m_widget) int list_size;
return;
if (!m_widget || !m_map)
return;
// *********************** // ***********************
// create menu actions // create menu actions
@ -1503,7 +1562,7 @@ void OPMapGadgetWidget::createActions()
zoomActGroup = new QActionGroup(this); zoomActGroup = new QActionGroup(this);
connect(zoomActGroup, SIGNAL(triggered(QAction *)), this, SLOT(onZoomActGroup_triggered(QAction *))); connect(zoomActGroup, SIGNAL(triggered(QAction *)), this, SLOT(onZoomActGroup_triggered(QAction *)));
zoomAct.clear(); zoomAct.clear();
for (int i = min_zoom; i <= max_zoom; i++) for (int i = m_min_zoom; i <= m_max_zoom; i++)
{ {
QAction *zoom_act = new QAction(QString::number(i), zoomActGroup); QAction *zoom_act = new QAction(QString::number(i), zoomActGroup);
zoom_act->setCheckable(true); zoom_act->setCheckable(true);
@ -1511,7 +1570,22 @@ void OPMapGadgetWidget::createActions()
zoomAct.append(zoom_act); zoomAct.append(zoom_act);
} }
// ***** maxUpdateRateActGroup = new QActionGroup(this);
connect(maxUpdateRateActGroup, SIGNAL(triggered(QAction *)), this, SLOT(onMaxUpdateRateActGroup_triggered(QAction *)));
maxUpdateRateAct.clear();
list_size = sizeof(max_update_rate_list) / sizeof(max_update_rate_list[0]);
for (int i = 0; i < list_size; i++)
{
QAction *maxUpdateRate_act;
int j = max_update_rate_list[i];
maxUpdateRate_act = new QAction(QString::number(j), maxUpdateRateActGroup);
maxUpdateRate_act->setCheckable(true);
maxUpdateRate_act->setData(j);
maxUpdateRate_act->setChecked(j == m_maxUpdateRate);
maxUpdateRateAct.append(maxUpdateRate_act);
}
// *****
// safe area // safe area
showSafeAreaAct = new QAction(tr("Show Safe Area"), this); showSafeAreaAct = new QAction(tr("Show Safe Area"), this);
@ -1523,7 +1597,8 @@ void OPMapGadgetWidget::createActions()
safeAreaActGroup = new QActionGroup(this); safeAreaActGroup = new QActionGroup(this);
connect(safeAreaActGroup, SIGNAL(triggered(QAction *)), this, SLOT(onSafeAreaActGroup_triggered(QAction *))); connect(safeAreaActGroup, SIGNAL(triggered(QAction *)), this, SLOT(onSafeAreaActGroup_triggered(QAction *)));
safeAreaAct.clear(); safeAreaAct.clear();
for (int i = 0; i < (int)(sizeof(safe_area_radius_list) / sizeof(safe_area_radius_list[0])); i++) list_size = sizeof(safe_area_radius_list) / sizeof(safe_area_radius_list[0]);
for (int i = 0; i < list_size; i++)
{ {
int safeArea = safe_area_radius_list[i]; int safeArea = safe_area_radius_list[i];
QAction *safeArea_act = new QAction(QString::number(safeArea) + "m", safeAreaActGroup); QAction *safeArea_act = new QAction(QString::number(safeArea) + "m", safeAreaActGroup);
@ -1569,7 +1644,8 @@ void OPMapGadgetWidget::createActions()
uavTrailTimeActGroup = new QActionGroup(this); uavTrailTimeActGroup = new QActionGroup(this);
connect(uavTrailTimeActGroup, SIGNAL(triggered(QAction *)), this, SLOT(onUAVTrailTimeActGroup_triggered(QAction *))); connect(uavTrailTimeActGroup, SIGNAL(triggered(QAction *)), this, SLOT(onUAVTrailTimeActGroup_triggered(QAction *)));
uavTrailTimeAct.clear(); uavTrailTimeAct.clear();
for (int i = 0; i < (int)(sizeof(uav_trail_time_list) / sizeof(uav_trail_time_list[0])); i++) list_size = sizeof(uav_trail_time_list) / sizeof(uav_trail_time_list[0]);
for (int i = 0; i < list_size; i++)
{ {
int uav_trail_time = uav_trail_time_list[i]; int uav_trail_time = uav_trail_time_list[i];
QAction *uavTrailTime_act = new QAction(QString::number(uav_trail_time) + " sec", uavTrailTimeActGroup); QAction *uavTrailTime_act = new QAction(QString::number(uav_trail_time) + " sec", uavTrailTimeActGroup);
@ -1582,7 +1658,8 @@ void OPMapGadgetWidget::createActions()
uavTrailDistanceActGroup = new QActionGroup(this); uavTrailDistanceActGroup = new QActionGroup(this);
connect(uavTrailDistanceActGroup, SIGNAL(triggered(QAction *)), this, SLOT(onUAVTrailDistanceActGroup_triggered(QAction *))); connect(uavTrailDistanceActGroup, SIGNAL(triggered(QAction *)), this, SLOT(onUAVTrailDistanceActGroup_triggered(QAction *)));
uavTrailDistanceAct.clear(); uavTrailDistanceAct.clear();
for (int i = 0; i < (int)(sizeof(uav_trail_distance_list) / sizeof(uav_trail_distance_list[0])); i++) list_size = sizeof(uav_trail_distance_list) / sizeof(uav_trail_distance_list[0]);
for (int i = 0; i < list_size; i++)
{ {
int uav_trail_distance = uav_trail_distance_list[i]; int uav_trail_distance = uav_trail_distance_list[i];
QAction *uavTrailDistance_act = new QAction(QString::number(uav_trail_distance) + " meters", uavTrailDistanceActGroup); QAction *uavTrailDistance_act = new QAction(QString::number(uav_trail_distance) + " meters", uavTrailDistanceActGroup);
@ -1599,62 +1676,59 @@ void OPMapGadgetWidget::createActions()
void OPMapGadgetWidget::onReloadAct_triggered() void OPMapGadgetWidget::onReloadAct_triggered()
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
m_map->ReloadMap(); m_map->ReloadMap();
} }
void OPMapGadgetWidget::onCopyMouseLatLonToClipAct_triggered() void OPMapGadgetWidget::onCopyMouseLatLonToClipAct_triggered()
{ {
// QClipboard *clipboard = qApp->clipboard();
QClipboard *clipboard = QApplication::clipboard(); QClipboard *clipboard = QApplication::clipboard();
clipboard->setText(QString::number(context_menu_lat_lon.Lat(), 'f', 7) + ", " + QString::number(context_menu_lat_lon.Lng(), 'f', 7), QClipboard::Clipboard); clipboard->setText(QString::number(m_context_menu_lat_lon.Lat(), 'f', 7) + ", " + QString::number(m_context_menu_lat_lon.Lng(), 'f', 7), QClipboard::Clipboard);
} }
void OPMapGadgetWidget::onCopyMouseLatToClipAct_triggered() void OPMapGadgetWidget::onCopyMouseLatToClipAct_triggered()
{ {
// QClipboard *clipboard = qApp->clipboard();
QClipboard *clipboard = QApplication::clipboard(); QClipboard *clipboard = QApplication::clipboard();
clipboard->setText(QString::number(context_menu_lat_lon.Lat(), 'f', 7), QClipboard::Clipboard); clipboard->setText(QString::number(m_context_menu_lat_lon.Lat(), 'f', 7), QClipboard::Clipboard);
} }
void OPMapGadgetWidget::onCopyMouseLonToClipAct_triggered() void OPMapGadgetWidget::onCopyMouseLonToClipAct_triggered()
{ {
// QClipboard *clipboard = qApp->clipboard();
QClipboard *clipboard = QApplication::clipboard(); QClipboard *clipboard = QApplication::clipboard();
clipboard->setText(QString::number(context_menu_lat_lon.Lng(), 'f', 7), QClipboard::Clipboard); clipboard->setText(QString::number(m_context_menu_lat_lon.Lng(), 'f', 7), QClipboard::Clipboard);
} }
void OPMapGadgetWidget::onShowCompassAct_toggled(bool show) void OPMapGadgetWidget::onShowCompassAct_toggled(bool show)
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
m_map->SetShowCompass(show); m_map->SetShowCompass(show);
} }
void OPMapGadgetWidget::onShowDiagnostics_toggled(bool show) void OPMapGadgetWidget::onShowDiagnostics_toggled(bool show)
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
m_map->SetShowDiagnostics(show); m_map->SetShowDiagnostics(show);
} }
void OPMapGadgetWidget::onShowHomeAct_toggled(bool show) void OPMapGadgetWidget::onShowHomeAct_toggled(bool show)
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
m_map->Home->setVisible(show); m_map->Home->setVisible(show);
} }
void OPMapGadgetWidget::onShowUAVAct_toggled(bool show) void OPMapGadgetWidget::onShowUAVAct_toggled(bool show)
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
m_map->UAV->setVisible(show); m_map->UAV->setVisible(show);
m_map->GPS->setVisible(show); m_map->GPS->setVisible(show);
@ -1662,8 +1736,8 @@ void OPMapGadgetWidget::onShowUAVAct_toggled(bool show)
void OPMapGadgetWidget::onShowTrailAct_toggled(bool show) void OPMapGadgetWidget::onShowTrailAct_toggled(bool show)
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
m_map->UAV->SetShowTrail(show); m_map->UAV->SetShowTrail(show);
m_map->GPS->SetShowTrail(show); m_map->GPS->SetShowTrail(show);
@ -1671,8 +1745,8 @@ void OPMapGadgetWidget::onShowTrailAct_toggled(bool show)
void OPMapGadgetWidget::onShowTrailLineAct_toggled(bool show) void OPMapGadgetWidget::onShowTrailLineAct_toggled(bool show)
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
m_map->UAV->SetShowTrailLine(show); m_map->UAV->SetShowTrailLine(show);
m_map->GPS->SetShowTrailLine(show); m_map->GPS->SetShowTrailLine(show);
@ -1700,42 +1774,50 @@ void OPMapGadgetWidget::onGoZoomOutAct_triggered()
void OPMapGadgetWidget::onZoomActGroup_triggered(QAction *action) void OPMapGadgetWidget::onZoomActGroup_triggered(QAction *action)
{ {
if (!m_widget || !action) if (!m_widget || !m_map || !action)
return; return;
setZoom(action->data().toInt()); setZoom(action->data().toInt());
} }
void OPMapGadgetWidget::onMaxUpdateRateActGroup_triggered(QAction *action)
{
if (!m_widget || !m_map || !action)
return;
setMaxUpdateRate(action->data().toInt());
}
void OPMapGadgetWidget::onGoMouseClickAct_triggered() void OPMapGadgetWidget::onGoMouseClickAct_triggered()
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
m_map->SetCurrentPosition(m_map->currentMousePosition()); // center the map onto the mouse position m_map->SetCurrentPosition(m_map->currentMousePosition()); // center the map onto the mouse position
} }
void OPMapGadgetWidget::onSetHomeAct_triggered() void OPMapGadgetWidget::onSetHomeAct_triggered()
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
setHome(context_menu_lat_lon); setHome(m_context_menu_lat_lon);
setHomeLocationObject(); // update the HomeLocation UAVObject setHomeLocationObject(); // update the HomeLocation UAVObject
} }
void OPMapGadgetWidget::onGoHomeAct_triggered() void OPMapGadgetWidget::onGoHomeAct_triggered()
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
goHome(); goHome();
} }
void OPMapGadgetWidget::onGoUAVAct_triggered() void OPMapGadgetWidget::onGoUAVAct_triggered()
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
double latitude; double latitude;
double longitude; double longitude;
@ -1750,8 +1832,8 @@ void OPMapGadgetWidget::onGoUAVAct_triggered()
void OPMapGadgetWidget::onFollowUAVpositionAct_toggled(bool checked) void OPMapGadgetWidget::onFollowUAVpositionAct_toggled(bool checked)
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
if (m_widget->toolButtonMapUAV->isChecked() != checked) if (m_widget->toolButtonMapUAV->isChecked() != checked)
m_widget->toolButtonMapUAV->setChecked(checked); m_widget->toolButtonMapUAV->setChecked(checked);
@ -1761,8 +1843,8 @@ void OPMapGadgetWidget::onFollowUAVpositionAct_toggled(bool checked)
void OPMapGadgetWidget::onFollowUAVheadingAct_toggled(bool checked) void OPMapGadgetWidget::onFollowUAVheadingAct_toggled(bool checked)
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
if (m_widget->toolButtonMapUAVheading->isChecked() != checked) if (m_widget->toolButtonMapUAVheading->isChecked() != checked)
m_widget->toolButtonMapUAVheading->setChecked(checked); m_widget->toolButtonMapUAVheading->setChecked(checked);
@ -1772,8 +1854,8 @@ void OPMapGadgetWidget::onFollowUAVheadingAct_toggled(bool checked)
void OPMapGadgetWidget::onUAVTrailTypeActGroup_triggered(QAction *action) void OPMapGadgetWidget::onUAVTrailTypeActGroup_triggered(QAction *action)
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map || !action)
return; return;
int trail_type_idx = action->data().toInt(); int trail_type_idx = action->data().toInt();
@ -1785,8 +1867,8 @@ void OPMapGadgetWidget::onUAVTrailTypeActGroup_triggered(QAction *action)
void OPMapGadgetWidget::onClearUAVtrailAct_triggered() void OPMapGadgetWidget::onClearUAVtrailAct_triggered()
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
m_map->UAV->DeleteTrail(); m_map->UAV->DeleteTrail();
m_map->GPS->DeleteTrail(); m_map->GPS->DeleteTrail();
@ -1794,8 +1876,8 @@ void OPMapGadgetWidget::onClearUAVtrailAct_triggered()
void OPMapGadgetWidget::onUAVTrailTimeActGroup_triggered(QAction *action) void OPMapGadgetWidget::onUAVTrailTimeActGroup_triggered(QAction *action)
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map || !action)
return; return;
int trail_time = (double)action->data().toInt(); int trail_time = (double)action->data().toInt();
@ -1804,8 +1886,8 @@ void OPMapGadgetWidget::onUAVTrailTimeActGroup_triggered(QAction *action)
void OPMapGadgetWidget::onUAVTrailDistanceActGroup_triggered(QAction *action) void OPMapGadgetWidget::onUAVTrailDistanceActGroup_triggered(QAction *action)
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map || !action)
return; return;
int trail_distance = action->data().toInt(); int trail_distance = action->data().toInt();
@ -1818,8 +1900,8 @@ void OPMapGadgetWidget::onUAVTrailDistanceActGroup_triggered(QAction *action)
/* /*
void OPMapGadgetWidget::onAddWayPointAct_triggered() void OPMapGadgetWidget::onAddWayPointAct_triggered()
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
if (m_map_mode != Normal_MapMode) if (m_map_mode != Normal_MapMode)
return; return;
@ -1866,8 +1948,8 @@ void OPMapGadgetWidget::onAddWayPointAct_triggered()
/* /*
void OPMapGadgetWidget::onEditWayPointAct_triggered() void OPMapGadgetWidget::onEditWayPointAct_triggered()
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map)
return; return;
if (m_map_mode != Normal_MapMode) if (m_map_mode != Normal_MapMode)
return; return;
@ -2010,7 +2092,7 @@ void OPMapGadgetWidget::onShowSafeAreaAct_toggled(bool show)
void OPMapGadgetWidget::onSafeAreaActGroup_triggered(QAction *action) void OPMapGadgetWidget::onSafeAreaActGroup_triggered(QAction *action)
{ {
if (!m_widget || !m_map) if (!m_widget || !m_map || !action)
return; return;
int radius = action->data().toInt(); int radius = action->data().toInt();
@ -2033,10 +2115,10 @@ void OPMapGadgetWidget::homeMagicWaypoint()
if (m_map_mode != MagicWaypoint_MapMode) if (m_map_mode != MagicWaypoint_MapMode)
return; return;
magic_waypoint.coord = home_position.coord; m_magic_waypoint.coord = m_home_position.coord;
if (magic_waypoint.map_wp_item) if (m_magic_waypoint.map_wp_item)
magic_waypoint.map_wp_item->SetCoord(magic_waypoint.coord); m_magic_waypoint.map_wp_item->SetCoord(m_magic_waypoint.coord);
} }
// ************************************************************************************* // *************************************************************************************
@ -2134,8 +2216,8 @@ void OPMapGadgetWidget::keepMagicWaypointWithInSafeArea()
{ {
// calcute the bearing and distance from the home position to the magic waypoint // calcute the bearing and distance from the home position to the magic waypoint
double dist = distance(home_position.coord, magic_waypoint.coord); double dist = distance(m_home_position.coord, m_magic_waypoint.coord);
double bear = bearing(home_position.coord, magic_waypoint.coord); double bear = bearing(m_home_position.coord, m_magic_waypoint.coord);
// get the maximum safe distance - in kilometers // get the maximum safe distance - in kilometers
double boundry_dist = (double)m_map->Home->SafeArea() / 1000; double boundry_dist = (double)m_map->Home->SafeArea() / 1000;
@ -2147,12 +2229,12 @@ void OPMapGadgetWidget::keepMagicWaypointWithInSafeArea()
// move the magic waypoint // move the magic waypoint
magic_waypoint.coord = destPoint(home_position.coord, bear, dist); m_magic_waypoint.coord = destPoint(m_home_position.coord, bear, dist);
if (m_map_mode == MagicWaypoint_MapMode) if (m_map_mode == MagicWaypoint_MapMode)
{ // move the on-screen waypoint { // move the on-screen waypoint
if (magic_waypoint.map_wp_item) if (m_magic_waypoint.map_wp_item)
magic_waypoint.map_wp_item->SetCoord(magic_waypoint.coord); m_magic_waypoint.map_wp_item->SetCoord(m_magic_waypoint.coord);
} }
} }
@ -2289,7 +2371,21 @@ bool OPMapGadgetWidget::getUAVPosition(double &latitude, double &longitude, doub
return true; return true;
} }
// ************************************************************************************* double OPMapGadgetWidget::getUAV_Yaw()
{
if (!obm)
return 0;
UAVObject *obj = dynamic_cast<UAVDataObject*>(obm->getObject(QString("AttitudeActual")));
double yaw = obj->getField(QString("Yaw"))->getDouble();
if (yaw != yaw) yaw = 0; // nan detection
while (yaw < 0) yaw += 360;
while (yaw >= 360) yaw -= 360;
return yaw;
}
bool OPMapGadgetWidget::getGPSPosition(double &latitude, double &longitude, double &altitude) bool OPMapGadgetWidget::getGPSPosition(double &latitude, double &longitude, double &altitude)
{ {
@ -2308,22 +2404,6 @@ bool OPMapGadgetWidget::getGPSPosition(double &latitude, double &longitude, doub
return true; return true;
} }
double OPMapGadgetWidget::getUAV_Yaw()
{
if (!obm)
return 0;
UAVObject *obj = dynamic_cast<UAVDataObject*>(obm->getObject(QString("AttitudeActual")));
double yaw = obj->getField(QString("Yaw"))->getDouble();
if (yaw != yaw) yaw = 0; // nan detection
while (yaw < 0) yaw += 360;
while (yaw >= 360) yaw -= 360;
return yaw;
}
// ************************************************************************************* // *************************************************************************************
void OPMapGadgetWidget::setMapFollowingMode() void OPMapGadgetWidget::setMapFollowingMode()
@ -2359,7 +2439,7 @@ bool OPMapGadgetWidget::setHomeLocationObject()
if (!obum) if (!obum)
return false; return false;
double LLA[3] = {home_position.coord.Lat(), home_position.coord.Lng(), home_position.altitude}; double LLA[3] = {m_home_position.coord.Lat(), m_home_position.coord.Lng(), m_home_position.altitude};
return (obum->setHomeLocation(LLA, true) >= 0); return (obum->setHomeLocation(LLA, true) >= 0);
} }

View File

@ -115,7 +115,8 @@ public:
void setUseMemoryCache(bool useMemoryCache); void setUseMemoryCache(bool useMemoryCache);
void setCacheLocation(QString cacheLocation); void setCacheLocation(QString cacheLocation);
void setMapMode(opMapModeType mode); void setMapMode(opMapModeType mode);
void SetUavPic(QString UAVPic); void SetUavPic(QString UAVPic);
void setMaxUpdateRate(int update_rate);
public slots: public slots:
void homePositionUpdated(UAVObject *); void homePositionUpdated(UAVObject *);
@ -221,25 +222,31 @@ private slots:
void onClearUAVtrailAct_triggered(); void onClearUAVtrailAct_triggered();
void onUAVTrailTimeActGroup_triggered(QAction *action); void onUAVTrailTimeActGroup_triggered(QAction *action);
void onUAVTrailDistanceActGroup_triggered(QAction *action); void onUAVTrailDistanceActGroup_triggered(QAction *action);
void onMaxUpdateRateActGroup_triggered(QAction *action);
private: private:
int min_zoom;
int max_zoom; // *****
int m_min_zoom;
int m_max_zoom;
double m_heading; // uav heading double m_heading; // uav heading
internals::PointLatLng mouse_lat_lon; internals::PointLatLng m_mouse_lat_lon;
internals::PointLatLng context_menu_lat_lon; internals::PointLatLng m_context_menu_lat_lon;
int prev_tile_number; int m_prev_tile_number;
opMapModeType m_map_mode; opMapModeType m_map_mode;
t_home home_position; int m_maxUpdateRate;
t_waypoint magic_waypoint; t_home m_home_position;
QStringList findPlaceWordList; t_waypoint m_magic_waypoint;
QStringList findPlaceWordList;
QCompleter *findPlaceCompleter; QCompleter *findPlaceCompleter;
QTimer *m_updateTimer; QTimer *m_updateTimer;
@ -266,14 +273,16 @@ private:
QMutex m_map_mutex; QMutex m_map_mutex;
bool telemetry_connected; bool m_telemetry_connected;
// *****
void createActions(); void createActions();
QAction *closeAct1; QAction *closeAct1;
QAction *closeAct2; QAction *closeAct2;
QAction *reloadAct; QAction *reloadAct;
QAction *copyMouseLatLonToClipAct; QAction *copyMouseLatLonToClipAct;
QAction *copyMouseLatToClipAct; QAction *copyMouseLatToClipAct;
QAction *copyMouseLonToClipAct; QAction *copyMouseLonToClipAct;
QAction *findPlaceAct; QAction *findPlaceAct;
@ -319,7 +328,12 @@ private:
QActionGroup *zoomActGroup; QActionGroup *zoomActGroup;
QList<QAction *> zoomAct; QList<QAction *> zoomAct;
void homeMagicWaypoint(); QActionGroup *maxUpdateRateActGroup;
QList<QAction *> maxUpdateRateAct;
// *****
void homeMagicWaypoint();
void moveToMagicWaypointPosition(); void moveToMagicWaypointPosition();

View File

@ -151,6 +151,16 @@ void SystemHealthGadgetWidget::setSystemFile(QString dfn)
QGraphicsScene *l_scene = scene(); QGraphicsScene *l_scene = scene();
l_scene->setSceneRect(background->boundingRect()); l_scene->setSceneRect(background->boundingRect());
fitInView(background, Qt::KeepAspectRatio ); fitInView(background, Qt::KeepAspectRatio );
// Check whether the autopilot is connected already, by the way:
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
UAVObjectManager *objManager = pm->getObject<UAVObjectManager>();
TelemetryManager* telMngr = pm->getObject<TelemetryManager>();
if (telMngr->isConnected()) {
onAutopilotConnect();
SystemAlarms* obj = dynamic_cast<SystemAlarms*>(objManager->getObject(QString("SystemAlarms")));
updateAlarms(obj);
}
} }
} }
else else

View File

@ -143,6 +143,36 @@ int UAVObjectUtilManager::getBoardModel()
return boardType; return boardType;
} }
/**
* Get the UAV Board CPU Serial Number, for anyone interested. Return format is a byte array
*/
QByteArray UAVObjectUtilManager::getBoardCPUSerial()
{
QByteArray cpuSerial;
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
if (!pm)
return 0;
UAVObjectManager *om = pm->getObject<UAVObjectManager>();
if (!om)
return 0;
UAVDataObject *obj = dynamic_cast<UAVDataObject *>(om->getObject(QString("FirmwareIAPObj")));
// The code below will ask for the object update and wait for the updated to be received,
// or the timeout of the timer, set to 1 second.
QEventLoop loop;
connect(obj, SIGNAL(objectUpdated(UAVObject*)), &loop, SLOT(quit()));
QTimer::singleShot(1000, &loop, SLOT(quit())); // Create a timeout
obj->requestUpdate();
loop.exec();
UAVObjectField* cpuField = obj->getField("CPUSerial");
for (int i = 0; i < cpuField->getNumElements(); ++i) {
cpuSerial.append(cpuField->getValue(i).toUInt());
}
return cpuSerial;
}
// ****************************** // ******************************
// HomeLocation // HomeLocation

View File

@ -61,6 +61,7 @@ public:
int getTelemetrySerialPortSpeeds(QComboBox *comboBox); int getTelemetrySerialPortSpeeds(QComboBox *comboBox);
int getBoardModel(); int getBoardModel();
QByteArray getBoardCPUSerial();
private: private:
QMutex *mutex; QMutex *mutex;

View File

@ -9,5 +9,6 @@
<dependency name="UAVObjects" version="1.0.0"/> <dependency name="UAVObjects" version="1.0.0"/>
<dependency name="UAVTalk" version="1.0.0"/> <dependency name="UAVTalk" version="1.0.0"/>
<dependency name="RAWHid" version="1.0.0"/> <dependency name="RAWHid" version="1.0.0"/>
<dependency name="UAVObjectUtil" version="1.0.0"/>
</dependencyList> </dependencyList>
</plugin> </plugin>

View File

@ -0,0 +1,443 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 9.0, SVG Export Plug-In -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
sodipodi:docbase="/home/jimmac/gfx/ximian/tango-icon-theme/scalable/mimetypes"
sodipodi:docname="application-certificate.svg"
inkscape:version="0.46"
sodipodi:version="0.32"
id="svg5105"
xml:space="preserve"
viewBox="0 0 48 48"
height="48.000000px"
width="48.000000px"
inkscape:output_extension="org.inkscape.output.svg.inkscape"><metadata
id="metadata5189">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>Certificate</dc:title><dc:creator><cc:Agent><dc:title>Jakub Steiner</dc:title></cc:Agent></dc:creator><dc:subject><rdf:Bag><rdf:li>certificate</rdf:li></rdf:Bag></dc:subject><cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/" /></cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/"><cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" /><cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" /><cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /></cc:License></rdf:RDF>
</metadata>
<defs
id="defs5187"><inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 24 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="48 : 24 : 1"
inkscape:persp3d-origin="24 : 16 : 1"
id="perspective54" /><linearGradient
id="linearGradient6684">
<stop
id="stop6686"
offset="0.0000000"
style="stop-color:#d5dbff;stop-opacity:1.0000000;" />
<stop
id="stop6688"
offset="1"
style="stop-color:#6579ff;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient6665">
<stop
style="stop-color:#000000;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop6667" />
<stop
style="stop-color:#000000;stop-opacity:0.0000000;"
offset="1.0000000"
id="stop6669" />
</linearGradient>
<linearGradient
id="linearGradient6625">
<stop
id="stop6627"
offset="0.0000000"
style="stop-color:#1d2349;stop-opacity:1.0000000;" />
<stop
style="stop-color:#4c5279;stop-opacity:1.0000000;"
offset="0.35315102"
id="stop6637" />
<stop
style="stop-color:#b3bdff;stop-opacity:1.0000000;"
offset="0.46551725"
id="stop6633" />
<stop
id="stop6635"
offset="0.64982164"
style="stop-color:#727cbe;stop-opacity:1.0000000;" />
<stop
id="stop6629"
offset="1.0000000"
style="stop-color:#323c7e;stop-opacity:1.0000000;" />
</linearGradient>
<linearGradient
id="linearGradient6617">
<stop
id="stop6619"
offset="0.0000000"
style="stop-color:#ffffff;stop-opacity:0.24742268;" />
<stop
id="stop6621"
offset="1"
style="stop-color:#ffffff;stop-opacity:0;" />
</linearGradient>
<linearGradient
id="linearGradient6604">
<stop
id="stop6606"
offset="0.0000000"
style="stop-color:#ffa196;stop-opacity:1.0000000;" />
<stop
id="stop6608"
offset="1"
style="stop-color:#ff1f06;stop-opacity:0;" />
</linearGradient>
<radialGradient
r="13.2807"
fy="20.9712"
fx="28.7891"
cy="20.9712"
cx="28.7891"
gradientUnits="userSpaceOnUse"
id="radialGradient5199"
xlink:href="#aigrd1"
inkscape:collect="always" />
<radialGradient
r="14.6944"
fy="13.5444"
fx="19.292"
cy="13.5444"
cx="19.292"
gradientUnits="userSpaceOnUse"
id="radialGradient5201"
xlink:href="#aigrd2"
inkscape:collect="always" />
<linearGradient
y2="16.7231"
x2="23.412"
y1="11.5991"
x1="18.229"
gradientUnits="userSpaceOnUse"
id="linearGradient5203"
xlink:href="#aigrd3"
inkscape:collect="always" />
<radialGradient
gradientUnits="userSpaceOnUse"
fy="20.971201"
fx="28.789101"
r="13.280700"
cy="20.971201"
cx="28.789101"
id="aigrd1">
<stop
id="stop5115"
style="stop-color:#E41E08"
offset="0" />
<stop
id="stop5117"
style="stop-color:#901505"
offset="1" />
</radialGradient>
<radialGradient
gradientUnits="userSpaceOnUse"
fy="13.544400"
fx="19.292000"
r="14.694400"
cy="13.544400"
cx="19.292000"
id="aigrd2">
<stop
id="stop5122"
style="stop-color:#E41E08"
offset="0" />
<stop
id="stop5124"
style="stop-color:#901505"
offset="1" />
</radialGradient>
<linearGradient
y2="16.723101"
x2="23.412001"
y1="11.599100"
x1="18.229000"
gradientUnits="userSpaceOnUse"
id="aigrd3">
<stop
id="stop5137"
style="stop-color:#FFFFFF"
offset="0" />
<stop
id="stop5139"
style="stop-color:#901505"
offset="1" />
</linearGradient>
<linearGradient
gradientTransform="matrix(1.135551,0.000000,0.000000,1.135551,-3.259995,-3.266773)"
y2="16.7231"
x2="23.412"
y1="11.5991"
x1="18.229"
gradientUnits="userSpaceOnUse"
id="linearGradient5274"
xlink:href="#aigrd3"
inkscape:collect="always" />
<radialGradient
gradientTransform="matrix(1.135551,0.000000,0.000000,1.135551,-4.540325,-2.077433)"
r="14.6944"
fy="13.5444"
fx="19.292"
cy="13.5444"
cx="19.292"
gradientUnits="userSpaceOnUse"
id="radialGradient5281"
xlink:href="#aigrd2"
inkscape:collect="always" />
<radialGradient
gradientTransform="matrix(1.310386,0.000000,0.000000,1.310386,-8.642682,-4.375977)"
r="13.2807"
fy="20.9712"
fx="28.7891"
cy="20.9712"
cx="28.7891"
gradientUnits="userSpaceOnUse"
id="radialGradient5284"
xlink:href="#aigrd1"
inkscape:collect="always" />
<linearGradient
gradientUnits="userSpaceOnUse"
y2="49.895073"
x2="43.140980"
y1="5.9244628"
x1="15.338736"
gradientTransform="matrix(0.975728,0.000000,0.000000,0.931033,-0.132002,1.978392)"
id="linearGradient6610"
xlink:href="#linearGradient6604"
inkscape:collect="always" />
<linearGradient
gradientUnits="userSpaceOnUse"
y2="22.783224"
x2="29.957399"
y1="9.4436626"
x1="18.570419"
gradientTransform="matrix(1.028670,0.000000,0.000000,0.972129,-1.280330,1.189340)"
id="linearGradient6623"
xlink:href="#linearGradient6617"
inkscape:collect="always" />
<linearGradient
gradientUnits="userSpaceOnUse"
y2="35.017860"
x2="38.250904"
y1="22.886259"
x1="38.506161"
gradientTransform="matrix(0.843938,0.000000,0.000000,1.184922,-1.280330,1.689340)"
id="linearGradient6631"
xlink:href="#linearGradient6625"
inkscape:collect="always" />
<radialGradient
gradientUnits="userSpaceOnUse"
r="33.156136"
fy="19.818913"
fx="24.452202"
cy="19.818913"
cx="24.452202"
gradientTransform="matrix(1.024478,0.000000,0.000000,0.976107,0.939339,-0.530329)"
id="radialGradient6663"
xlink:href="#linearGradient6665"
inkscape:collect="always" />
<radialGradient
r="33.156136"
fy="19.818913"
fx="24.452202"
cy="19.818913"
cx="24.452202"
gradientTransform="matrix(1.024478,0.000000,0.000000,0.976107,1.646447,-0.353552)"
gradientUnits="userSpaceOnUse"
id="radialGradient6675"
xlink:href="#linearGradient6665"
inkscape:collect="always" />
<radialGradient
r="14.6944"
fy="20.479359"
fx="26.887432"
cy="20.479359"
cx="26.887432"
gradientTransform="matrix(1.135551,0.000000,0.000000,1.135551,-4.540325,-2.077433)"
gradientUnits="userSpaceOnUse"
id="radialGradient6678"
xlink:href="#aigrd2"
inkscape:collect="always" />
<linearGradient
gradientUnits="userSpaceOnUse"
y2="27.403761"
x2="36.499001"
y1="35.458244"
x1="37.502811"
gradientTransform="scale(0.843938,1.184922)"
id="linearGradient6690"
xlink:href="#linearGradient6684"
inkscape:collect="always" />
</defs>
<sodipodi:namedview
inkscape:current-layer="svg5105"
inkscape:window-y="30"
inkscape:window-x="203"
inkscape:cy="20.392013"
inkscape:cx="20.303269"
inkscape:zoom="5.6568542"
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="0.16470588"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:window-width="821"
inkscape:window-height="818"
inkscape:showpageshadow="false"
showgrid="false" />
<path
style="opacity:0.48044690;color:#000000;fill:url(#radialGradient6675);fill-opacity:1.0000000;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible"
d="M 25.389110,19.305038 C 25.389110,19.305038 19.484245,27.481005 19.484245,31.228324 C 19.484245,34.975642 26.297551,32.931650 29.022873,35.656973 C 31.748195,38.382295 22.663787,45.422711 22.663787,45.422711 L 31.748195,42.924499 L 35.381959,46.785372 C 35.381959,42.129613 40.719048,38.382295 37.993726,35.543418 C 35.154848,32.704540 27.092436,33.045205 26.638216,29.297887 C 26.183995,25.550569 25.502665,19.418593 25.502665,19.418593 L 25.389110,19.305038 z "
id="path6671" />
<path
style="opacity:0.48044690;fill:url(#radialGradient6663);fill-opacity:1.0000000;fill-rule:nonzero;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
d="M 36.916160,9.3946518 C 38.237688,12.452028 40.559293,12.296470 40.616709,16.377167 C 40.649454,18.652929 42.449165,19.847910 42.449165,22.172684 C 42.449165,24.497457 38.434150,25.646156 37.066636,27.013668 C 35.699121,28.381184 37.174521,31.888095 33.464606,32.918627 C 29.789944,33.939367 27.994548,32.508375 25.669774,32.508375 C 23.344998,32.508375 17.781956,36.991063 15.730683,34.939790 C 13.679411,32.888519 13.635647,28.405831 11.857879,26.628063 C 9.9433579,24.713542 6.9184435,22.038663 6.9184435,18.619877 C 6.9184435,15.201092 8.8926489,13.396291 11.721128,10.217892 C 14.639403,6.9385873 14.729659,2.0128046 18.148445,2.0128046 C 21.567230,2.0128046 22.877627,2.9506145 25.787409,2.8770766 C 30.425746,2.7598534 30.994149,0.55375463 34.405481,2.2835766 C 37.413183,3.8087260 35.881638,7.0012699 36.916160,9.3946518 z "
id="path6639"
sodipodi:nodetypes="csssssssssssss" />
<path
id="path5112"
d="M 23.621340,18.067599 C 23.621340,18.067599 17.716475,26.243566 17.716475,29.990885 C 17.716475,33.738203 24.529781,31.694211 27.255103,34.419534 C 29.980425,37.144856 20.896017,44.185272 20.896017,44.185272 L 29.980425,41.687060 L 33.614189,45.547933 C 33.614189,40.892174 38.951278,37.144856 36.225956,34.305979 C 33.387078,31.467101 25.324666,31.807766 24.870446,28.060448 C 24.416225,24.313130 23.734895,18.181154 23.734895,18.181154 L 23.621340,18.067599 z "
style="stroke-opacity:1.0000000;stroke-miterlimit:6.5999999;stroke-width:1.0000000;stroke:#1f254f;fill-rule:nonzero;fill-opacity:1.0000000;fill:url(#linearGradient6631)" />
<path
sodipodi:nodetypes="cscccsss"
style="fill:none;fill-opacity:1.0000000;fill-rule:nonzero;stroke:url(#linearGradient6690);stroke-width:0.72112519;stroke-miterlimit:6.5999999;stroke-opacity:1.0000000"
d="M 20.803213,31.602421 C 25.355213,32.050805 28.232227,32.837946 28.609835,35.591528 C 28.939949,37.998767 24.377692,42.324487 24.377692,42.324487 L 30.221580,40.699741 L 33.062950,43.660691 C 33.725862,39.949751 37.427758,37.438687 35.741856,35.156087 C 33.627168,32.292939 26.775807,32.912620 26.448257,30.210335 C 26.120707,27.508049 18.114196,31.334950 20.803213,31.602421 z "
id="path6680" />
<path
sodipodi:nodetypes="csssssssssssss"
id="path5119"
d="M 34.935485,9.2468088 C 36.201806,12.176463 38.426426,12.027404 38.481444,15.937630 C 38.512821,18.118322 40.237349,19.263383 40.237349,21.491039 C 40.237349,23.718695 36.390061,24.819407 35.079675,26.129792 C 33.769288,27.440180 35.183053,30.800590 31.628119,31.788071 C 28.106966,32.766170 26.386573,31.394957 24.158916,31.394957 C 21.931258,31.394957 16.600611,35.690381 14.635030,33.724800 C 12.669450,31.759221 12.627514,27.463797 10.924012,25.760295 C 9.0894699,23.925753 6.1909207,21.362617 6.1909207,18.086651 C 6.1909207,14.810685 8.0826538,13.081280 10.792974,10.035658 C 13.589338,6.8933472 13.675824,2.1733389 16.951790,2.1733389 C 20.227756,2.1733389 21.483411,3.0719718 24.271637,3.0015059 C 28.716208,2.8891797 29.260866,0.77524063 32.529689,2.4327994 C 35.411745,3.8942357 33.944180,6.9534113 34.935485,9.2468088 z "
style="stroke-opacity:1.0000000;stroke-miterlimit:4.0000000;stroke-linejoin:round;stroke-linecap:round;stroke:#4c0901;fill-rule:nonzero;fill:url(#radialGradient5284)" />
<path
id="path5126"
d="M 34.976850,17.567599 C 34.976850,23.813130 29.866870,28.923109 23.621340,28.923109 C 17.375809,28.923109 12.265830,23.813130 12.265830,17.567599 C 12.265830,11.322069 17.375809,6.2120891 23.621340,6.2120891 C 29.866870,6.2120891 34.976850,11.322069 34.976850,17.567599 z "
style="stroke-miterlimit:4.0000000;stroke:none;fill-rule:nonzero;fill:url(#radialGradient6678)" />
<path
style="fill:none;fill-rule:nonzero;stroke:url(#linearGradient6610);stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
d="M 33.888971,10.030124 C 35.042232,12.698211 37.068232,12.562460 37.118338,16.123571 C 37.146913,18.109565 38.717470,19.152392 38.717470,21.181157 C 38.717470,23.209922 35.213679,24.212359 34.020288,25.405749 C 32.826895,26.599143 34.114436,29.659526 30.876896,30.558842 C 27.670121,31.449613 26.103329,30.200827 24.074563,30.200827 C 22.045797,30.200827 17.191084,34.112744 15.400995,32.322655 C 13.610908,30.532568 13.572716,26.620651 12.021307,25.069242 C 10.350558,23.398493 7.7107989,21.064201 7.7107989,18.080722 C 7.7107989,15.097243 9.4336334,13.522243 11.901968,10.748543 C 14.448666,7.8867861 14.527430,3.5881928 17.510909,3.5881928 C 20.494388,3.5881928 21.637935,4.4065934 24.177221,4.3424188 C 28.224968,4.2401214 28.720998,2.3149204 31.697971,3.8244879 C 34.322710,5.1554433 32.986173,7.9414875 33.888971,10.030124 z "
id="path6600"
sodipodi:nodetypes="csssssssssssss" />
<path
id="path6612"
d="M 23.663250,7.0524597 C 17.795434,7.0524597 13.016988,11.794692 13.016988,17.662510 C 13.016988,21.333503 15.000693,24.443138 17.833154,26.353336 C 25.073625,22.456374 23.786958,15.548148 33.440430,13.606789 C 31.841424,9.7576868 28.088842,7.0524597 23.663250,7.0524597 z "
style="color:#000000;fill:url(#linearGradient6623);fill-opacity:1.0000000;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible;opacity:1.0000000" />
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -0,0 +1,131 @@
/**
******************************************************************************
*
* @file runningdevicewidget.cpp
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
* @addtogroup GCSPlugins GCS Plugins
* @{
* @addtogroup Uploader Serial and USB Uploader Plugin
* @{
* @brief The USB and Serial protocol uploader plugin
*****************************************************************************/
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "runningdevicewidget.h"
runningDeviceWidget::runningDeviceWidget(QWidget *parent) :
QWidget(parent)
{
myDevice = new Ui_runningDeviceWidget();
myDevice->setupUi(this);
devicePic = NULL; // Initialize pointer to null
// Initialization of the Device icon display
myDevice->devicePicture->setScene(new QGraphicsScene(this));
QPixmap pix = QPixmap(QString(":uploader/images/view-refresh.svg"));
myDevice->statusIcon->setPixmap(pix);
}
void runningDeviceWidget::showEvent(QShowEvent *event)
{
Q_UNUSED(event)
// Thit fitInView method should only be called now, once the
// widget is shown, otherwise it cannot compute its values and
// the result is usually a ahrsbargraph that is way too small.
if (devicePic)
myDevice->devicePicture->fitInView(devicePic,Qt::KeepAspectRatio);
}
void runningDeviceWidget::resizeEvent(QResizeEvent* event)
{
Q_UNUSED(event);
if (devicePic)
myDevice->devicePicture->fitInView(devicePic, Qt::KeepAspectRatio);
}
/**
Fills the various fields for the device
*/
void runningDeviceWidget::populate()
{
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
UAVObjectUtilManager* utilMngr = pm->getObject<UAVObjectUtilManager>();
int id = utilMngr->getBoardModel();
myDevice->deviceID->setText(QString("Device ID: ") + QString::number(id, 16));
// DeviceID tells us what sort of HW we have detected:
// display a nice icon:
myDevice->devicePicture->scene()->clear();
if (devicePic)
delete devicePic;
devicePic = new QGraphicsSvgItem();
devicePic->setSharedRenderer(new QSvgRenderer());
switch (id) {
case 0x0101:
devicePic->renderer()->load(QString(":/uploader/images/deviceID-0101.svg"));
break;
case 0x0301:
devicePic->renderer()->load(QString(":/uploader/images/deviceID-0301.svg"));
break;
case 0x0401:
devicePic->renderer()->load(QString(":/uploader/images/deviceID-0401.svg"));
break;
case 0x0201:
devicePic->renderer()->load(QString(":/uploader/images/deviceID-0201.svg"));
break;
default:
break;
}
devicePic->setElementId("device");
myDevice->devicePicture->scene()->addItem(devicePic);
myDevice->devicePicture->setSceneRect(devicePic->boundingRect());
myDevice->devicePicture->fitInView(devicePic,Qt::KeepAspectRatio);
QString serial = utilMngr->getBoardCPUSerial().toHex();
myDevice->cpuSerial->setText(serial);
status("Ready...", STATUSICON_INFO);
}
/**
Updates status message
*/
void runningDeviceWidget::status(QString str, StatusIcon ic)
{
QPixmap px;
myDevice->statusLabel->setText(str);
switch (ic) {
case STATUSICON_RUNNING:
px.load(QString(":/uploader/images/system-run.svg"));
break;
case STATUSICON_OK:
px.load(QString(":/uploader/images/dialog-apply.svg"));
break;
case STATUSICON_FAIL:
px.load(QString(":/uploader/images/process-stop.svg"));
break;
default:
px.load(QString(":/uploader/images/gtk-info.svg"));
}
myDevice->statusIcon->setPixmap(px);
}

View File

@ -0,0 +1,69 @@
/**
******************************************************************************
*
* @file devicewidget.h
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
* @addtogroup GCSPlugins GCS Plugins
* @{
* @addtogroup YModemUploader YModem Serial Uploader Plugin
* @{
* @brief The YModem protocol serial uploader plugin
*****************************************************************************/
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef RUNNINGDEVICEWIDGET_H
#define RUNNINGDEVICEWIDGET_H
#include "ui_runningdevicewidget.h"
#include "uploadergadgetwidget.h"
#include <QWidget>
#include <QErrorMessage>
#include <QtSvg/QGraphicsSvgItem>
#include <QtSvg/QSvgRenderer>
#include "uavtalk/telemetrymanager.h"
#include "extensionsystem/pluginmanager.h"
#include "uavobjectmanager.h"
#include "uavobject.h"
#include "uavobjectutilmanager.h"
class runningDeviceWidget : public QWidget
{
Q_OBJECT
public:
runningDeviceWidget( QWidget *parent = 0);
void populate();
void freeze();
QString setOpenFileName();
QString setSaveFileName();
typedef enum { STATUSICON_OK, STATUSICON_RUNNING, STATUSICON_FAIL, STATUSICON_INFO} StatusIcon;
private:
Ui_runningDeviceWidget *myDevice;
int deviceID;
QGraphicsSvgItem *devicePic;
void status(QString str, StatusIcon ic);
signals:
protected:
void showEvent(QShowEvent *event);
void resizeEvent(QResizeEvent *event);
};
#endif // RUNNINGDEVICEWIDGET_H

View File

@ -0,0 +1,91 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>runningDeviceWidget</class>
<widget class="QWidget" name="runningDeviceWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>516</width>
<height>253</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="6" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="statusIcon">
<property name="text">
<string>ic</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="statusLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Status</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="5" column="0">
<widget class="QLabel" name="deviceID">
<property name="text">
<string>DeviceID</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="cpuSerialLabel">
<property name="text">
<string>CPU Serial:</string>
</property>
</widget>
</item>
<item row="4" column="2" rowspan="2">
<widget class="QGraphicsView" name="devicePicture">
<property name="maximumSize">
<size>
<width>160</width>
<height>160</height>
</size>
</property>
<property name="styleSheet">
<string notr="true">background: transparent</string>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
</widget>
</item>
<item row="2" column="0" colspan="3">
<widget class="QLineEdit" name="description"/>
</item>
<item row="4" column="1">
<widget class="QLineEdit" name="cpuSerial"/>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -6,6 +6,7 @@ include(../../plugins/coreplugin/coreplugin.pri)
include(../../plugins/uavobjects/uavobjects.pri) include(../../plugins/uavobjects/uavobjects.pri)
include(../../plugins/uavtalk/uavtalk.pri) include(../../plugins/uavtalk/uavtalk.pri)
include(../../plugins/rawhid/rawhid.pri) include(../../plugins/rawhid/rawhid.pri)
include(../../plugins/uavobjectutil/uavobjectutil.pri)
INCLUDEPATH += ../../libs/qextserialport/src INCLUDEPATH += ../../libs/qextserialport/src
HEADERS += uploadergadget.h \ HEADERS += uploadergadget.h \
@ -20,7 +21,8 @@ HEADERS += uploadergadget.h \
SSP/port.h \ SSP/port.h \
SSP/qssp.h \ SSP/qssp.h \
SSP/qsspt.h \ SSP/qsspt.h \
SSP/common.h SSP/common.h \
runningdevicewidget.h
SOURCES += uploadergadget.cpp \ SOURCES += uploadergadget.cpp \
uploadergadgetconfiguration.cpp \ uploadergadgetconfiguration.cpp \
uploadergadgetfactory.cpp \ uploadergadgetfactory.cpp \
@ -32,12 +34,14 @@ SOURCES += uploadergadget.cpp \
devicewidget.cpp \ devicewidget.cpp \
SSP/port.cpp \ SSP/port.cpp \
SSP/qssp.cpp \ SSP/qssp.cpp \
SSP/qsspt.cpp SSP/qsspt.cpp \
runningdevicewidget.cpp
OTHER_FILES += Uploader.pluginspec OTHER_FILES += Uploader.pluginspec
FORMS += \ FORMS += \
uploader.ui \ uploader.ui \
devicewidget.ui devicewidget.ui \
runningdevicewidget.ui
RESOURCES += \ RESOURCES += \
uploader.qrc uploader.qrc

View File

@ -9,5 +9,6 @@
<file>images/deviceID-0301.svg</file> <file>images/deviceID-0301.svg</file>
<file>images/deviceID-0201.svg</file> <file>images/deviceID-0201.svg</file>
<file>images/deviceID-0101.svg</file> <file>images/deviceID-0101.svg</file>
<file>images/application-certificate.svg</file>
</qresource> </qresource>
</RCC> </RCC>

View File

@ -115,6 +115,18 @@ void UploaderGadgetWidget::onAutopilotConnect(){
m_config->bootButton->setEnabled(false); m_config->bootButton->setEnabled(false);
m_config->rescueButton->setEnabled(false); m_config->rescueButton->setEnabled(false);
m_config->telemetryLink->setEnabled(false); m_config->telemetryLink->setEnabled(false);
// Add a very simple widget with Board model & serial number
// Delete all previous tabs:
while (m_config->systemElements->count()) {
QWidget *qw = m_config->systemElements->widget(0);
m_config->systemElements->removeTab(0);
delete qw;
}
runningDeviceWidget* dw = new runningDeviceWidget(this);
dw->populate();
m_config->systemElements->addTab(dw, QString("Connected Device"));
} }
/** /**

View File

@ -31,6 +31,7 @@
#include "ui_uploader.h" #include "ui_uploader.h"
#include "delay.h" #include "delay.h"
#include "devicewidget.h" #include "devicewidget.h"
#include "runningdevicewidget.h"
#include "op_dfu.h" #include "op_dfu.h"
#include <qextserialport.h> #include <qextserialport.h>
#include <qextserialenumerator.h> #include <qextserialenumerator.h>

View File

@ -10,6 +10,7 @@ OBJDUMP = $(TCHAIN_PREFIX)objdump
SIZE = $(TCHAIN_PREFIX)size SIZE = $(TCHAIN_PREFIX)size
NM = $(TCHAIN_PREFIX)nm NM = $(TCHAIN_PREFIX)nm
STRIP = $(TCHAIN_PREFIX)strip STRIP = $(TCHAIN_PREFIX)strip
INSTALL = install
THUMB = -mthumb THUMB = -mthumb
@ -43,6 +44,7 @@ MSG_CLEANING := ${quote} CLEAN ${quote}
MSG_ASMFROMC := ${quote} AS(C) ${quote} MSG_ASMFROMC := ${quote} AS(C) ${quote}
MSG_ASMFROMC_ARM := ${quote} AS(C)-ARM ${quote} MSG_ASMFROMC_ARM := ${quote} AS(C)-ARM ${quote}
MSG_PYMITEINIT := ${quote} PY ${quote} MSG_PYMITEINIT := ${quote} PY ${quote}
MSG_INSTALLING := ${quote} INSTALL ${quote}
toprel = $(subst $(realpath $(TOP))/,,$(abspath $(1))) toprel = $(subst $(realpath $(TOP))/,,$(abspath $(1)))

View File

@ -37,17 +37,18 @@ locations (but any other locations are fine as well):
- QtSDK in C:\Qt\2010.05 - QtSDK in C:\Qt\2010.05
- msysGit in %ProgramFiles%\Git - msysGit in %ProgramFiles%\Git
- Unicode NSIS in %ProgramFiles%\NSIS\Unicode - Unicode NSIS in %ProgramFiles%\NSIS\Unicode
- OpenOCD in C:\OpenOCD\0.4.0\bin
Also it is assumed that you have the C:\Program Files\Git\cmd\ directory in Also it is assumed that you have the C:\Program Files\Git\cmd\ directory in
the PATH. Usually this is the case for msysGit installation if you have chosen the PATH. Usually this is the case for msysGit installation if you have chosen
the 2nd option: put only git and gitk in the PATH (it is recommended option). the 2nd option: put only git and gitk in the PATH (it is recommended option).
Now you need to copy two files to your msysGit installation folders. Now you need to copy few files to your msysGit installation folders.
Assuming that you installed the msysGit into C:\Program Files\Git\, Assuming that you installed the msysGit into C:\Program Files\Git\,
you have to copy: you have to copy:
make\winx86\make -> C:\Program Files\Git\bin\ make\winx86\bin\* -> C:\Program Files\Git\bin\
make\winx86\sh.cmd -> C:\Program Files\Git\cmd\ make\winx86\cmd\* -> C:\Program Files\Git\cmd\
If you have msysGit installed into another directory, you need to update paths If you have msysGit installed into another directory, you need to update paths
accordingly. Also if you have tools installed into different directories and accordingly. Also if you have tools installed into different directories and
@ -93,7 +94,7 @@ software and flight firmware built in the end.
4) To build parts of the system you can use, for example, such commands: 4) To build parts of the system you can use, for example, such commands:
user@pc /d/Work/OpenPilot/git (master) user@pc /d/Work/OpenPilot/git (master)
$ make -j2 USE_BOOTLOADER=YES GCS_BUIL_CONF=release gcs coptercontrol bl_coptercontrol $ make -j2 GCS_BUILD_CONF=release gcs coptercontrol
or to completely remove the build directory: or to completely remove the build directory:
@ -109,7 +110,7 @@ or to completely remove the build directory:
#!/bin/sh #!/bin/sh
# This is the cc_make_release.sh file used to build CC release software # This is the cc_make_release.sh file used to build CC release software
cd D:/Work/OpenPilot/git cd D:/Work/OpenPilot/git
make -j2 USE_BOOTLOADER=YES GCS_BUIL_CONF=release gcs coptercontrol bl_coptercontrol make -j2 GCS_BUILD_CONF=release gcs coptercontrol
echo RC=$? echo RC=$?
2) Run it typing: 2) Run it typing:
@ -170,7 +171,7 @@ to get rid of git bash welcome message on every script invocation.
Currently there may be some problems running scripts which contain spaces in Currently there may be some problems running scripts which contain spaces in
file names or located in directories which contain spaces in full paths. file names or located in directories which contain spaces in full paths.
It results in in strange "file not found" or other errors. It results in strange "file not found" or other errors.
It is recommended to avoid using such names with spaces. It is recommended to avoid using such names with spaces.

15
make/winx86/bin/install Normal file
View File

@ -0,0 +1,15 @@
#!/bin/sh
#
# simple install command replacement for Windows
#
# This file should be put into C:\Program Files\Git\bin\ subdirectory
# (or similar, depeding on where the msysGit package was installed)
# to provide a make command to unix-like build environment on Windows.
#
# See also:
# README.txt
# http://wiki.openpilot.org/display/Doc/GCS+Development+on+Windows
# http://wiki.openpilot.org/display/Doc/Firmware+Development+on+Windows
#
cp -f $*

View File

@ -1,6 +1,8 @@
#!/bin/sh #!/bin/sh
# #
# This file is to be put into C:\Program Files\Git\bin\ subdirectory # make command replacement for Windows
#
# This file should be put into C:\Program Files\Git\bin\ subdirectory
# (or similar, depeding on where the msysGit package was installed) # (or similar, depeding on where the msysGit package was installed)
# to provide a make command to unix-like build environment on Windows. # to provide a make command to unix-like build environment on Windows.
# #

9
make/winx86/cmd/make.sh Normal file
View File

@ -0,0 +1,9 @@
#
# make command replacement to run from command prompt under bash
#
# This file should be put into C:\Program Files\Git\cmd\ subdirectory
# (or similar, depeding on where the msysGit package was installed)
# to provide a shell prompt in the unix-like build environment on Windows.
#
exec /bin/make $*

View File

@ -1,6 +1,6 @@
@echo off @echo off
rem rem
rem This file is to be put into C:\Program Files\Git\cmd\ subdirectory rem This file should be put into C:\Program Files\Git\cmd\ subdirectory
rem (or similar, depeding on where the msysGit package was installed) rem (or similar, depeding on where the msysGit package was installed)
rem to provide a shell prompt in the unix-like build environment on Windows. rem to provide a shell prompt in the unix-like build environment on Windows.
rem rem
@ -56,6 +56,7 @@ call :which QTSDK "C:\Qt\2010.05\qt\bin" qmake.exe
call :which CODESOURCERY "C:\CodeSourcery\bin" cs-make.exe call :which CODESOURCERY "C:\CodeSourcery\bin" cs-make.exe
call :which PYTHON "C:\Python27" python.exe call :which PYTHON "C:\Python27" python.exe
call :which UNSIS "%ProgramFiles%\NSIS\Unicode" makensis.exe call :which UNSIS "%ProgramFiles%\NSIS\Unicode" makensis.exe
call :which OPENOCDBIN "C:\OpenOCD\0.4.0\bin" openocd.exe
if "%NOT_FOUND%" == "" goto set_path if "%NOT_FOUND%" == "" goto set_path

145
release/Makefile Normal file
View File

@ -0,0 +1,145 @@
# Set up a default goal
.DEFAULT_GOAL := help
# Tried the best to support parallel (-j) builds. But since this Makefile
# uses other Makefiles to build few targets which in turn have similar
# dependencies on uavobjects and other generated files, it is difficult
# to support parallel builds perfectly. But at least it was tested with
# -j (unlimited job number) on Windows and Linux.
# Locate the root of the tree
WHEREAMI := $(dir $(lastword $(MAKEFILE_LIST)))
ROOT_DIR := $(realpath $(WHEREAMI)/../)
# Set up some macros
BUILD_DIR := $(ROOT_DIR)/build
RELEASE_DATE := $(shell date +%Y%m%d)
RELEASE_TAG := unreleased
RELEASE_LBL := $(RELEASE_DATE)-$(RELEASE_TAG)
RELEASE_DIR := $(BUILD_DIR)/release-$(RELEASE_LBL)
FW_DIR := $(RELEASE_DIR)/firmware-$(RELEASE_LBL)
BL_DIR := $(FW_DIR)/bootloaders
BLUPD_DIR := $(FW_DIR)/bootloader_updaters
# Setup targets
FW_TARGETS_COMMON := ahrs pipxtreme
FW_TARGETS_INPUT := coptercontrol openpilot
FW_TARGETS_TOOLS := coptercontrol
FW_TARGETS := $(FW_TARGETS_COMMON) $(FW_TARGETS_INPUT)
BL_TARGETS := $(addprefix bl_, $(FW_TARGETS))
BLUPD_TARGETS := $(addprefix blupd_, $(FW_TARGETS))
help:
@echo
@echo " This Makefile is known to work on Linux and Mac in a standard shell environment."
@echo " It also works on Windows by following the instructions in ../make/winx86/README.txt."
@echo
@echo " Here is a summary of the available targets:"
@echo
@echo " [Release build and packaging]"
@echo " release - Build and package the OpenPilot release"
@echo " release_flight - Build and package the OpenPilot flight firmware"
@echo
@echo " Notes:"
@echo " - the build directory will be removed first on every run"
@echo " unless CLEAN_BUILD=NO is defined (recommended for testing only)"
@echo " - release packages will be placed in $(RELEASE_DIR)"
@echo
# Clean and build uavobjects since all parts depend on them
uavobjects: all_clean
$(V1) $(MAKE) -C $(ROOT_DIR) $@
all_clean:
ifneq ($(CLEAN_BUILD), NO)
$(V1) $(MAKE) -C $(ROOT_DIR) $@
endif
# Install template:
# $1 = target
# $2 = dependencies
# $3 = install directory (must be defined)
# $4 = installed file name prefix (optional)
# $5 = installed file name suffix (optional)
# $6 = extra make options (for instance, USE_SPEKTRUM=YES)
# $7 = optional target suffix (for instance, clean, if target must be cleaned first)
# $8 = list of targets to install (without _install suffix)
# $9 = inner make target (usually install, but can be other to just build)
define INSTALL_TEMPLATE
$(1): $(2)
ifneq ($(7),)
$$(V1) +$(MAKE) -C $(ROOT_DIR) $(6) $(addsuffix _$(7), $(8))
endif
$$(V1) +$(MAKE) -C $(ROOT_DIR) INSTALL_DIR=$(3) INSTALL_PFX=$(4) INSTALL_SFX=$(5) $(6) $(addsuffix _$(9), $(8))
.PHONY: $(1)
endef
# Firmware for different input drivers
$(eval $(call INSTALL_TEMPLATE,fw_common,uavobjects,$(FW_DIR),,-$(RELEASE_LBL),,,$(FW_TARGETS_COMMON),install))
$(eval $(call INSTALL_TEMPLATE,fw_pwm,uavobjects,$(FW_DIR),,-pwm-$(RELEASE_LBL),,clean,$(FW_TARGETS_INPUT),install))
$(eval $(call INSTALL_TEMPLATE,fw_spektrum,uavobjects,$(FW_DIR),,-spektrum-$(RELEASE_LBL),USE_SPEKTRUM=YES,clean,$(FW_TARGETS_INPUT),install))
$(eval $(call INSTALL_TEMPLATE,fw_ppm,uavobjects,$(FW_DIR),,-ppm-$(RELEASE_LBL),USE_PPM=YES,clean,$(FW_TARGETS_INPUT),install))
# Bootloaders (change 'bin' to 'install' to install bootloaders too)
$(eval $(call INSTALL_TEMPLATE,all_bl,uavobjects,$(BL_DIR),,-$(RELEASE_LBL),,,$(BL_TARGETS),bin))
# Bootloader Updaters
$(eval $(call INSTALL_TEMPLATE,blupd_coptercontrol,all_bl,$(BLUPD_DIR),CopterControl_,-$(RELEASE_LBL),,,blupd_coptercontrol,install))
$(eval $(call INSTALL_TEMPLATE,blupd_ahrs,all_bl,$(BLUPD_DIR),AHRS_,-$(RELEASE_LBL),,,blupd_ahrs,install))
$(eval $(call INSTALL_TEMPLATE,blupd_openpilot,all_bl,$(BLUPD_DIR),OpenPilot_,-$(RELEASE_LBL),,,blupd_openpilot,install))
$(eval $(call INSTALL_TEMPLATE,blupd_pipxtreme,all_bl,$(BLUPD_DIR),PipXtreme_,-$(RELEASE_LBL),,,blupd_pipxtreme,install))
# CopterControl flash eraser tool (change fw_spektrum to fw_ppm if fw_ppm is enabled in release_fw target below)
$(eval $(call INSTALL_TEMPLATE,fw_tools,uavobjects,$(BLUPD_DIR),,-FlashEraser-$(RELEASE_LBL),ERASE_FLASH=YES,clean,$(FW_TARGETS_TOOLS),install))
# Order-only dependencies
# They are bit complicated to support parallel (-j) builds and to
# create the pwm/ppm/spektrum and CC flash eraser targets in a sequence of build steps
fw_pwm: | # default dependencies
fw_spektrum: | fw_pwm # sequential build
fw_ppm: | fw_spektrum # sequential build
fw_tools: | fw_spektrum # sequential build, replace fw_spektrum by fw_ppm if uncommented below
release_fw: | fw_common fw_pwm fw_spektrum # fw_ppm
release_blupd: | $(BLUPD_TARGETS)
release_flight: | release_fw release_blupd fw_tools
release_ground: | ground_package
release: | release_flight release_ground
.PHONY: help uavobjects all_clean release release_flight release_fw release_blupd release_ground
# Decide on a verbosity level based on the V= parameter
export AT := @
ifndef V
export V0 :=
export V1 := $(AT)
else ifeq ($(V), 0)
export V0 := $(AT)
export V1 := $(AT)
else ifeq ($(V), 1)
endif
ifneq ($(V),1)
MAKEFLAGS += --no-print-directory
endif
# Platform-dependent stuff
PLATFORM := win32
UNAME := $(shell uname)
ifeq ($(UNAME), Linux)
PLATFORM := linux
endif
ifeq ($(UNAME), Darwin)
PLATFORM := osx
endif
include $(WHEREAMI)/Makefile.$(PLATFORM)

10
release/Makefile.linux Normal file
View File

@ -0,0 +1,10 @@
#
# Linux-specific packaging
#
gcs: uavobjects
$(V1) $(MAKE) -C $(ROOT_DIR) GCS_BUILD_CONF=release $@
ground_package: | gcs
.PHONY: gcs ground_package

10
release/Makefile.osx Normal file
View File

@ -0,0 +1,10 @@
#
# MacOSX-specific packaging
#
gcs: uavobjects
$(V1) $(MAKE) -C $(ROOT_DIR) GCS_BUILD_CONF=release $@
ground_package: | gcs
.PHONY: gcs ground_package

11
release/Makefile.win32 Normal file
View File

@ -0,0 +1,11 @@
#
# Windows-specific packaging
#
# Generate GCS installer
gcs_installer: uavobjects
$(V1) $(MAKE) -C $(ROOT_DIR) GCS_BUILD_CONF=release $@
ground_package: | gcs_installer
.PHONY: gcs_installer ground_package

View File

@ -4,7 +4,7 @@
<field name="AccelBias" units="lsb" type="int16" elementnames="X,Y,Z" defaultvalue="0"/> <field name="AccelBias" units="lsb" type="int16" elementnames="X,Y,Z" defaultvalue="0"/>
<field name="BoardRotation" units="deg" type="int8" elementnames="Roll,Pitch,Yaw" defaultvalue="0,0,0"/> <field name="BoardRotation" units="deg" type="int8" elementnames="Roll,Pitch,Yaw" defaultvalue="0,0,0"/>
<field name="GyroGain" units="(rad/s)/lsb" type="float" elements="1" defaultvalue="0.42"/> <field name="GyroGain" units="(rad/s)/lsb" type="float" elements="1" defaultvalue="0.42"/>
<field name="AccelKp" units="channel" type="float" elements="1" defaultvalue="0.01"/> <field name="AccelKp" units="channel" type="float" elements="1" defaultvalue="0.05"/>
<field name="AccelKi" units="channel" type="float" elements="1" defaultvalue="0.0001"/> <field name="AccelKi" units="channel" type="float" elements="1" defaultvalue="0.0001"/>
<field name="YawBiasRate" units="channel" type="float" elements="1" defaultvalue="0.000001"/> <field name="YawBiasRate" units="channel" type="float" elements="1" defaultvalue="0.000001"/>
<field name="ZeroDuringArming" units="channel" type="enum" elements="1" options="FALSE,TRUE" defaultvalue="FALSE"/> <field name="ZeroDuringArming" units="channel" type="enum" elements="1" options="FALSE,TRUE" defaultvalue="FALSE"/>

View File

@ -7,9 +7,9 @@
<field name="ManualRate" units="degrees/sec" type="float" elementnames="Roll,Pitch,Yaw" defaultvalue="150,150,150"/> <field name="ManualRate" units="degrees/sec" type="float" elementnames="Roll,Pitch,Yaw" defaultvalue="150,150,150"/>
<field name="MaximumRate" units="degrees/sec" type="float" elementnames="Roll,Pitch,Yaw" defaultvalue="300,300,300"/> <field name="MaximumRate" units="degrees/sec" type="float" elementnames="Roll,Pitch,Yaw" defaultvalue="300,300,300"/>
<field name="RollRatePI" units="" type="float" elementnames="Kp,Ki,ILimit" defaultvalue="0.0015,0,0.3"/> <field name="RollRatePI" units="" type="float" elementnames="Kp,Ki,ILimit" defaultvalue="0.002,0,0.3"/>
<field name="PitchRatePI" units="" type="float" elementnames="Kp,Ki,ILimit" defaultvalue="0.0015,0,0.3"/> <field name="PitchRatePI" units="" type="float" elementnames="Kp,Ki,ILimit" defaultvalue="0.002,0,0.3"/>
<field name="YawRatePI" units="" type="float" elementnames="Kp,Ki,ILimit" defaultvalue="0.003,0,0.3"/> <field name="YawRatePI" units="" type="float" elementnames="Kp,Ki,ILimit" defaultvalue="0.003,0.003,0.3"/>
<field name="RollPI" units="" type="float" elementnames="Kp,Ki,ILimit" defaultvalue="2,0,50"/> <field name="RollPI" units="" type="float" elementnames="Kp,Ki,ILimit" defaultvalue="2,0,50"/>
<field name="PitchPI" units="" type="float" elementnames="Kp,Ki,ILimit" defaultvalue="2,0,50"/> <field name="PitchPI" units="" type="float" elementnames="Kp,Ki,ILimit" defaultvalue="2,0,50"/>
<field name="YawPI" units="" type="float" elementnames="Kp,Ki,ILimit" defaultvalue="2,0,50"/> <field name="YawPI" units="" type="float" elementnames="Kp,Ki,ILimit" defaultvalue="2,0,50"/>