ProjectController.py
changeset 2463 8742337a9fe3
parent 2462 ed6b0e905fcb
child 2464 10437c6c294e
--- a/ProjectController.py	Tue Nov 27 13:34:14 2018 +0100
+++ b/ProjectController.py	Tue Dec 04 11:31:58 2018 +0100
@@ -891,19 +891,6 @@
             self._builder = targetclass(self)
         return self._builder
 
-    def ResetBuildMD5(self):
-        builder = self.GetBuilder()
-        if builder is not None:
-            builder.ResetBinaryCodeMD5()
-        self.EnableMethod("_Transfer", False)
-
-    def GetLastBuildMD5(self):
-        builder = self.GetBuilder()
-        if builder is not None:
-            return builder.GetBinaryCodeMD5()
-        else:
-            return None
-
     #
     #
     #                C CODE GENERATION METHODS
@@ -1131,7 +1118,6 @@
         # If IEC code gen fail, bail out.
         if not IECGenRes:
             self.logger.write_error(_("PLC code generation failed !\n"))
-            self.ResetBuildMD5()
             return False
 
         # Reset variable and program list that are parsed from
@@ -1147,7 +1133,6 @@
         builder = self.GetBuilder()
         if builder is None:
             self.logger.write_error(_("Fatal : cannot get builder.\n"))
-            self.ResetBuildMD5()
             return False
 
         # Build
@@ -1156,9 +1141,9 @@
                 self.logger.write_error(_("C Build failed.\n"))
                 return False
         except Exception:
+            builder.ResetBinaryMD5()
             self.logger.write_error(_("C Build crashed !\n"))
             self.logger.write_error(traceback.format_exc())
-            self.ResetBuildMD5()
             return False
 
         self.logger.write(_("Successfully built.\n"))
@@ -1178,7 +1163,6 @@
             self.logger.write_error(
                 _("Runtime IO extensions C code generation failed !\n"))
             self.logger.write_error(traceback.format_exc())
-            self.ResetBuildMD5()
             return False
 
         # Generate C code and compilation params from liraries
@@ -1189,7 +1173,6 @@
             self.logger.write_error(
                 _("Runtime library extensions C code generation failed !\n"))
             self.logger.write_error(traceback.format_exc())
-            self.ResetBuildMD5()
             return False
 
         self.LocationCFilesAndCFLAGS = LibCFilesAndCFLAGS + \
@@ -1239,7 +1222,6 @@
             except Exception:
                 self.logger.write_error(name + _(" generation failed !\n"))
                 self.logger.write_error(traceback.format_exc())
-                self.ResetBuildMD5()
                 return False
         self.logger.write(_("C code generated successfully.\n"))
         return True
@@ -1820,26 +1802,18 @@
     def CompareLocalAndRemotePLC(self):
         if self._connector is None:
             return
-        # We are now connected. Update button status
-        MD5 = self.GetLastBuildMD5()
+        builder = self.GetBuilder()
+        if builder is None :
+            return
+        MD5 = builder.GetBinaryMD5()
+        if MD5 is None:
+            return
         # Check remote target PLC correspondance to that md5
-        if MD5 is not None:
-            if not self._connector.MatchMD5(MD5):
-                # self.logger.write_warning(
-                # _("Latest build does not match with target, please
-                # transfer.\n"))
-                self.EnableMethod("_Transfer", True)
-            else:
-                # self.logger.write(
-                #     _("Latest build matches target, no transfer needed.\n"))
-                self.EnableMethod("_Transfer", True)
-                # warns controller that program match
-                self.ProgramTransferred()
-                # self.EnableMethod("_Transfer", False)
+        if self._connector.MatchMD5(MD5):
+            self.ProgramTransferred()
         else:
-            # self.logger.write_warning(
-            #     _("Cannot compare latest build to target. Please build.\n"))
-            self.EnableMethod("_Transfer", False)
+            self.logger.write(
+                _("Latest build does not match with connected target.\n"))
 
     def _Disconnect(self):
         self._SetConnector(None)
@@ -1855,8 +1829,13 @@
             else:
                 return
 
-        # Get the last build PLC's
-        MD5 = self.GetLastBuildMD5()
+        builder = self.GetBuilder()
+        if builder is None:
+            self.logger.write_error(_("Fatal : cannot get builder.\n"))
+            return False
+
+        # recover md5 from last build 
+        MD5 = builder.GetBinaryMD5()
 
         # Check if md5 file is empty : ask user to build PLC
         if MD5 is None:
@@ -1869,35 +1848,37 @@
             self.logger.write(
                 _("Latest build already matches current target. Transfering anyway...\n"))
 
-        # Get temprary directory path
+        # purge any non-finished transfer
+        # note: this would abord any runing transfer with error
+        self._connector.PurgeBlobs()
+
+        # transfer extra files
         extrafiles = []
         for extrafilespath in [self._getExtraFilesPath(),
                                self._getProjectFilesPath()]:
 
-            extrafiles.extend(
-                [(name, open(os.path.join(extrafilespath, name),
-                             'rb').read())
-                 for name in os.listdir(extrafilespath)])
+            for name in os.listdir(extrafilespath):
+                extrafiles.append((
+                    name, 
+                    self._connector.BlobFromFile(
+                        os.path.join(extrafilespath, name))))
 
         # Send PLC on target
-        builder = self.GetBuilder()
-        if builder is not None:
-            data = builder.GetBinaryCode()
-            if data is not None:
-                if self._connector.NewPLC(MD5, data, extrafiles) and self.GetIECProgramsAndVariables():
-                    self.UnsubscribeAllDebugIECVariable()
-                    self.ProgramTransferred()
-                    if self.AppFrame is not None:
-                        self.AppFrame.CloseObsoleteDebugTabs()
-                        self.AppFrame.RefreshPouInstanceVariablesPanel()
-                    self.logger.write(_("Transfer completed successfully.\n"))
-                    self.AppFrame.LogViewer.ResetLogCounters()
-                else:
-                    self.logger.write_error(_("Transfer failed\n"))
-                self.HidePLCProgress()
-            else:
-                self.logger.write_error(
-                    _("No PLC to transfer (did build succeed ?)\n"))
+        object_path = builder.GetBinaryPath()
+        object_blob = self._connector.BlobFromFile(object_path)
+
+        if self._connector.NewPLC(MD5, object_blob, extrafiles):
+            self.ProgramTransferred()
+            self.AppFrame.CloseObsoleteDebugTabs()
+            self.AppFrame.LogViewer.ResetLogCounters()
+            if self.GetIECProgramsAndVariables():
+                self.UnsubscribeAllDebugIECVariable()
+                self.AppFrame.RefreshPouInstanceVariablesPanel()
+            self.logger.write(_("Transfer completed successfully.\n"))
+        else:
+            self.logger.write_error(_("Transfer failed\n"))
+
+        self.HidePLCProgress()
 
         wx.CallAfter(self.UpdateMethodsFromPLCStatus)