فهرست منبع

di-soric first set

Reinhard Russinger 7 سال پیش
والد
کامیت
de2e0b584e

+ 1 - 1
board/GfA/Display001/BUILD

@@ -1 +1 @@
-439
+440

+ 27 - 0
board/GfA/Display001/rootfs/etc/init.d/rcK

@@ -0,0 +1,27 @@
+#!/bin/sh
+# turn off backlight
+/root/gfa_spi -b 0
+# Stop all init scripts in /etc/init.d
+# executing them in reversed numerical order.
+#
+for i in $(ls -r /etc/init.d/S??*) ;do
+
+     # Ignore dangling symlinks (if any).
+     [ ! -f "$i" ] && continue
+
+     case "$i" in
+	*.sh)
+	    # Source shell script for speed.
+	    (
+		trap - INT QUIT TSTP
+		set stop
+		. $i
+	    )
+	    ;;
+	*)
+	    # No sh extension, so fork subprocess.
+	    $i stop
+	    ;;
+    esac
+done
+

+ 13 - 7
board/GfA/Display001/rootfs/etc/init.d/rcS

@@ -1,13 +1,13 @@
 #!/bin/sh
 
+
 # Start all init scripts in /etc/init.d
 # executing them in numerical order.
 #
-
 # --- set ddr3ram controller queue
 devmem2 0x4c000054 w 0x00FFFF10
 # --- get spi tiva rtc
-/root/gfa_spi -s
+#/root/gfa_spi -s
 
 if [ -c "/dev/net/tun" ]
 	then echo "."
@@ -42,14 +42,20 @@ for i in /etc/init.d/S??* ;do
     esac
 done
 
-rdate time.memod.de
+/usr/bin/beep -f 4500 -l 100 -r 2 -d 50 -n -f 6000 -l 200
+# clear screen and cursor off for customer logo
+echo -e "\033[3J\033[?25l\033[9;0]\033[14;0]" > /dev/tty0
+while [  ! -c "/dev/spidev1.0" ]; do
+	sleep 1
+done
+# - check tiva firmware and update if neccessary
+/root/fw_update.sh
+/root/gfa_spi -b 100
+/root/gfa_spi -s
+#rdate time.memod.de
 
 BOOTCNT=`cat /etc/BOOTCNT`
 BOOTCNT=$((BOOTCNT+1))
 echo $BOOTCNT > /etc/BOOTCNT
 
 echo "$BOOTCNT ::"`date`" -- "`/root/gfa_spi -u` >> /etc/BOOTTIME 
-
-#-- pwm beeper --- toDo fix kernel dependencies, of error message
-modprobe pwm_beeper
-beep -f 4000 -l 100 -d 200 -n -f 10 -l 50 -n -f 5000 -l 100

+ 5 - 1
board/GfA/Display001/rootfs/etc/inittab

@@ -28,7 +28,11 @@ ttyO0::respawn:/sbin/getty -L  ttyO0 115200 linux # GENERIC_SERIAL
 #tty1::respawn:/root/startapp.sh
 tty2::respawn:/sbin/getty -L  tty2 115200 linux
 tty3::respawn:/sbin/getty -L  tty3 115200 linux
-tty8::respawn:/var/GfA/Display_GSM 
+#tty4::respawn:/opt/WGET_di-soric_001/bin/WGET_di-soric_001
+#tty5::respawn:/opt/MAIN_di-soric_001/bin/MAIN_di-soric_001
+
+tty6::respawn:/root/startbrowser.sh
+#tty8::respawn:/var/GfA/Display_GSM 
 # Stuff to do for the 3-finger salute
 ::ctrlaltdel:/sbin/reboot
 

BIN
board/GfA/Display001/rootfs/opt/di-soric/HMI/VISU_di-soric


BIN
board/GfA/Display001/rootfs/root/btm43_0113.bin


+ 13 - 0
board/GfA/Display001/rootfs/root/fw_update.sh

@@ -0,0 +1,13 @@
+#!/bin/sh
+ACTFW=`/root/gfa_spi -v | awk '{split($0,a," "); print a[8]}'`
+MINFW="0x00000113"
+FWFILE="/root/btm43_0113.bin"
+
+echo "actual Firmware : $ACTFW"
+
+if [ "$ACTFW" \< "$MINFW" ]; then
+echo "Do Update"
+/root/spi_tivia $FWFILE
+else
+echo "FW ok"
+fi

