1
0
mirror of https://github.com/naruxde/revpipycontrol.git synced 2025-11-08 15:43:52 +01:00

Watch-Mode IO-Name und IO-Value Seiten getauscht

?bersetzung
Mit develop zusammenf?hren
This commit is contained in:
2018-08-14 09:22:21 +02:00
32 changed files with 1254 additions and 460 deletions

View File

@@ -10,7 +10,7 @@ aclmanager</h1>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3> Global Attributes</h3>
<table> <table>
<tr><td>_</td></tr> <tr><td>_</td></tr><tr><td>__author__</td></tr><tr><td>__copyright__</td></tr><tr><td>__license__</td></tr>
</table> </table>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3> Classes</h3>

View File

@@ -6,7 +6,9 @@
<body style="background-color:#FFFFFF;color:#000000"> <body style="background-color:#FFFFFF;color:#000000">
<h1 style="background-color:#FFFFFF;color:#0000FF"> <h1 style="background-color:#FFFFFF;color:#0000FF">
revpipycontrol.shared</h1> revpipycontrol.shared</h1>
<p>
Shared modules.
</p>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">

View File

@@ -13,7 +13,7 @@ Packages</h3>
<table> <table>
<tr> <tr>
<td><a style="color:#0000FF" href="index-revpipycontrol.shared.html">shared</a></td> <td><a style="color:#0000FF" href="index-revpipycontrol.shared.html">shared</a></td>
<td></td> <td>Shared modules.</td>
</tr> </tr>
</table> </table>
@@ -30,6 +30,9 @@ Modules</h3>
<td><a style="color:#0000FF" href="revpicheckclient.html">revpicheckclient</a></td> <td><a style="color:#0000FF" href="revpicheckclient.html">revpicheckclient</a></td>
<td></td> <td></td>
</tr><tr> </tr><tr>
<td><a style="color:#0000FF" href="revpidevelop.html">revpidevelop</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="revpiinfo.html">revpiinfo</a></td> <td><a style="color:#0000FF" href="revpiinfo.html">revpiinfo</a></td>
<td></td> <td></td>
</tr><tr> </tr><tr>

View File

@@ -12,7 +12,7 @@ Tools-Sammlung.
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3> Global Attributes</h3>
<table> <table>
<tr><td>savefile_connections</td></tr><tr><td>savefile_programpath</td></tr> <tr><td>__author__</td></tr><tr><td>__copyright__</td></tr><tr><td>__license__</td></tr><tr><td>savefile_connections</td></tr><tr><td>savefile_developer</td></tr><tr><td>savefile_programpath</td></tr>
</table> </table>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3> Classes</h3>

View File

@@ -10,7 +10,7 @@ revpicheckclient</h1>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3> Global Attributes</h3>
<table> <table>
<tr><td>_</td></tr> <tr><td>_</td></tr><tr><td>__author__</td></tr><tr><td>__copyright__</td></tr><tr><td>__license__</td></tr>
</table> </table>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3> Classes</h3>

192
doc/revpidevelop.html Normal file
View File

@@ -0,0 +1,192 @@
<!DOCTYPE html>
<html><head>
<title>revpidevelop</title>
<meta charset="UTF-8">
</head>
<body style="background-color:#FFFFFF;color:#000000"><a NAME="top" ID="top"></a>
<h1 style="background-color:#FFFFFF;color:#0000FF">
revpidevelop</h1>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3>
<table>
<tr><td>_</td></tr><tr><td>__author__</td></tr><tr><td>__copyright__</td></tr><tr><td>__license__</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#RevPiDevelop">RevPiDevelop</a></td>
<td>Zeigt Debugfenster an.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Functions</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#_loaddefaults">_loaddefaults</a></td>
<td>&#220;bernimmt f&#252;r den Pi die letzen Pfade.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#_savedefaults">_savedefaults</a></td>
<td>Schreibt fuer den Pi die letzen Pfade.</td>
</tr>
</table>
<hr /><hr />
<a NAME="RevPiDevelop" ID="RevPiDevelop"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">RevPiDevelop</h2>
<p>
Zeigt Debugfenster an.
</p>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Derived from</h3>
ttk.Frame
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Attributes</h3>
<table>
<tr><td>app</td></tr><tr><td>cli</td></tr><tr><td>root</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Methods</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#RevPiDevelop.__init__">RevPiDevelop</a></td>
<td>Init RevPiDevelop-Class.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiDevelop._checkclose">_checkclose</a></td>
<td>Pr&#252;ft ob Fenster beendet werden soll.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiDevelop._createwidgets">_createwidgets</a></td>
<td>Erstellt alle Widgets.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiDevelop.btn_domyjob">btn_domyjob</a></td>
<td>Hochladen und neu starten.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiDevelop.btn_selectpath">btn_selectpath</a></td>
<td>L&#228;sst dem Benuzter ein Verzeichnis ausw&#228;hlen.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiDevelop.load_pathfiles">load_pathfiles</a></td>
<td>Aktualisiert die Dateiliste.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiDevelop.refresh_stats">refresh_stats</a></td>
<td>Passt die Widgets an.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiDevelop.select_pathfiles">select_pathfiles</a></td>
<td>Setzt state der Buttons.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Static Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<a NAME="RevPiDevelop.__init__" ID="RevPiDevelop.__init__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiDevelop (Constructor)</h3>
<b>RevPiDevelop</b>(<i>master, xmlcli, xmlmode, revpi</i>)
<p>
Init RevPiDevelop-Class.
</p><dl>
<dt>Returns:</dt>
<dd>
None
</dd>
</dl><a NAME="RevPiDevelop._checkclose" ID="RevPiDevelop._checkclose"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiDevelop._checkclose</h3>
<b>_checkclose</b>(<i>event=None</i>)
<p>
Pr&#252;ft ob Fenster beendet werden soll.
</p><dl>
<dt><i>event</i></dt>
<dd>
tkinter-Event
</dd>
</dl><a NAME="RevPiDevelop._createwidgets" ID="RevPiDevelop._createwidgets"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiDevelop._createwidgets</h3>
<b>_createwidgets</b>(<i></i>)
<p>
Erstellt alle Widgets.
</p><a NAME="RevPiDevelop.btn_domyjob" ID="RevPiDevelop.btn_domyjob"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiDevelop.btn_domyjob</h3>
<b>btn_domyjob</b>(<i></i>)
<p>
Hochladen und neu starten.
</p><a NAME="RevPiDevelop.btn_selectpath" ID="RevPiDevelop.btn_selectpath"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiDevelop.btn_selectpath</h3>
<b>btn_selectpath</b>(<i></i>)
<p>
L&#228;sst dem Benuzter ein Verzeichnis ausw&#228;hlen.
</p><a NAME="RevPiDevelop.load_pathfiles" ID="RevPiDevelop.load_pathfiles"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiDevelop.load_pathfiles</h3>
<b>load_pathfiles</b>(<i>silent=False</i>)
<p>
Aktualisiert die Dateiliste.
</p><dl>
<dt><i>silent</i></dt>
<dd>
Keinen Dialog anzeigen
</dd>
</dl><a NAME="RevPiDevelop.refresh_stats" ID="RevPiDevelop.refresh_stats"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiDevelop.refresh_stats</h3>
<b>refresh_stats</b>(<i></i>)
<p>
Passt die Widgets an.
</p><a NAME="RevPiDevelop.select_pathfiles" ID="RevPiDevelop.select_pathfiles"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiDevelop.select_pathfiles</h3>
<b>select_pathfiles</b>(<i>tkevt</i>)
<p>
Setzt state der Buttons.
</p>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr /><hr />
<a NAME="_loaddefaults" ID="_loaddefaults"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">_loaddefaults</h2>
<b>_loaddefaults</b>(<i>revpiname=None</i>)
<p>
&#220;bernimmt f&#252;r den Pi die letzen Pfade.
</p><dl>
<dt><i>revpiname</i></dt>
<dd>
Einstellungen nur f&#252;r RevPi laden
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
<class 'dict'> mit Einstellungen
</dd>
</dl>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr /><hr />
<a NAME="_savedefaults" ID="_savedefaults"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">_savedefaults</h2>
<b>_savedefaults</b>(<i>revpiname, settings</i>)
<p>
Schreibt fuer den Pi die letzen Pfade.
</p><dl>
<dt><i>revpiname</i></dt>
<dd>
Einstellungen sind f&#252;r diesen RevPi
</dd><dt><i>settings</i></dt>
<dd>
<class 'dict'> mit Einstellungen
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
True, bei erfolgreicher Verarbeitung
</dd>
</dl>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr />
</body></html>

View File

@@ -10,7 +10,7 @@ revpiinfo</h1>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3> Global Attributes</h3>
<table> <table>
<tr><td>_</td></tr> <tr><td>_</td></tr><tr><td>__author__</td></tr><tr><td>__copyright__</td></tr><tr><td>__license__</td></tr>
</table> </table>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3> Classes</h3>

View File

@@ -10,7 +10,7 @@ revpilegacy</h1>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3> Global Attributes</h3>
<table> <table>
<tr><td>_</td></tr> <tr><td>_</td></tr><tr><td>__author__</td></tr><tr><td>__copyright__</td></tr><tr><td>__license__</td></tr>
</table> </table>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3> Classes</h3>

View File

@@ -10,7 +10,7 @@ revpilogfile</h1>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3> Global Attributes</h3>
<table> <table>
<tr><td>_</td></tr> <tr><td>_</td></tr><tr><td>__author__</td></tr><tr><td>__copyright__</td></tr><tr><td>__license__</td></tr>
</table> </table>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3> Classes</h3>

View File

@@ -10,7 +10,7 @@ revpioption</h1>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3> Global Attributes</h3>
<table> <table>
<tr><td>_</td></tr> <tr><td>_</td></tr><tr><td>__author__</td></tr><tr><td>__copyright__</td></tr><tr><td>__license__</td></tr>
</table> </table>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3> Classes</h3>

View File

