diff --git a/ground/openpilotgcs/share/openpilotgcs/pfd/default/Info.qml b/ground/openpilotgcs/share/openpilotgcs/pfd/default/Info.qml
index e8455caba..f8db82737 100644
--- a/ground/openpilotgcs/share/openpilotgcs/pfd/default/Info.qml
+++ b/ground/openpilotgcs/share/openpilotgcs/pfd/default/Info.qml
@@ -37,11 +37,6 @@ Item {
property real wp_eta_m: (wp_eta > 0 ? Math.floor((wp_eta - wp_eta_h*3600)/60) : 0)
property real wp_eta_s: (wp_eta > 0 ? Math.floor(wp_eta - wp_eta_h*3600 - wp_eta_m*60) : 0)
- property real est_flight_time: Math.round(FlightBatteryState.EstimatedFlightTime)
- property real est_time_h: (est_flight_time > 0 ? Math.floor(est_flight_time / 3600) : 0 )
- property real est_time_m: (est_flight_time > 0 ? Math.floor((est_flight_time - est_time_h*3600)/60) : 0)
- property real est_time_s: (est_flight_time > 0 ? Math.floor(est_flight_time - est_time_h*3600 - est_time_m*60) : 0)
-
function reset_distance(){
total_distance = 0;
}
@@ -66,110 +61,6 @@ Item {
return time.toString();
}
- //
- // Panel functions
- //
-
- property bool hide_display_rc: false
- property bool hide_display_bat: false
- property bool hide_display_oplm: false
-
- function hide_display_rcinput(){
- if (hide_display_rc == false && hide_display_bat == false && hide_display_oplm == false)
- hide_display_rc = true;
- else
- hide_display_rc = false;
- battery_bg.z = -1
- oplm_bg.z = -1
- }
-
- function hide_display_battery(){
- if (hide_display_bat == false && hide_display_rc == false && hide_display_oplm == false)
- hide_display_bat = true;
- else
- hide_display_bat = false;
- battery_bg.z = 10
- oplm_bg.z = -1
- }
-
- function hide_display_oplink(){
- if (hide_display_oplm == false && hide_display_rc == false && hide_display_bat == false)
- hide_display_oplm = true;
- else
- hide_display_oplm = false;
- oplm_bg.z = 20
- }
-
- // Uninitialised, Ok, Warning, Critical, Error
- property variant batColors : ["#2c2929", "green", "orange", "red", "red"]
-
- property real smeter_angle
-
- // Needed to get correctly int8 value, reset value (-127) on disconnect
- property int oplm0_db: OPLinkStatus.LinkState == 4 ? OPLinkStatus.PairSignalStrengths_0 : -127
- property int oplm1_db: OPLinkStatus.LinkState == 4 ? OPLinkStatus.PairSignalStrengths_1 : -127
- property int oplm2_db: OPLinkStatus.LinkState == 4 ? OPLinkStatus.PairSignalStrengths_2 : -127
- property int oplm3_db: OPLinkStatus.LinkState == 4 ? OPLinkStatus.PairSignalStrengths_3 : -127
-
- // Filtering for S-meter. Smeter range -127dB <--> -13dB = S9+60dB
-
- Timer {
- id: smeter_filter0
- interval: 100; running: true; repeat: true
- onTriggered: smeter_angle = (0.90 * smeter_angle) + (0.1 * (oplm0_db + 13))
- }
-
- Timer {
- id: smeter_filter1
- interval: 100; repeat: true
- onTriggered: smeter_angle = (0.90 * smeter_angle) + (0.1 * (oplm1_db + 13))
- }
-
- Timer {
- id: smeter_filter2
- interval: 100; repeat: true
- onTriggered: smeter_angle = (0.90 * smeter_angle) + (0.1 * (oplm2_db + 13))
- }
-
- Timer {
- id: smeter_filter3
- interval: 100; repeat: true
- onTriggered: smeter_angle = (0.90 * smeter_angle) + (0.1 * (oplm3_db + 13))
- }
-
- property int smeter_filter
- property variant oplm_pair_id : OPLinkStatus.PairIDs_0
-
- function select_oplm(index){
- smeter_filter0.running = false;
- smeter_filter1.running = false;
- smeter_filter2.running = false;
- smeter_filter3.running = false;
-
- switch(index) {
- case 0:
- smeter_filter0.running = true;
- smeter_filter = 0;
- oplm_pair_id = OPLinkStatus.PairIDs_0
- break;
- case 1:
- smeter_filter1.running = true;
- smeter_filter = 1;
- oplm_pair_id = OPLinkStatus.PairIDs_1
- break;
- case 2:
- smeter_filter2.running = true;
- smeter_filter = 2;
- oplm_pair_id = OPLinkStatus.PairIDs_2
- break;
- case 3:
- smeter_filter3.running = true;
- smeter_filter = 3;
- oplm_pair_id = OPLinkStatus.PairIDs_3
- break;
- }
- }
-
// End Functions
//
// Start Drawing
@@ -473,630 +364,6 @@ Item {
}
}
- //
- // Rc-Input panel
- //
-
- SvgElementImage {
- id: rc_input_bg
- elementName: "rc-input-bg"
- sceneSize: info.sceneSize
- y: Math.floor(scaledBounds.y * sceneItem.height)
-
- states: State {
- name: "fading"
- when: hide_display_rc !== true
- PropertyChanges { target: rc_input_bg; x: Math.floor(scaledBounds.x * sceneItem.width) - (rc_input_bg.width * 0.85); }
- }
-
- transitions: Transition {
- SequentialAnimation {
- id: rc_input_anim
- PropertyAnimation { property: "x"; duration: 800 }
- }
- }
- }
-
- SvgElementImage {
- id: rc_input_labels
- elementName: "rc-input-labels"
- sceneSize: info.sceneSize
- y: Math.floor(scaledBounds.y * sceneItem.height)
-
- states: State {
- name: "fading"
- when: hide_display_rc !== true
- PropertyChanges { target: rc_input_labels; x: Math.floor(scaledBounds.x * sceneItem.width) - (rc_input_bg.width * 0.85); }
- }
-
- transitions: Transition {
- SequentialAnimation {
- PropertyAnimation { property: "x"; duration: 800 }
- }
- }
- }
-
- SvgElementImage {
- id: rc_input_mousearea
- elementName: "rc-input-panel-mousearea"
- sceneSize: info.sceneSize
- y: Math.floor(scaledBounds.y * sceneItem.height)
-
- MouseArea {
- id: hidedisp_rcinput;
- anchors.fill: parent;
- cursorShape: hide_display_bat == false && hide_display_oplm == false ? Qt.WhatsThisCursor : Qt.ArrowCursor
- onClicked: hide_display_bat == false && hide_display_oplm == false ? hide_display_rcinput() : 0
- }
-
- states: State {
- name: "fading"
- when: hide_display_rc !== true
- PropertyChanges { target: rc_input_mousearea; x: Math.floor(scaledBounds.x * sceneItem.width) - (rc_input_bg.width * 0.85); }
- }
-
- transitions: Transition {
- SequentialAnimation {
- PropertyAnimation { property: "x"; duration: 800 }
- }
- }
- }
-
- SvgElementImage {
- id: rc_throttle
- elementName: "rc-throttle"
- sceneSize: info.sceneSize
-
- width: scaledBounds.width * sceneItem.width
- height: (scaledBounds.height * sceneItem.height) * (ManualControlCommand.Throttle)
-
- x: scaledBounds.x * sceneItem.width
- y: (scaledBounds.y * sceneItem.height) - rc_throttle.height + (scaledBounds.height * sceneItem.height)
-
- smooth: true
-
- states: State {
- name: "fading"
- when: hide_display_rc !== true
- PropertyChanges { target: rc_throttle; x: Math.floor(scaledBounds.x * sceneItem.width) - (rc_input_bg.width * 0.85); }
- }
-
- transitions: Transition {
- SequentialAnimation {
- PropertyAnimation { property: "x"; duration: 800 }
- }
- }
- }
-
- SvgElementImage {
- id: rc_stick
- elementName: "rc-stick"
- sceneSize: info.sceneSize
-
- width: scaledBounds.width * sceneItem.width
- height: scaledBounds.height * sceneItem.height
-
- x: (scaledBounds.x * sceneItem.width) + (ManualControlCommand.Roll * rc_stick.width * 2.5)
- y: (scaledBounds.y * sceneItem.height) + (ManualControlCommand.Pitch * rc_stick.width * 2.5)
-
- smooth: true
-
- //rotate it around his center
- transform: Rotation {
- angle: ManualControlCommand.Yaw * 90
- origin.y : rc_stick.height / 2
- origin.x : rc_stick.width / 2
- }
-
- states: State {
- name: "fading"
- when: hide_display_rc !== true
- PropertyChanges { target: rc_stick; x: Math.floor(scaledBounds.x * sceneItem.width) - (rc_input_bg.width * 0.85); }
- }
-
- transitions: Transition {
- SequentialAnimation {
- PropertyAnimation { property: "x"; duration: 800 }
- }
- }
- }
-
- //
- // Battery panel
- //
-
- SvgElementImage {
- id: battery_bg
- elementName: "battery-bg"
- sceneSize: info.sceneSize
- y: Math.floor(scaledBounds.y * sceneItem.height)
- z: 10
-
- states: State {
- name: "fading"
- when: hide_display_bat !== true
- PropertyChanges { target: battery_bg; x: Math.floor(scaledBounds.x * sceneItem.width) - (battery_bg.width * 0.85); }
- }
-
- transitions: Transition {
- SequentialAnimation {
- PropertyAnimation { property: "x"; duration: 800 }
- }
- }
- }
-
- SvgElementPositionItem {
- id: battery_volt
- sceneSize: info.sceneSize
- elementName: "battery-volt-text"
- z: 11
-
- width: scaledBounds.width * sceneItem.width
- height: scaledBounds.height * sceneItem.height
- y: scaledBounds.y * sceneItem.height
-
- states: State {
- name: "fading"
- when: hide_display_bat !== true
- PropertyChanges { target: battery_volt; x: Math.floor(scaledBounds.x * sceneItem.width) - (battery_bg.width * 0.85); }
- }
-
- transitions: Transition {
- SequentialAnimation {
- PropertyAnimation { property: "x"; duration: 800 }
- }
- }
-
- Rectangle {
- anchors.fill: parent
- color: info.batColors[SystemAlarms.Alarm_Battery]
- border.color: "white"
- border.width: battery_volt.width * 0.01
- radius: border.width * 4
-
- Text {
- text: FlightBatteryState.Voltage.toFixed(2)
- anchors.centerIn: parent
- color: "white"
- font {
- family: "Arial"
- pixelSize: Math.floor(parent.height * 0.6)
- }
- }
- }
- }
-
- SvgElementPositionItem {
- id: battery_amp
- sceneSize: info.sceneSize
- elementName: "battery-amp-text"
- z: 12
-
- width: scaledBounds.width * sceneItem.width
- height: scaledBounds.height * sceneItem.height
- y: scaledBounds.y * sceneItem.height
-
- states: State {
- name: "fading"
- when: hide_display_bat !== true
- PropertyChanges { target: battery_amp; x: Math.floor(scaledBounds.x * sceneItem.width) - (battery_bg.width * 0.85); }
- }
-
- transitions: Transition {
- SequentialAnimation {
- PropertyAnimation { property: "x"; duration: 800 }
- }
- }
-
- Rectangle {
- anchors.fill: parent
- color: info.batColors[SystemAlarms.Alarm_Battery]
- border.color: "white"
- border.width: battery_volt.width * 0.01
- radius: border.width * 4
-
- Text {
- text: FlightBatteryState.Current.toFixed(2)
- anchors.centerIn: parent
- color: "white"
- font {
- family: "Arial"
- pixelSize: Math.floor(parent.height * 0.6)
- }
- }
- }
- }
-
- SvgElementPositionItem {
- id: battery_milliamp
- sceneSize: info.sceneSize
- elementName: "battery-milliamp-text"
- z: 13
-
- width: scaledBounds.width * sceneItem.width
- height: scaledBounds.height * sceneItem.height
- y: scaledBounds.y * sceneItem.height
-
- states: State {
- name: "fading"
- when: hide_display_bat !== true
- PropertyChanges { target: battery_milliamp; x: Math.floor(scaledBounds.x * sceneItem.width) - (battery_bg.width * 0.85); }
- }
-
- transitions: Transition {
- SequentialAnimation {
- PropertyAnimation { property: "x"; duration: 800 }
- }
- }
-
- Rectangle {
- anchors.fill: parent
-
- // Alarm based on FlightBatteryState.EstimatedFlightTime < 120s orange, < 60s red
- color: (FlightBatteryState.EstimatedFlightTime <= 120 && FlightBatteryState.EstimatedFlightTime > 60 ? "orange" :
- (FlightBatteryState.EstimatedFlightTime <= 60 ? "red": info.batColors[SystemAlarms.Alarm_Battery]))
-
- border.color: "white"
- border.width: battery_volt.width * 0.01
- radius: border.width * 4
-
- Text {
- text: FlightBatteryState.ConsumedEnergy.toFixed(0)
- anchors.centerIn: parent
- color: "white"
- font {
- family: "Arial"
- pixelSize: Math.floor(parent.height * 0.6)
- }
- }
- }
- }
-
- SvgElementPositionItem {
- id: battery_estimated_flight_time
- sceneSize: info.sceneSize
- elementName: "battery-estimated-flight-time"
- z: 14
- width: scaledBounds.width * sceneItem.width
- height: scaledBounds.height * sceneItem.height
- y: scaledBounds.y * sceneItem.height
-
- states: State {
- name: "fading"
- when: hide_display_bat !== true
- PropertyChanges { target: battery_estimated_flight_time; x: Math.floor(scaledBounds.x * sceneItem.width) - (battery_bg.width * 0.85); }
- }
-
- transitions: Transition {
- SequentialAnimation {
- PropertyAnimation { property: "x"; duration: 800 }
- }
- }
-
- Rectangle {
- anchors.fill: parent
- //color: info.batColors[SystemAlarms.Alarm_Battery]
-
- // Alarm based on FlightBatteryState.EstimatedFlightTime < 120s orange, < 60s red
- color: (FlightBatteryState.EstimatedFlightTime <= 120 && FlightBatteryState.EstimatedFlightTime > 60 ? "orange" :
- (FlightBatteryState.EstimatedFlightTime <= 60 ? "red": info.batColors[SystemAlarms.Alarm_Battery]))
-
- border.color: "white"
- border.width: battery_volt.width * 0.01
- radius: border.width * 4
-
- Text {
- text: formatTime(est_time_h) + ":" + formatTime(est_time_m) + ":" + formatTime(est_time_s)
- anchors.centerIn: parent
- color: "white"
- font {
- family: "Arial"
- pixelSize: Math.floor(parent.height * 0.6)
- }
- }
- }
- }
-
- SvgElementImage {
- id: battery_labels
- elementName: "battery-labels"
- sceneSize: info.sceneSize
- y: Math.floor(scaledBounds.y * sceneItem.height)
- z: 15
- states: State {
- name: "fading"
- when: hide_display_bat !== true
- PropertyChanges { target: battery_labels; x: Math.floor(scaledBounds.x * sceneItem.width) - (battery_bg.width * 0.85); }
- }
-
- transitions: Transition {
- SequentialAnimation {
- PropertyAnimation { property: "x"; duration: 800 }
- }
- }
- }
-
- SvgElementImage {
- id: battery_mousearea
- elementName: "battery-panel-mousearea"
- sceneSize: info.sceneSize
- y: Math.floor(scaledBounds.y * sceneItem.height)
- z: 16
-
- MouseArea {
- id: hidedisp_battery;
- anchors.fill: parent;
- cursorShape: hide_display_rc == false && hide_display_oplm == false ? Qt.WhatsThisCursor : Qt.ArrowCursor
- onClicked: hide_display_rc == false && hide_display_oplm == false ? hide_display_battery() : 0
- }
-
- states: State {
- name: "fading"
- when: hide_display_bat !== true
- PropertyChanges { target: battery_mousearea; x: Math.floor(scaledBounds.x * sceneItem.width) - (battery_bg.width * 0.85); }
- }
-
- transitions: Transition {
- SequentialAnimation {
- PropertyAnimation { property: "x"; duration: 800 }
- }
- }
- }
-
- //
- // OPLM panel
- //
-
- SvgElementImage {
- id: oplm_bg
- elementName: "oplm-bg"
- sceneSize: info.sceneSize
- y: Math.floor(scaledBounds.y * sceneItem.height)
- z: 20
-
- states: State {
- name: "fading"
- when: hide_display_oplm !== true
- PropertyChanges { target: oplm_bg; x: Math.floor(scaledBounds.x * sceneItem.width) - (oplm_bg.width * 0.85); }
- }
-
- transitions: Transition {
- SequentialAnimation {
- PropertyAnimation { property: "x"; duration: 800 }
- }
- }
- }
-
- SvgElementImage {
- id: smeter_bg
- elementName: "smeter-bg"
- sceneSize: info.sceneSize
- y: Math.floor(scaledBounds.y * sceneItem.height)
- z: 21
-
- states: State {
- name: "fading"
- when: hide_display_oplm !== true
- PropertyChanges { target: smeter_bg; x: Math.floor(scaledBounds.x * sceneItem.width) - (oplm_bg.width * 0.85); }
- }
-
- transitions: Transition {
- SequentialAnimation {
- PropertyAnimation { property: "x"; duration: 800 }
- }
- }
- }
-
- SvgElementImage {
- id: smeter_scale
- elementName: "smeter-scale"
- sceneSize: info.sceneSize
- y: Math.floor(scaledBounds.y * sceneItem.height)
- z: 22
-
- states: State {
- name: "fading"
- when: hide_display_oplm !== true
- PropertyChanges { target: smeter_scale; x: Math.floor(scaledBounds.x * sceneItem.width) - (oplm_bg.width * 0.85); }
- }
-
- transitions: Transition {
- SequentialAnimation {
- PropertyAnimation { property: "x"; duration: 800 }
- }
- }
- }
-
- SvgElementImage {
- id: smeter_needle
- elementName: "smeter-needle"
- sceneSize: info.sceneSize
- y: Math.floor(scaledBounds.y * sceneItem.height)
- z: 23
-
- states: State {
- name: "fading"
- when: hide_display_oplm !== true
- PropertyChanges { target: smeter_needle; x: Math.floor(scaledBounds.x * sceneItem.width) - (oplm_bg.width * 0.85); }
- }
-
- transitions: Transition {
- SequentialAnimation {
- PropertyAnimation { property: "x"; duration: 800 }
- }
- }
-
- transform: Rotation {
- angle: smeter_angle.toFixed(1)
- origin.y : smeter_needle.height
- }
- }
-
- SvgElementImage {
- id: smeter_mask
- elementName: "smeter-mask"
- sceneSize: info.sceneSize
- y: Math.floor(scaledBounds.y * sceneItem.height)
- z: 24
-
- states: State {
- name: "fading"
- when: hide_display_oplm !== true
- PropertyChanges { target: smeter_mask; x: Math.floor(scaledBounds.x * sceneItem.width) - (oplm_bg.width * 0.85); }
- }
-
- transitions: Transition {
- SequentialAnimation {
- PropertyAnimation { property: "x"; duration: 800 }
- }
- }
- }
-
- SvgElementImage {
- id: oplm_button_bg
- elementName: "oplm-button-bg"
- sceneSize: info.sceneSize
- y: Math.floor(scaledBounds.y * sceneItem.height)
- z: 25
-
- states: State {
- name: "fading"
- when: hide_display_oplm !== true
- PropertyChanges { target: oplm_button_bg; x: Math.floor(scaledBounds.x * sceneItem.width) - (oplm_bg.width * 0.85); }
- }
-
- transitions: Transition {
- SequentialAnimation {
- PropertyAnimation { property: "x"; duration: 800 }
- }
- }
- }
-
- Repeater {
- model: 4
-
- SvgElementImage {
- z: 25
- property variant idButton_oplm: "oplm_button_" + index
- property variant idButton_oplm_mousearea: "oplm_button_mousearea" + index
- property variant button_color: "button"+index+"_color"
-
- id: idButton_oplm
-
- elementName: "oplm-button-" + index
- sceneSize: info.sceneSize
-
- Rectangle {
- anchors.fill: parent
- border.color: "red"
- border.width: parent.width * 0.04
- radius: border.width*3
- color: "transparent"
- opacity: smeter_filter == index ? 0.5 : 0
- }
-
- MouseArea {
- id: idButton_oplm_mousearea;
- anchors.fill: parent;
- cursorShape: Qt.PointingHandCursor
- onClicked: select_oplm(index)
- }
-
- states: State {
- name: "fading"
- when: hide_display_oplm !== true
- PropertyChanges { target: idButton_oplm; x: Math.floor(scaledBounds.x * sceneItem.width) - (oplm_bg.width * 0.85); }
- }
-
- transitions: Transition {
- SequentialAnimation {
- PropertyAnimation { property: "x"; duration: 800 }
- }
- }
- }
- }
-
- SvgElementImage {
- id: oplm_id_label
- elementName: "oplm-id-label"
- sceneSize: info.sceneSize
- y: Math.floor(scaledBounds.y * sceneItem.height)
- z: 26
- states: State {
- name: "fading"
- when: hide_display_oplm !== true
- PropertyChanges { target: oplm_id_label; x: Math.floor(scaledBounds.x * sceneItem.width) - (oplm_bg.width * 0.85); }
- }
-
- transitions: Transition {
- SequentialAnimation {
- PropertyAnimation { property: "x"; duration: 800 }
- }
- }
- }
-
- SvgElementPositionItem {
- id: oplm_id_text
- sceneSize: info.sceneSize
- elementName: "oplm-id-text"
- z: 27
-
- width: scaledBounds.width * sceneItem.width
- height: scaledBounds.height * sceneItem.height
- y: scaledBounds.y * sceneItem.height
-
- states: State {
- name: "fading"
- when: hide_display_oplm !== true
- PropertyChanges { target: oplm_id_text; x: Math.floor(scaledBounds.x * sceneItem.width) - (oplm_bg.width * 0.85); }
- }
-
- transitions: Transition {
- SequentialAnimation {
- PropertyAnimation { property: "x"; duration: 800 }
- }
- }
-
- Text {
- text: oplm_pair_id > 0 ? oplm_pair_id.toString(16) : "-- -- -- --"
- anchors.centerIn: parent
- color: "white"
- font {
- family: "Arial"
- pixelSize: Math.floor(parent.height * 1.4)
- weight: Font.DemiBold
- capitalization: Font.AllUppercase
- }
- }
- }
-
- SvgElementImage {
- id: oplm_mousearea
- elementName: "oplm-panel-mousearea"
- sceneSize: info.sceneSize
- y: Math.floor(scaledBounds.y * sceneItem.height)
- z: 26
-
- MouseArea {
- id: hidedisp_oplm;
- anchors.fill: parent;
- cursorShape: hide_display_rc == false && hide_display_bat == false ? Qt.WhatsThisCursor : Qt.ArrowCursor
- onClicked: hide_display_rc == false && hide_display_bat == false ? hide_display_oplink() : 0
- }
-
- states: State {
- name: "fading"
- when: hide_display_oplm !== true
- PropertyChanges { target: oplm_mousearea; x: Math.floor(scaledBounds.x * sceneItem.width) - (oplm_bg.width * 0.85); }
- }
-
- transitions: Transition {
- SequentialAnimation {
- PropertyAnimation { property: "x"; duration: 800 }
- }
- }
- }
-
SvgElementImage {
id: info_border
elementName: "info-border"
diff --git a/ground/openpilotgcs/share/openpilotgcs/pfd/default/Panels.qml b/ground/openpilotgcs/share/openpilotgcs/pfd/default/Panels.qml
new file mode 100644
index 000000000..0e3f0f483
--- /dev/null
+++ b/ground/openpilotgcs/share/openpilotgcs/pfd/default/Panels.qml
@@ -0,0 +1,906 @@
+import QtQuick 2.0
+
+Item {
+ id: panels
+ property variant sceneSize
+
+ property real est_flight_time: Math.round(FlightBatteryState.EstimatedFlightTime)
+ property real est_time_h: (est_flight_time > 0 ? Math.floor(est_flight_time / 3600) : 0 )
+ property real est_time_m: (est_flight_time > 0 ? Math.floor((est_flight_time - est_time_h*3600)/60) : 0)
+ property real est_time_s: (est_flight_time > 0 ? Math.floor(est_flight_time - est_time_h*3600 - est_time_m*60) : 0)
+
+ function formatTime(time) {
+ if (time === 0)
+ return "00"
+ if (time < 10)
+ return "0" + time;
+ else
+ return time.toString();
+ }
+
+ //
+ // Panel functions
+ //
+
+ property bool show_panels: false
+ property bool hide_display_rc: false
+ property bool hide_display_bat: false
+ property bool hide_display_oplm: false
+
+ function close_panels(){
+ if (show_panels == true)
+ show_panels = false;
+ rc_input_bg.z = 10
+ battery_bg.z = 20
+ oplm_bg.z = 30
+ system_bg.z = 40
+ }
+
+ function hide_display_rcinput(){
+ if (show_panels == false)
+ show_panels = true;
+ else
+ rc_input_bg.z = 10
+ battery_bg.z = -1
+ oplm_bg.z = -1
+ system_bg.z = -1
+ }
+
+ function hide_display_battery(){
+ if (show_panels == false)
+ show_panels = true;
+ else
+ rc_input_bg.z = -1
+ battery_bg.z = 20
+ oplm_bg.z = -1
+ system_bg.z = -1
+ }
+
+ function hide_display_oplink(){
+ if (show_panels == false)
+ show_panels = true;
+ else
+ rc_input_bg.z = -1
+ battery_bg.z = -1
+ oplm_bg.z = 30
+ system_bg.z = -1
+ }
+
+ function hide_display_system(){
+ if (show_panels == false)
+ show_panels = true;
+ else
+ rc_input_bg.z = -1
+ battery_bg.z = -1
+ oplm_bg.z = -1
+ system_bg.z = 40
+ }
+
+ // Uninitialised, Ok, Warning, Critical, Error
+ property variant batColors : ["#2c2929", "green", "orange", "red", "red"]
+
+ property real smeter_angle
+
+ // Needed to get correctly int8 value, reset value (-127) on disconnect
+ property int oplm0_db: OPLinkStatus.LinkState == 4 ? OPLinkStatus.PairSignalStrengths_0 : -127
+ property int oplm1_db: OPLinkStatus.LinkState == 4 ? OPLinkStatus.PairSignalStrengths_1 : -127
+ property int oplm2_db: OPLinkStatus.LinkState == 4 ? OPLinkStatus.PairSignalStrengths_2 : -127
+ property int oplm3_db: OPLinkStatus.LinkState == 4 ? OPLinkStatus.PairSignalStrengths_3 : -127
+
+ // Filtering for S-meter. Smeter range -127dB <--> -13dB = S9+60dB
+
+ Timer {
+ id: smeter_filter0
+ interval: 100; running: true; repeat: true
+ onTriggered: smeter_angle = (0.90 * smeter_angle) + (0.1 * (oplm0_db + 13))
+ }
+
+ Timer {
+ id: smeter_filter1
+ interval: 100; repeat: true
+ onTriggered: smeter_angle = (0.90 * smeter_angle) + (0.1 * (oplm1_db + 13))
+ }
+
+ Timer {
+ id: smeter_filter2
+ interval: 100; repeat: true
+ onTriggered: smeter_angle = (0.90 * smeter_angle) + (0.1 * (oplm2_db + 13))
+ }
+
+ Timer {
+ id: smeter_filter3
+ interval: 100; repeat: true
+ onTriggered: smeter_angle = (0.90 * smeter_angle) + (0.1 * (oplm3_db + 13))
+ }
+
+ property int smeter_filter
+ property variant oplm_pair_id : OPLinkStatus.PairIDs_0
+
+ function select_oplm(index){
+ smeter_filter0.running = false;
+ smeter_filter1.running = false;
+ smeter_filter2.running = false;
+ smeter_filter3.running = false;
+
+ switch(index) {
+ case 0:
+ smeter_filter0.running = true;
+ smeter_filter = 0;
+ oplm_pair_id = OPLinkStatus.PairIDs_0
+ break;
+ case 1:
+ smeter_filter1.running = true;
+ smeter_filter = 1;
+ oplm_pair_id = OPLinkStatus.PairIDs_1
+ break;
+ case 2:
+ smeter_filter2.running = true;
+ smeter_filter = 2;
+ oplm_pair_id = OPLinkStatus.PairIDs_2
+ break;
+ case 3:
+ smeter_filter3.running = true;
+ smeter_filter = 3;
+ oplm_pair_id = OPLinkStatus.PairIDs_3
+ break;
+ }
+ }
+
+ // End Functions
+ //
+ // Start Drawing
+
+ //
+ // Close panel
+ //
+
+ SvgElementImage {
+ id: close_bg
+ elementName: "close-bg"
+ sceneSize: panels.sceneSize
+ y: Math.floor(scaledBounds.y * sceneItem.height)
+
+ states: State {
+ name: "fading"
+ when: show_panels !== true
+ PropertyChanges { target: close_bg; x: Math.floor(scaledBounds.x * sceneItem.width) - (close_bg.width * 0.85); }
+ }
+
+ transitions: Transition {
+ SequentialAnimation {
+ id: close_anim
+ PropertyAnimation { property: "x"; duration: 800 }
+ }
+ }
+ }
+
+ SvgElementImage {
+ id: close_mousearea
+ elementName: "close-panel-mousearea"
+ sceneSize: panels.sceneSize
+ y: Math.floor(scaledBounds.y * sceneItem.height)
+
+ MouseArea {
+ id: hidedisp_close;
+ anchors.fill: parent;
+ cursorShape: show_panels == true ? Qt.WhatsThisCursor : Qt.ArrowCursor
+ onClicked: close_panels()
+ }
+
+ states: State {
+ name: "fading"
+ when: show_panels !== true
+ PropertyChanges { target: close_mousearea; x: Math.floor(scaledBounds.x * sceneItem.width) - (close_bg.width * 0.85); }
+ }
+
+ transitions: Transition {
+ SequentialAnimation {
+ PropertyAnimation { property: "x"; duration: 800 }
+ }
+ }
+ }
+
+
+ //
+ // Rc-Input panel
+ //
+
+ SvgElementImage {
+ id: rc_input_bg
+ elementName: "rc-input-bg"
+ sceneSize: panels.sceneSize
+ y: Math.floor(scaledBounds.y * sceneItem.height)
+ z: 10
+
+ states: State {
+ name: "fading"
+ when: show_panels !== true
+ PropertyChanges { target: rc_input_bg; x: Math.floor(scaledBounds.x * sceneItem.width) - (rc_input_bg.width * 0.85); }
+ }
+
+ transitions: Transition {
+ SequentialAnimation {
+ id: rc_input_anim
+ PropertyAnimation { property: "x"; duration: 800 }
+ }
+ }
+ }
+
+ SvgElementImage {
+ id: rc_input_labels
+ elementName: "rc-input-labels"
+ sceneSize: panels.sceneSize
+ y: Math.floor(scaledBounds.y * sceneItem.height)
+ z: rc_input_bg.z+1
+
+ states: State {
+ name: "fading"
+ when: show_panels !== true
+ PropertyChanges { target: rc_input_labels; x: Math.floor(scaledBounds.x * sceneItem.width) - (rc_input_bg.width * 0.85); }
+ }
+
+ transitions: Transition {
+ SequentialAnimation {
+ PropertyAnimation { property: "x"; duration: 800 }
+ }
+ }
+ }
+
+ SvgElementImage {
+ id: rc_input_mousearea
+ elementName: "rc-input-panel-mousearea"
+ sceneSize: panels.sceneSize
+ y: Math.floor(scaledBounds.y * sceneItem.height)
+ z: rc_input_bg.z+1
+
+ MouseArea {
+ id: hidedisp_rcinput;
+ anchors.fill: parent;
+ cursorShape: hide_display_bat == false && hide_display_oplm == false ? Qt.WhatsThisCursor : Qt.ArrowCursor
+ onClicked: hide_display_bat == false && hide_display_oplm == false ? hide_display_rcinput() : 0
+ }
+
+ states: State {
+ name: "fading"
+ when: show_panels !== true
+ PropertyChanges { target: rc_input_mousearea; x: Math.floor(scaledBounds.x * sceneItem.width) - (rc_input_bg.width * 0.85); }
+ }
+
+ transitions: Transition {
+ SequentialAnimation {
+ PropertyAnimation { property: "x"; duration: 800 }
+ }
+ }
+ }
+
+ SvgElementImage {
+ id: rc_throttle
+ elementName: "rc-throttle"
+ sceneSize: panels.sceneSize
+ z: rc_input_bg.z+2
+
+ width: scaledBounds.width * sceneItem.width
+ height: (scaledBounds.height * sceneItem.height) * (ManualControlCommand.Throttle)
+
+ x: scaledBounds.x * sceneItem.width
+ y: (scaledBounds.y * sceneItem.height) - rc_throttle.height + (scaledBounds.height * sceneItem.height)
+
+ smooth: true
+
+ states: State {
+ name: "fading"
+ when: show_panels !== true
+ PropertyChanges { target: rc_throttle; x: Math.floor(scaledBounds.x * sceneItem.width) - (rc_input_bg.width * 0.85); }
+ }
+
+ transitions: Transition {
+ SequentialAnimation {
+ PropertyAnimation { property: "x"; duration: 800 }
+ }
+ }
+ }
+
+ SvgElementImage {
+ id: rc_stick
+ elementName: "rc-stick"
+ sceneSize: panels.sceneSize
+ z: rc_input_bg.z+3
+
+ width: scaledBounds.width * sceneItem.width
+ height: scaledBounds.height * sceneItem.height
+
+ x: (scaledBounds.x * sceneItem.width) + (ManualControlCommand.Roll * rc_stick.width * 2.5)
+ y: (scaledBounds.y * sceneItem.height) + (ManualControlCommand.Pitch * rc_stick.width * 2.5)
+
+ smooth: true
+
+ //rotate it around his center
+ transform: Rotation {
+ angle: ManualControlCommand.Yaw * 90
+ origin.y : rc_stick.height / 2
+ origin.x : rc_stick.width / 2
+ }
+
+ states: State {
+ name: "fading"
+ when: show_panels !== true
+ PropertyChanges { target: rc_stick; x: Math.floor(scaledBounds.x * sceneItem.width) - (rc_input_bg.width * 0.85); }
+ }
+
+ transitions: Transition {
+ SequentialAnimation {
+ PropertyAnimation { property: "x"; duration: 800 }
+ }
+ }
+ }
+
+ //
+ // Battery panel
+ //
+
+ SvgElementImage {
+ id: battery_bg
+ elementName: "battery-bg"
+ sceneSize: panels.sceneSize
+ y: Math.floor(scaledBounds.y * sceneItem.height)
+ z: 20
+
+ states: State {
+ name: "fading"
+ when: show_panels !== true
+ PropertyChanges { target: battery_bg; x: Math.floor(scaledBounds.x * sceneItem.width) - (battery_bg.width * 0.85); }
+ }
+
+ transitions: Transition {
+ SequentialAnimation {
+ PropertyAnimation { property: "x"; duration: 800 }
+ }
+ }
+ }
+
+ SvgElementPositionItem {
+ id: battery_volt
+ sceneSize: panels.sceneSize
+ elementName: "battery-volt-text"
+ z: battery_bg.z+1
+
+ width: scaledBounds.width * sceneItem.width
+ height: scaledBounds.height * sceneItem.height
+ y: scaledBounds.y * sceneItem.height
+
+ states: State {
+ name: "fading"
+ when: show_panels !== true
+ PropertyChanges { target: battery_volt; x: Math.floor(scaledBounds.x * sceneItem.width) - (battery_bg.width * 0.85); }
+ }
+
+ transitions: Transition {
+ SequentialAnimation {
+ PropertyAnimation { property: "x"; duration: 800 }
+ }
+ }
+
+ Rectangle {
+ anchors.fill: parent
+ color: panels.batColors[SystemAlarms.Alarm_Battery]
+ border.color: "white"
+ border.width: battery_volt.width * 0.01
+ radius: border.width * 4
+
+ Text {
+ text: FlightBatteryState.Voltage.toFixed(2)
+ anchors.centerIn: parent
+ color: "white"
+ font {
+ family: "Arial"
+ pixelSize: Math.floor(parent.height * 0.6)
+ }
+ }
+ }
+ }
+
+ SvgElementPositionItem {
+ id: battery_amp
+ sceneSize: panels.sceneSize
+ elementName: "battery-amp-text"
+ z: battery_bg.z+2
+
+ width: scaledBounds.width * sceneItem.width
+ height: scaledBounds.height * sceneItem.height
+ y: scaledBounds.y * sceneItem.height
+
+ states: State {
+ name: "fading"
+ when: show_panels !== true
+ PropertyChanges { target: battery_amp; x: Math.floor(scaledBounds.x * sceneItem.width) - (battery_bg.width * 0.85); }
+ }
+
+ transitions: Transition {
+ SequentialAnimation {
+ PropertyAnimation { property: "x"; duration: 800 }
+ }
+ }
+
+ Rectangle {
+ anchors.fill: parent
+ color: panels.batColors[SystemAlarms.Alarm_Battery]
+ border.color: "white"
+ border.width: battery_volt.width * 0.01
+ radius: border.width * 4
+
+ Text {
+ text: FlightBatteryState.Current.toFixed(2)
+ anchors.centerIn: parent
+ color: "white"
+ font {
+ family: "Arial"
+ pixelSize: Math.floor(parent.height * 0.6)
+ }
+ }
+ }
+ }
+
+ SvgElementPositionItem {
+ id: battery_milliamp
+ sceneSize: panels.sceneSize
+ elementName: "battery-milliamp-text"
+ z: battery_bg.z+3
+
+ width: scaledBounds.width * sceneItem.width
+ height: scaledBounds.height * sceneItem.height
+ y: scaledBounds.y * sceneItem.height
+
+ states: State {
+ name: "fading"
+ when: show_panels !== true
+ PropertyChanges { target: battery_milliamp; x: Math.floor(scaledBounds.x * sceneItem.width) - (battery_bg.width * 0.85); }
+ }
+
+ transitions: Transition {
+ SequentialAnimation {
+ PropertyAnimation { property: "x"; duration: 800 }
+ }
+ }
+
+ Rectangle {
+ anchors.fill: parent
+
+ // Alarm based on FlightBatteryState.EstimatedFlightTime < 120s orange, < 60s red
+ color: (FlightBatteryState.EstimatedFlightTime <= 120 && FlightBatteryState.EstimatedFlightTime > 60 ? "orange" :
+ (FlightBatteryState.EstimatedFlightTime <= 60 ? "red": panels.batColors[SystemAlarms.Alarm_Battery]))
+
+ border.color: "white"
+ border.width: battery_volt.width * 0.01
+ radius: border.width * 4
+
+ Text {
+ text: FlightBatteryState.ConsumedEnergy.toFixed(0)
+ anchors.centerIn: parent
+ color: "white"
+ font {
+ family: "Arial"
+ pixelSize: Math.floor(parent.height * 0.6)
+ }
+ }
+ }
+ }
+
+ SvgElementPositionItem {
+ id: battery_estimated_flight_time
+ sceneSize: panels.sceneSize
+ elementName: "battery-estimated-flight-time"
+ z: battery_bg.z+4
+
+ width: scaledBounds.width * sceneItem.width
+ height: scaledBounds.height * sceneItem.height
+ y: scaledBounds.y * sceneItem.height
+
+ states: State {
+ name: "fading"
+ when: show_panels !== true
+ PropertyChanges { target: battery_estimated_flight_time; x: Math.floor(scaledBounds.x * sceneItem.width) - (battery_bg.width * 0.85); }
+ }
+
+ transitions: Transition {
+ SequentialAnimation {
+ PropertyAnimation { property: "x"; duration: 800 }
+ }
+ }
+
+ Rectangle {
+ anchors.fill: parent
+ //color: panels.batColors[SystemAlarms.Alarm_Battery]
+
+ // Alarm based on FlightBatteryState.EstimatedFlightTime < 120s orange, < 60s red
+ color: (FlightBatteryState.EstimatedFlightTime <= 120 && FlightBatteryState.EstimatedFlightTime > 60 ? "orange" :
+ (FlightBatteryState.EstimatedFlightTime <= 60 ? "red": panels.batColors[SystemAlarms.Alarm_Battery]))
+
+ border.color: "white"
+ border.width: battery_volt.width * 0.01
+ radius: border.width * 4
+
+ Text {
+ text: formatTime(est_time_h) + ":" + formatTime(est_time_m) + ":" + formatTime(est_time_s)
+ anchors.centerIn: parent
+ color: "white"
+ font {
+ family: "Arial"
+ pixelSize: Math.floor(parent.height * 0.6)
+ }
+ }
+ }
+ }
+
+ SvgElementImage {
+ id: battery_labels
+ elementName: "battery-labels"
+ sceneSize: panels.sceneSize
+ y: Math.floor(scaledBounds.y * sceneItem.height)
+ z: battery_bg.z+5
+
+ states: State {
+ name: "fading"
+ when: show_panels !== true
+ PropertyChanges { target: battery_labels; x: Math.floor(scaledBounds.x * sceneItem.width) - (battery_bg.width * 0.85); }
+ }
+
+ transitions: Transition {
+ SequentialAnimation {
+ PropertyAnimation { property: "x"; duration: 800 }
+ }
+ }
+ }
+
+ SvgElementImage {
+ id: battery_mousearea
+ elementName: "battery-panel-mousearea"
+ sceneSize: panels.sceneSize
+ y: Math.floor(scaledBounds.y * sceneItem.height)
+ z: battery_bg.z+6
+
+ MouseArea {
+ id: hidedisp_battery;
+ anchors.fill: parent;
+ cursorShape: Qt.WhatsThisCursor
+ onClicked: hide_display_battery()
+ }
+
+ states: State {
+ name: "fading"
+ when: show_panels !== true
+ PropertyChanges { target: battery_mousearea; x: Math.floor(scaledBounds.x * sceneItem.width) - (battery_bg.width * 0.85); }
+ }
+
+ transitions: Transition {
+ SequentialAnimation {
+ PropertyAnimation { property: "x"; duration: 800 }
+ }
+ }
+ }
+
+ //
+ // OPLM panel
+ //
+
+ SvgElementImage {
+ id: oplm_bg
+ elementName: "oplm-bg"
+ sceneSize: panels.sceneSize
+ y: Math.floor(scaledBounds.y * sceneItem.height)
+ z: 30
+
+ states: State {
+ name: "fading"
+ when: show_panels !== true
+ PropertyChanges { target: oplm_bg; x: Math.floor(scaledBounds.x * sceneItem.width) - (oplm_bg.width * 0.85); }
+ }
+
+ transitions: Transition {
+ SequentialAnimation {
+ PropertyAnimation { property: "x"; duration: 800 }
+ }
+ }
+ }
+
+ SvgElementImage {
+ id: smeter_bg
+ elementName: "smeter-bg"
+ sceneSize: panels.sceneSize
+ y: Math.floor(scaledBounds.y * sceneItem.height)
+ z: oplm_bg.z+1
+
+ states: State {
+ name: "fading"
+ when: show_panels !== true
+ PropertyChanges { target: smeter_bg; x: Math.floor(scaledBounds.x * sceneItem.width) - (oplm_bg.width * 0.85); }
+ }
+
+ transitions: Transition {
+ SequentialAnimation {
+ PropertyAnimation { property: "x"; duration: 800 }
+ }
+ }
+ }
+
+ SvgElementImage {
+ id: smeter_scale
+ elementName: "smeter-scale"
+ sceneSize: panels.sceneSize
+ y: Math.floor(scaledBounds.y * sceneItem.height)
+ z: oplm_bg.z+2
+
+ states: State {
+ name: "fading"
+ when: show_panels !== true
+ PropertyChanges { target: smeter_scale; x: Math.floor(scaledBounds.x * sceneItem.width) - (oplm_bg.width * 0.85); }
+ }
+
+ transitions: Transition {
+ SequentialAnimation {
+ PropertyAnimation { property: "x"; duration: 800 }
+ }
+ }
+ }
+
+ SvgElementImage {
+ id: smeter_needle
+ elementName: "smeter-needle"
+ sceneSize: panels.sceneSize
+ y: Math.floor(scaledBounds.y * sceneItem.height)
+ z: oplm_bg.z+3
+
+ states: State {
+ name: "fading"
+ when: show_panels !== true
+ PropertyChanges { target: smeter_needle; x: Math.floor(scaledBounds.x * sceneItem.width) - (oplm_bg.width * 0.85); }
+ }
+
+ transitions: Transition {
+ SequentialAnimation {
+ PropertyAnimation { property: "x"; duration: 800 }
+ }
+ }
+
+ transform: Rotation {
+ angle: smeter_angle.toFixed(1)
+ origin.y : smeter_needle.height
+ }
+ }
+
+ SvgElementImage {
+ id: smeter_mask
+ elementName: "smeter-mask"
+ sceneSize: panels.sceneSize
+ y: Math.floor(scaledBounds.y * sceneItem.height)
+ z: oplm_bg.z+4
+
+ states: State {
+ name: "fading"
+ when: show_panels !== true
+ PropertyChanges { target: smeter_mask; x: Math.floor(scaledBounds.x * sceneItem.width) - (oplm_bg.width * 0.85); }
+ }
+
+ transitions: Transition {
+ SequentialAnimation {
+ PropertyAnimation { property: "x"; duration: 800 }
+ }
+ }
+ }
+
+ SvgElementImage {
+ id: oplm_button_bg
+ elementName: "oplm-button-bg"
+ sceneSize: panels.sceneSize
+ y: Math.floor(scaledBounds.y * sceneItem.height)
+ z: oplm_bg.z+5
+
+ states: State {
+ name: "fading"
+ when: show_panels !== true
+ PropertyChanges { target: oplm_button_bg; x: Math.floor(scaledBounds.x * sceneItem.width) - (oplm_bg.width * 0.85); }
+ }
+
+ transitions: Transition {
+ SequentialAnimation {
+ PropertyAnimation { property: "x"; duration: 800 }
+ }
+ }
+ }
+
+ Repeater {
+ model: 4
+
+ SvgElementImage {
+ z: oplm_bg.z+5
+ property variant idButton_oplm: "oplm_button_" + index
+ property variant idButton_oplm_mousearea: "oplm_button_mousearea" + index
+ property variant button_color: "button"+index+"_color"
+
+ id: idButton_oplm
+
+ elementName: "oplm-button-" + index
+ sceneSize: panels.sceneSize
+
+ Rectangle {
+ anchors.fill: parent
+ border.color: "red"
+ border.width: parent.width * 0.04
+ radius: border.width*3
+ color: "transparent"
+ opacity: smeter_filter == index ? 0.5 : 0
+ }
+
+ MouseArea {
+ id: idButton_oplm_mousearea;
+ anchors.fill: parent;
+ cursorShape: Qt.PointingHandCursor
+ onClicked: select_oplm(index)
+ }
+
+ states: State {
+ name: "fading"
+ when: show_panels !== true
+ PropertyChanges { target: idButton_oplm; x: Math.floor(scaledBounds.x * sceneItem.width) - (oplm_bg.width * 0.85); }
+ }
+
+ transitions: Transition {
+ SequentialAnimation {
+ PropertyAnimation { property: "x"; duration: 800 }
+ }
+ }
+ }
+ }
+
+ SvgElementImage {
+ id: oplm_id_label
+ elementName: "oplm-id-label"
+ sceneSize: panels.sceneSize
+ y: Math.floor(scaledBounds.y * sceneItem.height)
+ z: oplm_bg.z+6
+ states: State {
+ name: "fading"
+ when: show_panels !== true
+ PropertyChanges { target: oplm_id_label; x: Math.floor(scaledBounds.x * sceneItem.width) - (oplm_bg.width * 0.85); }
+ }
+
+ transitions: Transition {
+ SequentialAnimation {
+ PropertyAnimation { property: "x"; duration: 800 }
+ }
+ }
+ }
+
+ SvgElementPositionItem {
+ id: oplm_id_text
+ sceneSize: panels.sceneSize
+ elementName: "oplm-id-text"
+ z: oplm_bg.z+7
+
+ width: scaledBounds.width * sceneItem.width
+ height: scaledBounds.height * sceneItem.height
+ y: scaledBounds.y * sceneItem.height
+
+ states: State {
+ name: "fading"
+ when: show_panels !== true
+ PropertyChanges { target: oplm_id_text; x: Math.floor(scaledBounds.x * sceneItem.width) - (oplm_bg.width * 0.85); }
+ }
+
+ transitions: Transition {
+ SequentialAnimation {
+ PropertyAnimation { property: "x"; duration: 800 }
+ }
+ }
+
+ Text {
+ text: oplm_pair_id > 0 ? oplm_pair_id.toString(16) : "-- -- -- --"
+ anchors.centerIn: parent
+ color: "white"
+ font {
+ family: "Arial"
+ pixelSize: Math.floor(parent.height * 1.4)
+ weight: Font.DemiBold
+ capitalization: Font.AllUppercase
+ }
+ }
+ }
+
+ SvgElementImage {
+ id: oplm_mousearea
+ elementName: "oplm-panel-mousearea"
+ sceneSize: panels.sceneSize
+ y: Math.floor(scaledBounds.y * sceneItem.height)
+ z: oplm_bg.z
+
+ MouseArea {
+ id: hidedisp_oplm;
+ anchors.fill: parent;
+ cursorShape: Qt.WhatsThisCursor
+ onClicked: hide_display_oplink()
+ }
+
+ states: State {
+ name: "fading"
+ when: show_panels !== true
+ PropertyChanges { target: oplm_mousearea; x: Math.floor(scaledBounds.x * sceneItem.width) - (oplm_bg.width * 0.85); }
+ }
+
+ transitions: Transition {
+ SequentialAnimation {
+ PropertyAnimation { property: "x"; duration: 800 }
+ }
+ }
+ }
+
+ //
+ // System panel
+ //
+
+ SvgElementImage {
+ id: system_bg
+ elementName: "system-bg"
+ sceneSize: panels.sceneSize
+ y: Math.floor(scaledBounds.y * sceneItem.height)
+ z: 40
+
+ states: State {
+ name: "fading"
+ when: show_panels !== true
+ PropertyChanges { target: system_bg; x: Math.floor(scaledBounds.x * sceneItem.width) - (system_bg.width * 0.85); }
+ }
+
+ transitions: Transition {
+ SequentialAnimation {
+ id: system_anim
+ PropertyAnimation { property: "x"; duration: 800 }
+ }
+ }
+ }
+
+ SvgElementImage {
+ id: system_text
+ elementName: "system-text-tmp"
+ sceneSize: panels.sceneSize
+ y: Math.floor(scaledBounds.y * sceneItem.height)
+ z: system_bg.z+1
+
+ states: State {
+ name: "fading"
+ when: show_panels !== true
+ PropertyChanges { target: system_text; x: Math.floor(scaledBounds.x * sceneItem.width) - (system_bg.width * 0.85); }
+ }
+
+ transitions: Transition {
+ SequentialAnimation {
+ PropertyAnimation { property: "x"; duration: 800 }
+ }
+ }
+ }
+
+ SvgElementImage {
+ id: system_mousearea
+ elementName: "system-panel-mousearea"
+ sceneSize: panels.sceneSize
+ y: Math.floor(scaledBounds.y * sceneItem.height)
+ z: system_bg.z+1
+
+ MouseArea {
+ id: hidedisp_system;
+ anchors.fill: parent;
+ cursorShape: Qt.WhatsThisCursor
+ onClicked: hide_display_system()
+ }
+
+ states: State {
+ name: "fading"
+ when: show_panels !== true
+ PropertyChanges { target: system_mousearea; x: Math.floor(scaledBounds.x * sceneItem.width) - (system_bg.width * 0.85); }
+ }
+
+ transitions: Transition {
+ SequentialAnimation {
+ PropertyAnimation { property: "x"; duration: 800 }
+ }
+ }
+ }
+}
diff --git a/ground/openpilotgcs/share/openpilotgcs/pfd/default/Pfd.qml b/ground/openpilotgcs/share/openpilotgcs/pfd/default/Pfd.qml
index 336a0617a..37e38256c 100644
--- a/ground/openpilotgcs/share/openpilotgcs/pfd/default/Pfd.qml
+++ b/ground/openpilotgcs/share/openpilotgcs/pfd/default/Pfd.qml
@@ -83,6 +83,12 @@ Rectangle {
sceneSize: sceneItem.viewportSize
}
+ Panels {
+ anchors.fill: parent
+ sceneSize: sceneItem.viewportSize
+ }
+
+
Warnings {
anchors.fill: parent
sceneSize: sceneItem.viewportSize
diff --git a/ground/openpilotgcs/share/openpilotgcs/pfd/default/pfd.svg b/ground/openpilotgcs/share/openpilotgcs/pfd/default/pfd.svg
index 560b7ee07..0591abfc5 100644
--- a/ground/openpilotgcs/share/openpilotgcs/pfd/default/pfd.svg
+++ b/ground/openpilotgcs/share/openpilotgcs/pfd/default/pfd.svg
@@ -22,6 +22,29 @@
inkscape:export-ydpi="72">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ inkscape:snap-bbox-edge-midpoints="true">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ style="display:none">
+ transform="translate(0,-2.0678301)">
-
@@ -1573,14 +1710,12 @@
inkscape:groupmode="layer"
id="layer84"
inkscape:label="battery-panel"
- style="display:inline"
- sodipodi:insensitive="true">
+ style="display:none">
+ style="display:inline">
-
+ transform="translate(-25.702698,19.078394)">
@@ -1893,16 +2022,136 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ inkscape:label="oplm-panel"
+ style="display:none">
+ style="display:inline">
-
+ id="oplm-icon"
+ transform="translate(0,10.34333)">
+ id="path5847"
+ inkscape:connector-curvature="0" />
+ d="m 21.619769,406.77173 l 0,-9.66381 l 3.645353,0 c 0.641611,1e-5 1.131613,0.0308 1.470006,0.0923 c 0.474615,0.0791 0.872329,0.23072 1.193145,0.45484 c 0.320801,0.21974 0.577887,0.52956 0.771259,0.92947 c 0.19775,0.39992 0.296629,0.83938 0.296638,1.31839 c -9e-6,0.8218 -0.261489,1.51835 -0.784443,2.08965 c -0.522969,0.56691 -1.467816,0.85037 -2.834542,0.85036 l -2.478576,0 l 0,3.92881 l -1.27884,0 m 1.27884,-5.06922 l 2.498352,0 c 0.826186,1e-5 1.41287,-0.1538 1.760053,-0.46143 c 0.347169,-0.30762 0.520757,-0.74049 0.520764,-1.29862 c -7e-6,-0.4043 -0.103281,-0.74928 -0.309822,-1.03494 c -0.20216,-0.29004 -0.470232,-0.4812 -0.804219,-0.5735 c -0.215343,-0.0571 -0.613057,-0.0857 -1.193144,-0.0857 l -2.471984,0 l 0,3.45418"
+ id="path5849"
+ inkscape:connector-curvature="0" />
+ id="path5851"
+ inkscape:connector-curvature="0" />
+ id="path5853"
+ inkscape:connector-curvature="0" />
+ id="path5855"
+ inkscape:connector-curvature="0" />
+ id="path5857"
+ inkscape:connector-curvature="0" />
+ id="path5859"
+ inkscape:connector-curvature="0" />