Browse Source

Erste Version mit QML-Implementation.

Rind 5 năm trước cách đây
mục cha
commit
4478b0fb88

+ 2 - 1
Test/Test.pro

@@ -3,7 +3,8 @@ TEMPLATE = subdirs
 SUBDIRS += \
     app1 \
     app2 \
-    app3
+    app3 \
+    qmlApp
 
 CONFIG += qtc_runnable
 CONFIG += ordered

+ 168 - 6
Test/Test.pro.user

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 4.11.0, 2020-01-31T15:55:28. -->
+<!-- Written by QtCreator 4.11.0, 2020-02-06T09:10:39. -->
 <qtcreator>
  <data>
   <variable>EnvironmentId</variable>
@@ -54,7 +54,16 @@
  </data>
  <data>
   <variable>ProjectExplorer.Project.PluginSettings</variable>
-  <valuemap type="QVariantMap"/>
+  <valuemap type="QVariantMap">
+   <valuemap type="QVariantMap" key="AutoTest.ActiveFrameworks">
+    <value type="bool" key="AutoTest.Framework.Boost">true</value>
+    <value type="bool" key="AutoTest.Framework.GTest">true</value>
+    <value type="bool" key="AutoTest.Framework.QtQuickTest">true</value>
+    <value type="bool" key="AutoTest.Framework.QtTest">true</value>
+   </valuemap>
+   <value type="int" key="AutoTest.RunAfterBuild">0</value>
+   <value type="bool" key="AutoTest.UseGlobal">true</value>
+  </valuemap>
  </data>
  <data>
   <variable>ProjectExplorer.Project.Target.0</variable>
@@ -64,7 +73,7 @@
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.57.gcc_64_kit</value>
    <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
    <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
-   <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
+   <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">3</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
     <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/wrk/share/gfaipc/Test/Debug/Desktop_Qt_5_7_1_GCC_64bit</value>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
@@ -396,7 +405,81 @@
     <value type="QString" key="RunConfiguration.WorkingDirectory"></value>
     <value type="QString" key="RunConfiguration.WorkingDirectory.default">/home/wrk/share/gfaipc/Test/Debug/Desktop_Qt_5_7_1_GCC_64bit/app3</value>
    </valuemap>
-   <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">3</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.3">
+    <value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
+    <valuelist type="QVariantList" key="Analyzer.Perf.Events">
+     <value type="QString">cpu-cycles</value>
+    </valuelist>
+    <valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/>
+    <value type="int" key="Analyzer.Perf.Frequency">250</value>
+    <valuelist type="QVariantList" key="Analyzer.Perf.RecordArguments">
+     <value type="QString">-e</value>
+     <value type="QString">cpu-cycles</value>
+     <value type="QString">--call-graph</value>
+     <value type="QString">dwarf,4096</value>
+     <value type="QString">-F</value>
+     <value type="QString">250</value>
+    </valuelist>
+    <value type="QString" key="Analyzer.Perf.SampleMode">-F</value>
+    <value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
+    <value type="int" key="Analyzer.Perf.StackSize">4096</value>
+    <value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
+    <value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
+    <value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
+    <value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
+    <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
+    <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
+    <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
+    <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
+    <value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value>
+    <value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
+    <value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
+    <value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
+    <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
+    <value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
+    <value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
+    <value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
+     <value type="int">0</value>
+     <value type="int">1</value>
+     <value type="int">2</value>
+     <value type="int">3</value>
+     <value type="int">4</value>
+     <value type="int">5</value>
+     <value type="int">6</value>
+     <value type="int">7</value>
+     <value type="int">8</value>
+     <value type="int">9</value>
+     <value type="int">10</value>
+     <value type="int">11</value>
+     <value type="int">12</value>
+     <value type="int">13</value>
+     <value type="int">14</value>
+    </valuelist>
+    <value type="int" key="PE.EnvironmentAspect.Base">2</value>
+    <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/home/wrk/share/gfaipc/Test/qmlApp/qmlApp.pro</value>
+    <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/home/wrk/share/gfaipc/Test/qmlApp/qmlApp.pro</value>
+    <value type="QString" key="RunConfiguration.Arguments"></value>
+    <value type="bool" key="RunConfiguration.Arguments.multi">false</value>
+    <value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
+    <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
+    <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
+    <value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
+    <value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
+    <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
+    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
+    <value type="QString" key="RunConfiguration.WorkingDirectory"></value>
+    <value type="QString" key="RunConfiguration.WorkingDirectory.default">/home/wrk/share/gfaipc/Test/Debug/Desktop_Qt_5_7_1_GCC_64bit/qmlApp</value>
+   </valuemap>
+   <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">4</value>
   </valuemap>
  </data>
  <data>
@@ -407,7 +490,7 @@
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{b0a415a1-ecbe-4123-8afc-05ffc0004131}</value>
    <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
    <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
-   <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
+   <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">3</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
     <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/wrk/share/gfaipc/Test/Debug/Sitara_1</value>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
@@ -788,7 +871,86 @@
     <value type="QString" key="RunConfiguration.WorkingDirectory.default"></value>
     <value type="QString" key="RunConfiguration.X11Forwarding">:0</value>
    </valuemap>
-   <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">3</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.3">
+    <value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
+    <valuelist type="QVariantList" key="Analyzer.Perf.Events">
+     <value type="QString">cpu-cycles</value>
+    </valuelist>
+    <valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/>
+    <value type="int" key="Analyzer.Perf.Frequency">250</value>
+    <valuelist type="QVariantList" key="Analyzer.Perf.RecordArguments">
+     <value type="QString">-e</value>
+     <value type="QString">cpu-cycles</value>
+     <value type="QString">--call-graph</value>
+     <value type="QString">dwarf,4096</value>
+     <value type="QString">-F</value>
+     <value type="QString">250</value>
+    </valuelist>
+    <value type="QString" key="Analyzer.Perf.SampleMode">-F</value>
+    <value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
+    <value type="int" key="Analyzer.Perf.StackSize">4096</value>
+    <value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
+    <value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
+    <value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
+    <value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
+    <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
+    <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
+    <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
+    <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
+    <value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value>
+    <value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
+    <value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
+    <value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
+    <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
+    <value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
+    <value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
+    <value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
+     <value type="int">0</value>
+     <value type="int">1</value>
+     <value type="int">2</value>
+     <value type="int">3</value>
+     <value type="int">4</value>
+     <value type="int">5</value>
+     <value type="int">6</value>
+     <value type="int">7</value>
+     <value type="int">8</value>
+     <value type="int">9</value>
+     <value type="int">10</value>
+     <value type="int">11</value>
+     <value type="int">12</value>
+     <value type="int">13</value>
+     <value type="int">14</value>
+    </valuelist>
+    <value type="int" key="PE.EnvironmentAspect.Base">1</value>
+    <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">qmlApp (auf Sitara 1)</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">RemoteLinuxRunConfiguration:/home/wrk/share/gfaipc/Test/qmlApp/qmlApp.pro</value>
+    <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/home/wrk/share/gfaipc/Test/qmlApp/qmlApp.pro</value>
+    <value type="int" key="RemoteLinux.EnvironmentAspect.Version">1</value>
+    <value type="QString" key="RemoteLinux.RunConfig.AlternateRemoteExecutable"></value>
+    <value type="bool" key="RemoteLinux.RunConfig.UseAlternateRemoteExecutable">false</value>
+    <value type="QString" key="RunConfiguration.Arguments"></value>
+    <value type="bool" key="RunConfiguration.Arguments.multi">false</value>
+    <value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
+    <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
+    <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
+    <value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
+    <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
+    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
+    <value type="bool" key="RunConfiguration.UseX11Forwarding">false</value>
+    <value type="QString" key="RunConfiguration.WorkingDirectory"></value>
+    <value type="QString" key="RunConfiguration.WorkingDirectory.default"></value>
+    <value type="QString" key="RunConfiguration.X11Forwarding">:0</value>
+   </valuemap>
+   <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">4</value>
   </valuemap>
  </data>
  <data>

+ 15 - 10
Test/main.cpp

@@ -68,14 +68,20 @@ static void _ProcessCtrlMessages(HAPPCTRL hAC, HAPPINFO hAI)
 			TRACE("Received Message: STOP!\n");
 			break;
 		case GFA_APPCTRL_CTRLMSG_PAUSE:
-			g_fPause = true;
-			::GfaIpcAppCtrlSetState(hAC, GIAS_Paused);
-			TRACE("%-8s: State: %s\n", "Me", g_pszStateNames[GIAS_Paused]);
+			if(!g_fPause)
+			{
+				g_fPause = true;
+				::GfaIpcAppCtrlSetState(hAC, GIAS_Paused);
+				TRACE("%-8s: State: %s\n", "Me", g_pszStateNames[GIAS_Paused]);
+			}
 			break;
 		case GFA_APPCTRL_CTRLMSG_RESUME:
-			g_fPause = false;
-			::GfaIpcAppCtrlSetState(hAC, GIAS_Running);
-			TRACE("%-8s: State: %s\n", "Me", g_pszStateNames[GIAS_Running]);
+			if(g_fPause)
+			{
+				g_fPause = false;
+				::GfaIpcAppCtrlSetState(hAC, GIAS_Running);
+				TRACE("%-8s: State: %s\n", "Me", g_pszStateNames[GIAS_Running]);
+			}
 			break;
 		case _CTRL_MSG_DELAY:
 			TRACE("Delaying 2 seconds.\n");
