Newer
Older
minerva / Kernel / Bus / SerialIO / Controller.h
@minerva minerva on 13 Jul 1 KB Initial commit
/*
 * Copyright (c) 2023, Liav A. <liavalb@hotmail.co.il>
 *
 * SPDX-License-Identifier: BSD-2-Clause
 */

#pragma once

#include <AK/AtomicRefCounted.h>
#include <AK/DistinctNumeric.h>
#include <AK/Error.h>
#include <AK/IntrusiveList.h>
#include <AK/NonnullRefPtr.h>
#include <AK/RefPtr.h>
#include <AK/Types.h>

namespace Kernel {

class InputManagement;
class SerialIOController : public AtomicRefCounted<SerialIOController> {
    friend class InputManagement;

public:
    enum class DeviceCommand : u8 {
        GetDeviceID,
        SetSampleRate,
        EnablePacketStreaming,
        DisablePacketStreaming,
        SetDefaults,
    };

    AK_TYPEDEF_DISTINCT_ORDERED_ID(size_t, PortIndex);

    virtual ~SerialIOController() = default;

    virtual ErrorOr<void> reset_device(PortIndex) = 0;
    virtual ErrorOr<void> send_command(PortIndex, DeviceCommand command) = 0;
    virtual ErrorOr<void> send_command(PortIndex, DeviceCommand command, u8 data) = 0;

    virtual ErrorOr<u8> read_from_device(PortIndex) = 0;
    virtual ErrorOr<void> prepare_for_input(PortIndex) = 0;

protected:
    SerialIOController() = default;

private:
    IntrusiveListNode<SerialIOController, NonnullRefPtr<SerialIOController>> m_list_node;
};

}