Ejemplo n.º 1
0
class TCPThread(Thread):
    ownerNotifier = None
    terminated = False
    tcpClient = None
    pktHandler = None
    host = None
    port = None

    def __init__(self, pktHandler, ownerNotifier, host, port):
        Thread.__init__(self)
        self.pktHandler = pktHandler
        self.ownerNotifier = ownerNotifier
        self.host = host
        self.port = port

    def cleanup(self):
        if self.tcpClient is not None:
            self.tcpClient.disconnect()
        self.ownerNotifier.notify(self.ownerNotifier.TERMINATE)

    def run(self):
        try:
            log.debug("TCPThread.run")

            self.tcpClient = TCPClient(self.host, self.port)
            if not self.tcpClient.connect(10):
                print "Connection to host failed"
                self.terminated = True

            while not self.terminated:
                data = self.tcpClient.read()
                if data is not None:
                    data = data[1:-3]  # remove leading ' and trailing \n'
                    self.pktHandler.input(data)

                time.sleep(0.001)
            self.cleanup()
        except:  # sys.excepthook does not work in threads
            import traceback

            traceback.print_exc()
            self.terminated = True
            self.cleanup()

    def terminate(self):
        log.debug("TCPThread.terminate")
        self.terminated = True
 class ClientRunner():
     
     client = None
     serverPort = None
     
     def __init__(self, port):
         log.debug('Creating ClientRunner, port ' + str(port))
         self.serverPort = port
         pass
     
     def startClient(self):
         self.client = TCPClient('localhost', self.serverPort)
         return self.client.connect(2)
 
     def stopClient(self):
         self.client.disconnect()
         time.sleep(0.1)
         self.client = None
Ejemplo n.º 3
0
def Main():
    
    signal.signal(signal.SIGINT, sigIntHandler)
    client = TCPClient(HOST, PORT)
    
    print 'Connecting to ' + HOST + ':' + str(PORT) + ' ..'
    if not client.connect(10):
        print 'Connection to host failed'
        sys.exit(-1)

    runTime = 0
    while not terminated:
        data = client.read()
        if data is not None:
            print data
        time.sleep(0.1)
        runTime += 0.1
        if runTime > 10:
            print 'Terminating'
            break
Ejemplo n.º 4
0
class WindowGUI(object):
    def __init__(self, width, height, svr_addr, svr_port, host_addr,
                 host_port):  # {{{
        """ """
        self.lan = 'cn'
        self.tcp = TCPClient(4096)
        self.log = dict()

        # window
        self.width = width
        self.height = height
        self.win = tk.Tk()
        self.win.protocol('WM_DELETE_WINDOW', self.onCloseWindow)
        self.win.resizable(width=True, height=False)
        self.screenwidth = self.win.winfo_screenwidth()
        self.screenheight = self.win.winfo_screenheight()

        # homebrain address / port
        self.server_addr = tk.StringVar()
        self.server_port = tk.StringVar()
        self.server_addr.set(svr_addr)
        self.server_port.set(svr_port)

        # host address / port
        self.host_addr = tk.StringVar()
        self.host_port = tk.StringVar()
        self.host_addr.set(host_addr)
        self.host_port.set(host_port)

        self.filter_key = tk.StringVar()
        self.rule_newn_var = tk.StringVar()
        self.rule_switch_var = tk.StringVar()
        self.rule_btm_sw = 0

        self.onGlobalConfigure()
        self.createConnectView()
        self.win.mainloop()
# }}}

    def onGlobalConfigure(self):  # {{{
        self.win.title(gStrings['title'][self.lan])
        style = ttk.Style()
        style.theme_create('monitor',
                           parent="alt",
                           settings=gStyles['monitor'])
        style.theme_use('monitor')
        #  data = {}
        #  for e in style.element_names():
        #      data[e] = style.element_options(e)
        #  print(data)
# }}}

    def onInitWindow(self):  # {{{
        # set window place and size
        alignstr = '%dx%d+%d+%d' % (self.width, self.height,
                                    (self.screenwidth - self.width) / 2,
                                    (self.screenheight - self.height) / 2)
        self.win.geometry(alignstr)

        # set menu
        self.menu_bar = tk.Menu(self.win)
        menu_set = tk.Menu(self.menu_bar)
        menu_set.add_command(label=gStrings['lanSwitch'][self.lan],
                             command=self.onSwitchLang)
        self.menu_bar.add_cascade(label=gStrings['set'][self.lan],
                                  menu=menu_set)

        self.menu_bar.add_command(label=gStrings['quit'][self.lan],
                                  command=self.onCloseWindow)

        self.menu_bar.add_command(label=gStrings['about'][self.lan],
                                  state=tk.DISABLED,
                                  command=self.oShowAbout)
        self.win.config(menu=self.menu_bar)

        # set tabpage
        self.tabControl = ttk.Notebook(self.win)
        self.bi_tab = ttk.Frame(self.tabControl)
        self.tabControl.add(self.bi_tab, text=gStrings['basicInfo'][self.lan])
        self.log_tab = ttk.Frame(self.tabControl)
        self.tabControl.add(self.log_tab, text=gStrings['logSet'][self.lan])
        self.dev_tab = ttk.Frame(self.tabControl)
        self.tabControl.add(self.dev_tab, text=gStrings['ruleCtrl'][self.lan])
        self.scene_tab = ttk.Frame(self.tabControl)
        self.tabControl.add(self.scene_tab,
                            text=gStrings['sceneAuto'][self.lan])
        self.tabControl.pack(expand=1, fill=tk.BOTH)

        self.createBasicInfoView(self.bi_tab)
        self.createLogSetView(self.log_tab)
        self.createRuleControlView(self.dev_tab)
        self.createSceneAutoView(self.scene_tab)
# }}}

    def onSwitchLang(self):  # {{{
        if self.lan == 'en':
            self.lan = 'cn'
        else:
            self.lan = 'en'
        self.menu_bar.destroy()
        self.tabControl.destroy()
        self.onInitWindow()
# }}}

    def oShowAbout(self):  # {{{
        pass  # }}}}}}

    def onCloseWindow(self):  # {{{
        try:
            if self.logthread:
                self.onLogTerminate()
        except Exception:
            pass
        self.tcp.close()
        self.win.destroy()
# }}}

    def onConnect(self):  # {{{
        addr = self.server_addr.get()
        port = self.server_port.get()
        if self.tcp.connect(addr, int(port)):
            self.conn_frm.destroy()
            self.onInitWindow()
        else:
            self.conn_frm.destroy()
            self.onConnectError()
# }}}

    def onBack(self, destoryFrm, showFunc):  # {{{
        destoryFrm.destroy()
        showFunc()
# }}}

    def createConnectView(self):  # {{{
        width = 360
        height = 200
        alignstr = '%dx%d+%d+%d' % (width, height,
                                    (self.screenwidth - width) / 2,
                                    (self.screenheight - height) / 2)
        self.win.geometry(alignstr)
        self.conn_frm = ttk.Frame(self.win,
                                  padding=20,
                                  width=width,
                                  height=height)
        ttk.Label(
            self.conn_frm,
            text=gStrings['serverAddr'][self.lan],
        ).grid(row=1, sticky=tk.E, padx=10, pady=10)
        ttk.Entry(
            self.conn_frm,
            textvariable=self.server_addr,
        ).grid(row=1, column=1, sticky=tk.W, padx=10, pady=10)
        ttk.Label(
            self.conn_frm,
            text=gStrings['serverPort'][self.lan],
        ).grid(row=2, sticky=tk.E, padx=10, pady=10)
        ttk.Entry(
            self.conn_frm,
            textvariable=self.server_port,
        ).grid(row=2, column=1, sticky=tk.W, padx=10, pady=10)
        ttk.Button(
            self.conn_frm,
            text=gStrings['connect'][self.lan],
            command=self.onConnect,
        ).grid(row=3, column=1, columnspan=2, sticky=tk.E, padx=12)
        self.conn_frm.pack(side=tk.BOTTOM, anchor=tk.CENTER)