BIN
board/GfA/Display001/rootfs/root/gfa_spi


+ 15 - 0
board/GfA/Display001/rootfs/root/startbrowser.sh

@@ -0,0 +1,15 @@
+#!/bin/sh
+rm -rf /var/cache/fontconfig
+mkdir /fontconfig_cache
+ln -s /fontconfig_cache/ /var/cache/fontconfig
+echo -e "\033[?25l\033[9;0]\033[14;0]" > /dev/tty0
+cd /root
+#-- browsercache loeschen
+rm -rf .cache .local
+. /etc/profile
+export HOME=/tmp
+
+export QT_QPA_EGLFS_PHYSICAL_WIDTH=152
+export QT_QPA_EGLFS_PHYSICAL_HEIGHT=92
+
+/opt/di-soric/HMI/VISU_di-soric

BIN
board/GfA/Display001/rootfs/usr/lib/qt/plugins/platforminputcontexts/libFreeVirtualKeyboard.so


BIN
board/GfA/Display001/rootfs/usr/qml/ApplicationLauncher/libApplicationLauncher.so


+ 3 - 0
board/GfA/Display001/rootfs/usr/qml/ApplicationLauncher/qmldir

@@ -0,0 +1,3 @@
+module ApplicationLauncher
+plugin ApplicationLauncher
+

BIN
board/GfA/Display001/rootfs/usr/qml/QtQuick/FreeVirtualKeyboard/FontAwesome.otf


+ 263 - 0
board/GfA/Display001/rootfs/usr/qml/QtQuick/FreeVirtualKeyboard/InputPanel.qml

