--- /dev/null
+import QtQuick 1.0
+import com.nokia.symbian 1.1
+import JoyStick 1.0
+Page {
+ property color textColor:"white"
+ property int textSize:30
+ id:dialog
+ tools:commonTools
+ Menu {
+ id:uiMenu
+ visualParent:pageStack
+ MenuLayout {
+ MenuItem { text:"MeeGo/Harmattan 854x480"; onClicked: { drone.confActiveUI="ardrone_harmattan.qml" }}
+ MenuItem { text:"Desktop"; onClicked: { drone.confActiveUI="ardrone_desktop.qml"}}
+ }
+ }
+ Flickable {
+ id: dialogscrolarea
+ anchors.fill: parent
+ // anchors.leftMargin:50;anchors.rightMargin:50
+ contentHeight: dialogcontent.height
+ contentWidth: parent.width
+
+ Grid {
+ columns:2
+ id: dialogcontent
+ anchors.leftMargin:50;anchors.rightMargin:150
+ spacing: 20
+
+ Text {
+ font.pixelSize :textSize
+ text:"UI Style"
+
+ }
+ Button {
+ text:drone.confActiveUI
+ anchors.right:parent.right
+ onClicked:uiMenu.open()
+ }
+ Text {
+ width:350
+ text: "Drone IP"
+ color:textColor
+ font.pixelSize :textSize
+ }
+
+ TextField {
+ id: droneip
+ width: 300
+ height: 40
+ anchors.right: parent.right
+ text: drone.confDroneIp
+ onTextChanged:{drone.confDroneIp=text;}
+ }
+
+// }
+
+ Text {
+ text: "Video 640x480/Full Screen"
+ color:textColor
+ font.pixelSize :textSize
+ }
+ Switch {
+ id: fullScreen
+ checked:drone.confFullScreen
+ anchors.right:parent.right
+ onCheckedChanged:{drone.confFullScreen=checked;}
+ }
+ Text {
+ text: "Acceleration Sensor controll"
+ color:textColor
+ font.pixelSize :textSize
+ }
+ Switch {
+ id: useAccelSw
+ checked:drone.confUseAccel
+ anchors.right:parent.right
+ onCheckedChanged:{drone.confUseAccel=checked;}
+ }
+ Text {
+ text: "Joystick"
+ color:textColor
+ font.pixelSize :textSize
+ }
+ Switch {
+ id: useJoySw
+ checked:drone.confUseJoyStick
+ anchors.right:parent.right
+ enabled:js.haveJoyStick
+ onCheckedChanged:{drone.confUseJoyStick=checked;}
+ }
+
+ Text {
+ visible:drone.confUseJoyStick
+ font.pixelSize :textSize
+ text:"\"" + js.joyStickName + "\""
+
+ }
+ Button {
+ visible:drone.confUseJoyStick
+ text:"Calibrate"
+ anchors.right:parent.right
+ onClicked:{
+ js.calibrate=true
+ pageStack.push(calibrateDialog);
+ }
+ }
+ Text {
+ visible:drone.confUseJoyStick
+ font.pixelSize :textSize
+ text:"Show JoyStick Indicators"
+
+ }
+ Switch {
+ visible:drone.confUseJoyStick
+ checked:drone.confShowJSIndicators
+ anchors.right:parent.right
+ enabled:js.haveJoyStick
+ onCheckedChanged:{drone.confShowJSIndicators=checked;}
+
+ }
+ Text {
+ color:textColor
+ text: "Show debug"
+ font.pixelSize :textSize
+ }
+ Switch {
+ id: showDebug
+ checked:drone.confShowDebug
+ anchors.right:parent.right
+ onCheckedChanged:{drone.confShowDebug=checked;}
+ }
+
+ Text {
+ text: "Show engine gauges"
+ color:textColor
+ font.pixelSize :textSize
+
+ }
+ Switch {
+ id: showGauges
+ checked:drone.confShowGauges
+ anchors.right:parent.right
+ onCheckedChanged:{drone.confShowGauges=checked;}
+ }
+
+ Text {
+ text: "Show horizon"
+ color:textColor
+ font.pixelSize :textSize
+
+ }
+ Switch {
+ id: showHorizon
+ checked:drone.confShowHorizon
+ anchors.right:parent.right
+ onCheckedChanged:{drone.confShowHorizon=checked;}
+ }
+
+ Text {
+ text: "Forward/backward gain"
+ color:textColor
+ font.pixelSize :textSize
+ }
+
+ Slider {
+ id: forwardGain
+ anchors.right:parent.right
+ maximumValue:1.0
+ stepSize:0.01
+ value:drone.confForwardGain
+ onValueChanged:{drone.confForwardGain=value;}
+ }
+ Text {
+ text: "Right/Left gain"
+ color:textColor
+ font.pixelSize :textSize
+ }
+
+ Slider {
+ id: rightGain
+ anchors.right:parent.right
+ maximumValue:1.0
+ stepSize:0.01
+ value:drone.confRightGain
+ onValueChanged:{drone.confRightGain=value;}
+ }
+ Text {
+ text: "accel ctrl treshold"
+ color:textColor
+ font.pixelSize :textSize
+ }
+
+ Slider {
+ id: ctrlTreshold
+ anchors.right:parent.right
+ maximumValue:25.0
+ value:drone.confCtrlTrsh
+ onValueChanged:{drone.confCtrlTrsh=value;}
+ }
+ }
+ }
+ Page {
+ property color textColor:"black"
+ property int textSize:30
+ id:calibrateDialog
+ tools:commonTools
+ /*
+ JoyStickCalibrator {
+ id:jc
+ // jStick:js
+ Component.onCompleted: {
+ if (jc.status != Component.Ready)
+ console.log("Error loading component:", jc.errorString());
+ }
+ }
+*/
+ }
+ }
+
--- /dev/null
+import QtQuick 1.0
+import JoyStick 1.0
+import QtDesktop 0.1
+
+Item {
+ width: 600
+ height: 800
+ property int textSize:22
+ property int ctrlSize:40
+ ListModel {
+ id: axisMapModel
+ ListElement{ text:"Aileron"; mapAxis:1 }
+ ListElement { text:"Elevator"; mapAxis:2 }
+ ListElement { text:"Throtle"; mapAxis:3 }
+ ListElement { text:"Rudder"; mapAxis:4 }
+ ListElement { text:"none"; mapAxis:0 }
+ }
+ /*
+ ComboBox {
+ id: axisMap1UICombo;
+ model: ListModel {
+ id: choicesMapAxis1
+ ListElement{ text:"Aileron"; mapAxis:1 }
+ ListElement { text:"Elevator"; mapAxis:2 }
+ ListElement { text:"Throtle"; mapAxis:3 }
+ ListElement { text:"Rudder"; mapAxis:4 }
+ ListElement { text:"none"; mapAxis:0 }
+ }
+ onSelectedIndexChanged: {
+ console.debug("onSelectedIndexChanged " + selectedText + ", " + choicesMapAxis1.get(selectedIndex).mapAxis);
+ js.mapAxis1=choicesMapAxis1.get(selectedIndex).mapAxis
+ }
+ selectedText:js.mapAxis1
+ KeyNavigation.tab: t1
+ KeyNavigation.backtab: button2
+ }
+
+ Menu {
+ id:js1map
+ visualParent:pageStack
+ MenuLayout {
+ MenuItem { text:"Aileron"; onClicked: { js.mapAxis1=1 }}
+ MenuItem { text:"Elevator"; onClicked: { js.mapAxis1=2 }}
+ MenuItem { text:"Throtle"; onClicked: { js.mapAxis1=3 }}
+ MenuItem { text:"Rudder"; onClicked: { js.mapAxis1=4 }}
+ MenuItem { text:"none"; onClicked: { js.mapAxis1=0 }}
+
+ }
+ }
+ Menu {
+ id:js2map
+ visualParent:pageStack
+ MenuLayout {
+ MenuItem { text:"Aileron"; onClicked: { js.mapAxis2=1 }}
+ MenuItem { text:"Elevator"; onClicked: { js.mapAxis2=2 }}
+ MenuItem { text:"Throtle"; onClicked: { js.mapAxis2=3 }}
+ MenuItem { text:"Rudder"; onClicked: { js.mapAxis2=4 }}
+ MenuItem { text:"none"; onClicked: { js.mapAxis2=0 }}
+
+ }
+ }
+ Menu {
+ id:js3map
+ visualParent:pageStack
+ MenuLayout {
+ MenuItem { text:"Aileron"; onClicked: { js.mapAxis3=1 }}
+ MenuItem { text:"Elevator"; onClicked: { js.mapAxis3=2 }}
+ MenuItem { text:"Throtle"; onClicked: { js.mapAxis3=3 }}
+ MenuItem { text:"Rudder"; onClicked: { js.mapAxis3=4 }}
+ MenuItem { text:"none"; onClicked: { js.mapAxis3=0 }}
+
+ }
+ }
+ Menu {
+ id:js4map
+ visualParent:pageStack
+ MenuLayout {
+ MenuItem { text:"Aileron"; onClicked: { js.mapAxis4=1 }}
+ MenuItem { text:"Elevator"; onClicked: { js.mapAxis4=2 }}
+ MenuItem { text:"Throtle"; onClicked: { js.mapAxis4=3 }}
+ MenuItem { text:"Rudder"; onClicked: { js.mapAxis4=4 }}
+ MenuItem { text:"none"; onClicked: { js.mapAxis4=0 }}
+
+ }
+ }
+ Menu {
+ id:js5map
+ visualParent:pageStack
+ MenuLayout {
+ MenuItem { text:"Aileron"; onClicked: { js.mapAxis5=1 }}
+ MenuItem { text:"Elevator"; onClicked: { js.mapAxis5=2 }}
+ MenuItem { text:"Throtle"; onClicked: { js.mapAxis5=3 }}
+ MenuItem { text:"Rudder"; onClicked: { js.mapAxis5=4 }}
+ MenuItem { text:"none"; onClicked: { js.mapAxis5=0 }}
+
+ }
+ }
+ Menu {
+ id:js6map
+ visualParent:pageStack
+ MenuLayout {
+ MenuItem { text:"Aileron"; onClicked: { js.mapAxis6=1 }}
+ MenuItem { text:"Elevator"; onClicked: { js.mapAxis6=2 }}
+ MenuItem { text:"Throtle"; onClicked: { js.mapAxis6=3 }}
+ MenuItem { text:"Rudder"; onClicked: { js.mapAxis6=4 }}
+ MenuItem { text:"none"; onClicked: { js.mapAxis6=0 }}
+
+ }
+ }
+*/
+ // property Item jStick:
+ Column {
+ Text {
+ text:" "
+ }
+
+ Row {
+ Text {
+ text:" "
+ }
+ JoyStickIndicator {
+ border.width:1
+ width:100;height:100
+ xvalue:js.axis4
+ yvalue:js.axis3
+ Text {
+ anchors.bottom: parent.bottom
+ font.pixelSize: 10
+ text:" rudder"
+ }
+ Text {
+ x:-10;y:50
+ rotation:90
+ font.pixelSize: 10
+ text:"Throtle"
+ }
+ }
+
+ spacing:50
+ JoyStickIndicator {
+ border.width:1
+ width:100;height:100
+ xvalue:js.axis1
+ yvalue:js.axis2
+ Text {
+ anchors.bottom: parent.bottom
+ font.pixelSize: 10
+ text:" Aileron"
+ }
+ Text {
+ x:-15;y:50
+ rotation:90
+ font.pixelSize: 10
+ text:"Elevator"
+ }
+ }
+ Column {
+ Button{
+ text:"Reset"
+ onClicked:{
+ js.calibrate=false
+ pageStack.pop();
+ }
+ }
+ Button{
+ text:"Save"
+ onClicked:{
+ js.calibrate=false
+ pageStack.pop();
+ }
+ }
+ }
+ }
+ Grid {
+ spacing:10
+ columns:7
+ Text {
+ font.pixelSize :textSize
+ text:" Raw"
+ }
+ Text {
+ font.pixelSize :textSize
+ text:" Max"
+ }
+ Text {
+ font.pixelSize :textSize
+ text:" Min"
+ }
+ Text {
+ font.pixelSize :textSize
+ text:"Calib"
+ }
+ Text {
+ font.pixelSize :textSize
+ text:"value"
+ }
+ Text {
+ font.pixelSize :textSize
+ text:"reverse"
+ }
+ Text {
+ font.pixelSize :textSize
+ text:"mapping " + js.mapAxis1 + js.mapAxis2 + js.mapAxis3 + js.mapAxis4 +js.mapAxis5 +js.mapAxis6
+ }
+
+
+ Text {
+ font.pixelSize :textSize
+ text:js.rawAxis1
+ }
+ Text {
+ font.pixelSize :textSize
+ text:js.maxAxis1
+ }
+ Text {
+ font.pixelSize :textSize
+ text:js.minAxis1
+ }
+ Text {
+ font.pixelSize :textSize
+ text:js.calAxis1.toFixed(2)
+ }
+ BarGauge {
+ width:100
+ height:20
+ val:js.calAxis1+1.0
+ max:2.0
+ horiz:true
+ }
+ CheckBox {
+ width:60
+ // scale:0.8
+ checked:js.invertAxis1
+ onCheckedChanged:{js.invertAxis1=checked;}
+ }
+ ComboBox {
+ id: axisMap1UICombo;
+ model: axisMapModel
+ onSelectedIndexChanged: {
+ console.debug("onSelectedIndexChanged " + selectedText + ", " + axisMap1UICombo.get(selectedIndex).mapAxis);
+ js.mapAxis1=caxisMap1UICombo.get(selectedIndex).mapAxis
+ }
+ selectedText:js.mapAxis1
+ }
+/* Button{
+ width:200;height:ctrlSize
+ text:js.mapAxis1==1?"Aileron":js.mapAxis1==2?"Elevator":js.mapAxis1==3?"Throtle":js.mapAxis1==4?"Rudder":"none"
+ onClicked:js1map.open()
+ }
+*/
+
+
+ Text {
+ font.pixelSize :textSize
+ text:js.rawAxis2
+ }
+ Text {
+ font.pixelSize :textSize
+ text:js.maxAxis2
+ }
+ Text {
+ font.pixelSize :textSize
+ text:js.minAxis2
+ }
+ Text {
+ font.pixelSize :textSize
+ text:js.calAxis2.toFixed(2)
+ }
+ BarGauge {
+ width:100
+ height:20
+ val:js.calAxis2+1.0
+ max:2.0
+ horiz:true
+ }
+ CheckBox {
+ checked:js.invertAxis2
+ onCheckedChanged:{js.invertAxis2=checked;}
+ }
+ Button{
+ width:200;height:ctrlSize
+ text:js.mapAxis2==1?"Aileron":js.mapAxis2==2?"Elevator":js.mapAxis2==3?"Throtle":js.mapAxis2==4?"Rudder":"none"
+ onClicked:js2map.open()
+ }
+
+
+
+ Text {
+ font.pixelSize :textSize
+ text:js.rawAxis3
+ }
+ Text {
+ font.pixelSize :textSize
+ text:js.maxAxis3
+ }
+ Text {
+ font.pixelSize :textSize
+ text:js.minAxis3
+ }
+ Text {
+ font.pixelSize :textSize
+ text:js.calAxis3.toFixed(2)
+ }
+ BarGauge {
+ width:100
+ height:20
+ val:js.calAxis3+1.0
+ max:2.0
+ horiz:true
+ }
+ CheckBox {
+ checked:js.invertAxis3
+ onCheckedChanged:{js.invertAxis3=checked;}
+ }
+ Button{
+ width:200;height:ctrlSize
+ text:js.mapAxis3==1?"Aileron":js.mapAxis3==2?"Elevator":js.mapAxis3==3?"Throtle":js.mapAxis3==4?"Rudder":"none"
+ onClicked:js3map.open()
+ }
+
+ Text {
+ font.pixelSize :textSize
+ text:js.rawAxis4
+ }
+ Text {
+ font.pixelSize :textSize
+ text:js.maxAxis4
+ }
+ Text {
+ font.pixelSize :textSize
+ text:js.minAxis4
+ }
+ Text {
+ font.pixelSize :textSize
+ text:js.calAxis4.toFixed(2)
+ }
+ BarGauge {
+ width:100
+ height:20
+ val:js.calAxis4+1.0
+ max:2.0
+ horiz:true
+ }
+ CheckBox {
+ checked:js.invertAxis4
+ onCheckedChanged:{js.invertAxis4=checked;}
+ }
+ Button{
+ width:200;height:ctrlSize
+ text:js.mapAxis4==1?"Aileron":js.mapAxis4==2?"Elevator":js.mapAxis4==3?"Throtle":js.mapAxis4==4?"Rudder":"none"
+ onClicked:js4map.open()
+ }
+
+ Text {
+ font.pixelSize :textSize
+ text:js.rawAxis5
+ }
+ Text {
+ font.pixelSize :textSize
+ text:js.maxAxis5
+ }
+ Text {
+ font.pixelSize :textSize
+ text:js.minAxis5
+ }
+ Text {
+ font.pixelSize :textSize
+ text:js.calAxis5.toFixed(2)
+ }
+ BarGauge {
+ width:100
+ height:20
+ val:js.calAxis5+1.0
+ max:2.0
+ horiz:true
+ }
+ CheckBox {
+ checked:js.invertAxis5
+ onCheckedChanged:{js.invertAxis5=checked;}
+ }
+ Button{
+ width:200;height:ctrlSize
+ text:js.mapAxis5==1?"Aileron":js.mapAxis5==2?"Elevator":js.mapAxis5==3?"Throtle":js.mapAxis5==4?"Rudder":"none"
+ onClicked:js5map.open()
+ }
+
+ Text {
+ font.pixelSize :textSize
+ text:js.rawAxis6
+ }
+ Text {
+ font.pixelSize :textSize
+ text:js.maxAxis6
+ }
+ Text {
+ font.pixelSize :textSize
+ text:js.minAxis6
+ }
+ Text {
+ font.pixelSize :textSize
+ text:js.calAxis6.toFixed(2)
+ }
+ BarGauge {
+ width:100
+ height:20
+ val:js.calAxis6+1.0
+ max:2.0
+ horiz:true
+ }
+ CheckBox {
+ checked:js.invertAxis6
+ onCheckedChanged:{js.invertAxis6=checked;}
+ }
+ Button{
+ width:200;height:ctrlSize
+ text:js.mapAxis6==1?"Aileron":js.mapAxis6==2?"Elevator":js.mapAxis6==3?"Throtle":js.mapAxis6==4?"Rudder":"none"
+ onClicked:js6map.open()
+ }
+ }
+
+ }
+}
+
+
--- /dev/null
+
+import QtQuick 1.0
+
+Item {
+ id: root
+ property real value : 0
+ property real startAngle:0
+ property real endAngle:300
+ property maxValue:100
+ property url gaugeBackground:"joybox.png"
+ property url gaugeForeground:"joybox.png"
+ property url gaugeNeedle:"needle1.png"
+ property url bezel:""
+
+ Image {
+ anchors.fill:parent
+ source: gaugeBackground
+ }
+
+ Image {
+ id: needle
+ x: (root.width/2)-(width/2); y:(root.width/2)
+ transformOrigin: Item.Top
+ scale: root.width / 300
+ rotation: startAngle+root.value*0.36
+ smooth: true
+ source: gaugeNeedle
+
+ Image {
+ anchors.fill:parent
+ source: gaugeForeground
+ }
+
+}
--- /dev/null
+
+import QtQuick 1.0
+
+Item {
+ id: root
+ property real value : 0
+ property url gaugeForeground:"hdg2.png"
+ property url gaugeNeedle:"hdg1.png"
+ property url bezel:""
+
+
+ Image {
+ id: needle
+ x: (root.width/2)-(width/2); y:(root.width/2)
+ transformOrigin: Item.Center
+ anchors.fill:parent
+ rotation: root.value
+ smooth: true
+ source: gaugeNeedle
+ }
+ Image {
+ anchors.fill:parent
+ source: gaugeForeground
+ }
+ Image {
+ id:bezelImg
+ anchors.fill:parent
+ source: bezel
+ }
+
+}
--- /dev/null
+begin-base64 644 mardrone-icon48.png
+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
+====