# }}}

    def onConnectError(self):  # {{{
        width = 360
        height = 150
        alignstr = '%dx%d+%d+%d' % (width, height,
                                    (self.screenwidth - width) / 2,
                                    (self.screenheight - height) / 2)
        self.win.geometry(alignstr)
        self.connerr_frm = ttk.Frame(self.win,
                                     padding=20,
                                     width=width,
                                     height=height)
        ttk.Label(
            self.connerr_frm,
            text=gStrings['connErr'][self.lan],
        ).grid(row=0, sticky=tk.NS, padx=10, pady=10)
        ttk.Button(self.connerr_frm,
                   text=gStrings['back'][self.lan],
                   command=lambda: self.onBack(self.connerr_frm, self.
                                               createConnectView)).grid(
                                                   row=1,
                                                   column=1,
                                                   sticky=tk.W,
                                                   padx=12)
        ttk.Button(
            self.connerr_frm,
            text=gStrings['quit'][self.lan],
            command=self.onCloseWindow,
        ).grid(row=1, column=2, sticky=tk.E, padx=12)
        self.connerr_frm.pack(side=tk.BOTTOM, anchor=tk.CENTER)
# }}}

    def createBasicInfoView(self, tab):  # {{{
        ver_frm = ttk.Frame(tab)
        ttk.Label(ver_frm,
                  text=gStrings['versionInfo'][self.lan],
                  foreground=gColors['Tomato'],
                  font=('Arial', 14)).grid(row=0,
                                           column=0,
                                           columnspan=2,
                                           sticky=tk.W)
        ver_frm.pack(anchor=tk.W)

        ttk.Label(ver_frm,
                  text=gStrings['hbVer'][self.lan],
                  width=15,
                  font=('Arial', 12)).grid(row=1, column=0)

        ttk.Label(ver_frm,
                  text=self.tcp.command('getHomeBrainVersion'),
                  width=15,
                  font=('Arial', 12)).grid(row=1, column=1)

        ttk.Label(ver_frm,
                  text=gStrings['reVer'][self.lan],
                  width=15,
                  font=('Arial', 12)).grid(row=2, column=0)

        ttk.Label(ver_frm,
                  text=self.tcp.command('getRuleEngineVersion'),
                  width=15,
                  font=('Arial', 12)).grid(row=2, column=1)
# }}}

    def createLogSetView(self, tab):  # {{{
        # level frame
        i = 0
        j = 0
        top_frm = ttk.Frame(tab)
        top_frm.pack(anchor=tk.W)

        # Log Level
        level_frm = ttk.Frame(top_frm)
        ttk.Label(level_frm,
                  text=gStrings['loglevel'][self.lan],
                  foreground=gColors['Tomato'],
                  font=('Arial', 14)).grid(row=i,
                                           column=j,
                                           columnspan=6,
                                           sticky=tk.W)
        level_frm.pack(side=tk.LEFT)

        i += 1
        j += 1
        for t in (gStrings['logModule'][self.lan],
                  gStrings['logError'][self.lan],
                  gStrings['logWarn'][self.lan],
                  gStrings['logNormal'][self.lan],
                  gStrings['logInfo'][self.lan],
                  gStrings['logTrace'][self.lan]):
            ttk.Label(level_frm, text=t, anchor=tk.CENTER,
                      width=10).grid(row=i, column=j)
            j += 1
        i += 1
        names = self.tcp.command('getModulesName').split(';')
        for name in names:
            level = self.tcp.command('getModuleLogLevel', name)
            if level == "":
                continue
            self.log[name] = tk.IntVar()
            self.log[name].set(int(level))
            ttk.Label(level_frm, text=name, anchor=tk.CENTER,
                      width=10).grid(row=i, column=1)
            for j in range(1, 6):
                ttk.Radiobutton(
                    level_frm,
                    variable=self.log[name],
                    value=j,
                    command=lambda n=name, l=str(j): self.tcp.command(
                        'setModuleLogLevel', n, l)).grid(row=i, column=j + 1)
            i = i + 1

        # CLP Watch
        watch_frm = ttk.Frame(top_frm)
        watch_frm.pack(side=tk.TOP)

        witems = (('rules', 'statistics'), ('facts', 'activations'),
                  ('focus', 'instances'), ('slots', 'messages'),
                  ('globals', 'message-handlers'))
        ttk.Label(watch_frm,
                  text=gStrings['watch'][self.lan],
                  foreground=gColors['Tomato'],
                  font=('Arial', 14)).grid(row=0,
                                           column=0,
                                           columnspan=3,
                                           sticky=tk.W)
        i = 1
        for row in witems:
            var1 = tk.IntVar()
            ttk.Checkbutton(watch_frm,
                            text=row[0],
                            width=8,
                            variable=var1,
                            command=lambda v=var1, m=row[0]: self.
                            onLogWatchCheck(v, m)).grid(row=i,
                                                        column=0,
                                                        padx=(16, 2),
                                                        pady=2)
            var2 = tk.IntVar()
            ttk.Checkbutton(watch_frm,
                            text=row[1],
                            width=16,
                            variable=var2,
                            command=lambda v=var2, m=row[1]: self.
                            onLogWatchCheck(v, m)).grid(row=i,
                                                        column=1,
                                                        columnspan=2,
                                                        padx=(16, 2),
                                                        pady=2)
            i += 1

        # Log Output
        log_frm = ttk.Frame(tab)
        ttk.Label(log_frm,
                  text=gStrings['logOutput'][self.lan],
                  foreground=gColors['Tomato'],
                  font=('Arial', 14)).grid(row=0, column=0, sticky=tk.W)
        ttk.Label(log_frm, text=gStrings['host'][self.lan]).grid(row=1,
                                                                 column=0)
        ttk.Entry(log_frm, width=16,
                  textvariable=self.host_addr).grid(row=1, column=1)
        ttk.Label(log_frm, text=gStrings['port'][self.lan]).grid(row=1,
                                                                 column=2,
                                                                 padx=5)
        ttk.Entry(log_frm, width=7, textvariable=self.host_port).grid(row=1,
                                                                      column=3,
                                                                      padx=5)
        self.output_btn = ttk.Button(
            log_frm,
            text=gStrings['output'][self.lan],
            command=self.onLogOutput,
        )
        self.output_btn.grid(row=1, column=4, sticky=tk.W, padx=5)
        ttk.Button(
            log_frm,
            text=gStrings['terminate'][self.lan],
            command=self.onLogTerminate,
        ).grid(row=1, column=5, sticky=tk.W, padx=5)
        ttk.Button(
            log_frm,
            text=gStrings['clear'][self.lan],
            command=self.onLogClear,
        ).grid(row=1, column=6, sticky=tk.W, padx=5)
        ttk.Label(log_frm, text=gStrings['filter'][self.lan]).grid(row=1,
                                                                   column=7)
        ttk.Entry(log_frm, width=16,
                  textvariable=self.filter_key).grid(row=1, column=8, padx=5)
        ttk.Button(
            log_frm,
            text=gStrings['printItem'][self.lan],
            command=self.onLogPrintListDialog,
        ).grid(row=1, column=9, sticky=tk.W, padx=(10, 10))

        log_frm.pack(anchor="w")

        # Log Text
        self.log_text = tk.Text(tab,
                                wrap=tk.NONE,
                                width=self.width,
                                height=self.height)
        hscroll = tk.Scrollbar(tab,
                               orient=tk.HORIZONTAL,
                               command=self.log_text.xview)
        hscroll.pack(side=tk.BOTTOM, fill=tk.X)
        vscroll = tk.Scrollbar(tab,
                               orient=tk.VERTICAL,
                               command=self.log_text.yview)
        vscroll.pack(side=tk.RIGHT, fill=tk.Y)
        self.log_text.config(yscrollcommand=vscroll.set)
        self.log_text.config(xscrollcommand=hscroll.set)
        self.log_text.pack()
