#!/usr/bin/python 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 settings= {} looptype=0 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_soundpreviewtime=5 o_defaultbrightness=0 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) def showclock(tstr): "Show da clock" # sys.stdout.write( "%s [%d]\r" % (tstr,looptype)) # sys.stdout.flush() d=0 if tstr[2]==':': display.ShowDoublepoint(True) else: display.ShowDoublepoint(False) if tstr[0]==' ': display.Show1(0,0x7f) else: display.Show1(0,int(tstr[0])) if tstr[1]==' ': display.Show1(1,0x7f) elif tstr[1]=='=': display.Show1(1,16) else: display.Show1(1,int(tstr[1])) if tstr[3]==' ': display.Show1(2,0x7f) else: display.Show1(2,int(tstr[3])) if tstr[4]==' ': display.Show1(3,0x7f) else: display.Show1(3,int(tstr[4])) def writesettings(): "write settings to conf file" with open(o_configfilename, 'wb') as handle: pickle.dump(settings, handle) handle.close() def readmp3list(): c=0 mp3s=[] dirs=os.listdir('.') for ent in os.listdir('.'): if ent.lower().endswith(".mp3") and os.access(ent,os.R_OK): mp3s.append(ent) mp3s.sort() for m in mp3s: c+=1 if c>99: break if c: return(mp3s) else: return(0) # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # looptype=0 colon=0 count=0 digit=1 showtime=0 playtime=0 soundpreview=0 alarmoff=0 alarmstarted=0 tvol=0 volume=0.0 brightness=0.0 snooze=0 print "\n +--------+\n | Clocky |\n | v0.1 |\n +--------+\n" display=tm1637.TM1637(CLK=14, DIO=4, brightness=1.0) display.Clear() display.SetBrightnessRaw(o_defaultbrightness) print "" print "reading mp3s from directory:" allmp3s=readmp3list() if allmp3s==0: print "ERROR: No mp3's found!" display.ShowDoublepoint(False) display.Show1(0,0x7f); display.Show1(1,14); display.Show1(2,17); display.Show1(3,17); GPIO.cleanup() sys.exit() c=0 for m in allmp3s: print " %2d : %s"%(c+1,m) c+=1 print "" but1=button.Button(21) but2=button.Button(20) print "" if not os.path.isfile(o_configfilename): print "creating new configfile \""+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; with open(o_configfilename, 'wb') as handle: pickle.dump(settings, handle) handle.close() else: print "reading from previous configfile \""+o_configfilename+"\":" with open(o_configfilename, 'rb') as handle: settings = pickle.load(handle) handle.close() a_mins=settings['alarmtime']%60 a_hour=(settings['alarmtime']-a_mins)/60 print " Alarmtime: %02d:%02d - Starttrack: %d"%(a_hour,a_mins,settings['starttrack']) for i in range(0,10): print " track %d: %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] else: print "" settings["track%d"%i]=0 writesettings() print "" print strftime("Starting: %d %b %Y %H:%M:%S") sys.stdout.flush() #------------------------------------------------------------------ while quit!=True: count+=1; sleep(o_loopdelay) 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 looptype==0: # normal time display if but1.WasPressed(): looptype=1 if but1.WasLong(): looptype=2 if but2.WasPressed(): looptype=3 track=0 if but2.WasLong(): looptype=4 if colon: tim="%02d:%02d" % (mytime[3] , mytime[4]) else: tim="%02d %02d" % (mytime[3] , mytime[4]) showclock(tim) if count % 4 == 0: colon=1-colon # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if looptype==1: # show alarmtime a_mins=settings['alarmtime']%60 a_hour=(settings['alarmtime']-a_mins)/60 if colon: tim="%02d:%02d" % (a_hour, a_mins) else: 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 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if looptype==2: # edit alarmtime delta=0 sm=settings['alarmtime']%10 dm=((settings['alarmtime']-sm)/10)%6 sh=(settings['alarmtime']-dm)/60%10 dh=(settings['alarmtime']-sh)/600 if colon: tim="%0d%0d:%0d%0d" % (dh,sh,dm,sm) else: if but2.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 tim=" %0d:%0d%0d" % ( sh,dm,sm) elif digit==2: if delta: sh+=delta if sh>9: sh=0 if dh==2 and sh>3: sh=0 tim="%0d :%0d%0d" % (dh, dm,sm) elif digit==3: if delta: dm+=delta if dm>5: dm=0 tim="%0d%0d: %0d" % (dh,sh, sm) elif digit==4: if delta: sm+=delta if sm>9: sm=0 tim="%0d%0d:%0d " % (dh,sh,dm ) delta=0 showclock(tim) colon=1-colon if showtime > o_showtimeout: showtime=0 looptype=0 writesettings() sys.stdout.write(strftime("%d %b %Y %H:%M:%S : ")) print "set alarmtime = %d%d:%d%d"%(dh,sh,dm,sm) sys.stdout.flush() else: showtime+=o_loopdelay settings['alarmtime']=dh*600+sh*60+dm*10+sm if but1.WasPressed(): showtime=0 digit+=1 if digit>4: digit=1 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if looptype==3: # show tracks if but1.WasPressed(): pygame.mixer.music.set_volume(0) pygame.mixer.music.stop() if pygame.mixer.get_init(): pygame.mixer.quit() soundpreview=0 looptype=1 if but1.WasLong(): looptype=2 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() soundpreview=1 tr=track tl=settings["track%d"%tr]%10 th=(settings["track%d"%tr]-tl)/10 if colon: tim="%d=:%d%d" % (tr,th,tl) else: tim="%d %d%d" % (tr,th,tl) tr+=1; if tr>9: looptype=0 showclock(tim) colon=1-colon if soundpreview: if pygame.mixer.music.get_pos() >o_soundpreviewtime*1000: pygame.mixer.music.set_volume(0) pygame.mixer.music.stop() soundpreview=0 showtime=0 track+=1; if track>9: looptype=0 else: if showtime > o_showtracktime: showtime=0 track+=1; if track>9: looptype=0 else: showtime+=o_loopdelay # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if looptype==4: # edit track delta=0 tr=track tl=settings["track%d"%tr]%10 th=(settings["track%d"%tr]-tl)/10 if colon: tim="%d=:%d%d" % (tr,th,tl) else: if but2.WasPressed(): delta=1 showtime=0 if digit==1: if delta: tr+=delta if tr>9: tr=0 delta=0 tl=settings["track%d"%tr]%10 th=(settings["track%d"%tr]-tl)/10 tim=" =:%0d%0d" % ( th,tl) elif digit==2: if delta: th+=delta if th>9: th=0 delta=0 tim="%d=: %d" % (tr, tl) elif digit==3: if delta: tl+=delta if tl>9: tl=0 delta=0 tim="%d=:%d " % (tr,th ) delta=0 showclock(tim) colon=1-colon settings["track%d"%tr]=th*10+tl track=tr if showtime > o_showtimeout: showtime=0 looptype=0 writesettings() else: showtime+=o_loopdelay if but1.WasPressed(): digit+=1 if digit>3: digit=1 showtime=0 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if looptype==5: # Alarm! #o_timetomaxvol = 60 # seconds it takes to go from 0% to 100% volume if colon: display.SetBrightnessRaw(0) tim="%02d:%02d" % (mytime[3] , mytime[4]) else: display.SetBrightnessRaw(brightness) tim="%02d:%02d" % (mytime[3] , mytime[4]) showclock(tim) if count % 2 == 0: 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])) 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() track+=1 if track > 9: track=0 if settings["track%d"%track]==0: track=0 settings['starttrack']=track; writesettings() playtime=0 alarmstarted=1 else: 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) else: volume=1 if pygame.mixer.get_init(): pygame.mixer.music.set_volume(volume) playtime+=o_loopdelay if not pygame.mixer.music.get_busy(): 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])) 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 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() display.cleanup()