/* 
 * Send a single command to the RIO Karma and dump the response as ascii.
 */
#include <stdio.h>
#include <usb.h>

#define RIO_VENDOR    0x045a
#define RIO_PROD      0x5210 

typedef struct usb_device usb_dev_t;

static 
usb_dev_t *get_device(int vendor, int product)
{
    struct usb_device *device;
    struct usb_bus *bus;

    for (bus = usb_busses; bus; bus=bus->next)
    {
        for (device = bus->devices; device; device=device->next)
        {
            if (device->descriptor.idVendor == vendor &&
                device->descriptor.idProduct == product)
            {
                return device;
            }
        }
    }
    return NULL;
}

int main(int argc, char **argv)
{
    int seq, cmd;

    if (argc < 3)
    {
        fprintf(stderr, "Usage: %s <cmd> <seq>\n", argv[0]);
        exit(1);
    }

    seq = atoi(argv[1]);
    cmd = atoi(argv[1]);

    char riop[] = "RIOP";
    char request[40];
    char response[512];

    usb_init();

    usb_find_busses();
    usb_find_devices();

    usb_dev_t *device;

    if (!(device = get_device(RIO_VENDOR, RIO_PROD)))
    {
        fprintf(stderr, "Could not open device\n");
        exit(1);
    }

    usb_dev_handle *handle = usb_open(device);
    if (usb_claim_interface(handle, 0) < 0)
    {
        perror("user.c");
        exit(1);
    }

    usb_resetep(handle, 0x02);
    usb_resetep(handle, 0x88);

    memset(request, 0, sizeof(request));
    memset(response, 0, sizeof(response));
    strcpy (request, riop);
    request[4] = 0;
    request[5] = cmd;
    request[6] = seq;

    usb_bulk_write(handle, 0x02, request, sizeof(request), 1000);
    usb_bulk_read(handle, 0x88, response, sizeof(response), 1000);

    int sent = 0; 
    while (!sent)
    {
        memset(request, 0, sizeof(request));
        memset(response, 0, sizeof(response));
        strcpy (request, riop);
        request[4] = 0x80;
        request[5] = 0;
        request[6] = seq;

        usb_bulk_write(handle, 0x02, request, sizeof(request), 1000);
        usb_bulk_read(handle, 0x88, response, sizeof(response), 1000);

        sent = (response[5] == request[6]);
        if (!sent)
        {
            fprintf(stderr, ".");
            usleep(10);
        }
        else
        {
            printf ("\nresult:\n%s\n", &response[7]);
        }
    }
    usb_release_interface(handle, 0);
    usb_close(handle);
}