# }}}

    def onLogWatchCheck(self, var, item):  # {{{
        self.tcp.command('watchItem', str(var.get()), item)
# }}}

    def onLogOutput(self):  # {{{
        self.logthread = LogThread()
        addr = self.server_addr.get()
        port = self.server_port.get()

        def output(log):
            if self.filter_key.get():
                for line in log.splitlines():
                    # TODO using re
                    if self.filter_key.get() in line:
                        self.log_text.insert(tk.END, line + "\n")
                        self.log_text.see(tk.END)
            else:
                self.log_text.insert(tk.END, log)
                self.log_text.see(tk.END)

        self.logthread.start(addr, port, output)
        self.tcp.command('startUDPLog', addr, port)
        self.output_btn.configure(state=tk.DISABLED)
# }}}

    def onLogTerminate(self):  # {{{
        self.tcp.command('stopUDPLog')
        for i in range(0, 3):
            if self.logthread.isAlive():
                self.logthread.stop()
                time.sleep(0.2)
        self.output_btn.configure(state=tk.NORMAL)
# }}}

    def onLogClear(self):  # {{{
        self.log_text.delete(0.0, tk.END)
# }}}

    def onLogPrintListDialog(self):  # {{{
        try:
            self.print_dialog.destroy()
        except Exception as e:
            print("don't worry, that's ok!")
        width = 180
        height = 235
        self.print_dialog = tk.Toplevel()
        self.print_dialog.title(gStrings['selectItem'][self.lan])
        alignstr = '%dx%d+%d+%d' % (width, height,
                                    (self.screenwidth - self.width) / 2 +
                                    (self.width - width) - 40,
                                    (self.screenheight - self.height) / 2 + 60)
        self.print_dialog.geometry(alignstr)
        dialog_frm = ttk.Frame(self.print_dialog,
                               padding=10,
                               width=width,
                               height=height)
        self.debug_items = ('mem', 'fact', 'instance', 'class', 'rule',
                            'agenda', 'global')
        log_listbox = tk.Listbox(dialog_frm,
                                 selectmode=tk.SINGLE,
                                 height=len(self.debug_items),
                                 font=('Arial', 14))
        for item in self.debug_items:
            log_listbox.insert(tk.END, gStrings[item][self.lan])
        log_listbox.bind('<Button-1>', self.onClickDebugListBox)
        log_listbox.pack(side=tk.TOP, anchor=tk.CENTER, fill=tk.BOTH)
        ttk.Button(dialog_frm,
                   text=gStrings['quit'][self.lan],
                   command=lambda: self.onClickQuit('logprint')).pack(
                       side=tk.RIGHT, pady=(20, 10))
        dialog_frm.pack(side=tk.TOP, anchor=tk.CENTER, fill=tk.BOTH)
# }}}

    def createRuleControlView(self, tab):  # {{{
        sel_frm = ttk.Frame(tab)
        sel_frm.pack(pady=(6, 20))

        rul_frm = ttk.Frame(tab)
        rul_frm.pack(side=tk.BOTTOM, expand=1, fill=tk.Y, pady=(20, 0))
        rul_ctl_frm = ttk.Frame(rul_frm)
        rul_ctl_frm.pack(fill=tk.Y, anchor=tk.NW)

        ttk.Label(rul_ctl_frm,
                  text=gStrings['ruleSel'][self.lan],
                  foreground=gColors['Tomato'],
                  font=('Arial', 14)).pack(side=tk.LEFT)
        self.rule_var = tk.StringVar()
        self.rule_list = ttk.Combobox(rul_ctl_frm,
                                      takefocus=False,
                                      state='readonly',
                                      width=23,
                                      textvariable=self.rule_var,
                                      exportselection=0,
                                      font=('Arial', 14))
        result = self.tcp.command('getRules')
        rules = ('<NONE>', )
        if len(result) > 0:
            rules = result.split(';')
        self.rule_list['values'] = rules
        self.rule_list.current(0)
        self.rule_list.bind("<<ComboboxSelected>>", self.onRuleSelected)
        self.rule_list.pack(side=tk.LEFT, padx=(2, 8))

        self.rule_refresh_btn = ttk.Button(
            rul_ctl_frm,
            width=5,
            text=gStrings['refresh'][self.lan],
            command=self.onRefreshRules,
        )
        self.rule_refresh_btn.pack(side=tk.LEFT, padx=(8, 8))
        self.rule_ci_btn = ttk.Button(rul_ctl_frm,
                                      text=gStrings['commit'][self.lan],
                                      command=self.onRuleCommit)
        self.rule_ci_btn.pack(side=tk.LEFT, padx=(8, 8))
        ttk.Button(rul_ctl_frm,
                   text=gStrings['delete'][self.lan],
                   command=self.onRuleDeleteDialog).pack(side=tk.LEFT,
                                                         padx=(8, 8))
        ttk.Button(rul_ctl_frm,
                   textvariable=self.rule_switch_var,
                   command=self.onRuleSwitch).pack(side=tk.LEFT, padx=(8, 12))
        self.rule_newn_btn = ttk.Button(rul_ctl_frm,
                                        text=gStrings['new'][self.lan],
                                        command=lambda: self.onRuleNew('save'))
        self.rule_newn_btn.pack(side=tk.LEFT, padx=(8, 8))
        self.rule_newn_entry = ttk.Entry(rul_ctl_frm,
                                         textvariable=self.rule_newn_var,
                                         state=tk.DISABLED,
                                         font=('Arial', 14))
        self.rule_newn_entry.pack(side=tk.LEFT, padx=(8, 8))
        self.rule_cancel_btn = ttk.Button(
            rul_ctl_frm,
            width=5,
            text=gStrings['cancel'][self.lan],
            command=lambda: self.onRuleNew('cancel'))

        self.rule_text = tk.Text(rul_frm,
                                 wrap=tk.NONE,
                                 width=100,
                                 height=25,
                                 font=('Arial', 14))
        hscroll = tk.Scrollbar(rul_frm,
                               orient=tk.HORIZONTAL,
                               command=self.rule_text.xview)
        hscroll.pack(side=tk.BOTTOM, fill=tk.X)
        vscroll = tk.Scrollbar(rul_frm,
                               orient=tk.VERTICAL,
                               command=self.rule_text.yview)
        vscroll.pack(side=tk.RIGHT, fill=tk.Y)
        self.rule_text.config(yscrollcommand=vscroll.set)
        self.rule_text.config(xscrollcommand=hscroll.set)
        self.rule_text.pack(side=tk.BOTTOM,
                            anchor=tk.CENTER,
                            expand=1,
                            fill=tk.Y)
        self.rule_text.bind("<Control-Key-a>", self.onRuleSelectText)
        self.rule_text.bind("<Control-Key-A>", self.onRuleSelectText)
        self.onRuleSelected()

        #  Devices
        ttk.Label(sel_frm,
                  text=gStrings['deviceSel'][self.lan],
                  foreground=gColors['Tomato'],
                  font=('Arial', 14)).pack(side=tk.LEFT)
        self.device_var = tk.StringVar()
        self.device_list = ttk.Combobox(sel_frm,
                                        takefocus=False,
                                        state='readonly',
                                        width=20,
                                        textvariable=self.device_var,
                                        exportselection=0,
                                        font=('Arial', 14))
        result = self.tcp.command('getDevices')
        devices = ('<NONE>', )
        if len(result) > 0:
            devices = result.split(';')
        self.device_list['values'] = devices
        self.device_list.current(0)
        self.device_list.bind("<<ComboboxSelected>>", self.onDeviceSelected)
        self.device_list.pack(side=tk.LEFT)
        ttk.Label(sel_frm,
                  text=gStrings['deviceID'][self.lan],
                  foreground=gColors['Tomato'],
                  font=('Arial', 14)).pack(side=tk.LEFT, padx=(15, 0))

        #  Instances
        self.ins_var = tk.StringVar()
        self.ins_list = ttk.Combobox(sel_frm,
                                     takefocus=False,
                                     state='readonly',
                                     width=25,
                                     textvariable=self.ins_var,
                                     exportselection=0,
                                     font=('Arial', 14))
        inses = self.tcp.command('getInstaces', devices[0])
        values = ('<NONE>', )
        if len(inses) > 0:
            values = inses.split(';')
        self.ins_list['values'] = values
        self.ins_list.current(0)
        self.ins_list.bind("<<ComboboxSelected>>", self.onInstanceSelected)
        self.ins_list.pack(side=tk.LEFT)

        self.manual_refresh_btn = ttk.Button(
            sel_frm,
            width=8,
            text=gStrings['manualRefresh'][self.lan],
            command=self.onInstanceSelected)
        self.manual_refresh_btn.pack(side=tk.LEFT, padx=(20, 0))

        self.sw_auto_refresh = 0
        auto_refresh_ins = tk.IntVar()
        auto_refresh_ins.set(3)
        self.auto_refresh_btn = ttk.Button(
            sel_frm,
            width=8,
            text=gStrings['autoRefresh'][self.lan],
            command=lambda var=auto_refresh_ins: self.onAutoRefreshInstance(var
                                                                            ))
        self.auto_refresh_btn.pack(side=tk.LEFT, padx=(15, 0))
        self.auto_refresh_entry = ttk.Entry(sel_frm,
                                            width=3,
                                            justify=tk.CENTER,
                                            textvariable=auto_refresh_ins)
        self.auto_refresh_entry.pack(side=tk.LEFT, padx=(8, 0))

        self.onInstanceSelected()
