hid_return hid_dump_tree(FILE* const out, HIDInterface* const hidif) { if (!hid_is_opened(hidif)) { ERROR("cannot dump tree of unopened HIDinterface."); return HID_RET_DEVICE_NOT_OPENED; } if (!out) { ERROR("cannot dump HIDinterface tree of USB device %s to NULL output stream.", hidif->id); return HID_RET_INVALID_PARAMETER; } hid_reset_parser(hidif); TRACE("iterating the parse tree for USB device %s...", hidif->id); unsigned int i = 0; fprintf(out, "parse tree of HIDInterface %s:\n", hidif->id); while (HIDParse(hidif->hid_parser, hidif->hid_data)) { fprintf(out, " path: "); for (i = 0; i < hidif->hid_data->Path.Size; ++i) { fprintf(out, "0x%08x", (hidif->hid_data->Path.Node[i].UPage << 16) | hidif->hid_data->Path.Node[i].Usage); if ((signed)i < hidif->hid_data->Path.Size - 1) fputc('.', out); } fprintf(out, "; type: 0x%02x\n", hidif->hid_data->Type); } hid_reset_parser(hidif); return HID_RET_SUCCESS; }
/* -------------------------------------------------------------------------- */ static void usbhid_get_descriptor(t_usbhid *x) { if(x->debug_level) post("usbhid_get"); unsigned int i = 0; t_int input_size = 0; t_int output_size = 0; t_int feature_size = 0; char buf[MAXPDSTRING]; if (!hid_is_opened(x->x_hidinterface)) { error("[usbget] cannot dump tree of unopened HIDinterface."); } else { post("[usbhid] parse tree of HIDInterface %s:\n", x->x_hidinterface->id); // reset_output(x); while (HIDParse(x->x_hidinterface->hid_parser, x->x_hidinterface->hid_data)) { reset_output(x); // add_symbol_to_output(x, gensym("path")); switch(x->x_hidinterface->hid_data->Type) { case 0x80: add_symbol_to_output(x, gensym("input")); input_size = input_size + x->x_hidinterface->hid_data->Size; break; case 0x90: add_symbol_to_output(x, gensym("output")); output_size = output_size + x->x_hidinterface->hid_data->Size; break; case 0xb0: add_symbol_to_output(x, gensym("feature")); feature_size = feature_size + x->x_hidinterface->hid_data->Size; break; default: add_symbol_to_output(x, gensym("UNKNOWN_TYPE")); } add_float_to_output(x, x->x_hidinterface->hid_data->Size); add_float_to_output(x, x->x_hidinterface->hid_data->Offset); add_symbol_to_output(x, gensym("path")); for (i = 0; i < x->x_hidinterface->hid_data->Path.Size; ++i) { // sprintf(buf, "0x%04x", x->x_hidinterface->hid_data->Path.Node[i].UPage); // add_symbol_to_output(x, gensym(buf)); // sprintf(buf, "0x%04x", x->x_hidinterface->hid_data->Path.Node[i].Usage); // add_symbol_to_output(x, gensym(buf)); // post("0x%04x%04x",x->x_hidinterface->hid_data->Path.Node[i].UPage, // x->x_hidinterface->hid_data->Path.Node[i].Usage); } add_symbol_to_output(x, gensym("logical")); add_float_to_output(x, x->x_hidinterface->hid_data->LogMin); add_float_to_output(x, x->x_hidinterface->hid_data->LogMax); outlet_anything(x->x_status_outlet, gensym("element"), x->output_count, x->output); } reset_output(x); // add_symbol_to_output(x, gensym("totalSize")); add_float_to_output(x, input_size); add_float_to_output(x, output_size); add_float_to_output(x, feature_size); outlet_anything(x->x_status_outlet, gensym("totalSize"), x->output_count, x->output); // outlet_anything(x->x_status_outlet, gensym("device"), // x->output_count, x->output); } }