fiber
Loading...
Searching...
No Matches
cPin.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "cAwaitable.hpp"
4
5#include <concepts>
6#include <bitset>
7#include <tuple>
8
9namespace fiber
10{
11
12 // ------------------ single pin ------------------
13
49 template<class Pin>
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>;
54 };
55
85 template<class Pin>
86 concept cInPin = requires( Pin pin){
87 { /*nodiscard*/ pin.is_high() } -> std::same_as<bool>;
88 { /*nodiscard*/ pin.is_low() } -> std::same_as<bool>;
89 { /*nodiscard*/ pin.read() } -> std::same_as<bool>;
90 };
91
174 template<class Pin>
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>;
179
180 { pin.input() } -> std::same_as<void>;
181 { pin.output() } -> std::same_as<void>;
182 { pin.dir(boolean) } -> std::same_as<void>;
183
184 { /*nodiscard*/ pin.is_high() } -> std::same_as<bool>;
185 { /*nodiscard*/ pin.is_low() } -> std::same_as<bool>;
186 { /*nodiscard*/ pin.read() } -> std::same_as<bool>;
187 };
188
189 // ------------------ multiple pins ------------------
190
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;
200 };
201
207 template<class Pins, std::size_t N>
208 concept cInPins = requires(Pins pins){
209 { pins.read() } -> std::same_as<std::bitset<N>>;
210 { pins.template view<0>() } -> cInPin;
211 };
212
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;
233 };
234
235// ---------------------------------------------------------------------------------------------
236// Helpers
237// ---------------------------------------------------------------------------------------------
238
242 class VoidPin{
243 public:
244
246 constexpr void write([[maybe_unused]]bool b){}
247
249 constexpr void high(){}
250
252 constexpr void low(){}
253
255 constexpr void dir([[maybe_unused]] bool b){}
256
258 constexpr void input(){}
259
261 constexpr void output(){}
262
264 [[nodiscard]] constexpr bool read() {return false;}
265
267 [[nodiscard]] constexpr bool is_high() {return false;}
268
270 [[nodiscard]] constexpr bool is_low() {return true;}
271 }; static_assert(cPin<VoidPin>, "VoidPin needs to implement cPin");
272
273 template<cPin Pin>
275 private:
276 Pin _pin;
277
278 public:
279 constexpr InvertedPin(const Pin& pin) : _pin(pin){}
280
281 constexpr void high(){_pin.low();}
282 constexpr void low(){_pin.high();}
283 constexpr void write(bool level){_pin.write(!level);}
284
285 constexpr void input(){_pin.input();}
286 constexpr void output(){_pin.output();}
287 constexpr void dir(bool direction){_pin.dir(direction);}
288
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");
293
294 template<size_t N>
295 class VoidPins{
296 public:
298 constexpr void write([[maybe_unused]]std::bitset<N> values){}
299
301 constexpr void dir([[maybe_unused]]std::bitset<N> values){}
302
304 [[nodiscard]] constexpr std::bitset<N> read(){return std::bitset<N>(0);}
305
307 template<size_t pin>
308 requires(pin < N)
309 [[nodiscard]] constexpr VoidPin view(){return VoidPin();}
310
311 }; static_assert(cPins<VoidPins<8>, 8>, "cPinArray needs to implement cPins");
312
316 template<typename... Pins>
317 requires (cPin<Pins> && ...)
318 class PinTuple{
319 std::tuple<Pins...> pins;
320
321 public:
322
326 constexpr PinTuple(Pins... pins) : pins(std::forward<Pins>(pins)...){}
327
331 constexpr void write(std::bitset<sizeof...(Pins)> values){
332 write_impl(values, std::make_index_sequence<sizeof...(Pins)>{});
333 }
334
338 constexpr void dir(std::bitset<sizeof...(Pins)> values){
339 dir_impl(values, std::make_index_sequence<sizeof...(Pins)>{});
340 }
341
345 [[nodiscard]] constexpr std::bitset<sizeof...(Pins)> read() {
346 return read_impl(std::make_index_sequence<sizeof...(Pins)>{});
347 }
348
352 template<size_t pin>
353 requires(pin < sizeof...(Pins))
354 [[nodiscard]] constexpr auto view(){return std::get<pin>(pins);}
355
356 private:
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]));
360 }
361
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]));
365 }
366
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) | ...);
370 return result;
371 }
372
373 }; static_assert(cPins<PinTuple<VoidPin, VoidPin>, 2>, "PinTuple needs to implement cPins");
374
375} // namespace fiber
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
Definition cPin.hpp:295
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
STL namespace.