Example #1
0
    def __init__(self,master=None):
        
        #Creates Main Frame
        tk.Frame.__init__(self, master)
        self.grid(sticky=tk.N+tk.S+tk.E+tk.W) #Create main Grid of the application
        
        global breakTimerInstance #This lets the object work in another thread
        self.breakTimerInstance = BreakTimer() # instance of BreakTimer from BreakTimer.py

        
        #Active screen flags
        self.isMainScreenActive                     =   False
        self.isBreakScreenActive                    =   False
        self.isSettingsETSScreenActive              =   False
        self.isSettingsBreakReminderScreenActive    =   False
        
        #Create the screens
        self.initCreateMainScreen()
        self.initCreateBreakScreen()
        self.initSettingsETSReminderScreen()
        self.initSettingsBreakReminderScreen()
        
        #Initialize Settings
        self.breakTimerInstance.loadSettings()
        if self.breakTimerInstance.getIsSettingsDefault() != True:
            self.savedSettings = self.breakTimerInstance.getSavedSettings()
            index = 0
            for each in self.stringVarsDict:
                self.stringVarsDict[each].set(self.savedSettings[each])
                index+=1
        else:
            self.savedSettings = self.breakTimerInstance.getDefaultSettings()
            
        self.t = threading.Thread(group=None,target=self.etsSignedService)
        self.t.start()
        
        self.breakReminderServiceThread = threading.Thread(group=None,target=self.breakReminderService)
        self.breakReminderServiceThread.start()
