6#include "mupplet_core.h"
10static const uint8_t digitTable7Seg[] PROGMEM = {
23static const uint8_t charTable7Seg[] PROGMEM = {
52#define MAX72XX_DP B10000000
53#define MAX72XX_SPACE B00000000
54#define MAX72XX_EXCLAMATION B10110000
55#define MAX72XX_QUOTES B00100010
56#define MAX72XX_DASH B00000001
57#define MAX72XX_EQUALS B00001001
58#define MAX72XX_UNDERSCORE B00001000
59#define MAX72XX_PAROPEN B01001110
60#define MAX72XX_PARCLOSE B01111000
79 uint8_t *outputBuffer;
94 Max72xxDigits(uint8_t csPin, uint8_t hDisplays = 1, uint8_t vDisplays = 1, uint8_t length = 8)
95 : driver(csPin, hDisplays * vDisplays), length(length > 8 ? 8 : length) {
96 bitmapSize = hDisplays * vDisplays * length;
97 bitmap = (uint8_t *)malloc(bitmapSize + (hDisplays * vDisplays * 2));
98 outputBuffer = bitmap + bitmapSize;
99 _width = hDisplays * length;
109 if (bitmap !=
nullptr) {
184 void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint8_t pattern = B00000000) {
185 x = x < 0 ? 0 : x >= _width ? _width - 1 : x;
186 y = y < 0 ? 0 : y >= _height ? _height - 1 : y;
187 w = w < 0 ? 0 : w >= _width - x ? _width - x : w;
188 h = h < 0 ? 0 : h >= _height - y ? _height - y : h;
190 for (int16_t yy = y; yy < y + h; yy++) {
191 memset(bitmap + yy * _width + x, pattern, w);
208 bool printFormatted(int16_t x, int16_t y, int16_t w, int16_t align, String content) {
209 uint8_t shadowBuffer[8];
210 x = x < 0 ? 0 : x >= _width ? _width - 1 : x;
211 y = y < 0 ? 0 : y >= _height ? _height - 1 : y;
212 w = w < 0 ? 0 : w >= _width - x ? _width - x : w;
213 memset(bitmap + y * _width + x, B00000000, w);
214 uint8_t *pDst = shadowBuffer;
215 const unsigned char *pSrc = (
unsigned char *)content.c_str();
216 while (pDst < shadowBuffer + 8 && *pSrc) {
219 }
else if (*pSrc ==
'.' || *pSrc ==
',') {
220 if (pDst == shadowBuffer) {
227 *pDst = mapchar(*pSrc);
232 int16_t size = pDst - shadowBuffer;
235 pDst = bitmap + (y * length) + x;
240 memcpy(pDst, shadowBuffer, min(w, size));
242 newx = x + min(w, size);
248 offs = (size - w) / 2;
249 memcpy(pDst, shadowBuffer + offs, w);
250 newx = x + size - offs;
253 offs = (w - size) / 2;
254 memcpy(pDst + offs, shadowBuffer, size);
255 newx = x + size + offs;
263 memcpy(pDst, shadowBuffer + offs, w);
267 memcpy(pDst + offs, shadowBuffer, size);
274 return *pSrc == 0 && size <= w;
284 if (bitmap !=
nullptr) {
285 for (uint8_t digit = 0; digit < length; digit++) {
286 uint16_t endOffset = digit;
287 uint16_t startOffset = bitmapSize + endOffset;
288 uint8_t *pPtr = outputBuffer;
290 startOffset -= length;
292 pPtr[1] = bitmap[startOffset];
294 }
while (startOffset > endOffset);
295 driver.
sendBlock(outputBuffer, pPtr - outputBuffer);
304 if (bitmap !=
nullptr) {
305 memset(bitmap, pattern, length * driver.
getChainLen());
350 uint8_t
getCharLen(
unsigned char c,
bool firstChar =
false) {
353 }
else if (c ==
'.' || c ==
',') {
354 return firstChar ? 1 : 0;
360 uint8_t mapchar(uint8_t c) {
366 return MAX72XX_EXCLAMATION;
368 return MAX72XX_QUOTES;
370 return MAX72XX_SPACE;
374 return MAX72XX_EQUALS;
378 return MAX72XX_PAROPEN;
382 return MAX72XX_PARCLOSE;
384 return MAX72XX_UNDERSCORE;
386 if (c >=
'0' && c <=
'9') {
387 return pgm_read_byte_near(digitTable7Seg + c -
'0');
388 }
else if (c >=
'A' && c <=
'Z') {
389 return pgm_read_byte_near(charTable7Seg + c -
'A');
390 }
else if (c >=
'a' && c <=
'z') {
391 return pgm_read_byte_near(charTable7Seg + c -
'a');
393 return MAX72XX_UNDERSCORE;
397 virtual size_t write(uint8_t c) {
400 }
else if (c ==
'\n') {
404 if (wrap && cursor_x >= _width) {
408 if (cursor_x >= _width || cursor_y >= _height) {
412 if (cursor_x < 0 || cursor_y < 0) {
417 uint8_t index = cursor_y * _width + cursor_x;
420 }
else if (c ==
'.' || c ==
',') {
422 bitmap[index] = MAX72XX_DP;
424 bitmap[index - 1] |= MAX72XX_DP;
428 bitmap[index] = mapchar(c);
The MAX72XX Controller Class.
Definition: max72xx.h:14
void begin()
Definition: max72xx.h:52
@ digit0
Digit 0.
Definition: max72xx.h:24
void setPowerSave(bool powersave)
Definition: max72xx.h:93
void setIntensity(uint8_t intensity)
Definition: max72xx.h:78
uint8_t getChainLen() const
Definition: max72xx.h:64
void setTestMode(bool testmode)
Definition: max72xx.h:104
void sendBlock(uint8_t *buffer, uint8_t size)
Definition: max72xx.h:126
void setScanLimit(uint8_t scanlimit)
Definition: max72xx.h:85
void setDecodeMode(uint8_t mode)
Definition: max72xx.h:71
The MAX72XX Digits Display Class.
Definition: max72xx_digits.h:70
int16_t width() const
Definition: max72xx_digits.h:314
int16_t height() const
Definition: max72xx_digits.h:321
int16_t getCursorY() const
Definition: max72xx_digits.h:342
bool printFormatted(int16_t x, int16_t y, int16_t w, int16_t align, String content)
Definition: max72xx_digits.h:208
Max72xxDigits(uint8_t csPin, uint8_t hDisplays=1, uint8_t vDisplays=1, uint8_t length=8)
Definition: max72xx_digits.h:94
void setIntensity(uint8_t intensity)
Definition: max72xx_digits.h:133
virtual void fillScreen(uint8_t pattern)
Definition: max72xx_digits.h:303
uint8_t getCharLen(unsigned char c, bool firstChar=false)
Definition: max72xx_digits.h:350
bool getTextWrap() const
Definition: max72xx_digits.h:328
void setTestMode(bool testmode)
Definition: max72xx_digits.h:141
void begin()
Definition: max72xx_digits.h:108
int16_t getCursorX() const
Definition: max72xx_digits.h:335
void setCursor(int16_t x, int16_t y)
Definition: max72xx_digits.h:149
void setCursorY(int16_t y)
Definition: max72xx_digits.h:164
void write()
Definition: max72xx_digits.h:283
void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint8_t pattern=B00000000)
Definition: max72xx_digits.h:184
void setCursorX(int16_t x)
Definition: max72xx_digits.h:157
void setTextWrap(bool w)
Definition: max72xx_digits.h:172
void setPowerSave(bool powersave)
Definition: max72xx_digits.h:126
The muwerk namespace.
Definition: display_digits_max72xx.h:10