v1.0.0
This commit is contained in:
66
.gitignore
vendored
Normal file
66
.gitignore
vendored
Normal file
@@ -0,0 +1,66 @@
|
||||
### https://raw.github.com/github/gitignore/18654b47c86bef38add5cd091ec2dac7d6e6e37b/C++.gitignore
|
||||
|
||||
# Prerequisites
|
||||
*.d
|
||||
|
||||
# Compiled Object files
|
||||
*.slo
|
||||
*.lo
|
||||
*.o
|
||||
*.obj
|
||||
|
||||
# Precompiled Headers
|
||||
*.gch
|
||||
*.pch
|
||||
|
||||
# Compiled Dynamic libraries
|
||||
*.so
|
||||
*.dylib
|
||||
*.dll
|
||||
|
||||
# Fortran module files
|
||||
*.mod
|
||||
*.smod
|
||||
|
||||
# Compiled Static libraries
|
||||
*.lai
|
||||
*.la
|
||||
*.a
|
||||
*.lib
|
||||
|
||||
# Executables
|
||||
*.exe
|
||||
*.out
|
||||
*.app
|
||||
|
||||
|
||||
### https://raw.github.com/github/gitignore/18654b47c86bef38add5cd091ec2dac7d6e6e37b/Global/macOS.gitignore
|
||||
|
||||
# General
|
||||
.DS_Store
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
|
||||
# Icon must end with two \r
|
||||
Icon
|
||||
|
||||
|
||||
# Thumbnails
|
||||
._*
|
||||
|
||||
# Files that might appear in the root of a volume
|
||||
.DocumentRevisions-V100
|
||||
.fseventsd
|
||||
.Spotlight-V100
|
||||
.TemporaryItems
|
||||
.Trashes
|
||||
.VolumeIcon.icns
|
||||
.com.apple.timemachine.donotpresent
|
||||
|
||||
# Directories potentially created on remote AFP share
|
||||
.AppleDB
|
||||
.AppleDesktop
|
||||
Network Trash Folder
|
||||
Temporary Items
|
||||
.apdisk
|
||||
|
||||
9
library.properties
Executable file
9
library.properties
Executable file
@@ -0,0 +1,9 @@
|
||||
name=SwitchControlLibrary
|
||||
version=1.0.0
|
||||
author=celclow
|
||||
maintainer=celclow
|
||||
sentence=
|
||||
paragraph=
|
||||
category=Device Control
|
||||
url=https://wearysite.wordpress.com/
|
||||
architectures=*
|
||||
21
src/CustomHID.cpp
Normal file
21
src/CustomHID.cpp
Normal file
@@ -0,0 +1,21 @@
|
||||
#include "CustomHID.h"
|
||||
|
||||
#if defined(USBCON)
|
||||
|
||||
CustomHID_::CustomHID_()
|
||||
{
|
||||
}
|
||||
|
||||
int CustomHID_::SendReport(const void *data, int len)
|
||||
{
|
||||
auto ret = USB_Send(pluggedEndpoint | TRANSFER_RELEASE, data, len);
|
||||
return ret;
|
||||
}
|
||||
|
||||
CustomHID_ &CustomHID()
|
||||
{
|
||||
static CustomHID_ obj;
|
||||
return obj;
|
||||
}
|
||||
|
||||
#endif /* if defined(USBCON) */
|
||||
14
src/CustomHID.h
Normal file
14
src/CustomHID.h
Normal file
@@ -0,0 +1,14 @@
|
||||
#include <HID.h>
|
||||
|
||||
#if defined(USBCON)
|
||||
|
||||
class CustomHID_ : public HID_
|
||||
{
|
||||
public:
|
||||
CustomHID_();
|
||||
int SendReport(const void *data, int len);
|
||||
};
|
||||
|
||||
CustomHID_ &CustomHID();
|
||||
|
||||
#endif /* if defined(USBCON) */
|
||||
261
src/SwitchControlLibrary.cpp
Executable file
261
src/SwitchControlLibrary.cpp
Executable file
@@ -0,0 +1,261 @@
|
||||
#include "SwitchControlLibrary.h"
|
||||
|
||||
#if defined(_USING_HID)
|
||||
|
||||
static const uint8_t _hidReportDescriptor[] PROGMEM = {
|
||||
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
|
||||
0x09, 0x05, // USAGE (Game Pad)
|
||||
0xa1, 0x01, // COLLECTION (Application)
|
||||
0x15, 0x00, // LOGICAL_MINIMUM (0)
|
||||
0x25, 0x01, // LOGICAL_MAXIMUM (1)
|
||||
0x35, 0x00, // PHYSICAL_MINIMUM (0)
|
||||
0x45, 0x01, // PHYSICAL_MAXIMUM (1)
|
||||
0x75, 0x01, // REPORT_SIZE (1)
|
||||
0x95, 0x10, // REPORT_COUNT (16)
|
||||
0x05, 0x09, // USAGE_PAGE (Button)
|
||||
0x19, 0x01, // USAGE_MINIMUM (1)
|
||||
0x29, 0x10, // USAGE_MAXIMUM (16)
|
||||
0x81, 0x02, // INPUT (Data,Var,Abs)
|
||||
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
|
||||
0x25, 0x07, // LOGICAL_MAXIMUM (7)
|
||||
0x46, 0x3b, 0x01, // PHYSICAL_MAXIMUM (315)
|
||||
0x75, 0x04, // REPORT_SIZE (4)
|
||||
0x95, 0x01, // REPORT_COUNT (1)
|
||||
0x65, 0x14, // UNIT (20)
|
||||
0x09, 0x39, // USAGE (Hat Switch)
|
||||
0x81, 0x42, // INPUT (Data,Var,Abs)
|
||||
0x65, 0x00, // UNIT (0)
|
||||
0x95, 0x01, // REPORT_COUNT (1)
|
||||
0x81, 0x01, // INPUT (Cnst,Arr,Abs)
|
||||
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
|
||||
0x46, 0xff, 0x00, // PHYSICAL_MAXIMUM (255)
|
||||
0x09, 0x30, // USAGE (X)
|
||||
0x09, 0x31, // USAGE (Y)
|
||||
0x09, 0x32, // USAGE (Z)
|
||||
0x09, 0x35, // USAGE (Rz)
|
||||
0x75, 0x08, // REPORT_SIZE (8)
|
||||
0x95, 0x04, // REPORT_COUNT (4)
|
||||
0x81, 0x02, // INPUT (Data,Var,Abs)
|
||||
0x06, 0x00, 0xff, // USAGE_PAGE (Vendor Defined 65280)
|
||||
0x09, 0x20, // USAGE (32)
|
||||
0x95, 0x01, // REPORT_COUNT (1)
|
||||
0x81, 0x02, // INPUT (Data,Var,Abs)
|
||||
0x0a, 0x21, 0x26, // USAGE (9761)
|
||||
0x95, 0x08, // REPORT_COUNT (8)
|
||||
0x91, 0x02, // OUTPUT (Data,Var,Abs)
|
||||
0xc0 // END_COLLECTION
|
||||
};
|
||||
|
||||
SwitchControlLibrary_::SwitchControlLibrary_()
|
||||
{
|
||||
static HIDSubDescriptor node(_hidReportDescriptor, sizeof(_hidReportDescriptor));
|
||||
CustomHID().AppendDescriptor(&node);
|
||||
|
||||
memset(&_joystickInputData, 0, sizeof(USB_JoystickReport_Input_t));
|
||||
_joystickInputData.LX = (uint8_t)Stick::CENTER;
|
||||
_joystickInputData.LY = (uint16_t)Stick::CENTER;
|
||||
_joystickInputData.RX = (uint16_t)Stick::CENTER;
|
||||
_joystickInputData.RY = (uint16_t)Stick::CENTER;
|
||||
_joystickInputData.Hat = (uint16_t)Hat::CENTER;
|
||||
}
|
||||
|
||||
void SwitchControlLibrary_::SendReport()
|
||||
{
|
||||
CustomHID().SendReport(&_joystickInputData, sizeof(USB_JoystickReport_Input_t));
|
||||
}
|
||||
|
||||
void SwitchControlLibrary_::PressButtonY()
|
||||
{
|
||||
_joystickInputData.Button |= (uint16_t)Button::Y;
|
||||
SendReport();
|
||||
}
|
||||
|
||||
void SwitchControlLibrary_::ReleaseButtonY()
|
||||
{
|
||||
_joystickInputData.Button &= ((uint16_t)Button::Y ^ 0xffff);
|
||||
SendReport();
|
||||
}
|
||||
|
||||
void SwitchControlLibrary_::PressButtonB()
|
||||
{
|
||||
_joystickInputData.Button |= (uint16_t)Button::B;
|
||||
SendReport();
|
||||
}
|
||||
|
||||
void SwitchControlLibrary_::ReleaseButtonB()
|
||||
{
|
||||
_joystickInputData.Button &= ((uint16_t)Button::B ^ 0xffff);
|
||||
SendReport();
|
||||
}
|
||||
|
||||
void SwitchControlLibrary_::PressButtonA()
|
||||
{
|
||||
_joystickInputData.Button |= (uint16_t)Button::A;
|
||||
SendReport();
|
||||
}
|
||||
|
||||
void SwitchControlLibrary_::ReleaseButtonA()
|
||||
{
|
||||
_joystickInputData.Button &= ((uint16_t)Button::A ^ 0xffff);
|
||||
SendReport();
|
||||
}
|
||||
|
||||
void SwitchControlLibrary_::PressButtonX()
|
||||
{
|
||||
_joystickInputData.Button |= (uint16_t)Button::X;
|
||||
SendReport();
|
||||
}
|
||||
|
||||
void SwitchControlLibrary_::ReleaseButtonX()
|
||||
{
|
||||
_joystickInputData.Button &= ((uint16_t)Button::X ^ 0xffff);
|
||||
SendReport();
|
||||
}
|
||||
|
||||
void SwitchControlLibrary_::PressButtonL()
|
||||
{
|
||||
_joystickInputData.Button |= (uint16_t)Button::L;
|
||||
SendReport();
|
||||
}
|
||||
|
||||
void SwitchControlLibrary_::ReleaseButtonL()
|
||||
{
|
||||
_joystickInputData.Button &= ((uint16_t)Button::L ^ 0xffff);
|
||||
SendReport();
|
||||
}
|
||||
|
||||
void SwitchControlLibrary_::PressButtonR()
|
||||
{
|
||||
_joystickInputData.Button |= (uint16_t)Button::R;
|
||||
SendReport();
|
||||
}
|
||||
|
||||
void SwitchControlLibrary_::ReleaseButtonR()
|
||||
{
|
||||
_joystickInputData.Button &= ((uint16_t)Button::R ^ 0xffff);
|
||||
SendReport();
|
||||
}
|
||||
|
||||
void SwitchControlLibrary_::PressButtonZL()
|
||||
{
|
||||
_joystickInputData.Button |= (uint16_t)Button::ZL;
|
||||
SendReport();
|
||||
}
|
||||
|
||||
void SwitchControlLibrary_::ReleaseButtonZL()
|
||||
{
|
||||
_joystickInputData.Button &= ((uint16_t)Button::ZL ^ 0xffff);
|
||||
SendReport();
|
||||
}
|
||||
|
||||
void SwitchControlLibrary_::PressButtonZR()
|
||||
{
|
||||
_joystickInputData.Button |= (uint16_t)Button::ZR;
|
||||
SendReport();
|
||||
}
|
||||
|
||||
void SwitchControlLibrary_::ReleaseButtonZR()
|
||||
{
|
||||
_joystickInputData.Button &= ((uint16_t)Button::ZR ^ 0xffff);
|
||||
SendReport();
|
||||
}
|
||||
|
||||
void SwitchControlLibrary_::PressButtonMinus()
|
||||
{
|
||||
_joystickInputData.Button |= (uint16_t)Button::MINUS;
|
||||
SendReport();
|
||||
}
|
||||
|
||||
void SwitchControlLibrary_::ReleaseButtonMinus()
|
||||
{
|
||||
_joystickInputData.Button &= ((uint16_t)Button::MINUS ^ 0xffff);
|
||||
SendReport();
|
||||
}
|
||||
|
||||
void SwitchControlLibrary_::PressButtonPlus()
|
||||
{
|
||||
_joystickInputData.Button |= (uint16_t)Button::PLUS;
|
||||
SendReport();
|
||||
}
|
||||
|
||||
void SwitchControlLibrary_::ReleaseButtonPlus()
|
||||
{
|
||||
_joystickInputData.Button &= ((uint16_t)Button::PLUS ^ 0xffff);
|
||||
SendReport();
|
||||
}
|
||||
|
||||
void SwitchControlLibrary_::PressButtonLClick()
|
||||
{
|
||||
_joystickInputData.Button |= (uint16_t)Button::LCLICK;
|
||||
SendReport();
|
||||
}
|
||||
|
||||
void SwitchControlLibrary_::ReleaseButtonLClick()
|
||||
{
|
||||
_joystickInputData.Button &= ((uint16_t)Button::LCLICK ^ 0xffff);
|
||||
SendReport();
|
||||
}
|
||||
|
||||
void SwitchControlLibrary_::PressButtonRClick()
|
||||
{
|
||||
_joystickInputData.Button |= (uint16_t)Button::RCLICK;
|
||||
SendReport();
|
||||
}
|
||||
|
||||
void SwitchControlLibrary_::ReleaseButtonRClick()
|
||||
{
|
||||
_joystickInputData.Button &= ((uint16_t)Button::RCLICK ^ 0xffff);
|
||||
SendReport();
|
||||
}
|
||||
|
||||
void SwitchControlLibrary_::PressButtonHome()
|
||||
{
|
||||
_joystickInputData.Button |= (uint16_t)Button::HOME;
|
||||
SendReport();
|
||||
}
|
||||
|
||||
void SwitchControlLibrary_::ReleaseButtonHome()
|
||||
{
|
||||
_joystickInputData.Button &= ((uint16_t)Button::HOME ^ 0xffff);
|
||||
SendReport();
|
||||
}
|
||||
|
||||
void SwitchControlLibrary_::PressButtonCapture()
|
||||
{
|
||||
_joystickInputData.Button |= (uint16_t)Button::CAPTURE;
|
||||
SendReport();
|
||||
}
|
||||
|
||||
void SwitchControlLibrary_::ReleaseButtonCapture()
|
||||
{
|
||||
_joystickInputData.Button &= ((uint16_t)Button::CAPTURE ^ 0xffff);
|
||||
SendReport();
|
||||
}
|
||||
|
||||
void SwitchControlLibrary_::MoveHat(uint8_t hat)
|
||||
{
|
||||
_joystickInputData.Hat = hat;
|
||||
SendReport();
|
||||
}
|
||||
|
||||
void SwitchControlLibrary_::MoveLeftStick(uint8_t lx, uint8_t ly)
|
||||
{
|
||||
_joystickInputData.LX = lx;
|
||||
_joystickInputData.LY = ly;
|
||||
SendReport();
|
||||
}
|
||||
|
||||
void SwitchControlLibrary_::MoveRightStick(uint8_t rx, uint8_t ry)
|
||||
{
|
||||
_joystickInputData.RX = rx;
|
||||
_joystickInputData.RY = ry;
|
||||
SendReport();
|
||||
}
|
||||
|
||||
SwitchControlLibrary_ &SwitchControlLibrary()
|
||||
{
|
||||
static SwitchControlLibrary_ obj;
|
||||
return obj;
|
||||
}
|
||||
|
||||
#endif
|
||||
97
src/SwitchControlLibrary.h
Executable file
97
src/SwitchControlLibrary.h
Executable file
@@ -0,0 +1,97 @@
|
||||
#include <ArduinoSTL.h>
|
||||
#include <list>
|
||||
|
||||
#include "CustomHID.h"
|
||||
|
||||
enum class Button : uint16_t
|
||||
{
|
||||
Y = 0x0001,
|
||||
B = 0x0002,
|
||||
A = 0x0004,
|
||||
X = 0x0008,
|
||||
L = 0x0010,
|
||||
R = 0x0020,
|
||||
ZL = 0x0040,
|
||||
ZR = 0x0080,
|
||||
MINUS = 0x0100,
|
||||
PLUS = 0x0200,
|
||||
LCLICK = 0x0400,
|
||||
RCLICK = 0x0800,
|
||||
HOME = 0x1000,
|
||||
CAPTURE = 0x2000
|
||||
};
|
||||
|
||||
enum class Hat : uint8_t
|
||||
{
|
||||
TOP = 0x00,
|
||||
TOP_RIGHT = 0x01,
|
||||
RIGHT = 0x02,
|
||||
BOTTOM_RIGHT = 0x03,
|
||||
BOTTOM = 0x04,
|
||||
BOTTOM_LEFT = 0x05,
|
||||
LEFT = 0x06,
|
||||
TOP_LEFT = 0x07,
|
||||
CENTER = 0x08
|
||||
};
|
||||
|
||||
enum class Stick : uint8_t
|
||||
{
|
||||
MIN = 0,
|
||||
CENTER = 128,
|
||||
MAX = 255
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint16_t Button;
|
||||
uint8_t Hat;
|
||||
uint8_t LX;
|
||||
uint8_t LY;
|
||||
uint8_t RX;
|
||||
uint8_t RY;
|
||||
uint8_t VendorSpec;
|
||||
} USB_JoystickReport_Input_t;
|
||||
|
||||
class SwitchControlLibrary_
|
||||
{
|
||||
private:
|
||||
USB_JoystickReport_Input_t _joystickInputData;
|
||||
void SendReport();
|
||||
|
||||
public:
|
||||
SwitchControlLibrary_();
|
||||
|
||||
void PressButtonY();
|
||||
void ReleaseButtonY();
|
||||
void PressButtonB();
|
||||
void ReleaseButtonB();
|
||||
void PressButtonA();
|
||||
void ReleaseButtonA();
|
||||
void PressButtonX();
|
||||
void ReleaseButtonX();
|
||||
void PressButtonL();
|
||||
void ReleaseButtonL();
|
||||
void PressButtonR();
|
||||
void ReleaseButtonR();
|
||||
void PressButtonZL();
|
||||
void ReleaseButtonZL();
|
||||
void PressButtonZR();
|
||||
void ReleaseButtonZR();
|
||||
void PressButtonMinus();
|
||||
void ReleaseButtonMinus();
|
||||
void PressButtonPlus();
|
||||
void ReleaseButtonPlus();
|
||||
void PressButtonLClick();
|
||||
void ReleaseButtonLClick();
|
||||
void PressButtonRClick();
|
||||
void ReleaseButtonRClick();
|
||||
void PressButtonHome();
|
||||
void ReleaseButtonHome();
|
||||
void PressButtonCapture();
|
||||
void ReleaseButtonCapture();
|
||||
void MoveHat(uint8_t hat);
|
||||
void MoveLeftStick(uint8_t lx, uint8_t ly);
|
||||
void MoveRightStick(uint8_t rx, uint8_t ry);
|
||||
};
|
||||
|
||||
SwitchControlLibrary_ &SwitchControlLibrary();
|
||||
28
src/examples/connect_switch/connect_switch.ino
Executable file
28
src/examples/connect_switch/connect_switch.ino
Executable file
@@ -0,0 +1,28 @@
|
||||
#include <SwitchControlLibrary.h>
|
||||
|
||||
void setup()
|
||||
{
|
||||
}
|
||||
|
||||
int loopCount = 0;
|
||||
void loop()
|
||||
{
|
||||
if (100 < loopCount)
|
||||
loopCount = 0;
|
||||
|
||||
if (loopCount == 50)
|
||||
{
|
||||
SwitchControlLibrary().PressButtonL();
|
||||
SwitchControlLibrary().PressButtonR();
|
||||
SwitchControlLibrary().ReleaseButtonL();
|
||||
SwitchControlLibrary().ReleaseButtonR();
|
||||
}
|
||||
|
||||
if (loopCount == 100)
|
||||
{
|
||||
SwitchControlLibrary().PressButtonA();
|
||||
SwitchControlLibrary().ReleaseButtonA();
|
||||
}
|
||||
|
||||
loopCount++;
|
||||
}
|
||||
Reference in New Issue
Block a user