@@ -198,11 +204,10 @@ int main(void)
 
 		;;GfaIpcDumpSHMROT();
 
-		::GfaIpcAppCtrlPresetDisplayName(hAC, _APPID_1, _APPNAME_1);
-		::GfaIpcAppCtrlPresetDisplayName(hAC, _APPID_2, _APPNAME_2);
+		::GfaIpcAppCtrlPresetDisplayName(hAC, GFA_APPCTRL_CTRLMSG_USER_01, "qmlApp");
 		::GfaIpcAppCtrlSetState(hAC, GIAS_Initializing);
 
-		if(!::GfaIpcAppCtrlSubscribeStateEvents(hAC, _APPID_1 | _APPID_2))
+		if(!::GfaIpcAppCtrlSubscribeStateEvents(hAC, _APPID_1 | _APPID_2 | GFA_APPCTRL_CTRLMSG_USER_01))
 			break;
 
 		TRACE("My Name:  %s\n", _APPNAME_0);
@@ -230,7 +235,7 @@ int main(void)
 			/////////////////////////////////////////////////////////////////
 			// update app control info
 
-			if((hAI = ::GfaIpcAppCtrlInfoUpdate(hAC, !g_fPause)))
+			if((hAI = ::GfaIpcAppCtrlInfoUpdate(hAC)))
 			{
 				_ProcessCtrlMessages(hAC, hAI);
 				_ProcessStateEvents(hAC, hAI);

+ 44 - 0
Test/qmlApp/main.cpp

@@ -0,0 +1,44 @@
+#include <QGuiApplication>
+#include <QQmlApplicationEngine>
+#include "qappctrl.h"
+
+#define _APP_ID					GFA_APPCTRL_CTRLMSG_USER_01
+#define _APP_NAME				"qmlApp"
+#define _TIMER_INT				50
+
+int main(int argc, char *argv[])
+{
+    int nRet = -1;
+	QGfaAppCtrl appCtrl;
+    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
+    QGuiApplication app(argc, argv);
+    QQmlApplicationEngine engine;
+    const QUrl url(QStringLiteral("qrc:/main.qml"));
+
+    if(appCtrl.Create(_APP_ID, _APP_NAME, _TIMER_INT))
+    {
+		appCtrl.SubscribeStateEvents(GFA_APPCTRL_APPID_ALL_GFA);
+		appCtrl.SetState(GIAS_Initializing);
+
+	    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
+	                     &app, [url, &appCtrl](QObject *obj, const QUrl &objUrl) {
+							if (!obj && url == objUrl)
+							{
+								appCtrl.SetState(GIAS_Terminating);
+								appCtrl.Release();
+					            QCoreApplication::exit(-1);
+							}
+	    }, Qt::QueuedConnection);
+
+		appCtrl.RegisterQmlTypes(engine, 1, 0);
+	    engine.load(url);
+
+		appCtrl.SetState(GIAS_Running);
+
+	    nRet = app.exec();
+
+		appCtrl.SetState(GIAS_Terminating);
+	}
+
+    return nRet;
+}

+ 328 - 0
Test/qmlApp/main.qml

@@ -0,0 +1,328 @@
+import QtQuick 2.7
+import QtQuick.Window 2.2
+import com.gfa.ipc.appctrl 1.0
+
+Window {
+    visible: true
+    width: 640
+    height: 480
+    title: qsTr("GfA App Control")
+
+	property var appInfoRem:	qAppCtrl.appInfo[qAppCtrl.idxRemanent]
+	property var appInfoRest:	qAppCtrl.appInfo[qAppCtrl.idxRest]
+	property var appInfoMqtt:	qAppCtrl.appInfo[qAppCtrl.idxMqttCl]
+
+    Text {
+        x: 50
+        y: 60
+        width: 80
+        height: 40
+        font.pixelSize: 14
+        text: appInfoRem.name
+    }
+
+    Text {
+        x: 150
+        y: 60
+        width: 80
+        height: 40
+        font.pixelSize: 14
+        text: appInfoRem.stateText
+    }
+
+    Rectangle
+    {
+        x: 250
+        y: 50
+        width: 90
+        height: 40
+        color: "lightgrey"
+
+        Text {
+            text: "Pause"
+	        font.pixelSize: 14
+            anchors.centerIn: parent
+        }
+
+        MouseArea {
+            anchors.fill: parent
+            onClicked: appInfoRem.pause()
+        }
+    }
+
+    Rectangle
+    {
+        x: 350
+        y: 50
+        width: 90
+        height: 40
+        color: "lightgrey"
+
+        Text {
+            text: "Resume"
+	        font.pixelSize: 14
+            anchors.centerIn: parent
+        }
+
+        MouseArea {
+            anchors.fill: parent
+            onClicked: appInfoRem.resume()
+        }
+    }
+
+    Rectangle
+    {
+        x: 450
+        y: 50
+        width: 90
+        height: 40
+        color: "lightgrey"
+
+        Text {
+            text: "Stop"
+	        font.pixelSize: 14
+            anchors.centerIn: parent
+        }
+
+        MouseArea {
+            anchors.fill: parent
+            onClicked: appInfoRem.stop()
+        }
+    }
+
+    Text {
+        x: 550
+        y: 60
+        width: 80
+        height: 40
+        font.pixelSize: 14
+        text: appInfoRem.cycMin
+    }
+
+    Text {
+        x: 650
+        y: 60
+        width: 80
+        height: 40
+        font.pixelSize: 14
+        text: appInfoRem.cycMax
+    }
+
+	////////////////////////////////////////////////////////////
+
+    Text {
+        x: 50
+        y: 110
+        width: 80
+        height: 40
+        font.pixelSize: 14
+        text: appInfoRest.name
+    }
+
+    Text {
+        x: 150
+        y: 110
+        width: 80
+        height: 40
+        font.pixelSize: 14
+        text: appInfoRest.stateText
+    }
+
+    Rectangle
+    {
+        x: 250
+        y: 100
+        width: 90
+        height: 40
+        color: "lightgrey"
+
+        Text {
+            text: "Pause"
+	        font.pixelSize: 14
+            anchors.centerIn: parent
+        }
+
+        MouseArea {
+            anchors.fill: parent
+            onClicked: appInfoRest.pause()
+        }
+    }
+
+    Rectangle
+    {
+        x: 350
+        y: 100
+        width: 90
+        height: 40
+        color: "lightgrey"
+
+        Text {
+            text: "Resume"
+	        font.pixelSize: 14
+            anchors.centerIn: parent
+        }
+
+        MouseArea {
+            anchors.fill: parent
+            onClicked: appInfoRest.resume()
+        }
+    }
+
+    Rectangle
+    {
+        x: 450
+        y: 100
+        width: 90
+        height: 40
+        color: "lightgrey"
+
+        Text {
+            text: "Stop"
+	        font.pixelSize: 14
+            anchors.centerIn: parent
+        }
+
+        MouseArea {
+            anchors.fill: parent
+            onClicked: appInfoRest.stop()
+        }
+    }
+
+    Text {
+        x: 550
+        y: 110
+        width: 80
+        height: 40
+        font.pixelSize: 14
+        text: appInfoRest.cycMin
+    }
+
+    Text {
+        x: 650
+        y: 110
+        width: 80
+        height: 40
+        font.pixelSize: 14
+        text: appInfoRest.cycMax
+    }
+
+	////////////////////////////////////////////////////////////
+
+    Text {
+        x: 50
+        y: 160
+        width: 80
+        height: 40
+        font.pixelSize: 14
+        text: appInfoMqtt.name
+    }
+
+    Text {
+        x: 150
+        y: 160
+        width: 80
+        height: 40
+        font.pixelSize: 14
+        text: appInfoMqtt.stateText
+    }
+
+    Rectangle
+    {
+        x: 250
+        y: 150
+        width: 90
+        height: 40
+        color: "lightgrey"
+
+        Text {
+            text: "Pause"
+	        font.pixelSize: 14
+            anchors.centerIn: parent
+        }
+
+        MouseArea {
+            anchors.fill: parent
+            onClicked: appInfoMqtt.pause()
+        }
+    }
+
+    Rectangle
+    {
+        x: 350
+        y: 150
+        width: 90
+        height: 40
+        color: "lightgrey"
+
+        Text {
+            text: "Resume"
+	        font.pixelSize: 14
+            anchors.centerIn: parent
+        }
+
+        MouseArea {
+            anchors.fill: parent
+            onClicked: appInfoMqtt.resume()
+        }
+    }
+
+    Rectangle
+    {
+        x: 450
+        y: 150
+        width: 90
+        height: 40
+        color: "lightgrey"
+
+        Text {
+            text: "Stop"
+	        font.pixelSize: 14
+            anchors.centerIn: parent
+        }
+
+        MouseArea {
+            anchors.fill: parent
+            onClicked: appInfoMqtt.stop()
+        }
+    }
+
+    Text {
+        x: 550
+        y: 160
+        width: 80
+        height: 40
+        font.pixelSize: 14
+        text: appInfoMqtt.cycMin
+    }
+
+    Text {
+        x: 650
+        y: 160
+        width: 80
+        height: 40
+        font.pixelSize: 14
+        text: appInfoMqtt.cycMax
+    }
+
+	////////////////////////////////////////////////////////////
+
+    Rectangle
+    {
+        x: 50
+        y: 400
+        width: 90
+        height: 40
+        color: "lightgrey"
+
+        Text {
+            text: "Quit"
+	        font.pixelSize: 14
+            anchors.centerIn: parent
+        }
+
+        MouseArea {
+            anchors.fill: parent
+            onClicked: Qt.quit()
+        }
+    }
+}

