import itertools
import sys

import RPIO

from bfcslib.seven_seg import SevenSegmentDisplay
from bfcslib.status_led import LED
from bfcslib.tmp512 import TMP512


NUM_SENSORS = 4
sensor_iterator = itertools.cycle(range(0, NUM_SENSORS))
CURRENT_IDX = sensor_iterator.next()
SENSORS = None

def button_isr(gpio_id, val):
	global CURRENT_IDX
	global SENSORS

	# Turn off previous LED
	SENSORS[CURRENT_IDX]['led'].off()

	# Update current index
	# print 'CURRENT_IDX: %s' % CURRENT_IDX
	CURRENT_IDX = sensor_iterator.next()

	# Turn on new LED
	SENSORS[CURRENT_IDX]['led'].on()

def main():
	global CURRENT_IDX
	global SENSORS

	print 'Beer Fermentation Control System - RPI Client'

	# Setup the sensor status LEDs
	sensor1_led = LED(24)
	sensor2_led = LED(25)
	sensor3_led = LED(8)
	sensor4_led = LED(7)

	# Setup both TMP512's
	tmp512_1 = TMP512(0x5d)
	tmp512_2 = TMP512(0x5c)

	SENSORS = [{'led': sensor1_led, 'temp': tmp512_1.temp_sensor2},
			   {'led': sensor2_led, 'temp': tmp512_1.temp_sensor1},
			   {'led': sensor3_led, 'temp': tmp512_2.temp_sensor2},
			   {'led': sensor4_led, 'temp': tmp512_2.temp_sensor1}]

	# Turn on initial sensor LED
	SENSORS[CURRENT_IDX]['led'].on()

	# Setup 7 seg display
	ssdisplay = SevenSegmentDisplay()

	# Setup pushbutton
	# Use the BCM addressing scheme
	RPIO.setmode(RPIO.BCM)

	# Setup input
	RPIO.setup(22, RPIO.IN)

	# Setup switch interrupt with debounce
	RPIO.add_interrupt_callback(22, button_isr, edge='rising', 
								pull_up_down=RPIO.PUD_DOWN, threaded_callback=True, 
								debounce_timeout_ms=150)

	# Wait for interrupts in a non-blocking fashion
	RPIO.wait_for_interrupts(threaded=True)

	# Main loop
	while True:

		# Iterate over all temperature sensors and read their temp
		for idx in xrange(NUM_SENSORS):
			temp = SENSORS[idx]['temp']()
			if idx == CURRENT_IDX:
				ssdisplay.display_number(temp)


if __name__ == '__main__':
	sys.exit(main())