50 concept cOutPin =
requires(Pin pin,
bool level){
51 { pin.high() } -> std::same_as<void>;
52 { pin.low() } -> std::same_as<void>;
53 { pin.write(level) } -> std::same_as<void>;
87 { pin.is_high() } -> std::same_as<bool>;
88 { pin.is_low() } -> std::same_as<bool>;
89 { pin.read() } -> std::same_as<bool>;
175 concept cPin =
requires(Pin pin,
bool boolean){
176 { pin.high() } -> std::same_as<void>;
177 { pin.low() } -> std::same_as<void>;
178 { pin.write(
boolean) } -> std::same_as<void>;
180 { pin.input() } -> std::same_as<void>;
181 { pin.output() } -> std::same_as<void>;
182 { pin.dir(
boolean) } -> std::same_as<void>;
184 { pin.is_high() } -> std::same_as<bool>;
185 { pin.is_low() } -> std::same_as<bool>;
186 { pin.read() } -> std::same_as<bool>;
196 template<
class Pins, std::
size_t N>
197 concept cOutPins =
requires(Pins pins, std::bitset<N> values, std::size_t n){
198 { pins.write(values) } -> std::same_as<void>;
199 { pins.template view<0>() } ->
cOutPin;
207 template<
class Pins, std::
size_t N>
209 { pins.read() } -> std::same_as<std::bitset<N>>;
210 { pins.template view<0>() } ->
cInPin;
227 template<
class Pins, std::
size_t N>
228 concept cPins =
requires(Pins pins, std::bitset<N> values){
229 { pins.write(values) } -> std::same_as<void>;
230 { pins.dir(values) } -> std::same_as<void>;
231 { pins.read() } -> std::same_as<std::bitset<N>>;
232 { pins.template view<0>() } ->
cPin;
246 constexpr void write([[maybe_unused]]
bool b){}
255 constexpr void dir([[maybe_unused]]
bool b){}
264 [[nodiscard]]
constexpr bool read() {
return false;}
267 [[nodiscard]]
constexpr bool is_high() {
return false;}
270 [[nodiscard]]
constexpr bool is_low() {
return true;}
271 };
static_assert(cPin<VoidPin>,
"VoidPin needs to implement cPin");
281 constexpr void high(){_pin.low();}
282 constexpr void low(){_pin.high();}
283 constexpr void write(
bool level){_pin.write(!level);}
285 constexpr void input(){_pin.input();}
287 constexpr void dir(
bool direction){_pin.dir(direction);}
289 [[nodiscard]]
constexpr bool is_high() {
return _pin.is_low();}
290 [[nodiscard]]
constexpr bool is_low() {
return _pin.is_high();}
291 [[nodiscard]]
constexpr bool read() {
return !_pin.read();}
292 };
static_assert(cPin<InvertedPin<VoidPin>>,
"InvertedPin needs to implement cPin");
298 constexpr void write([[maybe_unused]]std::bitset<N> values){}
301 constexpr void dir([[maybe_unused]]std::bitset<N> values){}
304 [[nodiscard]]
constexpr std::bitset<N>
read(){
return std::bitset<N>(0);}
311 };
static_assert(cPins<VoidPins<8>, 8>,
"cPinArray needs to implement cPins");
316 template<
typename... Pins>
317 requires (cPin<Pins> && ...)
319 std::tuple<Pins...> pins;
326 constexpr PinTuple(Pins... pins) : pins(
std::forward<Pins>(pins)...){}
331 constexpr void write(std::bitset<
sizeof...(Pins)> values){
332 write_impl(values, std::make_index_sequence<
sizeof...(Pins)>{});
338 constexpr void dir(std::bitset<
sizeof...(Pins)> values){
339 dir_impl(values, std::make_index_sequence<
sizeof...(Pins)>{});
345 [[nodiscard]]
constexpr std::bitset<
sizeof...(Pins)>
read() {
346 return read_impl(std::make_index_sequence<
sizeof...(Pins)>{});
353 requires(pin <
sizeof...(Pins))
354 [[nodiscard]]
constexpr auto view(){
return std::get<pin>(pins);}
357 template<std::size_t... I>
358 constexpr void write_impl(
const std::bitset<
sizeof...(Pins)>& values, std::index_sequence<I...>) {
359 (..., std::get<I>(pins).write(values[I]));
362 template<std::size_t... I>
363 constexpr void dir_impl(
const std::bitset<
sizeof...(Pins)>& values, std::index_sequence<I...>) {
364 (..., std::get<I>(pins).dir(values[I]));
367 template<std::size_t... I>
368 constexpr std::bitset<
sizeof...(Pins)> read_impl(std::index_sequence<I...>) {
369 std::bitset<
sizeof...(Pins)> result = ((std::bitset<
sizeof...(Pins)>(std::get<I>(pins).
read() ? 1 : 0) << I) | ...);
constexpr void high()
Definition cPin.hpp:281
constexpr void input()
Definition cPin.hpp:285
constexpr bool is_high()
Definition cPin.hpp:289
constexpr InvertedPin(const Pin &pin)
Definition cPin.hpp:279
constexpr bool read()
Definition cPin.hpp:291
constexpr void output()
Definition cPin.hpp:286
constexpr bool is_low()
Definition cPin.hpp:290
constexpr void low()
Definition cPin.hpp:282
constexpr void write(bool level)
Definition cPin.hpp:283
constexpr void dir(bool direction)
Definition cPin.hpp:287
constexpr void write(std::bitset< sizeof...(Pins)> values)
writes each bit to each corresponding pin
Definition cPin.hpp:331
constexpr PinTuple(Pins... pins)
constructs a PinTuple from a list of pins
Definition cPin.hpp:326
constexpr auto view()
returns a view of the corresponding pin position
Definition cPin.hpp:354
constexpr void dir(std::bitset< sizeof...(Pins)> values)
writes each bit to configure each corresponding pin
Definition cPin.hpp:338
constexpr std::bitset< sizeof...(Pins)> read()
reads from all pins and writes their results to the corresponding bit position
Definition cPin.hpp:345
Represents an unconnected pin that does nothing.
Definition cPin.hpp:242
constexpr bool is_low()
always returns true
Definition cPin.hpp:270
constexpr bool is_high()
always returns false
Definition cPin.hpp:267
constexpr void high()
does nothing (no-op)
Definition cPin.hpp:249
constexpr void input()
does nothing (no-op)
Definition cPin.hpp:258
constexpr bool read()
always returns false
Definition cPin.hpp:264
constexpr void low()
does nothing (no-op)
Definition cPin.hpp:252
constexpr void dir(bool b)
does nothing (no-op)
Definition cPin.hpp:255
constexpr void write(bool b)
does nothing (no-op)
Definition cPin.hpp:246
constexpr void output()
does nothing (no-op)
Definition cPin.hpp:261
constexpr void write(std::bitset< N > values)
does nothing (no-op)
Definition cPin.hpp:298
constexpr void dir(std::bitset< N > values)
does nothing (no-op)
Definition cPin.hpp:301
constexpr VoidPin view()
returns a void pin
Definition cPin.hpp:309
constexpr std::bitset< N > read()
does nothing (no-op) and returns 0
Definition cPin.hpp:304
Concept for pin that can be immediatelly read from.
Definition cPin.hpp:86
Concept for synchronous output pins.
Definition cPin.hpp:208
Concept for a pin that can be immediatly written to.
Definition cPin.hpp:50
Concept for synchronous output pins.
Definition cPin.hpp:197
Concept for tri-state pin (high, low, input) that can be immediatelly read from and written to.
Definition cPin.hpp:175
Concept for tri-state pin (high, low, input) that can be immediatelly read from and written to.
Definition cPin.hpp:228
Definition Duration.hpp:17