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
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
C: ?
D: ?

View File

@ -265,8 +265,8 @@ gcs_clean: openpilotgcs_clean
.PHONY: openpilotgcs
openpilotgcs: uavobjects_gcs
$(V1) mkdir -p $(BUILD_DIR)/ground/$@
$(V1) ( cd $(BUILD_DIR)/ground/$@ ; \
$(QMAKE) $(ROOT_DIR)/ground/openpilotgcs/openpilotgcs.pro -spec $(QT_SPEC) -r CONFIG+=$(GCS_BUILD_CONF) ; \
$(V1) ( cd $(BUILD_DIR)/ground/$@ && \
$(QMAKE) $(ROOT_DIR)/ground/openpilotgcs/openpilotgcs.pro -spec $(QT_SPEC) -r CONFIG+=$(GCS_BUILD_CONF) && \
$(MAKE) -w ; \
)
@ -290,8 +290,8 @@ openpilotgcs_clean:
.PHONY: uavobjgenerator
uavobjgenerator:
$(V1) mkdir -p $(BUILD_DIR)/ground/$@
$(V1) ( cd $(BUILD_DIR)/ground/$@ ; \
$(QMAKE) $(ROOT_DIR)/ground/uavobjgenerator/uavobjgenerator.pro -spec $(QT_SPEC) -r CONFIG+=debug ; \
$(V1) ( cd $(BUILD_DIR)/ground/$@ && \
$(QMAKE) $(ROOT_DIR)/ground/uavobjgenerator/uavobjgenerator.pro -spec $(QT_SPEC) -r CONFIG+=debug && \
$(MAKE) --no-print-directory -w ; \
)
@ -306,7 +306,7 @@ $(UAVOBJ_OUT_DIR):
$(V1) mkdir -p $@
uavobjects_%: $(UAVOBJ_OUT_DIR) uavobjgenerator
$(V1) ( cd $(UAVOBJ_OUT_DIR) ; \
$(V1) ( cd $(UAVOBJ_OUT_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:
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.
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/*)
endif
# 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:
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.
clean: clean_list
@ -426,4 +436,4 @@ else
endif
# 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:
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.
clean: begin clean_list finished end
@ -430,7 +440,6 @@ clean_list :
$(V1) $(REMOVE) $(CPPSRC:.cpp=.s)
$(V1) $(REMOVE) $(CPPSRCARM:.cpp=.s)
# Create output files directory
# all known MS Windows OS define the ComSpec environment variable
ifdef ComSpec
@ -447,4 +456,4 @@ else
endif
# 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
* might expect its value to hold the size but you'd be wrong.
*/
extern void _binary_start;
extern void _binary_end;
extern void _binary_size;
extern uint32_t _binary_start;
extern uint32_t _binary_end;
extern uint32_t _binary_size;
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_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
$(eval $(call PARTIAL_COMPILE_ARM_TEMPLATE, SRCARM))
# Generate Doxygen documents
docs:
doxygen $(DOXYGENDIR)/doxygen.cfg
$(OUTDIR)/$(TARGET).bin.o: $(OUTDIR)/$(TARGET).bin
.PHONY: elf lss sym hex bin bino
@ -447,6 +443,20 @@ $(eval $(call SIZE_TEMPLATE, $(OUTDIR)/$(TARGET).elf))
.PHONY: 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.
clean: clean_list
@ -484,4 +494,4 @@ else
endif
# 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:
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.
clean: clean_list
@ -487,4 +497,4 @@ else
endif
# 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:
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.
clean: clean_list
@ -483,5 +493,4 @@ else
endif
# 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
## PIOS Hardware (Common)
SRC += $(PIOSCOMMON)/pios_flashfs_objlist.c
SRC += $(PIOSCOMMON)/pios_flash_w25x.c
SRC += $(PIOSCOMMON)/pios_adxl345.c
SRC += $(PIOSCOMMON)/pios_com.c
@ -591,6 +592,16 @@ size: $(OUTDIR)/$(TARGET).elf_size
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.
clean: clean_list
@ -630,5 +641,4 @@ else
endif
# 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
PIOS_Flash_W25X_EraseChip();
while(TRUE){};
#endif
/* Initialize modules */

View File

@ -84,16 +84,16 @@
#define AUXUART_BAUDRATE 19200
/* Alarm Thresholds */
#define HEAP_LIMIT_WARNING 450
#define HEAP_LIMIT_CRITICAL 350
#define HEAP_LIMIT_WARNING 350
#define HEAP_LIMIT_CRITICAL 250
#define CPULOAD_LIMIT_WARNING 80
#define CPULOAD_LIMIT_CRITICAL 95
/* Task stack sizes */
#define PIOS_ACTUATOR_STACK_SIZE 1020
#define PIOS_MANUAL_STACK_SIZE 644
#define PIOS_SYSTEM_STACK_SIZE 644
#define PIOS_STABILIZATION_STACK_SIZE 624
#define PIOS_MANUAL_STACK_SIZE 724
#define PIOS_SYSTEM_STACK_SIZE 504
#define PIOS_STABILIZATION_STACK_SIZE 524
#define PIOS_TELEM_STACK_SIZE 500
#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_ADXL345_Attach(pios_spi_flash_accel_id);
PIOS_FLASHFS_Init();
#if defined(PIOS_INCLUDE_SPEKTRUM)
/* SPEKTRUM init must come before comms */
PIOS_SPEKTRUM_Init();

View File

@ -416,6 +416,16 @@ size: $(OUTDIR)/$(TARGET).elf_size
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.
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/*)
endif
# 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 ++;
}
}
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
continue;
@ -198,8 +198,12 @@ static void actuatorTask(void* parameters)
float curve2 = MixerCurve(desired.Throttle,mixerSettings.ThrottleCurve2);
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;
}
status[ct] = ProcessMixer(ct, curve1, curve2, &mixerSettings, &desired, dT);
@ -400,14 +404,19 @@ static void setFailsafe()
// Reset ActuatorCommand to safe values
for (int n = 0; n < ACTUATORCOMMAND_CHANNEL_NUMELEM; ++n)
{
if(mixers[n].type == MIXERSETTINGS_MIXER1TYPE_MOTOR)
{
command.Channel[n] = settings.ChannelMin[n];
}
else
else if(mixers[n].type == MIXERSETTINGS_MIXER1TYPE_SERVO)
{
command.Channel[n] = settings.ChannelNeutral[n];
}
else
{
command.Channel[n] = 0;
}
}
// Set alarm

View File

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

View File

@ -30,6 +30,7 @@
#include "openpilot.h"
#include "firmwareiap.h"
#include "firmwareiapobj.h"
#include "flightstatus.h"
// Private constants
#define IAP_CMD_STEP_1 1122
@ -156,6 +157,16 @@ static void FirmwareIAPCallback(UAVObjEvent* ev)
case IAP_STATE_STEP_2:
if( data.Command == IAP_CMD_STEP_3 ) {
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 time requirements.
PIOS_IAP_SetRequest1();

View File

@ -63,7 +63,7 @@ static float GravityAccel(float latitude, float longitude, float altitude);
// Private constants
//#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_COMMAND_RESEND_TIMEOUT_MS 2000
@ -154,7 +154,7 @@ static void gpsTask(void *parameters)
}
#endif
#ifdef DISABLE_GPS_TRESHOLD
#ifdef DISABLE_GPS_THRESHOLD
PIOS_COM_SendStringNonBlocking(gpsPort, "$PMTK397,0*23\r\n");
#endif

View File

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

View File

@ -52,14 +52,13 @@ endif
FLASH_TOOL = OPENOCD
# 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 MK/MKSerial
#MODULES = Telemetry
#MODULES += Osd/OsdEtStd
# MCU name, submodel and board
# - MCU used for compiler-option (-mcpu)
# - 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.)
# use file-extension c for "c-only"-files
MODNAMES = $(notdir ${MODULES})
MODNAMES = $(notdir ${MODULES} ${PYMODULES})
ifndef TESTAPP
## PyMite files
## PyMite files and modules
SRC += $(OUTDIR)/pmlib_img.c
SRC += $(OUTDIR)/pmlib_nat.c
SRC += $(OUTDIR)/pmlibusr_img.c
SRC += $(OUTDIR)/pmlibusr_nat.c
SRC += $(wildcard ${PYMITEVM}/*.c)
SRC += $(wildcard ${PYMITEPLAT}/*.c)
PYSRC += $(wildcard ${PYMITEVM}/*.c)
PYSRC += $(wildcard ${PYMITEPLAT}/*.c)
PYSRC += ${foreach MOD, ${PYMODULES}, ${wildcard ${OPMODULEDIR}/${MOD}/*.c}}
SRC += $(PYSRC)
## MODULES
SRC += ${foreach MOD, ${MODULES}, ${wildcard ${OPMODULEDIR}/${MOD}/*.c}}
@ -317,7 +318,7 @@ EXTRAINCDIRS += $(RTOSSRCDIR)/portable/GCC/ARM_CM3
EXTRAINCDIRS += $(AHRSBOOTLOADERINC)
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.
@ -481,7 +482,7 @@ LSTFILES = $(addprefix $(OUTDIR)/, $(addsuffix .lst, $(ALLSRCBASE)))
DEPFILES = $(addprefix $(OUTDIR)/dep/, $(addsuffix .o.d, $(ALLSRCBASE)))
# Default target.
all: gencode gccversion build
all: gccversion build
ifeq ($(LOADFORMAT),ihex)
build: elf hex lss sym
@ -500,6 +501,8 @@ endif
# 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
$(PYSRC): gencode
# Generate code for module initialization
${OUTDIR}/InitMods.c: Makefile
@echo $(MSG_MODINIT) $(call toprel, $@)
@ -570,6 +573,16 @@ size: $(OUTDIR)/$(TARGET).elf_size
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.
clean: clean_list
@ -609,5 +622,4 @@ else
endif
# 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;
}
/**
* @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)
{
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)
#include <pios_flash_w25x.h>
#include <pios_flashfs_objlist.h>
#endif
#if defined(PIOS_INCLUDE_BL_HELPER)

View File

@ -439,6 +439,16 @@ size: $(OUTDIR)/$(TARGET).elf_size
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.
clean: clean_list
@ -476,4 +486,4 @@ else
endif
# 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>"; };
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>"; };
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 */
/* Begin PBXGroup section */
@ -3505,6 +3553,7 @@
657CEEB5121DBC49007A1FBE /* flight */ = {
isa = PBXGroup;
children = (
65FF4BB313791C3300146BE4 /* Bootloaders */,
65F93B9012EE09280047DB36 /* PipXtreme */,
65B7E6AC120DF1CD000C1123 /* AHRS */,
65E6DF7012E02E8E00058553 /* CopterControl */,
@ -7610,6 +7659,7 @@
65E8F03711EFF25C00BBF654 /* printf-stdarg.c */,
6528CCB412E406B800CF5144 /* pios_adxl345.c */,
6512D60712ED4CB8008175E5 /* pios_flash_w25x.c */,
65FF4D5E137EDEC100146BE4 /* pios_flashfs_objlist.c */,
);
name = Common;
path = ../../PiOS/Common;
@ -7634,6 +7684,7 @@
65E8F03E11EFF25C00BBF654 /* pios_debug.h */,
65E8F03F11EFF25C00BBF654 /* pios_delay.h */,
65E8F04011EFF25C00BBF654 /* pios_exti.h */,
65FF4D61137EFA4F00146BE4 /* pios_flashfs_objlist.h */,
65E8F04111EFF25C00BBF654 /* pios_gpio.h */,
65E8F04211EFF25C00BBF654 /* pios_hmc5843.h */,
65E8F04311EFF25C00BBF654 /* pios_i2c.h */,
@ -8238,6 +8289,140 @@
path = inc;
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 */ = {
isa = PBXGroup;
children = (

View File

@ -41,10 +41,10 @@
* List of event queues and the eventmask associated with the queue.
*/
struct ObjectEventListStruct {
xQueueHandle queue;
UAVObjEventCallback cb;
int32_t eventMask;
struct ObjectEventListStruct* next;
xQueueHandle queue;
UAVObjEventCallback cb;
int32_t eventMask;
struct ObjectEventListStruct *next;
};
typedef struct ObjectEventListStruct ObjectEventList;
@ -52,9 +52,9 @@ typedef struct ObjectEventListStruct ObjectEventList;
* List of object instances, holds the actual data structure and instance ID
*/
struct ObjectInstListStruct {
void* data;
uint16_t instId;
struct ObjectInstListStruct* next;
void *data;
uint16_t instId;
struct ObjectInstListStruct *next;
};
typedef struct ObjectInstListStruct ObjectInstList;
@ -62,34 +62,48 @@ typedef struct ObjectInstListStruct ObjectInstList;
* List of objects registered in the object manager
*/
struct ObjectListStruct {
uint32_t id; /** The object ID */
const char* name; /** The object name */
int8_t isMetaobject; /** Set to 1 if this is a metaobject */
int8_t isSingleInstance; /** Set to 1 if this object has a single instance */
int8_t isSettings; /** Set to 1 if this object is a settings object */
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) */
uint32_t id;
/** The object ID */
const char *name;
/** The object name */
int8_t isMetaobject;
/** Set to 1 if this is a metaobject */
int8_t isSingleInstance;
/** Set to 1 if this object has a single instance */
int8_t isSettings;
/** Set to 1 if this object is a settings object */
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;
// Private functions
static int32_t sendEvent(ObjectList* obj, uint16_t instId, UAVObjEventType event);
static ObjectInstList* createInstance(ObjectList* obj, uint16_t instId);
static ObjectInstList* getInstance(ObjectList* obj, uint16_t instId);
static int32_t connectObj(UAVObjHandle obj, xQueueHandle queue, UAVObjEventCallback cb, int32_t eventMask);
static int32_t disconnectObj(UAVObjHandle obj, xQueueHandle queue, UAVObjEventCallback cb);
static int32_t sendEvent(ObjectList * obj, uint16_t instId,
UAVObjEventType event);
static ObjectInstList *createInstance(ObjectList * obj, uint16_t instId);
static ObjectInstList *getInstance(ObjectList * obj, uint16_t instId);
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)
static void objectFilename(ObjectList* obj, uint8_t* filename);
static void customSPrintf(uint8_t* buffer, uint8_t* format, ...);
static void objectFilename(ObjectList * obj, uint8_t * filename);
static void customSPrintf(uint8_t * buffer, uint8_t * format, ...);
#endif
// Private variables
static ObjectList* objList;
static ObjectList *objList;
static xSemaphoreHandle mutex;
static UAVObjMetadata defMetadata;
static UAVObjStats stats;
@ -101,40 +115,40 @@ static UAVObjStats stats;
*/
int32_t UAVObjInitialize()
{
// Initialize variables
objList = NULL;
memset(&stats, 0, sizeof(UAVObjStats));
// Initialize variables
objList = NULL;
memset(&stats, 0, sizeof(UAVObjStats));
// Create mutex
mutex = xSemaphoreCreateRecursiveMutex();
if (mutex == NULL)
return -1;
// Create mutex
mutex = xSemaphoreCreateRecursiveMutex();
if (mutex == NULL)
return -1;
// Initialize default metadata structure (metadata of metaobjects)
defMetadata.access = ACCESS_READWRITE;
defMetadata.gcsAccess = ACCESS_READWRITE;
defMetadata.telemetryAcked = 1;
defMetadata.telemetryUpdateMode = UPDATEMODE_ONCHANGE;
defMetadata.telemetryUpdatePeriod = 0;
defMetadata.gcsTelemetryAcked = 1;
defMetadata.gcsTelemetryUpdateMode = UPDATEMODE_ONCHANGE;
defMetadata.gcsTelemetryUpdatePeriod = 0;
defMetadata.loggingUpdateMode = UPDATEMODE_ONCHANGE;
defMetadata.loggingUpdatePeriod = 0;
// Initialize default metadata structure (metadata of metaobjects)
defMetadata.access = ACCESS_READWRITE;
defMetadata.gcsAccess = ACCESS_READWRITE;
defMetadata.telemetryAcked = 1;
defMetadata.telemetryUpdateMode = UPDATEMODE_ONCHANGE;
defMetadata.telemetryUpdatePeriod = 0;
defMetadata.gcsTelemetryAcked = 1;
defMetadata.gcsTelemetryUpdateMode = UPDATEMODE_ONCHANGE;
defMetadata.gcsTelemetryUpdatePeriod = 0;
defMetadata.loggingUpdateMode = UPDATEMODE_ONCHANGE;
defMetadata.loggingUpdatePeriod = 0;
// Done
return 0;
// Done
return 0;
}
/**
* Get the statistics counters
* @param[out] statsOut The statistics counters will be copied there
*/
void UAVObjGetStats(UAVObjStats* statsOut)
void UAVObjGetStats(UAVObjStats * statsOut)
{
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
memcpy(statsOut, &stats, sizeof(UAVObjStats));
xSemaphoreGiveRecursive(mutex);
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
memcpy(statsOut, &stats, sizeof(UAVObjStats));
xSemaphoreGiveRecursive(mutex);
}
/**
@ -142,9 +156,9 @@ void UAVObjGetStats(UAVObjStats* statsOut)
*/
void UAVObjClearStats()
{
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
memset(&stats, 0, sizeof(UAVObjStats));
xSemaphoreGiveRecursive(mutex);
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
memset(&stats, 0, sizeof(UAVObjStats));
xSemaphoreGiveRecursive(mutex);
}
/**
@ -160,91 +174,85 @@ void UAVObjClearStats()
* \return Object handle, or NULL if failure.
* \return
*/
UAVObjHandle UAVObjRegister(uint32_t id, const char* name, const char* metaName, int32_t isMetaobject,
int32_t isSingleInstance, int32_t isSettings, uint32_t numBytes, UAVObjInitializeCallback initCb)
UAVObjHandle UAVObjRegister(uint32_t id, const char *name,
const char *metaName, int32_t isMetaobject,
int32_t isSingleInstance, int32_t isSettings,
uint32_t numBytes,
UAVObjInitializeCallback initCb)
{
ObjectList* objEntry;
ObjectInstList* instEntry;
ObjectList* metaObj;
ObjectList *objEntry;
ObjectInstList *instEntry;
ObjectList *metaObj;
// Get lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Get lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Check that the object is not already registered
LL_FOREACH(objList, objEntry)
{
if (objEntry->id == id)
{
// Already registered, ignore
xSemaphoreGiveRecursive(mutex);
return NULL;
}
}
// Check that the object is not already registered
LL_FOREACH(objList, objEntry) {
if (objEntry->id == id) {
// Already registered, ignore
xSemaphoreGiveRecursive(mutex);
return NULL;
}
}
// Create and append entry
objEntry = (ObjectList*)pvPortMalloc(sizeof(ObjectList));
if (objEntry == NULL)
{
xSemaphoreGiveRecursive(mutex);
return NULL;
}
objEntry->id = id;
objEntry->name = name;
objEntry->isMetaobject = (int8_t)isMetaobject;
objEntry->isSingleInstance = (int8_t)isSingleInstance;
objEntry->isSettings = (int8_t)isSettings;
objEntry->numBytes = numBytes;
objEntry->events = NULL;
objEntry->numInstances = 0;
objEntry->instances.data = NULL;
objEntry->instances.instId = 0xFFFF;
objEntry->instances.next = NULL;
objEntry->linkedObj = NULL; // will be set later
LL_APPEND(objList, objEntry);
// Create and append entry
objEntry = (ObjectList *) pvPortMalloc(sizeof(ObjectList));
if (objEntry == NULL) {
xSemaphoreGiveRecursive(mutex);
return NULL;
}
objEntry->id = id;
objEntry->name = name;
objEntry->isMetaobject = (int8_t) isMetaobject;
objEntry->isSingleInstance = (int8_t) isSingleInstance;
objEntry->isSettings = (int8_t) isSettings;
objEntry->numBytes = numBytes;
objEntry->events = NULL;
objEntry->numInstances = 0;
objEntry->instances.data = NULL;
objEntry->instances.instId = 0xFFFF;
objEntry->instances.next = NULL;
objEntry->linkedObj = NULL; // will be set later
LL_APPEND(objList, objEntry);
// Create instance zero
instEntry = createInstance(objEntry, 0);
if ( instEntry == NULL )
{
xSemaphoreGiveRecursive(mutex);
return NULL;
}
// Create instance zero
instEntry = createInstance(objEntry, 0);
if (instEntry == NULL) {
xSemaphoreGiveRecursive(mutex);
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
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;
}
// Initialize object fields and metadata to default values
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;
// Initialize object fields and metadata to default values
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)
{
ObjectList* objEntry;
ObjectList *objEntry;
// Get lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Get lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Look for object
LL_FOREACH(objList, objEntry)
{
if (objEntry->id == id)
{
// Release lock
xSemaphoreGiveRecursive(mutex);
// Done, object found
return (UAVObjHandle)objEntry;
}
}
// Look for object
LL_FOREACH(objList, objEntry) {
if (objEntry->id == id) {
// Release lock
xSemaphoreGiveRecursive(mutex);
// Done, object found
return (UAVObjHandle) objEntry;
}
}
// Object not found, release lock and return error
xSemaphoreGiveRecursive(mutex);
return NULL;
// Object not found, release lock and return error
xSemaphoreGiveRecursive(mutex);
return NULL;
}
/**
@ -281,28 +287,27 @@ UAVObjHandle UAVObjGetByID(uint32_t id)
* \param[in] name The name of the object
* \return The object or NULL if not found.
*/
UAVObjHandle UAVObjGetByName(char* name)
UAVObjHandle UAVObjGetByName(char *name)
{
ObjectList* objEntry;
ObjectList *objEntry;
// Get lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Get lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Look for object
LL_FOREACH(objList, objEntry)
{
if (objEntry->name != NULL && strcmp(objEntry->name, name) == 0)
{
// Release lock
xSemaphoreGiveRecursive(mutex);
// Done, object found
return (UAVObjHandle)objEntry;
}
}
// Look for object
LL_FOREACH(objList, objEntry) {
if (objEntry->name != NULL
&& strcmp(objEntry->name, name) == 0) {
// Release lock
xSemaphoreGiveRecursive(mutex);
// Done, object found
return (UAVObjHandle) objEntry;
}
}
// Object not found, release lock and return error
xSemaphoreGiveRecursive(mutex);
return NULL;
// Object not found, release lock and return error
xSemaphoreGiveRecursive(mutex);
return NULL;
}
/**
@ -312,7 +317,7 @@ UAVObjHandle UAVObjGetByName(char* name)
*/
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
* \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)
{
return ((ObjectList*)obj)->numBytes;
return ((ObjectList *) obj)->numBytes;
}
/**
@ -344,7 +349,7 @@ uint32_t UAVObjGetNumBytes(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)
{
uint32_t numInstances;
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
numInstances = ((ObjectList*)obj)->numInstances;
xSemaphoreGiveRecursive(mutex);
return numInstances;
uint32_t numInstances;
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
numInstances = ((ObjectList *) obj)->numInstances;
xSemaphoreGiveRecursive(mutex);
return numInstances;
}
/**
@ -366,32 +371,29 @@ uint16_t UAVObjGetNumInstances(UAVObjHandle obj)
* \param[in] obj The object handle
* \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;
ObjectInstList* instEntry;
ObjectList *objEntry;
ObjectInstList *instEntry;
// Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Create new instance
objEntry = (ObjectList*)obj;
instEntry = createInstance(objEntry, objEntry->numInstances);
if ( instEntry == NULL )
{
xSemaphoreGiveRecursive(mutex);
return -1;
}
// Initialize instance data
if ( initCb != NULL )
{
initCb(obj, instEntry->instId);
}
// Unlock
xSemaphoreGiveRecursive(mutex);
return instEntry->instId;
// Create new instance
objEntry = (ObjectList *) obj;
instEntry = createInstance(objEntry, objEntry->numInstances);
if (instEntry == NULL) {
xSemaphoreGiveRecursive(mutex);
return -1;
}
// Initialize instance data
if (initCb != NULL) {
initCb(obj, instEntry->instId);
}
// Unlock
xSemaphoreGiveRecursive(mutex);
return instEntry->instId;
}
/**
@ -401,7 +403,7 @@ uint16_t UAVObjCreateInstance(UAVObjHandle obj, UAVObjInitializeCallback initCb)
*/
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)
{
return ((ObjectList*)obj)->isMetaobject;
return ((ObjectList *) obj)->isMetaobject;
}
/**
@ -421,7 +423,7 @@ int32_t UAVObjIsMetaobject(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
* \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;
ObjectInstList* instEntry;
ObjectList *objEntry;
ObjectInstList *instEntry;
// Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Cast handle to object
objEntry = (ObjectList*)obj;
// Cast handle to object
objEntry = (ObjectList *) obj;
// Get the instance
instEntry = getInstance(objEntry, instId);
// Get the instance
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 -1;
}
}
// 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 -1;
}
}
// Set the data
memcpy(instEntry->data, dataIn, objEntry->numBytes);
// Set the data
memcpy(instEntry->data, dataIn, objEntry->numBytes);
// Fire event
sendEvent(objEntry, instId, EV_UNPACKED);
// Fire event
sendEvent(objEntry, instId, EV_UNPACKED);
// Unlock
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
* \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;
ObjectInstList* instEntry;
ObjectList *objEntry;
ObjectInstList *instEntry;
// Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Cast handle to object
objEntry = (ObjectList*)obj;
// Cast handle to object
objEntry = (ObjectList *) obj;
// Get the instance
instEntry = getInstance(objEntry, instId);
if ( instEntry == NULL )
{
// Error, unlock and return
xSemaphoreGiveRecursive(mutex);
return -1;
}
// Get the instance
instEntry = getInstance(objEntry, instId);
if (instEntry == NULL) {
// Error, unlock and return
xSemaphoreGiveRecursive(mutex);
return -1;
}
// Pack data
memcpy(dataOut, instEntry->data, objEntry->numBytes);
// Pack data
memcpy(dataOut, instEntry->data, objEntry->numBytes);
// Unlock
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
* @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)
uint32_t bytesWritten;
ObjectList* objEntry;
ObjectInstList* instEntry;
uint32_t bytesWritten;
ObjectList *objEntry;
ObjectInstList *instEntry;
// Check for file system availability
if ( PIOS_SDCARD_IsMounted() == 0 )
{
return -1;
}
// Check for file system availability
if (PIOS_SDCARD_IsMounted() == 0) {
return -1;
}
// Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Cast to object
objEntry = (ObjectList *) obj;
// Cast to object
objEntry = (ObjectList*)obj;
// Get the instance information
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
instEntry = getInstance(objEntry, instId);
if ( instEntry == NULL )
{
xSemaphoreGiveRecursive(mutex);
return -1;
}
// Write the object ID
PIOS_FWRITE(file,&objEntry->id,sizeof(objEntry->id),&bytesWritten);
// Write the instance ID
if (!objEntry->isSingleInstance)
{
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);
// Write the instance ID
if (!objEntry->isSingleInstance) {
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 */
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).
* 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)
{
#if defined(PIOS_INCLUDE_FLASH_SECTOR_SETTINGS)
ObjectList* objEntry = (ObjectList*)obj;
ObjectList *objEntry = (ObjectList *) obj;
if(objEntry == NULL)
return -1;
if (objEntry == NULL)
return -1;
ObjectInstList* instEntry = getInstance(objEntry, instId);
ObjectInstList *instEntry = getInstance(objEntry, instId);
if(instEntry == NULL)
return -1;
if (instEntry == NULL)
return -1;
if(instEntry->data == NULL)
return -1;
if (instEntry->data == NULL)
return -1;
struct fileHeader header = {
.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);
if (PIOS_FLASHFS_ObjSave(obj, instId, instEntry->data) != 0)
return -1;
#endif
#if defined(PIOS_INCLUDE_SDCARD)
FILEINFO file;
ObjectList* objEntry;
uint8_t filename[14];
FILEINFO file;
ObjectList *objEntry;
uint8_t filename[14];
// Check for file system availability
if ( PIOS_SDCARD_IsMounted() == 0 )
{
return -1;
}
// Check for file system availability
if (PIOS_SDCARD_IsMounted() == 0) {
return -1;
}
// Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Cast to object
objEntry = (ObjectList *) obj;
// Cast to object
objEntry = (ObjectList*)obj;
// Get filename
objectFilename(objEntry, filename);
// Get filename
objectFilename(objEntry, filename);
// Open file
if ( PIOS_FOPEN_WRITE(filename,file) )
{
xSemaphoreGiveRecursive(mutex);
return -1;
}
// Append object
if ( UAVObjSaveToFile(obj, instId, &file) == -1 )
{
PIOS_FCLOSE(file);
xSemaphoreGiveRecursive(mutex);
return -1;
}
// Done, close file and unlock
PIOS_FCLOSE(file);
xSemaphoreGiveRecursive(mutex);
// Open file
if (PIOS_FOPEN_WRITE(filename, file)) {
xSemaphoreGiveRecursive(mutex);
return -1;
}
// Append object
if (UAVObjSaveToFile(obj, instId, &file) == -1) {
PIOS_FCLOSE(file);
xSemaphoreGiveRecursive(mutex);
return -1;
}
// Done, close file and unlock
PIOS_FCLOSE(file);
xSemaphoreGiveRecursive(mutex);
#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
* @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)
uint32_t bytesRead;
ObjectList* objEntry;
ObjectInstList* instEntry;
uint32_t objId;
uint16_t instId;
UAVObjHandle obj;
uint32_t bytesRead;
ObjectList *objEntry;
ObjectInstList *instEntry;
uint32_t objId;
uint16_t instId;
UAVObjHandle obj;
// Check for file system availability
if ( PIOS_SDCARD_IsMounted() == 0 )
{
return NULL;
}
// Check for file system availability
if (PIOS_SDCARD_IsMounted() == 0) {
return NULL;
}
// Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Read the object ID
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
if ( PIOS_FREAD(file,&objId,sizeof(objId),&bytesRead) )
{
xSemaphoreGiveRecursive(mutex);
return NULL;
}
// Get the instance ID
instId = 0;
if (!objEntry->isSingleInstance) {
if (PIOS_FREAD
(file, &instId, sizeof(instId), &bytesRead)) {
xSemaphoreGiveRecursive(mutex);
return NULL;
}
}
// Get the instance information
instEntry = getInstance(objEntry, instId);
// Get the object
obj = UAVObjGetByID(objId);
if ( obj == 0 )
{
xSemaphoreGiveRecursive(mutex);
return NULL;
}
objEntry = (ObjectList*)obj;
// 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);
// Get the instance ID
instId = 0;
if ( !objEntry->isSingleInstance )
{
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;
// Unlock
xSemaphoreGiveRecursive(mutex);
return obj;
#else /* PIOS_INCLUDE_SDCARD */
return NULL;
return NULL;
#endif
}
@ -745,87 +705,70 @@ UAVObjHandle UAVObjLoadFromFile(FILEINFO* file)
int32_t UAVObjLoad(UAVObjHandle obj, uint16_t instId)
{
#if defined(PIOS_INCLUDE_FLASH_SECTOR_SETTINGS)
ObjectList* objEntry = (ObjectList*)obj;
ObjectList *objEntry = (ObjectList *) obj;
if(objEntry == NULL)
return -1;
if (objEntry == NULL)
return -1;
ObjectInstList* instEntry = getInstance(objEntry, instId);
ObjectInstList *instEntry = getInstance(objEntry, instId);
if(instEntry == NULL)
return -1;
if (instEntry == NULL)
return -1;
if(instEntry->data == NULL)
return -1;
if (instEntry->data == NULL)
return -1;
struct fileHeader header;
uint32_t addr = (objEntry->id & FLASH_MASK);
PIOS_Flash_W25X_ReadData(addr, (uint8_t *) &header, sizeof(header));
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);
// Fire event on success
if (PIOS_FLASHFS_ObjLoad(obj, instId, instEntry->data) == 0)
sendEvent(objEntry, instId, EV_UNPACKED);
else
return -1;
#endif
#if defined(PIOS_INCLUDE_SDCARD)
FILEINFO file;
ObjectList* objEntry;
UAVObjHandle loadedObj;
ObjectList* loadedObjEntry;
uint8_t filename[14];
FILEINFO file;
ObjectList *objEntry;
UAVObjHandle loadedObj;
ObjectList *loadedObjEntry;
uint8_t filename[14];
// Check for file system availability
if ( PIOS_SDCARD_IsMounted() == 0 )
{
return -1;
}
// Check for file system availability
if (PIOS_SDCARD_IsMounted() == 0) {
return -1;
}
// Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Cast to object
objEntry = (ObjectList *) obj;
// Cast to object
objEntry = (ObjectList*)obj;
// Get filename
objectFilename(objEntry, filename);
// Get filename
objectFilename(objEntry, filename);
// Open file
if ( PIOS_FOPEN_READ(filename,file) )
{
xSemaphoreGiveRecursive(mutex);
return -1;
}
// Load object
loadedObj = UAVObjLoadFromFile(&file);
if (loadedObj == 0)
{
PIOS_FCLOSE(file);
xSemaphoreGiveRecursive(mutex);
return -1;
}
// Check that the IDs match
loadedObjEntry = (ObjectList*)loadedObj;
if ( loadedObjEntry->id != objEntry->id )
{
PIOS_FCLOSE(file);
xSemaphoreGiveRecursive(mutex);
return -1;
}
// Done, close file and unlock
PIOS_FCLOSE(file);
xSemaphoreGiveRecursive(mutex);
// Open file
if (PIOS_FOPEN_READ(filename, file)) {
xSemaphoreGiveRecursive(mutex);
return -1;
}
// Load object
loadedObj = UAVObjLoadFromFile(&file);
if (loadedObj == 0) {
PIOS_FCLOSE(file);
xSemaphoreGiveRecursive(mutex);
return -1;
}
// Check that the IDs match
loadedObjEntry = (ObjectList *) loadedObj;
if (loadedObjEntry->id != objEntry->id) {
PIOS_FCLOSE(file);
xSemaphoreGiveRecursive(mutex);
return -1;
}
// Done, close file and unlock
PIOS_FCLOSE(file);
xSemaphoreGiveRecursive(mutex);
#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)
{
#if defined(PIOS_INCLUDE_FLASH_SECTOR_SETTINGS)
ObjectList* objEntry = (ObjectList*)obj;
if(objEntry == NULL)
return -1;
uint32_t addr = (objEntry->id & FLASH_MASK);
PIOS_Flash_W25X_EraseSector(addr);
PIOS_FLASHFS_ObjDelete(obj, instId);
#endif
#if defined(PIOS_INCLUDE_SDCARD)
ObjectList* objEntry;
uint8_t filename[14];
ObjectList *objEntry;
uint8_t filename[14];
// Check for file system availability
if ( PIOS_SDCARD_IsMounted() == 0 )
{
return -1;
}
// Check for file system availability
if (PIOS_SDCARD_IsMounted() == 0) {
return -1;
}
// Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Cast to object
objEntry = (ObjectList *) obj;
// Cast to object
objEntry = (ObjectList*)obj;
// Get filename
objectFilename(objEntry, filename);
// Get filename
objectFilename(objEntry, filename);
// Delete file
PIOS_FUNLINK(filename);
// Delete file
PIOS_FUNLINK(filename);
// Done
xSemaphoreGiveRecursive(mutex);
// Done
xSemaphoreGiveRecursive(mutex);
#endif /* PIOS_INCLUDE_SDCARD */
return 0;
return 0;
}
/**
@ -879,29 +814,27 @@ int32_t UAVObjDelete(UAVObjHandle obj, uint16_t instId)
*/
int32_t UAVObjSaveSettings()
{
ObjectList* objEntry;
ObjectList *objEntry;
// Get lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Get lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Save all settings objects
LL_FOREACH(objList, objEntry)
{
// Check if this is a settings object
if ( objEntry->isSettings )
{
// Save object
if ( UAVObjSave( (UAVObjHandle)objEntry, 0 ) == -1 )
{
xSemaphoreGiveRecursive(mutex);
return -1;
}
}
}
// Save all settings objects
LL_FOREACH(objList, objEntry) {
// Check if this is a settings object
if (objEntry->isSettings) {
// Save object
if (UAVObjSave((UAVObjHandle) objEntry, 0) ==
-1) {
xSemaphoreGiveRecursive(mutex);
return -1;
}
}
}
// Done
xSemaphoreGiveRecursive(mutex);
return 0;
// Done
xSemaphoreGiveRecursive(mutex);
return 0;
}
/**
@ -910,29 +843,27 @@ int32_t UAVObjSaveSettings()
*/
int32_t UAVObjLoadSettings()
{
ObjectList* objEntry;
ObjectList *objEntry;
// Get lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Get lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Load all settings objects
LL_FOREACH(objList, objEntry)
{
// Check if this is a settings object
if ( objEntry->isSettings )
{
// Load object
if ( UAVObjLoad( (UAVObjHandle)objEntry, 0 ) == -1 )
{
xSemaphoreGiveRecursive(mutex);
return -1;
}
}
}
// Load all settings objects
LL_FOREACH(objList, objEntry) {
// Check if this is a settings object
if (objEntry->isSettings) {
// Load object
if (UAVObjLoad((UAVObjHandle) objEntry, 0) ==
-1) {
xSemaphoreGiveRecursive(mutex);
return -1;
}
}
}
// Done
xSemaphoreGiveRecursive(mutex);
return 0;
// Done
xSemaphoreGiveRecursive(mutex);
return 0;
}
/**
@ -941,29 +872,27 @@ int32_t UAVObjLoadSettings()
*/
int32_t UAVObjDeleteSettings()
{
ObjectList* objEntry;
ObjectList *objEntry;
// Get lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Get lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Save all settings objects
LL_FOREACH(objList, objEntry)
{
// Check if this is a settings object
if ( objEntry->isSettings )
{
// Save object
if ( UAVObjDelete( (UAVObjHandle)objEntry, 0 ) == -1 )
{
xSemaphoreGiveRecursive(mutex);
return -1;
}
}
}
// Save all settings objects
LL_FOREACH(objList, objEntry) {
// Check if this is a settings object
if (objEntry->isSettings) {
// Save object
if (UAVObjDelete((UAVObjHandle) objEntry, 0)
== -1) {
xSemaphoreGiveRecursive(mutex);
return -1;
}
}
}
// Done
xSemaphoreGiveRecursive(mutex);
return 0;
// Done
xSemaphoreGiveRecursive(mutex);
return 0;
}
/**
@ -972,29 +901,27 @@ int32_t UAVObjDeleteSettings()
*/
int32_t UAVObjSaveMetaobjects()
{
ObjectList* objEntry;
ObjectList *objEntry;
// Get lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Get lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Save all settings objects
LL_FOREACH(objList, objEntry)
{
// Check if this is a settings object
if ( objEntry->isMetaobject )
{
// Save object
if ( UAVObjSave( (UAVObjHandle)objEntry, 0 ) == -1 )
{
xSemaphoreGiveRecursive(mutex);
return -1;
}
}
}
// Save all settings objects
LL_FOREACH(objList, objEntry) {
// Check if this is a settings object
if (objEntry->isMetaobject) {
// Save object
if (UAVObjSave((UAVObjHandle) objEntry, 0) ==
-1) {
xSemaphoreGiveRecursive(mutex);
return -1;
}
}
}
// Done
xSemaphoreGiveRecursive(mutex);
return 0;
// Done
xSemaphoreGiveRecursive(mutex);
return 0;
}
/**
@ -1003,29 +930,27 @@ int32_t UAVObjSaveMetaobjects()
*/
int32_t UAVObjLoadMetaobjects()
{
ObjectList* objEntry;
ObjectList *objEntry;
// Get lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Get lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Load all settings objects
LL_FOREACH(objList, objEntry)
{
// Check if this is a settings object
if ( objEntry->isMetaobject )
{
// Load object
if ( UAVObjLoad( (UAVObjHandle)objEntry, 0 ) == -1 )
{
xSemaphoreGiveRecursive(mutex);
return -1;
}
}
}
// Load all settings objects
LL_FOREACH(objList, objEntry) {
// Check if this is a settings object
if (objEntry->isMetaobject) {
// Load object
if (UAVObjLoad((UAVObjHandle) objEntry, 0) ==
-1) {
xSemaphoreGiveRecursive(mutex);
return -1;
}
}
}
// Done
xSemaphoreGiveRecursive(mutex);
return 0;
// Done
xSemaphoreGiveRecursive(mutex);
return 0;
}
/**
@ -1034,29 +959,27 @@ int32_t UAVObjLoadMetaobjects()
*/
int32_t UAVObjDeleteMetaobjects()
{
ObjectList* objEntry;
ObjectList *objEntry;
// Get lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Get lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Load all settings objects
LL_FOREACH(objList, objEntry)
{
// Check if this is a settings object
if ( objEntry->isMetaobject )
{
// Load object
if ( UAVObjDelete( (UAVObjHandle)objEntry, 0 ) == -1 )
{
xSemaphoreGiveRecursive(mutex);
return -1;
}
}
}
// Load all settings objects
LL_FOREACH(objList, objEntry) {
// Check if this is a settings object
if (objEntry->isMetaobject) {
// Load object
if (UAVObjDelete((UAVObjHandle) objEntry, 0)
== -1) {
xSemaphoreGiveRecursive(mutex);
return -1;
}
}
}
// Done
xSemaphoreGiveRecursive(mutex);
return 0;
// Done
xSemaphoreGiveRecursive(mutex);
return 0;
}
/**
@ -1065,9 +988,9 @@ int32_t UAVObjDeleteMetaobjects()
* \param[in] dataIn The object's data structure
* \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
* \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
* \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;
ObjectInstList* instEntry;
UAVObjMetadata* mdata;
ObjectList *objEntry;
ObjectInstList *instEntry;
UAVObjMetadata *mdata;
// Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Cast to object info
objEntry = (ObjectList*)obj;
// Cast to object info
objEntry = (ObjectList *) obj;
// Check access level
if ( !objEntry->isMetaobject )
{
mdata = (UAVObjMetadata*)(objEntry->linkedObj->instances.data);
if ( mdata->access == ACCESS_READONLY )
{
xSemaphoreGiveRecursive(mutex);
return -1;
}
}
// Check access level
if (!objEntry->isMetaobject) {
mdata =
(UAVObjMetadata *) (objEntry->linkedObj->instances.
data);
if (mdata->access == ACCESS_READONLY) {
xSemaphoreGiveRecursive(mutex);
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
instEntry = getInstance(objEntry, instId);
if ( instEntry == NULL )
{
// Error, unlock and return
xSemaphoreGiveRecursive(mutex);
return -1;
}
// Fire event
sendEvent(objEntry, instId, EV_UPDATED);
// Set data
memcpy(instEntry->data, dataIn, objEntry->numBytes);
// Fire event
sendEvent(objEntry, instId, EV_UPDATED);
// Unlock
xSemaphoreGiveRecursive(mutex);
return 0;
// 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
* \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;
ObjectInstList* instEntry;
ObjectList *objEntry;
ObjectInstList *instEntry;
// Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Cast to object info
objEntry = (ObjectList*)obj;
// Cast to object info
objEntry = (ObjectList *) obj;
// Get instance information
instEntry = getInstance(objEntry, instId);
if ( instEntry == NULL )
{
// Error, unlock and return
xSemaphoreGiveRecursive(mutex);
return -1;
}
// Get instance information
instEntry = getInstance(objEntry, instId);
if (instEntry == NULL) {
// Error, unlock and return
xSemaphoreGiveRecursive(mutex);
return -1;
}
// Set data
memcpy(dataOut, instEntry->data, objEntry->numBytes);
// Set data
memcpy(dataOut, instEntry->data, objEntry->numBytes);
// Unlock
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
* \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
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Set metadata (metadata of metaobjects can not be modified)
objEntry = (ObjectList*)obj;
if (!objEntry->isMetaobject)
{
UAVObjSetData((UAVObjHandle)objEntry->linkedObj, dataIn);
}
else
{
return -1;
}
// Set metadata (metadata of metaobjects can not be modified)
objEntry = (ObjectList *) obj;
if (!objEntry->isMetaobject) {
UAVObjSetData((UAVObjHandle) objEntry->linkedObj,
dataIn);
} else {
return -1;
}
// Unlock
xSemaphoreGiveRecursive(mutex);
return 0;
// Unlock
xSemaphoreGiveRecursive(mutex);
return 0;
}
/**
@ -1201,27 +1119,25 @@ int32_t UAVObjSetMetadata(UAVObjHandle obj, const UAVObjMetadata* dataIn)
* \param[out] dataOut The object's metadata structure
* \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
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Get metadata
objEntry = (ObjectList*)obj;
if (objEntry->isMetaobject)
{
memcpy(dataOut, &defMetadata, sizeof(UAVObjMetadata));
}
else
{
UAVObjGetData((UAVObjHandle)objEntry->linkedObj, dataOut);
}
// Get metadata
objEntry = (ObjectList *) obj;
if (objEntry->isMetaobject) {
memcpy(dataOut, &defMetadata, sizeof(UAVObjMetadata));
} else {
UAVObjGetData((UAVObjHandle) objEntry->linkedObj,
dataOut);
}
// Unlock
xSemaphoreGiveRecursive(mutex);
return 0;
// Unlock
xSemaphoreGiveRecursive(mutex);
return 0;
}
/**
@ -1234,19 +1150,20 @@ int32_t UAVObjGetMetadata(UAVObjHandle obj, UAVObjMetadata* dataOut)
*/
int8_t UAVObjReadOnly(UAVObjHandle obj)
{
ObjectList* objEntry;
UAVObjMetadata* mdata;
ObjectList *objEntry;
UAVObjMetadata *mdata;
// Cast to object info
objEntry = (ObjectList*)obj;
// Cast to object info
objEntry = (ObjectList *) obj;
// Check access level
if ( !objEntry->isMetaobject )
{
mdata = (UAVObjMetadata*)(objEntry->linkedObj->instances.data);
return mdata->access == ACCESS_READONLY;
}
return -1;
// Check access level
if (!objEntry->isMetaobject) {
mdata =
(UAVObjMetadata *) (objEntry->linkedObj->instances.
data);
return mdata->access == ACCESS_READONLY;
}
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)
* \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;
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
res = connectObj(obj, queue, 0, eventMask);
xSemaphoreGiveRecursive(mutex);
return res;
int32_t res;
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
res = connectObj(obj, queue, 0, eventMask);
xSemaphoreGiveRecursive(mutex);
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 res;
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
res = disconnectObj(obj, queue, 0);
xSemaphoreGiveRecursive(mutex);
return res;
int32_t res;
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
res = disconnectObj(obj, queue, 0);
xSemaphoreGiveRecursive(mutex);
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)
* \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;
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
res = connectObj(obj, 0, cb, eventMask);
xSemaphoreGiveRecursive(mutex);
return res;
int32_t res;
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
res = connectObj(obj, 0, cb, eventMask);
xSemaphoreGiveRecursive(mutex);
return res;
}
/**
@ -1306,14 +1225,13 @@ int32_t UAVObjConnectCallback(UAVObjHandle obj, UAVObjEventCallback cb, int32_t
*/
int32_t UAVObjDisconnectCallback(UAVObjHandle obj, UAVObjEventCallback cb)
{
int32_t res;
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
res = disconnectObj(obj, 0, cb);
xSemaphoreGiveRecursive(mutex);
return res;
int32_t res;
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
res = disconnectObj(obj, 0, cb);
xSemaphoreGiveRecursive(mutex);
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
* 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)
{
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)
{
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
sendEvent((ObjectList*)obj, instId, EV_UPDATE_REQ);
xSemaphoreGiveRecursive(mutex);
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
sendEvent((ObjectList *) obj, instId, EV_UPDATE_REQ);
xSemaphoreGiveRecursive(mutex);
}
/**
@ -1343,7 +1261,7 @@ void UAVObjRequestInstanceUpdate(UAVObjHandle obj, uint16_t instId)
*/
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)
{
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
sendEvent((ObjectList*)obj, instId, EV_UPDATED_MANUAL);
xSemaphoreGiveRecursive(mutex);
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
sendEvent((ObjectList *) obj, instId, EV_UPDATED_MANUAL);
xSemaphoreGiveRecursive(mutex);
}
/**
@ -1363,143 +1281,133 @@ void UAVObjInstanceUpdated(UAVObjHandle obj, uint16_t instId)
* \param iterator This function will be called once for each object,
* 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
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Get lock
xSemaphoreTakeRecursive(mutex, portMAX_DELAY);
// Iterate through the list and invoke iterator for each object
LL_FOREACH(objList, objEntry)
{
(*iterator)((UAVObjHandle)objEntry);
}
// Iterate through the list and invoke iterator for each object
LL_FOREACH(objList, objEntry) {
(*iterator) ((UAVObjHandle) objEntry);
}
// Release lock
xSemaphoreGiveRecursive(mutex);
// Release lock
xSemaphoreGiveRecursive(mutex);
}
/**
* 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;
UAVObjEvent msg;
ObjectEventList *eventEntry;
UAVObjEvent msg;
// Setup event
msg.obj = (UAVObjHandle)obj;
msg.event = event;
msg.instId = instId;
// Setup event
msg.obj = (UAVObjHandle) obj;
msg.event = event;
msg.instId = instId;
// Go through each object and push the event message in the queue (if event is activated for the queue)
LL_FOREACH(obj->events, eventEntry)
{
if ( eventEntry->eventMask == 0 || (eventEntry->eventMask & event) != 0 )
{
// Send to queue if a valid queue is registered
if (eventEntry->queue != 0)
{
if ( xQueueSend(eventEntry->queue, &msg, 0) != pdTRUE ) // will not block
{
++stats.eventErrors;
}
}
// Invoke callback (from event task) if a valid one is registered
if (eventEntry->cb != 0)
{
if ( EventCallbackDispatch(&msg, eventEntry->cb) != pdTRUE ) // invoke callback from the event task, will not block
{
++stats.eventErrors;
}
}
}
}
// Go through each object and push the event message in the queue (if event is activated for the queue)
LL_FOREACH(obj->events, eventEntry) {
if (eventEntry->eventMask == 0
|| (eventEntry->eventMask & event) != 0) {
// Send to queue if a valid queue is registered
if (eventEntry->queue != 0) {
if (xQueueSend(eventEntry->queue, &msg, 0) != pdTRUE) // will not block
{
++stats.eventErrors;
}
}
// Invoke callback (from event task) if a valid one is registered
if (eventEntry->cb != 0) {
if (EventCallbackDispatch(&msg, eventEntry->cb) != pdTRUE) // invoke callback from the event task, will not block
{
++stats.eventErrors;
}
}
}
}
// Done
return 0;
// Done
return 0;
}
/**
* 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;
int32_t n;
ObjectInstList *instEntry;
int32_t n;
// For single instance objects, only instance zero is allowed
if (obj->isSingleInstance && instId != 0)
{
return NULL;
}
// For single instance objects, only instance zero is allowed
if (obj->isSingleInstance && instId != 0) {
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 >= UAVOBJ_MAX_INSTANCES)
{
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;
// Check if the instance already exists
if ( getInstance(obj, instId) != NULL )
{
return NULL;
}
// Fire event
UAVObjInstanceUpdated((UAVObjHandle) obj, instId);
// Create any missing instances (all instance IDs must be sequential)
for (n = obj->numInstances; n < instId; ++n)
{
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;
// Done
return instEntry;
}
/**
* 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
LL_FOREACH(&(obj->instances), instEntry)
{
if (instEntry->instId == instId)
{
return instEntry;
}
}
// If this point is reached then instance id was not found
return NULL;
// Look for specified instance ID
LL_FOREACH(&(obj->instances), instEntry) {
if (instEntry->instId == instId) {
return instEntry;
}
}
// 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)
* \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;
ObjectList* objEntry;
ObjectEventList *eventEntry;
ObjectList *objEntry;
// Check that the queue is not already connected, if it is simply update event mask
objEntry = (ObjectList*)obj;
LL_FOREACH(objEntry->events, eventEntry)
{
if ( eventEntry->queue == queue && eventEntry->cb == cb )
{
// Already connected, update event mask and return
eventEntry->eventMask = eventMask;
return 0;
}
}
// Check that the queue is not already connected, if it is simply update event mask
objEntry = (ObjectList *) obj;
LL_FOREACH(objEntry->events, eventEntry) {
if (eventEntry->queue == queue && eventEntry->cb == cb) {
// Already connected, update event mask and return
eventEntry->eventMask = eventMask;
return 0;
}
}
// Add queue to list
eventEntry = (ObjectEventList*)pvPortMalloc(sizeof(ObjectEventList));
if (eventEntry == NULL)
{
return -1;
}
eventEntry->queue = queue;
eventEntry->cb = cb;
eventEntry->eventMask = eventMask;
LL_APPEND(objEntry->events, eventEntry);
// Add queue to list
eventEntry =
(ObjectEventList *) pvPortMalloc(sizeof(ObjectEventList));
if (eventEntry == NULL) {
return -1;
}
eventEntry->queue = queue;
eventEntry->cb = cb;
eventEntry->eventMask = eventMask;
LL_APPEND(objEntry->events, eventEntry);
// Done
return 0;
// Done
return 0;
}
/**
@ -1549,59 +1456,43 @@ static int32_t connectObj(UAVObjHandle obj, xQueueHandle queue, UAVObjEventCallb
* \param[in] cb The event callback
* \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;
ObjectList* objEntry;
ObjectEventList *eventEntry;
ObjectList *objEntry;
// Find queue and remove it
objEntry = (ObjectList*)obj;
LL_FOREACH(objEntry->events, eventEntry)
{
if ( ( eventEntry->queue == queue && eventEntry->cb == cb ) )
{
LL_DELETE(objEntry->events, eventEntry);
vPortFree(eventEntry);
return 0;
}
}
// Find queue and remove it
objEntry = (ObjectList *) obj;
LL_FOREACH(objEntry->events, eventEntry) {
if ((eventEntry->queue == queue
&& eventEntry->cb == cb)) {
LL_DELETE(objEntry->events, eventEntry);
vPortFree(eventEntry);
return 0;
}
}
// If this point is reached the queue was not found
return -1;
// If this point is reached the queue was not found
return -1;
}
#if defined(PIOS_INCLUDE_SDCARD)
/**
* 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_start(args, format);
vsprintf((char *)buffer, (char *)format, args);
va_list args;
va_start(args, format);
vsprintf((char *)buffer, (char *)format, args);
}
/**
* 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 */

