From: Kate Alhola Date: Wed, 11 Apr 2012 11:06:56 +0000 (+0300) Subject: Sync repository X-Git-Url: http://git.maemo.org/git/?p=mardrone;a=commitdiff_plain;h=2920a0ac78c2b7b75addea843f45f46abb33a8e4 Sync repository --- diff --git a/mardrone/ConfigDialogSymbian.qml b/mardrone/ConfigDialogSymbian.qml new file mode 100644 index 0000000..d76f723 --- /dev/null +++ b/mardrone/ConfigDialogSymbian.qml @@ -0,0 +1,220 @@ +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()); + } + } +*/ + } + } + diff --git a/mardrone/JoyStickCalibratorDesktop.qml b/mardrone/JoyStickCalibratorDesktop.qml new file mode 100644 index 0000000..deb435e --- /dev/null +++ b/mardrone/JoyStickCalibratorDesktop.qml @@ -0,0 +1,424 @@ +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() + } + } + + } +} + + diff --git a/mardrone/ardrone-lib-arm/libpc_ardrone.a b/mardrone/ardrone-lib-arm/libpc_ardrone.a new file mode 100644 index 0000000..97eb429 Binary files /dev/null and b/mardrone/ardrone-lib-arm/libpc_ardrone.a differ diff --git a/mardrone/ardrone-lib-arm/libpc_ardrone_notool.a b/mardrone/ardrone-lib-arm/libpc_ardrone_notool.a new file mode 100644 index 0000000..8f30b9a Binary files /dev/null and b/mardrone/ardrone-lib-arm/libpc_ardrone_notool.a differ diff --git a/mardrone/ardrone-lib-arm/libsdk.a b/mardrone/ardrone-lib-arm/libsdk.a new file mode 100644 index 0000000..d302b8d Binary files /dev/null and b/mardrone/ardrone-lib-arm/libsdk.a differ diff --git a/mardrone/ardrone-lib-arm/libvlib.a b/mardrone/ardrone-lib-arm/libvlib.a new file mode 100644 index 0000000..f56354d Binary files /dev/null and b/mardrone/ardrone-lib-arm/libvlib.a differ diff --git a/mardrone/ardrone-lib-x86/libpc_ardrone.a b/mardrone/ardrone-lib-x86/libpc_ardrone.a new file mode 100644 index 0000000..97eb429 Binary files /dev/null and b/mardrone/ardrone-lib-x86/libpc_ardrone.a differ diff --git a/mardrone/ardrone-lib-x86/libpc_ardrone_notool.a b/mardrone/ardrone-lib-x86/libpc_ardrone_notool.a new file mode 100644 index 0000000..42bd797 Binary files /dev/null and b/mardrone/ardrone-lib-x86/libpc_ardrone_notool.a differ diff --git a/mardrone/ardrone-lib-x86/libsdk.a b/mardrone/ardrone-lib-x86/libsdk.a new file mode 100644 index 0000000..4a8b101 Binary files /dev/null and b/mardrone/ardrone-lib-x86/libsdk.a differ diff --git a/mardrone/ardrone-lib-x86/libvlib.a b/mardrone/ardrone-lib-x86/libvlib.a new file mode 100644 index 0000000..829e432 Binary files /dev/null and b/mardrone/ardrone-lib-x86/libvlib.a differ diff --git a/mardrone/gauges/GenericGauge.qml b/mardrone/gauges/GenericGauge.qml new file mode 100644 index 0000000..8a8c74e --- /dev/null +++ b/mardrone/gauges/GenericGauge.qml @@ -0,0 +1,34 @@ + +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 + } + +} diff --git a/mardrone/gauges/HeadingGauge.qml b/mardrone/gauges/HeadingGauge.qml new file mode 100644 index 0000000..c37f7a0 --- /dev/null +++ b/mardrone/gauges/HeadingGauge.qml @@ -0,0 +1,31 @@ + +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 + } + +} diff --git a/mardrone/gauges/bezel.png b/mardrone/gauges/bezel.png new file mode 100644 index 0000000..f0c2246 Binary files /dev/null and b/mardrone/gauges/bezel.png differ diff --git a/mardrone/gauges/glareshield1.png b/mardrone/gauges/glareshield1.png new file mode 100644 index 0000000..7cd326f Binary files /dev/null and b/mardrone/gauges/glareshield1.png differ diff --git a/mardrone/gauges/hdg1.png b/mardrone/gauges/hdg1.png new file mode 100644 index 0000000..7f1b91e Binary files /dev/null and b/mardrone/gauges/hdg1.png differ diff --git a/mardrone/gauges/hdg2.png b/mardrone/gauges/hdg2.png new file mode 100644 index 0000000..8e27232 Binary files /dev/null and b/mardrone/gauges/hdg2.png differ diff --git a/mardrone/gauges/tach-2700-redline.png b/mardrone/gauges/tach-2700-redline.png new file mode 100644 index 0000000..2cb5d07 Binary files /dev/null and b/mardrone/gauges/tach-2700-redline.png differ diff --git a/mardrone/gauges/trn1.png b/mardrone/gauges/trn1.png new file mode 100644 index 0000000..a57d75a Binary files /dev/null and b/mardrone/gauges/trn1.png differ diff --git a/mardrone/gauges/vsi1.png b/mardrone/gauges/vsi1.png new file mode 100644 index 0000000..5214f81 Binary files /dev/null and b/mardrone/gauges/vsi1.png differ diff --git a/mardrone/mardrone-icon48.png b/mardrone/mardrone-icon48.png new file mode 100644 index 0000000..a53acdc Binary files /dev/null and b/mardrone/mardrone-icon48.png differ diff --git a/mardrone/mardrone-icon48.png.en b/mardrone/mardrone-icon48.png.en new file mode 100644 index 0000000..c515d4d --- /dev/null +++ b/mardrone/mardrone-icon48.png.en @@ -0,0 +1,54 @@ +begin-base64 644 mardrone-icon48.png +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 +====