Fix iss#1492
Introduced lcd_strlen() and lcd_strlen_P(). Replaced the old functions where necessary. Reworked language_ru.h. Speeded up test for zero length string in cardreader.cpp
This commit is contained in:
		| @@ -14,10 +14,14 @@ | |||||||
| // it is a Russian alphabet translation | // it is a Russian alphabet translation | ||||||
| // except 0401 --> 0xa2 = ╗, 0451 --> 0xb5 | // except 0401 --> 0xa2 = ╗, 0451 --> 0xb5 | ||||||
| const PROGMEM uint8_t utf_recode[] =  | const PROGMEM uint8_t utf_recode[] =  | ||||||
|        { 0x41,0xa0,0x42,0xa1,0xe0,0x45,0xa3,0xa4,0xa5,0xa6,0x4b,0xa7,0x4d,0x48,0x4f, |        { 0x41,0xa0,0x42,0xa1,0xe0,0x45,0xa3,0xa4, | ||||||
|          0xa8,0x50,0x43,0x54,0xa9,0xaa,0x58,0xe1,0xab,0xac,0xe2,0xad,0xae,0x62,0xaf,0xb0,0xb1, |          0xa5,0xa6,0x4b,0xa7,0x4d,0x48,0x4f,0xa8, | ||||||
|          0x61,0xb2,0xb3,0xb4,0xe3,0x65,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0x6f, |          0x50,0x43,0x54,0xa9,0xaa,0x58,0xe1,0xab, | ||||||
|          0xbe,0x70,0x63,0xbf,0x79,0xe4,0x78,0xe5,0xc0,0xc1,0xe6,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7 |          0xac,0xe2,0xad,0xae,0x62,0xaf,0xb0,0xb1, | ||||||
|  |          0x61,0xb2,0xb3,0xb4,0xe3,0x65,0xb6,0xb7, | ||||||
|  |          0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0x6f,0xbe, | ||||||
|  |          0x70,0x63,0xbf,0x79,0xe4,0x78,0xe5,0xc0, | ||||||
|  |          0xc1,0xe6,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7 | ||||||
|         };      |         };      | ||||||
|  |  | ||||||
| // When the display powers up, it is configured as follows: | // When the display powers up, it is configured as follows: | ||||||
|   | |||||||
| @@ -65,7 +65,7 @@ void CardReader::lsDive(const char *prepend, SdFile parent, const char * const m | |||||||
|       createFilename(lfilename,p); |       createFilename(lfilename,p); | ||||||
|        |        | ||||||
|       path[0]=0; |       path[0]=0; | ||||||
|       if(strlen(prepend)==0) //avoid leading / if already in prepend |       if(prepend[0]==0) //avoid leading / if already in prepend | ||||||
|       { |       { | ||||||
|        strcat(path,"/"); |        strcat(path,"/"); | ||||||
|       } |       } | ||||||
|   | |||||||
| @@ -315,7 +315,7 @@ static void lcd_implementation_drawmenu_generic(uint8_t row, const char* pstr, c | |||||||
|  |  | ||||||
| static void _drawmenu_setting_edit_generic(uint8_t row, const char* pstr, char pre_char, const char* data, bool pgm) { | static void _drawmenu_setting_edit_generic(uint8_t row, const char* pstr, char pre_char, const char* data, bool pgm) { | ||||||
|   char c; |   char c; | ||||||
|   uint8_t n = LCD_WIDTH - 2 - (pgm ? strlen_P(data) : (strlen(data))); |   uint8_t n = LCD_WIDTH - 2 - (pgm ? lcd_strlen_P(data) : (lcd_strlen((char*)data))); | ||||||
|  |  | ||||||
|   lcd_implementation_mark_as_selected(row, pre_char); |   lcd_implementation_mark_as_selected(row, pre_char); | ||||||
|  |  | ||||||
| @@ -377,18 +377,18 @@ void lcd_implementation_drawedit(const char* pstr, char* value) { | |||||||
|   uint8_t char_width = DOG_CHAR_WIDTH; |   uint8_t char_width = DOG_CHAR_WIDTH; | ||||||
|  |  | ||||||
|   #ifdef USE_BIG_EDIT_FONT |   #ifdef USE_BIG_EDIT_FONT | ||||||
|     if (strlen_P(pstr) <= LCD_WIDTH_EDIT - 1) { |     if (lcd_strlen_P(pstr) <= LCD_WIDTH_EDIT - 1) { | ||||||
|       u8g.setFont(FONT_MENU_EDIT); |       u8g.setFont(FONT_MENU_EDIT); | ||||||
|       lcd_width = LCD_WIDTH_EDIT + 1; |       lcd_width = LCD_WIDTH_EDIT + 1; | ||||||
|       char_width = DOG_CHAR_WIDTH_EDIT; |       char_width = DOG_CHAR_WIDTH_EDIT; | ||||||
|       if (strlen_P(pstr) >= LCD_WIDTH_EDIT - strlen(value)) rows = 2; |       if (lcd_strlen_P(pstr) >= LCD_WIDTH_EDIT - lcd_strlen(value)) rows = 2; | ||||||
|     } |     } | ||||||
|     else { |     else { | ||||||
|       u8g.setFont(FONT_MENU); |       u8g.setFont(FONT_MENU); | ||||||
|     } |     } | ||||||
|   #endif |   #endif | ||||||
|  |  | ||||||
|   if (strlen_P(pstr) > LCD_WIDTH - 2 - strlen(value)) rows = 2; |   if (lcd_strlen_P(pstr) > LCD_WIDTH - 2 - lcd_strlen(value)) rows = 2; | ||||||
|  |  | ||||||
|   const float kHalfChar = DOG_CHAR_HEIGHT_EDIT / 2; |   const float kHalfChar = DOG_CHAR_HEIGHT_EDIT / 2; | ||||||
|   float rowHeight = u8g.getHeight() / (rows + 1); // 1/(rows+1) = 1/2 or 1/3 |   float rowHeight = u8g.getHeight() / (rows + 1); // 1/(rows+1) = 1/2 or 1/3 | ||||||
| @@ -396,7 +396,7 @@ void lcd_implementation_drawedit(const char* pstr, char* value) { | |||||||
|   u8g.setPrintPos(0, rowHeight + kHalfChar); |   u8g.setPrintPos(0, rowHeight + kHalfChar); | ||||||
|   lcd_printPGM(pstr); |   lcd_printPGM(pstr); | ||||||
|   u8g.print(':'); |   u8g.print(':'); | ||||||
|   u8g.setPrintPos((lcd_width-1-strlen(value)) * char_width, rows * rowHeight + kHalfChar); |   u8g.setPrintPos((lcd_width-1-lcd_strlen(value)) * char_width, rows * rowHeight + kHalfChar); | ||||||
|   u8g.print(value); |   u8g.print(value); | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -13,7 +13,7 @@ | |||||||
| #define WELCOME_MSG                         MACHINE_NAME " Готов." | #define WELCOME_MSG                         MACHINE_NAME " Готов." | ||||||
| #define MSG_SD_INSERTED                     "Карта вставлена" | #define MSG_SD_INSERTED                     "Карта вставлена" | ||||||
| #define MSG_SD_REMOVED                      "Карта извлечена" | #define MSG_SD_REMOVED                      "Карта извлечена" | ||||||
| #define MSG_MAIN                            "Меню \003" | #define MSG_MAIN                            "Меню" | ||||||
| #define MSG_AUTOSTART                       "Автостарт" | #define MSG_AUTOSTART                       "Автостарт" | ||||||
| #define MSG_DISABLE_STEPPERS                "Выкл. двигатели" | #define MSG_DISABLE_STEPPERS                "Выкл. двигатели" | ||||||
| #define MSG_AUTO_HOME                       "Парковка" | #define MSG_AUTO_HOME                       "Парковка" | ||||||
| @@ -43,14 +43,14 @@ | |||||||
| #define MSG_MOVE_1MM                        "Move 1mm" | #define MSG_MOVE_1MM                        "Move 1mm" | ||||||
| #define MSG_MOVE_10MM                       "Move 10mm" | #define MSG_MOVE_10MM                       "Move 10mm" | ||||||
| #define MSG_SPEED                           "Скорость" | #define MSG_SPEED                           "Скорость" | ||||||
| #define MSG_NOZZLE                          "\002 Фильера" | #define MSG_NOZZLE                          LCD_STR_THERMOMETER " Фильера" | ||||||
| #define MSG_BED                             "\002 Кровать" | #define MSG_BED                             LCD_STR_THERMOMETER " Кровать" | ||||||
| #define MSG_FAN_SPEED                       "Куллер" | #define MSG_FAN_SPEED                       "Куллер" | ||||||
| #define MSG_FLOW                            "Поток" | #define MSG_FLOW                            "Поток" | ||||||
| #define MSG_CONTROL                         "Настройки \003" | #define MSG_CONTROL                         "Настройки" | ||||||
| #define MSG_MIN                             "\002 Минимум" | #define MSG_MIN                             LCD_STR_THERMOMETER " Минимум" | ||||||
| #define MSG_MAX                             "\002 Максимум" | #define MSG_MAX                             LCD_STR_THERMOMETER " Максимум" | ||||||
| #define MSG_FACTOR                          "\002 Фактор" | #define MSG_FACTOR                          LCD_STR_THERMOMETER " Фактор" | ||||||
| #define MSG_AUTOTEMP                        "Autotemp" | #define MSG_AUTOTEMP                        "Autotemp" | ||||||
| #define MSG_ON                              "Вкл. " | #define MSG_ON                              "Вкл. " | ||||||
| #define MSG_OFF                             "Выкл. " | #define MSG_OFF                             "Выкл. " | ||||||
| @@ -75,10 +75,10 @@ | |||||||
| #define MSG_YSTEPS                          "Y шаг/mm" | #define MSG_YSTEPS                          "Y шаг/mm" | ||||||
| #define MSG_ZSTEPS                          "Z шаг/mm" | #define MSG_ZSTEPS                          "Z шаг/mm" | ||||||
| #define MSG_ESTEPS                          "E шаг/mm" | #define MSG_ESTEPS                          "E шаг/mm" | ||||||
| #define MSG_TEMPERATURE                     "Температура     \x7E" | #define MSG_TEMPERATURE                     "Температура" | ||||||
| #define MSG_MOTION                          "Скорости        \x7E" | #define MSG_MOTION                          "Скорости" | ||||||
| #define MSG_VOLUMETRIC                      "Filament" | #define MSG_VOLUMETRIC                      "Filament" | ||||||
| #define MSG_VOLUMETRIC_ENABLED		        "E in mm3" | #define MSG_VOLUMETRIC_ENABLED		          "E in mm3" | ||||||
| #define MSG_FILAMENT_SIZE_EXTRUDER_0        "Fil. Dia. 1" | #define MSG_FILAMENT_SIZE_EXTRUDER_0        "Fil. Dia. 1" | ||||||
| #define MSG_FILAMENT_SIZE_EXTRUDER_1        "Fil. Dia. 2" | #define MSG_FILAMENT_SIZE_EXTRUDER_1        "Fil. Dia. 2" | ||||||
| #define MSG_FILAMENT_SIZE_EXTRUDER_2        "Fil. Dia. 3" | #define MSG_FILAMENT_SIZE_EXTRUDER_2        "Fil. Dia. 3" | ||||||
| @@ -86,14 +86,14 @@ | |||||||
| #define MSG_STORE_EPROM                     "Сохранить в EPROM" | #define MSG_STORE_EPROM                     "Сохранить в EPROM" | ||||||
| #define MSG_LOAD_EPROM                      "Загруз. из EPROM" | #define MSG_LOAD_EPROM                      "Загруз. из EPROM" | ||||||
| #define MSG_RESTORE_FAILSAFE                "Сброс настроек" | #define MSG_RESTORE_FAILSAFE                "Сброс настроек" | ||||||
| #define MSG_REFRESH                         "\004Обновить" | #define MSG_REFRESH                         LCD_STR_REFRESH "Обновить" | ||||||
| #define MSG_WATCH                           "Обзор           \003" | #define MSG_WATCH                           "Обзор" | ||||||
| #define MSG_PREPARE                         "Действия        \x7E" | #define MSG_PREPARE                         "Действия" | ||||||
| #define MSG_TUNE                            "Настройки       \x7E" | #define MSG_TUNE                            "Настройки" | ||||||
| #define MSG_PAUSE_PRINT                     "Продолжить печать" | #define MSG_PAUSE_PRINT                     "Продолжить печать" | ||||||
| #define MSG_RESUME_PRINT                    "возобн. печать" | #define MSG_RESUME_PRINT                    "возобн. печать" | ||||||
| #define MSG_STOP_PRINT                      "Остановить печать" | #define MSG_STOP_PRINT                      "Остановить печать" | ||||||
| #define MSG_CARD_MENU                       "Меню карты      \x7E" | #define MSG_CARD_MENU                       "Меню карты" | ||||||
| #define MSG_NO_CARD                         "Нет карты" | #define MSG_NO_CARD                         "Нет карты" | ||||||
| #define MSG_DWELL                           "Сон..." | #define MSG_DWELL                           "Сон..." | ||||||
| #define MSG_USERWAIT                        "Ожиданиие" | #define MSG_USERWAIT                        "Ожиданиие" | ||||||
|   | |||||||
| @@ -1260,6 +1260,26 @@ void lcd_init() | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
|  | int lcd_strlen(char *s) { | ||||||
|  |      int i = 0, j = 0; | ||||||
|  |    while (s[i]) { | ||||||
|  |      if ((s[i] & 0xc0) != 0x80) j++; | ||||||
|  |      i++; | ||||||
|  |    } | ||||||
|  |    return j; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int lcd_strlen_P(const char *s) { | ||||||
|  |      int j = 0; | ||||||
|  |    while (pgm_read_byte(s)) { | ||||||
|  |      if ((pgm_read_byte(s) & 0xc0) != 0x80) j++; | ||||||
|  |      s++; | ||||||
|  |    } | ||||||
|  |    return j; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| void lcd_update() | void lcd_update() | ||||||
| { | { | ||||||
|     static unsigned long timeoutToStatus = 0; |     static unsigned long timeoutToStatus = 0; | ||||||
| @@ -1372,7 +1392,7 @@ void lcd_ignore_click(bool b) | |||||||
| } | } | ||||||
|  |  | ||||||
| void lcd_finishstatus() { | void lcd_finishstatus() { | ||||||
|   int len = strlen(lcd_status_message); |   int len = lcd_strlen(lcd_status_message); | ||||||
|   if (len > 0) { |   if (len > 0) { | ||||||
|     while (len < LCD_WIDTH) { |     while (len < LCD_WIDTH) { | ||||||
|       lcd_status_message[len++] = ' '; |       lcd_status_message[len++] = ' '; | ||||||
|   | |||||||
| @@ -4,7 +4,8 @@ | |||||||
| #include "Marlin.h" | #include "Marlin.h" | ||||||
|  |  | ||||||
| #ifdef ULTRA_LCD | #ifdef ULTRA_LCD | ||||||
|  |   int lcd_strlen(char *s); | ||||||
|  |   int lcd_strlen_P(const char *s); | ||||||
|   void lcd_update(); |   void lcd_update(); | ||||||
|   void lcd_init(); |   void lcd_init(); | ||||||
|   void lcd_setstatus(const char* message); |   void lcd_setstatus(const char* message); | ||||||
|   | |||||||
| @@ -636,7 +636,7 @@ static void lcd_implementation_drawmenu_generic(uint8_t row, const char* pstr, c | |||||||
|     { |     { | ||||||
|         lcd.print(c); |         lcd.print(c); | ||||||
|         pstr++; |         pstr++; | ||||||
|         n--; |         if ((pgm_read_byte(pstr) & 0xc0) != 0x80) n--; | ||||||
|     } |     } | ||||||
|     while(n--) |     while(n--) | ||||||
|         lcd.print(' '); |         lcd.print(' '); | ||||||
| @@ -648,9 +648,9 @@ static void lcd_implementation_drawmenu_setting_edit_generic(uint8_t row, const | |||||||
|     char c; |     char c; | ||||||
|     //Use all characters in narrow LCDs |     //Use all characters in narrow LCDs | ||||||
|   #if LCD_WIDTH < 20 |   #if LCD_WIDTH < 20 | ||||||
|       uint8_t n = LCD_WIDTH - 1 - 1 - strlen(data); |       uint8_t n = LCD_WIDTH - 1 - 1 - lcd_strlen(data); | ||||||
|     #else |     #else | ||||||
|       uint8_t n = LCD_WIDTH - 1 - 2 - strlen(data); |       uint8_t n = LCD_WIDTH - 1 - 2 - lcd_strlen(data); | ||||||
|   #endif |   #endif | ||||||
|     lcd.setCursor(0, row); |     lcd.setCursor(0, row); | ||||||
|     lcd.print(pre_char); |     lcd.print(pre_char); | ||||||
| @@ -658,7 +658,7 @@ static void lcd_implementation_drawmenu_setting_edit_generic(uint8_t row, const | |||||||
|     { |     { | ||||||
|         lcd.print(c); |         lcd.print(c); | ||||||
|         pstr++; |         pstr++; | ||||||
|         n--; |         if ((pgm_read_byte(pstr) & 0xc0) != 0x80) n--; | ||||||
|     } |     } | ||||||
|     lcd.print(':'); |     lcd.print(':'); | ||||||
|     while(n--) |     while(n--) | ||||||
| @@ -670,9 +670,9 @@ static void lcd_implementation_drawmenu_setting_edit_generic_P(uint8_t row, cons | |||||||
|     char c; |     char c; | ||||||
|     //Use all characters in narrow LCDs |     //Use all characters in narrow LCDs | ||||||
|   #if LCD_WIDTH < 20 |   #if LCD_WIDTH < 20 | ||||||
|       uint8_t n = LCD_WIDTH - 1 - 1 - strlen_P(data); |       uint8_t n = LCD_WIDTH - 1 - 1 - lcd_strlen_P(data); | ||||||
|     #else |     #else | ||||||
|       uint8_t n = LCD_WIDTH - 1 - 2 - strlen_P(data); |       uint8_t n = LCD_WIDTH - 1 - 2 - lcd_strlen_P(data); | ||||||
|   #endif |   #endif | ||||||
|     lcd.setCursor(0, row); |     lcd.setCursor(0, row); | ||||||
|     lcd.print(pre_char); |     lcd.print(pre_char); | ||||||
| @@ -680,7 +680,7 @@ static void lcd_implementation_drawmenu_setting_edit_generic_P(uint8_t row, cons | |||||||
|     { |     { | ||||||
|         lcd.print(c); |         lcd.print(c); | ||||||
|         pstr++; |         pstr++; | ||||||
|         n--; |         if ((pgm_read_byte(pstr) & 0xc0) != 0x80) n--; | ||||||
|     } |     } | ||||||
|     lcd.print(':'); |     lcd.print(':'); | ||||||
|     while(n--) |     while(n--) | ||||||
| @@ -733,9 +733,9 @@ void lcd_implementation_drawedit(const char* pstr, char* value) | |||||||
|     lcd_printPGM(pstr); |     lcd_printPGM(pstr); | ||||||
|     lcd.print(':'); |     lcd.print(':'); | ||||||
|    #if LCD_WIDTH < 20 |    #if LCD_WIDTH < 20 | ||||||
|       lcd.setCursor(LCD_WIDTH - strlen(value), 1); |       lcd.setCursor(LCD_WIDTH - lcd_strlen(value), 1); | ||||||
|     #else |     #else | ||||||
|       lcd.setCursor(LCD_WIDTH -1 - strlen(value), 1); |       lcd.setCursor(LCD_WIDTH -1 - lcd_strlen(value), 1); | ||||||
|    #endif |    #endif | ||||||
|     lcd.print(value); |     lcd.print(value); | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user