# }}}

    def onDeviceSelected(self, *args):  # {{{
        inses = self.tcp.command('getInstaces', self.device_list.get())
        values = ('<NONE>', )
        if len(inses) > 0:
            values = inses.split(';')
        self.ins_list['values'] = values
        self.ins_list.current(0)
        self.onInstanceSelected()
# }}}

    def onAutoRefreshInstance(self, var):  # {{{
        # refresh thread
        def _refresh_thread(delay):
            while not self.stop_auto_refresh:
                #  self.onInstanceSelected() # blinking because fresh by thread.
                self.manual_refresh_btn.invoke()
                time.sleep(delay)

        if self.sw_auto_refresh == 0:
            self.stop_auto_refresh = False
            threading.Thread(target=_refresh_thread,
                             args=(var.get(), )).start()
            self.auto_refresh_btn.configure(
                text=gStrings['stopRefresh'][self.lan])
            self.auto_refresh_entry.configure(state=tk.DISABLED)
            self.sw_auto_refresh = 1
        else:
            self.stop_auto_refresh = True
            self.auto_refresh_btn.configure(
                text=gStrings['autoRefresh'][self.lan])
            self.auto_refresh_entry.configure(state=tk.NORMAL)
            self.sw_auto_refresh = 0
# }}}

    def onInstanceSelected(self, *args):  # {{{
        try:
            self.pro_frm.destroy()
            del self.curslot_vars
        except Exception as e:
            print("don't worry, that's ok!")
        self.pro_frm = ttk.Frame(self.dev_tab)
        slots = ()
        self.curslot_vars = {}
        result = self.tcp.command('getSlots', self.device_list.get())
        if len(result) > 0:
            slots = result.split(';')

        j = 0
        for pro in slots:
            ttk.Label(self.pro_frm,
                      text=pro,
                      anchor=tk.CENTER,
                      relief=tk.GROOVE,
                      width=15).grid(row=1,
                                     column=j,
                                     columnspan=2,
                                     pady=(10, 10),
                                     padx=(5, 5))
            uuid = self.ins_list.get()
            if uuid != '<NONE>':
                self.curslot_vars[pro] = tk.StringVar()
                val = self.tcp.command('getInstanceValue', uuid, pro)
                if not val.strip():
                    val = 'null'
                self.curslot_vars[pro].set(val)
                ttk.Entry(
                    self.pro_frm,
                    width=10,
                    font=('Arial', 12),
                    justify=tk.CENTER,
                    textvariable=self.curslot_vars[pro],
                ).grid(row=2, column=j, columnspan=2, pady=(10, 10))
                ttk.Button(
                    self.pro_frm,
                    width=5,
                    text=gStrings['setVal'][self.lan] + 'R',
                    command=lambda u=uuid, p=pro: self.onUpdateValue(
                        'setR', u, p),
                ).grid(row=3, column=j, pady=5, padx=2, sticky=tk.E)
                ttk.Button(
                    self.pro_frm,
                    width=5,
                    text=gStrings['getVal'][self.lan] + 'R',
                    command=lambda u=uuid, p=pro: self.onUpdateValue(
                        'getR', u, p),
                ).grid(row=4, column=j, pady=5, padx=2, sticky=tk.E)
                ttk.Button(
                    self.pro_frm,
                    width=5,
                    text=gStrings['setVal'][self.lan] + 'D',
                    command=lambda u=uuid, p=pro: self.onUpdateValue(
                        'setD', u, p),
                ).grid(row=3, column=j + 1, pady=5, padx=2, sticky=tk.W)
                ttk.Button(
                    self.pro_frm,
                    width=5,
                    text=gStrings['getVal'][self.lan] + 'D',
                    command=lambda u=uuid, p=pro: self.onUpdateValue(
                        'getD', u, p),
                ).grid(row=4, column=j + 1, pady=5, padx=2, sticky=tk.W)
            j += 2
        self.pro_frm.pack()
# }}}

    def onUpdateValue(self, target, uuid, pro):  # {{{
        if target == 'setR':
            self.tcp.command('updateInstanceValue', uuid, pro,
                             self.curslot_vars[pro].get())
        elif target == 'setD':
            self.tcp.command('updateDeviceValue', uuid, pro,
                             self.curslot_vars[pro].get())
        elif target == 'getR':
            val = self.tcp.command('getInstanceValue', uuid, pro)
            if not val.strip():
                val = 'null'
            self.curslot_vars[pro].set(val)
        elif target == 'getD':
            val = self.tcp.command('getDeviceValue', uuid, pro)
            if not val.strip():
                val = 'null'
            self.curslot_vars[pro].set(val)
        else:
            print('unkown target:', target)
# }}}

    def onRefreshRules(self):  # {{{
        result = self.tcp.command('getRules')
        rules = ('<NONE>', )
        if len(result) > 0:
            rules = result.split(';')
        self.rule_list['values'] = rules
        self.rule_list.current(0)
        self.onRuleSelected()
# }}}

    def onRuleSelectText(self, event):
        self.rule_text.tag_add(tk.SEL, "1.0", tk.END)
        return 'break'

    def onRuleCommit(self):  # {{{
        name = self.rule_list.get()
        doc = self.rule_text.get(0.0, tk.END)
        self.tcp.command('commitRuleScript', name, doc.strip())
        #  self.rule_refresh_btn.invoke()
