mirror of
https://github.com/HarbourMasters/Starship
synced 2026-07-29 15:45:14 -04:00
150 lines
4.4 KiB
C
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;
|
|
}
|
|
}
|