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

time.sleep(10)


h_py_wechsler = hal.component("py_wechsler")
h_py_wechsler.newpin("in", hal.HAL_FLOAT, hal.HAL_IN)
h_py_wechsler.newpin("out", hal.HAL_FLOAT, hal.HAL_OUT)


# Eingaenge Werkzeugwechsler
h_py_wechsler.newpin("schwenkarm_vorne_in", hal.HAL_BIT, hal.HAL_IN)
h_py_wechsler.newpin("schwenkarm_hinten_in", hal.HAL_BIT, hal.HAL_IN)
h_py_wechsler.newpin("schwenkarm_mitte_in", hal.HAL_BIT, hal.HAL_IN)
h_py_wechsler.newpin("wechselschlitten_vorne_in", hal.HAL_BIT, hal.HAL_IN)
h_py_wechsler.newpin("wechselschlitten_hinten_in", hal.HAL_BIT, hal.HAL_IN)
h_py_wechsler.newpin("Werkz_grei_spind_ausgefahren_in", hal.HAL_BIT, hal.HAL_IN)
h_py_wechsler.newpin("Werkz_grei_spind_eingefahren_in", hal.HAL_BIT, hal.HAL_IN)
h_py_wechsler.newpin("Werkz_grei_mag_ausgefahren_in", hal.HAL_BIT, hal.HAL_IN)
h_py_wechsler.newpin("Werkz_grei_mag_eingefahren_in", hal.HAL_BIT, hal.HAL_IN)
h_py_wechsler.newpin("magazin_ref_in", hal.HAL_BIT, hal.HAL_IN)
h_py_wechsler.newpin("magazin_anhalten_in", hal.HAL_BIT, hal.HAL_IN)
h_py_wechsler.newpin("magazin_position_in", hal.HAL_BIT, hal.HAL_IN)
h_py_wechsler.newpin("magazin_absicherung_in", hal.HAL_BIT, hal.HAL_IN)
h_py_wechsler.newpin("magazin_drehen_in", hal.HAL_BIT, hal.HAL_IN)

# Sonstige Eingaenge
h_py_wechsler.newpin("spindel_dreht", hal.HAL_BIT, hal.HAL_IN)


#Eingaenge Glade
h_py_wechsler.newpin("hydraulik_an_checkbox", hal.HAL_BIT, hal.HAL_IN)

h_py_wechsler.newpin("arm_ausfahren_button", hal.HAL_BIT, hal.HAL_IN)
h_py_wechsler.newpin("arm_einfahren_button", hal.HAL_BIT, hal.HAL_IN)
h_py_wechsler.newpin("arm_ganz_ausfahren_button", hal.HAL_BIT, hal.HAL_IN)
h_py_wechsler.newpin("arm_ganz_einfahren_button", hal.HAL_BIT, hal.HAL_IN)

h_py_wechsler.newpin("arm_einschwenken_button", hal.HAL_BIT, hal.HAL_IN)
h_py_wechsler.newpin("arm_ausschwenken_button", hal.HAL_BIT, hal.HAL_IN)
h_py_wechsler.newpin("arm_ganz_einschwenken_button", hal.HAL_BIT, hal.HAL_IN)
h_py_wechsler.newpin("arm_ganz_ausschwenken_button", hal.HAL_BIT, hal.HAL_IN)

h_py_wechsler.newpin("greifer_ausfahren_button", hal.HAL_BIT, hal.HAL_IN)
h_py_wechsler.newpin("greifer_einfahren_button", hal.HAL_BIT, hal.HAL_IN)
h_py_wechsler.newpin("greifer_ganz_ausfahren_button", hal.HAL_BIT, hal.HAL_IN)
h_py_wechsler.newpin("greifer_ganz_einfahren_button", hal.HAL_BIT, hal.HAL_IN)

h_py_wechsler.newpin("mag_drehen_tast_button", hal.HAL_BIT, hal.HAL_IN)
h_py_wechsler.newpin("mag_eins_weiter_button", hal.HAL_BIT, hal.HAL_IN)

h_py_wechsler.newpin("bremse_loesen_checkbox", hal.HAL_BIT, hal.HAL_IN)
h_py_wechsler.newpin("kusa_button", hal.HAL_BIT, hal.HAL_IN)

h_py_wechsler.newpin("bero_an_checkbox", hal.HAL_BIT, hal.HAL_IN)

h_py_wechsler.newpin("spindel_fix_ein_button", hal.HAL_BIT, hal.HAL_IN)
h_py_wechsler.newpin("spindel_fix_aus_button", hal.HAL_BIT, hal.HAL_IN)
h_py_wechsler.newpin("spindel_fixieren_button", hal.HAL_BIT, hal.HAL_IN)
h_py_wechsler.newpin("spindel_freigeben_button", hal.HAL_BIT, hal.HAL_IN)





