mirror of
https://github.com/DCC-EX/CommandStation-EX.git
synced 2025-07-30 19:03:44 +02:00
Support for multiple displays
Refactor display handling so DisplayInterface class passes the relevant commands to the relevant display objects.
This commit is contained in:
@@ -25,23 +25,75 @@
|
||||
|
||||
// Definition of base class for displays. The base class does nothing.
|
||||
class DisplayInterface : public Print {
|
||||
public:
|
||||
virtual DisplayInterface* loop2(bool force) { (void)force; return NULL; };
|
||||
virtual void setRow(byte line) { (void)line; };
|
||||
virtual void clear() { };
|
||||
virtual size_t write(uint8_t c) { (void)c; return 0; };
|
||||
// Additional functions to support multiple displays.
|
||||
// Display number zero is the default one and the original display
|
||||
// drivers overloaded the above calls only. Newer display drivers
|
||||
// (e.g. HAL IO_OledDisplay) should override all functions.
|
||||
virtual void setRow(uint8_t displayNo, byte line) {
|
||||
if (!displayNo) setRow(line);
|
||||
}
|
||||
virtual void clear(uint8_t displayNo) {
|
||||
if (!displayNo) clear();
|
||||
}
|
||||
protected:
|
||||
static DisplayInterface *_displayHandler;
|
||||
static uint8_t _selectedDisplayNo; // Nothing selected.
|
||||
DisplayInterface *_nextHandler = NULL;
|
||||
uint8_t _displayNo = 0;
|
||||
|
||||
static DisplayInterface *displayHandler;
|
||||
public:
|
||||
// Add display object to list of displays
|
||||
void addDisplay(uint8_t displayNo) {
|
||||
_nextHandler = _displayHandler;
|
||||
_displayHandler = this;
|
||||
_displayNo = displayNo;
|
||||
}
|
||||
static DisplayInterface *getDisplayHandler() {
|
||||
return _displayHandler;
|
||||
}
|
||||
uint8_t getDisplayNo() {
|
||||
return _displayNo;
|
||||
}
|
||||
|
||||
// The next functions are to provide compatibility with calls to the LCD function
|
||||
// which does not specify a display number. These always apply to display '0'.
|
||||
static void refresh() { refresh(0); };
|
||||
static void setRow(uint8_t line) { setRow(0, line); };
|
||||
static void clear() { clear(0); };
|
||||
|
||||
// Additional functions to support multiple displays. These perform a
|
||||
// multicast to all displays that match the selected displayNo.
|
||||
// Display number zero is the default one.
|
||||
static void setRow(uint8_t displayNo, uint8_t line) {
|
||||
_selectedDisplayNo = displayNo;
|
||||
for (DisplayInterface *p = _displayHandler; p!=0; p=p->_nextHandler) {
|
||||
if (displayNo == p->_displayNo) p->_setRow(line);
|
||||
}
|
||||
}
|
||||
size_t write (uint8_t c) override {
|
||||
for (DisplayInterface *p = _displayHandler; p!=0; p=p->_nextHandler)
|
||||
if (_selectedDisplayNo == p->_displayNo) p->_write(c);
|
||||
return _displayHandler ? 1 : 0;
|
||||
}
|
||||
static void clear(uint8_t displayNo) {
|
||||
for (DisplayInterface *p = _displayHandler; p!=0; p=p->_nextHandler)
|
||||
if (displayNo == p->_displayNo) p->_clear();
|
||||
}
|
||||
static void refresh(uint8_t displayNo) {
|
||||
for (DisplayInterface *p = _displayHandler; p!=0; p=p->_nextHandler)
|
||||
if (displayNo == p->_displayNo) p->_refresh();
|
||||
}
|
||||
static void loop() {
|
||||
for (DisplayInterface *p = _displayHandler; p!=0; p=p->_nextHandler)
|
||||
p->_displayLoop();
|
||||
};
|
||||
// The following are overridden within the specific device class
|
||||
virtual void begin() {};
|
||||
virtual size_t _write(uint8_t c) { (void)c; return 0; };
|
||||
virtual void _setRow(uint8_t line) {}
|
||||
virtual void _clear() {}
|
||||
virtual void _refresh() {}
|
||||
virtual void _displayLoop() {}
|
||||
};
|
||||
|
||||
class DisplayDevice {
|
||||
public:
|
||||
virtual bool begin() { return true; }
|
||||
virtual void clearNative() = 0;
|
||||
virtual void setRowNative(uint8_t line) = 0;
|
||||
virtual size_t writeNative(uint8_t c) = 0;
|
||||
virtual bool isBusy() = 0;
|
||||
virtual uint16_t getNumRows() = 0;
|
||||
virtual uint16_t getNumCols() = 0;
|
||||
};
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user