# NeoPixel library strandtest example
# Author: Tony DiCola (tony@tonydicola.com)
#
# Direct port of the Arduino NeoPixel library strandtest example.  Showcases
# various animations on a strip of NeoPixels.
import time
#import getch

from neopixel import *

# LED strip configuration:
LED_COUNT      = 1200      # Number of LED pixels.
LED_PIN        = 18      # GPIO pin connected to the pixels (18 uses PWM!).
#LED_PIN        = 21    # GPIO pin connected to the pixels (10 uses SPI /dev/spidev0.0).
LED_FREQ_HZ    = 800000 # LED signal frequency in hertz (usually 800khz)
LED_DMA        = 5       # DMA channel to use for generating signal (try 5)
LED_BRIGHTNESS = 255     # Set to 0 for darkest and 255 for brightest
LED_INVERT     = False   # True to invert the signal (when using NPN transistor level shift)
LED_CHANNEL    = 0       # set to '1' for GPIOs 13, 19, 41, 45 or 53
LED_STRIP      = ws.WS2811_STRIP_RBG   # Strip type and colour ordering

pressed = False
levelR = 128
levelG = 0
levelB = 0

# Define functions which animate LEDs in various ways.
def colorWipe(strip, color, wait_ms=50):
	"""Wipe color across display a pixel at a time."""
	for i in range(strip.numPixels()):
		strip.setPixelColor(i, color)
		strip.show()
		time.sleep(wait_ms/1000.0)

def off(strip):
	for i in range(strip.numPixels()):
		strip.setPixelColor(i,Color(0,0,0))
	strip.show()

def colorTest(strip, wait_ms=1):
	R = 0
	G = 0
	B = 0
	it = 0
	step = 8
	top = 256
	while True:
		for it in range(0,2*top,step):
			if it < top:
				#print it
				for i in range(strip.numPixels()):
					strip.setPixelColor(i,Color(it,0,0))
			else:
				#print 511-it
				for i in range(strip.numPixels()):
					strip.setPixelColor(i,Color((2*top-1-it),0,0))
			strip.show()    
		for it in range(0,2*top,step):
			if it < top:
				for i in range(strip.numPixels()):
					strip.setPixelColor(i,Color(0,it,0))
			else:
				for i in range(strip.numPixels()):
					strip.setPixelColor(i,Color(0,(2*top-1-it),0))
			strip.show()
		for it in range(0,2*top,step):
			if it < top:
				for i in range(strip.numPixels()):
					strip.setPixelColor(i,Color(0,0,it))
			else:
				for i in range(strip.numPixels()):
					strip.setPixelColor(i,Color(0,0,(2*top-1-it)))
			strip.show()
		for it in range(0,2*top,step):
			if it < top:
				for i in range(strip.numPixels()):
					strip.setPixelColor(i,Color(it,it,it))
			else:
				for i in range(strip.numPixels()):
					strip.setPixelColor(i,Color((2*top-1-it),(2*top-1-it),(2*top-1-it)))
			strip.show()
		
def myTest(strip, wait_ms=50):
	global levelR
	global levelG
	global levelB
	char = getch.getch()
	if char == 'a':
		if levelR < 254:
			levelR = levelR+2
			print(str(levelR)+','+str(levelG)+','+str(levelB))
	elif char == 's':
		if levelG < 254:
			levelG = levelG + 2
			print (str(levelR)+','+str(levelG)+','+str(levelB))
	elif char == 'd':
		if levelB < 254:
			levelB = levelB + 2
			print (str(levelR)+','+str(levelG)+','+str(levelB))
	elif char == 'z':
		if levelR > 0:
			levelR = levelR - 2
			print (str(levelR)+','+str(levelG)+','+str(levelB))
	elif char == 'x':
		if levelG > 0:
			levelG = levelG - 2
			print (str(levelR)+','+str(levelG)+','+str(levelB))
	elif char == 'c':
		if levelB > 0:
			levelB = levelB - 2
			print (str(levelR)+','+str(levelG)+','+str(levelB))
	elif char == 'q':
		exit()
	for i in range(strip.numPixels()):
		strip.setPixelColor(i,Color(levelR,levelG,levelB))
	strip.show()    
	time.sleep(wait_ms/100.0)        

def theaterChase(strip, color, wait_ms=50, iterations=10):
	"""Movie theater light style chaser animation."""
	for j in range(iterations):
		for q in range(3):
			for i in range(0, strip.numPixels(), 3):
				strip.setPixelColor(i+q, color)
			strip.show()
			time.sleep(wait_ms/1000.0)
			for i in range(0, strip.numPixels(), 3):
				strip.setPixelColor(i+q, 0)

def wheel(pos):
	"""Generate rainbow colors across 0-255 positions."""
	if pos < 85:
		return Color(pos * 3, 255 - pos * 3, 0)
	elif pos < 170:
		pos -= 85
		return Color(255 - pos * 3, 0, pos * 3)
	else:
		pos -= 170
		return Color(0, pos * 3, 255 - pos * 3)

def rainbow(strip, wait_ms=20, iterations=1):
	"""Draw rainbow that fades across all pixels at once."""
	for j in range(256*iterations):
		for i in range(strip.numPixels()):
			strip.setPixelColor(i, wheel((i+j) & 255))
		strip.show()
		time.sleep(wait_ms/1000.0)

def rainbowCycle(strip, wait_ms=20, iterations=5):
	"""Draw rainbow that uniformly distributes itself across all pixels."""
	for j in range(256*iterations):
		for i in range(strip.numPixels()):
			strip.setPixelColor(i, wheel((int(i * 256 / strip.numPixels()) + j) & 255))
		strip.show()
		time.sleep(wait_ms/1000.0)

def theaterChaseRainbow(strip, wait_ms=50):
	"""Rainbow movie theater light style chaser animation."""
	for j in range(256):
		for q in range(3):
			for i in range(0, strip.numPixels(), 3):
				strip.setPixelColor(i+q, wheel((i+j) % 255))
			strip.show()
			time.sleep(wait_ms/1000.0)
			for i in range(0, strip.numPixels(), 3):
				strip.setPixelColor(i+q, 0)


# Main program logic follows:
if __name__ == '__main__':
	# Create NeoPixel object with appropriate configuration.
	strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL, LED_STRIP)
	# Intialize the library (must be called once before other functions).
	strip.begin()
	
	
	print ('Press Ctrl-C to quit.')
	while True:
		#off(strip)
#		colorTest(strip)
		#myTest(strip)
		print ('Color wipe animations.')
		#colorWipe(strip, Color(255, 0, 0))  # Red wipe
		#colorWipe(strip, Color(0, 255, 0))  # Blue wipe
		#colorWipe(strip, Color(0, 0, 255))  # Green wipe
		print ('Theater chase animations.')
		theaterChase(strip, Color(127, 127, 127))  # White theater chase
		theaterChase(strip, Color(127,   0,   0))  # Red theater chase
		theaterChase(strip, Color(  0,   0, 127))  # Blue theater chase
		print ('Rainbow animations.')
		rainbow(strip)
		rainbowCycle(strip)
		theaterChaseRainbow(strip)
