/* * ======================================================== * * HCore * Copyright Mahrouss Logic, all rights reserved. * * ======================================================== */ #pragma once #include #include #include #include #include namespace HCore { enum class PATAType { kRead28, kRead48, kWrite28, kWrite48, kUnknown }; const char* ata_read_28(ULong lba); const char* ata_read_48(ULong lba); Int32 ata_write_48(ULong lba, const char *text = nullptr); Int32 ata_write_28(ULong lba, const char *text = nullptr); class PATACommandManager final { public: PATACommandManager() = default; ~PATACommandManager() = default; PATACommandManager &operator=(const PATACommandManager &) = default; PATACommandManager(const PATACommandManager &) = default; public: static Ref Shared() { static Ref manager; return manager; } public: template ErrorOr operator()(ULong lba, const char *text = nullptr) noexcept { switch (Command) { case PATAType::kRead28: return ErrorOr(ata_read_28(lba)); case PATAType::kRead48: return ErrorOr(ata_read_48(lba)); case PATAType::kWrite28: { if (text) { ata_write_28(lba, text); kcout << "ErrorOr ata_read: Write ATA Command... " "(Write28)\n"; return {}; } kcout << "ErrorOr ata_read: Bad ATA Command... " "(Write28)\n"; return {}; } case PATAType::kWrite48: { if (text) { ata_write_48(lba, text); kcout << "ErrorOr ata_read: Write ATA Command... " "(Write48)\n"; return {}; } kcout << "ErrorOr ata_read: Bad ATA Command... " "(Write48)\n"; return {}; } case PATAType::kUnknown: { kcout << "ErrorOr ata_read: Unknown ATA Command...\n"; return {}; } } return ErrorOr(nullptr); } }; } // namespace HCore