Browse Source

BROKEN - refactoring in progress

Krystian Lewandowski 9 years ago
parent
commit
5d5da8ffb2

+ 345 - 149
.idea/workspace.xml

@@ -2,26 +2,28 @@
 <project version="4">
   <component name="ChangeListManager">
     <list default="true" id="1591b6fa-ad4f-4d7a-b643-0b1859455660" name="Default" comment="">
-      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/.idea/PiMonitor.iml" />
-      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/.idea/encodings.xml" />
-      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/.idea/misc.xml" />
-      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/.idea/modules.xml" />
-      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/.idea/scopes/scope_settings.xml" />
-      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/.idea/vcs.xml" />
-      <change type="DELETED" beforePath="$PROJECT_DIR$/.project" afterPath="" />
-      <change type="DELETED" beforePath="$PROJECT_DIR$/.pydevproject" afterPath="" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/pimonitor/cu/PMCUAddress.py" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/pimonitor/cu/PMCUCalculatedParameter.py" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/pimonitor/cu/PMCUContext.py" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/pimonitor/cu/PMCUConversion.py" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/pimonitor/cu/PMCUFixedAddressParameter.py" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/pimonitor/cu/PMCUParameter.py" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/pimonitor/cu/PMCUStandardParameter.py" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/pimonitor/cu/PMCUSwitchParameter.py" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/pimonitor/test/PMCUTest.py" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/pimonitor/cu/__init__.py" />
+      <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/pimonitor/test/__init__.py" />
       <change type="MODIFICATION" beforePath="$PROJECT_DIR$/pimonitor/PM.py" afterPath="$PROJECT_DIR$/pimonitor/PM.py" />
       <change type="MODIFICATION" beforePath="$PROJECT_DIR$/pimonitor/PMConnection.py" afterPath="$PROJECT_DIR$/pimonitor/PMConnection.py" />
       <change type="MODIFICATION" beforePath="$PROJECT_DIR$/pimonitor/PMDemoConnection.py" afterPath="$PROJECT_DIR$/pimonitor/PMDemoConnection.py" />
       <change type="MODIFICATION" beforePath="$PROJECT_DIR$/pimonitor/PMMain.py" afterPath="$PROJECT_DIR$/pimonitor/PMMain.py" />
       <change type="MODIFICATION" beforePath="$PROJECT_DIR$/pimonitor/PMPacket.py" afterPath="$PROJECT_DIR$/pimonitor/PMPacket.py" />
-      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/pimonitor/PMParameter.py" afterPath="$PROJECT_DIR$/pimonitor/PMParameter.py" />
       <change type="MODIFICATION" beforePath="$PROJECT_DIR$/pimonitor/ui/PMScreen.py" afterPath="$PROJECT_DIR$/pimonitor/ui/PMScreen.py" />
       <change type="MODIFICATION" beforePath="$PROJECT_DIR$/pimonitor/ui/PMSingleWindow.py" afterPath="$PROJECT_DIR$/pimonitor/ui/PMSingleWindow.py" />
       <change type="MODIFICATION" beforePath="$PROJECT_DIR$/pimonitor/PMUtils.py" afterPath="$PROJECT_DIR$/pimonitor/PMUtils.py" />
       <change type="MODIFICATION" beforePath="$PROJECT_DIR$/pimonitor/ui/PMWindow.py" afterPath="$PROJECT_DIR$/pimonitor/ui/PMWindow.py" />
       <change type="MODIFICATION" beforePath="$PROJECT_DIR$/pimonitor/PMXmlParser.py" afterPath="$PROJECT_DIR$/pimonitor/PMXmlParser.py" />
-      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/run.sh" afterPath="$PROJECT_DIR$/run.sh" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
     </list>
     <ignored path="PiMonitor.iws" />
     <ignored path=".idea/workspace.xml" />
@@ -44,11 +46,11 @@
   </component>
   <component name="FileEditorManager">
     <leaf>
-      <file leaf-file-name="PMMain.py" pinned="false" current="false" current-in-tab="false">
+      <file leaf-file-name="PMMain.py" pinned="false" current="true" current-in-tab="true">
         <entry file="file://$PROJECT_DIR$/pimonitor/PMMain.py">
           <provider selected="true" editor-type-id="text-editor">
-            <state vertical-scroll-proportion="0.0" vertical-offset="1073" max-vertical-offset="2115">
-              <caret line="88" column="45" selection-start-line="88" selection-start-column="45" selection-end-line="88" selection-end-column="45" />
+            <state vertical-scroll-proportion="1.5403423" vertical-offset="0" max-vertical-offset="1785">
+              <caret line="84" column="142" selection-start-line="84" selection-start-column="142" selection-end-line="84" selection-end-column="142" />
               <folding>
                 <element signature="e#72#81#0" expanded="true" />
               </folding>
@@ -56,87 +58,11 @@
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="PMParameter.py" pinned="false" current="true" current-in-tab="true">
-        <entry file="file://$PROJECT_DIR$/pimonitor/PMParameter.py">
-          <provider selected="true" editor-type-id="text-editor">
-            <state vertical-scroll-proportion="1.7022809" vertical-offset="682" max-vertical-offset="2925">
-              <caret line="140" column="21" selection-start-line="140" selection-start-column="21" selection-end-line="140" selection-end-column="21" />
-              <folding>
-                <element signature="e#47#56#0" expanded="true" />
-              </folding>
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="PMXmlParser.py" pinned="false" current="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/pimonitor/PMXmlParser.py">
-          <provider selected="true" editor-type-id="text-editor">
-            <state vertical-scroll-proportion="0.0" vertical-offset="728" max-vertical-offset="3105">
-              <caret line="66" column="0" selection-start-line="66" selection-start-column="0" selection-end-line="66" selection-end-column="0" />
-              <folding>
-                <element signature="e#47#61#0" expanded="true" />
-              </folding>
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="PMScreen.py" pinned="false" current="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/pimonitor/ui/PMScreen.py">
-          <provider selected="true" editor-type-id="text-editor">
-            <state vertical-scroll-proportion="0.0" vertical-offset="2333" max-vertical-offset="3705">
-              <caret line="172" column="36" selection-start-line="172" selection-start-column="36" selection-end-line="172" selection-end-column="36" />
-              <folding>
-                <element signature="e#47#56#0" expanded="true" />
-              </folding>
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="PMSingleWindow.py" pinned="false" current="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/pimonitor/ui/PMSingleWindow.py">
-          <provider selected="true" editor-type-id="text-editor">
-            <state vertical-scroll-proportion="0.0" vertical-offset="240" max-vertical-offset="1095">
-              <caret line="26" column="0" selection-start-line="26" selection-start-column="0" selection-end-line="26" selection-end-column="0" />
-              <folding />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="PMPacket.py" pinned="false" current="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/pimonitor/PMPacket.py">
-          <provider selected="true" editor-type-id="text-editor">
-            <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="1905">
-              <caret line="12" column="4" selection-start-line="12" selection-start-column="4" selection-end-line="12" selection-end-column="4" />
-              <folding />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="PMWindow.py" pinned="false" current="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/pimonitor/ui/PMWindow.py">
-          <provider selected="true" editor-type-id="text-editor">
-            <state vertical-scroll-proportion="0.0" vertical-offset="173" max-vertical-offset="1320">
-              <caret line="28" column="47" selection-start-line="28" selection-start-column="47" selection-end-line="28" selection-end-column="47" />
-              <folding />
-            </state>
-          </provider>
-        </entry>
-      </file>
       <file leaf-file-name="PMDemoConnection.py" pinned="false" current="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/pimonitor/PMDemoConnection.py">
           <provider selected="true" editor-type-id="text-editor">
-            <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="1290">
-              <caret line="19" column="8" selection-start-line="19" selection-start-column="8" selection-end-line="19" selection-end-column="8" />
-              <folding />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="PMConnection.py" pinned="false" current="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/pimonitor/PMConnection.py">
-          <provider selected="true" editor-type-id="text-editor">
-            <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="2100">
-              <caret line="19" column="8" selection-start-line="19" selection-start-column="8" selection-end-line="19" selection-end-column="8" />
+            <state vertical-scroll-proportion="0.0" vertical-offset="347" max-vertical-offset="1185">
+              <caret line="44" column="0" selection-start-line="44" selection-start-column="0" selection-end-line="44" selection-end-column="0" />
               <folding />
             </state>
           </provider>
@@ -155,17 +81,31 @@
   <component name="IdeDocumentHistory">
     <option name="changedFiles">
       <list>
-        <option value="$PROJECT_DIR$/pimonitor/PM.py" />
+        <option value="$PROJECT_DIR$/pimonitor/PMCUParam.py" />
         <option value="$PROJECT_DIR$/pimonitor/PMUtils.py" />
