mirror of
https://github.com/felis/USB_Host_Shield_2.0.git
synced 2024-03-22 11:31:26 +01:00
Can now also parse the battery level and charging status
This commit is contained in:
parent
4651acd2c6
commit
ec8890d40e
4 changed files with 37 additions and 8 deletions
|
@ -71,14 +71,14 @@ void SwitchProParser::Parse(uint8_t len, uint8_t *buf) {
|
||||||
if (buf[0] == 0x3F) // Simple input report via Bluetooth
|
if (buf[0] == 0x3F) // Simple input report via Bluetooth
|
||||||
switchProOutput.enableFullReportMode = true; // Switch over to the full report
|
switchProOutput.enableFullReportMode = true; // Switch over to the full report
|
||||||
else if (buf[0] == 0x30) { // Standard full mode
|
else if (buf[0] == 0x30) { // Standard full mode
|
||||||
if (len < 4) {
|
if (len < 3) {
|
||||||
#ifdef DEBUG_USB_HOST
|
#ifdef DEBUG_USB_HOST
|
||||||
Notify(PSTR("\r\nReport is too short: "), 0x80);
|
Notify(PSTR("\r\nReport is too short: "), 0x80);
|
||||||
D_PrintHex<uint8_t > (len, 0x80);
|
D_PrintHex<uint8_t > (len, 0x80);
|
||||||
#endif
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
memcpy(&switchProData, buf + 3, min((uint8_t)(len - 3), MFK_CASTUINT8T sizeof(switchProData)));
|
memcpy(&switchProData, buf + 2, min((uint8_t)(len - 2), MFK_CASTUINT8T sizeof(switchProData)));
|
||||||
|
|
||||||
if (switchProData.btn.val != oldButtonState.val) { // Check if anything has changed
|
if (switchProData.btn.val != oldButtonState.val) { // Check if anything has changed
|
||||||
buttonClickState.val = switchProData.btn.val & ~oldButtonState.val; // Update click state variable
|
buttonClickState.val = switchProData.btn.val & ~oldButtonState.val; // Update click state variable
|
||||||
|
@ -250,4 +250,4 @@ void SwitchProParser::Reset() {
|
||||||
switchProOutput.enableImu = -1;
|
switchProOutput.enableImu = -1;
|
||||||
switchProOutput.sendHandshake = false;
|
switchProOutput.sendHandshake = false;
|
||||||
switchProOutput.disableTimeout = false;
|
switchProOutput.disableTimeout = false;
|
||||||
};
|
}
|
||||||
|
|
|
@ -100,7 +100,10 @@ struct ImuData {
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|
||||||
struct SwitchProData {
|
struct SwitchProData {
|
||||||
// TODO: Add byte 2 containing battery level and connection info
|
struct {
|
||||||
|
uint8_t connection_info : 4;
|
||||||
|
uint8_t battery_level : 4;
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
/* Button and joystick values */
|
/* Button and joystick values */
|
||||||
SwitchProButtons btn; // Bytes 3-5
|
SwitchProButtons btn; // Bytes 3-5
|
||||||
|
@ -316,10 +319,27 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Get the incoming message count. */
|
/** Get the incoming message count. */
|
||||||
uint16_t getMessageCounter(){
|
uint16_t getMessageCounter() {
|
||||||
return message_counter;
|
return message_counter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the battery level of the Switch Pro Controller.
|
||||||
|
* @return The battery level as a bit mask according to ::SwitchProBatteryLevel:
|
||||||
|
* 4=full, 3=medium, 2=low, 1=critical, 0=empty.
|
||||||
|
*/
|
||||||
|
uint8_t getBatteryLevel() {
|
||||||
|
return switchProData.battery_level >> 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whenever the controller is plugged in and charging.
|
||||||
|
* @return Returns True if the controller is charging.
|
||||||
|
*/
|
||||||
|
bool isCharging() {
|
||||||
|
return switchProData.battery_level & 0x01;
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/**
|
/**
|
||||||
* Used to parse data sent from the Switch Pro controller.
|
* Used to parse data sent from the Switch Pro controller.
|
||||||
|
@ -352,7 +372,6 @@ protected:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static int8_t getButtonIndexSwitchPro(ButtonEnum b);
|
static int8_t getButtonIndexSwitchPro(ButtonEnum b);
|
||||||
bool checkDpad(ButtonEnum b); // Used to check Switch Pro DPAD buttons
|
|
||||||
|
|
||||||
void sendOutputCmd();
|
void sendOutputCmd();
|
||||||
void sendRumbleOutputReport();
|
void sendRumbleOutputReport();
|
||||||
|
|
|
@ -109,8 +109,13 @@ void loop() {
|
||||||
|
|
||||||
if (SwitchPro.getButtonClick(A))
|
if (SwitchPro.getButtonClick(A))
|
||||||
Serial.print(F("\r\nA"));
|
Serial.print(F("\r\nA"));
|
||||||
if (SwitchPro.getButtonClick(B))
|
if (SwitchPro.getButtonClick(B)) {
|
||||||
Serial.print(F("\r\nB"));
|
Serial.print(F("\r\nB"));
|
||||||
|
Serial.print(F("\r\nBattery level: "));
|
||||||
|
Serial.print(SwitchPro.getBatteryLevel());
|
||||||
|
Serial.print(F(", charging: "));
|
||||||
|
Serial.print(SwitchPro.isCharging());
|
||||||
|
}
|
||||||
if (SwitchPro.getButtonClick(X))
|
if (SwitchPro.getButtonClick(X))
|
||||||
Serial.print(F("\r\nX"));
|
Serial.print(F("\r\nX"));
|
||||||
if (SwitchPro.getButtonClick(Y))
|
if (SwitchPro.getButtonClick(Y))
|
||||||
|
|
|
@ -90,8 +90,13 @@ void loop() {
|
||||||
|
|
||||||
if (SwitchPro.getButtonClick(A))
|
if (SwitchPro.getButtonClick(A))
|
||||||
Serial.print(F("\r\nA"));
|
Serial.print(F("\r\nA"));
|
||||||
if (SwitchPro.getButtonClick(B))
|
if (SwitchPro.getButtonClick(B)) {
|
||||||
Serial.print(F("\r\nB"));
|
Serial.print(F("\r\nB"));
|
||||||
|
Serial.print(F("\r\nBattery level: "));
|
||||||
|
Serial.print(SwitchPro.getBatteryLevel());
|
||||||
|
Serial.print(F(", charging: "));
|
||||||
|
Serial.print(SwitchPro.isCharging());
|
||||||
|
}
|
||||||
if (SwitchPro.getButtonClick(X))
|
if (SwitchPro.getButtonClick(X))
|
||||||
Serial.print(F("\r\nX"));
|
Serial.print(F("\r\nX"));
|
||||||
if (SwitchPro.getButtonClick(Y))
|
if (SwitchPro.getButtonClick(Y))
|
||||||
|
|
Loading…
Reference in a new issue