Control Surface  1.2.0
MIDI Control Surface library for Arduino
MIDIAbsoluteEncoder.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #if not defined(Encoder_h_) && not defined(IDE)
4 #error \
5  "The PJRC Encoder library should be included before the Control-Surface " \
6  "library. (#include <Encoder.h>)"
7 #endif
8 
9 #include <Def/Def.hpp>
10 #include <Encoder.h>
12 
14 
16 
21 template <class Sender>
23  protected:
25  const MIDIAddress &address,
26  int16_t multiplier, uint8_t pulsesPerStep,
27  const Sender &sender)
28  : encoder{pins.A, pins.B}, address(address),
29  multiplier(multiplier),
30  pulsesPerStep(pulsesPerStep), sender(sender) {}
31 
32  public:
33  void begin() override {}
34  void update() override {
35  long currentPosition = getValue();
36  if (currentPosition != previousPosition) {
37  sender.send(currentPosition, address);
38  previousPosition = currentPosition;
39  }
40  }
41 
43  auto maxval = (1 << Sender::precision()) - 1;
44  noInterrupts();
45  auto rawval = encoder.read() * multiplier / pulsesPerStep;
46  noInterrupts(); // encoder.read() enables interrupts :(
47  auto val = constrain(rawval, 0, maxval);
48  if (val != rawval)
49  encoder.write(val * pulsesPerStep / multiplier);
50  interrupts();
51  return val;
52  }
53 
54  private:
55  Encoder encoder;
57  const int16_t multiplier;
58  const uint8_t pulsesPerStep;
59  long previousPosition = 0;
60 
61  public:
62  Sender sender;
63 };
64 
66 
MIDIAddress
A type-safe utility class for saving a MIDI address consisting of a 7-bit address,...
Definition: MIDIAddress.hpp:91
AH::Updatable<>
MIDIAbsoluteEncoder::address
const MIDIAddress address
Definition: MIDIAbsoluteEncoder.hpp:56
MIDIAbsoluteEncoder::MIDIAbsoluteEncoder
MIDIAbsoluteEncoder(const EncoderPinList &pins, const MIDIAddress &address, int16_t multiplier, uint8_t pulsesPerStep, const Sender &sender)
Definition: MIDIAbsoluteEncoder.hpp:24
EncoderPinList::A
uint8_t A
The pin connected to the A pin of the encoder.
Definition: Def.hpp:45
MIDIAbsoluteEncoder::sender
Sender sender
Definition: MIDIAbsoluteEncoder.hpp:62
MIDIOutputElement.hpp
Def.hpp
MIDIAbsoluteEncoder::update
void update() override
Update this updatable.
Definition: MIDIAbsoluteEncoder.hpp:34
BEGIN_CS_NAMESPACE
#define BEGIN_CS_NAMESPACE
Definition: Settings/NamespaceSettings.hpp:9
AH_DIAGNOSTIC_POP
#define AH_DIAGNOSTIC_POP()
Definition: Warnings.hpp:36
MIDIAbsoluteEncoder
An abstract class for rotary encoders that send absolute MIDI events.
Definition: MIDIAbsoluteEncoder.hpp:22
END_CS_NAMESPACE
#define END_CS_NAMESPACE
Definition: Settings/NamespaceSettings.hpp:10
EncoderPinList
A struct for the pins of a rotary (quadrature) encoder without a switch.
Definition: Def.hpp:44
MIDIAbsoluteEncoder::begin
void begin() override
Initialize this updatable.
Definition: MIDIAbsoluteEncoder.hpp:33
AH::analog_t
uint16_t analog_t
The type returned from analogRead and similar functions.
Definition: Hardware-Types.hpp:15
MIDIAbsoluteEncoder::multiplier
const int16_t multiplier
Definition: MIDIAbsoluteEncoder.hpp:57
MIDIAbsoluteEncoder::pulsesPerStep
const uint8_t pulsesPerStep
Definition: MIDIAbsoluteEncoder.hpp:58
AH_DIAGNOSTIC_WERROR
#define AH_DIAGNOSTIC_WERROR()
Definition: Warnings.hpp:35
MIDIAbsoluteEncoder::encoder
Encoder encoder
Definition: MIDIAbsoluteEncoder.hpp:55
MIDIAbsoluteEncoder::getValue
analog_t getValue()
Definition: MIDIAbsoluteEncoder.hpp:42
EncoderPinList::B
uint8_t B
The pin connected to the B pin of the encoder.
Definition: Def.hpp:46