@@ -0,0 +1,263 @@
+import QtQuick 2.0
+import "."
+import FreeVirtualKeyboard 1.0
+
+/**
+ * This is the QML input panel that provides the virtual keyboard UI
+ * The code has been copied from
+ * http://tolszak-dev.blogspot.de/2013/04/qplatforminputcontext-and-virtual.html
+ */
+Item {
+    id:root
+    objectName: "inputPanel"
+    width: parent.width
+    height: width / 4
+
+    signal hideKeyPressed
+
+    // Report actual keyboard rectangle to input engine
+    onYChanged: InputEngine.setKeyboardRectangle(Qt.rect(x, y, width, height))
+
+    KeyModel {
+        id:keyModel
+        kbdLayout: settings.value("COMMON/KbdLayout") //"de"
+    }
+
+    FontLoader {
+        source: "FontAwesome.otf"
+    }
+    QtObject {
+        id:pimpl
+        property bool shiftModifier: false
+        property bool symbolModifier: false
+        property int verticalSpacing: keyboard.height / 40
+        property int horizontalSpacing: verticalSpacing
+        property int rowHeight: keyboard.height/24*5 - verticalSpacing
+        property int buttonWidth:  (keyboard.width-column.anchors.margins)/12 - horizontalSpacing
+    }
+
+    // The delegate that paints the key buttons
+    Component {
+        id: keyButtonDelegate
+        KeyButton {
+            id: button
+            width: pimpl.buttonWidth
+            height: pimpl.rowHeight
+            text: (pimpl.shiftModifier) ? letter.toUpperCase() : (pimpl.symbolModifier)?firstSymbol : letter
+            inputPanel: root
+        }
+    }
+
+    Component {
+        id: numberButtonDelegate
+        KeyButton {
+            id: button
+            width: pimpl.buttonWidth
+            height: pimpl.rowHeight  * 4 / 5
+            text: (pimpl.shiftModifier) ? letter.toUpperCase() : (pimpl.symbolModifier)?firstSymbol : letter
+            inputPanel: root
+            color: "grey"
+        }
+    }
+
+    Connections {
+        target: InputEngine
+        // Switch the keyboard layout to Numeric if the input mode of the InputEngine changes
+        onInputModeChanged: {
+            pimpl.symbolModifier = ((InputEngine.inputMode == InputEngine.Numeric)
+                                 || (InputEngine.inputMode == InputEngine.Dialable))
+            if (pimpl.symbolModifier) {
+                pimpl.shiftModifier = false
+            }
+        }
+    }
+
+    // This function shows the character preview popup for each key button
+    function showKeyPopup(keyButton)
+    {
+        // console.log("showKeyPopup");
+        keyPopup.popup(keyButton, root);
+    }
+
+    // The key popup for character preview
+    KeyPopup {
+        id: keyPopup
+        visible: false
+        z: 100
+    }
+
+    Rectangle {
+        id: background
+        color: "black"
+        width: keyboard.width
+        height: keyboard.height + 4 * pimpl.verticalSpacing
+    }
+
+    Rectangle {
+        id:keyboard
+        color: "black"
+        anchors.fill: parent;
+        MouseArea {
+            anchors.fill: parent
+        }
+
+        Column {
+            id:column
+            anchors.margins: 5
+            anchors.fill: parent
+            spacing: pimpl.verticalSpacing
+            Row {
+                height: pimpl.rowHeight
+                spacing: pimpl.horizontalSpacing
+                anchors.horizontalCenter:parent.horizontalCenter
+                Repeater {
+                    model: keyModel.numbersRowModel
+                    delegate: numberButtonDelegate
+                }
+            }
+
+            Row {
+                height: pimpl.rowHeight
+                spacing: pimpl.horizontalSpacing
+                anchors.horizontalCenter:parent.horizontalCenter
+                Repeater {
+                    model: keyModel.firstRowModel
+                    delegate: keyButtonDelegate
+                }
+            }
+            Row {
+                height: pimpl.rowHeight
+                spacing: pimpl.horizontalSpacing
+                anchors.horizontalCenter:parent.horizontalCenter
+                Repeater {
+                    model: keyModel.secondRowModel
+                    delegate: keyButtonDelegate
+                }
+            }
+            Item {
+                height: pimpl.rowHeight
+                width:parent.width
+                KeyButton {
+                    id: shiftKey
+                    color: (pimpl.shiftModifier)? "#1e6fa7": "#1e1b18"
+                    anchors.left: parent.left
+                    width: 1.25*pimpl.buttonWidth
+                    height: pimpl.rowHeight
+                    font.family: "FontAwesome"
+                    font.bold: true
+                    text: "\u21ea" //"\uf062"
+                    functionKey: true
+                    onClicked: {
+                        if (pimpl.symbolModifier) {
+                            pimpl.symbolModifier = false
+                        }
+                        pimpl.shiftModifier = !pimpl.shiftModifier
+                    }
+                    inputPanel: root
+                }
+                Row {
+                    height: pimpl.rowHeight
+                    spacing: pimpl.horizontalSpacing
+                    anchors.horizontalCenter:parent.horizontalCenter
+                    Repeater {
+                        anchors.horizontalCenter: parent.horizontalCenter
+                        model: keyModel.thirdRowModel
+                        delegate: keyButtonDelegate
+                    }
+                }
+                KeyButton {
+                    id: backspaceKey
+                    font.family: "FontAwesome"
+                    color: "#1e1b18"
+                    anchors.right: parent.right
+                    width: 1.25*pimpl.buttonWidth
+                    height: pimpl.rowHeight
+                    text: "\x7F"
+                    displayText: "\u27f5" //"\uf177"
+                    inputPanel: root
+                    repeat: true
+                }
+            }
+            Row {
+                height: pimpl.rowHeight
+                spacing: pimpl.horizontalSpacing
+                anchors.horizontalCenter:parent.horizontalCenter
+                KeyButton {
+                    id: hideKey
+                    color: "#1e1b18"
+                    width: 1.25*pimpl.buttonWidth
+                    height: pimpl.rowHeight
+                    font.family: "FontAwesome"
+                    text: "\uf11c" //"\uf078"
+                    functionKey: true
+                    onClicked: {
+                        Qt.inputMethod.hide();
+                        hideKeyPressed();
+                    }
+                    inputPanel: root
+                    showPreview: false
+                }
+                KeyButton {
+                    color: "#1e1b18"
+                    width: 1.25*pimpl.buttonWidth
+                    height: pimpl.rowHeight
+                    font.family: "FontAwesome"
+                    font.bold: true
+                    text:  (pimpl.shiftModifier) ? "\u21a4":"\u21a6"
+                    inputPanel: root
+                    //functionKey: true
+                }
+                KeyButton {
+                    color: "#1e1b18"
+                    width: pimpl.buttonWidth
+                    height: pimpl.rowHeight
+                    font.family: "FontAwesome"
+                    text: (pimpl.shiftModifier) ? "\u2191":"\u2190" //"\uf060" // arrow left
+                    //onClicked: InputEngine.sendKeyToFocusItem(text)
+                    inputPanel: root
+                }
+                KeyButton {
+                    id: spaceKey
+                    width: 3*pimpl.buttonWidth
+                    height: pimpl.rowHeight
+                    text: " "
+                    inputPanel: root
+                    showPreview: false
+                }
+                KeyButton {
+                    color: "#1e1b18"
+                    width: pimpl.buttonWidth
+                    height: pimpl.rowHeight
+                    font.family: "FontAwesome"
+                    text: (pimpl.shiftModifier) ?"\u2193":"\u2192" //"\uf061"  //pimpl.symbolModifier ? ":" :"."
+                    inputPanel: root
+                }
+                KeyButton {
+                    id: symbolKey
+                    color: "#1e1b18"
+                    width: 1.25*pimpl.buttonWidth
+                    height: pimpl.rowHeight
+                    text: (!pimpl.symbolModifier)? "12#" : "ABC"
+                    functionKey: true
+                    onClicked: {
+                        if (pimpl.shiftModifier) {
+                            pimpl.shiftModifier = false
+                        }
+                        pimpl.symbolModifier = !pimpl.symbolModifier
+                    }
+                    inputPanel: root
+                }
+                KeyButton {
+                    id: enterKey
+                    color: "#1e1b18"
+                    width: 1.25*pimpl.buttonWidth
+                    height: pimpl.rowHeight
+                    font.bold: true
+                    displayText: "\u23ce" //"Enter"
+                    text: "\n"
+                    inputPanel: root
+                }
+            }
+        }
+    }
+}

