#!/usr/bin/python

import sys, usb, time, hal


h=hal.component("lhb04b")
h.newpin("mpg_cnt", hal.HAL_S32, hal.HAL_OUT)
h.newpin("sel_x", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("sel_y", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("sel_z", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("sel_a", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("inc", hal.HAL_FLOAT, hal.HAL_OUT)
h.newpin("reset", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("stop", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("start", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("fn", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("step", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("cont", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("macro1", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("macro2", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("macro3", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("macro4", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("macro5", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("macro6", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("macro7", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("macro8", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("macro9", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("macro10", hal.HAL_BIT, hal.HAL_OUT)
h.ready()


try:
    while 1:
        dev = None
        print 'LB04: searching for device...'
        while dev == None:
            dev = usb.core.find(idVendor=0x10ce, idProduct=0xeb93)
            time.sleep(1)
        
        try:
            if dev.is_kernel_driver_active(0) is True:
                dev.detach_kernel_driver(0)
        except usb.core.USBError as e:
            print("LHB04: Kernel driver won't give up control over device: %s" % str(e))

        try:
            dev.set_configuration()
            dev.reset()
        except usb.core.USBError as e:
            print("LHB04: Cannot set configuration: %s" % str(e))

        endpoint = dev[0][(0,0)][0]
        print 'LHB04: Device connected!'

        while 1:    
         try:    
            data = dev.read(endpoint.bEndpointAddress, endpoint.wMaxPacketSize, timeout=2000)
            h.sel_x = data[5] == 17
            h.sel_y = data[5] == 18
            h.sel_z = data[5] == 19
            h.sel_a = data[5] == 20
            if data[4] == 13:
	            h.inc = 0.001
            elif data[4] == 14:
	            h.inc = 0.01
            elif data[4] == 15:
	            h.inc = 0.1
            elif data[4] == 16:
	            h.inc = 1.0
            else:
	            h.inc = 0.0

            h.reset   = data[2] == 1
            h.stop    = data[2] == 2
            h.start   = data[2] == 3
            h.fn      = data[2] == 12
            h.step    = data[2] == 15
            h.cont    = data[2] == 14
            h.macro1  = data[2] == 4
            h.macro2  = data[2] == 5
            h.macro3  = data[2] == 6
            h.macro4  = data[2] == 7
            h.macro5  = data[2] == 8
            h.macro6  = data[2] == 9
            h.macro7  = data[2] == 10
            h.macro8  = data[2] == 11
            h.macro9  = data[2] == 13
            h.macro10 = data[2] == 16

            if data[6] > 127:
             h.mpg_cnt=h.mpg_cnt+(256 - data[6])*-1
            else:
             h.mpg_cnt=h.mpg_cnt+data[6]


         except usb.core.USBError as e:
            h.sel_x = 0
            h.sel_y = 0
            h.sel_z = 0
            h.sel_a = 0
            h.inc = 0.0
            h.reset = 0
            h.stop = 0
            h.start = 0
            h.fn = 0
            h.step = 0
            h.cont = 0
            h.macro1 = 0
            h.macro2 = 0
            h.macro3 = 0
            h.macro4 = 0
            h.macro5 = 0
            h.macro6 = 0
            h.macro7 = 0
            h.macro8 = 0
            h.macro9 = 0
            h.macro10 = 0
            if e.errno != 110: # 110 is a timeout.
             print ("LHB04: Error readin data: %s" % str(e))
             usb.util.dispose_resources(dev)
             time.sleep(1)
             break


except KeyboardInterrupt:
    raise SystemExit
