diff --git a/clocky.py b/clocky.py index 24ec71f..220818b 100644 --- a/clocky.py +++ b/clocky.py @@ -4,40 +4,50 @@ import pickle import os.path import time import sys -import keyboard import tm1637 import pygame from time import sleep,strftime import RPi.GPIO as GPIO import button +import signal settings= {} looptype=0 +quit=0 + + +print "\n +----------+\n | Clocky |\n | v0.0.5 |\n +----------+\n" o_configfilename = "clocky.conf" o_defaultalarmtime = 60*7+45 # hh*60+mm -o_showalarmtime=5 # time that the alarmtime shows after short press -o_showtracktime=2 # note that this is per track, so total time is 10 times longer -o_editdelaytime=3 # time it takes to qualify as longpress -o_showtimeout=6 # timeout to exit edit modus -o_snoozetime = 9 # time to snooze -o_timetomaxvol = 150# seconds it takes to go from 0% to 100% volume -o_maxplaytime = 900 # seconds it to play +o_showalarmtime=3 # time that the alarmtime shows after short press +o_showtracktime=2 # note that this is per track, so total time is 10 times longer +o_editdelaytime=3 # time it takes to qualify as longpress +o_showtimeout=6 # timeout to exit edit modus +o_snoozetime = 9 # time to snooze +o_timetomaxvol = 150 # seconds it takes to go from 0% to 100% volume +o_maxplaytime = 1800 # seconds it to play o_soundpreviewtime=5 -o_defaultbrightness=0 +o_defaultbrightness=1 o_loopdelay=0.25 track=0 -GPIO.setmode(GPIO.BCM) # set up BCM GPIO numbering -GPIO.setup(21, GPIO.IN, pull_up_down = GPIO.PUD_UP) -GPIO.setup(20, GPIO.IN, pull_up_down = GPIO.PUD_UP) +#GPIO.setmode(GPIO.BCM) # set up BCM GPIO numbering +#GPIO.setup(16, GPIO.IN, pull_up_down = GPIO.PUD_UP) +def signal_handler(signal,frame): + global quit + print "" + quit=1 + +def stamp(): + sys.stdout.write(strftime("[%Y%m%d %H%M%S] ")) def showclock(tstr): "Show da clock" - sys.stdout.write( "%s [%d]\r" % (tstr,looptype)) - sys.stdout.flush() +# sys.stdout.write( "%s [%d]\r" % (tstr,looptype)) +# sys.stdout.flush() d=0 if tstr[2]==':': @@ -98,15 +108,14 @@ digit=1 showtime=0 playtime=0 soundpreview=0 -alarmoff=0 alarmstarted=0 +silencedalarm=0 tvol=0 volume=0.0 brightness=0.0 snooze=0 -print "\n +--------+\n | Clocky |\n | v0.1 |\n +--------+\n" - +signal.signal(signal.SIGINT,signal_handler) display=tm1637.TM1637(CLK=14, DIO=4, brightness=1.0) display.Clear() display.SetBrightnessRaw(o_defaultbrightness) @@ -132,21 +141,23 @@ for m in allmp3s: print "" but1=button.Button(21) but2=button.Button(20) +but3=button.Button(26) print "" if not os.path.isfile(o_configfilename): - print "creating new configfile \""+o_configfilename+"\":" + print "Createconf: \""+o_configfilename+"\":" settings = {'track0':1, 'track1':2, 'track2':3, 'track3':4, 'track4':5, 'track5':6, 'track6':7, 'track7':8, 'track8':9, 'track9':10 } settings['alarmtime']=o_defaultalarmtime; settings['starttrack']=0; + settings['alarmdisabled']=0; with open(o_configfilename, 'wb') as handle: pickle.dump(settings, handle) handle.close() else: - print "reading from previous configfile \""+o_configfilename+"\":" + print "Configfile: \""+o_configfilename+"\":" with open(o_configfilename, 'rb') as handle: settings = pickle.load(handle) @@ -154,21 +165,28 @@ else: a_mins=settings['alarmtime']%60 a_hour=(settings['alarmtime']-a_mins)/60 -print " Alarmtime: %02d:%02d - Starttrack: %d"%(a_hour,a_mins,settings['starttrack']) +print "Alarmtime : %02d:%02d"%(a_hour,a_mins) +print "Alarmdisable: %d"%(settings['alarmdisabled']) +print "Starttrack : %d"%(settings['starttrack']) for i in range(0,10): - print " track %d: %02d"%(i,settings["track%d"%i]), + if i==settings['starttrack']: + print "=>", + else: + print " ", + print "[T%02dM%02d]"%(i,settings["track%d"%i]), if settings["track%d"%i] and (settings["track%d"%i]-1 < len(allmp3s)): - print " => "+allmp3s[settings["track%d"%i]-1] + print "\""+allmp3s[settings["track%d"%i]-1]+"\"" else: print "" settings["track%d"%i]=0 writesettings() - print "" - -print strftime("Starting: %d %b %Y %H:%M:%S") +stamp() +print "Started" +sys.stdout.flush() +#------------------------------------------------------------------ #------------------------------------------------------------------ while quit!=True: count+=1; @@ -177,12 +195,12 @@ while quit!=True: mytime=time.localtime(time.time()) currenttime=mytime[3]*60 + mytime[4]; -# settings['alarmtime']= currenttime - if currenttime == settings['alarmtime']: - if not alarmoff: - looptype=5 - else: - alarmoff=0 + if not settings["alarmdisabled"]: + if currenttime == settings['alarmtime']: + if looptype==0 and not silencedalarm: + looptype=5 + else: + silencedalarm=0 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -191,6 +209,20 @@ while quit!=True: if but1.WasPressed(): looptype=1 if but1.WasLong(): + if but2.WasPressed(): + if but2.WasLong(): + if settings["alarmdisabled"]==0: + settings["alarmdisabled"]=1 + stamp() + print "Alarm disabled" + writesettings() + else: + settings["alarmdisabled"]=0 + stamp() + print "Alarm enabled" + writesettings() + looptype=1 + else: looptype=2 if but2.WasPressed(): @@ -199,6 +231,21 @@ while quit!=True: if but2.WasLong(): looptype=4 + if but3.WasPressed(): + if but3.WasLong(): + if settings["alarmdisabled"]==0: + settings["alarmdisabled"]=1 + stamp() + print "Alarm disabled" + writesettings() + else: + settings["alarmdisabled"]=0 + stamp() + print "Alarm enabled" + writesettings() + looptype=1 + + if colon: tim="%02d:%02d" % (mytime[3] , mytime[4]) else: @@ -210,6 +257,7 @@ while quit!=True: # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if looptype==1: # show alarmtime + if not settings["alarmdisabled"]==1: a_mins=settings['alarmtime']%60 a_hour=(settings['alarmtime']-a_mins)/60 @@ -219,15 +267,24 @@ while quit!=True: tim="%02d %02d" % (a_hour, a_mins) showclock(tim) colon=1-colon - if showtime > o_showalarmtime: - if but1.WasPressed(): # drop intermediate presses - {} - if but2.WasPressed(): - {} - showtime=0 - looptype=0 - else: - showtime+=o_loopdelay + else: + display.ShowDoublepoint(False) + display.Show1(0,0x7f); + display.Show1(1,0); + display.Show1(2,15); + display.Show1(3,15); + + if showtime > o_showalarmtime: + if but1.WasPressed(): # drop intermediate presses + {} + if but2.WasPressed(): + {} + if but3.WasPressed(): + {} + showtime=0 + looptype=0 + else: + showtime+=o_loopdelay # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -245,46 +302,67 @@ while quit!=True: if but2.WasPressed(): delta=1 showtime=0 + if but3.WasPressed(): + delta=-1 + showtime=0 if digit==1: if delta: dh+=delta if dh>2: - dh=0 - if dh==2 and sh>3: - sh=3 + dh=0 + if dh<0: + dh=2 tim=" %0d:%0d%0d" % ( sh,dm,sm) elif digit==2: if delta: sh+=delta if sh>9: - sh=0 + sh=0 if dh==2 and sh>3: sh=0 + if sh<0: + sh=9 tim="%0d :%0d%0d" % (dh, dm,sm) elif digit==3: if delta: dm+=delta if dm>5: - dm=0 + dm=0 + if dm<0: + dm=5 tim="%0d%0d: %0d" % (dh,sh, sm) elif digit==4: if delta: sm+=delta if sm>9: - sm=0 + sm=0 + if sm<0: + sm=9 tim="%0d%0d:%0d " % (dh,sh,dm ) delta=0 showclock(tim) colon=1-colon + if showtime > o_showtimeout: showtime=0 - looptype=0 + if dh==2 and sh>3: + sh=3 + looptype=1 + else: + looptype=0 + if settings["alarmdisabled"]==1: + settings["alarmdisabled"]=0 + stamp() + print "Alarm enabled" + settings['alarmtime']=dh*600+sh*60+dm*10+sm writesettings() - sys.stdout.write(strftime("%d %b %Y %H:%M:%S : ")) - print "set alarmtime = %d%d:%d%d"%(dh,sh,dm,sm) + stamp() + print "Set alarmtime = %d%d:%d%d"%(dh,sh,dm,sm) + sys.stdout.flush() + digit=1 else: showtime+=o_loopdelay @@ -299,12 +377,12 @@ while quit!=True: # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if looptype==3: # show tracks + if looptype==3: # show tracks mode if but1.WasPressed(): - pygame.mixer.music.set_volume(0) - pygame.mixer.music.stop() if pygame.mixer.get_init(): + pygame.mixer.music.set_volume(0) + pygame.mixer.music.stop() pygame.mixer.quit() soundpreview=0 looptype=1 @@ -314,11 +392,13 @@ while quit!=True: if but2.WasPressed(): if settings["track%d"%track]>0: print (allmp3s[settings["track%d"%track]-1]) + sys.stdout.flush() if not pygame.mixer.get_init(): pygame.mixer.init() - pygame.mixer.music.load(allmp3s[settings["track%d"%track]-1]) - pygame.mixer.music.set_volume(1) - pygame.mixer.music.play() + if pygame.mixer.get_init(): + pygame.mixer.music.load(allmp3s[settings["track%d"%track]-1]) + pygame.mixer.music.set_volume(1) + pygame.mixer.music.play() soundpreview=1 tr=track @@ -338,8 +418,10 @@ while quit!=True: if soundpreview: if pygame.mixer.music.get_pos() >o_soundpreviewtime*1000: - pygame.mixer.music.set_volume(0) - pygame.mixer.music.stop() + if pygame.mixer.get_init(): + pygame.mixer.music.set_volume(0) + pygame.mixer.music.stop() + pygame.mixer.quit() soundpreview=0 showtime=0 track+=1; @@ -371,6 +453,9 @@ while quit!=True: if but2.WasPressed(): delta=1 showtime=0 + if but3.WasPressed(): + delta=-1 + showtime=0 if digit==1: if delta: @@ -434,14 +519,16 @@ while quit!=True: colon=1-colon if not alarmstarted: - sys.stdout.write(strftime("%d %b %Y %H:%M:%S : ")) track=settings['starttrack']; - print "[%d] - %02d %s"%(track,settings["track%d"%track],(allmp3s[settings["track%d"%track]-1])) + stamp() + print "[T%02dM%02d] \"%s\""%(track,settings["track%d"%track],(allmp3s[settings["track%d"%track]-1])) + sys.stdout.flush() if not pygame.mixer.get_init(): pygame.mixer.init() - pygame.mixer.music.load(allmp3s[settings["track%d"%track]-1]) - pygame.mixer.music.set_volume(volume) - pygame.mixer.music.play() + if pygame.mixer.get_init(): + pygame.mixer.music.load(allmp3s[settings["track%d"%track]-1]) + pygame.mixer.music.set_volume(volume) + pygame.mixer.music.play() track+=1 if track > 9: track=0 @@ -451,22 +538,79 @@ while quit!=True: writesettings() playtime=0 alarmstarted=1 - else: + else: # alarmstarted if playtime < o_timetomaxvol: brightness=(playtime / o_timetomaxvol)*6 volume = float(int((playtime*100) / o_timetomaxvol))/100 # print "------> %d / %d => %f - %f"%(playtime,o_timetomaxvol,tvol,volume) - pygame.mixer.music.set_volume(volume) else: - pygame.mixer.music.set_volume(1) + volume=1 + + if pygame.mixer.get_init(): + pygame.mixer.music.set_volume(volume) + playtime+=o_loopdelay - if not pygame.mixer.music.get_busy(): + if pygame.mixer.get_init(): + if not pygame.mixer.music.get_busy(): + track=settings['starttrack'] + stamp() + print "[T%02dM%02d] \"%s\""%(track,settings["track%d"%track],(allmp3s[settings["track%d"%track]-1])) + sys.stdout.flush() + pygame.mixer.music.load(allmp3s[settings["track%d"%track]-1]) + pygame.mixer.music.play() + track+=1 + if track > 9: + track=0 + if settings["track%d"%track]==0: + track=0 + settings['starttrack']=track; + writesettings() + + if playtime > o_maxplaytime: + looptype=0 + playtime=0 + if pygame.mixer.get_init(): + pygame.mixer.music.set_volume(0) + pygame.mixer.music.stop() + pygame.mixer.quit() + display.SetBrightnessRaw(o_defaultbrightness) + alarmstarted=0 + + if but1.WasPressed(): + if but1.WasLong(): # Finished + if pygame.mixer.get_init(): + pygame.mixer.music.set_volume(0) + pygame.mixer.music.stop() + pygame.mixer.quit() + display.SetBrightnessRaw(o_defaultbrightness) + playtime=0 + if but1.WasPressed(): # flush intermediate presses + {} + if but2.WasPressed(): + {} + if but3.WasPressed(): + {} + looptype=0 + alarmstarted=0 + silencedalarm=1 + stamp() + print "Silenced alarm" + + + if but2.WasPressed(): + if not but1.WasLong(): + if pygame.mixer.get_init(): + if pygame.mixer.music.get_busy(): + pygame.mixer.music.stop() + track=settings['starttrack'] - sys.stdout.write(strftime("%d %b %Y %H:%M:%S : ")) - print "[%d] - %02d %s"%(track,settings["track%d"%track],(allmp3s[settings["track%d"%track]-1])) - pygame.mixer.music.load(allmp3s[settings["track%d"%track]-1]) - pygame.mixer.music.play() + stamp() + print "[T%02dM%02d] \"%s\""%(track,settings["track%d"%track],(allmp3s[settings["track%d"%track]-1])) + sys.stdout.flush() + if pygame.mixer.get_init(): + pygame.mixer.music.load(allmp3s[settings["track%d"%track]-1]) + pygame.mixer.music.play() track+=1 if track > 9: track=0 @@ -475,31 +619,9 @@ while quit!=True: settings['starttrack']=track; writesettings() - if playtime > o_maxplaytime: - looptype=0 - playtime=0 - pygame.mixer.music.set_volume(0) - pygame.mixer.music.stop() - if pygame.mixer.get_init(): - pygame.mixer.quit() - display.SetBrightnessRaw(o_defaultbrightness) - if but1.WasPressed(): - if but1.WasLong(): # Finished - pygame.mixer.music.set_volume(0) - pygame.mixer.music.stop() - if pygame.mixer.get_init(): - pygame.mixer.get_init() - display.SetBrightnessRaw(o_defaultbrightness) - playtime=0 - if but1.WasPressed(): # drop intermediate presses - {} - if but2.WasPressed(): - {} - looptype=0 - alarmoff=1 - - -print "\nQuit!" -display.Clear() +#------------------------------------------------------------------ +stamp() +print "Shutdown!" +sys.stdout.flush() display.cleanup() diff --git a/tm1637.py b/tm1637.py index 3de1807..bc6734a 100644 --- a/tm1637.py +++ b/tm1637.py @@ -12,6 +12,7 @@ HexDigits = [0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, # 0 1 2 3 4 5 6 # 7 8 9 A B C D E F = r +# 10 11 12 13 14 15 16 17 # # 0 # --- @@ -46,8 +47,6 @@ class TM1637: def cleanup(self): """Stop updating clock, turn off display, and cleanup GPIO""" - self.StopClock() - self.Clear() IO.cleanup() def Clear(self): @@ -212,7 +211,7 @@ class TM1637: if __name__ == "__main__": """Confirm the display operation""" - display = TM1637(CLK=26, DIO=16, brightness=1.0) + display = TM1637(CLK=14, DIO=4, brightness=1.0) display.Clear() @@ -254,3 +253,27 @@ if __name__ == "__main__": display.Show1(3,17); # See clock.py for how to use the clock functions! + display.SetBrightnessRaw(0) + print "level=0" + scrap=raw_input() + display.SetBrightnessRaw(1) + print "level=1" + scrap=raw_input() + display.SetBrightnessRaw(2) + print "level=2" + scrap=raw_input() + display.SetBrightnessRaw(3) + print "level=3" + scrap=raw_input() + display.SetBrightnessRaw(4) + print "level=4" + scrap=raw_input() + display.SetBrightnessRaw(5) + print "level=5" + scrap=raw_input() + display.SetBrightnessRaw(6) + print "level=6" + scrap=raw_input() + display.SetBrightnessRaw(7) + print "level=7" + scrap=raw_input()