@@ -10,7 +10,7 @@ revpiplclist</h1>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3> Global Attributes</h3>
<table> <table>
<tr><td>_</td></tr> <tr><td>_</td></tr><tr><td>__author__</td></tr><tr><td>__copyright__</td></tr><tr><td>__license__</td></tr>
</table> </table>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3> Classes</h3>

View File

@@ -10,7 +10,7 @@ revpiprogram</h1>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3> Global Attributes</h3>
<table> <table>
<tr><td>_</td></tr> <tr><td>_</td></tr><tr><td>__author__</td></tr><tr><td>__copyright__</td></tr><tr><td>__license__</td></tr>
</table> </table>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3> Classes</h3>

View File

@@ -10,7 +10,7 @@ revpipycontrol</h1>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3> Global Attributes</h3>
<table> <table>
<tr><td>_</td></tr><tr><td>pycontrolversion</td></tr> <tr><td>_</td></tr><tr><td>__author__</td></tr><tr><td>__copyright__</td></tr><tr><td>__license__</td></tr><tr><td>__version__</td></tr>
</table> </table>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3> Classes</h3>
@@ -78,6 +78,9 @@ Methods</h3>
<td><a style="color:#0000FF" href="#RevPiPyControl.plcdebug">plcdebug</a></td> <td><a style="color:#0000FF" href="#RevPiPyControl.plcdebug">plcdebug</a></td>
<td>Baut den Debugframe und packt ihn.</td> <td>Baut den Debugframe und packt ihn.</td>
</tr><tr> </tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl.plcdevelop">plcdevelop</a></td>
<td>Startet das Developfenster.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl.plclist">plclist</a></td> <td><a style="color:#0000FF" href="#RevPiPyControl.plclist">plclist</a></td>
<td>&#214;ffnet das Fenster f&#252;r die Verbindungen.</td> <td>&#214;ffnet das Fenster f&#252;r die Verbindungen.</td>
</tr><tr> </tr><tr>
@@ -200,7 +203,13 @@ Baut den Debugframe und packt ihn.
<dd> <dd>
None None
</dd> </dd>
</dl><a NAME="RevPiPyControl.plclist" ID="RevPiPyControl.plclist"></a> </dl><a NAME="RevPiPyControl.plcdevelop" ID="RevPiPyControl.plcdevelop"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl.plcdevelop</h3>
<b>plcdevelop</b>(<i></i>)
<p>
Startet das Developfenster.
</p><a NAME="RevPiPyControl.plclist" ID="RevPiPyControl.plclist"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl.plclist</h3> RevPiPyControl.plclist</h3>
<b>plclist</b>(<i></i>) <b>plclist</b>(<i></i>)

View File

@@ -12,7 +12,7 @@ Verwaltet IP Adressen und deren ACLs.
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3> Global Attributes</h3>
<table> <table>
<tr><td>None</td></tr> <tr><td>__author__</td></tr><tr><td>__copyright__</td></tr><tr><td>__license__</td></tr>
</table> </table>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3> Classes</h3>

View File

@@ -18,9 +18,16 @@ aclmanager.AclManager.get_acl?4()
aclmanager.AclManager.root?7 aclmanager.AclManager.root?7
aclmanager.AclManager?1(master, minlevel, maxlevel, acl_str="", readonly=False) aclmanager.AclManager?1(master, minlevel, maxlevel, acl_str="", readonly=False)
aclmanager._?8 aclmanager._?8
aclmanager.__author__?9
aclmanager.__copyright__?9
aclmanager.__license__?9
mytools.__author__?9
mytools.__copyright__?9
mytools.__license__?9
mytools.addroot?4(filename) mytools.addroot?4(filename)
mytools.gettrans?4(proglang=None) mytools.gettrans?4(proglang=None)
mytools.savefile_connections?7 mytools.savefile_connections?7
mytools.savefile_developer?7
mytools.savefile_programpath?7 mytools.savefile_programpath?7
revpicheckclient.RevPiCheckClient.__chval?6(device, io, event=None) revpicheckclient.RevPiCheckClient.__chval?6(device, io, event=None)
revpicheckclient.RevPiCheckClient.__hidewin?6(win, event=None) revpicheckclient.RevPiCheckClient.__hidewin?6(win, event=None)
@@ -43,11 +50,34 @@ revpicheckclient.RevPiCheckClient.validatereturn?4(returnlist)
revpicheckclient.RevPiCheckClient.writevalues?4() revpicheckclient.RevPiCheckClient.writevalues?4()
revpicheckclient.RevPiCheckClient?1(master, xmlcli, xmlmode=0) revpicheckclient.RevPiCheckClient?1(master, xmlcli, xmlmode=0)
revpicheckclient._?8 revpicheckclient._?8
revpicheckclient.__author__?9
revpicheckclient.__copyright__?9
revpicheckclient.__license__?9
revpidevelop.RevPiDevelop._checkclose?5(event=None)
revpidevelop.RevPiDevelop._createwidgets?5()
revpidevelop.RevPiDevelop.app?7
revpidevelop.RevPiDevelop.btn_domyjob?4()
revpidevelop.RevPiDevelop.btn_selectpath?4()
revpidevelop.RevPiDevelop.cli?7
revpidevelop.RevPiDevelop.load_pathfiles?4(silent=False)
revpidevelop.RevPiDevelop.refresh_stats?4()
revpidevelop.RevPiDevelop.root?7
revpidevelop.RevPiDevelop.select_pathfiles?4(tkevt)
revpidevelop.RevPiDevelop?1(master, xmlcli, xmlmode, revpi)
revpidevelop._?8
revpidevelop.__author__?9
revpidevelop.__copyright__?9
revpidevelop.__license__?9
revpidevelop._loaddefaults?5(revpiname=None)
revpidevelop._savedefaults?5(revpiname, settings)
revpiinfo.RevPiInfo._checkclose?5(event=None) revpiinfo.RevPiInfo._checkclose?5(event=None)
revpiinfo.RevPiInfo._createwidgets?5(extended=False) revpiinfo.RevPiInfo._createwidgets?5(extended=False)
revpiinfo.RevPiInfo.visitwebsite?4(event=None) revpiinfo.RevPiInfo.visitwebsite?4(event=None)
revpiinfo.RevPiInfo?1(master, xmlcli, version) revpiinfo.RevPiInfo?1(master, xmlcli, version)
revpiinfo._?8 revpiinfo._?8
revpiinfo.__author__?9
revpiinfo.__copyright__?9
revpiinfo.__license__?9
revpilegacy.RevPiOption._changesdone?5() revpilegacy.RevPiOption._changesdone?5()
revpilegacy.RevPiOption._checkclose?5(event=None) revpilegacy.RevPiOption._checkclose?5(event=None)
revpilegacy.RevPiOption._createwidgets?5() revpilegacy.RevPiOption._createwidgets?5()
@@ -58,6 +88,9 @@ revpilegacy.RevPiOption.xmlmod2_tail?4()
revpilegacy.RevPiOption.xmlmod_tail?4() revpilegacy.RevPiOption.xmlmod_tail?4()
revpilegacy.RevPiOption?1(master, xmlcli) revpilegacy.RevPiOption?1(master, xmlcli)
revpilegacy._?8 revpilegacy._?8
revpilegacy.__author__?9
revpilegacy.__copyright__?9
revpilegacy.__license__?9
revpilogfile.RevPiLogfile._checkclose?5(event=None) revpilogfile.RevPiLogfile._checkclose?5(event=None)
revpilogfile.RevPiLogfile._createwidgets?5() revpilogfile.RevPiLogfile._createwidgets?5()
revpilogfile.RevPiLogfile._load_log?5(textwidget, xmlcall, startposition, full) revpilogfile.RevPiLogfile._load_log?5(textwidget, xmlcall, startposition, full)
@@ -67,6 +100,9 @@ revpilogfile.RevPiLogfile.get_applog?4(full=False)
revpilogfile.RevPiLogfile.get_plclog?4(full=False) revpilogfile.RevPiLogfile.get_plclog?4(full=False)
revpilogfile.RevPiLogfile?1(master, xmlcli) revpilogfile.RevPiLogfile?1(master, xmlcli)
revpilogfile._?8 revpilogfile._?8
revpilogfile.__author__?9
revpilogfile.__copyright__?9
revpilogfile.__license__?9
revpioption.RevPiOption._changesdone?5() revpioption.RevPiOption._changesdone?5()
revpioption.RevPiOption._checkclose?5(event=None) revpioption.RevPiOption._checkclose?5(event=None)
revpioption.RevPiOption._checkvalues?5() revpioption.RevPiOption._checkvalues?5()
@@ -78,6 +114,9 @@ revpioption.RevPiOption.btn_slaveacl?4()
revpioption.RevPiOption.btn_xmlacl?4() revpioption.RevPiOption.btn_xmlacl?4()
revpioption.RevPiOption?1(master, xmlcli) revpioption.RevPiOption?1(master, xmlcli)
revpioption._?8 revpioption._?8
revpioption.__author__?9
revpioption.__copyright__?9
revpioption.__license__?9
revpiplclist.RevPiPlcList._checkclose?5(event=None) revpiplclist.RevPiPlcList._checkclose?5(event=None)
revpiplclist.RevPiPlcList._createwidgets?5() revpiplclist.RevPiPlcList._createwidgets?5()
revpiplclist.RevPiPlcList._saveappdata?5() revpiplclist.RevPiPlcList._saveappdata?5()
@@ -92,6 +131,9 @@ revpiplclist.RevPiPlcList.myapp?7
revpiplclist.RevPiPlcList.root?7 revpiplclist.RevPiPlcList.root?7
revpiplclist.RevPiPlcList?1(master) revpiplclist.RevPiPlcList?1(master)
revpiplclist._?8 revpiplclist._?8
revpiplclist.__author__?9
revpiplclist.__copyright__?9
revpiplclist.__license__?9
revpiplclist.get_connections?4() revpiplclist.get_connections?4()
revpiprogram.RevPiProgram._checkclose?5(event=None) revpiprogram.RevPiProgram._checkclose?5(event=None)
revpiprogram.RevPiProgram._createwidgets?5() revpiprogram.RevPiProgram._createwidgets?5()
@@ -107,6 +149,9 @@ revpiprogram.RevPiProgram.plcupload?4()
revpiprogram.RevPiProgram.setpictoryrsc?4(filename=None) revpiprogram.RevPiProgram.setpictoryrsc?4(filename=None)
revpiprogram.RevPiProgram?1(master, xmlcli, xmlmode, revpi) revpiprogram.RevPiProgram?1(master, xmlcli, xmlmode, revpi)
revpiprogram._?8 revpiprogram._?8
revpiprogram.__author__?9
revpiprogram.__copyright__?9
revpiprogram.__license__?9
revpiprogram._loaddefaults?5(revpiname=None) revpiprogram._loaddefaults?5(revpiname=None)
revpiprogram._savedefaults?5(revpiname, settings) revpiprogram._savedefaults?5(revpiname, settings)
revpipycontrol.RevPiPyControl._btnstate?5() revpipycontrol.RevPiPyControl._btnstate?5()
@@ -119,6 +164,7 @@ revpipycontrol.RevPiPyControl._opt_conn?5(text, reconnect=False)
revpipycontrol.RevPiPyControl.infowindow?4() revpipycontrol.RevPiPyControl.infowindow?4()
revpipycontrol.RevPiPyControl.myapp?7 revpipycontrol.RevPiPyControl.myapp?7
revpipycontrol.RevPiPyControl.plcdebug?4() revpipycontrol.RevPiPyControl.plcdebug?4()
revpipycontrol.RevPiPyControl.plcdevelop?4()
revpipycontrol.RevPiPyControl.plclist?4() revpipycontrol.RevPiPyControl.plclist?4()
revpipycontrol.RevPiPyControl.plclogs?4() revpipycontrol.RevPiPyControl.plclogs?4()
revpipycontrol.RevPiPyControl.plcoptions?4() revpipycontrol.RevPiPyControl.plcoptions?4()
@@ -133,7 +179,13 @@ revpipycontrol.RevPiPyControl.tmr_plcrunning?4()
revpipycontrol.RevPiPyControl.visitwebsite?4() revpipycontrol.RevPiPyControl.visitwebsite?4()
revpipycontrol.RevPiPyControl?1(master=None) revpipycontrol.RevPiPyControl?1(master=None)
revpipycontrol._?8 revpipycontrol._?8
revpipycontrol.pycontrolversion?7 revpipycontrol.__author__?9
revpipycontrol.__copyright__?9
revpipycontrol.__license__?9
revpipycontrol.__version__?9
revpipycontrol.shared.__author__?9
revpipycontrol.shared.__copyright__?9
revpipycontrol.shared.__license__?9
revpipycontrol.shared.ipaclmanager.IpAclManager.__get_acl?6() revpipycontrol.shared.ipaclmanager.IpAclManager.__get_acl?6()
revpipycontrol.shared.ipaclmanager.IpAclManager.__get_filename?6() revpipycontrol.shared.ipaclmanager.IpAclManager.__get_filename?6()
revpipycontrol.shared.ipaclmanager.IpAclManager.__get_regex_acl?6() revpipycontrol.shared.ipaclmanager.IpAclManager.__get_regex_acl?6()
@@ -147,4 +199,7 @@ revpipycontrol.shared.ipaclmanager.IpAclManager.loadaclfile?4(filename)
revpipycontrol.shared.ipaclmanager.IpAclManager.regex_acl?7 revpipycontrol.shared.ipaclmanager.IpAclManager.regex_acl?7
revpipycontrol.shared.ipaclmanager.IpAclManager.writeaclfile?4(filename=None, aclname=None) revpipycontrol.shared.ipaclmanager.IpAclManager.writeaclfile?4(filename=None, aclname=None)
revpipycontrol.shared.ipaclmanager.IpAclManager?1(minlevel, maxlevel, acl=None) revpipycontrol.shared.ipaclmanager.IpAclManager?1(minlevel, maxlevel, acl=None)
revpipycontrol.shared.ipaclmanager.__author__?9
revpipycontrol.shared.ipaclmanager.__copyright__?9
revpipycontrol.shared.ipaclmanager.__license__?9
revpipycontrol.shared.ipaclmanager.refullmatch?4(regex, string) revpipycontrol.shared.ipaclmanager.refullmatch?4(regex, string)

