58 int8_t XBOXONESParser::getButtonIndexXboxOneS(
ButtonEnum b) {
80 const int8_t index = getButtonIndexXboxOneS(b);
if (index < 0)
return 0;
85 else if (index <=
LEFT)
88 return xboxButtonState;
93 const int8_t index = getButtonIndexXboxOneS(b);
if (index < 0)
return 0;
107 bool click = xboxbuttonClickState;
108 xboxbuttonClickState = 0;
112 bool click = buttonClickState.
val & mask;
113 buttonClickState.
val &= ~mask;
118 return xboxOneSData.
hatValue[(uint8_t)a] - 32768;
122 if (len > 1 && buf) {
125 for (uint8_t i = 0; i < len; i++) {
126 D_PrintHex<uint8_t > (buf[i], 0x80);
132 memcpy(&xboxOneSData, buf + 1, min((uint8_t)(len - 1),
MFK_CASTUINT8T sizeof(xboxOneSData)));
133 else if (buf[0] == 0x02) {
134 xboxButtonState = buf[1];
135 if(xboxButtonState != xboxOldButtonState) {
136 xboxbuttonClickState = xboxButtonState & ~xboxOldButtonState;
137 xboxOldButtonState = xboxButtonState;
140 }
else if (buf[0] == 0x04)
143 #ifdef DEBUG_USB_HOST
144 Notify(
PSTR(
"\r\nUnknown report id: "), 0x80);
145 D_PrintHex<uint8_t > (buf[0], 0x80);
150 if (xboxOneSData.
btn.
val != oldButtonState.
val) {
151 buttonClickState.
val = xboxOneSData.
btn.
val & ~oldButtonState.
val;
152 oldButtonState.
val = xboxOneSData.
btn.
val;
158 if (checkDpad(
RIGHT))
159 newDpad |= 1 <<
RIGHT;
161 newDpad |= 1 <<
DOWN;
163 newDpad |= 1 <<
LEFT;
164 if (newDpad != oldDpad) {
165 buttonClickState.
dpad = newDpad & ~oldDpad;
171 if(xboxOneSData.
trigger[0] != 0 && triggerOld[0] == 0)
173 triggerOld[0] = xboxOneSData.
trigger[0];
174 if(xboxOneSData.
trigger[1] != 0 && triggerOld[1] == 0)
176 triggerOld[1] = xboxOneSData.
trigger[1];
182 for (i = 0; i <
sizeof(xboxOneSData.
hatValue) /
sizeof(xboxOneSData.
hatValue[0]); i++)
185 oldButtonState.
val = 0;
186 for (i = 0; i <
sizeof(xboxOneSData.
trigger) /
sizeof(xboxOneSData.
trigger[0]); i++)
191 buttonClickState.
dpad = 0;
212 buf[0] = 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0 ;
213 buf[1] = leftTrigger;
214 buf[2] = rightTrigger;
const uint8_t XBOX_ONE_S_BUTTONS[]
void setRumbleOn(uint8_t leftTrigger, uint8_t rightTrigger, uint8_t leftMotor, uint8_t rightMotor)
virtual void sendOutputReport(uint8_t *data, uint8_t nbytes)=0
int16_t getAnalogHat(AnalogHatEnum a)
void Parse(uint8_t len, uint8_t *buf)
uint16_t getButtonPress(ButtonEnum b)
bool getButtonClick(ButtonEnum b)
constexpr int8_t ButtonIndex(ButtonEnum key)
#define pgm_read_byte(addr)