2021-02-10 16:23:47 +00:00
/*
2021-02-18 17:14:15 +00:00
xdsp_15_tm1637 . ino - Support for TM1637 - and TM1638 - based seven - segment displays for Tasmota
2021-02-10 16:23:47 +00:00
2021-02-17 11:32:36 +00:00
Copyright ( C ) 2021 Ajith Vasudevan
2021-02-10 16:23:47 +00:00
This program is free software : you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation , either version 3 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
2021-02-17 11:32:36 +00:00
# ifdef USE_DISPLAY
# ifdef USE_DISPLAY_TM1637
/*********************************************************************************************\
This driver enables the display of numbers ( both integers and floats ) and basic text
2021-03-18 14:00:50 +00:00
on the inexpensive TM1637 - and TM1638 - based seven - segment modules .
2021-02-18 17:14:15 +00:00
2021-02-16 12:12:49 +00:00
Raw segments can also be displayed .
2021-02-18 17:14:15 +00:00
In addition , it is also possible to set brightness ( 8 levels ) , clear the display , scroll text ,
display a rudimentary bar graph , and a Clock ( 12 hr and 24 hr ) .
2021-02-17 11:32:36 +00:00
2021-02-14 11:22:08 +00:00
To use , compile Tasmota with USE_DISPLAY and USE_DISPLAY_TM1637 , or build the tasmota - display env .
2021-02-22 06:00:11 +00:00
For TM1637 :
Connect the TM1637 display module ' s pins to any free GPIOs of the ESP8266 module
2021-02-14 11:22:08 +00:00
and assign the pins as follows from Tasmota ' s GUI :
2021-02-22 06:00:11 +00:00
DIO hardware pin - - > " TM1637 DIO "
CLK hardware pin - - > " TM1637 CLK "
2021-02-14 11:22:08 +00:00
2021-02-22 06:00:11 +00:00
For TM1638 :
Connect the TM1638 display module ' s pins to any free GPIOs of the ESP8266 module
and assign the pins as follows from Tasmota ' s GUI :
2021-02-14 11:22:08 +00:00
2021-02-22 06:00:11 +00:00
DIO hardware pin - - > " TM1638 DIO "
CLK hardware pin - - > " TM1638 CLK "
STB hardware pin - - > " TM1638 STB "
2021-02-14 11:22:08 +00:00
2021-02-18 17:14:15 +00:00
2021-02-19 13:09:42 +00:00
Once the GPIO configuration is saved and the ESP8266 / ESP32 module restarts , set the Display Model to 15
using the command " DisplayModel 15 "
2021-03-18 14:00:50 +00:00
If your display is a TM1637 with 6 digits , set Display Columns to the number of digits your
display has , using the command " DisplayCols 6 " and restart the ESP module .
2021-02-19 13:09:42 +00:00
After the ESP8266 / ESP32 module restarts again , the following " Display " commands can be used :
2021-02-16 12:12:49 +00:00
2021-02-14 11:22:08 +00:00
DisplayClear
2021-02-17 11:32:36 +00:00
2021-02-16 12:12:49 +00:00
Clears the display , command : " DisplayClear "
2021-02-14 11:22:08 +00:00
2021-02-21 11:17:39 +00:00
DisplayNumber num [ , position { 0 - ( TM1637Data . num_digits - 1 ) ) } [ , leading_zeros { 0 | 1 } [ , length { 1 to TM1637Data . num_digits } ] ] ]
2021-02-17 11:32:36 +00:00
2021-02-16 12:12:49 +00:00
Clears and then displays number without decimal . command e . g . , " DisplayNumber 1234 "
Control ' leading zeros ' , ' length ' and ' position ' with " DisplayNumber 1234, <position>, <leadingZeros>, <length> "
2021-02-21 11:17:39 +00:00
' leading zeros ' can be 1 or 0 ( default ) , ' length ' can be 1 to TM1637Data . num_digits , ' position ' can be 0 ( left - most ) to TM1637Data . num_digits ( right - most ) .
2021-02-16 12:12:49 +00:00
See function description below for more details .
2021-02-21 11:17:39 +00:00
DisplayNumberNC num [ , position { 0 - ( TM1637Data . num_digits - 1 ) ) } [ , leading_zeros { 0 | 1 } [ , length { 1 to TM1637Data . num_digits } ] ] ]
2021-02-16 12:12:49 +00:00
2021-02-14 11:22:08 +00:00
Display integer number as above , but without clearing first . e . g . , " DisplayNumberNC 1234 " . Usage is same as above .
2021-02-16 12:12:49 +00:00
2021-02-21 11:17:39 +00:00
DisplayFloat num [ , position { 0 - ( TM1637Data . num_digits - 1 ) } [ , precision { 0 - TM1637Data . num_digits } [ , length { 1 to TM1637Data . num_digits } ] ] ]
2021-02-16 12:12:49 +00:00
Clears and then displays float ( with decimal point ) command e . g . , " DisplayFloat 12.34 "
2021-02-14 11:22:08 +00:00
See function description below for more details .
2021-02-16 12:12:49 +00:00
2021-02-21 11:17:39 +00:00
DisplayFloatNC num [ , position { 0 - ( TM1637Data . num_digits - 1 ) } [ , precision { 0 - TM1637Data . num_digits } [ , length { 1 to TM1637Data . num_digits } ] ] ]
2021-02-16 12:12:49 +00:00
2021-02-14 11:22:08 +00:00
Displays float ( with decimal point ) as above , but without clearing first . command e . g . , " DisplayFloatNC 12.34 "
See function description below for more details .
2021-02-16 12:12:49 +00:00
2021-02-21 05:04:40 +00:00
DisplayBrightness num { 1 - 8 }
2021-02-16 12:12:49 +00:00
2021-02-21 05:04:40 +00:00
Set brightness ( 1 to 8 ) command e . g . , " DisplayBrightness 2 "
2021-02-16 12:12:49 +00:00
2021-02-21 11:17:39 +00:00
DisplayRaw position { 0 - ( TM1637Data . num_digits - 1 ) } , length { 1 to TM1637Data . num_digits } , num1 [ , num2 [ , num3 [ , num4 [ , . . . upto TM1637Data . num_digits numbers ] ] ] ] ]
2021-02-16 12:12:49 +00:00
2021-02-21 11:17:39 +00:00
Takes upto TM1637Data . num_digits comma - separated integers ( 0 - 255 ) and displays raw segments . Each number represents a
2021-02-16 12:12:49 +00:00
7 - segment digit . Each 8 - bit number represents individual segments of a digit .
For example , the command " DisplayRaw 0, 4, 255, 255, 255, 255 " would display " [8.8.8.8.] "
2021-02-21 11:17:39 +00:00
DisplayText text [ , position { 0 - ( TM1637Data . num_digits - 1 ) } [ , length { 1 to TM1637Data . num_digits } ] ]
2021-02-16 12:12:49 +00:00
2021-02-17 11:32:36 +00:00
Clears and then displays basic text . command e . g . , " DisplayText ajith vasudevan "
2021-02-16 12:12:49 +00:00
Control ' length ' and ' position ' with " DisplayText <text>, <position>, <length> "
2021-02-21 11:17:39 +00:00
' length ' can be 1 to TM1637Data . num_digits , ' position ' can be 0 ( left - most ) to TM1637Data . num_digits - 1 ( right - most )
2021-02-17 10:54:45 +00:00
A caret ( ^ ) symbol in the text input is dispayed as the degrees ( ° ) symbol . This is useful for displaying Temperature !
For example , the command " DisplayText 22.5^ " will display " 22.5° " .
2021-02-16 12:12:49 +00:00
2021-02-21 11:17:39 +00:00
DisplayTextNC text [ , position { 0 - TM1637Data . num_digits - 1 } [ , length { 1 to TM1637Data . num_digits } ] ]
2021-02-16 12:12:49 +00:00
Clears first , then displays text . Usage is same as above .
DisplayScrollText text
2021-02-17 11:32:36 +00:00
Displays scrolling text .
2021-02-16 12:12:49 +00:00
DisplayScrollDelay delay { 0 - 15 } // default = 4
Sets the speed of text scroll . Smaller delay = faster scrolling .
2021-02-14 11:22:08 +00:00
DisplayLevel num { 0 - 100 }
2021-02-17 11:32:36 +00:00
Display a horizontal bar graph ( 0 - 100 ) command e . g . , " DisplayLevel 50 " will display [ | | | | ]
2021-02-14 11:22:08 +00:00
2021-02-17 11:32:36 +00:00
DisplayClock 1 | 2 | 0
2021-02-16 12:12:49 +00:00
2021-02-17 11:32:36 +00:00
Displays a clock .
2021-02-14 11:22:08 +00:00
Commands " DisplayClock 1 " // 12 hr format
" DisplayClock 2 " // 24 hr format
" DisplayClock 0 " // turn off clock
2021-02-18 17:14:15 +00:00
2021-02-10 16:23:47 +00:00
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2021-02-21 11:17:39 +00:00
# define XDSP_15 15
2021-02-16 12:12:49 +00:00
2021-02-21 05:04:40 +00:00
# define BRIGHTNESS_MIN 1
2021-02-16 12:12:49 +00:00
# define BRIGHTNESS_MAX 8
2021-02-21 11:17:39 +00:00
# define CMD_MAX_LEN 55
# define LEVEL_MIN 0
# define LEVEL_MAX 100
# define SCROLL_MAX_LEN 50
2021-02-18 17:14:15 +00:00
# define POSITION_MIN 0
# define POSITION_MAX 8
# define LED_MIN 0
# define LED_MAX 255
2021-02-10 16:23:47 +00:00
2021-02-21 11:17:39 +00:00
# include "SevenSegmentTM1637.h"
2021-02-22 06:00:11 +00:00
# include <TM1638plus.h>
2021-02-21 13:33:51 +00:00
SevenSegmentTM1637 * tm1637display ;
2021-02-22 06:00:11 +00:00
TM1638plus * tm1638display ;
enum display_types { TM1637 , TM1638 } ;
2021-02-21 11:17:39 +00:00
struct {
char scroll_text [ CMD_MAX_LEN ] ;
char msg [ 60 ] ;
2021-02-22 06:00:11 +00:00
char model_name [ 8 ] ;
2021-02-21 11:17:39 +00:00
uint8_t num_digits = 4 ;
uint8_t scroll_delay = 4 ;
uint8_t scroll_index = 0 ;
uint8_t iteration = 0 ;
uint8_t brightness = 5 ;
2021-02-22 06:00:11 +00:00
uint8_t buttons ;
uint8_t display_type = TM1637 ;
uint8_t prev_buttons ;
2021-02-21 11:17:39 +00:00
2021-02-22 06:00:11 +00:00
bool driver_inited = false ;
2021-02-21 11:17:39 +00:00
bool scroll = false ;
bool show_clock = false ;
bool clock_24 = false ;
2021-02-22 06:00:11 +00:00
bool LED [ 8 ] = { false , false , false , false , false , false , false , false } ;
2021-02-21 11:17:39 +00:00
} TM1637Data ;
2021-02-10 16:23:47 +00:00
/*********************************************************************************************\
* Init function
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2021-03-18 14:00:50 +00:00
bool TM1637Init ( void ) {
2021-02-22 06:00:11 +00:00
2021-03-18 14:00:50 +00:00
if ( TM1637Data . driver_inited ) return true ;
2021-02-22 06:00:11 +00:00
2021-03-18 14:00:50 +00:00
if ( PinUsed ( GPIO_TM16CLK ) & & PinUsed ( GPIO_TM16DIO ) & & PinUsed ( GPIO_TM16STB ) ) {
TM1637Data . display_type = TM1638 ;
TM1637Data . num_digits = 8 ;
} else if ( PinUsed ( GPIO_TM1637CLK ) & & PinUsed ( GPIO_TM1637DIO ) ) {
TM1637Data . display_type = TM1637 ;
if ( Settings . display_cols [ 0 ] < = 6 ) TM1637Data . num_digits = Settings . display_cols [ 0 ] ;
else TM1637Data . num_digits = 4 ;
2021-02-18 17:14:15 +00:00
}
2021-03-18 14:00:50 +00:00
else return false ;
Settings . display_model = = XDSP_15 ;
if ( TM1637Data . display_type = = TM1637 ) {
strcpy ( TM1637Data . model_name , " TM1637 " ) ;
tm1637display = new SevenSegmentTM1637 ( Pin ( GPIO_TM1637CLK ) , Pin ( GPIO_TM1637DIO ) ) ;
tm1637display - > begin ( TM1637Data . num_digits , 1 ) ;
} else if ( TM1637Data . display_type = = TM1638 ) {
strcpy ( TM1637Data . model_name , " TM1638 " ) ;
tm1638display = new TM1638plus ( Pin ( GPIO_TM16STB ) , Pin ( GPIO_TM16CLK ) , Pin ( GPIO_TM16DIO ) , true ) ;
TM1637Data . num_digits = 8 ;
tm1638display - > displayBegin ( ) ;
}
TM1637ClearDisplay ( ) ;
TM1637Data . brightness = ( Settings . display_dimmer ? Settings . display_dimmer : TM1637Data . brightness ) ;
TM1637SetBrightness ( TM1637Data . brightness ) ;
TM1637Data . driver_inited = true ;
AddLog ( LOG_LEVEL_INFO , PSTR ( " DSP: %s display driver initialized with %d digits " ) , TM1637Data . model_name , TM1637Data . num_digits ) ;
2021-02-18 17:14:15 +00:00
2021-02-10 16:23:47 +00:00
return true ;
}
/*********************************************************************************************\
2021-02-16 12:12:49 +00:00
* Displays number without decimal , with / without leading zeros , specifying start - position
* and length , optionally skipping clearing display before displaying the number .
2021-02-21 11:17:39 +00:00
* commands : DisplayNumber num [ , position { 0 - ( TM1637Data . num_digits - 1 ) } [ , leading_zeros { 0 | 1 } [ , length { 1 to TM1637Data . num_digits } ] ] ]
* DisplayNumberNC num [ , position { 0 - ( TM1637Data . num_digits - 1 ) } [ , leading_zeros { 0 | 1 } [ , length { 1 to TM1637Data . num_digits } ] ] ] // "NC" --> "No Clear"
2021-02-10 16:23:47 +00:00
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2021-03-18 14:00:50 +00:00
bool CmndTM1637Number ( bool clear ) {
2021-02-17 11:32:36 +00:00
char sNum [ CMD_MAX_LEN ] ;
2021-02-16 12:12:49 +00:00
char sLeadingzeros [ CMD_MAX_LEN ] ;
2021-02-17 11:32:36 +00:00
char sPosition [ CMD_MAX_LEN ] ;
2021-02-16 12:12:49 +00:00
char sLength [ CMD_MAX_LEN ] ;
uint8_t length = 0 ;
2021-02-14 11:22:08 +00:00
bool leadingzeros = false ;
2021-02-16 12:12:49 +00:00
uint8_t position = 0 ;
uint32_t num = 0 ;
2021-02-10 16:23:47 +00:00
2021-02-17 11:32:36 +00:00
switch ( ArgC ( ) )
2021-02-10 16:23:47 +00:00
{
case 4 :
2021-02-16 12:12:49 +00:00
subStr ( sLength , XdrvMailbox . data , " , " , 4 ) ;
2021-02-10 16:23:47 +00:00
length = atoi ( sLength ) ;
2021-02-16 12:12:49 +00:00
case 3 :
subStr ( sLeadingzeros , XdrvMailbox . data , " , " , 3 ) ;
leadingzeros = atoi ( sLeadingzeros ) ;
2021-02-10 16:23:47 +00:00
case 2 :
2021-02-16 12:12:49 +00:00
subStr ( sPosition , XdrvMailbox . data , " , " , 2 ) ;
position = atoi ( sPosition ) ;
2021-02-10 16:23:47 +00:00
case 1 :
subStr ( sNum , XdrvMailbox . data , " , " , 1 ) ;
2021-02-16 12:12:49 +00:00
num = atof ( sNum ) ;
2021-02-10 16:23:47 +00:00
}
2021-02-16 12:12:49 +00:00
2021-02-21 11:17:39 +00:00
if ( ( position < 0 ) | | ( position > ( TM1637Data . num_digits - 1 ) ) ) position = 0 ;
2021-02-10 16:23:47 +00:00
2021-02-21 11:17:39 +00:00
AddLog ( LOG_LEVEL_DEBUG , PSTR ( " TM7: num %d, pos %d, lead %d, len %d " ) , num , position , leadingzeros , length ) ;
2021-02-10 16:23:47 +00:00
2021-03-18 14:00:50 +00:00
if ( clear ) TM1637ClearDisplay ( ) ;
2021-02-16 12:12:49 +00:00
char txt [ 30 ] ;
2021-02-17 11:32:36 +00:00
snprintf_P ( txt , sizeof ( txt ) , PSTR ( " %d " ) , num ) ;
2021-02-16 12:12:49 +00:00
if ( ! length ) length = strlen ( txt ) ;
2021-02-21 11:17:39 +00:00
if ( ( length < 0 ) | | ( length > TM1637Data . num_digits ) ) length = TM1637Data . num_digits ;
2021-02-16 12:12:49 +00:00
char pad = ( leadingzeros ? ' 0 ' : ' ' ) ;
uint32_t i = position ;
uint8_t rawBytes [ 1 ] ;
2021-02-18 17:14:15 +00:00
2021-02-16 12:12:49 +00:00
for ( ; i < position + ( length - strlen ( txt ) ) ; i + + ) {
2021-02-21 11:17:39 +00:00
if ( i > TM1637Data . num_digits ) break ;
2021-02-22 06:00:11 +00:00
if ( TM1637Data . display_type = = TM1637 ) { rawBytes [ 0 ] = tm1637display - > encode ( pad ) ; tm1637display - > printRaw ( rawBytes , 1 , i ) ; }
else if ( TM1637Data . display_type = = TM1638 ) tm1638display - > displayASCII ( i , pad ) ;
2021-02-16 12:12:49 +00:00
}
2021-02-17 11:32:36 +00:00
2021-02-16 12:12:49 +00:00
for ( uint32_t j = 0 ; i < position + length ; i + + , j + + ) {
2021-02-21 11:17:39 +00:00
if ( i > TM1637Data . num_digits ) break ;
2021-02-18 17:14:15 +00:00
if ( txt [ j ] = = 0 ) break ;
2021-02-22 06:00:11 +00:00
if ( TM1637Data . display_type = = TM1637 ) { rawBytes [ 0 ] = tm1637display - > encode ( txt [ j ] ) ; tm1637display - > printRaw ( rawBytes , 1 , i ) ; }
else if ( TM1637Data . display_type = = TM1638 ) tm1638display - > displayASCII ( i , txt [ j ] ) ;
2021-02-16 12:12:49 +00:00
}
2021-02-10 16:23:47 +00:00
return true ;
}
/*********************************************************************************************\
2021-02-16 12:12:49 +00:00
* Displays number with decimal , specifying position , precision and length ,
2021-02-10 16:23:47 +00:00
* optionally skipping clearing display before displaying the number .
2021-02-21 11:17:39 +00:00
* commands : DisplayFloat num [ , position { 0 - ( TM1637Data . num_digits - 1 ) } [ , precision { 0 - TM1637Data . num_digits } [ , length { 1 to TM1637Data . num_digits } ] ] ]
* DisplayFloatNC num [ , position { 0 - ( TM1637Data . num_digits - 1 ) } [ , precision { 0 - TM1637Data . num_digits } [ , length { 1 to TM1637Data . num_digits } ] ] ] // "NC" --> "No Clear"
2021-02-10 16:23:47 +00:00
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2021-03-18 14:00:50 +00:00
bool CmndTM1637Float ( bool clear ) {
2021-02-10 16:23:47 +00:00
2021-02-17 11:32:36 +00:00
char sNum [ CMD_MAX_LEN ] ;
2021-02-16 12:12:49 +00:00
char sPrecision [ CMD_MAX_LEN ] ;
2021-02-17 11:32:36 +00:00
char sPosition [ CMD_MAX_LEN ] ;
2021-02-14 11:22:08 +00:00
char sLength [ CMD_MAX_LEN ] ;
2021-02-16 12:12:49 +00:00
uint8_t length = 0 ;
2021-02-21 11:17:39 +00:00
uint8_t precision = TM1637Data . num_digits ;
2021-02-16 12:12:49 +00:00
uint8_t position = 0 ;
2021-02-14 11:22:08 +00:00
2021-02-10 16:23:47 +00:00
float fnum = 0.0f ;
2021-02-17 11:32:36 +00:00
switch ( ArgC ( ) )
2021-02-10 16:23:47 +00:00
{
2021-02-16 12:12:49 +00:00
case 4 :
subStr ( sLength , XdrvMailbox . data , " , " , 4 ) ;
2021-02-14 11:22:08 +00:00
length = atoi ( sLength ) ;
2021-02-16 12:12:49 +00:00
case 3 :
subStr ( sPrecision , XdrvMailbox . data , " , " , 3 ) ;
2021-02-10 16:23:47 +00:00
precision = atoi ( sPrecision ) ;
2021-02-16 12:12:49 +00:00
case 2 :
subStr ( sPosition , XdrvMailbox . data , " , " , 2 ) ;
position = atoi ( sPosition ) ;
2021-02-10 16:23:47 +00:00
case 1 :
subStr ( sNum , XdrvMailbox . data , " , " , 1 ) ;
fnum = atof ( sNum ) ;
}
2021-02-16 12:12:49 +00:00
2021-02-17 11:32:36 +00:00
2021-02-21 11:17:39 +00:00
if ( ( position < 0 ) | | ( position > ( TM1637Data . num_digits - 1 ) ) ) position = 0 ;
if ( ( precision < 0 ) | | ( precision > TM1637Data . num_digits ) ) precision = TM1637Data . num_digits ;
2021-02-16 12:12:49 +00:00
2021-03-18 14:00:50 +00:00
if ( clear ) TM1637ClearDisplay ( ) ;
2021-02-16 12:12:49 +00:00
char txt [ 30 ] ;
2021-02-17 11:32:36 +00:00
ext_snprintf_P ( txt , sizeof ( txt ) , PSTR ( " %*_f " ) , precision , & fnum ) ;
2021-02-16 12:12:49 +00:00
if ( ! length ) length = strlen ( txt ) ;
2021-02-21 11:17:39 +00:00
if ( ( length < = 0 ) | | ( length > TM1637Data . num_digits ) ) length = TM1637Data . num_digits ;
2021-02-10 16:23:47 +00:00
2021-02-21 11:17:39 +00:00
AddLog ( LOG_LEVEL_DEBUG , PSTR ( " TM7: num %4_f, prec %d, len %d " ) , & fnum , precision , length ) ;
2021-02-18 17:14:15 +00:00
2021-02-22 06:00:11 +00:00
if ( TM1637Data . display_type = = TM1637 ) {
2021-02-18 17:14:15 +00:00
uint8_t rawBytes [ 1 ] ;
for ( uint32_t i = 0 , j = 0 ; i < length ; i + + , j + + ) {
if ( txt [ i ] = = 0 ) break ;
2021-02-22 06:00:11 +00:00
rawBytes [ 0 ] = tm1637display - > encode ( txt [ i ] ) ;
2021-02-18 17:14:15 +00:00
if ( txt [ i + 1 ] = = ' . ' ) {
rawBytes [ 0 ] = rawBytes [ 0 ] | 128 ;
i + + ;
length + + ;
}
2021-02-22 06:00:11 +00:00
if ( ( j + position ) > TM1637Data . num_digits ) break ;
tm1637display - > printRaw ( rawBytes , 1 , j + position ) ;
2021-02-18 17:14:15 +00:00
}
2021-02-22 06:00:11 +00:00
} else if ( TM1637Data . display_type = = TM1638 ) {
2021-02-18 17:14:15 +00:00
for ( uint32_t i = 0 , j = 0 ; i < length ; i + + , j + + ) {
if ( ( j + position ) > 7 ) break ;
if ( txt [ i ] = = 0 ) break ;
if ( txt [ i + 1 ] = = ' . ' ) {
2021-02-22 06:00:11 +00:00
tm1638display - > displayASCIIwDot ( j + position , txt [ i ] ) ;
2021-02-18 17:14:15 +00:00
i + + ;
length + + ;
}
2021-02-22 06:00:11 +00:00
else tm1638display - > displayASCII ( j + position , txt [ i ] ) ;
2021-02-17 11:32:36 +00:00
}
2021-02-18 17:14:15 +00:00
}
2021-02-10 16:23:47 +00:00
return true ;
}
2021-02-16 12:12:49 +00:00
/ / /*********************************************************************************************\
// * Clears the display
// * Command: DisplayClear
// \*********************************************************************************************/
2021-03-18 14:00:50 +00:00
bool CmndTM1637Clear ( void ) {
TM1637ClearDisplay ( ) ;
2021-02-21 11:17:39 +00:00
sprintf ( TM1637Data . msg , PSTR ( " Cleared " ) ) ;
XdrvMailbox . data = TM1637Data . msg ;
2021-02-10 16:23:47 +00:00
return true ;
}
2021-02-18 17:14:15 +00:00
/ / /*********************************************************************************************\
// * Clears the display
// \*********************************************************************************************/
2021-03-18 14:00:50 +00:00
void TM1637ClearDisplay ( void ) {
2021-02-22 06:00:11 +00:00
if ( TM1637Data . display_type = = TM1637 ) {
2021-02-18 17:14:15 +00:00
unsigned char arr [ ] = { 0 } ;
2021-02-22 06:00:11 +00:00
for ( int i = 0 ; i < TM1637Data . num_digits ; i + + ) tm1637display - > printRaw ( arr , 1 , i ) ;
} else if ( TM1637Data . display_type = = TM1638 ) {
for ( int i = 0 ; i < TM1637Data . num_digits ; i + + ) tm1638display - > display7Seg ( i , 0 ) ;
2021-02-18 17:14:15 +00:00
}
2021-02-16 12:12:49 +00:00
}
/*********************************************************************************************\
* Display scrolling text
2021-02-22 06:00:11 +00:00
* Command : DisplayTM1637Data . scroll_text text
2021-02-16 12:12:49 +00:00
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2021-03-18 14:00:50 +00:00
bool CmndTM1637ScrollText ( void ) {
2021-02-16 12:12:49 +00:00
2021-02-21 11:17:39 +00:00
AddLog ( LOG_LEVEL_DEBUG , PSTR ( " TM7: Text %s " ) , XdrvMailbox . data ) ;
2021-02-16 12:12:49 +00:00
if ( XdrvMailbox . data_len > SCROLL_MAX_LEN ) {
2021-02-21 11:17:39 +00:00
snprintf ( TM1637Data . msg , sizeof ( TM1637Data . msg ) , PSTR ( " Text too long. Length should be less than %d " ) , SCROLL_MAX_LEN ) ;
XdrvMailbox . data = TM1637Data . msg ;
2021-02-16 12:12:49 +00:00
return false ;
} else {
2021-02-23 07:22:05 +00:00
snprintf ( TM1637Data . scroll_text , sizeof ( TM1637Data . scroll_text ) , PSTR ( " " ) ) ;
2021-02-21 11:17:39 +00:00
snprintf ( TM1637Data . scroll_text , sizeof ( TM1637Data . scroll_text ) , PSTR ( " %s " ) , XdrvMailbox . data ) ;
TM1637Data . scroll_text [ XdrvMailbox . data_len ] = 0 ;
TM1637Data . scroll_index = 0 ;
TM1637Data . scroll = true ;
2021-02-16 12:12:49 +00:00
return true ;
}
}
/*********************************************************************************************\
* Sets the scroll delay for scrolling text .
2021-02-22 06:00:11 +00:00
* Command : DisplayTM1637Data . scroll_delay delay { 0 - 15 } // default = 4
2021-02-16 12:12:49 +00:00
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2021-03-18 14:00:50 +00:00
bool CmndTM1637ScrollDelay ( void ) {
2021-02-23 07:22:05 +00:00
if ( ArgC ( ) = = 0 ) {
XdrvMailbox . payload = TM1637Data . scroll_delay ;
return true ;
}
2021-02-21 11:17:39 +00:00
if ( TM1637Data . scroll_delay < 0 ) TM1637Data . scroll_delay = 0 ;
TM1637Data . scroll_delay = XdrvMailbox . payload ;
2021-02-16 12:12:49 +00:00
return true ;
}
/*********************************************************************************************\
* Scrolls a given string . Called every 50 ms
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2021-03-18 14:00:50 +00:00
void TM1637ScrollText ( void ) {
2021-02-22 06:00:11 +00:00
TM1637Data . iteration + + ;
if ( TM1637Data . scroll_delay ) TM1637Data . iteration = TM1637Data . iteration % TM1637Data . scroll_delay ;
else TM1637Data . iteration = 0 ;
if ( TM1637Data . iteration ) return ;
if ( TM1637Data . scroll_index > strlen ( TM1637Data . scroll_text ) ) {
TM1637Data . scroll = false ;
TM1637Data . scroll_index = 0 ;
2021-02-18 17:14:15 +00:00
return ;
}
uint8_t rawBytes [ 1 ] ;
2021-02-23 07:22:05 +00:00
for ( uint32_t i = 0 , j = TM1637Data . scroll_index ; i < 1 + strlen ( TM1637Data . scroll_text ) ; i + + , j + + ) {
if ( i > ( TM1637Data . num_digits - 1 ) ) { break ; }
rawBytes [ 0 ] = tm1637display - > encode ( TM1637Data . scroll_text [ j ] ) ;
bool dotSkipped = false ;
if ( TM1637Data . scroll_text [ j + 1 ] = = ' . ' ) {
dotSkipped = true ;
rawBytes [ 0 ] = rawBytes [ 0 ] | 128 ;
j + + ;
} else if ( TM1637Data . scroll_text [ j ] = = ' ^ ' ) {
rawBytes [ 0 ] = 1 | 2 | 32 | 64 ;
}
if ( ! dotSkipped & & TM1637Data . scroll_text [ j ] = = ' . ' ) {
j + + ;
TM1637Data . scroll_index + + ;
rawBytes [ 0 ] = tm1637display - > encode ( TM1637Data . scroll_text [ j ] ) ;
}
if ( TM1637Data . scroll_text [ j + 1 ] = = ' . ' ) { rawBytes [ 0 ] = rawBytes [ 0 ] | 128 ; }
2021-02-22 06:00:11 +00:00
if ( TM1637Data . display_type = = TM1637 ) {
2021-02-21 13:33:51 +00:00
tm1637display - > printRaw ( rawBytes , 1 , i ) ;
2021-02-22 06:00:11 +00:00
} else if ( TM1637Data . display_type = = TM1638 ) {
2021-02-23 07:22:05 +00:00
tm1638display - > display7Seg ( i , rawBytes [ 0 ] ) ;
2021-02-16 12:12:49 +00:00
}
2021-02-18 17:14:15 +00:00
2021-02-16 12:12:49 +00:00
}
2021-02-22 06:00:11 +00:00
TM1637Data . scroll_index + + ;
2021-02-16 12:12:49 +00:00
}
2021-02-10 16:23:47 +00:00
/*********************************************************************************************\
* Displays a horizontal bar graph . Takes a percentage number ( 0 - 100 ) as input
* Command : DisplayLevel level { 0 - 100 }
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2021-03-18 14:00:50 +00:00
bool CmndTM1637Level ( void ) {
2021-02-10 16:23:47 +00:00
uint16_t val = XdrvMailbox . payload ;
if ( ( val < LEVEL_MIN ) | | ( val > LEVEL_MAX ) ) {
2021-02-19 09:58:16 +00:00
Response_P ( PSTR ( " { \" Error \" : \" Level should be a number in the range [%d, %d] \" } " ) , LEVEL_MIN , LEVEL_MAX ) ;
2021-02-17 11:32:36 +00:00
return false ;
}
2021-02-16 12:12:49 +00:00
2021-02-21 11:17:39 +00:00
uint8_t totalBars = 2 * TM1637Data . num_digits ;
2021-03-18 14:00:50 +00:00
AddLog ( LOG_LEVEL_DEBUG , PSTR ( " TM7: TM1637Data.model_name %s CmndTM1637Level totalBars=%d " ) , TM1637Data . model_name , totalBars ) ;
2021-02-16 12:12:49 +00:00
float barsToDisplay = totalBars * val / 100.0f ;
char txt [ 5 ] ;
2021-02-17 11:32:36 +00:00
ext_snprintf_P ( txt , sizeof ( txt ) , PSTR ( " %*_f " ) , 1 , & barsToDisplay ) ;
2021-03-18 14:00:50 +00:00
AddLog ( LOG_LEVEL_DEBUG , PSTR ( " TM7: TM1637Data.model_name %s CmndTM1637Level barsToDisplay=%s " ) , TM1637Data . model_name , txt ) ;
2021-02-16 12:12:49 +00:00
char s [ 4 ] ;
2021-02-21 11:17:39 +00:00
ext_snprintf_P ( s , sizeof ( s ) , PSTR ( " %0_f " ) , & barsToDisplay ) ;
2021-02-16 12:12:49 +00:00
uint8_t numBars = atoi ( s ) ;
2021-02-21 11:17:39 +00:00
AddLog ( LOG_LEVEL_DEBUG , PSTR ( " TM7: CmndTM1637Level numBars %d " ) , numBars ) ;
2021-02-16 12:12:49 +00:00
2021-03-18 14:00:50 +00:00
TM1637ClearDisplay ( ) ;
2021-02-16 12:12:49 +00:00
uint8_t rawBytes [ 1 ] ;
for ( int i = 1 ; i < = numBars ; i + + ) {
uint8_t digit = ( i - 1 ) / 2 ;
uint8_t value = ( ( ( i % 2 ) = = 0 ) ? 54 : 48 ) ;
2021-02-22 06:00:11 +00:00
if ( TM1637Data . display_type = = TM1637 ) {
2021-02-18 17:14:15 +00:00
rawBytes [ 0 ] = value ;
2021-02-22 06:00:11 +00:00
tm1637display - > printRaw ( rawBytes , 1 , digit ) ;
} else if ( TM1637Data . display_type = = TM1638 ) {
tm1638display - > display7Seg ( digit , value ) ;
2021-02-18 17:14:15 +00:00
}
2021-02-16 12:12:49 +00:00
}
2021-02-10 16:23:47 +00:00
return true ;
}
/*********************************************************************************************\
* Display arbitrary data on the display module
2021-02-21 11:17:39 +00:00
* Command : DisplayRaw position { 0 - ( TM1637Data . num_digits - 1 ) } , length { 1 to TM1637Data . num_digits } , a [ , b [ , c [ , d [ . . . upto TM1637Data . num_digits ] ] ] ]
* where a , b , c , d . . . are upto TM1637Data . num_digits numbers in the range 0 - 255 , each number ( byte )
2021-02-17 11:32:36 +00:00
* corresponding to a single 7 - segment digit . Within each byte , bit 0 is segment A ,
* bit 1 is segment B etc . The function may either set the entire display
2021-02-16 12:12:49 +00:00
* or any desired part using the length and position parameters .
2021-02-10 16:23:47 +00:00
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2021-03-18 14:00:50 +00:00
bool CmndTM1637Raw ( void ) {
2021-02-16 12:12:49 +00:00
uint8_t DATA [ 6 ] = { 0 , 0 , 0 , 0 , 0 , 0 } ;
2021-02-10 16:23:47 +00:00
2021-02-17 11:32:36 +00:00
char as [ CMD_MAX_LEN ] ;
char bs [ CMD_MAX_LEN ] ;
char cs [ CMD_MAX_LEN ] ;
char ds [ CMD_MAX_LEN ] ;
char es [ CMD_MAX_LEN ] ;
char fs [ CMD_MAX_LEN ] ;
char sLength [ CMD_MAX_LEN ] ;
char sPos [ CMD_MAX_LEN ] ;
2021-02-16 12:12:49 +00:00
2021-02-14 11:22:08 +00:00
2021-02-10 16:23:47 +00:00
uint32_t position = 0 ;
2021-02-16 12:12:49 +00:00
uint32_t length = 0 ;
2021-02-10 16:23:47 +00:00
2021-02-17 11:32:36 +00:00
switch ( ArgC ( ) )
2021-02-10 16:23:47 +00:00
{
2021-02-16 12:12:49 +00:00
case 8 :
subStr ( fs , XdrvMailbox . data , " , " , 8 ) ;
DATA [ 5 ] = atoi ( fs ) ;
case 7 :
subStr ( es , XdrvMailbox . data , " , " , 7 ) ;
DATA [ 4 ] = atoi ( es ) ;
2021-02-10 16:23:47 +00:00
case 6 :
2021-02-16 12:12:49 +00:00
subStr ( ds , XdrvMailbox . data , " , " , 6 ) ;
DATA [ 3 ] = atoi ( ds ) ;
2021-02-10 16:23:47 +00:00
case 5 :
2021-02-16 12:12:49 +00:00
subStr ( cs , XdrvMailbox . data , " , " , 5 ) ;
DATA [ 2 ] = atoi ( cs ) ;
2021-02-10 16:23:47 +00:00
case 4 :
2021-02-16 12:12:49 +00:00
subStr ( bs , XdrvMailbox . data , " , " , 4 ) ;
DATA [ 1 ] = atoi ( bs ) ;
2021-02-10 16:23:47 +00:00
case 3 :
2021-02-16 12:12:49 +00:00
subStr ( as , XdrvMailbox . data , " , " , 3 ) ;
DATA [ 0 ] = atoi ( as ) ;
2021-02-10 16:23:47 +00:00
case 2 :
2021-02-16 12:12:49 +00:00
subStr ( sLength , XdrvMailbox . data , " , " , 2 ) ;
length = atoi ( sLength ) ;
2021-02-10 16:23:47 +00:00
case 1 :
2021-02-16 12:12:49 +00:00
subStr ( sPos , XdrvMailbox . data , " , " , 1 ) ;
position = atoi ( sPos ) ;
2021-02-10 16:23:47 +00:00
}
2021-02-16 12:12:49 +00:00
if ( ! length ) length = ArgC ( ) - 2 ;
2021-02-21 11:17:39 +00:00
if ( length < 0 | | length > TM1637Data . num_digits ) length = TM1637Data . num_digits ;
if ( position < 0 | | position > ( TM1637Data . num_digits - 1 ) ) position = 0 ;
2021-02-16 12:12:49 +00:00
2021-02-21 11:17:39 +00:00
AddLog ( LOG_LEVEL_DEBUG , PSTR ( " TM7: a %d, b %d, c %d, d %d, e %d, f %d, len %d, pos %d " ) ,
DATA [ 0 ] , DATA [ 1 ] , DATA [ 2 ] , DATA [ 3 ] , DATA [ 4 ] , DATA [ 5 ] , length , position ) ;
2021-02-16 12:12:49 +00:00
2021-02-22 06:00:11 +00:00
if ( TM1637Data . display_type = = TM1637 ) {
2021-02-18 17:14:15 +00:00
uint8_t rawBytes [ 1 ] ;
for ( uint32_t i = position ; i < position + length ; i + + ) {
2021-02-22 06:00:11 +00:00
if ( i > ( TM1637Data . num_digits - 1 ) ) break ;
2021-02-18 17:14:15 +00:00
rawBytes [ 0 ] = DATA [ i - position ] ;
2021-02-22 06:00:11 +00:00
tm1637display - > printRaw ( rawBytes , 1 , i ) ;
2021-02-18 17:14:15 +00:00
}
2021-02-22 06:00:11 +00:00
} else if ( TM1637Data . display_type = = TM1638 ) {
2021-02-18 17:14:15 +00:00
for ( uint32_t i = position ; i < position + length ; i + + ) {
if ( i > 7 ) break ;
2021-02-22 06:00:11 +00:00
tm1638display - > display7Seg ( i , DATA [ i - position ] ) ;
2021-02-18 17:14:15 +00:00
}
2021-02-16 12:12:49 +00:00
}
2021-02-18 17:14:15 +00:00
2021-02-10 16:23:47 +00:00
return true ;
}
/*********************************************************************************************\
2021-02-17 11:32:36 +00:00
* Display a given string .
* Text can be placed at arbitrary location on the display using the length and
2021-02-10 16:23:47 +00:00
* position parameters without affecting the rest of the display .
2021-02-21 11:17:39 +00:00
* Command : DisplayText text [ , position { 0 - ( TM1637Data . num_digits - 1 ) } [ , length { 1 to TM1637Data . num_digits } ] ]
2021-02-10 16:23:47 +00:00
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2021-03-18 14:00:50 +00:00
bool CmndTM1637Text ( bool clear ) {
2021-02-17 11:32:36 +00:00
char sString [ CMD_MAX_LEN + 1 ] ;
char sPosition [ CMD_MAX_LEN ] ;
2021-02-16 12:12:49 +00:00
char sLength [ CMD_MAX_LEN ] ;
uint8_t length = 0 ;
uint8_t position = 0 ;
2021-02-14 11:22:08 +00:00
2021-02-17 11:32:36 +00:00
switch ( ArgC ( ) )
2021-02-10 16:23:47 +00:00
{
2021-02-16 12:12:49 +00:00
case 3 :
subStr ( sLength , XdrvMailbox . data , " , " , 3 ) ;
2021-02-10 16:23:47 +00:00
length = atoi ( sLength ) ;
2021-02-16 12:12:49 +00:00
case 2 :
subStr ( sPosition , XdrvMailbox . data , " , " , 2 ) ;
position = atoi ( sPosition ) ;
2021-02-10 16:23:47 +00:00
case 1 :
subStr ( sString , XdrvMailbox . data , " , " , 1 ) ;
}
2021-02-21 11:17:39 +00:00
if ( ( position < 0 ) | | ( position > ( TM1637Data . num_digits - 1 ) ) ) position = 0 ;
2021-02-16 12:12:49 +00:00
2021-02-21 11:17:39 +00:00
AddLog ( LOG_LEVEL_DEBUG , PSTR ( " TM7: sString %s, pos %d, len %d " ) , sString , position , length ) ;
2021-02-10 16:23:47 +00:00
2021-03-18 14:00:50 +00:00
if ( clear ) TM1637ClearDisplay ( ) ;
2021-02-16 12:12:49 +00:00
if ( ! length ) length = strlen ( sString ) ;
2021-02-21 11:17:39 +00:00
if ( ( length < 0 ) | | ( length > TM1637Data . num_digits ) ) length = TM1637Data . num_digits ;
2021-02-16 12:12:49 +00:00
uint32_t i = position ;
2021-02-22 06:00:11 +00:00
if ( TM1637Data . display_type = = TM1637 ) {
2021-02-18 17:14:15 +00:00
uint8_t rawBytes [ 1 ] ;
for ( uint32_t j = 0 ; i < position + length ; i + + , j + + ) {
2021-02-22 06:00:11 +00:00
if ( i > ( TM1637Data . num_digits - 1 ) ) break ;
2021-02-18 17:14:15 +00:00
if ( sString [ j ] = = 0 ) break ;
2021-02-22 06:00:11 +00:00
rawBytes [ 0 ] = tm1637display - > encode ( sString [ j ] ) ;
2021-02-23 07:22:05 +00:00
bool dotSkipped = false ;
2021-02-18 17:14:15 +00:00
if ( sString [ j + 1 ] = = ' . ' ) {
2021-02-23 07:22:05 +00:00
dotSkipped = true ;
2021-02-18 17:14:15 +00:00
rawBytes [ 0 ] = rawBytes [ 0 ] | 128 ;
j + + ;
} else if ( sString [ j ] = = ' ^ ' ) {
rawBytes [ 0 ] = 1 | 2 | 32 | 64 ;
}
2021-02-23 07:22:05 +00:00
if ( ! dotSkipped & & sString [ j ] = = ' . ' ) rawBytes [ 0 ] = 128 ;
2021-02-22 06:00:11 +00:00
tm1637display - > printRaw ( rawBytes , 1 , i ) ;
2021-02-17 10:54:45 +00:00
}
2021-02-22 06:00:11 +00:00
} else if ( TM1637Data . display_type = = TM1638 ) {
2021-02-18 17:14:15 +00:00
for ( uint32_t j = 0 ; i < position + length ; i + + , j + + ) {
if ( i > 7 ) break ;
if ( sString [ j ] = = 0 ) break ;
if ( sString [ j + 1 ] = = ' . ' ) {
2021-02-22 06:00:11 +00:00
tm1638display - > displayASCIIwDot ( i , sString [ j ] ) ;
2021-02-18 17:14:15 +00:00
j + + ;
} else if ( sString [ j ] = = ' ^ ' ) {
2021-02-22 06:00:11 +00:00
tm1638display - > display7Seg ( i , ( 1 | 2 | 32 | 64 ) ) ;
} else tm1638display - > displayASCII ( i , sString [ j ] ) ;
2021-02-18 17:14:15 +00:00
}
2021-02-10 16:23:47 +00:00
}
return true ;
}
/*********************************************************************************************\
2021-02-17 11:32:36 +00:00
* Sets brightness of the display .
2021-02-21 05:04:40 +00:00
* Command : DisplayBrightness { 1 - 8 }
2021-02-10 16:23:47 +00:00
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2021-03-18 14:00:50 +00:00
bool CmndTM1637Brightness ( void ) {
2021-02-14 11:22:08 +00:00
2021-02-17 11:32:36 +00:00
uint16_t val = XdrvMailbox . payload ;
2021-02-17 10:54:45 +00:00
if ( ArgC ( ) = = 0 ) {
2021-02-21 11:17:39 +00:00
XdrvMailbox . payload = TM1637Data . brightness ;
2021-02-17 10:54:45 +00:00
return true ;
}
2021-02-14 11:22:08 +00:00
2021-02-10 16:23:47 +00:00
if ( ( val < BRIGHTNESS_MIN ) | | ( val > BRIGHTNESS_MAX ) ) {
2021-02-19 09:58:16 +00:00
Response_P ( PSTR ( " { \" Error \" : \" Brightness should be a number in the range [%d, %d] \" } " ) , BRIGHTNESS_MIN , BRIGHTNESS_MAX ) ;
2021-02-17 11:32:36 +00:00
return false ;
2021-02-17 10:54:45 +00:00
}
2021-02-21 11:17:39 +00:00
TM1637Data . brightness = val ;
2021-03-18 14:00:50 +00:00
TM1637SetBrightness ( TM1637Data . brightness ) ;
2021-02-10 16:23:47 +00:00
return true ;
}
2021-02-14 11:22:08 +00:00
2021-02-10 16:23:47 +00:00
2021-03-18 14:00:50 +00:00
void TM1637SetBrightness ( uint8_t val ) {
2021-02-18 17:14:15 +00:00
if ( ( val < BRIGHTNESS_MIN ) | | ( val > BRIGHTNESS_MAX ) ) val = 5 ;
Settings . display_dimmer = val ;
2021-02-22 06:00:11 +00:00
if ( TM1637Data . display_type = = TM1637 ) tm1637display - > setBacklight ( val * 10 ) ;
else if ( TM1637Data . display_type = = TM1638 ) tm1638display - > brightness ( val - 1 ) ;
2021-02-18 17:14:15 +00:00
}
2021-02-10 16:23:47 +00:00
/*********************************************************************************************\
* Displays a clock .
2021-02-14 11:22:08 +00:00
* Command : DisplayClock 1 // 12-hour format
* DisplayClock 2 // 24-hour format
* DisplayClock 0 // turn off clock and clear
2021-02-10 16:23:47 +00:00
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2021-03-18 14:00:50 +00:00
bool CmndTM1637Clock ( void ) {
2021-02-10 16:23:47 +00:00
2021-02-21 11:17:39 +00:00
TM1637Data . show_clock = XdrvMailbox . payload ;
2021-02-14 11:22:08 +00:00
if ( ArgC ( ) = = 0 ) XdrvMailbox . payload = 1 ;
2021-02-21 11:17:39 +00:00
if ( XdrvMailbox . payload > 1 ) TM1637Data . clock_24 = true ;
else if ( XdrvMailbox . payload = = 1 ) TM1637Data . clock_24 = false ;
2021-02-14 11:22:08 +00:00
2021-02-22 06:00:11 +00:00
AddLog ( LOG_LEVEL_DEBUG , PSTR ( " TM7: TM1637Data.show_clock %d, TM1637Data.clock_24 %d " ) , TM1637Data . show_clock , TM1637Data . clock_24 ) ;
2021-02-14 11:22:08 +00:00
2021-03-18 14:00:50 +00:00
TM1637ClearDisplay ( ) ;
2021-02-10 16:23:47 +00:00
return true ;
}
/*********************************************************************************************\
2021-02-14 11:22:08 +00:00
* refreshes the time if clock is displayed
2021-02-10 16:23:47 +00:00
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2021-03-18 14:00:50 +00:00
void TM1637ShowTime ( ) {
2021-02-10 16:23:47 +00:00
uint8_t hr = RtcTime . hour ;
uint8_t mn = RtcTime . minute ;
2021-02-14 11:22:08 +00:00
// uint8_t hr = 1;
// uint8_t mn = 0;
char z = ' ' ;
2021-02-21 11:17:39 +00:00
if ( TM1637Data . clock_24 ) {
2021-02-14 11:22:08 +00:00
z = ' 0 ' ;
} else {
2021-02-10 16:23:47 +00:00
if ( hr > 12 ) hr - = 12 ;
2021-02-14 11:22:08 +00:00
if ( hr = = 0 ) hr = 12 ;
2021-02-10 16:23:47 +00:00
}
2021-02-14 11:22:08 +00:00
2021-02-21 11:17:39 +00:00
char tm [ 5 ] ;
2021-02-14 11:22:08 +00:00
if ( hr < 10 ) {
if ( mn < 10 ) snprintf ( tm , sizeof ( tm ) , PSTR ( " %c%d0%d " ) , z , hr , mn ) ;
else snprintf ( tm , sizeof ( tm ) , PSTR ( " %c%d%d " ) , z , hr , mn ) ;
} else {
if ( mn < 10 ) snprintf ( tm , sizeof ( tm ) , PSTR ( " %d0%d " ) , hr , mn ) ;
else snprintf ( tm , sizeof ( tm ) , PSTR ( " %d%d " ) , hr , mn ) ;
}
2021-02-18 17:14:15 +00:00
2021-02-22 06:00:11 +00:00
if ( TM1637Data . display_type = = TM1637 ) {
2021-02-18 17:14:15 +00:00
uint8_t rawBytes [ 1 ] ;
for ( uint32_t i = 0 ; i < 4 ; i + + ) {
2021-02-22 06:00:11 +00:00
rawBytes [ 0 ] = tm1637display - > encode ( tm [ i ] ) ;
2021-02-18 17:14:15 +00:00
if ( ( millis ( ) % 1000 ) > 500 & & ( i = = 1 ) ) rawBytes [ 0 ] = rawBytes [ 0 ] | 128 ;
2021-02-22 06:00:11 +00:00
tm1637display - > printRaw ( rawBytes , 1 , i ) ;
2021-02-18 17:14:15 +00:00
}
2021-02-22 06:00:11 +00:00
} else if ( TM1637Data . display_type = = TM1638 ) {
2021-02-18 17:14:15 +00:00
for ( uint32_t i = 0 ; i < 4 ; i + + ) {
2021-02-22 06:00:11 +00:00
if ( ( millis ( ) % 1000 ) > 500 & & ( i = = 1 ) ) tm1638display - > displayASCIIwDot ( i , tm [ i ] ) ;
else tm1638display - > displayASCII ( i , tm [ i ] ) ;
2021-02-18 17:14:15 +00:00
}
2021-02-16 12:12:49 +00:00
}
2021-02-18 17:14:15 +00:00
2021-02-10 16:23:47 +00:00
}
2021-02-18 17:14:15 +00:00
/*********************************************************************************************\
* This function is called for all Display functions .
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2021-03-18 14:00:50 +00:00
bool TM1637MainFunc ( uint8_t fn ) {
2021-02-18 17:14:15 +00:00
bool result = false ;
2021-02-16 12:12:49 +00:00
2021-02-14 11:22:08 +00:00
if ( XdrvMailbox . data_len > CMD_MAX_LEN ) {
2021-02-19 09:58:16 +00:00
Response_P ( PSTR ( " { \" Error \" : \" Command text too long. Please limit it to %d characters \" } " ) , CMD_MAX_LEN ) ;
return false ;
2021-02-14 11:22:08 +00:00
}
2021-02-10 16:23:47 +00:00
switch ( fn ) {
case FUNC_DISPLAY_CLEAR :
2021-03-18 14:00:50 +00:00
result = CmndTM1637Clear ( ) ;
2021-02-10 16:23:47 +00:00
break ;
case FUNC_DISPLAY_NUMBER :
2021-03-18 14:00:50 +00:00
result = CmndTM1637Number ( true ) ;
2021-02-10 16:23:47 +00:00
break ;
case FUNC_DISPLAY_NUMBERNC :
2021-03-18 14:00:50 +00:00
result = CmndTM1637Number ( false ) ;
2021-02-10 16:23:47 +00:00
break ;
case FUNC_DISPLAY_FLOAT :
2021-03-18 14:00:50 +00:00
result = CmndTM1637Float ( true ) ;
2021-02-10 16:23:47 +00:00
break ;
case FUNC_DISPLAY_FLOATNC :
2021-03-18 14:00:50 +00:00
result = CmndTM1637Float ( false ) ;
2021-02-10 16:23:47 +00:00
break ;
case FUNC_DISPLAY_BRIGHTNESS :
2021-03-18 14:00:50 +00:00
result = CmndTM1637Brightness ( ) ;
2021-02-10 16:23:47 +00:00
break ;
case FUNC_DISPLAY_RAW :
2021-03-18 14:00:50 +00:00
result = CmndTM1637Raw ( ) ;
2021-02-10 16:23:47 +00:00
break ;
case FUNC_DISPLAY_SEVENSEG_TEXT :
2021-03-18 14:00:50 +00:00
result = CmndTM1637Text ( true ) ;
2021-02-10 16:23:47 +00:00
break ;
case FUNC_DISPLAY_SEVENSEG_TEXTNC :
2021-03-18 14:00:50 +00:00
result = CmndTM1637Text ( false ) ;
2021-02-10 16:23:47 +00:00
break ;
2021-02-16 12:12:49 +00:00
case FUNC_DISPLAY_LEVEL :
2021-03-18 14:00:50 +00:00
result = CmndTM1637Level ( ) ;
2021-02-16 12:12:49 +00:00
break ;
case FUNC_DISPLAY_SCROLLTEXT :
2021-03-18 14:00:50 +00:00
result = CmndTM1637ScrollText ( ) ;
2021-02-17 11:32:36 +00:00
break ;
2021-02-10 16:23:47 +00:00
case FUNC_DISPLAY_SCROLLDELAY :
2021-03-18 14:00:50 +00:00
result = CmndTM1637ScrollDelay ( ) ;
2021-02-10 16:23:47 +00:00
break ;
2021-03-18 14:00:50 +00:00
case FUNC_DISPLAY_CLOCK :
result = CmndTM1637Clock ( ) ;
2021-02-10 16:23:47 +00:00
break ;
}
return result ;
2021-02-17 11:32:36 +00:00
}
2021-02-10 16:23:47 +00:00
/*********************************************************************************************\
* Interface
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
bool Xdsp15 ( uint8_t function )
{
bool result = false ;
2021-02-18 17:14:15 +00:00
if ( function = = FUNC_DISPLAY_MODEL ) {
return true ;
2021-02-10 16:23:47 +00:00
}
2021-02-18 17:14:15 +00:00
if ( Settings . display_model = = XDSP_15 ) {
2021-02-10 16:23:47 +00:00
switch ( function ) {
2021-02-18 17:14:15 +00:00
case FUNC_DISPLAY_INIT_DRIVER :
2021-03-18 14:00:50 +00:00
result = TM1637Init ( ) ; // init
2021-02-10 16:23:47 +00:00
break ;
case FUNC_DISPLAY_INIT :
2021-03-03 12:45:27 +00:00
AddLog ( LOG_LEVEL_DEBUG , PSTR ( " TM7: %s: FUNC_DISPLAY_INIT: Display depends on TM1637Data.display_type, currently %d " ) , TM1637Data . model_name , Settings . display_options . data ) ;
2021-02-18 17:14:15 +00:00
result = true ;
break ;
2021-02-10 16:23:47 +00:00
case FUNC_DISPLAY_SEVENSEG_TEXT :
case FUNC_DISPLAY_CLEAR :
case FUNC_DISPLAY_NUMBER :
case FUNC_DISPLAY_FLOAT :
case FUNC_DISPLAY_NUMBERNC :
case FUNC_DISPLAY_FLOATNC :
case FUNC_DISPLAY_RAW :
case FUNC_DISPLAY_LEVEL :
case FUNC_DISPLAY_SEVENSEG_TEXTNC :
2021-02-16 12:12:49 +00:00
case FUNC_DISPLAY_SCROLLTEXT :
2021-02-10 16:23:47 +00:00
case FUNC_DISPLAY_SCROLLDELAY :
2021-02-21 05:37:12 +00:00
case FUNC_DISPLAY_CLOCK :
2021-02-22 06:00:11 +00:00
TM1637Data . show_clock = false ;
2021-02-21 05:37:12 +00:00
case FUNC_DISPLAY_BRIGHTNESS :
2021-03-18 14:00:50 +00:00
result = TM1637MainFunc ( function ) ;
2021-02-10 16:23:47 +00:00
break ;
case FUNC_DISPLAY_EVERY_50_MSECOND :
2021-03-18 14:00:50 +00:00
if ( TM1637Data . scroll ) TM1637ScrollText ( ) ;
if ( TM1637Data . show_clock ) TM1637ShowTime ( ) ;
2021-02-17 11:32:36 +00:00
break ;
2021-02-10 16:23:47 +00:00
}
}
return result ;
}
# endif // USE_DISPLAY_TM1637
# endif // USE_DISPLAY