nixp.ru v3.0

28 мая 2017,
воскресенье,
13:32:08 MSK

DevOps с компанией «Флант»
GSMD написал 4 сентября 2006 года в 23:26 (1223 просмотра) Ведет себя неопределенно; открыл 2 темы в форуме.

Для чтения данных с hid-устройства используется следующий фрагмент кода.

struct hiddev_report_info rinfo;
struct hiddev_field_info finfo;
struct hiddev_usage_ref uref;
int i, j, ret, count;
while (1){
      rinfo.report_type = HID_REPORT_TYPE_INPUT;
      rinfo.report_id = HID_REPORT_ID_FIRST;
      ret = ioctl(fd, HIDIOCGREPORTINFO, &rinfo);
      // Get Reports
      while (ret >= 0&&rinfo.num_fields>0&&rinfo.num_fields<64){
            // Get Fields
            for (i = 0; i < rinfo.num_fields; i++){
                  finfo.report_type = rinfo.report_type;
                  finfo.report_id   = rinfo.report_id;
                  finfo.field_index = i;
                  ioctl(fd, HIDIOCGFIELDINFO, &finfo);
                  // Get usages
                  for (j = 0; j < count+1; j++){
                        uref.report_type = finfo.report_type;
                        uref.report_id   = finfo.report_id;
                        uref.field_index = i;
                        uref.usage_index = j;
                        ioctl(fd, HIDIOCGUCODE, &uref);
                        ioctl(fd, HIDIOCGUSAGE, &uref);
                        printf("0x%X ",uref.value);
                        // First output usage: grab it.
                        if(uref.report_type == HID_REPORT_TYPE_OUTPUT && j==0) {
                              memcpy(&uref_out, &uref, sizeof(uref));
                        }
                  }
                  for (; j < finfo.maxusage; j++){
                        uref.report_type = finfo.report_type;
                        uref.report_id   = finfo.report_id;
                        uref.field_index = i;
                        uref.usage_index = j;
                        ioctl(fd, HIDIOCGUCODE, &uref);
                        ioctl(fd, HIDIOCGUSAGE, &uref);
                  }
            }
            printf("\n");
            rinfo.report_id = HID_REPORT_ID_NEXT;
            ret = ioctl(fd, HIDIOCGREPORTINFO, &rinfo);
            
      }
      usleep(1000000);
}
}

В результате получаю лишь последний report из серии.

При попытке вместо

ret = ioctl(fd, HIDIOCGREPORTINFO, &rinfo);

использовать

ret = ioctl(fd, HIDIOCGREPORT &rinfo);

вообще никакой разумной информации получить не удалось.

Попытки использовать вместо

rinfo.report_id = HID_REPORT_ID_FIRST;

что-либо другое, не привели ни к чему (полное отсутствие разумной информации).

Reports к устройству доходят и доходят без искажений (видно из того, что устройство правильно на них отвечает). Отправка репортов происходит при помощи

ret = ioctl(fd, HIDIOSGREPORT &rinfo);

Подскажите пожалуйста, что я делаю не так?

Премного благодарен.