Stap 6: De HID-code toevoegen aan uw bestanden Arduino omgeving
Nu hebt u uw descriptor u toevoegen aan uw omgeving Arduino moet, zodat het kan het programma op uw apparaat. Om dit te doen moet u een aantal bestanden wijzigen. Navigeer naar de documenten/Arduino/hardware/arduino/cores/arduino (Mac) of C:\Program Files (x86) \Arduino\hardware\arduino\cores\arduino (Win) map. Er nemen in reservekopieën van de bestanden HID.cpp en USBAPI.h, voor het geval.
Open HID.cpp in uw favoriete tekst-editor (EditPlus 2 of Notepad ++ zijn goed voor Windows, tekst Wrangler is handig voor Mac) en zoek in de buurt van de bovenkant naar de volgende sectie:
#if defined(USBCON)#ifdef HID_ENABLED // #define RAWHID_ENABLED // Singletons for mouse and keyboard Mouse_ Mouse; Keyboard_ Keyboard;
U moet nu een definitie en een singleton-variabele als volgt toevoegen:
#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;
Kijk dan verder naar beneden voor de RAWHID-sectie:
#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 };
Nu wijzigen om te wijzigen van de #if aan #ifdef en uw nieuwe HID-descriptor binnen eigen #ifdef sectie invoegen
#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 };
Nu is gedaan, moeten we enkele code toevoegen om te ontvangen van de gegevens van onze schets die we eerder hebt gemaakt en het rapport verzenden. Zoek verder naar beneden voor de volgende code:
//=============================================================================//============================================================================= // Mouse Mouse_::Mouse_(void) : _buttons(0) { }
Direct boven dit toevoegen een nieuw stuk van code kan omgaan met de gegevens als volgt
//=============================================================================//============================================================================= // 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); }
Hier definiëren we het aantal bytes dat wordt verzonden. In dit geval 2-1 byte voor de knoppen en 1 byte voor de hoed, inclusief opvulling. Dan hebben we de eenvoudige functie te aanvaarden van de gegevens die worden verzonden vanaf de schets, hak hem omhoog en dan spuug het uit met de HID_SendReport functie. Dit men is zeer eenvoudig, maar vindt u ingewikkelder is dan degenen elders. Deze site heeft een goed voorbeeld van een 8-as, de 32-knop, de 1 hoed setup. Dit sociaal assistente mij alot maar was veel te ingewikkeld voor wat ik wilde dus ik vereenvoudigd het zo veel als ik kon.
Zodra u hebt alles gedaan wat, sla het bestand op en open USBAPI.h. In dit bestand zullen we een struct en klasse voor de joystick-object maken. Zoek de volgende code:
//==========================================================================//========================================================================== // Mouse #define MOUSE_LEFT 1 #define MOUSE_RIGHT 2
Als voorheen, voeg deze code direct boven dit
//=============================================================================//============================================================================= // 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;
Sla het bestand op en je bent klaar. Nogmaals, hebt u meer een veeleisende toepassing programmacode toe te voegen om de extra hardware. De hierboven genoemde site zal weer nuttig zijn.