mirror of
https://github.com/HarbourMasters/Starship.git
synced 2025-03-14 03:44:01 +03:00

* stuff * three whole files * format * format and such * a switch in time * merge prep * nintendo switch * format * the great switch statement of our time * 43AC0 matched * stuff * Enums everywhere * oh god the switch * knakyo * new headers * format * fox * everyone hates recursion * format * one more thing * one more one more thing * renames * matches * matrix scale why * names and such * cleanup * name back
148 lines
4.2 KiB
C
148 lines
4.2 KiB
C
#include "global.h"
|
|
|
|
OSContPad gCurrentInput[4];
|
|
OSContPad gChangedInput[4];
|
|
u8 gControllerStatus[4];
|
|
u32 gStopInputTimer;
|
|
u8 gRumbleStatus[4];
|
|
OSContPad sNextInput[4]; //
|
|
OSContPad sPrevInput[4]; //
|
|
OSContStatus D_800DD8F0[4]; //
|
|
OSPfs D_800DD900[4]; //
|
|
|
|
void Controller_AddDeadZone(s32 contrNum) {
|
|
s32 temp_v0 = gCurrentInput[contrNum].stick_x;
|
|
s32 temp_a2 = gCurrentInput[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;
|
|
}
|
|
gChangedInput[contrNum].stick_x = var_a0;
|
|
gChangedInput[contrNum].stick_y = var_v0;
|
|
}
|
|
|
|
void Controller_Init(void) {
|
|
u8 sp1F;
|
|
s32 i;
|
|
|
|
osContInit(&gSerialEventQueue, &sp1F, D_800DD8F0);
|
|
for (i = 0; i < 4; i++) {
|
|
gControllerStatus[i] = (sp1F >> i) & 1;
|
|
gRumbleStatus[i] = 0;
|
|
}
|
|
}
|
|
|
|
void Controller_UpdateInput(void) {
|
|
s32 i;
|
|
|
|
for (i = 0; i < 4; i++) {
|
|
if (gControllerStatus[i] == 1 && sNextInput[i].errno == 0) {
|
|
sPrevInput[i] = gCurrentInput[i];
|
|
gCurrentInput[i] = sNextInput[i];
|
|
gChangedInput[i].button = (gCurrentInput[i].button ^ sPrevInput[i].button) & gCurrentInput[i].button;
|
|
Controller_AddDeadZone(i);
|
|
} else {
|
|
gCurrentInput[i].button = gCurrentInput[i].stick_x = gCurrentInput[i].stick_y = gCurrentInput[i].errno =
|
|
gChangedInput[i].button = gChangedInput[i].stick_x = gChangedInput[i].stick_y = gChangedInput[i].errno =
|
|
0;
|
|
}
|
|
}
|
|
}
|
|
|
|
void Controller_ReadData(void) {
|
|
s32 i;
|
|
|
|
if (gStopInputTimer != 0) {
|
|
gStopInputTimer--;
|
|
for (i = 0; i < 4; i++) {
|
|
sNextInput[i].button = sNextInput[i].stick_x = sNextInput[i].stick_y = sNextInput[i].errno = 0;
|
|
}
|
|
} else {
|
|
osContStartReadData(&gSerialEventQueue);
|
|
osRecvMesg(&gSerialEventQueue, NULL, OS_MESG_BLOCK);
|
|
osContGetReadData(sNextInput);
|
|
}
|
|
osSendMesg(&gControllerMsgQueue, (OSMesg) SI_CONT_READ_DONE, OS_MESG_PRI_NORMAL);
|
|
}
|
|
|
|
void Save_ReadData(void) {
|
|
if ((gStartNMI == 0) && (Save_ReadEeprom(&gSaveIOBuffer) == 0)) {
|
|
osSendMesg(&gSaveMsgQueue, (OSMesg) SI_SAVE_SUCCESS, OS_MESG_PRI_NORMAL);
|
|
return;
|
|
}
|
|
osSendMesg(&gSaveMsgQueue, (OSMesg) SI_SAVE_FAILED, OS_MESG_PRI_NORMAL);
|
|
}
|
|
|
|
void Save_WriteData(void) {
|
|
if ((gStartNMI == 0) && (Save_WriteEeprom(&gSaveIOBuffer) == 0)) {
|
|
osSendMesg(&gSaveMsgQueue, (OSMesg) SI_SAVE_SUCCESS, OS_MESG_PRI_NORMAL);
|
|
return;
|
|
}
|
|
osSendMesg(&gSaveMsgQueue, (OSMesg) SI_SAVE_FAILED, OS_MESG_PRI_NORMAL);
|
|
}
|
|
|
|
void Controller_Rumble(void) {
|
|
s32 i;
|
|
|
|
osContStartQuery(&gSerialEventQueue);
|
|
osRecvMesg(&gSerialEventQueue, NULL, OS_MESG_BLOCK);
|
|
osContGetQuery(D_800DD8F0);
|
|
|
|
for (i = 0; i < 4; i++) {
|
|
if ((gControllerStatus[i] != 0) && (D_800DD8F0[i].errno == 0)) {
|
|
if (D_800DD8F0[i].status & 1) {
|
|
if (gRumbleStatus[i] == 0) {
|
|
if (osMotorInit(&gSerialEventQueue, &D_800DD900[i], i)) {
|
|
gRumbleStatus[i] = 0;
|
|
} else {
|
|
gRumbleStatus[i] = 1;
|
|
}
|
|
}
|
|
if (gRumbleStatus[i] == 1) {
|
|
if (D_80137E84[i] != 0) {
|
|
if (osMotorStart(&D_800DD900[i])) {
|
|
gRumbleStatus[i] = 0;
|
|
}
|
|
} else {
|
|
if (osMotorStop(&D_800DD900[i])) {
|
|
gRumbleStatus[i] = 0;
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
gRumbleStatus[i] = 0;
|
|
}
|
|
}
|
|
}
|
|
for (i = 0; i < 4; i++) {
|
|
D_80137E84[i] = 0;
|
|
}
|
|
}
|