OSPlayRecord.o 100%

This commit is contained in:
Joshua Andrew 2023-07-27 01:37:10 -04:00
parent d1b87998d7
commit d5193b23d3
7 changed files with 282 additions and 11 deletions

View File

@ -234,10 +234,10 @@ __OSVIDimReplyHandler,OSStateTM.o,os.a,true
__OSDefaultResetCallback,OSStateTM.o,os.a,false
__OSDefaultPowerCallback,OSStateTM.o,os.a,false
__OSStateEventHandler,OSStateTM.o,os.a,false
PlayRecordAlarmCallback,OSPlayRecord.o,os.a,false
PlayRecordCallback,OSPlayRecord.o,os.a,false
__OSStartPlayRecord,OSPlayRecord.o,os.a,false
__OSStopPlayRecord,OSPlayRecord.o,os.a,false
PlayRecordAlarmCallback,OSPlayRecord.o,os.a,true
PlayRecordCallback,OSPlayRecord.o,os.a,true
__OSStartPlayRecord,OSPlayRecord.o,os.a,true
__OSStopPlayRecord,OSPlayRecord.o,os.a,true
__OSWriteStateFlags,OSStateFlags.o,os.a,true
__OSReadStateFlags,OSStateFlags.o,os.a,true
__OSInitNet,OSNet.o,os.a,true

1 Symbol Name Object File Library Archive Matching
234 __OSDefaultResetCallback OSStateTM.o os.a false
235 __OSDefaultPowerCallback OSStateTM.o os.a false
236 __OSStateEventHandler OSStateTM.o os.a false
237 PlayRecordAlarmCallback OSPlayRecord.o os.a false true
238 PlayRecordCallback OSPlayRecord.o os.a false true
239 __OSStartPlayRecord OSPlayRecord.o os.a false true
240 __OSStopPlayRecord OSPlayRecord.o os.a false true
241 __OSWriteStateFlags OSStateFlags.o os.a true
242 __OSReadStateFlags OSStateFlags.o os.a true
243 __OSInitNet OSNet.o os.a true

View File

@ -1,6 +1,6 @@
{
"schemaVersion": 1,
"label": "SDK",
"message": "18.91%",
"message": "19.171%",
"color": "blue"
}

View File

