Esempio n. 1
0
    def openMap(self):

        # topLevel method is to open new window

        mapWindow = Toplevel(self.master)

        self.mapWindow = mapWindow
        # mapWindow.attributes('-fullscreen', True)
        toplevel = mapWindow.winfo_toplevel()
        # toplevel.wm_state('zoomed')

        mapWindow.bind('<Escape>', self.toggleFullScreen)

        # Frames for map window
        mapWindowTop = Frame(mapWindow)
        mapWindowTop.pack(side=TOP)
        mapWindowBottom = Frame(mapWindow)
        mapWindowBottom.pack()
        # mapWindowBottom.bind('<Configure>', self.resizeImage)

        self.admincanvas = ResizingCanvas(mapWindowBottom,
                                          width=400,
                                          height=400,
                                          bg="grey")
        self.admincanvas.pack()
        self.admincanvas.bind_all("<MouseWheel>", self._on_mousewheel)

        self.mapWindow.protocol('WM_DELETE_WINDOW', self.closeInstallerMap)

        # Buttons for map window
        buttonwidth = 20
        b1 = Button(mapWindowTop,
                    text="Upload",
                    command=self.uploadImage,
                    width=buttonwidth)
        b1.grid(row=0, column=0, sticky=W)

        try:
            # row = self.tableImage.all().next()
            # self.openImage(row["imageName"],self.admincanvas)
            self.openImage(self.admincanvas)
        except:
            print "No map found!"

        for item in self.table:
            if item['coordx'] != None and item['coordy'] != None:
                Point(self.table, self.admincanvas,
                      (item['coordx'], item['coordy']), item['repeater'],
                      item['name'])
Esempio n. 2
0
    def openGuardMap(self, rightFrame):

        # Uneditable Map
        self.guardcanvas = ResizingCanvas(rightFrame,
                                          width=400,
                                          height=400,
                                          bg="grey")
        self.guardcanvas.pack()
        self.guardcanvas.bind_all("<MouseWheel>", self._on_mousewheel)
        self.guardcanvas.bind("<ButtonPress-1>", self._on_press)

        # if self.tableImage.count() != 0:
        # row = self.tableImage.all().next()
        # self.openImage(row["imageName"],self.guardcanvas)
        if self.tablePicture.count() != 0:
            self.openImage(self.guardcanvas)
        self.houses = []

        self.x_error = 0
        self.y_error = 0

        self.updateGuardMap()
Esempio n. 3
0
    def openMap(self):
        
        # topLevel method is to open new window
        
        mapWindow = Toplevel(self.master)

        self.mapWindow = mapWindow
        # mapWindow.attributes('-fullscreen', True)
        toplevel = mapWindow.winfo_toplevel()
        # toplevel.wm_state('zoomed')
        
        
        mapWindow.bind('<Escape>',self.toggleFullScreen)

        # Frames for map window
        mapWindowTop = Frame(mapWindow)
        mapWindowTop.pack(side=TOP)
        mapWindowBottom = Frame(mapWindow)
        mapWindowBottom.pack()
        # mapWindowBottom.bind('<Configure>', self.resizeImage)

        self.admincanvas = ResizingCanvas(mapWindowBottom,width=400, height=400, bg="grey")
        self.admincanvas.pack()
        self.admincanvas.bind_all("<MouseWheel>", self._on_mousewheel)

        self.mapWindow.protocol('WM_DELETE_WINDOW', self.closeInstallerMap)

        # Buttons for map window
        buttonwidth = 20
        b1 = Button(mapWindowTop,text="Upload" ,command=self.uploadImage , width=buttonwidth)
        b1.grid(row=0,column=0, sticky=W)

        try:
            # row = self.tableImage.all().next()
            # self.openImage(row["imageName"],self.admincanvas)
            self.openImage(self.admincanvas)
        except:
            print "No map found!"

        for item in self.table:
            if item['coordx'] != None and item['coordy'] != None:
                Point(self.table, self.admincanvas, (item['coordx'], item['coordy']), item['repeater'],item['name'])
Esempio n. 4
0
    def openGuardMap(self, rightFrame):

        # Uneditable Map
        self.guardcanvas = ResizingCanvas(rightFrame,width=400, height=400, bg="grey")
        self.guardcanvas.pack()
        self.guardcanvas.bind_all("<MouseWheel>", self._on_mousewheel)
        self.guardcanvas.bind("<ButtonPress-1>", self._on_press)

        # if self.tableImage.count() != 0:
            # row = self.tableImage.all().next()
            # self.openImage(row["imageName"],self.guardcanvas)
        if self.tablePicture.count() != 0:
            self.openImage(self.guardcanvas)
        self.houses = []


        self.x_error = 0
        self.y_error = 0

        self.updateGuardMap()
Esempio n. 5
0
    def openGuardMap(self, rightFrame):

        # Uneditable Map
        self.guardcanvas = ResizingCanvas(rightFrame,width=400, height=400, bg="grey")
        self.guardcanvas.pack()
        self.guardcanvas.bind_all("<MouseWheel>", self._on_mousewheel)
        self.guardcanvas.bind("<ButtonPress-1>", self._on_press)


        # if self.tableImage.count() != 0:
            # row = self.tableImage.all().next()
            # self.openImage(row["imageName"],self.guardcanvas)
        if self.tablePicture.count() != 0:
            self.openImage('abc', self.guardcanvas)
        self.houses = []

        for item in self.table:
            self.mlb.insert(END, (item['repeater'], item['name'], item['address']))
            if item['coordx'] != None and item['coordy'] != None:
                self.houses.append(Point(self.table, self.guardcanvas, (item['coordx'], item['coordy']), item['repeater'],item['name']))

        self.x_error = 0
        self.y_error = 0