View File

@@ -1,5 +1,6 @@
AclManager ttk.Frame AclManager ttk.Frame
RevPiCheckClient tkinter.Frame RevPiCheckClient tkinter.Frame
RevPiDevelop ttk.Frame
RevPiInfo tkinter.Frame RevPiInfo tkinter.Frame
RevPiLogfile tkinter.Frame RevPiLogfile tkinter.Frame
RevPiOption tkinter.Frame RevPiOption tkinter.Frame

View File

@@ -1,32 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Project SYSTEM "Project-5.1.dtd"> <!DOCTYPE Project SYSTEM "Project-5.1.dtd">
<!-- eric project file for project revpipycontrol --> <!-- eric project file for project revpipycontrol -->
<!-- Saved: 2018-05-25, 08:26:59 --> <!-- Saved: 2018-08-12, 16:56:01 -->
<!-- Copyright (C) 2018 Sven Sager, akira@narux.de --> <!-- Copyright (C) 2018 Sven Sager, akira@narux.de -->
<Project version="5.1"> <Project version="5.1">
<Language>en_US</Language> <Language>en_US</Language>
<Hash>66103e2eaf8a762f14d1fd51d8b1c9dcaf35a275</Hash> <Hash>66103e2eaf8a762f14d1fd51d8b1c9dcaf35a275</Hash>
<ProgLanguage mixed="0">Python3</ProgLanguage> <ProgLanguage mixed="0">Python3</ProgLanguage>
<ProjectType>Console</ProjectType> <ProjectType>Console</ProjectType>
<Description></Description> <Version>0.7.0</Version>
<Version>0.6.2</Version>
<Author>Sven Sager</Author> <Author>Sven Sager</Author>
<Email>akira@narux.de</Email> <Email>akira@narux.de</Email>
<Eol index="1"/> <Eol index="1"/>
<Sources> <Sources>
<Source>revpipycontrol/revpipycontrol.py</Source> <Source>revpipycontrol/aclmanager.py</Source>
<Source>revpipycontrol/mytools.py</Source>
<Source>revpipycontrol/revpicheckclient.py</Source> <Source>revpipycontrol/revpicheckclient.py</Source>
<Source>setup.py</Source> <Source>revpipycontrol/revpidevelop.py</Source>
<Source>revpipycontrol/revpiplclist.py</Source> <Source>revpipycontrol/revpiinfo.py</Source>
<Source>revpipycontrol/revpilegacy.py</Source>
<Source>revpipycontrol/revpilogfile.py</Source> <Source>revpipycontrol/revpilogfile.py</Source>
<Source>revpipycontrol/revpioption.py</Source> <Source>revpipycontrol/revpioption.py</Source>
<Source>revpipycontrol/revpiplclist.py</Source>
<Source>revpipycontrol/revpiprogram.py</Source> <Source>revpipycontrol/revpiprogram.py</Source>
<Source>revpipycontrol/mytools.py</Source> <Source>revpipycontrol/revpipycontrol.py</Source>
<Source>revpipycontrol/revpiinfo.py</Source>
<Source>revpipycontrol/aclmanager.py</Source>
<Source>revpipycontrol/revpilegacy.py</Source>
<Source>revpipycontrol/shared/ipaclmanager.py</Source>
<Source>revpipycontrol/shared/__init__.py</Source> <Source>revpipycontrol/shared/__init__.py</Source>
<Source>revpipycontrol/shared/ipaclmanager.py</Source>
<Source>setup.py</Source>
</Sources> </Sources>
<Forms/> <Forms/>
<Translations/> <Translations/>
@@ -35,8 +35,8 @@
<Others> <Others>
<Other>data</Other> <Other>data</Other>
<Other>doc</Other> <Other>doc</Other>
<Other>stdeb.cfg</Other>
<Other>eric-revpipycontrol.api</Other> <Other>eric-revpipycontrol.api</Other>
<Other>stdeb.cfg</Other>
</Others> </Others>
<MainScript>revpipycontrol/revpipycontrol.py</MainScript> <MainScript>revpipycontrol/revpipycontrol.py</MainScript>
<Vcs> <Vcs>
@@ -141,9 +141,6 @@
</value> </value>
</dict> </dict>
</VcsOptions> </VcsOptions>
<VcsOtherData>
<dict/>
</VcsOtherData>
</Vcs> </Vcs>
<FiletypeAssociations> <FiletypeAssociations>
<FiletypeAssociation pattern="*.idl" type="INTERFACES"/> <FiletypeAssociation pattern="*.idl" type="INTERFACES"/>
@@ -243,14 +240,6 @@
<value> <value>
<bool>False</bool> <bool>False</bool>
</value> </value>
<key>
<string>sourceExtensions</string>
</key>
<value>
<list>
<string></string>
</list>
</value>
<key> <key>
<string>useRecursion</string> <string>useRecursion</string>
</key> </key>
@@ -265,6 +254,133 @@
<Checkers> <Checkers>
<CheckersParams> <CheckersParams>
<dict> <dict>
<key>
<string>PYLINT</string>
</key>
<value>
<dict>
<key>
<string>configFile</string>
</key>
<value>
<string>/home/akira/Entwicklung/eric/revpipyplc/revpipycontrol/default.cnf</string>
</value>
<key>
<string>dialogReport</string>
</key>
<value>
<bool>False</bool>
</value>
<key>
<string>disabledMessages</string>
</key>
<value>
<string></string>
</value>
<key>
<string>enableBasic</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>enableClasses</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>enableDesign</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>enableExceptions</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>enableFormat</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>enableImports</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>enableLogging</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>enableMetrics</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>enableMiscellaneous</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>enableNewstyle</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>enableSimilarities</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>enableStringFormat</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>enableTypecheck</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>enableVariables</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>enabledMessages</string>
</key>
<value>
<string></string>
</value>
<key>
<string>htmlReport</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>txtReport</string>
</key>
<value>
<bool>False</bool>
</value>
</dict>
</value>
<key> <key>
<string>Pep8Checker</string> <string>Pep8Checker</string>
</key> </key>

