/* ------------------------------------------- Copyright ZKA Technologies ------------------------------------------- */ /* ------------------------------------------- Revision History: 31/01/24: Add kDeviceCnt (amlel) ------------------------------------------- */ #pragma once /* Kernel device interface manager. */ /* @file KernelKit/DeviceManager.hpp */ /* @brief Device abstraction and I/O buffer. */ #include #include // Last Rev // Wed, Apr 3, 2024 9:09:41 AM namespace Kernel { template class DeviceInterface; template class DeviceInterface { public: explicit DeviceInterface(void (*Out)(T), void (*In)(T)) : fOut(Out), fIn(In) { } virtual ~DeviceInterface() = default; public: DeviceInterface& operator=(const DeviceInterface&) = default; DeviceInterface(const DeviceInterface&) = default; public: virtual DeviceInterface& operator<<(T Data) { fOut(Data); return *this; } virtual DeviceInterface& operator>>(T Data) { fIn(Data); return *this; } virtual const char* Name() const { return "DeviceInterface"; } operator bool() { return fOut && fIn; } bool operator!() { return !fOut || !fIn; } private: void (*fOut)(T Data); void (*fIn)(T Data); }; /// /// @brief Input Output Buffer /// Used mainly to communicate between hardware. /// template class IOBuf final { public: explicit IOBuf(T Dat) : fData(Dat) { // at least pass something valid when instancating this struct. MUST_PASS(Dat); } IOBuf& operator=(const IOBuf&) = default; IOBuf(const IOBuf&) = default; ~IOBuf() = default; public: template R operator->() const { return fData; } template R& operator[](Size index) const { return fData[index]; } private: T fData; }; ///! @brief Device enum types. enum { kDeviceTypeIDE, kDeviceTypeEthernet, kDeviceTypeWiFi, kDeviceTypeRS232, kDeviceTypeSCSI, kDeviceTypeSHCI, kDeviceTypeUSB, kDeviceTypeMedia, kDeviceTypeCount, }; } // namespace Kernel