Control Surface  1.1.1
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 (ExtendedIOElement &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, uint8_t mode) {
37  if (pin == NO_PIN)
38  return;
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, uint8_t mode) { pinMode((pin_t)pin, mode); }
47 
48 void digitalWrite(pin_t pin, uint8_t val) {
49  if (pin == NO_PIN)
50  return;
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, uint8_t val) { digitalWrite((pin_t)pin, val); }
59 
60 int digitalRead(pin_t pin) {
61  if (pin == NO_PIN)
62  return 0;
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 
73 void shiftOut(pin_t dataPin, pin_t clockPin, uint8_t bitOrder, uint8_t val) {
74  uint8_t i;
75 
76  for (i = 0; i < 8; i++) {
77  if (bitOrder == LSBFIRST)
78  digitalWrite(dataPin, !!(val & (1 << i)));
79  else
80  digitalWrite(dataPin, !!(val & (1 << (7 - i))));
81 
82  digitalWrite(clockPin, HIGH);
83  digitalWrite(clockPin, LOW);
84  }
85 }
86 void shiftOut(int dataPin, int clockPin, uint8_t bitOrder, uint8_t val) {
87  shiftOut((pin_t)dataPin, (pin_t)clockPin, bitOrder, val);
88 }
89 
91  if (pin == NO_PIN)
92  return 0;
93  else if (pin < NUM_DIGITAL_PINS + NUM_ANALOG_INPUTS) {
95  } else {
97  return el.analogRead(pin - el.getStart());
98  }
99  return 0;
100 }
101 analog_t analogRead(int pin) { return analogRead((pin_t)pin); }
102 
103 void analogWrite(pin_t pin, analog_t val) {
104  // DEBUGFN(NAMEDVALUE(pin) << '\t' << NAMEDVALUE(val));
105  if (pin == NO_PIN)
106  return;
107  else if (pin < NUM_DIGITAL_PINS + NUM_ANALOG_INPUTS) {
108 #ifndef ESP32
109  ::analogWrite(pin, val);
110 #endif
111  } else {
113  el.analogWrite(pin - el.getStart(), val);
114  }
115 }
116 void analogWrite(int pin, analog_t val) { analogWrite((pin_t)pin, val); }
117 void analogWrite(int pin, int val) { analogWrite((pin_t)pin, (analog_t)val); }
118 void analogWrite(pin_t pin, int val) { analogWrite(pin, (analog_t)val); }
119 
120 } // namespace ExtIO
121 
123 
AH::ExtendedIOElement::analogWrite
virtual void analogWrite(pin_t pin, analog_t val)=0
Write an analog (or PWM) value to the given pin.
AH::ExtIO::pinMode
void pinMode(int pin, uint8_t mode)
An ExtIO version of the Arduino function.
Definition: ExtendedInputOutput.cpp:46
Warnings.hpp
AH::ExtendedIOElement::digitalRead
virtual int digitalRead(pin_t pin)=0
Read the state of the given pin.
AH::ExtendedIOElement::digitalWrite
virtual void digitalWrite(pin_t pin, uint8_t state)=0
Set the output of the given pin to the given state.
AH::ExtIO::analogWrite
void analogWrite(pin_t pin, int val)
An ExtIO version of the Arduino function.
Definition: ExtendedInputOutput.cpp:118
Error.hpp
AH::pin_t
uint16_t pin_t
The type for Arduino pins (and ExtendedIOElement pins).
Definition: Hardware-Types.hpp:17
AH::ExtendedIOElement::analogRead
virtual analog_t analogRead(pin_t pin)=0
Read the analog value of the given pin.
ExtendedInputOutput.hpp
AH_DIAGNOSTIC_POP
#define AH_DIAGNOSTIC_POP()
Definition: Warnings.hpp:17
AH::ExtendedIOElement
An abstract base class for Extended Input/Output elements.
Definition: ExtendedIOElement.hpp:62
HIGH
const uint8_t HIGH
Definition: ExtendedInputOutput.hpp:46
FATAL_ERROR
#define FATAL_ERROR(msg, errc)
Print the error message and error code, and stop the execution.
Definition: Error.hpp:60
AH::ExtIO::digitalWrite
void digitalWrite(int pin, uint8_t val)
An ExtIO version of the Arduino function.
Definition: ExtendedInputOutput.cpp:58
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:49
AH::ExtIO::getIOElementOfPin
ExtendedIOElement & getIOElementOfPin(pin_t pin)
Find the IO element of a given extended IO pin number.
Definition: ExtendedInputOutput.cpp:17
LOW
const uint8_t LOW
Definition: ExtendedInputOutput.hpp:47
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:101
AH::ExtIO::shiftOut
void shiftOut(int dataPin, int clockPin, uint8_t bitOrder, uint8_t val)
An ExtIO version of the Arduino function.
Definition: ExtendedInputOutput.cpp:86
MIDI_Notes::F
constexpr int8_t F
Definition: Notes.hpp:23
AH::ExtendedIOElement::pinMode
virtual void pinMode(pin_t pin, uint8_t mode)=0
Set the mode of a given pin.
AH_DIAGNOSTIC_WERROR
#define AH_DIAGNOSTIC_WERROR()
Definition: Warnings.hpp:16
BEGIN_AH_NAMESPACE
#define BEGIN_AH_NAMESPACE
Definition: AH/Settings/NamespaceSettings.hpp:9
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