2 * Copyright (C) 2016 The LibrePilot Project
3 * Contact: http://www.librepilot.org
5 * This file is part of LibrePilot GCS.
7 * LibrePilot GCS is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
12 * LibrePilot GCS is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with LibrePilot GCS. If not, see <http://www.gnu.org/licenses/>.
22 import "../js/common.js" as Utils
23 import "../js/uav.js" as UAV
27 property variant sceneSize
33 property bool show_panels: false
34 property bool display_rc: false
35 property bool display_bat: false
36 property bool display_oplm: false
37 property bool display_sys: false
39 function close_panels(){
40 if (show_panels == true)
46 function hide_display_rcinput(){
56 function hide_display_battery(){
66 function hide_display_oplink(){
76 function hide_display_system(){
86 property real smeter_angle
88 // Needed to get correctly int8 value, reset value (-127) on disconnect
89 property int oplm0_db: (telemetry_link == 1) ? opLinkStatus.pairSignalStrengths0 : -127
90 property int oplm1_db: (telemetry_link == 1) ? opLinkStatus.pairSignalStrengths1 : -127
91 property int oplm2_db: (telemetry_link == 1) ? opLinkStatus.pairSignalStrengths2 : -127
92 property int oplm3_db: (telemetry_link == 1) ? opLinkStatus.pairSignalStrengths3 : -127
94 property real telemetry_sum
95 property real telemetry_sum_old
96 property bool telemetry_link
98 // Hack : check if telemetry is active. Works with real link and log replay
100 function telemetry_check() {
101 telemetry_sum = opLinkStatus.rxRate + opLinkStatus.txRate
103 if (telemetry_sum != telemetry_sum_old || UAV.isOplmConnected()) {
108 telemetry_sum_old = telemetry_sum
112 id: telemetry_activity
113 interval: 1200; running: true; repeat: true
114 onTriggered: telemetry_check()
117 // Filtering for S-meter. Smeter range -127dB <--> -13dB = S9+60dB
121 interval: 100; running: true; repeat: true
122 onTriggered: smeter_angle = (0.90 * smeter_angle) + (0.1 * (oplm0_db + 13))
127 interval: 100; repeat: true
128 onTriggered: smeter_angle = (0.90 * smeter_angle) + (0.1 * (oplm1_db + 13))
133 interval: 100; repeat: true
134 onTriggered: smeter_angle = (0.90 * smeter_angle) + (0.1 * (oplm2_db + 13))
139 interval: 100; repeat: true
140 onTriggered: smeter_angle = (0.90 * smeter_angle) + (0.1 * (oplm3_db + 13))
143 property int smeter_filter
144 property variant oplm_pair_id : opLinkStatus.pairIDs0
146 function select_oplm(index){
147 smeter_filter0.running = false;
148 smeter_filter1.running = false;
149 smeter_filter2.running = false;
150 smeter_filter3.running = false;
154 smeter_filter0.running = true;
156 oplm_pair_id = opLinkStatus.pairIDs0
159 smeter_filter1.running = true;
161 oplm_pair_id = opLinkStatus.pairIDs1
164 smeter_filter2.running = true;
166 oplm_pair_id = opLinkStatus.pairIDs2
169 smeter_filter3.running = true;
171 oplm_pair_id = opLinkStatus.pairIDs3
181 // Animation properties
184 property double offset_value: close_bg.width * 0.85
186 property int anim_type: Easing.OutExpo
187 property int anim_duration: 1600
190 // Close - Open panel
195 elementName: "close-bg"
196 sceneSize: panels.sceneSize
197 y: Math.floor(scaledBounds.y * sceneItem.height)
202 when: show_panels == true
203 PropertyChanges { target: close_bg; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
206 transitions: Transition {
207 SequentialAnimation {
209 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
216 elementName: "panel-open-icon"
217 sceneSize: panels.sceneSize
218 y: Math.floor(scaledBounds.y * sceneItem.height)
220 opacity: show_panels == true ? 0 : 1
224 when: show_panels == true
225 PropertyChanges { target: panel_open_icon; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
226 PropertyChanges { target: panel_open_icon; opacity: 0; }
229 transitions: Transition {
230 SequentialAnimation {
231 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
232 PropertyAnimation { property: "opacity"; duration: 500; }
239 elementName: "close-panel-mousearea"
240 sceneSize: panels.sceneSize
241 y: Math.floor(scaledBounds.y * sceneItem.height)
245 text: show_panels == true ? "Close panels" : "Open panels"
250 anchors.fill: parent;
251 cursorShape: Qt.PointingHandCursor
252 onClicked: close_panels()
257 when: show_panels == true
258 PropertyChanges { target: close_mousearea; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
261 transitions: Transition {
262 SequentialAnimation {
263 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
274 elementName: "rc-input-bg"
275 sceneSize: panels.sceneSize
276 y: Math.floor(scaledBounds.y * sceneItem.height)
281 when: show_panels == true
282 PropertyChanges { target: rc_input_bg; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
285 transitions: Transition {
286 SequentialAnimation {
287 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
294 elementName: "rc-input-labels"
295 sceneSize: panels.sceneSize
296 y: Math.floor(scaledBounds.y * sceneItem.height)
301 when: show_panels == true
302 PropertyChanges { target: rc_input_labels; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
305 transitions: Transition {
306 SequentialAnimation {
307 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
313 id: rc_input_mousearea
314 elementName: "rc-input-panel-mousearea"
315 sceneSize: panels.sceneSize
316 y: Math.floor(scaledBounds.y * sceneItem.height)
324 id: hidedisp_rcinput;
325 anchors.fill: parent;
326 cursorShape: Qt.PointingHandCursor
327 onClicked: hide_display_rcinput()
332 when: show_panels == true
333 PropertyChanges { target: rc_input_mousearea; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
336 transitions: Transition {
337 SequentialAnimation {
338 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
345 elementName: "rc-throttle"
346 sceneSize: panels.sceneSize
349 width: scaledBounds.width * sceneItem.width
350 height: (scaledBounds.height * sceneItem.height) * (manualControlCommand.throttle)
352 x: scaledBounds.x * sceneItem.width
353 y: (scaledBounds.y * sceneItem.height) - rc_throttle.height + (scaledBounds.height * sceneItem.height)
359 when: show_panels == true
360 PropertyChanges { target: rc_throttle; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
363 transitions: Transition {
364 SequentialAnimation {
365 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
372 elementName: "rc-stick"
373 sceneSize: panels.sceneSize
376 width: scaledBounds.width * sceneItem.width
377 height: scaledBounds.height * sceneItem.height
379 y: (scaledBounds.y * sceneItem.height) + (manualControlCommand.pitch * rc_stick.width * 2.5)
383 //rotate it around his center
384 transform: Rotation {
385 angle: manualControlCommand.yaw * 90
386 origin.y : rc_stick.height / 2
387 origin.x : rc_stick.width / 2
392 when: show_panels == true
393 PropertyChanges { target: rc_stick; x: Math.floor(scaledBounds.x * sceneItem.width) + (manualControlCommand.roll * rc_stick.width * 2.5) + offset_value; }
396 transitions: Transition {
397 SequentialAnimation {
398 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
409 elementName: "battery-bg"
410 sceneSize: panels.sceneSize
411 y: Math.floor(scaledBounds.y * sceneItem.height)
416 when: show_panels == true
417 PropertyChanges { target: battery_bg; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
420 transitions: Transition {
421 SequentialAnimation {
422 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
427 SvgElementPositionItem {
429 sceneSize: panels.sceneSize
430 elementName: "battery-volt-text"
433 width: scaledBounds.width * sceneItem.width
434 height: scaledBounds.height * sceneItem.height
435 y: scaledBounds.y * sceneItem.height
439 when: show_panels == true
440 PropertyChanges { target: battery_volt; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
443 transitions: Transition {
444 SequentialAnimation {
445 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
451 color: UAV.batteryAlarmColor()
452 border.color: "white"
453 border.width: battery_volt.width * 0.01
454 radius: border.width * 4
457 text: UAV.batteryVoltage()
458 anchors.centerIn: parent
462 pixelSize: Math.floor(parent.height * 0.6)
468 SvgElementPositionItem {
470 sceneSize: panels.sceneSize
471 elementName: "battery-amp-text"
474 width: scaledBounds.width * sceneItem.width
475 height: scaledBounds.height * sceneItem.height
476 y: scaledBounds.y * sceneItem.height
480 when: show_panels == true
481 PropertyChanges { target: battery_amp; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
484 transitions: Transition {
485 SequentialAnimation {
486 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
492 color: UAV.batteryAlarmColor()
493 border.color: "white"
494 border.width: battery_volt.width * 0.01
495 radius: border.width * 4
498 text: UAV.batteryCurrent()
499 anchors.centerIn: parent
503 pixelSize: Math.floor(parent.height * 0.6)
509 SvgElementPositionItem {
511 sceneSize: panels.sceneSize
512 elementName: "battery-milliamp-text"
515 width: scaledBounds.width * sceneItem.width
516 height: scaledBounds.height * sceneItem.height
517 y: scaledBounds.y * sceneItem.height
521 when: show_panels == true
522 PropertyChanges { target: battery_milliamp; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
525 transitions: Transition {
526 SequentialAnimation {
527 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
535 text: "Reset consumed energy"
536 visible: display_bat == true ? 1 : 0
540 id: reset_panel_consumed_energy_mouseArea;
541 anchors.fill: parent;
542 cursorShape: Qt.PointingHandCursor;
543 visible: display_bat == true ? 1 : 0
544 onClicked: pfdContext.resetConsumedEnergy();
547 // Alarm based on estimatedFlightTime < 120s orange, < 60s red
548 color: UAV.estimatedTimeAlarmColor()
550 border.color: "white"
551 border.width: battery_volt.width * 0.01
552 radius: border.width * 4
555 text: UAV.batteryConsumedEnergy()
556 anchors.centerIn: parent
560 pixelSize: Math.floor(parent.height * 0.6)
566 SvgElementPositionItem {
567 id: battery_estimated_flight_time
568 sceneSize: panels.sceneSize
569 elementName: "battery-estimated-flight-time"
572 width: scaledBounds.width * sceneItem.width
573 height: scaledBounds.height * sceneItem.height
574 y: scaledBounds.y * sceneItem.height
578 when: show_panels == true
579 PropertyChanges { target: battery_estimated_flight_time; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
582 transitions: Transition {
583 SequentialAnimation {
584 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
592 text: "Reset consumed energy"
593 visible: display_bat == true ? 1 : 0
597 id: reset_panel_consumed_energy_mouseArea2;
598 anchors.fill: parent;
599 cursorShape: Qt.PointingHandCursor;
600 visible: display_bat == true ? 1 : 0
601 onClicked: pfdContext.resetConsumedEnergy();
604 // Alarm based on estimatedFlightTime < 120s orange, < 60s red
605 color: UAV.estimatedTimeAlarmColor()
607 border.color: "white"
608 border.width: battery_volt.width * 0.01
609 radius: border.width * 4
612 text: Utils.formatFlightTime(UAV.estimatedFlightTimeValue())
613 anchors.centerIn: parent
617 pixelSize: Math.floor(parent.height * 0.6)
625 elementName: "battery-labels"
626 sceneSize: panels.sceneSize
627 y: Math.floor(scaledBounds.y * sceneItem.height)
632 when: show_panels == true
633 PropertyChanges { target: battery_labels; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
636 transitions: Transition {
637 SequentialAnimation {
638 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
644 id: battery_mousearea
645 elementName: "battery-panel-mousearea"
646 sceneSize: panels.sceneSize
647 y: Math.floor(scaledBounds.y * sceneItem.height)
651 text: "Battery panel"
655 id: hidedisp_battery;
656 anchors.fill: parent;
657 cursorShape: Qt.PointingHandCursor
658 onClicked: hide_display_battery()
663 when: show_panels == true
664 PropertyChanges { target: battery_mousearea; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
667 transitions: Transition {
668 SequentialAnimation {
669 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
680 elementName: "oplm-bg"
681 sceneSize: panels.sceneSize
682 y: Math.floor(scaledBounds.y * sceneItem.height)
687 when: show_panels == true
688 PropertyChanges { target: oplm_bg; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
691 transitions: Transition {
692 SequentialAnimation {
693 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
700 elementName: "smeter-bg"
701 sceneSize: panels.sceneSize
702 y: Math.floor(scaledBounds.y * sceneItem.height)
707 when: show_panels == true
708 PropertyChanges { target: smeter_bg; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
711 transitions: Transition {
712 SequentialAnimation {
713 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
720 elementName: "smeter-scale"
721 sceneSize: panels.sceneSize
722 y: Math.floor(scaledBounds.y * sceneItem.height)
727 when: show_panels == true
728 PropertyChanges { target: smeter_scale; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
731 transitions: Transition {
732 SequentialAnimation {
733 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
740 elementName: "smeter-needle"
741 sceneSize: panels.sceneSize
742 y: Math.floor(scaledBounds.y * sceneItem.height)
747 when: show_panels == true
748 PropertyChanges { target: smeter_needle; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
751 transitions: Transition {
752 SequentialAnimation {
753 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
757 transform: Rotation {
758 angle: smeter_angle.toFixed(1)
759 origin.y : smeter_needle.height
765 elementName: "smeter-mask"
766 sceneSize: panels.sceneSize
767 //y: Math.floor(scaledBounds.y * sceneItem.height)
768 width: smeter_scale.width * 1.09
769 //anchors.horizontalCenter: smeter_scale
775 when: show_panels == true
776 PropertyChanges { target: smeter_mask; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
779 transitions: Transition {
780 SequentialAnimation {
781 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
788 elementName: "oplm-button-bg"
789 sceneSize: panels.sceneSize
790 y: Math.floor(scaledBounds.y * sceneItem.height)
791 width: smeter_mask.width
797 when: show_panels == true
798 PropertyChanges { target: oplm_button_bg; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
801 transitions: Transition {
802 SequentialAnimation {
803 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
813 property variant idButton_oplm: "oplm_button_" + index
814 property variant idButton_oplm_mousearea: "oplm_button_mousearea" + index
815 property variant button_color: "button"+index+"_color"
819 elementName: "oplm-button-" + index
820 sceneSize: panels.sceneSize
825 border.width: parent.width * 0.04
826 radius: border.width*3
828 opacity: smeter_filter == index ? 0.5 : 0
832 id: idButton_oplm_mousearea;
833 anchors.fill: parent;
834 cursorShape: Qt.PointingHandCursor;
835 visible: display_oplm == true ? 1 : 0
836 onClicked: select_oplm(index)
841 when: show_panels == true
842 PropertyChanges { target: idButton_oplm; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
845 transitions: Transition {
846 SequentialAnimation {
847 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
855 elementName: "oplm-id-label"
856 sceneSize: panels.sceneSize
857 y: Math.floor(scaledBounds.y * sceneItem.height)
862 when: show_panels == true
863 PropertyChanges { target: oplm_id_label; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
866 transitions: Transition {
867 SequentialAnimation {
868 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
873 SvgElementPositionItem {
875 sceneSize: panels.sceneSize
876 elementName: "oplm-id-text"
879 width: scaledBounds.width * sceneItem.width
880 height: scaledBounds.height * sceneItem.height
881 y: scaledBounds.y * sceneItem.height
885 when: show_panels == true
886 PropertyChanges { target: oplm_id_text; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
889 transitions: Transition {
890 SequentialAnimation {
891 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
896 text: oplm_pair_id > 0 ? oplm_pair_id.toString(16) : "-- -- -- --"
897 anchors.centerIn: parent
901 pixelSize: Math.floor(parent.height * 1.4)
902 weight: Font.DemiBold
903 capitalization: Font.AllUppercase
910 elementName: "rx-quality-label"
911 sceneSize: panels.sceneSize
912 y: Math.floor(scaledBounds.y * sceneItem.height)
917 when: show_panels == true
918 PropertyChanges { target: rx_quality_label; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
921 transitions: Transition {
922 SequentialAnimation {
923 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
928 SvgElementPositionItem {
930 sceneSize: panels.sceneSize
931 elementName: "rx-quality-text"
934 width: scaledBounds.width * sceneItem.width
935 height: scaledBounds.height * sceneItem.height
936 y: scaledBounds.y * sceneItem.height
940 when: show_panels == true
941 PropertyChanges { target: rx_quality_text; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
944 transitions: Transition {
945 SequentialAnimation {
946 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
951 text: UAV.receiverQuality()
952 anchors.right: parent.right
956 pixelSize: Math.floor(parent.height * 1.4)
957 weight: Font.DemiBold
964 elementName: "cnx-state-label"
965 sceneSize: panels.sceneSize
966 y: Math.floor(scaledBounds.y * sceneItem.height)
971 when: show_panels == true
972 PropertyChanges { target: cnx_state_label; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
975 transitions: Transition {
976 SequentialAnimation {
977 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
982 SvgElementPositionItem {
984 sceneSize: panels.sceneSize
985 elementName: "cnx-state-text"
988 width: scaledBounds.width * sceneItem.width
989 height: scaledBounds.height * sceneItem.height
990 y: scaledBounds.y * sceneItem.height
994 when: show_panels == true
995 PropertyChanges { target: cnx_state_text; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
998 transitions: Transition {
999 SequentialAnimation {
1000 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
1005 text: UAV.oplmLinkState()
1006 anchors.right: parent.right
1009 family: pt_bold.name
1010 pixelSize: Math.floor(parent.height * 1.4)
1011 weight: Font.DemiBold
1018 elementName: "oplm-panel-mousearea"
1019 sceneSize: panels.sceneSize
1020 y: Math.floor(scaledBounds.y * sceneItem.height)
1029 anchors.fill: parent;
1030 cursorShape: Qt.PointingHandCursor
1031 onClicked: hide_display_oplink()
1036 when: show_panels == true
1037 PropertyChanges { target: oplm_mousearea; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
1040 transitions: Transition {
1041 SequentialAnimation {
1042 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
1053 elementName: "system-bg"
1054 sceneSize: panels.sceneSize
1055 y: scaledBounds.y * sceneItem.height
1060 when: show_panels == true
1061 PropertyChanges { target: system_bg; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
1064 transitions: Transition {
1065 SequentialAnimation {
1066 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
1071 SvgElementPositionItem {
1072 id: system_frametype
1073 elementName: "system-frame-type"
1074 sceneSize: panels.sceneSize
1075 y: scaledBounds.y * sceneItem.height
1080 when: show_panels == true
1081 PropertyChanges { target: system_frametype; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
1084 transitions: Transition {
1085 SequentialAnimation {
1086 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
1091 text: UAV.frameType()
1092 anchors.right: parent.right
1095 family: pt_bold.name
1096 pixelSize: Math.floor(parent.height * 1.4)
1097 weight: Font.DemiBold
1102 SvgElementPositionItem {
1103 id: system_cpuloadtemp
1104 elementName: "system-cpu-load-temp"
1105 sceneSize: panels.sceneSize
1106 y: scaledBounds.y * sceneItem.height
1111 when: show_panels == true
1112 PropertyChanges { target: system_cpuloadtemp; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
1115 transitions: Transition {
1116 SequentialAnimation {
1117 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
1122 // CC3D: Only display Cpu load, no temperature available.
1123 text: UAV.cpuLoad() + "%" + [UAV.isCC3D() ? "" : " | " + UAV.cpuTemp() + "°C"]
1124 anchors.right: parent.right
1127 family: pt_bold.name
1128 pixelSize: Math.floor(parent.height * 1.4)
1129 weight: Font.DemiBold
1134 SvgElementPositionItem {
1136 elementName: "system-mem-free"
1137 sceneSize: panels.sceneSize
1138 y: scaledBounds.y * sceneItem.height
1143 when: show_panels == true
1144 PropertyChanges { target: system_memfree; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
1147 transitions: Transition {
1148 SequentialAnimation {
1149 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
1154 text: UAV.freeMemory()
1155 anchors.right: parent.right
1158 family: pt_bold.name
1159 pixelSize: Math.floor(parent.height * 1.4)
1160 weight: Font.DemiBold
1165 SvgElementPositionItem {
1166 id: system_fusion_algo
1167 elementName: "system-attitude-estimation-algo"
1168 sceneSize: panels.sceneSize
1169 y: scaledBounds.y * sceneItem.height
1174 when: show_panels == true
1175 PropertyChanges { target: system_fusion_algo; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
1178 transitions: Transition {
1179 SequentialAnimation {
1180 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
1185 text: UAV.fusionAlgorithm()
1186 anchors.right: parent.right
1189 family: pt_bold.name
1190 pixelSize: Math.floor(parent.height * 1.35)
1191 weight: Font.DemiBold
1196 SvgElementPositionItem {
1198 elementName: "system-mag-used"
1199 sceneSize: panels.sceneSize
1200 y: scaledBounds.y * sceneItem.height
1205 when: show_panels == true
1206 PropertyChanges { target: system_mag_used; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
1209 transitions: Transition {
1210 SequentialAnimation {
1211 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
1216 text: UAV.magSourceName()
1217 anchors.right: parent.right
1220 family: pt_bold.name
1221 pixelSize: Math.floor(parent.height * 1.4)
1222 weight: Font.DemiBold
1227 SvgElementPositionItem {
1229 elementName: "system-gps-type"
1230 sceneSize: panels.sceneSize
1231 y: scaledBounds.y * sceneItem.height
1236 when: show_panels == true
1237 PropertyChanges { target: system_gpstype; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
1240 transitions: Transition {
1241 SequentialAnimation {
1242 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }
1247 text: UAV.gpsSensorType()
1248 anchors.right: parent.right
1251 family: pt_bold.name
1252 pixelSize: Math.floor(parent.height * 1.4)
1253 weight: Font.DemiBold
1259 id: system_mousearea
1260 elementName: "system-panel-mousearea"
1261 sceneSize: panels.sceneSize
1262 y: Math.floor(scaledBounds.y * sceneItem.height)
1266 text: "System panel"
1270 id: hidedisp_system;
1271 anchors.fill: parent;
1272 cursorShape: Qt.PointingHandCursor
1273 onClicked: hide_display_system()
1278 when: show_panels == true
1279 PropertyChanges { target: system_mousearea; x: Math.floor(scaledBounds.x * sceneItem.width) + offset_value; }
1282 transitions: Transition {
1283 SequentialAnimation {
1284 PropertyAnimation { property: "x"; easing.type: anim_type; duration: anim_duration }