View File

@@ -1,11 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
#
# RevPiPyControl
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
u"""Manager für ACL Einträge.""" u"""Manager für ACL Einträge."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
import tkinter import tkinter
import tkinter.messagebox as tkmsg import tkinter.messagebox as tkmsg
from mytools import gettrans from mytools import gettrans
@@ -56,8 +55,8 @@ class AclManager(ttk.Frame):
self.aclinfo = ttk.Frame(self) self.aclinfo = ttk.Frame(self)
for acltext in self.__dict_acltext: for acltext in self.__dict_acltext:
lbl = ttk.Label(self.aclinfo) lbl = ttk.Label(self.aclinfo)
lbl["text"] = _("Level") + " {}: {}".format( lbl["text"] = _("Level") + " {id}: {text}".format(
acltext, self.__dict_acltext[acltext] id=acltext, text=self.__dict_acltext[acltext]
) )
lbl.pack(anchor="w") lbl.pack(anchor="w")
@@ -276,12 +275,12 @@ class AclManager(ttk.Frame):
ask = tkmsg.askyesno( ask = tkmsg.askyesno(
_("Question"), _("Question"),
_("Do you really want to delete the following item? \n" _("Do you really want to delete the following item? \n"
"\nIP: {} / Level: {}").format(*lst_ipacl), "\nIP: {0} / Level: {1}").format(*lst_ipacl),
parent=self.master, default="no" parent=self.master, default="no"
) )
if ask: if ask:
new_acl = self.__acl.acl.replace( new_acl = self.__acl.acl.replace(
"{},{}".format(*lst_ipacl), "" "{0},{1}".format(*lst_ipacl), ""
).replace(" ", " ") ).replace(" ", " ")
if self.__acl.loadacl(new_acl.strip()): if self.__acl.loadacl(new_acl.strip()):
@@ -354,7 +353,7 @@ class AclManager(ttk.Frame):
def _savefields(self): def _savefields(self):
u"""Übernimmt neuen ACL Eintrag.""" u"""Übernimmt neuen ACL Eintrag."""
new_acl = "{}.{}.{}.{},{}".format( new_acl = "{0}.{1}.{2}.{3},{4}".format(
self.var_ip1.get(), self.var_ip1.get(),
self.var_ip2.get(), self.var_ip2.get(),
self.var_ip3.get(), self.var_ip3.get(),
@@ -386,8 +385,8 @@ class AclManager(ttk.Frame):
acltext = property(__get_acltext, __set_acltext) acltext = property(__get_acltext, __set_acltext)
# Debugging
if __name__ == "__main__": if __name__ == "__main__":
root = AclManager(tkinter.Tk(), 0, 9, " 192.168.50.100,2 127.0.0.*,1") root = AclManager(tkinter.Tk(), 0, 9, " 192.168.50.100,2 127.0.0.*,1")
root.acltext = {0: "Keine Rechte", 1: "Hohe Rechte"} root.acltext = {0: "Keine Rechte", 1: "Hohe Rechte"}
root.mainloop() root.mainloop()
print(root.acl)

File diff suppressed because it is too large Load Diff

View File

@@ -1,11 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
#
# RevPiPyControl
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
"""Tools-Sammlung.""" """Tools-Sammlung."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
import gettext import gettext
import locale import locale
import sys import sys
@@ -19,8 +18,11 @@ if platform == "linux":
homedir = environ["HOME"] homedir = environ["HOME"]
else: else:
homedir = environ["APPDATA"] homedir = environ["APPDATA"]
savefile_connections = pathjoin( savefile_connections = pathjoin(
homedir, ".revpipyplc", "connections.dat") homedir, ".revpipyplc", "connections.dat")
savefile_developer = pathjoin(
homedir, ".revpipyplc", "developer.dat")
savefile_programpath = pathjoin( savefile_programpath = pathjoin(
homedir, ".revpipyplc", "programpath.dat") homedir, ".revpipyplc", "programpath.dat")

View File