+ 404 - 0
Test/qmlApp/qappctrl.cpp

@@ -0,0 +1,404 @@
+#include <QTimerEvent>
+#include "qappctrl.h"
+#include "../../src/defines.h"
+
+/////////////////////////////////////////////////////////////////////////////
+
+#define _INVALID_SLOT_INDEX								-1
+#define _APP_CTRL_MAX_SLOTS								((int)(sizeof(appid_t) * 8))
+#define _APP_INDEX_FROM_APP_ID(aid)						(ffsll(aid) - 1)
+#define _IS_POWER_OF_2(x)								(!!(x) && !((x) & ((x) - 1)))
+#define _IS_VALID_APP_ID(i)								_IS_POWER_OF_2(i)
+#define _TIMESPEC_2_US(ts)								(ts.tv_sec * 1000000 + ts.tv_nsec / 1000)
+#define _TIMESPEC_DIFF(ts1, ts2)						(_TIMESPEC_2_US(ts1) - _TIMESPEC_2_US(ts2))
+#define _MIN_TIMER_INT									20
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+QGfaAppInfo::QGfaAppInfo(int nIndex, QObject *pParent) :	QObject(pParent),
+															m_state(GIAS_StateNotRunning),
+															m_nIndex(nIndex),
+															m_cycMin(0),
+															m_cycMax(0)
+{
+	m_nAppID = 1ull << m_nIndex;
+	setStateText(m_state);
+}
+
+QGfaAppInfo::~QGfaAppInfo(void)
+{
+	this->disconnect();		
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+int QGfaAppInfo::state(void) const
+{
+	return m_state;
+}
+
+void QGfaAppInfo::setState(int val)
+{
+	if(m_state != val)
+	{
+		m_state = val;
+		emit stateChanged(val);
+		setStateText(val);
+
+		if((m_state != GIAS_Running) && (m_state != GIAS_Paused))
+		{
+			if(m_cycMin != 0)
+			{
+				m_cycMin = 0;
+				emit cycMinChanged(m_cycMin);
+			}
+
+			if(m_cycMax != 0)
+			{
+				m_cycMax = 0;
+				emit cycMaxChanged(m_cycMax);
+			}
+		}
+	}
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+QString QGfaAppInfo::stateText(void) const
+{
+	return m_stateText;
+}
+
+void QGfaAppInfo::setStateText(int val)
+{
+	QString sval = ::GfaIpcAppCtrlGetStateText((GfaIpcAppStates)val);
+	if(m_stateText != sval)
+	{
+		m_stateText = sval;
+		emit stateTextChanged(sval);
+	}
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+QString QGfaAppInfo::name(void) const
+{
+	return m_name;
+}
+
+void QGfaAppInfo::setName(const QString &val)
+{
+	if(m_name != val)
+	{
+		m_name = val;
+		emit nameChanged(val);
+	}
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+quint64 QGfaAppInfo::cycMin(void) const
+{
+	return m_cycMin;
+}
+
+quint64 QGfaAppInfo::cycMax(void) const
+{
+	return m_cycMax;
+}
+
+void QGfaAppInfo::setAppTimes(LPCGFA_APPCTRL_APPTIMES pat)
+{
+	if(pat)
+	{
+		if(m_cycMin != (quint64)pat->nCycleMin)
+		{
+			m_cycMin = (quint64)pat->nCycleMin;
+			emit cycMinChanged(m_cycMin);
+		}
+
+		if(m_cycMax != (quint64)pat->nCycleMax)
+		{
+			m_cycMax = (quint64)pat->nCycleMax;
+			emit cycMaxChanged(m_cycMax);
+		}
+	}
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+bool QGfaAppInfo::pause(void)
+{
+	emit sendControlMessage(m_nAppID, GFA_APPCTRL_CTRLMSG_PAUSE);
+	return true;
+}
+
+bool QGfaAppInfo::resume(void)
+{
+	emit sendControlMessage(m_nAppID, GFA_APPCTRL_CTRLMSG_RESUME);
+	return true;
+}
+
+bool QGfaAppInfo::stop(void)
+{
+	emit sendControlMessage(m_nAppID, GFA_APPCTRL_CTRLMSG_STOP);
+	return true;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+QGfaAppCtrl::QGfaAppCtrl(QObject *pParent) :	QObject(pParent),
+												m_hAC(NULL),
+												m_nAppID(0),
+												m_nTimerID(0),
+												m_curPass(0),
+												m_minPass(LLONG_MAX),
+												m_maxPass(LLONG_MIN),
+												m_nEvtSrcs(0)
+{
+	for(int i = 0; i < _APP_CTRL_MAX_SLOTS; ++i)
+	{
+		QGfaAppInfo *pai = new QGfaAppInfo(i, this);
+		connect(pai, SIGNAL(sendControlMessage(appid_t, ctrlmsg_t)), SLOT(onSendControlMessage(appid_t, ctrlmsg_t)));
+		m_appInfo.append(pai);
+	}
+}
+
+QGfaAppCtrl::~QGfaAppCtrl(void)
+{
+	Release();
+	for(int i = 0; i < _APP_CTRL_MAX_SLOTS; ++i)
+	{
+		QGfaAppInfo *pai = m_appInfo.at(i);
+		delete pai;
+	}
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+bool QGfaAppCtrl::Create(appid_t nAppID, const char *pszDisplayName, int nTimerIntMs)
+{
+	if(!m_hAC)
+	{
+		if(nTimerIntMs < _MIN_TIMER_INT)
+			nTimerIntMs = _MIN_TIMER_INT;
+
+		if((m_hAC = ::GfaIpcAppCtrlAcquire(nAppID, pszDisplayName, (clock64_t)(nTimerIntMs * 1000 * 2))))
+		{
+			m_nAppID = nAppID;
+			m_nTimerID = startTimer(nTimerIntMs, Qt::CoarseTimer);
+		}
+	}
+
+	return !!m_hAC;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void QGfaAppCtrl::Release(void)
+{
+	if(m_hAC)
+	{
+		killTimer(m_nTimerID);
+		::GfaIpcAppCtrlRelease(m_hAC);
+		m_hAC = NULL;
+	}
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void QGfaAppCtrl::RegisterQmlTypes(QQmlEngine &rEng, int nVerMajor, int nVerMinor)
+{
+	qmlRegisterUncreatableType<QGfaAppInfo>("com.gfa.ipc.appctrl", nVerMajor, nVerMinor, "qAppInfo", QStringLiteral("class not creatable in QML"));
+	qmlRegisterUncreatableType<QGfaAppCtrl>("com.gfa.ipc.appctrl", nVerMajor, nVerMinor, "qAppCtrl", QStringLiteral("class not creatable in QML"));
+	rEng.rootContext()->setContextProperty(QStringLiteral("qAppCtrl"), this);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+bool QGfaAppCtrl::PresetDisplayName(appid_t nAppID, const char *pszName)
+{
+	if(m_hAC)
+		return ::GfaIpcAppCtrlPresetDisplayName(m_hAC, nAppID, pszName);
+	return false;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+bool QGfaAppCtrl::SubscribeStateEvents(appid_t nAppMask)
+{
+	if(m_hAC)
+	{
+		nAppMask &= ~m_nAppID;
+		m_nEvtSrcs |= nAppMask;
+		return ::GfaIpcAppCtrlSubscribeStateEvents(m_hAC, nAppMask);
+	}
+	return false;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void QGfaAppCtrl::timerEvent(QTimerEvent *event)
+{
+	struct timespec	tsStart, tsEnd;
+	::clock_gettime(CLOCK_MONOTONIC, &tsStart);
+
+	if((event->timerId() == m_nTimerID) && m_hAC)
+	{
+		HAPPINFO hAI;
+
+		if((hAI = ::GfaIpcAppCtrlInfoUpdate(m_hAC)))
+		{
+			int b;
+		    ctrlmsg_t nCtrlMsg;
+		    appid_t app, nAppIdSrc;
+			GFA_APPCTRL_APPTIMES at;
+			char szDispName[128];
+
+			while((nCtrlMsg = ::GfaIpcAppCtrlGetNextCtrlMsg(hAI)))
+			{
+				switch(nCtrlMsg)
+				{
+				case GFA_APPCTRL_CTRLMSG_STOP:
+					break;
+				case GFA_APPCTRL_CTRLMSG_PAUSE:
+					break;
+				case GFA_APPCTRL_CTRLMSG_RESUME:
+					break;
+				default:
+					break;
+				}
+			}
+
+			while((nAppIdSrc = ::GfaIpcAppCtrlGetNextStateEvtSrc(hAI)))
+			{
+				GfaIpcAppStates state = ::GfaIpcAppCtrlGetState(m_hAC, nAppIdSrc);
+				int nIndex = appIndexFromAppID(nAppIdSrc);
+				QGfaAppInfo &ai = *m_appInfo[nIndex];
+				ai.setState(state);
+				
+				if((state >= GIAS_StateNotRunning) && (state <= GIAS_Paused))
+				{
+					if(::GfaIpcAppCtrlGetDisplayName(m_hAC, nAppIdSrc, szDispName, sizeof(szDispName)))
+					{
+						ai.setName(szDispName);
+					}
+				}
+
+				switch(nAppIdSrc)
+				{
+				case GFA_APPCTRL_APPID_REMANENT:
+					break;
+				case GFA_APPCTRL_APPID_REST:
+					break;
+				case GFA_APPCTRL_APPID_MQTTCL:
+					break;
+				}
+			}
+			
+			nAppIdSrc = m_nEvtSrcs;
+			
+			while(nAppIdSrc)
+			{
+				b = ffsll(nAppIdSrc) - 1;
+				app = ((appid_t)0x1 << b);
+				nAppIdSrc &= ~app;
+				GfaIpcAppStates state = ::GfaIpcAppCtrlGetState(m_hAC, app);
+				
+				if(state == GIAS_Running)
+				{
+					if(::GfaIpcAppCtrlGetAppTimes(m_hAC, app, &at) >= 0)
+					{
+						QGfaAppInfo &ai = *m_appInfo[b];
+						ai.setAppTimes(&at);
+					}
+				}
+			}
+		}
+	}
+
+	::clock_gettime(CLOCK_MONOTONIC, &tsEnd);
+	m_curPass = _TIMESPEC_DIFF(tsEnd, tsStart);
+	
+	if(m_minPass > m_curPass)
+	{
+		m_minPass = m_curPass;
+		TRACE("Min pass: %llu us\n", m_minPass);
+	}
+
+	if(m_maxPass < m_curPass)
+	{
+		m_maxPass = m_curPass;
+		TRACE("Max pass: %llu us\n", m_maxPass);
+	}
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void QGfaAppCtrl::onSendControlMessage(appid_t nAppID, ctrlmsg_t msg)
+{
+	if(m_hAC)
+		::GfaIpcAppCtrlSendCtrlMsg(m_hAC, nAppID, msg);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+int QGfaAppCtrl::SetState(int nState)
+{
+	if(m_hAC)
+		::GfaIpcAppCtrlSetState(m_hAC, (GfaIpcAppStates)nState);
+	return GIAS_Invalid;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+int QGfaAppCtrl::appIndexFromAppID(quint64 nAppID)
+{
+	if(_IS_VALID_APP_ID(nAppID))
+		return _APP_INDEX_FROM_APP_ID(nAppID);
+	return _INVALID_SLOT_INDEX;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+QQmlListProperty<QGfaAppInfo> QGfaAppCtrl::appInfo(void)
+{
+	return QQmlListProperty<QGfaAppInfo>(this, m_appInfo);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+int QGfaAppCtrl::idxRemanent(void) const
+{
+	static const int i = _APP_INDEX_FROM_APP_ID(GFA_APPCTRL_APPID_REMANENT);
+	return i;
+}
+
+int QGfaAppCtrl::idxDatalogger(void) const
+{
+	static const int i = _APP_INDEX_FROM_APP_ID(GFA_APPCTRL_APPID_DATALOGGER);
+	return i;
+}
+
+int QGfaAppCtrl::idxSummarist(void) const
+{
+	static const int i = _APP_INDEX_FROM_APP_ID(GFA_APPCTRL_APPID_SUMMARIST);
+	return i;
+}
+
+int QGfaAppCtrl::idxRest(void) const
+{
+	static const int i = _APP_INDEX_FROM_APP_ID(GFA_APPCTRL_APPID_REST);
+	return i;
+}
+
+int QGfaAppCtrl::idxMqttCl(void) const
+{
+	static const int i = _APP_INDEX_FROM_APP_ID(GFA_APPCTRL_APPID_MQTTCL);
+	return i;
+}
+

+ 120 - 0
Test/qmlApp/qappctrl.h

@@ -0,0 +1,120 @@
+// qappctrl.h :
+//
+
+#if !defined(AGD_QAPPCTRL_H__ADD46467_F628_4A07_8844_613598E359DE__INCLUDED_)
+#define AGD_QAPPCTRL_H__ADD46467_F628_4A07_8844_613598E359DE__INCLUDED_
+
+#include <QObject>
+#include <QQmlEngine>
+#include <QQmlContext>
+#include <gfaipc.h>
+
+#ifdef __cplusplus
+
+/////////////////////////////////////////////////////////////////////////////
+// qappctrl.h - Declarations:
+
+class QGfaAppInfo : public QObject
+{
+    Q_OBJECT
+	Q_PROPERTY(int state READ state NOTIFY stateChanged)
+	Q_PROPERTY(QString stateText READ stateText NOTIFY stateTextChanged)
+	Q_PROPERTY(QString name READ name NOTIFY nameChanged)
+	Q_PROPERTY(quint64 cycMin READ cycMin NOTIFY cycMinChanged)
+	Q_PROPERTY(quint64 cycMax READ cycMax NOTIFY cycMaxChanged)
+
+public:
+	Q_INVOKABLE bool pause(void);
+	Q_INVOKABLE bool resume(void);
+	Q_INVOKABLE bool stop(void);
+
+signals:
+	void stateChanged(int val);
+	void stateTextChanged(const QString &val);
+	void nameChanged(const QString &val);
+	void sendControlMessage(appid_t nAppID, ctrlmsg_t msg);
+	void cycMinChanged(quint64 val);
+	void cycMaxChanged(quint64 val);
+
+public:
+	explicit QGfaAppInfo(int nIndex, QObject *pParent = NULL);
+	virtual ~QGfaAppInfo(void);
+
+	int state(void) const;
+	void setState(int val);
+
+	QString stateText(void) const;
+	void setStateText(int val);
+
+	QString name(void) const;
+	void setName(const QString &val);
+	
+	quint64 cycMin(void) const;
+	quint64 cycMax(void) const;
+	void setAppTimes(LPCGFA_APPCTRL_APPTIMES pat);
+
+private:
+
+private:
+	int m_state;
+	QString m_stateText;
+	QString m_name;
+	int m_nIndex;
+	appid_t m_nAppID;
+	quint64 m_cycMin;
+	quint64 m_cycMax;
+};
+
+/////////////////////////////////////////////////////////////////////////////
+
+class QGfaAppCtrl : public QObject
+{
+    Q_OBJECT
+    Q_PROPERTY(QQmlListProperty<QGfaAppInfo> appInfo READ appInfo CONSTANT)
+	Q_PROPERTY(int idxRemanent READ idxRemanent CONSTANT)
+	Q_PROPERTY(int idxDatalogger READ idxDatalogger CONSTANT)
+	Q_PROPERTY(int idxSummarist READ idxSummarist CONSTANT)
+	Q_PROPERTY(int idxRest READ idxRest CONSTANT)
+	Q_PROPERTY(int idxMqttCl READ idxMqttCl CONSTANT)
+
+public:
+	explicit QGfaAppCtrl(QObject *pParent = NULL);
+	virtual ~QGfaAppCtrl(void);
+
+	bool Create(appid_t nAppID, const char *pszDisplayName, int nTimerIntMs);
+	void Release(void);
+	void RegisterQmlTypes(QQmlEngine &rEng, int nVerMajor = 1, int nVerMinor = 0);
+	bool PresetDisplayName(appid_t nAppID, const char *pszName);
+	bool SubscribeStateEvents(appid_t nAppMask);
+	int SetState(int nState);
+
+public:
+	Q_INVOKABLE int appIndexFromAppID(quint64 nAppID);
+
+	QQmlListProperty<QGfaAppInfo> appInfo(void);
+	int idxRemanent(void) const;
+	int idxDatalogger(void) const;
+	int idxSummarist(void) const;
+	int idxRest(void) const;
+	int idxMqttCl(void) const;
+
+private slots:
+	void onSendControlMessage(appid_t nAppID, ctrlmsg_t msg);
+
+private:
+	void timerEvent(QTimerEvent *event) override;
+
+private:
+	HAPPCTRL m_hAC;
+	appid_t m_nAppID;
+	int m_nTimerID;
+	QList<QGfaAppInfo*> m_appInfo;
+	clock64_t m_curPass;
+	clock64_t m_minPass;
+	clock64_t m_maxPass;
+	appid_t m_nEvtSrcs;
+};
+
+/////////////////////////////////////////////////////////////////////////////
+#endif	//	__cplusplus
+#endif	//	!defined(AGD_QAPPCTRL_H__ADD46467_F628_4A07_8844_613598E359DE__INCLUDED_)

+ 5 - 0
Test/qmlApp/qml.qrc

@@ -0,0 +1,5 @@
+<RCC>
+    <qresource prefix="/">
+        <file>main.qml</file>
+    </qresource>
+</RCC>

+ 49 - 0
Test/qmlApp/qmlApp.pro

@@ -0,0 +1,49 @@
+QT += quick
+
+CONFIG += c++11
+
+# The following define makes your compiler emit warnings if you use
+# any Qt feature that has been marked deprecated (the exact warnings
+# depend on your compiler). Refer to the documentation for the
+# deprecated API to know how to port your code away from it.
+DEFINES += QT_DEPRECATED_WARNINGS
+
+# You can also make your code fail to compile if it uses deprecated APIs.
+# In order to do so, uncomment the following line.
+# You can also select to disable deprecated APIs only up to a certain version of Qt.
+#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
+
+SOURCES += \
+        main.cpp \
+        qappctrl.cpp
+
+RESOURCES += qml.qrc
+
+# Additional import path used to resolve QML modules in Qt Creator's code model
+QML_IMPORT_PATH =
+
+# Additional import path used to resolve QML modules just for Qt Quick Designer
+QML_DESIGNER_IMPORT_PATH =
+
+CONFIG(debug, debug|release) {
+    QMAKE_CXXFLAGS -= -Os -pthread
+    QMAKE_CFLAGS -= -Os -pthread
+    QMAKE_CXXFLAGS += -D_DEBUG
+    QMAKE_CFLAGS += -D_DEBUG
+	QMAKE_LIBS += -lgfaipcd -pthread
+}
+
+CONFIG(release, debug|release) {
+	QMAKE_LIBS += -lgfaipc -pthread
+}
+
+linux-buildroot-g++ {
+    QMAKE_CXXFLAGS += -D_TARGET_BUILD
+    QMAKE_CFLAGS += -D_TARGET_BUILD
+    target.path += /opt/GfA/ipc/test
+	INSTALLS += target
+}
+
+HEADERS += \
+    qappctrl.h
+

+ 205 - 268
qttest/qttest.pro.user → Test/qmlApp/qmlApp.pro.user

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 4.0.2, 2017-01-25T12:20:18. -->
+<!-- Written by QtCreator 4.11.0, 2020-02-03T13:33:17. -->
 <qtcreator>
  <data>
   <variable>EnvironmentId</variable>
@@ -59,19 +59,17 @@
  <data>
   <variable>ProjectExplorer.Project.Target.0</variable>
   <valuemap type="QVariantMap">
-   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.7.0 GCC 64bit</value>
-   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.7.0 GCC 64bit</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.7.1 GCC 64bit</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.7.1 GCC 64bit</value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.57.gcc_64_kit</value>
    <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
    <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
    <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/wrk/share/gfaipc/qttest/Debug/Desktop_Qt_5_7_0_GCC_64bit</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/wrk/share/gfaipc/Test/qmlApp/Debug/Desktop_Qt_5_7_1_GCC_64bit</value>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
       <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
       <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
@@ -81,57 +79,45 @@
      </valuemap>
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
-      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
-       <value type="QString">-w</value>
-       <value type="QString">-r</value>
-      </valuelist>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
       <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
       <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
       <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
      </valuemap>
      <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Erstellen</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Erstellen</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
     </valuemap>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
-      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
-       <value type="QString">-w</value>
-       <value type="QString">-r</value>
-      </valuelist>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
       <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
       <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
       <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
      </valuemap>
      <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Bereinigen</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Bereinigen</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
     </valuemap>
     <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
     <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
     <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Debug</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
     <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
-    <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
    </valuemap>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/wrk/share/gfaipc/qttest/Release/Desktop_Qt_5_7_0_GCC_64bit</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/wrk/share/gfaipc/Test/qmlApp/Release/Desktop_Qt_5_7_1_GCC_64bit</value>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
       <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
       <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
@@ -141,126 +127,71 @@
      </valuemap>
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
-      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
-       <value type="QString">-w</value>
-       <value type="QString">-r</value>
-      </valuelist>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
       <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
       <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
       <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
      </valuemap>
      <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Erstellen</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Erstellen</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
     </valuemap>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
-      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
-       <value type="QString">-w</value>
-       <value type="QString">-r</value>
-      </valuelist>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
       <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
       <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
       <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
      </valuemap>
      <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Bereinigen</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Bereinigen</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
     </valuemap>
     <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
     <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
     <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Release</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
     <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
-    <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
    </valuemap>
-   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/wrk/share/gfaipc/qttest/Profile/Desktop_Qt_5_7_0_GCC_64bit</value>
-    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
-      <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
-      <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
-      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
-      <value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">true</value>
-      <value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
-     </valuemap>
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
-      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
-       <value type="QString">-w</value>
-       <value type="QString">-r</value>
-      </valuelist>
-      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
-      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
-      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
-     </valuemap>
-     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
-    </valuemap>
-    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
-      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
-       <value type="QString">-w</value>
-       <value type="QString">-r</value>
-      </valuelist>
-      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
-      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
-      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
-     </valuemap>
-     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Bereinigen</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
-    </valuemap>
-    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
-    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
-    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Profile</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
-    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
-    <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
-   </valuemap>
-   <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
+   <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">2</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
      <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deployment</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
     </valuemap>
     <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Lokales Deployment</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
    </valuemap>
    <value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
+    <value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
+    <valuelist type="QVariantList" key="Analyzer.Perf.Events">
+     <value type="QString">cpu-cycles</value>
+    </valuelist>
+    <valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/>
+    <value type="int" key="Analyzer.Perf.Frequency">250</value>
+    <valuelist type="QVariantList" key="Analyzer.Perf.RecordArguments">
+     <value type="QString">-e</value>
+     <value type="QString">cpu-cycles</value>
+     <value type="QString">--call-graph</value>
+     <value type="QString">dwarf,4096</value>
+     <value type="QString">-F</value>
+     <value type="QString">250</value>
+    </valuelist>
+    <value type="QString" key="Analyzer.Perf.SampleMode">-F</value>
+    <value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
+    <value type="int" key="Analyzer.Perf.StackSize">4096</value>
     <value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
     <value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
     <value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
@@ -275,6 +206,7 @@
     <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
     <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
     <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
+    <value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value>
     <value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
     <value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
     <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
@@ -302,21 +234,19 @@
     </valuelist>
     <value type="int" key="PE.EnvironmentAspect.Base">2</value>
     <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qttest</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/home/wrk/share/gfaipc/qttest/qttest.pro</value>
-    <value type="bool" key="QmakeProjectManager.QmakeRunConfiguration.UseLibrarySearchPath">true</value>
-    <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments"></value>
-    <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.ProFile">qttest.pro</value>
-    <value type="bool" key="Qt4ProjectManager.Qt4RunConfiguration.UseDyldImageSuffix">false</value>
-    <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory"></value>
-    <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory.default">/home/wrk/share/gfaipc/qttest/Debug/Desktop_Qt_5_7_0_GCC_64bit</value>
-    <value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/home/wrk/share/gfaipc/Test/qmlApp/qmlApp.pro</value>
+    <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/home/wrk/share/gfaipc/Test/qmlApp/qmlApp.pro</value>
+    <value type="QString" key="RunConfiguration.Arguments"></value>
+    <value type="bool" key="RunConfiguration.Arguments.multi">false</value>
+    <value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
     <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
+    <value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
     <value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
     <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
+    <value type="QString" key="RunConfiguration.WorkingDirectory"></value>
+    <value type="QString" key="RunConfiguration.WorkingDirectory.default">/home/wrk/share/gfaipc/Test/qmlApp/Debug/Desktop_Qt_5_7_1_GCC_64bit</value>
    </valuemap>
    <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
   </valuemap>
@@ -324,19 +254,17 @@
  <data>
   <variable>ProjectExplorer.Project.Target.1</variable>
   <valuemap type="QVariantMap">
-   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">GfA-Device</value>
-   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">GfA-Device</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Sitara 1</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Sitara 1</value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{b0a415a1-ecbe-4123-8afc-05ffc0004131}</value>
    <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
    <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
    <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/wrk/share/gfaipc/qttest/Debug/GfA_Device</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/wrk/share/gfaipc/Test/qmlApp/Debug/Sitara_1</value>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
       <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
       <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
@@ -346,57 +274,45 @@
      </valuemap>
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
-      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
-       <value type="QString">-w</value>
-       <value type="QString">-r</value>
-      </valuelist>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
       <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
       <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
       <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
      </valuemap>
      <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Erstellen</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Erstellen</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
     </valuemap>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
-      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
-       <value type="QString">-w</value>
-       <value type="QString">-r</value>
-      </valuelist>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
       <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
       <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
       <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
      </valuemap>
      <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Bereinigen</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Bereinigen</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
     </valuemap>
     <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
     <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
     <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Debug</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
     <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
-    <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
    </valuemap>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/wrk/share/gfaipc/qttest/Release/GfA_Device</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/wrk/share/gfaipc/Test/qmlApp/Release/Sitara_1</value>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
       <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
       <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
@@ -406,162 +322,179 @@
      </valuemap>
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
-      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
-       <value type="QString">-w</value>
-       <value type="QString">-r</value>
-      </valuelist>
-      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
-      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
-      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
-     </valuemap>
-     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
-    </valuemap>
-    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
-      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
-       <value type="QString">-w</value>
-       <value type="QString">-r</value>
-      </valuelist>
-      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
-      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
-      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
-     </valuemap>
-     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Bereinigen</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
-    </valuemap>
-    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
-    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
-    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Release</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
-    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
-    <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
-   </valuemap>
-   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/wrk/share/gfaipc/qttest/Profile/GfA_Device</value>
-    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
-      <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
-      <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
-      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
-      <value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">true</value>
-      <value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
-     </valuemap>
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
-      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
-       <value type="QString">-w</value>
-       <value type="QString">-r</value>
-      </valuelist>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
       <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
       <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
       <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
      </valuemap>
      <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Erstellen</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Erstellen</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
     </valuemap>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
-      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
-       <value type="QString">-w</value>
-       <value type="QString">-r</value>
-      </valuelist>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.BuildTargets"/>
       <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
       <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
       <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.OverrideMakeflags">false</value>
      </valuemap>
      <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Bereinigen</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Bereinigen</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
     </valuemap>
     <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
     <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
     <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Profile</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
     <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
-    <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
    </valuemap>
-   <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
+   <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">2</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Freien Plattenplatz überprüfen</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">RemoteLinux.CheckForFreeDiskSpaceStep</value>
-      <valuelist type="QVariantList" key="Qt4ProjectManager.MaemoRunConfiguration.LastDeployedFiles"/>
-      <valuelist type="QVariantList" key="Qt4ProjectManager.MaemoRunConfiguration.LastDeployedHosts"/>
-      <valuelist type="QVariantList" key="Qt4ProjectManager.MaemoRunConfiguration.LastDeployedRemotePaths"/>
-      <valuelist type="QVariantList" key="Qt4ProjectManager.MaemoRunConfiguration.LastDeployedSysroots"/>
-      <valuelist type="QVariantList" key="Qt4ProjectManager.MaemoRunConfiguration.LastDeployedTimes"/>
+      <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedFiles"/>
+      <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedHosts"/>
+      <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedRemotePaths"/>
+      <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedSysroots"/>
       <value type="QString" key="RemoteLinux.CheckForFreeDiskSpaceStep.PathToCheck">/</value>
-      <value type="qulonglong" key="RemoteLinux.CheckForFreeDiskSpaceStep.RequiredSpace">5242880</value>
+      <value type="qlonglong" key="RemoteLinux.CheckForFreeDiskSpaceStep.RequiredSpace">5242880</value>
+      <valuelist type="QVariantList" key="RemoteLinux.LastDeployedLocalTimes"/>
+      <valuelist type="QVariantList" key="RemoteLinux.LastDeployedRemoteTimes"/>
      </valuemap>
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Dateien mittels SFTP hochladen</value>
-      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">RemoteLinux.KillAppStep</value>
+      <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedFiles"/>
+      <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedHosts"/>
+      <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedRemotePaths"/>
+      <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedSysroots"/>
+      <valuelist type="QVariantList" key="RemoteLinux.LastDeployedLocalTimes"/>
+      <valuelist type="QVariantList" key="RemoteLinux.LastDeployedRemoteTimes"/>
+     </valuemap>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.2">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">RemoteLinux.DirectUploadStep</value>
-      <valuelist type="QVariantList" key="Qt4ProjectManager.MaemoRunConfiguration.LastDeployedFiles">
-       <value type="QString">/home/wrk/share/gfaipc/qttest/Debug/GfA_Device/qttest</value>
-      </valuelist>
-      <valuelist type="QVariantList" key="Qt4ProjectManager.MaemoRunConfiguration.LastDeployedHosts">
-       <value type="QString">192.168.0.125</value>
-      </valuelist>
-      <valuelist type="QVariantList" key="Qt4ProjectManager.MaemoRunConfiguration.LastDeployedRemotePaths">
-       <value type="QString">/root/gfaipc</value>
-      </valuelist>
-      <valuelist type="QVariantList" key="Qt4ProjectManager.MaemoRunConfiguration.LastDeployedSysroots">
-       <value type="QString">/opt/GfA/T_C49xL448RT_Qt57x/usr/arm-buildroot-linux-gnueabihf/sysroot</value>
-      </valuelist>
-      <valuelist type="QVariantList" key="Qt4ProjectManager.MaemoRunConfiguration.LastDeployedTimes">
-       <value type="QDateTime">2016-11-18T22:25:49</value>
-      </valuelist>
+      <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedFiles"/>
+      <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedHosts"/>
+      <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedRemotePaths"/>
+      <valuelist type="QVariantList" key="ProjectExplorer.RunConfiguration.LastDeployedSysroots"/>
       <value type="bool" key="RemoteLinux.GenericDirectUploadStep.IgnoreMissingFiles">false</value>
       <value type="bool" key="RemoteLinux.GenericDirectUploadStep.Incremental">true</value>
+      <valuelist type="QVariantList" key="RemoteLinux.LastDeployedLocalTimes"/>
+      <valuelist type="QVariantList" key="RemoteLinux.LastDeployedRemoteTimes"/>
      </valuemap>
-     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deployment</value>
-     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">3</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
     </valuemap>
     <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Auf Linux-Mobilgerät ausführen</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">DeployToGenericLinux</value>
    </valuemap>
    <value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
+    <value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
+    <valuelist type="QVariantList" key="Analyzer.Perf.Events">
+     <value type="QString">cpu-cycles</value>
+    </valuelist>
+    <valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/>
+    <value type="int" key="Analyzer.Perf.Frequency">250</value>
+    <valuelist type="QVariantList" key="Analyzer.Perf.RecordArguments">
+     <value type="QString">-e</value>
+     <value type="QString">cpu-cycles</value>
+     <value type="QString">--call-graph</value>
+     <value type="QString">dwarf,4096</value>
+     <value type="QString">-F</value>
+     <value type="QString">250</value>
+    </valuelist>
+    <value type="QString" key="Analyzer.Perf.SampleMode">-F</value>
+    <value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
+    <value type="int" key="Analyzer.Perf.StackSize">4096</value>
+    <value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
+    <value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
+    <value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
+    <value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
+    <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
+    <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
+    <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
+    <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
+    <value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value>
+    <value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
+    <value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
+    <value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
+    <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
+    <value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
+    <value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
+    <value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
+     <value type="int">0</value>
+     <value type="int">1</value>
+     <value type="int">2</value>
+     <value type="int">3</value>
+     <value type="int">4</value>
+     <value type="int">5</value>
+     <value type="int">6</value>
+     <value type="int">7</value>
+     <value type="int">8</value>
+     <value type="int">9</value>
+     <value type="int">10</value>
+     <value type="int">11</value>
+     <value type="int">12</value>
+     <value type="int">13</value>
+     <value type="int">14</value>
+    </valuelist>
+    <value type="int" key="PE.EnvironmentAspect.Base">2</value>
+    <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
+    <value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.Executable"></value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value>
+    <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey"></value>
+    <value type="QString" key="RunConfiguration.Arguments"></value>
+    <value type="bool" key="RunConfiguration.Arguments.multi">false</value>
+    <value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
+    <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
+    <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
+    <value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
+    <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
+    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
+    <value type="QString" key="RunConfiguration.WorkingDirectory"></value>
+    <value type="QString" key="RunConfiguration.WorkingDirectory.default"></value>
+   </valuemap>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.1">
+    <value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
+    <valuelist type="QVariantList" key="Analyzer.Perf.Events">
+     <value type="QString">cpu-cycles</value>
+    </valuelist>
+    <valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/>
+    <value type="int" key="Analyzer.Perf.Frequency">250</value>
+    <valuelist type="QVariantList" key="Analyzer.Perf.RecordArguments">
+     <value type="QString">-e</value>
+     <value type="QString">cpu-cycles</value>
+     <value type="QString">--call-graph</value>
+     <value type="QString">dwarf,4096</value>
+     <value type="QString">-F</value>
+     <value type="QString">250</value>
+    </valuelist>
+    <value type="QString" key="Analyzer.Perf.SampleMode">-F</value>
+    <value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
+    <value type="int" key="Analyzer.Perf.StackSize">4096</value>
     <value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
     <value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
     <value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
@@ -576,6 +509,7 @@
     <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
     <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
     <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
+    <value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value>
     <value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
     <value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
     <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
@@ -603,22 +537,25 @@
     </valuelist>
     <value type="int" key="PE.EnvironmentAspect.Base">1</value>
     <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qttest (auf Mobilgerät)</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">RemoteLinuxRunConfiguration:qttest</value>
-    <value type="QString" key="Qt4ProjectManager.MaemoRunConfiguration.Arguments"></value>
-    <value type="QString" key="Qt4ProjectManager.MaemoRunConfiguration.TargetName">qttest</value>
-    <value type="QString" key="RemoteLinux.RunConfig.AlternateRemoteExecutable"></value>
-    <value type="bool" key="RemoteLinux.RunConfig.UseAlternateRemoteExecutable">false</value>
-    <value type="QString" key="RemoteLinux.RunConfig.WorkingDirectory"></value>
-    <value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">RemoteLinux.CustomRunConfig</value>
+    <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey"></value>
+    <value type="QString" key="RemoteLinux.CustomRunConfig.LocalExecutable"></value>
+    <value type="QString" key="RemoteLinux.CustomRunConfig.RemoteExecutable"></value>
+    <value type="int" key="RemoteLinux.EnvironmentAspect.Version">1</value>
+    <value type="QString" key="RunConfiguration.Arguments"></value>
+    <value type="bool" key="RunConfiguration.Arguments.multi">false</value>
+    <value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
     <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
-    <value type="bool" key="RunConfiguration.UseMultiProcess">true</value>
+    <value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
     <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
+    <value type="bool" key="RunConfiguration.UseX11Forwarding">false</value>
+    <value type="QString" key="RunConfiguration.WorkingDirectory"></value>
+    <value type="QString" key="RunConfiguration.WorkingDirectory.default"></value>
+    <value type="QString" key="RunConfiguration.X11Forwarding">:0</value>
    </valuemap>
-   <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
+   <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">2</value>
   </valuemap>
  </data>
  <data>
@@ -627,10 +564,10 @@
  </data>
  <data>
   <variable>ProjectExplorer.Project.Updater.FileVersion</variable>
-  <value type="int">18</value>
+  <value type="int">22</value>
  </data>
  <data>
   <variable>Version</variable>
-  <value type="int">18</value>
+  <value type="int">22</value>
  </data>
 </qtcreator>

+ 1 - 1
gfaipc.pro.user

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 4.11.0, 2020-01-31T15:55:28. -->
+<!-- Written by QtCreator 4.11.0, 2020-02-06T09:10:40. -->
 <qtcreator>
  <data>
   <variable>EnvironmentId</variable>

+ 0 - 51
qttest/main.c

@@ -1,51 +0,0 @@
-#include <stdio.h>
-#include <unistd.h>
-#include <gfaipc.h>
-
-#define _UNUSED(v)				v = v
-
-typedef struct _TESTSTRUCT
-{
-    int nCounter1;
-    int nCounter2;
-}TESTSTRUCT, *LPTESTSTRUCT;
-typedef const TESTSTRUCT *LPCTESTSTRUCT;
-
-#define _UUID_TESTSTRUCT			"8c2e723a-5556-4d90-b5ed-bba8575b6f28"
-
-int main(int argc, char *argv[])
-{
-    static HSHM hShm = NULL;
-    LPTESTSTRUCT p = NULL;
-
-    _UNUSED(argc);
-    _UNUSED(argv);
-
-    hShm = GfaIpcAcquireSHM(_UUID_TESTSTRUCT, sizeof(TESTSTRUCT), 1, "Teststruct");
-
-    if(hShm)
-    {
-        p = (LPTESTSTRUCT)GfaIpcAcquirePointer(hShm);
-
-        GfaIpcLockSHM(hShm);
-        printf("In Lock 1!\n");
-
-        GfaIpcLockSHM(hShm);
-        printf("In Lock 2!\n");
-
-        sleep(10);
-
-        GfaIpcUnlockSHM(hShm);
-        printf("Out of Lock 2!\n");
-
-        sleep(2);
-
-        GfaIpcUnlockSHM(hShm);
-        printf("Out of Lock 1!\n");
-
-        GfaIpcReleasePointer(hShm, p);
-        GfaIpcReleaseSHM(hShm);
-    }
-
-    return 0;
-}

+ 0 - 11
qttest/qttest.pro

@@ -1,11 +0,0 @@
-TEMPLATE = app
-CONFIG += console
-CONFIG -= app_bundle
-CONFIG -= qt
-
-QMAKE_LIBS += -lgfaipcd -lpthread
-
-target.path = /root/gfaipc
-INSTALLS += target
-
-SOURCES += main.c

+ 125 - 27
src/appctrl.cpp

@@ -3,10 +3,16 @@
 #include <errno.h>
 #include <unistd.h>
 #include <linux/limits.h>
+#include <sys/types.h>
+#include <sys/wait.h>
 #include "defines.h"
 #include "uuid.h"
 #include "appctrl.h"
 
+/////////////////////////////////////////////////////////////////////////////
+
+#define _countof(a)								(sizeof(a) / sizeof(*a))
+
 #define _INVALID_SLOT_INDEX						-1
 #define _IS_POWER_OF_2(x)						(!!(x) && !((x) & ((x) - 1)))
 #define _IS_VALID_SLOT_INDEX(i)					((i) >= 0) && ((i) < _APP_CTRL_MAX_SLOTS)
@@ -17,6 +23,18 @@
 #define _TIMESPEC_2_US(ts)						(ts.tv_sec * 1000000 + ts.tv_nsec / 1000)
 #define _TIMESPEC_DIFF(ts1, ts2)				(_TIMESPEC_2_US(ts1) - _TIMESPEC_2_US(ts2))
 #define _APP_CTRL_MAX_MSG_BITS					((int)(sizeof(ctrlmsg_t) * 8))
+#define _IS_KNOWN_APP_INDEX(i)					(((i) >= 0) && ((i) < (int)_countof(g_pszKnownAppNames)))
+
+/////////////////////////////////////////////////////////////////////////////
+
+static const char *g_pszKnownAppNames[] =
+{
+	"Remanent",
+	"Datalogger",
+	"Summarist",
+	"REST",
+	"MqttCl"
+};
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
@@ -121,6 +139,13 @@ bool CAppCtrl::Create(appid_t nAppID, const char *pszDisplayName, clock64_t nMax
 			{
 				if(!strcmp(proc.szAppPath, szAppPath))
 				{
+					pid_t pid = getpgid(proc.pid);
+					
+					if((pid < 0) && (errno == ESRCH))
+					{
+						Release();
+						return Create(nAppID, pszDisplayName, nMaxHeartbeatDelay);
+					}
 				}
 				else
 				{
@@ -206,7 +231,7 @@ appid_t CAppCtrl::GetRunningAppsMask(void)
 
 /////////////////////////////////////////////////////////////////////////////
 
-LPAPP_CTRL_INFO CAppCtrl::AppInfoUpdate(bool bUpdateHeartbeat)
+LPAPP_CTRL_INFO CAppCtrl::AppInfoUpdate(void)
 {
 	if(m_hShm)
 	{
@@ -223,7 +248,7 @@ LPAPP_CTRL_INFO CAppCtrl::AppInfoUpdate(bool bUpdateHeartbeat)
 		proc.nHeartbeatLast = proc.nHeartbeatCur;
 		proc.nHeartbeatCur = _TIMESPEC_2_US(tsHeartBeat);
 
-		if(bUpdateHeartbeat && proc.nHeartbeatLast)
+		if((proc.state == GIAS_Running) && proc.nHeartbeatLast)
 		{
 			proc.at.nCycleLast = proc.nHeartbeatCur - proc.nHeartbeatLast;
 			if((proc.at.nCycleMin > proc.at.nCycleLast) || !proc.at.nCycleMin)
@@ -243,25 +268,43 @@ LPAPP_CTRL_INFO CAppCtrl::AppInfoUpdate(bool bUpdateHeartbeat)
 				int b = ffsll(src) - 1;
 				app = ((appid_t)0x1 << b);
 				src &= ~app;
+				GfaIpcAppStates state = GetAppState(app);
+				APP_CTRL_PROCESS &rhp = m_pAppCtrl->proc[b];
+				
+				if(rhp.pid)
+				{
+					pid_t pid = getpgid(rhp.pid);
+
+					if((pid < 0) && (errno == ESRCH))
+					{
+						proc.nHangingApps &= ~app;
+						AppStateChanged(app, rhp.state, GIAS_StateNotRunning);
+						memset(&rhp, 0, sizeof(rhp));
+						continue;
+					}
+				}
 
-				if((clk = GetAppTimes(app, &at)) >= 0)
+				if((state == GIAS_Running) || (proc.nHangingApps & app))
 				{
-					if(at.nMaxHeartbeatDelay > 0)
+					if((clk = GetAppTimes(app, &at)) >= 0)
 					{
-						if(clk > at.nMaxHeartbeatDelay)
+						if(at.nMaxHeartbeatDelay > 0)
 						{
-							if(!(proc.nHangingApps & app))
+							if(clk > at.nMaxHeartbeatDelay)
 							{
-								proc.nHangingApps |= app;
-								m_ai.nStateEvtPending |= app;
+								if(!(proc.nHangingApps & app))
+								{
+									proc.nHangingApps |= app;
+									m_ai.nStateEvtPending |= app;
+								}
 							}
-						}
-						else
-						{
-							if(proc.nHangingApps & app)
+							else
 							{
-								proc.nHangingApps &= ~app;
-								m_ai.nStateEvtPending |= app;
+								if(proc.nHangingApps & app)
+								{
+									proc.nHangingApps &= ~app;
+									m_ai.nStateEvtPending |= app;
+								}
 							}
 						}
 					}
@@ -304,6 +347,26 @@ GfaIpcAppStates CAppCtrl::GetAppState(appid_t nAppID)
 
 /////////////////////////////////////////////////////////////////////////////
 
+const char* CAppCtrl::GetStateText(GfaIpcAppStates state)
+{
+	static const char *pszStateNames[] =
+	{
+		"Not running",
+		"Initializing",
+		"Running",
+		"Paused",
+		"Hanging",
+		"Terminating",
+		"Invalid"
+	};
+
+	if(state >= GIAS_StateNotRunning && state <= GIAS_Invalid)
+		return pszStateNames[state];
+	return "n/a";
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
 GfaIpcAppStates CAppCtrl::SetAppState(GfaIpcAppStates state)
 {
 	GfaIpcAppStates ret = GIAS_Invalid;
@@ -317,7 +380,7 @@ GfaIpcAppStates CAppCtrl::SetAppState(GfaIpcAppStates state)
 		if(ret != state)
 		{
 			proc.state = state;
-			AppStateChanged(ret, state);
+			AppStateChanged(m_nAppID, ret, state);
 		}
 	}
 
@@ -342,6 +405,9 @@ const char* CAppCtrl::GetDisplayName(appid_t nAppID, char *pszName, size_t nCChN
 
 			if(!nLen)
 			{
+				if(GetKnownAppDisplayName(nAppID, pszName, nCChName))
+					return pszName;
+					
 				nLen = sprintf(szUnknown, "APP %02d", nIndex + 1);
 				pszTmp = szUnknown;
 			}
@@ -383,6 +449,30 @@ bool CAppCtrl::PresetDisplayName(appid_t nAppID, const char *pszName)
 
 /////////////////////////////////////////////////////////////////////////////
 
+const char* CAppCtrl::GetKnownAppDisplayName(appid_t nAppID, char *pszName, size_t nCChName)
+{
+	if(pszName && nCChName)
+	{
+		int nIndex = SlotIndexFromAppID(nAppID);
+		
+		if(_IS_KNOWN_APP_INDEX(nIndex))
+		{
+			const char *pszTmp = g_pszKnownAppNames[nIndex];
+			size_t nLen = strlen(pszTmp);
+
+			if(nLen < nCChName)
+			{
+				strcpy(pszName, pszTmp);
+				return pszName;
+			}
+		}
+	}
+
+	return NULL;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
 bool CAppCtrl::SubscribeStateEvents(appid_t nAppMask)
 {
 	if(m_hShm)
@@ -503,7 +593,7 @@ int CAppCtrl::SlotIndexFromAppID(appid_t nAppID)
 
 /////////////////////////////////////////////////////////////////////////////
 
-void CAppCtrl::AppStateChanged(GfaIpcAppStates oldState, GfaIpcAppStates newState)
+void CAppCtrl::AppStateChanged(appid_t nAppID, GfaIpcAppStates oldState, GfaIpcAppStates newState)
 {
 	UNUSED(oldState);
 	UNUSED(newState);
@@ -511,20 +601,13 @@ void CAppCtrl::AppStateChanged(GfaIpcAppStates oldState, GfaIpcAppStates newStat
 	for(int i = 0; i < _APP_CTRL_MAX_SLOTS; ++i)
 	{
 		APP_CTRL_PROCESS &proc = m_pAppCtrl->proc[i];
-		if(_IS_VALID_APP_ID(proc.nAppID) && (proc.nStateEvtSources & m_nAppID))
+		if(_IS_VALID_APP_ID(proc.nAppID) && (proc.nStateEvtSources & nAppID))
 		{
-			proc.nStateEvtPending |= m_nAppID;
+			proc.nStateEvtPending |= nAppID;
 		}
 	}
 }
 
-clock64_t CAppCtrl::TimespecDiff(const struct timespec &ts1, const struct timespec &ts2)
-{
-	clock64_t ti1 = _TIMESPEC_2_US(ts1);
-	clock64_t ti2 = _TIMESPEC_2_US(ts2);
-	return ti1 - ti2;
-}
-
 /////////////////////////////////////////////////////////////////////////////
 
 void CAppCtrl::Lock(void)
@@ -584,11 +667,11 @@ void GfaIpcAppCtrlRelease(HAPPCTRL hAC)
 
 /////////////////////////////////////////////////////////////////////////////
 
-HAPPINFO GfaIpcAppCtrlInfoUpdate(HAPPCTRL hAC, bool bUpdateHeartbeat)
+HAPPINFO GfaIpcAppCtrlInfoUpdate(HAPPCTRL hAC)
 {
 	CAppCtrl *p = reinterpret_cast<CAppCtrl*>(hAC);
 	if(p)
-		return reinterpret_cast<HAPPINFO>(p->AppInfoUpdate(bUpdateHeartbeat));
+		return reinterpret_cast<HAPPINFO>(p->AppInfoUpdate());
 	return NULL;
 }
 
@@ -610,6 +693,11 @@ GfaIpcAppStates GfaIpcAppCtrlSetState(HAPPCTRL hAC, GfaIpcAppStates state)
 	return GIAS_Invalid;
 }
 
+const char* GfaIpcAppCtrlGetStateText(GfaIpcAppStates state)
+{
+	return CAppCtrl::GetStateText(state);
+}
+
 /////////////////////////////////////////////////////////////////////////////
 
 const char* GfaIpcAppCtrlGetDisplayName(HAPPCTRL hAC, appid_t nAppID, char *pszName, size_t nCChName)
@@ -652,6 +740,16 @@ bool GfaIpcAppCtrlSubscribeStateEvents(HAPPCTRL hAC, appid_t nAppMask)
 
 /////////////////////////////////////////////////////////////////////////////
 
+bool GfaIpcAppCtrlUnsubscribeStateEvents(HAPPCTRL hAC, appid_t nAppMask)
+{
+	CAppCtrl *p = reinterpret_cast<CAppCtrl*>(hAC);
+	if(p)
+		return p->UnsubscribeStateEvents(nAppMask);
+	return false;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
 appid_t GfaIpcAppCtrlGetPendingStateEvents(HAPPCTRL hAC)
 {
 	CAppCtrl *p = reinterpret_cast<CAppCtrl*>(hAC);

+ 5 - 3
src/appctrl.h

@@ -91,16 +91,18 @@ public:
 	~CAppCtrl(void);
 	
 	static const char* GetAppPath(char *pszPath, size_t nCChPath, pid_t pid = 0);
+	static const char* GetStateText(GfaIpcAppStates state);
 
 
 	bool Create(appid_t nAppID, const char *pszDisplayName, clock64_t nMaxHeartbeatDelay);
 	void Release(bool bResetSlot = true);
 
 	appid_t GetRunningAppsMask(void);
-	LPAPP_CTRL_INFO AppInfoUpdate(bool bUpdateHeartbeat);
+	LPAPP_CTRL_INFO AppInfoUpdate(void);
 
 	GfaIpcAppStates GetAppState(appid_t nAppID);
 	GfaIpcAppStates SetAppState(GfaIpcAppStates state);
+	static const char* GetAppStateText(GfaIpcAppStates state);
 	
 	const char* GetDisplayName(appid_t nAppID, char *pszName, size_t nCChName);
 	bool PresetDisplayName(appid_t nAppID, const char *pszName);
@@ -116,8 +118,8 @@ public:
 
 private:
 	int SlotIndexFromAppID(appid_t nAppID);
-	void AppStateChanged(GfaIpcAppStates oldState, GfaIpcAppStates newState);
-	static clock64_t TimespecDiff(const struct timespec &ts1, const struct timespec &ts2);
+	void AppStateChanged(appid_t nAppID, GfaIpcAppStates oldState, GfaIpcAppStates newState);
+	const char* GetKnownAppDisplayName(appid_t nAppID, char *pszName, size_t nCChName);
 
 	void Lock(void);
 	void Unlock(void);

+ 6 - 1
src/gfaipc.h

@@ -58,6 +58,8 @@ typedef long long									clock64_t;
 #define GFA_APPCTRL_APPID_REST						GFA_APPCTRL_MAKE_APPID(3)
 #define GFA_APPCTRL_APPID_MQTTCL					GFA_APPCTRL_MAKE_APPID(4)
 
+#define GFA_APPCTRL_APPID_ALL_GFA					(GFA_APPCTRL_APPID_REMANENT | GFA_APPCTRL_APPID_DATALOGGER | GFA_APPCTRL_APPID_SUMMARIST | GFA_APPCTRL_APPID_REST | GFA_APPCTRL_APPID_MQTTCL)
+
 /////////////////////////////////////////////////////////////////////////////
 
 #define GFA_APPCTRL_CTRLMSG_STOP					GFA_APPCTRL_MAKE_CTRLMSG(0)
@@ -166,7 +168,7 @@ HAPPCTRL		GfaIpcAppCtrlAcquire			(appid_t nAppID, const char *pszDisplayName, cl
 void			GfaIpcAppCtrlRelease			(HAPPCTRL hAC);
 
 appid_t			GfaIpcAppCtrlGetRunningMask		(HAPPCTRL hAC);
-HAPPINFO		GfaIpcAppCtrlInfoUpdate			(HAPPCTRL hAC, bool bUpdateHeartbeat);
+HAPPINFO		GfaIpcAppCtrlInfoUpdate			(HAPPCTRL hAC);
 
 GfaIpcAppStates	GfaIpcAppCtrlGetState			(HAPPCTRL hAC, appid_t nAppID);
 GfaIpcAppStates	GfaIpcAppCtrlSetState			(HAPPCTRL hAC, GfaIpcAppStates state);
@@ -175,6 +177,7 @@ const char*		GfaIpcAppCtrlGetDisplayName		(HAPPCTRL hAC, appid_t nAppID, char *p
 bool			GfaIpcAppCtrlPresetDisplayName	(HAPPCTRL hAC, appid_t nAppID, const char *pszName);
 
 bool			GfaIpcAppCtrlSubscribeStateEvents	(HAPPCTRL hAC, appid_t nAppMask);
+bool			GfaIpcAppCtrlUnsubscribeStateEvents	(HAPPCTRL hAC, appid_t nAppMask);
 appid_t			GfaIpcAppCtrlGetPendingStateEvents	(HAPPCTRL hAC);
 
 bool			GfaIpcAppCtrlSendCtrlMsg		(HAPPCTRL hAC, appid_t nAppID, ctrlmsg_t msg);
@@ -187,6 +190,8 @@ clock64_t		GfaIpcAppCtrlGetAppTimes		(HAPPCTRL hAC, appid_t nAppID, LPGFA_APPCTR
 ctrlmsg_t		GfaIpcAppCtrlGetNextCtrlMsg		(HAPPINFO hAI);
 appid_t			GfaIpcAppCtrlGetNextStateEvtSrc	(HAPPINFO hAI);
 
+const char*		GfaIpcAppCtrlGetStateText		(GfaIpcAppStates state);
+
 /////////////////////////////////////////////////////////////////////////////
 #ifdef __cplusplus
 }