#!/usr/bin/env python # -*- coding: UTF-8 -*- # # generated by wxGlade 0.9.5 on Fri Feb 7 20:10:41 2020 # import wx import wx.grid import wx.propgrid import gettext import re import sys from pubsub import pub import pubsub.utils.notification from WebRelay import WebRelay from FaultView import FaultFrame print('pubsub API version', pub.VERSION_API) pubsub.utils.notification.useNotifyByWriteFile(sys.stdout) class Controller: def __init__(self, view): self.sc = None self.view = view self.timer = wx.Timer() self.timer.Bind(wx.EVT_TIMER, self.OnTimer) self.refresh_rate = 2000 self.mode = False self.model = WebRelay() pub.subscribe(self.startTimer, 'monitoring_started') pub.subscribe(self.stopTimer, 'monitoring_stopped') pub.subscribe(self.model.apply_network_configs, 'apply_network_configs') pub.subscribe(self.model.turn_relay_on, "turn_relay_on") pub.subscribe(self.model.turn_relay_off, "turn_relay_off") def startTimer(self): self.model.connect_slave() self.timer.Start(self.refresh_rate) def stopTimer(self): self.model.disconnect_slave() self.timer.Stop() def OnTimer(self, event): # Read registers relay_status = self.model.client.read_coils(0,10) # Process registers # Show Registers for i, rstatus in enumerate(relay_status): self.model.relay_status[i] = rstatus if rstatus: self.view.indicators[i].SetValue("ON") self.view.indicators[i].SetBackgroundColour(wx.Colour(0, 255, 0)) else: self.view.indicators[i].SetValue("OFF") self.view.indicators[i].SetBackgroundColour(wx.Colour(255, 0, 0)) class MyFrame(FaultFrame): def __init__(self, *args, **kwds): FaultFrame.__init__(self, *args, **kwds) pub.subscribe(self.update_display, 'read_all_registers') self.indicators = [ self.text_ctrl_1, self.text_ctrl_2, self.text_ctrl_3, self.text_ctrl_4, self.text_ctrl_5, self.text_ctrl_6, self.text_ctrl_7, self.text_ctrl_8, self.text_ctrl_9, self.text_ctrl_10, ] def update_status(self, stats): self.text_ctrl_system_status.SetValue(stats[0]) self.text_ctrl_ac1_status.SetValue(stats[1]) self.text_ctrl_dc2_status.SetValue(stats[2]) self.text_ctrl_dc3_status.SetValue(stats[3]) def update_display(self, reg, info): ports = {k: v for (k, v) in info.items() if re.search(r'^p[1-3]_', k)} etc = {k: v for (k, v) in info.items() if not re.search(r'^p[1-3]_', k)} for k, v in ports.items(): self.property_page.SetPropertyValue(k, str(v.convertValue(reg[v.address]))) self.property_page.SetPropertyAttribute(k, "Units", str((reg[v.address]))) for k, v in etc.items(): self.property_page_etc.SetPropertyValue(k, str(v.convertValue(reg[v.address]))) self.property_page_etc.SetPropertyAttribute(k, "Units", str((reg[v.address]))) def ToggleMonitoring(self, event): # wxGlade: MyFrame. btnLabel = self.button_1.GetLabel() if self.button_1.Value: pub.sendMessage("monitoring_started") self.button_1.SetLabel("Stop") else: pub.sendMessage("monitoring_stopped") self.button_1.SetLabel("Start") def OnApply(self, event): if self.button_1.Enabled: return self.input_uid.Disable() self.input_port.Disable() self.input_ip.Disable() self.input_refresh.Disable() nc_dict = { "ipaddr": self.input_ip.GetValue(), "port": int(self.input_port.GetValue()), "uid": int(self.input_uid.GetValue()), "refresh": int(self.input_refresh.GetValue()), } pub.sendMessage("apply_network_configs", nc_dict=nc_dict) self.button_1.Enable() def OnReset(self, event=None): if not self.button_1.Enabled: return self.button_1.SetValue(False) self.button_1.Disable() self.input_uid.Enable() self.input_port.Enable() self.input_ip.Enable() self.input_refresh.Enable() def OnRelayOn(self, event): pub.sendMessage("turn_relay_on", relay_id = event.GetId()-1) event.Skip() def OnRelayOff(self, event): pub.sendMessage("turn_relay_off", relay_id = event.GetId()-11) event.Skip() def OnRelayPulse(self, event): event.Skip() # end of class MyFrame class MyApp(wx.App): def OnInit(self): self.frame = MyFrame(None, wx.ID_ANY, "") self.c = Controller(self.frame) self.SetTopWindow(self.frame) self.frame.Show() return True # end of class MyApp if __name__ == "__main__": gettext.install("app") # replace with the appropriate catalog name app = MyApp(0) app.MainLoop() app.c.model.disconnect_slave()