#Ausgaenge Werkzeugwechsler
h_py_wechsler.newpin("hydraulik_an_out", hal.HAL_BIT, hal.HAL_OUT)

h_py_wechsler.newpin("arm_ausfahren_out", hal.HAL_BIT, hal.HAL_OUT)
h_py_wechsler.newpin("arm_einfahren_out", hal.HAL_BIT, hal.HAL_OUT)

h_py_wechsler.newpin("arm_ausschwenken_out", hal.HAL_BIT, hal.HAL_OUT)
h_py_wechsler.newpin("arm_einschwenken_out", hal.HAL_BIT, hal.HAL_OUT)

h_py_wechsler.newpin("greifer_ausfahren_out", hal.HAL_BIT, hal.HAL_OUT)
h_py_wechsler.newpin("greifer_einfahren_out", hal.HAL_BIT, hal.HAL_OUT)

h_py_wechsler.newpin("mag_motor_out", hal.HAL_BIT, hal.HAL_OUT)

h_py_wechsler.newpin("bremse_loesen_out", hal.HAL_BIT, hal.HAL_OUT)
h_py_wechsler.newpin("kusa_out", hal.HAL_BIT, hal.HAL_OUT)

h_py_wechsler.newpin("bero_an_out", hal.HAL_BIT, hal.HAL_OUT)

h_py_wechsler.newpin("spindel_fix_ein_out", hal.HAL_BIT, hal.HAL_OUT)
h_py_wechsler.newpin("Spindel_fix_aus_out", hal.HAL_BIT, hal.HAL_OUT)


#def hydraulikachse (schalter):
 #   hal.set_p(schalter,"1")
  #  time.sleep(2)
   # hal.set_p(schalter,"0")


class checkbox:
    def __init__(self, speicher=None):
        self.speicher = speicher
    def checkboxx (self, eingang, ausgang):
        if h_py_wechsler[eingang] == self.speicher:
            pass
        else:
            self.speicher = h_py_wechsler[eingang]
            if h_py_wechsler[eingang] == 1:
                h_py_wechsler[ausgang]=1
            else:
                h_py_wechsler[ausgang]=0
            


def achse_ganz_fahren (ventil, endschalter):
    while h_py_wechsler[endschalter] == 0:
        h_py_wechsler[ventil] = 1
    h_py_wechsler[ventil] = 0

def mag_eins_weiter_drehen ():
    h_py_wechsler['mag_motor_out']=1
    time.sleep(0.75)
    while h_py_wechsler['magazin_anhalten_in'] == 0:
        h_py_wechsler['mag_motor_out']=1
    h_py_wechsler['mag_motor_out']=0

def spindel_fixieren ():
    while h_py_wechsler['spindel_dreht'] == 1:
        time.sleep(0.2)
      
    h_py_wechsler['bero_an_out'] = 1
    h_py_wechsler['hydraulik_an_out'] = 1
    h_py_wechsler['bremse_loesen_out'] = 1



def spindel_freigeben ():
    h_py_wechsler['bremse_loesen_out'] = 0
    h_py_wechsler['bero_an_out'] = 0
    h_py_wechsler['hydraulik_an_out'] = 0




    """class StateMachine():
    # die __init__ funktion wird automatische beim instanziieren ausgefuehrt, es ist eine "integrierte" Systemfunktion
    def __init__(self, hal_obj):
        # das hal objekt also h_py_wechsler wird uebergeben, damit es die StateMachine auch kennt
        self.halObj = hal_obj
        # Schrittkette/StateMachine bei der Instanziierung automatisch im Init-Schritt starten
        self.switch('Init')
    #mit der switch Funktion wird die StateMachine weitergeschaltet
    def switch(self,step_name):
            method=getattr(self,step_name,lambda :'Invalid')
            return method()

    def HydraulikAchseGanzFahren(ventil, endschalter):
        # ventil 0 schalten
        self.halObj[ventil] = 0
        # warten
        while (self.halObj[endschalter] == 1):
            pass # nichts tun
        # ventil 1 schalten
        self.halObj[ventil] = 1

    def Schritt_Init(self):
        # warten auf button der die Automatik startete (hier beispielhalft 'arm_ausfahren_button')
        while (halObj['arm_ausfahren_button'] == 0):
            pass # nichts tun
            # solange der button nicht gedrueckt ist im Init Schritt bleiben!
        # wenn der button gedrueckt wird springt das programm automatisch aus der while schleife  
        self.switch('ArmGanzAusfahren')

    def ArmGanzAusfahren(self):
        # LED Arm drin ausschalten...
        hal.set_p("toolchanger.hal_led_arm_drin","0")
        # HydraulikAchse wird gefahren
        self.HydraulikAchseGanzFahren('arm_ausfahren_out', 'wechselschlitten_vorne_in')
        # wenn die Achse gefahren ist wird die LED geschalten
        hal.set_p("toolchanger.hal_led_arm_draussen","1")

        #Beispielhaft soll nach dem Ausfahren der Arm automatisch nach einer kurzen Wartezeit wieder eingefahren werden
        time.sleep(5.0)
        self.switch('ArmGanzEinfahren')

    def ArmGanzEinfahren(self):
        # LED Arm draussen ausschalten...
        hal.set_p("toolchanger.hal_led_arm_draussen","0")
        # HydraulikAchse wird gefahren
        self.HydraulikAchseGanzFahren('arm_einfahren_out', 'wechselschlitten_hinten_in')
        # wenn die Achse gefahren ist wird die LED geschalten
        hal.set_p("toolchanger.hal_led_arm_drin","1")

        #Beispielhaft soll nach dem einfahren der Arm automatisch nach einer kurzen Wartezeit wieder ausgefahren werden
        time.sleep(5.0)
        self.switch('ArmGanzAusfahren') """    