# }}}

    def onRuleDeleteDialog(self):  # {{{
        width = 320
        height = 120
        self.rule_dialog = tk.Toplevel()
        self.rule_dialog.title(gStrings['delruletitle'][self.lan])
        alignstr = '%dx%d+%d+%d' % (width, height,
                                    (self.screenwidth - width) / 2,
                                    (self.screenheight - height) / 2)
        self.rule_dialog.geometry(alignstr)
        dialog_frm = ttk.Frame(self.rule_dialog,
                               padding=10,
                               width=width,
                               height=height)
        ttk.Label(
            dialog_frm,
            text=gStrings['delete'][self.lan],
        ).grid(row=1, padx=(5, 2))
        ttk.Label(
            dialog_frm,
            font=('Arial', 14),
            text=self.rule_list.get() + " ?",
        ).grid(row=1, column=1, columnspan=2, padx=(0, 2))
        ttk.Button(dialog_frm,
                   text=gStrings['confirm'][self.lan],
                   command=lambda: self.onClickConfirm('delrule')).grid(
                       row=3, column=1, padx=12, pady=(20, 20))
        ttk.Button(dialog_frm,
                   text=gStrings['cancel'][self.lan],
                   command=lambda: self.onClickCancel('delrule')).grid(
                       row=3, column=2, padx=12, pady=(20, 20))
        dialog_frm.pack(side=tk.TOP, anchor=tk.CENTER, fill=tk.X)
# }}}

    def onRuleSelected(self, *args):  # {{{
        ruleId = self.rule_list.get()
        doc = self.tcp.command('getRuleScript', ruleId)
        if doc:
            self.rule_text.delete(0.0, tk.END)
            self.rule_text.insert(0.0, doc)
            sw = self.tcp.command('getRuleSwitch', ruleId)
            if sw == '1':
                self.rule_switch_var.set(gStrings['stop'][self.lan])
            else:
                self.rule_switch_var.set(gStrings['start'][self.lan])
# }}}

    def onRuleSwitch(self):  # {{{
        ruleId = self.rule_list.get()
        val = self.rule_switch_var.get()
        if val == gStrings['stop'][self.lan]:
            self.tcp.command('switchRule', ruleId, 'false')
        else:
            self.tcp.command('switchRule', ruleId, 'true')
        time.sleep(0.2)
        self.onRuleSelected()
# }}}

    def onRuleNewDialog(self):  # {{{
        width = 300
        height = 160
        self.rule_dialog = tk.Toplevel()
        self.rule_dialog.title(gStrings['newruletitle'][self.lan])
        alignstr = '%dx%d+%d+%d' % (width, height,
                                    (self.screenwidth - width) / 2,
                                    (self.screenheight - height) / 2)
        self.rule_dialog.geometry(alignstr)
        self.rule_newn_var.set('rul-')
        dialog_frm = ttk.Frame(self.rule_dialog,
                               padding=10,
                               width=width,
                               height=height)
        ttk.Label(
            dialog_frm,
            text=gStrings['rulePrompt'][self.lan],
            foreground=gColors['SlateBlue'],
        ).grid(row=0, column=1, columnspan=2, sticky=tk.E)
        ttk.Label(
            dialog_frm,
            text=gStrings['filename'][self.lan],
        ).grid(row=1, sticky=tk.E)
        ttk.Entry(
            dialog_frm,
            font=('Arial', 14),
            textvariable=self.rule_newn_var,
        ).grid(row=1, column=1, columnspan=2, sticky=tk.W)
        ttk.Button(dialog_frm,
                   text=gStrings['confirm'][self.lan],
                   command=lambda: self.onClickConfirm('newrule')).grid(
                       row=3, column=1, padx=12, pady=(20, 20))
        ttk.Button(dialog_frm,
                   text=gStrings['cancel'][self.lan],
                   command=lambda: self.onClickCancel('newrule')).grid(
                       row=3, column=2, padx=12, pady=(20, 20))
        dialog_frm.pack(side=tk.TOP, anchor=tk.CENTER)
# }}}

    def onRuleNew(self, who):  # {{{
        if self.rule_btm_sw == 0:
            # new rule
            self.onRuleNewDialog()
            self.rule_list.configure(state=tk.DISABLED)
            self.rule_ci_btn.configure(state=tk.DISABLED)
            self.rule_refresh_btn.configure(state=tk.DISABLED)
            self.rule_newn_entry.configure(state=tk.NORMAL)
            self.rule_newn_btn.configure(text=gStrings['save'][self.lan])
            self.rule_text.delete(0.0, tk.END)
            self.rule_btm_sw = 1
            return

        # save rule
        if who == 'save':
            name = self.rule_newn_entry.get()
            doc = self.rule_text.get(0.0, tk.END)
            self.tcp.command('commitRuleScript', name, doc)
            time.sleep(1)  # wait save cmd finished

        self.rule_list.configure(state=tk.NORMAL)
        self.rule_ci_btn.configure(state=tk.NORMAL)
        self.rule_refresh_btn.configure(state=tk.NORMAL)
        self.rule_newn_entry.configure(state=tk.DISABLED)
        self.rule_cancel_btn.forget()
        self.rule_newn_var.set('')
        self.rule_newn_btn.configure(text=gStrings['new'][self.lan])
        self.rule_btm_sw = 0

        self.rule_refresh_btn.invoke()
# }}}

    def onClickDebugListBox(self, event):  # {{{
        index = event.widget.nearest(event.y)
        self.filter_key.set('clips_')
        self.tcp.command("printItem", self.debug_items[index])
# }}}

    def onClickConfirm(self, who):  # {{{
        if who == 'newrule':
            rule_id = self.rule_newn_var.get()
            self.rule_text.insert(0.0, gFormatRuleStr % (rule_id, rule_id))
            self.rule_cancel_btn.pack(side=tk.RIGHT, padx=(10, 10))
            self.rule_dialog.destroy()
            return

        if who == 'delrule':
            self.tcp.command('deleteRuleScript', self.rule_list.get())
            time.sleep(1)  # wait delete cmd finished
            self.rule_dialog.destroy()
            self.rule_refresh_btn.invoke()
            return

        if who == 'assert':
            fact = self.assert_var.get()
            if fact[0] != '(' or fact[-1] != ')':
                fact = "(" + fact + ")"
            self.tcp.command('assertFact', fact)
            self.cmd2_display.set(self.cmd1_display.get())
            self.cmd1_display.set(fact)
            return

# }}}

    def onClickCancel(self, who):  # {{{
        if who == 'newrule':
            self.rule_newn_var.set('')
            self.rule_dialog.destroy()
            self.onRuleNew('cancel')
            return

        if who == 'delrule':
            self.rule_dialog.destroy()
            return
# }}}

    def onClickQuit(self, who):  # {{{
        if who == 'logprint':
            self.print_dialog.destroy()
            self.filter_key.set('')
            return
# }}}

    def createSceneAutoView(self, tab):  # {{{
        mode_frm = ttk.Frame(tab)
        mode_frm.pack(anchor=tk.W)

        ttk.Label(mode_frm,
                  text=gStrings['modeTrigger'][self.lan],
                  foreground=gColors['Tomato'],
                  font=('Arial', 14)).pack(side=tk.LEFT)

        modes_list_frm = ttk.Frame(tab)
        modes_list_frm.pack(anchor=tk.CENTER)

        scenes = (('comehome', 'leavehome', 'entermovie', 'exitmovie',
                   'sleepmode', 'getupmode'), )
        i = 0
        for ms in scenes:
            for j in range(0, 6):
                btn = ttk.Button(
                    modes_list_frm,
                    width=10,
                    text=gStrings[ms[j]][self.lan],
                    command=lambda m=ms[j]: self.onSceneSelected(m))
                btn.grid(row=i, column=j, padx=(10, 20), pady=(20, 10))
            i += 1

        fact_frm = ttk.Frame(tab)
        fact_frm.pack(anchor=tk.W)

        ttk.Label(fact_frm,
                  text=gStrings['factTrigger'][self.lan],
                  foreground=gColors['Tomato'],
                  font=('Arial', 14)).pack(side=tk.LEFT)

        fact_stmt_frm = ttk.Frame(tab)
        fact_stmt_frm.pack(anchor=tk.CENTER)

        self.assert_var = tk.StringVar()
        ttk.Entry(
            fact_stmt_frm,
            font=('Arial', 14),
            width=50,
            textvariable=self.assert_var,
        ).grid(row=1, column=1, sticky=tk.W)
        ttk.Button(fact_stmt_frm,
                   text=gStrings['assert'][self.lan],
                   command=lambda: self.onClickConfirm('assert')).grid(
                       row=1, column=2, padx=20)

        cmd_rec_frm = ttk.Frame(tab, width=self.width)
        cmd_rec_frm.pack(side=tk.BOTTOM, fill=tk.X)
        self.cmd1_display = tk.StringVar()
        self.cmd2_display = tk.StringVar()
        ttk.Label(
            cmd_rec_frm,
            textvariable=self.cmd1_display,
            foreground=gColors['Black'],
            font=('Arial', 12),
            borderwidth=0,
            padding=2,
            anchor=tk.W,
        ).pack(side=tk.RIGHT)
        ttk.Label(
            cmd_rec_frm,
            textvariable=self.cmd2_display,
            foreground=gColors['Gray'],
            font=('Arial', 12),
            borderwidth=0,
            padding=2,
            anchor=tk.E,
        ).pack(side=tk.LEFT)