View File

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

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>343</height>
<width>415</width>
<height>349</height>
</rect>
</property>
<property name="windowTitle">
@ -142,18 +142,6 @@
</widget>
</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>
</item>
<item>
<widget class="QGroupBox" name="groupBox">
<property name="sizePolicy">
@ -171,86 +159,98 @@ arming it in that case!</string>
<property name="title">
<string>Attitude Calibration</string>
</property>
<widget class="QWidget" name="verticalLayoutWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>20</y>
<width>371</width>
<height>111</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<property name="margin">
<number>3</number>
</property>
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Place aircraft flat before computing</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="status">
<property name="text">
<string>Click &quot;Zero Accel Bias&quot; to start</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPushButton" name="zeroBias">
<property name="toolTip">
<string>Launch horizontal calibration.</string>
</property>
<property name="text">
<string>Zero Accel Bias</string>
</property>
</widget>
</item>
<item>
<widget class="QProgressBar" name="zeroBiasProgress">
<property name="value">
<number>0</number>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QVBoxLayout" name="verticalLayout_3">
<property name="margin">
<number>3</number>
</property>
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Place aircraft flat before computing</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="status">
<property name="text">
<string>Click &quot;Zero Accel Bias&quot; to start</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>6</number>
</property>
<property name="margin">
<number>4</number>
</property>
<item>
<widget class="QPushButton" name="zeroBias">
<property name="toolTip">
<string>Launch horizontal calibration.</string>
</property>
<property name="text">
<string>Zero Accel Bias</string>
</property>
</widget>
</item>
<item>
<widget class="QProgressBar" name="zeroBiasProgress">
<property name="value">
<number>0</number>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
</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>
</item>
<item>

