muwerk mupplet Display Library
muwerk applets; mupplets: functional units that support specific hardware or reusable applications
Loading...
Searching...
No Matches
display_digits_max72xx.h
1// display_digits_max72xx.h - mupplet for 7 segment digits display using MAX72xx
2
3#pragma once
4
5#include "muwerk.h"
6#include "helper/light_controller.h"
7#include "helper/mup_display.h"
8#include "hardware/max72xx_digits.h"
9
10namespace ustd {
11
12class DisplayDigitsMAX72XX : public MuppletDisplay {
13 public:
14 static const char *version; // = "0.1.0";
15
16 private:
17 // hardware configuration
18 Max72xxDigits display;
19
20 // runtime
21 LightController light;
22
23 public:
34 DisplayDigitsMAX72XX(String name, uint8_t csPin, uint8_t hDisplays = 1, uint8_t vDisplays = 1,
35 uint8_t length = 8)
36 : MuppletDisplay(name, 0), display(csPin, hDisplays, vDisplays, length) {
37 }
38
44 void begin(Scheduler *_pSched, bool initialState = false) {
45 pSched = _pSched;
46 tID = pSched->add([this]() { this->loop(); }, name, 80000L);
47
48 pSched->subscribe(tID, name + "/display/#", [this](String topic, String msg, String orig) {
49 this->commandParser(topic.substring(name.length() + 9), msg, name + "/display");
50 });
51 pSched->subscribe(tID, name + "/light/#", [this](String topic, String msg, String orig) {
52 this->light.commandParser(topic.substring(name.length() + 7), msg);
53 });
54
55 // initialize default values
56 current_font = 0;
57#ifdef USTD_FEATURE_PROGRAMPLAYER
58 programInit();
59#endif
60 // prepare hardware
61 display.begin();
62 display.setTextWrap(false);
63
64 // start light controller
65 light.begin([this](bool state, double level, bool control,
66 bool notify) { this->onLightControl(state, level, control, notify); },
67 initialState);
68 }
69
70 private:
71 void loop() {
72 light.loop();
73#ifdef USTD_FEATURE_PROGRAMPLAYER
74 programLoop();
75#endif
76 }
77
78 void onLightControl(bool state, double level, bool control, bool notify) {
79 uint8_t intensity = (level * 15000) / 1000;
80 if (control) {
81 display.setIntensity(intensity);
82 }
83 if (control) {
84 display.setPowerSave(!state);
85 }
86 if (notify) {
87 pSched->publish(name + "/light/unitbrightness", String(level, 3));
88 pSched->publish(name + "/light/state", state ? "on" : "off");
89 }
90 }
91
92 virtual void getDimensions(int16_t &width, int16_t &height) {
93 width = display.width();
94 height = display.height();
95 }
96
97 virtual bool getTextWrap() {
98 return display.getTextWrap();
99 }
100
101 virtual void setTextWrap(bool wrap) {
102 display.setTextWrap(wrap);
103 }
104
105 virtual FontSize getTextFontSize() {
106 FontSize retVal;
107 retVal.baseLine = 0;
108 retVal.xAdvance = 1;
109 retVal.yAdvance = 1;
110 return retVal;
111 }
112
113 virtual uint8_t getTextFontCount() {
114 return 1;
115 }
116
117 virtual void setTextFont(uint8_t font, int16_t baseLineAdjustment) {
118 }
119
120 virtual void setTextColor(uint16_t fg, uint16_t bg) {
121 }
122
123 virtual void getCursor(int16_t &x, int16_t &y) {
124 x = display.getCursorX();
125 y = display.getCursorY();
126 }
127
128 virtual void setCursor(int16_t x, int16_t y) {
129 display.setCursor(x, y);
130 }
131
132 virtual void displayClear(int16_t x, int16_t y, int16_t w, int16_t h) {
133 display.fillRect(x, y, w, h);
134 display.write();
135 }
136
137 virtual void displayClear(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t bg) {
138 display.fillRect(x, y, w, h);
139 display.write();
140 }
141
142 virtual void displayPrint(String content, bool ln = false) {
143 if (ln) {
144 display.println(content);
145 } else {
146 display.print(content);
147 }
148 display.write();
149 }
150
151 virtual bool displayFormat(int16_t x, int16_t y, int16_t w, int16_t align, String content,
152 uint8_t font, uint16_t color, uint16_t bg) {
153 bool ret = display.printFormatted(x, y, w, align, content);
154 display.write();
155 return ret;
156 }
157
158#ifdef USTD_FEATURE_PROGRAMPLAYER
159 virtual bool initNextCharDimensions(ProgramItem &item) {
160 while (charPos < item.content.length()) {
161 charX = display.getCharLen(item.content[charPos], false);
162 charY = 1;
163 if (charX) {
164 if (item.content[charPos] == ' ') {
165 lastPos += charX;
166 } else {
167 return true;
168 }
169 } else if (item.content[charPos] == ' ') {
170 lastPos += charX;
171 }
172 // char is not printable
173 ++charPos;
174 }
175 // end of string
176 return false;
177 }
178#endif
179};
180
181const char *DisplayDigitsMAX72XX::version = "0.1.0";
182
183} // namespace ustd
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
void setIntensity(uint8_t intensity)
Definition: max72xx_digits.h:133
uint8_t getCharLen(unsigned char c, bool firstChar=false)
Definition: max72xx_digits.h:350
bool getTextWrap() const
Definition: max72xx_digits.h:328
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 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 setTextWrap(bool w)
Definition: max72xx_digits.h:172
void setPowerSave(bool powersave)
Definition: max72xx_digits.h:126
The base class for all display mupplets.
Definition: mup_display.h:24
The muwerk namespace.
Definition: display_digits_max72xx.h:10