mirror of
https://github.com/SMGCommunity/Petari.git
synced 2025-02-25 16:40:50 +00:00
OSPlayRecord.o
100%
This commit is contained in:
parent
d1b87998d7
commit
d5193b23d3
@ -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,6 +1,6 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"label": "SDK",
|
||||
"message": "18.91%",
|
||||
"message": "19.171%",
|
||||
"color": "blue"
|
||||
}
|
@ -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% |
|
||||
|
@ -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
|
||||
|
@ -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 *);
|
||||
|
@ -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
|
260
libs/RVL_SDK/source/revolution/os/OSPlayRecord.c
Normal file
260
libs/RVL_SDK/source/revolution/os/OSPlayRecord.c
Normal 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;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user