+ 149 - 0
board/GfA/Display001/rootfs/usr/qml/QtQuick/FreeVirtualKeyboard/KeyButton.qml

@@ -0,0 +1,149 @@
+import QtQuick 2.0
+import FreeVirtualKeyboard 1.0
+
+/**
+ * This is the type implements one single key button in the InputPanel
+ * The code has been copied from
+ * http://tolszak-dev.blogspot.de/2013/04/qplatforminputcontext-and-virtual.html
+ */
+Item {
+    id:root
+
+    // The background color of this button
+    property color color: "#35322f"
+
+    // The key text to show in this button
+    property string text
+
+    // The font for rendering of text
+    property alias font: txt.font
+
+    // The color of the text in this button
+    property alias textColor: txt.color
+
+    // This property holds the pressed status of the key.
+    property alias isPressed: buttonMouseArea.pressed
+
+    // This property holds a reference to the input panel.
+    // A key can only show the charcter preview popup if this property contains
+    // a valid refernce to the input panel
+    property var inputPanel
+
+    // This property holds the highlighted status of the key
+    // The highlighted status is a little bit different from the pressed status
+    // If the user releases the key, it is not pressed anymore, but it is still
+    // highlighted for some milliseconds
+    property bool isHighlighted: false
+
+    // Sets the show preview attribute for the character preview key popup
+    property bool showPreview: true
+
+    // Sets the key repeat attribute.
+    // If the repeat is enabled, the key will repeat the input events while held down.
+    // The default is false.
+    property bool repeat: false
+
+    // Sets the key code for input method processing.
+    property int key
+
+    // Sets the display text - this string is rendered in the keyboard layout.
+    // The default value is the key text.
+    property alias displayText: txt.text
+
+    // Sets the function key attribute.
+    property bool functionKey: false
+
+    signal clicked()
+    signal pressed()
+    signal released()
+
+    Rectangle {
+        anchors.fill: parent
+        radius: height / 20
+        color: isHighlighted ? Qt.tint(root.color, "#801e6fa7") : root.color
+        Text {
+            id: txt
+            color: "white"
+            anchors.margins: parent.height / 6
+            anchors.fill: parent
+            fontSizeMode: Text.Fit
+            font.pixelSize: height
+            horizontalAlignment: Text.AlignHCenter
+            verticalAlignment: Text.AlignVCenter
+            text: root.text
+        }
+        MouseArea {
+            id: buttonMouseArea
+            anchors.fill: parent
+            onClicked: root.clicked()
+            onPressed: root.pressed()
+            onReleased: root.released()
+        }
+    }
+
+    Timer {
+        id: highlightTimer
+        interval: 100
+        running: !isPressed
+        repeat: false
+
+        onTriggered: {
+            isHighlighted = false;
+        }
+    }
+
+    Timer {
+        id: repeatTimer
+        interval: 500
+        repeat: true
+        running: root.repeat && root.isPressed
+
+        onTriggered: {
+            if (root.state == "")
+            {
+                root.state = "REPEATING"
+                console.log("switching to repeating");
+            }
+            else if (root.state == "REPEATING")
+            {
+                console.log("repeating");
+            }
+
+            if (!functionKey)
+            {
+                InputEngine.sendKeyToFocusItem(text)
+            }
+        }
+    }
+
+    onInputPanelChanged: {
+        console.log("onInputPanelChanged: " + inputPanel.objectName);
+    }
+
+    // If the InputPanel property has a valid InputPanel reference and if
+    // showPreview is true, then this function calls showKeyPopup() to
+    // show the character preview popup.
+    onPressed: {
+        if (inputPanel != null && showPreview)
+        {
+            inputPanel.showKeyPopup(root);
+        }
+        isHighlighted = true;
+    }
+
+    onReleased: {
+        state = ""
+        console.log("onReleased - functionKey = " + functionKey)
+        if (!functionKey)
+        {
+            InputEngine.sendKeyToFocusItem(text)
+        }
+    }
+
+    states: [
+        State {
+            name: "REPEATING"
+            PropertyChanges { target: repeatTimer; interval: 50}
+        }
+    ]
+}

