瀏覽代碼

CPU-Info und andere Änderungen.

Rind 5 年之前
父節點
當前提交
8451cfb38e
共有 17 個文件被更改,包括 1843 次插入739 次删除
  1. 99 99
      Test/Test.pro.user
  2. 19 0
      Test/app1/app.h
  3. 0 13
      Test/app1/app1.pro
  4. 19 0
      Test/app2/app.h
  5. 0 13
      Test/app2/app2.pro
  6. 19 0
      Test/app3/app.h
  7. 0 13
      Test/app3/app3.pro
  8. 45 22
      Test/main.cpp
  9. 5 4
      Test/qmlApp/main.cpp
  10. 1100 293
      Test/qmlApp/main.qml
  11. 242 88
      Test/qmlApp/qappctrl.cpp
  12. 62 15
      Test/qmlApp/qappctrl.h
  13. 7 2
      Test/test.pri
  14. 133 133
      gfaipc.pro.user
  15. 64 32
      src/appctrl.cpp
  16. 6 4
      src/appctrl.h
  17. 23 8
      src/gfaipc.h

+ 99 - 99
Test/Test.pro.user

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE QtCreatorProject>
 <!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 4.11.0, 2020-02-06T09:10:39. -->
+<!-- Written by QtCreator 4.11.1, 2020-02-15T05:35:42. -->
 <qtcreator>
 <qtcreator>
  <data>
  <data>
   <variable>EnvironmentId</variable>
   <variable>EnvironmentId</variable>
@@ -68,14 +68,14 @@
  <data>
  <data>
   <variable>ProjectExplorer.Project.Target.0</variable>
   <variable>ProjectExplorer.Project.Target.0</variable>
   <valuemap type="QVariantMap">
   <valuemap type="QVariantMap">
-   <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="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.ActiveBuildConfiguration">0</value>
    <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
    <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
    <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">3</value>
    <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">3</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
    <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>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/wrk/share/gfaipc/Test/Debug/Sitara_1</value>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
@@ -123,7 +123,7 @@
     <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
     <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
    </valuemap>
    </valuemap>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/wrk/share/gfaipc/Test/Release/Desktop_Qt_5_7_1_GCC_64bit</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/wrk/share/gfaipc/Test/Release/Sitara_1</value>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
@@ -173,13 +173,47 @@
    <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">2</value>
    <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">2</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">RemoteLinux.CheckForFreeDiskSpaceStep</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"/>
+      <value type="QString" key="RemoteLinux.CheckForFreeDiskSpaceStep.PathToCheck">/</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.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="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">false</value>
+      <valuelist type="QVariantList" key="RemoteLinux.LastDeployedLocalTimes"/>
+      <valuelist type="QVariantList" key="RemoteLinux.LastDeployedRemoteTimes"/>
+     </valuemap>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">3</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</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.DisplayName">Deploy</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
     </valuemap>
     </valuemap>
     <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
     <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">DeployToGenericLinux</value>
    </valuemap>
    </valuemap>
    <value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
    <value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
@@ -241,21 +275,26 @@
      <value type="int">13</value>
      <value type="int">13</value>
      <value type="int">14</value>
      <value type="int">14</value>
     </valuelist>
     </valuelist>
-    <value type="int" key="PE.EnvironmentAspect.Base">2</value>
+    <value type="int" key="PE.EnvironmentAspect.Base">1</value>
     <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
     <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/home/wrk/share/gfaipc/Test/app1/app1.pro</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">app1 (auf Sitara 1)</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">RemoteLinuxRunConfiguration:/home/wrk/share/gfaipc/Test/app1/app1.pro</value>
     <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/home/wrk/share/gfaipc/Test/app1/app1.pro</value>
     <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/home/wrk/share/gfaipc/Test/app1/app1.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="QString" key="RunConfiguration.Arguments"></value>
     <value type="bool" key="RunConfiguration.Arguments.multi">false</value>
     <value type="bool" key="RunConfiguration.Arguments.multi">false</value>
     <value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
     <value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
     <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</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.UseMultiProcess">false</value>
     <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
-    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
+    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">false</value>
+    <value type="bool" key="RunConfiguration.UseX11Forwarding">false</value>
     <value type="QString" key="RunConfiguration.WorkingDirectory"></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/app1</value>
+    <value type="QString" key="RunConfiguration.WorkingDirectory.default"></value>
+    <value type="QString" key="RunConfiguration.X11Forwarding">:0</value>
    </valuemap>
    </valuemap>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.1">
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.1">
     <value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
     <value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
@@ -315,21 +354,26 @@
      <value type="int">13</value>
      <value type="int">13</value>
      <value type="int">14</value>
      <value type="int">14</value>
     </valuelist>
     </valuelist>
-    <value type="int" key="PE.EnvironmentAspect.Base">2</value>
+    <value type="int" key="PE.EnvironmentAspect.Base">1</value>
     <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
     <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/home/wrk/share/gfaipc/Test/app2/app2.pro</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">app2 (auf Sitara 1)</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">RemoteLinuxRunConfiguration:/home/wrk/share/gfaipc/Test/app2/app2.pro</value>
     <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/home/wrk/share/gfaipc/Test/app2/app2.pro</value>
     <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/home/wrk/share/gfaipc/Test/app2/app2.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="QString" key="RunConfiguration.Arguments"></value>
     <value type="bool" key="RunConfiguration.Arguments.multi">false</value>
     <value type="bool" key="RunConfiguration.Arguments.multi">false</value>
     <value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
     <value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
     <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</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.UseMultiProcess">false</value>
     <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</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"></value>
-    <value type="QString" key="RunConfiguration.WorkingDirectory.default">/home/wrk/share/gfaipc/Test/Debug/Desktop_Qt_5_7_1_GCC_64bit/app2</value>
+    <value type="QString" key="RunConfiguration.WorkingDirectory.default"></value>
+    <value type="QString" key="RunConfiguration.X11Forwarding">:0</value>
    </valuemap>
    </valuemap>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.2">
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.2">
     <value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
     <value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
@@ -389,21 +433,26 @@
      <value type="int">13</value>
      <value type="int">13</value>
      <value type="int">14</value>
      <value type="int">14</value>
     </valuelist>
     </valuelist>
-    <value type="int" key="PE.EnvironmentAspect.Base">2</value>
+    <value type="int" key="PE.EnvironmentAspect.Base">1</value>
     <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
     <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/home/wrk/share/gfaipc/Test/app3/app3.pro</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">app3 (auf Sitara 1)</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">RemoteLinuxRunConfiguration:/home/wrk/share/gfaipc/Test/app3/app3.pro</value>
     <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/home/wrk/share/gfaipc/Test/app3/app3.pro</value>
     <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/home/wrk/share/gfaipc/Test/app3/app3.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="QString" key="RunConfiguration.Arguments"></value>
     <value type="bool" key="RunConfiguration.Arguments.multi">false</value>
     <value type="bool" key="RunConfiguration.Arguments.multi">false</value>
     <value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
     <value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
     <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</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.UseMultiProcess">false</value>
     <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</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"></value>
-    <value type="QString" key="RunConfiguration.WorkingDirectory.default">/home/wrk/share/gfaipc/Test/Debug/Desktop_Qt_5_7_1_GCC_64bit/app3</value>
+    <value type="QString" key="RunConfiguration.WorkingDirectory.default"></value>
+    <value type="QString" key="RunConfiguration.X11Forwarding">:0</value>
    </valuemap>
    </valuemap>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.3">
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.3">
     <value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
     <value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
@@ -463,21 +512,26 @@
      <value type="int">13</value>
      <value type="int">13</value>
      <value type="int">14</value>
      <value type="int">14</value>
     </valuelist>
     </valuelist>
-    <value type="int" key="PE.EnvironmentAspect.Base">2</value>
+    <value type="int" key="PE.EnvironmentAspect.Base">1</value>
     <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
     <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.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="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="QString" key="RunConfiguration.Arguments"></value>
     <value type="bool" key="RunConfiguration.Arguments.multi">false</value>
     <value type="bool" key="RunConfiguration.Arguments.multi">false</value>
     <value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
     <value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
     <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</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.UseMultiProcess">false</value>
     <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</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"></value>
-    <value type="QString" key="RunConfiguration.WorkingDirectory.default">/home/wrk/share/gfaipc/Test/Debug/Desktop_Qt_5_7_1_GCC_64bit/qmlApp</value>
+    <value type="QString" key="RunConfiguration.WorkingDirectory.default"></value>
+    <value type="QString" key="RunConfiguration.X11Forwarding">:0</value>
    </valuemap>
    </valuemap>
    <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">4</value>
    <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">4</value>
   </valuemap>
   </valuemap>
@@ -485,14 +539,14 @@
  <data>
  <data>
   <variable>ProjectExplorer.Project.Target.1</variable>
   <variable>ProjectExplorer.Project.Target.1</variable>
   <valuemap type="QVariantMap">
   <valuemap type="QVariantMap">
-   <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="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.ActiveBuildConfiguration">0</value>
    <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
    <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
    <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">3</value>
    <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">3</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/wrk/share/gfaipc/Test/Debug/Sitara_1</value>
+    <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">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
@@ -540,7 +594,7 @@
     <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
     <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
    </valuemap>
    </valuemap>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/wrk/share/gfaipc/Test/Release/Sitara_1</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/wrk/share/gfaipc/Test/Release/Desktop_Qt_5_7_1_GCC_64bit</value>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
@@ -590,47 +644,13 @@
    <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">2</value>
    <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">2</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.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.Id">RemoteLinux.CheckForFreeDiskSpaceStep</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"/>
-      <value type="QString" key="RemoteLinux.CheckForFreeDiskSpaceStep.PathToCheck">/</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.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="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">false</value>
-      <valuelist type="QVariantList" key="RemoteLinux.LastDeployedLocalTimes"/>
-      <valuelist type="QVariantList" key="RemoteLinux.LastDeployedRemoteTimes"/>
-     </valuemap>
-     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">3</value>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</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.DisplayName">Deploy</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
     </valuemap>
     </valuemap>
     <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
     <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">DeployToGenericLinux</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
    </valuemap>
    </valuemap>
    <value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
    <value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
@@ -692,26 +712,21 @@
      <value type="int">13</value>
      <value type="int">13</value>
      <value type="int">14</value>
      <value type="int">14</value>
     </valuelist>
     </valuelist>
-    <value type="int" key="PE.EnvironmentAspect.Base">1</value>
+    <value type="int" key="PE.EnvironmentAspect.Base">2</value>
     <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
     <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">app1 (auf Sitara 1)</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">RemoteLinuxRunConfiguration:/home/wrk/share/gfaipc/Test/app1/app1.pro</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/home/wrk/share/gfaipc/Test/app1/app1.pro</value>
     <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/home/wrk/share/gfaipc/Test/app1/app1.pro</value>
     <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/home/wrk/share/gfaipc/Test/app1/app1.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="QString" key="RunConfiguration.Arguments"></value>
     <value type="bool" key="RunConfiguration.Arguments.multi">false</value>
     <value type="bool" key="RunConfiguration.Arguments.multi">false</value>
     <value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
     <value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
     <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</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.UseMultiProcess">false</value>
     <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
-    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">false</value>
-    <value type="bool" key="RunConfiguration.UseX11Forwarding">false</value>
+    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
     <value type="QString" key="RunConfiguration.WorkingDirectory"></value>
     <value type="QString" key="RunConfiguration.WorkingDirectory"></value>
     <value type="QString" key="RunConfiguration.WorkingDirectory.default"></value>
     <value type="QString" key="RunConfiguration.WorkingDirectory.default"></value>
-    <value type="QString" key="RunConfiguration.X11Forwarding">:0</value>
    </valuemap>
    </valuemap>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.1">
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.1">
     <value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
     <value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
@@ -771,26 +786,21 @@
      <value type="int">13</value>
      <value type="int">13</value>
      <value type="int">14</value>
      <value type="int">14</value>
     </valuelist>
     </valuelist>
-    <value type="int" key="PE.EnvironmentAspect.Base">1</value>
+    <value type="int" key="PE.EnvironmentAspect.Base">2</value>
     <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
     <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">app2 (auf Sitara 1)</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">RemoteLinuxRunConfiguration:/home/wrk/share/gfaipc/Test/app2/app2.pro</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/home/wrk/share/gfaipc/Test/app2/app2.pro</value>
     <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/home/wrk/share/gfaipc/Test/app2/app2.pro</value>
     <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/home/wrk/share/gfaipc/Test/app2/app2.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="QString" key="RunConfiguration.Arguments"></value>
     <value type="bool" key="RunConfiguration.Arguments.multi">false</value>
     <value type="bool" key="RunConfiguration.Arguments.multi">false</value>
     <value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
     <value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
     <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</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.UseMultiProcess">false</value>
     <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</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"></value>
     <value type="QString" key="RunConfiguration.WorkingDirectory.default"></value>
     <value type="QString" key="RunConfiguration.WorkingDirectory.default"></value>
-    <value type="QString" key="RunConfiguration.X11Forwarding">:0</value>
    </valuemap>
    </valuemap>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.2">
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.2">
     <value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
     <value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
@@ -850,26 +860,21 @@
      <value type="int">13</value>
      <value type="int">13</value>
      <value type="int">14</value>
      <value type="int">14</value>
     </valuelist>
     </valuelist>