-        <option value="$PROJECT_DIR$/pimonitor/PMXmlParser.py" />
         <option value="$PROJECT_DIR$/pimonitor/ui/PMWindow.py" />
-        <option value="$PROJECT_DIR$/pimonitor/PMMain.py" />
-        <option value="$PROJECT_DIR$/pimonitor/ui/PMScreen.py" />
         <option value="$PROJECT_DIR$/pimonitor/PMPacket.py" />
+        <option value="$PROJECT_DIR$/pimonitor/PMCUContext.py" />
         <option value="$PROJECT_DIR$/pimonitor/PMConnection.py" />
+        <option value="$PROJECT_DIR$/pimonitor/PM.py" />
+        <option value="$PROJECT_DIR$/pimonitor/PMCUParameter.py" />
+        <option value="$PROJECT_DIR$/pimonitor/PMParameter.py" />
+        <option value="$PROJECT_DIR$/pimonitor/cu/PMCUFixedAddressParamater.py" />
+        <option value="$PROJECT_DIR$/pimonitor/test/PMCUContextTest.py" />
+        <option value="$PROJECT_DIR$/pimonitor/cu/PMCUAddress.py" />
+        <option value="$PROJECT_DIR$/pimonitor/cu/PMCUConversion.py" />
+        <option value="$PROJECT_DIR$/pimonitor/PMXmlParser.py" />
         <option value="$PROJECT_DIR$/pimonitor/PMDemoConnection.py" />
+        <option value="$PROJECT_DIR$/pimonitor/cu/PMCUSwitchParameter.py" />
+        <option value="$PROJECT_DIR$/pimonitor/cu/PMCUParameter.py" />
         <option value="$PROJECT_DIR$/pimonitor/ui/PMSingleWindow.py" />
-        <option value="$PROJECT_DIR$/pimonitor/PMParameter.py" />
+        <option value="$PROJECT_DIR$/pimonitor/ui/PMScreen.py" />
+        <option value="$PROJECT_DIR$/pimonitor/cu/PMCUContext.py" />
+        <option value="$PROJECT_DIR$/pimonitor/test/PMCUTest.py" />
+        <option value="$PROJECT_DIR$/pimonitor/cu/PMCUCalculatedParameter.py" />
+        <option value="$PROJECT_DIR$/pimonitor/cu/PMCUStandardParameter.py" />
+        <option value="$PROJECT_DIR$/pimonitor/cu/PMCUFixedAddressParameter.py" />
+        <option value="$PROJECT_DIR$/pimonitor/PMMain.py" />
       </list>
     </option>
   </component>
@@ -229,6 +169,20 @@
               <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
             <PATH_ELEMENT>
+              <option name="myItemId" value="res" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+          </PATH>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="PiMonitor" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="PiMonitor" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
               <option name="myItemId" value="pimonitor" />
               <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
@@ -261,6 +215,42 @@
               <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
             <PATH_ELEMENT>
+              <option name="myItemId" value="pimonitor" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="test" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+          </PATH>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="PiMonitor" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="PiMonitor" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="pimonitor" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="cu" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+          </PATH>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="PiMonitor" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="PiMonitor" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
               <option name="myItemId" value="data" />
               <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
             </PATH_ELEMENT>
@@ -277,12 +267,21 @@
     <property name="options.searchVisible" value="true" />
     <property name="recentsLimit" value="5" />
     <property name="restartRequiresConfirmation" value="true" />
+    <property name="LayoutCode.rearrangeEntriesPython" value="false" />
   </component>
   <component name="PyConsoleOptionsProvider">
     <option name="myPythonConsoleState">
       <console-settings />
     </option>
   </component>
+  <component name="RecentsManager">
+    <key name="CopyFile.RECENT_KEYS">
+      <recent name="$PROJECT_DIR$/pimonitor/cu" />
+    </key>
+    <key name="MoveFile.RECENT_KEYS">
+      <recent name="$PROJECT_DIR$/pimonitor/cu" />
+    </key>
+  </component>
   <component name="RunManager" selected="Python.PMMain">
     <configuration default="false" name="PMMain" type="PythonConfigurationType" factoryName="Python" temporary="true">
       <option name="INTERPRETER_OPTIONS" value="" />
@@ -302,6 +301,50 @@
       <ConfigurationWrapper RunnerId="PythonRunner" />
       <method />
     </configuration>
+    <configuration default="false" name="Unittests in PMCUTest" type="tests" factoryName="Unittests" temporary="true" nameIsGenerated="true">
+      <option name="INTERPRETER_OPTIONS" value="" />
+      <option name="PARENT_ENVS" value="true" />
+      <envs />
+      <option name="SDK_HOME" value="" />
+      <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
+      <option name="IS_MODULE_SDK" value="true" />
+      <option name="ADD_CONTENT_ROOTS" value="true" />
+      <option name="ADD_SOURCE_ROOTS" value="true" />
+      <module name="PiMonitor" />
+      <option name="SCRIPT_NAME" value="$PROJECT_DIR$/pimonitor/test/PMCUTest.py" />
+      <option name="CLASS_NAME" value="" />
+      <option name="METHOD_NAME" value="" />
+      <option name="FOLDER_NAME" value="" />
+      <option name="TEST_TYPE" value="TEST_SCRIPT" />
+      <option name="PATTERN" value="" />
+      <option name="USE_PATTERN" value="false" />
+      <option name="PUREUNITTEST" value="true" />
+      <option name="PARAMS" value="" />
+      <option name="USE_PARAM" value="false" />
+      <RunnerSettings RunnerId="PyDebugRunner" />
+      <RunnerSettings RunnerId="PythonRunner" />
+      <ConfigurationWrapper RunnerId="PyDebugRunner" />
+      <ConfigurationWrapper RunnerId="PythonRunner" />
+      <method />
+    </configuration>
+    <configuration default="false" name="PMCUFixedAddressParameter" type="PythonConfigurationType" factoryName="Python" temporary="true">
+      <option name="INTERPRETER_OPTIONS" value="" />
+      <option name="PARENT_ENVS" value="true" />
+      <envs>
+        <env name="PYTHONUNBUFFERED" value="1" />
+      </envs>
+      <option name="SDK_HOME" value="" />
+      <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/pimonitor/cu" />
+      <option name="IS_MODULE_SDK" value="true" />
+      <option name="ADD_CONTENT_ROOTS" value="true" />
+      <option name="ADD_SOURCE_ROOTS" value="true" />
+      <module name="PiMonitor" />
+      <option name="SCRIPT_NAME" value="$PROJECT_DIR$/pimonitor/cu/PMCUFixedAddressParameter.py" />
+      <option name="PARAMETERS" value="" />
+      <RunnerSettings RunnerId="PythonRunner" />
+      <ConfigurationWrapper RunnerId="PythonRunner" />
+      <method />
+    </configuration>
     <configuration default="true" type="tests" factoryName="py.test">
       <option name="INTERPRETER_OPTIONS" value="" />
       <option name="PARENT_ENVS" value="true" />
@@ -423,16 +466,23 @@
       <option name="USE_PATTERN" value="false" />
       <method />
     </configuration>
-    <list size="1">
+    <list size="3">
       <item index="0" class="java.lang.String" itemvalue="Python.PMMain" />
+      <item index="1" class="java.lang.String" itemvalue="Python tests.Unittests in PMCUTest" />
+      <item index="2" class="java.lang.String" itemvalue="Python.PMCUFixedAddressParameter" />
     </list>
     <recent_temporary>
-      <list size="1">
+      <list size="3">
         <item index="0" class="java.lang.String" itemvalue="Python.PMMain" />
+        <item index="1" class="java.lang.String" itemvalue="Python tests.Unittests in PMCUTest" />
+        <item index="2" class="java.lang.String" itemvalue="Python.PMCUFixedAddressParameter" />
       </list>
     </recent_temporary>
   </component>
   <component name="ShelveChangesManager" show_recycled="false" />
+  <component name="SvnConfiguration">
+    <configuration />
+  </component>
   <component name="TaskManager">
     <task active="true" id="Default" summary="Default task">
       <changelist id="1591b6fa-ad4f-4d7a-b643-0b1859455660" name="Default" comment="" />
@@ -445,20 +495,20 @@
     <frame x="0" y="22" width="2560" height="1353" extended-state="0" />
     <editor active="true" />
     <layout>