+ 191 - 0
board/GfA/Display001/rootfs/usr/qml/QtQuick/FreeVirtualKeyboard/KeyModel.qml

@@ -0,0 +1,191 @@
+import QtQuick 2.0
+
+/**
+ * This is quick and dirty model for the keys of the InputPanel *
+ * The code has been copied from
+ * http://tolszak-dev.blogspot.de/2013/04/qplatforminputcontext-and-virtual.html
+ */
+
+
+/********************************************************
+                English Keyboard Layout
+ ********************************************************/
+
+
+Item {
+    property QtObject firstRowModel: first
+    property QtObject secondRowModel: second
+    property QtObject thirdRowModel: third
+    property QtObject numbersRowModel: numbers
+    property string kbdLayout: ""
+
+    ListModel {
+        id:numbers
+
+
+        Component.onCompleted: {
+
+            switch (kbdLayout){
+            default:
+            case "de":
+            append ({ letter: "1", firstSymbol: "1"});
+            append ({ letter: "2", firstSymbol: "2"});
+            append ({ letter: "3", firstSymbol: "3"});
+            append ({ letter: "4", firstSymbol: "4"});
+            append ({ letter: "5", firstSymbol: "5"});
+            append ({ letter: "6", firstSymbol: "6"});
+            append ({ letter: "7", firstSymbol: "7"});
+            append ({ letter: "8", firstSymbol: "8"});
+            append ({ letter: "9", firstSymbol: "9"});
+            append ({ letter: "0", firstSymbol: "0"});
+            append ({ letter: "@", firstSymbol: "€"});
+            break;
+
+            case "en":
+            append ({ letter: "1", firstSymbol: "1"});
+            append ({ letter: "2", firstSymbol: "2"});
+            append ({ letter: "3", firstSymbol: "3"});
+            append ({ letter: "4", firstSymbol: "4"});
+            append ({ letter: "5", firstSymbol: "5"});
+            append ({ letter: "6", firstSymbol: "6"});
+            append ({ letter: "7", firstSymbol: "7"});
+            append ({ letter: "8", firstSymbol: "8"});
+            append ({ letter: "9", firstSymbol: "9"});
+            append ({ letter: "0", firstSymbol: "0"});
+            append ({ letter: "$", firstSymbol: "$"});
+            break;
+
+            }
+
+        }
+
+//        ListElement { letter: "1"; firstSymbol: "1"}
+//        ListElement { letter: "2"; firstSymbol: "2"}
+//        ListElement { letter: "3"; firstSymbol: "3"}
+//        ListElement { letter: "4"; firstSymbol: "4"}
+//        ListElement { letter: "5"; firstSymbol: "5"}
+//        ListElement { letter: "6"; firstSymbol: "6"}
+//        ListElement { letter: "7"; firstSymbol: "7"}
+//        ListElement { letter: "8"; firstSymbol: "8"}
+//        ListElement { letter: "9"; firstSymbol: "9"}
+//        ListElement { letter: "0"; firstSymbol: "0"}
+//        ListElement { letter: "@"; firstSymbol: "@"}
+//        // ListElement { letter: "="; firstSymbol: "+"}
+    }
+
+    ListModel {
+        id:first
+        ListElement { letter: "q"; firstSymbol: "!"}
+        ListElement { letter: "w"; firstSymbol: "°"}
+        ListElement { letter: "e"; firstSymbol: "#"}
+        ListElement { letter: "r"; firstSymbol: "$"}
+        ListElement { letter: "t"; firstSymbol: "%"}
+        ListElement { letter: "y"; firstSymbol: "^"}
+        ListElement { letter: "u"; firstSymbol: "&"}
+        ListElement { letter: "i"; firstSymbol: "+"}
+        ListElement { letter: "o"; firstSymbol: "-"}
+        ListElement { letter: "p"; firstSymbol: "*"}
+        ListElement { letter: "("; firstSymbol: "/"}
+        ListElement { letter: ")"; firstSymbol: "="}
+    }
+    ListModel {
+        id:second
+        ListElement { letter: "a"; firstSymbol: "{"}
+        ListElement { letter: "s"; firstSymbol: "}"}
+        ListElement { letter: "d"; firstSymbol: "["}
+        ListElement { letter: "f"; firstSymbol: "]"}
+        ListElement { letter: "g"; firstSymbol: "("}
+        ListElement { letter: "h"; firstSymbol: ")"}
+        ListElement { letter: "j"; firstSymbol: ":"}
+        ListElement { letter: "k"; firstSymbol: "\""}
+        ListElement { letter: "l"; firstSymbol: "'"}
+        ListElement { letter: "'"; firstSymbol: "|"}
+        ListElement { letter: "/"; firstSymbol: "\\"}
+    }
+    ListModel {
+        id:third
+        ListElement { letter: "z"; firstSymbol: "<"}
+        ListElement { letter: "x"; firstSymbol: ">"}
+        ListElement { letter: "c"; firstSymbol: "€"}
+        ListElement { letter: "v"; firstSymbol: "µ"}
+        ListElement { letter: "b"; firstSymbol: "?"}
+        ListElement { letter: "n"; firstSymbol: ".com"}
+        ListElement { letter: "m"; firstSymbol: ";"}
+        ListElement { letter: ","; firstSymbol: ","}
+        ListElement { letter: "."; firstSymbol: "."}
+    }
+}
+
+
+
+/********************************************************
+                German Keyboard Layout
+ ********************************************************/
+/*
+
+Item {
+    property QtObject firstRowModel: first
+    property QtObject secondRowModel: second
+    property QtObject thirdRowModel: third
+    property QtObject numbersRowModel: numbers
+
+    ListModel {
+        id:numbers
+        ListElement { letter: "1"; firstSymbol: "1"}
+        ListElement { letter: "2"; firstSymbol: "2"}
+        ListElement { letter: "3"; firstSymbol: "3"}
+        ListElement { letter: "4"; firstSymbol: "4"}
+        ListElement { letter: "5"; firstSymbol: "5"}
+        ListElement { letter: "6"; firstSymbol: "6"}
+        ListElement { letter: "7"; firstSymbol: "7"}
+        ListElement { letter: "8"; firstSymbol: "8"}
+        ListElement { letter: "9"; firstSymbol: "9"}
+        ListElement { letter: "0"; firstSymbol: "0"}
+        ListElement { letter: "ß"; firstSymbol: "@"}
+        // ListElement { letter: "="; firstSymbol: "+"}
+    }
+
+    ListModel {
+        id:first
+        ListElement { letter: "q"; firstSymbol: "!"}
+        ListElement { letter: "w"; firstSymbol: "°"}
+        ListElement { letter: "e"; firstSymbol: "#"}
+        ListElement { letter: "r"; firstSymbol: "$"}
+        ListElement { letter: "t"; firstSymbol: "%"}
+        ListElement { letter: "z"; firstSymbol: "^"}
+        ListElement { letter: "u"; firstSymbol: "&"}
+        ListElement { letter: "i"; firstSymbol: "+"}
+        ListElement { letter: "o"; firstSymbol: "-"}
+        ListElement { letter: "p"; firstSymbol: "*"}
+        ListElement { letter: "ü"; firstSymbol: "/"}
+        ListElement { letter: ""; firstSymbol: "="}
+    }
+    ListModel {
+        id:second
+        ListElement { letter: "a"; firstSymbol: "{"}
+        ListElement { letter: "s"; firstSymbol: "}"}
+        ListElement { letter: "d"; firstSymbol: "["}
+        ListElement { letter: "f"; firstSymbol: "]"}
+        ListElement { letter: "g"; firstSymbol: "("}
+        ListElement { letter: "h"; firstSymbol: ")"}
+        ListElement { letter: "j"; firstSymbol: ":"}
+        ListElement { letter: "k"; firstSymbol: "\""}
+        ListElement { letter: "l"; firstSymbol: "'"}
+        ListElement { letter: "ö"; firstSymbol: "|"}
+        ListElement { letter: "ä"; firstSymbol: "\\"}
+    }
+    ListModel {
+        id:third
+        ListElement { letter: "y"; firstSymbol: "<"}
+        ListElement { letter: "x"; firstSymbol: ">"}
+        ListElement { letter: "c"; firstSymbol: "€"}
+        ListElement { letter: "v"; firstSymbol: "µ"}
+        ListElement { letter: "b"; firstSymbol: "?"}
+        ListElement { letter: "n"; firstSymbol: ".de"}
+        ListElement { letter: "m"; firstSymbol: ";"}
+        ListElement { letter: ","; firstSymbol: ","}
+        ListElement { letter: "."; firstSymbol: "."}
+    }
+}
+
+*/

