Files
Starship/src/sys/sys_joybus.c
T

150 lines
4.4 KiB
C

#include "sys.h"
OSContPad gControllerHold[4];
OSContPad gControllerPress[4];
u8 gControllerPlugged[4];
u32 gControllerLock;
u8 gControllerRumble[4];
OSContPad sNextController[4]; //
OSContPad sPrevController[4]; //
OSContStatus sControllerStatus[4]; //
OSPfs sControllerMotor[4]; //
void Controller_AddDeadZone(s32 contrNum) {
s32 temp_v0 = gControllerHold[contrNum].stick_x;
s32 temp_a2 = gControllerHold[contrNum].stick_y;
s32 var_a0;
s32 var_v0;
if ((temp_v0 >= -16) && (temp_v0 <= 16)) {
var_a0 = 0;
} else if (temp_v0 > 16) {
var_a0 = temp_v0 - 16;
} else {
var_a0 = temp_v0 + 16;
}
if ((temp_a2 >= -16) && (temp_a2 <= 16)) {
var_v0 = 0;
} else if (temp_a2 > 16) {
var_v0 = temp_a2 - 16;
} else {
var_v0 = temp_a2 + 16;
}
if (var_a0 > 60) {
var_a0 = 60;
}
if (var_a0 < -60) {
var_a0 = -60;
}
if (var_v0 > 60) {
var_v0 = 60;
}
if (var_v0 < -60) {
var_v0 = -60;
}
gControllerPress[contrNum].stick_x = var_a0;
gControllerPress[contrNum].stick_y = var_v0;
}
void Controller_Init(void) {
u8 sp1F;
s32 i;
osContInit(&gSerialEventQueue, &sp1F, sControllerStatus);
for (i = 0; i < 4; i++) {
gControllerPlugged[i] = (sp1F >> i) & 1;
gControllerRumble[i] = 0;
}
}
void Controller_UpdateInput(void) {
s32 i;
for (i = 0; i < 4; i++) {
if (gControllerPlugged[i] == 1 && sNextController[i].err_no == 0) {
sPrevController[i] = gControllerHold[i];
gControllerHold[i] = sNextController[i];
gControllerPress[i].button =
(gControllerHold[i].button ^ sPrevController[i].button) & gControllerHold[i].button;
Controller_AddDeadZone(i);
} else {
gControllerHold[i].button = gControllerHold[i].stick_x = gControllerHold[i].stick_y =
gControllerHold[i].err_no = gControllerPress[i].button = gControllerPress[i].stick_x =
gControllerPress[i].stick_y = gControllerPress[i].err_no = 0;
}
}
}
void Controller_ReadData(void) {
s32 i;
if (gControllerLock != 0) {
gControllerLock--;
for (i = 0; i < 4; i++) {
sNextController[i].button = sNextController[i].stick_x = sNextController[i].stick_y =
sNextController[i].err_no = 0;
}
} else {
osContStartReadData(&gSerialEventQueue);
osRecvMesg(&gSerialEventQueue, NULL, OS_MESG_BLOCK);
osContGetReadData(sNextController);
}
osSendMesg(&gControllerMsgQueue, OS_MESG_32(SI_CONT_READ_DONE), OS_MESG_PRI_NORMAL);
}
void Save_ReadData(void) {
if ((gStartNMI == 0) && (Save_ReadEeprom(&gSaveIOBuffer) == 0)) {
osSendMesg(&gSaveMsgQueue, OS_MESG_32(SI_SAVE_SUCCESS), OS_MESG_PRI_NORMAL);
return;
}
osSendMesg(&gSaveMsgQueue, OS_MESG_32(SI_SAVE_FAILED), OS_MESG_PRI_NORMAL);
}
void Save_WriteData(void) {
if ((gStartNMI == 0) && (Save_WriteEeprom(&gSaveIOBuffer) == 0)) {
osSendMesg(&gSaveMsgQueue, OS_MESG_32(SI_SAVE_SUCCESS), OS_MESG_PRI_NORMAL);
return;
}
osSendMesg(&gSaveMsgQueue, OS_MESG_32(SI_SAVE_FAILED), OS_MESG_PRI_NORMAL);
}
void Controller_Rumble(void) {
s32 i;
// osContStartQuery(&gSerialEventQueue);
osRecvMesg(&gSerialEventQueue, NULL, OS_MESG_BLOCK);
// osContGetQuery(sControllerStatus);
for (i = 0; i < 4; i++) {
if ((gControllerPlugged[i] != 0) && (sControllerStatus[i].err_no == 0)) {
if (sControllerStatus[i].status & 1) {
if (gControllerRumble[i] == 0) {
if (osMotorInit(&gSerialEventQueue, &sControllerMotor[i], i)) {
gControllerRumble[i] = 0;
} else {
gControllerRumble[i] = 1;
}
}
if (gControllerRumble[i] == 1) {
if (D_80137E84[i] != 0) {
if (osMotorStart(&sControllerMotor[i])) {
gControllerRumble[i] = 0;
}
} else {
if (osMotorStop(&sControllerMotor[i])) {
gControllerRumble[i] = 0;
}
}
}
} else {
gControllerRumble[i] = 0;
}
}
}
for (i = 0; i < 4; i++) {
D_80137E84[i] = 0;
}
}