halter = 1
testwert = 0

time.sleep(0.5)

h_py_wechsler.ready()

checkbox_hydraulik=checkbox(speicher=0)
checkbox_bremse=checkbox(speicher=0)

time.sleep(0.5)

try:
    while 1:
        #h_py_wechsler['out'] = h_py_wechsler['in']	

    #test
        checkbox_hydraulik.checkboxx('hydraulik_an_checkbox', 'hydraulik_an_out')
        """if h_py_wechsler['hydraulik_an_checkbox'] == 1:
            hal.set_p("toolchanger.hal_led_hydraulik","1")
            h_py_wechsler['hydraulik_an_out'] = 1
        else:
            hal.set_p("toolchanger.hal_led_hydraulik","0")
            h_py_wechsler['hydraulik_an_out'] = 0"""

        #Leds fuer wechselschlitten vorne hinten    
        if h_py_wechsler['wechselschlitten_vorne_in'] == 1:
            hal.set_p("toolchanger.hal_led_arm_draussen","1")
        else:
            hal.set_p("toolchanger.hal_led_arm_draussen","0")

        if h_py_wechsler['wechselschlitten_hinten_in'] == 1:
            hal.set_p("toolchanger.hal_led_arm_drin","1")
        else:
            hal.set_p("toolchanger.hal_led_arm_drin","0")


        #Leds fuer ein aus schwenken    
        if h_py_wechsler['schwenkarm_hinten_in'] == 1:
            hal.set_p("toolchanger.hal_led_schwenkarm_hinten","1")
        else:
            hal.set_p("toolchanger.hal_led_schwenkarm_hinten","0")

        if h_py_wechsler['schwenkarm_mitte_in'] == 1:
            hal.set_p("toolchanger.hal_led_schwenkarm_mitte","1")
        else:
            hal.set_p("toolchanger.hal_led_schwenkarm_mitte","0")

        if h_py_wechsler['schwenkarm_vorne_in'] == 1:
            hal.set_p("toolchanger.hal_led_schwenkarm_vorne","1")
        else:
            hal.set_p("toolchanger.hal_led_schwenkarm_vorne","0")

        #Leds fuer greifer wechslerseite und spindelseite  
        if h_py_wechsler['Werkz_grei_spind_eingefahren_in'] == 1:
            hal.set_p("toolchanger.hal_led_greifer_spi_ein","1")
        else:
            hal.set_p("toolchanger.hal_led_greifer_spi_ein","0")

        if h_py_wechsler['Werkz_grei_spind_ausgefahren_in'] == 1:
            hal.set_p("toolchanger.hal_led_greifer_spi_aus","1")
        else:
            hal.set_p("toolchanger.hal_led_greifer_spi_aus","0")

        if h_py_wechsler['Werkz_grei_mag_eingefahren_in'] == 1:
            hal.set_p("toolchanger.hal_led_greifer_mag_ein","1")
        else:
            hal.set_p("toolchanger.hal_led_greifer_mag_ein","0")

        if h_py_wechsler['Werkz_grei_mag_ausgefahren_in'] == 1:
            hal.set_p("toolchanger.hal_led_greifer_mag_aus","1")
        else:
            hal.set_p("toolchanger.hal_led_greifer_mag_aus","0")