-    <value type="int" key="PE.EnvironmentAspect.Base">1</value>
+    <value type="int" key="PE.EnvironmentAspect.Base">2</value>
     <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
     <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">app3 (auf Sitara 1)</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">RemoteLinuxRunConfiguration:/home/wrk/share/gfaipc/Test/app3/app3.pro</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/home/wrk/share/gfaipc/Test/app3/app3.pro</value>
     <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/home/wrk/share/gfaipc/Test/app3/app3.pro</value>
     <value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">/home/wrk/share/gfaipc/Test/app3/app3.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="QString" key="RunConfiguration.Arguments"></value>
     <value type="bool" key="RunConfiguration.Arguments.multi">false</value>
     <value type="bool" key="RunConfiguration.Arguments.multi">false</value>
     <value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
     <value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
     <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</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.UseMultiProcess">false</value>
     <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</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"></value>
     <value type="QString" key="RunConfiguration.WorkingDirectory.default"></value>
     <value type="QString" key="RunConfiguration.WorkingDirectory.default"></value>
-    <value type="QString" key="RunConfiguration.X11Forwarding">:0</value>
    </valuemap>
    </valuemap>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.3">
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.3">
     <value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
     <value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
@@ -929,26 +934,21 @@
      <value type="int">13</value>
      <value type="int">13</value>
      <value type="int">14</value>
      <value type="int">14</value>
     </valuelist>
     </valuelist>
-    <value type="int" key="PE.EnvironmentAspect.Base">1</value>
+    <value type="int" key="PE.EnvironmentAspect.Base">2</value>
     <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
     <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.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="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="QString" key="RunConfiguration.Arguments"></value>
     <value type="bool" key="RunConfiguration.Arguments.multi">false</value>
     <value type="bool" key="RunConfiguration.Arguments.multi">false</value>
     <value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
     <value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value>
     <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</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.UseMultiProcess">false</value>
     <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</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"></value>
     <value type="QString" key="RunConfiguration.WorkingDirectory.default"></value>
     <value type="QString" key="RunConfiguration.WorkingDirectory.default"></value>
-    <value type="QString" key="RunConfiguration.X11Forwarding">:0</value>
    </valuemap>
    </valuemap>
    <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">4</value>
    <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">4</value>
   </valuemap>
   </valuemap>

+ 19 - 0
Test/app1/app.h

@@ -0,0 +1,19 @@
+// app.h :
+//
+
+#if !defined(AGD_APP_H__A50B34D4_A27E_4F0D_8FE9_02D35AC82A13__INCLUDED_)
+#define AGD_APP_H__A50B34D4_A27E_4F0D_8FE9_02D35AC82A13__INCLUDED_
+
+/////////////////////////////////////////////////////////////////////////////
+// app.h - Declarations:
+
+#define _APPID_0		GFA_APPCTRL_APPID_REMANENT
+#define _APPID_1		GFA_APPCTRL_APPID_MQTTCL
+#define _APPID_2		GFA_APPCTRL_APPID_REST
+#define _APPNAME_0		_APPNAME_REMANENT
+#define _APPNAME_1		_APPNAME_MQTTCL
+#define _APPNAME_2		_APPNAME_REST
+#define _CYCLE_INTV		20
+
+/////////////////////////////////////////////////////////////////////////////
+#endif	//	!defined(AGD_APP_H__A50B34D4_A27E_4F0D_8FE9_02D35AC82A13__INCLUDED_)

+ 0 - 13
Test/app1/app1.pro

@@ -1,14 +1 @@
 include(../test.pri)
 include(../test.pri)
-
-QMAKE_CXXFLAGS	+= -D_APPID_0=GFA_APPCTRL_APPID_MQTTCL
-QMAKE_CFLAGS	+= -D_APPID_0=GFA_APPCTRL_APPID_MQTTCL
-QMAKE_CXXFLAGS	+= -D_APPID_1=GFA_APPCTRL_APPID_REMANENT
-QMAKE_CFLAGS	+= -D_APPID_1=GFA_APPCTRL_APPID_REMANENT
-QMAKE_CXXFLAGS	+= -D_APPID_2=GFA_APPCTRL_APPID_REST
-QMAKE_CFLAGS	+= -D_APPID_2=GFA_APPCTRL_APPID_REST
-QMAKE_CXXFLAGS	+= -D_APPNAME_0=_APPNAME_MQTTCL
-QMAKE_CFLAGS	+= -D_APPNAME_0=_APPNAME_MQTTCL
-QMAKE_CXXFLAGS	+= -D_APPNAME_1=_APPNAME_REMANENT
-QMAKE_CFLAGS	+= -D_APPNAME_1=_APPNAME_REMANENT
-QMAKE_CXXFLAGS	+= -D_APPNAME_2=_APPNAME_REST
-QMAKE_CFLAGS	+= -D_APPNAME_2=_APPNAME_REST

+ 19 - 0
Test/app2/app.h

@@ -0,0 +1,19 @@
+// app.h :
+//
+
+#if !defined(AGD_APP_H__A50B34D4_A27E_4F0D_8FE9_02D35AC82A13__INCLUDED_)
+#define AGD_APP_H__A50B34D4_A27E_4F0D_8FE9_02D35AC82A13__INCLUDED_
+
+/////////////////////////////////////////////////////////////////////////////
+// app.h - Declarations:
+
+#define _APPID_0		GFA_APPCTRL_APPID_REST
+#define _APPID_1		GFA_APPCTRL_APPID_REMANENT
+#define _APPID_2		GFA_APPCTRL_APPID_MQTTCL
+#define _APPNAME_0		_APPNAME_REST
+#define _APPNAME_1		_APPNAME_REMANENT
+#define _APPNAME_2		_APPNAME_MQTTCL
+#define _CYCLE_INTV		40
+
+/////////////////////////////////////////////////////////////////////////////
+#endif	//	!defined(AGD_APP_H__A50B34D4_A27E_4F0D_8FE9_02D35AC82A13__INCLUDED_)

+ 0 - 13
Test/app2/app2.pro

@@ -1,14 +1 @@
 include(../test.pri)
 include(../test.pri)
-
-QMAKE_CXXFLAGS	+= -D_APPID_1=GFA_APPCTRL_APPID_MQTTCL
-QMAKE_CFLAGS	+= -D_APPID_1=GFA_APPCTRL_APPID_MQTTCL
-QMAKE_CXXFLAGS	+= -D_APPID_0=GFA_APPCTRL_APPID_REMANENT
-QMAKE_CFLAGS	+= -D_APPID_0=GFA_APPCTRL_APPID_REMANENT
-QMAKE_CXXFLAGS	+= -D_APPID_2=GFA_APPCTRL_APPID_REST
-QMAKE_CFLAGS	+= -D_APPID_2=GFA_APPCTRL_APPID_REST
-QMAKE_CXXFLAGS	+= -D_APPNAME_1=_APPNAME_MQTTCL
-QMAKE_CFLAGS	+= -D_APPNAME_1=_APPNAME_MQTTCL
-QMAKE_CXXFLAGS	+= -D_APPNAME_0=_APPNAME_REMANENT
-QMAKE_CFLAGS	+= -D_APPNAME_0=_APPNAME_REMANENT
-QMAKE_CXXFLAGS	+= -D_APPNAME_2=_APPNAME_REST
-QMAKE_CFLAGS	+= -D_APPNAME_2=_APPNAME_REST

+ 19 - 0
Test/app3/app.h

@@ -0,0 +1,19 @@
+// app.h :
+//
+
+#if !defined(AGD_APP_H__A50B34D4_A27E_4F0D_8FE9_02D35AC82A13__INCLUDED_)
+#define AGD_APP_H__A50B34D4_A27E_4F0D_8FE9_02D35AC82A13__INCLUDED_
+
+/////////////////////////////////////////////////////////////////////////////
+// app.h - Declarations:
+
+#define _APPID_0		GFA_APPCTRL_APPID_MQTTCL
+#define _APPID_1		GFA_APPCTRL_APPID_REST
+#define _APPID_2		GFA_APPCTRL_APPID_REMANENT
+#define _APPNAME_0		_APPNAME_MQTTCL
+#define _APPNAME_1		_APPNAME_REST
+#define _APPNAME_2		_APPNAME_REMANENT
+#define _CYCLE_INTV		30
+
+/////////////////////////////////////////////////////////////////////////////
+#endif	//	!defined(AGD_APP_H__A50B34D4_A27E_4F0D_8FE9_02D35AC82A13__INCLUDED_)

+ 0 - 13
Test/app3/app3.pro

@@ -1,14 +1 @@
 include(../test.pri)
 include(../test.pri)
-
-QMAKE_CXXFLAGS	+= -D_APPID_2=GFA_APPCTRL_APPID_MQTTCL
-QMAKE_CFLAGS	+= -D_APPID_2=GFA_APPCTRL_APPID_MQTTCL
-QMAKE_CXXFLAGS	+= -D_APPID_1=GFA_APPCTRL_APPID_REMANENT
-QMAKE_CFLAGS	+= -D_APPID_1=GFA_APPCTRL_APPID_REMANENT
-QMAKE_CXXFLAGS	+= -D_APPID_0=GFA_APPCTRL_APPID_REST
-QMAKE_CFLAGS	+= -D_APPID_0=GFA_APPCTRL_APPID_REST
-QMAKE_CXXFLAGS	+= -D_APPNAME_2=_APPNAME_MQTTCL
-QMAKE_CFLAGS	+= -D_APPNAME_2=_APPNAME_MQTTCL
-QMAKE_CXXFLAGS	+= -D_APPNAME_1=_APPNAME_REMANENT
-QMAKE_CFLAGS	+= -D_APPNAME_1=_APPNAME_REMANENT
-QMAKE_CXXFLAGS	+= -D_APPNAME_0=_APPNAME_REST
-QMAKE_CFLAGS	+= -D_APPNAME_0=_APPNAME_REST

+ 45 - 22
Test/main.cpp

@@ -3,8 +3,10 @@
 #include <string.h>
 #include <string.h>
 #include <signal.h>
 #include <signal.h>
 #include <poll.h>
 #include <poll.h>
+#include <gfa/gfasitarautils.h>
 #include <gfaipc.h>
 #include <gfaipc.h>
 #include "../src/defines.h"
 #include "../src/defines.h"
+#include "app.h"
 
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 
 
@@ -13,11 +15,12 @@
 #define _APPNAME_REST			"REST"
 #define _APPNAME_REST			"REST"
 
 
 #define _CTRL_MSG_DELAY			8
 #define _CTRL_MSG_DELAY			8
+#define _HANG_DELAY				10
 
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 
 
 #define UNUSED(v)				(void)v
 #define UNUSED(v)				(void)v
-#define _USLEEP_DELAY			20000
+#define _MAX_CYCLE_DELAY		(_CYCLE_INTV * 5000)
 
 
 static volatile bool g_fRun		= false;
 static volatile bool g_fRun		= false;
 static volatile bool g_fPause	= false;
 static volatile bool g_fPause	= false;
@@ -55,6 +58,20 @@ static int _InputAvailable(void)
 
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 
 