View File

@ -265,10 +265,27 @@ void ConfigOutputWidget::runChannelTests(bool state)
mdata.gcsTelemetryAcked = false;
mdata.gcsTelemetryUpdateMode = UAVObject::UPDATEMODE_ONCHANGE;
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
{
mdata = accInitialData; // Restore metadata
foreach (QSpinBox* box, outMin) {
box->setEnabled(true);
}
foreach (QSpinBox* box, outMax) {
box->setEnabled(true);
}
}
obj->setMetadata(mdata);

View File

@ -7,7 +7,7 @@ Workspace1=Flight data
Icon1=:/core/images/ah.png
Workspace2=Configuration
Icon2=:/core/images/config.png
Workspace3=Large Map
Workspace3=Flight Planner
Icon3=:/core/images/world.png
Workspace4=Scopes
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\splitterSizes=144, 608
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\classId=PFDGadget
Mode1\splitter\side0\side0\side1\gadget\activeConfiguration=raw
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\splitterOrientation=2
Mode1\splitter\side1\splitterSizes=492, 288
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\splitterOrientation=1
Mode1\splitter\side1\side1\splitterSizes=441, 259
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\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\showToolbars=false
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\side1\type=splitter
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\classId=UAVObjectBrowser
Mode2\splitter\side1\side0\gadget\activeConfiguration=default
@ -111,11 +219,28 @@ Mode4\splitter\type=splitter
Mode4\splitter\splitterOrientation=1
Mode4\splitter\splitterSizes=653, 660
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\splitterOrientation=2
Mode4\splitter\side1\splitterSizes=661, 119
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\classId=LoggingGadget
Mode5\version=UAVGadgetManagerV1
Mode5\showToolbars=false
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\side0\type=uavGadget
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\classId=LineardialGadget
Mode5\splitter\side0\side1\side1\side0\side1\gadget\activeConfiguration=PitchActual
Mode5\splitter\side0\side1\side1\side1\type=uavGadget
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\classId=UAVObjectBrowser
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\showToolbars=false
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\splitterSizes=@Invalid()
Mode6\splitter\side0\type=uavGadget
@ -288,9 +288,6 @@ Mode6\splitter\side1\type=splitter
Mode6\splitter\side1\splitterOrientation=2
Mode6\splitter\side1\splitterSizes=274, 506
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\splitterSizes=322, 396
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\classId=PFDGadget
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]
size=0
[%General]
SaveSettingsOnExit=true
LastPreferenceCategory=OPMapGadget
LastPreferencePage=default
SettingsWindowWidth=697
SettingsWindowHeight=476
OverrideLanguage=en_AU
SaveSettingsOnExit=true
[UAVGadgetConfigurations]
configInfo\version=1.2.0
@ -340,7 +336,7 @@ DialGadget\Attitude\data\needle3Factor=-1
DialGadget\Attitude\data\needle1Move=Rotate
DialGadget\Attitude\data\needle2Move=Vertical
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\beSmooth=false
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\needle2Move=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\beSmooth=false
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\needle2Move=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\beSmooth=false
DialGadget\Barometer\configInfo\version=0.0.0
@ -427,7 +423,7 @@ DialGadget\Climbrate\data\needle3Factor=1
DialGadget\Climbrate\data\needle1Move=Rotate
DialGadget\Climbrate\data\needle2Move=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\beSmooth=false
DialGadget\Climbrate\configInfo\version=0.0.0
@ -456,7 +452,7 @@ DialGadget\Compass\data\needle3Factor=1
DialGadget\Compass\data\needle1Move=Rotate
DialGadget\Compass\data\needle2Move=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\beSmooth=false
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\needle2Move=Vertical
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\beSmooth=false
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\needle2Move=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\beSmooth=false
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\needle2Move=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\beSmooth=false
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\needle2Move=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\beSmooth=false
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\needle2Move=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\beSmooth=false
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\needle2Move=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\beSmooth=false
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\needle2Move=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\beSmooth=false
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\needle2Move=Horizontal
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\beSmooth=false
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\needle2Move=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\beSmooth=false
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\needle2Move=Vertical
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\beSmooth=false
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\needle2Move=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\beSmooth=false
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\needle2Move=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\beSmooth=false
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\needle2Move=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\beSmooth=false
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\needle2Move=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\beSmooth=false
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\needle2Move=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\beSmooth=false
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\needle2Move=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\beSmooth=false
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\needle2Move=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\beSmooth=false
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\needle2Move=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\beSmooth=false
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\defaultParity=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\configInfo\version=0.0.0
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\defaultParity=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\configInfo\version=0.0.0
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\configInfo\version=0.0.0
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\sourceDataObject=AttitudeActual
LineardialGadget\PitchActual\data\sourceObjectField=Pitch
@ -1256,57 +1286,40 @@ LineardialGadget\PitchActual\data\factor=1
LineardialGadget\PitchActual\data\useOpenGLFlag=false
LineardialGadget\PitchActual\configInfo\version=0.0.0
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\sourceDataObject=ManualControlCommand
LineardialGadget\Roll\data\sourceObjectField=Roll
LineardialGadget\Roll\data\minValue=0
LineardialGadget\Roll\data\minValue=-1
LineardialGadget\Roll\data\maxValue=1
LineardialGadget\Roll\data\redMin=0
LineardialGadget\Roll\data\redMin=-1
LineardialGadget\Roll\data\redMax=1
LineardialGadget\Roll\data\yellowMin=0.1
LineardialGadget\Roll\data\yellowMax=0.9
LineardialGadget\Roll\data\greenMin=0.3
LineardialGadget\Roll\data\greenMax=0.8
LineardialGadget\Roll\data\yellowMin=-0.8
LineardialGadget\Roll\data\yellowMax=0.8
LineardialGadget\Roll\data\greenMin=-0.5
LineardialGadget\Roll\data\greenMax=0.5
LineardialGadget\Roll\data\font="Andale Mono,12,-1,5,75,0,0,0,0,0"
LineardialGadget\Roll\data\decimalPlaces=2
LineardialGadget\Roll\data\factor=1
LineardialGadget\Roll\data\useOpenGLFlag=false
LineardialGadget\Roll\configInfo\version=0.0.0
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\sourceDataObject=GCSTelemetryStats
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\minValue=0
LineardialGadget\Throttle\data\maxValue=1
LineardialGadget\Throttle\data\redMin=0
LineardialGadget\Throttle\data\redMin=0.75
LineardialGadget\Throttle\data\redMax=1
LineardialGadget\Throttle\data\yellowMin=0.1
LineardialGadget\Throttle\data\yellowMax=0.9
LineardialGadget\Throttle\data\greenMin=0.3
LineardialGadget\Throttle\data\greenMax=0.8
LineardialGadget\Throttle\data\yellowMin=0.5
LineardialGadget\Throttle\data\yellowMax=0.75
LineardialGadget\Throttle\data\greenMin=0
LineardialGadget\Throttle\data\greenMax=0.5
LineardialGadget\Throttle\data\font="Andale Mono,12,-1,5,75,0,0,0,0,0"
LineardialGadget\Throttle\data\decimalPlaces=2
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\sourceDataObject=ManualControlCommand
LineardialGadget\Yaw\data\sourceObjectField=Yaw
LineardialGadget\Yaw\data\minValue=0
LineardialGadget\Yaw\data\minValue=-1
LineardialGadget\Yaw\data\maxValue=1
LineardialGadget\Yaw\data\redMin=0
LineardialGadget\Yaw\data\redMin=-1
LineardialGadget\Yaw\data\redMax=1
LineardialGadget\Yaw\data\yellowMin=0.1
LineardialGadget\Yaw\data\yellowMax=0.9
LineardialGadget\Yaw\data\greenMin=0.3
LineardialGadget\Yaw\data\greenMax=0.8
LineardialGadget\Yaw\data\yellowMin=-0.8
LineardialGadget\Yaw\data\yellowMax=0.8
LineardialGadget\Yaw\data\greenMin=-0.5
LineardialGadget\Yaw\data\greenMax=0.5
LineardialGadget\Yaw\data\font="Andale Mono,12,-1,5,75,0,0,0,0,0"
LineardialGadget\Yaw\data\decimalPlaces=2
LineardialGadget\Yaw\data\factor=1
LineardialGadget\Yaw\data\useOpenGLFlag=false
LineardialGadget\Yaw\configInfo\version=0.0.0
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\bgFilename=%%DATAPATH%%models/backgrounds/default_background.png
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\defaultLatitude=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\accessMode=ServerAndCache
OPMapGadget\Google%20Sat\data\useMemoryCache=true
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\locked=false
OPMapGadget\Memory%20Only\data\mapProvider=GoogleMap
OPMapGadget\Memory%20Only\data\defaultZoom=2
OPMapGadget\Memory%20Only\data\defaultLatitude=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\accessMode=CacheOnly
OPMapGadget\Memory%20Only\data\useMemoryCache=true
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\locked=false
OPMapGadget\default\data\mapProvider=GoogleMap
@ -1468,7 +1498,7 @@ OPMapGadget\default\data\showTileGridLines=false
OPMapGadget\default\data\accessMode=ServerAndCache
OPMapGadget\default\data\useMemoryCache=true
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\locked=false
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
[Plugins]
SoundNotifyPlugin\data\Current\1\SoundCollectionPath=%%DATAPATH%%sounds
SoundNotifyPlugin\data\Current\1\CurrentLanguage=default
SoundNotifyPlugin\data\Current\1\ObjectField=Channel
SoundNotifyPlugin\data\Current\1\DataObject=ActuatorCommand
SoundNotifyPlugin\data\Current\1\Value=Equal to
SoundNotifyPlugin\data\Current\1\SoundCollectionPath=
SoundNotifyPlugin\data\Current\1\CurrentLanguage=
SoundNotifyPlugin\data\Current\1\ObjectField=
SoundNotifyPlugin\data\Current\1\DataObject=
SoundNotifyPlugin\data\Current\1\Value=
SoundNotifyPlugin\data\Current\1\ValueSpinBox=0
SoundNotifyPlugin\data\Current\1\Sound1=
SoundNotifyPlugin\data\Current\1\Sound2=
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\ExpireTimeout=0
SoundNotifyPlugin\data\Current\size=1
@ -1900,9 +1930,3 @@ SoundNotifyPlugin\data\listNotifies\size=0
SoundNotifyPlugin\data\EnableSound=false
SoundNotifyPlugin\configInfo\version=1.0.0
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;
rightY = 0;
m_gcscontrol->widgetLeftStick->enableOpenGL(true);
m_gcscontrol->widgetRightStick->enableOpenGL(true);
// No point enabling OpenGL for the joysticks, and causes
// issues on some computers:
// m_gcscontrol->widgetLeftStick->enableOpenGL(true);
// m_gcscontrol->widgetRightStick->enableOpenGL(true);
}
GCSControlGadgetWidget::~GCSControlGadgetWidget()

