skullc-peripherals/Peripherals/Inc/peripherals_hal_concepts.hpp
Erki 66461af1e4
Some checks failed
CI & Unit Tests / Unit-Tests (push) Failing after 13s
CI & Unit Tests / Docs (push) Successful in 10s
WIP3
2025-02-06 21:27:51 +02:00

49 lines
1.2 KiB
C++

//
// Created by erki on 11/02/24.
//
#pragma once
#include <array>
#include <concepts>
#include <cstdint>
namespace Peripherals::Hal
{
enum class Edge
{
Rising,
Falling
};
template<typename T>
concept Gpio = requires(T t, const T ct) {
t.set(true);
t.toggle();
{ ct.read() } -> std::same_as<bool>;
};
template<typename T>
concept SerialInterface = requires(T t, std::uint8_t* data, const std::uint32_t len) {
{ t.transmit(data, len) } -> std::same_as<bool>;
{ t.transmit(std::array<std::uint8_t, 10>{}) } -> std::same_as<bool>;
{ t.receive(data, len) } -> std::same_as<bool>;
{ t.receive(std::array<std::uint8_t, 10>{}) } -> std::same_as<bool>;
};
template<typename T, typename RegName>
concept RegisterInterface = requires(T t, RegName reg, std::uint8_t* data, const std::uint32_t len) {
t.writerRegister(reg, std::uint8_t{});
t.writeRegisterMultibyte(reg, data, len);
{ t.readRegister(reg, std::uint32_t{}) } -> std::same_as<std::uint8_t>;
t.readRegisterMultibyte(reg, data, len, std::uint32_t{});
};
template<typename T>
concept StaticHal = requires() {
{ T::getMillis() } -> std::same_as<std::uint32_t>;
};
}// namespace Peripherals::Hal