Проблема с прекращающимся циклом на С
друзья! Есть проблема с циклом While, задача:
Считывать нажатие средней (колесо), левой и правой кнопок мыши и выводить на экран факты нажатия. Завершить работу с устройством по кручению колеса мыши
Программа работает, но во первых: 1) Не получается сделать так чтобы во время непосредственно цикла выводились в консоль только левая (1) правая (10) и центральная кнопки (100) но происходит что забивается память(на сколько понимаю) и в определенный момент перестает считывать нажатия, пауза примерно секунд 15 идёт, после чего начинает нормально работать и так по кругу, в чем может быть проблема? Может кто нибудь подскажет более простое решение этого отображения? Заранее спасибо, товарищи! Весь код ниже: На Linux Mint 19 верси запускаю, все библиотеки прописаны естественно. libusb - библиотека для работы с USB устройствами в данном варианте.
Но когда зажимаешь любую кнопку мыши и перемещаешь его отображается целая серия строк с нажатой кнопкой в консоли
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <libusb-1.0/libusb.h>
#include <stdbool.h>
#include <string.h>
struct libusb_device_descriptor devDescriptor; // Глобальные переменные ( структуры )
struct libusb_config_descriptor* configDescriptor; // ->
struct libusb_interface_descriptor *interface; // ->
/// PATH usr/include/libusb-1.0/libusb.h
// gcc -o main main.c -lusb-1.0 - запуск с параметрами
int count; // Глобальная переменная ( количества устройств )
int IO_VID; // ГП. для присвоения VendorID устройства
int IO_PID; // ГП. для присвоения PID устройства
void main() { // Функция, точка входа в программу
int i, j; // Объявление локальных переменных
char string[256]; // ->
bool state; // ->
int task; // ->
int x = 0, y = 0, tx, ty; // ->
int dWheel; // ->
char temp_left, temp_right, temp_middle;
unsigned char bytes[8] = { 0 }; // ->
libusb_device **devList; // ->
libusb_device *device = NULL; // ->
libusb_device_handle *devHandle; // ->
printf("Введите 1 для запуска:\n"); // Вывод информации, далее тоже самое
printf(" 1. Считывать нажатие средней (колесо), левой и правой кнопок мыши и выводить на экран факты нажатия. Завершить работу с устройством по кручению колеса мыши;\n");
scanf("%d", &task); // Ожидаем вводимое целое число
printf("Задание #%d\n", task); // Вывод информации
if (task == 0 || task == 1) { // Условие для использования по заданию нужный VID, PID; Условие используеющее мышь
IO_VID = 0x046d; // Запись в переменную VID мышь
IO_PID = 0xc077; // Запись в переменную PID мышь
}
if (libusb_init(NULL) != 0) { // Инитилизация билбиотеки LibUsb
printf("Невозможно инитилизировать библиотеку libusb\n"); // Вывод информации об ошибке
return; // Выход из программы
}
count = libusb_get_device_list(NULL, &devList); // Получение количества устройств
printf("VID-PID Нашей мышки:\n"); // Вывод информации
//printf("------------------------------------------------------------------------------------------------\n");
for (i = 0; i < count; i++) { // Цикл For со счетчиком
if (libusb_get_device_descriptor(devList[i], &devDescriptor) == 0) { // Запрашиваем дескриптора устройства
if (libusb_open(devList[i], &devHandle) == LIBUSB_SUCCESS) { // Открываем устройство
if (devDescriptor.idVendor == IO_VID) {
printf(" VID this Mouse: %04x\n", devDescriptor.idVendor); // Вывод информации о устройстве
printf(" PID this Mouse: %04x\n", devDescriptor.idProduct); // Вывод информации о устройстве
}
}
//printf("------------------------------------------------------------------------------------------------\n");
if (devDescriptor.idVendor == IO_VID && devDescriptor.idProduct == IO_PID) { // Условие на поиск устройства
device = devList[i]; // Запись в переменную номера найденого устройства
}
libusb_close(devHandle); // Закрываем дескриптор устройства
}
}
if (device == NULL) { // Условие при ошибке поиска устрйоства
printf("Не найдено устройство\n"); // Вывод информации с ошибкой
return; // Выход из программы
}
if (libusb_open(device, &devHandle) != LIBUSB_SUCCESS) { // Открываем дескриптор устройства
printf("Невозможно подключится к найденному устройству\n"); // Вывод информации с ошибкой
return; // Выход из программы
}
libusb_free_device_list(devList, 0); // Отчищаем список устройств
printf("Нажмите Enter для продолжения"); // Вывод информации
getchar(); getchar(); // Ожидаем клавиши Enter для выполнения задания
if ( libusb_kernel_driver_active(devHandle, 0) == 1) { // Проверка на захват ядром устройства
printf("Устройство захвачено ядром ОС\n"); // Вывод информации
libusb_detach_kernel_driver(devHandle, 0); // Отсоединить устрйоства от ядра
printf("Устройство отсоединено от ядра\n"); // Вывод информации
}
if (libusb_claim_interface(devHandle, 0) < 0) { // Захват интерфейса устрйоства
printf("Захват интерфейса устройства - ошибка"); // Вывод информации с ошибкой
return; // Выход из программы
}
if (task == 1) { // Выполнение 1 задания
**
while(true){ // Бесконечный цикл
if (libusb_interrupt_transfer(devHandle, 0x81, bytes, sizeof(bytes), 0, 0) >= 0) { // Ожидание получения пакета от мыши
if ((0b00000001 == bytes[0])) {
printf("Левая кнопка мыши\n");
}
for (int i = 0; i < 8; i++) {
printf("%s", (bytes[0] & 0x80) ? "1" : "0");
bytes[0] <<= 1;
}
printf("\n");
printf("data: %d\n",bytes[0]);
if (0b00001111 & bytes[3]) { // При прокрутки колесика мыши выход из цикла
break; // Выход из цикла
**
} // Выход из цикла
}
}
}
libusb_release_interface(devHandle, 0); // Закрытие захваченого интерфейса
libusb_attach_kernel_driver(devHandle, 0); // Прикрепление к ядру
libusb_close(devHandle); // Отключить библиотеку libUsb
libusb_exit(NULL); // ->
}
// gcc -I/usr/include/libusb-1.0/ main.c -o main -lusb-1.0
есть второй вариант того цикла:
Кстати, есть более адекватный цикл: но в нем те же проблемы присутстуют...
if (task == 1) {
while(true){
if (libusb_interrupt_transfer(devHandle, 0x81, bytes, sizeof(bytes), 0, 10000) >= 0) {
printf("Левая кнопка мыши: %03d\n", (0b00000001 & bytes[0]) );
printf("Правая кнопка мыши: %03d\n", (0b00000010 & bytes[0]) );
printf("Средняя кнопка мыши: %03d\n", (0b00000100 & bytes[0]));
if (0b00001111 & bytes[3]) {
break;
}
}else{
break;
}
}