#include <LiquidCrystal_I2C.h>
#include <EasyHID.h>
//POWER
#define POWER_PIN 3
//LEFT JOYSTICK
#define RJ_V_PIN A2
#define RJ_H_PIN A3
#define RJ_C_PIN 0
//RIGHT JOYSTICK
#define LJ_V_PIN A0
#define LJ_H_PIN A1
#define LJ_C_PIN 1
//LEFT CROSS
#define LEFT_PIN 22
#define UP_PIN 24
#define RIGHT_PIN 26
#define DOWN_PIN 28
//RIGHT CROSS
#define X_PIN 23
#define Y_PIN 25
#define B_PIN 27
#define A_PIN 29
//TRIGERS
#define LT_PIN 13
#define RT_PIN 8
//BUMBERS
#define LB_PIN 12
#define RB_PIN 9
//MIDDLE BUTTONS
#define ML_PIN 11
#define MR_PIN 10
//LED
#define LED_R_PIN 6
#define LED_G_PIN 7
#define LED_B_PIN 30
struct joystick{
int x = 0;
int y = 0;
bool press = false;
};
//VARIABLES TO STORE STATES
joystick RJS = joystick();
joystick LJS = joystick();
bool LEFT;
bool UP;
bool RIGHT;
bool DOWN;
bool X;
bool Y;
bool B;
bool A;
bool LT;
bool LB;
bool RT;
bool RB;
bool ML;
bool MR;
const int mouseSensetivity = 10
int timer = millis();
const int maxBlockTime = 15;
int horMovBlockTimer = millis();
int vertMovBlockTimer = millis();
int horDutyCycleTimer = millis();
int vertDutyCycleTimer = millis();
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
setPins();
HID.begin();
digitalWrite(LED_BUILTIN, LOW); //DISABLE "L" LED ON CHIP
setLED(87, 245, 66);
}
void loop() {
HID.tick();
timer = millis();
if(digitalRead(POWER_PIN) == HIGH){
setLED(0, 0, 0);
goto BREAK;
}
setLED(87, 245, 66);
updateStates();
react();
BREAK;
}
void setLED(int r, int g, int b){
analogWrite(LED_R_PIN, r);
analogWrite(LED_G_PIN, g);
analogWrite(LED_B_PIN, b);
}
void updateStates(){
RJS.x = 1024 - analogRead(RJ_H_PIN) - 512;
RJS.y = 1024 - analogRead(RJ_V_PIN) - 512;
RJS.press = digitalRead(RJ_C_PIN) == LOW;
LJS.x = 1024 - analogRead(LJ_H_PIN) - 512;
LJS.y = 1024 - analogRead(LJ_V_PIN) - 512;
LJS.press = digitalRead(RJ_C_PIN) == LOW ? !LJS.press : LJS.press;
LEFT = digitalRead(LEFT_PIN) == LOW;
UP = digitalRead(UP_PIN) == LOW;
RIGHT = digitalRead(RIGHT_PIN) == LOW;
DOWN = digitalRead(DOWN_PIN) == LOW;
X = digitalRead(X_PIN) == LOW;
Y = digitalRead(Y_PIN) == LOW;
B = digitalRead(B_PIN) == LOW;
A = digitalRead(A_PIN) == LOW;
LT = digitalRead(LT_PIN) == LOW;
LB = digitalRead(LB_PIN) == LOW;
RT = digitalRead(RT_PIN) == LOW;
RB = digitalRead(RB_PIN) == LOW;
ML = digitalRead(ML_PIN) == LOW;
MR = digitalRead(MR_PIN) == LOW;
}
void setPins(){
pinMode(POWER_PIN, INPUT_PULLUP);
pinMode(RJ_V_PIN, INPUT);
pinMode(RJ_H_PIN, INPUT);
pinMode(RJ_C_PIN, INPUT_PULLUP);
pinMode(LJ_V_PIN, INPUT);
pinMode(LJ_H_PIN, INPUT);
pinMode(LJ_C_PIN, INPUT_PULLUP);
pinMode(LEFT_PIN, INPUT_PULLUP);
pinMode(UP_PIN, INPUT_PULLUP);
pinMode(RIGHT_PIN, INPUT_PULLUP);
pinMode(DOWN_PIN, INPUT_PULLUP);
pinMode(X_PIN, INPUT_PULLUP);
pinMode(Y_PIN, INPUT_PULLUP);
pinMode(B_PIN, INPUT_PULLUP);
pinMode(A_PIN, INPUT_PULLUP);
pinMode(LT_PIN, INPUT_PULLUP);
pinMode(LB_PIN, INPUT_PULLUP);
pinMode(RT_PIN, INPUT_PULLUP);
pinMode(RB_PIN, INPUT_PULLUP);
pinMode(ML_PIN, INPUT_PULLUP);
pinMode(MR_PIN, INPUT_PULLUP);
pinMode(LED_R_PIN, OUTPUT);
pinMode(LED_G_PIN, OUTPUT);
pinMode(LED_B_PIN, OUTPUT);
pinMode(LED_BUILTIN, OUTPUT);
pinMode(2, INPUT);
pinMode(4, INPUT);
pinMode(5, OUTPUT);
}
int sign(int num){
if(num < 0) return -1;
if(num > 0) return 1;
return 0;
}
void react(){
//Key presses
if(RT) Mouse.click(MOUSE_LEFT);
if(LT) Mouse.press(MOUSE_RIGHT); else Mouse.releaseAll();
if(LB) Keyboard.press(KEY_C); else Keyboard.release(KEY_C);
if(RB) Keyboard.press(KEY_F); else Keyboard.release(KEY_F);
if(ML) Keyboard.press(KEY_M); else Keyboard.release(KEY_M);
if(MR) Keyboard.press(KEY_ESC); else Keyboard.release(KEY_ESC);
if(LEFT) Keyboard.press(KEY_TAB); else Keyboard.release(KEY_TAB);
if(RIGHT) Keyboard.press(KEY_G); else Keyboard.release(KEY_G);
if(DOWN) Keyboard.press(KEY_Z); else Keyboard.release(KEY_Z);
if(UP) Keyboard.press(KEY_CTRL); else Keyboard.release(KEY_CTRL);
if(X) Keyboard.press(KEY_R); else Keyboard.release(KEY_R);
if(Y) Keyboard.press(KEY_E); else Keyboard.release(KEY_E);
if(A) Keyboard.press(KEY_SPACE); else Keyboard.release(KEY_SPACE);
if(B) Keyboard.press(KEY_Q); else Keyboard.release(KEY_Q);
if(RJS.press) Keyboard.press(KEY_V); else Keyboard.release(KEY_V);
if(LJS.press) Keyboard.press(KEY_SHIFT); else Keyboard.release(KEY_SHIFT);
//Mouse movement
Mouse.move(map(RJS.x, -512, 512, -mouseSensetivity, mouseSensetivity), map(RJS.y, -512, 512, -mouseSensetivity, mouseSensetivity))
//Horizontal movement
if(millis() >= horDutyCycleTimer){
Keyboard.release(KEY_A)
Keyboard.release(KEY_D)
}
if(millis() >= horMovBlockTimer && LJS.x != 0){
if(LJS.x > 0){
Keyboard.press(KEY_D)
} else{
Keyboard.press(KEY_A)
}
int dutyCycle = map(LJS.x, 0, 512 * sign(LJS.x), 0, maxBlockTime)
horDutyCycleTimer = millis() + dutyCycle;
horMovBlockTimer = millis() + maxBlockTime;
}
//Vertical movement
if(millis() >= vertDutyCycleTimer){
Keyboard.release(KEY_W)
Keyboard.release(KEY_S)
}
if(millis() >= vertMovBlockTimer && LJS.y != 0){
if(LJS.y > 0){
Keyboard.press(KEY_W)
} else{
Keyboard.press(KEY_S)
}
int dutyCycle = map(LJS.y, 0, 512 * sign(LJS.y), 0, maxBlockTime)
vertDutyCycleTimer = millis() + dutyCycle;
vertMovBlockTimer = millis() + maxBlockTime;
}
}