+static void _DoHang(time_t nSec)
+{
+	time_t t = time(NULL) + nSec;
+
+	do
+	{
+		if(t < time(NULL))
+			break;
+	}
+	while(true);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
 static void _ProcessCtrlMessages(HAPPCTRL hAC, HAPPINFO hAI)
 static void _ProcessCtrlMessages(HAPPCTRL hAC, HAPPINFO hAI)
 {
 {
     ctrlmsg_t nCtrlMsg;
     ctrlmsg_t nCtrlMsg;
@@ -84,8 +101,8 @@ static void _ProcessCtrlMessages(HAPPCTRL hAC, HAPPINFO hAI)
 			}
 			}
 			break;
 			break;
 		case _CTRL_MSG_DELAY:
 		case _CTRL_MSG_DELAY:
-			TRACE("Delaying 2 seconds.\n");
-			sleep(2);
+			TRACE("Hanging %d seconds.\n", _HANG_DELAY);
+			_DoHang(_HANG_DELAY);
 			break;
 			break;
 		default:
 		default:
 			break;
 			break;
@@ -199,19 +216,21 @@ int main(void)
 
 
 	do
 	do
 	{
 	{
-		if(!(hAC = ::GfaIpcAppCtrlAcquire(_APPID_0, _APPNAME_0, _USLEEP_DELAY * 5)))
+		if(!(hAC = ::GfaIpcAppCtrlAcquire(_APPID_0, _APPNAME_0, _MAX_CYCLE_DELAY)))
 			break;
 			break;
 
 
 		;;GfaIpcDumpSHMROT();
 		;;GfaIpcDumpSHMROT();
 
 
-		::GfaIpcAppCtrlPresetDisplayName(hAC, GFA_APPCTRL_CTRLMSG_USER_01, "qmlApp");
+		::GfaIpcAppCtrlPresetDisplayName(hAC, GFA_APPCTRL_APPID_USER_01, "qmlApp");
 		::GfaIpcAppCtrlSetState(hAC, GIAS_Initializing);
 		::GfaIpcAppCtrlSetState(hAC, GIAS_Initializing);
 
 
-		if(!::GfaIpcAppCtrlSubscribeStateEvents(hAC, _APPID_1 | _APPID_2 | GFA_APPCTRL_CTRLMSG_USER_01))
+		if(!::GfaIpcAppCtrlSubscribeStateEvents(hAC, _APPID_1 | _APPID_2 | GFA_APPCTRL_APPID_USER_01))
 			break;
 			break;
 
 
 		TRACE("My Name:  %s\n", _APPNAME_0);
 		TRACE("My Name:  %s\n", _APPNAME_0);
 		TRACE("My AppID: %llu\n", _APPID_0);
 		TRACE("My AppID: %llu\n", _APPID_0);
+		TRACE("My PID:   %d\n", getpid());
+		TRACE("My Cycle: %d\n", _CYCLE_INTV);
 
 
 		g_fRun = true;
 		g_fRun = true;
 		::GfaIpcAppCtrlSetState(hAC, GIAS_Running);
 		::GfaIpcAppCtrlSetState(hAC, GIAS_Running);
@@ -223,38 +242,42 @@ int main(void)
 	/////////////////////////////////////////////////////////////////////////
 	/////////////////////////////////////////////////////////////////////////
 	// run
 	// run
 
 
+	CCycleTimer ct(_CYCLE_INTV);
+
 	while(g_fRun)
 	while(g_fRun)
 	{
 	{
-		do
-		{
-			/////////////////////////////////////////////////////////////////
-			// test input
+		/////////////////////////////////////////////////////////////////////
+		// trigger cycle timer
 
 
-			_ProcessInput(hAC);
+		ct.Trigger();
 
 
-			/////////////////////////////////////////////////////////////////
-			// update app control info
+		/////////////////////////////////////////////////////////////////////
+		// test input
 
 
-			if((hAI = ::GfaIpcAppCtrlInfoUpdate(hAC)))
-			{
-				_ProcessCtrlMessages(hAC, hAI);
-				_ProcessStateEvents(hAC, hAI);
-			}
+		_ProcessInput(hAC);
 
 
-			/////////////////////////////////////////////////////////////////
+		/////////////////////////////////////////////////////////////////////
+		// update app control info
 
 
-			::usleep(_USLEEP_DELAY);
+		if((hAI = ::GfaIpcAppCtrlInfoUpdate(hAC)))
+		{
+			_ProcessCtrlMessages(hAC, hAI);
+			_ProcessStateEvents(hAC, hAI);
 		}
 		}
-		while(g_fRun && g_fPause);
 
 
 		/////////////////////////////////////////////////////////////////////
 		/////////////////////////////////////////////////////////////////////
+		// if not paused, do work
 
 
-		if(g_fRun)
+		if(!g_fPause && g_fRun)
 		{
 		{
 			_DoWork();
 			_DoWork();
 		}
 		}
 
 
 		/////////////////////////////////////////////////////////////////////
 		/////////////////////////////////////////////////////////////////////
+		// if running, sleep
+
+		if(g_fRun)
+			ct.Sleep1();
 	}
 	}
 
 
 	/////////////////////////////////////////////////////////////////////////
 	/////////////////////////////////////////////////////////////////////////

+ 5 - 4
Test/qmlApp/main.cpp

@@ -2,9 +2,10 @@
 #include <QQmlApplicationEngine>
 #include <QQmlApplicationEngine>
 #include "qappctrl.h"
 #include "qappctrl.h"
 
 
-#define _APP_ID					GFA_APPCTRL_CTRLMSG_USER_01
-#define _APP_NAME				"qmlApp"
-#define _TIMER_INT				50
+#define _APP_ID								GFA_APPCTRL_APPID_USER_01
+#define _APP_NAME							"qmlApp"
+#define _UPDATE_TIMER_INT					50
+#define _UPDATE_TIMER_INT_HEAVY_LOAD		5000
 
 
 int main(int argc, char *argv[])
 int main(int argc, char *argv[])
 {
 {
@@ -15,7 +16,7 @@ int main(int argc, char *argv[])
     QQmlApplicationEngine engine;
     QQmlApplicationEngine engine;
     const QUrl url(QStringLiteral("qrc:/main.qml"));
     const QUrl url(QStringLiteral("qrc:/main.qml"));
 
 
-    if(appCtrl.Create(_APP_ID, _APP_NAME, _TIMER_INT))
+    if(appCtrl.Create(_APP_ID, _APP_NAME, _UPDATE_TIMER_INT, _UPDATE_TIMER_INT_HEAVY_LOAD))
     {
     {
 		appCtrl.SubscribeStateEvents(GFA_APPCTRL_APPID_ALL_GFA);
 		appCtrl.SubscribeStateEvents(GFA_APPCTRL_APPID_ALL_GFA);
 		appCtrl.SetState(GIAS_Initializing);
 		appCtrl.SetState(GIAS_Initializing);

+ 1100 - 293
Test/qmlApp/main.qml

@@ -1,5 +1,6 @@
 import QtQuick 2.7
 import QtQuick 2.7
 import QtQuick.Window 2.2
 import QtQuick.Window 2.2
+import QtQuick.Controls 1.4
 import com.gfa.ipc.appctrl 1.0
 import com.gfa.ipc.appctrl 1.0
 
 
 Window {
 Window {
@@ -7,322 +8,1128 @@ Window {
     width: 640
     width: 640
     height: 480
     height: 480
     title: qsTr("GfA App Control")
     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
+    
+    function stateColor(state)
     {
     {
-        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()
-        }
+    	switch(state)
+    	{
+    	case QGfaAppCtrl.STATE_RUNNING:
+    		return "lightgreen";
+    	case QGfaAppCtrl.STATE_PAUSED:
+    		return "lightgrey";
+    	case QGfaAppCtrl.STATE_HANGING:
+    		return "red";
+    	default:
+    		return "white";
+    	}
     }
     }
-
-    Rectangle
+    
+    function sec2HMS(sec)
     {
     {
-        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()
-        }
+    	var h = parseInt(sec / 3600);
+    	sec -= h * 3600;
+    	var m = parseInt(sec / 60);
+    	sec -= m * 60;
+    	return "" + h + (m < 10 ? ":0" : ":") + m + (sec < 10 ? ":0" : ":") + sec;
     }
     }
 
 
-    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()
-        }
-    }
+    Rectangle {
+        x: 10
+        y: 20
+        width: 120
+        height: 460
 
 
-    Text {
-        x: 550
-        y: 60
-        width: 80
-        height: 40
-        font.pixelSize: 14
-        text: appInfoRem.cycMin
-    }
+		Rectangle {
+	        x: 0
+	        y: 40
+	        width: parent.width
+	        height: 30
+		    Text {
+		        font.pixelSize: 14
+		        font.italic: true
+				anchors.verticalCenter: parent.verticalCenter
+	            anchors.left: parent.left
+		        text: "State:"
+		    }
+		}
 
 
-    Text {
-        x: 650
-        y: 60
-        width: 80
-        height: 40
-        font.pixelSize: 14
-        text: appInfoRem.cycMax
-    }
+		Rectangle {
+	        x: 0
+	        y: 70
+	        width: parent.width
+	        height: 30
+		    Text {
+		        font.pixelSize: 14
+		        font.italic: true
+				anchors.verticalCenter: parent.verticalCenter
+	            anchors.left: parent.left
+		        text: "Cyc. min. μs:"
+		    }
+		}
 
 
-	////////////////////////////////////////////////////////////
+		Rectangle {
+	        x: 0
+	        y: 100
+	        width: parent.width
+	        height: 30
+		    Text {
+		        font.pixelSize: 14
+		        font.italic: true
+				anchors.verticalCenter: parent.verticalCenter
+	            anchors.left: parent.left
+		        text: "Cyc. max. μs:"
+		    }
+		}
 
 
-    Text {
-        x: 50
-        y: 110
-        width: 80
-        height: 40
-        font.pixelSize: 14
-        text: appInfoRest.name
-    }
+		Rectangle {
+	        x: 0
+	        y: 130
+	        width: parent.width
+	        height: 30
+		    Text {
+		        font.pixelSize: 14
+		        font.italic: true
+				anchors.verticalCenter: parent.verticalCenter
+	            anchors.left: parent.left
+		        text: "Cyc. cur. μs:"
+		    }
+		}
 
 
-    Text {
-        x: 150
-        y: 110
-        width: 80
-        height: 40
-        font.pixelSize: 14
-        text: appInfoRest.stateText
-    }
+		Rectangle {
+	        x: 0
+	        y: 160
+	        width: parent.width
+	        height: 30
+		    Text {
+		        font.pixelSize: 14
+		        font.italic: true
+				anchors.verticalCenter: parent.verticalCenter
+	            anchors.left: parent.left
+		        text: "CPU Time sec.:"
+		    }
+		}
 
 
-    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: 0
+	        y: 190
+	        width: parent.width
+	        height: 30
+		    Text {
+		        font.pixelSize: 14
+		        font.italic: true
+				anchors.verticalCenter: parent.verticalCenter
+	            anchors.left: parent.left
+		        text: "CPU avg. %:"
+		    }
+		}
 
 
-    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: 0
+	        y: 220
+	        width: parent.width
+	        height: 30
+		    Text {
+		        font.pixelSize: 14
+		        font.italic: true
+				anchors.verticalCenter: parent.verticalCenter
+	            anchors.left: parent.left
+		        text: "CPU cur. %:"
+		    }
+		}
 
 
-    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()
-        }
-    }
+		Rectangle {
+	        x: 0
+	        y: 250
+	        width: parent.width
+	        height: 30
+		    Text {
+		        font.pixelSize: 14
+		        font.italic: true
+				anchors.verticalCenter: parent.verticalCenter
+	            anchors.left: parent.left
+		        text: "Uptime H:M:S:"
+		    }
+		}
 
 
-    Text {
-        x: 550
-        y: 110
-        width: 80
-        height: 40
-        font.pixelSize: 14
-        text: appInfoRest.cycMin
-    }
+		Rectangle {
+	        x: 0
+	        y: 280
+	        width: parent.width
+	        height: 30
+		    Text {
+		        font.pixelSize: 14
+		        font.italic: true
+				anchors.verticalCenter: parent.verticalCenter
+	            anchors.left: parent.left
+		        text: "</Ø pass μs"
+		    }
+		}
 
 
-    Text {
-        x: 650
-        y: 110
-        width: 80
-        height: 40
-        font.pixelSize: 14
-        text: appInfoRest.cycMax
-    }
+	    Rectangle {
+	        x: 0
+	        y: 330
+	        height: 30
+	        width: parent.width
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: qGfaAppCtrl.minPass
+		    }
+	    }
 
 
-	////////////////////////////////////////////////////////////
+	    Rectangle {
+	        x: 0
+	        y: 370
+	        height: 30
+	        width: parent.width
+	        border.width: 1
+			border.color: "black"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: qGfaAppCtrl.avgPass
+		    }
+	    }
 
 
-    Text {
-        x: 50
-        y: 160
-        width: 80
-        height: 40
-        font.pixelSize: 14
-        text: appInfoMqtt.name
-    }
+	    Rectangle {
+	        x: 0
+	        y: 410
+	        height: 30
+	        width: parent.width
+			Button {
+	            text: "Exit"
+	            anchors.fill: parent
+	            onClicked: Qt.quit()
+			}
+	    }
+	}
 
 
-    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: 140
+        y: 20
+        width: 120
+        height: 460
 
 
-    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()
-        }
-    }
+		property var appInfo: qGfaAppCtrl.appInfo[QGfaAppCtrl.APP_INDEX_REMANENT]
 
 
-    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()
-        }
-    }
+		Rectangle {
+	        x: 0
+	        y: 0
+	        width: parent.width
+	        height: 30
+		    Text {
+		        font.pixelSize: 18
+		        font.bold: true
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.name
+		    }
+		}
 
 
-    Text {
-        x: 550
-        y: 160
-        width: 80
-        height: 40
-        font.pixelSize: 14
-        text: appInfoMqtt.cycMin
-    }
+		Rectangle {
+	        x: 0
+	        y: 40
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+	        color: stateColor(parent.appInfo.state)
+		    Text {
+		        font.pixelSize: 14
+		        font.bold: true
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.stateText
+		    }
+		}
 
 
-    Text {
-        x: 650
-        y: 160
-        width: 80
-        height: 40
-        font.pixelSize: 14
-        text: appInfoMqtt.cycMax
-    }
+		Rectangle {
+	        x: 0
+	        y: 70
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.cycMin
+		    }
+		}
 
 
-	////////////////////////////////////////////////////////////
+		Rectangle {
+	        x: 0
+	        y: 100
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.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()
-        }
-    }
+		Rectangle {
+	        x: 0
+	        y: 130
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "black"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.cycCur
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 160
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.cpuTime.toFixed(1)
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 190
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.cpuAvg.toFixed(2)
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 220
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.cpuCur.toFixed(2)
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 250
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: sec2HMS(parent.parent.appInfo.upTime)
+		    }
+		}
+
+	    Rectangle {
+	        x: 0
+	        y: 330
+	        height: 30
+	        width: parent.width
+			Button {
+	            text: "Pause"
+	            anchors.fill: parent
+	            onClicked: parent.parent.appInfo.pause()
+	            enabled: (parent.parent.appInfo.state !== QGfaAppCtrl.STATE_NOT_RUNNING) && (parent.parent.appInfo.state !== QGfaAppCtrl.STATE_PAUSED)
+			}
+	    }
+
+	    Rectangle {
+	        x: 0
+	        y: 370
+	        height: 30
+	        width: parent.width
+			Button {
+	            text: "Resume"
+	            anchors.fill: parent
+	            onClicked: parent.parent.appInfo.resume()
+	            enabled: (parent.parent.appInfo.state === QGfaAppCtrl.STATE_PAUSED)
+			}
+	    }
+
+	    Rectangle {
+	        x: 0
+	        y: 410
+	        height: 30
+	        width: parent.width
+			Button {
+	            text: "Stop"
+	            anchors.fill: parent
+	            onClicked: parent.parent.appInfo.stop()
+                enabled: (parent.parent.appInfo.state !== QGfaAppCtrl.STATE_NOT_RUNNING)
+			}
+	    }
+	}
+
+	/////////////////////////////////////////////////////////////////////////////////////////////////
+
+    Rectangle {
+        x: 270
+        y: 20
+        width: 120
+        height: 460
+
+		property var appInfo: qGfaAppCtrl.appInfo[QGfaAppCtrl.APP_INDEX_MQTTCL]
+
+		Rectangle {
+	        x: 0
+	        y: 0
+	        width: parent.width
+	        height: 30
+		    Text {
+		        font.pixelSize: 18
+		        font.bold: true
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.name
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 40
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+	        color: stateColor(parent.appInfo.state)
+		    Text {
+		        font.pixelSize: 14
+		        font.bold: true
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.stateText
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 70
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.cycMin
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 100
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.cycMax
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 130
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "black"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.cycCur
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 160
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.cpuTime.toFixed(1)
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 190
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.cpuAvg.toFixed(2)
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 220
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.cpuCur.toFixed(2)
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 250
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: sec2HMS(parent.parent.appInfo.upTime)
+		    }
+		}
+
+	    Rectangle {
+	        x: 0
+	        y: 330
+	        height: 30
+	        width: parent.width
+			Button {
+	            text: "Pause"
+	            anchors.fill: parent
+	            onClicked: parent.parent.appInfo.pause()
+	            enabled: (parent.parent.appInfo.state !== QGfaAppCtrl.STATE_NOT_RUNNING) && (parent.parent.appInfo.state !== QGfaAppCtrl.STATE_PAUSED)
+			}
+	    }
+
+	    Rectangle {
+	        x: 0
+	        y: 370
+	        height: 30
+	        width: parent.width
+			Button {
+	            text: "Resume"
+	            anchors.fill: parent
+	            onClicked: parent.parent.appInfo.resume()
+	            enabled: (parent.parent.appInfo.state === QGfaAppCtrl.STATE_PAUSED)
+			}
+	    }
+
+	    Rectangle {
+	        x: 0
+	        y: 410
+	        height: 30
+	        width: parent.width
+			Button {
+	            text: "Stop"
+	            anchors.fill: parent
+	            onClicked: parent.parent.appInfo.stop()
+                enabled: (parent.parent.appInfo.state !== QGfaAppCtrl.STATE_NOT_RUNNING)
+			}
+	    }
+	}
+
+	/////////////////////////////////////////////////////////////////////////////////////////////////
+
+    Rectangle {
+        x: 400
+        y: 20
+        width: 120
+        height: 460
+
+		property var appInfo: qGfaAppCtrl.appInfo[QGfaAppCtrl.APP_INDEX_REST]
+
+		Rectangle {
+	        x: 0
+	        y: 0
+	        width: parent.width
+	        height: 30
+		    Text {
+		        font.pixelSize: 18
+		        font.bold: true
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.name
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 40
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+	        color: stateColor(parent.appInfo.state)
+		    Text {
+		        font.pixelSize: 14
+		        font.bold: true
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.stateText
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 70
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.cycMin
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 100
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.cycMax
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 130
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "black"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.cycCur
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 160
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.cpuTime.toFixed(1)
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 190
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.cpuAvg.toFixed(2)
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 220
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.cpuCur.toFixed(2)
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 250
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: sec2HMS(parent.parent.appInfo.upTime)
+		    }
+		}
+
+	    Rectangle {
+	        x: 0
+	        y: 330
+	        height: 30
+	        width: parent.width
+			Button {
+	            text: "Pause"
+	            anchors.fill: parent
+	            onClicked: parent.parent.appInfo.pause()
+	            enabled: (parent.parent.appInfo.state !== QGfaAppCtrl.STATE_NOT_RUNNING) && (parent.parent.appInfo.state !== QGfaAppCtrl.STATE_PAUSED)
+			}
+	    }
+
+	    Rectangle {
+	        x: 0
+	        y: 370
+	        height: 30
+	        width: parent.width
+			Button {
+	            text: "Resume"
+	            anchors.fill: parent
+	            onClicked: parent.parent.appInfo.resume()
+	            enabled: (parent.parent.appInfo.state === QGfaAppCtrl.STATE_PAUSED)
+			}
+	    }
+
+	    Rectangle {
+	        x: 0
+	        y: 410
+	        height: 30
+	        width: parent.width
+			Button {
+	            text: "Stop"
+	            anchors.fill: parent
+	            onClicked: parent.parent.appInfo.stop()
+                enabled: (parent.parent.appInfo.state !== QGfaAppCtrl.STATE_NOT_RUNNING)
+			}
+	    }
+	}
+
+	/////////////////////////////////////////////////////////////////////////////////////////////////
+
+    Rectangle {
+        x: 530
+        y: 20
+        width: 120
+        height: 460
+
+		property var appInfo: qGfaAppCtrl.appInfo[QGfaAppCtrl.APP_INDEX_DATALOGGER]
+
+		Rectangle {
+	        x: 0
+	        y: 0
+	        width: parent.width
+	        height: 30
+		    Text {
+		        font.pixelSize: 18
+		        font.bold: true
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.name
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 40
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+	        color: stateColor(parent.appInfo.state)
+		    Text {
+		        font.pixelSize: 14
+		        font.bold: true
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.stateText
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 70
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.cycMin
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 100
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.cycMax
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 130
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "black"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.cycCur
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 160
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.cpuTime.toFixed(1)
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 190
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.cpuAvg.toFixed(2)
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 220
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.cpuCur.toFixed(2)
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 250
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: sec2HMS(parent.parent.appInfo.upTime)
+		    }
+		}
+
+	    Rectangle {
+	        x: 0
+	        y: 330
+	        height: 30
+	        width: parent.width
+			Button {
+	            text: "Pause"
+	            anchors.fill: parent
+	            onClicked: parent.parent.appInfo.pause()
+	            enabled: (parent.parent.appInfo.state !== QGfaAppCtrl.STATE_NOT_RUNNING) && (parent.parent.appInfo.state !== QGfaAppCtrl.STATE_PAUSED)
+			}
+	    }
+
+	    Rectangle {
+	        x: 0
+	        y: 370
+	        height: 30
+	        width: parent.width
+			Button {
+	            text: "Resume"
+	            anchors.fill: parent
+	            onClicked: parent.parent.appInfo.resume()
+	            enabled: (parent.parent.appInfo.state === QGfaAppCtrl.STATE_PAUSED)
+			}
+	    }
+
+	    Rectangle {
+	        x: 0
+	        y: 410
+	        height: 30
+	        width: parent.width
+			Button {
+	            text: "Stop"
+	            anchors.fill: parent
+	            onClicked: parent.parent.appInfo.stop()
+                enabled: (parent.parent.appInfo.state !== QGfaAppCtrl.STATE_NOT_RUNNING)
+			}
+	    }
+	}
+
+	/////////////////////////////////////////////////////////////////////////////////////////////////
+
+    Rectangle {
+        x: 660
+        y: 20
+        width: 120
+        height: 460
+
+		property var appInfo: qGfaAppCtrl.appInfo[QGfaAppCtrl.APP_INDEX_SUMMARIST]
+
+		Rectangle {
+	        x: 0
+	        y: 0
+	        width: parent.width
+	        height: 30
+		    Text {
+		        font.pixelSize: 18
+		        font.bold: true
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.name
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 40
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+	        color: stateColor(parent.appInfo.state)
+		    Text {
+		        font.pixelSize: 14
+		        font.bold: true
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.stateText
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 70
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.cycMin
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 100
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.cycMax
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 130
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "black"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.cycCur
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 160
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.cpuTime.toFixed(1)
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 190
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.cpuAvg.toFixed(2)
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 220
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: parent.parent.appInfo.cpuCur.toFixed(2)
+		    }
+		}
+
+		Rectangle {
+	        x: 0
+	        y: 250
+	        width: parent.width
+	        height: 30
+	        border.width: 1
+			border.color: "lightgrey"
+	        radius: 5
+		    Text {
+		        font.pixelSize: 14
+	            anchors.centerIn: parent
+		        text: sec2HMS(parent.parent.appInfo.upTime)
+		    }
+		}
+
+	    Rectangle {
+	        x: 0
+	        y: 330
+	        height: 30
+	        width: parent.width
+			Button {
+	            text: "Pause"
+	            anchors.fill: parent
+	            onClicked: parent.parent.appInfo.pause()
+	            enabled: (parent.parent.appInfo.state !== QGfaAppCtrl.STATE_NOT_RUNNING) && (parent.parent.appInfo.state !== QGfaAppCtrl.STATE_PAUSED)
+			}
+	    }
+
+	    Rectangle {
+	        x: 0
+	        y: 370
+	        height: 30
+	        width: parent.width
+			Button {
+	            text: "Resume"
+	            anchors.fill: parent
+	            onClicked: parent.parent.appInfo.resume()
+	            enabled: (parent.parent.appInfo.state === QGfaAppCtrl.STATE_PAUSED)
+			}
+	    }
+
+	    Rectangle {
+	        x: 0
+	        y: 410
+	        height: 30
+	        width: parent.width
+			Button {
+	            text: "Stop"
+	            anchors.fill: parent
+	            onClicked: parent.parent.appInfo.stop()
+                enabled: (parent.parent.appInfo.state !== QGfaAppCtrl.STATE_NOT_RUNNING)
+			}
+	    }
+	}
 }
 }

+ 242 - 88
Test/qmlApp/qappctrl.cpp

@@ -9,7 +9,7 @@
 #define _APP_INDEX_FROM_APP_ID(aid)						(ffsll(aid) - 1)
 #define _APP_INDEX_FROM_APP_ID(aid)						(ffsll(aid) - 1)
 #define _IS_POWER_OF_2(x)								(!!(x) && !((x) & ((x) - 1)))
 #define _IS_POWER_OF_2(x)								(!!(x) && !((x) & ((x) - 1)))
 #define _IS_VALID_APP_ID(i)								_IS_POWER_OF_2(i)
 #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_2_US(ts)								(((clock64_t)(ts).tv_sec) * 1000000LL + ((clock64_t)(ts).tv_nsec) / 1000LL)
 #define _TIMESPEC_DIFF(ts1, ts2)						(_TIMESPEC_2_US(ts1) - _TIMESPEC_2_US(ts2))
 #define _TIMESPEC_DIFF(ts1, ts2)						(_TIMESPEC_2_US(ts1) - _TIMESPEC_2_US(ts2))
 #define _MIN_TIMER_INT									20
 #define _MIN_TIMER_INT									20
 
 
@@ -20,8 +20,13 @@
 QGfaAppInfo::QGfaAppInfo(int nIndex, QObject *pParent) :	QObject(pParent),
 QGfaAppInfo::QGfaAppInfo(int nIndex, QObject *pParent) :	QObject(pParent),
 															m_state(GIAS_StateNotRunning),
 															m_state(GIAS_StateNotRunning),
 															m_nIndex(nIndex),
 															m_nIndex(nIndex),
+															m_cycCur(0),
 															m_cycMin(0),
 															m_cycMin(0),
-															m_cycMax(0)
+															m_cycMax(0),
+															m_upTime(0),
+															m_cpuTime(0.0),
+															m_cpuPercCur(0.0),
+															m_cpuPercAvg(0.0)
 {
 {
 	m_nAppID = 1ull << m_nIndex;
 	m_nAppID = 1ull << m_nIndex;
 	setStateText(m_state);
 	setStateText(m_state);
@@ -29,7 +34,7 @@ QGfaAppInfo::QGfaAppInfo(int nIndex, QObject *pParent) :	QObject(pParent),
 
 
 QGfaAppInfo::~QGfaAppInfo(void)
 QGfaAppInfo::~QGfaAppInfo(void)
 {
 {
-	this->disconnect();		
+	this->disconnect();
 }
 }
 
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
@@ -39,29 +44,17 @@ int QGfaAppInfo::state(void) const
 	return m_state;
 	return m_state;
 }
 }
 
 
-void QGfaAppInfo::setState(int val)
+bool QGfaAppInfo::setState(int val)
 {
 {
 	if(m_state != val)
 	if(m_state != val)
 	{
 	{
 		m_state = val;
 		m_state = val;
 		emit stateChanged(val);
 		emit stateChanged(val);
 		setStateText(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);
-			}
-		}
+		return true;
 	}
 	}
+
+	return false;
 }
 }
 
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
@@ -99,6 +92,11 @@ void QGfaAppInfo::setName(const QString &val)
 
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 
 
