Stap 7: Vouw uw schets om de gegevens te verzenden
Nu uw omgeving is geconfigureerd kunt u de code toevoegen aan uw testscript maken gebruik van de HID "descriptor".
Neem een kopie van uw testscript en wijzig het als volgt. Eerst moet u bij de bovenkant van het manuscript om toe te voegen een variabele om te houden van de status van de joystick en een andere voor het bijhouden van de hat-switch
// Create a variable to hold the entire state of the device to pass over USB to the HID driverJoyState_t joySt; // A variable to help us manage the 4 hat buttons to make an 8-way hat if we want byte hatButtons;
Voeg vervolgens een lijn aan de onderkant van de Setup-functie om de beginstatus:
joySt.buttons = 0; // Set the initial state of the buttons
In dit voorbeeld de eerste 8 knoppen zijn enkel eenvoudige knoppen dus kunnen we gewoon door alle knoppen, minder de laatste vier voor de hoed., en set of duidelijk de juiste bit rekenen op de joySt.buttons-variabele.
if (i < (switchCount - 4)) { // We're looking at all but the last 4 pins as simple buttons in this section // if the button state has changed and it's currently pressed if ((buttonState != buttonLastState[i]) && (buttonState == LOW)) { // Set the button bit joySt.buttons = bitSet(joySt.buttons, i); } // if the button state has changed and it's currently released if ((buttonState != buttonLastState[i]) && (buttonState == HIGH)) { // Unset the buttonbit joySt.buttons = bitClear(joySt.buttons, i); } // save the current button state for comparison next time: buttonLastState[i] = buttonState;} else { ...
We behandelen de laatste vier knoppen als een hat-switch. Er zijn een aantal manieren voor het verwerken van een hat-switch. Kunt u het behandelen als een eenvoudige 4-weg-hoed (Noord, Oost, Zuid, West), of u kunt gaan voor een 8-way hoed (N, NE, E SE, S, SW, W, NW). Een 4-weg-hoed is vrij eenvoudig te behandelen zodat zal ik de 8-weg versie hier tonen u. De 8-weg-functionaliteit betekent dat u omgaan met meer dan één knop wordt ingedrukt moet, zodat u kunt dingen niet instellen als je langs gaat zoals met de knoppen. Dus, naar aanleiding van de vorige code, voor de laatste vier knoppen u moet opnemen van de staat van elk in de variabele die we eerder hebt gemaakt. Ik ben met behulp van een bitmasker om dingen eenvoudiger als we kunnen gewoon lezen de geheelwaarde daarna om de 'richting' van de hoed.
} else { // We're now looking at the remaining four buttons as hat switches in this section // Using a bit-mask, set the bit that corresponds to each button so we can // determine the state of all four buttons in one go later on if (buttonState == LOW) { // Set the bit if the button is pressed bitSet(hatButtons, i - 8); } else { // Clear the bit if the button is NOT pressed bitClear(hatButtons, i - 8); } }
Nu weten we die van de hoed knoppen zijn ingedrukt wij kunnen luiden naar de waarde van de variabele hatButtons en doorgeven van de juiste waarde aan het joySt-object:
// Determine value for hatSw1 according to the buttons that are pressed// This uses the last four bits in the byte so we just need to check the value of // the byte and set the joySt.hatSw1 value if we have a single button pressed or // a valid pair of buttons pressed. Below i've shown what's pressed using UPPER // case and what's not pressed using lower case. i.e. ULdr = UP and LEFT pressed // Key: UP = bit 1, LEFT = bit 2, DOWN = bit 3, RIGHT = bit 4 switch (hatButtons) { case 0: joySt.hatSw1 = 8; break; // uldr : center : hatButtons = B00000000 case 1: joySt.hatSw1 = 0; break; // Uldr : 0 : hatButtons = B00000001 case 3: joySt.hatSw1 = 1; break; // ULdr : 45 : hatButtons = B00000011 case 2: joySt.hatSw1 = 2; break; // uLdr : 90 : hatButtons = B00000010 case 6: joySt.hatSw1 = 3; break; // uLDr : 135 : hatButtons = B00000110 case 4: joySt.hatSw1 = 4; break; // ulDr : 180 : hatButtons = B00000100 case 12: joySt.hatSw1 = 5; break; // ulDR : 225 : hatButtons = B00001100 case 8: joySt.hatSw1 = 6; break; // uldR : 270 : hatButtons = B00001000 case 9: joySt.hatSw1 = 7; break; // UldR : 315 : hatButtons = B00001001 }
Nu alles wat die nog moet worden gedaan aan de huidige status voor het bijwerken van de computer output is
// Call Joystick.setState and send the data to the computerJoystick.setState(&joySt);
Ik heb de code voor dit voorbeeld om deze stap te slaan uw vingers gehecht.