def thread_control (d):
	"""
	Toggling state THREAD... if light is detected global manager dictionay will be updated, other processes respond accordingly.

	It will 'poll' every second to determine which process should be running
	"""

	global cam
	global camera_running

	def sigterm_handler (signal_no, frame):
		print datetime.datetime.now().strftime('%b %d, %G %I:%M%p--'), signal_no, "received, exitting."
		sys.exit(0)	

	signal.signal(signal.SIGTERM, sigterm_handler)
	signal.signal(signal.SIGINT, sigterm_handler)

	blob_color = 1
	while True:
		if camera_running:
			img = cam.getImage()
			h, l, s = img.toHLS().splitChannels()
			l = l.threshold(145)
			
			blobs = l.findBlobs(minsize=2)
			if blobs:
				mask = SimpleCV.Image(img.size())


				for blob in blobs:
					mask.drawCircle(blob.centroid(), 10, color=Doorway.color_wheel(blob_color), thickness=-1)
				
				blob_color += 1

				if blob_color > 255:
					blob_color = 1

				mask = mask.applyLayers()
				mask = mask.flipHorizontal().rotate(90).scale(28, 7)
				# mask.save(display)

				d['image'] = mask.getPIL()

				d['has_light'] = True
			else:
				d['has_light'] = False
				sleep(1)

			del img
			sleep(0.01)
		else:
			d['has_light'] = False
			sleep(1)
def proc_animation (manager_dict, sacred):
	where = [0] # Why is this a list? Because memory that's why. Look it up.

	""" 
	p - a list that contains effects for the presentation state
	check DoorwayEffects for a list of functions 
	"""
	p = [
		{'images' : ['doorway/res/stripes/colorfuls/', 0.05, True]},
		{'images' : ['doorway/res/circles/', 0.07, True]},
		{'images' : ['doorway/res/stripes/', 0.07, True]},
		{'rainbow_FtoB' : [ 0.01 ] },
		{'rainbow_BtoF' : [ 0.01 ] },
		{'wipe_down' : [ 1 ] },
		{'wipe_up' : [ 2 ] },
		{'wipe_down' : [ 3 ] },
		{'wipe_up' : [ 4 ] },
		{'wipe_down' : [ 5 ] },
		{'wipe_up' : [ 6 ] },
		{'wipe_down' : [ 7 ] },
		{'strobe_FtoB' : [] },
		]

	[p.append({'images' : ['doorway/res/pokes/', 0.05, True]}) for _ in range(5)]
	[p.append({'images' : ['doorway/res/elements/water/', 0.01]}) for _ in range(5)]
	[p.append({'images' : ['doorway/res/elements/fire/', 0.01]}) for _ in range(5)]
	[p.append({'images' : ['doorway/res/chakras/', 0.07, True]}) for _ in range(5)]
	[p.append({'images' : ['doorway/res/circles/colorfuls/', 0.01, True]}) for _ in range(5)]

	[p.append({'swipe_down' : [Doorway.color_wheel(random.randrange(255))]}) for _ in range(10)]
	[p.append({'swipe_up'   : [Doorway.color_wheel(random.randrange(255))]}) for _ in range(10)]

	for _ in range(20):
		p.append({'wipe_down' : [random.randrange(1,8), (random.randrange(255), random.randrange(255), random.randrange(255))]})
		p.append({'wipe_up'   : [random.randrange(1,8), (random.randrange(255), random.randrange(255), random.randrange(255))]})

		p.append({'wipe_down' : [random.randrange(1,8), (0, 0, 0)]})
		p.append({'wipe_up'   : [random.randrange(1,8), (0, 0, 0)]})

	[p.append({'picture' : ['doorway/res/chakras/{0}.jpg'.format(x), 0.1]})            for x in range(1, 8)]
	[p.append({'picture' : ['doorway/res/chakras/{0}.jpg'.format(x), 0.1]})            for x in range(1, 8)]
	[p.append({'picture' : ['doorway/res/circles/{0}.jpg'.format(x), 0.05]})           for x in range(1,10)]
	[p.append({'picture' : ['doorway/res/circles/colorfuls/{0}.jpg'.format(x), 0.02]}) for x in range(1,8)]
	[p.append({'picture' : ['doorway/res/circles/{0}.jpg'.format(x), 0.05]})           for x in range(1,10)]
	[p.append({'picture' : ['doorway/res/circles/colorfuls/{0}.jpg'.format(x), 0.05]}) for x in range(1,8)]
	[p.append({'picture' : ['doorway/res/stripes/{0}.jpg'.format(x), 0.07]})           for x in range(1,9)]
	[p.append({'picture' : ['doorway/res/stripes/colorfuls/{0}.jpg'.format(x), 0.07]}) for x in range(1,6)]
	[p.append({'picture' : ['doorway/res/stripes/{0}.jpg'.format(x), 0.05]})           for x in range(1,9)]
	[p.append({'picture' : ['doorway/res/stripes/colorfuls/{0}.jpg'.format(x), 0.05]}) for x in range(1,6)]

	for _ in range(20):
		p.append({'strobe_FtoB' : [5, 0.01, 
			(random.randrange(255), random.randrange(255), random.randrange(255)), 
			(random.randrange(255), random.randrange(255), random.randrange(255))]})
		p.append({'strobe_BtoF' : [5, 0.01, 
			(random.randrange(255), random.randrange(255), random.randrange(255)), 
			(random.randrange(255), random.randrange(255), random.randrange(255))]})
	
	for _ in range(10):
		p.append({'strobe_rainbow_FtoB' : [0.05]})
		p.append({'strobe_rainbow_BtoF' : [0.05]})

	for _ in range(10):
		p.append({'rainbow_FtoB' : [0.07]})
		p.append({'rainbow_BtoF' : [0.07]})

	random.shuffle(p)

	def draw_animation (sacred, pres):
		if where[0] == len(pres) - 1:
			random.shuffle(pres)
			where[0] = 0

		for i, x in enumerate(pres):
			if i < where[0]:
				continue

			where[0] = i
			
			for key, val in x.iteritems():
				if getattr(sacred, key)(*val):
					return

		sleep(0.1)

	try:
		while True:
			if not manager_dict['has_light']:
				draw_animation(sacred, p)
				sleep(1)
			else:
				sleep(1)
	except KeyboardInterrupt:
		pass