-      <window_info id="Changes" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
-      <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
-      <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
-      <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
-      <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
-      <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.13671875" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
-      <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
-      <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.3995327" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
-      <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="true" content_ui="tabs" />
-      <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="true" content_ui="tabs" />
-      <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.32943925" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
-      <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
-      <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
-      <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
+      <window_info id="Changes" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
+      <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="9" side_tool="false" content_ui="tabs" />
+      <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32943925" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+      <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.13666798" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
+      <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.39888978" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
+      <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.3995327" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
+      <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="1" side_tool="true" content_ui="tabs" />
+      <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="true" content_ui="tabs" />
+      <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.3291039" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
+      <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="10" side_tool="false" content_ui="tabs" />
+      <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="8" side_tool="false" content_ui="tabs" />
       <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
       <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="SLIDING" type="SLIDING" visible="false" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
       <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
@@ -481,7 +531,21 @@
     </option>
   </component>
   <component name="XDebuggerManager">
-    <breakpoint-manager />
+    <breakpoint-manager>
+      <breakpoints>
+        <line-breakpoint enabled="true" type="python-line">
+          <url>file://$PROJECT_DIR$/pimonitor/cu/PMCUStandardParameter.py</url>
+          <line>39</line>
+          <option name="timeStamp" value="22" />
+        </line-breakpoint>
+        <line-breakpoint enabled="true" type="python-line">
+          <url>file://$PROJECT_DIR$/pimonitor/PMDemoConnection.py</url>
+          <line>44</line>
+          <option name="timeStamp" value="23" />
+        </line-breakpoint>
+      </breakpoints>
+      <option name="time" value="24" />
+    </breakpoint-manager>
   </component>
   <component name="editorHistoryManager">
     <entry file="file://$PROJECT_DIR$/pimonitor/__init__.py">
@@ -492,108 +556,240 @@
         </state>
       </provider>
     </entry>
+    <entry file="file://$PROJECT_DIR$/pimonitor/ui/__init__.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="1256">
+          <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/pimonitor/test/__init__.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="1256">
+          <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$USER_HOME$/Library/Caches/PyCharm30/python_stubs/-2131660280/exceptions.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.2785114" vertical-offset="2693" max-vertical-offset="13065">
+          <caret line="195" column="25" selection-start-line="195" selection-start-column="25" selection-end-line="195" selection-end-column="25" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$USER_HOME$/Library/Caches/PyCharm30/python_stubs/-2131660280/__builtin__.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.332533" vertical-offset="49463" max-vertical-offset="77445">
+          <caret line="3316" column="8" selection-start-line="3316" selection-start-column="8" selection-end-line="3316" selection-end-column="8" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
     <entry file="file://$PROJECT_DIR$/pimonitor/PM.py">
       <provider selected="true" editor-type-id="text-editor">
-        <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="525">
-          <caret line="4" column="0" selection-start-line="4" selection-start-column="0" selection-end-line="4" selection-end-column="0" />
+        <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="540">
+          <caret line="30" column="0" selection-start-line="30" selection-start-column="0" selection-end-line="30" selection-end-column="0" />
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/pimonitor/PMUtils.py">
+    <entry file="file://$PROJECT_DIR$/pimonitor/PMParameter.py">
       <provider selected="true" editor-type-id="text-editor">
-        <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="1185">
-          <caret line="11" column="4" selection-start-line="11" selection-start-column="4" selection-end-line="11" selection-end-column="4" />
+        <state vertical-scroll-proportion="0.62184876" vertical-offset="2092" max-vertical-offset="2925">
+          <caret line="174" column="87" selection-start-line="174" selection-start-column="87" selection-end-line="174" selection-end-column="87" />
           <folding>
             <element signature="e#47#56#0" expanded="true" />
           </folding>
         </state>
       </provider>
     </entry>
+    <entry file="file://$PROJECT_DIR$/data/out.txt">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="225">
+          <caret line="9" column="0" selection-start-line="9" selection-start-column="0" selection-end-line="9" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/pimonitor/cu/PMCUAddress.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.27010804" vertical-offset="0" max-vertical-offset="833">
+          <caret line="15" column="80" selection-start-line="15" selection-start-column="80" selection-end-line="15" selection-end-column="80" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/pimonitor/PMPacket.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.3948655" vertical-offset="847" max-vertical-offset="1665">
+          <caret line="78" column="0" selection-start-line="78" selection-start-column="0" selection-end-line="78" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/pimonitor/PMUtils.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.6882641" vertical-offset="322" max-vertical-offset="1155">
+          <caret line="60" column="20" selection-start-line="60" selection-start-column="20" selection-end-line="60" selection-end-column="20" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file:///opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/case.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0" vertical-offset="4482" max-vertical-offset="16035">
+          <caret line="328" column="0" selection-start-line="328" selection-start-column="0" selection-end-line="328" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
     <entry file="file://$PROJECT_DIR$/pimonitor/PMXmlParser.py">
       <provider selected="true" editor-type-id="text-editor">
-        <state vertical-scroll-proportion="0.0" vertical-offset="728" max-vertical-offset="3105">
-          <caret line="66" column="0" selection-start-line="66" selection-start-column="0" selection-end-line="66" selection-end-column="0" />
+        <state vertical-scroll-proportion="0.0" vertical-offset="1752" max-vertical-offset="3225">
+          <caret line="141" column="36" selection-start-line="141" selection-start-column="36" selection-end-line="141" selection-end-column="36" />
           <folding>
             <element signature="e#47#61#0" expanded="true" />
           </folding>
         </state>
       </provider>
     </entry>
+    <entry file="file://$PROJECT_DIR$/pimonitor/PMConnection.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="2130">
+          <caret line="104" column="45" selection-start-line="104" selection-start-column="45" selection-end-line="104" selection-end-column="45" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file:///opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/platform.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.41849148" vertical-offset="17259" max-vertical-offset="24915">
+          <caret line="1185" column="14" selection-start-line="1185" selection-start-column="14" selection-end-line="1185" selection-end-column="14" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
     <entry file="file://$PROJECT_DIR$/pimonitor/ui/PMWindow.py">
       <provider selected="true" editor-type-id="text-editor">
-        <state vertical-scroll-proportion="0.0" vertical-offset="173" max-vertical-offset="1320">
-          <caret line="28" column="47" selection-start-line="28" selection-start-column="47" selection-end-line="28" selection-end-column="47" />
+        <state vertical-scroll-proportion="0.71515894" vertical-offset="0" max-vertical-offset="1305">
+          <caret line="39" column="0" selection-start-line="39" selection-start-column="0" selection-end-line="39" selection-end-column="0" />
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/pimonitor/PMMain.py">
+    <entry file="file://$PROJECT_DIR$/pimonitor/ui/PMSingleWindow.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.35819072" vertical-offset="277" max-vertical-offset="1095">
+          <caret line="38" column="0" selection-start-line="38" selection-start-column="0" selection-end-line="38" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/pimonitor/cu/PMCUFixedAddressParameter.py">
       <provider selected="true" editor-type-id="text-editor">
-        <state vertical-scroll-proportion="0.0" vertical-offset="1073" max-vertical-offset="2115">
-          <caret line="88" column="45" selection-start-line="88" selection-start-column="45" selection-end-line="88" selection-end-column="45" />
+        <state vertical-scroll-proportion="0.53178483" vertical-offset="0" max-vertical-offset="818">
+          <caret line="30" column="0" selection-start-line="30" selection-start-column="0" selection-end-line="30" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/pimonitor/test/PMCUTest.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.5709047" vertical-offset="793" max-vertical-offset="1695">
+          <caret line="84" column="61" selection-start-line="84" selection-start-column="61" selection-end-line="84" selection-end-column="61" />
           <folding>
-            <element signature="e#72#81#0" expanded="true" />
+            <element signature="e#0#45#0" expanded="true" />
           </folding>
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/pimonitor/ui/PMScreen.py">
+    <entry file="file://$PROJECT_DIR$/pimonitor/cu/PMCUCalculatedParameter.py">
       <provider selected="true" editor-type-id="text-editor">
-        <state vertical-scroll-proportion="0.0" vertical-offset="2333" max-vertical-offset="3705">
-          <caret line="172" column="36" selection-start-line="172" selection-start-column="36" selection-end-line="172" selection-end-column="36" />
+        <state vertical-scroll-proportion="0.8716381" vertical-offset="472" max-vertical-offset="1290">
+          <caret line="79" column="46" selection-start-line="79" selection-start-column="46" selection-end-line="79" selection-end-column="46" />
           <folding>
-            <element signature="e#47#56#0" expanded="true" />
+            <element signature="e#0#9#0" expanded="true" />
           </folding>
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/pimonitor/PMPacket.py">
+    <entry file="file://$PROJECT_DIR$/pimonitor/cu/PMCUSwitchParameter.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.29339853" vertical-offset="0" max-vertical-offset="818">
+          <caret line="16" column="0" selection-start-line="16" selection-start-column="0" selection-end-line="16" selection-end-column="0" />
+          <folding>
+            <element signature="e#0#48#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/pimonitor/cu/PMCUParameter.py">
       <provider selected="true" editor-type-id="text-editor">