### Verknuepfung der buttons fuer handbedienung###

        #buttons fuer wechselschlitten vorne hinten
        if h_py_wechsler['arm_ausfahren_button'] == 1:
            h_py_wechsler['arm_ausfahren_out'] = 1
        else:
            h_py_wechsler['arm_ausfahren_out'] = 0

        if h_py_wechsler['arm_einfahren_button'] == 1:
            h_py_wechsler['arm_einfahren_out'] = 1
        else:
            h_py_wechsler['arm_einfahren_out'] = 0

        
        if h_py_wechsler['arm_ganz_ausfahren_button'] == 1:
            achse_ganz_fahren('arm_ausfahren_out', 'wechselschlitten_vorne_in')

        if h_py_wechsler['arm_ganz_einfahren_button'] == 1:
            achse_ganz_fahren('arm_einfahren_out', 'wechselschlitten_hinten_in')  

        #buttons fuer greifer schwenken
        if h_py_wechsler['arm_ausschwenken_button'] == 1:
            h_py_wechsler['arm_ausschwenken_out'] = 1
        else:
            h_py_wechsler['arm_ausschwenken_out'] = 0

        if h_py_wechsler['arm_einschwenken_button'] == 1:
            h_py_wechsler['arm_einschwenken_out'] = 1
        else:
            h_py_wechsler['arm_einschwenken_out'] = 0
            
        #buttons fuer greifer ein ausfahren
        if h_py_wechsler['greifer_ausfahren_button'] == 1:
            h_py_wechsler['greifer_ausfahren_out'] = 1
        else:
            h_py_wechsler['greifer_ausfahren_out'] = 0

        if h_py_wechsler['greifer_einfahren_button'] == 1:
            h_py_wechsler['greifer_einfahren_out'] = 1
        else:
            h_py_wechsler['greifer_einfahren_out'] = 0

            #Fallunterscheidung magazin und spindelseite
        if h_py_wechsler['schwenkarm_vorne_in'] == 1:
            if h_py_wechsler['greifer_ganz_ausfahren_button'] == 1:
                achse_ganz_fahren('greifer_ausfahren_out', 'Werkz_grei_mag_ausgefahren_in')

            if h_py_wechsler['greifer_ganz_einfahren_button'] == 1:
                achse_ganz_fahren('greifer_einfahren_out', 'Werkz_grei_mag_eingefahren_in') 
        
        if h_py_wechsler['schwenkarm_vorne_in'] == 1:
            if h_py_wechsler['greifer_ganz_ausfahren_button'] == 1:
                achse_ganz_fahren('greifer_ausfahren_out', 'Werkz_grei_spind_ausgefahren_in')

            if h_py_wechsler['greifer_ganz_einfahren_button'] == 1:
                achse_ganz_fahren('greifer_einfahren_out', 'Werkz_grei_spind_eingefahren_in')

        #buttons fuer magazin drehen 
        if h_py_wechsler['mag_drehen_tast_button'] == 1:
            h_py_wechsler['mag_motor_out'] = 1
        else:
            h_py_wechsler['mag_motor_out'] = 0

        if h_py_wechsler['mag_eins_weiter_button'] or h_py_wechsler['magazin_drehen_in'] == 1:
            mag_eins_weiter_drehen ()

        #buttons fuer spindeldrehung
        checkbox_bremse.checkboxx('bremse_loesen_checkbox', 'bremse_loesen_out')
        #if h_py_wechsler['bremse_loesen_checkbox'] == 1:
        #    h_py_wechsler['bremse_loesen_out'] = 1
        #else:
        #    h_py_wechsler['bremse_loesen_out'] = 0

        if h_py_wechsler['kusa_button'] == 1:
            h_py_wechsler['kusa_out'] = 1
        else:
            h_py_wechsler['kusa_out'] = 0

        #bero anschalten
        if h_py_wechsler['bero_an_checkbox'] == 1:
            h_py_wechsler['bero_an_out'] = 1
        else:
            h_py_wechsler['bero_an_out'] = 0    
        # spindelfixierung
        if h_py_wechsler['spindel_fix_ein_button'] == 1:
            h_py_wechsler['spindel_fix_ein_out'] = 1
        else:
            h_py_wechsler['spindel_fix_ein_out'] = 0

        # spindel fixieren
        if h_py_wechsler['spindel_fixieren_button'] == 1:
            spindel_fixieren()
            
        # spindel freigeben
        if h_py_wechsler['spindel_freigeben_button'] == 1:
            spindel_freigeben()
            

    


        

        
        """if h_py_wechsler['arm_ganz_ausfahren_button'] == 1:
            achse_ganz_fahren('arm_ausfahren_out', 'wechselschlitten_vorne_in')

        if h_py_wechsler['arm_ganz_einfahren_button'] == 1:
            achse_ganz_fahren('arm_einfahren_out', 'wechselschlitten_hinten_in')  """
        
### Ende Verknuepfung der buttons fuer handbedienung###

        #if h_py_wechsler['einschwenken_button'] == 1:
        #    testwert = 1
        #    hydraulikachse("toolchanger.hal_eingeschwenkt")



    


except KeyboardInterrupt:
    raise SystemExit
