# project gesture recognition for music playing control
# ECE 5725 Final Project
# Dec. 1st 2016
# Tianze Jiang

import sys
import pygame
import os
import RPi.GPIO as GPIO
import subprocess

#os.putenv('SDL_VIDEODRIVER','fbcon')
#os.putenv('SDL_FBDEV', '/dev/fb1')
#os.putenv('SDL_MOUSEDRV', 'TSLIB')
#os.putenv('SDL_MOUSEDEV', '/dev/input/touchscreen')

GPIO.setmode(GPIO.BCM) # Set for broadcom numbering not board numbers

GPIO.setup(21, GPIO.IN, pull_up_down=GPIO.PUD_UP) # sensor input GPIO ports declaration
GPIO.setup(20, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(16, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(12, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(25, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP)

GPIO.setup(27, GPIO.IN, pull_up_down=GPIO.PUD_UP) # quit button port

musicarray = ['1.flac','2.flac','3.flac','4.flac','5.flac','6.flac'] #music list
n = 0

v = 0.5

pygame.mixer.pre_init(44100, -16, 2, 2048) # music player initialization
pygame.mixer.init()
pygame.mixer.music.load(musicarray[n])
pygame.mixer.music.play(-1)
pygame.mixer.music.set_volume(v)
pygame.mixer.music.pause()

#unsuitable flag
pauseflag = 0

pygame.init()

size = width, heights = 320, 240
WHITE = (255,255,255)
BLACK = (0,0,0)

screen = pygame.display.set_mode(size)
screen.fill(BLACK)

font_big = pygame.font.Font(None, 30)
menu0 = {'Put your hand':(160,100), 'at the center':(160, 140)}
menu1 = {'Volume down':(80,110), '<--':(40,130), 'volume up':(240,110), '-->':(280,130), 'pause/resume':(160,200), '|':(160,220), 'V':(160,230)}
menu2 = {'fast backward':(80,110), '<--':(40,130), 'fast forward':(240,110), '-->':(280,130), 'pause/resume':(160,200), '|':(160,220), 'V':(160,230)}

state0 = {'Volume down':(160,120)}
state1 = {'Volume up':(160,120)}
state2 = {'pause/resume':(160,120)}
state3 = {'fast backward':(160,120)}
state4 = {'fast forward':(160,120)}
state5 = {'restart music':(160,120)}

centercounter = 0
recflag = 0
doneflag = 1
sleft = 0
sright = 0
sdown = 0

while True:
for event in pygame.event.get():
if event.type == pygame.QUIT: sys.exit()

if recflag == 0:
if ( not GPIO.input(25) == 1):
recflag = 1
centercounter = centercounter + 1
else:
if ( not GPIO.input(25) == 1): # sweep direction recognition logic
centercounter = centercounter + 1
if ( not GPIO.input(16) == 1):
slefti = 1
else:
slefti = 0
if ( not GPIO.input(23) == 1):
srighti = 1
else:
srighti = 0
if ( not GPIO.input(17) == 0):
sdowni = 1
else:
sdowni = 0

if slefti == 1:
if ( GPIO.input(12) ):
sleft = 1

if srighti == 1:
if ( not GPIO.input(24) ):
sright == 1

if sdowni == 1:
if ( not GPIO.input(20) ):
sdown = 1

if doneflag == 1: # control signal generation according to
if centercounter > 200 and centercounter < 400: # center counter and sweep direction
if sleft == 1:
#volume down
if v >= 0.1:
v = v - 0.1
pygame.mixer.music.set_volume(v)
else:
pygame.mixer.music.set_volume(0)
doneflag = 0
elif sright == 1:
#volume up
if v <= 0.9:
v = v + 0.1
pygame.mixer.music.set_volume(v)
else:
pygame.mixer.music.set_volume(1)
doneflag = 0
elif sdown == 1:
#pause
if pauseflag == 0:
pauseflag = 1
pygame.mixer.music.pause()
else:
pauseflag = 0
pygame.mixer.music.unpause()
doneflag = 0

if centercounter > 400:
if sright == 1:
#fastforward 10s
p = pygame.mixer.music.get_pos()
pygame.mixer.music.set_pos(p+10000)
doneflag = 0
elif sleft == 1:
#fastbackward 10s
p = pygame.mixer.music.get_pos()
pygame.mixer.music.set_pos(p-10000)
doneflag = 0
elif sdown == 1:
#rewind
pygame.mixer.music.rewind()
doneflag = 0

screen.fill(BLACK)
if centercounter < 200:
for k,v in menu0.items():
text_surface = font_big.render('%s'%k, True, WHITE) # menu display updates
rect = text_surface.get_rect(center=v)
screen.blit(text_surface, rect)

elif centercounter < 400:
for k,v in menu1.items():
text_surface = font_big.render('%s'%k, True, WHITE)
rect = text_surface.get_rect(center=v)
screen.blit(text_surface, rect)

else:
for k,v in menu2.items():
text_surface = font_big.render('%s'%k, True, WHITE)
rect = text_surface.get_rect(center=v)
screen.blit(text_surface, rect)

pygame.display.flip()

print centercounter
print " ", GPIO.input(17)
print " ", GPIO.input(4)
print GPIO.input(16),GPIO.input(12),GPIO.input(25),GPIO.input(24),GPIO.input(23)
print " ", GPIO.input(20)
print " ", GPIO.input(21)
print " "
print "recflag", recflag
print "doneflag", doneflag
print "sleft", sleft
print "sright", sright
print "sdown", sdown

clear = ( not GPIO.input(21)) or ( not GPIO.input(20)) or ( not GPIO.input(16)) or ( not GPIO.input(12)) or ( not GPIO.input(25)) or ( not GPIO.input(24)) or ( not GPIO.input(23)) or ( not GPIO.input(4)) or ( not GPIO.input(17))
print " "
print not clear

if not clear: # check if nothing covers any sensor
recflag = 0
doneflag = 1
centercounter = 0

if ( not GPIO.input(27) ):
exit(0)

GPIO.cleanup()