summaryrefslogtreecommitdiff
path: root/src/d/d_dvd_unk.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/d/d_dvd_unk.cpp')
-rw-r--r--src/d/d_dvd_unk.cpp222
1 files changed, 218 insertions, 4 deletions
diff --git a/src/d/d_dvd_unk.cpp b/src/d/d_dvd_unk.cpp
index 5732bdc8..e0225142 100644
--- a/src/d/d_dvd_unk.cpp
+++ b/src/d/d_dvd_unk.cpp
@@ -1,23 +1,237 @@
#include "d/d_dvd_unk.h"
+#include "common.h"
+#include "d/d_cs_base.h"
+#include "d/d_cursor_hit_check.h"
#include "d/d_dvd_drive_error.h"
+#include "d/d_gfx.h"
+#include "d/d_hbm.h"
+#include "d/d_pad.h"
+#include "d/d_pad_manager.h"
+#include "d/d_s_boot.h"
+#include "d/d_video.h"
+#include "d/lyt/d_lyt_system_window.h"
+#include "d/snd/d_snd_player_mgr.h"
#include "egg/core/eggHeap.h"
+#include "egg/gfx/eggTextureBuffer.h"
+#include "rvl/NAND/nand.h"
#include "toBeSorted/nand_result_tracker.h"
+namespace dDvdUnk {
#include "d/dol_backup_error_font.inc"
-namespace dDvdUnk {
-
FontUnk *FontUnk::sInstance;
-extern "C" void fn_80059D10(EGG::Heap *heap);
+
void FontUnk::create(EGG::Heap *heap) {
sInstance = new (heap, 0x04) FontUnk();
sInstance->init();
dDvdDriveError_c::create(heap);
NandResultTracker::create(heap);
- fn_80059D10(heap);
+ dPadManager_c::create(heap);
sInstance->field_0x2C = 0;
}
+void FontUnk::execute() {
+ if (dHbm::Manage_c::GetInstance()->getState() == dHbm::Manage_c::HBM_MANAGE_ACTIVE) {
+ return;
+ }
+
+ dDvdDriveError_c *driveError = dDvdDriveError_c::GetInstance();
+ dPadManager_c *padManager = dPadManager_c::GetInstance();
+ NandResultTracker *nandTracker = NandResultTracker::GetInstance();
+
+ // Errors in decreasing importance
+ switch (mErrorType) {
+ case ERROR_DISK: driveError->execute(); break;
+ case ERROR_PAD:
+ driveError->execute();
+ padManager->execute();
+ break;
+ case ERROR_NAND:
+ driveError->execute();
+ padManager->execute();
+ nandTracker->execute();
+ break;
+ default:
+ driveError->execute();
+ nandTracker->execute();
+ padManager->execute();
+ break;
+ }
+ if (checkFlag(FLAG_ERROR_REQUEST)) {
+ offFlag(FLAG_ERROR_REQUEST);
+ EGG::TextureBuffer *buf = dGfx_c::GetInstance()->getTextureBuffer();
+ if (buf != nullptr) {
+ buf->capture(0, 0, false, -1);
+ }
+ onFlag(FLAG_ERROR_STATE);
+ }
+}
+
+void FontUnk::drawNonDriveError() {
+ switch (mErrorType) {
+ case ERROR_PAD: dPadManager_c::GetInstance()->draw(); break;
+ case ERROR_NAND: NandResultTracker::GetInstance()->draw(); break;
+ default: break;
+ }
+}
+
+void FontUnk::drawDriveError() {
+ if (mIsDiskError == true) {
+ dDvdDriveError_c::GetInstance()->draw();
+ }
+}
+
+void FontUnk::init() {
+ mIsDiskError = false;
+ mIsNandError = false;
+ mIsPadError = false;
+ mFlags = 0;
+ mDiskErrorCode = 0;
+ mNandErrorCode = 0;
+ field_0x2B = false;
+ mErrorType = ERROR_NONE;
+ mFont.SetResource(DOL_BACKUP_FONT);
+}
+
+void dDvdUnk::FontUnk::fn_800529B0() {
+ mIsPadError = false;
+ field_0x2B = false;
+ if (dCsBase_c::GetInstance() == nullptr) {
+ return;
+ }
+ dCsBase_c::GetInstance()->setVisible(false);
+ dCsBase_c::GetInstance()->setDrawDirectly(false);
+ dCsBase_c::GetInstance()->setCalibrationPointCenterEnabled(false);
+}
+
+void dDvdUnk::FontUnk::clearNandError() {
+ clearNandTrackerError();
+ mIsNandError = false;
+ mNandErrorCode = 0;
+}
+
+void dDvdUnk::FontUnk::fn_80052A20() {
+ if (dScBoot_c::GetInstance() == nullptr && !dPadManager_c::GetInstance()->isCalibrationFinished()) {
+ dPad::ex_c::setCalibrateMpls();
+ }
+
+ if (checkFlag(FLAG_ERROR_STATE)) {
+ dGfx_c::GetInstance()->releaseTextureBuffer();
+ dSndPlayerMgr_c::GetInstance()->fn_8035E6E0();
+ }
+
+ if (dLytSystemWindow_c::GetInstance() != nullptr && dLytSystemWindow_c::GetInstance()->fn_80152F80()) {
+ dLytSystemWindow_c::GetInstance()->fn_80152F10();
+ }
+
+ mIsDiskError = false;
+ mIsNandError = false;
+ mIsPadError = false;
+ mFlags = false;
+ mDiskErrorCode = 0;
+ mNandErrorCode = 0;
+ field_0x2B = false;
+ mErrorType = ERROR_NONE;
+
+ dPadManager_c::GetInstance()->init();
+ NandResultTracker::GetInstance()->init();
+}
+
+void FontUnk::preExecute() {
+ if (dHbm::Manage_c::GetInstance()->getState() != dHbm::Manage_c::HBM_MANAGE_ACTIVE) {
+ dDvdDriveError_c *drive = dDvdDriveError_c::GetInstance();
+ NandResultTracker *nand = NandResultTracker::GetInstance();
+ dPadManager_c *pad = dPadManager_c::GetInstance();
+ bool prevError = isAnyError();
+ mIsDiskError = drive->isError();
+ mDiskErrorCode = drive->getStatus();
+ mIsNandError = nand->isError();
+ mNandErrorCode = nand->getErrorCategory();
+
+ if (padErrorsAllowed() == true) {
+ mIsPadError = pad->isError();
+ }
+
+ // Errors in decreasing importance
+ if (mIsDiskError == true) {
+ mErrorType = ERROR_DISK;
+ } else if (mIsPadError == true) {
+ mErrorType = ERROR_PAD;
+ } else if (mIsNandError == true) {
+ mErrorType = ERROR_NAND;
+ } else {
+ mErrorType = ERROR_NONE;
+ }
+
+ if (prevError && !isAnyError()) {
+ dGfx_c::GetInstance()->releaseTextureBuffer();
+ offFlag(FLAG_ERROR_STATE);
+ dSndPlayerMgr_c::GetInstance()->fn_8035E6E0();
+ }
+
+ if (field_0x2C == true && !prevError && isAnyError()) {
+ dSndPlayerMgr_c::GetInstance()->fn_8035E620();
+ }
+ }
+}
+
+bool FontUnk::isAnyError() const {
+ return mIsDiskError | mIsNandError | mIsPadError;
+}
+
+void FontUnk::onError() {
+ if (checkFlag(FLAG_ERROR_STATE)) {
+ return;
+ }
+ onFlag(FLAG_ERROR_REQUEST);
+ dVideo::enableDimming(1);
+}
+
+void FontUnk::clearNandTrackerError() {
+ NandResultTracker::GetInstance()->isFailure(NAND_RESULT_OK);
+}
+
+void FontUnk::fn_80052CC0() {
+ setNeedsPad(true);
+ field_0x2B = true;
+}
+
+void FontUnk::setNeedsPad(bool b) {
+ if (dPadManager_c::GetInstance() != nullptr) {
+ dPadManager_c::GetInstance()->setField_0x1F(b);
+ }
+}
+
+bool FontUnk::padErrorsAllowed() {
+ if (field_0x2B != true) {
+ return false;
+ }
+
+ if (dPadManager_c::GetInstance() != nullptr) {
+ return dPadManager_c::GetInstance()->getField_0x1F();
+ }
+
+ return false;
+}
+
+void FontUnk::fn_80052D50() {
+ if (dPadManager_c::GetInstance()->isError() == true) {
+ if (checkFlag(FLAG_ERROR_STATE)) {
+ dGfx_c::GetInstance()->releaseTextureBuffer();
+ mFlags = 0;
+ dSndPlayerMgr_c::GetInstance()->fn_8035E6E0();
+ }
+ dPadManager_c::GetInstance()->init();
+ }
+ setNeedsPad(false);
+ dVideo::enableDimming(0);
+}
+
+void FontUnk::fn_80052DD0() {
+ setNeedsPad(true);
+ dVideo::enableDimming(1);
+}
+
} // namespace dDvdUnk