+quint64 QGfaAppInfo::cycCur(void) const
+{
+	return m_cycCur;
+}
+
 quint64 QGfaAppInfo::cycMin(void) const
 quint64 QGfaAppInfo::cycMin(void) const
 {
 {
 	return m_cycMin;
 	return m_cycMin;
@@ -109,20 +107,159 @@ quint64 QGfaAppInfo::cycMax(void) const
 	return m_cycMax;
 	return m_cycMax;
 }
 }
 
 
-void QGfaAppInfo::setAppTimes(LPCGFA_APPCTRL_APPTIMES pat)
+quint64 QGfaAppInfo::upTime(void) const
+{
+	return m_upTime;
+}
+
+double QGfaAppInfo::cpuTime(void) const
+{
+	return m_cpuTime;
+}
+
+double QGfaAppInfo::cpuCur(void) const
+{
+	return m_cpuPercCur;
+}
+
+double QGfaAppInfo::cpuAvg(void) const
+{
+	return m_cpuPercAvg;
+}
+
+void QGfaAppInfo::setAppTimes(LPCGFA_APPCTRL_APPTIMES pat, GfaIpcAppStates state, bool bDoHeavyLoadUpdate)
 {
 {
 	if(pat)
 	if(pat)
 	{
 	{
-		if(m_cycMin != (quint64)pat->nCycleMin)
+		if(state == GIAS_Running)
+		{
+			if(m_cycMin != (quint64)pat->nCycleMinUs)
+			{
+				m_cycMin = (quint64)pat->nCycleMinUs;
+				emit cycMinChanged(m_cycMin);
+			}
+
+			if(m_cycMax != (quint64)pat->nCycleMaxUs)
+			{
+				m_cycMax = (quint64)pat->nCycleMaxUs;
+				emit cycMaxChanged(m_cycMax);
+			}
+		}
+		else
 		{
 		{
-			m_cycMin = (quint64)pat->nCycleMin;
-			emit cycMinChanged(m_cycMin);
+			if(m_cycCur != 0)
+			{
+				m_cycCur = 0;
+				emit cycCurChanged(m_cycCur);
+			}
 		}
 		}
 
 
-		if(m_cycMax != (quint64)pat->nCycleMax)
+		if(bDoHeavyLoadUpdate)
 		{
 		{
-			m_cycMax = (quint64)pat->nCycleMax;
-			emit cycMaxChanged(m_cycMax);
+			quint64 upTime = time(NULL) - pat->nTsStart;
+			
+			if(m_upTime != upTime)
+			{
+				m_upTime = upTime;
+				emit upTimeChanged(m_upTime);
+			}
+
+			if(state == GIAS_Running)
+			{
+				if(m_cycCur != (quint64)pat->nCycleLastUs)
+				{
+					m_cycCur = (quint64)pat->nCycleLastUs;
+					emit cycCurChanged(m_cycCur);
+				}
+			}
+			
+			if(state != GIAS_Hanging)
+			{
+				if(m_cpuTime != pat->fCpuTime)
+				{
+					m_cpuTime = pat->fCpuTime;
+					emit cpuTimeChanged(m_cpuTime);
+				}
+				
+				if(m_cpuPercCur != pat->fCpuCur)
+				{
+					m_cpuPercCur = pat->fCpuCur;
+					emit cpuCurChanged(m_cpuPercCur);
+				}
+				
+				if(m_cpuPercAvg != pat->fCpuAvg)
+				{
+					m_cpuPercAvg = pat->fCpuAvg;
+					emit cpuAvgChanged(m_cpuPercAvg);
+				}
+			}
+		}
+	}
+	else
+	{
+		if(m_cycCur != 0)
+		{
+			m_cycCur = 0;
+			emit cycCurChanged(m_cycCur);
+		}
+
+		if(state == GIAS_Hanging)
+		{
+			if(m_cpuTime != -1)
+			{
+				m_cpuTime = -1;
+				emit cpuTimeChanged(m_cpuTime);
+			}
+			
+			if(m_cpuPercCur != -1)
+			{
+				m_cpuPercCur = -1;
+				emit cpuCurChanged(m_cpuPercCur);
+			}
+			
+			if(m_cpuPercAvg != -1)
+			{
+				m_cpuPercAvg = -1;
+				emit cpuAvgChanged(m_cpuPercAvg);
+			}
+		}
+		else
+		{
+			if(m_cycMin != 0)
+			{
+				m_cycMin = 0;
+				emit cycMinChanged(m_cycMin);
+			}
+
+			if(m_cycMax != 0)
+			{
+				m_cycMax = 0;
+				emit cycMaxChanged(m_cycMax);
+			}
+
+			if(m_upTime != 0)
+			{
+				m_upTime = 0;
+				emit upTimeChanged(m_upTime);
+			}
+				
+			if(m_cpuTime != 0)
+			{
+				m_cpuTime = 0;
+				emit cpuTimeChanged(m_cpuTime);
+			}
+			
+			if(m_cpuPercCur != 0)
+			{
+				m_cpuPercCur = 0;
+				emit cpuCurChanged(m_cpuPercCur);
+			}
+			
+			if(m_cpuPercAvg != 0)
+			{
+				m_cpuPercAvg = 0;
+				emit cpuAvgChanged(m_cpuPercAvg);
+			}
 		}
 		}
 	}
 	}
 }
 }
