tyrav2 init

This commit is contained in:
h4570
2022-07-17 10:21:35 +02:00
parent 44c1ee4fe8
commit c8b22ff331
249 changed files with 18187 additions and 0 deletions
+229
View File
@@ -0,0 +1,229 @@
/*
# ______ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2020-2022, tyra - https://github.com/h4570/tyrav2
# Licenced under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
# Sandro Wellinator <wellcoj@gmail.com>
*/
#include <tamtypes.h>
#include <loadfile.h>
#include <sifrpc.h>
#include <stdio.h>
#include <string.h>
#include "debug/debug.hpp"
#include "pad/pad.hpp"
namespace Tyra {
/** Init vars, load modules, opens pad port and initializes pad */
Pad::Pad() {}
Pad::~Pad() {}
// ----
// Methods
// ----
void Pad::init() {
this->oldPad = 0;
padInit(0);
this->port = 0; // 0 -> Connector 1, 1 -> Connector 2
this->slot = 0; // Always zero if not using multitap
this->ret = padPortOpen(this->port, this->slot, padBuf);
TYRA_ASSERT(this->ret != 0,
"padPortOpen failed! padPortOpen returned: ", this->ret);
TYRA_ASSERT(this->initPad(), "initPad failed!");
}
/** Wait when pad will be ready (stable and ready) */
int Pad::waitPadReady() {
int state;
int lastState;
char* stateString = new char[16];
state = padGetState(this->port, this->slot);
lastState = -1;
while ((state != PAD_STATE_STABLE) && (state != PAD_STATE_FINDCTP1)) {
if (state != lastState) {
padStateInt2String(state, stateString);
TYRA_LOG("Pad state changed");
printf("Curent pad(%d,%d) status: %s\n", this->port, this->slot,
stateString);
}
lastState = state;
state = padGetState(this->port, this->slot);
}
// Were the pad ever 'out of sync'?
if (lastState != -1) TYRA_LOG("Pad is ready!");
delete[] stateString;
return 0;
}
/** Initializes and checks type of pad */
int Pad::initPad() {
TYRA_LOG("Initializing pad");
this->waitPadReady();
int modes = padInfoMode(this->port, this->slot, PAD_MODETABLE, -1);
TYRA_ASSERT(modes, "Connected device is not a dual shock controller!");
// Verify that the controller has a DUAL SHOCK mode
int i = 0;
do {
if (padInfoMode(this->port, this->slot, PAD_MODETABLE, i) ==
PAD_TYPE_DUALSHOCK)
break;
i++;
} while (i < modes);
TYRA_ASSERT(i < modes, "Connected device is not a dual shock controller!");
// If ExId != 0x0 => This controller has actuator engines
// This check should always pass if the Dual Shock test above passed
this->ret = padInfoMode(this->port, this->slot, PAD_MODECUREXID, 0);
TYRA_ASSERT(this->ret, "Connected device is not a dual shock controller!");
TYRA_LOG("Enabling dual shock functions.");
// When using MMODE_LOCK, user cant change mode with Select button
padSetMainMode(this->port, this->slot, PAD_MMODE_DUALSHOCK, PAD_MMODE_LOCK);
this->waitPadReady();
TYRA_LOG("Pad has pressure sensitive buttons? ",
padInfoPressMode(this->port, this->slot));
this->waitPadReady();
padEnterPressMode(this->port, this->slot); // Set pressure sensitive mode
this->waitPadReady();
this->actuators = padInfoAct(this->port, this->slot, -1, 0);
TYRA_LOG("# of actuators: ", this->actuators);
if (actuators != 0) {
this->actAlign[0] = 0; // Enable small engine
this->actAlign[1] = 1; // Enable big engine
this->actAlign[2] = 0xff;
this->actAlign[3] = 0xff;
this->actAlign[4] = 0xff;
this->actAlign[5] = 0xff;
this->waitPadReady();
TYRA_LOG("padSetActAlign: ",
padSetActAlign(this->port, this->slot, actAlign));
} else
TYRA_LOG("Did not find any actuators.");
this->waitPadReady();
TYRA_LOG("Pad initialized!");
return 1;
}
/** Updates state of joys/buttons. Called by engine */
void Pad::update() {
int x = 0;
this->ret = padGetState(this->port, this->slot);
while ((this->ret != PAD_STATE_STABLE) && (this->ret != PAD_STATE_FINDCTP1)) {
if (this->ret == PAD_STATE_DISCONN)
printf("Pad(%d, %d) is disconnected\n", this->port, this->slot);
this->ret = padGetState(this->port, this->slot);
}
if (x == 1) TYRA_LOG("Pad: OK!\n");
this->ret = padRead(this->port, this->slot, &this->buttons);
if (this->ret != 0) {
this->padData = 0xffff ^ this->buttons.btns;
this->newPad = this->padData & ~this->oldPad;
this->oldPad = this->padData;
this->reset();
// Digital buttons
this->rightJoyPad.h = this->buttons.rjoy_h;
this->rightJoyPad.v = this->buttons.rjoy_v;
this->leftJoyPad.h = this->buttons.ljoy_h;
this->leftJoyPad.v = this->buttons.ljoy_v;
this->rightJoyPad.isCentered =
this->buttons.rjoy_h == 127 && this->buttons.rjoy_v == 127;
this->rightJoyPad.isMoved = !this->rightJoyPad.isCentered;
this->leftJoyPad.isCentered =
this->buttons.ljoy_h == 127 && this->buttons.ljoy_v == 127;
this->leftJoyPad.isMoved = !this->leftJoyPad.isCentered;
this->handleClickedButtons();
this->handlePressedButtons();
}
}
/** Update clicked buttons state */
void Pad::handleClickedButtons() {
if (this->newPad & PAD_CROSS) this->clicked.Cross = 1;
if (this->newPad & PAD_SQUARE) this->clicked.Square = 1;
if (this->newPad & PAD_TRIANGLE) this->clicked.Triangle = 1;
if (this->newPad & PAD_CIRCLE) this->clicked.Circle = 1;
if (this->newPad & PAD_UP) this->clicked.DpadUp = 1;
if (this->newPad & PAD_DOWN) this->clicked.DpadDown = 1;
if (this->newPad & PAD_LEFT) this->clicked.DpadLeft = 1;
if (this->newPad & PAD_RIGHT) this->clicked.DpadRight = 1;
if (this->newPad & PAD_L1) this->clicked.L1 = 1;
if (this->newPad & PAD_L2) this->clicked.L2 = 1;
if (this->newPad & PAD_L3) this->clicked.L3 = 1;
if (this->newPad & PAD_R1) this->clicked.R1 = 1;
if (this->newPad & PAD_R2) this->clicked.R2 = 1;
if (this->newPad & PAD_R3) this->clicked.R3 = 1;
if (this->newPad & PAD_START) this->clicked.Start = 1;
if (this->newPad & PAD_SELECT) this->clicked.Select = 1;
}
/** Update pressed buttons state */
void Pad::handlePressedButtons() {
if (this->buttons.cross_p) this->pressed.Cross = 1;
if (this->buttons.square_p) this->pressed.Square = 1;
if (this->buttons.triangle_p) this->pressed.Triangle = 1;
if (this->buttons.circle_p) this->pressed.Circle = 1;
if (this->buttons.up_p) this->pressed.DpadUp = 1;
if (this->buttons.down_p) this->pressed.DpadDown = 1;
if (this->buttons.left_p) this->pressed.DpadLeft = 1;
if (this->buttons.right_p) this->pressed.DpadRight = 1;
if (this->buttons.l1_p) this->pressed.L1 = 1;
if (this->buttons.l2_p) this->pressed.L2 = 1;
if (this->buttons.r1_p) this->pressed.R1 = 1;
if (this->buttons.r2_p) this->pressed.R2 = 1;
}
/** Resets state of joys/buttons */
void Pad::reset() {
this->clicked.Cross = 0;
this->clicked.Square = 0;
this->clicked.Triangle = 0;
this->clicked.Circle = 0;
this->clicked.DpadUp = 0;
this->clicked.DpadDown = 0;
this->clicked.DpadLeft = 0;
this->clicked.DpadRight = 0;
this->clicked.L1 = 0;
this->clicked.L2 = 0;
this->clicked.L3 = 0;
this->clicked.R1 = 0;
this->clicked.R2 = 0;
this->clicked.R3 = 0;
this->clicked.Start = 0;
this->clicked.Select = 0;
this->pressed.Cross = 0;
this->pressed.Square = 0;
this->pressed.Triangle = 0;
this->pressed.Circle = 0;
this->pressed.DpadUp = 0;
this->pressed.DpadDown = 0;
this->pressed.DpadLeft = 0;
this->pressed.DpadRight = 0;
this->pressed.L1 = 0;
this->pressed.L2 = 0;
this->pressed.R1 = 0;
this->pressed.R2 = 0;
}
} // Namespace Tyra