@@ -1,13 +1,15 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# u"""Fenstererweiterung für den 'watch modus'.
# RevPiPyControl
# Thranks to: http://stackoverflow.com/questions/3085696/adding-a-
# Webpage: https://revpimodio.org/revpipyplc/ scrollbar-to-a-group-of-widgets-in-tkinter
# (c) Sven Sager, License: LGPLv3
# """
# Thranks to: http://stackoverflow.com/questions/3085696/adding-a-
# scrollbar-to-a-group-of-widgets-in-tkinter __author__ = "Sven Sager"
u"""Fenstererweiterung für den 'watch modus'.""" __copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
import pickle import pickle
import tkinter import tkinter
import tkinter.messagebox as tkmsg import tkinter.messagebox as tkmsg
@@ -108,8 +110,11 @@ class RevPiCheckClient(tkinter.Frame):
io[5].set(self.__oldvalue) io[5].set(self.__oldvalue)
tkmsg.showerror( tkmsg.showerror(
_("Error"), _("Error"),
_("Given value for Output '{}' is not valid! \nReset to ""'{}'" _("Given value for Output '{0}' is not valid! \n"
"").format(self.dict_devices[device], self.__oldvalue), "Reset to '{1}'").format(
self.dict_devices[device],
self.__oldvalue
),
parent=self.dict_wins[device] parent=self.dict_wins[device]
) )
@@ -135,7 +140,7 @@ class RevPiCheckClient(tkinter.Frame):
canvas = tkinter.Canvas( canvas = tkinter.Canvas(
frame, frame,
borderwidth=0, borderwidth=0,
width=180, width=190,
heigh=calc_heigh if calc_heigh <= 600 else 600 heigh=calc_heigh if calc_heigh <= 600 else 600
) )
s_frame = tkinter.Frame(canvas) s_frame = tkinter.Frame(canvas)
@@ -166,7 +171,7 @@ class RevPiCheckClient(tkinter.Frame):
# io = [name,bytelen,byteaddr,bmk,bitaddress,(tkinter_var)] # io = [name,bytelen,byteaddr,bmk,bitaddress,(tkinter_var)]
tkinter.Label(s_frame, text=io[0]).grid( tkinter.Label(s_frame, text=io[0]).grid(
column=0, row=rowcount, sticky="w" column=1, row=rowcount, sticky="w"
) )
if io[4] >= 0: if io[4] >= 0:
@@ -177,7 +182,7 @@ class RevPiCheckClient(tkinter.Frame):
check["state"] = "disabled" if iotype == "inp" else "normal" check["state"] = "disabled" if iotype == "inp" else "normal"
check["text"] = "" check["text"] = ""
check["variable"] = var check["variable"] = var
check.grid(column=1, row=rowcount) check.grid(column=0, row=rowcount)
else: else:
var = tkinter.IntVar() var = tkinter.IntVar()
txt = tkinter.Spinbox(s_frame, to=self.maxint(io[1])) txt = tkinter.Spinbox(s_frame, to=self.maxint(io[1]))
@@ -196,7 +201,7 @@ class RevPiCheckClient(tkinter.Frame):
self.maxint(io[1]) == 0 else "normal" self.maxint(io[1]) == 0 else "normal"
txt["width"] = 5 txt["width"] = 5
txt["textvariable"] = var txt["textvariable"] = var
txt.grid(column=1, row=rowcount) txt.grid(column=0, row=rowcount)
# Steuerelementvariable in IO übernehmen (mutabel) # Steuerelementvariable in IO übernehmen (mutabel)
io.append(var) io.append(var)
@@ -213,7 +218,7 @@ class RevPiCheckClient(tkinter.Frame):
for dev in self.lst_devices: for dev in self.lst_devices:
win = tkinter.Toplevel(self) win = tkinter.Toplevel(self)
win.wm_title("{} | {}".format(dev, self.dict_devices[dev])) win.wm_title("{0} | {1}".format(dev, self.dict_devices[dev]))
win.protocol( win.protocol(
"WM_DELETE_WINDOW", "WM_DELETE_WINDOW",
lambda win=win: self.__hidewin(win) lambda win=win: self.__hidewin(win)
@@ -235,7 +240,7 @@ class RevPiCheckClient(tkinter.Frame):
# Button erstellen # Button erstellen
btn = tkinter.Button(devgrp) btn = tkinter.Button(devgrp)
btn["command"] = lambda win=win: self.__showwin(win) btn["command"] = lambda win=win: self.__showwin(win)
btn["text"] = "{} | {}".format(dev, self.dict_devices[dev]) btn["text"] = "{0} | {1}".format(dev, self.dict_devices[dev])
btn.pack(**cfxpxy53) btn.pack(**cfxpxy53)
# Steuerungsfunktionen # Steuerungsfunktionen
@@ -311,7 +316,7 @@ class RevPiCheckClient(tkinter.Frame):
try: try:
ba_values = bytearray(self.cli.ps_values().data) ba_values = bytearray(self.cli.ps_values().data)
self.err_workvalues = 0 self.err_workvalues = 0
except: except Exception:
if self.autorw.get(): if self.autorw.get():
self.err_workvalues += 1 self.err_workvalues += 1
else: else:
@@ -329,7 +334,7 @@ class RevPiCheckClient(tkinter.Frame):
tkmsg.showerror( tkmsg.showerror(
_("Error"), _("Error"),
_("To many errors while reading IO data. " _("To many errors while reading IO data. "
"Can not show the Watch-Mode."), "Can not show the Watch-Mode."),
parent=self.master parent=self.master
) )
@@ -402,7 +407,7 @@ class RevPiCheckClient(tkinter.Frame):
if not self.autorw.get(): if not self.autorw.get():
try: try:
self.chk_auto["state"] = "normal" self.chk_auto["state"] = "normal"
except: except Exception:
pass pass
return None return None
@@ -448,7 +453,7 @@ class RevPiCheckClient(tkinter.Frame):
# Fehlermeldungen erstellen # Fehlermeldungen erstellen
devicename = self.dict_devices[lst_result[0]] devicename = self.dict_devices[lst_result[0]]
str_errmsg += _( str_errmsg += _(
"Error set value of device '{}' Output '{}': {} \n" "Error set value of device '{0}' Output '{1}': {2} \n"
).format(devicename, lst_result[1], lst_result[3]) ).format(devicename, lst_result[1], lst_result[3])
if str_errmsg != "": if str_errmsg != "":

View File

@@ -0,0 +1,310 @@
# -*- coding: utf-8 -*-
u"""PLC Programm und Konfig hoch und runterladen."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
import gzip
import os
import pickle
import tkinter
import tkinter.filedialog as tkfd
import tkinter.messagebox as tkmsg
from mytools import homedir
from mytools import gettrans
from mytools import savefile_developer as savefile
from tkinter import ttk
from xmlrpc.client import Binary
# Übersetzung laden
_ = gettrans()
def _loaddefaults(revpiname=None):
u"""Übernimmt für den Pi die letzen Pfade.
@param revpiname Einstellungen nur für RevPi laden
@return <class 'dict'> mit Einstellungen"""
if os.path.exists(savefile):
with open(savefile, "rb") as fh:
dict_all = pickle.load(fh)
if revpiname is None:
return dict_all
else:
return dict_all.get(revpiname, {})
return {}
def _savedefaults(revpiname, settings):
u"""Schreibt fuer den Pi die letzen Pfade.
@param revpiname Einstellungen sind für diesen RevPi
@param settings <class 'dict'> mit Einstellungen
@return True, bei erfolgreicher Verarbeitung
"""
try:
os.makedirs(os.path.dirname(savefile), exist_ok=True)
if revpiname is None:
dict_all = settings
else:
dict_all = _loaddefaults()
dict_all[revpiname] = settings
with open(savefile, "wb") as fh:
pickle.dump(dict_all, fh)
except Exception:
return False
return True
class RevPiDevelop(ttk.Frame):
u"""Zeigt Debugfenster an."""
def __init__(self, master, xmlcli, xmlmode, revpi):
u"""Init RevPiDevelop-Class.
@return None"""
if xmlmode < 3:
return None
super().__init__(master)
self.pack(expand=True, fill="both")
self.revpi = revpi
self.xmlcli = xmlcli
# Letzte Einstellungen übernehmen
self.opt = _loaddefaults(revpi)
# Einstellungen
self.pathselected = self.opt.get("pathselected", False)
self.watchpath = self.opt.get("watchpath", homedir)
self.watchfiles = self.opt.get("watchfiles", [])
# Fenster bauen
self._createwidgets()
# Alte Einstellungen anwenden
if self.pathselected:
self.load_pathfiles(silent=True)
self.refresh_stats()
def _checkclose(self, event=None):
u"""Prüft ob Fenster beendet werden soll.
@param event tkinter-Event"""
# Einstellungen speichern
self.opt["pathselected"] = self.pathselected
self.opt["watchpath"] = self.watchpath
self.opt["watchfiles"] = self.watchfiles
_savedefaults(self.revpi, self.opt)
def _createwidgets(self):
u"""Erstellt alle Widgets."""
self.rowconfigure(0, weight=1)
self.columnconfigure(0, weight=1)
# cpad = {"padx": 4, "pady": 2}
# cpade = {"padx": 4, "pady": 2, "sticky": "e"}
cpadw = {"padx": 4, "pady": 2, "sticky": "w"}
cpadwe = {"padx": 4, "pady": 2, "sticky": "we"}
# Gruppe Develop
devel = ttk.LabelFrame(self)
devel.columnconfigure(0, weight=1)
devel["text"] = _("File watcher for PLC development")
devel.grid(**cpadwe)
r = 0
lbl = ttk.Label(devel)
lbl["text"] = _("Path to list files:")
lbl.grid(row=r, **cpadw)
btn = ttk.Button(devel)
btn["command"] = self.btn_selectpath
btn["text"] = _("Select path")
btn.grid(row=r, column=1, **cpadw)
r += 1
self.lbl_path = ttk.Label(devel)
self.lbl_path["width"] = 50
self.lbl_path.grid(row=r, column=0, columnspan=2, **cpadw)
# Listbox
r += 1
trv = ttk.Frame(devel)
trv.columnconfigure(0, weight=1)
trv.grid(row=r, columnspan=2, sticky="we")
scb_files = ttk.Scrollbar(trv)
self.trv_files = ttk.Treeview(trv)
self.trv_files.bind("<<TreeviewSelect>>", self.select_pathfiles)
self.trv_files["height"] = 15
self.trv_files["yscrollcommand"] = scb_files.set
self.trv_files.grid(row=0, column=0, sticky="we")
scb_files["command"] = self.trv_files.yview
scb_files.grid(row=0, column=1, sticky="ns")
# Uploadbutton
r += 1
btnlist = ttk.Frame(devel)
btnlist.columnconfigure(1, weight=1)
btnlist.grid(row=r, columnspan=2, sticky="we")
self.btn_jobs = ttk.Button(btnlist)
self.btn_jobs["command"] = self.btn_domyjob
self.btn_jobs["text"] = _("Stop / Upload / Start")
self.btn_jobs.grid(row=0, column=1, **cpadwe)
def btn_domyjob(self):
u"""Hochladen und neu starten."""
# PLC Programm anhalten
self.xmlcli.plcstop()
# Aktuell konfiguriertes Programm lesen (für uploaded Flag)
opt_program = self.xmlcli.get_config()
opt_program = opt_program.get("plcprogram", "none.py")
uploaded = True
ec = 0
for fname in self.watchfiles:
# FIXME: Fehlerabfang bei Dateilesen
with open(fname, "rb") as fh:
# Ordnernamen vom System entfernen
sendname = fname.replace(self.watchpath, "")[1:]
# Prüfen ob Dateiname bereits als Startprogramm angegeben ist
if sendname == opt_program:
uploaded = False
# Datei übertragen
try:
ustatus = self.xmlcli.plcupload(
Binary(gzip.compress(fh.read())), sendname
)
except Exception:
ec = -2
break
if not ustatus:
ec = -1
break
if ec == 0:
# Wenn eines der Dateien nicht das Hauptprogram ist, info
if uploaded:
tkmsg.showinfo(
_("Information"),
_("A PLC program has been uploaded. Please check the "
"PLC options to see if the correct program is "
"specified as the start program."),
parent=self.master
)
elif ec == -1:
tkmsg.showerror(
_("Error"),
_("The Revolution Pi could not process some parts of the "
"transmission."),
parent=self.master
)
elif ec == -2:
tkmsg.showerror(
_("Error"),
_("Errors occurred during transmission"),
parent=self.master
)
# PLC Programm starten
self.xmlcli.plcstart()
def btn_selectpath(self):
u"""Lässt dem Benuzter ein Verzeichnis auswählen."""
dirselect = tkfd.askdirectory(
parent=self.master,
title=_("Directory to watch"),
mustexist=False,
initialdir=self.watchpath
)
if not dirselect:
return
# Neuen Pfad übernehmen
if os.path.exists(dirselect):
self.pathselected = True
self.watchpath = dirselect
self.load_pathfiles()
else:
tkmsg.showerror(
_("Error"),
_("Can not open the selected folder."),
parent=self.master
)
self.refresh_stats()
def load_pathfiles(self, silent=False):
u"""Aktualisiert die Dateiliste.
@param silent Keinen Dialog anzeigen"""
# Liste leeren
self.trv_files.delete(*self.trv_files.get_children())
# Dateiliste erstellen
filecount = 0
for tup_walk in os.walk(self.watchpath):
for filename in sorted(tup_walk[2]):
fullname = os.path.join(tup_walk[0], filename)
self.trv_files.insert(
"", "end", fullname,
text=fullname.replace(self.watchpath, "")[1:],
values=fullname
)
# Dateiobergrenze
filecount += 1
if filecount >= 1000:
break
if filecount >= 1000:
if not silent:
tkmsg.showwarning(
_("Warning"),
_("Found more than 1000 files! Only 1000 files can be "
"shown in this dialog, all other will be ignored."
""),
parent=self.master
)
break
# Alle Elemente für Selection prüfen und anwenden
for watchfile in self.watchfiles.copy():
try:
self.trv_files.item(watchfile)
except Exception:
self.watchfiles.remove(watchfile)
self.trv_files.selection_set(self.watchfiles)
def select_pathfiles(self, tkevt):
u"""Setzt state der Buttons."""
self.watchfiles = list(self.trv_files.selection())
self.refresh_stats()
def refresh_stats(self):
u"""Passt die Widgets an."""
self.btn_jobs["state"] = "normal" if len(self.watchfiles) > 0 \
else "disabled"
self.lbl_path["text"] = self.watchpath
# Debugging
if __name__ == "__main__":
from xmlrpc.client import ServerProxy
cli = ServerProxy("http://localhost:55123")
root = tkinter.Tk()
app = RevPiDevelop(root, cli, 3, "debugging")
app.mainloop()

View File

@@ -1,11 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
#
# RevPiPyControl
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
u"""Programminformationen anzeigen.""" u"""Programminformationen anzeigen."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
import tkinter import tkinter
import tkinter.font as tkf import tkinter.font as tkf
import webbrowser import webbrowser
@@ -55,7 +54,7 @@ class RevPiInfo(tkinter.Frame):
lbl.pack(pady=5) lbl.pack(pady=5)
lbl = tkinter.Label(self) lbl = tkinter.Label(self)
lbl["font"] = fntmid lbl["font"] = fntmid
lbl["text"] = _("Version: {}").format(self.version) lbl["text"] = _("Version: {0}").format(self.version)
lbl.bind( lbl.bind(
"<ButtonPress-2>", "<ButtonPress-2>",
lambda event: self._createwidgets(extended=not extended) lambda event: self._createwidgets(extended=not extended)

View File

@@ -1,11 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
#
# RevPiPyControl
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
u"""Alte Klassen laden hier, bevor sie entsorgt werden.""" u"""Alte Klassen laden hier, bevor sie entsorgt werden."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
import tkinter import tkinter
import tkinter.messagebox as tkmsg import tkinter.messagebox as tkmsg
from mytools import gettrans from mytools import gettrans
@@ -23,7 +22,7 @@ class RevPiOption(tkinter.Frame):
@return None""" @return None"""
try: try:
self.dc = xmlcli.get_config() self.dc = xmlcli.get_config()
except: except Exception:
self.dc = None self.dc = None
return None return None
@@ -46,17 +45,17 @@ class RevPiOption(tkinter.Frame):
u"""Prüft ob sich die Einstellungen geändert haben. u"""Prüft ob sich die Einstellungen geändert haben.
@return True, wenn min. eine Einstellung geändert wurde""" @return True, wenn min. eine Einstellung geändert wurde"""
return ( return (
self.var_start.get() != self.dc.get("autostart", "1") self.var_start.get() != self.dc.get("autostart", "1") or
or self.var_reload.get() != self.dc.get("autoreload", "1") self.var_reload.get() != self.dc.get("autoreload", "1") or
or self.var_zexit.get() != self.dc.get("zeroonexit", "0") self.var_zexit.get() != self.dc.get("zeroonexit", "0") or
or self.var_zerr.get() != self.dc.get("zeroonerror", "0") self.var_zerr.get() != self.dc.get("zeroonerror", "0") or
or self.var_startpy.get() != self.dc.get("plcprogram", "none.py") self.var_startpy.get() != self.dc.get("plcprogram", "none.py") or
or self.var_startargs.get() != self.dc.get("plcarguments", "") self.var_startargs.get() != self.dc.get("plcarguments", "") or
or self.var_pythonver.get() != self.dc.get("pythonversion", "3") self.var_pythonver.get() != self.dc.get("pythonversion", "3") or
or self.var_slave.get() != self.dc.get("plcslave", "0") self.var_slave.get() != self.dc.get("plcslave", "0") or
or self.var_xmlon.get() != (self.dc.get("xmlrpc", 0) >= 1) self.var_xmlon.get() != (self.dc.get("xmlrpc", 0) >= 1) or
or self.var_xmlmod2.get() != (self.dc.get("xmlrpc", 0) >= 2) self.var_xmlmod2.get() != (self.dc.get("xmlrpc", 0) >= 2) or
or self.var_xmlmod3.get() != (self.dc.get("xmlrpc", 0) >= 3) self.var_xmlmod3.get() != (self.dc.get("xmlrpc", 0) >= 3)
# or self.var_xmlport.get() != self.dc.get("xmlrpcport", "55123") # or self.var_xmlport.get() != self.dc.get("xmlrpcport", "55123")
) )

View File

@@ -1,11 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
#
# RevPiPyControl
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
u"""Zeigt die Logfiles an.""" u"""Zeigt die Logfiles an."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
import tkinter import tkinter
from mytools import gettrans from mytools import gettrans
@@ -106,7 +105,7 @@ class RevPiLogfile(tkinter.Frame):
self.applog, self.xmlcli.load_applog, self.mrkapp, full self.applog, self.xmlcli.load_applog, self.mrkapp, full
) )
self.errapp = 0 self.errapp = 0
except: except Exception:
self.errapp += 1 self.errapp += 1
# Timer neu starten # Timer neu starten
@@ -122,7 +121,7 @@ class RevPiLogfile(tkinter.Frame):
self.plclog, self.xmlcli.load_plclog, self.mrkplc, full self.plclog, self.xmlcli.load_plclog, self.mrkplc, full
) )
self.errplc = 0 self.errplc = 0
except: except Exception:
self.errplc += 1 self.errplc += 1
# Timer neu starten # Timer neu starten