Esempio n. 6
0
class GuiPart:
    def __init__(self, master, queue, endCommand, send):
        self.master = master
        self.queue = queue
        self.endCommand = endCommand
        self.send = send
        self.repeater = None
        self.current = None
        self.listen = False
        self.initPosition = "+250+50"
        self.db_file = "mydatabase.db"
        self.initDB()
        self.logger("Program startup properly..\n")

        toplevel = master.winfo_toplevel()
        toplevel.wm_state('zoomed')

        self.centralId = "00000001"
        self.do_blink = False
        self.isOpenPanicDialog = False
        self.panicdlg = None

        # Add default admin user and password
        if self.tableUsers.count() == 0:
            self.tableUsers.insert(
                dict(username="******", password="******", role=""))

        # Set up the GUI
        master.title("DF Panic Alarm")
        # master.overrideredirect(True)
        w, h = master.winfo_screenwidth(), master.winfo_screenheight()
        # master.attributes('-fullscreen', True)
        master.geometry("%dx%d+0+0" % (w, h))

        # create a toplevel menu
        menubar = Menu(master)

        # manage
        manageMenu = Menu(menubar, tearoff=0)
        manageMenu.add_command(label="Admin",
                               command=lambda: self.addUsers(master))
        manageMenu.add_command(label="Installer",
                               command=lambda: self.openInstaller())
        menubar.add_cascade(label="Manage", menu=manageMenu)

        # view
        menubar.add_command(label="New Alarms",
                            command=lambda: PanicDialog(master, self))
        menubar.add_command(label="All Alarms",
                            command=lambda: ConfirmedPanicDialog(master))
        # display the menu
        master.config(menu=menubar)

        master.protocol('WM_DELETE_WINDOW', self.on_exit)

        # Paned window
        paned = PanedWindow(master,
                            orient=HORIZONTAL,
                            showhandle=0,
                            handlepad=0,
                            handlesize=0,
                            sashwidth=5,
                            opaqueresize=1,
                            bg="grey")
        paned.pack(side=LEFT, expand=YES, fill=BOTH)
        leftFrame = Frame(paned, border=0)
        rightFrame = Frame(paned)
        paned.add(leftFrame, minsize=16)
        paned.add(rightFrame, minsize=16)

        self.hbar = Scrollbar(rightFrame, orient=HORIZONTAL)
        self.hbar.pack(side=BOTTOM, fill=X)
        self.vbar = Scrollbar(rightFrame, orient=VERTICAL)
        self.vbar.pack(side=RIGHT, fill=Y)

        self.openGuardMap(rightFrame)

        # Listbox for details
        self.mlb = guardMultiListBox.MultiListbox(
            leftFrame, (('RepeaterID', 15), ('Name', 20), ('Address', 30)),
            self.selectedlistbox)
        # for i in range(1000):
        #     mlb.insert(END, ('Important Message: %d' % i, 'John Doe', '10/10/%04d' % (1900+i)))
        self.mlb.pack(expand=YES, fill=BOTH)

        for item in self.table:
            self.mlb.insert(END,
                            (item['repeater'], item['name'], item['address']))

        row = self.tableConfig.find_one(type='map')
        if row:
            self.resizeImage(self.guardcanvas, row['map_width'],
                             row['map_height'])

        self.checkPanic()

    def initDB(self):
        self.table = db['repeater']
        self.tableImage = db['image']
        self.tableLog = db['log']
        self.tableUsers = db['users']
        self.tablePanic = db['panic']
        self.tableHistory = db['history']
        self.tableConfig = db['config']

        self.tablePanic.create_column('time', sqlalchemy.Integer)
        self.tablePanic.create_column('repeater', sqlalchemy.String)
        self.tablePanic.create_column('acknowledged', sqlalchemy.String)

        self.tableHistory.create_column('time', sqlalchemy.Integer)
        self.tableHistory.create_column('repeater', sqlalchemy.String)
        self.tableHistory.create_column('acknowledged', sqlalchemy.String)

        self.table.create_column('repeater', sqlalchemy.String)
        self.table.create_column('name', sqlalchemy.String)
        self.table.create_column('address', sqlalchemy.String)
        self.table.create_column('phone', sqlalchemy.String)
        self.initPictureTable()

    def initPictureTable(self):
        conn = sqlite3.connect(self.db_file)
        # if db_is_new:
        print 'Creating schema'
        sql = '''create table if not exists PICTURE(
        ID INTEGER PRIMARY KEY AUTOINCREMENT,
        PICTURE BLOB,
        TYPE TEXT,
        FILE_NAME TEXT);'''
        conn.execute(sql)  # shortcut for conn.cursor().execute(sql)
        conn.close()
        self.tablePicture = db["PICTURE"]

    def processIncoming(self):
        """
        Handle all the messages currently in the queue (if any).
        """
        while self.queue.qsize():
            try:
                # print 'queue'
                msg = self.queue.get(0)
                # Check contents of message and do what it says
                # As a test, we simply print it
                if msg == "exit":
                    if tkMessageBox.showerror(
                            "Device Not Found!",
                            "Please connect Central Device .."):
                        os._exit(0)
                else:
                    self.decode(msg)
            except Queue.Empty:
                pass

    def decode(self, b):

        m = re.match('.*RA(\w)(.{8})(.{2})?', b)
        if m:
            print m.group(0), 'Cmd:', m.group(1), 'Repeater:', m.group(
                2), 'RSSI: -', m.group(3)

            cmd = m.group(1)
            repeater = m.group(2)
            RSSI = m.group(3)

            if cmd == "I":
                if self.listen == True:

                    msg = "Setting Repeater Central ID = " + repeater + "\n"
                    self.logger(msg)
                    if not self.table.find_one(repeater=repeater):
                        self.l1.insert(END, repeater)
                        self.table.insert(dict(repeater=repeater))

            # elif not (self.centralId == repeater or self.table.find_one(repeater=repeater) or '00000000' == repeater):
            #     print "Alien Discovered", repeater
            #     return

            elif cmd == 'A':
                msg = "Repeater with ID = " + repeater + " has acknowledged..\n"
                self.logger(msg)
            elif cmd == "E":
                msg = "Repeater with ID = " + repeater + " has responded..\n"
                self.logger(msg)
            elif cmd == "C":
                msg = "Repeater with ID = " + repeater + " has finished searching path..\n"
                self.logger(msg)

                if 'searchedPath' in dir(self):
                    self.searchedPath.append(repeater)
                    print self.searchedPath
                    listofRepeaters = self.l1.get(0, END)
                    diff = list(set(listofRepeaters) - set(self.searchedPath))
                    for i in range(len(self.l1.get(0, END))):
                        self.l1.itemconfig(i, {'bg': 'green'})
                    for repeater in diff:
                        index = self.getIndexOfListbox(repeater)
                        self.l1.itemconfig(index, {'bg': 'red'})

                else:
                    self.searchedPath = []
                    self.searchedPath.append(repeater)
            elif cmd == "F":
                msg = "Repeater central ID = " + repeater + " ..\n"
                self.logger(msg)
            elif cmd == "P":
                msg = "Repeater central ID = " + repeater + " PANIC ALARM! \n"
                self.logger(msg)
                # house.isPanic = True
                self.panicAlarm(cmd, repeater)
            elif cmd == "J":
                msg = "Current Central ID= " + repeater + "..\n"
                self.logger(msg)

            elif int(cmd) in range(1, 4):
                msg = "Repeater path " + cmd + " = " + repeater + " ..\n"
                self.logger(msg)

        else:
            print 'Cant decode', b

    def start_blinking(self):
        self.do_blink = True

    def stop_blinking(self):
        self.do_blink = False

    # admin page
    def addUsers(self, master):
        login = LoginDialog(master)
        if login.result == 1:
            adminPage = admin.AdminPage(master, self)

    def logger(self, msg):
        now = time.localtime()
        msg = time.strftime("%y/%m/%d %H:%M", now) + " " + msg
        timeinsec = time.time()
        if 'log' in dir(self):
            self.log.insert(END, msg)
        self.tableLog.insert(dict(time=timeinsec, msg=msg))

    def selectedlistbox(self):
        print 'selected'
        repeaterID = self.mlb.get(self.mlb.curselection())[0]
        self.guardcanvas.itemconfigure("house", fill="black")
        self.guardcanvas.itemconfigure(
            self.findHouseByRepeater(repeaterID).item, fill="yellow")

    def onPointSelect(self, repeater):

        for i in range(self.mlb.size()):
            if repeater == self.mlb.get(i)[0]:
                self.mlb.selection_set(i)

    def sos(self):
        while self.do_blink:
            for i in range(0, 3):
                winsound.Beep(2000, 100)
            for i in range(0, 3):
                winsound.Beep(2000, 400)
            for i in range(0, 3):
                winsound.Beep(2000, 100)
            time.sleep(0.5)

    def panicAlarm(self, cmd, repeater):
        currentTime = time.time()
        self.tablePanic.insert(
            dict(repeater=repeater, time=currentTime, acknowledged="None"))
        print currentTime, repeater
        self.checkPanic()

    def checkPanic(self):

        pendingPanic = db.query(
            'SELECT panic.time, panic.repeater, repeater.name,repeater.address,repeater.phone FROM panic, repeater WHERE panic.repeater = repeater.repeater AND panic.acknowledged=="None"'
        )
        # self.doBlinkThread = dict()
        self.start_blinking()
        for item in pendingPanic:
            house = self.findHouseByRepeater(item['repeater'])
            if house.isPanic == False:
                house.isPanic = True
                self.blink(house.item)
                # self.doBlinkThread[item['repeater']] = threading.Thread(target=lambda:self.blink(house.item))
                # self.doBlinkThread[item['repeater']].start()

        self.sosThread = threading.Thread(target=self.sos)
        self.sosThread.start()

        self.openPanicDlg()

    def openPanicDlg(self):
        print 'openpanic'
        if self.tablePanic.find_one(acknowledged="None"):
            if self.isOpenPanicDialog:
                self.panicdlg.loadPendingAlarm()
            else:
                self.panicdlg = PanicDialog(self.master, self, False)
        self.master.after(20000, lambda: self.openPanicDlg())

    def on_exit(self):
        """When you click to exit, this function is called"""
        if tkMessageBox.askyesno("Exit",
                                 "Do you want to quit the application?"):
            self.logger("Program shutdown properly..\n")
            self.master.destroy()
            self.endCommand()