@@ -158,7 +295,9 @@ QGfaAppCtrl::QGfaAppCtrl(QObject *pParent) :	QObject(pParent),
 												m_curPass(0),
 												m_curPass(0),
 												m_minPass(LLONG_MAX),
 												m_minPass(LLONG_MAX),
 												m_maxPass(LLONG_MIN),
 												m_maxPass(LLONG_MIN),
-												m_nEvtSrcs(0)
+												m_avgPass(0),
+												m_nEvtSrcs(0),
+												m_nHeavyLoadUpdateIntervalUs(2500000)
 {
 {
 	for(int i = 0; i < _APP_CTRL_MAX_SLOTS; ++i)
 	for(int i = 0; i < _APP_CTRL_MAX_SLOTS; ++i)
 	{
 	{
@@ -166,6 +305,8 @@ QGfaAppCtrl::QGfaAppCtrl(QObject *pParent) :	QObject(pParent),
 		connect(pai, SIGNAL(sendControlMessage(appid_t, ctrlmsg_t)), SLOT(onSendControlMessage(appid_t, ctrlmsg_t)));
 		connect(pai, SIGNAL(sendControlMessage(appid_t, ctrlmsg_t)), SLOT(onSendControlMessage(appid_t, ctrlmsg_t)));
 		m_appInfo.append(pai);
 		m_appInfo.append(pai);
 	}
 	}
+
+	memset(&m_tsLastHeavyLoadUpdate, 0, sizeof(m_tsLastHeavyLoadUpdate));
 }
 }
 
 
 QGfaAppCtrl::~QGfaAppCtrl(void)
 QGfaAppCtrl::~QGfaAppCtrl(void)
@@ -180,16 +321,19 @@ QGfaAppCtrl::~QGfaAppCtrl(void)
 
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 
 