# }}}

    def onSceneSelected(self, mode):  # {{{
        fact = "(scene-enter room1 " + mode + ")"
        self.tcp.command('assertFact', fact)
        self.cmd2_display.set(self.cmd1_display.get())
        self.cmd1_display.set(fact)
Ejemplo n.º 5
0
    def run(self):
        SOCK_CLOSE_STATE = 1
        SOCK_OPENTRY_STATE = 2
        SOCK_OPEN_STATE = 3
        SOCK_CONNECTTRY_STATE = 4
        SOCK_CONNECT_STATE = 5

        idle_state = 1
        datasent_state = 2

        sys.stdout.write('thread for %r ' % self.serverip)
        sys.stdout.write('is starting\r\n')

        # TCPClient instance creation

        client = TCPClient(2, self.serverip, self.serverport)
        filename = self.serverip + '_log.txt'

        #print(filename)
        IsTimeout = 0

        self.f = open(filename, 'w+')

        while True:
            if client.state is SOCK_CLOSE_STATE:
                cur_state = client.state
                client.state = client.open()
                if client.state != cur_state:
                    sys.stdout.write('client.state is %r\r\n' % client.state)
                time.sleep(1)

            elif client.state is SOCK_OPEN_STATE:
                cur_state = client.state
                client.state = client.connect()
                if client.state != cur_state:
                    sys.stdout.write('client.state is %r\r\n' % client.state)
                time.sleep(1)

            elif client.state is SOCK_CONNECT_STATE:
                if client.working_state == idle_state:
                    try:
                        client.write(msg)
                        client.working_state = datasent_state
                        self.istimeout = 0
                        self.totaltrycount += 1

                        self.timer1 = threading.Timer(5.0, self.myTimer)
                        self.timer1.start()
                    except Exception as e:
                        sys.stdout.write('%r\r\n' % e)
                elif client.working_state == datasent_state:
                    response = client.readline()
                    if (response != ""):
                        sys.stdout.write(response)
                        sys.stdout.write('\n')
                        sys.stdout.flush()
                        self.timer1.cancel()
                        self.istimeout = 0

                        if (msg in response):
                            logstr = '[' + self.serverip + ']' + strftime(
                                "%d %b %Y %H:%M:%S",
                                localtime()) + ': success\r\n'
                            sys.stdout.write(logstr)
                            self.successcount += 1
                            time.sleep(10)
                            client.working_state = idle_state
                        else:
                            logstr = '[' + self.serverip + ']' + strftime(
                                "%d %b %Y %H:%M:%S",
                                localtime()) + ': fail by broken data\r\n'
                            sys.stdout.write(logstr)
                            self.failcount += 1
                            self.f.write(logstr)
                            self.f.write("\r\n")
                            time.sleep(10)
                            client.working_state = idle_state

                    if self.istimeout is 1:
                        self.timer1.cancel()
                        self.istimeout = 0
                        logstr = '[' + self.serverip + ']' + strftime(
                            "%d %b %Y %H:%M:%S",
                            localtime()) + ': fail by timeout\r\n'
                        sys.stdout.write(logstr)
                        self.failcount += 1
                        self.f.write(logstr)
                        self.f.write("\r\n")
                        time.sleep(5)
                        client.working_state = idle_state

                    response = ""
class comthread(threading.Thread):
    def __init__(self, id, dst_ip):
        threading.Thread.__init__(self)
        self.exitflag = False
        self.bank = 0
        self.id = id
        self.alive = True
        self.command = idle_msg
        self.dst_ip = dst_ip
        self.outputs = []
        self.is_request = False
        self.is_start = False
        self.timer1 = None

        if (id % 4) is 0:
            self.dst_port = 5001
            self.power_port = 0
            self.switch_port = 4
            self.redled_port = 8
            self.blueled_port = 9
        elif (id % 4) is 1:
            self.dst_port = 5002
            self.power_port = 1
            self.switch_port = 5
            self.redled_port = 10
            self.blueled_port = 11
        elif (id % 4) is 2:
            self.dst_port = 5003
            self.power_port = 3
            self.switch_port = 7
            self.redled_port = 14
            self.blueled_port = 15
        elif (id % 4) is 3:
            self.dst_port = 5004
            self.power_port = 2
            self.switch_port = 6
            self.redled_port = 12
            self.blueled_port = 13

        lastnumindex = dst_ip.rfind('.')
        lastnum = int(dst_ip[lastnumindex + 1:len(dst_ip)])

        self.module_ip = dst_ip[:lastnumindex + 1] + str(lastnum + id +
                                                         1) + "\r"
        # sys.stdout.write('module ip: %r\n' % self.module_ip)
        self.client = TCPClient(2, self.dst_ip, self.dst_port)

    def stop(self):
        sys.stdout.write('[ComThread %r] ' % self.id)
        sys.stdout.write('is shutdowning\r\n')
        if self.client is not None:
            self.client.close()

        if self.timer1 is not None:
            self.timer1.cancel()
        self.alive = False

    def run(self):
        sys.stdout.write('[ComThread %r] Hello\r\n' % self.id)
        #		self.client.open()

        while self.alive:
            if self.client.state is SOCK_CLOSE_STATE:
                cur_state = self.client.state
                self.client.state = self.client.open()
#				if self.client.state != cur_state:
#					print(self.client.state)

            elif self.client.state is SOCK_OPEN_STATE:
                cur_state = self.client.state
                self.client.state = self.client.connect()
