Control Surface  1.1.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 (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  // DEBUGFN(DEBUGVAR(pin) << '\t' << DEBUGVAR(mode));
38  if (pin < NUM_DIGITAL_PINS + NUM_ANALOG_INPUTS) {
39  ::pinMode(pin, mode);
40  } else {
42  el.pinMode(pin - el.getStart(), mode);
43  }
44 }
45 void pinMode(int pin, uint8_t mode) { pinMode((pin_t)pin, mode); }
46 
47 void digitalWrite(pin_t pin, uint8_t val) {
48  // DEBUGFN(DEBUGVAR(pin) << '\t' << DEBUGVAR(val));
49  if (pin < NUM_DIGITAL_PINS + NUM_ANALOG_INPUTS) {
50  ::digitalWrite(pin, val);
51  } else {
53  el.digitalWrite(pin - el.getStart(), val);
54  }
55 }
56 void digitalWrite(int pin, uint8_t val) { digitalWrite((pin_t)pin, val); }
57 
58 int digitalRead(pin_t pin) {
59  if (pin < NUM_DIGITAL_PINS + NUM_ANALOG_INPUTS) {
61  } else {
63  return el.digitalRead(pin - el.getStart());
64  }
65  return 0;
66 }
67 int digitalRead(int pin) { return digitalRead((pin_t)pin); }
68 
69 void shiftOut(pin_t dataPin, pin_t clockPin, uint8_t bitOrder, uint8_t val) {
70  uint8_t i;
71 
72  for (i = 0; i < 8; i++) {
73  if (bitOrder == LSBFIRST)
74  digitalWrite(dataPin, !!(val & (1 << i)));
75  else
76  digitalWrite(dataPin, !!(val & (1 << (7 - i))));
77 
78  digitalWrite(clockPin, HIGH);
79  digitalWrite(clockPin, LOW);
80  }
81 }
82 void shiftOut(int dataPin, int clockPin, uint8_t bitOrder, uint8_t val) {
83  shiftOut((pin_t)dataPin, (pin_t)clockPin, bitOrder, val);
84 }
85 
87  if (pin < NUM_DIGITAL_PINS + NUM_ANALOG_INPUTS) {
89  } else {
91  return el.analogRead(pin - el.getStart());
92  }
93  return 0;
94 }
95 analog_t analogRead(int pin) { return analogRead((pin_t)pin); }
96 
97 void analogWrite(pin_t pin, analog_t val) {
98  // DEBUGFN(DEBUGVAR(pin) << '\t' << DEBUGVAR(val));
99  if (pin < NUM_DIGITAL_PINS + NUM_ANALOG_INPUTS) {
100 #ifndef ESP32
101  ::analogWrite(pin, val);
102 #endif
103  } else {
105  el.analogWrite(pin - el.getStart(), val);
106  }
107 }
108 void analogWrite(int pin, analog_t val) { analogWrite((pin_t)pin, val); }
109 void analogWrite(int pin, int val) { analogWrite((pin_t)pin, (analog_t)val); }
110 void analogWrite(pin_t pin, int val) { analogWrite(pin, (analog_t)val); }
111 
112 } // namespace ExtIO
113 
115 
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:82
AH::ExtIO::pinMode
void pinMode(int pin, uint8_t mode)
An ExtIO version of the Arduino function.
Definition: ExtendedInputOutput.cpp:45
Warnings.hpp
Error.hpp
AH::ExtIO::analogWrite
void analogWrite(pin_t pin, int val)
An ExtIO version of the Arduino function.
Definition: ExtendedInputOutput.cpp:110
AH::analog_t
uint16_t analog_t
The type returned from analogRead and similar functions.
Definition: Hardware-Types.hpp:15
ExtendedInputOutput.hpp
AH::ExtIO::analogRead
analog_t analogRead(int pin)
An ExtIO version of the Arduino function.
Definition: ExtendedInputOutput.cpp:95
AH_DIAGNOSTIC_POP
#define AH_DIAGNOSTIC_POP()
Definition: Warnings.hpp:17
AH::ExtendedIOElement::analogRead
virtual analog_t analogRead(pin_t pin)=0
Read the analog value of the given pin.
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::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
LOW
const uint8_t LOW
Definition: ExtendedInputOutput.hpp:47
AH::ExtIO::getIOElementOfPin
ExtendedIOElement & getIOElementOfPin(pin_t pin)
Find the IO element of a given extended IO pin number.
Definition: ExtendedInputOutput.cpp:17
AH::ExtendedIOElement::digitalRead
virtual int digitalRead(pin_t pin)=0
Read the state of the given pin.
AH::pin_t
uint16_t pin_t
The type for Arduino pins (and ExtendedIOElement pins).
Definition: Hardware-Types.hpp:17
AH::ExtIO::digitalWrite
void digitalWrite(int pin, uint8_t val)
An ExtIO version of the Arduino function.
Definition: ExtendedInputOutput.cpp:56
AH::ExtendedIOElement::pinMode
virtual void pinMode(pin_t pin, uint8_t mode)=0
Set the mode of a given pin.
AH::ExtIO::digitalRead
int digitalRead(int pin)
An ExtIO version of the Arduino function.
Definition: ExtendedInputOutput.cpp:67
AH_DIAGNOSTIC_WERROR
#define AH_DIAGNOSTIC_WERROR()
Definition: Warnings.hpp:16
AH::ExtendedIOElement::analogWrite
virtual void analogWrite(pin_t pin, analog_t val)=0
Write an analog (or PWM) value to the given pin.
BEGIN_AH_NAMESPACE
#define BEGIN_AH_NAMESPACE
Definition: AH/Settings/NamespaceSettings.hpp:9
AH::ExtendedIOElement::digitalWrite
virtual void digitalWrite(pin_t pin, uint8_t state)=0
Set the output of the given pin to the given state.
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
MIDI_Notes::F
constexpr int8_t F
Definition: Notes.hpp:23