-        <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="1905">
-          <caret line="12" column="4" selection-start-line="12" selection-start-column="4" selection-end-line="12" selection-end-column="4" />
+        <state vertical-scroll-proportion="0.34841076" vertical-offset="0" max-vertical-offset="818">
+          <caret line="19" column="16" selection-start-line="19" selection-start-column="16" selection-end-line="19" selection-end-column="16" />
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/pimonitor/PMConnection.py">
+    <entry file="file://$PROJECT_DIR$/pimonitor/cu/PMCUStandardParameter.py">
       <provider selected="true" editor-type-id="text-editor">
-        <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="2100">
-          <caret line="19" column="8" selection-start-line="19" selection-start-column="8" selection-end-line="19" selection-end-column="8" />
+        <state vertical-scroll-proportion="0.8716381" vertical-offset="757" max-vertical-offset="1575">
+          <caret line="98" column="46" selection-start-line="98" selection-start-column="46" selection-end-line="98" selection-end-column="46" />
+          <folding>
+            <element signature="e#0#48#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/pimonitor/cu/PMCUConversion.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.34841076" vertical-offset="0" max-vertical-offset="818">
+          <caret line="19" column="48" selection-start-line="19" selection-start-column="48" selection-end-line="19" selection-end-column="48" />
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/pimonitor/PMDemoConnection.py">
+    <entry file="file://$PROJECT_DIR$/pimonitor/cu/PMCUContext.py">
       <provider selected="true" editor-type-id="text-editor">
-        <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="1290">
-          <caret line="19" column="8" selection-start-line="19" selection-start-column="8" selection-end-line="19" selection-end-column="8" />
+        <state vertical-scroll-proportion="0.5709047" vertical-offset="523" max-vertical-offset="1365">
+          <caret line="66" column="0" selection-start-line="66" selection-start-column="0" selection-end-line="66" selection-end-column="0" />
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/pimonitor/ui/__init__.py">
+    <entry file="file://$PROJECT_DIR$/data/logger_METRIC_EN_v263.xml">
       <provider selected="true" editor-type-id="text-editor">
-        <state vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="1256">
-          <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+        <state vertical-scroll-proportion="0.5827985" vertical-offset="10916" max-vertical-offset="468150">
+          <caret line="758" column="40" selection-start-line="758" selection-start-column="40" selection-end-line="758" selection-end-column="40" />
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/pimonitor/ui/PMSingleWindow.py">
+    <entry file="file://$PROJECT_DIR$/pimonitor/ui/PMScreen.py">
       <provider selected="true" editor-type-id="text-editor">
-        <state vertical-scroll-proportion="0.0" vertical-offset="240" max-vertical-offset="1095">
-          <caret line="26" column="0" selection-start-line="26" selection-start-column="0" selection-end-line="26" selection-end-column="0" />
+        <state vertical-scroll-proportion="0.14914425" vertical-offset="2203" max-vertical-offset="3585">
+          <caret line="162" column="0" selection-start-line="162" selection-start-column="0" selection-end-line="162" selection-end-column="0" />
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/pimonitor/PMParameter.py">
+    <entry file="file://$PROJECT_DIR$/pimonitor/PMDemoConnection.py">
       <provider selected="true" editor-type-id="text-editor">
-        <state vertical-scroll-proportion="1.7022809" vertical-offset="682" max-vertical-offset="2925">
-          <caret line="140" column="21" selection-start-line="140" selection-start-column="21" selection-end-line="140" selection-end-column="21" />
+        <state vertical-scroll-proportion="0.0" vertical-offset="347" max-vertical-offset="1185">
+          <caret line="44" column="0" selection-start-line="44" selection-start-column="0" selection-end-line="44" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/pimonitor/PMMain.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="1.5403423" vertical-offset="0" max-vertical-offset="1785">
+          <caret line="84" column="142" selection-start-line="84" selection-start-column="142" selection-end-line="84" selection-end-column="142" />
           <folding>
-            <element signature="e#47#56#0" expanded="true" />
+            <element signature="e#72#81#0" expanded="true" />
           </folding>
         </state>
       </provider>

BIN
data/data.pkl


+ 4 - 4
pimonitor/PM.py

@@ -24,7 +24,7 @@ class PM(object):
         return PM().log_impl(message, mid)
 
     def log_impl(self, message, mid):
-        return self._log(message, mid)
-
-    def in_demo(self):
-        return False
+        if self._log is not None:
+            return self._log(message, mid)
+        else:
+            return -1

+ 2 - 0
pimonitor/PMConnection.py

@@ -32,6 +32,8 @@ class PMConnection(object):
             bytesize=serial.EIGHTBITS)
         time.sleep(0.2)
 
+        return self._ser is not None
+
     def close(self):
         if self._ser is not None:
             self._ser.close()

+ 3 - 10
pimonitor/PMDemoConnection.py

@@ -10,14 +10,8 @@ import time
 
 
 class PMDemoConnection(object):
-    """
-    classdocs
-    """
 
     def __init__(self):
-        """
-        Constructor
-        """
         self._ser = None
         self._log_id = None
         random.seed()
@@ -30,6 +24,8 @@ class PMDemoConnection(object):
         time.sleep(0.2)
         PM.log(message + " [DONE]", self._log_id)
 
+        return True
+
     def close(self):
         PM.log("Closing serial connection", self._log_id)
         pass
@@ -44,12 +40,9 @@ class PMDemoConnection(object):
             
         return PMPacket.from_array(response)
 
-    def send_packet(self, packet):
-        raise Exception('connection', 'should never be called')
-
     def read_parameter(self, parameter):
         time.sleep(0.05)
-        address_len = parameter.get_address_length()
+        address_len = parameter.get_address().get_length()
 
         data = [0x80, 0xF0]  # [0x80, 0xF0, 0x18, 0x02, 0xE8, 0x60, 0xD2]
 

+ 26 - 48
pimonitor/PMMain.py

@@ -16,6 +16,7 @@ from pimonitor.PM import PM
 from pimonitor.PMConnection import PMConnection
 from pimonitor.PMDemoConnection import PMDemoConnection
 from pimonitor.PMXmlParser import PMXmlParser
+from pimonitor.cu.PMCUContext import PMCUContext
 from pimonitor.ui.PMScreen import PMScreen
 from pimonitor.ui.PMSingleWindow import PMSingleWindow
 
@@ -52,9 +53,10 @@ if __name__ == '__main__':
         serializedDataFile.close()
     else:
         defined_parameters = parser.parse("logger_METRIC_EN_v263.xml")
-    # output = open("data/data.pkl", "wb")
-    #pickle.dump(defined_parameters, output, -1)
-    #output.close()
+        defined_parameters = sorted(defined_parameters, key=lambda x: x.get_id(), reverse=True)
+        output = open("data/data.pkl", "wb")
+        pickle.dump(defined_parameters, output, -1)
+        output.close()
 
     if platform.system() == "Linux":
         connection = PMConnection()
@@ -67,44 +69,20 @@ if __name__ == '__main__':
             ecu_packet = connection.init(1)
             tcu_packet = connection.init(2)
 
-            if ecu_packet is None or tcu_packet is None:
-                PM.log("Can't get initial data", log_id)
-                continue
-            PM.log("ECU ROM ID: " + ecu_packet.get_rom_id())
-            PM.log("TCU ROM ID: " + tcu_packet.get_rom_id())
-            for p in defined_parameters:
-                if (p.get_target() & 0x1 == 0x1) and p.is_supported(ecu_packet.to_bytes()[4:]):
-                    if not filter(lambda x: x.get_id() == p.get_id(), supported_parameters):
-                        p.switch_to_ecu_id(ecu_packet.get_rom_id())
-                        supported_parameters.append(p)
-
-            for p in defined_parameters:
-                if ((p.get_target() & 0x2 == 0x2) or (p.get_target() & 0x1 == 0x1)) and p.is_supported(
-                        tcu_packet.to_bytes()[4:]):
-                    if not filter(lambda x: x.get_id() == p.get_id(), supported_parameters):
-                        p.switch_to_ecu_id(tcu_packet.get_rom_id())
-                        supported_parameters.append(p)
-
-            for p in defined_parameters:
-                p_deps = p.get_dependencies()
-                if not p_deps:
-                    continue
-
-                deps_found = ()
-                for dep in p_deps:
-                    deps_found = filter(lambda x: x.get_id() == dep, supported_parameters)
-                    if not deps_found:
-                        break
-
-                    if len(deps_found) > 1:
-                        raise Exception('duplicated dependencies', deps_found)
-
-                    p.add_parameter(deps_found[0])
-
-                if deps_found:
-                    supported_parameters.append(p)
-
-            supported_parameters = sorted(supported_parameters)
+            ecu_context = PMCUContext(ecu_packet, [1, 3])
+            ecu_parameters = ecu_context.match_parameters(defined_parameters)
+            ecu_switch_parameters = ecu_context.match_switch_parameters(defined_parameters)
+            ecu_calculated_parameters = ecu_context.match_calculated_parameters(defined_parameters, ecu_parameters)
+
+            tcu_context = PMCUContext(tcu_packet, [2])
+            tcu_parameters = tcu_context.match_parameters(defined_parameters)
+            tcu_switch_parameters = tcu_context.match_switch_parameters(defined_parameters)
+            tcu_calculated_parameters = tcu_context.match_calculated_parameters(defined_parameters, tcu_parameters)
+
+            PM.log("ECU ROM ID: " + ecu_context.get_rom_id())
+            PM.log("TCU ROM ID: " + tcu_context.get_rom_id())
+
+            supported_parameters = ecu_parameters + ecu_switch_parameters + ecu_calculated_parameters + tcu_parameters + tcu_switch_parameters + tcu_calculated_parameters
 
             for p in supported_parameters:
                 window = PMSingleWindow(p)
