mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-23 02:36:35 +00:00
- for 7 segment displays
- added support for FUNC_DISPLAY_DIM - added new FUNC_DISPLAY_BLINKRATE with new command DisplayBlinkrate Value is not being persistently stored, so no seting req. - added SevensegLog for DisplayMode 1..5 support, displaying the nth sensor value to nth atached 7-segment display. For that unsed display adresses before the first one being used may not be zero, but must be configured to unused addresses (e.g. 0xFF), otherwise driver init will fail.
This commit is contained in:
parent
85dea8bbcc
commit
0747239d4c
@ -63,6 +63,7 @@ const uint8_t DISPLAY_LOG_ROWS = 32; // Number of lines in display log
|
||||
#define D_CMND_DISP_TEXT "Text"
|
||||
#define D_CMND_DISP_WIDTH "Width"
|
||||
#define D_CMND_DISP_HEIGHT "Height"
|
||||
#define D_CMND_DISP_BLINKRATE "Blinkrate"
|
||||
|
||||
enum XdspFunctions { FUNC_DISPLAY_INIT_DRIVER, FUNC_DISPLAY_INIT, FUNC_DISPLAY_EVERY_50_MSECOND, FUNC_DISPLAY_EVERY_SECOND,
|
||||
FUNC_DISPLAY_MODEL, FUNC_DISPLAY_MODE, FUNC_DISPLAY_POWER,
|
||||
@ -70,19 +71,20 @@ enum XdspFunctions { FUNC_DISPLAY_INIT_DRIVER, FUNC_DISPLAY_INIT, FUNC_DISPLAY_E
|
||||
FUNC_DISPLAY_DRAW_HLINE, FUNC_DISPLAY_DRAW_VLINE, FUNC_DISPLAY_DRAW_LINE,
|
||||
FUNC_DISPLAY_DRAW_CIRCLE, FUNC_DISPLAY_FILL_CIRCLE,
|
||||
FUNC_DISPLAY_DRAW_RECTANGLE, FUNC_DISPLAY_FILL_RECTANGLE,
|
||||
FUNC_DISPLAY_TEXT_SIZE, FUNC_DISPLAY_FONT_SIZE, FUNC_DISPLAY_ROTATION, FUNC_DISPLAY_DRAW_STRING };
|
||||
FUNC_DISPLAY_TEXT_SIZE, FUNC_DISPLAY_FONT_SIZE, FUNC_DISPLAY_ROTATION, FUNC_DISPLAY_DRAW_STRING,
|
||||
FUNC_DISPLAY_DIM, FUNC_DISPLAY_BLINKRATE };
|
||||
|
||||
enum DisplayInitModes { DISPLAY_INIT_MODE, DISPLAY_INIT_PARTIAL, DISPLAY_INIT_FULL };
|
||||
|
||||
const char kDisplayCommands[] PROGMEM = D_PRFX_DISPLAY "|" // Prefix
|
||||
"|" D_CMND_DISP_MODEL "|" D_CMND_DISP_WIDTH "|" D_CMND_DISP_HEIGHT "|" D_CMND_DISP_MODE "|" D_CMND_DISP_REFRESH "|"
|
||||
D_CMND_DISP_DIMMER "|" D_CMND_DISP_COLS "|" D_CMND_DISP_ROWS "|" D_CMND_DISP_SIZE "|" D_CMND_DISP_FONT "|"
|
||||
D_CMND_DISP_ROTATE "|" D_CMND_DISP_TEXT "|" D_CMND_DISP_ADDRESS ;
|
||||
D_CMND_DISP_ROTATE "|" D_CMND_DISP_TEXT "|" D_CMND_DISP_ADDRESS "|" D_CMND_DISP_BLINKRATE ;
|
||||
|
||||
void (* const DisplayCommand[])(void) PROGMEM = {
|
||||
&CmndDisplay, &CmndDisplayModel, &CmndDisplayWidth, &CmndDisplayHeight, &CmndDisplayMode, &CmndDisplayRefresh,
|
||||
&CmndDisplayDimmer, &CmndDisplayColumns, &CmndDisplayRows, &CmndDisplaySize, &CmndDisplayFont,
|
||||
&CmndDisplayRotate, &CmndDisplayText, &CmndDisplayAddress };
|
||||
&CmndDisplayRotate, &CmndDisplayText, &CmndDisplayAddress, &CmndDisplayBlinkrate };
|
||||
|
||||
char *dsp_str;
|
||||
|
||||
@ -1410,11 +1412,24 @@ void CmndDisplayDimmer(void)
|
||||
else if (!Settings.display_dimmer && disp_power) {
|
||||
ExecuteCommandPower(disp_device, POWER_OFF, SRC_DISPLAY);
|
||||
}
|
||||
if (renderer) renderer->dim(Settings.display_dimmer);
|
||||
if (renderer)
|
||||
renderer->dim(Settings.display_dimmer);
|
||||
else
|
||||
XdspCall(FUNC_DISPLAY_DIM);
|
||||
}
|
||||
ResponseCmndNumber(Settings.display_dimmer);
|
||||
}
|
||||
|
||||
void CmndDisplayBlinkrate(void)
|
||||
{
|
||||
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 3)) {
|
||||
|
||||
if (!renderer)
|
||||
XdspCall(FUNC_DISPLAY_BLINKRATE);
|
||||
}
|
||||
ResponseCmndNumber(XdrvMailbox.payload);
|
||||
}
|
||||
|
||||
void CmndDisplaySize(void)
|
||||
{
|
||||
if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload <= 4)) {
|
||||
|
@ -62,6 +62,61 @@ void SevensegWrite(void)
|
||||
}
|
||||
}
|
||||
|
||||
void SevensegLog(void)
|
||||
{
|
||||
// get sensor data
|
||||
ResponseClear();
|
||||
ResponseAppendTime();
|
||||
XsnsCall(FUNC_JSON_APPEND);
|
||||
ResponseJsonEnd();
|
||||
|
||||
// display nth sensor value on nth display
|
||||
// code adapted from xdrv_13_display.ino, DisplayAnalyzeJson()
|
||||
uint8_t unit = 0;
|
||||
int16_t valueDecimal = 0;
|
||||
double valueFloat = 0;
|
||||
uint8 fDigits = 0;
|
||||
String jsonStr = TasmotaGlobal.mqtt_data; // Move from stack to heap to fix watchdogs (20180626)
|
||||
JsonParser parser((char*)jsonStr.c_str());
|
||||
JsonParserObject object_root = parser.getRootObject();
|
||||
if (object_root) {
|
||||
for (auto key_level1 : object_root) {
|
||||
JsonParserToken token_level1 = key_level1.getValue();
|
||||
if (token_level1.isObject()) {
|
||||
JsonParserObject object_level1 = token_level1.getObject();
|
||||
for (auto key_level2 : object_level1) {
|
||||
const char* value_level2 = key_level2.getValue().getStr(nullptr);
|
||||
if (value_level2 != nullptr) {
|
||||
if ((unit < sevensegs) && (sevenseg[unit] != nullptr)) {
|
||||
if (strchr( value_level2, '.') == NULL) {
|
||||
sevenseg[unit]->print(atoi(value_level2), DEC);
|
||||
} else {
|
||||
sevenseg[unit]->printFloat(atof(value_level2), 1, DEC);
|
||||
}
|
||||
sevenseg[unit]->writeDisplay();
|
||||
unit++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SevensegDim(void)
|
||||
{
|
||||
for (uint32_t i = 0; i < sevensegs; i++) {
|
||||
sevenseg[i]->setBrightness(Settings.display_dimmer);
|
||||
}
|
||||
}
|
||||
|
||||
void SevensegBlinkrate( void)
|
||||
{
|
||||
for (uint32_t i = 0; i < sevensegs; i++) {
|
||||
sevenseg[i]->blinkRate(XdrvMailbox.payload);
|
||||
}
|
||||
}
|
||||
|
||||
void SevensegClear(void)
|
||||
{
|
||||
for (uint32_t i = 0; i < sevensegs; i++) {
|
||||
@ -352,6 +407,7 @@ void SevensegRefresh(void) // Every second
|
||||
case 4: // Mqtt
|
||||
case 3: // Local
|
||||
case 5: { // Mqtt
|
||||
SevensegLog();
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -396,6 +452,13 @@ bool Xdsp11(uint8_t function)
|
||||
case FUNC_DISPLAY_DRAW_STRING:
|
||||
SevensegDrawStringAt(dsp_x, dsp_y, dsp_str, dsp_color, dsp_flag);
|
||||
break;
|
||||
case FUNC_DISPLAY_DIM:
|
||||
SevensegDim();
|
||||
break;
|
||||
case FUNC_DISPLAY_BLINKRATE:
|
||||
SevensegBlinkrate();
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
return result;
|
||||
|
Loading…
x
Reference in New Issue
Block a user