Paso 6: Agregue el código ocultado a los archivos de entorno de Arduino
Ahora tienes el descriptor que necesita agregar al entorno de Arduino, por lo que se puede programar a su dispositivo. Para hacer esto usted tendrá que modificar un par de archivos. Desplácese al directorio de archivos de C:\Program (x86) \Arduino\hardware\arduino\cores\arduino (Win) o documentos/Arduino/hardware/arduino/corazones/arduino (Mac). En tener copias de seguridad de los archivos HID.cpp y USBAPI.h, por si acaso.
Abrir HID.cpp en su editor de texto favorito (EditPlus 2 o Notepad ++ son buenas para Windows, texto Wrangler es útil para Mac) y buscar en la parte superior la siguiente sección:
#if defined(USBCON)#ifdef HID_ENABLED // #define RAWHID_ENABLED // Singletons for mouse and keyboard Mouse_ Mouse; Keyboard_ Keyboard;
Ahora necesita añadir una definición y una variable singleton como sigue:
#if defined(USBCON)#ifdef HID_ENABLED// #define RAWHID_ENABLED #define JOYHID_ENABLED// Singletons for mouse and keyboard Mouse_ Mouse; Keyboard_ Keyboard;// And now a joystick object too Joystick_ Joystick;
Entonces busque abajo para la sección de Grad:
#if RAWHID_ENABLED // RAW HID 0x06, LSB(RAWHID_USAGE_PAGE), MSB(RAWHID_USAGE_PAGE), // 30 0x0A, LSB(RAWHID_USAGE), MSB(RAWHID_USAGE), 0xA1, 0x01, // Collection 0x01 0x85, 0x03, // REPORT_ID (3) 0x75, 0x08, // report size = 8 bits 0x15, 0x00, // logical minimum = 0 0x26, 0xFF, 0x00, // logical maximum = 255 0x95, 64, // report count TX 0x09, 0x01, // usage 0x81, 0x02, // Input (array) 0x95, 64, // report count RX 0x09, 0x02, // usage 0x91, 0x02, // Output (array) 0xC0 // end collection #endif };
Ahora modificar para cambiar el #if #ifdef e introduzca el descriptor HID nuevo dentro de su propia sección de #ifdef
#ifdef RAWHID_ENABLED// RAW HID 0x06, LSB(RAWHID_USAGE_PAGE), MSB(RAWHID_USAGE_PAGE), // 30 0x0A, LSB(RAWHID_USAGE), MSB(RAWHID_USAGE), 0xA1, 0x01, // Collection 0x01 0x85, 0x03, // REPORT_ID (3) 0x75, 0x08, // report size = 8 bits 0x15, 0x00, // logical minimum = 0 0x26, 0xFF, 0x00, // logical maximum = 255 0x95, 64, // report count TX 0x09, 0x01, // usage 0x81, 0x02, // Input (array) 0x95, 64, // report count RX 0x09, 0x02, // usage 0x91, 0x02, // Output (array) 0xC0 // end collection #endif// *** Here is where the RAW_HID has been converted to a Game Pad device // *** Inspired by helmpcb.com/electronics/usb-joystick // *** Check out www.usb.org/developers/hidpage/ for more than you'll ever need to know about USB HID // *** HID descriptor created using the HID descriptor tool from www.usb.org/developers/hidpage/dt2_4.zip#ifdef JOYHID_ENABLED 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x05, // USAGE (Game Pad) 0xa1, 0x01, // COLLECTION (Application) 0x85, 0x03, // REPORT_ID (3) (This is important when HID_SendReport() is called) 0xA1, 0x00, // COLLECTION (Physical) // 8 buttons 0x05, 0x09, // USAGE_PAGE (Button) 0x19, 0x01, // USAGE_MINIMUM (Button 1) 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) // 1 Hat Switch 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x39, // USAGE (Hat switch) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x07, // LOGICAL_MAXIMUM (7) 0x35, 0x00, // PHYSICAL_MINIMUM (0) 0x46, 0x3B, 0x01, // PHYSICAL_MAXIMUM (315) 0x65, 0x14, // UNIT (Eng Rot:Angular Pos) 0x75, 0x04, // REPORT_SIZE (4) 0x95, 0x01, // REPORT_COUNT (1) 0x81, 0x02, // INPUT (Data,Var,Abs) // Padding (4 bytes) 0x75, 0x04, // REPORT_SIZE (4) 0x95, 0x01, // REPORT_COUNT (1) 0x81, 0x03, // INPUT (Cnst,Var,Abs) // 1 D-pads - Dummy so Elite:Dangerous recognises it 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x30, // USAGE (X) 0x09, 0x31, // USAGE (Y) 0x15, 0x81, // LOGICAL_MINIMUM (-127) 0x25, 0x7f, // LOGICAL_MAXIMUM (127) 0x75, 0x08, // REPORT_SIZE (8) 0x95, 0x02, // REPORT_COUNT (2) 0x81, 0x02, // INPUT (Data,Var,Abs) 0xC0, //END COLLECTION 0xC0, //END COLLECTION#endif };
Ahora que ha hecho, necesitamos añadir algún código para recibir los datos de nuestro dibujo que creamos anteriormente y enviar el informe. Busque por el siguiente código:
//=============================================================================//============================================================================= // Mouse Mouse_::Mouse_(void) : _buttons(0) { }
Directamente por encima de esto agregue un nuevo trozo de código para manejar los datos como sigue
//=============================================================================//============================================================================= // Joystick // Usage: Joystick.move(inputs go here) // // The report data format must match the one defined in the descriptor exactly // or it either won't work, or the pc will make a mess of unpacking the data //Joystick_::Joystick_() { }#define joyBytes 4 // should be equivalent to sizeof(JoyState_t)void Joystick_::setState(JoyState_t *joySt) { uint8_t data[joyBytes]; data[0] = joySt->buttons & 0xFF; data[1] = joySt->hatSw1; data[2] = joySt->left_x; data[3] = joySt->left_y; //HID_SendReport(Report number, array of values in same order as HID descriptor, length) // The joystick is specified as using report 3 in the descriptor. That's where the "3" comes from HID_SendReport(3, data, joyBytes); }
Aquí definimos el número de bytes que se envían. En este caso 2-1 byte para los botones y 1 byte para el sombrero, como relleno. Luego tenemos la función simple para aceptar los datos enviados desde el boceto, picar para arriba y luego escupirla utilizando la función HID_SendReport. Este es muy simple, pero usted puede encontrar que más complicada en otros lugares. Este sitio tiene un buen ejemplo de un eje de 8, 32-botón, configuración 1 sombrero. Esto me ayudó mucho pero era demasiado complicado para lo que quería así que había simplificado tanto como pude.
Una vez hayas hecho todo eso, guarde el archivo y abra USBAPI.h. En este archivo se creará una estructura y clase para el objeto de la palanca de mando. Encontrar el siguiente código:
//==========================================================================//========================================================================== // Mouse #define MOUSE_LEFT 1 #define MOUSE_RIGHT 2
Como antes, insertar este código directamente por encima de este
//=============================================================================//============================================================================= // Joystick // Implemented in HID.cpp // The list of parameters here needs to match the implementation in HID.cpptypedef struct JoyState // Pretty self explanitory. Simple state to store all the joystick parameters { uint8_t buttons; uint8_t hatSw1; int8_t left_x; int8_t left_y; } JoyState_t;class Joystick_ { public: Joystick_(); void setState(JoyState_t *joySt);}; extern Joystick_ Joystick;
Guarde el archivo y listo. Una vez más, si tienes más una aplicación exigente simplemente agregar código para controlar el hardware adicional. El sitio antes mencionado será útil nuevamente.