#!/usr/bin/python
import os
import hal, time


h_py_home = hal.component("py_home")

# pin erzeugung x axis
h_py_home.newpin("maxvel_x_in", hal.HAL_FLOAT, hal.HAL_IN)
h_py_home.newpin("maxvel_x_out", hal.HAL_FLOAT, hal.HAL_OUT)
h_py_home.newpin("maxvel_x_reduction_jog", hal.HAL_FLOAT, hal.HAL_IN)
h_py_home.newpin("maxvel_x_reduction_home", hal.HAL_FLOAT, hal.HAL_IN)
h_py_home.newpin("reduzierung_x_minus", hal.HAL_BIT, hal.HAL_IN)
h_py_home.newpin("reduzierung_x_plus", hal.HAL_BIT, hal.HAL_IN)
# negativer limit switch wird gebraucht um den max velocitiy schon 
# beim erreichen diese switches hochzustellen, damit die home 
# final position im Eilgang angefahren wird
h_py_home.newpin("bereichsende_x_minus", hal.HAL_BIT, hal.HAL_IN)
h_py_home.newpin("x_homed", hal.HAL_BIT, hal.HAL_IN)
h_py_home.newpin("x_homing", hal.HAL_BIT, hal.HAL_IN)


# pin erzeugung y axis
h_py_home.newpin("maxvel_y_in", hal.HAL_FLOAT, hal.HAL_IN)
h_py_home.newpin("maxvel_y_out", hal.HAL_FLOAT, hal.HAL_OUT)
h_py_home.newpin("maxvel_y_reduction_jog", hal.HAL_FLOAT, hal.HAL_IN)
h_py_home.newpin("maxvel_y_reduction_home", hal.HAL_FLOAT, hal.HAL_IN)
h_py_home.newpin("reduzierung_y_minus", hal.HAL_BIT, hal.HAL_IN)
h_py_home.newpin("reduzierung_y_plus", hal.HAL_BIT, hal.HAL_IN)
# negativer limit switch wird gebraucht um den max velocitiy schon 
# beim erreichen diese switches hochzustellen, damit die home 
# final position im Eilgang angefahren wird
h_py_home.newpin("bereichsende_y_plus", hal.HAL_BIT, hal.HAL_IN)
h_py_home.newpin("y_homed", hal.HAL_BIT, hal.HAL_IN)
h_py_home.newpin("y_homing", hal.HAL_BIT, hal.HAL_IN)


# pin erzeugung z axis
h_py_home.newpin("maxvel_z_in", hal.HAL_FLOAT, hal.HAL_IN)
h_py_home.newpin("maxvel_z_out", hal.HAL_FLOAT, hal.HAL_OUT)
h_py_home.newpin("maxvel_z_reduction_jog", hal.HAL_FLOAT, hal.HAL_IN)
h_py_home.newpin("maxvel_z_reduction_home", hal.HAL_FLOAT, hal.HAL_IN)
h_py_home.newpin("reduzierung_z_minus", hal.HAL_BIT, hal.HAL_IN)
h_py_home.newpin("reduzierung_z_plus", hal.HAL_BIT, hal.HAL_IN)
# negativer limit switch wird gebraucht um den max velocitiy schon 
# beim erreichen diese switches hochzustellen, damit die home 
# final position im Eilgang angefahren wird
h_py_home.newpin("bereichsende_z_plus", hal.HAL_BIT, hal.HAL_IN)
h_py_home.newpin("z_homed", hal.HAL_BIT, hal.HAL_IN)
h_py_home.newpin("z_homing", hal.HAL_BIT, hal.HAL_IN)
#
#
time.sleep(0.5)
#
h_py_home.ready()

time.sleep(0.5)


# variablenzuweisung x axis
maxvel_x = h_py_home['maxvel_x_in']  
reduction_x_jog_vel = h_py_home['maxvel_x_reduction_jog'] 
reduction_x_home_vel = h_py_home['maxvel_x_reduction_home'] 
h_py_home['maxvel_x_out'] = maxvel_x
endschalter_erreicht_x = 0

# variablenzuweisung y axis
maxvel_y = h_py_home['maxvel_y_in']  
reduction_y_jog_vel = h_py_home['maxvel_y_reduction_jog'] 
reduction_y_home_vel = h_py_home['maxvel_y_reduction_home'] 
h_py_home['maxvel_y_out'] = maxvel_y
endschalter_erreicht_y = 0

# variablenzuweisung z axis
maxvel_z = h_py_home['maxvel_z_in']  
reduction_z_jog_vel = h_py_home['maxvel_z_reduction_jog'] 
reduction_z_home_vel = h_py_home['maxvel_z_reduction_home'] 
h_py_home['maxvel_z_out'] = maxvel_z
endschalter_erreicht_z = 0

try:
    while 1:


	# logic x axis
	if h_py_home['x_homed'] == 0:
		if h_py_home['reduzierung_x_minus'] or h_py_home['reduzierung_x_plus'] == 1:
			if h_py_home['x_homing'] == 1:
				# gucken wann der endschalter gedrueckt wird und endschalter erreicht true setzen
				# bevor endschalter erreicht reduzierte max vel, danach volle max vel
				if endschalter_erreicht_x == 0:
					if h_py_home['bereichsende_x_minus'] == 1:
						endschalter_erreicht_x = 1
					h_py_home['maxvel_x_out'] = reduction_x_home_vel
				else:
					h_py_home['maxvel_x_out'] = maxvel_x
			else:
				h_py_home['maxvel_x_out'] = reduction_x_jog_vel
		else:
			h_py_home['maxvel_x_out'] = maxvel_x
		#resteten von endschalter erreicht wenn eventuell ein zweites mal gehomet wird
		if h_py_home['x_homing'] == 0:
			endschalter_erreicht_x = 0
	else:
		h_py_home['maxvel_x_out'] = maxvel_x

	# logic y axis
	if h_py_home['y_homed'] == 0:
		if h_py_home['reduzierung_y_minus'] or h_py_home['reduzierung_y_plus'] == 1:
			if h_py_home['y_homing'] == 1:
				# gucken wann der endschalter gedrueckt wird und endschalter erreicht true setzen
				# bevor endschalter erreicht reduzierte max vel, danach volle max vel
				if endschalter_erreicht_y == 0:
					if h_py_home['bereichsende_y_plus'] == 1:
						endschalter_erreicht_y = 1
				h_py_home['maxvel_y_out'] = maxvel_y
			else:
				h_py_home['maxvel_y_out'] = reduction_y_jog_vel
		else:
			h_py_home['maxvel_y_out'] = maxvel_y
		#resteten von endschalter erreicht wenn eventuell ein zweites mal gehomet wird
		if h_py_home['y_homing'] == 0:
			endschalter_erreicht_y = 0
	else:
		h_py_home['maxvel_y_out'] = maxvel_y
	
	# logic z axis
	if h_py_home['z_homed'] == 0:
		if h_py_home['reduzierung_z_minus'] or h_py_home['reduzierung_z_plus'] == 1:
			if h_py_home['z_homing'] == 1:
				# gucken wann der endschalter gedrueckt wird und endschalter erreicht true setzen
				# bevor endschalter erreicht reduzierte max vel, danach volle max vel
				if endschalter_erreicht_z == 0:
					if h_py_home['bereichsende_z_plus'] == 1:
						endschalter_erreicht_z = 1
					h_py_home['maxvel_z_out'] = reduction_z_home_vel
				else:
					h_py_home['maxvel_z_out'] = maxvel_z
			else:
				h_py_home['maxvel_z_out'] = reduction_z_jog_vel
		else:
			h_py_home['maxvel_z_out'] = maxvel_z
		#resteten von endschalter erreicht wenn eventuell ein zweites mal gehomet wird
		if h_py_home['z_homing'] == 0:
			endschalter_erreicht_z = 0
	else:
		h_py_home['maxvel_z_out'] = maxvel_z


except KeyboardInterrupt:
    raise SystemExit