View File

@@ -1,11 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
#
# RevPiPyControl
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
u"""Optionsfenster.""" u"""Optionsfenster."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
import tkinter import tkinter
import tkinter.messagebox as tkmsg import tkinter.messagebox as tkmsg
from aclmanager import AclManager from aclmanager import AclManager
@@ -24,7 +23,7 @@ class RevPiOption(tkinter.Frame):
@return None""" @return None"""
try: try:
self.dc = xmlcli.get_config() self.dc = xmlcli.get_config()
except: except Exception:
self.dc = None self.dc = None
return None return None
@@ -48,20 +47,20 @@ class RevPiOption(tkinter.Frame):
u"""Prüft ob sich die Einstellungen geändert haben. u"""Prüft ob sich die Einstellungen geändert haben.
@return True, wenn min. eine Einstellung geändert wurde""" @return True, wenn min. eine Einstellung geändert wurde"""
return ( return (
self.var_start.get() != self.dc.get("autostart", 1) self.var_start.get() != self.dc.get("autostart", 1) or
or self.var_reload.get() != self.dc.get("autoreload", 1) self.var_reload.get() != self.dc.get("autoreload", 1) or
or self.var_reload_delay.get() != self.var_reload_delay.get() !=
str(self.dc.get("autoreloaddelay", 5)) str(self.dc.get("autoreloaddelay", 5)) or
or self.var_zexit.get() != self.dc.get("zeroonexit", 0) self.var_zexit.get() != self.dc.get("zeroonexit", 0) or
or self.var_zerr.get() != self.dc.get("zeroonerror", 0) self.var_zerr.get() != self.dc.get("zeroonerror", 0) or
# TODO: rtlevel (0) # TODO: rtlevel (0)
or self.var_startpy.get() != self.dc.get("plcprogram", "none.py") self.var_startpy.get() != self.dc.get("plcprogram", "none.py") or
or self.var_startargs.get() != self.dc.get("plcarguments", "") self.var_startargs.get() != self.dc.get("plcarguments", "") or
or self.var_pythonver.get() != self.dc.get("pythonversion", 3) self.var_pythonver.get() != self.dc.get("pythonversion", 3) or
or self.var_slave.get() != self.dc.get("plcslave", 0) self.var_slave.get() != self.dc.get("plcslave", 0) or
or self.var_slaveacl.get() != self.dc.get("plcslaveacl", "") self.var_slaveacl.get() != self.dc.get("plcslaveacl", "") or
or self.var_xmlon.get() != self.dc.get("xmlrpc", 0) self.var_xmlon.get() != self.dc.get("xmlrpc", 0) or
or self.var_xmlacl.get() != self.dc.get("xmlrpcacl", "") self.var_xmlacl.get() != self.dc.get("xmlrpcacl", "")
) )
def _checkclose(self, event=None): def _checkclose(self, event=None):

View File

@@ -1,17 +1,18 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
#
# RevPiPyControl
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
u"""Fenster um RevPi-Verbindungen einzurichten.""" u"""Fenster um RevPi-Verbindungen einzurichten."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
import os.path import os.path
import pickle import pickle
import tkinter import tkinter
import tkinter.messagebox as tkmsg import tkinter.messagebox as tkmsg
from mytools import gettrans from mytools import gettrans
from mytools import savefile_connections as savefile from mytools import savefile_connections as savefile
from revpidevelop import _loaddefaults as developloaddefaults
from revpidevelop import _savedefaults as developsavedefaults
from revpiprogram import _loaddefaults as programloaddefaults from revpiprogram import _loaddefaults as programloaddefaults
from revpiprogram import _savedefaults as programsavedefaults from revpiprogram import _savedefaults as programsavedefaults
from os import makedirs from os import makedirs
@@ -150,15 +151,20 @@ class RevPiPlcList(tkinter.Frame):
with open(savefile, "wb") as fh: with open(savefile, "wb") as fh:
pickle.dump(self._connections, fh) pickle.dump(self._connections, fh)
self.changes = False self.changes = False
except: except Exception:
return False return False
# Andere Einstellungen aufräumen # Andere Einstellungen aufräumen
dict = programloaddefaults() dict_o = developloaddefaults()
for revpi in tuple(dict.keys()): for revpi in tuple(dict_o.keys()):
if revpi not in self._connections: if revpi not in self._connections:
del dict[revpi] del dict_o[revpi]
programsavedefaults(None, dict) developsavedefaults(None, dict_o)
dict_o = programloaddefaults()
for revpi in tuple(dict_o.keys()):
if revpi not in self._connections:
del dict_o[revpi]
programsavedefaults(None, dict_o)
return True return True
@@ -195,7 +201,7 @@ class RevPiPlcList(tkinter.Frame):
item = self.list_conn.get(item_index[0]) item = self.list_conn.get(item_index[0])
ask = tkmsg.askyesno( ask = tkmsg.askyesno(
_("Question"), _("Question"),
_("Do you really want to delete the selected connection '{}'?" _("Do you really want to delete the selected connection '{0}'?"
"").format(item), "").format(item),
parent=self.master parent=self.master
) )
@@ -243,9 +249,9 @@ class RevPiPlcList(tkinter.Frame):
def evt_keypress(self, evt=None): def evt_keypress(self, evt=None):
u"""Passt bei Tastendruck den Status der Buttons an.""" u"""Passt bei Tastendruck den Status der Buttons an."""
okvalue = "normal" if ( okvalue = "normal" if (
self.var_address.get() != "" self.var_address.get() != "" and
and self.var_name.get() != "" self.var_name.get() != "" and
and self.var_port.get() != "" self.var_port.get() != ""
) else "disabled" ) else "disabled"
self.btn_add["state"] = okvalue self.btn_add["state"] = okvalue

View File