-bool QGfaAppCtrl::Create(appid_t nAppID, const char *pszDisplayName, int nTimerIntMs)
+bool QGfaAppCtrl::Create(appid_t nAppID, const char *pszDisplayName, int nTimerIntMs, clock64_t nHeavyLoadUpdateIntervalMs)
 {
 {
 	if(!m_hAC)
 	if(!m_hAC)
 	{
 	{
 		if(nTimerIntMs < _MIN_TIMER_INT)
 		if(nTimerIntMs < _MIN_TIMER_INT)
 			nTimerIntMs = _MIN_TIMER_INT;
 			nTimerIntMs = _MIN_TIMER_INT;
+		if(nHeavyLoadUpdateIntervalMs < (nTimerIntMs * 50))
+			nHeavyLoadUpdateIntervalMs = (nTimerIntMs * 50);
 
 
 		if((m_hAC = ::GfaIpcAppCtrlAcquire(nAppID, pszDisplayName, (clock64_t)(nTimerIntMs * 1000 * 2))))
 		if((m_hAC = ::GfaIpcAppCtrlAcquire(nAppID, pszDisplayName, (clock64_t)(nTimerIntMs * 1000 * 2))))
 		{
 		{
 			m_nAppID = nAppID;
 			m_nAppID = nAppID;
+			m_nHeavyLoadUpdateIntervalUs = nHeavyLoadUpdateIntervalMs * 1000;
 			m_nTimerID = startTimer(nTimerIntMs, Qt::CoarseTimer);
 			m_nTimerID = startTimer(nTimerIntMs, Qt::CoarseTimer);
 		}
 		}
 	}
 	}
@@ -213,9 +357,9 @@ void QGfaAppCtrl::Release(void)
 
 
 void QGfaAppCtrl::RegisterQmlTypes(QQmlEngine &rEng, int nVerMajor, int nVerMinor)
 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);
+	qmlRegisterUncreatableType<QGfaAppInfo>("com.gfa.ipc.appctrl", nVerMajor, nVerMinor, "QGfaAppInfo", QStringLiteral("class not creatable in QML"));
+	qmlRegisterUncreatableType<QGfaAppCtrl>("com.gfa.ipc.appctrl", nVerMajor, nVerMinor, "QGfaAppCtrl", QStringLiteral("class not creatable in QML"));
+	rEng.rootContext()->setContextProperty(QStringLiteral("qGfaAppCtrl"), this);
 }
 }
 
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
@@ -244,8 +388,8 @@ bool QGfaAppCtrl::SubscribeStateEvents(appid_t nAppMask)
 
 
 void QGfaAppCtrl::timerEvent(QTimerEvent *event)
 void QGfaAppCtrl::timerEvent(QTimerEvent *event)
 {
 {
-	struct timespec	tsStart, tsEnd;
-	::clock_gettime(CLOCK_MONOTONIC, &tsStart);
+	struct timespec	tsEnterUpdate, tsLeaveUpdate;
+	::clock_gettime(CLOCK_MONOTONIC, &tsEnterUpdate);
 
 
 	if((event->timerId() == m_nTimerID) && m_hAC)
 	if((event->timerId() == m_nTimerID) && m_hAC)
 	{
 	{
@@ -254,10 +398,11 @@ void QGfaAppCtrl::timerEvent(QTimerEvent *event)
 		if((hAI = ::GfaIpcAppCtrlInfoUpdate(m_hAC)))
 		if((hAI = ::GfaIpcAppCtrlInfoUpdate(m_hAC)))
 		{
 		{
 			int b;
 			int b;
-		    ctrlmsg_t nCtrlMsg;
 		    appid_t app, nAppIdSrc;
 		    appid_t app, nAppIdSrc;
 			GFA_APPCTRL_APPTIMES at;
 			GFA_APPCTRL_APPTIMES at;
 			char szDispName[128];
 			char szDispName[128];
+#if 0
+		    ctrlmsg_t nCtrlMsg;
 
 
 			while((nCtrlMsg = ::GfaIpcAppCtrlGetNextCtrlMsg(hAI)))
 			while((nCtrlMsg = ::GfaIpcAppCtrlGetNextCtrlMsg(hAI)))
 			{
 			{
@@ -273,14 +418,23 @@ void QGfaAppCtrl::timerEvent(QTimerEvent *event)
 					break;
 					break;
 				}
 				}
 			}
 			}
+#endif
 
 
 			while((nAppIdSrc = ::GfaIpcAppCtrlGetNextStateEvtSrc(hAI)))
 			while((nAppIdSrc = ::GfaIpcAppCtrlGetNextStateEvtSrc(hAI)))
 			{
 			{
 				GfaIpcAppStates state = ::GfaIpcAppCtrlGetState(m_hAC, nAppIdSrc);
 				GfaIpcAppStates state = ::GfaIpcAppCtrlGetState(m_hAC, nAppIdSrc);
 				int nIndex = appIndexFromAppID(nAppIdSrc);
 				int nIndex = appIndexFromAppID(nAppIdSrc);
 				QGfaAppInfo &ai = *m_appInfo[nIndex];
 				QGfaAppInfo &ai = *m_appInfo[nIndex];
-				ai.setState(state);
-				
+				bool bStateChanged = ai.setState(state);
+
+				if(bStateChanged)
+				{
+					if(state == GIAS_Running)
+						memset(&m_tsLastHeavyLoadUpdate, 0, sizeof(m_tsLastHeavyLoadUpdate));
+					else if(state != GIAS_Paused)
+						ai.setAppTimes(NULL, state);
+				}
+
 				if((state >= GIAS_StateNotRunning) && (state <= GIAS_Paused))
 				if((state >= GIAS_StateNotRunning) && (state <= GIAS_Paused))
 				{
 				{
 					if(::GfaIpcAppCtrlGetDisplayName(m_hAC, nAppIdSrc, szDispName, sizeof(szDispName)))
 					if(::GfaIpcAppCtrlGetDisplayName(m_hAC, nAppIdSrc, szDispName, sizeof(szDispName)))
@@ -288,52 +442,68 @@ void QGfaAppCtrl::timerEvent(QTimerEvent *event)
 						ai.setName(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;
 			nAppIdSrc = m_nEvtSrcs;
-			
+			bool bDontSaveLast = false, bUpdate = (_TIMESPEC_DIFF(tsEnterUpdate, m_tsLastHeavyLoadUpdate) >= m_nHeavyLoadUpdateIntervalUs);
+
 			while(nAppIdSrc)
 			while(nAppIdSrc)
 			{
 			{
 				b = ffsll(nAppIdSrc) - 1;
 				b = ffsll(nAppIdSrc) - 1;
 				app = ((appid_t)0x1 << b);
 				app = ((appid_t)0x1 << b);
 				nAppIdSrc &= ~app;
 				nAppIdSrc &= ~app;
 				GfaIpcAppStates state = ::GfaIpcAppCtrlGetState(m_hAC, app);
 				GfaIpcAppStates state = ::GfaIpcAppCtrlGetState(m_hAC, app);
-				
-				if(state == GIAS_Running)
+
+				if(::GfaIpcAppCtrlGetAppTimes(m_hAC, app, &at) >= 0)
 				{
 				{
-					if(::GfaIpcAppCtrlGetAppTimes(m_hAC, app, &at) >= 0)
+					if(!at.nCycleLastUs)
 					{
 					{
-						QGfaAppInfo &ai = *m_appInfo[b];
-						ai.setAppTimes(&at);
+						bDontSaveLast = true;
+						continue;
 					}
 					}
+
+					QGfaAppInfo &ai = *m_appInfo[b];
+					ai.setAppTimes(&at, state, bUpdate);
 				}
 				}
 			}
 			}
+
+			if(bUpdate && !bDontSaveLast)
+				m_tsLastHeavyLoadUpdate = tsEnterUpdate;
 		}
 		}
 	}
 	}
 
 
-	::clock_gettime(CLOCK_MONOTONIC, &tsEnd);
-	m_curPass = _TIMESPEC_DIFF(tsEnd, tsStart);
-	
+	::clock_gettime(CLOCK_MONOTONIC, &tsLeaveUpdate);
+	m_curPass = _TIMESPEC_DIFF(tsLeaveUpdate, tsEnterUpdate);
+
 	if(m_minPass > m_curPass)
 	if(m_minPass > m_curPass)
 	{
 	{
 		m_minPass = m_curPass;
 		m_minPass = m_curPass;
-		TRACE("Min pass: %llu us\n", m_minPass);
+		emit minPassChanged(m_minPass);
 	}
 	}
 
 
 	if(m_maxPass < m_curPass)
 	if(m_maxPass < m_curPass)
 	{
 	{
 		m_maxPass = m_curPass;
 		m_maxPass = m_curPass;
-		TRACE("Max pass: %llu us\n", m_maxPass);
+		emit maxPassChanged(m_maxPass);
+	}
+	
+	if(!m_avgPass)
+	{
+		m_avgPass = m_curPass;
+		emit avgPassChanged(m_avgPass);
+	}
+	else
+	{
+		static uint64_t nPasses = 0;
+		++nPasses;
+//		clock64_t avgPass = (m_avgPass + m_curPass) / 2;
+		clock64_t avgPass = (clock64_t)sqrt(double((m_avgPass * m_avgPass + m_curPass * m_curPass) / 2));
+		if(m_avgPass != avgPass)
+		{
+			m_avgPass = avgPass;
+			if(!(nPasses % 50))
+				emit avgPassChanged(m_avgPass);
+		}
 	}
 	}
 }
 }
 
 
@@ -356,49 +526,33 @@ int QGfaAppCtrl::SetState(int nState)
 
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 
 
-int QGfaAppCtrl::appIndexFromAppID(quint64 nAppID)
+quint64 QGfaAppCtrl::minPass(void) const
 {
 {
-	if(_IS_VALID_APP_ID(nAppID))
-		return _APP_INDEX_FROM_APP_ID(nAppID);
-	return _INVALID_SLOT_INDEX;
+	return m_minPass;
 }
 }
 
 
-/////////////////////////////////////////////////////////////////////////////
-
-QQmlListProperty<QGfaAppInfo> QGfaAppCtrl::appInfo(void)
+quint64 QGfaAppCtrl::maxPass(void) const
 {
 {
-	return QQmlListProperty<QGfaAppInfo>(this, m_appInfo);
+	return m_maxPass;
 }
 }
 
 
-/////////////////////////////////////////////////////////////////////////////
-
-int QGfaAppCtrl::idxRemanent(void) const
+quint64 QGfaAppCtrl::avgPass(void) const
 {
 {
-	static const int i = _APP_INDEX_FROM_APP_ID(GFA_APPCTRL_APPID_REMANENT);
-	return i;
+	return m_avgPass;
 }
 }
 
 
-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
+int QGfaAppCtrl::appIndexFromAppID(quint64 nAppID)
 {
 {
-	static const int i = _APP_INDEX_FROM_APP_ID(GFA_APPCTRL_APPID_SUMMARIST);
-	return i;
+	if(_IS_VALID_APP_ID(nAppID))
+		return _APP_INDEX_FROM_APP_ID(nAppID);
+	return _INVALID_SLOT_INDEX;
 }
 }
 
 
-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
+QQmlListProperty<QGfaAppInfo> QGfaAppCtrl::appInfo(void)
 {
 {
-	static const int i = _APP_INDEX_FROM_APP_ID(GFA_APPCTRL_APPID_MQTTCL);
-	return i;
+	return QQmlListProperty<QGfaAppInfo>(this, m_appInfo);
 }
 }
-

+ 62 - 15
Test/qmlApp/qappctrl.h

@@ -20,8 +20,13 @@ class QGfaAppInfo : public QObject
 	Q_PROPERTY(int state READ state NOTIFY stateChanged)
 	Q_PROPERTY(int state READ state NOTIFY stateChanged)
 	Q_PROPERTY(QString stateText READ stateText NOTIFY stateTextChanged)
 	Q_PROPERTY(QString stateText READ stateText NOTIFY stateTextChanged)
 	Q_PROPERTY(QString name READ name NOTIFY nameChanged)
 	Q_PROPERTY(QString name READ name NOTIFY nameChanged)
+	Q_PROPERTY(quint64 cycCur READ cycCur NOTIFY cycCurChanged)
 	Q_PROPERTY(quint64 cycMin READ cycMin NOTIFY cycMinChanged)
 	Q_PROPERTY(quint64 cycMin READ cycMin NOTIFY cycMinChanged)
 	Q_PROPERTY(quint64 cycMax READ cycMax NOTIFY cycMaxChanged)
 	Q_PROPERTY(quint64 cycMax READ cycMax NOTIFY cycMaxChanged)
+	Q_PROPERTY(quint64 upTime READ upTime NOTIFY upTimeChanged)
+	Q_PROPERTY(double cpuTime READ cpuTime NOTIFY cpuTimeChanged)
+	Q_PROPERTY(double cpuCur READ cpuCur NOTIFY cpuCurChanged)
+	Q_PROPERTY(double cpuAvg READ cpuAvg NOTIFY cpuAvgChanged)
 
 
 public:
 public:
 	Q_INVOKABLE bool pause(void);
 	Q_INVOKABLE bool pause(void);
@@ -33,15 +38,20 @@ signals:
 	void stateTextChanged(const QString &val);
 	void stateTextChanged(const QString &val);
 	void nameChanged(const QString &val);
 	void nameChanged(const QString &val);
 	void sendControlMessage(appid_t nAppID, ctrlmsg_t msg);
 	void sendControlMessage(appid_t nAppID, ctrlmsg_t msg);
+	void cycCurChanged(quint64 val);
 	void cycMinChanged(quint64 val);
 	void cycMinChanged(quint64 val);
 	void cycMaxChanged(quint64 val);
 	void cycMaxChanged(quint64 val);
+	void upTimeChanged(quint64 val);
+	void cpuTimeChanged(double val);
+	void cpuCurChanged(double val);
+	void cpuAvgChanged(double val);
 
 
 public:
 public:
 	explicit QGfaAppInfo(int nIndex, QObject *pParent = NULL);
 	explicit QGfaAppInfo(int nIndex, QObject *pParent = NULL);
 	virtual ~QGfaAppInfo(void);
 	virtual ~QGfaAppInfo(void);
 
 
 	int state(void) const;
 	int state(void) const;
-	void setState(int val);
+	bool setState(int val);
 
 
 	QString stateText(void) const;
 	QString stateText(void) const;
 	void setStateText(int val);
 	void setStateText(int val);
@@ -49,9 +59,15 @@ public:
 	QString name(void) const;
 	QString name(void) const;
 	void setName(const QString &val);
 	void setName(const QString &val);
 	
 	
+	quint64 cycCur(void) const;
 	quint64 cycMin(void) const;
 	quint64 cycMin(void) const;
 	quint64 cycMax(void) const;
 	quint64 cycMax(void) const;
-	void setAppTimes(LPCGFA_APPCTRL_APPTIMES pat);
+	quint64 upTime(void) const;
+	double cpuTime(void) const;
+	double cpuCur(void) const;
+	double cpuAvg(void) const;
+
+	void setAppTimes(LPCGFA_APPCTRL_APPTIMES pat, GfaIpcAppStates state, bool bDoHeavyLoadUpdate = false);
 
 
 private:
 private:
 
 
@@ -61,8 +77,13 @@ private:
 	QString m_name;
 	QString m_name;
 	int m_nIndex;
 	int m_nIndex;
 	appid_t m_nAppID;
 	appid_t m_nAppID;
+	quint64 m_cycCur;
 	quint64 m_cycMin;
 	quint64 m_cycMin;
 	quint64 m_cycMax;
 	quint64 m_cycMax;
+	quint64 m_upTime;
+	double m_cpuTime;
+	double m_cpuPercCur;
+	double m_cpuPercAvg;
 };
 };
 
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
@@ -71,17 +92,43 @@ class QGfaAppCtrl : public QObject
 {
 {
     Q_OBJECT
     Q_OBJECT
     Q_PROPERTY(QQmlListProperty<QGfaAppInfo> appInfo READ appInfo CONSTANT)
     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)
+	Q_PROPERTY(quint64 minPass READ minPass NOTIFY minPassChanged)
+	Q_PROPERTY(quint64 maxPass READ maxPass NOTIFY maxPassChanged)
+	Q_PROPERTY(quint64 avgPass READ avgPass NOTIFY avgPassChanged)
+
+public:
+	enum AppStates
+	{
+		STATE_NOT_RUNNING	= GIAS_StateNotRunning,
+		STATE_INITIALIZING,
+		STATE_RUNNING,
+		STATE_PAUSED,
+		STATE_HANGING,
+		STATE_TERMINATING,
+		STATE_INVALID
+	};
+	Q_ENUM(AppStates)
+	
+	enum AppIndex
+	{
+		APP_INDEX_REMANENT		= GAI_Remanent,
+		APP_INDEX_DATALOGGER	= GAI_Datalogger,
+		APP_INDEX_SUMMARIST		= GAI_Summarist,
+		APP_INDEX_REST			= GAI_Rest,
+		APP_INDEX_MQTTCL		= GAI_Mqttcl
+	};
+	Q_ENUM(AppIndex)
+
+signals:
+	void minPassChanged(quint64 val);
+	void maxPassChanged(quint64 val);
+	void avgPassChanged(quint64 val);
 
 
 public:
 public:
 	explicit QGfaAppCtrl(QObject *pParent = NULL);
 	explicit QGfaAppCtrl(QObject *pParent = NULL);
 	virtual ~QGfaAppCtrl(void);
 	virtual ~QGfaAppCtrl(void);
 
 
-	bool Create(appid_t nAppID, const char *pszDisplayName, int nTimerIntMs);
+	bool Create(appid_t nAppID, const char *pszDisplayName, int nTimerIntMs, clock64_t nHeavyLoadUpdateIntervalMs);
 	void Release(void);
 	void Release(void);
 	void RegisterQmlTypes(QQmlEngine &rEng, int nVerMajor = 1, int nVerMinor = 0);
 	void RegisterQmlTypes(QQmlEngine &rEng, int nVerMajor = 1, int nVerMinor = 0);
 	bool PresetDisplayName(appid_t nAppID, const char *pszName);
 	bool PresetDisplayName(appid_t nAppID, const char *pszName);
@@ -91,17 +138,14 @@ public:
 public:
 public:
 	Q_INVOKABLE int appIndexFromAppID(quint64 nAppID);
 	Q_INVOKABLE int appIndexFromAppID(quint64 nAppID);
 
 
+public:
 	QQmlListProperty<QGfaAppInfo> appInfo(void);
 	QQmlListProperty<QGfaAppInfo> appInfo(void);
-	int idxRemanent(void) const;
-	int idxDatalogger(void) const;
-	int idxSummarist(void) const;
-	int idxRest(void) const;
-	int idxMqttCl(void) const;
+	quint64 minPass(void) const;
+	quint64 maxPass(void) const;
+	quint64 avgPass(void) const;
 
 
 private slots:
 private slots:
 	void onSendControlMessage(appid_t nAppID, ctrlmsg_t msg);
 	void onSendControlMessage(appid_t nAppID, ctrlmsg_t msg);
-
-private:
 	void timerEvent(QTimerEvent *event) override;
 	void timerEvent(QTimerEvent *event) override;
 
 
 private:
 private:
@@ -112,7 +156,10 @@ private:
 	clock64_t m_curPass;
 	clock64_t m_curPass;
 	clock64_t m_minPass;
 	clock64_t m_minPass;
 	clock64_t m_maxPass;
 	clock64_t m_maxPass;
+	clock64_t m_avgPass;
 	appid_t m_nEvtSrcs;
 	appid_t m_nEvtSrcs;
+	clock64_t m_nHeavyLoadUpdateIntervalUs;
+	struct timespec m_tsLastHeavyLoadUpdate;
 };
 };
 
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////

+ 7 - 2
Test/test.pri

@@ -3,23 +3,28 @@ CONFIG += console
 CONFIG -= app_bundle
 CONFIG -= app_bundle
 CONFIG -= qt
 CONFIG -= qt
 
 
+QMAKE_LFLAGS += -Wl,-rpath=/usr/lib/gfa
+
 CONFIG(debug, debug|release) {
 CONFIG(debug, debug|release) {
     QMAKE_CXXFLAGS -= -Os -pthread
     QMAKE_CXXFLAGS -= -Os -pthread
     QMAKE_CFLAGS -= -Os -pthread
     QMAKE_CFLAGS -= -Os -pthread
     QMAKE_CXXFLAGS += -D_DEBUG
     QMAKE_CXXFLAGS += -D_DEBUG
     QMAKE_CFLAGS += -D_DEBUG
     QMAKE_CFLAGS += -D_DEBUG
-	QMAKE_LIBS += -lgfaipcd -pthread
+	QMAKE_LIBS += -lgfaipcd -lgfasitarautilsd -pthread
 }
 }
 
 
 CONFIG(release, debug|release) {
 CONFIG(release, debug|release) {
-	QMAKE_LIBS += -lgfaipc -pthread
+	QMAKE_LIBS += -lgfaipc -lgfasitarautils -pthread
 }
 }
 
 
 linux-buildroot-g++ {
 linux-buildroot-g++ {
     QMAKE_CXXFLAGS += -D_TARGET_BUILD
     QMAKE_CXXFLAGS += -D_TARGET_BUILD
     QMAKE_CFLAGS += -D_TARGET_BUILD
     QMAKE_CFLAGS += -D_TARGET_BUILD
+    QMAKE_LIBDIR += $$(SITARA_TOOLCHAIN_ROOT)/usr/arm-buildroot-linux-gnueabihf/sysroot/usr/lib/gfa
     target.path += /opt/GfA/ipc/test
     target.path += /opt/GfA/ipc/test
 	INSTALLS += target
 	INSTALLS += target
+} else {
+	QMAKE_LIBDIR += /usr/lib/gfa
 }
 }
 
 
 SOURCES += ../main.cpp
 SOURCES += ../main.cpp

+ 133 - 133
gfaipc.pro.user

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE QtCreatorProject>
 <!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 4.11.0, 2020-02-06T09:10:40. -->
+<!-- Written by QtCreator 4.11.1, 2020-02-15T05:35:42. -->
 <qtcreator>
 <qtcreator>
  <data>
  <data>
   <variable>EnvironmentId</variable>
   <variable>EnvironmentId</variable>
@@ -59,14 +59,14 @@
  <data>
  <data>
   <variable>ProjectExplorer.Project.Target.0</variable>
   <variable>ProjectExplorer.Project.Target.0</variable>
   <valuemap type="QVariantMap">
   <valuemap type="QVariantMap">
