#!/usr/bin/python

import time
import os
import gpiod
import subprocess

# PB8  LED rosso piccolo su scheda
# PB14 ADC3
# PC17 Tasto on board

pinout = [
	(39,"PC0" ,0 ,"gpiochip2",891,),
	(37,"PC1" ,1 ,"gpiochip2",910),
	(35,"PC2" ,2 ,"gpiochip2",940),
	(33,"PC3" ,3 ,"gpiochip2",963),
	(31,"PC4" ,4 ,"gpiochip2",996),
	(29,"PC28",28,"gpiochip2",1026),
	(27,"PA6" ,6 ,"gpiochip0",1059),
	(25,"PA8" ,8 ,"gpiochip0",1092),
	(23,"PA0" ,0 ,"gpiochip0",1128),
	(21,"PA29",29,"gpiochip0",1168),
	(19,"PA28",28,"gpiochip0",1211),
	(17,"PA27",27,"gpiochip0",1254),
	(15,"PA26",26,"gpiochip0",1303),
	(13,"PA25",25,"gpiochip0",1353),
	(11,"PA24",24,"gpiochip0",1409),
	( 7,"PA23",23,"gpiochip0",1468),

	( 8,"PA22",22,"gpiochip0",1537),
	(10,"PA21",21,"gpiochip0",1610),
	(12,"PA31",31,"gpiochip0",1689),
	(14,"PA30",30,"gpiochip0",1782),
	(24,"PA1" ,1 ,"gpiochip0",1877),
	(26,"PA7" ,7 ,"gpiochip0",1989),
	(28,"PA5" ,5 ,"gpiochip0",2112),
	(30,"PC27",27,"gpiochip2",2253),
	(32,"PC31",31,"gpiochip2",2412),
	(34,"PB11",11,"gpiochip1",2597),
	(36,"PB12",12,"gpiochip1",2811),
	(38,"PB13",13,"gpiochip1",3069),
]   

VT100_RED   = "\033[31m"
VT100_GREEN = "\033[32m"
VT100_WHITE = "\033[0m"

def ClearScreen():
	print("\033[2J\033[H",end='')

def FontRed():
	print(VT100_RED,end='')

def FontGreen():
	print(VT100_GREEN,end='')

def FontWhite():
	print(VT100_WHITE,end='')

def get_adc():
	with open("/sys/bus/iio/devices/iio:device0/in_voltage%d_raw" % 3) as f:
		value=int(f.read())*3.3
		return value

def GetPushButton():
	chip=gpiod.Chip("gpiochip2")
	line=chip.get_line(17)
	line.request(consumer='test', type=gpiod.LINE_REQ_DIR_IN)
	state=line.get_value()
	line.release()
	chip.close()
	if state==0:
		return True
	else:
		return False

######## START #########


while True:
	subprocess.run("resize")
	ClearScreen()
	total_errorfound=False

	# Controlla le USB

	files_da_controllare = ['/dev/ttyUSB0', '/dev/ttyGS0', '/dev/ttyACM0']

	for file in files_da_controllare:
		errorfound=False
		if os.path.exists(file):
			errorfound=False
		else:
			errorfound=True
			total_errorfound=True

		if (errorfound):
			FontRed()

		print("File [%12s] " % file, end='')

		if (errorfound):
			print(" ERROR ",end='')
				
		FontWhite()
		print()


	# Controlla i GPIO

	for pin_number,pin_name,pin_line,pin_chip,voltage in pinout:
		errorfound=False

		chip=gpiod.Chip(pin_chip)
		line=chip.get_line(pin_line)
		line.request(consumer='test', type=gpiod.LINE_REQ_DIR_OUT)

		line.set_value(1)
		volt_active=get_adc();
		line.release()
		line.request(consumer='test', type=gpiod.LINE_REQ_DIR_IN)
		line.release()
		volt_inactive=get_adc();
		line.release()
		chip.close()

		if not (volt_active>(voltage-20) and volt_active<(voltage+20)):
			errorfound=True
			total_errorfound=True
			
		if volt_inactive!=0:
			errorfound=True
			total_errorfound=True

		if (errorfound):
			FontRed()
				
		print("Pin %2d (%4s) %4d (%4d) %d" % (pin_number,pin_name,volt_active,voltage,volt_inactive),end='')

		if (errorfound):
			print(" ERROR ",end='')
			
		FontWhite()
		print()

	print(total_errorfound)

	print("\nPremi il pulsante P1 per ripetere");
	while GetPushButton()==False:
		pass