@@ -1,11 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
#
# RevPiPyControl
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
u"""PLC Programm und Konfig hoch und runterladen.""" u"""PLC Programm und Konfig hoch und runterladen."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
import gzip import gzip
import os import os
import pickle import pickle
@@ -15,8 +14,8 @@ import tkinter.filedialog as tkfd
import tkinter.messagebox as tkmsg import tkinter.messagebox as tkmsg
import zipfile import zipfile
from mytools import gettrans from mytools import gettrans
from mytools import homedir
from mytools import savefile_programpath as savefile from mytools import savefile_programpath as savefile
from os import makedirs
from shutil import rmtree from shutil import rmtree
from tempfile import mkstemp, mkdtemp from tempfile import mkstemp, mkdtemp
from xmlrpc.client import Binary from xmlrpc.client import Binary
@@ -48,7 +47,7 @@ def _savedefaults(revpiname, settings):
""" """
try: try:
makedirs(os.path.dirname(savefile), exist_ok=True) os.makedirs(os.path.dirname(savefile), exist_ok=True)
if revpiname is None: if revpiname is None:
dict_all = settings dict_all = settings
else: else:
@@ -56,7 +55,7 @@ def _savedefaults(revpiname, settings):
dict_all[revpiname] = settings dict_all[revpiname] = settings
with open(savefile, "wb") as fh: with open(savefile, "wb") as fh:
pickle.dump(dict_all, fh) pickle.dump(dict_all, fh)
except: except Exception:
return False return False
return True return True
@@ -325,7 +324,7 @@ class RevPiProgram(tkinter.Frame):
if fh is not None: if fh is not None:
try: try:
fh.write(self.xmlcli.get_pictoryrsc().data) fh.write(self.xmlcli.get_pictoryrsc().data)
except: except Exception:
tkmsg.showerror( tkmsg.showerror(
_("Error"), _("Error"),
_("Could not load and save file!"), _("Could not load and save file!"),
@@ -356,7 +355,7 @@ class RevPiProgram(tkinter.Frame):
if fh is not None: if fh is not None:
try: try:
fh.write(self.xmlcli.get_procimg().data) fh.write(self.xmlcli.get_procimg().data)
except: except Exception:
tkmsg.showerror( tkmsg.showerror(
_("Error"), _("Error"),
_("Could not load and save file!"), _("Could not load and save file!"),
@@ -561,7 +560,7 @@ class RevPiProgram(tkinter.Frame):
self.opt["typedown"] = self.var_typedown.get() self.opt["typedown"] = self.var_typedown.get()
self.opt["picdown"] = self.var_picdown.get() self.opt["picdown"] = self.var_picdown.get()
except: except Exception:
raise raise
tkmsg.showerror( tkmsg.showerror(
_("Error"), _("Error"),
@@ -588,6 +587,7 @@ class RevPiProgram(tkinter.Frame):
dirtmp = None dirtmp = None
filelist = [] filelist = []
fileselect = None fileselect = None
foldername = ""
rscfile = None rscfile = None
if tup == 0: if tup == 0:
@@ -595,7 +595,7 @@ class RevPiProgram(tkinter.Frame):
fileselect = tkfd.askopenfilenames( fileselect = tkfd.askopenfilenames(
parent=self.master, parent=self.master,
title="Upload Python program...", title="Upload Python program...",
initialdir=self.opt.get("plcupload_dir", ""), initialdir=self.opt.get("plcupload_dir", homedir),
filetypes=(("Python", "*.py"), (_("All files"), "*.*")) filetypes=(("Python", "*.py"), (_("All files"), "*.*"))
) )
if type(fileselect) == tuple and len(fileselect) > 0: if type(fileselect) == tuple and len(fileselect) > 0:
@@ -608,8 +608,12 @@ class RevPiProgram(tkinter.Frame):
parent=self.master, parent=self.master,
title=_("Folder to upload"), title=_("Folder to upload"),
mustexist=True, mustexist=True,
initialdir=self.opt.get("plcupload_dir", self.revpi) initialdir=self.opt.get("plcupload_dir", homedir)
) )
# Ordnernamen merken um diesen auf RevPi anzulegen
foldername = os.path.basename(dirselect)
if type(dirselect) == str and dirselect != "": if type(dirselect) == str and dirselect != "":
filelist = self.create_filelist(dirselect) filelist = self.create_filelist(dirselect)
@@ -706,7 +710,11 @@ class RevPiProgram(tkinter.Frame):
if dirselect == "": if dirselect == "":
sendname = os.path.basename(fname) sendname = os.path.basename(fname)
else: else:
sendname = fname.replace(dirselect, "")[1:] # Ordnernamen in Dateipfad für RevPi übernehmen
sendname = os.path.join(
foldername,
fname.replace(dirselect, "")[1:]
)
# Prüfen ob Dateiname bereits als Startprogramm angegeben ist # Prüfen ob Dateiname bereits als Startprogramm angegeben ist
if sendname == opt_program: if sendname == opt_program:
@@ -716,7 +724,7 @@ class RevPiProgram(tkinter.Frame):
try: try:
ustatus = self.xmlcli.plcupload( ustatus = self.xmlcli.plcupload(
Binary(gzip.compress(fh.read())), sendname) Binary(gzip.compress(fh.read())), sendname)
except: except Exception:
ec = -2 ec = -2
break break

View File

@@ -1,14 +1,14 @@
#!/usr/bin/python3 #!/usr/bin/python3
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# u"""RevPiPyControl main program."""
# RevPiPyControl
# Version: see global var pycontrolverion __author__ = "Sven Sager"
# __copyright__ = "Copyright (C) 2018 Sven Sager"
# Webpage: https://revpimodio.org/revpipyplc/ __license__ = "GPLv3"
# (c) Sven Sager, License: LGPLv3 __version__ = "0.7.0"
#
u"""Hauptprogramm."""
import revpicheckclient import revpicheckclient
import revpidevelop
import revpiinfo import revpiinfo
import revpilogfile import revpilogfile
import revpioption import revpioption
@@ -25,8 +25,6 @@ from xmlrpc.client import ServerProxy
# Übersetzung laden # Übersetzung laden
_ = gettrans() _ = gettrans()
pycontrolversion = "0.6.2"
class RevPiPyControl(tkinter.Frame): class RevPiPyControl(tkinter.Frame):
@@ -47,8 +45,9 @@ class RevPiPyControl(tkinter.Frame):
self.xmlfuncs = [] self.xmlfuncs = []
self.xmlmode = 0 self.xmlmode = 0
# Debugger vorbereiten # Frames vorbereiten
self.debugframe = None self.debugframe = None
self.developframe = None
# Globale Fenster # Globale Fenster
self.tkcheckclient = None self.tkcheckclient = None
@@ -75,6 +74,10 @@ class RevPiPyControl(tkinter.Frame):
u"""Schließt alle Fenster.""" u"""Schließt alle Fenster."""
if self.tkcheckclient is not None: if self.tkcheckclient is not None:
self.tkcheckclient.destroy() self.tkcheckclient.destroy()
if self.developframe is not None:
self.developframe._checkclose()
self.developframe.destroy()
self.developframe = None
if self.tklogs is not None: if self.tklogs is not None:
self.tklogs.master.destroy() self.tklogs.master.destroy()
if self.tkoptions is not None: if self.tkoptions is not None:
@@ -86,7 +89,7 @@ class RevPiPyControl(tkinter.Frame):
self.debugframe = None self.debugframe = None
try: try:
self.cli.psstop() self.cli.psstop()
except: except Exception:
pass pass
def _closeapp(self, event=None): def _closeapp(self, event=None):
@@ -125,38 +128,43 @@ class RevPiPyControl(tkinter.Frame):
menu1.add_command(label=_("Info..."), command=self.infowindow) menu1.add_command(label=_("Info..."), command=self.infowindow)
self.mbar.add_cascade(label=_("Help"), menu=menu1) self.mbar.add_cascade(label=_("Help"), menu=menu1)
self.var_conn = tkinter.StringVar(self) self.main_frame = tkinter.Frame(self)
self.txt_connect = tkinter.Entry(self, state="readonly", width=40) self.main_frame.pack(side="left", fill="y")
self.var_conn = tkinter.StringVar(self.main_frame)
self.txt_connect = tkinter.Entry(
self.main_frame, state="readonly", width=40
)
self.txt_connect["textvariable"] = self.var_conn self.txt_connect["textvariable"] = self.var_conn
self.txt_connect.pack(fill="x") self.txt_connect.pack(fill="x")
self.btn_plcstart = tkinter.Button(self) self.btn_plcstart = tkinter.Button(self.main_frame)
self.btn_plcstart["text"] = _("PLC start") self.btn_plcstart["text"] = _("PLC start")
self.btn_plcstart["command"] = self.plcstart self.btn_plcstart["command"] = self.plcstart
self.btn_plcstart.pack(fill="x") self.btn_plcstart.pack(fill="x")
self.btn_plcstop = tkinter.Button(self) self.btn_plcstop = tkinter.Button(self.main_frame)
self.btn_plcstop["text"] = _("PLC stop") self.btn_plcstop["text"] = _("PLC stop")
self.btn_plcstop["command"] = self.plcstop self.btn_plcstop["command"] = self.plcstop
self.btn_plcstop.pack(fill="x") self.btn_plcstop.pack(fill="x")
self.btn_plcrestart = tkinter.Button(self) self.btn_plcrestart = tkinter.Button(self.main_frame)
self.btn_plcrestart["text"] = _("PLC restart") self.btn_plcrestart["text"] = _("PLC restart")
self.btn_plcrestart["command"] = self.plcrestart self.btn_plcrestart["command"] = self.plcrestart
self.btn_plcrestart.pack(fill="x") self.btn_plcrestart.pack(fill="x")
self.btn_plclogs = tkinter.Button(self) self.btn_plclogs = tkinter.Button(self.main_frame)
self.btn_plclogs["text"] = _("PLC logs") self.btn_plclogs["text"] = _("PLC logs")
self.btn_plclogs["command"] = self.plclogs self.btn_plclogs["command"] = self.plclogs
self.btn_plclogs.pack(fill="x") self.btn_plclogs.pack(fill="x")
self.var_status = tkinter.StringVar(self) self.var_status = tkinter.StringVar(self.main_frame)
self.txt_status = tkinter.Entry(self) self.txt_status = tkinter.Entry(self.main_frame)
self.txt_status["state"] = "readonly" self.txt_status["state"] = "readonly"
self.txt_status["textvariable"] = self.var_status self.txt_status["textvariable"] = self.var_status
self.txt_status.pack(fill="x") self.txt_status.pack(fill="x")
self.btn_debug = tkinter.Button(self) self.btn_debug = tkinter.Button(self.main_frame)
self.btn_debug["text"] = _("PLC watch mode") self.btn_debug["text"] = _("PLC watch mode")
self.btn_debug["command"] = self.plcdebug self.btn_debug["command"] = self.plcdebug
self.btn_debug.pack(fill="x") self.btn_debug.pack(fill="x")
@@ -179,6 +187,8 @@ class RevPiPyControl(tkinter.Frame):
label=_("PLC options..."), command=self.plcoptions) label=_("PLC options..."), command=self.plcoptions)
self.mplc.add_command( self.mplc.add_command(
label=_("PLC program..."), command=self.plcprogram) label=_("PLC program..."), command=self.plcprogram)
self.mplc.add_command(
label=_("PLC developer..."), command=self.plcdevelop)
self.mplc.add_separator() self.mplc.add_separator()
self.mplc.add_command( self.mplc.add_command(
@@ -194,12 +204,12 @@ class RevPiPyControl(tkinter.Frame):
@param text Verbindungsname @param text Verbindungsname
@param reconnect Socket Timeout nicht heruntersetzen""" @param reconnect Socket Timeout nicht heruntersetzen"""
if reconnect: if reconnect:
socket.setdefaulttimeout(10) socket.setdefaulttimeout(6)
else: else:
socket.setdefaulttimeout(2) socket.setdefaulttimeout(2)
sp = ServerProxy( sp = ServerProxy(
"http://{}:{}".format( "http://{0}:{1}".format(
self.dict_conn[text][0], int(self.dict_conn[text][1]) self.dict_conn[text][0], int(self.dict_conn[text][1])
) )
) )
@@ -208,18 +218,18 @@ class RevPiPyControl(tkinter.Frame):
self.xmlfuncs = sp.system.listMethods() self.xmlfuncs = sp.system.listMethods()
self.xmlmode = sp.xmlmodus() self.xmlmode = sp.xmlmodus()
self.revpipyversion = list(map(int, sp.version().split("."))) self.revpipyversion = list(map(int, sp.version().split(".")))
except: except Exception:
self.servererror() self.servererror()
else: else:
self._closeall() self._closeall()
socket.setdefaulttimeout(10) socket.setdefaulttimeout(6)
self.cli = ServerProxy( self.cli = ServerProxy(
"http://{}:{}".format( "http://{0}:{1}".format(
self.dict_conn[text][0], int(self.dict_conn[text][1]) self.dict_conn[text][0], int(self.dict_conn[text][1])
) )
) )
self.revpiname = text self.revpiname = text
self.var_conn.set("{} - {}:{}".format( self.var_conn.set("{0} - {1}:{2}".format(
text, self.dict_conn[text][0], int(self.dict_conn[text][1]) text, self.dict_conn[text][0], int(self.dict_conn[text][1])
)) ))
self.mbar.entryconfig("PLC", state="normal") self.mbar.entryconfig("PLC", state="normal")
@@ -229,7 +239,7 @@ class RevPiPyControl(tkinter.Frame):
win = tkinter.Toplevel(self) win = tkinter.Toplevel(self)
win.focus_set() win.focus_set()
win.grab_set() win.grab_set()
revpiinfo.RevPiInfo(win, self.cli, pycontrolversion) revpiinfo.RevPiInfo(win, self.cli, __version__)
self.wait_window(win) self.wait_window(win)
self.dict_conn = revpiplclist.get_connections() self.dict_conn = revpiplclist.get_connections()
self._fillconnbar() self._fillconnbar()
@@ -242,48 +252,72 @@ class RevPiPyControl(tkinter.Frame):
if "psstart" not in self.xmlfuncs: if "psstart" not in self.xmlfuncs:
tkmsg.showwarning( tkmsg.showwarning(
_("Warning"), _("Warning"),
_("The watch mode ist not supported in version {} " _("The watch mode ist not supported in version {0} "
"of RevPiPyLoad on your RevPi! You need at least version " "of RevPiPyLoad on your RevPi! You need at least version "
"0.5.3! Maybe the python3-revpimodio2 module is not " "0.5.3! Maybe the python3-revpimodio2 module is not "
"installed on your RevPi at least version 2.0.0." "installed on your RevPi at least version 2.0.0."
"").format(self.cli.version()), "").format(self.cli.version()),
parent=self.master parent=self.master
) )
else: return
# Debugfenster laden
if self.debugframe is None:
try:
self.debugframe = revpicheckclient.RevPiCheckClient(
self, self.cli, self.xmlmode
)
except:
tkmsg.showwarning(
_("Error"),
_("Can not load piCtory configuration. \n"
"Did you create a hardware configuration? "
"Please check this in piCtory!"),
parent=self.master
)
self.btn_debug["state"] = "normal"
return None
# Fehler prüfen # FIXME: Bei neuer piCtory Konfig schneller vernichten
if self.debugframe.err_workvalues >= self.debugframe.max_errors: if self.debugframe is None:
self.debugframe = None try:
self.debugframe = revpicheckclient.RevPiCheckClient(
self.main_frame, self.cli, self.xmlmode
)
except Exception:
tkmsg.showwarning(
_("Error"),
_("Can not load piCtory configuration. \n"
"Did you create a hardware configuration? "
"Please check this in piCtory!"),
parent=self.master
)
self.btn_debug["state"] = "normal"
return None return None
# Show/Hide wechseln # Fehler prüfen
if self.debugframe.winfo_viewable(): if self.debugframe.err_workvalues >= self.debugframe.max_errors:
self.debugframe.hideallwindows() self.debugframe = None
if self.debugframe.autorw.get(): return None
self.debugframe.autorw.set(False)
self.debugframe.toggleauto()
self.debugframe.dowrite.set(False)
self.debugframe.pack_forget()
else:
self.debugframe.pack(fill="x")
self.btn_debug["state"] = "normal" # Show/Hide wechseln
if self.debugframe.winfo_viewable():
self.debugframe.hideallwindows()
if self.debugframe.autorw.get():
self.debugframe.autorw.set(False)
self.debugframe.toggleauto()
self.debugframe.dowrite.set(False)
self.debugframe.pack_forget()
else:
self.debugframe.pack(fill="x")
self.btn_debug["state"] = "normal"
def plcdevelop(self):
u"""Startet das Developfenster."""
if self.xmlmode < 3:
tkmsg.showwarning(
_("Warning"),
_("XML-RPC access mode in the RevPiPyLoad "
"configuration is too small to access this dialog!"),
parent=self.master
)
return
# Developframe laden
if self.developframe is None:
self.developframe = revpidevelop.RevPiDevelop(
self, self.cli, self.xmlmode, self.revpiname
)
if self.developframe.winfo_viewable():
self.developframe._checkclose()
self.developframe.pack_forget()
else:
self.developframe.pack(side="right") # fill="x")
def plclist(self): def plclist(self):
u"""Öffnet das Fenster für die Verbindungen.""" u"""Öffnet das Fenster für die Verbindungen."""
@@ -301,7 +335,7 @@ class RevPiPyControl(tkinter.Frame):
if "load_plclog" not in self.xmlfuncs: if "load_plclog" not in self.xmlfuncs:
tkmsg.showwarning( tkmsg.showwarning(
_("Warning"), _("Warning"),
_("This version of Logviewer ist not supported in version {} " _("This version of Logviewer ist not supported in version {0} "
"of RevPiPyLoad on your RevPi! You need at least version " "of RevPiPyLoad on your RevPi! You need at least version "
"0.4.1.").format(self.cli.version()), "0.4.1.").format(self.cli.version()),
parent=self.master parent=self.master
@@ -407,7 +441,7 @@ class RevPiPyControl(tkinter.Frame):
else: else:
try: try:
plcec = self.cli.plcexitcode() plcec = self.cli.plcexitcode()
except: except Exception:
self.errcount += 1 self.errcount += 1
if self.errcount >= 5: if self.errcount >= 5:
self.var_status.set("SERVER ERROR") self.var_status.set("SERVER ERROR")

View File

@@ -1 +1,6 @@
# -*- coding: utf-8 -*-
"""Shared modules.""" """Shared modules."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"