@@ -115,13 +93,13 @@ if __name__ == '__main__':
             while True:
                 window = screen.get_window()
                 param = window.get_parameter()
-                parameters = param.get_parameters()
-                if parameters:
-                    packets = connection.read_parameters(parameters)
-                    window.set_packets(packets)
-                else:
-                    packet = connection.read_parameter(param)
-                    window.set_packets([packet])
+                #parameters = param.get_parameters()
+                #if parameters:
+                #    packets = connection.read_parameters(parameters)
+                #    window.set_packets(packets)
+                #else:
+                packet = connection.read_parameter(param)
+                window.set_packets([packet])
 
                 screen.render()
 

+ 0 - 16
pimonitor/PMPacket.py

@@ -8,9 +8,6 @@ import array
 
 
 class PMPacket(object):
-    """
-	classdocs
-	"""
     # 0x80
     # destination byte
     # source byte
@@ -49,7 +46,6 @@ class PMPacket(object):
         valid = valid and (data[0] == PMPacket._header_byte)
         msg += "invalid header, " if (not valid) else ""
 
-
         # valid = data[4] in PMPacket._valid_bytes
         # msg += "invalid header, expected one of " + ', '.join(hex(s) for s in PMPacket._valid_bytes) +", got: " + hex(data[4]) + ", " if (not valid) else ""
         #valid = valid and ((data[1] == 0x10) or (data[1] == 0xf0))
@@ -104,18 +100,6 @@ class PMPacket(object):
     def get_source(self):
         return self._src
 
-    def get_rom_id(self):
-        return PMPacket.extract_rom_id(self._data)
-
-    @classmethod
-    def extract_rom_id(cls, data):
-        if data[0] != 0xFF:
-            raise Exception('packet', "not valid init response: " + hex(data[0]) + " instead 0xFF")
-        if len(data) < 9:
-            raise Exception('packet', "not valid init response")
-        rom_id = ((data[4] << 32) | (data[5] << 24) | (data[6] << 16) | (data[7] << 8) | (data[8])) & 0xFFFFFFFFFF
-        return hex(rom_id).lstrip("0x").upper()
-
     @classmethod
     def dump_header(cls, data):
         print("header [" + ', '.join(hex(s) for s in data) + "], len: " + str(len(data)))

+ 2 - 3
pimonitor/PMUtils.py

