Control Surface  1.2.0
MIDI Control Surface library for Arduino
ExtendedInputOutput.cpp
Go to the documentation of this file.
2 AH_DIAGNOSTIC_WERROR() // Enable errors on warnings
3 
4 #include "ExtendedIOElement.hpp"
6 #include <AH/Error/Error.hpp>
7 
9 
10 namespace ExtIO {
11 
12 template <class T>
13 bool inRange(T target, T start, T end) {
14  return target >= start && target < end;
15 }
16 
18  for (auto &el : ExtendedIOElement::getAll())
19  if (pin < el.getStart())
20  break;
21  else if (inRange(pin, el.getStart(), el.getEnd()))
22  return el;
23 
25  F("The given pin does not correspond to an Extended IO element."),
26  0x8888);
27 
28  // TODO: why doesn't this give a compilation error?
29  // No return statement. On desktop, FATAL_ERROR throws an exception, so
30  // I get why that works, but on Arduino, it just calls fatalErrorExit, which
31  // is marked 'noreturn'. However, if I remove the 'noreturn' attribute, and
32  // have it return immediately, it still compiles, without returning a valid
33  // reference.
34 }
35 
36 void pinMode(pin_t pin, PinMode_t mode) {
37  if (pin == NO_PIN)
38  return; // LCOV_EXCL_LINE
39  else if (pin < NUM_DIGITAL_PINS + NUM_ANALOG_INPUTS) {
40  ::pinMode(pin, mode);
41  } else {
43  el.pinMode(pin - el.getStart(), mode);
44  }
45 }
46 void pinMode(int pin, PinMode_t mode) { pinMode((pin_t)pin, mode); }
47 
48 void digitalWrite(pin_t pin, PinStatus_t val) {
49  if (pin == NO_PIN)
50  return; // LCOV_EXCL_LINE
51  else if (pin < NUM_DIGITAL_PINS + NUM_ANALOG_INPUTS) {
52  ::digitalWrite(pin, val);
53  } else {
55  el.digitalWrite(pin - el.getStart(), val);
56  }
57 }
58 void digitalWrite(int pin, PinStatus_t val) { digitalWrite((pin_t)pin, val); }
59 
60 int digitalRead(pin_t pin) {
61  if (pin == NO_PIN)
62  return 0; // LCOV_EXCL_LINE
63  else if (pin < NUM_DIGITAL_PINS + NUM_ANALOG_INPUTS) {
65  } else {
67  return el.digitalRead(pin - el.getStart());
68  }
69  return 0;
70 }
71 int digitalRead(int pin) { return digitalRead((pin_t)pin); }
72 
74  if (pin == NO_PIN)
75  return 0; // LCOV_EXCL_LINE
76  else if (pin < NUM_DIGITAL_PINS + NUM_ANALOG_INPUTS) {
78  } else {
80  return el.analogRead(pin - el.getStart());
81  }
82  return 0;
83 }
84 analog_t analogRead(int pin) { return analogRead((pin_t)pin); }
85 
86 void analogWrite(pin_t pin, analog_t val) {
87  if (pin == NO_PIN)
88  return; // LCOV_EXCL_LINE
89  else if (pin < NUM_DIGITAL_PINS + NUM_ANALOG_INPUTS) {
90 #ifndef ESP32
91  ::analogWrite(pin, val);
92 #endif
93  } else {
95  el.analogWrite(pin - el.getStart(), val);
96  }
97 }
98 void analogWrite(int pin, analog_t val) { analogWrite((pin_t)pin, val); }
99 void analogWrite(int pin, int val) { analogWrite((pin_t)pin, (analog_t)val); }
100 void analogWrite(pin_t pin, int val) { analogWrite(pin, (analog_t)val); }
101 
102 void pinModeBuffered(pin_t pin, PinMode_t mode) {
103  if (pin == NO_PIN)
104  return; // LCOV_EXCL_LINE
105  else if (pin < NUM_DIGITAL_PINS + NUM_ANALOG_INPUTS) {
106  ::pinMode(pin, mode);
107  } else {
109  el.pinModeBuffered(pin - el.getStart(), mode);
110  }
111 }
112 void pinModeBuffered(int pin, PinMode_t mode) {
113  pinModeBuffered((pin_t)pin, mode);
114 }
115 
117  if (pin == NO_PIN)
118  return; // LCOV_EXCL_LINE
119  else if (pin < NUM_DIGITAL_PINS + NUM_ANALOG_INPUTS) {
120  ::digitalWrite(pin, val);
121  } else {
123  el.digitalWriteBuffered(pin - el.getStart(), val);
124  }
125 }
126 void digitalWriteBuffered(int pin, PinStatus_t val) {
127  digitalWriteBuffered((pin_t)pin, val);
128 }
129 
131  if (pin == NO_PIN)
132  return 0; // LCOV_EXCL_LINE
133  else if (pin < NUM_DIGITAL_PINS + NUM_ANALOG_INPUTS) {
135  } else {
137  return el.digitalReadBuffered(pin - el.getStart());
138  }
139  return 0;
140 }
141 int digitalReadBuffered(int pin) { return digitalReadBuffered((pin_t)pin); }
142 
144  if (pin == NO_PIN)
145  return 0; // LCOV_EXCL_LINE
146  else if (pin < NUM_DIGITAL_PINS + NUM_ANALOG_INPUTS) {
147  return ::analogRead(pin);
148  } else {
150  return el.analogReadBuffered(pin - el.getStart());
151  }
152  return 0;
153 }
155 
157  if (pin == NO_PIN)
158  return; // LCOV_EXCL_LINE
159  else if (pin < NUM_DIGITAL_PINS + NUM_ANALOG_INPUTS) {
160 #ifndef ESP32
161  ::analogWrite(pin, val);
162 #endif
163  } else {
165  el.analogWriteBuffered(pin - el.getStart(), val);
166  }
167 }
168 void analogWriteBuffered(int pin, analog_t val) {
169  analogWriteBuffered((pin_t)pin, val);
170 }
171 void analogWriteBuffered(int pin, int val) {
172  analogWriteBuffered((pin_t)pin, (analog_t)val);
173 }
174 void analogWriteBuffered(pin_t pin, int val) {
175  analogWriteBuffered(pin, (analog_t)val);
176 }
177 
178 void shiftOut(pin_t dataPin, pin_t clockPin, BitOrder_t bitOrder, uint8_t val) {
179  uint8_t i;
180 
181  for (i = 0; i < 8; i++) {
182  if (bitOrder == LSBFIRST)
183  digitalWrite(dataPin, (val & (1 << i)) ? HIGH : LOW);
184  else
185  digitalWrite(dataPin, (val & (1 << (7 - i))) ? HIGH : LOW);
186 
187  digitalWrite(clockPin, HIGH);
188  digitalWrite(clockPin, LOW);
189  }
190 }
191 void shiftOut(int dataPin, int clockPin, BitOrder_t bitOrder, uint8_t val) {
192  shiftOut((pin_t)dataPin, (pin_t)clockPin, bitOrder, val);
193 }
194 
195 } // namespace ExtIO
196 
198 
LOW
const PinStatus_t LOW
Definition: ExtendedInputOutput.hpp:57
AH::ExtIO::pinModeBuffered
void pinModeBuffered(int pin, PinMode_t mode)
A buffered ExtIO version of the Arduino function.
Definition: ExtendedInputOutput.cpp:112
Warnings.hpp
AH::ExtIO::analogWrite
void analogWrite(pin_t pin, int val)
An ExtIO version of the Arduino function.
Definition: ExtendedInputOutput.cpp:100
Error.hpp
AH::pin_t
uint16_t pin_t
The type for Arduino pins (and ExtendedIOElement pins).
Definition: Hardware-Types.hpp:17
AH::ExtendedIOElement::digitalWrite
virtual void digitalWrite(pin_t pin, PinStatus_t state)
Set the output of the given pin to the given state.
Definition: ExtendedIOElement.hpp:111
AH::ExtendedIOElement::analogReadBuffered
virtual analog_t analogReadBuffered(pin_t pin)=0
Read the analog value of the given pin from the software buffer.
ExtendedInputOutput.hpp
AH::ExtendedIOElement::analogWrite
virtual void analogWrite(pin_t pin, analog_t val)
Write an analog (or PWM) value to the given pin.
Definition: ExtendedIOElement.hpp:151
AH_DIAGNOSTIC_POP
#define AH_DIAGNOSTIC_POP()
Definition: Warnings.hpp:36
AH::ExtendedIOElement
An abstract base class for Extended Input/Output elements.
Definition: ExtendedIOElement.hpp:63
AH::ExtIO::analogReadBuffered
analog_t analogReadBuffered(int pin)
A buffered ExtIO version of the Arduino function.
Definition: ExtendedInputOutput.cpp:154
FATAL_ERROR
#define FATAL_ERROR(msg, errc)
Print the error message and error code, and stop the execution.
Definition: Error.hpp:60
HIGH
const PinStatus_t HIGH
Definition: ExtendedInputOutput.hpp:56
AH::ExtendedIOElement::analogRead
virtual analog_t analogRead(pin_t pin)
Read the analog value of the given pin.
Definition: ExtendedIOElement.hpp:171
AH::ExtendedIOElement::pinModeBuffered
virtual void pinModeBuffered(pin_t pin, PinMode_t mode)=0
Set the mode of a given pin in the software buffer.
AH::ExtIO::digitalRead
int digitalRead(int pin)
An ExtIO version of the Arduino function.
Definition: ExtendedInputOutput.cpp:71
AH::ExtendedIOElement::getStart
pin_t getStart() const
Get the smallest global extended IO pin number that belongs to this extended IO element.
Definition: ExtendedIOElement.cpp:53
PinStatus_t
uint8_t PinStatus_t
Definition: ExtendedInputOutput.hpp:48
AH::ExtendedIOElement::pinMode
virtual void pinMode(pin_t pin, PinMode_t mode)
Set the mode of a given pin.
Definition: ExtendedIOElement.hpp:90
AH::ExtIO::getIOElementOfPin
ExtendedIOElement & getIOElementOfPin(pin_t pin)
Find the IO element of a given extended IO pin number.
Definition: ExtendedInputOutput.cpp:17
AH::NO_PIN
constexpr pin_t NO_PIN
A special pin number that indicates an unused or invalid pin.
Definition: Hardware-Types.hpp:24
AH::analog_t
uint16_t analog_t
The type returned from analogRead and similar functions.
Definition: Hardware-Types.hpp:15
AH::ExtIO::analogRead
analog_t analogRead(int pin)
An ExtIO version of the Arduino function.
Definition: ExtendedInputOutput.cpp:84
AH::ExtendedIOElement::digitalReadBuffered
virtual int digitalReadBuffered(pin_t pin)=0
Read the state of the given pin from the software buffer.
AH::ExtendedIOElement::digitalRead
virtual int digitalRead(pin_t pin)
Read the state of the given pin.
Definition: ExtendedIOElement.hpp:131
AH::ExtIO::shiftOut
void shiftOut(int dataPin, int clockPin, BitOrder_t bitOrder, uint8_t val)
An ExtIO version of the Arduino function.
Definition: ExtendedInputOutput.cpp:191
AH::ExtIO::analogWriteBuffered
void analogWriteBuffered(pin_t pin, int val)
A buffered ExtIO version of the Arduino function.
Definition: ExtendedInputOutput.cpp:174
AH::ExtIO::pinMode
void pinMode(int pin, PinMode_t mode)
An ExtIO version of the Arduino function.
Definition: ExtendedInputOutput.cpp:46
AH::ExtIO::digitalWriteBuffered
void digitalWriteBuffered(int pin, PinStatus_t val)
A buffered ExtIO version of the Arduino function.
Definition: ExtendedInputOutput.cpp:126
AH::ExtIO::digitalWrite
void digitalWrite(int pin, PinStatus_t val)
An ExtIO version of the Arduino function.
Definition: ExtendedInputOutput.cpp:58
MIDI_Notes::F
constexpr int8_t F
Definition: Notes.hpp:23
BitOrder_t
uint8_t BitOrder_t
Definition: ExtendedInputOutput.hpp:53
AH::ExtendedIOElement::digitalWriteBuffered
virtual void digitalWriteBuffered(pin_t pin, PinStatus_t state)=0
Set the output of a given pin in the software buffer.
AH::ExtIO::digitalReadBuffered
int digitalReadBuffered(int pin)
A buffered ExtIO version of the Arduino function.
Definition: ExtendedInputOutput.cpp:141
AH_DIAGNOSTIC_WERROR
#define AH_DIAGNOSTIC_WERROR()
Definition: Warnings.hpp:35
BEGIN_AH_NAMESPACE
#define BEGIN_AH_NAMESPACE
Definition: AH/Settings/NamespaceSettings.hpp:9
AH::ExtendedIOElement::analogWriteBuffered
virtual void analogWriteBuffered(pin_t pin, analog_t val)=0
Write an analog (or PWM) value to the software buffer given pin.
END_AH_NAMESPACE
#define END_AH_NAMESPACE
Definition: AH/Settings/NamespaceSettings.hpp:10
AH::ExtIO::inRange
bool inRange(T target, T start, T end)
Definition: ExtendedInputOutput.cpp:13
PinMode_t
uint8_t PinMode_t
Definition: ExtendedInputOutput.hpp:49