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" />