-   <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="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.ActiveBuildConfiguration">0</value>
    <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">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">0</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/wrk/share/gfaipc/Debug/Desktop_Qt_5_7_1_GCC_64bit</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/wrk/share/gfaipc/Debug/Sitara_1</value>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
@@ -88,7 +88,7 @@
      </valuemap>
      </valuemap>
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.2">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.2">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProcessStep.Arguments">%{CurrentBuild:Name} %{CurrentKit:Name}</value>
+      <value type="QString" key="ProjectExplorer.ProcessStep.Arguments">%{CurrentBuild:Name} &quot;%{CurrentKit:Name}&quot; %{Device:UserName} %{Device:HostAddress} %{Device:KeyFile}</value>
       <value type="QString" key="ProjectExplorer.ProcessStep.Command">/home/wrk/share/gfaipc/distribute.sh</value>
       <value type="QString" key="ProjectExplorer.ProcessStep.Command">/home/wrk/share/gfaipc/distribute.sh</value>
       <value type="QString" key="ProjectExplorer.ProcessStep.WorkingDirectory">%{buildDir}</value>
       <value type="QString" key="ProjectExplorer.ProcessStep.WorkingDirectory">%{buildDir}</value>
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.ProcessStep</value>
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.ProcessStep</value>
@@ -121,7 +121,7 @@
     <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
     <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
    </valuemap>
    </valuemap>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/wrk/share/gfaipc/Release/Desktop_Qt_5_7_1_GCC_64bit</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/wrk/share/gfaipc/Release/Sitara_1</value>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
@@ -143,7 +143,7 @@
      </valuemap>
      </valuemap>
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.2">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.2">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProcessStep.Arguments">%{CurrentBuild:Name} %{CurrentKit:Name}</value>
+      <value type="QString" key="ProjectExplorer.ProcessStep.Arguments">%{CurrentBuild:Name} &quot;%{CurrentKit:Name}&quot; %{Device:UserName} %{Device:HostAddress} %{Device:KeyFile}</value>
       <value type="QString" key="ProjectExplorer.ProcessStep.Command">/home/wrk/share/gfaipc/distribute.sh</value>
       <value type="QString" key="ProjectExplorer.ProcessStep.Command">/home/wrk/share/gfaipc/distribute.sh</value>
       <value type="QString" key="ProjectExplorer.ProcessStep.WorkingDirectory">%{buildDir}</value>
       <value type="QString" key="ProjectExplorer.ProcessStep.WorkingDirectory">%{buildDir}</value>
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.ProcessStep</value>
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.ProcessStep</value>
@@ -178,13 +178,47 @@
    <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">2</value>
    <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">2</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">RemoteLinux.CheckForFreeDiskSpaceStep</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"/>
+      <value type="QString" key="RemoteLinux.CheckForFreeDiskSpaceStep.PathToCheck">/</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.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="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">3</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</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.DisplayName">Deploy</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
     </valuemap>
     </valuemap>
     <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
     <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">DeployToGenericLinux</value>
    </valuemap>
    </valuemap>
    <value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
    <value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
@@ -262,20 +296,98 @@
     <value type="QString" key="RunConfiguration.WorkingDirectory"></value>
     <value type="QString" key="RunConfiguration.WorkingDirectory"></value>
     <value type="QString" key="RunConfiguration.WorkingDirectory.default"></value>
     <value type="QString" key="RunConfiguration.WorkingDirectory.default"></value>
    </valuemap>
    </valuemap>
-   <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
+   <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>
+    <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.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">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">2</value>
   </valuemap>
   </valuemap>
  </data>
  </data>
  <data>
  <data>
   <variable>ProjectExplorer.Project.Target.1</variable>
   <variable>ProjectExplorer.Project.Target.1</variable>
   <valuemap type="QVariantMap">
   <valuemap type="QVariantMap">
-   <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="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.ActiveBuildConfiguration">0</value>
    <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">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">0</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/wrk/share/gfaipc/Debug/Sitara_1</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/wrk/share/gfaipc/Debug/Desktop_Qt_5_7_1_GCC_64bit</value>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
@@ -297,7 +409,7 @@
      </valuemap>
      </valuemap>
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.2">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.2">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProcessStep.Arguments">%{CurrentBuild:Name} &quot;%{CurrentKit:Name}&quot; %{Device:UserName} %{Device:HostAddress} %{Device:KeyFile}</value>
+      <value type="QString" key="ProjectExplorer.ProcessStep.Arguments">%{CurrentBuild:Name} %{CurrentKit:Name}</value>
       <value type="QString" key="ProjectExplorer.ProcessStep.Command">/home/wrk/share/gfaipc/distribute.sh</value>
       <value type="QString" key="ProjectExplorer.ProcessStep.Command">/home/wrk/share/gfaipc/distribute.sh</value>
       <value type="QString" key="ProjectExplorer.ProcessStep.WorkingDirectory">%{buildDir}</value>
       <value type="QString" key="ProjectExplorer.ProcessStep.WorkingDirectory">%{buildDir}</value>
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.ProcessStep</value>
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.ProcessStep</value>
@@ -330,7 +442,7 @@
     <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
     <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
    </valuemap>
    </valuemap>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
-    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/wrk/share/gfaipc/Release/Sitara_1</value>
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/wrk/share/gfaipc/Release/Desktop_Qt_5_7_1_GCC_64bit</value>
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
@@ -352,7 +464,7 @@
      </valuemap>
      </valuemap>
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.2">
      <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.2">
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
       <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" key="ProjectExplorer.ProcessStep.Arguments">%{CurrentBuild:Name} &quot;%{CurrentKit:Name}&quot; %{Device:UserName} %{Device:HostAddress} %{Device:KeyFile}</value>
+      <value type="QString" key="ProjectExplorer.ProcessStep.Arguments">%{CurrentBuild:Name} %{CurrentKit:Name}</value>
       <value type="QString" key="ProjectExplorer.ProcessStep.Command">/home/wrk/share/gfaipc/distribute.sh</value>
       <value type="QString" key="ProjectExplorer.ProcessStep.Command">/home/wrk/share/gfaipc/distribute.sh</value>
       <value type="QString" key="ProjectExplorer.ProcessStep.WorkingDirectory">%{buildDir}</value>
       <value type="QString" key="ProjectExplorer.ProcessStep.WorkingDirectory">%{buildDir}</value>
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.ProcessStep</value>
       <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.ProcessStep</value>
@@ -387,47 +499,13 @@
    <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">2</value>
    <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">2</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
     <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.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.Id">RemoteLinux.CheckForFreeDiskSpaceStep</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"/>
-      <value type="QString" key="RemoteLinux.CheckForFreeDiskSpaceStep.PathToCheck">/</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.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="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">3</value>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</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.DisplayName">Deploy</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
     </valuemap>
     </valuemap>
     <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
     <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
-    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">DeployToGenericLinux</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
    </valuemap>
    </valuemap>
    <value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
    <value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
@@ -505,85 +583,7 @@
     <value type="QString" key="RunConfiguration.WorkingDirectory"></value>
     <value type="QString" key="RunConfiguration.WorkingDirectory"></value>
     <value type="QString" key="RunConfiguration.WorkingDirectory.default"></value>
     <value type="QString" key="RunConfiguration.WorkingDirectory.default"></value>
    </valuemap>
    </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>
-    <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.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">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">2</value>
+   <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
   </valuemap>
   </valuemap>
  </data>
  </data>
  <data>
  <data>

+ 64 - 32
src/appctrl.cpp

@@ -20,10 +20,11 @@
 #define _IS_VALID_APP_STATE(s)					(((s) >= GIAS_StateNotRunning) && ((s) < GIAS_Invalid))
 #define _IS_VALID_APP_STATE(s)					(((s) >= GIAS_StateNotRunning) && ((s) < GIAS_Invalid))
 #define _IS_VALID_CTRL_MSG(m)					_IS_POWER_OF_2(m)
 #define _IS_VALID_CTRL_MSG(m)					_IS_POWER_OF_2(m)
 #define _APP_INDEX_FROM_APP_ID(aid)				(ffsll(aid) - 1)
 #define _APP_INDEX_FROM_APP_ID(aid)				(ffsll(aid) - 1)
-#define _TIMESPEC_2_US(ts)						(ts.tv_sec * 1000000 + ts.tv_nsec / 1000)
+#define _TIMESPEC_2_US(ts)						(((clock64_t)(ts).tv_sec) * 1000000LL + ((clock64_t)(ts).tv_nsec) / 1000LL)
 #define _TIMESPEC_DIFF(ts1, ts2)				(_TIMESPEC_2_US(ts1) - _TIMESPEC_2_US(ts2))
 #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 _APP_CTRL_MAX_MSG_BITS					((int)(sizeof(ctrlmsg_t) * 8))
 #define _IS_KNOWN_APP_INDEX(i)					(((i) >= 0) && ((i) < (int)_countof(g_pszKnownAppNames)))
 #define _IS_KNOWN_APP_INDEX(i)					(((i) >= 0) && ((i) < (int)_countof(g_pszKnownAppNames)))
+#define _MIN_CPU_UPDATE_INTERVAL_US				5000000
 
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 
 
@@ -67,8 +68,13 @@ HSHM CAppCtrl::m_hShm = NULL;
 CAppCtrl::CAppCtrl(void) :	m_pAppCtrl(NULL),
 CAppCtrl::CAppCtrl(void) :	m_pAppCtrl(NULL),
 							m_nSlotIdx(_INVALID_SLOT_INDEX),
 							m_nSlotIdx(_INVALID_SLOT_INDEX),
 							m_nAppID(0),
 							m_nAppID(0),
-							m_nLockCount(0)
+							m_nLockCount(0),
+							m_nLastTimesCallUs(0)
 {
 {
+	struct timespec	ts;
+	::clock_gettime(CLOCK_MONOTONIC, &ts);
+	m_nClockStartUs = _TIMESPEC_2_US(ts);
+	m_nClkTicksPerSec = sysconf(_SC_CLK_TCK);
 	m_pid = getpid();
 	m_pid = getpid();
 	memset(&m_ai, 0, sizeof(m_ai));
 	memset(&m_ai, 0, sizeof(m_ai));
 }
 }