View File

@@ -1,11 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
#
# IpAclManager
#
# (c) Sven Sager, License: LGPLv3
# Version 0.1.0
#
"""Verwaltet IP Adressen und deren ACLs.""" """Verwaltet IP Adressen und deren ACLs."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
from os import access, R_OK, W_OK from os import access, R_OK, W_OK
from re import match as rematch from re import match as rematch
@@ -66,7 +65,7 @@ class IpAclManager():
return ACLs als <class 'str'>""" return ACLs als <class 'str'>"""
str_acl = "" str_acl = ""
for aclip in sorted(self.__dict_acl): for aclip in sorted(self.__dict_acl):
str_acl += "{},{} ".format(aclip, self.__dict_acl[aclip]) str_acl += "{0},{1} ".format(aclip, self.__dict_acl[aclip])
return str_acl.strip() return str_acl.strip()
def __get_filename(self): def __get_filename(self):
@@ -173,14 +172,14 @@ class IpAclManager():
if not access(filename, W_OK): if not access(filename, W_OK):
return False return False
header = "# {}Access Control List (acl)\n" \ header = "# {0}Access Control List (acl)\n" \
"# One entry per Line IPADRESS,LEVEL\n" \ "# One entry per Line IPADRESS,LEVEL\n" \
"#\n".format("" if aclname is None else aclname + " ") "#\n".format("" if aclname is None else aclname + " ")
with open(filename, "w") as fh: with open(filename, "w") as fh:
fh.write(header) fh.write(header)
for aclip in sorted(self.__dict_acl): for aclip in sorted(self.__dict_acl):
fh.write("{},{}\n".format(aclip, self.__dict_acl[aclip])) fh.write("{0},{1}\n".format(aclip, self.__dict_acl[aclip]))
return True return True

View File

@@ -1,8 +1,9 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
#
# (c) Sven Sager, License: LGPLv3
#
"""Setupscript fuer RevPiPyLoad.""" """Setupscript fuer RevPiPyLoad."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "LGPLv3"
import distutils.command.install_egg_info import distutils.command.install_egg_info
from sys import platform from sys import platform
from glob import glob from glob import glob
@@ -22,7 +23,7 @@ globsetup = {
"author_email": "akira@narux.de", "author_email": "akira@narux.de",
"url": "https://revpimodio.org/revpipyplc/", "url": "https://revpimodio.org/revpipyplc/",
"license": "LGPLv3", "license": "LGPLv3",
"version": "0.6.2", "version": "0.7.0",
"name": "revpipycontrol", "name": "revpipycontrol",