@pepl213

Почему приложение подзависает?

#include <libusb.h> // for libusb_init
#include <stdlib.h> // for exit
#include <stdio.h> // for printf
#include <X11/Xlib.h>
#include <string.h>

#define VID 0x046d
#define PID 0xc216
#define SENSETIVE 0.01f
void coords (Display *display, int *x, int *y);
void move_to (Display *display, int x, int y)
{
  int cur_x, cur_y;
  coords (display, &cur_x, &cur_y);
  XWarpPointer (display, None, None, 0,0,0,0, -cur_x, -cur_y);
  XWarpPointer (display, None, None, 0,0,0,0, x, y);
  usleep (1);
}
void coords (Display *display, int *x, int *y)
{
  XEvent event;
  XQueryPointer (display, DefaultRootWindow (display),
                 &event.xbutton.root, &event.xbutton.window,
                 &event.xbutton.x_root, &event.xbutton.y_root,
                 &event.xbutton.x, &event.xbutton.y,
                 &event.xbutton.state);
  *x = event.xbutton.x;
  *y = event.xbutton.y;

}

int main()
{
    Display *display = XOpenDisplay (NULL);
    libusb_device **list = NULL;
    ssize_t number_of_devices = 0;
    if(libusb_init(NULL) != 0)
    {
        fprintf(stderr, "%s:%d: unable to initialize libusb\n", __FILE__, __LINE__);
        exit(EXIT_FAILURE);
    }
    number_of_devices = libusb_get_device_list(NULL, &list);
    if(number_of_devices < 0)
    {
        fprintf(stderr, "%s:%d: unable to get the list of USB devices\n", __FILE__, __LINE__);
        libusb_exit(NULL);
        exit(EXIT_FAILURE);
    }
    printf("number_of_devices = %ld\n", number_of_devices);
    int index = 0;
    for(index = 0; index < number_of_devices; ++index)
    {
        libusb_device *device = list[index];
        struct libusb_device_descriptor desc = {0};
        if(libusb_get_device_descriptor(device, &desc) != 0)
        {
            fprintf(stderr, "%s:%d: unable to get the USB device descriptor\n", __FILE__, __LINE__);
            libusb_free_device_list(list, 1);
            libusb_exit(NULL);
            exit(EXIT_FAILURE);
        }
        printf("%d/%ld: idVendor: %04x, idProduct: %04x\n", index + 1, number_of_devices, desc.idVendor, desc.idProduct);
        /*if(desc.idVendor == 0x045e && desc.idProduct == 0x028e)*/
        if(desc.idVendor == VID && desc.idProduct == PID)
        {
            printf("USB device found!\n");
            printf("Opening the USB device...\n");
            libusb_device_handle *handle = NULL;
            if(libusb_open(device, &handle) != 0)
            {
                fprintf(stderr, "%s:%d: unable to open the USB device\n", __FILE__, __LINE__);
                libusb_free_device_list(list, 1);
                libusb_exit(NULL);
                exit(EXIT_FAILURE);
            }
            printf("Done!\n");
            if(libusb_kernel_driver_active(handle, 0) != 0)
            {
                printf("Kernel driver is active!\n");
                printf("Detaching the kernel driver...\n");
                if(libusb_detach_kernel_driver(handle, 0) != 0)
                {
                    fprintf(stderr, "%s:%d: unable to detach the kernel driver from the interface of the USB device\n", __FILE__, __LINE__);
                    libusb_close(handle);
                    libusb_free_device_list(list, 1);
                    libusb_exit(NULL);
                    exit(EXIT_FAILURE);
                }
                printf("Done!\n");
            }
            printf("Claiming the interface...\n");
            if(libusb_claim_interface(handle, 0) != 0)
            {
                fprintf(stderr, "%s:%d: unable to claim the interface of the USB device\n", __FILE__, __LINE__);
                libusb_close(handle);
                libusb_free_device_list(list, 1);
                libusb_exit(NULL);
                exit(EXIT_FAILURE);
            }
            printf("Done!\n");
            unsigned char data[8];
            int actual_length;
            printf("Reading data...\n");
            while(1)
            {
                int x,y;
                coords(display, &x, &y);
                int r = libusb_bulk_transfer(handle, 0x81, data, sizeof(data), &actual_length, 1);
                int coord_x = ((float)data[0]-127)*SENSETIVE;
                int coord_y = ((float)data[1]-127)*SENSETIVE;
                int new_coord_X = x+coord_x;
                int new_coord_Y = y+coord_y;
                move_to(display, new_coord_X, new_coord_Y);
                printf("Data: ");
                for (int i=0; i<sizeof(data)-1;i++)
                    printf("%d ", data[i]);
                printf("\n");
                

            }
            printf("Releasing the interface...\n");
            if(libusb_release_interface(handle, 0) != 0)
            {
                fprintf(stderr, "%s:%d: unable to detach the kernel driver from the interface of the USB device\n", __FILE__, __LINE__);
                libusb_close(handle);
                libusb_free_device_list(list, 1);
                libusb_exit(NULL);
                exit(EXIT_FAILURE);
            }
            printf("Done!\n");
            printf("Closing the USB device...\n");
            libusb_close(handle);
            printf("Done!\n");
        }
    }
    libusb_free_device_list(list, 1);
    libusb_exit(NULL);
    exit(EXIT_SUCCESS);
}

Этот код считывает значение с джостика и перемещает мышь на такие же значения. НО
1) приложение подвисает
2) не получается перемещать мышку по диагонали.
Почему?
  • Вопрос задан
  • 148 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы