MissionControl/btdrv-mitm/source/controllers/switchcontroller.hpp

124 lines
3.5 KiB
C++

#pragma once
#include "bluetoothcontroller.hpp"
#define UINT12_MAX 0xfff
#define STICK_ZERO 0x800
namespace controller {
enum BatteryLevel {
BatteryLevel_Empty,
BatteryLevel_Critical,
BatteryLevel_Low,
BatteryLevel_Medium,
BatteryLevel_Full
};
struct SwitchStickData {
uint8_t xy[3];
};
struct SwitchButtonData {
uint8_t Y : 1;
uint8_t X : 1;
uint8_t B : 1;
uint8_t A : 1;
uint8_t : 2; // SR, SL (Right Joy)
uint8_t R : 1;
uint8_t ZR : 1;
uint8_t minus : 1;
uint8_t plus : 1;
uint8_t rstick_press : 1;
uint8_t lstick_press : 1;
uint8_t home : 1;
uint8_t capture : 1;
uint8_t : 0;
uint8_t dpad_down : 1;
uint8_t dpad_up : 1;
uint8_t dpad_right : 1;
uint8_t dpad_left : 1;
uint8_t : 2; // SR, SL (Left Joy)
uint8_t L : 1;
uint8_t ZL : 1;
};
struct Switch6AxisData {
uint16_t accel_x;
uint16_t accel_y;
uint16_t accel_z;
uint16_t gyro_1;
uint16_t gyro_2;
uint16_t gyro_3;
};
struct SwitchReport0x21 {
uint8_t timer;
uint8_t conn_info : 4;
uint8_t battery : 4;
//uint8_t timer;
SwitchButtonData buttons;
SwitchStickData left_stick;
SwitchStickData right_stick;
uint8_t vibrator;
struct {
uint8_t ack;
uint8_t id;
uint8_t reply;
uint8_t data[0x22];
} subcmd;
};
struct SwitchReport0x30 {
uint8_t timer;
uint8_t conn_info : 4;
uint8_t battery : 4;
SwitchButtonData buttons;
SwitchStickData left_stick;
SwitchStickData right_stick;
uint8_t vibrator;
Switch6AxisData imu_0ms;
Switch6AxisData imu_5ms;
Switch6AxisData imu_10ms;
} __attribute__ ((__packed__));
union SwitchReportData {
SwitchReport0x21 report0x21;
SwitchReport0x30 report0x30;
};
inline void packStickData(SwitchStickData *stick, uint16_t x, uint16_t y) {
*stick = (SwitchStickData){
static_cast<uint8_t>(x & 0xff),
static_cast<uint8_t>((x >> 8) | ((y & 0xff) << 4)),
static_cast<uint8_t>((y >> 4) & 0xff)
};
}
class SwitchProController : public BluetoothController {
public:
static constexpr const HardwareID hardwareIds[] = {
{0x057e, 0x2009} // Official Switch Pro Controller
};
SwitchProController(const BluetoothAddress *address) : BluetoothController(ControllerType_SwitchPro, address) {};
};
class JoyconController : public BluetoothController {
public:
static constexpr const HardwareID hardwareIds[] = {
{0x057e, 0x2006}, // Official Joycon(L) Controller
{0x057e, 0x2007}, // Official Joycon(R) Controller
};
JoyconController(const BluetoothAddress *address) : BluetoothController(ControllerType_Joycon, address) {};
};
}