static void writedata(int f, report_desc_t rd) { struct variable *var; int dlen, i, r, rid; u_char *dbuf; enum hid_kind kind; kind = 0; rid = 0; for (kind = 0; kind < 3; kind ++) { for (rid = 0; rid < 256; rid ++) { for (var = vars; var; var = var->next) { if (rid == var->h.report_ID && kind == var->h.kind) break; } if (var == NULL) continue; dlen = hid_report_size(rd, kind, rid); if (dlen <= 0) continue; dbuf = malloc(dlen); memset(dbuf, 0, dlen); dbuf[0] = rid; if (!zflag && hid_get_report(f, kind, dbuf, dlen) == 0) { if (verbose) { printf("Got %s report %d (%d bytes):", kind == hid_input ? "input" : kind == hid_output ? "output" : "feature", rid, dlen); for (i = 0; i < dlen; i++) printf(" %02x", dbuf[i]); printf("\n"); } } else if (!zflag) { warn("hid_get_report(rid %d)", rid); if (verbose) { printf("Can't get %s report %d (%d bytes). " "Will be initialized with zeros.\n", kind == hid_input ? "input" : kind == hid_output ? "output" : "feature", rid, dlen); } } for (var = vars; var; var = var->next) { if (rid != var->h.report_ID || kind != var->h.kind) continue; hid_set_data(dbuf, &var->h, var->val); } if (verbose) { printf("Setting %s report %d (%d bytes):", kind == hid_output ? "output" : kind == hid_feature ? "feature" : "input", rid, dlen); for (i = 0; i < dlen; i++) printf(" %02x", dbuf[i]); printf("\n"); } r = hid_set_report(f, kind, dbuf, dlen); if (r != 0) warn("hid_set_report(rid %d)", rid); free(dbuf); } } }
QByteArray QUsbHid::getInputReport(int reportID, int maxLen,bool* r) { return hid_get_report(handle, interface, HID_REPORT_TYPE_INPUT, reportID, maxLen, &lastErr, r); }
static void dumpdata(int f, report_desc_t rd, int loop) { struct variable *var; int dlen, havedata, i, match, r, rid, use_rid; u_char *dbuf; enum hid_kind kind; kind = 0; rid = -1; use_rid = !!hid_get_report_id(f); do { if (kind < 3) { if (++rid >= 256) { rid = 0; kind++; } if (kind >= 3) rid = -1; for (var = vars; var; var = var->next) { if (rid == var->h.report_ID && kind == var->h.kind) break; } if (var == NULL) continue; } dlen = hid_report_size(rd, kind < 3 ? kind : hid_input, rid); if (dlen <= 0) continue; dbuf = malloc(dlen); memset(dbuf, 0, dlen); if (kind < 3) { dbuf[0] = rid; r = hid_get_report(f, kind, dbuf, dlen); if (r < 0) warn("hid_get_report(rid %d)", rid); havedata = !r && (rid == 0 || dbuf[0] == rid); if (rid != 0) dbuf[0] = rid; } else { r = read(f, dbuf, dlen); if (r < 1) err(1, "read error"); havedata = 1; } if (verbose) { printf("Got %s report %d (%d bytes):", kind == hid_output ? "output" : kind == hid_feature ? "feature" : "input", use_rid ? dbuf[0] : 0, dlen); if (havedata) { for (i = 0; i < dlen; i++) printf(" %02x", dbuf[i]); } printf("\n"); } match = 0; for (var = vars; var; var = var->next) { if ((kind < 3 ? kind : hid_input) != var->h.kind) continue; if (var->h.report_ID != 0 && dbuf[0] != var->h.report_ID) continue; match = 1; if (!noname) printf("%s=", var->name); if (havedata) prdata(dbuf, &var->h); printf("\n"); } if (match) printf("\n"); free(dbuf); } while (loop || kind < 3); }
QByteArray QUsbHid::getFeature(int reportID, int maxLen,bool* r) { return hid_get_report(handle, interface, HID_REPORT_TYPE_FEATURE, reportID, maxLen, &lastErr, r); }