oscaroae:
Queria hacerte ( mas bien hacerles) una consulta, como modifico el descriptor para realizar un "gamepad o joystick" que sólo posea botones y no aparezcan los ejes x,y por ejemplo.
Mi idea es hacer un control con solo 32 botones y despues otro control con solo dos ó 4 ejes.
Otra cosa que no entedí es que es y para que sirve el #define USB_NUM_HID_INTERFACES 2 que mencionaste.
Les comento que arme un joystick y funcionó bien, y para los que no podian modificarle el nombre del dispositivo les cuento que busquen en la REGISTRY del Windows el string del dispositivo, lo borran y luego al enchufar nuevamente el joystick les tomará el nombre nuevo, es que el windows recuerda el id del dispositivo viejo y entonces no actualiza el nombre, aprovecho a preguntar como cambio el ID y que valores les puedo poner.
Slds.
Hola dashtronic. Primero mis disculpas, se suponía que tenía suscrito este post, pero nunca me llegó email de nada. Segundo, no sé si a estas alturas ya solucionaste, en todo caso yo probaría quitar todas las colecciones que hacen referencia a las palancas. Es decir el descriptor quedaría:
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x09, 0x05, // USAGE (Game Pad)
0xa1, 0x01, // COLLECTION (Application)
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x01, // USAGE_MINIMUM (Button 1) ---- 'Botones'
0x29, 0x08, // USAGE_MAXIMUM (Button 8)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x95, 0x08, // REPORT_COUNT (8)
0x75, 0x01, // REPORT_SIZE (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x09, // USAGE_MINIMUM (Button 9) 'MAS botones'
0x29, 0x10, // USAGE_MAXIMUM (Button 16)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x95, 0x08, // REPORT_COUNT (8)
0x75, 0x01, // REPORT_SIZE (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xc0 // END_COLLECTION
Yo intenté meter 16 botones en un solo Usage Page Button, pero no me sirvió. Por lo que hice fueron paquetes de a 8, (2 en este caso) Tu tendrías que hacer otros 2, recuerda que los valores están en Hexadecimal (por lo que 0x10 es = 16 o boton 16).
Respecto a los ID... creo que si no vas a vender el dispositivo, puedes usar cualquiera, de lo contrario tienes que registrar tu ID con usb.org (creo).
Por ultimo #define USB_NUM_HID_INTERFACES 2... encontré q debía definirse de esta forma, aunque no estoy seguro para que o con que fin. Creo, pero no estoy seguro porque no he tenido otro pic para probar, es para conectar 2 dispositivos con el mismo ID. Bueno, espero haber ayudado a alguien
Saludos!
Hola a todos,
Tengo un hardware trabajando con el PIC18F2550 y una aplicacion en vb net 2008 express, pero aun no entiendo muy bien como debo configurar este report para que trabaje segun los datos que utilizo.
Este es parte de mi main donde debo recibir una cantidad desconocida de numeros, y el pic responde ok a cada recepcion de datos. El problema esta en que el pic solamente recibe bien los 2 primeros datos [0] y [1], el resto me recibe basura.
Código:case 170: if ( responder_ok() == true ) { if (llego_dato_USB() == true ) { usb_get_packet(1, inp_data, sizeof(inp_data)); total_telef = inp_data[0]; //write_eeprom (10,total_telef); if ( responder_ok() == true ) { puntero = 11; salir = false; if (llego_dato_USB() == true ) { usb_get_packet(1, inp_data, sizeof(inp_data)); total_digitos = inp_data[0]; if ( responder_ok() == true ) { if (llego_dato_USB() == true ) { i = 0; usb_get_packet(1, inp_data, sizeof(inp_data)); // total_digitos //for (pos = puntero ; pos <= (puntero + total_digitos) ; pos++) //{ //escribir_eeprom (pos,inp_data[i]); num_telf[0]=inp_data[0]; num_telf[1]=inp_data[1]; num_telf[2]=inp_data[2]; num_telf[3]=inp_data[3]; num_telf[4]=inp_data[4]; num_telf[5]=inp_data[5]; num_telf[6]=inp_data[6]; num_telf[7]=inp_data[7]; num_telf[8]=inp_data[8]; num_telf[9]=inp_data[9]; //i++; //} num_telf[10] = total_digitos; num_telf[11] = total_telef; //escribir_eeprom(pos,'%'); puntero = pos++; responder_ok(); } } } } } } break;
y
Código:const char USB_CLASS_SPECIFIC_DESC[] = { 6, 0, 255, // Usage Page = Vendor Defined 9, 1, // Usage = IO device 0xa1, 1, // Collection = Application 0x19, 1, // Usage minimum 0x29, 8, // Usage maximum 0x15, 0x80, // Logical minimum (-128) 0x25, 0x7F, // Logical maximum (127) 0x75, 8, // Report size = 8 (bits) 0x95, 2, // Report count = 16 bits (2 bytes) 0x81, 2, // Input (Data, Var, Abs) 0x19, 1, // Usage minimum 0x29, 8, // Usage maximum 0x75, 8, // Report size = 8 (bits) 0x95, 2, // Report count = 16 bits (2 bytes) 0x91, 2, // Output (Data, Var, Abs) 0xc0 // End Collection };
Me podrian decir en lo que me estoy equivocando aca. Gracias
Bueno, no sé como estás enviando los datos (en que formato), pero si dices que te funcionan los dos primeros entonces vas bien. En tu descriptor veo que defines el Conteo del Reporte con 2 bytes. Pero tu estás manejando 10 bytes. Es decir en las ultimas lineas del descriptor,
Código:
0x95, 2, // Report count = 16 bits (2 bytes)
Debería ser:
Código:
0x95, 10, // Report count (10 bytes)
Pero como le decía a dashtronic, esto tiene como la mala costumbre de manejar paquetes de a 8, sean bits, o bytes. Por lo pronto intenta probarlo de esta forma y nos cuentas.
Saludos!
Última edición: