#!/usr/bin/python
import RPi.GPIO as GPIO
import sys
import argparse
import time


GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)

def error_function(error):
    print error
    sys.exit()

if len(sys.argv) < 3: 
	error_function("Not enough Arguments")


module_number = int(sys.argv[1])
command = sys.argv[2]

# Map the Opto22 module number to raspberry pi GPIO pin number
# module number  0   1   2   3   4   5   6   7   8   9  10  11  12  13  14 15
gpio_number = [ 40, 37, 38, 35, 36, 33, 31, 32, 29, 22, 18, 15, 16, 13, 11, 7]

# If the user entered a value outside the module range give some feedback and exit
if module_number <  0 or module_number > 15:
	error_function("Module position must be at least 0 and no greater than 15")
# If the command is the write. Set the direction of the pin to output and write the value
elif command == "write":
	value = int(sys.argv[3])
	GPIO.setup(gpio_number[module_number], GPIO.OUT)
	# Invert value b/c Opto 22 modules use negative true logic (0V = on, 5V = off)
	value = 1 if value == 0 else 0
	GPIO.output(gpio_number[module_number], value)
# Read the module
elif command == "read":
	GPIO.setup(gpio_number[module_number], GPIO.IN)
	result = GPIO.input(gpio_number[module_number])
	# Invert value b/c Opto 22 modules use negative true logic (0V = on, 5V = off)
	result = 1 if result == 0 else 0
	print "The value of module", module_number, "is " ,result
elif command == "config":
	value = sys.argv[3]
	if value == "input":
		GPIO.setup(gpio_number[module_number], GPIO.IN)	
	elif value == "output":
		GPIO.setup(gpio_number[module_number], GPIO.OUT)
	else:
		error_function()
elif command == "blink":
        period = int(sys.argv[3])
	if period < 2:
		error_function("Period length must be at least 2")		
        sleep_time = period/2
        GPIO.setup(gpio_number[module_number], GPIO.OUT)
        while (1):
                # Turn output on (must write 0 because Opto 22 modules use negative true logic (0V = 0n, 5V = Off)
                GPIO.output(gpio_number[module_number], 0)
                time.sleep(sleep_time)
				# Turn output off (must write 1 because Opto 22 modules use negative true logic (0V = 0n, 5V = Off)
                GPIO.output(gpio_number[module_number], 1)
                time.sleep(sleep_time)
else:
	error_function("Invalid command given")
sys.exit()