@@ -10,9 +10,8 @@ from pimonitor.PM import PM
 
 class PMUtils(object):
     """
-	classdocs
-	"""
-
+    classdocs
+    """
 
     # Return CPU temperature as a character string
     @classmethod

+ 85 - 77
pimonitor/PMXmlParser.py

@@ -8,15 +8,18 @@ import xml.sax
 import os.path
 
 from pimonitor.PM import PM
-from pimonitor.PMParameter import PMParameter
-
-# TODO: dependencies
-# TODO: ecuparams
+from pimonitor.cu.PMCUAddress import PMCUAddress
+from pimonitor.cu.PMCUCalculatedParameter import PMCUCalculatedParameter
+from pimonitor.cu.PMCUConversion import PMCUConversion
+from pimonitor.cu.PMCUFixedAddressParameter import PMCUFixedAddressParameter
+from pimonitor.cu.PMCUParameter import PMCUParameter
+from pimonitor.cu.PMCUStandardParameter import PMCUStandardParameter
+from pimonitor.cu.PMCUSwitchParameter import PMCUSwitchParameter
 
 # <parameter id="P1" name="Engine Load (Relative)" desc="P1" ecubyteindex="8" ecubit="7" target="1">
 # <address>0x000007</address>
-#    <conversions>
-#        <conversion units="%" expr="x*100/255" format="0.00" />
+# <conversions>
+# <conversion units="%" expr="x*100/255" format="0.00" />
 #    </conversions>
 #</parameter>
 
@@ -26,31 +29,44 @@ from pimonitor.PMParameter import PMParameter
 #    </ecu>
 # ... ecu and conversions
 
-# <switch id="S71" name="Clear Memory Terminal" desc="(E) S71" byte="0x000061" bit="0" ecubyteindex="19" target="1" />
+#<parameter id="P200" name="Engine Load (Calculated)" desc="P200-Engine load as calculated from MAF and RPM." target="1">
+#   <depends>
+#       <ref parameter="P8" />
+#       <ref parameter="P12" />
+#   </depends>
+#   <conversions>
+#       <conversion units="g/rev" expr="(P12*60)/P8" format="0.00" />
+#   </conversions>
+#</parameter>
 
-class PMXmlParser(xml.sax.ContentHandler):
-    """
-	classdocs
-	"""
+# <switch id="S71" name="Clear Memory Terminal" desc="(E) S71" byte="0x000061" bit="0" ecubyteindex="19" target="1" />
 
 
+class PMXmlParser(xml.sax.ContentHandler):
     def __init__(self):
-        """
-		Constructor
-		"""
         xml.sax.ContentHandler.__init__(self)
+        self._message = ''
+        self._log_id = 0
 
-    def parse(self, file_name):
-        self._parameters = set()
-        self._parameter = None
         self._element_no = 0
+
+        self._contexts = None
+
+        self._parameter = None
+        self._parameters = set()
+
         self._characters = ''
-        self._ecu_id = None
+        self._ecu_ids = None
+        self._address_length = 0
 
-        self._message = "Parsing XML data"
+    def parse(self, file_name):
+        self._message = 'Parsing XML data'
         self._log_id = PM.log(self._message)
-        source = open(os.path.join("data", file_name))
+
+        file_path = os.path.join("data", file_name)
+        source = open(file_path)
         xml.sax.parse(source, self)
+        self.log_progress()
         PM.log(self._message + " [DONE]", self._log_id)
 
         return self._parameters
@@ -58,15 +74,16 @@ class PMXmlParser(xml.sax.ContentHandler):
     def startElement(self, name, attrs):
         pid = None
         desc = None
-        target = None
-        address = None
+        target = 0
         units = None
         expr = None
         value_format = None
+        address = None
+
+        byte_index = PMCUParameter.CU_INVALID_BYTE_INDEX()
+        bit_index = PMCUParameter.CU_INVALID_BIT_INDEX()
 
         if name == "parameter":
-            byte_index = "none"
-            bit_index = "none"
 
             for (k, v) in attrs.items():
                 if k == "id":
@@ -82,12 +99,14 @@ class PMXmlParser(xml.sax.ContentHandler):
                 if k == "target":
                     target = int(v)
 
-            self._parameter = PMParameter(pid, name, desc, byte_index, bit_index, target)
-
-        if name == "switch":
-            byte_index = "none"
-            bit_index = "none"
+            if byte_index is not PMCUParameter.CU_INVALID_BYTE_INDEX() and bit_index is not PMCUParameter.CU_INVALID_BIT_INDEX():
+                self._parameter = PMCUStandardParameter(pid, name, desc, byte_index, bit_index, target)
+            elif byte_index is PMCUParameter.CU_INVALID_BYTE_INDEX() and bit_index is PMCUParameter.CU_INVALID_BIT_INDEX():
+                self._parameter = PMCUCalculatedParameter(pid, name, desc, target)
+            else:
+                raise Exception
 
+        if name == "ecuparam":
             for (k, v) in attrs.items():
                 if k == "id":
                     pid = v
@@ -95,22 +114,12 @@ class PMXmlParser(xml.sax.ContentHandler):
                     name = v
                 if k == "desc":
                     desc = v
-                if k == "ecubyteindex":
-                    byte_index = int(v)
-                if k == "bit":
-                    bit_index = int(v)
                 if k == "target":
                     target = int(v)
-                if k == "byte":
-                    address = v
 
-            self._parameter = PMParameter(pid, name, desc, byte_index, bit_index, target)  #
-            self._parameter.set_address(int(address, 16), 1)
-
-        if name == "ecuparam":
-            byte_index = "none"
-            bit_index = "none"
+            self._parameter = PMCUFixedAddressParameter(pid, name, desc, target)
 
+        if name == "switch":
             for (k, v) in attrs.items():
                 if k == "id":
                     pid = v
@@ -118,24 +127,22 @@ class PMXmlParser(xml.sax.ContentHandler):
                     name = v
                 if k == "desc":
                     desc = v
+                if k == "byte":
+                    address = int(v, 16)
+                if k == "ecubyteindex":
+                    byte_index = int(v)
+                if k == "bit":
+                    bit_index = int(v)
                 if k == "target":
                     target = int(v)
 
-            self._parameter = PMParameter(pid, name, desc, byte_index, bit_index, target)
+            self._parameter = PMCUSwitchParameter(pid, name, desc, address, byte_index, bit_index, target)
 
         if name == "address":
-            self._addrlen = 1
+            self._address_length = 1
             for (k, v) in attrs.items():
                 if k == "length":
-                    self._addrlen = int(v)
-
-        if name == "depends":
-            self._addrlen = 0
-
-        if name == "ref":
-            for (k, v) in attrs.items():
-                if k == "parameter":
-                    self._parameter.add_dependency(v)
+                    self._address_length = int(v)
 
         if name == "conversion":
             for (k, v) in attrs.items():
@@ -146,15 +153,17 @@ class PMXmlParser(xml.sax.ContentHandler):
                 if k == "format":
                     value_format = v
 
-            self._parameter.add_conversion([units, expr, value_format])
+            self._parameter.add_conversion(PMCUConversion(units, expr, value_format))
 
         if name == "ecu":
             for (k, v) in attrs.items():
                 if k == "id":
-                    self._parameter.init_ecu_id(v)
-                    self._ecu_id = self._parameter.get_ecu_id(v)
+                    self._ecu_ids = v.split(",")
 
-        self._name = name
+        if name == "ref":
+            for (k, v) in attrs.items():
+                if k == "parameter":
+                    self._parameter.add_dependency(v)
 
     def characters(self, content):
         self._characters = self._characters + content
@@ -163,39 +172,38 @@ class PMXmlParser(xml.sax.ContentHandler):
         if name == "parameter":
             self._parameters.add(self._parameter)
             self._parameter = None
-            self._addrlen = 0
 
         if name == "ecuparam":
             self._parameters.add(self._parameter)
             self._parameter = None
-            self._addrlen = 0
 
-        #if name == "switch":
-        #self._parameters.add(self._parameter)
-        #self._parameter = None
-        #self._addrlen = 0
+        if name == "switch":
+            self._parameters.add(self._parameter)
+            self._parameter = None
 
         if name == "address":
             self._characters = self._characters.strip()
-            if len(self._characters.strip()) > 0 and self._name == "address" and self._parameter is not None:
-                if self._ecu_id is None:
-                    self._parameter.set_address(int(self._characters, 16), self._addrlen)
-                else:
-                    self._ecu_id.append(int(self._characters, 16))
-                    self._ecu_id.append(self._addrlen)
-
-            self._addrlen = 0
-            self._characters = ''
 
-        if name == "ecu":
-            self._ecu_id = None
+            if len(self._characters.strip()) > 0:
+
+                if self._parameter.get_cu_type() == PMCUParameter.CU_TYPE_STD_PARAMETER():
+                    self._parameter.set_address(PMCUAddress(int(self._characters, 16), self._address_length))
+                elif self._parameter.get_cu_type() == PMCUParameter.CU_TYPE_FIXED_ADDRESS_PARAMETER():
+                    address = PMCUAddress(int(self._characters, 16), self._address_length)
+                    for ecu_id in self._ecu_ids:
+                        self._parameter.add_ecu_id(ecu_id, address)
 
-        if name == "depends":
-            pass
+            self._address_length = 0
+            self._characters = ''
 
-        self._name = ""
+        if name == "ecu":
+            self._ecu_ids = None
 
         self._element_no += 1
 
         if self._element_no % 1000 == 0:
-            PM.log(self._message + " " + str(self._element_no) + " elements", self._log_id)
+            self.log_progress()
+
+    def log_progress(self):
+        PM.log(self._message + " " + str(self._element_no) + " elements, " + str(len(self._parameters)) + " parameters",
+               self._log_id)

+ 16 - 0
pimonitor/cu/PMCUAddress.py

@@ -0,0 +1,16 @@
+__author__ = 'citan'
+
+class PMCUAddress(object):
+
+    def __init__(self, address, length):
+        self._address = address
+        self._length = length
+
+    def get_address(self):
+        return self._address
+
+    def get_length(self):
+        return self._length
+
+    def to_string(self):
+        return "address=" + hex(self._address) + ", length=" + str(self._length)

+ 81 - 0
pimonitor/cu/PMCUCalculatedParameter.py

@@ -0,0 +1,81 @@
+import re
+
+from pimonitor.cu.PMCUParameter import PMCUParameter
+from pimonitor.cu.PMCUStandardParameter import PMCUStandardParameter
+
+__author__ = 'citan'
+
+class PMCUCalculatedParameter(PMCUStandardParameter):
+    def __init__(self, pid, name, desc, target):
+        PMCUStandardParameter.__init__(self, pid, name, desc, PMCUParameter.CU_INVALID_BYTE_INDEX(),
+                                       PMCUParameter.CU_INVALID_BIT_INDEX(), target)
+
+        self._cu_type = PMCUParameter.CU_TYPE_CALCULATED_PARAMETER()
+        self._dependencies = []
+
+    def add_dependency(self, parameter):
+        self._dependencies.append(parameter)
+
+    def get_calculated_value(self, packets, unit=None):
+        value = ""
+        local_vars = locals()
+
+        if len(self._conversions) > 0 and unit is None:
+            unit = self._conversions[0][0]
+
+        for conversion in self._conversions:
+            curr_unit = conversion.get_unit()
+            expr = conversion.get_expr()
+            value_format = conversion.get_format()
+            conversion_map = {}
+            if unit == curr_unit:
+                param_pairs = re.findall(r'\[([^]]*)\]', expr)
+                for pair in param_pairs:
+                    attributes = pair.split(":")
+                    key = attributes[0]
+                    unit = attributes[1]
+                    expr = expr.replace("[" + key + ":" + unit + "]", key)
+                    conversion_map.update({key: unit})
+
+                param_no = 0
+                for packet in packets:
+                    param = self._parameters[param_no]
+                    if param.get_id() in conversion_map:
+                        conversion_unit = conversion_map[param.get_id()]
+                    else:
+                        conversion_unit = None
+
+                    if param.get_dependencies():
+                        return "DEPS :("
+                    else:
+                        value = param.get_value(packet, conversion_unit)
+                        local_vars[param.get_id()] = float(value)
+                    param_no += 1
+
+                try:
+                    value = eval(expr)
+                except (SyntaxError, ZeroDivisionError):
+                    value = 0.0
+
+                format_tokens = value_format.split(".")
+                output_format = "%.0f"
+                if len(format_tokens) > 1:
+                    output_format = "%." + str(len(format_tokens[1])) + "f"
+
+                value = output_format % value
+
+        return value
+
+    def is_supported(self, parameters):
+        param_ids = [p.get_id() for p in parameters]
+
+        for dependency in self._dependencies:
+            if dependency not in param_ids:
+                return False
+
+        return True
+
+    def to_string(self):
+        return "id=" + self._id + "\nname=" + self._name + "\ndesc=" + self._desc +  "\ntarget=" + str(
+            self._target) + "\nconversion:\n\t" + '%s' % ',\n\t'.join(x.to_string() for x in self._conversions) + \
+            '\ndependency: ' + '%s' % ', '.join(x for x in self._dependencies)

+ 86 - 0
pimonitor/cu/PMCUContext.py

@@ -0,0 +1,86 @@
+from pimonitor.cu.PMCUParameter import PMCUParameter
+
+__author__ = 'citan'
+
+
+class PMCUContext(object):
+    @classmethod
+    def RESPONSE_MARK_OFFSET(cls):
+        return 4
+
+    @classmethod
+    def RESPONSE_ROM_ID_OFFSET(cls):
+        return 8
+
+    @classmethod
+    def INITIAL_RESPONSE_MIN_LEN(cls):
+        return 13
+
+    def __init__(self, packet, targets):
+        self._packet = packet
+        self._targets = targets
+
+    def get_rom_id(self):
+        data = self._packet.to_bytes()
+
+        if data[PMCUContext.RESPONSE_MARK_OFFSET()] != 0xFF:
+            raise Exception('packet', "not valid init response: " + hex(data[0]) + " instead 0xFF")
+        if len(data) < PMCUContext.INITIAL_RESPONSE_MIN_LEN():
+            raise Exception('packet', "not valid init response")
+
+        rom_id = ((data[PMCUContext.RESPONSE_ROM_ID_OFFSET()] << 32) |
+                  (data[PMCUContext.RESPONSE_ROM_ID_OFFSET() + 1] << 24) |
+                  (data[PMCUContext.RESPONSE_ROM_ID_OFFSET() + 2] << 16) |
+                  (data[PMCUContext.RESPONSE_ROM_ID_OFFSET() + 3] << 8) |
+                  (data[PMCUContext.RESPONSE_ROM_ID_OFFSET() + 4])) & 0xFFFFFFFFFF
+
+        return hex(rom_id).lstrip("0x").upper()
+
+    def match_parameters(self, parameters):
+        matched = []
+        rom_id = self.get_rom_id()
+
+        for parameter in parameters:
+            if parameter.get_target() not in self._targets:
+                continue
+
+            cu_type = parameter.get_cu_type()
+
+            if cu_type == PMCUParameter.CU_TYPE_STD_PARAMETER():
+                if parameter.is_supported(self._packet.to_bytes()):
+                    matched.append(parameter)
+            elif cu_type == PMCUParameter.CU_TYPE_FIXED_ADDRESS_PARAMETER():
+                if parameter.is_supported(rom_id):
+                    parameter.switch_to_id(rom_id)
+                    matched.append(parameter)
+
+        return matched
+
+    def match_switch_parameters(self, parameters):
+        matched = []
+
+        for parameter in parameters:
+            if parameter.get_target() not in self._targets:
+                continue
+
+            cu_type = parameter.get_cu_type()
+
+            if cu_type == PMCUParameter.CU_TYPE_SWITCH_PARAMETER():
+                if parameter.is_supported(self._packet.to_bytes()):
+                    matched.append(parameter)
+
+        return matched
+
+    def match_calculated_parameters(self, parameters, supported_parameters):
+        matched = []
+
+        for parameter in parameters:
+            if parameter.get_target() not in self._targets:
+                continue
+
+            cu_type = parameter.get_cu_type()
+            if cu_type == PMCUParameter.CU_TYPE_CALCULATED_PARAMETER():
+                if parameter.is_supported(supported_parameters):
+                    matched.append(parameter)
+
+        return matched

+ 20 - 0
pimonitor/cu/PMCUConversion.py

@@ -0,0 +1,20 @@
+__author__ = 'citan'
+
+class PMCUConversion(object):
+
+    def __init__(self, unit, expr, format):
+        self._unit = unit
+        self._expr = expr
+        self._format = format
+
+    def get_unit(self):
+        return self._unit
+
+    def get_expr(self):
+        return self._expr
+
+    def get_format(self):
+        return self._format
+
+    def to_string(self):
+        return "unit=" + self._unit + ", expr=" + self._expr + ", format=" + self._format

+ 35 - 0
pimonitor/cu/PMCUFixedAddressParameter.py

@@ -0,0 +1,35 @@
+from pimonitor.cu.PMCUParameter import PMCUParameter
+from pimonitor.cu.PMCUStandardParameter import PMCUStandardParameter
+
+__author__ = 'citan'
+
+class PMCUFixedAddressParameter(PMCUStandardParameter):
+    def __init__(self, pid, name, desc, target):
+        PMCUStandardParameter.__init__(self, pid, name, desc, PMCUParameter.CU_INVALID_BYTE_INDEX(),
+                                       PMCUParameter.CU_INVALID_BIT_INDEX(), target)
+
+        self._cu_type = PMCUParameter.CU_TYPE_FIXED_ADDRESS_PARAMETER()
+        self._cu_ids = {}
+
+    def add_ecu_id(self, cu_id, address):
+        self._cu_ids[cu_id] = address
+
+    def get_address_for_id(self, cu_id):
+        if cu_id in self._cu_ids:
+            return self._cu_ids[cu_id]
+        else:
+            return None
+
+    def switch_to_id(self, cu_id):
+        self._address = self.get_address_for_id(cu_id)
+
+    def set_address(self, address):
+        raise Exception
+
+    def is_supported(self, cu_id):
+        return self.get_address_for_id(cu_id) is not None
+
+    def to_string(self):
+        return "id=" + self._id + "\nname=" + self._name + "\ndesc=" + self._desc +  "\ntarget=" + str(
+            self._target) + "\nconversion:\n\t" + '%s' % '\n\t'.join(x.to_string() for x in self._conversions) + \
+            '\necu: ' + ' '.join(['\n\tid={}, {}'.format(k,v.to_string()) for k,v in self._cu_ids.iteritems()])

+ 40 - 0
pimonitor/cu/PMCUParameter.py

@@ -0,0 +1,40 @@
+__author__ = 'citan'
+
+# <parameter id="P1" name="Engine Load (Relative)" desc="P1" ecubyteindex="8" ecubit="7" target="1">
+# <address>0x000007</address>
+# <conversions>
+#        <conversion units="%" expr="x*100/255" format="0.00" />
+#    </conversions>
+#</parameter>
+
+class PMCUParameter(object):
+
+    def __init__(self, cu_type):
+        self._cu_type = cu_type
+
+    def get_cu_type(self):
+        return self._cu_type
+
+    @classmethod
+    def CU_TYPE_STD_PARAMETER(cls):
+        return 0
+
+    @classmethod
+    def CU_TYPE_FIXED_ADDRESS_PARAMETER(cls):
+        return 1
+
+    @classmethod
+    def CU_TYPE_SWITCH_PARAMETER(cls):
+        return 2
+
+    @classmethod
+    def CU_TYPE_CALCULATED_PARAMETER(cls):
+        return 3
+
+    @classmethod
+    def CU_INVALID_BYTE_INDEX(cls):
+        return -1
+
+    @classmethod
+    def CU_INVALID_BIT_INDEX(cls):
+        return -1

+ 99 - 0
pimonitor/cu/PMCUStandardParameter.py

@@ -0,0 +1,99 @@
+from pimonitor.cu.PMCUContext import PMCUContext
+from pimonitor.cu.PMCUParameter import PMCUParameter
+
+__author__ = 'citan'
+
+
+class PMCUStandardParameter(PMCUParameter):
+    def __init__(self, pid, name, desc, byte_index, bit_index, target):
+        PMCUParameter.__init__(self, PMCUParameter.CU_TYPE_STD_PARAMETER())
+
+        self._id = pid
+        self._name = name
+        self._desc = desc
+        self._byte_index = byte_index
+        self._bit_index = bit_index
+        self._target = target
+        self._conversions = []
+        self._address = None
+
+    def get_id(self):
+        return self._id
+
+    def set_address(self, address):
+        self._address = address
+
+    def get_address(self):
+        return self._address
+
+    def get_target(self):
+        return self._target
+
+    def get_name(self):
+        return self._name
+
+    def add_conversion(self, conversion):
+        self._conversions.append(conversion)
+
+    # noinspection PyUnusedLocal
+    def get_value(self, packet, unit=None):
+        value = ""
+
+        if len(self._conversions) > 0 and unit is None:
+            unit = self._conversions[0].get_unit()
+
+        for conversion in self._conversions:
+            curr_unit = conversion.get_unit()
+            expr = conversion.get_expr()
+            value_format = conversion.get_format()
+
+            if unit == curr_unit:
+                # ignore 0xe8
+                index = 1
+                x = 0
+                value_bytes = packet.get_data()[index:index + self.get_address().get_length()]
+
+                address_length = self.get_address().get_length()
+                if address_length == 1:
+                    x = value_bytes[0]
+                elif address_length == 2:
+                    x = (value_bytes[0] << 8) | value_bytes[1]
+                elif address_length == 3:
+                    x = (value_bytes[0] << 16) | (value_bytes[1] << 8) | value_bytes[2]
+                elif address_length == 4:
+                    x = (value_bytes[0] << 24) | (value_bytes[1] << 16) | (value_bytes[2] << 8) | value_bytes[3]
+
+                try:
+                    value = eval(expr)
+                except (SyntaxError, ZeroDivisionError):
+                    return "exception"
+
+                format_tokens = value_format.split(".")
+                output_format = "%.0f"
+                if len(format_tokens) > 1:
+                    output_format = "%." + str(len(format_tokens[1])) + "f"
+
+                value = output_format % value
+
+        return value
+
+    def get_default_unit(self):
+        if len(self._conversions) > 0:
+            return self._conversions[0].get_unit()
+        return ""
+
+    def is_supported(self, data):
+        offset = PMCUContext.RESPONSE_MARK_OFFSET() + 1 + self._byte_index
+        # <, not <= because last one is checksum
+        if offset < len(data):
+            cu_byte = data[offset]
+            bit_mask = 1 << self._bit_index
+            return cu_byte & bit_mask == bit_mask
+        else:
+            return False
+
+    def to_string(self):
+        return "id=" + self._id + "\nname=" + self._name + "\ndesc=" + self._desc + "\nbyte=" + str(
+            self._byte_index) + "\n" + self._address.to_string() + "\nbit=" + str(
+            self._bit_index) + "\ntarget=" + str(
+            self._target) + "\nconversion:\n\t" + '%s' % ',\n\t'.join(x.to_string() for x in self._conversions)

+ 30 - 0
pimonitor/cu/PMCUSwitchParameter.py

@@ -0,0 +1,30 @@
+from pimonitor.cu.PMCUAddress import PMCUAddress
+from pimonitor.cu.PMCUParameter import PMCUParameter
+from pimonitor.cu.PMCUStandardParameter import PMCUStandardParameter
+
+__author__ = 'citan'
+
+
+class PMCUSwitchParameter(PMCUStandardParameter):
+    def __init__(self, pid, name, desc, address, byte_index, bit_index, target):
+        PMCUStandardParameter.__init__(self, pid, name, desc, byte_index,
+                                       bit_index, target)
+
+        self._cu_type = PMCUParameter.CU_TYPE_SWITCH_PARAMETER()
+        self.set_address(PMCUAddress(address, 1))
+
+    def get_value(self, packet):
+        index = 1
+        value_byte = packet.get_data()[index:index + self._address.get_length()][0]
+
+        bit_mask = 1 << self._bit_index
+        if value_byte & bit_mask == bit_mask:
+            return "1"
+        else:
+            return "0"
+
+    def to_string(self):
+        return "id=" + self._id + "\nname=" + self._name + "\ndesc=" + self._desc + "\nbyte=" + str(
+            self._byte_index) + "\n" + self._address.to_string() + "\nbit=" + str(
+            self._bit_index) + "\ntarget=" + str(
+            self._target)

+ 1 - 0
pimonitor/cu/__init__.py

@@ -0,0 +1 @@
+__author__ = 'citan'

+ 107 - 0
pimonitor/test/PMCUTest.py

@@ -0,0 +1,107 @@
+from pimonitor.PMXmlParser import PMXmlParser
+from pimonitor.cu.PMCUContext import PMCUContext
+
+__author__ = 'citan'
+
+import unittest
+
+from pimonitor.PMDemoConnection import PMDemoConnection
+from pimonitor.PM import PM
+
+class PMCUTestCase(unittest.TestCase):
+
+    def setUp(self):
+        self._ecu_packet = None
+        self._tcu_packet = None
+
+        self._connection = None
+
+        self._parameters = None
+
+        self._ecu_context = None
+        self._tcu_context = None
+
+        self._ecu_parameters = None
+        self._ecu_switch_parameters = None
+        self._ecu_calculated_parameters = None
+
+        self._tcu_parameters = None
+        self._tcu_calculated_parameters = None
+        self._tcu_switch_parameters = None
+
+        logger = PM()
+        logger.set(self.log)
+
+    def prepare_1_open_connection(self):
+        self._connection = PMDemoConnection()
+
+        result = self._connection.open()
+        self.assertTrue(result)
+
+    def prepare_2_init_connection(self):
+        self.prepare_1_open_connection()
+        self.assertIsNotNone(self._connection)
+
+        self._ecu_packet = self._connection.init(1)
+        self.assertIsNotNone(self._ecu_packet)
+
+        self._tcu_packet = self._connection.init(2)
+        self.assertIsNotNone(self._tcu_packet)
+
+    def prepare_3_parse_logger_definition(self):
+        self.prepare_2_init_connection()
+        parser = PMXmlParser()
+
+        self._parameters = parser.parse("logger_METRIC_EN_v263.xml")
+
+        self._parameters = sorted(self._parameters, key=lambda x: x.get_id(), reverse=True)
+
+        self.assertIsNotNone(self._parameters)
+        self.assertEqual(len(self._parameters), 716)
+
+    def prepare_4_match_parameters(self):
+        self.prepare_3_parse_logger_definition()
+
+        self._ecu_context = PMCUContext(self._ecu_packet, [1, 3])
+        self._ecu_parameters = self._ecu_context.match_parameters(self._parameters)
+        self.assertIsNotNone(self._ecu_parameters)
+        self.assertEqual(len(self._ecu_parameters), 125)
+
+        self._ecu_switch_parameters = self._ecu_context.match_switch_parameters(self._parameters)
+        self.assertIsNotNone(self._ecu_switch_parameters)
+        self.assertEqual(len(self._ecu_switch_parameters), 36)
+
+        self._ecu_calculated_parameters = self._ecu_context.match_calculated_parameters(self._parameters, self._ecu_parameters)
+        self.assertIsNotNone(self._ecu_calculated_parameters)
+        self.assertEqual(len(self._ecu_calculated_parameters), 4)
+
+        self._tcu_context = PMCUContext(self._tcu_packet, [2])
+        self._tcu_parameters = self._tcu_context.match_parameters(self._parameters)
+        self.assertIsNotNone(self._tcu_parameters)
+        self.assertEqual(len(self._tcu_parameters), 11)
+
+        self._tcu_switch_parameters = self._tcu_context.match_switch_parameters(self._parameters)
+        self.assertIsNotNone(self._tcu_switch_parameters)
+        self.assertEqual(len(self._tcu_switch_parameters), 13)
+
+        self._tcu_calculated_parameters = self._tcu_context.match_calculated_parameters(self._parameters, self._tcu_parameters)
+        self.assertIsNotNone(self._tcu_calculated_parameters)
+        self.assertEqual(len(self._tcu_calculated_parameters), 0)
+
+        #TODO: switches
+
+    def test_5_read_parameters(self):
+        self.prepare_4_match_parameters()
+
+        print self._ecu_parameters[120].to_string()
+        packet = self._connection.read_parameter(self._ecu_parameters[120])
+        value = self._ecu_parameters[120].get_value(packet)
+        print 'value=' + value
+
+    def log(self, message, mid):
+        print message
+
+        return mid
+
+if __name__ == '__main__':
+    unittest.main()

+ 1 - 0
pimonitor/test/__init__.py

@@ -0,0 +1 @@
+__author__ = 'citan'

+ 4 - 5
pimonitor/ui/PMScreen.py

@@ -16,16 +16,16 @@ from pimonitor.PMUtils import PMUtils
 
 class PMScreen(object):
     """
