PiWatch.py

#############################################################################################
# ECE 5725 FINAL PROJECT
# Title: piwatch.py
# Date: May 18, 2017
# Authors: Erissa Irani and Gulnar Mirza
# NetIDs: eli8 and gzm3
# Description:  The following code implements our PiWatch project, using GPIO, PyGame, Mplayer, and the piTFT touch screen. 
#############################################################################################

import pygame # Import Library and initialize pygame
from pygame.locals import *
import os
import math
import RPi.GPIO as GPIO
import time
import datetime
import sys
import subprocess
from twilio.rest import Client
import random

# set GPIO mode to broadcom numbering 
GPIO.setmode(GPIO.BCM)
GPIO.setup(27,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(17,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(22,GPIO.IN,pull_up_down=GPIO.PUD_UP)

# piTFT environment variables
os.putenv('SDL_VIDEODRIVER', 'fbcon') # Display on piTFT
os.putenv('SDL_FBDEV', '/dev/fb1')
os.putenv('SDL_MOUSEDRV', 'TSLIB') # Track mouse clicks on piTFT
os.putenv('SDL_MOUSEDEV', '/dev/input/touchscreen')

#############################################################################################
#--------------------------------------------------------------  LIBRARY FUNCTIONS  -----------------------------------------------------------------------
#############################################################################################

first_row_y = 160
second_row_y = 200
first_col_x = 80
col_incr = 40
text_y = 40
text_x = 160
# home screen left/right arrows
left_arrow_x = 15
left_arrow_y = 200
right_arrow_x = 305
right_arrow_y = 200


#############################################################################################
#-------------------------------------------------------------- function to draw lock screen  -----------------------------------------------------------------------
#############################################################################################
def draw_lock_screen(error, timer_red):
    passcode_x=80
    passcode_y=100
    x_incr=40
    
    # User prompt text
    my_font=pygame.font.Font(None,25)
    if (error):
        text_surface = my_font.render('Passcode Incorrect, try again', True, red)
    else:
        text_surface = my_font.render('Enter passcode to unlock PiWatch', True, white)
    rect = text_surface.get_rect(center=(text_x,text_y))
    screen.blit(text_surface, rect)

    # Draw number buttons
    my_font=pygame.font.Font(None,30)
    my_numbers={'0':(first_col_x,first_row_y), '1':(first_col_x + col_incr,first_row_y), '2':(first_col_x + 2*col_incr,first_row_y), '3': (first_col_x + 3*col_incr,first_row_y),
    '4':(first_col_x,second_row_y), '5':(first_col_x + col_incr,second_row_y), '6':(first_col_x + 2*col_incr, second_row_y)}
    for my_text, text_pos in my_numbers.items():
            text_surface = my_font.render('%s'%my_text, True, white)
            rect = text_surface.get_rect(center=text_pos)
            screen.blit(text_surface, rect)
    
    # Draw clear button
    my_font=pygame.font.Font(None,30)
    text_surface = my_font.render('X', True, red)
    rect = text_surface.get_rect(center=(first_col_x + 3*col_incr,second_row_y))
    screen.blit(text_surface, rect)
    
    # Draw current entry
    for i in range(len(currently_entered)):
        text_surface=my_font.render('%s'%currently_entered[i],True,yellow)
        rect=text_surface.get_rect(center=(passcode_x+x_incr*i,passcode_y))
        screen.blit(text_surface,rect)
    
    pygame.draw.rect(screen,white,(60,70,160,50),4)
    
    # Timer global notifier -- red text
    if (timer_red == 1):
        my_font=pygame.font.Font(None,50)
        text_surface = my_font.render('TIMER!', True, red)
        rect = text_surface.get_rect(center=(160,120))
        screen.blit(text_surface, rect)
    pygame.display.flip()

#############################################################################################
#-------------------------------------------------------------- function to check passcode input event ----------------------------------------------------------
#############################################################################################
def passcode_press(pos, error):
    # Check which button was pressed, append to current string
    x,y = pos
    if (y>first_row_y-20 and y<first_row_y+20):
        #0-3 pressed
        if (x>first_col_x-10 and x<first_col_x+10):
            print('0 pressed')
            currently_entered.append(str(0))
            error=0
        elif(x>first_col_x+col_incr-10 and x<first_col_x+col_incr+10):
            print('1 pressed')
            currently_entered.append(str(1))
            error=0
        elif(x>first_col_x+2*col_incr-10 and x<first_col_x+2*col_incr+10):
            print('2 pressed')
            currently_entered.append(str(2))    
            error=0
        elif(x>first_col_x+3*col_incr-10 and x<first_col_x+3*col_incr+10):
            print('3 pressed')
            currently_entered.append(str(3))
            error=0
    elif (y>second_row_y-20 and y<second_row_y+20):
        #4-X pressed
        if (x>first_col_x-10 and x<first_col_x+10):
            print('4 pressed')
            currently_entered.append(str(4))
            error=0
        elif(x>first_col_x+col_incr-10 and x<first_col_x+col_incr+10):
            print('5 pressed')
            currently_entered.append(str(5))
            error=0
        elif(x>first_col_x+2*col_incr-10 and x<first_col_x+2*col_incr+10):
            print('6 pressed')
            currently_entered.append(str(6))
            error=0
        elif(x>first_col_x+3*col_incr-10 and x<first_col_x+3*col_incr+10):
            print('x pressed')
            # clear last entry
            currently_entered.pop(len(currently_entered)-1)
            error=0
            #x pressed
    return error

#############################################################################################
#-------------------------------------------------------------- function to check passcode entry  -----------------------------------------------------------------------
#############################################################################################
def check_passcode(list):
    check=True
    wrong=0
    for i in range(0,4):
        if list[i]!=passcode[i]:
            check=False
    if (check==True):
        locked=0
        list=[]
    else:
        locked=1
        wrong=1
        list=[]
        screen.fill(black)
        pygame.display.flip()
    return locked,list,wrong

#############################################################################################
#-------------------------------------------------------------- function to draw home screen  -----------------------------------------------------------------------
#############################################################################################
def draw_homescreen(color_list, hs_number, timer_red):
    # define app icon colors and locations
    hs_one_colors=[red,blue,green]
    hs_two_colors = [cyan,pink]
    screen.fill(black)
    app_y=50
    app_x=70
    app_deltax=120
    app_deltay=80
    color_index=0
    
    left_arrow_x = 20
    left_arrow_y = 200
    right_arrow_x = 300
    right_arrow_y = 200
    
    left_circle_x = 130
    right_circle_x = 190
    circle_y = left_arrow_y + 5
    
    # Draw apps on homescreen 1
    my_font=pygame.font.Font(None,30)
    if (hs_number is 1):
        one_apps={'PiTime':(app_x,app_y),'PiCalc':(app_x+app_deltax,app_y),
                'PiMsg':(app_x,app_y + app_deltay)}
        for my_text, text_pos in one_apps.items():
            pygame.draw.rect(screen,hs_one_colors[color_index],(text_pos[0]-40,text_pos[1]-20,80,40),0)
            text_surface=my_font.render('%s'%my_text,True,(255,255,255))
            rect=text_surface.get_rect(center=text_pos)
            screen.blit(text_surface,rect)
            color_index+=1
            
        # draw helper circles   
        pygame.draw.circle(screen,white,(left_circle_x,circle_y),10,0)
        pygame.draw.circle(screen,white,(right_circle_x,circle_y),10,2)
        
    # Draw apps on homescreen 2
    elif (hs_number is 2):
        two_apps = {'PiMusic':(app_x,app_y),
                'PiSimon':(app_x+app_deltax,app_y)}
        for my_text, text_pos in two_apps.items():
            pygame.draw.rect(screen,hs_two_colors[color_index],(text_pos[0]-40,text_pos[1]-20,80,40),0)
            text_surface=my_font.render('%s'%my_text,True,(255,255,255))
            rect=text_surface.get_rect(center=text_pos)
            screen.blit(text_surface,rect)
            color_index+=1
        # draw helper circles   
        pygame.draw.circle(screen,white,(left_circle_x,circle_y),10,2)
        pygame.draw.circle(screen,white,(right_circle_x,circle_y),10,0)
            
    # draw left and right arrows
    my_font=pygame.font.Font(None,50)
    text_surface = my_font.render('<', True, white)
    rect = text_surface.get_rect(center=(left_arrow_x, left_arrow_y))
    screen.blit(text_surface, rect)
    text_surface = my_font.render('>', True, white)
    rect = text_surface.get_rect(center=(right_arrow_x, right_arrow_y))
    screen.blit(text_surface, rect)
    
    # Global timer notifier
    if (timer_red == 1):
        my_font=pygame.font.Font(None,50)
        text_surface = my_font.render('TIMER!', True, red)
        rect = text_surface.get_rect(center=(160,120))
        screen.blit(text_surface, rect)
    pygame.display.flip()
        
#############################################################################################
#-------------------------------------------------------------- function to check homescreen input event  -----------------------------------------------------------------------
#############################################################################################
def hs_press(pos,hs_number, current_app):
    app_y=50
    app_x=70
    app_deltax=120
    app_deltay=80
    x,y = pos
    if (y>left_arrow_y-20 and y<left_arrow_y+20):
    
        if (x > left_arrow_x - 20 and x < left_arrow_x + 20):
            # left arrow pressed
            if (hs_number is 2): # only do it if on rightmost screen
                hs_number = 1
            
        elif (x > right_arrow_x - 20 and x < right_arrow_x + 20):
            # right arrow pressed
            if (hs_number is 1): # only do it if on leftmost screen
                hs_number = 2   
                
    if (y>app_y-20 and y<app_y+20):
        #first row y
        if (x>app_x-40 and x<app_x+40):
            # first row, first col app pressed
            if (hs_number is 1):        
                # piTime pressed
                current_app = 1
            elif (hs_number is 2):
                # piMusic pressed
                current_app = 4
            
            msg = "current_app: " + str(current_app)
            print(msg)              
        elif(x>app_x+app_deltax-40 and x<app_x+app_deltax+40):
            # first row, second col app pressed
            if (hs_number is 1):
                # PiCalc pressed
                current_app = 2
            elif (hs_number is 2):
                # PiDrum pressed
                current_app = 5
            msg = "current_app: " + str(current_app)
            print(msg)
                
    elif (y>app_y+app_deltay-20 and y<app_y+app_deltay+20):
        # second row y 
        if (x>app_x-40 and x<app_x+40):
            # second row, first col app pressed
            if (hs_number is 1):
                # piMsg pressed
                current_app = 3
                msg = "current_app: " + str(current_app)
                print(msg)
            
    

    return hs_number, current_app

#############################################################################################
#-------------------------------------------------------------- function to draw picalc app  -----------------------------------------------------------------------
#############################################################################################
def draw_picalc(list,ind, timer_red):
    num_y=100
    num_x=50
    num_deltax=55
    num_deltay=55
    op_x=25
    op_deltax = 45

    # draw number buttons and operators
    row_one={'0':(num_x,num_y),'1':(num_x+num_deltax,num_y),
            '2':(num_x + 2*num_deltax,num_y), '3':(num_x + 3*num_deltax,num_y),'4':(num_x + 4*num_deltax,num_y),
            '5':(num_x, num_y + num_deltay), '6':(num_x + num_deltax, num_y + num_deltay),
            '7':(num_x + 2*num_deltax, num_y + num_deltay), '8':(num_x + 3*num_deltax, num_y + num_deltay),
            '9':(num_x + 4*num_deltax, num_y + num_deltay),'c':(op_x,num_y+2*num_deltay),
            '.':(op_x+op_deltax, num_y + 2*num_deltay),'+':(op_x + 2*op_deltax, num_y + 2*num_deltay),
            '-':(op_x + 3*op_deltax, num_y + 2*num_deltay), 'x':(op_x + 4*op_deltax, num_y + 2*num_deltay),
            '/':(op_x + 5*op_deltax, num_y + 2*num_deltay),'=':(op_x + 6*op_deltax, num_y + 2*num_deltay)}
    for my_text, text_pos in row_one.items():
        if ((my_text is '.') or (my_text is '+') or (my_text is '-') or (my_text is 'x') or (my_text is '/')):
            my_font=pygame.font.Font(None,50)
            color = yellow
        elif ((my_text is 'c') or (my_text is '=')):
            my_font=pygame.font.Font(None,50)
            color = cyan
        else:
            my_font=pygame.font.Font(None,30)
            color = white
                
        text_surface=my_font.render('%s'%my_text,True,color)
        rect=text_surface.get_rect(center=text_pos)
        screen.blit(text_surface,rect)
    
    # display current entry based on index of current operand
    my_font=pygame.font.Font(None,25)
    my_text =   list[ind]
    text_pos = (280, 40)
    text_surface=my_font.render('%s'%my_text,True,pink)
    rect=text_surface.get_rect(midright=text_pos)
    screen.blit(text_surface,rect)

    pygame.draw.rect(screen,white,(20,20,280,40),2)
    
    # global timer notifier
    if (timer_red == 1):
        my_font=pygame.font.Font(None,50)
        text_surface = my_font.render('TIMER!', True, red)
        rect = text_surface.get_rect(center=(160,120))
        screen.blit(text_surface, rect)

    pygame.display.flip()   
    
#############################################################################################
#-------------------------------------------------------------- function to check picalc input  -----------------------------------------------------------------------
#############################################################################################
def picalc_press(pos, list, ind, sign, decimal_pressed):
    x,y = pos
    num_y=100
    num_x=50
    num_deltax=55
    num_deltay=55
    op_x=25
    op_deltax = 45
    # sign: #0=none, 1=add, 2=subtract, 3=multiply, 4=divide

    if (y>num_y-20 and y<num_y+20):
        #0-4 pressed
        # append to term
        if (x>num_x-10 and x<num_x+10): 
            print('0 pressed')
            list[ind]=list[ind]+str(0)
        elif(x>num_x+num_deltax-10 and x<num_x+num_deltax+10):
            print('1 pressed')
            list[ind]=list[ind]+str(1)
        elif(x>num_x+2*num_deltax-10 and x<num_x+2*num_deltax+10):
            print('2 pressed')
            list[ind]=list[ind]+str(2)  
        elif(x>num_x+3*num_deltax-10 and x<num_x+3*num_deltax+10):
            print('3 pressed')
            list[ind]=list[ind]+str(3)
        elif(x>num_x+4*num_deltax-10 and x<num_x+4*num_deltax+10):
            print('4 pressed')
            list[ind]=list[ind]+str(4)
            
        print list
            
    elif (y>num_y+num_deltay-20 and y<num_y+num_deltay+20):
        #5-9 pressed
        # append to term
        if (x>num_x-10 and x<num_x+10):
            print('5 pressed')
            list[ind]=list[ind]+str(5)
        elif(x>num_x+num_deltax-10 and x<num_x+num_deltax+10):
            print('6 pressed')
            list[ind]=list[ind]+str(6)
        elif(x>num_x+2*num_deltax-10 and x<num_x+2*num_deltax+10):
            print('7 pressed')
            list[ind]=list[ind]+str(7)  
        elif(x>num_x+3*num_deltax-10 and x<num_x+3*num_deltax+10):
            print('8 pressed')
            list[ind]=list[ind]+str(8)
        elif(x>num_x+4*num_deltax-10 and x<num_x+4*num_deltax+10):
            print('9 pressed')
            list[ind]=list[ind]+str(9)
            
        print list
            

    elif (y>num_y+2*num_deltay-20 and y<num_y+2*num_deltay+20):
        #clear/=/./signs  pressed
        if (x>op_x-10 and x<op_x+10):
            print('c pressed')
            clear=1
            #PiCalc reset
            list=['','',''] #first=first term, second=second term, third=answer
            ind=0 #0=add numbers to first term; 1=add to second term; 2=for displaying answer (should never be 2 in picalc_calc())
            sign=0

        elif(x>op_x+op_deltax-10 and x<op_x+op_deltax+10):
            print('. pressed')
            # safety check if number already has decimal
            if (not decimal_pressed):
                decimal_pressed=1
                list[ind] = list[ind]+ "."
            

        elif(x>op_x+2*op_deltax-10 and x<op_x+2*op_deltax+10):
            print('+ pressed')
            sign=1
            # change to next term
            if (ind is 0):
                ind = ind + 1
                decimal_pressed = 0
            # continue calculation
            elif (ind is 2):
                new_list = ['','','']
                new_list[0] = list[ind]
                list = new_list
                ind = 1
                decimal_pressed = 0
            
        elif(x>op_x+3*op_deltax-10 and x<op_x+3*op_deltax+10):
            print('- pressed')
            sign=2
            # change to next term
            if (ind is 0):
                ind = ind + 1
                decimal_pressed = 0
            # continue calculation
            elif (ind is 2):
                new_list = ['','','']
                new_list[0] = list[ind]
                list = new_list
                ind = 1     
                decimal_pressed = 0
            
        elif(x>op_x+4*op_deltax-10 and x<op_x+4*op_deltax+10):
            print('x pressed')
            sign=3
            # change to next term
            if (ind is 0):
                ind = ind + 1           
                decimal_pressed = 0
            # continue calculation
            elif (ind is 2):
                new_list = ['','','']
                new_list[0] = list[ind]
                list = new_list
                ind = 1
                decimal_pressed = 0
                
        elif(x>op_x+5*op_deltax-10 and x<op_x+5*op_deltax+10):
            print('/ pressed')
            sign=4
            # change to next term
            if (ind is 0):
                ind = ind + 1       
                decimal_pressed = 0
            # continue calculation
            elif (ind is 2):
                new_list = ['','','']
                new_list[0] = list[ind]
                list = new_list
                ind = 1
                decimal_pressed = 0
                
        elif(x>op_x+6*op_deltax-10 and x<op_x+6*op_deltax+10):
            print('= pressed')
            # change to display term
            if (ind is 1):
                ind = ind + 1
                decimal_pressed = 0
                # do the math
                if (sign is 1):
                    list[ind] = str(float(list[ind - 2]) + float(list[ind - 1]))
                elif (sign is 2):
                    list[ind] = str(float(list[ind - 2]) - float(list[ind - 1]))                
                elif (sign is 3):
                    list[ind] = str(float(list[ind - 2]) * float(list[ind - 1]))
                elif (sign is 4):
                    print ind
                    print list
                    # dividing, reset if denominator is 0
                    if (list[ind - 1] == '0'):
                        #PiCalc reset
                        list=['','',''] #first=first term, second=second term, third=answer
                        ind=0 
                        sign=0
                    else:
                        list[ind] = str(float(list[ind - 2]) / float(list[ind - 1]))
                            
    return ind,list,sign,decimal_pressed

#############################################################################################
#-------------------------------------------------------------- function to draw pitime app  -----------------------------------------------------------------------
#############################################################################################
def draw_pitime(time_screen,stopwatch_stopped, stopwatch_start_time, stopwatch_elapsed_time, stopwatch_prev_time, timer_str, timer_stopped, timer_start_time, timer_str_start, timer_red):
    
    # draw mode buttons
    my_buttons={'Clock': (40,210),'Timer': (150,210),'Stopwatch': (260,210)}
    my_font=pygame.font.Font(None,25)
    for my_text, text_pos in my_buttons.items():
            text_surface = my_font.render('%s'%my_text, True, white)
            rect = text_surface.get_rect(center=text_pos)
            screen.blit(text_surface, rect)
            
    # Clock screen
    if (time_screen==0):
        curr_time=time.strftime("%H:%M:%S",time.localtime())
        pygame.draw.rect(screen,yellow,(10,190,60,40),2)
        my_timefont=pygame.font.Font(None,70)
        time_surface=my_timefont.render(str(curr_time),True,yellow)
        rect=time_surface.get_rect(center=(160,60))
        screen.blit(time_surface,rect)
        
    # Timer screen
    elif (time_screen==1):
        # if timer is going, update elapsed time and display
        if (timer_stopped == 0):
            curr_time = time.strftime("%H:%M:%S",time.localtime())
            timer_str = timediff_timer(curr_time, timer_start_time, timer_str_start)
            
            # number is drawn in red if timer runs out
            if ((timer_str == "00:00:00") and (timer_str_start != "00:00:00") and (timer_stopped == 0)):
                timer_red = 1
                timer_stopped = 1
        # number is drawn in red if timer runs out
        if (timer_red == 1):
            str_color = red
        else: # else draw standard color
            str_color = yellow
        
        # draw clear/stop/start buttons
        my_buttons2={'Clear':(50,150),'Start':(150,150),'Stop':(250,150)}
        for my_text, text_pos in my_buttons2.items():
                text_surface = my_font.render('%s'%my_text, True, cyan)
                rect = text_surface.get_rect(center=text_pos)
                screen.blit(text_surface, rect)
        pygame.draw.rect(screen,yellow,(120,190,60,40),2)
        my_timefont=pygame.font.Font(None,70)
        time_surface=my_timefont.render(timer_str,True,str_color)
        rect=time_surface.get_rect(center=(160,60))
        screen.blit(time_surface,rect)
        
    # Stopwatch screen
    elif (time_screen==2):
        #stopwatch="00:00"
        
        if(not stopwatch_stopped):
            # check elapsed time since currently counting update
            curr_time = datetime.datetime.now().strftime("%H:%M:%S.%f")
            stopwatch_elapsed_time = timediff_stopwatch(stopwatch_start_time, curr_time, stopwatch_prev_time)
    
        # draw clear/stop/start buttons
        my_buttons2={'Clear':(50,150),'Start':(150,150),'Stop':(250,150)}
        for my_text, text_pos in my_buttons2.items():
                text_surface = my_font.render('%s'%my_text, True, cyan)
                rect = text_surface.get_rect(center=text_pos)
                screen.blit(text_surface, rect)
        pygame.draw.rect(screen,yellow,(210,190,100,40),2)
        my_timefont=pygame.font.Font(None,70)
        time_surface=my_timefont.render(stopwatch_elapsed_time,True,yellow)
        rect=time_surface.get_rect(center=(160,60))
        screen.blit(time_surface,rect)
        
    # Global timer notifier
    if (timer_red == 1):
        my_font=pygame.font.Font(None,50)
        text_surface = my_font.render('TIMER!', True, red)
        rect = text_surface.get_rect(center=(160,120))
        screen.blit(text_surface, rect)

    pygame.display.flip()
    return timer_str, timer_red, timer_stopped

#############################################################################################
#-------------------------------------------------------------- function to check pitime input -----------------------------------------------------------------------
#############################################################################################
def pitime_press(time_screen,pos,stopwatch_stopped, stopwatch_start_time, stopwatch_elapsed_time, stopwatch_prev_time, timer_str, timer_stopped, timer_start_time, timer_str_start, timer_red):
    x,y=pos
    mode_x=20
    mode_y=210
    delta_x=110
    
    # convert timer_str to int values
    timer_min = timer_str[3] + timer_str[4]
    timer_hour = timer_str[0] + timer_str[1]
    timer_sec = timer_str[6] + timer_str[7]
    timer_min_int = int(timer_min)
    timer_hour_int = int(timer_hour)
    timer_sec_int = int(timer_sec)
    
    if (y>mode_y-10 and y<mode_y+20): #bottom row of buttons
        if (x>mode_x-10 and x<mode_x+50):
            # clock
            print('time screen:0')
            time_screen=0
        if (x>mode_x+delta_x-10 and x<mode_x+delta_x+50):
            # timer
            print('time screen:1')
            time_screen=1
        if (x>mode_x+2*delta_x-40 and x<mode_x+2*delta_x+80):
            # stopwatch
            print('time screen:2')
            time_screen=2
            
    # Timer Clear/Start/Stop
    if (time_screen==1):
        op_x=30
        op_y=150
        op_deltax=100
        if (y>op_y-20 and y<op_y+20): #op buttons
            if (x>op_x-10 and x<op_x+30):
                print('clear')
                timer_stopped = 1
                # clear timer str
                timer_min_int = 0
                timer_hour_int = 0
                timer_sec_int = 0
                # back to standard color                
                timer_red  = 0
            if (x>op_x+op_deltax-10 and x<op_x+op_deltax+40):
                print('start')
                if (timer_str_start != "00:00:00"):
                    # start timer and get start time
                    timer_stopped = 0
                    timer_start_time = time.strftime("%H:%M:%S",time.localtime())
                
            if (x>op_x+2*op_deltax-20 and x<op_x+2*op_deltax+80):
                print('stop')
                timer_stopped = 1
                # back to standard color
                timer_red = 0
                
    # Stopwatch Clear/Start/Stop
    if (time_screen==2):
        op_x=30
        op_y=150
        op_deltax=100
        if (y>op_y-20 and y<op_y+20): #op buttons
            if (x>op_x-10 and x<op_x+40):
                print('clear')
                # reset stopwatch
                stopwatch_stopped = 1
                stopwatch_elapsed_time = "00:00:00.000"
                stopwatch_start_time = "00:00:00.000"
                stopwatch_prev_time = "00:00:00.000"
                
            if (x>op_x+op_deltax-10 and x<op_x+op_deltax+40):
                print('start')
                stopwatch_stopped = 0
                # get start time
                stopwatch_start_time = datetime.datetime.now().strftime("%H:%M:%S.%f")
                        
            if (x>op_x+2*op_deltax-20 and x<op_x+2*op_deltax+80):
                print('stop')
                stopwatch_stopped = 1
                # calculate elapsed time, updated prev elapsed time
                if (stopwatch_start_time != "00:00:00.000"):
                    curr_time = datetime.datetime.now().strftime("%H:%M:%S.%f")
                    stopwatch_elapsed_time = timediff_stopwatch(stopwatch_start_time, curr_time, stopwatch_prev_time)
                    stopwatch_prev_time = stopwatch_elapsed_time
                
        
    # timer controls for min/sec        
    if (time_screen==1 and (timer_stopped == 1)): 
        if (y>40 and y<80):
            if (x>130 and x<180):
                print('increase minutes')
                # back to standard color
                timer_red = 0
                
                # increase minutes, modulo 60
                
                if(timer_min_int == 59):
                    timer_min_int = 0
                    if (timer_hour_int < 24):
                        timer_hour_int = timer_hour_int + 1
                else:
                    timer_min_int = timer_min_int + 1

            elif (x>200 and x<250):
                print('increase seconds')
                # back to standard color
                timer_red = 0
                
                # increase seconds by 5, modulo 60
                if(timer_sec_int == 55):
                    timer_sec_int = 0
                    if(timer_min_int == 59):
                        timer_min_int = 0
                        if (timer_hour_int < 24):
                            timer_hour_int = timer_hour_int + 1
                    else:
                        timer_min_int = timer_min_int + 1
                else:
                    timer_sec_int = timer_sec_int + 5

            elif (x>70 and x<120):
                print('increase hours')
                
                # back to standard color
                timer_red = 0
                # increase hours up to 24
                if (timer_hour_int < 24):
                        timer_hour_int = timer_hour_int + 1
                
                
    # convert timer ints back to timer_str
    timer_min = str(timer_min_int).zfill(2)
    timer_hour = str(timer_hour_int).zfill(2)
    timer_sec = str(timer_sec_int).zfill(2)
    timer_str = timer_hour + ":" + timer_min + ":" + timer_sec
    timer_str_start = timer_str
    
    print timer_str
    
    return time_screen, stopwatch_stopped, stopwatch_start_time, stopwatch_elapsed_time, stopwatch_prev_time, timer_str, timer_stopped, timer_start_time, timer_str_start, timer_red

#############################################################################################
#----------------------------------------------------- function to perform time comparison for stopwatch  ----------------------------------------------------------
#############################################################################################
def timediff_stopwatch(start, current, prev):
# function to perform calculation for stopwatch elapsed time, using start time, current time, and prev elapsed time

    # convert times to int of total milliseconds
    start_msec  = start[9] + start[10] + start[11]
    start_sec   = start[6] + start[7]
    start_min   = start[3] + start[4]
    start_hour  = start[0] + start[1]
    start_int_sec = (3600*int(start_hour)) + (60*int(start_min)) + int(start_sec)
    start_int_msec = int(start_msec) + 1000*start_int_sec
    
    curr_msec  = current[9] + current[10] + current[11]
    curr_sec   = current[6] + current[7]
    curr_min   = current[3] + current[4]
    curr_hour  = current[0] + current[1]
    curr_int_sec = (3600*int(curr_hour)) + (60*int(curr_min)) + int(curr_sec)
    curr_int_msec = int(curr_msec) + 1000*curr_int_sec
    
    prev_msec  = prev[9] + prev[10] + prev[11]
    prev_sec   = prev[6] + prev[7]
    prev_min   = prev[3] + prev[4]
    prev_hour  = prev[0] + prev[1]  
    prev_int_sec = (3600*int(prev_hour)) + (60*int(prev_min)) + int(prev_sec)
    prev_int_msec = int(prev_msec) + 1000*prev_int_sec
    
    # calculate elapsed msec
    elapsed_msec = curr_int_msec - start_int_msec + prev_int_msec
    
    # convert back to hours, min, and sec
    elapsed_msec_int = elapsed_msec % 1000
    elapsed_sec = int(elapsed_msec / 1000)
    elapsed_sec_int = elapsed_sec % 60
    elapsed_min = int(elapsed_sec / 60)
    elapsed_min_int = elapsed_min % 60
    elapsed_hour_int = int(elapsed_min / 60)
    
    # convert to string
    elapsed_msec_str = str(elapsed_msec_int).zfill(3)
    elapsed_sec_str = str(elapsed_sec_int).zfill(2)
    elapsed_min_str = str(elapsed_min_int).zfill(2) 
    elapsed_hour_str = str(elapsed_hour_int).zfill(2)
    
    elapsed = elapsed_hour_str + ":" + elapsed_min_str + ":" + elapsed_sec_str + "." + elapsed_msec_str
    
    return elapsed

#############################################################################################
#----------------------------------------------------- function to perform time comparison for timer  ----------------------------------------------------------
#############################################################################################
def timediff_timer(current, start, timer_str):
# calculates and converts remaining time to a string, using current time, start time, and initial timer value
 
    # convert strings to int with total number of seconds
    start_sec   = start[6] + start[7]
    start_min   = start[3] + start[4]
    start_hour  = start[0] + start[1]
    start_int = (3600*int(start_hour)) + (60*int(start_min)) + int(start_sec)

    curr_sec   = current[6] + current[7]
    curr_min   = current[3] + current[4]
    curr_hour  = current[0] + current[1]
    curr_int = (3600*int(curr_hour)) + (60*int(curr_min)) + int(curr_sec)
    
    timer_sec = timer_str[6] + timer_str[7] 
    timer_min = timer_str[3] + timer_str[4]
    timer_hour = timer_str[0] + timer_str[1]    
    timer_int = (3600*int(timer_hour)) + (60*int(timer_min)) + int(timer_sec)
    
    # calculate remaining time
    elapsed_int = curr_int - start_int
    timer_int = timer_int - elapsed_int

    # convert back to hours and minutes
    timer_sec_int = timer_int % 60
    timer_min = int(timer_int / 60)
    timer_min_int = timer_min % 60
    timer_hour_int = int(timer_min / 60)
    
    # no negative time possible
    if (timer_int < 0):
        timer_sec_int = 0
        timer_min_int = 0
        timer_hour_int = 0

    # convert back to print string
    timer_sec   = str(timer_sec_int).zfill(2)
    timer_min   = str(timer_min_int).zfill(2)
    timer_hour  = str(timer_hour_int).zfill(2)
    timer_new_str = timer_hour + ":" + timer_min + ":" + timer_sec


    return timer_new_str

#############################################################################################
#-------------------------------------------------------------- function to draw pimusic app  -----------------------------------------------------------------------
#############################################################################################
def draw_pimusic(pimusic_screen,playing, song_num, timer_red):

    if (pimusic_screen is 0):
        # draw playlist screen
        instr_x = 160
        instr_y = 40
        p1_x = 160
        p2_x = 160
        p1_y = 120
        p2_y = 200

        # draw instruction
        my_font=pygame.font.Font(None,50)
        text_surface = my_font.render('Select a playlist', True, yellow)
        rect = text_surface.get_rect(center=(instr_x,instr_y))
        pygame.draw.rect(screen,green,(0,80,320,158),2)
        pygame.draw.rect(screen,green,(0,160,320,80),2)
        if ((playing == 1) and (song_num < 3)):
            # playlist 1 is playing
            pygame.draw.polygon(screen, white, [[50, 110], [70, 120], [50, 130]], 0)
        if ((playing == 1) and (song_num > 2)):
            # playlist 2 is playing
            pygame.draw.polygon(screen, white, [[50, 190], [70, 200], [50, 210]], 0)        
        screen.blit(text_surface, rect)
        # draw playlists
        my_buttons={'Popular': (p1_x,p1_y),'Classic': (p2_x,p2_y)}
        for my_text, text_pos in my_buttons.items():
                my_font=pygame.font.Font(None,35)
                text_surface = my_font.render('%s'%my_text, True, blue)
                rect = text_surface.get_rect(center=text_pos)
                screen.blit(text_surface, rect)
    
    ### Playlist 1 ###
    elif (pimusic_screen is 1):
        # draw playlist 1 buttons
        ctrl_x = 40
        ctrl_y = 30
        delta_x = 70
        
        # draw "back"
        my_font=pygame.font.Font(None,35)
        text_surface = my_font.render('BACK', True, yellow)
        rect = text_surface.get_rect(center=(ctrl_x + 3*delta_x + 10, ctrl_y))
        screen.blit(text_surface, rect)
        
        # draw play/pause
        if (playing):
            my_font=pygame.font.Font(None,40)
            text_surface = my_font.render('| |', True, green)
            rect = text_surface.get_rect(center=(ctrl_x + delta_x, ctrl_y))
            screen.blit(text_surface, rect)
        else:
            pygame.draw.polygon(screen, green, [[ctrl_x + delta_x - 10, ctrl_y - 10], [ctrl_x + delta_x + 10, ctrl_y], [ctrl_x + delta_x - 10, ctrl_y + 10]], 0)
        
        my_buttons={'<<': (ctrl_x,ctrl_y),'>>': (ctrl_x  + 2*delta_x ,ctrl_y)}
        my_font=pygame.font.Font(None,45)
        for my_text, text_pos in my_buttons.items():
                text_surface = my_font.render('%s'%my_text, True, green)
                rect = text_surface.get_rect(center=text_pos)
                screen.blit(text_surface, rect)
    
        song_x = 160
        song_y = 90
        delta_y = 60
        # draw songs

        if (song_num is 0):
            pygame.draw.rect(screen,blue,(0,120,320,60),2)
            pygame.draw.rect(screen,pink,(0,60,320,60),2)
            pygame.draw.rect(screen,blue,(0,180,320,59),2)
            
            if (playing):
                pygame.draw.polygon(screen, white, [[15, song_y - 10], [15 + 20, song_y], [15, song_y + 10]], 0)
            
        elif (song_num is 1):
            pygame.draw.rect(screen,blue,(0,60,320,60),2)
            pygame.draw.rect(screen,blue,(0,180,320,59),2)  
            pygame.draw.rect(screen,pink,(0,120,320,60),2)
            
            if (playing):
                pygame.draw.polygon(screen, white, [[15, song_y + delta_y - 10], [15 + 20, song_y + delta_y], [15, song_y + delta_y + 10]], 0)
            
        elif (song_num is 2):
            pygame.draw.rect(screen,blue,(0,60,320,60),2)
            pygame.draw.rect(screen,blue,(0,120,320,60),2)
            pygame.draw.rect(screen,pink,(0,180,320,59),2)  

            if (playing):
                pygame.draw.polygon(screen, white, [[15, song_y + 2*delta_y - 10], [15 + 20, song_y + 2*delta_y], [15, song_y + 2*delta_y + 10]], 0)            
        
        else:
            pygame.draw.rect(screen,blue,(0,60,320,60),2)
            pygame.draw.rect(screen,blue,(0,120,320,60),2)
            pygame.draw.rect(screen,blue,(0,180,320,59),2)          
        my_buttons={'I Feel It Coming': (song_x,song_y),'Beauty and the Beast': (song_x,song_y + delta_y),'Put Your Records On': (song_x,song_y + 2*delta_y)}
        for my_text, text_pos in my_buttons.items():
                my_font=pygame.font.Font(None,35)
                text_surface = my_font.render('%s'%my_text, True, blue)
                rect = text_surface.get_rect(center=text_pos)
                screen.blit(text_surface, rect)
        
    #### Playlist 2 ###
    elif (pimusic_screen is 2):
        # draw playlist 2 buttons
        ctrl_x = 40
        ctrl_y = 30
        delta_x = 70
        
        # draw "back"
        my_font=pygame.font.Font(None,35)
        text_surface = my_font.render('BACK', True, yellow)
        rect = text_surface.get_rect(center=(ctrl_x + 3*delta_x + 10, ctrl_y))
        screen.blit(text_surface, rect)
        
        # draw play/pause
        if (playing):
            my_font=pygame.font.Font(None,40)
            text_surface = my_font.render('| |', True, green)
            rect = text_surface.get_rect(center=(ctrl_x + delta_x, ctrl_y))
            screen.blit(text_surface, rect)
        else:
            pygame.draw.polygon(screen, green, [[ctrl_x + delta_x - 10, ctrl_y - 10], [ctrl_x + delta_x + 10, ctrl_y], [ctrl_x + delta_x - 10, ctrl_y + 10]], 0)
        
        my_buttons={'<<': (ctrl_x,ctrl_y),'>>': (ctrl_x  + 2*delta_x ,ctrl_y)}
        my_font=pygame.font.Font(None,45)
        for my_text, text_pos in my_buttons.items():
                text_surface = my_font.render('%s'%my_text, True, green)
                rect = text_surface.get_rect(center=text_pos)
                screen.blit(text_surface, rect)
    
        song_x = 160
        song_y = 90
        delta_y = 60
        # draw songs
        if (song_num is 3):
            pygame.draw.rect(screen,blue,(0,120,320,60),2)
            pygame.draw.rect(screen,pink,(0,60,320,60),2)
            pygame.draw.rect(screen,blue,(0,180,320,59),2)
            
            if (playing):
                pygame.draw.polygon(screen, white, [[15, song_y - 10], [15 + 20, song_y], [15, song_y + 10]], 0)
            
        elif (song_num is 4):
            pygame.draw.rect(screen,blue,(0,60,320,60),2)
            pygame.draw.rect(screen,blue,(0,180,320,59),2)  
            pygame.draw.rect(screen,pink,(0,120,320,60),2)
            
            if (playing):
                pygame.draw.polygon(screen, white, [[15, song_y + delta_y - 10], [15 + 20, song_y + delta_y], [15, song_y + delta_y + 10]], 0)
            
        elif (song_num is 5):
            pygame.draw.rect(screen,blue,(0,60,320,60),2)
            pygame.draw.rect(screen,blue,(0,120,320,60),2)
            pygame.draw.rect(screen,pink,(0,180,320,59),2)  

            if (playing):
                pygame.draw.polygon(screen, white, [[15, song_y + 2*delta_y - 10], [15 + 20, song_y + 2*delta_y], [15, song_y + 2*delta_y + 10]], 0)            
        else:
            pygame.draw.rect(screen,blue,(0,60,320,60),2)
            pygame.draw.rect(screen,blue,(0,120,320,60),2)
            pygame.draw.rect(screen,blue,(0,180,320,59),2)      
        my_buttons={'Fur Elise': (song_x,song_y),'Lucky': (song_x,song_y + delta_y),'Mozart No. 21': (song_x,song_y + 2*delta_y)}
        for my_text, text_pos in my_buttons.items():
                my_font=pygame.font.Font(None,35)
                text_surface = my_font.render('%s'%my_text, True, blue)
                rect = text_surface.get_rect(center=text_pos)
                screen.blit(text_surface, rect)
                
    # Global timer notifier
    if (timer_red == 1):
        my_font=pygame.font.Font(None,50)
        text_surface = my_font.render('TIMER!', True, red)
        rect = text_surface.get_rect(center=(160,120))
        screen.blit(text_surface, rect) 
    pygame.display.flip()
        
#############################################################################################
#-------------------------------------------------------------- function to check pimusic input  -----------------------------------------------------------------------
#############################################################################################
def pimusic_press(pos, pimusic_screen, playing, song_num):
    x,y = pos
    # if in one of playlists already
    if ((pimusic_screen == 1) or (pimusic_screen == 2)):
        ctrl_x = 40
        ctrl_y = 30
        delta_x = 70
        song_x = 160
        song_y = 90
        delta_y = 60
        # check control press
        if (y > ctrl_y -20 and y < ctrl_y + 17):
        
            if (x > ctrl_x - 30 and x < ctrl_x + 30):
                print("<< pressed")
                subprocess.call('echo "seek -30 0" > mp3_fifo',shell=True)
                
            elif (x > ctrl_x + delta_x - 30 and x < ctrl_x + delta_x + 30):
                print("play/pause pressed")
                playing = not playing
                subprocess.call('echo "pause" > mp3_fifo', shell=True)

            elif (x > ctrl_x + 2*delta_x - 30 and x < ctrl_x + 2*delta_x + 25):
                print(">> pressed")
                subprocess.call('echo "seek 30 0" > mp3_fifo',shell=True)
                
            elif (x > ctrl_x + 3*delta_x + 8 - 30 and x < ctrl_x + 3*delta_x + 12 + 30):
                print("BACK pressed")
                pimusic_screen = 0  

            
                
        # check song press
        elif (y > song_y - 30 and y < song_y + 30):
            #print("Song 1")
            # separate for song detection
            if (pimusic_screen == 1):
                if (song_num != 0):
                    playing = 0
                    subprocess.call('echo "stop" > mp3_fifo', shell=True)
                    # song for playlist 1
                    cmd =  'mplayer -loop 0 -novideo Weeknd.mp3 -ao alsa -input file=/home/pi/finalproject/mp3_fifo &'
                    subprocess.call(cmd, shell=True)
                    subprocess.call('echo "pause" > mp3_fifo', shell=True)
                    song_num = 0
                else:
                    if (playing == 1):
                        if (x > 160):
                            # increase volume
                            subprocess.call('echo "volume 10" > mp3_fifo', shell=True)
                        else: 
                            # decrease volume
                            subprocess.call('echo "volume -10" > mp3_fifo', shell=True)
                    
            elif (pimusic_screen == 2):
                if (song_num != 3):
                    playing = 0
                    subprocess.call('echo "stop" > mp3_fifo', shell=True)
                    # song for playlist 2
                    cmd =  'mplayer -loop 0 -novideo FurElise.mp3 -ao alsa -input file=/home/pi/finalproject/mp3_fifo &'
                    subprocess.call(cmd, shell=True)
                    subprocess.call('echo "pause" > mp3_fifo', shell=True)  
                    song_num = 3
                else:
                    if (playing == 1):
                        if (x > 160):
                            # increase volume
                            subprocess.call('echo "volume 10" > mp3_fifo', shell=True)
                        else: 
                            # decrease volume
                            subprocess.call('echo "volume -10" > mp3_fifo', shell=True)

        
            
        elif (y > song_y + delta_y - 30 and y < song_y + delta_y + 30):
            if (pimusic_screen == 1):       
                if (song_num != 1):
                    playing = 0
                    subprocess.call('echo "stop" > mp3_fifo', shell=True)
                    # song for playlist 1
                    cmd =  'mplayer -loop 0 -novideo BATB.mp3 -ao alsa -input file=/home/pi/finalproject/mp3_fifo &'
                    subprocess.call(cmd, shell=True)
                    subprocess.call('echo "pause" > mp3_fifo', shell=True)
                    song_num = 1
                else:
                    if (playing == 1):
                        if (x > 160):
                            # increase volume
                            subprocess.call('echo "volume 10" > mp3_fifo', shell=True)
                        else: 
                            # decrease volume
                            subprocess.call('echo "volume -10" > mp3_fifo', shell=True) 
                            
            elif (pimusic_screen == 2):
                if (song_num != 4):
                    playing = 0
                    subprocess.call('echo "stop" > mp3_fifo', shell=True)
                    # song for playlist 2
                    cmd =  'mplayer -loop 0 -novideo Lucky.mp3 -ao alsa -input file=/home/pi/finalproject/mp3_fifo &'
                    subprocess.call(cmd, shell=True) 
                    subprocess.call('echo "pause" > mp3_fifo', shell=True)  
                    song_num = 4
                else:
                    if (playing == 1):
                        if (x > 160):
                            # increase volume
                            subprocess.call('echo "volume 10" > mp3_fifo', shell=True)
                        else: 
                            # decrease volume
                            subprocess.call('echo "volume -10" > mp3_fifo', shell=True)
                            
        elif (y > song_y + 2*delta_y - 30 and y < song_y + 2*delta_y + 30):
            #print("Song 3")        
            if (pimusic_screen == 1):
                if (song_num != 2):
                    playing = 0
                    subprocess.call('echo "stop" > mp3_fifo', shell=True)
                    # song for playlist 1
                    cmd =  'mplayer -loop 0 -novideo Records.mp3 -ao alsa -input file=/home/pi/finalproject/mp3_fifo &'
                    subprocess.call(cmd, shell=True)
                    subprocess.call('echo "pause" > mp3_fifo', shell=True)
                    song_num = 2
                else:
                    if (playing == 1):
                        if (x > 160):
                            # increase volume
                            subprocess.call('echo "volume 10" > mp3_fifo', shell=True)
                        else: 
                            # decrease volume
                            subprocess.call('echo "volume -10" > mp3_fifo', shell=True)                 
                    
            elif (pimusic_screen == 2):
                if (song_num != 5):
                    playing = 0
                    subprocess.call('echo "stop" > mp3_fifo', shell=True)
                    # song for playlist 2
                    cmd =  'mplayer -loop 0 -novideo Mozart.mp3 -ao alsa -input file=/home/pi/finalproject/mp3_fifo &'
                    subprocess.call(cmd, shell=True)
                    subprocess.call('echo "pause" > mp3_fifo', shell=True)  
                    song_num = 5
                else:
                    if (playing == 1):
                        if (x > 160):
                            # increase volume
                            subprocess.call('echo "volume 10" > mp3_fifo', shell=True)
                        else: 
                            # decrease volume
                            subprocess.call('echo "volume -10" > mp3_fifo', shell=True)                 

    # on main menu
    else: 
        # check playlist press
        p1_y = 120
        p2_y = 200
        if (y > p1_y -40 and y < p1_y + 40):
            print("Playlist 1")
            pimusic_screen = 1
        elif (y > p2_y -40 and y < p2_y + 40):
            print("Playlist 2") 
            pimusic_screen = 2
        else: 
            pimusic_screen = 0 # need this??

            
    return pimusic_screen, playing, song_num

#############################################################################################
#-------------------------------------------------------------- function to draw pimessage app -----------------------------------------------------------------------
#############################################################################################
def draw_pimsg(msg_screen, timer_red):  
    # Main message screen, draw control buttons
    if (msg_screen==0):
        my_buttons={'Clear': (40,210),'Text': (150,210),'Send': (260,210)}
        my_font=pygame.font.Font(None,25)
        for my_text, text_pos in my_buttons.items():
                text_surface = my_font.render('%s'%my_text, True, white)
                rect = text_surface.get_rect(center=text_pos)
                screen.blit(text_surface, rect)
        my_txt_font=pygame.font.Font(None,15)
        pygame.draw.rect(screen,yellow,(10,20,300,60),2)
        msg_surface=my_txt_font.render('%s'%text_message,True,cyan)
        msg_rect=msg_surface.get_rect(center=(150,40))
        screen.blit(msg_surface,msg_rect)
    
    # Pre-set messages screen, draw buttons
    elif (msg_screen==1):
        my_buttons={'Back': (40,210)}
        my_font=pygame.font.Font(None,25)
        for my_text, text_pos in my_buttons.items():
                text_surface = my_font.render('%s'%my_text, True, white)
                rect = text_surface.get_rect(center=text_pos)
                screen.blit(text_surface, rect)
        my_buttons2={'Hello!':(40,40),'What\'s up?':(40,70),'On my way.':(40,100),'OK':(40,130),'Sure!':(40,160),'No Problem!':(160,40),'Where are you?':(160,70),'Thank you':(160,100),'Talk later?':(160,130),'Sorry, can\'t talk right now...':(160,160), 'Great!':(280,40),'Yes':(280,70),'Almost there!':(280,100),'No':(280,130),'Here':(280,160)}
        my_font2=pygame.font.Font(None,15)
        for my_text, text_pos in my_buttons2.items():
                text_surface = my_font2.render('%s'%my_text, True, white)
                rect = text_surface.get_rect(center=text_pos)
                screen.blit(text_surface, rect)
    # Global timer notifier
    if (timer_red == 1):
        my_font=pygame.font.Font(None,50)
        text_surface = my_font.render('TIMER!', True, red)
        rect = text_surface.get_rect(center=(160,120))
        screen.blit(text_surface, rect)
    pygame.display.flip()

#############################################################################################
#-------------------------------------------------------------- function to check pimessage input -----------------------------------------------------------------------
#############################################################################################
def pimsg_press(client,text_message,send,msg_screen,pos):
    x,y=pos
    send=0
    s0_x=40
    s0_y=210
    s0_deltax=110
    s1_x=40
    s1_y=40
    s1_deltax=120
    s1_deltay=30

    # detect control presses
    if (msg_screen==0):
        if (y>s0_y-20 and y<s0_y+20):
            if (x>s0_x-20 and x<s0_x+20):
                print('Clear pushed')
                text_message=''
            elif (x>s0_x+s0_deltax-20 and x<s0_x+s0_deltax+20):
                print ('Text message menu pushed')
                msg_screen=1
            elif (x>s0_x+2*s0_deltax-20 and x<s0_x+2*s0_deltax+20):
                print ('Send pushed')
                send=1
                client.messages.create(from_='+16072755445',to='+16156361096',body=text_message)
                text_message=''
    # detect presses for pre-set messages or "back"
    elif (msg_screen==1):
        if (y>190 and y<230): #back pressed
            if (x>s1_x-20 and x<s1_x+20):
                msg_screen=0
                print('Back pressed')
        if (y>s1_y-10 and y<s1_y+10): #first row pushed
            if (x>s1_x-15 and x<s1_x+20):
                text_message=text_message+'Hello! '
            elif (x>s1_x+s1_deltax-30 and x<s1_x+s1_deltax+30):
                text_message=text_message+'No Problem! '
            elif (x>s1_x+2*s1_deltax-25 and x<s1_x+2*s1_deltax+25):
                text_message=text_message+'Great! '
        elif (y>s1_y+s1_deltay-10 and y<s1_y+s1_deltay+10): #second row pushed
            if (x>s1_x-25 and x<s1_x+25):
                text_message=text_message+'What\'s up? '
            elif (x>s1_x+s1_deltax-35 and x<s1_x+s1_deltax+35):
                text_message=text_message+'Where are you? '
            elif (x>s1_x+2*s1_deltax-10 and x<s1_x+2*s1_deltax+10):
                text_message=text_message+'Yes '
        elif (y>s1_y+2*s1_deltay-10 and y<s1_y+2*s1_deltay+10): #third row pushed
            if (x>s1_x-25 and x<s1_x+25):
                text_message=text_message+'On my way '
            elif (x>s1_x+s1_deltax-25 and x<s1_x+s1_deltax+25):
                text_message=text_message+'Thank you.  '
            elif (x>s1_x+2*s1_deltax-25 and x<s1_x+2*s1_deltax+25):
                text_message=text_message+'Almost there! '
        elif (y>s1_y+3*s1_deltay-10 and y<s1_y+3*s1_deltay+10): #fourth row pushed
            if (x>s1_x-15 and x<s1_x+15):
                text_message=text_message+'OK '
            elif (x>s1_x+s1_deltax-25 and x<s1_x+s1_deltax+25):
                text_message=text_message+'Talk later?  '
            elif (x>s1_x+2*s1_deltax-15 and x<s1_x+2*s1_deltax+15):
                text_message=text_message+'No. '
        elif (y>s1_y+4*s1_deltay-10 and y<s1_y+4*s1_deltay+10): #fifth row pushed
            if (x>s1_x-20 and x<s1_x+20):
                text_message=text_message+'Sure! '
            elif (x>s1_x+s1_deltax-50 and x<s1_x+s1_deltax+50):
                text_message=text_message+'Sorry, can\'t talk right now...  '
            elif (x>s1_x+2*s1_deltax-20 and x<s1_x+2*s1_deltax+20):
                text_message=text_message+'Here. '
    return text_message,msg_screen,send 

#############################################################################################
#-------------------------------------------------------------- function to draw pisimon app -----------------------------------------------------------------------
#############################################################################################
def draw_pisimon(play_screen, length, timer_red):
    pygame.draw.rect(screen,red,(60,60,100,60))
    pygame.draw.rect(screen,yellow,(160,60,100,60))
    pygame.draw.rect(screen,green,(60,120,100,60))
    pygame.draw.rect(screen,blue,(160,120,100,60))
    
    my_text = 'Level ' + str(length - 2)
    my_font=pygame.font.Font(None,25)
    text_surface = my_font.render('%s'%my_text, True, white)
    rect = text_surface.get_rect(center=(80,30))
    screen.blit(text_surface, rect)
    
    if (timer_red == 1):
        my_font=pygame.font.Font(None,50)
        text_surface = my_font.render('TIMER!', True, red)
        rect = text_surface.get_rect(center=(160,180))
        screen.blit(text_surface, rect) 


    if (play_screen==0):
        my_buttons={'Press Here to Begin Playing': (160,210)}
    elif (play_screen == 1):
        my_buttons={'Watch the pattern!': (160,210)}
    elif (play_screen == 2):
        my_buttons={'Enter the pattern!': (160,210)}
    elif (play_screen == 3):
        my_buttons={'GAME OVER!': (160,120)}
        my_font=pygame.font.Font(None,50)
    elif (play_screen == 4):
        my_buttons={'CORRECT!': (160,120)}
        my_font=pygame.font.Font(None,50)
    for my_text, text_pos in my_buttons.items():
        text_surface = my_font.render('%s'%my_text, True, white)
        rect = text_surface.get_rect(center=text_pos)
        screen.blit(text_surface, rect)         
    pygame.display.flip()

#############################################################################################
#-------------------------------------------------------------- function to animate tile flash -----------------------------------------------------------------------
#############################################################################################
def draw_pisimon_flash(color, delay, play_screen, length, timer_red):
    screen.fill(black)
    print "in draw flash"
    draw_pisimon(play_screen,length, timer_red)
    if (color == green):
        pygame.draw.rect(screen,white,(60,120,100,60),4)
    elif (color == red):
        pygame.draw.rect(screen,white,(60,60,100,60),4)
    elif (color == yellow):
        pygame.draw.rect(screen,white,(160,60,100,60),4)
    elif (color == blue):
        pygame.draw.rect(screen,white,(160,120,100,60),4)
    pygame.display.flip()
    pygame.time.wait(delay)
    screen.fill(black)
    draw_pisimon(play_screen,length, timer_red)
    pygame.display.flip()
    pygame.time.wait(delay)

#############################################################################################
#-------------------------------------------------------------- function to display results -----------------------------------------------------------------------
#############################################################################################
def draw_pisimon_result(play_screen, length, timer_red):
    screen.fill(black)
    draw_pisimon(play_screen,length, timer_red)
    pygame.display.flip()
    pygame.time.wait(2*1000)

#############################################################################################
#-------------------------------------------------------------- function to animate pattern -----------------------------------------------------------------------
#############################################################################################   
def draw_list_flash (master_list, delay, play_screen,length, timer_red):
    for color in master_list:
        draw_pisimon_flash(color,delay,play_screen,length, timer_red)

#############################################################################################
#-------------------------------------------------------------- function to check pisimon input -----------------------------------------------------------------------
#############################################################################################
def pisimon_press(pos,play_screen, master_list, user_list, delay, length, timer_red):
    x,y = pos
    # detect presses: colors and "start"
    if (play_screen==0):
        if (y>=200 and y<=220):
            if (x>=45 and y<=280):
                play_screen=1
                print('click detected') 
                draw_list_flash(master_list,delay,play_screen,length, timer_red)
                play_screen=2
    elif (play_screen==2):
        #check until len(user_list)=len(master_list)
        #if user_list==master_list
        if (y>=60 and y<=120):
            if (x>=60 and x<=160):
                user_list.append(red)
            elif (x>160 and x<=260):
                user_list.append(yellow)
        elif (y>120 and y<=180):
            if (x>=60 and x<=160):
                user_list.append(green)
            elif (x>160 and x<=260):
                user_list.append(blue)
        if (len(user_list) == len(master_list)):
            length,user_list,master_list,play_screen,delay= pisimon_control(length,user_list,master_list,delay, timer_red)
        print user_list
    return play_screen, master_list, user_list, length,delay

#############################################################################################
#-------------------------------------------------------------- function to control pisimon game state -----------------------------------------------------------------------
#############################################################################################
def pisimon_control(length,user_list,master_list,delay, timer_red):
    if (user_list == master_list):
        #correct 
        # generate next sequence, restart
        play_screen = 4
        draw_pisimon_result(play_screen,length, timer_red)
        play_screen = 1
        length = length + 1
        # make it harder as you go
        if (length > 4):
            delay = 800
        elif (length > 6):
            delay = 650
        elif (length > 8):
            delay = 500
        elif (length > 10):
            delay = 350
        elif (length > 12):
            delay = 200
        
        user_list=[]
        master_list = gen_pisimon_list(length)
        draw_list_flash(master_list,delay,play_screen,length, timer_red)
        play_screen=2
        
    else:
        # incorrect
        # display game over and "click to restart"
        play_screen = 3
        draw_pisimon_result(play_screen,length, timer_red)
        #PiSimon reset
        play_screen=0
        length = 3
        user_list=[]
        master_list = gen_pisimon_list(length)

    return length,user_list,master_list,play_screen,delay
    
#############################################################################################
#-------------------------------------------------------------- function to generate random pattern -----------------------------------------------------------------------
#############################################################################################
def gen_pisimon_list(length):
    list=[]
    for i in range(0, length):
        num = random.randint(1, 4)
        if (num == 1):
            list.append(red)
        elif (num == 2):
            list.append(blue)
        elif (num == 3):
            list.append(green)
        elif (num == 4):
            list.append(yellow)
    return list
    
    
#############################################################################################
#-------------------------------------------------------------- Main Program Flow -----------------------------------------------------------------------
#############################################################################################
# init pygame
pygame.init()
pygame.mouse.set_visible(False)

# display setting and colors
size = width, height = 320, 240
black = 0, 0, 0
white = 255, 255, 255
blue = 0, 0, 255
red = 255, 0, 0
green = 0, 255, 0
pink = 255, 0, 255
cyan = 0, 255, 255
orange = 255, 128, 0
yellow = 255, 255, 0 
screen = pygame.display.set_mode(size)

locked = 1
passcode_error=0
passcode = ['1','2','3','4']
currently_entered = []
hs_buttons_colors=[red,green,blue,pink,cyan]
hs_number = 1
current_app = 99 #no apps

#for picalc
terms=['','',''] #first=first term, second=second term, third=answer
first_float=0 #0=int, 1=float
second_float=0
term_toggle=0 #0=add numbers to first term; 1=add to second term; 2=for displaying answer (should never be 2 in picalc_calc())
sign=0
decimal_pressed = 0

#for pitime
time_screen=0
stopwatch_start_time = "00:00:00.000"
stopwatch_elapsed_time = "00:00:00.000"
stopwatch_prev_time = "00:00:00.000"
stopwatch_stopped = 1

timer_str_start = "00:00:00"
timer_str = "00:00:00"
timer_stopped = 1
timer_start_time = "00:00:00"
timer_red = 0

# for pimusic
pimusic_screen = 0
playing = 0
song_num = 0
# start mplayer with playlist 1, song 0
cmd =  'mplayer -loop 0 -novideo Weeknd.mp3 -ao alsa -input file=/home/pi/finalproject/mp3_fifo &'
subprocess.call(cmd, shell=True)
cmd = 'echo "pause" > mp3_fifo'
subprocess.call(cmd, shell=True)

#for message app
msg_screen=0
send=0
text_message=''
screen.fill(black)
client=Client('ACf26adf116b1a934b37d87e5327d4f3c4','de8b5c965a22217df9c0fcb29c58abb0')

#for simon game
length = 3
play_screen=0
simon_delay=1000
master_list = gen_pisimon_list(length)
user_list=[]

screen.fill(black)

while (True):

    # clear screen
    screen.fill(black)
    
    # if timer is going, update elapsed time and display
    if (timer_stopped == 0):
        curr_time = time.strftime("%H:%M:%S",time.localtime())
        timer_str = timediff_timer(curr_time, timer_start_time, timer_str_start)
        
        # number is drawn in red if timer runs out
        if ((timer_str == "00:00:00") and (timer_str_start != "00:00:00") and (timer_stopped == 0)):
            timer_red = 1
            timer_stopped = 1

    # draw lock screen if still locked
    if (locked):
        draw_lock_screen(passcode_error, timer_red)


        # detect passcode presses and update list
        for event in pygame.event.get():

            if(event.type is MOUSEBUTTONDOWN):
                pos = pygame.mouse.get_pos()
        
            elif(event.type is MOUSEBUTTONUP):
                passcode_error=passcode_press(pos,passcode_error)
        
        if (len(currently_entered)==4):
            draw_lock_screen(passcode_error, timer_red)
            locked,currently_entered,passcode_error=check_passcode(currently_entered)
    else:
    
            # Return to lock screen
        if (not GPIO.input(17)):
            locked=1
            current_app=99
            hs_number=1
            
            #PiCalc reset
            terms=['','',''] #first=first term, second=second term, third=answer
            first_float=0 #0=int, 1=float
            second_float=0
            term_toggle=0 #0=add numbers to first term; 1=add to second term; 2=for displaying answer (should never be 2 in picalc_calc())
            sign=0
            
            #PiSimon reset
            play_screen=0
            simon_delay=1000
            length = 3
            master_list = gen_pisimon_list(length)
            user_list=[]


        # Return to home screen 1
        if (not GPIO.input(22)):
            locked=0
            current_app=99  
            hs_number=1
            #PiCalc reset
            terms=['','',''] #first=first term, second=second term, third=answer
            term_toggle=0 #0=add numbers to first term; 1=add to second term; 2=for displaying answer (should never be 2 in picalc_calc())
            sign=0

            #PiSimon reset
            play_screen=0
            simon_delay=1000
            length = 3  
            master_list = gen_pisimon_list(length)
            user_list=[]
        

        
        if (current_app is 99 and (locked == 0)): # draw home screen
            draw_homescreen(hs_buttons_colors, hs_number, timer_red)
            for event in pygame.event.get():
                if(event.type is MOUSEBUTTONDOWN):
                    pos = pygame.mouse.get_pos()
                elif(event.type is MOUSEBUTTONUP):
                    hs_number, current_app = hs_press(pos,hs_number, current_app)
                    
        elif (current_app is 2):
            # PiCalc
            draw_picalc(terms, term_toggle, timer_red)
            for event in pygame.event.get():
                if(event.type is MOUSEBUTTONDOWN):
                    pos = pygame.mouse.get_pos()
                elif(event.type is MOUSEBUTTONUP):
                    term_toggle,terms,sign,decimal_pressed = picalc_press(pos,terms,term_toggle,sign, decimal_pressed)
                    
            # draw updated picalc
            screen.fill(black)
            draw_picalc(terms, term_toggle, timer_red)
            pygame.display.flip()
            
        
        
        elif (current_app is 1):
            # PiTime
            timer_str, timer_red, timer_stopped = draw_pitime(time_screen,stopwatch_stopped, stopwatch_start_time, stopwatch_elapsed_time, stopwatch_prev_time, timer_str, timer_stopped, timer_start_time, timer_str_start, timer_red)
            for event in pygame.event.get():
                if(event.type is MOUSEBUTTONDOWN):
                    pos = pygame.mouse.get_pos()
                elif(event.type is MOUSEBUTTONUP):
                    time_screen,stopwatch_stopped, stopwatch_start_time, stopwatch_elapsed_time, stopwatch_prev_time, \
                    timer_str, timer_stopped, timer_start_time,timer_str_start, timer_red = \
                    pitime_press(time_screen,pos,stopwatch_stopped, stopwatch_start_time, stopwatch_elapsed_time, stopwatch_prev_time, \
                    timer_str, timer_stopped, timer_start_time,timer_str_start, timer_red)  

            # draw updated pitime
            screen.fill(black)
            timer_str, timer_red, timer_stopped = draw_pitime(time_screen,stopwatch_stopped, stopwatch_start_time, stopwatch_elapsed_time, stopwatch_prev_time, timer_str, timer_stopped, timer_start_time, timer_str_start, timer_red)
                
        elif (current_app is 4):
            # draw piMusic
            draw_pimusic(pimusic_screen, playing, song_num, timer_red)
            # check press
            for event in pygame.event.get():
                if(event.type is MOUSEBUTTONDOWN):
                    pos = pygame.mouse.get_pos()
                elif(event.type is MOUSEBUTTONUP):
                    pimusic_screen, playing, song_num =  pimusic_press(pos, pimusic_screen, playing, song_num)
        
        elif (current_app is 3):
            #PiMsg
            draw_pimsg(msg_screen, timer_red)   
            for event in pygame.event.get():
                if(event.type is MOUSEBUTTONDOWN):
                    pos = pygame.mouse.get_pos()
                elif(event.type is MOUSEBUTTONUP):
                    text_message,msg_screen,send=pimsg_press(client,text_message,send,msg_screen,pos)
                    print text_message
        
        elif (current_app is 5):
            draw_pisimon(play_screen,length, timer_red)
            for event in pygame.event.get():
                if(event.type is MOUSEBUTTONDOWN):
                    pos = pygame.mouse.get_pos()
                elif(event.type is MOUSEBUTTONUP):
                    play_screen, master_list, user_list,length,delay = pisimon_press(pos,play_screen,master_list,user_list,simon_delay,length, timer_red)
        else: 
            screen.fill(black)
            pygame.display.flip()

    # Active low input ==> button press occurs if input goes to 0
    if (not GPIO.input(27)):
            # Rightmost button pressed ==> exit python program
            # quit mplayer
            cmd = 'echo "stop" > mp3_fifo'
            subprocess.call(cmd, shell=True)                
            sys.exit()