From 34f133ea6e570e1217ccd4a7cc0ed28b332fc4f2 Mon Sep 17 00:00:00 2001 From: NaruX Date: Mon, 16 Sep 2019 10:45:39 +0200 Subject: [PATCH] Konfiguration plcworkdir_set_uid in Optionen integriert Konfiguraiton replace_ios in Optionen integriert Dropdownliste f?r forkonfigurierten Pfad von replace_ios eingebaut --- doc/revpioption.html | 14 ++++ eric-revpipycontrol.api | 1 + revpipycontrol.e4p | 71 +++++++++++++++++- revpipycontrol/revpioption.py | 122 ++++++++++++++++++++++++++----- revpipycontrol/revpipycontrol.py | 2 +- setup.py | 2 +- 6 files changed, 188 insertions(+), 24 deletions(-) diff --git a/doc/revpioption.html b/doc/revpioption.html index 0fc6641..031fc00 100644 --- a/doc/revpioption.html +++ b/doc/revpioption.html @@ -51,6 +51,9 @@ Methods RevPiOption Init RevPiOption-Class. +__state_replace_ios +Konfiguriert Werte für replace_io. + _changesdone Prüft ob sich die Einstellungen geändert haben. @@ -104,6 +107,17 @@ Init RevPiOption-Class.
None
+ +

+RevPiOption.__state_replace_ios

+__state_replace_ios(text) +

+Konfiguriert Werte für replace_io. +

+
text:
+
+Ausgewählter Eintrag in Liste +

RevPiOption._changesdone

