Control Surface  1.2.0
MIDI Control Surface library for Arduino
MAX7219_Base.hpp
Go to the documentation of this file.
1 /* ✔ */
2 
3 #pragma once
4 
6 AH_DIAGNOSTIC_WERROR() // Enable errors on warnings
7 
8 #include <AH/Hardware/ExtendedInputOutput/ExtendedInputOutput.hpp>
9 
11 #include <SPI.h>
13 
15 
23 class MAX7219_Base {
24  public:
33  MAX7219_Base(pin_t loadPin, uint8_t chainlength = 1)
34  : loadPin(loadPin), chainlength(chainlength) {}
35 
36  static constexpr uint8_t DECODEMODE = 9;
37  static constexpr uint8_t INTENSITY = 10;
38  static constexpr uint8_t SCANLIMIT = 11;
39  static constexpr uint8_t SHUTDOWN = 12;
40  static constexpr uint8_t DISPLAYTEST = 15;
41 
46  void init() {
47  ExtIO::digitalWrite(loadPin, HIGH);
48  ExtIO::pinMode(loadPin, OUTPUT);
49  SPI.begin();
50  sendRawAll(DISPLAYTEST, 0); // Normal operation, no test mode
51  sendRawAll(SCANLIMIT, 7); // Scan all 8 digits
52  sendRawAll(DECODEMODE, 0); // Raw LED addressing
53  sendRawAll(INTENSITY, 0xF); // Maximum intensity
54  clear();
55  sendRawAll(SHUTDOWN, 1); // Enable the display
56  }
57 
61  void clear() {
62  for (uint8_t j = 1; j < 8 + 1; j++)
63  sendRawAll(j, 0);
64  }
65 
76  void send(uint8_t digit, uint8_t value, uint8_t chip = 0) {
77  sendRaw((digit & 0x7) + 1, value, chip);
78  }
79 
111  void sendRowAll(uint8_t digit, const uint8_t *values,
112  uint8_t leading_dim = 1) {
113  uint8_t opcode = (digit & 0x7) + 1;
114  ExtIO::digitalWrite(loadPin, LOW);
115  SPI.beginTransaction(settings);
116  for (uint8_t i = 0; i < chainlength; ++i) {
117  SPI.transfer(opcode);
118  SPI.transfer(values[uint16_t(i) * leading_dim]);
119  }
120  ExtIO::digitalWrite(loadPin, HIGH);
121  SPI.endTransaction();
122  }
123 
142  void sendAll(const uint8_t *values) {
143  for (uint8_t row = 0; row < 8; ++row)
144  sendRowAll(row, values + row, 8);
145  }
146 
155  void sendRawAll(uint8_t opcode, uint8_t value) {
156  ExtIO::digitalWrite(loadPin, LOW);
157  SPI.beginTransaction(settings);
158  for (uint8_t i = 0; i < chainlength; ++i) {
159  SPI.transfer(opcode);
160  SPI.transfer(value);
161  }
162  ExtIO::digitalWrite(loadPin, HIGH);
163  SPI.endTransaction();
164  }
165 
176  void sendRaw(uint8_t opcode, uint8_t value, uint8_t chip = 0) {
177  if (chip >= chainlength)
178  return; // Should I throw an error?
179  ExtIO::digitalWrite(loadPin, LOW);
180  SPI.beginTransaction(settings);
181  uint8_t c = 0;
182  for (; c < chip; c++) {
183  SPI.transfer(0x00); // No-Op
184  SPI.transfer(0x00);
185  }
186  SPI.transfer(opcode);
187  SPI.transfer(value);
188  for (c++; c < chainlength; c++) {
189  SPI.transfer(0x00); // No-Op
190  SPI.transfer(0x00);
191  }
192  ExtIO::digitalWrite(loadPin, HIGH);
193  SPI.endTransaction();
194  }
195 
202  void setIntensity(uint8_t intensity) {
203  sendRawAll(INTENSITY, intensity & 0xF);
204  }
205 
214  void setIntensity(uint8_t intensity, uint8_t chip) {
215  sendRaw(INTENSITY, intensity & 0xF, chip);
216  }
217 
221  uint8_t getChainLength() const {
222  return chainlength;
223  }
224 
225  private:
227  uint8_t chainlength;
228  SPISettings settings = {SPI_MAX_SPEED, MSBFIRST, SPI_MODE0};
229 };
230 
232 
AH::MAX7219_Base::getChainLength
uint8_t getChainLength() const
Get the number of daisy-chained chips.
Definition: MAX7219_Base.hpp:221
LOW
const PinStatus_t LOW
Definition: ExtendedInputOutput.hpp:57
AH::MAX7219_Base
A base class for classes that control MAX7219 LED drivers.
Definition: MAX7219_Base.hpp:23
AH::SPI_MAX_SPEED
constexpr static Frequency SPI_MAX_SPEED
Definition: AH/Settings/Settings.hpp:85
Warnings.hpp
AH::MAX7219_Base::setIntensity
void setIntensity(uint8_t intensity)
Set the intensity of the LEDs of all chips.
Definition: MAX7219_Base.hpp:202
AH::MAX7219_Base::clear
void clear()
Turn off all LEDs.
Definition: MAX7219_Base.hpp:61
AH::MAX7219_Base::sendRaw
void sendRaw(uint8_t opcode, uint8_t value, uint8_t chip=0)
Send a raw opcode and value to the given MAX7219.
Definition: MAX7219_Base.hpp:176
AH::pin_t
uint16_t pin_t
The type for Arduino pins (and ExtendedIOElement pins).
Definition: Hardware-Types.hpp:17
AH::MAX7219_Base::sendRawAll
void sendRawAll(uint8_t opcode, uint8_t value)
Send the same raw opcode and value to all chips in the chain.
Definition: MAX7219_Base.hpp:155
AH_DIAGNOSTIC_POP
#define AH_DIAGNOSTIC_POP()
Definition: Warnings.hpp:36
AH::ExtIO::digitalWrite
void digitalWrite(pin_t pin, PinStatus_t val)
An ExtIO version of the Arduino function.
Definition: ExtendedInputOutput.cpp:48
AH::MAX7219_Base::MAX7219_Base
MAX7219_Base(pin_t loadPin, uint8_t chainlength=1)
Create a MAX7219_Base object.
Definition: MAX7219_Base.hpp:33
AH::MAX7219_Base::loadPin
pin_t loadPin
Definition: MAX7219_Base.hpp:226
HIGH
const PinStatus_t HIGH
Definition: ExtendedInputOutput.hpp:56
OUTPUT
const PinMode_t OUTPUT
Definition: ExtendedInputOutput.hpp:60
AH::MAX7219_Base::setIntensity
void setIntensity(uint8_t intensity, uint8_t chip)
Set the intensity of the LEDs of a specific chip.
Definition: MAX7219_Base.hpp:214
AH_DIAGNOSTIC_EXTERNAL_HEADER
#define AH_DIAGNOSTIC_EXTERNAL_HEADER()
Definition: Warnings.hpp:37
AH::ExtIO::pinMode
void pinMode(pin_t pin, PinMode_t mode)
An ExtIO version of the Arduino function.
Definition: ExtendedInputOutput.cpp:36
AH_DIAGNOSTIC_WERROR
#define AH_DIAGNOSTIC_WERROR()
Definition: Warnings.hpp:35
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::MAX7219_Base::sendRowAll
void sendRowAll(uint8_t digit, const uint8_t *values, uint8_t leading_dim=1)
Send values to the given digit or row, sending a different value for each chip.
Definition: MAX7219_Base.hpp:111
AH::MAX7219_Base::chainlength
uint8_t chainlength
Definition: MAX7219_Base.hpp:227
AH::MAX7219_Base::send
void send(uint8_t digit, uint8_t value, uint8_t chip=0)
Send the value to the given digit or row.
Definition: MAX7219_Base.hpp:76
AH::MAX7219_Base::sendAll
void sendAll(const uint8_t *values)
Send different values to all digits/rows of all chips.
Definition: MAX7219_Base.hpp:142
AH::MAX7219_Base::init
void init()
Initialize the Arduino pins, SPI, and the MAX7219.
Definition: MAX7219_Base.hpp:46