#pragma once
#include "IOValues/periphery_io_values.hpp"

namespace JabyEngine {
    namespace Periphery_IO {
        struct JOY_STAT_IO : public IOPort<Periphery_IO_Values::JOY_STAT> {
            inline bool has_response() const {
                return this->read().is_set(Periphery_IO_Values::JOY_STAT::RXFifoNonEmpty);
            }

            inline bool is_ready_transfer() const {
                return this->read().is_set(Periphery_IO_Values::JOY_STAT::TXReadyFinished);
            }
        };

        using JOY_BAUD_IO    = IOPort<Periphery_IO_Values::JOY_BAUD>;
        using JOY_CTRL_IO    = IOPort<Periphery_IO_Values::JOY_CTRL>;
        using JOY_MODE_IO    = IOPort<Periphery_IO_Values::JOY_MODE>;
        using JOY_RX_DATA_IO = IOPort<Periphery_IO_Values::JOY_RX_DATA>;
        using JOY_TX_DATA_IO = IOPort<Periphery_IO_Values::JOY_TX_DATA>;

        static auto&       JOY_TX_DATA = __declare_io_port(JOY_TX_DATA_IO, 0x1F801040);
        static const auto& JOY_RX_DATA = __declare_io_port(JOY_RX_DATA_IO, 0x1F801040);
        static const auto& JOY_STAT    = __declare_io_port(JOY_STAT_IO,    0x1F801044);
        static auto&       JOY_MODE    = __declare_io_port(JOY_MODE_IO,    0x1F801048);
        static auto&       JOY_CTRL    = __declare_io_port(JOY_CTRL_IO,    0x1F80104A);
        static auto&       JOY_BAUD    = __declare_io_port(JOY_BAUD_IO,    0x1F80104E);
    }
}