Example #2
0
class Application(tk.Frame):
    #This is the main application
    def __init__(self,master=None):
        
        #Creates Main Frame
        tk.Frame.__init__(self, master)
        self.grid(sticky=tk.N+tk.S+tk.E+tk.W) #Create main Grid of the application
        
        global breakTimerInstance #This lets the object work in another thread
        self.breakTimerInstance = BreakTimer() # instance of BreakTimer from BreakTimer.py

        
        #Active screen flags
        self.isMainScreenActive                     =   False
        self.isBreakScreenActive                    =   False
        self.isSettingsETSScreenActive              =   False
        self.isSettingsBreakReminderScreenActive    =   False
        
        #Create the screens
        self.initCreateMainScreen()
        self.initCreateBreakScreen()
        self.initSettingsETSReminderScreen()
        self.initSettingsBreakReminderScreen()
        
        #Initialize Settings
        self.breakTimerInstance.loadSettings()
        if self.breakTimerInstance.getIsSettingsDefault() != True:
            self.savedSettings = self.breakTimerInstance.getSavedSettings()
            index = 0
            for each in self.stringVarsDict:
                self.stringVarsDict[each].set(self.savedSettings[each])
                index+=1
        else:
            self.savedSettings = self.breakTimerInstance.getDefaultSettings()
            
        self.t = threading.Thread(group=None,target=self.etsSignedService)
        self.t.start()
        
        self.breakReminderServiceThread = threading.Thread(group=None,target=self.breakReminderService)
        self.breakReminderServiceThread.start()
        
       #This method creates the Main Screen on initialization. The Main Screen remains displayed.
    def initCreateMainScreen(self):


        top=self.winfo_toplevel()
        top.rowconfigure(0,weight=1)
        top.columnconfigure(0,weight=1)
        
        
        self.rowconfigure(0, weight=1)
        self.columnconfigure(0,weight=1)
        self.rowconfigure(1, weight=1)
        self.columnconfigure(1,weight=1)
        self.rowconfigure(2, weight=1)
        self.columnconfigure(2,weight=1)        
        self.rowconfigure(3, weight=1)
        self.columnconfigure(3,weight=1)
        self.rowconfigure(4, weight=1)
        self.columnconfigure(4,weight=1)
        self.rowconfigure(5, weight=1)
        self.columnconfigure(5,weight=1)
        self.rowconfigure(6, weight=1)
        self.columnconfigure(6,weight=1)
        


        
        #Create and hide Manual Indicator Checkbox.
        self.manualIndicatorIntVar = tk.IntVar()
        self.manualIndicatorCheckBox = tk.Checkbutton(self,
                                                      text="Away",
                                                      command=self.eventManualIndicatorCheckBox,
                                                      variable=self.manualIndicatorIntVar)
        self.manualIndicatorCheckBox.grid(row=0,column=4,sticky=tk.N+tk.E+tk.S+tk.W)
        
        #Create and display text label (shows number of minutes input from numpad)
        self.numpadTextStringVar = tk.StringVar()
        self.numpadTextStringVar.set(self.breakTimerInstance.getDisplayString() + " " + "mins")
        self.numpadText = tk.Label(self,text=self.numpadTextStringVar,textvariable=self.numpadTextStringVar)
        self.numpadText.grid(row=0,columnspan=3,sticky=tk.N+tk.E+tk.S+tk.W)

        
        #Create and display Clear and Break Buttons
        self.clearButton = tk.Button(self,text="Clear",foreground="red",background="grey",command=self.clearTextLabel,width=4)
        self.clearButton.grid(row=2,column=4)
        
        self.breakButton = tk.Button(self,
                                     text="Break!",
                                     foreground="green",
                                     background="grey",
                                     command= lambda: threading.Thread(target=self.switchToBreakScreen).start(),width=4)
                                     
        self.breakButton.grid(row=3,column=4)
        
        #Create and display "ETS Signed" Checkbox
        self.etsSignedIntVar = tk.IntVar()
        self.etsSignedCheckBox = tk.Checkbutton(self,
                                                text="ETS Signed",
                                                command=self.eventEtsSignedCheckbox,
                                                variable=self.etsSignedIntVar)
        self.etsSignedCheckBox.grid(row=5,column=4,sticky=tk.N+tk.E+tk.S+tk.W)
        
        #Button to navigate to Settings Page
        self.settingsButton = tk.Button(self,text="Settings",command=self.switchToSettingsETSReminderScreen,width=5)
        self.settingsButton.grid(row=5,columnspan=2)

        
        #Create and display Number Pad
        self.numpad = []
        
        kk = 0
        for ii in range(4,0,-1):
            if ii == 4:
                self.aButton = tk.Button(self,text=str(kk),foreground="black",background="grey",command = partial(self.updateTextLabel,kk))
                self.numpad.insert(kk,self.aButton)
                self.numpad[kk].grid(row=ii,column=1,sticky=tk.N+tk.E+tk.S+tk.W)
                kk+=1
            else:
                for jj in range(0,3):
                    self.aButton = tk.Button(self,text=str(kk),foreground="black",background="grey",command = partial(self.updateTextLabel,kk))
                    self.numpad.insert(kk,self.aButton)
                    self.numpad[kk].grid(row=ii,column=jj,sticky=tk.N+tk.E+tk.S+tk.W)
                    kk+=1

        #Set active screen flag
        self.isMainScreenActive = True
        
    #Create the Break Screen on initialization and hide it.
    #This means that on clicking "Break" the application merely hides the Main Screen and displays the Break Screen.
    def initCreateBreakScreen(self):

        self.breakScreen = BreakScreen()
        
        #Cancel Button
        self.breakPageCancelButton = tk.Button(self.breakScreen,text="Cancel",command=self.switchToMainScreen)
        self.breakPageCancelButton.grid(row=1,column=1,sticky=tk.N+tk.E+tk.S+tk.W)
        
        #Message to user
        self.breakPageMessage = tk.Label(self.breakScreen,text="Returns in: {0} Minutes".format("XX"))
        self.breakPageMessage.grid(row=0,column=1,sticky=tk.N+tk.E+tk.S+tk.W)
        
        #hide Break Screen
        self.breakScreen.grid_forget()

        
    #Create and hide ETS Reminder Settings Screen
    def initSettingsETSReminderScreen(self):
    
        self.settingsETSReminderScreen = SettingsETSReminderScreen()
        
        #Create Label Frame to enclose the settings options.
        self.etsReminderLabelFrame = tk.LabelFrame(self.settingsETSReminderScreen,
                                                   text="ETS Reminder Settings")
        self.etsReminderLabelFrame.grid(row=1)
        
        #Create back button to navigate back to main screen
        self.backButton = tk.Button(self.settingsETSReminderScreen,
                                    text="< Back",
                                    command=self.switchToMainScreen)
        self.backButton.grid(row=0,column=0,sticky=tk.W)
        
        #Create forward button that navigates to next settings screen
        self.forwardButton = tk.Button(self.settingsETSReminderScreen,
                                       text="Next >",
                                       command=self.switchToSettingsBreakReminderScreen)
        self.forwardButton.grid(row=0,column=2)
        
        
        #Create menu for user to select hour
        self.leavingHourStringVar = tk.StringVar()
        self.leavingHourStringVar.set("Hour")
        
        self.leavingHourMB = tk.Menubutton(self.etsReminderLabelFrame,
                                           text = self.leavingHourStringVar,
                                           textvariable=self.leavingHourStringVar,
                                           relief = tk.RAISED,
                                           width=6)
        self.leavingHourMB.grid(row=1, columnspan=2,sticky=tk.W)
        
        #Link menu to menubutton
        self.leavingHourMB.menu = tk.Menu(self.leavingHourMB,tearoff=0)
        self.leavingHourMB["menu"] = self.leavingHourMB.menu

        #Add menu options
        for ii in range(1,13):
            self.leavingHourMB.menu.add_command(label=str(ii),command=partial(self.hourSelectedCommand,ii))

        #Add menu button and stringvar to dictionary
        #Can't call a function to set a key when initializing a dictionary in Python. The "leavingHour" key is intended to match
        #settingsLeavingHourKey in BreakTimer.py
        self.menuButtonsDict = {"leavingHour" : self.leavingHourMB}
        self.stringVarsDict = {"leavingHour" : self.leavingHourStringVar}        

        #Create menu for user to select minute
        self.leavingMinStringVar = tk.StringVar()
        self.leavingMinStringVar.set("Min")
        
        self.leavingMinMB = tk.Menubutton(self.etsReminderLabelFrame,
                                          text = self.leavingMinStringVar,
                                          textvariable=self.leavingMinStringVar,
                                          relief=tk.RAISED,
                                          width=6)
        self.leavingMinMB.grid(row=2,columnspan=2,sticky=tk.W)
        
        #Link menu to menubutton
        self.leavingMinMB.menu = tk.Menu(self.leavingMinMB,tearoff=0)
        self.leavingMinMB["menu"] = self.leavingMinMB.menu
        
        #Add menu options
        self.leavingMinMB.menu.add_command(label="00",command=partial(self.minSelectedCommand,"00"))
        self.leavingMinMB.menu.add_command(label="15",command=partial(self.minSelectedCommand,"15"))
        self.leavingMinMB.menu.add_command(label="30",command=partial(self.minSelectedCommand,"30"))
        self.leavingMinMB.menu.add_command(label="45",command=partial(self.minSelectedCommand,"45"))

        #Add menu button and stringvar to dictionary
        self.menuButtonsDict[self.breakTimerInstance.getSettingsLeavingMinSettingsKey()] = self.leavingMinMB
        self.stringVarsDict[self.breakTimerInstance.getSettingsLeavingMinSettingsKey()] = self.leavingMinStringVar

        #Create menu for user to select period (AM or PM)
        self.leavingPeriodStringVar = tk.StringVar()
        self.leavingPeriodStringVar.set("Period")
        
        self.leavingPeriodMB = tk.Menubutton(self.etsReminderLabelFrame,
                                             text = self.leavingPeriodStringVar,
                                             textvariable=self.leavingPeriodStringVar,
                                             relief=tk.RAISED)
        self.leavingPeriodMB.grid(row=3,columnspan=2,sticky=tk.W)

        #Link menu to menubutton
        self.leavingPeriodMB.menu = tk.Menu(self.leavingPeriodMB,tearoff=0)
        self.leavingPeriodMB["menu"] = self.leavingPeriodMB.menu

        #Add menu options
        self.leavingPeriodMB.menu.add_command(label="AM",command=partial(self.periodSelectedCommand,"AM"))
        self.leavingPeriodMB.menu.add_command(label="PM",command=partial(self.periodSelectedCommand,"PM"))

        #Add menu button and stringvar to dictionary
        self.menuButtonsDict[self.breakTimerInstance.getSettingsLeavingPeriodSettingsKey()] = self.leavingPeriodMB
        self.stringVarsDict[self.breakTimerInstance.getSettingsLeavingPeriodSettingsKey()] = self.leavingPeriodStringVar
        

        #Create menu for user to select configurable amount of minutes to alert user with specified leaving time
        self.timeWithinStringVar = tk.StringVar()
        self.timeWithinStringVar.set("Time Within")
        
        self.timeWithinMB = tk.Menubutton(self.etsReminderLabelFrame,
                                          text=self.timeWithinStringVar,
                                          textvariable=self.timeWithinStringVar,
                                          relief=tk.RAISED)
        self.timeWithinMB.grid(row=4,columnspan=2,sticky=tk.W)
        
        #Link menu to menubutton
        self.timeWithinMB.menu = tk.Menu(self.timeWithinMB,tearoff=0)
        self.timeWithinMB["menu"] = self.timeWithinMB.menu

        #Add menu options
        self.timeWithinMB.menu.add_command(label="15 min",command=partial(self.timeWithinSelectedCommand,"15"))
        self.timeWithinMB.menu.add_command(label="30 min",command=partial(self.timeWithinSelectedCommand,"30"))
        self.timeWithinMB.menu.add_command(label="45 min",command=partial(self.timeWithinSelectedCommand,"45"))
        self.timeWithinMB.menu.add_command(label="60 min",command=partial(self.timeWithinSelectedCommand,"60"))

        #Add menu button and stringvar to dictionary
        self.menuButtonsDict[self.breakTimerInstance.getSettingsTimeWithinSettingsKey()] = self.timeWithinMB
        self.stringVarsDict[self.breakTimerInstance.getSettingsTimeWithinSettingsKey()] = self.timeWithinStringVar



        #Create a SAVE button
        self.saveSettingsButton = tk.Button(self.settingsETSReminderScreen,text="Save",command=self.doSaveSettings)
        self.saveSettingsButton.grid(row=2,column=2)


        #Hide Settings Screen
        self.settingsETSReminderScreen.grid_forget()
        
        
    #Create and hide Break Reminder Settings Screen
    def initSettingsBreakReminderScreen(self):
        self.settingsBreakReminderScreen = SettingsBreakReminderScreen()
        
        #Create Label Frame to enclose the settings options.
        self.breakReminderLabelFrame = tk.LabelFrame(self.settingsBreakReminderScreen,
                                                     text="Break Reminder Settings")
        self.breakReminderLabelFrame.grid(row=1)
        
        #Create back button to navigate back to ETS Reminder Settings Screen
        self.backButton = tk.Button(self.settingsBreakReminderScreen,
                                    text="< Back",
                                    command=self.switchToSettingsETSReminderScreen)
        self.backButton.grid(row=0,column=0,sticky=tk.W)
        
        #Create menu for user to select number of minutes for break reminder
        self.breakReminderMinutesStringVar = tk.StringVar()
        self.breakReminderMinutesStringVar.set("Min")
        
        self.breakReminderMB = tk.Menubutton(self.breakReminderLabelFrame,
                                                text=self.breakReminderMinutesStringVar,
                                                textvariable=self.breakReminderMinutesStringVar,
                                                relief=tk.RAISED,
                                                width=6)
        self.breakReminderMB.grid(row=1,columnspan=2,stick=tk.W)
        
        #Link menu to menubutton
        self.breakReminderMB.menu = tk.Menu(self.breakReminderMB,tearoff=0)
        self.breakReminderMB["menu"] = self.breakReminderMB.menu
        
        #Add menu options
        self.breakReminderMB.menu.add_command(label="15",command=partial(self.breakReminderMinSelectedCommand,"15"))
        self.breakReminderMB.menu.add_command(label="30",command=partial(self.breakReminderMinSelectedCommand,"30"))
        self.breakReminderMB.menu.add_command(label="45",command=partial(self.breakReminderMinSelectedCommand,"45"))
        self.breakReminderMB.menu.add_command(label="60",command=partial(self.breakReminderMinSelectedCommand,"60"))
        
        #Add to menubar and string vars dictionaries
        self.menuButtonsDict[self.breakTimerInstance.getSettingsBreakReminderMinutesKey()] = self.breakReminderMB
        self.stringVarsDict[self.breakTimerInstance.getSettingsBreakReminderMinutesKey()] = self.breakReminderMinutesStringVar

        #Create a SAVE button
        self.saveSettingsButton = tk.Button(self.settingsBreakReminderScreen,text="Save",command=self.doSaveSettings)
        self.saveSettingsButton.grid(row=2,column=2)

        #Hide screen
        self.settingsBreakReminderScreen.grid_forget()
        
    #This function executes when the user selects an hour
    def hourSelectedCommand(self,hourSelected):
        self.leavingHourStringVar.set(str(hourSelected))
        
    #This function executes when the user selects a minute
    def minSelectedCommand(self,minSelected):
        self.leavingMinStringVar.set(minSelected)

    #This function executes when the user selects a period
    def periodSelectedCommand(self,periodSelected):
        self.leavingPeriodStringVar.set(periodSelected)
        
    def timeWithinSelectedCommand(self,timeWithinSelected):
        self.timeWithinStringVar.set(timeWithinSelected)

    def doSaveSettings(self):
        #Refresh menubar text.
        for menuButton in self.menuButtonsDict:
            self.menuButtonsDict[menuButton].update_idletasks()
        
        #save settings
        self.breakTimerInstance.saveSettings(self.leavingHourStringVar.get(),
                                             self.leavingMinStringVar.get(),
                                             self.leavingPeriodStringVar.get(),
                                             self.timeWithinStringVar.get(),
                                             self.breakReminderMinutesStringVar.get())
        
    def breakReminderMinSelectedCommand(self, minSelected):
        self.breakReminderMinutesStringVar.set(minSelected)
        


    #Message displayed on the Break Screen
    def updateBreakScreenMessage(self,returnTime):
        
        if returnTime.hour > 12:
            formattedHour = returnTime.hour - 12
            self.period = "PM"
        else:
            formattedHour = returnTime.hour
            self.period = "AM"
        if returnTime.minute < 10:
            formattedMinute  = "0" + str(returnTime.minute) + " " + self.period
        else:
            formattedMinute = str(returnTime.minute) + " " + self.period

        self.breakPageMessage.config(text="Returns: {0}:{1}  ".format(formattedHour,formattedMinute))
        
        
    def switchToMainScreen(self):
    
        if self.isBreakScreenActive == True:
            
            #End OMRON
            self.breakTimerInstance.endOMRON()
            
            self.breakScreen.grid_forget() #Hide Break Screen
            self.isBreakScreenActive = False
            
            #Start BreakReminderService Thread again
            self.breakReminderServiceThread = threading.Thread(group=None,target=self.breakReminderService)
            self.breakReminderServiceThread.start()
            
        elif self.isSettingsETSScreenActive == True:
            self.settingsETSReminderScreen.grid_forget() #Hide Settings Screen
            self.isSettingsETSScreenActive = False

        
        self.grid() #Display Main Screen
        self.clearTextLabel()
        self.breakLength = 0
        self.isMainScreenActive = True
    
    #Switch from Main Screen to Break Screen
    def switchToBreakScreen(self):
    
        #Set BreakReminder Flag to end breakReminderService
        self.breakReminderFlag = False
    
        #Update active screen flags
        self.isMainScreenActive     =   False
        self.isBreakScreenActive    =   True
    
        self.grid_forget() #Hide Main Screen
        self.breakScreen.grid() #Display Break Screen
        self.breakLength = int(self.breakTimerInstance.getDisplayString())
        
        clockStart = dt.datetime.now()
        clockExp = clockStart + dt.timedelta(minutes=int(self.breakLength))
        self.updateBreakScreenMessage(clockExp)
        
        #Execute file to run the OMRON sensor. Need to implement logic so that execution ends when user
        #is navigated back to main screen.   
        self.breakTimerInstance.doOMRON()
        
    def switchToSettingsETSReminderScreen(self):
        
        if self.isMainScreenActive == True:
            self.grid_forget() #Hide Main Screen
            self.isMainScreenActive = False
        elif self.isSettingsBreakReminderScreenActive == True:
            self.settingsBreakReminderScreen.grid_forget() # Hide break reminder settings screen
            self.isSettingsBreakReminderScreenActive = False

        self.isSettingsETSScreenActive  =   True
        self.settingsETSReminderScreen.grid() #Display ETS Reminder Settings Screen

        
    def switchToSettingsBreakReminderScreen(self):
        
        #Update active screen flags
        self.isSettingsETSScreenActive              =   False
        self.isSettingsBreakReminderScreenActive    =   True
        
        self.settingsETSReminderScreen.grid_forget() #Hide ETS Reminder Settings Screen
        self.settingsBreakReminderScreen.grid() #Display Break Reminder Settings Screen
        

    
    def updateTextLabel(self,anInt):
        #Update displayString
        self.breakTimerInstance.updateDisplayString(anInt)
        self.numpadTextStringVar.set(self.breakTimerInstance.getDisplayString() + " " + "mins")
        self.numpadText.update_idletasks()

    def clearTextLabel(self):
        self.breakTimerInstance.clearDisplay()
        self.numpadTextStringVar.set(self.breakTimerInstance.getDisplayString() + " " + "mins")
        self.numpadText.update_idletasks()
    
    def eventManualIndicatorCheckBox(self):
        if self.manualIndicatorIntVar.get() == 1:
            #Away Checkbox is active and need to disable all widgets on main screen and turn LED on.
            self.numpadText.config(state=tk.DISABLED)
            self.clearButton.config(state=tk.DISABLED)
            self.breakButton.config(state=tk.DISABLED)
            self.settingsButton.config(state=tk.DISABLED)
            for numpadButton in self.numpad:
                numpadButton.config(state=tk.DISABLED)
            self.breakTimerInstance.activateLED()
            
        else:
            #Away Checkbox is not active and all widgets on main screen are enabled and LED is off.
            self.numpadText.config(state=tk.NORMAL)
            self.clearButton.config(state=tk.NORMAL)
            self.breakButton.config(state=tk.NORMAL)
            self.settingsButton.config(state=tk.NORMAL)
            for numpadButton in self.numpad:
                numpadButton.config(state=tk.NORMAL)
            self.breakTimerInstance.deactivateLED()
      
      
    def eventEtsSignedCheckbox(self):
        if self.t.isAlive() == False:
            self.t = threading.Thread(group=None,target=self.etsSignedService)
            self.t.start()
      
    
    def etsSignedService(self):
        timeFormat = "%H:%M:%S %m-%d-%Y"
        
        self.currentMonth = dt.datetime.now().month
        self.currentDay = dt.datetime.now().day
        self.currentYear = dt.datetime.now().year
        
        #Get ETS Reminder Configuration
        self.savedSettings = self.breakTimerInstance.getSavedSettings() #getting latest settings
        if  self.savedSettings[self.breakTimerInstance.getSettingsLeavingPeriodSettingsKey()] == "PM":
            self.leavingHourFormatted =  int(self.savedSettings[self.breakTimerInstance.getSettingsLeavingHourSettingsKey()]) + 12
            self.leavingMinFormatted = self.savedSettings[self.breakTimerInstance.getSettingsLeavingMinSettingsKey()]
            self.leavingTimeFormatted = str(self.leavingHourFormatted)+":"+self.leavingMinFormatted+":"+"00"+" "+str(self.currentMonth)+"-"+str(self.currentDay)+"-"+str(self.currentYear)
        else:
            self.leavingHourFormatted = self.savedSettings[self.breakTimerInstance.getSettingsLeavingHourSettingsKey()]
            self.leavingMinFormatted = self.savedSettings[self.breakTimerInstance.getSettingsLeavingMinSettingsKey()]
            self.leavingTimeFormatted = self.leavingHourFormatted+":"+self.leavingMinFormatted+":"+"00"+" "+str(self.currentMonth)+"-"+str(self.currentDay)+"-"+str(self.currentYear)
        
        #Create datetime object representing the user configured leaving time
        self.leavingTime = dt.datetime.strptime(self.leavingTimeFormatted,timeFormat)
        
        #Trigger time.
        self.timeWithin = self.savedSettings[self.breakTimerInstance.getSettingsTimeWithinSettingsKey()]
        self.timeWithinTimeDelta = dt.timedelta(minutes=int(self.timeWithin))
        self.triggerTime = self.leavingTime - self.timeWithinTimeDelta

        while self.etsSignedIntVar.get() == 0:
            self.currentTime = dt.datetime.now()
            self.timeDelta = self.triggerTime-self.currentTime

            #print current time and trigger time
            print(" ")
            print("ETS REMINDER SERVICE.....")
            print("Settings Leaving Time: " + self.leavingTimeFormatted)
            print("Settings Time Within: " + str(self.timeWithin))
            print("Current Time: " + str(self.currentTime))
            print("Trigger Time: " + str(self.triggerTime))
            print("Time Delta: " + str(self.timeDelta.days))
            
            if self.timeDelta.days < 0:
                print("***Activate monkey if presence not detected***")
            else:
                print("***Do not activate monkey if presence is not detected***")
            print("ETS REMINDER SERVICE LOOP END.....")
            
            #Check every 15 seconds
            time.sleep(2)
        
        print("***ETS SIGNED***")
        
    def breakReminderService(self):
        #Get Break Reminder Configuration
        self.savedSettings = self.breakTimerInstance.getSavedSettings() #getting latest settings
        self.breakReminderMinutes = self.savedSettings[self.breakTimerInstance.getSettingsBreakReminderMinutesKey()]
        self.breakReminderTimeDelta = dt.timedelta(minutes=int(self.breakReminderMinutes))
        # self.breakReminderTimeDelta = dt.timedelta(minutes=1) #only for demonstration purposes
        self.breakReminderTriggerTime = dt.datetime.now() + self.breakReminderTimeDelta
        
        self.breakReminderFlag = True
        while (self.breakReminderFlag):
            self.breakReminderCurrentTime = dt.datetime.now()
            self.breakReminderTimeDelta = self.breakReminderTriggerTime - self.breakReminderCurrentTime
            
            #Print Current Time and Trigger Time
            print(" ")
            print("BREAK REMINDER SERVICE.....")
            print("Break Reminder Current Time: " + str(self.breakReminderCurrentTime))
            print("Break Reminder Trigger Time: " + str(self.breakReminderTriggerTime))
            print("Break Reminder Current Time Delta: " + str(self.breakReminderTimeDelta.days))
            
            if self.breakReminderTimeDelta.days < 0 and self.isMainScreenActive == True:
                #Deactivate buttons on main screen
                self.clearButton.config(state=tk.DISABLED)
                self.clearButton.update_idletasks
                self.breakButton.config(state=tk.DISABLED)
                self.breakButton.update_idletasks()
                self.settingsButton.config(state=tk.DISABLED)
                self.settingsButton.update_idletasks()
                for numpadButton in self.numpad:
                    numpadButton.config(state=tk.DISABLED)
                    numpadButton.update_idletasks()
                print("***BREAK REMINDER ALERT***")
                self.numpadTextStringVar.set("Take a break!")
                self.numpadText.update_idletasks()
                
                for x in range(0,7):
                    self.numpadTextStringVar.set("Now!")
                    self.numpadText.update_idletasks()
                    time.sleep(1)
                    self.numpadTextStringVar.set("Take a break!")
                    self.numpadText.update_idletasks()
                    time.sleep(1)
                self.numpadTextStringVar.set(self.breakTimerInstance.getDisplayString() + " " + "mins")
                self.numpadText.update_idletasks()
                
                #Activate buttons on main screen
                self.clearButton.config(state=tk.NORMAL)
                self.clearButton.update_idletasks
                self.breakButton.config(state=tk.NORMAL)
                self.breakButton.update_idletasks()
                self.settingsButton.config(state=tk.NORMAL)
                self.settingsButton.update_idletasks()
                for numpadButton in self.numpad:
                    numpadButton.config(state=tk.NORMAL)
                    numpadButton.update_idletasks()
                self.breakReminderFlag = False
            else:
                print("***DO NOTHING***")
            print("BREAK REMINDER SERVICE LOOP END.....")
            
            #Check every 1 second
            time.sleep(2)