Fix lcd_status_message
Because we now can use utf8 with up to 3 bytes per symbol, lcd_status_message[] must be 3*LCD_WIDTH wide. Filling up the message, or cutting to length, are fixed to. Fix for #1832 about at the end.
This commit is contained in:
		@@ -31,7 +31,7 @@ int absPreheatFanSpeed;
 | 
				
			|||||||
typedef void (*menuFunc_t)();
 | 
					typedef void (*menuFunc_t)();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint8_t lcd_status_message_level;
 | 
					uint8_t lcd_status_message_level;
 | 
				
			||||||
char lcd_status_message[LCD_WIDTH+1] = WELCOME_MSG;
 | 
					char lcd_status_message[3*LCD_WIDTH+1] = WELCOME_MSG; // worst case is kana with up to 3*LCD_WIDTH+1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef DOGLCD
 | 
					#ifdef DOGLCD
 | 
				
			||||||
  #include "dogm_lcd_implementation.h"
 | 
					  #include "dogm_lcd_implementation.h"
 | 
				
			||||||
@@ -1402,13 +1402,6 @@ void lcd_ignore_click(bool b) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void lcd_finishstatus(bool persist=false) {
 | 
					void lcd_finishstatus(bool persist=false) {
 | 
				
			||||||
  int len = lcd_strlen(lcd_status_message);
 | 
					 | 
				
			||||||
  if (len > 0) {
 | 
					 | 
				
			||||||
    while (len < LCD_WIDTH) {
 | 
					 | 
				
			||||||
      lcd_status_message[len++] = ' ';
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  lcd_status_message[LCD_WIDTH] = '\0';
 | 
					 | 
				
			||||||
  #ifdef LCD_PROGRESS_BAR
 | 
					  #ifdef LCD_PROGRESS_BAR
 | 
				
			||||||
    progressBarTick = millis();
 | 
					    progressBarTick = millis();
 | 
				
			||||||
    #if PROGRESS_MSG_EXPIRE > 0
 | 
					    #if PROGRESS_MSG_EXPIRE > 0
 | 
				
			||||||
@@ -1426,15 +1419,27 @@ void lcd_finishstatus(bool persist=false) {
 | 
				
			|||||||
  void dontExpireStatus() { expireStatusMillis = 0; }
 | 
					  void dontExpireStatus() { expireStatusMillis = 0; }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void set_utf_strlen(char *s, uint8_t n) {
 | 
				
			||||||
 | 
					  uint8_t i = 0, j = 0;
 | 
				
			||||||
 | 
					  while (s[i] && (j < n)) {
 | 
				
			||||||
 | 
					    if ((s[i] & 0xc0u) != 0x80u) j++;
 | 
				
			||||||
 | 
					    i++;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  while (j++ < n) s[i++] = ' ';
 | 
				
			||||||
 | 
					  s[i] = 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void lcd_setstatus(const char* message, bool persist) {
 | 
					void lcd_setstatus(const char* message, bool persist) {
 | 
				
			||||||
  if (lcd_status_message_level > 0) return;
 | 
					  if (lcd_status_message_level > 0) return;
 | 
				
			||||||
  strncpy(lcd_status_message, message, LCD_WIDTH);
 | 
					  strncpy(lcd_status_message, message, 3*LCD_WIDTH);
 | 
				
			||||||
 | 
					  set_utf_strlen(lcd_status_message, LCD_WIDTH);
 | 
				
			||||||
  lcd_finishstatus(persist);
 | 
					  lcd_finishstatus(persist);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void lcd_setstatuspgm(const char* message, uint8_t level) {
 | 
					void lcd_setstatuspgm(const char* message, uint8_t level) {
 | 
				
			||||||
  if (level >= lcd_status_message_level) {
 | 
					  if (level >= lcd_status_message_level) {
 | 
				
			||||||
    strncpy_P(lcd_status_message, message, LCD_WIDTH);
 | 
					    strncpy_P(lcd_status_message, message, 3*LCD_WIDTH);
 | 
				
			||||||
 | 
					    set_utf_strlen(lcd_status_message, LCD_WIDTH);
 | 
				
			||||||
    lcd_status_message_level = level;
 | 
					    lcd_status_message_level = level;
 | 
				
			||||||
    lcd_finishstatus(level > 0);
 | 
					    lcd_finishstatus(level > 0);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user