diff --git a/include/addons/i2cdisplay.h b/include/addons/i2cdisplay.h index 54ed9f82..9fc79f9f 100644 --- a/include/addons/i2cdisplay.h +++ b/include/addons/i2cdisplay.h @@ -89,6 +89,8 @@ class I2CDisplayAddon : public GPAddon void drawSplashScreen(int splashMode, int splashSpeed); void drawDancepadA(int startX, int startY, int buttonSize, int buttonPadding); void drawDancepadB(int startX, int startY, int buttonSize, int buttonPadding); + void drawTwinStickA(int startX, int startY, int buttonSize, int buttonPadding); + void drawTwinStickB(int startX, int startY, int buttonSize, int buttonPadding); uint8_t ucBackBuffer[1024]; OBDISP obd; std::string statusBar; diff --git a/include/enums.h b/include/enums.h index cb47d6aa..bb2a91eb 100644 --- a/include/enums.h +++ b/include/enums.h @@ -10,6 +10,7 @@ typedef enum BUTTON_LAYOUT_KEYBOARD_ANGLED, BUTTON_LAYOUT_KEYBOARDA, BUTTON_LAYOUT_DANCEPADA, + BUTTON_LAYOUT_TWINSTICKA, } ButtonLayout; typedef enum @@ -25,6 +26,7 @@ typedef enum BUTTON_LAYOUT_NOIR8, BUTTON_LAYOUT_KEYBOARDB, BUTTON_LAYOUT_DANCEPADB, + BUTTON_LAYOUT_TWINSTICKB, } ButtonLayoutRight; typedef enum diff --git a/src/addons/i2cdisplay.cpp b/src/addons/i2cdisplay.cpp index ec95c844..6af4a9ee 100644 --- a/src/addons/i2cdisplay.cpp +++ b/src/addons/i2cdisplay.cpp @@ -75,6 +75,9 @@ void I2CDisplayAddon::process() { case BUTTON_LAYOUT_DANCEPADA: drawDancepadA(39, 12, 15, 2); break; + case BUTTON_LAYOUT_TWINSTICKA: + drawTwinStickA(8, 28, 8, 2); + break; } switch (BUTTON_LAYOUT_RIGHT) @@ -112,6 +115,9 @@ void I2CDisplayAddon::process() { case BUTTON_LAYOUT_DANCEPADB: drawDancepadB(39, 12, 15, 2); break; + case BUTTON_LAYOUT_TWINSTICKB: + drawTwinStickB(100, 28, 8, 2); + break; } } @@ -203,6 +209,70 @@ void I2CDisplayAddon::drawArcadeStick(int startX, int startY, int buttonRadius, } } +void I2CDisplayAddon::drawTwinStickA(int startX, int startY, int buttonRadius, int buttonPadding) +{ + const int buttonMargin = buttonPadding + (buttonRadius * 2); + + // Stick + obdPreciseEllipse(&obd, startX + (buttonMargin / 2), startY + (buttonMargin / 2), buttonRadius * 1.25, buttonRadius * 1.25, 1, 0); + + if (pGamepad->pressedUp()) { + if (pGamepad->pressedLeft()) { + obdPreciseEllipse(&obd, startX + (buttonMargin / 5), startY + (buttonMargin / 5), buttonRadius, buttonRadius, 1, 1); + } else if (pGamepad->pressedRight()) { + obdPreciseEllipse(&obd, startX + (buttonMargin * 0.875), startY + (buttonMargin / 5), buttonRadius, buttonRadius, 1, 1); + } else { + obdPreciseEllipse(&obd, startX + (buttonMargin / 2), startY, buttonRadius, buttonRadius, 1, 1); + } + } else if (pGamepad->pressedDown()) { + if (pGamepad->pressedLeft()) { + obdPreciseEllipse(&obd, startX + (buttonMargin / 5), startY + (buttonMargin * 0.875), buttonRadius, buttonRadius, 1, 1); + } else if (pGamepad->pressedRight()) { + obdPreciseEllipse(&obd, startX + (buttonMargin * 0.875), startY + (buttonMargin * 0.875), buttonRadius, buttonRadius, 1, 1); + } else { + obdPreciseEllipse(&obd, startX + buttonMargin / 2, startY + buttonMargin, buttonRadius, buttonRadius, 1, 1); + } + } else if (pGamepad->pressedLeft()) { + obdPreciseEllipse(&obd, startX, startY + buttonMargin / 2, buttonRadius, buttonRadius, 1, 1); + } else if (pGamepad->pressedRight()) { + obdPreciseEllipse(&obd, startX + buttonMargin, startY + buttonMargin / 2, buttonRadius, buttonRadius, 1, 1); + } else { + obdPreciseEllipse(&obd, startX + buttonMargin / 2, startY + buttonMargin / 2, buttonRadius, buttonRadius, 1, 1); + } +} + +void I2CDisplayAddon::drawTwinStickB(int startX, int startY, int buttonRadius, int buttonPadding) +{ + const int buttonMargin = buttonPadding + (buttonRadius * 2); + + // Stick + obdPreciseEllipse(&obd, startX + (buttonMargin / 2), startY + (buttonMargin / 2), buttonRadius * 1.25, buttonRadius * 1.25, 1, 0); + + if (pGamepad->pressedB4()) { + if (pGamepad->pressedB3()) { + obdPreciseEllipse(&obd, startX + (buttonMargin / 5), startY + (buttonMargin / 5), buttonRadius, buttonRadius, 1, 1); + } else if (pGamepad->pressedB2()) { + obdPreciseEllipse(&obd, startX + (buttonMargin * 0.875), startY + (buttonMargin / 5), buttonRadius, buttonRadius, 1, 1); + } else { + obdPreciseEllipse(&obd, startX + (buttonMargin / 2), startY, buttonRadius, buttonRadius, 1, 1); + } + } else if (pGamepad->pressedB1()) { + if (pGamepad->pressedB3()) { + obdPreciseEllipse(&obd, startX + (buttonMargin / 5), startY + (buttonMargin * 0.875), buttonRadius, buttonRadius, 1, 1); + } else if (pGamepad->pressedB2()) { + obdPreciseEllipse(&obd, startX + (buttonMargin * 0.875), startY + (buttonMargin * 0.875), buttonRadius, buttonRadius, 1, 1); + } else { + obdPreciseEllipse(&obd, startX + buttonMargin / 2, startY + buttonMargin, buttonRadius, buttonRadius, 1, 1); + } + } else if (pGamepad->pressedB3()) { + obdPreciseEllipse(&obd, startX, startY + buttonMargin / 2, buttonRadius, buttonRadius, 1, 1); + } else if (pGamepad->pressedB2()) { + obdPreciseEllipse(&obd, startX + buttonMargin, startY + buttonMargin / 2, buttonRadius, buttonRadius, 1, 1); + } else { + obdPreciseEllipse(&obd, startX + buttonMargin / 2, startY + buttonMargin / 2, buttonRadius, buttonRadius, 1, 1); + } +} + void I2CDisplayAddon::drawMAMEA(int startX, int startY, int buttonSize, int buttonPadding) { const int buttonMargin = buttonPadding + buttonSize;