diff --git a/eric-revpipycontrol.api b/eric-revpipycontrol.api index 6de61a4..da05dce 100644 --- a/eric-revpipycontrol.api +++ b/eric-revpipycontrol.api @@ -116,6 +116,7 @@ revpilogfile._?8 revpilogfile.__author__?9 revpilogfile.__copyright__?9 revpilogfile.__license__?9 +revpioption.RevPiOption.__state_replace_ios?6(text) revpioption.RevPiOption._changesdone?5() revpioption.RevPiOption._changesdone_mqtt?5() revpioption.RevPiOption._checkclose?5(event=None) diff --git a/revpipycontrol.e4p b/revpipycontrol.e4p index f8c2415..44232dd 100644 --- a/revpipycontrol.e4p +++ b/revpipycontrol.e4p @@ -1,14 +1,14 @@ - + en_US 66103e2eaf8a762f14d1fd51d8b1c9dcaf35a275 Python3 Console - 0.7.2 + 0.8.0 Sven Sager akira@narux.de @@ -387,6 +387,41 @@ + + BuiltinsChecker + + + + + chr + + + + unichr + + + + str + + + + unicode + + + + + + CopyrightAuthor + + + + + + CopyrightMinFileSize + + + 0 + DocstringType @@ -403,7 +438,7 @@ ExcludeMessages - E123,E226,E24 + E123,E226,E24,C101 FixCodes @@ -417,6 +452,12 @@ False + + FutureChecker + + + + HangClosing @@ -429,6 +470,24 @@ + + LineComplexity + + + 15 + + + LineComplexityScore + + + 10 + + + MaxCodeComplexity + + + 10 + MaxLineLength @@ -453,6 +512,12 @@ False + + ValidEncodings + + + latin-1, utf-8 + diff --git a/revpipycontrol/revpioption.py b/revpipycontrol/revpioption.py index bbe35fa..0fb117e 100644 --- a/revpipycontrol/revpioption.py +++ b/revpipycontrol/revpioption.py @@ -54,6 +54,13 @@ class RevPiOption(tkinter.Frame): "mqttwrite_outputs": 0, } + self.replace_ios_options = [ + _("Do not use replace io file"), + _("Use static file from RevPiPyLoad"), + _("Use dynamic file from work directory"), + _("Give own path and filename"), + ] + self.mrk_xmlmodask = False self.dorestart = False @@ -61,6 +68,25 @@ class RevPiOption(tkinter.Frame): self._createwidgets() self._loadappdata() + def __state_replace_ios(self, text): + u"""Konfiguriert Werte für replace_io. + @param text: Ausgewählter Eintrag in Liste""" + selected_id = self.replace_ios_options.index(text) + + # Preset value + if selected_id == 0: + self.var_replace_ios.set("") + elif selected_id == 1: + self.var_replace_ios.set("/etc/revpipyload/replace_ios.conf") + else: + self.var_replace_ios.set("replace_ios.conf") + + # Set state of input field + self.txt_replace_ios["state"] = "normal" \ + if self.xmlmodus >= 4 and \ + selected_id == 3 \ + else "disabled" + def _changesdone(self): u"""Prüft ob sich die Einstellungen geändert haben. @return True, wenn min. eine Einstellung geändert wurde""" @@ -71,10 +97,13 @@ class RevPiOption(tkinter.Frame): str(self.dc.get("autoreloaddelay", 5)) or self.var_zexit.get() != self.dc.get("zeroonexit", 0) or self.var_zerr.get() != self.dc.get("zeroonerror", 0) or + self.var_replace_ios.get() != self.dc.get("replace_ios", "") or # TODO: rtlevel (0) self.var_startpy.get() != self.dc.get("plcprogram", "none.py") or self.var_startargs.get() != self.dc.get("plcarguments", "") or self.var_pythonver.get() != self.dc.get("pythonversion", 3) or + self.var_plcworkdir_set_uid.get() != \ + self.dc.get("plcworkdir_set_uid") or self.var_slave.get() != self.dc.get("plcslave", 0) or self.var_slaveacl.get() != self.dc.get("plcslaveacl", "") or self.var_mqtton.get() != self.dc.get("mqtt", 0) or @@ -133,6 +162,9 @@ class RevPiOption(tkinter.Frame): # Gruppe Start/Stop stst = tkinter.LabelFrame(self) + stst.columnconfigure(0, weight=1) + stst.columnconfigure(2, weight=1) + stst.columnconfigure(3, weight=1) stst["text"] = _("Start / Stop behavior") stst.grid(columnspan=2, pady=2, sticky="we") @@ -141,82 +173,112 @@ class RevPiOption(tkinter.Frame): self.var_reload_delay = tkinter.StringVar(stst) self.var_zexit = tkinter.BooleanVar(stst) self.var_zerr = tkinter.BooleanVar(stst) + self.var_replace_ios = tkinter.StringVar(stst) + self.var_replace_ios_options = tkinter.StringVar(stst) + # Row 0 ckb_start = tkinter.Checkbutton(stst) ckb_start["text"] = _("Start program automatically") ckb_start["state"] = xmlstate ckb_start["variable"] = self.var_start - ckb_start.grid(columnspan=2, **cpadw) + ckb_start.grid(columnspan=3, **cpadw) + # Row 1 ckb_reload = tkinter.Checkbutton(stst) ckb_reload["text"] = _("Restart program after exit") ckb_reload["state"] = xmlstate ckb_reload["variable"] = self.var_reload - ckb_reload.grid(columnspan=2, **cpadw) + ckb_reload.grid(columnspan=3, **cpadw) + # Row 2 lbl = tkinter.Label(stst) lbl["text"] = _("Restart after n seconds of delay") - lbl.grid(**cpadw) + lbl.grid(columnspan=2, **cpadw) sbx = tkinter.Spinbox(stst) sbx["to"] = 60 sbx["from_"] = 5 sbx["textvariable"] = self.var_reload_delay sbx["width"] = 4 - sbx.grid(column=1, row=2, **cpade) + sbx.grid(column=2, row=2, **cpade) + # Row 3 lbl = tkinter.Label(stst) lbl["text"] = _("Set process image to NULL if program terminates...") - lbl.grid(columnspan=2, **cpadw) + lbl.grid(columnspan=3, **cpadw) + # Row 4 ckb_zexit = tkinter.Checkbutton(stst, justify="left") ckb_zexit["state"] = xmlstate ckb_zexit["text"] = _("... successfully") ckb_zexit["variable"] = self.var_zexit - ckb_zexit.grid(**cpadw) + ckb_zexit.grid(column=1, **cpadw) + # Row 5 ckb_zerr = tkinter.Checkbutton(stst, justify="left") ckb_zerr["state"] = xmlstate ckb_zerr["text"] = _("... with errors") ckb_zerr["variable"] = self.var_zerr - ckb_zerr.grid(**cpadw) + ckb_zerr.grid(column=1, **cpadw) + + # Row 6 + lbl = tkinter.Label(stst) + lbl["text"] = _("Replace IO file:") + lbl.grid(row=6, **cpadw) + + opt = tkinter.OptionMenu( + stst, self.var_replace_ios_options, *self.replace_ios_options, + command=self.__state_replace_ios + ) + opt["state"] = xmlstate + opt["width"] = 30 + opt.grid(row=6, column=1, columnspan=2, **cpadwe) + + # Row 7 + self.txt_replace_ios = tkinter.Entry(stst) + self.txt_replace_ios["state"] = xmlstate + self.txt_replace_ios["textvariable"] = self.var_replace_ios + self.txt_replace_ios.grid(column=1, columnspan=2, **cpadwe) # Gruppe Programm prog = tkinter.LabelFrame(self) prog.columnconfigure(0, weight=1) prog.columnconfigure(1, weight=1) + prog.columnconfigure(2, weight=1) prog["text"] = _("PLC program") prog.grid(columnspan=2, pady=2, sticky="we") self.var_pythonver = tkinter.IntVar(prog) self.var_startpy = tkinter.StringVar(prog) self.var_startargs = tkinter.StringVar(prog) + self.var_plcworkdir_set_uid = tkinter.BooleanVar(prog) self.var_pythonver.set(3) + # Row 0 lbl = tkinter.Label(prog) lbl["text"] = _("Python version") + ":" - lbl.grid(columnspan=2, row=0, **cpadw) + lbl.grid(row=0, **cpadw) rbn = tkinter.Radiobutton(prog) rbn["state"] = xmlstate rbn["text"] = "Python2" rbn["value"] = 2 rbn["variable"] = self.var_pythonver - rbn.grid(column=0, row=1, **cpade) + rbn.grid(row=0, column=1, **cpade) rbn = tkinter.Radiobutton(prog) rbn["state"] = xmlstate rbn["text"] = "Python3" rbn["value"] = 3 rbn["variable"] = self.var_pythonver - rbn.grid(column=1, row=1, **cpadw) + rbn.grid(row=0, column=2, **cpadw) - # Row 2 + # Row 1 lbl = tkinter.Label(prog) lbl["text"] = _("Python PLC program name") - lbl.grid(columnspan=2, **cpadw) + lbl.grid(columnspan=3, **cpadw) - # Row 3 + # Row 2 lst = self.xmlcli.get_filelist() lst.sort() if ".placeholder" in lst: @@ -227,17 +289,23 @@ class RevPiOption(tkinter.Frame): prog, self.var_startpy, *lst ) opt_startpy["state"] = xmlstate - opt_startpy.grid(columnspan=2, **cpadwe) + opt_startpy.grid(columnspan=3, **cpadwe) - # Row 4 + # Row 3 lbl = tkinter.Label(prog) - lbl["text"] = _("Program arguments") - lbl.grid(columnspan=2, **cpadw) + lbl["text"] = _("Program arguments:") + lbl.grid(**cpadw) - # Row 5 txt = tkinter.Entry(prog) txt["textvariable"] = self.var_startargs - txt.grid(columnspan=2, **cpadw) + txt.grid(row=3, column=1, columnspan=2, **cpadwe) + + # Row 4 + ckb = tkinter.Checkbutton(prog) + ckb["text"] = _("Set write access to workdirectory") + ckb["state"] = xmlstate + ckb["variable"] = self.var_plcworkdir_set_uid + ckb.grid(columnspan=2, **cpadw) # Gruppe Services services = tkinter.LabelFrame(self) @@ -338,11 +406,24 @@ class RevPiOption(tkinter.Frame): self.var_reload_delay.set(self.dc.get("autoreloaddelay", 5)) self.var_zexit.set(self.dc.get("zeroonexit", 0)) self.var_zerr.set(self.dc.get("zeroonerror", 0)) + replace_ios = self.dc.get("replace_ios", "") + self.var_replace_ios.set(replace_ios) + if replace_ios == "": + self.var_replace_ios_options.set(self.replace_ios_options[0]) + elif replace_ios == "/etc/revpipyload/replace_ios.conf": + self.var_replace_ios_options.set(self.replace_ios_options[1]) + elif replace_ios == "replace_ios.conf": + self.var_replace_ios_options.set(self.replace_ios_options[2]) + else: + self.var_replace_ios_options.set(self.replace_ios_options[3]) + self.__state_replace_ios(self.var_replace_ios_options.get()) # TODO: rtlevel (0) self.var_startpy.set(self.dc.get("plcprogram", "none.py")) self.var_startargs.set(self.dc.get("plcarguments", "")) self.var_pythonver.set(self.dc.get("pythonversion", 3)) + self.var_plcworkdir_set_uid.set( + self.dc.get("plcworkdir_set_uid", False)) # MQTT Einstellungen laden self.var_mqtton.set(self.dc.get("mqtt", 0)) @@ -388,9 +469,12 @@ class RevPiOption(tkinter.Frame): self.dc["plcprogram"] = self.var_startpy.get() self.dc["plcarguments"] = self.var_startargs.get() self.dc["pythonversion"] = self.var_pythonver.get() + self.dc["plcworkdir_set_uid"] = \ + int(self.var_plcworkdir_set_uid.get()) # TODO: rtlevel (0) self.dc["zeroonerror"] = int(self.var_zerr.get()) self.dc["zeroonexit"] = int(self.var_zexit.get()) + self.dc["replace_ios"] = self.var_replace_ios.get() # MQTT Settings self.dc["mqtt"] = int(self.var_mqtton.get()) diff --git a/revpipycontrol/revpipycontrol.py b/revpipycontrol/revpipycontrol.py index 437125c..770c423 100755 --- a/revpipycontrol/revpipycontrol.py +++ b/revpipycontrol/revpipycontrol.py @@ -5,7 +5,7 @@ u"""RevPiPyControl main program.""" __author__ = "Sven Sager" __copyright__ = "Copyright (C) 2018 Sven Sager" __license__ = "GPLv3" -__version__ = "0.7.2" +__version__ = "0.8.0" import revpicheckclient import revpidevelop diff --git a/setup.py b/setup.py index 751ea92..2fb1924 100644 --- a/setup.py +++ b/setup.py @@ -23,7 +23,7 @@ globsetup = { "author_email": "akira@narux.de", "url": "https://revpimodio.org/revpipyplc/", "license": "LGPLv3", - "version": "0.7.2", + "version": "0.8.0", "name": "revpipycontrol",