+ 81 - 0
board/GfA/Display001/rootfs/usr/qml/QtQuick/FreeVirtualKeyboard/KeyPopup.qml

@@ -0,0 +1,81 @@
+import QtQuick 2.0
+import QtGraphicalEffects 1.0
+
+/**
+ * This is the key popup that shows a character preview above the
+ * pressed key button like it is known from keyboards on phones.
+ */
+
+Item {
+    id: root
+    property alias text: txt.text
+    property alias font: txt.font
+
+    width: 40
+    height: 40
+    visible: false
+
+    Rectangle {
+        id: popup
+        anchors.fill: parent
+        radius: Math.round(height / 30)
+        z: shadow.z + 1
+
+        gradient: Gradient {
+                 GradientStop { position: 0.0; color: Qt.lighter(Qt.lighter("#35322f"))}
+                 GradientStop { position: 1.0; color: Qt.lighter("#35322f")}
+
+        }
+
+        Text {
+            id: txt
+            color: "white"
+            anchors.fill: parent
+            fontSizeMode: Text.Fit
+            font.pixelSize: height
+            horizontalAlignment: Text.AlignHCenter
+            verticalAlignment: Text.AlignVCenter
+        }
+    }
+
+    Rectangle {
+        id: shadow
+        width: root.width
+        height: root.height
+        color: "#3F000000"
+        x: 4
+        y: 4
+    }
+
+    function popup(keybutton, inputPanel) {
+        // console.log("popup: " + inputPanel.objectName);
+        // console.log("keybutton.text: " + keybutton.text);
+        width = keybutton.width * 1.4;
+        height = keybutton.height * 1.4;
+        var KeyButtonGlobalLeft = keybutton.mapToItem(inputPanel, 0, 0).x;
+        var KeyButtonGlobalTop = keybutton.mapToItem(inputPanel, 0, 0).y;
+        var PopupGlobalLeft = KeyButtonGlobalLeft - (width - keybutton.width) / 2;
+        var PopupGlobalTop = KeyButtonGlobalTop - height - pimpl.verticalSpacing * 1.5;
+        // console.log("Popup position left: " + KeyButtonGlobalLeft);
+        var PopupLeft = root.parent.mapFromItem(inputPanel, PopupGlobalLeft, PopupGlobalTop).x;
+        y = root.parent.mapFromItem(inputPanel, PopupGlobalLeft, PopupGlobalTop).y;
+        if (PopupGlobalLeft < 0)
+        {
+            x = 0;
+        }
+        else if ((PopupGlobalLeft + width) > inputPanel.width)
+        {
+            x = PopupLeft - (PopupGlobalLeft + width - inputPanel.width);
+        }
+        else
+        {
+            x = PopupLeft;
+        }
+
+        text = keybutton.displayText;
+        font.family = keybutton.font.family
+        visible = Qt.binding(function() {return keybutton.isHighlighted});
+    }
+}
+
+

+ 2 - 0
board/GfA/Display001/rootfs/usr/qml/QtQuick/FreeVirtualKeyboard/qmldir

@@ -0,0 +1,2 @@
+module QtQuick.FreeVirtualKeyboard
+InputPanel 1.0 InputPanel.qml