Control Surface  1.1.1
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 
19 template <class Sender>
21  protected:
24  int16_t multiplier, uint8_t pulsesPerStep,
25  const Sender &sender)
26  : encoder{pins.A, pins.B}, address(address),
29 
30  public:
31  void begin() override {}
32  void update() override {
33  long currentPosition = getValue();
34  if (currentPosition != previousPosition) {
35  sender.send(currentPosition, address);
36  previousPosition = currentPosition;
37  }
38  }
39 
41  auto maxval = (1 << Sender::precision()) - 1;
42  noInterrupts();
43  auto rawval = encoder.read() * multiplier / pulsesPerStep;
44  noInterrupts(); // encoder.read() enables interrupts :(
45  auto val = constrain(rawval, 0, maxval);
46  if (val != rawval)
47  encoder.write(val * pulsesPerStep / multiplier);
48  interrupts();
49  return val;
50  }
51 
52  private:
53  Encoder encoder;
55  const int16_t multiplier;
56  const uint8_t pulsesPerStep;
57  long previousPosition = 0;
58 
59  public:
60  Sender sender;
61 };
62 
AH::Updatable<>
MIDIAbsoluteEncoder::address
const MIDICNChannelAddress address
Definition: MIDIAbsoluteEncoder.hpp:54
MIDIAbsoluteEncoder::sender
Sender sender
Definition: MIDIAbsoluteEncoder.hpp:60
MIDIOutputElement.hpp
Def.hpp
MIDIAbsoluteEncoder::update
void update() override
Update this updatable.
Definition: MIDIAbsoluteEncoder.hpp:32
BEGIN_CS_NAMESPACE
#define BEGIN_CS_NAMESPACE
Definition: Settings/NamespaceSettings.hpp:9
MIDIAbsoluteEncoder::previousPosition
long previousPosition
Definition: MIDIAbsoluteEncoder.hpp:57
MIDIAbsoluteEncoder
An abstract class for rotary encoders that send absolute MIDI events.
Definition: MIDIAbsoluteEncoder.hpp:20
END_CS_NAMESPACE
#define END_CS_NAMESPACE
Definition: Settings/NamespaceSettings.hpp:10
EncoderPinList::B
uint8_t B
The pin connected to the B pin of the encoder.
Definition: Def.hpp:46
MIDICNChannelAddress
A type-safe utility class for saving a MIDI address consisting of a 7-bit address,...
Definition: MIDICNChannelAddress.hpp:82
MIDIAbsoluteEncoder::begin
void begin() override
Initialize this updatable.
Definition: MIDIAbsoluteEncoder.hpp:31
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:55
EncoderPinList::A
uint8_t A
The pin connected to the A pin of the encoder.
Definition: Def.hpp:45
MIDIAbsoluteEncoder::pulsesPerStep
const uint8_t pulsesPerStep
Definition: MIDIAbsoluteEncoder.hpp:56
EncoderPinList
A struct for the pins of a rotary (quadrature) encoder without a switch.
Definition: Def.hpp:44
MIDIAbsoluteEncoder::encoder
Encoder encoder
Definition: MIDIAbsoluteEncoder.hpp:53
MIDIAbsoluteEncoder::MIDIAbsoluteEncoder
MIDIAbsoluteEncoder(const EncoderPinList &pins, const MIDICNChannelAddress &address, int16_t multiplier, uint8_t pulsesPerStep, const Sender &sender)
Definition: MIDIAbsoluteEncoder.hpp:22
MIDIAbsoluteEncoder::getValue
analog_t getValue()
Definition: MIDIAbsoluteEncoder.hpp:40