#				if self.client.state != cur_state:
#					print(self.client.state)

            elif self.client.state is SOCK_CONNECT_STATE:
                if self.client.working_state == idle_state:
                    try:
                        self.outputs.insert(
                            0, [self.power_port, POWER_OFF, 'POWER OFF'])
                        #						sys.stdout.write('>')
                        time.sleep(0.1)
                        # check input switch value
                        self.client.working_state = check_sw_1_state
                        # logger.debug("Waiting SW%r input\r\n" % (switch_port -4))
                    except:
                        time.sleep(1)

                elif self.client.working_state == check_sw_1_state:
                    if (self.command == keypressed_msg):
                        sys.stdout.write(
                            '[ComThread %r] got key pressed message\r\n' %
                            self.id)
                        self.command = idle_msg
                        self.client.working_state = check_sw_2_state

                elif self.client.working_state == check_sw_2_state:
                    if (self.command == keyreleased_msg):
                        sys.stdout.write(
                            '[ComThread %r] got keyreleased message\r\n' %
                            self.id)
                        self.command = idle_msg
                        self.client.working_state = ready_state

                elif self.client.working_state == ready_state:
                    try:
                        self.outputs.insert(
                            0, [self.redled_port, LED_OFF, 'RED LED OFF'])
                        self.outputs.insert(
                            0, [self.blueled_port, LED_OFF, 'BLUE LED OFF'])
                        self.outputs.insert(
                            0, [self.power_port, POWER_ON, 'POWER ON'])
                        self.outputs.insert(
                            0, [self.redled_port, LED_ON, 'RED LED ON'])
                        self.outputs.insert(
                            0, [self.redled_port, LED_OFF, 'RED LED OFF'])

                        self.client.working_state = gout_1_state
                        sys.stdout.write('timer1 start\r\n')
                        self.timer1 = threading.Timer(10.0, timeoutfunc)
                        IsTimeout = 0
                        self.timer1.start()
                    except Exception as e:
                        sys.stdout.write('%r\r\n' % e)
                        sys.stdout.write('timer1 stop\r\n')
                        self.timer1.cancel()
                        time.sleep(1)

                elif self.client.working_state == gout_1_state:
                    if (len(self.outputs) == 0):
                        self.client.working_state = init_state
                        sys.stdout.write('\r\ninit_state\r\n')
                    else:
                        time.sleep(0.5)

                    if IsTimeout is 1:
                        # self.timer1.cancel()
                        self.client.outputs.remove()
                        self.client.working_state = idle_state

                elif self.client.working_state == init_state:
                    response = self.client.readline()
                    # logger.debug("[init_state] [%r] %r" % (len(response), response))
                    if (response != ""):
                        sys.stdout.write(response)
                        # sys.stdout.flush()
                        if ("9: Load Boot Loader code then write to Flash via TFTP."
                                in response):
                            self.client.write("2")
                            # print 'timer1 stop'
                            self.timer1.cancel()
                            self.client.working_state = menuselect_state

                            sys.stdout.write('\r\nmenuselect_state\r\n')
                            self.timer1 = threading.Timer(3.0, timeoutfunc)
                            IsTimeout = 0
                            self.timer1.start()
                    response = ""

                    if IsTimeout is 1:
                        sys.stdout.write("init_state timeout")
                        self.timer1.cancel()
                        self.client.working_state = fail_state
                        sys.stdout.write('\r\nfail_state\r\n')

                elif self.client.working_state == menuselect_state:
                    response = self.client.readline()
                    if (response != ""):
                        sys.stdout.write(response)
                        # sys.stdout.flush()
                        if ("Warning!! Erase Linux in Flash then burn new one. Are you sure?(Y/N)"
                                in response):
                            self.client.write("Y")

                            self.timer1.cancel()
                            self.client.working_state = flasherase_state
                            # sys.stdout.write('\r\nflasherase_state\r\n')

                            self.timer1 = threading.Timer(3.0, timeoutfunc)
                            IsTimeout = 0
                            self.timer1.start()
                        elif ("3: System Boot system code via Flash"
                              in response):
                            self.timer1.cancel()
                            self.client.working_state = fail_state
                            sys.stdout.write('\r\nfail_state\r\n')

                            self.timer1 = threading.Timer(3.0, timeoutfunc)
                            IsTimeout = 0
                            self.timer1.start()

                    response = ""

                    if IsTimeout is 1:
                        sys.stdout.write("menuselect_state timeout")
                        self.timer1.cancel()
                        self.client.working_state = fail_state
                        sys.stdout.write('\r\nfail_state\r\n')

                elif self.client.working_state == flasherase_state:
                    response = self.client.readline()
                    if (response != ""):
                        sys.stdout.write(response)
                        # sys.stdout.flush()
                        if ("Input device IP (10.10.10.123)" in response):
                            for i in range(12):
                                self.client.write("\b \b")
                                time.sleep(0.1)
                            self.timer1.cancel()
                            self.client.working_state = localIP_state
                            # sys.stdout.write('\r\nlocalIP_state\r\n')
                            self.timer1 = threading.Timer(3.0, timeoutfunc)
                            IsTimeout = 0
                            self.timer1.start()
                        response = ""

                    if IsTimeout is 1:
                        sys.stdout.write("flasherase_state timeout")
                        self.timer1.cancel()
                        self.client.working_state = fail_state
                        sys.stdout.write('\r\nfail_state\r\n')

                elif self.client.working_state == localIP_state:

                    response = self.client.readline()
                    if (response != ""):
                        sys.stdout.write(response)
                        # sys.stdout.flush()
                        response = ""
                        self.timer1.cancel()
                        self.client.write(self.module_ip)
                        self.client.working_state = localIP2_state
                        # sys.stdout.write('\r\nlocalIP2_state\r\n')

                        self.timer1 = threading.Timer(3.0, timeoutfunc)
                        IsTimeout = 0
                        self.timer1.start()
                        response = ""

                    if IsTimeout is 1:
                        sys.stdout.write("localIP_state timeout")
                        self.timer1.cancel()
                        self.client.working_state = fail_state
                        sys.stdout.write('\r\nfail_state\r\n')

                elif self.client.working_state == localIP2_state:

                    response = self.client.readline()
                    if (response != ""):
                        sys.stdout.write(response)
                        # sys.stdout.flush()

                        self.timer1.cancel()
                        self.client.working_state = localIPDone_state
                        # sys.stdout.write('\r\nlocalIPDone_state\r\n')
                        self.timer1 = threading.Timer(3.0, timeoutfunc)
                        IsTimeout = 0
                        self.timer1.start()

                        response = ""

                    if IsTimeout is 1:
                        sys.stdout.write("localIP2_state timeout")
                        self.timer1.cancel()
                        self.client.working_state = fail_state
                        sys.stdout.write('\r\nfail_state\r\n')

                elif self.client.working_state == localIPDone_state:
                    response = self.client.readline()
                    if (response != ""):
                        sys.stdout.write(response)
                        # sys.stdout.flush()
                        if ("Input server IP (10.10.10.3)" in response):
                            for i in range(10):
                                self.client.write("\b \b")
                                time.sleep(0.1)

                            self.timer1.cancel()
                            self.client.working_state = serverIP_state
                            # sys.stdout.write('\r\nserverIP_state\r\n')
                            self.timer1 = threading.Timer(3.0, timeoutfunc)
                            IsTimeout = 0
                            self.timer1.start()

                        response = ""

                    if IsTimeout is 1:
                        sys.stdout.write("localIPDone_state timeout")
                        self.timer1.cancel()
                        self.client.working_state = fail_state
                        sys.stdout.write('\r\nfail_state\r\n')

                elif self.client.working_state == serverIP_state:

                    response = self.client.readline()
                    if (response != ""):
                        sys.stdout.write(response)
                        # sys.stdout.flush()

                        self.client.write("192.168.10.212\r")
                        # self.client.write("192.168.10.235\r")
                        self.timer1.cancel()
                        self.client.working_state = serverIP2_state
                        # sys.stdout.write('\r\nserverIP2_state\r\n')
                        self.timer1 = threading.Timer(3.0, timeoutfunc)
                        IsTimeout = 0
                        self.timer1.start()
                        response = ""

                    if IsTimeout is 1:
                        sys.stdout.write("serverIP_state timeout")
                        self.timer1.cancel()
                        self.client.working_state = fail_state
                        sys.stdout.write('\r\nfail_state\r\n')

                elif self.client.working_state == serverIP2_state:

                    response = self.client.readline()

                    if (response != ""):
                        sys.stdout.write(response)
                        # sys.stdout.flush()
                        self.timer1.cancel()
                        self.client.working_state = checkOrder_state
                        sys.stdout.write('\r\ncheckOrder_state\r\n')
                        self.timer1 = threading.Timer(30.0, timeoutfunc)
                        IsTimeout = 0
                        self.timer1.start()

                        response = ""

                    if IsTimeout is 1:
                        sys.stdout.write("serverIP2_state timeout")
                        self.timer1.cancel()
                        self.client.working_state = fail_state
                        # sys.stdout.write('\r\nfail_state\r\n')

                elif self.client.working_state == checkOrder_state:
                    if self.is_request is False:
                        self.is_request = True
                    else:
                        if self.is_start is True:
                            self.timer1.cancel()
                            self.client.working_state = serverIPDone_state
                            # sys.stdout.write('\r\nserverIPDone_state\r\n')

                    if IsTimeout is 1:
                        sys.stdout.write("checkOrder_state timeout")
                        self.timer1.cancel()
                        self.client.working_state = fail_state
                        self.is_request = False
                        sys.stdout.write('\r\nfail_state\r\n')

                elif self.client.working_state == serverIPDone_state:
                    response = self.client.readline()
                    if (response != ""):
                        sys.stdout.write(response)
                        # sys.stdout.flush()
                        if ("Input Linux Kernel filename ()" in response):
                            self.client.write("std.bin\r")
                            self.client.working_state = filename_state
                            # sys.stdout.write('\r\nfilename_state\r\n')

                        response = ""

                elif self.client.working_state == filename_state:
                    response = self.client.readline()
                    if (response != ""):
                        sys.stdout.write(response)
                        # sys.stdout.flush()
                        # self.timer1.cancel()
                        self.client.working_state = filenameDone_state
                        # sys.stdout.write('\r\nfilenameDone_state\r\n')
                        # self.timer1 = threading.Timer(30.0, timeoutfunc)
                        # IsTimeout = 0
                        # self.timer1.start()
                    response = ""

                    # if IsTimeout is 1:
                    # 	sys.stdout.write("filename_state timeout")
                    # 	self.timer1.cancel()
                    # 	self.client.working_state = fail_state
                    # 	sys.stdout.write('\r\nfail_state\r\n')

                elif self.client.working_state == filenameDone_state:
                    ch = self.client.read()
                    if (ch != ''):
                        self.client.str_list.append(ch)
                        sys.stdout.write("%c" % ch)
                        # sys.stdout.flush()

                        if (ch == '\r'):
                            response = ''.join(self.client.str_list)
                            # sys.stdout.write('[%r-%r]' % (self.bank, self.id))
                            del self.client.str_list[:]
                            if ("done" in response):
                                # self.timer1.cancel()
                                self.client.working_state = tftpDone_state
                                # sys.stdout.write('\r\ntftpDone_state\r\n')
                                self.is_request = False
                                self.is_start = False
                                # self.timer1 = threading.Timer(30.0, timeoutfunc)
                                # IsTimeout = 0
                                # self.timer1.start()
                            elif ("Retry count exceeded; starting again"
                                  in response):
                                self.client.retrycount += 1
                                # logger.debug("retrycount: %r\r\n" % self.client.retrycount)
                                if (self.client.retrycount >= 10):
                                    self.client.retrycount = 0
                                    self.client.working_state = fail_state
                                    sys.stdout.write('\r\nfail_state\r\n')

                            response = ""
                    # if IsTimeout is 1:
                    # 	sys.stdout.write("filenameDone_state timeout")
                    # 	self.timer1.cancel()
                    # 	self.client.working_state = fail_state
                    # 	sys.stdout.write('\r\nfail_state\r\n')

                elif self.client.working_state == tftpDone_state:
                    ch = self.client.read()
                    if (ch != ''):
                        self.client.str_list.append(ch)
                        # if(ch is '#'):
                        # 	sys.stdout.write("%c" % ch)
                        # 	sys.stdout.flush()

                        if (ch == '\r'):
                            response = ''.join(self.client.str_list)
                            # sys.stdout.write(response)
                            sys.stdout.write('%r' % self.id)
                            del self.client.str_list[:]
                            if ("Verifying Checksum ... Bad Data CRC"
                                    in response):
                                # self.timer1.cancel()
                                sys.stdout.write(
                                    'Flashing Failed. Bad CRC\r\n')
                                self.client.write("\r\n\r\n")
                                self.client.working_state = fail_state
                                sys.stdout.write('\r\fail_state\r\n')
                                # self.is_start = False
                                # self.is_request = False
                                # self.timer1 = threading.Timer(10.0, timeoutfunc)
                                # IsTimeout = 0
                                # self.timer1.start()
                            elif ("Verifying Checksum ... OK" in response):
                                self.client.working_state = flashVerified_state
                                sys.stdout.write('\r\nflashverified_state\r\n')

                            response = ""

                elif self.client.working_state == flashVerified_state:
                    ch = self.client.read()
                    if (ch != ''):
                        self.client.str_list.append(ch)
                        # if(ch is '#'):
                        # 	sys.stdout.write("%c" % ch)
                        # 	sys.stdout.flush()

                        if (ch == '\r'):
                            response = ''.join(self.client.str_list)
                            # sys.stdout.write(response)
                            sys.stdout.write('%r' % self.id)
                            del self.client.str_list[:]
                            if ("Please press Enter to activate this console."
                                    in response):
                                # self.timer1.cancel()
                                sys.stdout.write('enter CRLF \r\n')
                                self.client.write("\r\n\r\n")
                                self.client.working_state = done_state
                                sys.stdout.write('\r\done_state\r\n')
                                # self.is_start = False
                                # self.is_request = False
                                # self.timer1 = threading.Timer(10.0, timeoutfunc)
                                # IsTimeout = 0
                                # self.timer1.start()
                            elif ("failsafe button BTN_1 was pressed"
                                  in response):
                                self.client.working_state = done_state
                                sys.stdout.write('\r\ndone_state\r\n')

                            response = ""

                elif self.client.working_state == done_state:
                    response = self.client.readline()
                    if (response != ""):
                        sys.stdout.write(response)
                        if ("root@" in response):  #Standard
                            # if ("IPS-231-0000 login:"******"\r\n")
                            sys.stdout.flush()
                            self.client.write("\r")
                            sys.stdout.write(
                                "===============================================\n"
                            )
                            sys.stdout.write(
                                " Bank %r, ID %r Firmware Update Succeeded!!!\n"
                                % (self.bank, self.id))
                            sys.stdout.write(
                                "===============================================\n"
                            )
                            sys.stdout.flush()
                            # BLUELED ON (HIGH)

                            # self.timer1.cancel()
                            self.outputs.insert(
                                0, [self.blueled_port, LED_ON, 'BLUE LED ON'])
                            self.outputs.insert(
                                0, [self.power_port, POWER_OFF, 'POWER OFF'])

                            self.client.working_state = gout_2_state
                            sys.stdout.write('\r\ngout_2_state\r\n')
                        elif ("Please press Enter to activate this console."
                              in response):
                            self.client.write("\r\n\r\n")
                        else:
                            self.client.write("\r\n")

                        response = ""

                    # if IsTimeout is 1:
                    # 	sys.stdout.write("done_state timeout")
                    # 	self.timer1.cancel()
                    # 	self.client.working_state = fail_state
                    # 	sys.stdout.write('\r\nfail_state\r\n')

                elif self.client.working_state == fail_state:
                    self.outputs.insert(
                        0, [self.redled_port, LED_ON, 'RED LED ON'])
                    self.outputs.insert(
                        0, [self.power_port, POWER_OFF, 'POWER OFF'])
                    self.client.working_state = gout_2_state
                    sys.stdout.write('\r\ngout_2_state\r\n')

                elif self.client.working_state == gout_2_state:
                    if (len(self.outputs) == 0):
                        logger.debug(
                            "You can remove a module on bank%r now\r\n" %
                            self.id)
                        self.client.working_state = idle_state
                        sys.stdout.write('\r\nidle_state\r\n')

        sys.stdout.write('[ComThread %r] Bye! \r\n' % self.id)
        self.client.close()