View File

@ -40,11 +40,13 @@ OPMapGadgetConfiguration::OPMapGadgetConfiguration(QString classId, QSettings*
m_accessMode("ServerAndCache"),
m_useMemoryCache(true),
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(qSettings != 0) {
if (qSettings != 0) {
QString mapProvider = qSettings->value("mapProvider").toString();
int zoom = qSettings->value("defaultZoom").toInt();
double latitude= qSettings->value("defaultLatitude").toDouble();
@ -55,16 +57,25 @@ OPMapGadgetConfiguration::OPMapGadgetConfiguration(QString classId, QSettings*
bool useMemoryCache= qSettings->value("useMemoryCache").toBool();
QString cacheLocation= qSettings->value("cacheLocation").toString();
QString uavSymbol=qSettings->value("uavSymbol").toString();
int max_update_rate = qSettings->value("maxUpdateRate").toInt();
if (!mapProvider.isEmpty()) m_mapProvider = mapProvider;
m_defaultZoom = zoom;
m_defaultLatitude = latitude;
m_defaultLongitude = longitude;
m_useOpenGL = useOpenGL;
m_showTileGridLines = showTileGridLines;
m_uavSymbol=uavSymbol;
if (!accessMode.isEmpty()) m_accessMode = accessMode;
m_uavSymbol = uavSymbol;
m_maxUpdateRate = max_update_rate;
if (m_maxUpdateRate < 100 || m_maxUpdateRate > 5000)
m_maxUpdateRate = 2000;
if (!accessMode.isEmpty())
m_accessMode = accessMode;
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_useMemoryCache = m_useMemoryCache;
m->m_cacheLocation = m_cacheLocation;
m->m_uavSymbol=m_uavSymbol;
m->m_uavSymbol = m_uavSymbol;
m->m_maxUpdateRate = m_maxUpdateRate;
return m;
}
@ -96,6 +109,7 @@ void OPMapGadgetConfiguration::saveConfig(QSettings* qSettings) const {
qSettings->setValue("useMemoryCache", m_useMemoryCache);
qSettings->setValue("uavSymbol", m_uavSymbol);
qSettings->setValue("cacheLocation", Utils::PathUtils().RemoveStoragePath(m_cacheLocation));
qSettings->setValue("maxUpdateRate", m_maxUpdateRate);
}
void OPMapGadgetConfiguration::setCacheLocation(QString 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(QString cacheLocation READ cacheLocation WRITE setCacheLocation)
Q_PROPERTY(QString uavSymbol READ uavSymbol WRITE setUavSymbol)
Q_PROPERTY(int maxUpdateRate READ maxUpdateRate WRITE setMaxUpdateRate)
public:
explicit OPMapGadgetConfiguration(QString classId, QSettings* qSettings = 0, QObject *parent = 0);
@ -64,6 +65,7 @@ public:
bool useMemoryCache() const { return m_useMemoryCache; }
QString cacheLocation() const { return m_cacheLocation; }
QString uavSymbol() const { return m_uavSymbol; }
int maxUpdateRate() const { return m_maxUpdateRate; }
public slots:
void setMapProvider(QString provider) { m_mapProvider = provider; }
@ -76,6 +78,8 @@ public slots:
void setUseMemoryCache(bool useMemoryCache) { m_useMemoryCache = useMemoryCache; }
void setCacheLocation(QString cacheLocation);
void setUavSymbol(QString symbol){m_uavSymbol=symbol;}
void setMaxUpdateRate(int update_rate){m_maxUpdateRate = update_rate;}
private:
QString m_mapProvider;
int m_defaultZoom;
@ -87,7 +91,7 @@ private:
bool m_useMemoryCache;
QString m_cacheLocation;
QString m_uavSymbol;
int m_maxUpdateRate;
};
#endif // OPMAP_GADGETCONFIGURATION_H

View File

@ -49,7 +49,9 @@ OPMapGadgetOptionsPage::OPMapGadgetOptionsPage(OPMapGadgetConfiguration *config,
QWidget *OPMapGadgetOptionsPage::createPage(QWidget *parent)
{
m_page = new Ui::OPMapGadgetOptionsPage();
int index;
m_page = new Ui::OPMapGadgetOptionsPage();
QWidget *w = new QWidget(parent);
m_page->setupUi(w);
@ -61,9 +63,22 @@ QWidget *OPMapGadgetOptionsPage::createPage(QWidget *parent)
m_page->accessModeComboBox->clear();
m_page->accessModeComboBox->addItems(mapcontrol::Helper::AccessModeTypes());
int index = m_page->providerComboBox->findText(m_config->mapProvider());
index = (index >= 0) ? index : 0;
m_page->providerComboBox->setCurrentIndex(index);
index = m_page->providerComboBox->findText(m_config->mapProvider());
index = (index >= 0) ? index : 0;
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->latitudeSpinBox->setValue(m_config->latitude());
@ -125,6 +140,7 @@ void OPMapGadgetOptionsPage::apply()
m_config->setUseMemoryCache(m_page->checkBoxUseMemoryCache->isChecked());
m_config->setCacheLocation(m_page->lineEditCacheLocation->path());
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()

View File

@ -30,7 +30,7 @@
<number>5</number>
</property>
<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">
<spacer name="horizontalSpacer_4">
<property name="orientation">
@ -249,6 +249,19 @@
</property>
</widget>
</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>
</item>
<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 max_update_rate_list[] = {100, 200, 500, 1000, 2000, 5000}; // milliseconds
// *************************************************************************************
@ -89,15 +91,17 @@ OPMapGadgetWidget::OPMapGadgetWidget(QWidget *parent) : QWidget(parent)
obm = 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;
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);
@ -123,20 +127,20 @@ OPMapGadgetWidget::OPMapGadgetWidget(QWidget *parent) : QWidget(parent)
// **************
// default home position
home_position.coord = pos_lat_lon;
home_position.altitude = altitude;
home_position.locked = false;
m_home_position.coord = pos_lat_lon;
m_home_position.altitude = altitude;
m_home_position.locked = false;
// **************
// default magic waypoint params
magic_waypoint.map_wp_item = NULL;
magic_waypoint.coord = home_position.coord;
magic_waypoint.altitude = altitude;
magic_waypoint.description = "Magic waypoint";
magic_waypoint.locked = false;
magic_waypoint.time_seconds = 0;
magic_waypoint.hold_time_seconds = 0;
m_magic_waypoint.map_wp_item = NULL;
m_magic_waypoint.coord = m_home_position.coord;
m_magic_waypoint.altitude = altitude;
m_magic_waypoint.description = "Magic waypoint";
m_magic_waypoint.locked = false;
m_magic_waypoint.time_seconds = 0;
m_magic_waypoint.hold_time_seconds = 0;
// **************
// 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->setMaximum(m_map->MaxZoom() + max_digital_zoom); //
min_zoom = m_widget->horizontalSliderZoom->minimum(); // minimum zoom we can accept
max_zoom = m_widget->horizontalSliderZoom->maximum(); // maximum zoom we can accept
m_min_zoom = m_widget->horizontalSliderZoom->minimum(); // minimum 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->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(WPDeleted(int const&)), this, SLOT(WPDeleted(int const&)));
m_map->SetCurrentPosition(home_position.coord); // set the map position
m_map->Home->SetCoord(home_position.coord); // set the HOME position
m_map->UAV->SetUAVPos(home_position.coord, 0.0); // set the UAV position
m_map->GPS->SetUAVPos(home_position.coord, 0.0); // set the UAV position
m_map->SetCurrentPosition(m_home_position.coord); // set the map position
m_map->Home->SetCoord(m_home_position.coord); // set the HOME position
m_map->UAV->SetUAVPos(m_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
@ -300,13 +304,14 @@ OPMapGadgetWidget::OPMapGadgetWidget(QWidget *parent) : QWidget(parent)
// create the desired timers
m_updateTimer = new QTimer();
m_updateTimer->setInterval(200);
m_updateTimer->setInterval(m_maxUpdateRate);
connect(m_updateTimer, SIGNAL(timeout()), this, SLOT(updatePosition()));
m_updateTimer->start();
m_statusUpdateTimer = new QTimer();
m_statusUpdateTimer->setInterval(100);
connect(m_statusUpdateTimer, SIGNAL(timeout()), this, SLOT(updateMousePos()));
m_statusUpdateTimer->setInterval(200);
// m_statusUpdateTimer->setInterval(m_maxUpdateRate);
connect(m_statusUpdateTimer, SIGNAL(timeout()), this, SLOT(updateMousePos()));
m_statusUpdateTimer->start();
// **************
@ -385,22 +390,22 @@ void OPMapGadgetWidget::contextMenuEvent(QContextMenuEvent *event)
QString s;
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
if (event->reason() != QContextMenuEvent::Mouse)
return; // not a mouse click event
// current mouse position
QPoint p = m_map->mapFromGlobal(event->globalPos());
context_menu_lat_lon = m_map->GetFromLocalToLatLng(p);
// context_menu_lat_lon = m_map->currentMousePosition();
m_context_menu_lat_lon = m_map->GetFromLocalToLatLng(p);
// m_context_menu_lat_lon = m_map->currentMousePosition();
if (!m_map->contentsRect().contains(p))
return; // the mouse click was not on the map
// 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);
// find out if we have a waypoint under the mouse cursor
@ -425,6 +430,13 @@ void OPMapGadgetWidget::contextMenuEvent(QContextMenuEvent *event)
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)
{
case Normal_MapMode: s = tr(" (Normal)"); break;
@ -612,58 +624,81 @@ void OPMapGadgetWidget::keyPressEvent(QKeyEvent* event)
// *************************************************************************************
// timer signals
/**
Updates the UAV position on the map. It is called every 200ms
by a 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()
{
if (!m_widget || !m_map)
return;
double uav_latitude, uav_longitude, uav_altitude, uav_yaw;
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);
//Pip I'm sorry, I know this was here with a purpose vvv
//if (!telemetry_connected)
// return;
// Pip I'm sorry, I know this was here with a purpose vvv
// from Pip: let you off :)
//if (!telemetry_connected)
// return;
double latitude;
double longitude;
double altitude;
// *************
// get the current UAV details
// get current UAV position
if (!getUAVPosition(latitude, longitude, altitude))
if (!getUAVPosition(uav_latitude, uav_longitude, uav_altitude))
return;
// get current UAV heading
float yaw = getUAV_Yaw();
uav_yaw = getUAV_Yaw();
internals::PointLatLng uav_pos = internals::PointLatLng(latitude, longitude); // current UAV position
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
uav_pos = internals::PointLatLng(uav_latitude, uav_longitude);
// *************
// 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 =
"lat: " + QString::number(uav_pos.Lat(), 'f', 7) +
" lon: " + QString::number(uav_pos.Lng(), 'f', 7) +
" " + QString::number(uav_heading_degrees, 'f', 1) + "deg" +
" " + QString::number(uav_altitude_meters, 'f', 1) + "m" +
" " + QString::number(uav_ground_speed_meters_per_second, 'f', 1) + "m/s";
" " + QString::number(uav_yaw, 'f', 1) + "deg" +
" " + QString::number(uav_altitude, 'f', 1) + "m";
// " " + QString::number(uav_ground_speed_meters_per_second, 'f', 1) + "m/s";
m_widget->labelUAVPos->setText(str);
m_map->UAV->SetUAVPos(uav_pos, uav_altitude_meters); // set the maps UAV position
// qDebug()<<"UAVPOSITION"<<uav_pos.ToString();
m_map->UAV->SetUAVHeading(uav_heading_degrees); // set the maps UAV heading
// *************
// set the UAV icon position on the map
if (!getGPSPosition(latitude, longitude, altitude))
return;
m_map->UAV->SetUAVPos(uav_pos, uav_altitude); // set the maps UAV position
// 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
m_map->GPS->SetUAVHeading(uav_heading_degrees); // set the maps UAV heading
// *************
// set the GPS icon position on the map
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()
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
QMutexLocker locker(&m_map_mutex);
@ -696,14 +731,14 @@ void OPMapGadgetWidget::updateMousePos()
// find out if we have a waypoint under the mouse cursor
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
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();
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)
{
s += " wp[" + QString::number(wp->Number()) + "]";
@ -718,8 +753,8 @@ void OPMapGadgetWidget::updateMousePos()
{
s += " home";
double dist = distance(home_lat_lon, mouse_lat_lon);
double bear = bearing(home_lat_lon, mouse_lat_lon);
double dist = distance(home_lat_lon, m_mouse_lat_lon);
double bear = bearing(home_lat_lon, m_mouse_lat_lon);
s += " " + QString::number(dist * 1000, 'f', 1) + "m";
s += " " + QString::number(bear, 'f', 1) + "deg";
}
@ -753,22 +788,22 @@ void OPMapGadgetWidget::updateMousePos()
*/
void OPMapGadgetWidget::zoomChanged(double zoomt, double zoom, double zoomd)
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
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);
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
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)
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())
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)
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
QString coord_str = QString::number(point.Lat(), 'f', 7) + " " + QString::number(point.Lng(), 'f', 7) + " ";
m_widget->labelMapPos->setText(coord_str);
@ -791,8 +826,8 @@ void OPMapGadgetWidget::OnCurrentPositionChanged(internals::PointLatLng point)
*/
void OPMapGadgetWidget::OnTilesStillToLoad(int number)
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
// if (prev_tile_number < number || m_widget->progressBarMap->maximum() < number)
// m_widget->progressBarMap->setMaximum(number);
@ -804,7 +839,7 @@ void OPMapGadgetWidget::OnTilesStillToLoad(int 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()
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
m_widget->progressBarMap->setVisible(true);
}
@ -826,8 +861,8 @@ void OPMapGadgetWidget::OnTileLoadStart()
void OPMapGadgetWidget::OnTileLoadComplete()
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
m_widget->progressBarMap->setVisible(false);
}
@ -878,11 +913,11 @@ void OPMapGadgetWidget::WPValuesChanged(WayPointItem *waypoint)
case MagicWaypoint_MapMode:
// 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();
magic_waypoint.altitude = waypoint->Altitude();
magic_waypoint.description = waypoint->Description();
m_magic_waypoint.coord = waypoint->Coord();
m_magic_waypoint.altitude = waypoint->Altitude();
m_magic_waypoint.description = waypoint->Description();
// move the UAV to the magic waypoint position
// moveToMagicWaypointPosition();
@ -930,8 +965,8 @@ void OPMapGadgetWidget::on_toolButtonMapHome_clicked()
void OPMapGadgetWidget::on_toolButtonMapUAV_clicked()
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
QMutexLocker locker(&m_map_mutex);
@ -940,16 +975,16 @@ void OPMapGadgetWidget::on_toolButtonMapUAV_clicked()
void OPMapGadgetWidget::on_toolButtonMapUAVheading_clicked()
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
followUAVheadingAct->toggle();
}
void OPMapGadgetWidget::on_horizontalSliderZoom_sliderMoved(int position)
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
QMutexLocker locker(&m_map_mutex);
@ -982,7 +1017,7 @@ void OPMapGadgetWidget::on_toolButtonMoveToWP_clicked()
void OPMapGadgetWidget::onTelemetryConnect()
{
telemetry_connected = true;
m_telemetry_connected = true;
if (!obum) return;
@ -998,14 +1033,14 @@ void OPMapGadgetWidget::onTelemetryConnect()
setHome(internals::PointLatLng(LLA[0], LLA[1]));
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()
{
telemetry_connected = false;
m_telemetry_connected = false;
}
// 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)
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
double latitude = pos.x();
double longitude = pos.y();
@ -1051,8 +1086,8 @@ void OPMapGadgetWidget::setHome(QPointF pos)
*/
void OPMapGadgetWidget::setHome(internals::PointLatLng pos_lat_lon)
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
if (pos_lat_lon.Lat() != pos_lat_lon.Lat() || pos_lat_lon.Lng() != pos_lat_lon.Lng())
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();
// 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()
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
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
}
void OPMapGadgetWidget::zoomIn()
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
int zoom = m_map->ZoomTotal() + 1;
if (zoom < min_zoom) zoom = min_zoom;
if (zoom < m_min_zoom) zoom = m_min_zoom;
else
if (zoom > max_zoom) zoom = max_zoom;
if (zoom > m_max_zoom) zoom = m_max_zoom;
m_map->SetZoom(zoom);
}
void OPMapGadgetWidget::zoomOut()
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
int zoom = m_map->ZoomTotal() - 1;
if (zoom < min_zoom) zoom = min_zoom;
if (zoom < m_min_zoom) zoom = m_min_zoom;
else
if (zoom > max_zoom) zoom = max_zoom;
if (zoom > m_max_zoom) zoom = m_max_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)
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
if (zoom < min_zoom) zoom = min_zoom;
if (zoom < m_min_zoom) zoom = m_min_zoom;
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();
m_map->SetMouseWheelZoomType(internals::MouseWheelZoomType::ViewCenter);
@ -1146,8 +1203,8 @@ void OPMapGadgetWidget::setZoom(int zoom)
void OPMapGadgetWidget::setPosition(QPointF pos)
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
double latitude = pos.y();
double longitude = pos.x();
@ -1168,48 +1225,48 @@ void OPMapGadgetWidget::setPosition(QPointF pos)
void OPMapGadgetWidget::setMapProvider(QString provider)
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
m_map->SetMapType(mapcontrol::Helper::MapTypeFromString(provider));
}
void OPMapGadgetWidget::setAccessMode(QString accessMode)
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
m_map->configuration->SetAccessMode(mapcontrol::Helper::AccessModeFromString(accessMode));
}
void OPMapGadgetWidget::setUseOpenGL(bool useOpenGL)
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
m_map->SetUseOpenGL(useOpenGL);
}
void OPMapGadgetWidget::setShowTileGridLines(bool showTileGridLines)
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
m_map->SetShowTileGridLines(showTileGridLines);
}
void OPMapGadgetWidget::setUseMemoryCache(bool useMemoryCache)
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
m_map->configuration->SetUseMemoryCache(useMemoryCache);
}
void OPMapGadgetWidget::setCacheLocation(QString cacheLocation)
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
cacheLocation = cacheLocation.simplified(); // remove any surrounding spaces
@ -1235,8 +1292,8 @@ void OPMapGadgetWidget::setCacheLocation(QString cacheLocation)
void OPMapGadgetWidget::setMapMode(opMapModeType mode)
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
if (mode != Normal_MapMode && mode != MagicWaypoint_MapMode)
mode = Normal_MapMode; // fix error
@ -1268,12 +1325,12 @@ void OPMapGadgetWidget::setMapMode(opMapModeType mode)
hideMagicWaypointControls();
// 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();
magic_waypoint.altitude = magic_waypoint.map_wp_item->Altitude();
magic_waypoint.description = magic_waypoint.map_wp_item->Description();
magic_waypoint.map_wp_item = NULL;
m_magic_waypoint.coord = m_magic_waypoint.map_wp_item->Coord();
m_magic_waypoint.altitude = m_magic_waypoint.map_wp_item->Altitude();
m_magic_waypoint.description = m_magic_waypoint.map_wp_item->Description();
m_magic_waypoint.map_wp_item = NULL;
}
m_map->WPDeleteAll();
@ -1320,10 +1377,10 @@ void OPMapGadgetWidget::setMapMode(opMapModeType mode)
m_waypoint_list_mutex.unlock();
// restore the magic waypoint on the map
magic_waypoint.map_wp_item = m_map->WPCreate(magic_waypoint.coord, magic_waypoint.altitude, magic_waypoint.description);
magic_waypoint.map_wp_item->setZValue(10 + magic_waypoint.map_wp_item->Number());
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 = m_map->WPCreate(m_magic_waypoint.coord, m_magic_waypoint.altitude, m_magic_waypoint.description);
m_magic_waypoint.map_wp_item->setZValue(10 + m_magic_waypoint.map_wp_item->Number());
m_magic_waypoint.map_wp_item->SetShowNumber(false);
m_magic_waypoint.map_wp_item->picture.load(QString::fromUtf8(":/opmap/images/waypoint_marker3.png"));
break;
}
@ -1334,8 +1391,10 @@ void OPMapGadgetWidget::setMapMode(opMapModeType mode)
void OPMapGadgetWidget::createActions()
{
if (!m_widget)
return;
int list_size;
if (!m_widget || !m_map)
return;
// ***********************
// create menu actions
@ -1503,7 +1562,7 @@ void OPMapGadgetWidget::createActions()
zoomActGroup = new QActionGroup(this);
connect(zoomActGroup, SIGNAL(triggered(QAction *)), this, SLOT(onZoomActGroup_triggered(QAction *)));
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);
zoom_act->setCheckable(true);
@ -1511,7 +1570,22 @@ void OPMapGadgetWidget::createActions()
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
showSafeAreaAct = new QAction(tr("Show Safe Area"), this);
@ -1523,7 +1597,8 @@ void OPMapGadgetWidget::createActions()
safeAreaActGroup = new QActionGroup(this);
connect(safeAreaActGroup, SIGNAL(triggered(QAction *)), this, SLOT(onSafeAreaActGroup_triggered(QAction *)));
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];
QAction *safeArea_act = new QAction(QString::number(safeArea) + "m", safeAreaActGroup);
@ -1569,7 +1644,8 @@ void OPMapGadgetWidget::createActions()
uavTrailTimeActGroup = new QActionGroup(this);
connect(uavTrailTimeActGroup, SIGNAL(triggered(QAction *)), this, SLOT(onUAVTrailTimeActGroup_triggered(QAction *)));
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];
QAction *uavTrailTime_act = new QAction(QString::number(uav_trail_time) + " sec", uavTrailTimeActGroup);
@ -1582,7 +1658,8 @@ void OPMapGadgetWidget::createActions()
uavTrailDistanceActGroup = new QActionGroup(this);
connect(uavTrailDistanceActGroup, SIGNAL(triggered(QAction *)), this, SLOT(onUAVTrailDistanceActGroup_triggered(QAction *)));
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];
QAction *uavTrailDistance_act = new QAction(QString::number(uav_trail_distance) + " meters", uavTrailDistanceActGroup);
@ -1599,62 +1676,59 @@ void OPMapGadgetWidget::createActions()
void OPMapGadgetWidget::onReloadAct_triggered()
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
m_map->ReloadMap();
}
void OPMapGadgetWidget::onCopyMouseLatLonToClipAct_triggered()
{
// QClipboard *clipboard = qApp->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()
{
// QClipboard *clipboard = qApp->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()
{
// QClipboard *clipboard = qApp->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)
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
m_map->SetShowCompass(show);
}
void OPMapGadgetWidget::onShowDiagnostics_toggled(bool show)
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
m_map->SetShowDiagnostics(show);
}
void OPMapGadgetWidget::onShowHomeAct_toggled(bool show)
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
m_map->Home->setVisible(show);
}
void OPMapGadgetWidget::onShowUAVAct_toggled(bool show)
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
m_map->UAV->setVisible(show);
m_map->GPS->setVisible(show);
@ -1662,8 +1736,8 @@ void OPMapGadgetWidget::onShowUAVAct_toggled(bool show)
void OPMapGadgetWidget::onShowTrailAct_toggled(bool show)
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
m_map->UAV->SetShowTrail(show);
m_map->GPS->SetShowTrail(show);
@ -1671,8 +1745,8 @@ void OPMapGadgetWidget::onShowTrailAct_toggled(bool show)
void OPMapGadgetWidget::onShowTrailLineAct_toggled(bool show)
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
m_map->UAV->SetShowTrailLine(show);
m_map->GPS->SetShowTrailLine(show);
@ -1700,42 +1774,50 @@ void OPMapGadgetWidget::onGoZoomOutAct_triggered()
void OPMapGadgetWidget::onZoomActGroup_triggered(QAction *action)
{
if (!m_widget || !action)
return;
if (!m_widget || !m_map || !action)
return;
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()
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
m_map->SetCurrentPosition(m_map->currentMousePosition()); // center the map onto the mouse position
}
void OPMapGadgetWidget::onSetHomeAct_triggered()
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
setHome(context_menu_lat_lon);
setHome(m_context_menu_lat_lon);
setHomeLocationObject(); // update the HomeLocation UAVObject
}
void OPMapGadgetWidget::onGoHomeAct_triggered()
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
goHome();
}
void OPMapGadgetWidget::onGoUAVAct_triggered()
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
double latitude;
double longitude;
@ -1750,8 +1832,8 @@ void OPMapGadgetWidget::onGoUAVAct_triggered()
void OPMapGadgetWidget::onFollowUAVpositionAct_toggled(bool checked)
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
if (m_widget->toolButtonMapUAV->isChecked() != checked)
m_widget->toolButtonMapUAV->setChecked(checked);
@ -1761,8 +1843,8 @@ void OPMapGadgetWidget::onFollowUAVpositionAct_toggled(bool checked)
void OPMapGadgetWidget::onFollowUAVheadingAct_toggled(bool checked)
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
if (m_widget->toolButtonMapUAVheading->isChecked() != checked)
m_widget->toolButtonMapUAVheading->setChecked(checked);
@ -1772,8 +1854,8 @@ void OPMapGadgetWidget::onFollowUAVheadingAct_toggled(bool checked)
void OPMapGadgetWidget::onUAVTrailTypeActGroup_triggered(QAction *action)
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map || !action)
return;
int trail_type_idx = action->data().toInt();
@ -1785,8 +1867,8 @@ void OPMapGadgetWidget::onUAVTrailTypeActGroup_triggered(QAction *action)
void OPMapGadgetWidget::onClearUAVtrailAct_triggered()
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
m_map->UAV->DeleteTrail();
m_map->GPS->DeleteTrail();
@ -1794,8 +1876,8 @@ void OPMapGadgetWidget::onClearUAVtrailAct_triggered()
void OPMapGadgetWidget::onUAVTrailTimeActGroup_triggered(QAction *action)
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map || !action)
return;
int trail_time = (double)action->data().toInt();
@ -1804,8 +1886,8 @@ void OPMapGadgetWidget::onUAVTrailTimeActGroup_triggered(QAction *action)
void OPMapGadgetWidget::onUAVTrailDistanceActGroup_triggered(QAction *action)
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map || !action)
return;
int trail_distance = action->data().toInt();
@ -1818,8 +1900,8 @@ void OPMapGadgetWidget::onUAVTrailDistanceActGroup_triggered(QAction *action)
/*
void OPMapGadgetWidget::onAddWayPointAct_triggered()
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
if (m_map_mode != Normal_MapMode)
return;
@ -1866,8 +1948,8 @@ void OPMapGadgetWidget::onAddWayPointAct_triggered()
/*
void OPMapGadgetWidget::onEditWayPointAct_triggered()
{
if (!m_widget || !m_map)
return;
if (!m_widget || !m_map)
return;
if (m_map_mode != Normal_MapMode)
return;
@ -2010,7 +2092,7 @@ void OPMapGadgetWidget::onShowSafeAreaAct_toggled(bool show)
void OPMapGadgetWidget::onSafeAreaActGroup_triggered(QAction *action)
{
if (!m_widget || !m_map)
if (!m_widget || !m_map || !action)
return;
int radius = action->data().toInt();
@ -2033,10 +2115,10 @@ void OPMapGadgetWidget::homeMagicWaypoint()
if (m_map_mode != MagicWaypoint_MapMode)
return;
magic_waypoint.coord = home_position.coord;
m_magic_waypoint.coord = m_home_position.coord;
if (magic_waypoint.map_wp_item)
magic_waypoint.map_wp_item->SetCoord(magic_waypoint.coord);
if (m_magic_waypoint.map_wp_item)
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
double dist = distance(home_position.coord, magic_waypoint.coord);
double bear = bearing(home_position.coord, magic_waypoint.coord);
double dist = distance(m_home_position.coord, m_magic_waypoint.coord);
double bear = bearing(m_home_position.coord, m_magic_waypoint.coord);
// get the maximum safe distance - in kilometers
double boundry_dist = (double)m_map->Home->SafeArea() / 1000;
@ -2147,12 +2229,12 @@ void OPMapGadgetWidget::keepMagicWaypointWithInSafeArea()
// 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)
{ // move the on-screen waypoint
if (magic_waypoint.map_wp_item)
magic_waypoint.map_wp_item->SetCoord(magic_waypoint.coord);
if (m_magic_waypoint.map_wp_item)
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;
}
// *************************************************************************************
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)
{
@ -2308,22 +2404,6 @@ bool OPMapGadgetWidget::getGPSPosition(double &latitude, double &longitude, doub
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()
@ -2359,7 +2439,7 @@ bool OPMapGadgetWidget::setHomeLocationObject()
if (!obum)
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);
}

View File

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

View File

@ -151,6 +151,16 @@ void SystemHealthGadgetWidget::setSystemFile(QString dfn)
QGraphicsScene *l_scene = scene();
l_scene->setSceneRect(background->boundingRect());
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

View File

@ -143,6 +143,36 @@ int UAVObjectUtilManager::getBoardModel()
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

View File

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

View File

@ -9,5 +9,6 @@
<dependency name="UAVObjects" version="1.0.0"/>
<dependency name="UAVTalk" version="1.0.0"/>
<dependency name="RAWHid" version="1.0.0"/>
<dependency name="UAVObjectUtil" version="1.0.0"/>
</dependencyList>
</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/uavtalk/uavtalk.pri)
include(../../plugins/rawhid/rawhid.pri)
include(../../plugins/uavobjectutil/uavobjectutil.pri)
INCLUDEPATH += ../../libs/qextserialport/src
HEADERS += uploadergadget.h \
@ -20,7 +21,8 @@ HEADERS += uploadergadget.h \
SSP/port.h \
SSP/qssp.h \
SSP/qsspt.h \
SSP/common.h
SSP/common.h \
runningdevicewidget.h
SOURCES += uploadergadget.cpp \
uploadergadgetconfiguration.cpp \
uploadergadgetfactory.cpp \
@ -32,12 +34,14 @@ SOURCES += uploadergadget.cpp \
devicewidget.cpp \
SSP/port.cpp \
SSP/qssp.cpp \
SSP/qsspt.cpp
SSP/qsspt.cpp \
runningdevicewidget.cpp
OTHER_FILES += Uploader.pluginspec
FORMS += \
uploader.ui \
devicewidget.ui
devicewidget.ui \
runningdevicewidget.ui
RESOURCES += \
uploader.qrc

View File

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

View File

@ -115,6 +115,18 @@ void UploaderGadgetWidget::onAutopilotConnect(){
m_config->bootButton->setEnabled(false);
m_config->rescueButton->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 "delay.h"
#include "devicewidget.h"
#include "runningdevicewidget.h"
#include "op_dfu.h"
#include <qextserialport.h>
#include <qextserialenumerator.h>

View File

@ -10,6 +10,7 @@ OBJDUMP = $(TCHAIN_PREFIX)objdump
SIZE = $(TCHAIN_PREFIX)size
NM = $(TCHAIN_PREFIX)nm
STRIP = $(TCHAIN_PREFIX)strip
INSTALL = install
THUMB = -mthumb
@ -43,6 +44,7 @@ MSG_CLEANING := ${quote} CLEAN ${quote}
MSG_ASMFROMC := ${quote} AS(C) ${quote}
MSG_ASMFROMC_ARM := ${quote} AS(C)-ARM ${quote}
MSG_PYMITEINIT := ${quote} PY ${quote}
MSG_INSTALLING := ${quote} INSTALL ${quote}
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
- msysGit in %ProgramFiles%\Git
- 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
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).
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\,
you have to copy:
make\winx86\make -> C:\Program Files\Git\bin\
make\winx86\sh.cmd -> C:\Program Files\Git\cmd\
make\winx86\bin\* -> C:\Program Files\Git\bin\
make\winx86\cmd\* -> C:\Program Files\Git\cmd\
If you have msysGit installed into another directory, you need to update paths
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:
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:
@ -109,7 +110,7 @@ or to completely remove the build directory:
#!/bin/sh
# This is the cc_make_release.sh file used to build CC release software
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=$?
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
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.

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
#
# 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)
# 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
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 to provide a shell prompt in the unix-like build environment on Windows.
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 PYTHON "C:\Python27" python.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

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="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="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="YawBiasRate" units="channel" type="float" elements="1" defaultvalue="0.000001"/>
<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="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="PitchRatePI" units="" type="float" elementnames="Kp,Ki,ILimit" defaultvalue="0.0015,0,0.3"/>
<field name="YawRatePI" units="" type="float" elementnames="Kp,Ki,ILimit" defaultvalue="0.003,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.002,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="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"/>