#!/usr/bin/python3.9
# vim: noet ts=4 number
import RPi.GPIO as GPIO

# pin number is 
#GPIO.setmode(GPIO.BOARD)   # 10 ; use 40-pin header numbering
GPIO.setmode(GPIO.BCM)	  # 11 ; use GPIO numbering


# this depends on the electronics...
OUTPUT_INVERTED = True
OUTPUT_NORMAL = False
OUTPUT_UNKNOWN = None

# based on https://roboticsbackend.com/raspberry-pi-gpios-default-state/
DEFAULT_INPUT_HIGH = True
DEFAULT_INPUT_LOW = False

#	label		  BCM	BOARD	output_effect		default_pin_state	user_comment
GPIOs = {
	'RED':		( 21,	40,		OUTPUT_INVERTED,	DEFAULT_INPUT_LOW,	"piezo RGB component"),
	'GREEN':	( 26,	37, 	OUTPUT_INVERTED,	DEFAULT_INPUT_LOW,	"piezo RGB component"),
	'BLUE':		( 20,	38, 	OUTPUT_INVERTED,	DEFAULT_INPUT_LOW,	"piezo RGB component"),
	'ISWITCH0':	( 27,	13, 	OUTPUT_NORMAL,		DEFAULT_INPUT_LOW,	"inside switch, white"),
	'ISWITCH1':	( 10,	19, 	OUTPUT_UNKNOWN,		DEFAULT_INPUT_LOW,	""),
	'ISWITCH2':	( 9,	21, 	OUTPUT_UNKNOWN,		DEFAULT_INPUT_LOW,	""),
	'ISWITCH3':	( 15,	22, 	OUTPUT_UNKNOWN,		DEFAULT_INPUT_LOW,	""),
	'ILED0':	( 18,	12, 	OUTPUT_NORMAL,		DEFAULT_INPUT_LOW,	""),	# hardware PWM on all platforms
	'OPTO1':	( 8,	24,		OUTPUT_UNKNOWN, 	DEFAULT_INPUT_HIGH,	""),
	'OPTO2':	( 7,	26,		OUTPUT_UNKNOWN, 	DEFAULT_INPUT_HIGH,	""),
	'OPTO3':	( 10,	29,		OUTPUT_UNKNOWN, 	DEFAULT_INPUT_LOW,	""),
	'ILED3':	( 11,	23,		OUTPUT_UNKNOWN, 	DEFAULT_INPUT_LOW,	""),
	'H0':		( 13,	33,		OUTPUT_UNKNOWN,		DEFAULT_INPUT_LOW,	""),	# hardware PWM avaiable on RPi A+, B+ and Pi2
	'H1':		( 6,	31,		OUTPUT_UNKNOWN,		DEFAULT_INPUT_HIGH,	""),
	'GP0':		( 12,	32,		OUTPUT_NORMAL,		DEFAULT_INPUT_LOW,	""),	# hardware PWM avaiable on RPi A+, B+ and Pi2
	'GP1':		( 19,	35,		OUTPUT_NORMAL,		DEFAULT_INPUT_LOW,	""),
	'Rel0':		( 16,	36,		OUTPUT_NORMAL,	    DEFAULT_INPUT_LOW,	""),
	'Rel1':		( 24,	18,		OUTPUT_NORMAL,	    DEFAULT_INPUT_LOW,	""),
	'Rel2':		( 23,	16,		OUTPUT_NORMAL,	    DEFAULT_INPUT_LOW,	""),
	'Rel3':		( 22,	15,		OUTPUT_NORMAL,	    DEFAULT_INPUT_LOW,	""),
	'TXD':		( 14,	8,		OUTPUT_UNKNOWN,		DEFAULT_INPUT_LOW,	""),
	'RXD':		( 15,	10,		OUTPUT_UNKNOWN,		DEFAULT_INPUT_LOW,	""),
	'DTR':		( 17,	11,		OUTPUT_UNKNOWN,		DEFAULT_INPUT_LOW,	""),
	'RI':		( 4,	7,		OUTPUT_UNKNOWN,		DEFAULT_INPUT_HIGH,	"outside switch, piezo"),
	'SDA':		( 2,	3,		OUTPUT_UNKNOWN,		DEFAULT_INPUT_HIGH,	""),
	'SCL':		( 3,	5,		OUTPUT_UNKNOWN,		DEFAULT_INPUT_HIGH,	""),
}

# redundant definitions
GPIOs['Screen0'] =	GPIOs['ISWITCH1']
GPIOs['Screen5'] =	GPIOs['ISWITCH2']
GPIOs['Screen1'] =	GPIOs['ISWITCH3']
GPIOs['OPTO0'] =	GPIOs['ISWITCH3']
GPIOs['ILED2'] =	GPIOs['OPTO1']
GPIOs['Screen3'] =	GPIOs['OPTO1']
GPIOs['ILED1'] =	GPIOs['OPTO2']
GPIOs['Screen4'] =	GPIOs['OPTO2']
GPIOs['Screen2'] =	GPIOs['ILED3']



def testHBridge(delay = 2):
	if delay <= 1:
		print("Short delays can burn your MOSFETS ; Don't do anything stupid!")
		raise Exception()
	from time import sleep
	delay = 2
	H0 = GPIOs['H0'][0]
	GPIO.setup(H0, GPIO.OUT)
	H1 = GPIOs['H1'][0]
	GPIO.setup(H1, GPIO.OUT)
	
	while True:
		print("H-Bridge: CW")
		GPIO.output(H0, True)
		#GPIO.output(H1, False) # not necessary if pin is at its default (boot) level
		sleep(delay)
		print("H-Bridge: Brake")
		GPIO.output(H1, True)
		sleep(delay)
		print("H-Bridge: CCW")
		GPIO.output(H0, False)
		sleep(delay)
		print("H-Bridge: Release")
		GPIO.output(H1, False)
		sleep(delay)


def testOutput(output, delay = 2):
	GPIO.setup(GPIOs[output][0], GPIO.OUT)
	from time import sleep
	while True:
		print(output,'on')
		GPIO.output(GPIOs[output][0], not GPIOs[output][2])
		sleep(delay)
		print(output,'off')
		GPIO.output(GPIOs[output][0], GPIOs[output][2])
		sleep(delay)

#output = Rel1
#
#while True:
#	GPIO.setup(output, GPIO.OUT)
#	GPIO.output(output, True)
#	print('off')
#	sleep(1)
#	GPIO.output(output, False)
#	print('on')
#	sleep(1)
#
#

#input("test inputs?")
#status = {}
#
#while True:
#	#for i in range(1,41):
#	for i in [ISWITCH0,GP0,GP1,RI]:
#		try:
#			GPIO.setup(i, GPIO.IN)
#			v = GPIO.input(i)
#			try:
#				if v != status[i] and i!=12 and i!=22:
#					print(i)
#			except KeyError:
#				status[i] = v
#			
#			#GPIO.output(i, True)
#			#print(i)
#			#sleep(1)
#			#GPIO.output(i, False)
#			#sleep(1)
#			#GPIO.output(i, True)
#		except ValueError:
#			pass
#			#print('oops',i)
#	sleep(.01)

if __name__ == "__main__":
	testOutput('ILED0')
    #testHBridge()