@ -22,7 +22,7 @@
| [nand](https://github.com/shibbo/Petari/tree/master/libs/RVL_SDK/docs/lib/nand.md) | 100.0% |
| [net](https://github.com/shibbo/Petari/tree/master/libs/RVL_SDK/docs/lib/net.md) | 0.0% |
| [nwc24](https://github.com/shibbo/Petari/tree/master/libs/RVL_SDK/docs/lib/nwc24.md) | 5.5843520782396086% |
| [os](https://github.com/shibbo/Petari/tree/master/libs/RVL_SDK/docs/lib/os.md) | 60.55346438031507% |
| [os](https://github.com/shibbo/Petari/tree/master/libs/RVL_SDK/docs/lib/os.md) | 63.662344904503% |
| [pad](https://github.com/shibbo/Petari/tree/master/libs/RVL_SDK/docs/lib/pad.md) | 0.0% |
| [rso](https://github.com/shibbo/Petari/tree/master/libs/RVL_SDK/docs/lib/rso.md) | 0.0% |
| [sc](https://github.com/shibbo/Petari/tree/master/libs/RVL_SDK/docs/lib/sc.md) | 66.63447609850314% |

View File

@ -33,7 +33,7 @@
| OSUtf.o | 0.0% | 0 / 4 | 0.0% | :x:
| OSIpc.o | 100.0% | 3 / 3 | 100.0% | :white_check_mark:
| OSStateTM.o | 32.55813953488372% | 5 / 12 | 41.66666666666667% | :eight_pointed_black_star:
| OSPlayRecord.o | 0.0% | 0 / 4 | 0.0% | :x:
| OSPlayRecord.o | 100.0% | 4 / 4 | 100.0% | :white_check_mark:
| OSStateFlags.o | 100.0% | 2 / 2 | 100.0% | :white_check_mark:
| OSNet.o | 100.0% | 1 / 1 | 100.0% | :white_check_mark:
| OSNandbootInfo.o | 0.0% | 0 / 2 | 0.0% | :x:
@ -405,10 +405,10 @@
# OSPlayRecord.o
| Symbol | Decompiled? |
| ------------- | ------------- |
| PlayRecordAlarmCallback | :x: |
| PlayRecordCallback | :x: |
| __OSStartPlayRecord | :x: |
| __OSStopPlayRecord | :x: |
| PlayRecordAlarmCallback | :white_check_mark: |
| PlayRecordCallback | :white_check_mark: |
| __OSStartPlayRecord | :white_check_mark: |
| __OSStopPlayRecord | :white_check_mark: |
# OSStateFlags.o

View File

@ -102,6 +102,7 @@ s32 NANDPrivateCreate(const char *, u8, u8);
s32 NANDOpen(const char *, NANDFileInfo *, u8);
s32 NANDPrivateOpen(const char *, NANDFileInfo *, u8);
s32 NANDOpenAsync(const char *, NANDFileInfo *, u8, NANDCallback, NANDCommandBlock *);
s32 NANDPrivateOpenAsync(const char *, NANDFileInfo *, const u8, NANDCallback, NANDCommandBlock *);
s32 NANDClose(NANDFileInfo *);

View File

@ -1,6 +1,16 @@
#ifndef OSPLAYRECORD_H
#define OSPLAYRECORD_H
typedef struct {
u32 checkSum;
u16 titleName[2][21];
OSTime playStartTime;
OSTime playTime;
char gameCode[4];
char companyCode[2];
char res[18];
} OSPlayRecord;
void __OSStartPlayRecord(void);
#endif // OSPLAYRECORD_H

View File

@ -0,0 +1,260 @@
#include <revolution/os.h>
#include <revolution/nand.h>
static BOOL PlayRecordGet = FALSE;
static OSPlayRecord PlayRecord __attribute__ ((aligned(32)));
static NANDFileInfo FileInfo;
static NANDCommandBlock Block;
static s32 PlayRecordState = 9;
static OSAlarm PlayRecordAlarm;
static BOOL PlayRecordError = FALSE;
static volatile BOOL PlayRecordTerminate = FALSE;
static volatile BOOL PlayRecordTerminated = FALSE;
static BOOL PlayRecordRetry = FALSE;
static OSTime PlayRecordLastCloseTime;
static s32 PlayRecordLastError = NAND_RESULT_OK;
static void PlayRecordCallback(s32, NANDCommandBlock *);
void PlayRecordAlarmCallback(OSAlarm* alarm, OSContext* context) {
PlayRecordCallback(NAND_RESULT_OK, NULL);
}
static u32 RecordCheckSum(OSPlayRecord* record) {
u32 *ptr, i, sum;
ptr = (u32*)record->titleName;
sum = 0;
for (i = 0; i < (sizeof(PlayRecord) - 4) / 4; i++) {
sum = sum + *ptr;
ptr++;
}
return sum;
}
static void PlayRecordCallback(s32 result, NANDCommandBlock* block) {
s32 ret = 0;
PlayRecordLastError = result;
if (PlayRecordTerminate) {
PlayRecordTerminated = TRUE;
return;
}
if (!PlayRecordRetry) {
switch (PlayRecordState) {
case 0:
PlayRecordState = 1;
break;
case 1:
if (result == NAND_RESULT_MAXFD) {
PlayRecordRetry = TRUE;
OSCreateAlarm(&PlayRecordAlarm);
OSSetAlarm(&PlayRecordAlarm, (OSTime)1 * OSSecondsToTicks(1), PlayRecordAlarmCallback);
return;
}
else if (result == NAND_RESULT_OK) {
if (!PlayRecordGet) {
PlayRecordState = 2;
}
else {
PlayRecordState = 4;
}
break;
}
else {
PlayRecordError = TRUE;
PlayRecordState = 7;
return;
}
case 2:
if (result == sizeof(OSPlayRecord)) {
PlayRecordGet = TRUE;
PlayRecordLastCloseTime = PlayRecord.playTime;
PlayRecordState = 3;
}
else {
PlayRecordError = TRUE;
PlayRecordState = 6;
}
break;
case 3:
if (result == 0) {
PlayRecordState = 4;
}
else {
PlayRecordError = TRUE;
PlayRecordState = 6;
}
break;
case 4:
PlayRecordState = 5;
break;
case 5:
if (result == sizeof(OSPlayRecord)) {
if (OSGetTime() - PlayRecordLastCloseTime > (OSTime)300 * OSSecondsToTicks(1)) {
PlayRecordState = 6;
}
else {
PlayRecordState = 3;
}
}
else {
PlayRecordError = TRUE;
PlayRecordState = 6;
}
break;
case 6:
if (PlayRecordError) {
PlayRecordState = 7;
return;
}
else {
if (result == NAND_RESULT_OK) {
PlayRecordLastCloseTime = PlayRecord.playTime;
PlayRecordState = 1;
break;
}
else {
PlayRecordState = 7;
PlayRecordError = TRUE;
return;
}
}
default:
PlayRecordState = 7;
PlayRecordError = TRUE;
return;
}
}
PlayRecordRetry = FALSE;
switch (PlayRecordState) {
case 1:
ret = NANDOpenAsync("/title/00000001/00000002/data/play_rec.dat", &FileInfo, 3, PlayRecordCallback, &Block);
break;
case 2:
ret = NANDReadAsync(&FileInfo, &PlayRecord, sizeof(OSPlayRecord), PlayRecordCallback, &Block);
break;
case 3:
ret = NANDSeekAsync(&FileInfo, 0, 0, PlayRecordCallback, &Block);
break;
case 4:
OSCreateAlarm(&PlayRecordAlarm);
OSSetAlarm(&PlayRecordAlarm, (OSTime)60 * OSSecondsToTicks(1), PlayRecordAlarmCallback);
break;
case 5:
PlayRecord.playTime = OSGetTime();
PlayRecord.checkSum = RecordCheckSum(&PlayRecord);
ret = NANDWriteAsync(&FileInfo, &PlayRecord, sizeof(OSPlayRecord), PlayRecordCallback, &Block);
break;
case 6:
ret = NANDCloseAsync(&FileInfo, PlayRecordCallback, &Block);
break;
}
if (ret != NAND_RESULT_OK) {
if (ret == NAND_RESULT_BUSY) {
OSCreateAlarm(&PlayRecordAlarm);
OSSetAlarm(&PlayRecordAlarm, (OSTime)1 * OSSecondsToTicks(1), PlayRecordAlarmCallback);
PlayRecordRetry = TRUE;
}
else {
PlayRecordError = TRUE;
switch (PlayRecordState) {
case 2:
case 3:
case 5:
PlayRecordState = 6;
ret = NANDCloseAsync(&FileInfo, PlayRecordCallback, &Block);
if (ret == NAND_RESULT_BUSY) {
PlayRecordRetry = TRUE;
OSCreateAlarm(&PlayRecordAlarm);
OSSetAlarm(&PlayRecordAlarm, 1 * OSSecondsToTicks(1), PlayRecordAlarmCallback);
}
break;
default:
PlayRecordState = 7;
}
}
}
PlayRecordLastError = ret;
}
void __OSStartPlayRecord(void) {
if (NANDInit() == NAND_RESULT_OK) {
PlayRecordGet = FALSE;
PlayRecordState = 0;
PlayRecordError = FALSE;
PlayRecordRetry = FALSE;
PlayRecordTerminate = FALSE;
PlayRecordTerminated = FALSE;
PlayRecordLastError = NAND_RESULT_OK;
PlayRecordCallback(NAND_RESULT_OK, NULL);
}
}
void __OSStopPlayRecord(void) {
BOOL old;
OSTime start;
old = OSDisableInterrupts();
PlayRecordTerminate = TRUE;
if (PlayRecordState == 7 || PlayRecordState == 0 ||
PlayRecordState == 9 || PlayRecordState == 8)
{
OSRestoreInterrupts(old);
}
else if (PlayRecordState == 4) {
OSCancelAlarm(&PlayRecordAlarm);
OSRestoreInterrupts(old);
PlayRecord.playTime = OSGetTime();
PlayRecord.checkSum = RecordCheckSum(&PlayRecord);
NANDWrite(&FileInfo, &PlayRecord, sizeof(PlayRecord));
NANDClose(&FileInfo);
}
else {
if (PlayRecordRetry) {
OSCancelAlarm(&PlayRecordAlarm);
OSRestoreInterrupts(old);
}
else {
OSRestoreInterrupts(old);
start = OSGetTime();
while (1) {
if (PlayRecordTerminated) {
break;
}
if ((OSGetTime() - start) > OSMillisecondsToTicks(500)) {
PlayRecordState = 8;
return;
}
}
}
switch (PlayRecordState) {
case 2:
case 3:
case 5:
NANDClose(&FileInfo);
break;
case 1:
if (PlayRecordLastError == NAND_RESULT_OK && !PlayRecordRetry) {
NANDClose(&FileInfo);
}
break;
case 6:
if (PlayRecordRetry) {
NANDClose(&FileInfo);
}
break;
}
}
PlayRecordState = 9;
}