@@ -140,7 +146,7 @@ bool CAppCtrl::Create(appid_t nAppID, const char *pszDisplayName, clock64_t nMax
 				if(!strcmp(proc.szAppPath, szAppPath))
 				if(!strcmp(proc.szAppPath, szAppPath))
 				{
 				{
 					pid_t pid = getpgid(proc.pid);
 					pid_t pid = getpgid(proc.pid);
-					
+
 					if((pid < 0) && (errno == ESRCH))
 					if((pid < 0) && (errno == ESRCH))
 					{
 					{
 						Release();
 						Release();
@@ -157,10 +163,9 @@ bool CAppCtrl::Create(appid_t nAppID, const char *pszDisplayName, clock64_t nMax
 			{
 			{
 				memset(&proc, 0, sizeof(APP_CTRL_PROCESS));
 				memset(&proc, 0, sizeof(APP_CTRL_PROCESS));
 
 
-				proc.nTsStart	= time(NULL);
-				proc.pid		= m_pid;
-				proc.nAppID		= m_nAppID = nAppID;
-				proc.bInitOnce	= true;
+				proc.at.nTsStart	= time(NULL);
+				proc.pid			= m_pid;
+				proc.nAppID			= m_nAppID = nAppID;
 				proc.at.nMaxHeartbeatDelay = nMaxHeartbeatDelay;
 				proc.at.nMaxHeartbeatDelay = nMaxHeartbeatDelay;
 
 
 				if(pszDisplayName)
 				if(pszDisplayName)
@@ -235,7 +240,7 @@ LPAPP_CTRL_INFO CAppCtrl::AppInfoUpdate(void)
 {
 {
 	if(m_hShm)
 	if(m_hShm)
 	{
 	{
-		struct timespec	tsHeartBeat;
+		struct timespec	tsCur;
 		APP_CTRL_PROCESS &proc	= m_pAppCtrl->proc[m_nSlotIdx];
 		APP_CTRL_PROCESS &proc	= m_pAppCtrl->proc[m_nSlotIdx];
 		CAppCtrlShmLocker locker(*this);
 		CAppCtrlShmLocker locker(*this);
 
 
@@ -244,17 +249,44 @@ LPAPP_CTRL_INFO CAppCtrl::AppInfoUpdate(void)
 		proc.nStateEvtPending	= 0;
 		proc.nStateEvtPending	= 0;
 		proc.nCtrlMsgPending	= 0;
 		proc.nCtrlMsgPending	= 0;
 
 
-		::clock_gettime(CLOCK_MONOTONIC, &tsHeartBeat);
-		proc.nHeartbeatLast = proc.nHeartbeatCur;
-		proc.nHeartbeatCur = _TIMESPEC_2_US(tsHeartBeat);
+		::clock_gettime(CLOCK_MONOTONIC, &tsCur);
+		proc.nHeartbeatLastUs = proc.nHeartbeatCurUs;
+		proc.nHeartbeatCurUs = _TIMESPEC_2_US(tsCur);
 
 
-		if((proc.state == GIAS_Running) && proc.nHeartbeatLast)
+		if(((uint64_t)proc.nHeartbeatCurUs - (uint64_t)m_nLastTimesCallUs) > _MIN_CPU_UPDATE_INTERVAL_US)
 		{
 		{
-			proc.at.nCycleLast = proc.nHeartbeatCur - proc.nHeartbeatLast;
-			if((proc.at.nCycleMin > proc.at.nCycleLast) || !proc.at.nCycleMin)
-				proc.at.nCycleMin = proc.at.nCycleLast;
-			if(proc.at.nCycleMax < proc.at.nCycleLast)
-				proc.at.nCycleMax = proc.at.nCycleLast;
+			struct tms tms;
+			clock64_t nCpuUsrTimeOldUs = proc.at.nCpuUsrTimeUs;
+			clock64_t nCpuKerTimeOldUs = proc.at.nCpuKerTimeUs;
+
+			if(times(&tms) != -1)
+			{
+				proc.at.nCpuUsrTimeUs = (clock64_t)tms.tms_utime * 1000000 / m_nClkTicksPerSec;
+				proc.at.nCpuKerTimeUs = (clock64_t)tms.tms_stime * 1000000 / m_nClkTicksPerSec;
+				proc.at.fCpuTime = (double)(proc.at.nCpuUsrTimeUs + proc.at.nCpuKerTimeUs) / 1000000.0;
+			}
+
+			static struct tms tmsLast = tms;
+			double fUpClockUs = llabs(proc.nHeartbeatCurUs - m_nClockStartUs);
+			proc.at.fCpuAvg = (double)(proc.at.nCpuUsrTimeUs + proc.at.nCpuKerTimeUs) / fUpClockUs * 100.0;
+			tmsLast = tms;
+
+			if(m_nLastTimesCallUs)
+			{
+				double fIntvClockUs = llabs(proc.nHeartbeatCurUs - m_nLastTimesCallUs);
+				proc.at.fCpuCur = (double)(proc.at.nCpuUsrTimeUs - nCpuUsrTimeOldUs + proc.at.nCpuKerTimeUs - nCpuKerTimeOldUs) / fIntvClockUs * 100.0;
+			}
+
+			m_nLastTimesCallUs = proc.nHeartbeatCurUs;
+		}
+
+		if((proc.state == GIAS_Running) && proc.nHeartbeatLastUs)
+		{
+			proc.at.nCycleLastUs = proc.nHeartbeatCurUs - proc.nHeartbeatLastUs;
+			if((proc.at.nCycleMinUs > proc.at.nCycleLastUs) || !proc.at.nCycleMinUs)
+				proc.at.nCycleMinUs = proc.at.nCycleLastUs;
+			if(proc.at.nCycleMaxUs < proc.at.nCycleLastUs)
+				proc.at.nCycleMaxUs = proc.at.nCycleLastUs;
 		}
 		}
 
 
 		if(proc.nStateEvtSources)
 		if(proc.nStateEvtSources)
@@ -270,12 +302,12 @@ LPAPP_CTRL_INFO CAppCtrl::AppInfoUpdate(void)
 				src &= ~app;
 				src &= ~app;
 				GfaIpcAppStates state = GetAppState(app);
 				GfaIpcAppStates state = GetAppState(app);
 				APP_CTRL_PROCESS &rhp = m_pAppCtrl->proc[b];
 				APP_CTRL_PROCESS &rhp = m_pAppCtrl->proc[b];
-				
-				if(rhp.pid)
+
+				if((rhp.nAppID == app) && rhp.pid)
 				{
 				{
 					pid_t pid = getpgid(rhp.pid);
 					pid_t pid = getpgid(rhp.pid);
 
 
-					if((pid < 0) && (errno == ESRCH))
+					if((pid < 0) && (errno == ESRCH) && (rhp.state != GIAS_StateNotRunning))
 					{
 					{
 						proc.nHangingApps &= ~app;
 						proc.nHangingApps &= ~app;
 						AppStateChanged(app, rhp.state, GIAS_StateNotRunning);
 						AppStateChanged(app, rhp.state, GIAS_StateNotRunning);
@@ -284,7 +316,7 @@ LPAPP_CTRL_INFO CAppCtrl::AppInfoUpdate(void)
 					}
 					}
 				}
 				}
 
 
-				if((state == GIAS_Running) || (proc.nHangingApps & app))
+				if((state == GIAS_Running) || (state == GIAS_Paused) || (proc.nHangingApps & app))
 				{
 				{
 					if((clk = GetAppTimes(app, &at)) >= 0)
 					if((clk = GetAppTimes(app, &at)) >= 0)
 					{
 					{
@@ -407,7 +439,7 @@ const char* CAppCtrl::GetDisplayName(appid_t nAppID, char *pszName, size_t nCChN
 			{
 			{
 				if(GetKnownAppDisplayName(nAppID, pszName, nCChName))
 				if(GetKnownAppDisplayName(nAppID, pszName, nCChName))
 					return pszName;
 					return pszName;
-					
+
 				nLen = sprintf(szUnknown, "APP %02d", nIndex + 1);
 				nLen = sprintf(szUnknown, "APP %02d", nIndex + 1);
 				pszTmp = szUnknown;
 				pszTmp = szUnknown;
 			}
 			}
@@ -434,7 +466,7 @@ bool CAppCtrl::PresetDisplayName(appid_t nAppID, const char *pszName)
 		{
 		{
 			APP_CTRL_PROCESS &proc = m_pAppCtrl->proc[nIndex];
 			APP_CTRL_PROCESS &proc = m_pAppCtrl->proc[nIndex];
 			size_t nLen = strlen(pszName);
 			size_t nLen = strlen(pszName);
-			
+
 			if(nLen < _APP_CTRL_MAX_DISPLAY_NAME_LENGTH)
 			if(nLen < _APP_CTRL_MAX_DISPLAY_NAME_LENGTH)
 			{
 			{
 				if(!proc.szDisplayName[0])
 				if(!proc.szDisplayName[0])
@@ -454,7 +486,7 @@ const char* CAppCtrl::GetKnownAppDisplayName(appid_t nAppID, char *pszName, size
 	if(pszName && nCChName)
 	if(pszName && nCChName)
 	{
 	{
 		int nIndex = SlotIndexFromAppID(nAppID);
 		int nIndex = SlotIndexFromAppID(nAppID);
-		
+
 		if(_IS_KNOWN_APP_INDEX(nIndex))
 		if(_IS_KNOWN_APP_INDEX(nIndex))
 		{
 		{
 			const char *pszTmp = g_pszKnownAppNames[nIndex];
 			const char *pszTmp = g_pszKnownAppNames[nIndex];
@@ -573,7 +605,7 @@ clock64_t CAppCtrl::GetAppTimes(appid_t nAppID, LPGFA_APPCTRL_APPTIMES pat)
 			if(pat)
 			if(pat)
 				memcpy(pat, &proc.at, sizeof(GFA_APPCTRL_APPTIMES));
 				memcpy(pat, &proc.at, sizeof(GFA_APPCTRL_APPTIMES));
 			::clock_gettime(CLOCK_MONOTONIC, &tsHeartBeat);
 			::clock_gettime(CLOCK_MONOTONIC, &tsHeartBeat);
-			ret = proc.nHeartbeatCur ? (_TIMESPEC_2_US(tsHeartBeat) - proc.nHeartbeatCur) : 0;
+			ret = proc.nHeartbeatCurUs ? (_TIMESPEC_2_US(tsHeartBeat) - proc.nHeartbeatCurUs) : 0;
 		}
 		}
 	}
 	}
 
 
@@ -595,15 +627,15 @@ int CAppCtrl::SlotIndexFromAppID(appid_t nAppID)
 
 
 void CAppCtrl::AppStateChanged(appid_t nAppID, GfaIpcAppStates oldState, GfaIpcAppStates newState)
 void CAppCtrl::AppStateChanged(appid_t nAppID, GfaIpcAppStates oldState, GfaIpcAppStates newState)
 {
 {
-	UNUSED(oldState);
-	UNUSED(newState);
-
-	for(int i = 0; i < _APP_CTRL_MAX_SLOTS; ++i)
+	if(oldState != newState)
 	{
 	{
-		APP_CTRL_PROCESS &proc = m_pAppCtrl->proc[i];
-		if(_IS_VALID_APP_ID(proc.nAppID) && (proc.nStateEvtSources & nAppID))
+		for(int i = 0; i < _APP_CTRL_MAX_SLOTS; ++i)
 		{
 		{
-			proc.nStateEvtPending |= nAppID;
+			APP_CTRL_PROCESS &proc = m_pAppCtrl->proc[i];
+			if(_IS_VALID_APP_ID(proc.nAppID) && (proc.nStateEvtSources & nAppID))
+			{
+				proc.nStateEvtPending |= nAppID;
+			}
 		}
 		}
 	}
 	}
 }
 }

+ 6 - 4
src/appctrl.h

@@ -6,6 +6,7 @@
 
 
 #include <stdbool.h>
 #include <stdbool.h>
 #include <time.h>
 #include <time.h>
+#include <sys/times.h>
 #include <gfaipc.h>
 #include <gfaipc.h>
 
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
@@ -46,17 +47,15 @@ typedef const APP_CTRL_SYSTEM *LPCAPP_CTRL_SYSTEM;
 
 
 typedef struct _APP_CTRL_PROCESS : public APP_CTRL_INFO
 typedef struct _APP_CTRL_PROCESS : public APP_CTRL_INFO
 {
 {
-	clock64_t		nHeartbeatCur;
-	clock64_t		nHeartbeatLast;
+	clock64_t		nHeartbeatCurUs;
+	clock64_t		nHeartbeatLastUs;
 	appid_t			nAppID;
 	appid_t			nAppID;
 	appid_t			nStateEvtSources;
 	appid_t			nStateEvtSources;
 	appid_t			nHangingApps;
 	appid_t			nHangingApps;
-	time_t			nTsStart;
 	char			szDisplayName[_APP_CTRL_MAX_DISPLAY_NAME_LENGTH];
 	char			szDisplayName[_APP_CTRL_MAX_DISPLAY_NAME_LENGTH];
 	char			szAppPath[_APP_CTRL_MAX_APP_PATH_LENGTH];
 	char			szAppPath[_APP_CTRL_MAX_APP_PATH_LENGTH];
 	GfaIpcAppStates state;
 	GfaIpcAppStates state;
 	pid_t			pid;
 	pid_t			pid;
-	bool			bInitOnce;
 }APP_CTRL_PROCESS, *LPAPP_CTRL_PROCESS;
 }APP_CTRL_PROCESS, *LPAPP_CTRL_PROCESS;
 typedef const APP_CTRL_PROCESS *LPCAPP_CTRL_PROCESS;
 typedef const APP_CTRL_PROCESS *LPCAPP_CTRL_PROCESS;
 
 
@@ -132,6 +131,9 @@ private:
 	appid_t m_nAppID;
 	appid_t m_nAppID;
 	long m_nLockCount;
 	long m_nLockCount;
 	APP_CTRL_INFO m_ai;
 	APP_CTRL_INFO m_ai;
+	clock64_t m_nClkTicksPerSec;
+	clock64_t m_nClockStartUs;
+	clock64_t m_nLastTimesCallUs;
 };
 };
 
 
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////

+ 23 - 8
src/gfaipc.h

@@ -52,11 +52,20 @@ typedef long long									clock64_t;
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 // GfA
 // GfA
 
 
-#define GFA_APPCTRL_APPID_REMANENT					GFA_APPCTRL_MAKE_APPID(0)
-#define GFA_APPCTRL_APPID_DATALOGGER				GFA_APPCTRL_MAKE_APPID(1)
-#define GFA_APPCTRL_APPID_SUMMARIST					GFA_APPCTRL_MAKE_APPID(2)
-#define GFA_APPCTRL_APPID_REST						GFA_APPCTRL_MAKE_APPID(3)
-#define GFA_APPCTRL_APPID_MQTTCL					GFA_APPCTRL_MAKE_APPID(4)
+typedef enum
+{
+	GAI_Remanent,
+	GAI_Datalogger,
+	GAI_Summarist,
+	GAI_Rest,
+	GAI_Mqttcl,
+}GfaAppIndex;
+
+#define GFA_APPCTRL_APPID_REMANENT					GFA_APPCTRL_MAKE_APPID(GAI_Remanent)
+#define GFA_APPCTRL_APPID_DATALOGGER				GFA_APPCTRL_MAKE_APPID(GAI_Datalogger)
+#define GFA_APPCTRL_APPID_SUMMARIST					GFA_APPCTRL_MAKE_APPID(GAI_Summarist)
+#define GFA_APPCTRL_APPID_REST						GFA_APPCTRL_MAKE_APPID(GAI_Rest)
+#define GFA_APPCTRL_APPID_MQTTCL					GFA_APPCTRL_MAKE_APPID(GAI_Mqttcl)
 
 
 #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_APPID_ALL_GFA					(GFA_APPCTRL_APPID_REMANENT | GFA_APPCTRL_APPID_DATALOGGER | GFA_APPCTRL_APPID_SUMMARIST | GFA_APPCTRL_APPID_REST | GFA_APPCTRL_APPID_MQTTCL)
 
 
@@ -155,10 +164,16 @@ typedef enum
 
 
 typedef struct _GFA_APPCTRL_APPTIMES
 typedef struct _GFA_APPCTRL_APPTIMES
 {
 {
-	clock64_t	nCycleLast;
-	clock64_t	nCycleMin;
-	clock64_t	nCycleMax;
+	clock64_t	nCycleLastUs;
+	clock64_t	nCycleMinUs;
+	clock64_t	nCycleMaxUs;
+	clock64_t	nCpuUsrTimeUs;
+	clock64_t	nCpuKerTimeUs;
 	clock64_t	nMaxHeartbeatDelay;
 	clock64_t	nMaxHeartbeatDelay;
+	double		fCpuTime;
+	double		fCpuCur;
+	double		fCpuAvg;
+	time_t		nTsStart;
 }GFA_APPCTRL_APPTIMES, *LPGFA_APPCTRL_APPTIMES;
 }GFA_APPCTRL_APPTIMES, *LPGFA_APPCTRL_APPTIMES;
 typedef const GFA_APPCTRL_APPTIMES *LPCGFA_APPCTRL_APPTIMES;
 typedef const GFA_APPCTRL_APPTIMES *LPCGFA_APPCTRL_APPTIMES;