Line data Source code
1 : #include "ExtendedIOElement.hpp"
2 : #include <AH/Error/Error.hpp>
3 : #include <AH/STL/type_traits> // is_unsigned
4 :
5 : BEGIN_AH_NAMESPACE
6 :
7 48 : ExtendedIOElement::ExtendedIOElement(pin_int_t length)
8 48 : : length(length), start(offset), end(offset + length) {
9 48 : if (end > NO_PIN)
10 1 : FATAL_ERROR(F("ExtIO ran out of pin numbers. "
11 : "Dynamically creating new ExtendedIOElements is not "
12 : "recommended."),
13 : 0x00FF);
14 47 : offset = end;
15 48 : }
16 :
17 10 : void ExtendedIOElement::beginAll() {
18 10 : ExtendedIOElement::applyToAll(&ExtendedIOElement::begin);
19 10 : }
20 :
21 1 : void ExtendedIOElement::updateAllBufferedOutputs() {
22 1 : ExtendedIOElement::applyToAll(&ExtendedIOElement::updateBufferedOutputs);
23 1 : }
24 :
25 1 : void ExtendedIOElement::updateAllBufferedInputs() {
26 1 : ExtendedIOElement::applyToAll(&ExtendedIOElement::updateBufferedInputs);
27 1 : }
28 :
29 72 : pin_t ExtendedIOElement::pin(pin_int_t p) const {
30 72 : if (p >= length) {
31 : static_assert(!std::is_integral<pin_t>::value ||
32 : std::is_unsigned<pin_t>::value,
33 : "Error: pin_t should be an unsigned integer type");
34 2 : ERROR(F("Error: the pin number (")
35 : << p
36 : << F(") is greater than the number of pins of this "
37 : "ExtendedIOElement (")
38 : << length << ')',
39 : 0x4567);
40 : return end - 1; // LCOV_EXCL_LINE
41 : }
42 70 : return p + start;
43 : }
44 :
45 1 : pin_t ExtendedIOElement::operator[](pin_int_t p) const { return pin(p); }
46 :
47 1 : pin_int_t ExtendedIOElement::getLength() const { return length; }
48 :
49 90 : pin_t ExtendedIOElement::getEnd() const { return end; }
50 :
51 259 : pin_t ExtendedIOElement::getStart() const { return start; }
52 :
53 80 : DoublyLinkedList<ExtendedIOElement> &ExtendedIOElement::getAll() {
54 80 : return updatables;
55 : }
56 :
57 : pin_t ExtendedIOElement::offset = NUM_DIGITAL_PINS + NUM_ANALOG_INPUTS;
58 :
59 : END_AH_NAMESPACE
|