|
44 | 44 | #else |
45 | 45 |
|
46 | 46 | uint8_t txData[20] = { 0x00, 0x14, 0x00 }; |
47 | | -uint8_t rxData[8] = { 0x00 }; |
48 | | - |
49 | 47 | boolean buttonState = false; |
50 | 48 |
|
| 49 | +volatile uint8_t rxData[8] = { 0x00 }; |
| 50 | +volatile uint8_t playerNum = 0; |
| 51 | + |
51 | 52 | void setup() { |
52 | 53 | while (!XInputUSB::connected()) {} // wait for connection |
53 | 54 | XInputUSB::setRecvCallback(receiveCallback); |
54 | 55 | } |
55 | 56 |
|
56 | 57 | void loop() { |
| 58 | + // Set D-PAD based on player number (test receive) |
| 59 | + const uint8_t pNum = playerNum; |
| 60 | + if (pNum != 0) { |
| 61 | + setPlayerControl(pNum); |
| 62 | + playerNum = 0; |
| 63 | + } |
| 64 | + |
| 65 | + // Toggle button 'A' (test send) |
57 | 66 | buttonState = !buttonState; |
58 | | - setButtonA(txData, buttonState); |
| 67 | + setButtonA(buttonState); |
59 | 68 | XInputUSB::send(txData, sizeof(txData)); |
60 | 69 |
|
61 | 70 | delay(1000); |
62 | 71 | } |
63 | 72 |
|
64 | | -void setButtonA(uint8_t * ptr, boolean state) { |
65 | | - const uint8_t ButtonIndex = 3; |
66 | | - const uint8_t ButtonPosition = 4; |
67 | | - |
| 73 | +void setButton(uint8_t index, uint8_t position, uint8_t state) { |
68 | 74 | if (state == true) { |
69 | | - ptr[ButtonIndex] |= (1 << ButtonPosition); |
| 75 | + txData[index] |= (1 << position); |
70 | 76 | } |
71 | 77 | else { |
72 | | - ptr[ButtonIndex] &= ~(1 << ButtonPosition); |
| 78 | + txData[index] &= ~(1 << position); |
73 | 79 | } |
74 | 80 | } |
75 | 81 |
|
| 82 | +void setButtonA(boolean state) { |
| 83 | + setButton(3, 4, state); |
| 84 | +} |
| 85 | + |
| 86 | +void setPlayerControl(uint8_t num) { |
| 87 | + // Player 1: Dpad Up |
| 88 | + // Player 2; Dpad Down |
| 89 | + // Player 3: Dpad Left |
| 90 | + // Player 4: Dpad Right |
| 91 | + setButton(2, num - 1, true); |
| 92 | +} |
| 93 | + |
76 | 94 | void receiveCallback() { |
77 | 95 | if (XInputUSB::available() > 0) { |
78 | | - XInputUSB::recv(rxData, sizeof(rxData)); |
| 96 | + const int success = XInputUSB::recv((uint8_t*) rxData, sizeof(rxData)); |
| 97 | + |
| 98 | + if (success > 0 && rxData[0] == 0x01) { // LED Packet |
| 99 | + uint8_t ledPattern = rxData[2]; |
| 100 | + if (ledPattern >= 2 && ledPattern <= 9) { // Player # Pattern |
| 101 | + playerNum = ((ledPattern - 2) % 4) + 1; // Player # 1-4 |
| 102 | + } |
| 103 | + } |
79 | 104 | } |
80 | 105 | } |
81 | 106 |
|
|
0 commit comments