-	classdocs
-	"""
+    classdocs
+    """
     LOG_FPS_EVENT = pygame.USEREVENT + 1
     LOG_STATS_EVENT = LOG_FPS_EVENT + 1
     ONE_SEC_EVENT = LOG_STATS_EVENT + 1
 
     def __init__(self):
         """
-		Constructor
-		"""
+        Constructor
+        """
         pygame.init()
         pygame.mouse.set_visible(False)
 
@@ -158,7 +158,6 @@ class PMScreen(object):
         if to_be_deleted is not None:
             self._log_queue.remove(to_be_deleted)
 
-
     def purge_logs(self):
         to_be_deleted = []
 

+ 1 - 1
pimonitor/ui/PMSingleWindow.py

@@ -47,7 +47,7 @@ class PMSingleWindow(object):
     def render(self):
         value = "??"
         if self._packets is not None:
-            if self._param.get_address_length() > 0:
+            if self._param.get_address().get_length() > 0:
                 value = self._param.get_value(self._packets[0])
             elif self._param.get_dependencies():
                 value = self._param.get_calculated_value(self._packets)

+ 2 - 3
pimonitor/ui/PMWindow.py

@@ -9,8 +9,8 @@ import pygame
 
 class PMWindow(object):
     """
-	classdocs
-	"""
+    classdocs
+    """
 
     def __init__(self):
         self._fg_color = pygame.Color(255, 255, 255)
@@ -38,7 +38,6 @@ class PMWindow(object):
 
         self._value_lbl_width = self._value_font.render("999", self._font_aa, self._fg_color).get_width()
 
-
     def render(self):
 
         first_row_height = self._title_font_size + self._value_font_size + 10