########################################## INSTALLER WINDOW ################################################

# installer page

    def openInstaller(self):

        result = tkSimpleDialog.askstring("Database Operation",
                                          "Please enter password :"******"dfelectronic123":
            self.addDevicesWindow = Toplevel(self.master)
            # Menubar for addDevices window
            menubar = Menu(self.addDevicesWindow)
            filemenu = Menu(menubar, tearoff=0)
            filemenu.add_command(label="Clear DB", command=self.clearDatabase)
            filemenu.add_separator()
            menubar.add_cascade(label="File", menu=filemenu)
            centralMenu = Menu(menubar, tearoff=0)
            centralMenu.add_command(label="MCU Reset", command=self.mcuReset)
            centralMenu.add_command(label="Check MCU ID",
                                    command=self.mcuIDChecking)
            menubar.add_cascade(label="Central Menu", menu=centralMenu)

            self.addDevicesWindow.config(menu=menubar)

            topFrame = LabelFrame(self.addDevicesWindow,
                                  text="Configure",
                                  padx=5,
                                  pady=5)
            topFrame.pack(side=TOP, fill=BOTH, expand=1)
            middleFrame = LabelFrame(self.addDevicesWindow,
                                     text="Devices",
                                     padx=5,
                                     pady=5)
            middleFrame.pack(side=LEFT, fill=BOTH, expand=1)
            middleFrameRight = LabelFrame(self.addDevicesWindow,
                                          text="Information",
                                          padx=10,
                                          pady=10)
            middleFrameRight.pack(side=LEFT, fill=BOTH, expand=1)
            bottomFrame = LabelFrame(self.addDevicesWindow,
                                     text="Event Log",
                                     padx=5,
                                     pady=5)
            bottomFrame.pack(side=BOTTOM, fill=BOTH, expand=1)
            # Init a frame for whole window

            # Top Frame Buttons
            buttonwidth = 20
            self.b0 = Button(topFrame,
                             text="Listen Mode",
                             command=self.listenMode,
                             width=buttonwidth)
            self.b0.grid(row=0, column=0, sticky=W)
            b1 = Button(topFrame,
                        text="Configure Central ID",
                        command=self.configCentralId,
                        width=buttonwidth)
            b1.grid(row=0, column=1, sticky=W)
            b2 = Button(topFrame,
                        text="Ask Respond",
                        command=self.askRespond,
                        width=buttonwidth)
            b2.grid(row=0, column=2, sticky=W)
            b3 = Button(topFrame,
                        text="Repeater Search Path",
                        command=self.repeaterSearchPath,
                        width=buttonwidth)
            b3.grid(row=0, column=3, sticky=W)
            b4 = Button(topFrame,
                        text="All Repeater Search Path",
                        command=self.allRepeaterSearchPath,
                        width=buttonwidth)
            b4.grid(row=0, column=4, sticky=W)

            # Second Row
            b5 = Button(topFrame,
                        text="Check Central ID",
                        command=self.mcuIDChecking,
                        width=buttonwidth)
            b5.grid(row=1, column=0, sticky=W)
            b6 = Button(topFrame,
                        text="Check Repeater Central ID",
                        command=self.repeaterCheckCentralID,
                        width=buttonwidth)
            b6.grid(row=1, column=1, sticky=W)
            b7 = Button(topFrame,
                        text="Check Repeater Path",
                        command=self.repeaterCheckPath,
                        width=buttonwidth)
            b7.grid(row=1, column=2, sticky=W)
            b8 = Button(topFrame,
                        text="Map",
                        command=lambda: self.openMap(),
                        width=buttonwidth)
            b8.grid(row=1, column=3, sticky=W)
            b9 = Button(topFrame,
                        text="View Old Logs",
                        command=self.openLog,
                        width=buttonwidth)
            b9.grid(row=1, column=4, sticky=W)

            #Initialize variables for UI
            listbox_width = 40

            # Middle Frame
            # Devices and owner information
            scrollbar = Scrollbar(middleFrame)
            self.l1 = Listbox(middleFrame,
                              width=listbox_width,
                              yscrollcommand=scrollbar.set,
                              exportselection=0,
                              height=24)
            self.l1.grid(row=1, column=0)
            self.l1.bind("<<ListboxSelect>>", self.loadEntry)
            scrollbar.grid(row=1, column=1, sticky=N + S)
            scrollbar.config(command=self.l1.yview)
            nameLabel = Label(middleFrameRight, text="Name")
            nameLabel.grid(row=0, column=0)
            self.nameVar = StringVar()
            self.name = Entry(middleFrameRight, textvariable=self.nameVar)
            self.name.grid(row=1, column=0)
            addressLabel = Label(middleFrameRight, text="Address")
            addressLabel.grid(row=2, column=0)
            self.addressVar = StringVar()
            self.address = Entry(middleFrameRight,
                                 textvariable=self.addressVar)
            self.address.grid(row=3, column=0)
            phoneLabel = Label(middleFrameRight, text="Phone")
            phoneLabel.grid(row=4, column=0)
            self.phoneVar = StringVar()
            self.phone = Entry(middleFrameRight, textvariable=self.phoneVar)
            self.phone.grid(row=5, column=0)

            # Middle Frame Buttons
            # b9 = Button(middleFrameRight,text="Load", command=self.loadEntry , width=buttonwidth)
            # b9.grid(row=6,column=0, sticky=W)
            b10 = Button(middleFrameRight,
                         text="Update",
                         command=self.updateEntry,
                         width=buttonwidth)
            b10.grid(row=7, column=0, sticky=W)
            b11 = Button(middleFrameRight,
                         text="Delete",
                         command=self.deleteEntry,
                         width=buttonwidth)
            b11.grid(row=8, column=0, sticky=W)

            # Bottom Frame
            # Console logging
            scrollbar3 = Scrollbar(bottomFrame)
            self.log = Text(bottomFrame, yscrollcommand=scrollbar3.set)
            self.log.grid(row=0, column=0)
            scrollbar3.grid(row=0, column=1, sticky=N + S)
            scrollbar3.config(command=self.log.yview)
            clearlog_button = Button(bottomFrame,
                                     text="Clear log",
                                     command=self.clearLogger)
            clearlog_button.grid(row=1, column=0, sticky=W)

            self.addDevicesWindow.protocol('WM_DELETE_WINDOW',
                                           self.closeAddDevices)

            for repeater in self.table:
                self.l1.insert(END, repeater['repeater'])
            self.l1.select_set(1)

        else:
            tkMessageBox.showwarning("Error", "Wrong Password!")

    def configCentralId(self):
        currentValue = self.l1.get(self.l1.curselection())
        self.send(b"ART" + currentValue + "G\r")
        msg = "Setting Device ID = " + currentValue + " to this central\n"
        self.logger(msg)

    def askRespond(self):
        currentValue = self.l1.get(self.l1.curselection())
        self.send(b"ART" + currentValue + "Z\r")
        msg = "Asking Device ID = " + currentValue + " to respond...\n"
        self.logger(msg)

    def repeaterSearchPath(self):
        currentValue = self.l1.get(self.l1.curselection())
        self.send(b"ART" + currentValue + "S000\r")
        msg = "Asking Device ID = " + currentValue + " to search path... Please wait 1 minute..\n"
        self.logger(msg)

    def allRepeaterSearchPath(self):
        del self.repeaterSearchPath
        self.send(b"ART00000000S000\r")
        self.logger(
            "Asking all repeater to search path... Please wait for reply..\n")

    def mcuIDChecking(self):
        self.send(b"ARI\r")
        # msg = "Central ID=" + currentValue + " to respond...\n"
        # self.logger(msg)

    def repeaterCheckCentralID(self):
        currentValue = self.l1.get(self.l1.curselection())
        self.send(b"ART" + currentValue + "F\r")
        msg = "Checking Repeater Central ID = " + currentValue + " ..\n"
        self.logger(msg)

    def repeaterCheckPath(self):
        currentValue = self.l1.get(self.l1.curselection())
        self.send(b"ART" + currentValue + "U\r")
        msg = "Checking Repeater Path = " + currentValue + " ..\n"
        self.logger(msg)

    def clearDatabase(self):
        result = tkSimpleDialog.askstring("Database Operation",
                                          "Please enter password :"******"df1397":
            self.table.drop()
            self.tableImage.drop()
            self.tableLog.drop()
            tkMessageBox.showinfo("Success", "Database deleted ..")
        else:
            tkMessageBox.showwarning("Error", "Wrong Password!")

    def mcuReset(self):
        if tkMessageBox.askyesno("MCU Operation",
                                 "Do you want to reset the MCU?"):
            self.send(b"ARR\r")
            self.logger("MCU Reset..\n")

    def getIndexOfListbox(self, item):
        for i in range(len(self.l1.get(0, END))):
            if self.l1.get(i) == item:
                return i

    def updateEntry(self):
        repeaterID = self.l1.get(self.l1.curselection())
        self.table.upsert(
            dict(repeater=repeaterID,
                 name=self.nameVar.get(),
                 address=self.addressVar.get(),
                 phone=self.phoneVar.get(),
                 coordx=100,
                 coordy=100), ['repeater'])

    def deleteEntry(self):
        repeaterID = self.l1.get(self.l1.curselection())
        self.table.delete(repeater=repeaterID)
        self.l1.delete(0, END)
        for repeater in self.table:
            self.l1.insert(END, repeater['repeater'])

    def loadEntry(self, event):

        repeaterID = self.l1.get(self.l1.curselection())
        row = self.table.find_one(repeater=repeaterID)
        self.nameVar.set(row['name'])
        self.addressVar.set(row['address'])
        self.phoneVar.set(row['phone'])

    def listenMode(self):
        self.listen = not self.listen
        if self.listen == True:
            self.b0.config(relief=SUNKEN)
        else:
            self.b0.config(relief=RAISED)

    def closeAddDevices(self):
        del self.log
        self.addDevicesWindow.destroy()

############################################### LOG ####################################################
####                 ###
####   Log Window    ###
####                 ###

    def openLog(self):
        logWindow = Toplevel(self.master)
        logWindowTop = LabelFrame(logWindow, text="Event Log")
        logWindowTop.pack(side=TOP)

        scrollbar = Scrollbar(logWindowTop)
        historylog = Text(logWindowTop, yscrollcommand=scrollbar.set)
        historylog.grid(row=0, column=0)
        scrollbar.grid(row=0, column=1, sticky=N + S)
        scrollbar.config(command=historylog.yview)

        logs = self.tableLog.all()

        for log in logs:
            msg = log["msg"]
            historylog.insert(END, msg)

    def clearLogger(self):
        self.log.delete('0.0', END)

################################################ INSTALLER MAP ########################################

####                 ###
####   Map Window    ###
####                 ###

    def openMap(self):

        # topLevel method is to open new window

        mapWindow = Toplevel(self.master)

        self.mapWindow = mapWindow
        # mapWindow.attributes('-fullscreen', True)
        toplevel = mapWindow.winfo_toplevel()
        # toplevel.wm_state('zoomed')

        mapWindow.bind('<Escape>', self.toggleFullScreen)

        # Frames for map window
        mapWindowTop = Frame(mapWindow)
        mapWindowTop.pack(side=TOP)
        mapWindowBottom = Frame(mapWindow)
        mapWindowBottom.pack()
        # mapWindowBottom.bind('<Configure>', self.resizeImage)

        self.admincanvas = ResizingCanvas(mapWindowBottom,
                                          width=400,
                                          height=400,
                                          bg="grey")
        self.admincanvas.pack()
        self.admincanvas.bind_all("<MouseWheel>", self._on_mousewheel)

        self.mapWindow.protocol('WM_DELETE_WINDOW', self.closeInstallerMap)

        # Buttons for map window
        buttonwidth = 20
        b1 = Button(mapWindowTop,
                    text="Upload",
                    command=self.uploadImage,
                    width=buttonwidth)
        b1.grid(row=0, column=0, sticky=W)

        try:
            # row = self.tableImage.all().next()
            # self.openImage(row["imageName"],self.admincanvas)
            self.openImage(self.admincanvas)
        except:
            print "No map found!"

        for item in self.table:
            if item['coordx'] != None and item['coordy'] != None:
                Point(self.table, self.admincanvas,
                      (item['coordx'], item['coordy']), item['repeater'],
                      item['name'])

    def closeInstallerMap(self):
        self.mapWindow.destroy()
        self.updateGuardMap()

    def openImage(self, canvas):
        filename = self.openPicture()
        self.image = Image.open(filename)
        self.img_copy = self.image.copy()
        # size = (self.mapWindow.winfo_screenwidth(), self.mapWindow.winfo_screenheight())
        # self.resizedImage = self.image.resize(size,Image.ANTIALIAS)
        # Put the image into a canvas compatible class, and stick in an
        # arbitrary variable to the garbage collector doesn't destroy it
        canvas.image = ImageTk.PhotoImage(self.image)
        canvas.create_image(0, 0, image=canvas.image, anchor='nw')

    def uploadImage(self):
        self.tablePicture.drop()
        self.initPictureTable()
        filename = tkFileDialog.askopenfilename(filetypes=[('PNG', '*.png'),
                                                           ('JPG', '*.jpg')],
                                                parent=self.mapWindow)
        # self.tableImage.insert(dict(imageName=filename))
        self.insert_picture(filename)
        self.openImage(self.admincanvas)

    def toggleFullScreen(self, event):
        global state
        if state == 0:
            self.mapWindow.attributes('-fullscreen', False)
            state = 1
        elif state == 1:
            self.mapWindow.attributes('-fullscreen', True)
            state = 0

    def insert_picture(self, picture_file):
        conn = sqlite3.connect(self.db_file)
        with open(picture_file, 'rb') as input_file:
            ablob = input_file.read()
            base = os.path.basename(picture_file)
            afile, ext = os.path.splitext(base)
            print afile, ext
            sql = '''INSERT INTO PICTURE
            (PICTURE, TYPE, FILE_NAME)
            VALUES(?, ?, ?);'''
            conn.execute(sql, [sqlite3.Binary(ablob), ext, afile])
            conn.commit()

        conn.close()

    def extract_picture(self, cursor, picture_id):

        sql = "SELECT PICTURE, TYPE, FILE_NAME FROM PICTURE WHERE id = :id"
        param = {'id': picture_id}
        cursor.execute(sql, param)
        ablob, ext, afile = cursor.fetchone()
        filename = afile + ext
        with open(filename, 'wb') as output_file:
            output_file.write(ablob)
        return filename

    def openPicture(self):
        conn = sqlite3.connect(self.db_file)
        cur = conn.cursor()
        filename = self.extract_picture(cur, 1)
        cur.close()
        conn.close()
        return filename

############################################# GUARD MAP ##########################################

    def openGuardMap(self, rightFrame):

        # Uneditable Map
        self.guardcanvas = ResizingCanvas(rightFrame,
                                          width=400,
                                          height=400,
                                          bg="grey")
        self.guardcanvas.pack()
        self.guardcanvas.bind_all("<MouseWheel>", self._on_mousewheel)
        self.guardcanvas.bind("<ButtonPress-1>", self._on_press)

        # if self.tableImage.count() != 0:
        # row = self.tableImage.all().next()
        # self.openImage(row["imageName"],self.guardcanvas)
        if self.tablePicture.count() != 0:
            self.openImage(self.guardcanvas)
        self.houses = []

        self.x_error = 0
        self.y_error = 0

        self.updateGuardMap()

    def updateGuardMap(self):
        # clear houses from canvas
        for h in reversed(self.houses):
            self.guardcanvas.delete(h.item)
            self.houses.pop()

        # append houses to canvas
        for item in self.table:
            if 'coordx' not in item:
                print 'Please update ' + item['repeater'] + ' info'
            elif item['coordx'] != None and item['coordy'] != None:
                self.houses.append(
                    Point(self.table, self.guardcanvas,
                          (item['coordx'], item['coordy']), item['repeater'],
                          item['name'], self.onPointSelect, False))

        if self.tablePicture.count() != 0:
            self.openImage(self.guardcanvas)

        self.guardcanvas.tag_raise("house")

    def resizeImage(self, canvas, new_width, new_height):
        print 'image:', new_width, new_height
        self.guardcanvas.config(xscrollcommand=self.hbar.set,
                                yscrollcommand=self.vbar.set,
                                scrollregion=(0, 0, new_width, new_height))

        self.hbar.config(command=self.guardcanvas.xview)
        self.vbar.config(command=self.guardcanvas.yview)

        self.image = self.img_copy.resize((new_width, new_height))

        canvas.image = ImageTk.PhotoImage(self.image)
        canvas.create_image(0, 0, image=canvas.image, anchor='nw')
        self.tableConfig.upsert(
            dict(type='map', map_width=new_width, map_height=new_height),
            ['type'])

    def _on_press(self, event):
        print 'click:', event.x, event.y

    def _on_mousewheel(self, event):
        scale = 1 + (0.10 * (event.delta / 120))

        w, h = self.image.size

        new_width = round(w * scale)
        new_height = round(h * scale)

        if new_width < 500 or new_height > 2000:
            return "zooming level exceed"

        self.resizeImage(self.guardcanvas, new_width, new_height)
        self.guardcanvas.tag_raise("house")

        sw, sh = new_width / w, new_height / h

        for h in self.houses:
            item = h.item
            self.transformPoint(item, sw, sh)

    def transformPoint(self, item, scalex, scaley):
        a, b, c, d = self.guardcanvas.coords(item)
        x, y = a + 5, b + 5
        mx, my = a * scalex - a, b * scaley - b
        self.x_error += mx - round(mx)
        self.y_error += my - round(my)
        import math
        self.guardcanvas.move(item,
                              int(round(mx) + math.modf(self.x_error)[1]),
                              int(round(my) + math.modf(self.y_error)[1]))
        # print round(mx) + math.modf(self.x_error)[1]
        self.x_error = math.modf(self.x_error)[0]
        self.y_error = math.modf(self.y_error)[0]

    def findHouseByRepeater(self, repeater):
        for h in self.houses:
            if h.repeater == repeater:
                return h

        return -1

    def blink(self, item):
        canvas = self.guardcanvas
        # print 'blink',canvas,self.do_blink
        current_color = canvas.itemcget(item, "fill")
        new_color = "red" if current_color == "black" else "black"
        canvas.itemconfigure(item, fill=new_color)
        if self.do_blink:
            self.master.after(1000, lambda: self.blink(item))
Esempio n. 7
0
class GuiPart:
    def __init__(self, master, queue, endCommand, send):
        self.master = master
        self.queue = queue
        self.endCommand = endCommand
        self.send = send
        self.repeater = None
        self.current = None
        self.table = db['repeater']
        self.tableImage = db['image']
        self.tableLog = db['log']
        self.tableUsers = db['users']
        self.tablePanic = db['panic']
        self.listen = False
        self.initPosition = "+300+30"
        self.logger("Program startup properly..\n")

        # Add default admin user and password
        if self.tableUsers.count() == 0:
            self.tableUsers.insert(dict(username="******",password="******",role=""))

        # Set up the GUI
        master.title("DF Panic Alarm")
        master.geometry(self.initPosition)

        # create a toplevel menu
        menubar = Menu(master)

        # manage
        manageMenu = Menu(menubar, tearoff=0)
        manageMenu.add_command(label="Admin", command=lambda:self.addUsers(master))
        manageMenu.add_command(label="Installer",command=lambda:self.openInstaller())
        menubar.add_cascade(label="Manage" ,menu=manageMenu )

        # view 
        menubar.add_command(label="New Alarms",command=lambda:PanicDialog(master, self))
        menubar.add_command(label="All Alarms",command=lambda:ConfirmedPanicDialog(master))

        # display the menu
        master.config(menu=menubar)

        master.protocol('WM_DELETE_WINDOW', self.on_exit)

        # Paned window
        paned = PanedWindow(master, orient=HORIZONTAL, showhandle=0, handlepad=0, 
            handlesize=0, sashwidth=5, opaqueresize=1, bg="grey")
        paned.pack(side=LEFT, expand=YES, fill=BOTH)
        leftFrame = Frame(paned, border=0)
        rightFrame = Frame(paned)
        paned.add(leftFrame,minsize=16)
        paned.add(rightFrame,minsize=16)

        # Listbox for details
        self.mlb = guardMultiListBox.MultiListbox(leftFrame, (('RepeaterID', 15), ('Name', 20), ('Address', 30)), self.selectedlistbox)
        # for i in range(1000):
        #     mlb.insert(END, ('Important Message: %d' % i, 'John Doe', '10/10/%04d' % (1900+i)))
        self.mlb.pack(expand=YES,fill=BOTH)


        self.centralId = "00000001"
        self.db_file = "mydatabase.db"
        self.initDB()
        self.tablePicture = db["PICTURE"]

        self.openGuardMap(rightFrame)
        self.do_blink = False


    def initDB(self):
        self.tablePanic.create_column('time', sqlalchemy.Integer)
        self.tablePanic.create_column('repeater', sqlalchemy.String)
        self.tablePanic.create_column('acknowledged', sqlalchemy.String)

        self.table.create_column('repeater', sqlalchemy.String)
        self.table.create_column('name', sqlalchemy.String)
        self.table.create_column('address', sqlalchemy.String)
        self.table.create_column('phone', sqlalchemy.String)



        conn = sqlite3.connect(self.db_file)
        # if db_is_new:
        print 'Creating schema'
        sql = '''create table if not exists PICTURE(
        ID INTEGER PRIMARY KEY AUTOINCREMENT,
        PICTURE BLOB,
        TYPE TEXT,
        FILE_NAME TEXT);'''
        conn.execute(sql) # shortcut for conn.cursor().execute(sql)
        conn.close()


    def processIncoming(self):
        """
        Handle all the messages currently in the queue (if any).
        """
        while self.queue.qsize():
            try:
                # print 'queue'
                msg = self.queue.get(0)
                # Check contents of message and do what it says
                # As a test, we simply print it
                if msg == "exit":
                    if tkMessageBox.showerror("Device Not Found!", "Please connect Central Device .."):
                        os._exit(0)
                else:
                    self.decode(msg)
            except Queue.Empty:
                pass


    def decode(self,b):

        m = re.match('.*RA(\w)(.{8})(.{2})?', b)
        if m:
            print m.group(0),'Cmd:', m.group(1), 'Repeater:', m.group(2), 'RSSI: -', m.group(3)

            cmd = m.group(1)
            repeater = m.group(2)
            RSSI = m.group(3)


            if cmd == "I":
                if self.listen == True:

                    msg = "Setting Repeater Central ID = " + repeater + "\n"
                    self.logger(msg)
                    if not self.table.find_one(repeater=repeater):
                        self.l1.insert(END, repeater)
                        self.table.insert(dict(repeater=repeater))

            # elif not (self.centralId == repeater or self.table.find_one(repeater=repeater) or '00000000' == repeater):
            #     print "Alien Discovered", repeater
            #     return

            elif cmd == 'A':
                msg = "Repeater with ID = "+ repeater + " has acknowledged..\n"
                self.logger(msg)
            elif cmd == "E":
                msg = "Repeater with ID = " + repeater + " has responded..\n"
                self.logger(msg)
            elif cmd == "C":
                msg = "Repeater with ID = " + repeater + " has finished searching path..\n"
                self.logger(msg)
                
                if 'searchedPath' in dir(self):
                    self.searchedPath.append(repeater)
                    print self.searchedPath
                    listofRepeaters = self.l1.get(0, END)
                    diff = list(set(listofRepeaters) - set(self.searchedPath))
                    for i in range(len(self.l1.get(0, END))):
                        self.l1.itemconfig(i, {'bg' : 'green'})
                    for repeater in diff:
                        index = self.getIndexOfListbox(repeater)
                        self.l1.itemconfig(index, {'bg':'red'})         

                else:
                    self.searchedPath = []
                    self.searchedPath.append(repeater)
            elif cmd == "F":
                msg = "Repeater central ID = " + repeater + " ..\n"
                self.logger(msg)
            elif cmd == "P":
                msg = "Repeater central ID = " + repeater + " PANIC ALARM! \n"
                self.logger(msg)
                self.start_blinking()
                house = self.findHouseByRepeater(repeater)
                self.blink(house.item)
                # house.isPanic = True
                self.panicAlarm((cmd, repeater))
            elif cmd == "J":
                msg = "Current Central ID= " + repeater + "..\n"
                self.logger(msg)

            elif int(cmd) in range(1,4):
                msg = "Repeater path " + cmd + " = " + repeater + " ..\n"
                self.logger(msg)


        else:
            print 'Cant decode', b


    def handlePanic(self):
        pass


    def start_blinking(self):
        self.do_blink = True
        

    def stop_blinking(self):
        self.do_blink = False

    # admin page
    def addUsers(self,master):
        login = LoginDialog(master)
        if login.result == 1:
            adminPage = admin.AdminPage(master)






    def logger(self, msg):
        now = time.localtime()
        msg = time.strftime("%y/%m/%d %H:%M", now) + " " +  msg
        timeinsec = time.time()
        if 'log' in dir(self):
            self.log.insert(END, msg)
        self.tableLog.insert(dict(time=timeinsec,msg=msg))


   
    def selectedlistbox(self):
        
        repeaterID = self.mlb.get(self.mlb.curselection())[0]
        self.guardcanvas.itemconfigure("house", fill="black")
        self.guardcanvas.itemconfigure(self.findHouseByRepeater(repeaterID).item, fill="yellow")



    
            




    def sos(self): 
        while True:
            for i in range(0, 3): winsound.Beep(2000, 100) 
            for i in range(0, 3): winsound.Beep(2000, 400) 
            for i in range(0, 3): winsound.Beep(2000, 100)

    def panicAlarm(self,msg):
        master = self.master
        cmd, repeater = msg
        currentTime = time.time()
        self.tablePanic.insert(dict(repeater=repeater, time=currentTime,acknowledged="None"))
        self.sos()
        # panic = PanicDialog(master,self)
        print 'End SOS'



    def on_exit(self):
        """When you click to exit, this function is called"""
        if tkMessageBox.askyesno("Exit", "Do you want to quit the application?"):
            self.logger("Program shutdown properly..\n")
            self.master.destroy()
            self.endCommand()

########################################## INSTALLER WINDOW ################################################



    # installer page
    def openInstaller(self):
        
        result =  tkSimpleDialog.askstring("Database Operation", "Please enter password :"******"1":
            self.addDevicesWindow = Toplevel(self.master)
            # Menubar for addDevices window
            menubar = Menu(self.addDevicesWindow)
            filemenu = Menu(menubar, tearoff=0)
            filemenu.add_command(label="Clear DB", command=self.clearDatabase)
            filemenu.add_separator()
            menubar.add_cascade(label="File", menu=filemenu)
            centralMenu = Menu(menubar, tearoff=0)
            centralMenu.add_command(label="MCU Reset", command=self.mcuReset )
            centralMenu.add_command(label="Check MCU ID", command=self.mcuIDChecking)
            menubar.add_cascade(label="Central Menu" ,menu=centralMenu )

            self.addDevicesWindow.config(menu=menubar)

            topFrame = LabelFrame(self.addDevicesWindow, text="Configure", padx= 5 , pady= 5)
            topFrame.pack(side=TOP,fill=BOTH, expand=1)
            middleFrame = LabelFrame(self.addDevicesWindow , text="Devices", padx= 5 , pady= 5)
            middleFrame.pack(side=LEFT,fill=BOTH, expand=1)
            middleFrameRight = LabelFrame(self.addDevicesWindow , text="Information", padx= 10 , pady= 10)
            middleFrameRight.pack(side=LEFT,fill=BOTH, expand=1)
            bottomFrame = LabelFrame(self.addDevicesWindow,text="Event Log", padx= 5 , pady= 5 )
            bottomFrame.pack(side=BOTTOM,fill=BOTH, expand=1)    
            # Init a frame for whole window
            


            # Top Frame Buttons
            buttonwidth = 20
            self.b0 = Button(topFrame,text="Listen Mode" ,command=self.listenMode , width=buttonwidth)
            self.b0.grid(row=0,column=0, sticky=W)
            b1 = Button(topFrame,text="Configure Central ID" ,command=self.configCentralId , width=buttonwidth)
            b1.grid(row=0,column=1, sticky=W)
            b2 = Button(topFrame,text="Ask Respond", command=self.askRespond , width=buttonwidth )
            b2.grid(row=0,column=2, sticky=W)
            b3 = Button(topFrame,text="Repeater Search Path", command=self.repeaterSearchPath , width=buttonwidth)
            b3.grid(row=0,column=3, sticky=W)
            b4 = Button(topFrame,text="All Repeater Search Path", command=self.allRepeaterSearchPath, width=buttonwidth )
            b4.grid(row=0,column=4, sticky=W)
            
            # Second Row
            b5 = Button(topFrame,text="Check Central ID", command=self.mcuIDChecking, width=buttonwidth )
            b5.grid(row=1,column=0, sticky=W)
            b6 = Button(topFrame,text="Check Repeater Central ID", command=self.repeaterCheckCentralID , width=buttonwidth)
            b6.grid(row=1,column=1, sticky=W)
            b7 = Button(topFrame,text="Check Repeater Path", command=self.repeaterCheckPath , width=buttonwidth)
            b7.grid(row=1,column=2, sticky=W)
            b8 = Button(topFrame,text="Map", command=lambda:self.openMap() , width=buttonwidth)
            b8.grid(row=1,column=3, sticky=W)
            b9 = Button(topFrame,text="View Old Logs", command=self.openLog , width=buttonwidth)
            b9.grid(row=1,column=4, sticky=W)

            #Initialize variables for UI
            listbox_width = 40

            # Middle Frame
            # Devices and owner information
            scrollbar = Scrollbar(middleFrame)
            self.l1 = Listbox(middleFrame, width=listbox_width,yscrollcommand=scrollbar.set, exportselection=0, height=24)
            self.l1.grid(row=1,column=0)
            self.l1.bind("<<ListboxSelect>>", self.loadEntry)
            scrollbar.grid(row=1,column=1,sticky=N+S)
            scrollbar.config( command = self.l1.yview)
            nameLabel = Label(middleFrameRight, text="Name")
            nameLabel.grid(row=0, column=0)
            self.nameVar = StringVar()
            self.name = Entry(middleFrameRight, textvariable=self.nameVar)
            self.name.grid(row=1,column=0)
            addressLabel = Label(middleFrameRight, text="Address")
            addressLabel.grid(row=2, column=0)
            self.addressVar = StringVar()
            self.address = Entry(middleFrameRight, textvariable=self.addressVar)
            self.address.grid(row=3,column=0)
            phoneLabel = Label(middleFrameRight, text="Phone")
            phoneLabel.grid(row=4, column=0)
            self.phoneVar = StringVar()
            self.phone = Entry(middleFrameRight, textvariable=self.phoneVar)
            self.phone.grid(row=5,column=0)

            
            # Middle Frame Buttons 
            # b9 = Button(middleFrameRight,text="Load", command=self.loadEntry , width=buttonwidth)
            # b9.grid(row=6,column=0, sticky=W)
            b10 = Button(middleFrameRight,text="Update", command=self.updateEntry , width=buttonwidth)
            b10.grid(row=7,column=0, sticky=W)
            b11 = Button(middleFrameRight,text="Delete", command=self.deleteEntry , width=buttonwidth)
            b11.grid(row=8,column=0, sticky=W)
            
            # Bottom Frame 
            # Console logging
            scrollbar3 = Scrollbar(bottomFrame)
            self.log = Text(bottomFrame,yscrollcommand=scrollbar3.set)
            self.log.grid(row=0,column=0)
            scrollbar3.grid(row=0,column=1,sticky=N+S)
            scrollbar3.config( command = self.log.yview)
            clearlog_button = Button(bottomFrame,text="Clear log", command=self.clearLogger )
            clearlog_button.grid(row=1,column=0, sticky=W)

            self.addDevicesWindow.protocol('WM_DELETE_WINDOW', self.closeAddDevices)

            for repeater in self.table:
                self.l1.insert(END, repeater['repeater'])
            self.l1.select_set(1)

        else:
            tkMessageBox.showwarning("Error","Wrong Password!")



    def configCentralId(self):
        currentValue = self.l1.get(self.l1.curselection())
        self.send(b"ART"+ currentValue +"G\r")
        msg = "Setting Device ID = " + currentValue + " to this central\n" 
        self.logger(msg)

    def askRespond(self):
        currentValue = self.l1.get(self.l1.curselection())
        self.send(b"ART"+ currentValue +"Z\r")
        msg = "Asking Device ID = " + currentValue + " to respond...\n" 
        self.logger(msg)

    def repeaterSearchPath(self):
        currentValue = self.l1.get(self.l1.curselection())
        self.send(b"ART"+ currentValue +"S000\r")
        msg = "Asking Device ID = " + currentValue + " to search path... Please wait 1 minute..\n"
        self.logger(msg)

    def allRepeaterSearchPath(self):
        del self.repeaterSearchPath
        self.send(b"ART00000000S000\r")
        self.logger("Asking all repeater to search path... Please wait for reply..\n")

    def mcuIDChecking(self):
        self.send(b"ARI\r")
        # msg = "Central ID=" + currentValue + " to respond...\n" 
        # self.logger(msg)
    
    def repeaterCheckCentralID(self):
        currentValue = self.l1.get(self.l1.curselection())
        self.send(b"ART"+ currentValue + "F\r")
        msg = "Checking Repeater Central ID = " + currentValue + " ..\n"
        self.logger(msg)

    def repeaterCheckPath(self):
        currentValue = self.l1.get(self.l1.curselection())
        self.send(b"ART"+ currentValue + "U\r")
        msg = "Checking Repeater Path = " + currentValue + " ..\n"
        self.logger(msg)


    def clearDatabase(self):
        result =  tkSimpleDialog.askstring("Database Operation", "Please enter password :"******"df1397":
            self.table.drop()
            self.tableImage.drop()
            self.tableLog.drop()
            tkMessageBox.showinfo("Success","Database deleted ..")
        else:
            tkMessageBox.showwarning("Error","Wrong Password!")

    def mcuReset(self):
        if tkMessageBox.askyesno("MCU Operation", "Do you want to reset the MCU?"):
            self.send(b"ARR\r")
            self.logger("MCU Reset..\n")


    def getIndexOfListbox(self,item):
        for i in range(len(self.l1.get(0, END))):
            if self.l1.get(i) == item:
                return i


    def updateEntry(self):
        repeaterID = self.l1.get(self.l1.curselection())
        self.table.upsert(dict(repeater=repeaterID,name=self.nameVar.get(),address=self.addressVar.get(),phone=self.phoneVar.get(), coordx=100, coordy=100), ['repeater'] )

    def deleteEntry(self):
        repeaterID = self.l1.get(self.l1.curselection())
        self.table.delete(repeater=repeaterID)
        self.l1.delete(0,END)
        for repeater in self.table:
            self.l1.insert(END, repeater['repeater'])

    def loadEntry(self, event):
        
        repeaterID = self.l1.get(self.l1.curselection())
        row = self.table.find_one(repeater=repeaterID)
        self.nameVar.set(row['name'])
        self.addressVar.set(row['address'])
        self.phoneVar.set(row['phone'])



    def listenMode(self):
        self.listen = not self.listen
        if self.listen == True:
            self.b0.config(relief=SUNKEN)
        else:
            self.b0.config(relief=RAISED) 


    def closeAddDevices(self):
        del self.log
        self.addDevicesWindow.destroy()



############################################### LOG ####################################################
    ####                 ###
    ####   Log Window    ###
    ####                 ###    

    def openLog(self):
        logWindow = Toplevel(self.master)
        logWindowTop = LabelFrame(logWindow, text="Event Log")
        logWindowTop.pack(side=TOP)

        scrollbar = Scrollbar(logWindowTop)
        historylog = Text(logWindowTop,yscrollcommand=scrollbar.set)
        historylog.grid(row=0,column=0)
        scrollbar.grid(row=0,column=1,sticky=N+S)
        scrollbar.config( command = historylog.yview)

        logs = self.tableLog.all()

        for log in logs:
            msg = log["msg"]
            historylog.insert(END,msg)





    def clearLogger(self):
        self.log.delete('0.0', END)



################################################ INSTALLER MAP ########################################


    ####                 ###
    ####   Map Window    ###
    ####                 ###
    
    def openMap(self):
        
        # topLevel method is to open new window
        
        mapWindow = Toplevel(self.master)
        self.mapWindow = mapWindow
        mapWindow.attributes('-fullscreen', False)
        mapWindow.geometry(self.initPosition)
        mapWindow.bind('<Escape>',self.toggleFullScreen)

        # Frames for map window
        mapWindowTop = Frame(mapWindow)
        mapWindowTop.pack(side=TOP)
        mapWindowBottom = Frame(mapWindow)
        mapWindowBottom.pack()
        # mapWindowBottom.bind('<Configure>', self.resizeImage)

        self.admincanvas = Canvas(mapWindowBottom, width=mapWindow.winfo_screenwidth()-4, height=mapWindow.winfo_screenheight()-4)
        self.admincanvas.pack()

        # Buttons for map window
        buttonwidth = 20
        b1 = Button(mapWindowTop,text="Upload" ,command=self.uploadImage , width=buttonwidth)
        b1.grid(row=0,column=0, sticky=W)
        # b2 = Button(mapWindowTop,text="Ask Respond" , width=buttonwidth )
        # b2.grid(row=0,column=1, sticky=W)
        try:
            # row = self.tableImage.all().next()
            # self.openImage(row["imageName"],self.admincanvas)
            self.openImage('abc', self.admincanvas)
        except:
            print "No map found!"

        for item in self.table:
            if item['coordx'] != None and item['coordy'] != None:
                Point(self.table, self.admincanvas, (item['coordx'], item['coordy']), item['repeater'],item['name'])

    def resizeImage(self, canvas, new_width, new_height):
        print 'image:', new_width, new_height
        self.image = self.img_copy.resize((new_width, new_height))

        canvas.image = ImageTk.PhotoImage(self.image)
        canvas.create_image(0, 0, image=canvas.image, anchor='nw')

    def openImage(self, abc, canvas):
        filename = self.openPicture()
        self.image = Image.open(filename)
        self.img_copy= self.image.copy()
        # size = (self.mapWindow.winfo_screenwidth(), self.mapWindow.winfo_screenheight())
        # self.resizedImage = self.image.resize(size,Image.ANTIALIAS)
        # Put the image into a canvas compatible class, and stick in an
        # arbitrary variable to the garbage collector doesn't destroy it
        canvas.image = ImageTk.PhotoImage(self.image)
        canvas.create_image(0, 0, image=canvas.image, anchor='nw')

    def uploadImage(self):
        self.tableImage.drop()
        # self.tableImage = db['PICTURE']
        filename = tkFileDialog.askopenfilename(filetypes=[('JPG', '*.jpg')])
        # self.tableImage.insert(dict(imageName=filename))
        self.insert_picture(filename)
        self.openImage(filename,self.admincanvas)

    def toggleFullScreen(self,event):
        global state
        if state==0:
            self.mapWindow.attributes('-fullscreen', False)
            state = 1
        elif state==1:
            self.mapWindow.attributes('-fullscreen', True)
            state = 0


    def insert_picture(self, picture_file):
        conn = sqlite3.connect(self.db_file)
        with open(picture_file, 'rb') as input_file:
            ablob = input_file.read()
            base=os.path.basename(picture_file)
            afile, ext = os.path.splitext(base)
            print afile, ext
            sql = '''INSERT INTO PICTURE
            (PICTURE, TYPE, FILE_NAME)
            VALUES(?, ?, ?);'''
            conn.execute(sql,[sqlite3.Binary(ablob), ext, afile]) 
            conn.commit()

        conn.close()

    def extract_picture(self, cursor, picture_id):

        sql = "SELECT PICTURE, TYPE, FILE_NAME FROM PICTURE WHERE id = :id"
        param = {'id': picture_id}
        cursor.execute(sql, param)
        ablob, ext, afile = cursor.fetchone()
        filename = afile + ext
        with open(filename, 'wb') as output_file:
            output_file.write(ablob)
        return filename

    def openPicture(self):
        conn = sqlite3.connect(self.db_file)
        cur = conn.cursor()
        filename = self.extract_picture(cur, 1)
        cur.close()
        conn.close()
        return filename


############################################# GUARD MAP ##########################################

    def openGuardMap(self, rightFrame):

        # Uneditable Map
        self.guardcanvas = ResizingCanvas(rightFrame,width=400, height=400, bg="grey")
        self.guardcanvas.pack()
        self.guardcanvas.bind_all("<MouseWheel>", self._on_mousewheel)
        self.guardcanvas.bind("<ButtonPress-1>", self._on_press)


        # if self.tableImage.count() != 0:
            # row = self.tableImage.all().next()
            # self.openImage(row["imageName"],self.guardcanvas)
        if self.tablePicture.count() != 0:
            self.openImage('abc', self.guardcanvas)
        self.houses = []

        for item in self.table:
            self.mlb.insert(END, (item['repeater'], item['name'], item['address']))
            if item['coordx'] != None and item['coordy'] != None:
                self.houses.append(Point(self.table, self.guardcanvas, (item['coordx'], item['coordy']), item['repeater'],item['name']))

        self.x_error = 0
        self.y_error = 0


    def _on_press(self, event):
        print 'click:', event.x, event.y

    def _on_mousewheel(self, event):
        scale = 1 + (0.10 *(event.delta/120))

        w, h = self.image.size
        
        self.resizeImage(self.guardcanvas, round(w*scale), round(h*scale))
        self.guardcanvas.tag_raise("house")

        sw, sh = round(w*scale) / w, round(h*scale) / h

        for h in self.houses:
            item = h.item
            self.transformPoint(item, sw, sh)

    
    def transformPoint(self, item, scalex, scaley):
        a, b, c, d = self.guardcanvas.coords(item)
        x, y = a+5, b+5
        mx, my = a*scalex-a, b*scaley-b
        self.x_error += mx - round(mx)
        self.y_error += my - round(my)
        import math
        self.guardcanvas.move(item, int(round(mx) + math.modf(self.x_error)[1]), int(round(my) + math.modf(self.y_error)[1]))
        # print round(mx) + math.modf(self.x_error)[1]
        self.x_error = math.modf(self.x_error)[0]
        self.y_error = math.modf(self.y_error)[0]


    
    def findHouseByRepeater(self, repeater):
        for h in self.houses:
            if h.repeater == repeater:
                return h

        return -1

    def blink(self, house):
        canvas = self.guardcanvas
        if self.do_blink:
            current_color = canvas.itemcget(house, "fill")
            new_color = "red" if current_color == "black" else "black"
            canvas.itemconfigure(house, fill=new_color)
            self.master.after(1000, lambda:self.blink(house))   
Esempio n. 8
0
    def openMap(self):

        # topLevel method is to open new window

        mapWindow = Toplevel(self.master)

        self.mapWindow = mapWindow
        # mapWindow.attributes('-fullscreen', True)
        toplevel = mapWindow.winfo_toplevel()
        # toplevel.wm_state('zoomed')
        w, h = self.master.winfo_screenwidth(), self.master.winfo_screenheight(
        )
        mapWindow.geometry("%dx%d+0+0" % (w, h))

        mapWindow.bind('<Escape>', self.toggleFullScreen)

        # Frames for map window
        mapWindowTop = Frame(mapWindow)
        mapWindowTop.pack(side=TOP)
        mapWindowBottom = Frame(mapWindow)
        mapWindowBottom.pack()
        # mapWindowBottom.bind('<Configure>', self.resizeImage)

        vbar = Scrollbar(mapWindowTop, orient=VERTICAL)
        hbar = Scrollbar(mapWindowTop, orient=HORIZONTAL)
        self.admincanvas = ResizingCanvas(mapWindowBottom,
                                          width=400,
                                          height=400,
                                          bg="grey")
        self.admincanvas.config(xscrollcommand=hbar.set,
                                yscrollcommand=vbar.set,
                                scrollregion=(0, 0, 2480, 2480))
        self.admincanvas.pack(side=LEFT)
        vbar.pack(side=LEFT, fill=Y)
        vbar.config(command=self.admincanvas.yview)
        hbar.pack(side=LEFT, fill=X)
        hbar.config(command=self.admincanvas.xview)
        self.admincanvas.bind_all("<MouseWheel>", self._on_mousewheel)

        self.mapWindow.protocol('WM_DELETE_WINDOW', self.closeInstallerMap)

        # Buttons for map window
        buttonwidth = 20
        b1 = Button(mapWindowTop,
                    text="Upload",
                    command=self.uploadImage,
                    width=buttonwidth)
        b1.pack(side=LEFT)

        try:
            # row = self.tableImage.all().next()
            # self.openImage(row["imageName"],self.admincanvas)
            self.openImage(self.admincanvas)
        except:
            print "No map found!"

        for item in self.table:
            if 'coordx' not in item:
                print 'Please update' + item['repeater'] + 'info.'
            elif item['coordx'] != None and item['coordy'] != None:
                Point(self.table, self.admincanvas,
                      (item['coordx'], item['coordy']), item['repeater'],
                      item['name'])