
#include <errno.h>
#include <signal.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#include <usb.h>

typedef enum 
{
	PID_UNKNOWN		= 0,
	PID_TIGLUSB     = 0xE001,
	PID_TI89TM		= 0xE004,
	PID_TI84P		= 0xE003,
	PID_TI84P_SE    = 0xE008,
	PID_NSPIRE      = 0xE012,
} UsbPid;

#define VID_TI    0x0451

//static struct usb_device *device = NULL;
static struct usb_dev_handle *devh = NULL;
static int inEP = 0x81;
static int outEP = 0x02;


static int open_ti_usb(usb_dev_handle *device)
{
    struct usb_bus    *bus;
    struct usb_device *dev;
    int j;
    static int didUsbInit = 0;

    if(!didUsbInit){
        usb_init();
        didUsbInit = 1;
    }
    usb_find_busses();
    usb_find_devices();

    j = 0;

    /* loop taken from testlibusb.c */
    for (bus = usb_busses; bus; bus = bus->next)
    {
	for (dev = bus->devices; dev; dev = dev->next)
	{
	    if ((dev->descriptor.idVendor == VID_TI))
	    {
		    if((dev->descriptor.idProduct == PID_TI84P)||(dev->descriptor.idProduct == PID_TI84P_SE))
		    {
				j = (int)device = usb_open(dev);
				break;
		    }
		}
	}
    }
    
    if ((j < 0) || (j == NULL)) {
		fprintf(stderr, "Could not find/open device\n");
		r = j;
		goto out;
	}

	r = usb_claim_interface(device, 0);
	if (r < 0) {
		fprintf(stderr, "usb_claim_interface error %s\n", usb_strerror());
		goto out;
	}
    
out:
    return j;
}

void    close_ti_device(usb_dev_handle *device)
{
    if(device != NULL)
    {
        usb_release_interface(device, 0);
        usb_close((usb_dev_handle *)device);
    }
}



static int send_buffer(usb_dev_handle *device, char *buffer, int len){
	int bytesSent;

	ret = usb_bulk_write(device, outEP, buffer, len, 5000);

	if (ret != len)
	{
		fprintf(stderr, "usb_bulk_write (%s).\n", usb_strerror());
		return ret;
	}
	return 0;
}

static int recv_buffer(usb_dev_handle *device, char *buffer, int len){
	int ret = 0;
		
	ret = usb_bulk_read(device, inEP, buffer, len, 5000);
	
	if(ret < 0)
	{
		fprintf(stderr, "usb_bulk_read (%s).\n", usb_strerror());
		return ret;
	}
	
	return 0;
}



