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