Latest upstream commits

master
Scott Lahteine 10 years ago
commit ffe0df4b36

@ -0,0 +1,145 @@
# LCD Language Font System
We deal with a variety of different displays.
And we try to display a lot of different languages in different scripts on them.
This system is ought to solve some of the related problems.
## The Displays
We have two different technologies for the displays:
* Character based displays:
Have a fixed set of symbols (charset - font) in their ROM.
All of them have a similar but not identical symbol set at the positions 0 to 127 similar to US-ASCII.
On the other hand symbols at places higher than 127 have mayor differences.
Until now we know of (and support):
* 1.) HD44780 and similar with Kana charset A00 https://www.sparkfun.com/datasheets/LCD/HD44780.pdf Page 17
These are very common, but sadly not very useful when writing in European languages.
* 2.) HD44780 and similar with Western charset A02 https://www.sparkfun.com/datasheets/LCD/HD44780.pdf Page 18
These are rare, but fairly useful for European languages. Also a limited number of Cyrillic symbols is available.
* 3.) HD44780 and similar with Cyrillic charset http://store.comet.bg/download-file.php?id=466 Page 14
Some of our Russian friends use them.
At all of them you can define 8 different symbols by yourself. In Marlin they are used for the Feedrate-, Thermometer-, ... symbols
* Full graphic displays:
Where we have the full freedom to display whatever we want, when we can make a program for it.
Currently we deal with 128x64 Pixel Displays and divide this area in about 5 Lines with about 22 columns.
Therefore we need fonts with a bounding box of about 6x10.
Until now we used a
* 1.) Marlin-font similar to ISO10646-1 but with special Symbols at the end, what made 'ü' and 'ä' inaccessible, in the size 6x10.
* 2.) Because these letters where to big for some locations on the info-screen we use a full ISO10646-1 font in the size of 6x9.(3200 byte)
* 3.) When we define USE_BIG_EDIT_FONT we use an additional ISO10646-1 font with 9x18, eating up another 3120 bytes of progmem - but readable without glasses.
## The Languages
For the moment Marlin wants to support a lot of languages:
* en English
* pl Polish
* fr French
* de German
* es Spanish
* ru Russian
* it Italian
* pt Portuguese
* pt-br Portuguese (Brazil)
* fi Finnish
* an Aragonese
* nl Dutch
* ca Catalan
* eu Basque-Euskera
and recently on [Thingiverse](http://www.thingiverse.com/) a new port to
* jp [Japanese](http://www.thingiverse.com/thing:664397)
appeared.
## The Problem
All of this languages, except the English, normally use extended symbol sets, not contained in US-ASCII.
Even the English translation uses some Symbols not in US-ASCII. ( '\002' for Thermometer, STR_h3 for '³')
And worse, in the code itself symbols are used, not taking in account, on what display they are written. [(This is true only for Displays with Japanese charset](https://github.com/MarlinFirmware/Marlin/blob/Development/Marlin/ultralcd_implementation_hitachi_HD44780.h#L218) on Western displays you'll see a '~' and on Cyrillic an 'arrow coming from top - pointing to left', what is quite the opposite of what the programmer wanted.)
The Germans want to use "ÄäÖöÜüß" the Finnish at least "äö". Other European languages want to see their accents on their letters.
For other scripts like Cyrillic, Japanese, Greek, Hebrew, ... you have to find totally different symbol sets.
Until now the problems where ignored widely.
The German translation used utf8 'ä' and 'ö' and did not care about showing garbage on ALL displays.
The Russian translators new that their system only works on the Cyrillic character displays and relied on special LCD routines (LiquidCrystalRus.cpp) to handle UTF8 but missed to implement a proper strlen().
The Japanese translator dealed with to scripts. He introduced a very special font for the full graphic displays and made use of the Japanese version of the character displays. Therefore he ended up with two pretty unreadable language.h files full of '\xxx' definitions.
Other languages ether tried to avoid wording with their special symbols or ignored the problem at all and used the basic symbols without the accents, dots, ... whatever.
## The (partial) Solution
On a 'perfect' system like Windows or Linux we'd dig out unifont.ttf and some code from the libraries and they'd do what we want. But we are on a embedded system with very limited resources. So we had to find ways to limit the used space (Alone unifont.ttf is about 12MB) and have to make some compromise.
### Aims:
* 1.) Make the input for translators as convenient as possible. (Unicode UTF8)
* 2.) Make the displays show the scripts as good as they can. (fonts, mapping tables)
* 3.) Don't destroy the existing language files.
* 3.) Don't loose to much speed
* 4.) Don't loose to much memory.
### Actions:
* a.) Declare the display hardware we use. (Configuration.h)
* b.) Declare the language ore script we use. (Configuration.h)
* c.) Declare the kind of input we use. Ether direct pointers to the font (\xxx) or UTF8 and the font to use on graphic displays. (language_xx.h)
* d.) Declare the needed translations. (language_xx.h)
* e.) Make strlen() work with UTF8. (ultralcd.cpp)
* f.) Seperate the Marlin Symbols to their own font. (dogm_font_data_Marlin_symbols.h)
* g.) Make the fontswitch function remember the last used font. (dogm_lcd_implementation.h)
* h.) Make output functions that count the number of written chars and switch the font to Marlin symbols and back when needed. (dogm_lcd_implementation.h) (ultralcd_implementation_hitachi_HD44780.h)
* i.) Make three fonts to simulate the HD44780 charsets on dogm-displays. With this fonts the translator can check how his translation will look on the character based displays.
* j.) Make ISO fonts for Cyrillic and Katakana because they do not need a mapping table and are faster to deal with and have a better charset (less compromises) than the HD44780 fonts.
* k.) Make mapping functions and tables to convert from UTF8 to the fonts and integrate in the new output functions. (utf_mapper.h)
* l.) Delete the not needed any more 'LiquidCrystalRus.xxx' files and their calls in 'ultralcd_implementation_hitachi_HD44780.h'.
* m.) Split 'dogm_font_data_Marlin.h' into separate fonts and delete. (+dogm_font_data_6x9_marlin.h , +dogm_font_data_Marlin_symbols.h, -dogm_font_data_Marlin.h)
* n.) Do a bit of preprocessor magic to match displays - fonts and mappers in 'utf_mapper.h'.
## Translators handbook
* a.) Check is there already is a language_xx.h file for your language (-> b.) or not (-> e.)
* b.) Ether their is declared MAPPER_NON (-> c.) or an other mapper (-> d.)
* c.) Symbols outside the normal ASCII-range (32-128) are written as "\xxx" and point directly into the font of the hardware you declared in 'Configuration.h'
This is one of the three fonts of the character based Hitachi displays (DISPLAY_CHARSET_HD44780_JAPAN, DISPLAY_CHARSET_HD44780_WEST, DISPLAY_CHARSET_HD44780_CYRILIC).
Even on the full graphic displays one of these will be used when SIMULATE_ROMFONT is defined.
If you don't make use of the extended character set your file will look like 'language_en.h' and your language file will work on all the displays.
If you make intensive use, your file will look like 'language_kana.h' and your language file will only work on one of displays. (in this case DISPLAY_CHARSET_HD44780_JAPAN)
Be careful with the characters 0x5c = '\', and 0x7b - 0x7f. "{|}"These are not the same on all variants.
MAPPER_NON is the fastest an least memory consuming variant.
If you want to make use of more than a view symbols outside standard ASCII or want to improve the portability to more different types of displays use UTF8 input. That means define an other mapper.
* d.) With a mapper different to MAPPER_NON UTF8 input is used. Instead of "\xe1" (on a display with Japanese font) or STR_ae simply use "ä". When the string is read byte by byte , the "ä" will expand to "\0xc3\0xa4" or "Я" will expand to "0xd0\0xaf" or "ホ" will expand to "\0xe3\0x83\0x9b"
To limit the used memory we can't use all the possibilities UTF8 gives at the same time. We define a subset matching to the language or script we use.
* MAPPER_C2C3 correspondents good with west European languages the possible symbols are listed at (http://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block))
* MAPPER_D0D1 correspondents well with the Cyrillic languages. See (http://en.wikipedia.org/wiki/Cyrillic_(Unicode_block))
* MAPPER_E382E383 works with the Japanese Katakana script. See (http://en.wikipedia.org/wiki/Katakana_(Unicode_block))
The mapper functions will only catch the 'lead in' described in the mappers name. If the input they get does not match they'll put out a '?' or garbage.
The last byte in the sequence ether points directly into a matching ISO10646 font or via a mapper_table into one of the HD44780 fonts.
The mapper_tables do their best to find a similar symbol in the HD44780_fonts. For example replacing small letters with the matching capital letters. But they may fail to find something matching and will output a '?'. There are combinations of language and display what simply have no corresponding symbols - like Cyrillic on a Japanese display or visa versa - than the compiler will throw an error.
In short: Chose a Mapper working with the symbols you want to use. Use only symbols matching the mapper. On FULL graphic displays all will be fine, but check for daring replacements or question-marks in the output of character based displays by defining SIMULATE_ROMFONT and trying the different variants.
If you get a lot of question-marks on the Hitachi based displays with your new translation, maybe creating an additional language file with the format 'language_xx_utf8.h' is the way to go.
* MAPPER_NON is the fastest and least memory consuming variant.
* Mappers together with a ISO10646_font are the second best choice regarding speed and memory consumption. Only a few more decisions are mad per character.
* Mappers together with the HD44780_fonts use about additional 128 bytes for the mapping_table.
* e.) Creating a new language file is not a big thing. Just make a new file with the format 'language_xx.h' or maybe 'language.xx.utf8.h', define a mapper and a font in there and translate some of the strings defined in language_en.h. You can drop the surrounding #ifndef #endif. You don't have to translate all the stings - the missing one will be added by language_en.h - in English - of cause.
* f.) If you cant find a matching mapper things will be a bit more complex. With the Hitachi based displays you will not have big chance to make something useful unless you have one with a matching charset. For a full graphic display - lets explain with - let's say Greece.
Find a matching charset. (http://en.wikipedia.org/wiki/Greek_and_Coptic)
Provide a font containing the symbols in the right size. Normal ASCII in the lower 127 places, the upper with your selection.
Write a mapper catching, in this case, 0xcd to 0xcf and add it to 'utf_mapper.h'.
In case of a ISO10646 font we have a MAPPER_ONE_TO_ONE and don't have to make a table.
* g.) If you discover enough useful symbols in one of the HD44780 fonts you can provide a mapping table. For example HD44780_WEST contains 'alpha', 'beta', 'pi', 'Sigma', 'omega' 'My' - what is not enough to make USEFUL table - I think.
* h.) If you want to integrate an entirely new variant of a Hitachi based display.
Add it in 'Configuration.h'. Define mapper tables in 'utf_mapper.h'. Maybe you need a new mapper function.
The length of the strings is limited. '17 chars' was crude rule of thumb. Obviously 17 is to long for the 16x2 displays. A more exact rule would be max_strlen = Displaywidth - 2 - strlen(value to display behind). This is a bit complicated. So try and count is my rule of thumb.
On the 16x2 displays the strings are cut at the end to fit on the display. So it's a good idea to make them differ early. ('Somverylongoptionname x' -> 'x Somverylongoptionname')
You'll find all translatable strings in 'language_en.h'. Please don't translate any strings from 'language.h', this may break the serial protocol.
## User Instructions
Define your hardware and the wanted language in 'Configuration.h'.
To find out what charset your hardware is, define language 'test' and compile. In the menu you will see two lines from the upper half of the charset.
* DISPLAY_CHARSET_HD44780_JAPAN locks like "バパヒビピフブプヘベペホボポマミ"
* DISPLAY_CHARSET_HD44780_WESTERN locks like "ÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß"
* DISPLAY_CHARSET_HD44780_CYRILIC locks like "РСТУФХЦЧШЩЪЫЬЭЮЯ"
If you get an error about missing mappers during compilation - lie about your displays hardware font to see at lest some garbage, or select an other language.
English works on all hardware.

@ -362,7 +362,7 @@
#define HAS_AUTO_FAN_1 (defined(EXTRUDER_1_AUTO_FAN_PIN) && EXTRUDER_1_AUTO_FAN_PIN >= 0) #define HAS_AUTO_FAN_1 (defined(EXTRUDER_1_AUTO_FAN_PIN) && EXTRUDER_1_AUTO_FAN_PIN >= 0)
#define HAS_AUTO_FAN_2 (defined(EXTRUDER_2_AUTO_FAN_PIN) && EXTRUDER_2_AUTO_FAN_PIN >= 0) #define HAS_AUTO_FAN_2 (defined(EXTRUDER_2_AUTO_FAN_PIN) && EXTRUDER_2_AUTO_FAN_PIN >= 0)
#define HAS_AUTO_FAN_3 (defined(EXTRUDER_3_AUTO_FAN_PIN) && EXTRUDER_3_AUTO_FAN_PIN >= 0) #define HAS_AUTO_FAN_3 (defined(EXTRUDER_3_AUTO_FAN_PIN) && EXTRUDER_3_AUTO_FAN_PIN >= 0)
#define HAS_AUTO_FAN HAS_AUTO_FAN_0 || HAS_AUTO_FAN_1 || HAS_AUTO_FAN_2 || HAS_AUTO_FAN_3 #define HAS_AUTO_FAN (HAS_AUTO_FAN_0 || HAS_AUTO_FAN_1 || HAS_AUTO_FAN_2 || HAS_AUTO_FAN_3)
#define HAS_FAN (defined(FAN_PIN) && FAN_PIN >= 0) #define HAS_FAN (defined(FAN_PIN) && FAN_PIN >= 0)
/** /**

@ -532,9 +532,11 @@ const bool Z_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic o
// Custom M code points // Custom M code points
#define CUSTOM_M_CODES #define CUSTOM_M_CODES
#ifdef CUSTOM_M_CODES #ifdef CUSTOM_M_CODES
#ifdef ENABLE_AUTO_BED_LEVELING
#define CUSTOM_M_CODE_SET_Z_PROBE_OFFSET 851 #define CUSTOM_M_CODE_SET_Z_PROBE_OFFSET 851
#define Z_PROBE_OFFSET_RANGE_MIN -15 #define Z_PROBE_OFFSET_RANGE_MIN -20
#define Z_PROBE_OFFSET_RANGE_MAX -5 #define Z_PROBE_OFFSET_RANGE_MAX 20
#endif
#endif #endif
@ -561,13 +563,16 @@ const bool Z_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic o
//==============================LCD and SD support============================= //==============================LCD and SD support=============================
// Define your display language below. Replace (en) with your language code and uncomment. // Define your display language below. Replace (en) with your language code and uncomment.
// en, pl, fr, de, es, ru, it, pt, pt-br, fi, an, nl, ca, eu // en, pl, fr, de, es, ru, it, pt, pt-br, fi, an, nl, ca, eu, kana, kana_utf8, test
// See also language.h // See also language.h
//#define LANGUAGE_INCLUDE GENERATE_LANGUAGE_INCLUDE(en) #define LANGUAGE_INCLUDE GENERATE_LANGUAGE_INCLUDE(en)
// Character based displays can have different extended charsets. // Chose ONE of the next three charsets. This has to match your hardware. In case of a full graphic display this information is not important.
#define DISPLAY_CHARSET_HD44780_JAPAN // "ääööüüß23°" // To find out what type you have - compile with (test) - upload - click to get the menu. You'll see two typical lines from the upper half of the charset.
//#define DISPLAY_CHARSET_HD44780_WESTERN // "ÄäÖöÜüß²³°" if you see a '~' instead of a 'arrow_right' at the right of submenuitems - this is the right one. // See also documentation/LCDLanguageFont.md
#define DISPLAY_CHARSET_HD44780_JAPAN // this is the most common hardware
//#define DISPLAY_CHARSET_HD44780_WESTERN
//#define DISPLAY_CHARSET_HD44780_CYRILLIC
//#define ULTRA_LCD //general LCD support, also 16x2 //#define ULTRA_LCD //general LCD support, also 16x2
//#define DOGLCD // Support for SPI LCD 128x64 (Controller ST7565R graphic Display Family) //#define DOGLCD // Support for SPI LCD 128x64 (Controller ST7565R graphic Display Family)
@ -580,6 +585,7 @@ const bool Z_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic o
//#define ULTIPANEL //the UltiPanel as on Thingiverse //#define ULTIPANEL //the UltiPanel as on Thingiverse
//#define LCD_FEEDBACK_FREQUENCY_HZ 1000 // this is the tone frequency the buzzer plays when on UI feedback. ie Screen Click //#define LCD_FEEDBACK_FREQUENCY_HZ 1000 // this is the tone frequency the buzzer plays when on UI feedback. ie Screen Click
//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 100 // the duration the buzzer plays the UI feedback sound. ie Screen Click //#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 100 // the duration the buzzer plays the UI feedback sound. ie Screen Click
// 0 to disable buzzer feedback
// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) // PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3)
// http://reprap.org/wiki/PanelOne // http://reprap.org/wiki/PanelOne

@ -11,7 +11,7 @@
* max_acceleration_units_per_sq_second (x4) * max_acceleration_units_per_sq_second (x4)
* acceleration * acceleration
* retract_acceleration * retract_acceleration
* travel_aceeleration * travel_acceleration
* minimumfeedrate * minimumfeedrate
* mintravelfeedrate * mintravelfeedrate
* minsegmenttime * minsegmenttime
@ -25,6 +25,7 @@
* mesh_num_x * mesh_num_x
* mesh_num_y * mesh_num_y
* z_values[][] * z_values[][]
* zprobe_zoffset
* *
* DELTA: * DELTA:
* endstop_adj (x3) * endstop_adj (x3)
@ -39,7 +40,6 @@
* absPreheatHotendTemp * absPreheatHotendTemp
* absPreheatHPBTemp * absPreheatHPBTemp
* absPreheatFanSpeed * absPreheatFanSpeed
* zprobe_zoffset
* *
* PIDTEMP: * PIDTEMP:
* Kp[0], Ki[0], Kd[0], Kc[0] * Kp[0], Ki[0], Kd[0], Kc[0]
@ -118,7 +118,7 @@ void _EEPROM_readData(int &pos, uint8_t* value, uint8_t size) {
// wrong data being written to the variables. // wrong data being written to the variables.
// ALSO: always make sure the variables in the Store and retrieve sections are in the same order. // ALSO: always make sure the variables in the Store and retrieve sections are in the same order.
#define EEPROM_VERSION "V17" #define EEPROM_VERSION "V18"
#ifdef EEPROM_SETTINGS #ifdef EEPROM_SETTINGS
@ -143,7 +143,7 @@ void Config_StoreSettings() {
uint8_t mesh_num_x = 3; uint8_t mesh_num_x = 3;
uint8_t mesh_num_y = 3; uint8_t mesh_num_y = 3;
#if defined(MESH_BED_LEVELING) #ifdef MESH_BED_LEVELING
// Compile time test that sizeof(mbl.z_values) is as expected // Compile time test that sizeof(mbl.z_values) is as expected
typedef char c_assert[(sizeof(mbl.z_values) == MESH_NUM_X_POINTS*MESH_NUM_Y_POINTS*sizeof(dummy)) ? 1 : -1]; typedef char c_assert[(sizeof(mbl.z_values) == MESH_NUM_X_POINTS*MESH_NUM_Y_POINTS*sizeof(dummy)) ? 1 : -1];
mesh_num_x = MESH_NUM_X_POINTS; mesh_num_x = MESH_NUM_X_POINTS;
@ -163,6 +163,11 @@ void Config_StoreSettings() {
} }
#endif // MESH_BED_LEVELING #endif // MESH_BED_LEVELING
#ifndef ENABLE_AUTO_BED_LEVELING
float zprobe_zoffset = 0;
#endif
EEPROM_WRITE_VAR(i, zprobe_zoffset);
#ifdef DELTA #ifdef DELTA
EEPROM_WRITE_VAR(i, endstop_adj); // 3 floats EEPROM_WRITE_VAR(i, endstop_adj); // 3 floats
EEPROM_WRITE_VAR(i, delta_radius); // 1 float EEPROM_WRITE_VAR(i, delta_radius); // 1 float
@ -188,7 +193,7 @@ void Config_StoreSettings() {
EEPROM_WRITE_VAR(i, absPreheatHotendTemp); EEPROM_WRITE_VAR(i, absPreheatHotendTemp);
EEPROM_WRITE_VAR(i, absPreheatHPBTemp); EEPROM_WRITE_VAR(i, absPreheatHPBTemp);
EEPROM_WRITE_VAR(i, absPreheatFanSpeed); EEPROM_WRITE_VAR(i, absPreheatFanSpeed);
EEPROM_WRITE_VAR(i, zprobe_zoffset);
for (int e = 0; e < 4; e++) { for (int e = 0; e < 4; e++) {
@ -328,6 +333,11 @@ void Config_RetrieveSettings() {
} }
#endif // MESH_BED_LEVELING #endif // MESH_BED_LEVELING
#ifndef ENABLE_AUTO_BED_LEVELING
float zprobe_zoffset = 0;
#endif
EEPROM_READ_VAR(i, zprobe_zoffset);
#ifdef DELTA #ifdef DELTA
EEPROM_READ_VAR(i, endstop_adj); // 3 floats EEPROM_READ_VAR(i, endstop_adj); // 3 floats
EEPROM_READ_VAR(i, delta_radius); // 1 float EEPROM_READ_VAR(i, delta_radius); // 1 float
@ -353,7 +363,6 @@ void Config_RetrieveSettings() {
EEPROM_READ_VAR(i, absPreheatHotendTemp); EEPROM_READ_VAR(i, absPreheatHotendTemp);
EEPROM_READ_VAR(i, absPreheatHPBTemp); EEPROM_READ_VAR(i, absPreheatHPBTemp);
EEPROM_READ_VAR(i, absPreheatFanSpeed); EEPROM_READ_VAR(i, absPreheatFanSpeed);
EEPROM_READ_VAR(i, zprobe_zoffset);
#ifdef PIDTEMP #ifdef PIDTEMP
for (int e = 0; e < 4; e++) { // 4 = max extruders currently supported by Marlin for (int e = 0; e < 4; e++) { // 4 = max extruders currently supported by Marlin
@ -461,9 +470,13 @@ void Config_ResetDefault() {
max_e_jerk = DEFAULT_EJERK; max_e_jerk = DEFAULT_EJERK;
home_offset[X_AXIS] = home_offset[Y_AXIS] = home_offset[Z_AXIS] = 0; home_offset[X_AXIS] = home_offset[Y_AXIS] = home_offset[Z_AXIS] = 0;
#if defined(MESH_BED_LEVELING) #ifdef MESH_BED_LEVELING
mbl.active = 0; mbl.active = 0;
#endif // MESH_BED_LEVELING #endif
#ifdef ENABLE_AUTO_BED_LEVELING
zprobe_zoffset = -Z_PROBE_OFFSET_FROM_EXTRUDER;
#endif
#ifdef DELTA #ifdef DELTA
endstop_adj[X_AXIS] = endstop_adj[Y_AXIS] = endstop_adj[Z_AXIS] = 0; endstop_adj[X_AXIS] = endstop_adj[Y_AXIS] = endstop_adj[Z_AXIS] = 0;
@ -484,10 +497,6 @@ void Config_ResetDefault() {
absPreheatFanSpeed = ABS_PREHEAT_FAN_SPEED; absPreheatFanSpeed = ABS_PREHEAT_FAN_SPEED;
#endif #endif
#ifdef ENABLE_AUTO_BED_LEVELING
zprobe_zoffset = -Z_PROBE_OFFSET_FROM_EXTRUDER;
#endif
#ifdef DOGLCD #ifdef DOGLCD
lcd_contrast = DEFAULT_LCD_CONTRAST; lcd_contrast = DEFAULT_LCD_CONTRAST;
#endif #endif
@ -738,15 +747,20 @@ void Config_PrintSettings(bool forReplay) {
} }
} }
#ifdef CUSTOM_M_CODES #ifdef ENABLE_AUTO_BED_LEVELING
SERIAL_ECHO_START; SERIAL_ECHO_START;
#ifdef CUSTOM_M_CODES
if (!forReplay) { if (!forReplay) {
SERIAL_ECHOLNPGM("Z-Probe Offset (mm):"); SERIAL_ECHOLNPGM("Z-Probe Offset (mm):");
SERIAL_ECHO_START; SERIAL_ECHO_START;
} }
SERIAL_ECHO(" M"); SERIAL_ECHOPAIR(" M", (unsigned long)CUSTOM_M_CODE_SET_Z_PROBE_OFFSET);
SERIAL_ECHO(CUSTOM_M_CODE_SET_Z_PROBE_OFFSET);
SERIAL_ECHOPAIR(" Z", -zprobe_zoffset); SERIAL_ECHOPAIR(" Z", -zprobe_zoffset);
#else
if (!forReplay) {
SERIAL_ECHOPAIR("Z-Probe Offset (mm):", -zprobe_zoffset);
}
#endif
SERIAL_EOL; SERIAL_EOL;
#endif #endif
} }

@ -1,393 +0,0 @@
#include "LiquidCrystalRus.h"
#include <stdio.h>
#include <string.h>
#include <inttypes.h>
#include <avr/pgmspace.h>
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
// it is a Russian alphabet translation
// except 0401 --> 0xa2 = ╗, 0451 --> 0xb5
const PROGMEM uint8_t utf_recode[] =
{ 0x41,0xa0,0x42,0xa1,0xe0,0x45,0xa3,0xa4,
0xa5,0xa6,0x4b,0xa7,0x4d,0x48,0x4f,0xa8,
0x50,0x43,0x54,0xa9,0xaa,0x58,0xe1,0xab,
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:
//
// 1. Display clear
// 2. Function set:
// DL = 1; 8-bit interface data
// N = 0; 1-line display
// F = 0; 5x8 dot character font
// 3. Display on/off control:
// D = 0; Display off
// C = 0; Cursor off
// B = 0; Blinking off
// 4. Entry mode set:
// I/D = 1; Increment by 1
// S = 0; No shift
//
// Note, however, that resetting the Arduino doesn't reset the LCD, so we
// can't assume that it's in that state when a sketch starts (and the
// LiquidCrystal constructor is called).
//
// modified 27 Jul 2011
// by Ilya V. Danilov http://mk90.ru/
LiquidCrystalRus::LiquidCrystalRus(uint8_t rs, uint8_t rw, uint8_t enable,
uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7)
{
init(0, rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7);
}
LiquidCrystalRus::LiquidCrystalRus(uint8_t rs, uint8_t enable,
uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7)
{
init(0, rs, 255, enable, d0, d1, d2, d3, d4, d5, d6, d7);
}
LiquidCrystalRus::LiquidCrystalRus(uint8_t rs, uint8_t rw, uint8_t enable,
uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3)
{
init(1, rs, rw, enable, d0, d1, d2, d3, 0, 0, 0, 0);
}
LiquidCrystalRus::LiquidCrystalRus(uint8_t rs, uint8_t enable,
uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3)
{
init(1, rs, 255, enable, d0, d1, d2, d3, 0, 0, 0, 0);
}
void LiquidCrystalRus::init(uint8_t fourbitmode, uint8_t rs, uint8_t rw, uint8_t enable,
uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7)
{
_rs_pin = rs;
_rw_pin = rw;
_enable_pin = enable;
_data_pins[0] = d0;
_data_pins[1] = d1;
_data_pins[2] = d2;
_data_pins[3] = d3;
_data_pins[4] = d4;
_data_pins[5] = d5;
_data_pins[6] = d6;
_data_pins[7] = d7;
pinMode(_rs_pin, OUTPUT);
// we can save 1 pin by not using RW. Indicate by passing 255 instead of pin#
if (_rw_pin != 255) {
pinMode(_rw_pin, OUTPUT);
}
pinMode(_enable_pin, OUTPUT);
if (fourbitmode)
_displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS;
else
_displayfunction = LCD_8BITMODE | LCD_1LINE | LCD_5x8DOTS;
begin(16, 1);
}
void LiquidCrystalRus::begin(uint8_t cols, uint8_t lines, uint8_t dotsize) {
if (lines > 1) {
_displayfunction |= LCD_2LINE;
}
_numlines = lines;
_currline = 0;
// for some 1 line displays you can select a 10 pixel high font
if ((dotsize != 0) && (lines == 1)) {
_displayfunction |= LCD_5x10DOTS;
}
// SEE PAGE 45/46 FOR INITIALIZATION SPECIFICATION!
// according to datasheet, we need at least 40ms after power rises above 2.7V
// before sending commands. Arduino can turn on way before 4.5V so we'll wait 50
delayMicroseconds(50000);
// Now we pull both RS and R/W low to begin commands
digitalWrite(_rs_pin, LOW);
digitalWrite(_enable_pin, LOW);
if (_rw_pin != 255) {
digitalWrite(_rw_pin, LOW);
}
//put the LCD into 4 bit or 8 bit mode
if (! (_displayfunction & LCD_8BITMODE)) {
// this is according to the Hitachi HD44780 datasheet
// figure 24, pg 46
// we start in 8bit mode, try to set 4 bit mode
writeNbits(0x03,4);
delayMicroseconds(4500); // wait min 4.1ms
// second try
writeNbits(0x03,4);
delayMicroseconds(4500); // wait min 4.1ms
// third go!
writeNbits(0x03,4);
delayMicroseconds(150);
// finally, set to 8-bit interface
writeNbits(0x02,4);
} else {
// this is according to the Hitachi HD44780 datasheet
// page 45 figure 23
// Send function set command sequence
command(LCD_FUNCTIONSET | _displayfunction);
delayMicroseconds(4500); // wait more than 4.1ms
// second try
command(LCD_FUNCTIONSET | _displayfunction);
delayMicroseconds(150);
// third go
command(LCD_FUNCTIONSET | _displayfunction);
}
// finally, set # lines, font size, etc.
command(LCD_FUNCTIONSET | _displayfunction);
// turn the display on with no cursor or blinking default
_displaycontrol = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF;
display();
// clear it off
clear();
// Initialize to default text direction (for romance languages)
_displaymode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT;
// set the entry mode
command(LCD_ENTRYMODESET | _displaymode);
}
void LiquidCrystalRus::setDRAMModel(uint8_t model) {
_dram_model = model;
}
/********** high level commands, for the user! */
void LiquidCrystalRus::clear()
{
command(LCD_CLEARDISPLAY); // clear display, set cursor position to zero
delayMicroseconds(2000); // this command takes a long time!
}
void LiquidCrystalRus::home()
{
command(LCD_RETURNHOME); // set cursor position to zero
delayMicroseconds(2000); // this command takes a long time!
}
void LiquidCrystalRus::setCursor(uint8_t col, uint8_t row)
{
int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 };
if ( row >= _numlines ) {
row = _numlines-1; // we count rows starting w/0
}
command(LCD_SETDDRAMADDR | (col + row_offsets[row]));
}
// Turn the display on/off (quickly)
void LiquidCrystalRus::noDisplay() {
_displaycontrol &= ~LCD_DISPLAYON;
command(LCD_DISPLAYCONTROL | _displaycontrol);
}
void LiquidCrystalRus::display() {
_displaycontrol |= LCD_DISPLAYON;
command(LCD_DISPLAYCONTROL | _displaycontrol);
}
// Turns the underline cursor on/off
void LiquidCrystalRus::noCursor() {
_displaycontrol &= ~LCD_CURSORON;
command(LCD_DISPLAYCONTROL | _displaycontrol);
}
void LiquidCrystalRus::cursor() {
_displaycontrol |= LCD_CURSORON;
command(LCD_DISPLAYCONTROL | _displaycontrol);
}
// Turn on and off the blinking cursor
void LiquidCrystalRus::noBlink() {
_displaycontrol &= ~LCD_BLINKON;
command(LCD_DISPLAYCONTROL | _displaycontrol);
}
void LiquidCrystalRus::blink() {
_displaycontrol |= LCD_BLINKON;
command(LCD_DISPLAYCONTROL | _displaycontrol);
}
// These commands scroll the display without changing the RAM
void LiquidCrystalRus::scrollDisplayLeft(void) {
command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVELEFT);
}
void LiquidCrystalRus::scrollDisplayRight(void) {
command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVERIGHT);
}
// This is for text that flows Left to Right
void LiquidCrystalRus::leftToRight(void) {
_displaymode |= LCD_ENTRYLEFT;
command(LCD_ENTRYMODESET | _displaymode);
}
// This is for text that flows Right to Left
void LiquidCrystalRus::rightToLeft(void) {
_displaymode &= ~LCD_ENTRYLEFT;
command(LCD_ENTRYMODESET | _displaymode);
}
// This will 'right justify' text from the cursor
void LiquidCrystalRus::autoscroll(void) {
_displaymode |= LCD_ENTRYSHIFTINCREMENT;
command(LCD_ENTRYMODESET | _displaymode);
}
// This will 'left justify' text from the cursor
void LiquidCrystalRus::noAutoscroll(void) {
_displaymode &= ~LCD_ENTRYSHIFTINCREMENT;
command(LCD_ENTRYMODESET | _displaymode);
}
// Allows us to fill the first 8 CGRAM locations
// with custom characters
void LiquidCrystalRus::createChar(uint8_t location, uint8_t charmap[]) {
location &= 0x7; // we only have 8 locations 0-7
command(LCD_SETCGRAMADDR | (location << 3));
for (int i=0; i<8; i++) {
write(charmap[i]);
}
}
/*********** mid level commands, for sending data/cmds */
inline void LiquidCrystalRus::command(uint8_t value) {
send(value, LOW);
}
#if defined(ARDUINO) && ARDUINO >= 100
size_t LiquidCrystalRus::write(uint8_t value)
#else
void LiquidCrystalRus::write(uint8_t value)
#endif
{
uint8_t out_char=value;
if (_dram_model == LCD_DRAM_WH1601) {
uint8_t ac=recv(LOW) & 0x7f;
if (ac>7 && ac<0x14) command(LCD_SETDDRAMADDR | (0x40+ac-8));
}
if (value>=0x80) { // UTF-8 handling
if (value >= 0xc0) {
utf_hi_char = value - 0xd0;
} else {
value &= 0x3f;
if (!utf_hi_char && (value == 1))
send(0xa2,HIGH); // ╗
else if ((utf_hi_char == 1) && (value == 0x11))
send(0xb5,HIGH); // ╦
else
send(pgm_read_byte_near(utf_recode + value + (utf_hi_char<<6) - 0x10), HIGH);
}
} else send(out_char, HIGH);
#if defined(ARDUINO) && ARDUINO >= 100
return 1; // assume success
#endif
}
/************ low level data pushing commands **********/
// write either command or data, with automatic 4/8-bit selection
void LiquidCrystalRus::send(uint8_t value, uint8_t mode) {
digitalWrite(_rs_pin, mode);
// if there is a RW pin indicated, set it low to Write
if (_rw_pin != 255) {
digitalWrite(_rw_pin, LOW);
}
if (_displayfunction & LCD_8BITMODE) {
writeNbits(value,8);
} else {
writeNbits(value>>4,4);
writeNbits(value,4);
}
}
// read data, with automatic 4/8-bit selection
uint8_t LiquidCrystalRus::recv(uint8_t mode) {
uint8_t retval;
digitalWrite(_rs_pin, mode);
// if there is a RW pin indicated, set it low to Write
if (_rw_pin != 255) {
digitalWrite(_rw_pin, HIGH);
}
if (_displayfunction & LCD_8BITMODE) {
retval = readNbits(8);
} else {
retval = readNbits(4) << 4;
retval |= readNbits(4);
}
return retval;
}
void LiquidCrystalRus::pulseEnable() {
digitalWrite(_enable_pin, LOW);
delayMicroseconds(1);
digitalWrite(_enable_pin, HIGH);
delayMicroseconds(1); // enable pulse must be >450ns
digitalWrite(_enable_pin, LOW);
delayMicroseconds(100); // commands need > 37us to settle
}
void LiquidCrystalRus::writeNbits(uint8_t value, uint8_t n) {
for (int i = 0; i < n; i++) {
pinMode(_data_pins[i], OUTPUT);
digitalWrite(_data_pins[i], (value >> i) & 0x01);
}
pulseEnable();
}
uint8_t LiquidCrystalRus::readNbits(uint8_t n) {
uint8_t retval=0;
for (int i = 0; i < n; i++) {
pinMode(_data_pins[i], INPUT);
}
digitalWrite(_enable_pin, LOW);
delayMicroseconds(1);
digitalWrite(_enable_pin, HIGH);
delayMicroseconds(1); // enable pulse must be >450ns
for (int i = 0; i < n; i++) {
retval |= (digitalRead(_data_pins[i]) == HIGH)?(1 << i):0;
}
digitalWrite(_enable_pin, LOW);
return retval;
}

@ -1,129 +0,0 @@
//
// based on LiquidCrystal library from ArduinoIDE, see http://arduino.cc
// modified 27 Jul 2011
// by Ilya V. Danilov http://mk90.ru/
//
#ifndef LiquidCrystalRus_h
#define LiquidCrystalRus_h
#include <inttypes.h>
#include "Print.h"
// commands
#define LCD_CLEARDISPLAY 0x01
#define LCD_RETURNHOME 0x02
#define LCD_ENTRYMODESET 0x04
#define LCD_DISPLAYCONTROL 0x08
#define LCD_CURSORSHIFT 0x10
#define LCD_FUNCTIONSET 0x20
#define LCD_SETCGRAMADDR 0x40
#define LCD_SETDDRAMADDR 0x80
// flags for display entry mode
#define LCD_ENTRYRIGHT 0x00
#define LCD_ENTRYLEFT 0x02
#define LCD_ENTRYSHIFTINCREMENT 0x01
#define LCD_ENTRYSHIFTDECREMENT 0x00
// flags for display on/off control
#define LCD_DISPLAYON 0x04
#define LCD_DISPLAYOFF 0x00
#define LCD_CURSORON 0x02
#define LCD_CURSOROFF 0x00
#define LCD_BLINKON 0x01
#define LCD_BLINKOFF 0x00
// flags for display/cursor shift
#define LCD_DISPLAYMOVE 0x08
#define LCD_CURSORMOVE 0x00
#define LCD_MOVERIGHT 0x04
#define LCD_MOVELEFT 0x00
// flags for function set
#define LCD_8BITMODE 0x10
#define LCD_4BITMODE 0x00
#define LCD_2LINE 0x08
#define LCD_1LINE 0x00
#define LCD_5x10DOTS 0x04
#define LCD_5x8DOTS 0x00
// enum for
#define LCD_DRAM_Normal 0x00
#define LCD_DRAM_WH1601 0x01
class LiquidCrystalRus : public Print {
public:
LiquidCrystalRus(uint8_t rs, uint8_t enable,
uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7);
LiquidCrystalRus(uint8_t rs, uint8_t rw, uint8_t enable,
uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7);
LiquidCrystalRus(uint8_t rs, uint8_t rw, uint8_t enable,
uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3);
LiquidCrystalRus(uint8_t rs, uint8_t enable,
uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3);
void init(uint8_t fourbitmode, uint8_t rs, uint8_t rw, uint8_t enable,
uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7);
void begin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS);
void clear();
void home();
void noDisplay();
void display();
void noBlink();
void blink();
void noCursor();
void cursor();
void scrollDisplayLeft();
void scrollDisplayRight();
void leftToRight();
void rightToLeft();
void autoscroll();
void noAutoscroll();
void createChar(uint8_t, uint8_t[]);
void setCursor(uint8_t, uint8_t);
#if defined(ARDUINO) && ARDUINO >= 100
virtual size_t write(uint8_t);
using Print::write;
#else
virtual void write(uint8_t);
#endif
void command(uint8_t);
void setDRAMModel(uint8_t);
private:
void send(uint8_t, uint8_t);
void writeNbits(uint8_t, uint8_t);
uint8_t recv(uint8_t);
uint8_t readNbits(uint8_t);
void pulseEnable();
uint8_t _rs_pin; // LOW: command. HIGH: character.
uint8_t _rw_pin; // LOW: write to LCD. HIGH: read from LCD.
uint8_t _enable_pin; // activated by a HIGH pulse.
uint8_t _data_pins[8];
uint8_t _displayfunction;
uint8_t _displaycontrol;
uint8_t _displaymode;
uint8_t _initialized;
uint8_t _numlines,_currline;
uint8_t _dram_model;
uint8_t utf_hi_char; // UTF-8 high part
};
#endif

@ -251,7 +251,9 @@ extern float z_endstop_adj;
extern float min_pos[3]; extern float min_pos[3];
extern float max_pos[3]; extern float max_pos[3];
extern bool axis_known_position[3]; extern bool axis_known_position[3];
extern float zprobe_zoffset; #ifdef ENABLE_AUTO_BED_LEVELING
extern float zprobe_zoffset;
#endif
extern int fanSpeed; extern int fanSpeed;
#ifdef BARICUDA #ifdef BARICUDA
extern int ValvePressure; extern int ValvePressure;

@ -203,7 +203,8 @@
float homing_feedrate[] = HOMING_FEEDRATE; float homing_feedrate[] = HOMING_FEEDRATE;
#ifdef ENABLE_AUTO_BED_LEVELING #ifdef ENABLE_AUTO_BED_LEVELING
int xy_travel_speed = XY_TRAVEL_SPEED; int xy_travel_speed = XY_TRAVEL_SPEED;
float zprobe_zoffset = -Z_PROBE_OFFSET_FROM_EXTRUDER;
#endif #endif
int homing_bump_divisor[] = HOMING_BUMP_DIVISOR; int homing_bump_divisor[] = HOMING_BUMP_DIVISOR;
bool axis_relative_modes[] = AXIS_RELATIVE_MODES; bool axis_relative_modes[] = AXIS_RELATIVE_MODES;
@ -255,7 +256,6 @@ float home_offset[3] = { 0, 0, 0 };
float min_pos[3] = { X_MIN_POS, Y_MIN_POS, Z_MIN_POS }; float min_pos[3] = { X_MIN_POS, Y_MIN_POS, Z_MIN_POS };
float max_pos[3] = { X_MAX_POS, Y_MAX_POS, Z_MAX_POS }; float max_pos[3] = { X_MAX_POS, Y_MAX_POS, Z_MAX_POS };
bool axis_known_position[3] = { false, false, false }; bool axis_known_position[3] = { false, false, false };
float zprobe_zoffset;
// Extruder offset // Extruder offset
#if EXTRUDERS > 1 #if EXTRUDERS > 1
@ -1101,9 +1101,6 @@ static void set_bed_level_equation_lsq(double *plane_equation_coefficients)
current_position[Y_AXIS] = corrected_position.y; current_position[Y_AXIS] = corrected_position.y;
current_position[Z_AXIS] = corrected_position.z; current_position[Z_AXIS] = corrected_position.z;
// put the bed at 0 so we don't go below it.
current_position[Z_AXIS] = zprobe_zoffset; // in the lsq we reach here after raising the extruder due to the loop structure
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
} }
#endif #endif
@ -1117,11 +1114,13 @@ static void set_bed_level_equation_3pts(float z_at_pt_1, float z_at_pt_2, float
vector_3 pt1 = vector_3(ABL_PROBE_PT_1_X, ABL_PROBE_PT_1_Y, z_at_pt_1); vector_3 pt1 = vector_3(ABL_PROBE_PT_1_X, ABL_PROBE_PT_1_Y, z_at_pt_1);
vector_3 pt2 = vector_3(ABL_PROBE_PT_2_X, ABL_PROBE_PT_2_Y, z_at_pt_2); vector_3 pt2 = vector_3(ABL_PROBE_PT_2_X, ABL_PROBE_PT_2_Y, z_at_pt_2);
vector_3 pt3 = vector_3(ABL_PROBE_PT_3_X, ABL_PROBE_PT_3_Y, z_at_pt_3); vector_3 pt3 = vector_3(ABL_PROBE_PT_3_X, ABL_PROBE_PT_3_Y, z_at_pt_3);
vector_3 planeNormal = vector_3::cross(pt1 - pt2, pt3 - pt2).get_normal();
vector_3 from_2_to_1 = (pt1 - pt2).get_normal(); if (planeNormal.z < 0) {
vector_3 from_2_to_3 = (pt3 - pt2).get_normal(); planeNormal.x = -planeNormal.x;
vector_3 planeNormal = vector_3::cross(from_2_to_1, from_2_to_3).get_normal(); planeNormal.y = -planeNormal.y;
planeNormal = vector_3(planeNormal.x, planeNormal.y, abs(planeNormal.z)); planeNormal.z = -planeNormal.z;
}
plan_bed_level_matrix = matrix_3x3::create_look_at(planeNormal); plan_bed_level_matrix = matrix_3x3::create_look_at(planeNormal);
@ -1130,11 +1129,7 @@ static void set_bed_level_equation_3pts(float z_at_pt_1, float z_at_pt_2, float
current_position[Y_AXIS] = corrected_position.y; current_position[Y_AXIS] = corrected_position.y;
current_position[Z_AXIS] = corrected_position.z; current_position[Z_AXIS] = corrected_position.z;
// put the bed at 0 so we don't go below it.
current_position[Z_AXIS] = zprobe_zoffset;
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
} }
#endif // AUTO_BED_LEVELING_GRID #endif // AUTO_BED_LEVELING_GRID
@ -2017,8 +2012,19 @@ inline void gcode_G28() {
endstops_hit_on_purpose(); endstops_hit_on_purpose();
} }
#if defined(MESH_BED_LEVELING) #ifdef MESH_BED_LEVELING
/**
* G29: Mesh-based Z-Probe, probes a grid and produces a
* mesh to compensate for variable bed height
*
* Parameters With MESH_BED_LEVELING:
*
* S0 Produce a mesh report
* S1 Start probing mesh points
* S2 Probe the next mesh point
*
*/
inline void gcode_G29() { inline void gcode_G29() {
static int probe_point = -1; static int probe_point = -1;
int state = 0; int state = 0;
@ -2060,7 +2066,7 @@ inline void gcode_G28() {
} else if (state == 2) { // Goto next point } else if (state == 2) { // Goto next point
if (probe_point < 0) { if (probe_point < 0) {
SERIAL_PROTOCOLPGM("Mesh probing not started.\n"); SERIAL_PROTOCOLPGM("Start mesh probing with \"G29 S1\" first.\n");
return; return;
} }
int ix, iy; int ix, iy;
@ -2070,16 +2076,14 @@ inline void gcode_G28() {
} else { } else {
ix = (probe_point-1) % MESH_NUM_X_POINTS; ix = (probe_point-1) % MESH_NUM_X_POINTS;
iy = (probe_point-1) / MESH_NUM_X_POINTS; iy = (probe_point-1) / MESH_NUM_X_POINTS;
if (iy&1) { // Zig zag if (iy & 1) ix = (MESH_NUM_X_POINTS - 1) - ix; // zig-zag
ix = (MESH_NUM_X_POINTS - 1) - ix;
}
mbl.set_z(ix, iy, current_position[Z_AXIS]); mbl.set_z(ix, iy, current_position[Z_AXIS]);
current_position[Z_AXIS] = MESH_HOME_SEARCH_Z; current_position[Z_AXIS] = MESH_HOME_SEARCH_Z;
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], homing_feedrate[X_AXIS]/60, active_extruder); plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], homing_feedrate[X_AXIS]/60, active_extruder);
st_synchronize(); st_synchronize();
} }
if (probe_point == MESH_NUM_X_POINTS*MESH_NUM_Y_POINTS) { if (probe_point == MESH_NUM_X_POINTS * MESH_NUM_Y_POINTS) {
SERIAL_PROTOCOLPGM("Mesh done.\n"); SERIAL_PROTOCOLPGM("Mesh probing done.\n");
probe_point = -1; probe_point = -1;
mbl.active = 1; mbl.active = 1;
enquecommands_P(PSTR("G28")); enquecommands_P(PSTR("G28"));
@ -2087,9 +2091,7 @@ inline void gcode_G28() {
} }
ix = probe_point % MESH_NUM_X_POINTS; ix = probe_point % MESH_NUM_X_POINTS;
iy = probe_point / MESH_NUM_X_POINTS; iy = probe_point / MESH_NUM_X_POINTS;
if (iy&1) { // Zig zag if (iy & 1) ix = (MESH_NUM_X_POINTS - 1) - ix; // zig-zag
ix = (MESH_NUM_X_POINTS - 1) - ix;
}
current_position[X_AXIS] = mbl.get_x(ix); current_position[X_AXIS] = mbl.get_x(ix);
current_position[Y_AXIS] = mbl.get_y(iy); current_position[Y_AXIS] = mbl.get_y(iy);
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], homing_feedrate[X_AXIS]/60, active_extruder); plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], homing_feedrate[X_AXIS]/60, active_extruder);
@ -2098,9 +2100,7 @@ inline void gcode_G28() {
} }
} }
#endif #elif defined(ENABLE_AUTO_BED_LEVELING)
#ifdef ENABLE_AUTO_BED_LEVELING
/** /**
* G29: Detailed Z-Probe, probes the bed at 3 or more points. * G29: Detailed Z-Probe, probes the bed at 3 or more points.
@ -2116,8 +2116,9 @@ inline void gcode_G28() {
* *
* S Set the XY travel speed between probe points (in mm/min) * S Set the XY travel speed between probe points (in mm/min)
* *
* D Dry-Run mode. Just evaluate the bed Topology - It does not apply or clean the rotation Matrix * D Dry-Run mode. Just evaluate the bed Topology - Don't apply
* Useful to check the topology after a first run of G29. * or clean the rotation Matrix. Useful to check the topology
* after a first run of G29.
* *
* V Set the verbose level (0-4). Example: "G29 V3" * V Set the verbose level (0-4). Example: "G29 V3"
* *
@ -2223,7 +2224,7 @@ inline void gcode_G28() {
#ifdef Z_PROBE_SLED #ifdef Z_PROBE_SLED
dock_sled(false); // engage (un-dock) the probe dock_sled(false); // engage (un-dock) the probe
#elif defined(Z_PROBE_ALLEN_KEY) #elif defined(Z_PROBE_ALLEN_KEY) //|| defined(SERVO_LEVELING)
engage_z_probe(); engage_z_probe();
#endif #endif
@ -2233,15 +2234,14 @@ inline void gcode_G28() {
{ {
#ifdef DELTA #ifdef DELTA
reset_bed_level(); reset_bed_level();
#else #else //!DELTA
// make sure the bed_level_rotation_matrix is identity or the planner will get it incorectly // make sure the bed_level_rotation_matrix is identity or the planner will get it incorectly
//vector_3 corrected_position = plan_get_position_mm(); //vector_3 corrected_position = plan_get_position_mm();
//corrected_position.debug("position before G29"); //corrected_position.debug("position before G29");
plan_bed_level_matrix.set_to_identity(); plan_bed_level_matrix.set_to_identity();
vector_3 uncorrected_position = plan_get_position(); vector_3 uncorrected_position = plan_get_position();
// uncorrected_position.debug("position during G29"); //uncorrected_position.debug("position during G29");
current_position[X_AXIS] = uncorrected_position.x; current_position[X_AXIS] = uncorrected_position.x;
current_position[Y_AXIS] = uncorrected_position.y; current_position[Y_AXIS] = uncorrected_position.y;
current_position[Z_AXIS] = uncorrected_position.z; current_position[Z_AXIS] = uncorrected_position.z;
@ -2260,7 +2260,12 @@ inline void gcode_G28() {
const int xGridSpacing = (right_probe_bed_position - left_probe_bed_position) / (auto_bed_leveling_grid_points-1); const int xGridSpacing = (right_probe_bed_position - left_probe_bed_position) / (auto_bed_leveling_grid_points-1);
const int yGridSpacing = (back_probe_bed_position - front_probe_bed_position) / (auto_bed_leveling_grid_points-1); const int yGridSpacing = (back_probe_bed_position - front_probe_bed_position) / (auto_bed_leveling_grid_points-1);
#ifndef DELTA #ifdef DELTA
delta_grid_spacing[0] = xGridSpacing;
delta_grid_spacing[1] = yGridSpacing;
float z_offset = Z_PROBE_OFFSET_FROM_EXTRUDER;
if (code_seen(axis_codes[Z_AXIS])) z_offset += code_value();
#else // !DELTA
// solve the plane equation ax + by + d = z // solve the plane equation ax + by + d = z
// A is the matrix with rows [x y 1] for all the probed points // A is the matrix with rows [x y 1] for all the probed points
// B is the vector of the Z positions // B is the vector of the Z positions
@ -2272,14 +2277,7 @@ inline void gcode_G28() {
double eqnAMatrix[abl2 * 3], // "A" matrix of the linear system of equations double eqnAMatrix[abl2 * 3], // "A" matrix of the linear system of equations
eqnBVector[abl2], // "B" vector of Z points eqnBVector[abl2], // "B" vector of Z points
mean = 0.0; mean = 0.0;
#endif // !DELTA
#else
delta_grid_spacing[0] = xGridSpacing;
delta_grid_spacing[1] = yGridSpacing;
float z_offset = Z_PROBE_OFFSET_FROM_EXTRUDER;
if (code_seen(axis_codes[Z_AXIS])) z_offset += code_value();
#endif
int probePointCounter = 0; int probePointCounter = 0;
bool zig = true; bool zig = true;
@ -2351,7 +2349,13 @@ inline void gcode_G28() {
clean_up_after_endstop_move(); clean_up_after_endstop_move();
#ifndef DELTA #ifdef DELTA
if (!dryrun) extrapolate_unprobed_bed_level();
print_bed_level();
#else // !DELTA
// solve lsq problem // solve lsq problem
double *plane_equation_coefficients = qr_solve(abl2, 3, eqnAMatrix, eqnBVector); double *plane_equation_coefficients = qr_solve(abl2, 3, eqnAMatrix, eqnBVector);
@ -2401,10 +2405,8 @@ inline void gcode_G28() {
if (!dryrun) set_bed_level_equation_lsq(plane_equation_coefficients); if (!dryrun) set_bed_level_equation_lsq(plane_equation_coefficients);
free(plane_equation_coefficients); free(plane_equation_coefficients);
#else //Delta
if (!dryrun) extrapolate_unprobed_bed_level(); #endif //!DELTA
print_bed_level();
#endif //Delta
#else // !AUTO_BED_LEVELING_GRID #else // !AUTO_BED_LEVELING_GRID
@ -2428,7 +2430,8 @@ inline void gcode_G28() {
#endif // !AUTO_BED_LEVELING_GRID #endif // !AUTO_BED_LEVELING_GRID
#ifndef DELTA #ifndef DELTA
if (verbose_level > 0) plan_bed_level_matrix.debug(" \n\nBed Level Correction Matrix:"); if (verbose_level > 0)
plan_bed_level_matrix.debug(" \n\nBed Level Correction Matrix:");
// Correct the Z height difference from z-probe position and hotend tip position. // Correct the Z height difference from z-probe position and hotend tip position.
// The Z height on homing is measured by Z-Probe, but the probe is quite far from the hotend. // The Z height on homing is measured by Z-Probe, but the probe is quite far from the hotend.
@ -2445,11 +2448,11 @@ inline void gcode_G28() {
current_position[Z_AXIS] = z_tmp - real_z + current_position[Z_AXIS]; //The difference is added to current position and sent to planner. current_position[Z_AXIS] = z_tmp - real_z + current_position[Z_AXIS]; //The difference is added to current position and sent to planner.
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
} }
#endif #endif // !DELTA
#ifdef Z_PROBE_SLED #ifdef Z_PROBE_SLED
dock_sled(true, -SLED_DOCKING_OFFSET); // dock the probe, correcting for over-travel dock_sled(true, -SLED_DOCKING_OFFSET); // dock the probe, correcting for over-travel
#elif defined(Z_PROBE_ALLEN_KEY) #elif defined(Z_PROBE_ALLEN_KEY) //|| defined(SERVO_LEVELING)
retract_z_probe(); retract_z_probe();
#endif #endif
@ -2919,7 +2922,7 @@ inline void gcode_M42() {
do_blocking_move_to( X_probe_location, Y_probe_location, Z_start_location); // Make sure we are at the probe location do_blocking_move_to( X_probe_location, Y_probe_location, Z_start_location); // Make sure we are at the probe location
if (n_legs) { if (n_legs) {
double radius=0.0, theta=0.0, x_sweep, y_sweep; double radius=0.0, theta=0.0;
int l; int l;
int rotational_direction = (unsigned long) millis() & 0x0001; // clockwise or counter clockwise int rotational_direction = (unsigned long) millis() & 0x0001; // clockwise or counter clockwise
radius = (unsigned long)millis() % (long)(X_MAX_LENGTH / 4); // limit how far out to go radius = (unsigned long)millis() % (long)(X_MAX_LENGTH / 4); // limit how far out to go
@ -5182,18 +5185,16 @@ void ClearToSend()
SERIAL_PROTOCOLLNPGM(MSG_OK); SERIAL_PROTOCOLLNPGM(MSG_OK);
} }
void get_coordinates() void get_coordinates() {
{ for (int i = 0; i < NUM_AXIS; i++) {
for(int8_t i=0; i < NUM_AXIS; i++) { if (code_seen(axis_codes[i]))
if(code_seen(axis_codes[i])) destination[i] = code_value() + (axis_relative_modes[i] || relative_mode ? current_position[i] : 0);
{ else
destination[i] = (float)code_value() + (axis_relative_modes[i] || relative_mode)*current_position[i]; destination[i] = current_position[i];
}
else destination[i] = current_position[i]; //Are these else lines really needed?
} }
if(code_seen('F')) { if (code_seen('F')) {
next_feedrate = code_value(); next_feedrate = code_value();
if(next_feedrate > 0.0) feedrate = next_feedrate; if (next_feedrate > 0.0) feedrate = next_feedrate;
} }
} }

@ -104,13 +104,13 @@
// Make sure probing points are reachable // Make sure probing points are reachable
#if LEFT_PROBE_BED_POSITION < MIN_PROBE_X #if LEFT_PROBE_BED_POSITION < MIN_PROBE_X
#error The given LEFT_PROBE_BED_POSITION can not be reached by the probe. #error "The given LEFT_PROBE_BED_POSITION can't be reached by the probe."
#elif RIGHT_PROBE_BED_POSITION > MAX_PROBE_X #elif RIGHT_PROBE_BED_POSITION > MAX_PROBE_X
#error The given RIGHT_PROBE_BED_POSITION can not be reached by the probe. #error "The given RIGHT_PROBE_BED_POSITION can't be reached by the probe."
#elif FRONT_PROBE_BED_POSITION < MIN_PROBE_Y #elif FRONT_PROBE_BED_POSITION < MIN_PROBE_Y
#error The given FRONT_PROBE_BED_POSITION can not be reached by the probe. #error "The given FRONT_PROBE_BED_POSITION can't be reached by the probe."
#elif BACK_PROBE_BED_POSITION > MAX_PROBE_Y #elif BACK_PROBE_BED_POSITION > MAX_PROBE_Y
#error The given BACK_PROBE_BED_POSITION can not be reached by the probe. #error "The given BACK_PROBE_BED_POSITION can't be reached by the probe."
#endif #endif
#define PROBE_SIZE_X (X_PROBE_OFFSET_FROM_EXTRUDER * (AUTO_BED_LEVELING_GRID_POINTS-1)) #define PROBE_SIZE_X (X_PROBE_OFFSET_FROM_EXTRUDER * (AUTO_BED_LEVELING_GRID_POINTS-1))

@ -569,9 +569,11 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
// Custom M code points // Custom M code points
#define CUSTOM_M_CODES #define CUSTOM_M_CODES
#ifdef CUSTOM_M_CODES #ifdef CUSTOM_M_CODES
#ifdef ENABLE_AUTO_BED_LEVELING
#define CUSTOM_M_CODE_SET_Z_PROBE_OFFSET 851 #define CUSTOM_M_CODE_SET_Z_PROBE_OFFSET 851
#define Z_PROBE_OFFSET_RANGE_MIN -15 #define Z_PROBE_OFFSET_RANGE_MIN -15
#define Z_PROBE_OFFSET_RANGE_MAX -5 #define Z_PROBE_OFFSET_RANGE_MAX -5
#endif
#endif #endif
// @section extras // @section extras

@ -0,0 +1,157 @@
/*
Fontname: -Misc-Fixed-Medium-R-Normal--9-90-75-75-C-60-ISO10646-1
Copyright: Public domain font. Share and enjoy.
Capital A Height: 6, '1' Height: 6
Calculated Max Values w= 6 h= 9 x= 2 y= 7 dx= 6 dy= 0 ascent= 7 len= 9
Font Bounding box w= 6 h= 9 x= 0 y=-2
Calculated Min Values x= 0 y=-2 dx= 0 dy= 0
Pure Font ascent = 6 descent=-2
X Font ascent = 6 descent=-2
Max Font ascent = 7 descent=-2
*/
#include <utility/u8g.h>
const u8g_fntpgm_uint8_t u8g_font_6x9[2300] U8G_SECTION(".progmem.u8g_font_6x9") = {
0,6,9,0,254,6,1,137,2,254,32,255,254,7,254,6,
254,0,0,0,6,0,7,1,6,6,6,2,0,128,128,128,
128,0,128,3,3,3,6,1,3,160,160,160,5,7,7,6,
0,255,80,80,248,80,248,80,80,5,9,9,6,0,254,32,
112,168,160,112,40,168,112,32,6,8,8,6,0,255,64,168,
72,16,32,72,84,8,5,7,7,6,0,255,96,144,144,96,
152,144,104,1,3,3,6,2,3,128,128,128,2,7,7,6,
2,255,64,128,128,128,128,128,64,2,7,7,6,2,255,128,
64,64,64,64,64,128,5,5,5,6,0,0,136,80,248,80,
136,5,5,5,6,0,0,32,32,248,32,32,2,4,4,6,
2,254,192,64,64,128,5,1,1,6,0,2,248,2,2,2,
6,2,0,192,192,4,6,6,6,1,0,16,16,32,64,128,
128,4,6,6,6,1,0,96,144,144,144,144,96,3,6,6,
6,1,0,64,192,64,64,64,224,4,6,6,6,1,0,96,
144,16,32,64,240,4,6,6,6,1,0,240,32,96,16,16,
224,5,6,6,6,0,0,16,48,80,144,248,16,4,6,6,
6,1,0,240,128,224,16,16,224,4,6,6,6,1,0,96,
128,224,144,144,96,4,6,6,6,1,0,240,16,16,32,64,
64,4,6,6,6,1,0,96,144,96,144,144,96,4,6,6,
6,1,0,96,144,144,112,16,96,2,5,5,6,2,0,192,
192,0,192,192,2,7,7,6,2,254,192,192,0,192,64,64,
128,5,5,5,6,0,0,24,96,128,96,24,5,3,3,6,
0,1,248,0,248,5,5,5,6,0,0,192,48,8,48,192,
4,7,7,6,1,0,96,144,16,96,64,0,64,5,6,6,
6,0,0,112,144,168,176,128,112,5,6,6,6,0,0,32,
80,136,248,136,136,5,6,6,6,0,0,240,136,240,136,136,
240,4,6,6,6,1,0,96,144,128,128,144,96,4,6,6,
6,1,0,224,144,144,144,144,224,4,6,6,6,1,0,240,
128,224,128,128,240,4,6,6,6,1,0,240,128,224,128,128,
128,4,6,6,6,1,0,96,144,128,176,144,96,4,6,6,
6,1,0,144,144,240,144,144,144,3,6,6,6,1,0,224,
64,64,64,64,224,5,6,6,6,0,0,56,16,16,16,144,
96,4,6,6,6,1,0,144,160,192,160,144,144,4,6,6,
6,1,0,128,128,128,128,128,240,5,6,6,6,0,0,136,
216,168,168,136,136,4,6,6,6,1,0,144,208,176,144,144,
144,5,6,6,6,0,0,112,136,136,136,136,112,4,6,6,
6,1,0,224,144,144,224,128,128,4,7,7,6,1,255,96,
144,144,208,176,96,16,4,6,6,6,1,0,224,144,144,224,
144,144,4,6,6,6,1,0,96,144,64,32,144,96,5,6,
6,6,0,0,248,32,32,32,32,32,4,6,6,6,1,0,
144,144,144,144,144,96,4,6,6,6,1,0,144,144,144,240,
96,96,5,6,6,6,0,0,136,136,168,168,216,136,5,6,
6,6,0,0,136,80,32,32,80,136,5,6,6,6,0,0,
136,136,80,32,32,32,4,6,6,6,1,0,240,16,32,64,
128,240,3,6,6,6,1,0,224,128,128,128,128,224,4,6,
6,6,1,0,128,128,64,32,16,16,3,6,6,6,1,0,
224,32,32,32,32,224,5,3,3,6,0,3,32,80,136,5,
1,1,6,0,254,248,2,2,2,6,2,4,128,64,4,4,
4,6,1,0,112,144,144,112,4,6,6,6,1,0,128,128,
224,144,144,224,4,4,4,6,1,0,112,128,128,112,4,6,
6,6,1,0,16,16,112,144,144,112,4,4,4,6,1,0,
96,176,192,112,4,6,6,6,1,0,32,80,64,224,64,64,
4,6,6,6,1,254,96,144,144,112,16,96,4,6,6,6,
1,0,128,128,224,144,144,144,3,6,6,6,1,0,64,0,
192,64,64,224,3,8,8,6,1,254,32,0,96,32,32,32,
160,64,4,6,6,6,1,0,128,128,160,192,160,144,3,6,
6,6,1,0,192,64,64,64,64,224,5,4,4,6,0,0,
208,168,168,136,4,4,4,6,1,0,224,144,144,144,4,4,
4,6,1,0,96,144,144,96,4,6,6,6,1,254,224,144,
144,224,128,128,4,6,6,6,1,254,112,144,144,112,16,16,
4,4,4,6,1,0,160,208,128,128,4,4,4,6,1,0,
112,192,48,224,4,6,6,6,1,0,64,64,224,64,80,32,
4,4,4,6,1,0,144,144,144,112,4,4,4,6,1,0,
144,144,96,96,5,4,4,6,0,0,136,168,168,80,4,4,
4,6,1,0,144,96,96,144,4,6,6,6,1,254,144,144,
144,112,144,96,4,4,4,6,1,0,240,32,64,240,3,7,
7,6,1,0,32,64,64,128,64,64,32,1,7,7,6,2,
255,128,128,128,128,128,128,128,3,7,7,6,1,0,128,64,
64,32,64,64,128,4,2,2,6,1,3,80,160,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,
0,6,0,7,1,6,6,6,2,0,128,0,128,128,128,128,
4,6,6,6,1,255,32,112,160,160,112,32,5,7,7,6,
0,255,48,72,64,240,64,64,248,5,5,5,6,0,0,168,
80,136,80,168,5,6,6,6,0,0,136,80,248,32,248,32,
1,7,7,6,2,255,128,128,128,0,128,128,128,4,7,7,
6,1,255,112,128,96,144,96,16,224,3,1,1,6,1,5,
160,6,7,7,6,0,0,120,132,148,164,148,132,120,3,5,
5,6,1,1,96,160,96,0,224,5,5,5,6,0,0,40,
80,160,80,40,4,3,3,6,1,0,240,16,16,4,1,1,
6,1,2,240,6,7,7,6,0,0,120,132,180,164,164,132,
120,4,1,1,6,1,5,240,4,3,3,6,1,2,96,144,
96,5,7,7,6,0,255,32,32,248,32,32,0,248,3,5,
5,6,1,1,64,160,32,64,224,3,5,5,6,1,1,192,
32,64,32,192,2,2,2,6,2,4,64,128,4,5,5,6,
1,255,144,144,176,208,128,5,6,6,6,0,0,120,232,232,
104,40,40,1,1,1,6,2,2,128,2,2,2,6,2,254,
64,128,3,5,5,6,1,1,64,192,64,64,224,3,5,5,
6,1,1,64,160,64,0,224,5,5,5,6,0,0,160,80,
40,80,160,5,8,8,6,0,255,64,192,64,80,112,48,120,
16,5,8,8,6,0,255,64,192,64,80,104,8,16,56,5,
8,8,6,0,255,192,32,64,48,240,48,120,16,4,7,7,
6,1,0,32,0,32,96,128,144,96,5,7,7,6,0,0,
64,32,32,80,112,136,136,5,7,7,6,0,0,16,32,32,
80,112,136,136,5,7,7,6,0,0,32,80,32,80,112,136,
136,5,7,7,6,0,0,40,80,32,80,112,136,136,5,7,
7,6,0,0,80,0,32,80,112,136,136,5,7,7,6,0,
0,32,80,32,80,112,136,136,5,6,6,6,0,0,120,160,
240,160,160,184,4,8,8,6,1,254,96,144,128,128,144,96,
32,64,4,7,7,6,1,0,64,32,240,128,224,128,240,4,
7,7,6,1,0,32,64,240,128,224,128,240,4,7,7,6,
1,0,32,80,240,128,224,128,240,4,7,7,6,1,0,80,
0,240,128,224,128,240,3,7,7,6,1,0,128,64,224,64,
64,64,224,3,7,7,6,1,0,32,64,224,64,64,64,224,
3,7,7,6,1,0,64,160,224,64,64,64,224,3,7,7,
6,1,0,160,0,224,64,64,64,224,5,6,6,6,0,0,
112,72,232,72,72,112,4,7,7,6,1,0,80,160,144,208,
176,144,144,4,7,7,6,1,0,64,32,96,144,144,144,96,
4,7,7,6,1,0,32,64,96,144,144,144,96,4,7,7,
6,1,0,32,80,96,144,144,144,96,4,7,7,6,1,0,
80,160,96,144,144,144,96,4,7,7,6,1,0,80,0,96,
144,144,144,96,5,5,5,6,0,0,136,80,32,80,136,4,
8,8,6,1,255,16,112,176,176,208,208,224,128,4,7,7,
6,1,0,64,32,144,144,144,144,96,4,7,7,6,1,0,
32,64,144,144,144,144,96,4,7,7,6,1,0,32,80,144,
144,144,144,96,4,7,7,6,1,0,80,0,144,144,144,144,
96,5,7,7,6,0,0,16,32,136,80,32,32,32,4,6,
6,6,1,0,128,224,144,144,224,128,4,6,6,6,1,0,
96,144,160,160,144,160,4,7,7,6,1,0,64,32,0,112,
144,144,112,4,7,7,6,1,0,32,64,0,112,144,144,112,
4,7,7,6,1,0,32,80,0,112,144,144,112,4,7,7,
6,1,0,80,160,0,112,144,144,112,4,6,6,6,1,0,
80,0,112,144,144,112,4,7,7,6,1,0,32,80,32,112,
144,144,112,5,4,4,6,0,0,112,168,176,120,4,6,6,
6,1,254,112,128,128,112,32,64,4,7,7,6,1,0,64,
32,0,96,176,192,112,4,7,7,6,1,0,32,64,0,96,
176,192,112,4,7,7,6,1,0,32,80,0,96,176,192,112,
4,6,6,6,1,0,80,0,96,176,192,112,3,7,7,6,
1,0,128,64,0,192,64,64,224,3,7,7,6,1,0,32,
64,0,192,64,64,224,3,7,7,6,1,0,64,160,0,192,
64,64,224,3,6,6,6,1,0,160,0,192,64,64,224,4,
7,7,6,1,0,48,96,16,112,144,144,96,4,7,7,6,
1,0,80,160,0,224,144,144,144,4,7,7,6,1,0,64,
32,0,96,144,144,96,4,7,7,6,1,0,32,64,0,96,
144,144,96,4,7,7,6,1,0,32,80,0,96,144,144,96,
4,7,7,6,1,0,80,160,0,96,144,144,96,4,6,6,
6,1,0,80,0,96,144,144,96,5,5,5,6,0,0,32,
0,248,0,32,4,4,4,6,1,0,112,176,208,224,4,7,
7,6,1,0,64,32,0,144,144,144,112,4,7,7,6,1,
0,32,64,0,144,144,144,112,4,7,7,6,1,0,32,80,
0,144,144,144,112,4,6,6,6,1,0,80,0,144,144,144,
112,4,9,9,6,1,254,32,64,0,144,144,144,112,144,96,
4,8,8,6,1,254,128,128,224,144,144,224,128,128,4,8,
8,6,1,254,80,0,144,144,144,112,144,96};

@ -0,0 +1,171 @@
/*
Fontname: HD44780_C v1.2
Copyright: A. Hardtung, public domain
Capital A Height: 7, '1' Height: 7
Calculated Max Values w= 5 h= 8 x= 2 y= 7 dx= 6 dy= 0 ascent= 8 len= 8
Font Bounding box w= 6 h= 9 x= 0 y=-2
Calculated Min Values x= 0 y=-1 dx= 0 dy= 0
Pure Font ascent = 7 descent=-1
X Font ascent = 7 descent=-1
Max Font ascent = 8 descent=-1
*/
#include <utility/u8g.h>
const u8g_fntpgm_uint8_t HD44780_C_5x7[2522] U8G_SECTION(".progmem.HD44780_C_5x7") = {
0,6,9,0,254,7,1,145,3,34,32,255,255,8,255,7,
255,0,0,0,6,0,0,1,7,7,6,2,0,128,128,128,
128,128,0,128,3,2,2,6,1,5,160,160,5,7,7,6,
0,0,80,80,248,80,248,80,80,5,7,7,6,0,0,32,
120,160,112,40,240,32,5,7,7,6,0,0,192,200,16,32,
64,152,24,5,7,7,6,0,0,96,144,160,64,168,144,104,
2,3,3,6,1,4,192,64,128,3,7,7,6,1,0,32,
64,128,128,128,64,32,3,7,7,6,1,0,128,64,32,32,
32,64,128,5,5,5,6,0,1,32,168,112,168,32,5,5,
5,6,0,1,32,32,248,32,32,2,3,3,6,2,255,192,
64,128,5,1,1,6,0,3,248,2,2,2,6,2,0,192,
192,5,5,5,6,0,1,8,16,32,64,128,5,7,7,6,
0,0,112,136,152,168,200,136,112,3,7,7,6,1,0,64,
192,64,64,64,64,224,5,7,7,6,0,0,112,136,8,112,
128,128,248,5,7,7,6,0,0,248,16,32,16,8,8,240,
5,7,7,6,0,0,16,48,80,144,248,16,16,5,7,7,
6,0,0,248,128,240,8,8,136,112,5,7,7,6,0,0,
48,64,128,240,136,136,112,5,7,7,6,0,0,248,8,16,
32,32,32,32,5,7,7,6,0,0,112,136,136,112,136,136,
112,5,7,7,6,0,0,112,136,136,120,8,16,96,2,5,
5,6,2,0,192,192,0,192,192,2,6,6,6,2,255,192,
192,0,192,64,128,4,7,7,6,0,0,16,32,64,128,64,
32,16,5,3,3,6,0,2,248,0,248,4,7,7,6,1,
0,128,64,32,16,32,64,128,5,7,7,6,0,0,112,136,
8,16,32,0,32,5,6,6,6,0,0,112,136,8,104,168,
112,5,7,7,6,0,0,112,136,136,248,136,136,136,5,7,
7,6,0,0,240,136,136,240,136,136,240,5,7,7,6,0,
0,112,136,128,128,128,136,112,5,7,7,6,0,0,224,144,
136,136,136,144,224,5,7,7,6,0,0,248,128,128,240,128,
128,248,5,7,7,6,0,0,248,128,128,240,128,128,128,5,
7,7,6,0,0,112,136,128,184,136,136,112,5,7,7,6,
0,0,136,136,136,248,136,136,136,1,7,7,6,2,0,128,
128,128,128,128,128,128,5,7,7,6,0,0,56,16,16,16,
16,144,96,5,7,7,6,0,0,136,144,160,192,160,144,136,
5,7,7,6,0,0,128,128,128,128,128,128,248,5,7,7,
6,0,0,136,216,168,136,136,136,136,5,7,7,6,0,0,
136,136,200,168,152,136,136,5,7,7,6,0,0,112,136,136,
136,136,136,112,5,7,7,6,0,0,240,136,136,240,128,128,
128,5,7,7,6,0,0,112,136,136,136,168,144,104,5,7,
7,6,0,0,240,136,136,240,160,144,136,5,7,7,6,0,
0,120,128,128,112,8,8,240,5,7,7,6,0,0,248,32,
32,32,32,32,32,5,7,7,6,0,0,136,136,136,136,136,
136,112,5,7,7,6,0,0,136,136,136,136,136,80,32,5,
7,7,6,0,0,136,136,136,136,136,168,80,5,7,7,6,
0,0,136,136,80,32,80,136,136,5,7,7,6,0,0,136,
136,136,80,32,32,32,5,7,7,6,0,0,248,8,16,32,
64,128,248,3,7,7,6,1,0,224,128,128,128,128,128,224,
5,7,7,6,0,0,32,112,160,160,168,112,32,3,7,7,
6,1,0,224,32,32,32,32,32,224,5,3,3,6,0,4,
32,80,136,5,1,1,6,0,0,248,2,2,2,6,2,5,
128,64,5,5,5,6,0,0,112,8,120,136,120,5,7,7,
6,0,0,128,128,176,200,136,136,240,5,5,5,6,0,0,
112,128,128,136,112,5,7,7,6,0,0,8,8,104,152,136,
136,120,5,5,5,6,0,0,112,136,248,128,112,5,7,7,
6,0,0,48,72,224,64,64,64,64,5,6,6,6,0,255,
112,136,136,120,8,112,5,7,7,6,0,0,128,128,176,200,
136,136,136,1,7,7,6,2,0,128,0,128,128,128,128,128,
3,8,8,6,1,255,32,0,32,32,32,32,160,64,4,7,
7,6,0,0,128,128,144,160,192,160,144,3,7,7,6,1,
0,192,64,64,64,64,64,224,5,5,5,6,0,0,208,168,
168,168,168,5,5,5,6,0,0,176,200,136,136,136,5,5,
5,6,0,0,112,136,136,136,112,5,6,6,6,0,255,240,
136,136,240,128,128,5,6,6,6,0,255,120,136,136,120,8,
8,5,5,5,6,0,0,176,200,128,128,128,5,5,5,6,
0,0,112,128,112,8,240,5,7,7,6,0,0,64,64,224,
64,64,72,48,5,5,5,6,0,0,136,136,136,152,104,5,
5,5,6,0,0,136,136,136,80,32,5,5,5,6,0,0,
136,136,168,168,80,5,5,5,6,0,0,136,80,32,80,136,
5,6,6,6,0,255,136,136,136,120,8,112,5,5,5,6,
0,0,248,16,32,64,248,5,5,5,6,0,2,184,168,168,
168,184,5,5,5,6,0,2,184,136,184,160,184,5,5,5,
6,0,2,184,160,184,136,184,5,6,6,6,0,1,8,40,
72,248,64,32,5,5,5,6,0,0,56,112,224,136,240,0,
0,0,6,0,0,0,0,0,6,0,0,0,0,0,6,0,
0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,0,
6,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0,
0,0,6,0,0,0,0,0,6,0,0,0,0,0,6,0,
0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,0,
6,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0,
0,0,6,0,0,0,0,0,6,0,0,0,0,0,6,0,
0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,0,
6,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0,
0,0,6,0,0,0,0,0,6,0,0,0,0,0,6,0,
0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,0,
6,0,0,0,0,0,6,0,0,0,0,0,6,0,0,5,
7,7,6,0,0,248,136,128,240,136,136,240,5,7,7,6,
0,0,248,136,128,128,128,128,128,5,7,7,6,0,0,80,
0,248,128,240,128,248,5,7,7,6,0,0,168,168,168,112,
168,168,168,5,7,7,6,0,0,240,8,8,112,8,8,240,
5,7,7,6,0,0,136,136,152,168,200,136,136,5,8,8,
6,0,0,80,32,136,152,168,168,200,136,5,7,7,6,0,
0,120,40,40,40,40,168,72,5,7,7,6,0,0,248,136,
136,136,136,136,136,5,7,7,6,0,0,136,136,136,80,32,
64,128,5,7,7,6,0,0,32,112,168,168,168,112,32,5,
7,7,6,0,0,136,136,136,120,8,8,8,5,7,7,6,
0,0,168,168,168,168,168,168,248,5,7,7,6,0,0,192,
64,64,112,72,72,112,5,7,7,6,0,0,136,136,136,200,
168,168,200,5,7,7,6,0,0,112,136,8,56,8,136,112,
5,7,7,6,0,0,144,168,168,232,168,168,144,5,7,7,
6,0,0,120,136,136,120,40,72,136,5,7,7,6,0,0,
24,96,128,240,136,136,112,4,5,5,6,0,0,224,144,224,
144,224,5,5,5,6,0,0,248,136,128,128,128,5,7,7,
6,0,0,80,0,112,136,248,128,112,5,5,5,6,0,0,
168,168,112,168,168,5,5,5,6,0,0,240,8,48,8,240,
5,5,5,6,0,0,136,152,168,200,136,5,7,7,6,0,
0,80,32,136,152,168,200,136,4,5,5,6,0,0,144,160,
192,160,144,5,5,5,6,0,0,248,40,40,168,72,5,5,
5,6,0,0,136,216,168,136,136,5,5,5,6,0,0,136,
136,248,136,136,5,5,5,6,0,0,248,136,136,136,136,5,
5,5,6,0,0,248,32,32,32,32,5,5,5,6,0,0,
136,136,120,8,8,5,5,5,6,0,0,168,168,168,168,248,
5,5,5,6,0,0,192,64,112,72,112,5,5,5,6,0,
0,136,136,200,168,200,4,5,5,6,0,0,128,128,224,144,
224,5,5,5,6,0,0,112,136,56,136,112,5,5,5,6,
0,0,144,168,232,168,144,5,5,5,6,0,0,120,136,120,
40,72,5,5,5,6,0,1,32,72,144,72,32,5,5,5,
6,0,1,32,144,72,144,32,5,3,3,6,0,0,72,144,
216,5,3,3,6,0,4,216,72,144,5,7,7,6,0,0,
144,208,176,144,56,40,56,5,7,7,6,0,0,32,0,32,
64,128,136,112,5,7,7,6,0,0,24,32,32,112,32,32,
192,5,7,7,6,0,0,32,80,64,240,64,64,120,1,2,
2,6,2,0,128,128,1,4,4,6,2,0,128,128,128,128,
3,5,5,6,1,0,160,160,160,0,224,3,5,5,6,1,
0,160,160,160,0,160,5,7,7,6,0,0,160,0,232,16,
32,64,128,5,5,5,6,0,1,216,112,32,112,216,5,7,
7,6,0,0,160,64,168,16,32,64,128,3,6,6,6,1,
1,224,64,64,64,64,224,5,6,6,6,0,1,248,80,80,
80,80,248,5,7,7,6,0,0,32,112,168,32,32,32,32,
5,7,7,6,0,0,32,32,32,32,168,112,32,5,7,7,
6,0,0,128,144,176,248,176,144,128,5,7,7,6,0,0,
8,72,104,248,104,72,8,5,7,7,6,0,0,128,136,168,
248,168,136,128,5,7,7,6,0,0,128,224,136,16,32,64,
128,2,2,2,6,2,2,192,192,5,8,8,6,0,255,120,
40,40,40,72,136,248,136,5,8,8,6,0,255,136,136,136,
136,136,136,248,8,5,8,8,6,0,255,168,168,168,168,168,
168,248,8,5,6,6,6,0,255,120,40,72,136,248,136,5,
7,7,6,0,255,32,32,112,168,168,112,32,5,6,6,6,
0,255,136,136,136,136,248,8,5,6,6,6,0,255,168,168,
168,168,248,8,2,2,2,6,2,6,64,128,3,1,1,6,
1,7,160,5,2,2,6,0,6,72,176,5,8,8,6,0,
0,16,32,0,112,136,248,128,112,5,6,6,6,0,255,112,
128,136,112,32,96,3,7,7,6,1,0,160,0,160,160,160,
32,192,5,6,6,6,0,1,32,112,112,112,248,32,5,5,
5,6,0,1,80,0,136,0,80,5,5,5,6,0,1,112,
136,136,136,112,5,7,7,6,0,0,136,144,168,88,184,8,
8,5,7,7,6,0,0,136,144,184,72,184,8,56,5,7,
7,6,0,0,136,144,184,72,152,32,56,5,8,8,6,0,
0,192,64,192,72,216,56,8,8,5,7,7,6,0,0,136,
248,136,248,136,248,136,4,5,5,6,0,2,192,0,48,0,
96,5,8,8,6,0,0,64,160,224,168,8,40,120,32,5,
8,8,6,0,0,64,112,64,120,64,112,64,224,5,8,8,
6,0,0,32,112,32,248,32,112,32,112,5,7,7,6,0,
0,104,0,232,0,104,16,56,5,8,8,6,0,0,16,112,
16,240,16,112,16,56,5,7,7,6,0,1,32,112,32,248,
32,112,32,5,8,8,6,0,0,16,144,80,48,80,144,16,
56,5,8,8,6,0,0,48,72,32,80,80,32,144,96,5,
7,7,6,0,0,120,168,168,120,40,40,40,5,8,8,6,
0,0,248,248,248,248,248,248,248,248};

@ -0,0 +1,169 @@
/*
Fontname: HD44780_J
Copyright: A. Hardtung, public domain
Capital A Height: 7, '1' Height: 7
Calculated Max Values w= 6 h=10 x= 2 y= 8 dx= 6 dy= 0 ascent= 8 len= 8
Font Bounding box w= 6 h= 9 x= 0 y=-2
Calculated Min Values x= 0 y=-2 dx= 0 dy= 0
Pure Font ascent = 7 descent=-1
X Font ascent = 7 descent=-1
Max Font ascent = 8 descent=-2
*/
#include <utility/u8g.h>
const u8g_fntpgm_uint8_t HD44780_J_5x7[2491] U8G_SECTION(".progmem.HD44780_J_5x7") = {
0,6,9,0,254,7,1,145,3,34,32,255,255,8,254,7,
255,0,0,0,6,0,8,1,7,7,6,2,0,128,128,128,
128,128,0,128,3,2,2,6,1,5,160,160,5,7,7,6,
0,0,80,80,248,80,248,80,80,5,7,7,6,0,0,32,
120,160,112,40,240,32,5,7,7,6,0,0,192,200,16,32,
64,152,24,5,7,7,6,0,0,96,144,160,64,168,144,104,
2,3,3,6,1,4,192,64,128,3,7,7,6,1,0,32,
64,128,128,128,64,32,3,7,7,6,1,0,128,64,32,32,
32,64,128,5,5,5,6,0,1,32,168,112,168,32,5,5,
5,6,0,1,32,32,248,32,32,2,3,3,6,2,255,192,
64,128,5,1,1,6,0,3,248,2,2,2,6,2,0,192,
192,5,5,5,6,0,1,8,16,32,64,128,5,7,7,6,
0,0,112,136,152,168,200,136,112,3,7,7,6,1,0,64,
192,64,64,64,64,224,5,7,7,6,0,0,112,136,8,112,
128,128,248,5,7,7,6,0,0,248,16,32,16,8,8,240,
5,7,7,6,0,0,16,48,80,144,248,16,16,5,7,7,
6,0,0,248,128,240,8,8,136,112,5,7,7,6,0,0,
48,64,128,240,136,136,112,5,7,7,6,0,0,248,8,16,
32,32,32,32,5,7,7,6,0,0,112,136,136,112,136,136,
112,5,7,7,6,0,0,112,136,136,120,8,16,96,2,5,
5,6,2,0,192,192,0,192,192,2,6,6,6,2,255,192,
192,0,192,64,128,4,7,7,6,0,0,16,32,64,128,64,
32,16,5,3,3,6,0,2,248,0,248,4,7,7,6,1,
0,128,64,32,16,32,64,128,5,7,7,6,0,0,112,136,
8,16,32,0,32,5,6,6,6,0,0,112,136,8,104,168,
112,5,7,7,6,0,0,112,136,136,248,136,136,136,5,7,
7,6,0,0,240,136,136,240,136,136,240,5,7,7,6,0,
0,112,136,128,128,128,136,112,5,7,7,6,0,0,224,144,
136,136,136,144,224,5,7,7,6,0,0,248,128,128,240,128,
128,248,5,7,7,6,0,0,248,128,128,240,128,128,128,5,
7,7,6,0,0,112,136,128,184,136,136,112,5,7,7,6,
0,0,136,136,136,248,136,136,136,1,7,7,6,2,0,128,
128,128,128,128,128,128,5,7,7,6,0,0,56,16,16,16,
16,144,96,5,7,7,6,0,0,136,144,160,192,160,144,136,
5,7,7,6,0,0,128,128,128,128,128,128,248,5,7,7,
6,0,0,136,216,168,136,136,136,136,5,7,7,6,0,0,
136,136,200,168,152,136,136,5,7,7,6,0,0,112,136,136,
136,136,136,112,5,7,7,6,0,0,240,136,136,240,128,128,
128,5,7,7,6,0,0,112,136,136,136,168,144,104,5,7,
7,6,0,0,240,136,136,240,160,144,136,5,7,7,6,0,
0,120,128,128,112,8,8,240,5,7,7,6,0,0,248,32,
32,32,32,32,32,5,7,7,6,0,0,136,136,136,136,136,
136,112,5,7,7,6,0,0,136,136,136,136,136,80,32,5,
7,7,6,0,0,136,136,136,136,136,168,80,5,7,7,6,
0,0,136,136,80,32,80,136,136,5,7,7,6,0,0,136,
136,136,80,32,32,32,5,7,7,6,0,0,248,8,16,32,
64,128,248,3,7,7,6,1,0,224,128,128,128,128,128,224,
5,7,7,6,0,0,136,80,248,32,248,32,32,3,7,7,
6,1,0,224,32,32,32,32,32,224,5,3,3,6,0,4,
32,80,136,5,1,1,6,0,0,248,2,2,2,6,2,5,
128,64,5,5,5,6,0,0,112,8,120,136,120,5,7,7,
6,0,0,128,128,176,200,136,136,240,5,5,5,6,0,0,
112,128,128,136,112,5,7,7,6,0,0,8,8,104,152,136,
136,120,5,5,5,6,0,0,112,136,248,128,112,5,7,7,
6,0,0,48,72,224,64,64,64,64,5,6,6,6,0,255,
112,136,136,120,8,112,5,7,7,6,0,0,128,128,176,200,
136,136,136,1,7,7,6,2,0,128,0,128,128,128,128,128,
3,8,8,6,1,255,32,0,32,32,32,32,160,64,4,7,
7,6,0,0,128,128,144,160,192,160,144,3,7,7,6,1,
0,192,64,64,64,64,64,224,5,5,5,6,0,0,208,168,
168,168,168,5,5,5,6,0,0,176,200,136,136,136,5,5,
5,6,0,0,112,136,136,136,112,5,6,6,6,0,255,240,
136,136,240,128,128,5,6,6,6,0,255,120,136,136,120,8,
8,5,5,5,6,0,0,176,200,128,128,128,5,5,5,6,
0,0,112,128,112,8,240,5,7,7,6,0,0,64,64,224,
64,64,72,48,5,5,5,6,0,0,136,136,136,152,104,5,
5,5,6,0,0,136,136,136,80,32,5,5,5,6,0,0,
136,136,168,168,80,5,5,5,6,0,0,136,80,32,80,136,
5,6,6,6,0,255,136,136,136,120,8,112,5,5,5,6,
0,0,248,16,32,64,248,3,7,7,6,1,0,32,64,64,
128,64,64,32,1,7,7,6,2,0,128,128,128,128,128,128,
128,3,7,7,6,1,0,128,64,64,32,64,64,128,5,5,
5,6,0,1,32,16,248,16,32,5,5,5,6,0,1,32,
64,248,64,32,0,0,0,6,0,8,0,0,0,6,0,8,
0,0,0,6,0,8,0,0,0,6,0,8,0,0,0,6,
0,8,0,0,0,6,0,8,0,0,0,6,0,8,0,0,
0,6,0,8,0,0,0,6,0,8,0,0,0,6,0,8,
0,0,0,6,0,8,0,0,0,6,0,8,0,0,0,6,
0,8,0,0,0,6,0,8,0,0,0,6,0,8,0,0,
0,6,0,8,0,0,0,6,0,8,0,0,0,6,0,8,
0,0,0,6,0,8,0,0,0,6,0,8,0,0,0,6,
0,8,0,0,0,6,0,8,0,0,0,6,0,8,0,0,
0,6,0,8,0,0,0,6,0,8,0,0,0,6,0,8,
0,0,0,6,0,8,0,0,0,6,0,8,0,0,0,6,
0,8,0,0,0,6,0,8,0,0,0,6,0,8,0,0,
0,6,0,8,0,0,0,6,0,8,3,3,3,6,0,0,
224,160,224,3,4,4,6,2,3,224,128,128,128,3,4,4,
6,0,0,32,32,32,224,3,3,3,6,0,0,128,64,32,
2,2,2,6,1,2,192,192,5,6,6,6,0,0,248,8,
248,8,16,32,5,5,5,6,0,0,248,8,48,32,64,4,
5,5,6,0,0,16,32,96,160,32,5,5,5,6,0,0,
32,248,136,8,48,5,4,4,6,0,0,248,32,32,248,5,
5,5,6,0,0,16,248,48,80,144,5,5,5,6,0,0,
64,248,72,80,64,5,4,4,6,0,0,112,16,16,248,4,
5,5,6,0,0,240,16,240,16,240,5,4,4,6,0,0,
168,168,8,48,5,1,1,6,0,4,248,5,7,7,6,0,
0,248,8,40,48,32,32,64,5,7,7,6,0,0,8,16,
32,96,160,32,32,5,7,7,6,0,0,32,248,136,136,8,
16,32,5,6,6,6,0,0,248,32,32,32,32,248,5,7,
7,6,0,0,16,248,16,48,80,144,16,5,7,7,6,0,
0,64,248,72,72,72,72,144,5,7,7,6,0,0,32,248,
32,248,32,32,32,5,6,6,6,0,0,120,72,136,8,16,
96,5,7,7,6,0,0,64,120,144,16,16,16,32,5,6,
6,6,0,0,248,8,8,8,8,248,5,7,7,6,0,0,
80,248,80,80,16,32,64,5,6,6,6,0,0,192,8,200,
8,16,224,5,6,6,6,0,0,248,8,16,32,80,136,5,
7,7,6,0,0,64,248,72,80,64,64,56,5,6,6,6,
0,0,136,136,72,8,16,96,5,6,6,6,0,0,120,72,
168,24,16,96,5,7,7,6,0,0,16,224,32,248,32,32,
64,5,6,6,6,0,0,168,168,168,8,16,32,5,7,7,
6,0,0,112,0,248,32,32,32,64,3,7,7,6,1,0,
128,128,128,192,160,128,128,5,7,7,6,0,0,32,32,248,
32,32,64,128,5,6,6,6,0,0,112,0,0,0,0,248,
5,6,6,6,0,0,248,8,80,32,80,128,5,6,6,6,
0,1,32,248,16,32,112,168,3,7,7,6,1,0,32,32,
32,32,32,64,128,5,6,6,6,0,0,32,16,136,136,136,
136,5,7,7,6,0,0,128,128,248,128,128,128,120,5,6,
6,6,0,0,248,8,8,8,16,96,5,5,5,6,0,1,
64,160,16,8,8,5,7,7,6,0,0,32,248,32,32,168,
168,32,5,6,6,6,0,0,248,8,8,80,32,16,4,6,
6,6,1,0,224,0,224,0,224,16,5,6,6,6,0,0,
32,64,128,136,248,8,5,6,6,6,0,0,8,8,80,32,
80,128,5,6,6,6,0,0,248,64,248,64,64,56,5,7,
7,6,0,0,64,64,248,72,80,64,64,5,7,7,6,0,
0,112,16,16,16,16,16,248,5,6,6,6,0,0,248,8,
248,8,8,248,5,7,7,6,0,0,112,0,248,8,8,16,
32,4,7,7,6,0,0,144,144,144,144,16,32,64,5,6,
6,6,0,0,32,160,160,168,168,176,5,7,7,6,0,0,
128,128,128,136,144,160,192,5,6,6,6,0,0,248,136,136,
136,136,248,5,6,6,6,0,0,248,136,136,8,16,32,5,
6,6,6,0,0,192,0,8,8,16,224,4,3,3,6,0,
4,32,144,64,3,3,3,6,0,4,224,160,224,5,5,5,
6,0,1,72,168,144,144,104,5,7,7,6,0,0,80,0,
112,8,120,136,120,4,8,8,6,1,255,96,144,144,224,144,
144,224,128,5,5,5,6,0,0,112,128,96,136,112,5,6,
6,6,0,255,136,136,152,232,136,128,5,5,5,6,0,0,
120,160,144,136,112,5,7,7,6,0,254,48,72,136,136,240,
128,128,5,8,8,6,0,254,120,136,136,136,120,8,8,112,
5,5,5,6,0,1,56,32,32,160,64,4,3,3,6,0,
3,16,208,16,4,8,8,6,0,255,16,0,48,16,16,16,
144,96,3,3,3,6,0,4,160,64,160,5,7,7,6,0,
0,32,112,160,160,168,112,32,5,7,7,6,0,0,64,64,
224,64,224,64,120,5,7,7,6,0,0,112,0,176,200,136,
136,136,5,7,7,6,0,0,80,0,112,136,136,136,112,5,
7,7,6,0,255,176,200,136,136,240,128,128,5,7,7,6,
0,255,104,152,136,136,120,8,8,5,6,6,6,0,0,112,
136,248,136,136,112,5,3,3,6,0,2,88,168,208,5,5,
5,6,0,0,112,136,136,80,216,5,7,7,6,0,0,80,
0,136,136,136,152,104,5,7,7,6,0,0,248,128,64,32,
64,128,248,5,5,5,6,0,0,248,80,80,80,152,5,7,
7,6,0,0,248,0,136,80,32,80,136,5,7,7,6,0,
255,136,136,136,136,120,8,112,5,6,6,6,0,1,8,240,
32,248,32,32,5,5,5,6,0,0,248,64,120,72,136,5,
5,5,6,0,0,248,168,248,136,136,5,5,5,6,0,1,
32,0,248,0,32,0,0,0,6,0,8,6,10,10,6,0,
254,252,252,252,252,252,252,252,252,252,252};

@ -0,0 +1,203 @@
/*
Fontname: HD44780_W
Copyright: A.Hardtung, public domain
Capital A Height: 7, '1' Height: 7
Calculated Max Values w= 5 h= 9 x= 2 y= 5 dx= 6 dy= 0 ascent= 8 len= 9
Font Bounding box w= 6 h= 9 x= 0 y=-2
Calculated Min Values x= 0 y=-1 dx= 0 dy= 0
Pure Font ascent = 7 descent=-1
X Font ascent = 7 descent=-1
Max Font ascent = 8 descent=-1
*/
#include <utility/u8g.h>
const u8g_fntpgm_uint8_t HD44780_W_5x7[3034] U8G_SECTION(".progmem.HD44780_W_5x7") = {
0,6,9,0,254,7,2,79,3,222,16,255,255,8,255,7,
255,4,7,7,6,0,0,16,48,112,240,112,48,16,4,7,
7,6,1,0,128,192,224,240,224,192,128,5,3,3,6,0,
4,216,72,144,5,3,3,6,0,4,216,144,72,5,7,7,
6,0,0,32,112,248,0,32,112,248,5,7,7,6,0,0,
248,112,32,0,248,112,32,5,5,5,6,0,1,112,248,248,
248,112,5,7,7,6,0,0,8,8,40,72,248,64,32,5,
7,7,6,0,0,32,112,168,32,32,32,32,5,7,7,6,
0,0,32,32,32,32,168,112,32,5,5,5,6,0,1,32,
64,248,64,32,5,5,5,6,0,1,32,16,248,16,32,5,
7,7,6,0,0,16,32,64,32,16,0,248,5,7,7,6,
0,0,64,32,16,32,64,0,248,5,5,5,6,0,1,32,
32,112,112,248,5,5,5,6,0,0,248,112,112,32,32,0,
0,0,6,0,0,1,7,7,6,2,0,128,128,128,128,128,
0,128,3,2,2,6,1,5,160,160,5,7,7,6,0,0,
80,80,248,80,248,80,80,5,7,7,6,0,0,32,120,160,
112,40,240,32,5,7,7,6,0,0,192,200,16,32,64,152,
24,5,7,7,6,0,0,96,144,160,64,168,144,104,2,3,
3,6,1,4,192,64,128,3,7,7,6,1,0,32,64,128,
128,128,64,32,3,7,7,6,1,0,128,64,32,32,32,64,
128,5,5,5,6,0,1,32,168,112,168,32,5,5,5,6,
0,1,32,32,248,32,32,2,3,3,6,2,255,192,64,128,
5,1,1,6,0,3,248,2,2,2,6,2,0,192,192,5,
5,5,6,0,1,8,16,32,64,128,5,7,7,6,0,0,
112,136,152,168,200,136,112,3,7,7,6,1,0,64,192,64,
64,64,64,224,5,7,7,6,0,0,112,136,8,112,128,128,
248,5,7,7,6,0,0,248,16,32,16,8,8,240,5,7,
7,6,0,0,16,48,80,144,248,16,16,5,7,7,6,0,
0,248,128,240,8,8,136,112,5,7,7,6,0,0,48,64,
128,240,136,136,112,5,7,7,6,0,0,248,8,16,32,32,
32,32,5,7,7,6,0,0,112,136,136,112,136,136,112,5,
7,7,6,0,0,112,136,136,120,8,16,96,2,5,5,6,
2,0,192,192,0,192,192,2,6,6,6,2,255,192,192,0,
192,64,128,4,7,7,6,0,0,16,32,64,128,64,32,16,
5,3,3,6,0,2,248,0,248,4,7,7,6,1,0,128,
64,32,16,32,64,128,5,7,7,6,0,0,112,136,8,16,
32,0,32,5,6,6,6,0,0,112,136,8,104,168,112,5,
7,7,6,0,0,112,136,136,248,136,136,136,5,7,7,6,
0,0,240,136,136,240,136,136,240,5,7,7,6,0,0,112,
136,128,128,128,136,112,5,7,7,6,0,0,224,144,136,136,
136,144,224,5,7,7,6,0,0,248,128,128,240,128,128,248,
5,7,7,6,0,0,248,128,128,240,128,128,128,5,7,7,
6,0,0,112,136,128,184,136,136,112,5,7,7,6,0,0,
136,136,136,248,136,136,136,1,7,7,6,2,0,128,128,128,
128,128,128,128,5,7,7,6,0,0,56,16,16,16,16,144,
96,5,7,7,6,0,0,136,144,160,192,160,144,136,5,7,
7,6,0,0,128,128,128,128,128,128,248,5,7,7,6,0,
0,136,216,168,136,136,136,136,5,7,7,6,0,0,136,136,
200,168,152,136,136,5,7,7,6,0,0,112,136,136,136,136,
136,112,5,7,7,6,0,0,240,136,136,240,128,128,128,5,
7,7,6,0,0,112,136,136,136,168,144,104,5,7,7,6,
0,0,240,136,136,240,160,144,136,5,7,7,6,0,0,120,
128,128,112,8,8,240,5,7,7,6,0,0,248,32,32,32,
32,32,32,5,7,7,6,0,0,136,136,136,136,136,136,112,
5,7,7,6,0,0,136,136,136,136,136,80,32,5,7,7,
6,0,0,136,136,136,136,136,168,80,5,7,7,6,0,0,
136,136,80,32,80,136,136,5,7,7,6,0,0,136,136,136,
80,32,32,32,5,7,7,6,0,0,248,8,16,32,64,128,
248,3,7,7,6,1,0,224,128,128,128,128,128,224,5,5,
5,6,0,1,128,64,32,16,8,3,7,7,6,1,0,224,
32,32,32,32,32,224,5,3,3,6,0,4,32,80,136,5,
1,1,6,0,0,248,2,2,2,6,2,5,128,64,5,5,
5,6,0,0,112,8,120,136,120,5,7,7,6,0,0,128,
128,176,200,136,136,240,5,5,5,6,0,0,112,128,128,136,
112,5,7,7,6,0,0,8,8,104,152,136,136,120,5,5,
5,6,0,0,112,136,248,128,112,5,7,7,6,0,0,48,
72,224,64,64,64,64,5,6,6,6,0,255,112,136,136,120,
8,112,5,7,7,6,0,0,128,128,176,200,136,136,136,1,
7,7,6,2,0,128,0,128,128,128,128,128,3,8,8,6,
1,255,32,0,32,32,32,32,160,64,4,7,7,6,0,0,
128,128,144,160,192,160,144,3,7,7,6,1,0,192,64,64,
64,64,64,224,5,5,5,6,0,0,208,168,168,168,168,5,
5,5,6,0,0,176,200,136,136,136,5,5,5,6,0,0,
112,136,136,136,112,5,6,6,6,0,255,240,136,136,240,128,
128,5,6,6,6,0,255,120,136,136,120,8,8,5,5,5,
6,0,0,176,200,128,128,128,5,5,5,6,0,0,112,128,
112,8,240,5,7,7,6,0,0,64,64,224,64,64,72,48,
5,5,5,6,0,0,136,136,136,152,104,5,5,5,6,0,
0,136,136,136,80,32,5,5,5,6,0,0,136,136,168,168,
80,5,5,5,6,0,0,136,80,32,80,136,5,6,6,6,
0,255,136,136,136,120,8,112,5,5,5,6,0,0,248,16,
32,64,248,3,7,7,6,1,0,32,64,64,128,64,64,32,
1,7,7,6,2,0,128,128,128,128,128,128,128,3,7,7,
6,1,0,128,64,64,32,64,64,128,5,6,6,6,0,1,
8,40,72,248,64,32,5,7,7,6,0,0,32,80,136,136,
136,136,248,5,7,7,6,0,0,248,136,128,240,136,136,240,
5,8,8,6,0,255,120,40,40,40,72,136,248,136,5,7,
7,6,0,0,168,168,168,112,168,168,168,5,7,7,6,0,
0,240,8,8,112,8,8,240,5,7,7,6,0,0,136,136,
152,168,200,136,136,5,8,8,6,0,0,80,32,136,152,168,
168,200,136,5,7,7,6,0,0,120,40,40,40,40,168,72,
5,7,7,6,0,0,248,136,136,136,136,136,136,5,7,7,
6,0,0,136,136,136,80,32,64,128,5,8,8,6,0,255,
136,136,136,136,136,136,248,8,5,7,7,6,0,0,136,136,
136,120,8,8,8,5,7,7,6,0,0,168,168,168,168,168,
168,248,5,8,8,6,0,255,168,168,168,168,168,168,248,8,
5,7,7,6,0,0,192,64,64,112,72,72,112,5,7,7,
6,0,0,136,136,136,200,168,168,200,5,7,7,6,0,0,
112,136,40,80,8,136,112,5,5,5,6,0,0,64,160,144,
144,104,5,7,7,6,0,0,32,48,40,40,32,224,224,5,
7,7,6,0,0,248,136,128,128,128,128,128,5,5,5,6,
0,0,248,80,80,80,152,5,7,7,6,0,0,248,128,64,
32,64,128,248,5,5,5,6,0,0,120,144,144,144,96,5,
7,7,6,0,0,48,40,56,40,200,216,24,5,6,6,6,
0,0,8,112,160,32,32,16,5,6,6,6,0,1,32,112,
112,112,248,32,5,7,7,6,0,0,112,136,136,248,136,136,
112,5,5,5,6,0,0,112,136,136,80,216,5,7,7,6,
0,0,48,72,32,80,136,136,112,5,3,3,6,0,2,88,
168,208,5,6,6,6,0,0,80,248,248,248,112,32,5,5,
5,6,0,0,112,128,96,136,112,5,7,7,6,0,0,112,
136,136,136,136,136,136,5,7,7,6,0,0,216,216,216,216,
216,216,216,1,7,7,6,2,0,128,0,128,128,128,128,128,
5,7,7,6,0,0,32,112,160,160,168,112,32,5,7,7,
6,0,0,48,64,64,224,64,80,168,5,5,5,6,0,0,
136,112,80,112,136,5,7,7,6,0,0,136,80,248,32,248,
32,32,1,7,7,6,2,0,128,128,128,0,128,128,128,5,
8,8,6,0,0,48,72,32,80,80,32,144,96,5,7,7,
6,0,0,24,32,32,112,32,32,192,5,7,7,6,0,0,
248,136,184,184,184,136,248,5,7,7,6,0,0,112,8,120,
136,120,0,248,5,5,5,6,0,1,40,80,160,80,40,5,
7,7,6,0,0,144,168,168,232,168,168,144,5,7,7,6,
0,0,120,136,136,120,40,72,136,5,7,7,6,0,0,248,
136,168,136,152,168,248,2,3,3,6,2,4,64,128,192,4,
5,5,6,0,3,96,144,144,144,96,5,7,7,6,0,0,
32,32,248,32,32,0,248,4,5,5,6,0,3,96,144,32,
64,240,3,5,5,6,0,3,224,32,224,32,224,5,8,8,
6,0,0,224,144,224,128,144,184,144,24,5,8,8,6,0,
255,136,136,136,136,152,232,128,128,5,7,7,6,0,0,120,
152,152,120,24,24,24,2,2,2,6,2,2,192,192,5,5,
5,6,0,0,80,136,168,168,80,3,5,5,6,0,3,64,
192,64,64,224,5,7,7,6,0,0,112,136,136,136,112,0,
248,5,5,5,6,0,1,160,80,40,80,160,5,7,7,6,
0,0,136,144,168,88,184,8,8,5,7,7,6,0,0,136,
144,184,72,152,32,56,5,8,8,6,0,0,192,64,192,72,
216,56,8,8,5,7,7,6,0,0,32,0,32,64,128,136,
112,5,8,8,6,0,0,64,32,32,80,136,248,136,136,5,
8,8,6,0,0,16,32,32,80,136,248,136,136,5,8,8,
6,0,0,32,80,0,112,136,248,136,136,5,8,8,6,0,
0,104,144,0,112,136,248,136,136,5,8,8,6,0,0,80,
0,32,80,136,248,136,136,5,8,8,6,0,0,32,80,32,
112,136,248,136,136,5,7,7,6,0,0,56,96,160,184,224,
160,184,5,8,8,6,0,255,112,136,128,128,136,112,32,96,
5,8,8,6,0,0,64,32,0,248,128,240,128,248,5,8,
8,6,0,0,8,16,0,248,128,240,128,248,5,8,8,6,
0,0,32,80,0,248,128,240,128,248,5,7,7,6,0,0,
80,0,248,128,240,128,248,3,8,8,6,1,0,128,64,0,
224,64,64,64,224,3,8,8,6,1,0,32,64,0,224,64,
64,64,224,3,8,8,6,1,0,64,160,0,224,64,64,64,
224,3,7,7,6,1,0,160,0,224,64,64,64,224,5,7,
7,6,0,0,112,72,72,232,72,72,112,5,8,8,6,0,
0,104,144,0,136,200,168,152,136,5,8,8,6,0,0,64,
32,112,136,136,136,136,112,5,8,8,6,0,0,16,32,112,
136,136,136,136,112,5,8,8,6,0,0,32,80,0,112,136,
136,136,112,5,8,8,6,0,0,104,144,0,112,136,136,136,
112,5,8,8,6,0,0,80,0,112,136,136,136,136,112,5,
5,5,6,0,1,136,80,32,80,136,5,7,7,6,0,0,
112,32,112,168,112,32,112,5,8,8,6,0,0,64,32,136,
136,136,136,136,112,5,8,8,6,0,0,16,32,136,136,136,
136,136,112,5,8,8,6,0,0,32,80,0,136,136,136,136,
112,5,8,8,6,0,0,80,0,136,136,136,136,136,112,5,
8,8,6,0,0,16,32,136,80,32,32,32,32,5,8,8,
6,0,0,192,64,112,72,72,112,64,224,5,7,7,6,0,
0,48,72,72,112,72,72,176,5,8,8,6,0,0,64,32,
0,112,8,120,136,120,5,8,8,6,0,0,16,32,0,112,
8,120,136,120,5,8,8,6,0,0,32,80,0,112,8,120,
136,120,5,8,8,6,0,0,104,144,0,112,8,120,136,120,
5,7,7,6,0,0,80,0,112,8,120,136,120,5,8,8,
6,0,0,32,80,32,112,8,120,136,120,5,6,6,6,0,
0,208,40,120,160,168,80,5,6,6,6,0,255,112,128,136,
112,32,96,5,8,8,6,0,0,64,32,0,112,136,248,128,
112,5,8,8,6,0,0,16,32,0,112,136,248,128,112,5,
8,8,6,0,0,32,80,0,112,136,248,128,112,5,7,7,
6,0,0,80,0,112,136,248,128,112,3,8,8,6,1,0,
128,64,0,64,192,64,64,224,3,8,8,6,1,0,32,64,
0,64,192,64,64,224,3,8,8,6,1,0,64,160,0,64,
192,64,64,224,3,7,7,6,1,0,160,0,64,192,64,64,
224,5,7,7,6,0,0,160,64,160,16,120,136,112,5,8,
8,6,0,0,104,144,0,176,200,136,136,136,5,8,8,6,
0,0,64,32,0,112,136,136,136,112,5,8,8,6,0,0,
16,32,0,112,136,136,136,112,5,8,8,6,0,0,32,80,
0,112,136,136,136,112,5,8,8,6,0,0,104,144,0,112,
136,136,136,112,5,7,7,6,0,0,80,0,112,136,136,136,
112,5,5,5,6,0,1,32,0,248,0,32,5,7,7,6,
0,0,16,32,112,168,112,32,64,5,8,8,6,0,0,64,
32,0,136,136,136,152,104,5,8,8,6,0,0,16,32,0,
136,136,136,152,104,5,8,8,6,0,0,32,80,0,136,136,
136,152,104,5,7,7,6,0,0,80,0,136,136,136,152,104,
5,9,9,6,0,255,16,32,0,136,136,136,248,8,112,4,
7,7,6,1,0,192,64,96,80,96,64,224,5,8,8,6,
0,255,80,0,136,136,136,248,8,112};

@ -1,17 +1,17 @@
/* /*
Fontname: ISO10646-1-Marlin Fontname: ISO10646-1
Copyright: A.Hardtung, public domain Copyright: A.Hardtung, public domain
Capital A Height: 7, '1' Height: 7 Capital A Height: 7, '1' Height: 7
Calculated Max Values w= 5 h=10 x= 2 y= 7 dx= 6 dy= 0 ascent= 8 len= 9 Calculated Max Values w= 5 h= 9 x= 2 y= 7 dx= 6 dy= 0 ascent= 8 len= 9
Font Bounding box w= 6 h= 9 x= 0 y=-2 Font Bounding box w= 6 h= 9 x= 0 y=-2
Calculated Min Values x= 0 y=-2 dx= 0 dy= 0 Calculated Min Values x= 0 y=-1 dx= 0 dy= 0
Pure Font ascent = 7 descent=-1 Pure Font ascent = 7 descent=-1
X Font ascent = 7 descent=-1 X Font ascent = 7 descent=-1
Max Font ascent = 8 descent=-2 Max Font ascent = 8 descent=-1
*/ */
#include <utility/u8g.h> #include <utility/u8g.h>
const u8g_fntpgm_uint8_t ISO10646_1_Marlin_5x7[2596] U8G_SECTION(".progmem.ISO10646_1_Marlin_5x7") = { const u8g_fntpgm_uint8_t ISO10646_1_5x7[2592] U8G_SECTION(".progmem.ISO10646_1_5x7") = {
0,6,9,0,254,7,1,146,3,33,32,255,255,8,254,7, 0,6,9,0,254,7,1,146,3,33,32,255,255,8,255,7,
255,0,0,0,6,0,0,1,7,7,6,2,0,128,128,128, 255,0,0,0,6,0,0,1,7,7,6,2,0,128,128,128,
128,128,0,128,3,2,2,6,1,5,160,160,5,7,7,6, 128,128,0,128,3,2,2,6,1,5,160,160,5,7,7,6,
0,0,80,80,248,80,248,80,80,5,7,7,6,0,0,32, 0,0,80,80,248,80,248,80,80,5,7,7,6,0,0,32,
@ -166,11 +166,11 @@ const u8g_fntpgm_uint8_t ISO10646_1_Marlin_5x7[2596] U8G_SECTION(".progmem.ISO10
8,6,0,0,32,80,0,112,136,136,136,112,5,8,8,6, 8,6,0,0,32,80,0,112,136,136,136,112,5,8,8,6,
0,0,104,144,0,112,136,136,136,112,5,7,7,6,0,0, 0,0,104,144,0,112,136,136,136,112,5,7,7,6,0,0,
80,0,112,136,136,136,112,5,5,5,6,0,1,32,0,248, 80,0,112,136,136,136,112,5,5,5,6,0,1,32,0,248,
0,32,5,8,8,6,0,0,64,240,200,136,136,152,120,16, 0,32,5,7,7,6,0,255,16,112,168,168,168,112,64,5,
5,8,8,6,0,0,192,248,136,136,136,136,136,248,5,5, 8,8,6,0,0,64,32,0,136,136,136,152,104,5,8,8,
5,6,0,1,32,48,248,48,32,5,8,8,6,0,0,32, 6,0,0,16,32,0,136,136,136,152,104,5,8,8,6,0,
112,248,32,32,32,32,224,5,9,9,6,0,255,32,112,168, 0,32,80,0,136,136,136,152,104,5,7,7,6,0,0,80,
168,184,136,136,112,32,5,9,9,6,0,255,224,128,192,176, 0,136,136,136,152,104,5,9,9,6,0,255,16,32,0,136,
168,40,48,40,40,5,9,9,6,0,255,248,168,136,136,136, 136,136,248,8,112,4,7,7,6,1,255,192,64,96,80,96,
136,136,168,248,5,10,10,6,0,254,32,80,80,80,80,136, 64,224,5,8,8,6,0,255,80,0,136,136,136,120,8,112
168,168,136,112}; };

@ -0,0 +1,174 @@
/*
Fontname: ISO10646_5_Cyrillic
Copyright: A. Hardtung, public domain
Capital A Height: 7, '1' Height: 7
Calculated Max Values w= 5 h= 9 x= 2 y= 5 dx= 6 dy= 0 ascent= 8 len= 9
Font Bounding box w= 6 h= 9 x= 0 y=-2
Calculated Min Values x= 0 y=-1 dx= 0 dy= 0
Pure Font ascent = 7 descent=-1
X Font ascent = 7 descent=-1
Max Font ascent = 8 descent=-1
*/
#include <utility/u8g.h>
const u8g_fntpgm_uint8_t ISO10646_5_Cyrillic_5x7[2560] U8G_SECTION(".progmem.ISO10646_5_Cyrillic_5x7") = {
0,6,9,0,254,7,1,145,3,32,32,255,255,8,255,7,
255,0,0,0,6,0,0,1,7,7,6,2,0,128,128,128,
128,128,0,128,3,2,2,6,1,5,160,160,5,7,7,6,
0,0,80,80,248,80,248,80,80,5,7,7,6,0,0,32,
120,160,112,40,240,32,5,7,7,6,0,0,192,200,16,32,
64,152,24,5,7,7,6,0,0,96,144,160,64,168,144,104,
2,3,3,6,1,4,192,64,128,3,7,7,6,1,0,32,
64,128,128,128,64,32,3,7,7,6,1,0,128,64,32,32,
32,64,128,5,5,5,6,0,1,32,168,112,168,32,5,5,
5,6,0,1,32,32,248,32,32,2,3,3,6,2,255,192,
64,128,5,1,1,6,0,3,248,2,2,2,6,2,0,192,
192,5,5,5,6,0,1,8,16,32,64,128,5,7,7,6,
0,0,112,136,152,168,200,136,112,3,7,7,6,1,0,64,
192,64,64,64,64,224,5,7,7,6,0,0,112,136,8,112,
128,128,248,5,7,7,6,0,0,248,16,32,16,8,8,240,
5,7,7,6,0,0,16,48,80,144,248,16,16,5,7,7,
6,0,0,248,128,240,8,8,136,112,5,7,7,6,0,0,
48,64,128,240,136,136,112,5,7,7,6,0,0,248,8,16,
32,32,32,32,5,7,7,6,0,0,112,136,136,112,136,136,
112,5,7,7,6,0,0,112,136,136,120,8,16,96,2,5,
5,6,2,0,192,192,0,192,192,2,6,6,6,2,255,192,
192,0,192,64,128,4,7,7,6,0,0,16,32,64,128,64,
32,16,5,3,3,6,0,2,248,0,248,4,7,7,6,1,
0,128,64,32,16,32,64,128,5,7,7,6,0,0,112,136,
8,16,32,0,32,5,6,6,6,0,0,112,136,8,104,168,
112,5,7,7,6,0,0,112,136,136,248,136,136,136,5,7,
7,6,0,0,240,136,136,240,136,136,240,5,7,7,6,0,
0,112,136,128,128,128,136,112,5,7,7,6,0,0,224,144,
136,136,136,144,224,5,7,7,6,0,0,248,128,128,240,128,
128,248,5,7,7,6,0,0,248,128,128,240,128,128,128,5,
7,7,6,0,0,112,136,128,184,136,136,112,5,7,7,6,
0,0,136,136,136,248,136,136,136,1,7,7,6,2,0,128,
128,128,128,128,128,128,5,7,7,6,0,0,56,16,16,16,
16,144,96,5,7,7,6,0,0,136,144,160,192,160,144,136,
5,7,7,6,0,0,128,128,128,128,128,128,248,5,7,7,
6,0,0,136,216,168,136,136,136,136,5,7,7,6,0,0,
136,136,200,168,152,136,136,5,7,7,6,0,0,112,136,136,
136,136,136,112,5,7,7,6,0,0,240,136,136,240,128,128,
128,5,7,7,6,0,0,112,136,136,136,168,144,104,5,7,
7,6,0,0,240,136,136,240,160,144,136,5,7,7,6,0,
0,120,128,128,112,8,8,240,5,7,7,6,0,0,248,32,
32,32,32,32,32,5,7,7,6,0,0,136,136,136,136,136,
136,112,5,7,7,6,0,0,136,136,136,136,136,80,32,5,
7,7,6,0,0,136,136,136,136,136,168,80,5,7,7,6,
0,0,136,136,80,32,80,136,136,5,7,7,6,0,0,136,
136,136,80,32,32,32,5,7,7,6,0,0,248,8,16,32,
64,128,248,3,7,7,6,1,0,224,128,128,128,128,128,224,
5,5,5,6,0,1,128,64,32,16,8,3,7,7,6,1,
0,224,32,32,32,32,32,224,5,3,3,6,0,4,32,80,
136,5,1,1,6,0,0,248,2,2,2,6,2,5,128,64,
5,5,5,6,0,0,112,8,120,136,120,5,7,7,6,0,
0,128,128,176,200,136,136,240,5,5,5,6,0,0,112,128,
128,136,112,5,7,7,6,0,0,8,8,104,152,136,136,120,
5,5,5,6,0,0,112,136,248,128,112,5,7,7,6,0,
0,48,72,224,64,64,64,64,5,6,6,6,0,255,112,136,
136,120,8,112,5,7,7,6,0,0,128,128,176,200,136,136,
136,1,7,7,6,2,0,128,0,128,128,128,128,128,3,8,
8,6,1,255,32,0,32,32,32,32,160,64,4,7,7,6,
0,0,128,128,144,160,192,160,144,3,7,7,6,1,0,192,
64,64,64,64,64,224,5,5,5,6,0,0,208,168,168,168,
168,5,5,5,6,0,0,176,200,136,136,136,5,5,5,6,
0,0,112,136,136,136,112,5,6,6,6,0,255,240,136,136,
240,128,128,5,6,6,6,0,255,120,136,136,120,8,8,5,
5,5,6,0,0,176,200,128,128,128,5,5,5,6,0,0,
112,128,112,8,240,5,7,7,6,0,0,64,64,224,64,64,
72,48,5,5,5,6,0,0,136,136,136,152,104,5,5,5,
6,0,0,136,136,136,80,32,5,5,5,6,0,0,136,136,
168,168,80,5,5,5,6,0,0,136,80,32,80,136,5,6,
6,6,0,255,136,136,136,120,8,112,5,5,5,6,0,0,
248,16,32,64,248,3,7,7,6,1,0,32,64,64,128,64,
64,32,1,7,7,6,2,0,128,128,128,128,128,128,128,3,
7,7,6,1,0,128,64,64,32,64,64,128,5,2,2,6,
0,3,104,144,0,0,0,6,0,0,0,0,0,6,0,0,
0,0,0,6,0,0,0,0,0,6,0,0,0,0,0,6,
0,0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,
0,6,0,0,0,0,0,6,0,0,0,0,0,6,0,0,
0,0,0,6,0,0,0,0,0,6,0,0,0,0,0,6,
0,0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,
0,6,0,0,0,0,0,6,0,0,0,0,0,6,0,0,
0,0,0,6,0,0,0,0,0,6,0,0,0,0,0,6,
0,0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,
0,6,0,0,0,0,0,6,0,0,0,0,0,6,0,0,
0,0,0,6,0,0,0,0,0,6,0,0,0,0,0,6,
0,0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,
0,6,0,0,0,0,0,6,0,0,5,8,8,6,0,0,
64,248,128,128,240,128,128,248,5,8,8,6,0,0,80,248,
128,128,240,128,128,248,5,7,7,6,0,0,224,64,64,112,
72,72,112,5,8,8,6,0,0,16,32,248,136,128,128,128,
128,5,7,7,6,0,0,48,72,128,224,128,72,48,5,7,
7,6,0,0,112,136,128,112,8,136,112,3,7,7,6,1,
0,224,64,64,64,64,64,224,3,8,8,6,1,0,160,0,
224,64,64,64,64,224,5,7,7,6,0,0,56,16,16,16,
16,144,96,5,7,7,6,0,0,160,160,160,184,168,168,184,
5,7,7,6,0,0,160,160,160,248,168,168,184,4,7,7,
6,0,0,224,64,112,80,80,80,80,5,8,8,6,0,0,
16,32,136,144,160,224,144,136,5,8,8,6,0,0,64,32,
136,152,168,200,136,136,5,9,9,6,0,255,80,32,136,136,
136,80,32,32,32,5,8,8,6,0,255,136,136,136,136,136,
136,248,32,5,7,7,6,0,0,112,136,136,248,136,136,136,
5,7,7,6,0,0,248,128,128,240,136,136,240,5,7,7,
6,0,0,240,136,136,240,136,136,240,5,7,7,6,0,0,
248,136,128,128,128,128,128,5,8,8,6,0,255,120,40,40,
40,72,136,248,136,5,7,7,6,0,0,248,128,128,240,128,
128,248,5,7,7,6,0,0,168,168,168,112,168,168,168,5,
7,7,6,0,0,240,8,8,112,8,8,240,5,7,7,6,
0,0,136,136,152,168,200,136,136,5,8,8,6,0,0,80,
32,136,152,168,168,200,136,5,7,7,6,0,0,136,144,160,
192,160,144,136,5,7,7,6,0,0,120,40,40,40,40,168,
72,5,7,7,6,0,0,136,216,168,136,136,136,136,5,7,
7,6,0,0,136,136,136,248,136,136,136,5,7,7,6,0,
0,112,136,136,136,136,136,112,5,7,7,6,0,0,248,136,
136,136,136,136,136,5,7,7,6,0,0,240,136,136,240,128,
128,128,5,7,7,6,0,0,112,136,128,128,128,136,112,5,
7,7,6,0,0,248,32,32,32,32,32,32,5,7,7,6,
0,0,136,136,136,80,32,64,128,5,7,7,6,0,0,32,
112,168,168,168,112,32,5,7,7,6,0,0,136,136,80,32,
80,136,136,5,8,8,6,0,255,136,136,136,136,136,136,248,
8,5,7,7,6,0,0,136,136,136,152,104,8,8,5,7,
7,6,0,0,168,168,168,168,168,168,248,5,8,8,6,0,
255,168,168,168,168,168,168,248,8,5,7,7,6,0,0,192,
64,64,112,72,72,112,5,7,7,6,0,0,136,136,136,200,
168,168,200,5,7,7,6,0,0,128,128,128,240,136,136,240,
5,7,7,6,0,0,112,136,8,56,8,136,112,5,7,7,
6,0,0,144,168,168,232,168,168,144,5,7,7,6,0,0,
120,136,136,120,40,72,136,5,5,5,6,0,0,112,8,120,
136,120,5,7,7,6,0,0,24,96,128,240,136,136,112,4,
5,5,6,0,0,224,144,224,144,224,5,5,5,6,0,0,
248,136,128,128,128,5,6,6,6,0,255,120,40,72,136,248,
136,5,5,5,6,0,0,112,136,248,128,112,5,5,5,6,
0,0,168,168,112,168,168,5,5,5,6,0,0,240,8,48,
8,240,5,5,5,6,0,0,136,152,168,200,136,5,7,7,
6,0,0,80,32,136,152,168,200,136,4,5,5,6,0,0,
144,160,192,160,144,5,5,5,6,0,0,248,40,40,168,72,
5,5,5,6,0,0,136,216,168,136,136,5,5,5,6,0,
0,136,136,248,136,136,5,5,5,6,0,0,112,136,136,136,
112,5,5,5,6,0,0,248,136,136,136,136,5,6,6,6,
0,255,240,136,136,240,128,128,5,5,5,6,0,0,112,128,
128,136,112,5,5,5,6,0,0,248,32,32,32,32,5,6,
6,6,0,255,136,136,136,120,8,112,5,6,6,6,0,0,
32,112,168,168,112,32,5,5,5,6,0,0,136,80,32,80,
136,5,6,6,6,0,255,136,136,136,136,248,8,5,5,5,
6,0,0,136,136,248,8,8,5,5,5,6,0,0,168,168,
168,168,248,5,6,6,6,0,255,168,168,168,168,248,8,5,
5,5,6,0,0,192,64,112,72,112,5,5,5,6,0,0,
136,136,200,168,200,3,5,5,6,1,0,128,128,192,160,192,
5,5,5,6,0,0,112,136,56,136,112,5,5,5,6,0,
0,144,168,232,168,144,5,5,5,6,0,0,120,136,120,40,
72,5,8,8,6,0,0,64,32,0,112,136,248,128,112,5,
7,7,6,0,0,80,0,112,136,248,128,112,5,9,9,6,
0,255,64,224,64,64,120,72,72,72,16,5,8,8,6,0,
0,16,32,0,248,136,128,128,128,5,5,5,6,0,0,112,
136,96,136,112,5,5,5,6,0,0,112,128,112,8,240,1,
7,7,6,2,0,128,0,128,128,128,128,128,3,7,7,6,
1,0,160,0,64,64,64,64,64,3,8,8,6,1,255,32,
0,32,32,32,32,160,64,5,5,5,6,0,0,160,160,184,
168,184,5,5,5,6,0,0,160,160,248,168,184,5,6,6,
6,0,0,64,224,64,120,72,72,4,8,8,6,0,0,16,
32,0,144,160,192,160,144,5,8,8,6,0,0,64,32,0,
136,152,168,200,136,5,9,9,6,0,255,80,32,0,136,136,
136,120,8,112,5,6,6,6,0,255,136,136,136,136,248,32
};

@ -0,0 +1,173 @@
/*
Fontname: ISO10646_Kana
Copyright: A. Hardtung, public domain
Capital A Height: 7, '1' Height: 7
Calculated Max Values w= 5 h= 9 x= 2 y= 5 dx= 6 dy= 0 ascent= 8 len= 9
Font Bounding box w= 6 h= 9 x= 0 y=-2
Calculated Min Values x= 0 y=-1 dx= 0 dy= 0
Pure Font ascent = 7 descent=-1
X Font ascent = 7 descent=-1
Max Font ascent = 8 descent=-1
*/
#include <utility/u8g.h>
const u8g_fntpgm_uint8_t ISO10646_Kana_5x7[2549] U8G_SECTION(".progmem.ISO10646_Kana_5x7") = {
0,6,9,0,254,7,1,145,3,32,32,255,255,8,255,7,
255,0,0,0,6,0,0,1,7,7,6,2,0,128,128,128,
128,128,0,128,3,2,2,6,1,5,160,160,5,7,7,6,
0,0,80,80,248,80,248,80,80,5,7,7,6,0,0,32,
120,160,112,40,240,32,5,7,7,6,0,0,192,200,16,32,
64,152,24,5,7,7,6,0,0,96,144,160,64,168,144,104,
2,3,3,6,1,4,192,64,128,3,7,7,6,1,0,32,
64,128,128,128,64,32,3,7,7,6,1,0,128,64,32,32,
32,64,128,5,5,5,6,0,1,32,168,112,168,32,5,5,
5,6,0,1,32,32,248,32,32,2,3,3,6,2,255,192,
64,128,5,1,1,6,0,3,248,2,2,2,6,2,0,192,
192,5,5,5,6,0,1,8,16,32,64,128,5,7,7,6,
0,0,112,136,152,168,200,136,112,3,7,7,6,1,0,64,
192,64,64,64,64,224,5,7,7,6,0,0,112,136,8,112,
128,128,248,5,7,7,6,0,0,248,16,32,16,8,8,240,
5,7,7,6,0,0,16,48,80,144,248,16,16,5,7,7,
6,0,0,248,128,240,8,8,136,112,5,7,7,6,0,0,
48,64,128,240,136,136,112,5,7,7,6,0,0,248,8,16,
32,32,32,32,5,7,7,6,0,0,112,136,136,112,136,136,
112,5,7,7,6,0,0,112,136,136,120,8,16,96,2,5,
5,6,2,0,192,192,0,192,192,2,6,6,6,2,255,192,
192,0,192,64,128,4,7,7,6,0,0,16,32,64,128,64,
32,16,5,3,3,6,0,2,248,0,248,4,7,7,6,1,
0,128,64,32,16,32,64,128,5,7,7,6,0,0,112,136,
8,16,32,0,32,5,6,6,6,0,0,112,136,8,104,168,
112,5,7,7,6,0,0,112,136,136,248,136,136,136,5,7,
7,6,0,0,240,136,136,240,136,136,240,5,7,7,6,0,
0,112,136,128,128,128,136,112,5,7,7,6,0,0,224,144,
136,136,136,144,224,5,7,7,6,0,0,248,128,128,240,128,
128,248,5,7,7,6,0,0,248,128,128,240,128,128,128,5,
7,7,6,0,0,112,136,128,184,136,136,112,5,7,7,6,
0,0,136,136,136,248,136,136,136,1,7,7,6,2,0,128,
128,128,128,128,128,128,5,7,7,6,0,0,56,16,16,16,
16,144,96,5,7,7,6,0,0,136,144,160,192,160,144,136,
5,7,7,6,0,0,128,128,128,128,128,128,248,5,7,7,
6,0,0,136,216,168,136,136,136,136,5,7,7,6,0,0,
136,136,200,168,152,136,136,5,7,7,6,0,0,112,136,136,
136,136,136,112,5,7,7,6,0,0,240,136,136,240,128,128,
128,5,7,7,6,0,0,112,136,136,136,168,144,104,5,7,
7,6,0,0,240,136,136,240,160,144,136,5,7,7,6,0,
0,120,128,128,112,8,8,240,5,7,7,6,0,0,248,32,
32,32,32,32,32,5,7,7,6,0,0,136,136,136,136,136,
136,112,5,7,7,6,0,0,136,136,136,136,136,80,32,5,
7,7,6,0,0,136,136,136,136,136,168,80,5,7,7,6,
0,0,136,136,80,32,80,136,136,5,7,7,6,0,0,136,
136,136,80,32,32,32,5,7,7,6,0,0,248,8,16,32,
64,128,248,3,7,7,6,1,0,224,128,128,128,128,128,224,
5,5,5,6,0,1,128,64,32,16,8,3,7,7,6,1,
0,224,32,32,32,32,32,224,5,3,3,6,0,4,32,80,
136,5,1,1,6,0,0,248,2,2,2,6,2,5,128,64,
5,5,5,6,0,0,112,8,120,136,120,5,7,7,6,0,
0,128,128,176,200,136,136,240,5,5,5,6,0,0,112,128,
128,136,112,5,7,7,6,0,0,8,8,104,152,136,136,120,
5,5,5,6,0,0,112,136,248,128,112,5,7,7,6,0,
0,48,72,224,64,64,64,64,5,6,6,6,0,255,112,136,
136,120,8,112,5,7,7,6,0,0,128,128,176,200,136,136,
136,1,7,7,6,2,0,128,0,128,128,128,128,128,3,8,
8,6,1,255,32,0,32,32,32,32,160,64,4,7,7,6,
0,0,128,128,144,160,192,160,144,3,7,7,6,1,0,192,
64,64,64,64,64,224,5,5,5,6,0,0,208,168,168,168,
168,5,5,5,6,0,0,176,200,136,136,136,5,5,5,6,
0,0,112,136,136,136,112,5,6,6,6,0,255,240,136,136,
240,128,128,5,6,6,6,0,255,120,136,136,120,8,8,5,
5,5,6,0,0,176,200,128,128,128,5,5,5,6,0,0,
112,128,112,8,240,5,7,7,6,0,0,64,64,224,64,64,
72,48,5,5,5,6,0,0,136,136,136,152,104,5,5,5,
6,0,0,136,136,136,80,32,5,5,5,6,0,0,136,136,
168,168,80,5,5,5,6,0,0,136,80,32,80,136,5,6,
6,6,0,255,136,136,136,120,8,112,5,5,5,6,0,0,
248,16,32,64,248,3,7,7,6,1,0,32,64,64,128,64,
64,32,1,7,7,6,2,0,128,128,128,128,128,128,128,3,
7,7,6,1,0,128,64,64,32,64,64,128,5,2,2,6,
0,3,104,144,0,0,0,6,0,0,0,0,0,6,0,0,
0,0,0,6,0,0,0,0,0,6,0,0,0,0,0,6,
0,0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,
0,6,0,0,0,0,0,6,0,0,0,0,0,6,0,0,
0,0,0,6,0,0,0,0,0,6,0,0,0,0,0,6,
0,0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,
0,6,0,0,0,0,0,6,0,0,0,0,0,6,0,0,
0,0,0,6,0,0,0,0,0,6,0,0,0,0,0,6,
0,0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,
0,6,0,0,0,0,0,6,0,0,0,0,0,6,0,0,
0,0,0,6,0,0,0,0,0,6,0,0,0,0,0,6,
0,0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,
0,6,0,0,0,0,0,6,0,0,5,3,3,6,0,2,
248,0,248,5,6,6,6,0,0,248,8,40,48,32,64,5,
7,7,6,0,0,248,8,40,48,32,32,64,4,5,5,6,
0,0,16,32,96,160,32,5,7,7,6,0,0,8,16,32,
96,160,32,32,5,5,5,6,0,0,32,248,136,8,48,5,
7,7,6,0,0,32,248,136,136,8,16,32,5,4,4,6,
0,0,248,32,32,248,5,6,6,6,0,0,248,32,32,32,
32,248,5,5,5,6,0,0,16,248,48,80,144,5,7,7,
6,0,0,16,248,16,48,80,144,16,5,5,5,6,0,0,
64,248,72,80,64,5,7,7,6,0,0,40,0,64,248,72,
80,64,5,7,7,6,0,0,32,248,32,248,32,32,32,5,
8,8,6,0,0,40,0,32,248,32,248,32,32,4,6,6,
6,0,0,64,112,144,16,16,32,5,8,8,6,0,0,40,
0,64,112,144,16,16,32,5,6,6,6,0,0,64,120,144,
16,16,32,5,8,8,6,0,0,40,0,64,120,144,16,16,
32,5,5,5,6,0,0,248,8,8,8,248,5,7,7,6,
0,0,40,0,248,8,8,8,248,5,7,7,6,0,255,80,
248,80,80,16,32,64,5,9,9,6,0,255,40,0,80,248,
80,80,16,32,64,5,6,6,6,0,0,192,8,200,8,16,
224,5,8,8,6,0,0,40,0,192,8,200,8,16,224,5,
6,6,6,0,0,248,8,16,32,80,136,5,8,8,6,0,
0,40,0,248,8,16,32,80,136,5,6,6,6,0,0,64,
248,72,80,64,120,5,8,8,6,0,0,40,0,64,248,72,
80,64,120,4,4,4,6,0,1,16,208,16,224,5,7,7,
6,0,0,40,0,8,200,8,16,224,5,7,7,6,0,255,
32,120,136,40,16,40,64,5,9,9,6,0,255,40,0,32,
120,136,40,16,40,64,5,6,6,6,0,0,240,32,248,32,
64,128,5,8,8,6,0,0,40,0,240,32,248,32,64,128,
4,5,5,6,0,1,192,16,208,16,224,5,6,6,6,0,
0,192,8,200,8,16,224,5,8,8,6,0,0,40,0,192,
8,200,8,16,224,5,6,6,6,0,0,112,0,248,32,32,
64,5,8,8,6,0,0,40,0,112,0,248,32,32,64,3,
7,7,6,1,0,128,128,128,192,160,128,128,4,8,8,6,
1,0,80,0,128,128,192,160,128,128,5,7,7,6,0,0,
32,32,248,32,32,64,128,5,6,6,6,0,0,112,0,0,
0,0,248,5,6,6,6,0,0,248,8,80,32,80,128,5,
7,7,6,0,255,32,248,8,16,32,112,168,3,7,7,6,
1,0,32,32,32,32,32,64,128,5,5,5,6,0,0,16,
136,136,136,136,5,7,7,6,0,0,40,0,16,136,136,136,
136,5,8,8,6,0,0,24,24,0,16,136,136,136,136,5,
7,7,6,0,0,128,128,248,128,128,128,120,5,8,8,6,
0,0,40,128,128,248,128,128,128,120,5,8,8,6,0,0,
24,152,128,248,128,128,128,120,5,6,6,6,0,0,248,8,
8,8,16,96,5,8,8,6,0,0,40,0,248,8,8,8,
16,96,5,8,8,6,0,0,24,24,248,8,8,8,16,96,
5,5,5,6,0,1,64,160,16,8,8,5,7,7,6,0,
1,40,0,64,160,16,8,8,5,7,7,6,0,1,24,24,
64,160,16,8,8,5,6,6,6,0,0,32,248,32,32,168,
168,5,8,8,6,0,0,40,0,32,248,32,32,168,168,5,
8,8,6,0,0,24,24,32,248,32,32,168,168,5,6,6,
6,0,0,248,8,8,80,32,16,4,6,6,6,1,0,224,
0,224,0,224,16,5,6,6,6,0,0,32,64,128,144,248,
8,5,6,6,6,0,0,8,8,80,32,80,128,5,6,6,
6,0,0,120,32,248,32,32,56,5,7,7,6,0,0,64,
64,248,72,80,64,64,5,7,7,6,0,0,64,248,72,80,
64,64,64,5,5,5,6,0,0,112,16,16,16,248,5,7,
7,6,0,0,112,16,16,16,16,16,248,4,5,5,6,1,
0,240,16,240,16,240,5,7,7,6,0,0,248,8,8,248,
8,8,248,5,6,6,6,0,0,112,0,248,8,16,32,3,
6,6,6,1,0,160,160,160,160,32,64,5,6,6,6,0,
0,80,80,80,80,88,144,4,6,6,6,1,0,128,128,128,
144,160,192,5,6,6,6,0,0,248,136,136,136,248,136,5,
5,5,6,0,0,248,136,8,16,96,5,6,6,6,0,0,
248,136,8,8,16,96,5,6,6,6,0,0,16,248,80,80,
248,16,5,6,6,6,0,0,248,8,80,96,64,248,5,6,
6,6,0,0,248,8,248,8,16,32,5,6,6,6,0,0,
128,64,8,8,16,224,5,8,8,6,0,0,40,0,32,248,
136,8,24,32,5,6,6,6,0,0,64,248,72,72,136,144,
4,5,5,6,1,0,128,240,160,32,32,5,8,8,6,0,
0,40,0,248,136,8,8,16,96,5,8,8,6,0,0,40,
0,16,248,80,80,248,16,5,7,7,6,0,0,40,0,248,
16,32,32,248,5,8,8,6,0,0,40,0,248,8,248,8,
16,32,2,2,2,6,2,2,192,192,5,1,1,6,0,3,
248,5,5,5,6,0,1,128,64,32,16,8,5,6,6,6,
0,1,40,128,64,32,16,8,5,7,7,6,0,0,248,8,
8,8,8,8,8};

@ -0,0 +1,22 @@
/*
Fontname: Marlin_symbols
Copyright: Created with Fony 1.4.7
Capital A Height: 0, '1' Height: 0
Calculated Max Values w= 5 h=10 x= 0 y= 3 dx= 6 dy= 0 ascent= 8 len=10
Font Bounding box w= 6 h= 9 x= 0 y=-2
Calculated Min Values x= 0 y=-2 dx= 0 dy= 0
Pure Font ascent = 0 descent= 0
X Font ascent = 0 descent= 0
Max Font ascent = 8 descent=-2
*/
#include <utility/u8g.h>
const u8g_fntpgm_uint8_t Marlin_symbols[140] U8G_SECTION(".progmem.Marlin_symbols") = {
0,6,9,0,254,0,0,0,0,0,1,9,0,8,254,0,
0,5,8,8,6,0,0,64,240,200,136,136,152,120,16,5,
8,8,6,0,0,192,248,136,136,136,136,136,248,5,5,5,
6,0,1,32,48,248,48,32,5,8,8,6,0,0,32,112,
248,32,32,32,32,224,5,9,9,6,0,255,32,112,168,168,
184,136,136,112,32,5,9,9,6,0,255,224,128,192,176,168,
40,48,40,40,5,9,9,6,0,255,248,168,136,136,136,136,
136,168,248,5,10,10,6,0,254,32,80,80,80,80,136,168,
168,136,112,3,3,3,6,0,3,64,160,64};

@ -14,11 +14,9 @@
#ifndef DOGM_LCD_IMPLEMENTATION_H #ifndef DOGM_LCD_IMPLEMENTATION_H
#define DOGM_LCD_IMPLEMENTATION_H #define DOGM_LCD_IMPLEMENTATION_H
#define MARLIN_VERSION "1.0.2"
/** /**
* Implementation of the LCD display routines for a DOGM128 graphic display. These are common LCD 128x64 pixel graphic displays. * Implementation of the LCD display routines for a DOGM128 graphic display. These are common LCD 128x64 pixel graphic displays.
**/ */
#ifdef ULTIPANEL #ifdef ULTIPANEL
#define BLEN_A 0 #define BLEN_A 0
@ -32,53 +30,99 @@
#include <U8glib.h> #include <U8glib.h>
#include "DOGMbitmaps.h" #include "DOGMbitmaps.h"
#include "dogm_font_data_ISO10646_1_Marlin.h"
#include "ultralcd.h" #include "ultralcd.h"
#include "ultralcd_st7920_u8glib_rrd.h" #include "ultralcd_st7920_u8glib_rrd.h"
#include "Configuration.h"
/* Russian language not supported yet, needs custom font // save 3120 bytes of PROGMEM by commenting out #define USE_BIG_EDIT_FONT
// we don't have a big font for Cyrillic, Kana
#if defined( MAPPER_C2C3 ) || defined( MAPPER_NON )
// #define USE_BIG_EDIT_FONT
#endif
#ifdef LANGUAGE_RU // If you have spare 2300Byte of progmem and want to use a
#include "LiquidCrystalRus.h" // smaller font on the Info-screen uncomment the next line.
#define LCD_CLASS LiquidCrystalRus //#define USE_SMALL_INFOFONT
#ifdef USE_SMALL_INFOFONT
#include "dogm_font_data_6x9_marlin.h"
#define FONT_STATUSMENU_NAME u8g_font_6x9
#else #else
#include <LiquidCrystal.h> #define FONT_STATUSMENU_NAME FONT_MENU_NAME
#define LCD_CLASS LiquidCrystal
#endif #endif
*/
#define USE_BIG_EDIT_FONT // save 3120 bytes of PROGMEM by commenting out this line #include "dogm_font_data_Marlin_symbols.h" // The Marlin special symbols
#define FONT_MENU ISO10646_1_Marlin_5x7 #define FONT_SPECIAL_NAME Marlin_symbols
#ifndef SIMULATE_ROMFONT
#if defined( DISPLAY_CHARSET_ISO10646_1 )
#include "dogm_font_data_ISO10646_1.h"
#define FONT_MENU_NAME ISO10646_1_5x7
#elif defined( DISPLAY_CHARSET_ISO10646_5 )
#include "dogm_font_data_ISO10646_5_Cyrillic.h"
#define FONT_MENU_NAME ISO10646_5_Cyrillic_5x7
#elif defined( DISPLAY_CHARSET_ISO10646_KANA )
#include "dogm_font_data_ISO10646_Kana.h"
#define FONT_MENU_NAME ISO10646_Kana_5x7
#else // fall-back
#include "dogm_font_data_ISO10646_1.h"
#define FONT_MENU_NAME ISO10646_1_5x7
#endif
#else // SIMULATE_ROMFONT
#if defined( DISPLAY_CHARSET_HD44780_JAPAN )
#include "dogm_font_data_HD44780_J.h"
#define FONT_MENU_NAME HD44780_J_5x7
#elif defined( DISPLAY_CHARSET_HD44780_WESTERN )
#include "dogm_font_data_HD44780_W.h"
#define FONT_MENU_NAME HD44780_W_5x7
#elif defined( DISPLAY_CHARSET_HD44780_CYRILLIC )
#include "dogm_font_data_HD44780_C.h"
#define FONT_MENU_NAME HD44780_C_5x7
#else // fall-back
#include "dogm_font_data_ISO10646_1.h"
#define FONT_MENU_NAME ISO10646_1_5x7
#endif
#endif // SIMULATE_ROMFONT
//#define FONT_STATUSMENU_NAME FONT_MENU_NAME
#define FONT_STATUSMENU 1
#define FONT_SPECIAL 2
#define FONT_MENU_EDIT 3
#define FONT_MENU 4
// DOGM parameters (size in pixels) // DOGM parameters (size in pixels)
#define DOG_CHAR_WIDTH 6 #define DOG_CHAR_WIDTH 6
#define DOG_CHAR_HEIGHT 12 #define DOG_CHAR_HEIGHT 12
#ifdef USE_BIG_EDIT_FONT #ifdef USE_BIG_EDIT_FONT
#define FONT_MENU_EDIT u8g_font_9x18 #define FONT_MENU_EDIT_NAME u8g_font_9x18
#define DOG_CHAR_WIDTH_EDIT 9 #define DOG_CHAR_WIDTH_EDIT 9
#define DOG_CHAR_HEIGHT_EDIT 18 #define DOG_CHAR_HEIGHT_EDIT 18
#define LCD_WIDTH_EDIT 14 #define LCD_WIDTH_EDIT 14
#else #else
#define FONT_MENU_EDIT ISO10646_1_Marlin_5x7 #define FONT_MENU_EDIT_NAME FONT_MENU_NAME
#define DOG_CHAR_WIDTH_EDIT 6 #define DOG_CHAR_WIDTH_EDIT 6
#define DOG_CHAR_HEIGHT_EDIT 12 #define DOG_CHAR_HEIGHT_EDIT 12
#define LCD_WIDTH_EDIT 22 #define LCD_WIDTH_EDIT 22
#endif #endif
#define FONT_STATUSMENU FONT_MENU
#define START_ROW 0 #define START_ROW 0
/* Custom characters defined in font font_6x10_marlin.c */ /* Custom characters defined in font font_6x10_marlin_symbols */
#define LCD_STR_DEGREE "\xB0" // \x00 intentionally skipped to avoid problems in strings
#define LCD_STR_REFRESH "\xF8" #define LCD_STR_REFRESH "\x01"
#define LCD_STR_FOLDER "\xF9" #define LCD_STR_FOLDER "\x02"
#define LCD_STR_ARROW_RIGHT "\xFA" #define LCD_STR_ARROW_RIGHT "\x03"
#define LCD_STR_UPLEVEL "\xFB" #define LCD_STR_UPLEVEL "\x04"
#define LCD_STR_CLOCK "\xFC" #define LCD_STR_CLOCK "\x05"
#define LCD_STR_FEEDRATE "\xFD" #define LCD_STR_FEEDRATE "\x06"
#define LCD_STR_BEDTEMP "\xFE" #define LCD_STR_BEDTEMP "\x07"
#define LCD_STR_THERMOMETER "\xFF" #define LCD_STR_THERMOMETER "\x08"
#define LCD_STR_DEGREE "\x09"
#define LCD_STR_SPECIAL_MAX '\x09'
// Maximum here is 0x1f because 0x20 is ' ' (space) and the normal charsets begin.
// Better stay below 0x10 because DISPLAY_CHARSET_HD44780_WESTERN begins here.
int lcd_contrast; int lcd_contrast;
@ -97,6 +141,51 @@ U8GLIB_NHD_C12864 u8g(DOGLCD_CS, DOGLCD_A0);
U8GLIB_DOGM128 u8g(DOGLCD_CS, DOGLCD_A0); // HW-SPI Com: CS, A0 U8GLIB_DOGM128 u8g(DOGLCD_CS, DOGLCD_A0); // HW-SPI Com: CS, A0
#endif #endif
#include "utf_mapper.h"
char currentfont = 0;
static void lcd_setFont(char font_nr) {
switch(font_nr) {
case FONT_STATUSMENU : {u8g.setFont(FONT_STATUSMENU_NAME); currentfont = FONT_STATUSMENU;}; break;
case FONT_MENU : {u8g.setFont(FONT_MENU_NAME); currentfont = FONT_MENU;}; break;
case FONT_SPECIAL : {u8g.setFont(FONT_SPECIAL_NAME); currentfont = FONT_SPECIAL;}; break;
case FONT_MENU_EDIT : {u8g.setFont(FONT_MENU_EDIT_NAME); currentfont = FONT_MENU_EDIT;}; break;
break;
}
}
char lcd_print(char c) {
if ((c > 0) && (c <= LCD_STR_SPECIAL_MAX)) {
u8g.setFont(FONT_SPECIAL_NAME);
u8g.print(c);
lcd_setFont(currentfont);
return 1;
} else {
return charset_mapper(c);
}
}
char lcd_print(char* str) {
char c;
int i = 0;
char n = 0;
while ((c = str[i++])) {
n += lcd_print(c);
}
return n;
}
/* Arduino < 1.0.0 is missing a function to print PROGMEM strings, so we need to implement our own */
char lcd_printPGM(const char* str) {
char c;
char n = 0;
while ((c = pgm_read_byte(str++))) {
n += lcd_print(c);
}
return n;
}
static void lcd_implementation_init() static void lcd_implementation_init()
{ {
#ifdef LCD_PIN_BL // Enable LCD backlight #ifdef LCD_PIN_BL // Enable LCD backlight
@ -131,7 +220,7 @@ static void lcd_implementation_init()
u8g.firstPage(); u8g.firstPage();
do { do {
u8g.drawBitmapP(offx, offy, START_BMPBYTEWIDTH, START_BMPHEIGHT, start_bmp); u8g.drawBitmapP(offx, offy, START_BMPBYTEWIDTH, START_BMPHEIGHT, start_bmp);
u8g.setFont(FONT_MENU); lcd_setFont(FONT_MENU);
#ifndef STRING_SPLASH_LINE2 #ifndef STRING_SPLASH_LINE2
u8g.drawStr(txt1X, u8g.getHeight() - DOG_CHAR_HEIGHT, STRING_SPLASH_LINE1); u8g.drawStr(txt1X, u8g.getHeight() - DOG_CHAR_HEIGHT, STRING_SPLASH_LINE1);
#else #else
@ -144,21 +233,17 @@ static void lcd_implementation_init()
static void lcd_implementation_clear() { } // Automatically cleared by Picture Loop static void lcd_implementation_clear() { } // Automatically cleared by Picture Loop
/* Arduino < 1.0.0 is missing a function to print PROGMEM strings, so we need to implement our own */
static void lcd_printPGM(const char* str) {
char c;
while ((c = pgm_read_byte(str++))) u8g.print(c);
}
static void _draw_heater_status(int x, int heater) { static void _draw_heater_status(int x, int heater) {
bool isBed = heater < 0; bool isBed = heater < 0;
int y = 17 + (isBed ? 1 : 0); int y = 17 + (isBed ? 1 : 0);
u8g.setFont(FONT_STATUSMENU);
lcd_setFont(FONT_STATUSMENU);
u8g.setPrintPos(x,7); u8g.setPrintPos(x,7);
u8g.print(itostr3(int((heater >= 0 ? degTargetHotend(heater) : degTargetBed()) + 0.5))); lcd_print(itostr3(int((heater >= 0 ? degTargetHotend(heater) : degTargetBed()) + 0.5)));
lcd_printPGM(PSTR(LCD_STR_DEGREE " ")); lcd_printPGM(PSTR(LCD_STR_DEGREE " "));
u8g.setPrintPos(x,28); u8g.setPrintPos(x,28);
u8g.print(itostr3(int(heater >= 0 ? degHotend(heater) : degBed()) + 0.5)); lcd_print(itostr3(int(heater >= 0 ? degHotend(heater) : degBed()) + 0.5));
lcd_printPGM(PSTR(LCD_STR_DEGREE " ")); lcd_printPGM(PSTR(LCD_STR_DEGREE " "));
if (!isHeatingHotend(0)) { if (!isHeatingHotend(0)) {
u8g.drawBox(x+7,y,2,2); u8g.drawBox(x+7,y,2,2);
@ -190,7 +275,7 @@ static void lcd_implementation_status_screen() {
u8g.drawFrame(54,49,73,4); u8g.drawFrame(54,49,73,4);
// SD Card Progress bar and clock // SD Card Progress bar and clock
u8g.setFont(FONT_STATUSMENU); lcd_setFont(FONT_STATUSMENU);
if (IS_SD_PRINTING) { if (IS_SD_PRINTING) {
// Progress bar solid part // Progress bar solid part
@ -200,9 +285,9 @@ static void lcd_implementation_status_screen() {
u8g.setPrintPos(80,48); u8g.setPrintPos(80,48);
if (starttime != 0) { if (starttime != 0) {
uint16_t time = (millis() - starttime) / 60000; uint16_t time = (millis() - starttime) / 60000;
u8g.print(itostr2(time/60)); lcd_print(itostr2(time/60));
u8g.print(':'); lcd_print(':');
u8g.print(itostr2(time%60)); lcd_print(itostr2(time%60));
} }
else { else {
lcd_printPGM(PSTR("--:--")); lcd_printPGM(PSTR("--:--"));
@ -216,69 +301,79 @@ static void lcd_implementation_status_screen() {
if (EXTRUDERS < 4) _draw_heater_status(81, -1); if (EXTRUDERS < 4) _draw_heater_status(81, -1);
// Fan // Fan
u8g.setFont(FONT_STATUSMENU); lcd_setFont(FONT_STATUSMENU);
u8g.setPrintPos(104,27); u8g.setPrintPos(104,27);
#if defined(FAN_PIN) && FAN_PIN > -1 #if defined(FAN_PIN) && FAN_PIN > -1
int per = ((fanSpeed + 1) * 100) / 256; int per = ((fanSpeed + 1) * 100) / 256;
if (per) { if (per) {
u8g.print(itostr3(per));
u8g.print('%'); lcd_print(itostr3(per));
lcd_print('%');
} }
else else
#endif #endif
{ {
u8g.print("---"); lcd_printPGM(PSTR("---"));
} }
// X, Y, Z-Coordinates // X, Y, Z-Coordinates
#define XYZ_BASELINE 38 #define XYZ_BASELINE 38
u8g.setFont(FONT_STATUSMENU); lcd_setFont(FONT_STATUSMENU);
#ifdef USE_SMALL_INFOFONT
u8g.drawBox(0,30,128,10);
#else
u8g.drawBox(0,30,128,9); u8g.drawBox(0,30,128,9);
#endif
u8g.setColorIndex(0); // white on black u8g.setColorIndex(0); // white on black
u8g.setPrintPos(2,XYZ_BASELINE); u8g.setPrintPos(2,XYZ_BASELINE);
u8g.print('X'); lcd_print('X');
u8g.drawPixel(8,XYZ_BASELINE - 5); u8g.drawPixel(8,XYZ_BASELINE - 5);
u8g.drawPixel(8,XYZ_BASELINE - 3); u8g.drawPixel(8,XYZ_BASELINE - 3);
u8g.setPrintPos(10,XYZ_BASELINE); u8g.setPrintPos(10,XYZ_BASELINE);
u8g.print(ftostr31ns(current_position[X_AXIS])); lcd_print(ftostr31ns(current_position[X_AXIS]));
u8g.setPrintPos(43,XYZ_BASELINE); u8g.setPrintPos(43,XYZ_BASELINE);
u8g.print('Y'); lcd_print('Y');
u8g.drawPixel(49,XYZ_BASELINE - 5); u8g.drawPixel(49,XYZ_BASELINE - 5);
u8g.drawPixel(49,XYZ_BASELINE - 3); u8g.drawPixel(49,XYZ_BASELINE - 3);
u8g.setPrintPos(51,XYZ_BASELINE); u8g.setPrintPos(51,XYZ_BASELINE);
u8g.print(ftostr31ns(current_position[Y_AXIS])); lcd_print(ftostr31ns(current_position[Y_AXIS]));
u8g.setPrintPos(83,XYZ_BASELINE); u8g.setPrintPos(83,XYZ_BASELINE);
u8g.print('Z'); lcd_print('Z');
u8g.drawPixel(89,XYZ_BASELINE - 5); u8g.drawPixel(89,XYZ_BASELINE - 5);
u8g.drawPixel(89,XYZ_BASELINE - 3); u8g.drawPixel(89,XYZ_BASELINE - 3);
u8g.setPrintPos(91,XYZ_BASELINE); u8g.setPrintPos(91,XYZ_BASELINE);
u8g.print(ftostr31(current_position[Z_AXIS])); lcd_print(ftostr31(current_position[Z_AXIS]));
u8g.setColorIndex(1); // black on white u8g.setColorIndex(1); // black on white
// Feedrate // Feedrate
u8g.setFont(FONT_MENU); lcd_setFont(FONT_MENU);
u8g.setPrintPos(3,49); u8g.setPrintPos(3,49);
u8g.print(LCD_STR_FEEDRATE[0]); lcd_print(LCD_STR_FEEDRATE[0]);
u8g.setFont(FONT_STATUSMENU); lcd_setFont(FONT_STATUSMENU);
u8g.setPrintPos(12,49); u8g.setPrintPos(12,49);
u8g.print(itostr3(feedmultiply)); lcd_print(itostr3(feedmultiply));
u8g.print('%'); lcd_print('%');
// Status line // Status line
u8g.setFont(FONT_STATUSMENU); lcd_setFont(FONT_STATUSMENU);
#ifdef USE_SMALL_INFOFONT
u8g.setPrintPos(0,62);
#else
u8g.setPrintPos(0,63); u8g.setPrintPos(0,63);
#endif
#ifndef FILAMENT_LCD_DISPLAY #ifndef FILAMENT_LCD_DISPLAY
u8g.print(lcd_status_message); lcd_print(lcd_status_message);
#else #else
if (millis() < message_millis + 5000) { //Display both Status message line and Filament display on the last line if (millis() < message_millis + 5000) { //Display both Status message line and Filament display on the last line
u8g.print(lcd_status_message); lcd_print(lcd_status_message);
} }
else { else {
lcd_printPGM(PSTR("dia:")); lcd_printPGM(PSTR("dia:"));
u8g.print(ftostr12ns(filament_width_meas)); lcd_print(ftostr12ns(filament_width_meas));
lcd_printPGM(PSTR(" factor:")); lcd_printPGM(PSTR(" factor:"));
u8g.print(itostr3(extrudemultiply)); lcd_print(itostr3(extrudemultiply));
u8g.print('%'); lcd_print('%');
} }
#endif #endif
} }
@ -301,14 +396,13 @@ static void lcd_implementation_drawmenu_generic(bool isSelected, uint8_t row, co
lcd_implementation_mark_as_selected(row, isSelected); lcd_implementation_mark_as_selected(row, isSelected);
while ((c = pgm_read_byte(pstr))) { while (c = pgm_read_byte(pstr)) {
u8g.print(c); n -= lcd_print(c);
pstr++; pstr++;
n--;
} }
while (n--) u8g.print(' '); while (n--) lcd_print(' ');
u8g.print(post_char); lcd_print(post_char);
u8g.print(' '); lcd_print(' ');
} }
static void _drawmenu_setting_edit_generic(bool isSelected, uint8_t row, const char* pstr, const char* data, bool pgm) { static void _drawmenu_setting_edit_generic(bool isSelected, uint8_t row, const char* pstr, const char* data, bool pgm) {
@ -317,14 +411,13 @@ static void _drawmenu_setting_edit_generic(bool isSelected, uint8_t row, const c
lcd_implementation_mark_as_selected(row, isSelected); lcd_implementation_mark_as_selected(row, isSelected);
while ((c = pgm_read_byte(pstr))) { while (c = pgm_read_byte(pstr)) {
u8g.print(c); n -= lcd_print(c);
pstr++; pstr++;
n--;
} }
u8g.print(':'); lcd_print(':');
while (n--) u8g.print(' '); while (n--) lcd_print(' ');
if (pgm) { lcd_printPGM(data); } else { u8g.print(data); } if (pgm) { lcd_printPGM(data); } else { lcd_print((char *)data); }
} }
#define lcd_implementation_drawmenu_setting_edit_generic(sel, row, pstr, data) _drawmenu_setting_edit_generic(sel, row, pstr, data, false) #define lcd_implementation_drawmenu_setting_edit_generic(sel, row, pstr, data) _drawmenu_setting_edit_generic(sel, row, pstr, data, false)
@ -358,13 +451,13 @@ void lcd_implementation_drawedit(const char* pstr, char* value) {
#ifdef USE_BIG_EDIT_FONT #ifdef USE_BIG_EDIT_FONT
if (lcd_strlen_P(pstr) <= LCD_WIDTH_EDIT - 1) { if (lcd_strlen_P(pstr) <= LCD_WIDTH_EDIT - 1) {
u8g.setFont(FONT_MENU_EDIT); lcd_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 (lcd_strlen_P(pstr) >= LCD_WIDTH_EDIT - vallen) rows = 2; if (lcd_strlen_P(pstr) >= LCD_WIDTH_EDIT - vallen) rows = 2;
} }
else { else {
u8g.setFont(FONT_MENU); lcd_setFont(FONT_MENU);
} }
#endif #endif
@ -375,9 +468,9 @@ 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(':'); lcd_print(':');
u8g.setPrintPos((lcd_width - 1 - vallen) * char_width, rows * rowHeight + kHalfChar); u8g.setPrintPos((lcd_width - 1 - vallen) * char_width, rows * rowHeight + kHalfChar);
u8g.print(value); lcd_print(value);
} }
static void _drawmenu_sd(bool isSelected, uint8_t row, const char* pstr, const char* filename, char * const longFilename, bool isDir) { static void _drawmenu_sd(bool isSelected, uint8_t row, const char* pstr, const char* filename, char * const longFilename, bool isDir) {
@ -391,13 +484,12 @@ static void _drawmenu_sd(bool isSelected, uint8_t row, const char* pstr, const c
lcd_implementation_mark_as_selected(row, isSelected); lcd_implementation_mark_as_selected(row, isSelected);
if (isDir) u8g.print(LCD_STR_FOLDER[0]); if (isDir) lcd_print(LCD_STR_FOLDER[0]);
while ((c = *filename)) { while (c = *filename) {
u8g.print(c); n -= lcd_print(c);
filename++; filename++;
n--;
} }
while (n--) u8g.print(' '); while (n--) lcd_print(' ');
} }
#define lcd_implementation_drawmenu_sdfile(sel, row, pstr, filename, longFilename) _drawmenu_sd(sel, row, pstr, filename, longFilename, false) #define lcd_implementation_drawmenu_sdfile(sel, row, pstr, filename, longFilename) _drawmenu_sd(sel, row, pstr, filename, longFilename, false)
@ -408,16 +500,4 @@ static void _drawmenu_sd(bool isSelected, uint8_t row, const char* pstr, const c
#define lcd_implementation_drawmenu_gcode(sel, row, pstr, gcode) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', ' ') #define lcd_implementation_drawmenu_gcode(sel, row, pstr, gcode) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', ' ')
#define lcd_implementation_drawmenu_function(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', ' ') #define lcd_implementation_drawmenu_function(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', ' ')
static void lcd_implementation_quick_feedback() {
#if BEEPER > -1
SET_OUTPUT(BEEPER);
for(int8_t i=0; i<10; i++) {
WRITE(BEEPER,HIGH);
delay(3);
WRITE(BEEPER,LOW);
delay(3);
}
#endif
}
#endif //__DOGM_LCD_IMPLEMENTATION_H #endif //__DOGM_LCD_IMPLEMENTATION_H

@ -511,9 +511,11 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
// Custom M code points // Custom M code points
#define CUSTOM_M_CODES #define CUSTOM_M_CODES
#ifdef CUSTOM_M_CODES #ifdef CUSTOM_M_CODES
#ifdef ENABLE_AUTO_BED_LEVELING
#define CUSTOM_M_CODE_SET_Z_PROBE_OFFSET 851 #define CUSTOM_M_CODE_SET_Z_PROBE_OFFSET 851
#define Z_PROBE_OFFSET_RANGE_MIN -15 #define Z_PROBE_OFFSET_RANGE_MIN -15
#define Z_PROBE_OFFSET_RANGE_MAX -5 #define Z_PROBE_OFFSET_RANGE_MAX -5
#endif
#endif #endif

@ -511,9 +511,11 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
// Custom M code points // Custom M code points
#define CUSTOM_M_CODES #define CUSTOM_M_CODES
#ifdef CUSTOM_M_CODES #ifdef CUSTOM_M_CODES
#ifdef ENABLE_AUTO_BED_LEVELING
#define CUSTOM_M_CODE_SET_Z_PROBE_OFFSET 851 #define CUSTOM_M_CODE_SET_Z_PROBE_OFFSET 851
#define Z_PROBE_OFFSET_RANGE_MIN -15 #define Z_PROBE_OFFSET_RANGE_MIN -15
#define Z_PROBE_OFFSET_RANGE_MAX -5 #define Z_PROBE_OFFSET_RANGE_MAX -5
#endif
#endif #endif

@ -539,9 +539,11 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
// Custom M code points // Custom M code points
#define CUSTOM_M_CODES #define CUSTOM_M_CODES
#ifdef CUSTOM_M_CODES #ifdef CUSTOM_M_CODES
#ifdef ENABLE_AUTO_BED_LEVELING
#define CUSTOM_M_CODE_SET_Z_PROBE_OFFSET 851 #define CUSTOM_M_CODE_SET_Z_PROBE_OFFSET 851
#define Z_PROBE_OFFSET_RANGE_MIN -15 #define Z_PROBE_OFFSET_RANGE_MIN -15
#define Z_PROBE_OFFSET_RANGE_MAX -5 #define Z_PROBE_OFFSET_RANGE_MAX -5
#endif
#endif #endif

@ -543,9 +543,11 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
// Custom M code points // Custom M code points
#define CUSTOM_M_CODES #define CUSTOM_M_CODES
#ifdef CUSTOM_M_CODES #ifdef CUSTOM_M_CODES
#ifdef ENABLE_AUTO_BED_LEVELING
#define CUSTOM_M_CODE_SET_Z_PROBE_OFFSET 851 #define CUSTOM_M_CODE_SET_Z_PROBE_OFFSET 851
#define Z_PROBE_OFFSET_RANGE_MIN -15 #define Z_PROBE_OFFSET_RANGE_MIN -15
#define Z_PROBE_OFFSET_RANGE_MAX -5 #define Z_PROBE_OFFSET_RANGE_MAX -5
#endif
#endif #endif

@ -569,9 +569,11 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
// Custom M code points // Custom M code points
//#define CUSTOM_M_CODES //#define CUSTOM_M_CODES
#ifdef CUSTOM_M_CODES #ifdef CUSTOM_M_CODES
#ifdef ENABLE_AUTO_BED_LEVELING
#define CUSTOM_M_CODE_SET_Z_PROBE_OFFSET 851 #define CUSTOM_M_CODE_SET_Z_PROBE_OFFSET 851
#define Z_PROBE_OFFSET_RANGE_MIN -15 #define Z_PROBE_OFFSET_RANGE_MIN -15
#define Z_PROBE_OFFSET_RANGE_MAX -5 #define Z_PROBE_OFFSET_RANGE_MAX -5
#endif
#endif #endif

@ -536,9 +536,11 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
// Custom M code points // Custom M code points
#define CUSTOM_M_CODES #define CUSTOM_M_CODES
#ifdef CUSTOM_M_CODES #ifdef CUSTOM_M_CODES
#ifdef ENABLE_AUTO_BED_LEVELING
#define CUSTOM_M_CODE_SET_Z_PROBE_OFFSET 851 #define CUSTOM_M_CODE_SET_Z_PROBE_OFFSET 851
#define Z_PROBE_OFFSET_RANGE_MIN -15 #define Z_PROBE_OFFSET_RANGE_MIN -15
#define Z_PROBE_OFFSET_RANGE_MAX -5 #define Z_PROBE_OFFSET_RANGE_MAX -5
#endif
#endif #endif

@ -552,9 +552,11 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
// Custom M code points // Custom M code points
#define CUSTOM_M_CODES #define CUSTOM_M_CODES
#ifdef CUSTOM_M_CODES #ifdef CUSTOM_M_CODES
#ifdef ENABLE_AUTO_BED_LEVELING
#define CUSTOM_M_CODE_SET_Z_PROBE_OFFSET 851 #define CUSTOM_M_CODE_SET_Z_PROBE_OFFSET 851
#define Z_PROBE_OFFSET_RANGE_MIN -15 #define Z_PROBE_OFFSET_RANGE_MIN -15
#define Z_PROBE_OFFSET_RANGE_MAX -5 #define Z_PROBE_OFFSET_RANGE_MAX -5
#endif
#endif #endif
@ -581,13 +583,16 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
//==============================LCD and SD support============================= //==============================LCD and SD support=============================
// Define your display language below. Replace (en) with your language code and uncomment. // Define your display language below. Replace (en) with your language code and uncomment.
// en, pl, fr, de, es, ru, it, pt, pt-br, fi, an, nl, ca, eu // en, pl, fr, de, es, ru, it, pt, pt-br, fi, an, nl, ca, eu, kana, kana_utf8, test
// See also language.h // See also language.h
//#define LANGUAGE_INCLUDE GENERATE_LANGUAGE_INCLUDE(en) #define LANGUAGE_INCLUDE GENERATE_LANGUAGE_INCLUDE(en)
// Character based displays can have different extended charsets. // Chose ONE of the next three charsets. This has to match your hardware. In case of a full graphic display this information is not important.
#define DISPLAY_CHARSET_HD44780_JAPAN // "ääööüüß23°" // To find out what type you have - compile with (test) - upload - click to get the menu. You'll see two typical lines from the upper half of the charset.
//#define DISPLAY_CHARSET_HD44780_WESTERN // "ÄäÖöÜüß²³°" if you see a '~' instead of a 'arrow_right' at the right of submenuitems - this is the right one. // See also documentation/LCDLanguageFont.md
#define DISPLAY_CHARSET_HD44780_JAPAN // this is the most common hardware
//#define DISPLAY_CHARSET_HD44780_WESTERN
//#define DISPLAY_CHARSET_HD44780_CYRILLIC
//#define ULTRA_LCD //general LCD support, also 16x2 //#define ULTRA_LCD //general LCD support, also 16x2
//#define DOGLCD // Support for SPI LCD 128x64 (Controller ST7565R graphic Display Family) //#define DOGLCD // Support for SPI LCD 128x64 (Controller ST7565R graphic Display Family)

@ -554,9 +554,11 @@ const bool Z_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic o
// Custom M code points // Custom M code points
#define CUSTOM_M_CODES #define CUSTOM_M_CODES
#ifdef CUSTOM_M_CODES #ifdef CUSTOM_M_CODES
#ifdef ENABLE_AUTO_BED_LEVELING
#define CUSTOM_M_CODE_SET_Z_PROBE_OFFSET 851 #define CUSTOM_M_CODE_SET_Z_PROBE_OFFSET 851
#define Z_PROBE_OFFSET_RANGE_MIN -15 #define Z_PROBE_OFFSET_RANGE_MIN -15
#define Z_PROBE_OFFSET_RANGE_MAX -5 #define Z_PROBE_OFFSET_RANGE_MAX -5
#endif
#endif #endif
@ -583,13 +585,16 @@ const bool Z_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic o
//==============================LCD and SD support============================= //==============================LCD and SD support=============================
// Define your display language below. Replace (en) with your language code and uncomment. // Define your display language below. Replace (en) with your language code and uncomment.
// en, pl, fr, de, es, ru, it, pt, pt-br, fi, an, nl, ca, eu // en, pl, fr, de, es, ru, it, pt, pt-br, fi, an, nl, ca, eu, kana, kana_utf8, test
// See also language.h // See also language.h
//#define LANGUAGE_INCLUDE GENERATE_LANGUAGE_INCLUDE(en) #define LANGUAGE_INCLUDE GENERATE_LANGUAGE_INCLUDE(en)
// Character based displays can have different extended charsets. // Chose ONE of the next three charsets. This has to match your hardware. In case of a full graphic display this information is not important.
#define DISPLAY_CHARSET_HD44780_JAPAN // "ääööüüß23°" // To find out what type you have - compile with (test) - upload - click to get the menu. You'll see two typical lines from the upper half of the charset.
//#define DISPLAY_CHARSET_HD44780_WESTERN // "ÄäÖöÜüß²³°" if you see a '~' instead of a 'arrow_right' at the right of submenuitems - this is the right one. // See also documentation/LCDLanguageFont.md
#define DISPLAY_CHARSET_HD44780_JAPAN // this is the most common hardware
//#define DISPLAY_CHARSET_HD44780_WESTERN
//#define DISPLAY_CHARSET_HD44780_CYRILLIC
//#define ULTRA_LCD //general LCD support, also 16x2 //#define ULTRA_LCD //general LCD support, also 16x2
//#define DOGLCD // Support for SPI LCD 128x64 (Controller ST7565R graphic Display Family) //#define DOGLCD // Support for SPI LCD 128x64 (Controller ST7565R graphic Display Family)

@ -534,9 +534,11 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
// Custom M code points // Custom M code points
#define CUSTOM_M_CODES #define CUSTOM_M_CODES
#ifdef CUSTOM_M_CODES #ifdef CUSTOM_M_CODES
#ifdef ENABLE_AUTO_BED_LEVELING
#define CUSTOM_M_CODE_SET_Z_PROBE_OFFSET 851 #define CUSTOM_M_CODE_SET_Z_PROBE_OFFSET 851
#define Z_PROBE_OFFSET_RANGE_MIN -15 #define Z_PROBE_OFFSET_RANGE_MIN -15
#define Z_PROBE_OFFSET_RANGE_MAX -5 #define Z_PROBE_OFFSET_RANGE_MAX -5
#endif
#endif #endif

@ -541,9 +541,11 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
// Custom M code points // Custom M code points
#define CUSTOM_M_CODES #define CUSTOM_M_CODES
#ifdef CUSTOM_M_CODES #ifdef CUSTOM_M_CODES
#ifdef ENABLE_AUTO_BED_LEVELING
#define CUSTOM_M_CODE_SET_Z_PROBE_OFFSET 851 #define CUSTOM_M_CODE_SET_Z_PROBE_OFFSET 851
#define Z_PROBE_OFFSET_RANGE_MIN -15 #define Z_PROBE_OFFSET_RANGE_MIN -15
#define Z_PROBE_OFFSET_RANGE_MAX -5 #define Z_PROBE_OFFSET_RANGE_MAX -5
#endif
#endif #endif

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -0,0 +1,6 @@
The fonts are created with Fony.exe (http://hukka.ncn.fi/?fony) because Fontforge didn't do what I want (probably lack off experience).
In Fony export the fonts to bdf-format. Maybe another one can edit them with Fontforge.
Then run make_fonts.bat what calls bdf2u8g.exe with the needed parameters to produce the .h files.
The .h files must be edited to replace '#include "u8g.h"' with '#include <utility/u8g.h>', replace 'U8G_FONT_SECTION' with 'U8G_SECTION', insert '.progmem.' right behind the first '"' and moved to the main directory.
Especially the Kana and Cyrillic fonts should be revised by someone who knows what he/she does. I am only a west-European with very little knowledge about this scripts.

Binary file not shown.

@ -3,6 +3,5 @@
.\bdf2u8g.exe -b 32 -e 255 HD44780_C.bdf HD44780_C_5x7 dogm_font_data_HD44780_C.h .\bdf2u8g.exe -b 32 -e 255 HD44780_C.bdf HD44780_C_5x7 dogm_font_data_HD44780_C.h
.\bdf2u8g.exe -b 32 -e 255 HD44780_J.bdf HD44780_J_5x7 dogm_font_data_HD44780_J.h .\bdf2u8g.exe -b 32 -e 255 HD44780_J.bdf HD44780_J_5x7 dogm_font_data_HD44780_J.h
.\bdf2u8g.exe -b 32 -e 255 ISO10646-1.bdf ISO10646_1_5x7 dogm_font_data_ISO10646_1.h .\bdf2u8g.exe -b 32 -e 255 ISO10646-1.bdf ISO10646_1_5x7 dogm_font_data_ISO10646_1.h
.\bdf2u8g.exe -b 32 -e 255 ISO10646-1-Marlin.bdf ISO10646_1_Marlin_5x7 dogm_font_data_ISO10646_1_Marlin.h
.\bdf2u8g.exe -b 32 -e 255 ISO10646_5_Cyrillic.bdf ISO10646_5_Cyrillic_5x7 dogm_font_data_ISO10646_5_Cyrillic.h .\bdf2u8g.exe -b 32 -e 255 ISO10646_5_Cyrillic.bdf ISO10646_5_Cyrillic_5x7 dogm_font_data_ISO10646_5_Cyrillic.h
.\bdf2u8g.exe -b 32 -e 255 ISO10646_Kana.bdf ISO10646_Kana_5x7 dogm_font_data_ISO10646_Kana.h .\bdf2u8g.exe -b 32 -e 255 ISO10646_Kana.bdf ISO10646_Kana_5x7 dogm_font_data_ISO10646_Kana.h

@ -11,6 +11,7 @@
// //
// ==> ALWAYS TRY TO COMPILE MARLIN WITH/WITHOUT "ULTIPANEL" / "ULTRALCD" / "SDSUPPORT" #define IN "Configuration.h" // ==> ALWAYS TRY TO COMPILE MARLIN WITH/WITHOUT "ULTIPANEL" / "ULTRALCD" / "SDSUPPORT" #define IN "Configuration.h"
// ==> ALSO TRY ALL AVAILABLE LANGUAGE OPTIONS // ==> ALSO TRY ALL AVAILABLE LANGUAGE OPTIONS
// See also documentation/LCDLanguageFont.md
// Languages // Languages
// en English // en English
@ -27,6 +28,8 @@
// nl Dutch // nl Dutch
// ca Catalan // ca Catalan
// eu Basque-Euskera // eu Basque-Euskera
// kana Japanese
// kana_utf Japanese
#ifndef LANGUAGE_INCLUDE #ifndef LANGUAGE_INCLUDE
// pick your language from the list above // pick your language from the list above
@ -201,65 +204,9 @@
// LCD Menu Messages // LCD Menu Messages
// Add your own character. Reference: https://github.com/MarlinFirmware/Marlin/pull/1434 photos #if !(defined( DISPLAY_CHARSET_HD44780_JAPAN ) || defined( DISPLAY_CHARSET_HD44780_WESTERN ) || defined( DISPLAY_CHARSET_HD44780_CYRILLIC ))
// and https://www.sparkfun.com/datasheets/LCD/HD44780.pdf page 17-18 #define DISPLAY_CHARSET_HD44780_JAPAN
#ifdef DOGLCD
#define STR_Ae "\304" // 'Ä' U8glib
#define STR_ae "\344" // 'ä'
#define STR_Oe "\326" // 'Ö'
#define STR_oe STR_Oe // 'ö'
#define STR_Ue "\334" // 'Ü'
#define STR_ue STR_Ue // 'ü'
#define STR_sz "\337" // 'ß'
#define STR_h2 "\262" // '²'
#define STR_h3 "\263" // '³'
#define STR_Deg "\260" // '°'
#define STR_THERMOMETER "\377"
#else
#ifdef DISPLAY_CHARSET_HD44780_JAPAN // HD44780 ROM Code: A00 (Japan)
#define STR_ae "\xe1"
#define STR_Ae STR_ae
#define STR_oe "\357"
#define STR_Oe STR_oe
#define STR_ue "\365"
#define STR_Ue STR_ue
#define STR_sz "\342"
#define STR_h2 "2"
#define STR_h3 "3"
#define STR_Deg "\271"
#define STR_THERMOMETER "\002"
#elif defined(DISPLAY_CHARSET_HD44780_WESTERN) // HD44780 ROM Code: A02 (Western)
#define STR_Ae "\216"
#define STR_ae "\204"
#define STR_Oe "\211"
#define STR_oe "\204"
#define STR_Ue "\212"
#define STR_ue "\201"
#define STR_sz "\160"
#define STR_h2 "\262"
#define STR_h3 "\263"
#define STR_Deg "\337"
#define STR_THERMOMETER "\002"
#endif
#endif #endif
/*
#define TESTSTRING000 "\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017"
#define TESTSTRING020 "\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
#define TESTSTRING040 "\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057"
#define TESTSTRING060 "\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077"
#define TESTSTRING100 "\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117"
#define TESTSTRING120 "\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137"
#define TESTSTRING140 "\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157"
#define TESTSTRING160 "\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177"
#define TESTSTRING200 "\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217"
#define TESTSTRING220 "\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237"
#define TESTSTRING240 "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257"
#define TESTSTRING260 "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277"
#define TESTSTRING300 "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317"
#define TESTSTRING320 "\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337"
#define TESTSTRING340 "\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357"
#define TESTSTRING360 "\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377"
*/
#include LANGUAGE_INCLUDE #include LANGUAGE_INCLUDE
#include "language_en.h" #include "language_en.h"

@ -2,12 +2,17 @@
* Aragonese * Aragonese
* *
* LCD Menu Messages * LCD Menu Messages
* Please note these are limited to 17 characters! * See also documentation/LCDLanguageFont.md
* *
*/ */
#ifndef LANGUAGE_AN_H #ifndef LANGUAGE_AN_H
#define LANGUAGE_AN_H #define LANGUAGE_AN_H
#define MAPPER_NON
// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h
//#define SIMULATE_ROMFONT
#define DISPLAY_CHARSET_ISO10646_1
#define WELCOME_MSG MACHINE_NAME " parada." #define WELCOME_MSG MACHINE_NAME " parada."
#define MSG_SD_INSERTED "Tarcheta colocada" #define MSG_SD_INSERTED "Tarcheta colocada"
#define MSG_SD_REMOVED "Tarcheta retirada" #define MSG_SD_REMOVED "Tarcheta retirada"
@ -46,9 +51,9 @@
#define MSG_FAN_SPEED "Ixoriador" #define MSG_FAN_SPEED "Ixoriador"
#define MSG_FLOW "Fluxo" #define MSG_FLOW "Fluxo"
#define MSG_CONTROL "Control" #define MSG_CONTROL "Control"
#define MSG_MIN "\002 Min" #define MSG_MIN LCD_STR_THERMOMETER " Min"
#define MSG_MAX "\002 Max" #define MSG_MAX LCD_STR_THERMOMETER " Max"
#define MSG_FACTOR "\002 Fact" #define MSG_FACTOR LCD_STR_THERMOMETER " Fact"
#define MSG_AUTOTEMP "Autotemp" #define MSG_AUTOTEMP "Autotemp"
#define MSG_ON "On" #define MSG_ON "On"
#define MSG_OFF "Off" #define MSG_OFF "Off"

@ -2,12 +2,18 @@
* Catalan * Catalan
* *
* LCD Menu Messages * LCD Menu Messages
* Please note these are limited to 17 characters! * See also documentation/LCDLanguageFont.md
* *
*/ */
#ifndef LANGUAGE_CA_H #ifndef LANGUAGE_CA_H
#define LANGUAGE_CA_H #define LANGUAGE_CA_H
//#define MAPPER_NON
#define MAPPER_C2C3 // because of "ó"
// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h
//#define SIMULATE_ROMFONT
#define DISPLAY_CHARSET_ISO10646_1
#define WELCOME_MSG MACHINE_NAME " preparada." #define WELCOME_MSG MACHINE_NAME " preparada."
#define MSG_SD_INSERTED "SD detectada." #define MSG_SD_INSERTED "SD detectada."
#define MSG_SD_REMOVED "SD expulsada." #define MSG_SD_REMOVED "SD expulsada."
@ -46,9 +52,9 @@
#define MSG_FAN_SPEED "Vel. Ventilador" #define MSG_FAN_SPEED "Vel. Ventilador"
#define MSG_FLOW "Fluxe" #define MSG_FLOW "Fluxe"
#define MSG_CONTROL "Control" #define MSG_CONTROL "Control"
#define MSG_MIN " \002 Min" #define MSG_MIN LCD_STR_THERMOMETER " Min"
#define MSG_MAX " \002 Max" #define MSG_MAX LCD_STR_THERMOMETER " Max"
#define MSG_FACTOR " \002 Fact" #define MSG_FACTOR LCD_STR_THERMOMETER " Fact"
#define MSG_AUTOTEMP "Autotemp" #define MSG_AUTOTEMP "Autotemp"
#define MSG_ON "On " #define MSG_ON "On "
#define MSG_OFF "Off" #define MSG_OFF "Off"

@ -2,32 +2,37 @@
* German * German
* *
* LCD Menu Messages * LCD Menu Messages
* Please note these are limited to 17 characters! * See also documentation/LCDLanguageFont.md
* *
*/ */
#ifndef LANGUAGE_DE_H #ifndef LANGUAGE_DE_H
#define LANGUAGE_DE_H #define LANGUAGE_DE_H
#define MAPPER_C2C3
// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h
//#define SIMULATE_ROMFONT
#define DISPLAY_CHARSET_ISO10646_1
#define WELCOME_MSG MACHINE_NAME " Bereit." #define WELCOME_MSG MACHINE_NAME " Bereit."
#define MSG_SD_INSERTED "SDKarte erkannt." #define MSG_SD_INSERTED "SDKarte erkannt."
#define MSG_SD_REMOVED "SDKarte entfernt." #define MSG_SD_REMOVED "SDKarte entfernt."
#define MSG_MAIN "Hauptmen" STR_ue #define MSG_MAIN "Hauptmenü"
#define MSG_AUTOSTART "Autostart" #define MSG_AUTOSTART "Autostart"
#define MSG_DISABLE_STEPPERS "Motoren Aus" // M84 #define MSG_DISABLE_STEPPERS "Motoren Aus" // M84
#define MSG_AUTO_HOME "Home" // G28 #define MSG_AUTO_HOME "Home" // G28
#define MSG_SET_HOME_OFFSETS "Setze Home hier" #define MSG_SET_HOME_OFFSETS "Setze Home hier"
#define MSG_SET_ORIGIN "Setze Null hier" //"G92 X0 Y0 Z0" commented out in ultralcd.cpp #define MSG_SET_ORIGIN "Setze Null hier" //"G92 X0 Y0 Z0" commented out in ultralcd.cpp
#define MSG_PREHEAT_PLA "Vorw" STR_ae "rmen PLA" #define MSG_PREHEAT_PLA "Vorwärmen PLA"
#define MSG_PREHEAT_PLA_N "Vorw" STR_ae "rmen PLA " #define MSG_PREHEAT_PLA_N "Vorwärmen PLA "
#define MSG_PREHEAT_PLA_ALL "Vorw. PLA Alle" #define MSG_PREHEAT_PLA_ALL "Vorw. PLA Alle"
#define MSG_PREHEAT_PLA_BEDONLY "Vorw. PLA Bett" #define MSG_PREHEAT_PLA_BEDONLY "Vorw. PLA Bett"
#define MSG_PREHEAT_PLA_SETTINGS "Vorw" STR_ae "rm. PLA Ein." #define MSG_PREHEAT_PLA_SETTINGS "Vorwärm. PLA Ein."
#define MSG_PREHEAT_ABS "Vorw" STR_ae "rmen ABS" #define MSG_PREHEAT_ABS "Vorwärmen ABS"
#define MSG_PREHEAT_ABS_N "Vorw" STR_ae "rmen ABS " #define MSG_PREHEAT_ABS_N "Vorwärmen ABS "
#define MSG_PREHEAT_ABS_ALL "Vorw. ABS Alle" #define MSG_PREHEAT_ABS_ALL "Vorw. ABS Alle"
#define MSG_PREHEAT_ABS_BEDONLY "Vorw. ABS Bett" #define MSG_PREHEAT_ABS_BEDONLY "Vorw. ABS Bett"
#define MSG_PREHEAT_ABS_SETTINGS "Vorw" STR_ae "rm. ABS Ein." #define MSG_PREHEAT_ABS_SETTINGS "Vorwärm. ABS Ein."
#define MSG_COOLDOWN "Abk" STR_ue "hlen" #define MSG_COOLDOWN "Abkühlen"
#define MSG_SWITCH_PS_ON "Netzteil Ein" #define MSG_SWITCH_PS_ON "Netzteil Ein"
#define MSG_SWITCH_PS_OFF "Netzteil Aus" #define MSG_SWITCH_PS_OFF "Netzteil Aus"
#define MSG_RETRACT "Retract" #define MSG_RETRACT "Retract"
@ -40,14 +45,14 @@
#define MSG_MOVE_1MM " 1.0 mm" #define MSG_MOVE_1MM " 1.0 mm"
#define MSG_MOVE_10MM "10.0 mm" #define MSG_MOVE_10MM "10.0 mm"
#define MSG_SPEED "Geschw." #define MSG_SPEED "Geschw."
#define MSG_NOZZLE "D" STR_ue "se" #define MSG_NOZZLE "Düse"
#define MSG_BED "Bett" #define MSG_BED "Bett"
#define MSG_FAN_SPEED "L" STR_ue "ftergeschw." #define MSG_FAN_SPEED "Lüftergeschw."
#define MSG_FLOW "Fluss" #define MSG_FLOW "Fluss"
#define MSG_CONTROL "Einstellungen" #define MSG_CONTROL "Einstellungen"
#define MSG_MIN STR_THERMOMETER " Min" #define MSG_MIN LCD_STR_THERMOMETER " Min"
#define MSG_MAX STR_THERMOMETER " Max" #define MSG_MAX LCD_STR_THERMOMETER " Max"
#define MSG_FACTOR STR_THERMOMETER " Faktor" #define MSG_FACTOR LCD_STR_THERMOMETER " Faktor"
#define MSG_AUTOTEMP "AutoTemp" #define MSG_AUTOTEMP "AutoTemp"
#define MSG_ON "Ein" #define MSG_ON "Ein"
#define MSG_OFF "Aus" #define MSG_OFF "Aus"
@ -75,7 +80,7 @@
#define MSG_TEMPERATURE "Temperatur" #define MSG_TEMPERATURE "Temperatur"
#define MSG_MOTION "Bewegung" #define MSG_MOTION "Bewegung"
#define MSG_VOLUMETRIC "Filament" #define MSG_VOLUMETRIC "Filament"
#define MSG_VOLUMETRIC_ENABLED "E in mm" STR_h3 #define MSG_VOLUMETRIC_ENABLED "E in mm³"
#define MSG_FILAMENT_SIZE_EXTRUDER_0 "Filament D 1" #define MSG_FILAMENT_SIZE_EXTRUDER_0 "Filament D 1"
#define MSG_FILAMENT_SIZE_EXTRUDER_1 "Filament D 2" #define MSG_FILAMENT_SIZE_EXTRUDER_1 "Filament D 2"
#define MSG_FILAMENT_SIZE_EXTRUDER_2 "Filament D 3" #define MSG_FILAMENT_SIZE_EXTRUDER_2 "Filament D 3"

@ -2,12 +2,22 @@
* English * English
* *
* LCD Menu Messages * LCD Menu Messages
* Please note these are limited to 17 characters! * Se also documentation/LCDLanguageFont.md
* *
*/ */
#ifndef LANGUAGE_EN_H #ifndef LANGUAGE_EN_H
#define LANGUAGE_EN_H #define LANGUAGE_EN_H
#if !( defined(MAPPER_NON)|| defined(MAPPER_C2C3)|| defined(MAPPER_D0D1)|| defined(MAPPER_D0D1_MOD)|| defined(MAPPER_E382E383) )
#define MAPPER_NON // For direct asci codes
#endif
//#define SIMULATE_ROMFONT //Comment in to see what is seen on the character based displays
#if !( defined(SIMULATE_ROMFONT)|| defined(DISPLAY_CHARSET_ISO10646_1)|| defined(DISPLAY_CHARSET_ISO10646_5)|| defined(DISPLAY_CHARSET_ISO10646_KANA) )
#define DISPLAY_CHARSET_ISO10646_1 // use the better font on full graphic displays.
#endif
#ifndef WELCOME_MSG #ifndef WELCOME_MSG
#define WELCOME_MSG MACHINE_NAME " ready." #define WELCOME_MSG MACHINE_NAME " ready."
#endif #endif
@ -159,13 +169,13 @@
#define MSG_CONTROL "Control" #define MSG_CONTROL "Control"
#endif #endif
#ifndef MSG_MIN #ifndef MSG_MIN
#define MSG_MIN " " STR_THERMOMETER " Min" #define MSG_MIN " "LCD_STR_THERMOMETER " Min"
#endif #endif
#ifndef MSG_MAX #ifndef MSG_MAX
#define MSG_MAX " " STR_THERMOMETER " Max" #define MSG_MAX " "LCD_STR_THERMOMETER " Max"
#endif #endif
#ifndef MSG_FACTOR #ifndef MSG_FACTOR
#define MSG_FACTOR " " STR_THERMOMETER " Fact" #define MSG_FACTOR " "LCD_STR_THERMOMETER " Fact"
#endif #endif
#ifndef MSG_AUTOTEMP #ifndef MSG_AUTOTEMP
#define MSG_AUTOTEMP "Autotemp" #define MSG_AUTOTEMP "Autotemp"
@ -261,7 +271,7 @@
#define MSG_VOLUMETRIC "Filament" #define MSG_VOLUMETRIC "Filament"
#endif #endif
#ifndef MSG_VOLUMETRIC_ENABLED #ifndef MSG_VOLUMETRIC_ENABLED
#define MSG_VOLUMETRIC_ENABLED "E in mm" STR_h3 #define MSG_VOLUMETRIC_ENABLED "E in mm3"
#endif #endif
#ifndef MSG_FILAMENT_SIZE_EXTRUDER_0 #ifndef MSG_FILAMENT_SIZE_EXTRUDER_0
#define MSG_FILAMENT_SIZE_EXTRUDER_0 "Fil. Dia. 1" #define MSG_FILAMENT_SIZE_EXTRUDER_0 "Fil. Dia. 1"

@ -2,12 +2,17 @@
* Spanish * Spanish
* *
* LCD Menu Messages * LCD Menu Messages
* Please note these are limited to 17 characters! * See also documentation/LCDLanguageFont.md
* *
*/ */
#ifndef LANGUAGE_ES_H #ifndef LANGUAGE_ES_H
#define LANGUAGE_ES_H #define LANGUAGE_ES_H
#define MAPPER_NON
// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h
//#define SIMULATE_ROMFONT
#define DISPLAY_CHARSET_ISO10646_1
#define WELCOME_MSG MACHINE_NAME " lista." #define WELCOME_MSG MACHINE_NAME " lista."
#define MSG_SD_INSERTED "Tarjeta colocada" #define MSG_SD_INSERTED "Tarjeta colocada"
#define MSG_SD_REMOVED "Tarjeta retirada" #define MSG_SD_REMOVED "Tarjeta retirada"
@ -46,9 +51,9 @@
#define MSG_FAN_SPEED "Ventilador" #define MSG_FAN_SPEED "Ventilador"
#define MSG_FLOW "Flujo" #define MSG_FLOW "Flujo"
#define MSG_CONTROL "Control" #define MSG_CONTROL "Control"
#define MSG_MIN "\002 Min" #define MSG_MIN LCD_STR_THERMOMETER " Min"
#define MSG_MAX "\002 Max" #define MSG_MAX LCD_STR_THERMOMETER " Max"
#define MSG_FACTOR "\002 Fact" #define MSG_FACTOR LCD_STR_THERMOMETER " Fact"
#define MSG_AUTOTEMP "Autotemp" #define MSG_AUTOTEMP "Autotemp"
#define MSG_ON "On" #define MSG_ON "On"
#define MSG_OFF "Off" #define MSG_OFF "Off"

@ -2,12 +2,17 @@
* Basque-Euskera * Basque-Euskera
* *
* LCD Menu Messages * LCD Menu Messages
* Please note these are limited to 17 characters! * See also documentation/LCDLanguageFont.md
* *
*/ */
#ifndef LANGUAGE_EU_H #ifndef LANGUAGE_EU_H
#define LANGUAGE_EU_H #define LANGUAGE_EU_H
#define MAPPER_NON
// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h
//#define SIMULATE_ROMFONT
#define DISPLAY_CHARSET_ISO10646_1
#define WELCOME_MSG MACHINE_NAME " prest." #define WELCOME_MSG MACHINE_NAME " prest."
#define MSG_SD_INSERTED "Txartela sartuta" #define MSG_SD_INSERTED "Txartela sartuta"
#define MSG_SD_REMOVED "Txartela kenduta" #define MSG_SD_REMOVED "Txartela kenduta"
@ -46,9 +51,9 @@
#define MSG_FAN_SPEED "Haizagailua" #define MSG_FAN_SPEED "Haizagailua"
#define MSG_FLOW "Fluxua" #define MSG_FLOW "Fluxua"
#define MSG_CONTROL "Kontrola" #define MSG_CONTROL "Kontrola"
#define MSG_MIN " \002 Min" #define MSG_MIN LCD_STR_THERMOMETER " Min"
#define MSG_MAX " \002 Max" #define MSG_MAX LCD_STR_THERMOMETER " Max"
#define MSG_FACTOR " \002 Faktorea" #define MSG_FACTOR LCD_STR_THERMOMETER " Faktorea"
#define MSG_AUTOTEMP "Auto tenperatura" #define MSG_AUTOTEMP "Auto tenperatura"
#define MSG_ON "On " #define MSG_ON "On "
#define MSG_OFF "Off" #define MSG_OFF "Off"

@ -2,12 +2,17 @@
* Finnish * Finnish
* *
* LCD Menu Messages * LCD Menu Messages
* Please note these are limited to 17 characters! * See also documentation/LCDLanguageFont.md
* *
*/ */
#ifndef LANGUAGE_FI_H #ifndef LANGUAGE_FI_H
#define LANGUAGE_FI_H #define LANGUAGE_FI_H
#define MAPPER_C2C3
// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h
//#define SIMULATE_ROMFONT
#define DISPLAY_CHARSET_ISO10646_1
#define WELCOME_MSG MACHINE_NAME " valmis." #define WELCOME_MSG MACHINE_NAME " valmis."
#define MSG_SD_INSERTED "Kortti asetettu" #define MSG_SD_INSERTED "Kortti asetettu"
#define MSG_SD_REMOVED "Kortti poistettu" #define MSG_SD_REMOVED "Kortti poistettu"
@ -17,21 +22,21 @@
#define MSG_AUTO_HOME "Aja referenssiin" #define MSG_AUTO_HOME "Aja referenssiin"
#define MSG_SET_HOME_OFFSETS "Set home offsets" #define MSG_SET_HOME_OFFSETS "Set home offsets"
#define MSG_SET_ORIGIN "Aseta origo" #define MSG_SET_ORIGIN "Aseta origo"
#define MSG_PREHEAT_PLA "Esil" STR_ae "mmit" STR_ae " PLA" #define MSG_PREHEAT_PLA "Esilämmitä PLA"
#define MSG_PREHEAT_PLA_N "Esil" STR_ae "mmit" STR_ae " PLA " #define MSG_PREHEAT_PLA_N "Esilämmitä PLA "
#define MSG_PREHEAT_PLA_ALL "Esil" STR_ae ". PLA Kaikki" #define MSG_PREHEAT_PLA_ALL "Esilä. PLA Kaikki"
#define MSG_PREHEAT_PLA_BEDONLY "Esil" STR_ae ". PLA Alusta" #define MSG_PREHEAT_PLA_BEDONLY "Esilä. PLA Alusta"
#define MSG_PREHEAT_PLA_SETTINGS "Esil" STR_ae "mm. PLA konf" #define MSG_PREHEAT_PLA_SETTINGS "Esilämm. PLA konf"
#define MSG_PREHEAT_ABS "Esil" STR_ae "mmit" STR_ae " ABS" #define MSG_PREHEAT_ABS "Esilämmitä ABS"
#define MSG_PREHEAT_ABS_N "Esil" STR_ae "mmit" STR_ae " ABS " #define MSG_PREHEAT_ABS_N "Esilämmitä ABS "
#define MSG_PREHEAT_ABS_ALL "Esil" STR_ae ". ABS Kaikki" #define MSG_PREHEAT_ABS_ALL "Esilä. ABS Kaikki"
#define MSG_PREHEAT_ABS_BEDONLY "Esil" STR_ae ". ABS Alusta" #define MSG_PREHEAT_ABS_BEDONLY "Esilä. ABS Alusta"
#define MSG_PREHEAT_ABS_SETTINGS "Esil" STR_ae "mm. ABS konf" #define MSG_PREHEAT_ABS_SETTINGS "Esilämm. ABS konf"
#define MSG_COOLDOWN "J" STR_ae "" STR_ae "hdyt" STR_ae "" #define MSG_COOLDOWN "Jäähdytä"
#define MSG_SWITCH_PS_ON "Virta p" STR_ae "" STR_ae "lle" #define MSG_SWITCH_PS_ON "Virta päälle"
#define MSG_SWITCH_PS_OFF "Virta pois" #define MSG_SWITCH_PS_OFF "Virta pois"
#define MSG_EXTRUDE "Pursota" #define MSG_EXTRUDE "Pursota"
#define MSG_RETRACT "Ved" STR_ae " takaisin" #define MSG_RETRACT "Vedä takaisin"
#define MSG_MOVE_AXIS "Liikuta akseleita" #define MSG_MOVE_AXIS "Liikuta akseleita"
#define MSG_MOVE_X "Liikuta X" #define MSG_MOVE_X "Liikuta X"
#define MSG_MOVE_Y "Liikuta Y" #define MSG_MOVE_Y "Liikuta Y"
@ -46,9 +51,9 @@
#define MSG_FAN_SPEED "Tuul. nopeus" #define MSG_FAN_SPEED "Tuul. nopeus"
#define MSG_FLOW "Virtaus" #define MSG_FLOW "Virtaus"
#define MSG_CONTROL "Kontrolli" #define MSG_CONTROL "Kontrolli"
#define MSG_MIN STR_THERMOMETER " Min" #define MSG_MIN LCD_STR_THERMOMETER " Min"
#define MSG_MAX STR_THERMOMETER " Max" #define MSG_MAX LCD_STR_THERMOMETER " Max"
#define MSG_FACTOR STR_THERMOMETER " Kerr" #define MSG_FACTOR LCD_STR_THERMOMETER " Kerr"
#define MSG_AUTOTEMP "Autotemp" #define MSG_AUTOTEMP "Autotemp"
#define MSG_ON "On " #define MSG_ON "On "
#define MSG_OFF "Off" #define MSG_OFF "Off"
@ -73,10 +78,10 @@
#define MSG_YSTEPS "Ysteps/mm" #define MSG_YSTEPS "Ysteps/mm"
#define MSG_ZSTEPS "Zsteps/mm" #define MSG_ZSTEPS "Zsteps/mm"
#define MSG_ESTEPS "Esteps/mm" #define MSG_ESTEPS "Esteps/mm"
#define MSG_TEMPERATURE "L" STR_ae "mp" STR_oe "tila" #define MSG_TEMPERATURE "Lämpötila"
#define MSG_MOTION "Liike" #define MSG_MOTION "Liike"
#define MSG_VOLUMETRIC "Filament" #define MSG_VOLUMETRIC "Filament"
#define MSG_VOLUMETRIC_ENABLED "E in mm3" #define MSG_VOLUMETRIC_ENABLED "E in mm³"
#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"
@ -84,13 +89,13 @@
#define MSG_STORE_EPROM "Tallenna muistiin" #define MSG_STORE_EPROM "Tallenna muistiin"
#define MSG_LOAD_EPROM "Lataa muistista" #define MSG_LOAD_EPROM "Lataa muistista"
#define MSG_RESTORE_FAILSAFE "Palauta oletus" #define MSG_RESTORE_FAILSAFE "Palauta oletus"
#define MSG_REFRESH "P" STR_ae "ivit" STR_ae "" #define MSG_REFRESH "Päivitä"
#define MSG_WATCH "Seuraa" #define MSG_WATCH "Seuraa"
#define MSG_PREPARE "Valmistele" #define MSG_PREPARE "Valmistele"
#define MSG_TUNE "S" STR_ae "" STR_ae "d" STR_ae "" #define MSG_TUNE "Säädä"
#define MSG_PAUSE_PRINT "Keskeyt" STR_ae " tulostus" #define MSG_PAUSE_PRINT "Keskeytä tulostus"
#define MSG_RESUME_PRINT "Jatka tulostusta" #define MSG_RESUME_PRINT "Jatka tulostusta"
#define MSG_STOP_PRINT "Pys" STR_ae "yt" STR_ae " tulostus" #define MSG_STOP_PRINT "Pysäytä tulostus"
#define MSG_CARD_MENU "Korttivalikko" #define MSG_CARD_MENU "Korttivalikko"
#define MSG_NO_CARD "Ei korttia" #define MSG_NO_CARD "Ei korttia"
#define MSG_DWELL "Nukkumassa..." #define MSG_DWELL "Nukkumassa..."
@ -100,9 +105,9 @@
#define MSG_NO_MOVE "Ei liiketta." #define MSG_NO_MOVE "Ei liiketta."
#define MSG_KILLED "KILLED. " #define MSG_KILLED "KILLED. "
#define MSG_STOPPED "STOPPED. " #define MSG_STOPPED "STOPPED. "
#define MSG_CONTROL_RETRACT "Ved" STR_ae " mm" #define MSG_CONTROL_RETRACT "Vedä mm"
#define MSG_CONTROL_RETRACT_SWAP "Va. Ved" STR_ae " mm" #define MSG_CONTROL_RETRACT_SWAP "Va. Vedä mm"
#define MSG_CONTROL_RETRACTF "Ved" STR_ae " V" #define MSG_CONTROL_RETRACTF "Vedä V"
#define MSG_CONTROL_RETRACT_ZLIFT "Z mm" #define MSG_CONTROL_RETRACT_ZLIFT "Z mm"
#define MSG_CONTROL_RETRACT_RECOVER "UnRet +mm" #define MSG_CONTROL_RETRACT_RECOVER "UnRet +mm"
#define MSG_CONTROL_RETRACT_RECOVER_SWAP "Va. UnRet +mm" #define MSG_CONTROL_RETRACT_RECOVER_SWAP "Va. UnRet +mm"

@ -2,12 +2,18 @@
* French * French
* *
* LCD Menu Messages * LCD Menu Messages
* Please note these are limited to 17 characters! * See also documentation/LCDLanguageFont.md
* *
*/ */
#ifndef LANGUAGE_FR_H #ifndef LANGUAGE_FR_H
#define LANGUAGE_FR_H #define LANGUAGE_FR_H
#define MAPPER_NON
// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h
//#define SIMULATE_ROMFONT
#define DISPLAY_CHARSET_ISO10646_1
#define WELCOME_MSG MACHINE_NAME " prete." #define WELCOME_MSG MACHINE_NAME " prete."
#define MSG_SD_INSERTED "Carte inseree" #define MSG_SD_INSERTED "Carte inseree"
#define MSG_SD_REMOVED "Carte retiree" #define MSG_SD_REMOVED "Carte retiree"
@ -46,9 +52,9 @@
#define MSG_FAN_SPEED "Vite. ventilateur" #define MSG_FAN_SPEED "Vite. ventilateur"
#define MSG_FLOW "Flux" #define MSG_FLOW "Flux"
#define MSG_CONTROL "Controler" #define MSG_CONTROL "Controler"
#define MSG_MIN " \002 Min" #define MSG_MIN LCD_STR_THERMOMETER " Min"
#define MSG_MAX " \002 Max" #define MSG_MAX LCD_STR_THERMOMETER " Max"
#define MSG_FACTOR " \002 Facteur" #define MSG_FACTOR LCD_STR_THERMOMETER " Facteur"
#define MSG_AUTOTEMP "Temp. Auto." #define MSG_AUTOTEMP "Temp. Auto."
#define MSG_ON "Marche " #define MSG_ON "Marche "
#define MSG_OFF "Arret" #define MSG_OFF "Arret"

@ -2,12 +2,17 @@
* Italian * Italian
* *
* LCD Menu Messages * LCD Menu Messages
* Please note these are limited to 17 characters! * See also documentation/LCDLanguageFont.md
* *
*/ */
#ifndef LANGUAGE_IT_H #ifndef LANGUAGE_IT_H
#define LANGUAGE_IT_H #define LANGUAGE_IT_H
#define MAPPER_NON
// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h
//#define SIMULATE_ROMFONT
#define DISPLAY_CHARSET_ISO10646_1
#define WELCOME_MSG MACHINE_NAME " pronto." #define WELCOME_MSG MACHINE_NAME " pronto."
#define MSG_SD_INSERTED "SD Card inserita" #define MSG_SD_INSERTED "SD Card inserita"
#define MSG_SD_REMOVED "SD Card rimossa" #define MSG_SD_REMOVED "SD Card rimossa"
@ -46,9 +51,9 @@
#define MSG_FAN_SPEED "Ventola" #define MSG_FAN_SPEED "Ventola"
#define MSG_FLOW "Flusso" #define MSG_FLOW "Flusso"
#define MSG_CONTROL "Controllo" #define MSG_CONTROL "Controllo"
#define MSG_MIN " \002 Min" #define MSG_MIN LCD_STR_THERMOMETER " Min"
#define MSG_MAX " \002 Max" #define MSG_MAX LCD_STR_THERMOMETER " Max"
#define MSG_FACTOR " \002 Fact" #define MSG_FACTOR LCD_STR_THERMOMETER " Fact"
#define MSG_AUTOTEMP "Autotemp" #define MSG_AUTOTEMP "Autotemp"
#define MSG_ON "ON " #define MSG_ON "ON "
#define MSG_OFF "OFF" #define MSG_OFF "OFF"

@ -0,0 +1,147 @@
/**
* Japanese (Kana)
*
* LCD Menu Messages
* See also documentation/LCDLanguageFont.md
*
*/
#ifndef LANGUAGE_KANA_H
#define LANGUAGE_KANA_H
#define MAPPER_NON
// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h
#define SIMULATE_ROMFONT
#define DISPLAY_CHARSET_ISO10646_KANA
// 片仮名表示定義
#define WELCOME_MSG MACHINE_NAME " ready."
#define MSG_SD_INSERTED "\xb6\xb0\xc4\xde\x20\xbf\xb3\xc6\xad\xb3\xbb\xda\xcf\xbc\xc0" // "Card inserted"
#define MSG_SD_REMOVED "\xb6\xb0\xc4\xde\xb6xde\xb1\xd8\xcf\xbe\xdd" // "Card removed"
#define MSG_MAIN "\xd2\xb2\xdd" // "Main"
#define MSG_AUTOSTART "\xbc\xde\xc4\xde\xb3\xb6\xb2\xbc" // "Autostart"
#define MSG_DISABLE_STEPPERS "\xd3\xb0\xc0\xb0\xc3\xde\xdd\xb9\xde\xdd\x20\xb5\xcc" // "Disable steppers"
#define MSG_AUTO_HOME "\xb9\xde\xdd\xc3\xdd\xc6\xb2\xc4\xde\xb3" // "Auto home"
#define MSG_SET_HOME_OFFSETS "\xb7\xbc\xde\xad\xdd\xb5\xcc\xbe\xaf\xc4\xbe\xaf\xc3\xb2" // "Set home offsets"
#define MSG_SET_ORIGIN "\xb7\xbc\xde\xad\xdd\xbe\xaf\xc4" // "Set origin"
#define MSG_PREHEAT_PLA "PLA \xd6\xc8\xc2" // "Preheat PLA"
#define MSG_PREHEAT_PLA_N MSG_PREHEAT_PLA " "
#define MSG_PREHEAT_PLA_ALL MSG_PREHEAT_PLA " \xbd\xcd\xde\xc3" // " All"
#define MSG_PREHEAT_PLA_BEDONLY MSG_PREHEAT_PLA " \xcd\xde\xaf\xc4\xde" // "Bed"
#define MSG_PREHEAT_PLA_SETTINGS MSG_PREHEAT_PLA " \xbe\xaf\xc3\xb2" // "conf"
#define MSG_PREHEAT_ABS "ABS \xd6\xc8\xc2" // "Preheat ABS"
#define MSG_PREHEAT_ABS_N MSG_PREHEAT_ABS " "
#define MSG_PREHEAT_ABS_ALL MSG_PREHEAT_ABS " \xbd\xcd\xde\xc3" // " All"
#define MSG_PREHEAT_ABS_BEDONLY MSG_PREHEAT_ABS " \xcd\xde\xaf\xc4\xde" // "Bed"
#define MSG_PREHEAT_ABS_SETTINGS MSG_PREHEAT_ABS " \xbe\xaf\xc3\xb2" // "conf"
#define MSG_COOLDOWN "\xb6\xc8\xc2\xc3\xb2\xbc" // "Cooldown"
#define MSG_SWITCH_PS_ON "\xc3\xde\xdd\xb9\xdd\xde\x20\xb5\xdd" // "Switch power on"
#define MSG_SWITCH_PS_OFF "\xc3\xde\xdd\xb9\xdd\xde\x20\xb5\xcc" // "Switch power off"
#define MSG_EXTRUDE "\xb5\xbc\xc0\xde\xbc" // "Extrude"
#define MSG_RETRACT "\xd8\xc4\xd7\xb8\xc4" // "Retract"
#define MSG_MOVE_AXIS "\xbc\xde\xb8\xb2\xc4\xde\xb3" // "Move axis"
#define MSG_MOVE_X "X\xbc\xde\xb8\x20\xb2\xc4\xde\xb3" // "Move X"
#define MSG_MOVE_Y "Y\xbc\xde\xb8\x20\xb2\xc4\xde\xb3" // "Move Y"
#define MSG_MOVE_Z "Z\xbc\xde\xb8\x20\xb2\xc4\xde\xb3" // "Move Z"
#define MSG_MOVE_E "\xb4\xb8\xbd\xc4\xd9\xb0\xc0\xde\xb0" // "Extruder"
#define MSG_MOVE_01MM "0.1mm \xb2\xc4\xde\xb3" // "Move 0.1mm"
#define MSG_MOVE_1MM " 1mm \xb2\xc4\xde\xb3" // "Move 1mm"
#define MSG_MOVE_10MM " 10mm \xb2\xc4\xde\xb3" // "Move 10mm"
#define MSG_SPEED "\xbd\xcb\xdf\xb0\xc4\xde" // "Speed"
#define MSG_NOZZLE "\xc9\xbd\xde\xd9" // "Nozzle"
#define MSG_BED "\xcd\xde\xaf\xc4\xde" // "Bed"
#define MSG_FAN_SPEED "\xcc\xa7\xdd\xbf\xb8\xc4\xde" // "Fan speed"
#define MSG_FLOW "\xb5\xb8\xd8\xd8\xae\xb3" // "Flow"
#define MSG_CONTROL "\xba\xdd\xc4\xdb\xb0\xd9" // "Control"
#define MSG_MIN LCD_STR_THERMOMETER " Min"
#define MSG_MAX LCD_STR_THERMOMETER " Max"
#define MSG_FACTOR LCD_STR_THERMOMETER " Fact"
#define MSG_AUTOTEMP "\xbc\xde\xc4\xde\xb3\xb5\xdd\xc4\xde" // "Autotemp"
#define MSG_ON "On "
#define MSG_OFF "Off"
#define MSG_PID_P "PID-P"
#define MSG_PID_I "PID-I"
#define MSG_PID_D "PID-D"
#define MSG_PID_C "PID-C"
#define MSG_ACC "\xb6\xbf\xb8\xc4\xde" // "Accel"
#define MSG_VXY_JERK "Vxy-jerk"
#define MSG_VZ_JERK "Vz-jerk"
#define MSG_VE_JERK "Ve-jerk"
#define MSG_VMAX "Vmax "
#define MSG_X "x"
#define MSG_Y "y"
#define MSG_Z "z"
#define MSG_E "e"
#define MSG_VMIN "Vmin"
#define MSG_VTRAV_MIN "VTrav min"
#define MSG_AMAX "Amax "
#define MSG_A_RETRACT "A-retract"
#define MSG_XSTEPS "Xsteps/mm"
#define MSG_YSTEPS "Ysteps/mm"
#define MSG_ZSTEPS "Zsteps/mm"
#define MSG_ESTEPS "Esteps/mm"
#define MSG_TEMPERATURE "\xb5\xdd\xc4\xde" // "Temperature"
#define MSG_MOTION "\xb3\xba\xde\xb7\xbe\xaf\xc3\xb2" // "Motion"
#define MSG_VOLUMETRIC "\xcc\xa8\xd7\xd2\xdd\xc4" // "Filament"
#define MSG_VOLUMETRIC_ENABLED "E in mm3"
#define MSG_FILAMENT_SIZE_EXTRUDER_0 "Fil. Dia. 1"
#define MSG_FILAMENT_SIZE_EXTRUDER_1 "Fil. Dia. 2"
#define MSG_FILAMENT_SIZE_EXTRUDER_2 "Fil. Dia. 3"
#define MSG_FILAMENT_SIZE_EXTRUDER_3 "Fil. Dia. 4"
#define MSG_CONTRAST "LCD\xba\xdd\xc4\xd7\xbd\xc4" // "LCD contrast"
#define MSG_STORE_EPROM "\xd2\xd3\xd8\xcd\xb6\xb8\xc9\xb3" // "Store memory"
#define MSG_LOAD_EPROM "\xd2\xd3\xd8\xb6\xd7\xd6\xd0\ba\xd0" // "Load memory"
#define MSG_RESTORE_FAILSAFE "\xbe\xaf\xc3\xb2\xd8\xbe\xaf\xc4" // "Restore failsafe"
#define MSG_REFRESH "\xd8\xcc\xda\xaf\xbc\xad" // "Refresh"
#define MSG_WATCH "\xb2\xdd\xcc\xab" // "Info screen"
#define MSG_PREPARE "\xbc\xde\xad\xdd\xcb\xde\xbe\xaf\xc3\xb2" // "Prepare"
#define MSG_TUNE "\xc1\xae\xb3\xbe\xb2" // "Tune"
#define MSG_PAUSE_PRINT "\xb2\xc1\xbc\xde\xc3\xb2\xbc" // "Pause print"
#define MSG_RESUME_PRINT "\xcc\xdf\xd8\xdd\xc4\xbb\xb2\xb6\xb2" // "Resume print"
#define MSG_STOP_PRINT "\xcc\xdf\xd8\xdd\xc4\xc3\xb2\xbc" // "Stop print"
#define MSG_CARD_MENU "SD\xb6\xb0\xc4\xde\xb6\xd7\xcc\xdf\xd8\xdd\xc4" // "Print from SD"
#define MSG_NO_CARD "SD\xb6\xb0\xc4\xde\xb6\xde\xb1\xd8\xcf\xbe\xdd" // "No SD card"
#define MSG_DWELL "\xbd\xd8\xb0\xcc\xdf" // "Sleep..."
#define MSG_USERWAIT "\xbc\xca\xde\xd7\xb9\xb5\xcf\xc1\xb8\xc0\xde\xbb\xb2" // "Wait for user..."
#define MSG_RESUMING "\xcc\xdf\xd8\xdd\xc4\xbb\xb2\xb6\xb2" // "Resuming print"
#define MSG_PRINT_ABORTED "\xcc\xdf\xd8\xdd\xc4\xc1\xad\xb3\xbc\xbb\xda\xcf\xbc\xc0" // "Print aborted"
#define MSG_NO_MOVE "\xb3\xba\xde\xb7\xcf\xbe\xdd" // "No move."
#define MSG_KILLED "\xbc\xae\xb3\xb7\xae" // "KILLED. "
#define MSG_STOPPED "\xc3\xb2\xbc\xbc\xcf\xbc\xc0" // "STOPPED. "
#define MSG_CONTROL_RETRACT "Retract mm"
#define MSG_CONTROL_RETRACT_SWAP "Swap Re.mm"
#define MSG_CONTROL_RETRACTF "Retract V"
#define MSG_CONTROL_RETRACT_ZLIFT "Hop mm"
#define MSG_CONTROL_RETRACT_RECOVER "UnRet +mm"
#define MSG_CONTROL_RETRACT_RECOVER_SWAP "S UnRet+mm"
#define MSG_CONTROL_RETRACT_RECOVERF "UnRet V"
#define MSG_AUTORETRACT "AutoRetr."
#define MSG_FILAMENTCHANGE "\xcc\xa8\xd7\xd2\xdd\xc4\xba\xb3\xb6\xdd" // "Change filament"
#define MSG_INIT_SDCARD "SD\xb6\xb0\xc4\xde\xbb\xb2\xd6\xd0\xba\xd0" // "Init. SD card"
#define MSG_CNG_SDCARD "SD\xb6\xb0\xc4\xde\xba\xb3\xb6\xdd" // "Change SD card"
#define MSG_ZPROBE_OUT "Z\xcc\xdf\xdb\xb0\xcc\xde \xcd\xde\xaf\xc4\xee\xb6\xde\xb2" // "Z probe out. bed"
#define MSG_POSITION_UNKNOWN "\xb9\xde\xdd\xc3\xdd\xcaXY\xb2\xc4\xde\xb3\xba\xdeZ" // "Home X/Y before Z"
#define MSG_ZPROBE_ZOFFSET "Z\xb5\xcc\xbe\xaf\xc4" // "Z Offset"
#define MSG_BABYSTEP_X "\xcb\xde\xc4\xde\xb3 X" // "Babystep X"
#define MSG_BABYSTEP_Y "\xcb\xde\xc4\xde\xb3 Y" // "Babystep Y"
#define MSG_BABYSTEP_Z "\xcb\xde\xc4\xde\xb3 Z" // "Babystep Z"
#define MSG_ENDSTOP_ABORT "Endstop abort"
/* These are from language.h. PLEASE DON'T TRANSLATE! All translatable messages can be found in language_en.h
#define MSG_HEATING "\xb6\xc8\xc2\xc1\xad\xb3..." // "Heating..."
#define MSG_HEATING_COMPLETE "\xb6\xc8\xc2\xb6\xdd\xd8x\xae\xb3" // "Heating done."
#define MSG_BED_HEATING "\xcd\xde\xaf\xc4\xde\xb6\xc8\xc2\xc1\xad\xb3" // "Bed Heating."
#define MSG_BED_DONE "\xcd\xde\xaf\xc4\xde\xb6\xc8\xc2\xb6\xdd\xd8x\xae\xb3" // "Bed done."
#define MSG_ENDSTOPS_HIT "endstops hit: "
^ typho
*/
#ifdef DELTA_CALIBRATION_MENU
#define MSG_DELTA_CALIBRATE "Delta Calibration"
#define MSG_DELTA_CALIBRATE_X "Calibrate X"
#define MSG_DELTA_CALIBRATE_Y "Calibrate Y"
#define MSG_DELTA_CALIBRATE_Z "Calibrate Z"
#define MSG_DELTA_CALIBRATE_CENTER "Calibrate Center"
#endif // DELTA_CALIBRATION_MENU
#endif // LANGUAGE_KANA_H

@ -0,0 +1,142 @@
/**
* Japanese (Kana UTF8 version)
*
* LCD Menu Messages
* See also documentation/LCDLanguageFont.md
*
*/
#ifndef LANGUAGE_KANA_UTF_H
#define LANGUAGE_KANA_UTF_H
#define MAPPER_E382E383
// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h
//#define SIMULATE_ROMFONT
#define DISPLAY_CHARSET_ISO10646_KANA
// This is very crude replacement of the codes used in language_kana.h from somebody who really does not know what he is doing.
// Just to show the potential benefit of unicode.
// This translation can be improved by using the full charset of unicode codeblock U+30A0 to U+30FF.
// 片仮名表示定義
#define WELCOME_MSG MACHINE_NAME " ready."
#define MSG_SD_INSERTED "セード ンウニユウアレマシタ" // "Card inserted"
#define MSG_SD_REMOVED "セードゼアリマセン" // "Card removed"
#define MSG_MAIN "ナイン" // "Main"
#define MSG_AUTOSTART "ヅドウセイシ" // "Autostart"
#define MSG_DISABLE_STEPPERS "モーターデンゲン オフ" // "Disable steppers"
#define MSG_AUTO_HOME "ゲンテンニイドウ" // "Auto home"
#define MSG_SET_HOME_OFFSETS "キヅユンオフセツトセツテイ" // "Set home offsets"
#define MSG_SET_ORIGIN "キヅユンセツト" // "Set origin"
#define MSG_PREHEAT_PLA "PLA ヨネシ" // "Preheat PLA"
#define MSG_PREHEAT_PLA_N MSG_PREHEAT_PLA " "
#define MSG_PREHEAT_PLA_ALL MSG_PREHEAT_PLA " スベテ" // " All"
#define MSG_PREHEAT_PLA_BEDONLY MSG_PREHEAT_PLA " ベツド" // "Bed"
#define MSG_PREHEAT_PLA_SETTINGS MSG_PREHEAT_PLA " セツテイ" // "conf"
#define MSG_PREHEAT_ABS "ABS ヨネシ" // "Preheat ABS"
#define MSG_PREHEAT_ABS_N MSG_PREHEAT_ABS " "
#define MSG_PREHEAT_ABS_ALL MSG_PREHEAT_ABS " スベテ" // " All"
#define MSG_PREHEAT_ABS_BEDONLY MSG_PREHEAT_ABS " ベツド" // "Bed"
#define MSG_PREHEAT_ABS_SETTINGS MSG_PREHEAT_ABS " セツテイ" // "conf"
#define MSG_COOLDOWN "セネシテイシ" // "Cooldown"
#define MSG_SWITCH_PS_ON "デンケゾ オン" // "Switch power on"
#define MSG_SWITCH_PS_OFF "デンケゾ オフ" // "Switch power off"
#define MSG_EXTRUDE "オシダシ" // "Extrude"
#define MSG_RETRACT "リトラケト" // "Retract"
#define MSG_MOVE_AXIS "ヅケイドウ" // "Move axis"
#define MSG_MOVE_X "Xヅケ イドウ" // "Move X"
#define MSG_MOVE_Y "Yヅケ イドウ" // "Move Y"
#define MSG_MOVE_Z "Zヅケ イドウ" // "Move Z"
#define MSG_MOVE_E "エケストルーダー" // "Extruder"
#define MSG_MOVE_01MM "0.1mm イドウ" // "Move 0.1mm"
#define MSG_MOVE_1MM " 1mm イドウ" // "Move 1mm"
#define MSG_MOVE_10MM " 10mm イドウ" // "Move 10mm"
#define MSG_SPEED "スヒ゜ード" // "Speed"
#define MSG_NOZZLE "ノズル" // "Nozzle"
#define MSG_BED "ベツド" // "Bed"
#define MSG_FAN_SPEED "ファンンケド" // "Fan speed"
#define MSG_FLOW "オケリリョウ" // "Flow"
#define MSG_CONTROL "コントロール" // "Control"
#define MSG_MIN LCD_STR_THERMOMETER " Min"
#define MSG_MAX LCD_STR_THERMOMETER " Max"
#define MSG_FACTOR LCD_STR_THERMOMETER " Fact"
#define MSG_AUTOTEMP "ヅドウオンド" // "Autotemp"
#define MSG_ON "On "
#define MSG_OFF "Off"
#define MSG_PID_P "PID-P"
#define MSG_PID_I "PID-I"
#define MSG_PID_D "PID-D"
#define MSG_PID_C "PID-C"
#define MSG_ACC "センケド" // "Accel"
#define MSG_VXY_JERK "Vxy-jerk"
#define MSG_VZ_JERK "Vz-jerk"
#define MSG_VE_JERK "Ve-jerk"
#define MSG_VMAX "Vmax "
#define MSG_X "x"
#define MSG_Y "y"
#define MSG_Z "z"
#define MSG_E "e"
#define MSG_VMIN "Vmin"
#define MSG_VTRAV_MIN "VTrav min"
#define MSG_AMAX "Amax "
#define MSG_A_RETRACT "A-retract"
#define MSG_XSTEPS "Xsteps/mm"
#define MSG_YSTEPS "Ysteps/mm"
#define MSG_ZSTEPS "Zsteps/mm"
#define MSG_ESTEPS "Esteps/mm"
#define MSG_TEMPERATURE "オンド" // "Temperature"
#define MSG_MOTION "ウゴキセツテイ" // "Motion"
#define MSG_VOLUMETRIC "フィラナント" // "Filament"
#define MSG_VOLUMETRIC_ENABLED "E in mm3"
#define MSG_FILAMENT_SIZE_EXTRUDER_0 "Fil. Dia. 1"
#define MSG_FILAMENT_SIZE_EXTRUDER_1 "Fil. Dia. 2"
#define MSG_FILAMENT_SIZE_EXTRUDER_2 "Fil. Dia. 3"
#define MSG_FILAMENT_SIZE_EXTRUDER_3 "Fil. Dia. 4"
#define MSG_CONTRAST "LCDコントラスト" // "LCD contrast"
#define MSG_STORE_EPROM "ナモリヘセケノウ" // "Store memory"
#define MSG_LOAD_EPROM "ナモリセラヨミbaミ" // "Load memory"
#define MSG_RESTORE_FAILSAFE "セツテイリセツト" // "Restore failsafe"
#define MSG_REFRESH "リフレツシユ" // "Refresh"
#define MSG_WATCH "インフォ" // "Info screen"
#define MSG_PREPARE "ヅユンゼセツテイ" //"Prepare"
#define MSG_TUNE "チョウセイ" // "Tune"
#define MSG_PAUSE_PRINT "イチヅテイシ" // "Pause print"
#define MSG_RESUME_PRINT "プリントアイセイ" // "Resume print"
#define MSG_STOP_PRINT "プリントテイシ" // "Stop print"
#define MSG_CARD_MENU "SDセードセラプリント" // "Print from SD"
#define MSG_NO_CARD "SDセードゼアリマセン" // "No SD card"
#define MSG_DWELL "スリープ" // "Sleep..."
#define MSG_USERWAIT "シバラケオマチケダアイ" // "Wait for user..."
#define MSG_RESUMING "プリントアイセイ" // "Resuming print"
#define MSG_PRINT_ABORTED "プリントチユウシアレマシタ" // "Print aborted"
#define MSG_NO_MOVE "ウゴキマセン" // "No move."
#define MSG_KILLED "ショウキョ" // "KILLED. "
#define MSG_STOPPED "テイシシマシタ" // "STOPPED. "
#define MSG_CONTROL_RETRACT "Retract mm"
#define MSG_CONTROL_RETRACT_SWAP "Swap Re.mm"
#define MSG_CONTROL_RETRACTF "Retract V"
#define MSG_CONTROL_RETRACT_ZLIFT "Hop mm"
#define MSG_CONTROL_RETRACT_RECOVER "UnRet +mm"
#define MSG_CONTROL_RETRACT_RECOVER_SWAP "S UnRet+mm"
#define MSG_CONTROL_RETRACT_RECOVERF "UnRet V"
#define MSG_AUTORETRACT "AutoRetr."
#define MSG_FILAMENTCHANGE "フィラナントコウセン" // "Change filament"
#define MSG_INIT_SDCARD "SDセードアイヨミコミ" // "Init. SD card"
#define MSG_CNG_SDCARD "SDセードコウセン" // "Change SD card"
#define MSG_ZPROBE_OUT "Zプローブ ベツトnゼイ" // "Z probe out. bed"
#define MSG_POSITION_UNKNOWN "ゲンテンハXYイドウゴZ" // "Home X/Y before Z"
#define MSG_ZPROBE_ZOFFSET "Zオフセツト" // "Z Offset"
#define MSG_BABYSTEP_X "ゼドウ X" // "Babystep X"
#define MSG_BABYSTEP_Y "ゼドウ Y" // "Babystep Y"
#define MSG_BABYSTEP_Z "ゼドウ Z" // "Babystep Z"
#define MSG_ENDSTOP_ABORT "Endstop abort"
#ifdef DELTA_CALIBRATION_MENU
#define MSG_DELTA_CALIBRATE "Delta Calibration"
#define MSG_DELTA_CALIBRATE_X "Calibrate X"
#define MSG_DELTA_CALIBRATE_Y "Calibrate Y"
#define MSG_DELTA_CALIBRATE_Z "Calibrate Z"
#define MSG_DELTA_CALIBRATE_CENTER "Calibrate Center"
#endif // DELTA_CALIBRATION_MENU
#endif // LANGUAGE_KANA_UTF_H

@ -2,12 +2,17 @@
* Dutch * Dutch
* *
* LCD Menu Messages * LCD Menu Messages
* Please note these are limited to 17 characters! * See also documentation/LCDLanguageFont.md
* *
*/ */
#ifndef LANGUAGE_NL_H #ifndef LANGUAGE_NL_H
#define LANGUAGE_NL_H #define LANGUAGE_NL_H
#define MAPPER_NON
// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h
//#define SIMULATE_ROMFONT
#define DISPLAY_CHARSET_ISO10646_1
#define WELCOME_MSG MACHINE_NAME " gereed." #define WELCOME_MSG MACHINE_NAME " gereed."
#define MSG_SD_INSERTED "Kaart ingestoken" #define MSG_SD_INSERTED "Kaart ingestoken"
#define MSG_SD_REMOVED "Kaart verwijderd" #define MSG_SD_REMOVED "Kaart verwijderd"
@ -46,9 +51,9 @@
#define MSG_FAN_SPEED "Fan snelheid" #define MSG_FAN_SPEED "Fan snelheid"
#define MSG_FLOW "Flow" #define MSG_FLOW "Flow"
#define MSG_CONTROL "Control" #define MSG_CONTROL "Control"
#define MSG_MIN " \002 Min" #define MSG_MIN LCD_STR_THERMOMETER " Min"
#define MSG_MAX " \002 Max" #define MSG_MAX LCD_STR_THERMOMETER " Max"
#define MSG_FACTOR " \002 Fact" #define MSG_FACTOR LCD_STR_THERMOMETER " Fact"
#define MSG_AUTOTEMP "Autotemp" #define MSG_AUTOTEMP "Autotemp"
#define MSG_ON "Aan " #define MSG_ON "Aan "
#define MSG_OFF "Uit" #define MSG_OFF "Uit"

@ -2,12 +2,17 @@
* Polish * Polish
* *
* LCD Menu Messages * LCD Menu Messages
* Please note these are limited to 17 characters! * See also documentation/LCDLanguageFont.md
* *
*/ */
#ifndef LANGUAGE_PL_H #ifndef LANGUAGE_PL_H
#define LANGUAGE_PL_H #define LANGUAGE_PL_H
#define MAPPER_NON
// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h
//#define SIMULATE_ROMFONT
#define DISPLAY_CHARSET_ISO10646_1
#define WELCOME_MSG MACHINE_NAME " gotowy." #define WELCOME_MSG MACHINE_NAME " gotowy."
#define MSG_SD_INSERTED "Karta wlozona" #define MSG_SD_INSERTED "Karta wlozona"
#define MSG_SD_REMOVED "Karta usunieta" #define MSG_SD_REMOVED "Karta usunieta"
@ -46,9 +51,9 @@
#define MSG_FAN_SPEED "Obroty wiatraka" #define MSG_FAN_SPEED "Obroty wiatraka"
#define MSG_FLOW "Przeplyw" #define MSG_FLOW "Przeplyw"
#define MSG_CONTROL "Ustawienia" #define MSG_CONTROL "Ustawienia"
#define MSG_MIN " \002 Min" #define MSG_MIN LCD_STR_THERMOMETER " Min"
#define MSG_MAX " \002 Max" #define MSG_MAX LCD_STR_THERMOMETER " Max"
#define MSG_FACTOR " \002 Mnoznik" #define MSG_FACTOR LCD_STR_THERMOMETER " Mnoznik"
#define MSG_AUTOTEMP "Auto. temperatura" #define MSG_AUTOTEMP "Auto. temperatura"
#define MSG_ON "Wl. " #define MSG_ON "Wl. "
#define MSG_OFF "Wyl." #define MSG_OFF "Wyl."
@ -84,7 +89,7 @@
#define MSG_STORE_EPROM "Zapisz w pamieci" #define MSG_STORE_EPROM "Zapisz w pamieci"
#define MSG_LOAD_EPROM "Wczytaj z pamieci" #define MSG_LOAD_EPROM "Wczytaj z pamieci"
#define MSG_RESTORE_FAILSAFE "Ustaw. fabryczne" #define MSG_RESTORE_FAILSAFE "Ustaw. fabryczne"
#define MSG_REFRESH "\004Odswiez" #define MSG_REFRESH LCD_STR_REFRESH " Odswiez"
#define MSG_WATCH "Ekran glowny" #define MSG_WATCH "Ekran glowny"
#define MSG_PREPARE "Przygotuj" #define MSG_PREPARE "Przygotuj"
#define MSG_TUNE "Strojenie" #define MSG_TUNE "Strojenie"

@ -2,16 +2,21 @@
* Portuguese (Brazil) * Portuguese (Brazil)
* *
* LCD Menu Messages * LCD Menu Messages
* Please note these are limited to 17 characters! * See also documentation/LCDLanguageFont.md
* *
*/ */
#ifndef LANGUAGE_PT_BR_H #ifndef LANGUAGE_PT_BR_H
#define LANGUAGE_PT_BR_H #define LANGUAGE_PT_BR_H
#define MAPPER_NON
// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h
//#define SIMULATE_ROMFONT
#define DISPLAY_CHARSET_ISO10646_1
#define WELCOME_MSG MACHINE_NAME " pronto." #define WELCOME_MSG MACHINE_NAME " pronto."
#define MSG_SD_INSERTED "Cartao inserido" #define MSG_SD_INSERTED "Cartao inserido"
#define MSG_SD_REMOVED "Cartao removido" #define MSG_SD_REMOVED "Cartao removido"
#define MSG_MAIN " Menu principal \003" #define MSG_MAIN " Menu principal"
#define MSG_AUTOSTART "Autostart" #define MSG_AUTOSTART "Autostart"
#define MSG_DISABLE_STEPPERS " Apagar motores" #define MSG_DISABLE_STEPPERS " Apagar motores"
#define MSG_AUTO_HOME "Ir para origen" #define MSG_AUTO_HOME "Ir para origen"
@ -20,19 +25,19 @@
#define MSG_PREHEAT_PLA "Pre-aquecer PLA" #define MSG_PREHEAT_PLA "Pre-aquecer PLA"
#define MSG_PREHEAT_PLA_N "Pre-aquecer PLA " #define MSG_PREHEAT_PLA_N "Pre-aquecer PLA "
#define MSG_PREHEAT_PLA_ALL "Pre-aq. PLA Tudo" #define MSG_PREHEAT_PLA_ALL "Pre-aq. PLA Tudo"
#define MSG_PREHEAT_PLA_BEDONLY "Pre-aq. PLA \002Base" #define MSG_PREHEAT_PLA_BEDONLY "Pre-aq. PLA " LCD_STR_THERMOMETER "Base"
#define MSG_PREHEAT_PLA_SETTINGS "PLA setting" #define MSG_PREHEAT_PLA_SETTINGS "PLA setting"
#define MSG_PREHEAT_ABS "Pre-aquecer ABS" #define MSG_PREHEAT_ABS "Pre-aquecer ABS"
#define MSG_PREHEAT_ABS_N "Pre-aquecer ABS " #define MSG_PREHEAT_ABS_N "Pre-aquecer ABS "
#define MSG_PREHEAT_ABS_ALL "Pre-aq. ABS Tudo" #define MSG_PREHEAT_ABS_ALL "Pre-aq. ABS Tudo"
#define MSG_PREHEAT_ABS_BEDONLY "Pre-aq. ABS \002Base" #define MSG_PREHEAT_ABS_BEDONLY "Pre-aq. ABS " LCD_STR_THERMOMETER "Base"
#define MSG_PREHEAT_ABS_SETTINGS "ABS setting" #define MSG_PREHEAT_ABS_SETTINGS "ABS setting"
#define MSG_COOLDOWN "Esfriar" #define MSG_COOLDOWN "Esfriar"
#define MSG_SWITCH_PS_ON "Switch Power On" #define MSG_SWITCH_PS_ON "Switch Power On"
#define MSG_SWITCH_PS_OFF "Switch Power Off" #define MSG_SWITCH_PS_OFF "Switch Power Off"
#define MSG_EXTRUDE "Extrudar" #define MSG_EXTRUDE "Extrudar"
#define MSG_RETRACT "Retrair" #define MSG_RETRACT "Retrair"
#define MSG_MOVE_AXIS "Mover eixo \x7E" #define MSG_MOVE_AXIS "Mover eixo"
#define MSG_MOVE_X "Move X" #define MSG_MOVE_X "Move X"
#define MSG_MOVE_Y "Move Y" #define MSG_MOVE_Y "Move Y"
#define MSG_MOVE_Z "Move Z" #define MSG_MOVE_Z "Move Z"
@ -41,14 +46,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 "Velocidade" #define MSG_SPEED "Velocidade"
#define MSG_NOZZLE "\002Nozzle" #define MSG_NOZZLE LCD_STR_THERMOMETER " Nozzle"
#define MSG_BED "\002Base" #define MSG_BED LCD_STR_THERMOMETER " Base"
#define MSG_FAN_SPEED "Velocidade vento." #define MSG_FAN_SPEED "Velocidade vento."
#define MSG_FLOW "Fluxo" #define MSG_FLOW "Fluxo"
#define MSG_CONTROL "Controle \003" #define MSG_CONTROL "Controle"
#define MSG_MIN "\002 Min" #define MSG_MIN LCD_STR_THERMOMETER " Min"
#define MSG_MAX "\002 Max" #define MSG_MAX LCD_STR_THERMOMETER " Max"
#define MSG_FACTOR "\002 Fact" #define MSG_FACTOR LCD_STR_THERMOMETER " Fact"
#define MSG_AUTOTEMP "Autotemp" #define MSG_AUTOTEMP "Autotemp"
#define MSG_ON "On " #define MSG_ON "On "
#define MSG_OFF "Off" #define MSG_OFF "Off"
@ -84,10 +89,10 @@
#define MSG_STORE_EPROM "Guardar memoria" #define MSG_STORE_EPROM "Guardar memoria"
#define MSG_LOAD_EPROM "Carregar memoria" #define MSG_LOAD_EPROM "Carregar memoria"
#define MSG_RESTORE_FAILSAFE "Rest. de emergen." #define MSG_RESTORE_FAILSAFE "Rest. de emergen."
#define MSG_REFRESH "\004Recarregar" #define MSG_REFRESH LCD_STR_REFRESH " Recarregar"
#define MSG_WATCH "Monitorar \003" #define MSG_WATCH "Monitorar"
#define MSG_PREPARE "Preparar \x7E" #define MSG_PREPARE "Preparar"
#define MSG_TUNE "Tune \x7E" #define MSG_TUNE "Tune"
#define MSG_PAUSE_PRINT "Pausar impressao" #define MSG_PAUSE_PRINT "Pausar impressao"
#define MSG_RESUME_PRINT "Resumir impressao" #define MSG_RESUME_PRINT "Resumir impressao"
#define MSG_STOP_PRINT "Parar impressao" #define MSG_STOP_PRINT "Parar impressao"

@ -2,16 +2,21 @@
* Portuguese * Portuguese
* *
* LCD Menu Messages * LCD Menu Messages
* Please note these are limited to 17 characters! * See also documentation/LCDLanguageFont.md
* *
*/ */
#ifndef LANGUAGE_PT_H #ifndef LANGUAGE_PT_H
#define LANGUAGE_PT_H #define LANGUAGE_PT_H
#define MAPPER_NON
// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h
//#define SIMULATE_ROMFONT
#define DISPLAY_CHARSET_ISO10646_1
#define WELCOME_MSG MACHINE_NAME " pronto." #define WELCOME_MSG MACHINE_NAME " pronto."
#define MSG_SD_INSERTED "Cartao inserido" #define MSG_SD_INSERTED "Cartao inserido"
#define MSG_SD_REMOVED "Cartao removido" #define MSG_SD_REMOVED "Cartao removido"
#define MSG_MAIN " Menu principal \003" #define MSG_MAIN " Menu principal"
#define MSG_AUTOSTART "Autostart" #define MSG_AUTOSTART "Autostart"
#define MSG_DISABLE_STEPPERS " Desligar motores" #define MSG_DISABLE_STEPPERS " Desligar motores"
#define MSG_AUTO_HOME "Ir para home" #define MSG_AUTO_HOME "Ir para home"
@ -20,19 +25,19 @@
#define MSG_PREHEAT_PLA "Pre-aquecer PLA" #define MSG_PREHEAT_PLA "Pre-aquecer PLA"
#define MSG_PREHEAT_PLA_N "Pre-aquecer PLA " #define MSG_PREHEAT_PLA_N "Pre-aquecer PLA "
#define MSG_PREHEAT_PLA_ALL "Pre-aq. PLA Tudo" #define MSG_PREHEAT_PLA_ALL "Pre-aq. PLA Tudo"
#define MSG_PREHEAT_PLA_BEDONLY "Pre-aq. PLA \002Base" #define MSG_PREHEAT_PLA_BEDONLY "Pre-aq. PLA " LCD_STR_THERMOMETER "Base"
#define MSG_PREHEAT_PLA_SETTINGS "PLA definicoes" #define MSG_PREHEAT_PLA_SETTINGS "PLA definicoes"
#define MSG_PREHEAT_ABS "Pre-aquecer ABS" #define MSG_PREHEAT_ABS "Pre-aquecer ABS"
#define MSG_PREHEAT_ABS_N "Pre-aquecer ABS " #define MSG_PREHEAT_ABS_N "Pre-aquecer ABS "
#define MSG_PREHEAT_ABS_ALL "Pre-aq. ABS Tudo" #define MSG_PREHEAT_ABS_ALL "Pre-aq. ABS Tudo"
#define MSG_PREHEAT_ABS_BEDONLY "Pre-aq. ABS \002Base" #define MSG_PREHEAT_ABS_BEDONLY "Pre-aq. ABS " LCD_STR_THERMOMETER "Base"
#define MSG_PREHEAT_ABS_SETTINGS "ABS definicoes" #define MSG_PREHEAT_ABS_SETTINGS "ABS definicoes"
#define MSG_COOLDOWN "Arrefecer" #define MSG_COOLDOWN "Arrefecer"
#define MSG_SWITCH_PS_ON "Ligar" #define MSG_SWITCH_PS_ON "Ligar"
#define MSG_SWITCH_PS_OFF "Desligar" #define MSG_SWITCH_PS_OFF "Desligar"
#define MSG_EXTRUDE "Extrudir" #define MSG_EXTRUDE "Extrudir"
#define MSG_RETRACT "Retrair" #define MSG_RETRACT "Retrair"
#define MSG_MOVE_AXIS "Mover eixo \x7E" #define MSG_MOVE_AXIS "Mover eixo"
#define MSG_MOVE_X "Mover X" #define MSG_MOVE_X "Mover X"
#define MSG_MOVE_Y "Mover Y" #define MSG_MOVE_Y "Mover Y"
#define MSG_MOVE_Z "Mover Z" #define MSG_MOVE_Z "Mover Z"
@ -41,14 +46,14 @@
#define MSG_MOVE_1MM "Mover 1mm" #define MSG_MOVE_1MM "Mover 1mm"
#define MSG_MOVE_10MM "Mover 10mm" #define MSG_MOVE_10MM "Mover 10mm"
#define MSG_SPEED "Velocidade" #define MSG_SPEED "Velocidade"
#define MSG_NOZZLE "\002Bico" #define MSG_NOZZLE LCD_STR_THERMOMETER "Bico"
#define MSG_BED "\002Base" #define MSG_BED LCD_STR_THERMOMETER "Base"
#define MSG_FAN_SPEED "Velocidade do ar." #define MSG_FAN_SPEED "Velocidade do ar."
#define MSG_FLOW "Fluxo" #define MSG_FLOW "Fluxo"
#define MSG_CONTROL "Controlo \003" #define MSG_CONTROL "Controlo"
#define MSG_MIN "\002 Min" #define MSG_MIN LCD_STR_THERMOMETER " Min"
#define MSG_MAX "\002 Max" #define MSG_MAX LCD_STR_THERMOMETER " Max"
#define MSG_FACTOR "\002 Fact" #define MSG_FACTOR LCD_STR_THERMOMETER " Fact"
#define MSG_AUTOTEMP "Autotemp" #define MSG_AUTOTEMP "Autotemp"
#define MSG_ON "On " #define MSG_ON "On "
#define MSG_OFF "Off" #define MSG_OFF "Off"
@ -84,10 +89,10 @@
#define MSG_STORE_EPROM "Guardar na memoria" #define MSG_STORE_EPROM "Guardar na memoria"
#define MSG_LOAD_EPROM "Carregar da memoria" #define MSG_LOAD_EPROM "Carregar da memoria"
#define MSG_RESTORE_FAILSAFE "Rest. de emergen." #define MSG_RESTORE_FAILSAFE "Rest. de emergen."
#define MSG_REFRESH "\004Recarregar" #define MSG_REFRESH LCD_STR_REFRESH " Recarregar"
#define MSG_WATCH "Monitorar \003" #define MSG_WATCH "Monitorar"
#define MSG_PREPARE "Preparar \x7E" #define MSG_PREPARE "Preparar"
#define MSG_TUNE "Afinar \x7E" #define MSG_TUNE "Afinar"
#define MSG_PAUSE_PRINT "Pausar impressao" #define MSG_PAUSE_PRINT "Pausar impressao"
#define MSG_RESUME_PRINT "Resumir impressao" #define MSG_RESUME_PRINT "Resumir impressao"
#define MSG_STOP_PRINT "Parar impressao" #define MSG_STOP_PRINT "Parar impressao"

@ -2,13 +2,16 @@
* Russian * Russian
* *
* LCD Menu Messages * LCD Menu Messages
* Please note these are limited to 17 characters! * See also documentation/LCDLanguageFont.md
* *
*/ */
#ifndef LANGUAGE_RU_H #ifndef LANGUAGE_RU_H
#define LANGUAGE_RU_H #define LANGUAGE_RU_H
#define LANGUAGE_RU #define MAPPER_D0D1 // For Cyrillic
// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h
//#define SIMULATE_ROMFONT
#define DISPLAY_CHARSET_ISO10646_5
#define WELCOME_MSG MACHINE_NAME " Готов." #define WELCOME_MSG MACHINE_NAME " Готов."
#define MSG_SD_INSERTED "Карта вставлена" #define MSG_SD_INSERTED "Карта вставлена"

@ -0,0 +1,215 @@
/**
* TEST
*
* LCD Menu Messages
* See also documentation/LCDLanguageFont.md
*
*/
#ifndef LANGUAGE_TEST_H
#define LANGUAGE_TEST_H
// Select ONE of the following Mappers.
// They decide what to do with a symbol in the area of [0x80:0xFF]. They take a symbol of this language file and make them point
// into an array with 128 cells, where they'll find the place of the symbol of the font in use.
//
// a.)For ASCII coded Language_xx.h files like (en) there are no occurrences of symbols above 0x7F so no mapper is needed.
// If such a symbol appears it is mapped directly into the font. This is the case for the language files we used until now, with all the STR_XX or
// "\xxx" symbols. All Symbols are only one byte long.
// b.) For Unicoded Language_xx.h files (currently ru, de and kana_utf8 ) the non ASCII [0x00-0x7F] symbols are represented by more then one byte.
// In the case of two bytes the first is pointing to a 'codepage' and the second to a place in the codepage. These codepages contain 64 symbols.
// So two of them can be mapped. For most of the European languages the necessary symbols are contained in the pages C2 and C3. Cyrillic uses D0
// and D1.
// c.) For katakana (one of the Japanese symbol sets) Unicode uses 3 bytes. Here the second byte also points to a codepage and byte 3 to the symbol.
// I hope the pages E282 and E283 are sufficient to write katakana.
// Kanji (an other Japanese symbol set) uses far more than two codepages. So currently I don't see a chance to map the Unicodes. Its not
// impossible to have a close to direct mapping but will need giant conversion tables and fonts (we don't want to have in a embedded system).
#define MAPPER_NON // For direct asci codes ( until now all languages except ru, de, fi, kana_utf8, ... )
//#define MAPPER_C2C3 // For most European languages when language file is in utf8
//#define MAPPER_D0D1 // For Cyrillic
//#define MAPPER_E382E383 // For Katakana
// Define SIMULATE_ROMFONT to see what is seen on the character based display defined in Configuration.h
//#define SIMULATE_ROMFONT
// Select the better font for full graphic displays.
//#define DISPLAY_CHARSET_ISO10646_1
//#define DISPLAY_CHARSET_ISO10646_5
//#define DISPLAY_CHARSET_ISO10646_KANA
// next 5 lines select variants in this file only
#define DISPLAYTEST
//#define WEST
//#define CYRIL
//#define KANA
// TESTSTRINGS
#define STRG_ASCII_2 " !\"#$%&'()*+,-./"
#define STRG_ASCII_3 "0123456789:;<=>?"
#define STRG_ASCII_4 "@ABCDEFGHIJKLMNO"
#define STRG_ASCII_5 "PQRSTUVWXYZ[\]^_"
#define STRG_ASCII_6 "`abcdefghijklmno"
#define STRG_ASCII_7 "pqrstuvwxyz{|}~"
#define STRG_C2_8 ""
#define STRG_C2_9 ""
#define STRG_C2_a " ¡¢£¤¥¦§¨©ª«¬­®¯"
#define STRG_C2_b "°±²³´µ¶·¸¹º»¼½¾¿"
#define STRG_C3_8 "ÈÁÂÃÄÅÆÇÈÉÊËÌÍÎÏ"
#define STRG_C3_9 "ÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß"
#define STRG_C3_a "àáâãäåæçèéêëìíîï"
#define STRG_C3_b "ðñòóôõö÷øùúûüýþÿ"
#define STRG_D0_8 "ЀЁЂЃЄЅІЇЈЉЊЋЌЍЎЏ"
#define STRG_D0_9 "АБВГДЕЖЗИЙКЛМНОП"
#define STRG_D0_a "РСТУФХЦЧШЩЪЫЬЭЮЯ"
#define STRG_D0_b "абвгдежзийклмноп"
#define STRG_D1_8 "рстуфхцчшщъыьэюя"
#define STRG_D1_9 "ѐёђѓєѕіїјљњћќѝўџ"
#define STRG_D1_a "ѠѡѢѣѤѥѦѧѨѩѪѫѬѭѮѯ"
#define STRG_D1_b "ѰѱѲѳѴѵѶѷѸѹѺѻѼѽѾѿ"
#define STRG_E382_8 "よめもゃやゅゆょよらりるれろゎわ"
#define STRG_E382_9 "ゐゑをんゔゕゖ゗゘゙゚゛ ゜ゝゞゟ"
#define STRG_E382_a "゠ァアィイゥウェエォオカガキギク"
#define STRG_E382_b "グケゲコゴサザシジスズセゼソゾタ"
#define STRG_E383_8 "トチヂッツヅテデトドナニヌネノハ"
#define STRG_E383_9 "バパヒビピフブプヘベペホボポマミ"
#define STRG_E383_a "ムメモャヤュユョヨラリルレロヮワ"
#define STRG_E383_b "ヰヱヲンヴヵヶヷヸヹヺ・ーヽヾヿ"
#define STRG_OKTAL_0 "\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017"
#define STRG_OKTAL_1 "\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
#define STRG_OKTAL_2 "\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057"
#define STRG_OKTAL_3 "\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077"
#define STRG_OKTAL_4 "\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117"
#define STRG_OKTAL_5 "\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137"
#define STRG_OKTAL_6 "\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157"
#define STRG_OKTAL_7 "\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177"
#define STRG_OKTAL_8 "\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217"
#define STRG_OKTAL_9 "\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237"
#define STRG_OKTAL_a "\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257"
#define STRG_OKTAL_b "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277"
#define STRG_OKTAL_c "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317"
#define STRG_OKTAL_d "\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337"
#define STRG_OKTAL_e "\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357"
#define STRG_OKTAL_f "\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377"
#ifdef DISPLAYTEST
#define WELCOME_MSG "Language TEST"
#define MSG_WATCH "Display test"
#define MSG_PREPARE STRG_OKTAL_b
#define MSG_CONTROL STRG_OKTAL_c
#endif
#ifdef WEST
#define WELCOME_MSG "Language TEST"
#define MSG_WATCH "\001\002\003\004\005\006\007\010\011"
#define MSG_PREPARE "UTF8"
#define MSG_CONTROL "ASCII"
//#define MSG_MAIN ".."
#define MSG_DISABLE_STEPPERS STRG_C2_8
#define MSG_AUTO_HOME STRG_C2_9
#define MSG_SET_HOME_OFFSETS STRG_C2_a
#define MSG_PREHEAT_PLA STRG_C2_b
#define MSG_PREHEAT_ABS STRG_C3_8
#define MSG_COOLDOWN STRG_C3_9
#define MSG_SWITCH_PS_OFF STRG_C3_a
#define MSG_MOVE_AXIS STRG_C3_b
#define MSG_MAIN STRG_OKTAL_2
#define MSG_TEMPERATURE STRG_OKTAL_3
#define MSG_MOTION STRG_OKTAL_4
#define MSG_VOLUMETRIC STRG_OKTAL_5
#define MSG_CONTRAST STRG_OKTAL_6
#define MSG_RESTORE_FAILSAFE STRG_OKTAL_7
#define MSG_NOZZLE STRG_OKTAL_8
#define MSG_FAN_SPEED STRG_OKTAL_9
#define MSG_AUTOTEMP STRG_OKTAL_a
#define MSG_MIN STRG_OKTAL_b
#define MSG_MAX STRG_OKTAL_c
#define MSG_FACTOR STRG_OKTAL_d
#define MSG_PID_P STRG_OKTAL_e
#define MSG_PID_I STRG_OKTAL_f
#endif
#ifdef CYRIL
#define WELCOME_MSG "Language TEST"
#define MSG_WATCH "\001\002\003\004\005\006\007\010\011"
#define MSG_PREPARE "UTF8"
#define MSG_CONTROL "ASCII"
//#define MSG_MAIN ".."
#define MSG_DISABLE_STEPPERS STRG_D0_8
#define MSG_AUTO_HOME STRG_D0_9
#define MSG_SET_HOME_OFFSETS STRG_D0_a
#define MSG_PREHEAT_PLA STRG_D0_b
#define MSG_PREHEAT_ABS STRG_D1_8
#define MSG_COOLDOWN STRG_D1_9
#define MSG_SWITCH_PS_OFF STRG_D1_a
#define MSG_MOVE_AXIS STRG_D1_b
#define MSG_MAIN STRG_OKTAL_2
#define MSG_TEMPERATURE STRG_OKTAL_3
#define MSG_MOTION STRG_OKTAL_4
#define MSG_VOLUMETRIC STRG_OKTAL_5
#define MSG_CONTRAST STRG_OKTAL_6
#define MSG_RESTORE_FAILSAFE STRG_OKTAL_7
#define MSG_NOZZLE STRG_OKTAL_8
#define MSG_FAN_SPEED STRG_OKTAL_9
#define MSG_AUTOTEMP STRG_OKTAL_a
#define MSG_MIN STRG_OKTAL_b
#define MSG_MAX STRG_OKTAL_c
#define MSG_FACTOR STRG_OKTAL_d
#define MSG_PID_P STRG_OKTAL_e
#define MSG_PID_I STRG_OKTAL_f
#endif
#if defined( KANA )
#define WELCOME_MSG "Language TEST"
#define MSG_WATCH "\001\002\003\004\005\006\007\010\011"
#define MSG_PREPARE "UTF8"
#define MSG_CONTROL "ASCII"
//#define MSG_MAIN ".."
#define MSG_DISABLE_STEPPERS STRG_E382_8
#define MSG_AUTO_HOME STRG_E382_9
#define MSG_SET_HOME_OFFSETS STRG_E382_a
#define MSG_PREHEAT_PLA STRG_E382_b
#define MSG_PREHEAT_ABS STRG_E383_8
#define MSG_COOLDOWN STRG_E383_9
#define MSG_SWITCH_PS_OFF STRG_E383_a
#define MSG_MOVE_AXIS STRG_E383_b
#define MSG_MAIN STRG_OKTAL_2
#define MSG_TEMPERATURE STRG_OKTAL_3
#define MSG_MOTION STRG_OKTAL_4
#define MSG_VOLUMETRIC STRG_OKTAL_5
#define MSG_CONTRAST STRG_OKTAL_6
#define MSG_RESTORE_FAILSAFE STRG_OKTAL_7
#define MSG_NOZZLE STRG_OKTAL_8
#define MSG_FAN_SPEED STRG_OKTAL_9
#define MSG_AUTOTEMP STRG_OKTAL_a
#define MSG_MIN STRG_OKTAL_b
#define MSG_MAX STRG_OKTAL_c
#define MSG_FACTOR STRG_OKTAL_d
#define MSG_PID_P STRG_OKTAL_e
#define MSG_PID_I STRG_OKTAL_f
#endif
#endif // LANGUAGE_TEST_H

@ -1,20 +1,16 @@
#include "mesh_bed_leveling.h" #include "mesh_bed_leveling.h"
#if defined(MESH_BED_LEVELING) #ifdef MESH_BED_LEVELING
mesh_bed_leveling mbl; mesh_bed_leveling mbl;
mesh_bed_leveling::mesh_bed_leveling() { mesh_bed_leveling::mesh_bed_leveling() { reset(); }
reset();
}
void mesh_bed_leveling::reset() { void mesh_bed_leveling::reset() {
for (int y=0; y<MESH_NUM_Y_POINTS; y++) { active = 0;
for (int x=0; x<MESH_NUM_X_POINTS; x++) { for (int y = 0; y < MESH_NUM_Y_POINTS; y++)
for (int x = 0; x < MESH_NUM_X_POINTS; x++)
z_values[y][x] = 0; z_values[y][x] = 0;
} }
}
active = 0;
}
#endif // MESH_BED_LEVELING #endif // MESH_BED_LEVELING

@ -2,11 +2,11 @@
#if defined(MESH_BED_LEVELING) #if defined(MESH_BED_LEVELING)
#define MESH_X_DIST ((MESH_MAX_X - MESH_MIN_X)/(MESH_NUM_X_POINTS - 1)) #define MESH_X_DIST ((MESH_MAX_X - MESH_MIN_X)/(MESH_NUM_X_POINTS - 1))
#define MESH_Y_DIST ((MESH_MAX_Y - MESH_MIN_Y)/(MESH_NUM_Y_POINTS - 1)) #define MESH_Y_DIST ((MESH_MAX_Y - MESH_MIN_Y)/(MESH_NUM_Y_POINTS - 1))
class mesh_bed_leveling { class mesh_bed_leveling {
public: public:
uint8_t active; uint8_t active;
float z_values[MESH_NUM_Y_POINTS][MESH_NUM_X_POINTS]; float z_values[MESH_NUM_Y_POINTS][MESH_NUM_X_POINTS];
@ -14,24 +14,20 @@ public:
void reset(); void reset();
float get_x(int i) { return MESH_MIN_X + MESH_X_DIST*i; } float get_x(int i) { return MESH_MIN_X + MESH_X_DIST * i; }
float get_y(int i) { return MESH_MIN_Y + MESH_Y_DIST*i; } float get_y(int i) { return MESH_MIN_Y + MESH_Y_DIST * i; }
void set_z(int ix, int iy, float z) { z_values[iy][ix] = z; } void set_z(int ix, int iy, float z) { z_values[iy][ix] = z; }
int select_x_index(float x) { int select_x_index(float x) {
int i = 1; int i = 1;
while (x > get_x(i) && i < MESH_NUM_X_POINTS-1) { while (x > get_x(i) && i < MESH_NUM_X_POINTS-1) i++;
i++; return i - 1;
}
return i-1;
} }
int select_y_index(float y) { int select_y_index(float y) {
int i = 1; int i = 1;
while (y > get_y(i) && i < MESH_NUM_Y_POINTS-1) { while (y > get_y(i) && i < MESH_NUM_Y_POINTS - 1) i++;
i++; return i - 1;
}
return i-1;
} }
float calc_z0(float a0, float a1, float z1, float a2, float z2) { float calc_z0(float a0, float a1, float z1, float a2, float z2) {
@ -54,8 +50,8 @@ public:
get_y(y_index+1), z2); get_y(y_index+1), z2);
return z0; return z0;
} }
}; };
extern mesh_bed_leveling mbl; extern mesh_bed_leveling mbl;
#endif // MESH_BED_LEVELING #endif // MESH_BED_LEVELING

@ -161,7 +161,7 @@ volatile signed char count_direction[NUM_AXIS] = { 1, 1, 1, 1 };
Z2_STEP_WRITE(v); \ Z2_STEP_WRITE(v); \
} }
#else #else
#define Z_APPLY_STEP(v,Q) Z_STEP_WRITE(v), Z2_STEP_WRITE(v) #define Z_APPLY_STEP(v,Q) { Z_STEP_WRITE(v); Z2_STEP_WRITE(v); }
#endif #endif
#else #else
#define Z_APPLY_DIR(v,Q) Z_DIR_WRITE(v) #define Z_APPLY_DIR(v,Q) Z_DIR_WRITE(v)

@ -53,10 +53,10 @@
//============================= public variables ============================ //============================= public variables ============================
//=========================================================================== //===========================================================================
int target_temperature[EXTRUDERS] = { 0 }; int target_temperature[4] = { 0 };
int target_temperature_bed = 0; int target_temperature_bed = 0;
int current_temperature_raw[EXTRUDERS] = { 0 }; int current_temperature_raw[4] = { 0 };
float current_temperature[EXTRUDERS] = { 0.0 }; float current_temperature[4] = { 0.0 };
int current_temperature_bed_raw = 0; int current_temperature_bed_raw = 0;
float current_temperature_bed = 0.0; float current_temperature_bed = 0.0;
#ifdef TEMP_SENSOR_1_AS_REDUNDANT #ifdef TEMP_SENSOR_1_AS_REDUNDANT
@ -1181,9 +1181,10 @@ static void set_current_temp_raw() {
#endif #endif
#if HAS_TEMP_1 #if HAS_TEMP_1
#ifdef TEMP_SENSOR_1_AS_REDUNDANT #ifdef TEMP_SENSOR_1_AS_REDUNDANT
redundant_temperature_raw = redundant_temperature_raw = raw_temp_value[1];
#endif #else
current_temperature_raw[1] = raw_temp_value[1]; current_temperature_raw[1] = raw_temp_value[1];
#endif
#if HAS_TEMP_2 #if HAS_TEMP_2
current_temperature_raw[2] = raw_temp_value[2]; current_temperature_raw[2] = raw_temp_value[2];
#if HAS_TEMP_3 #if HAS_TEMP_3

@ -41,10 +41,10 @@ void manage_heater(); //it is critical that this is called periodically.
// low level conversion routines // low level conversion routines
// do not use these routines and variables outside of temperature.cpp // do not use these routines and variables outside of temperature.cpp
extern int target_temperature[EXTRUDERS]; extern int target_temperature[4];
extern float current_temperature[EXTRUDERS]; extern float current_temperature[4];
#ifdef SHOW_TEMP_ADC_VALUES #ifdef SHOW_TEMP_ADC_VALUES
extern int current_temperature_raw[EXTRUDERS]; extern int current_temperature_raw[4];
extern int current_temperature_bed_raw; extern int current_temperature_bed_raw;
#endif #endif
extern int target_temperature_bed; extern int target_temperature_bed;

@ -911,7 +911,7 @@ static void lcd_control_motion_menu() {
START_MENU(); START_MENU();
MENU_ITEM(back, MSG_CONTROL, lcd_control_menu); MENU_ITEM(back, MSG_CONTROL, lcd_control_menu);
#ifdef ENABLE_AUTO_BED_LEVELING #ifdef ENABLE_AUTO_BED_LEVELING
MENU_ITEM_EDIT(float32, MSG_ZPROBE_ZOFFSET, &zprobe_zoffset, 0.0, 50); MENU_ITEM_EDIT(float32, MSG_ZPROBE_ZOFFSET, &zprobe_zoffset, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX);
#endif #endif
MENU_ITEM_EDIT(float5, MSG_ACC, &acceleration, 10, 99000); MENU_ITEM_EDIT(float5, MSG_ACC, &acceleration, 10, 99000);
MENU_ITEM_EDIT(float3, MSG_VXY_JERK, &max_xy_jerk, 1, 990); MENU_ITEM_EDIT(float3, MSG_VXY_JERK, &max_xy_jerk, 1, 990);
@ -1137,7 +1137,32 @@ menu_edit_type(unsigned long, long5, ftostr5, 0.01)
static void lcd_quick_feedback() { static void lcd_quick_feedback() {
lcdDrawUpdate = 2; lcdDrawUpdate = 2;
blocking_enc = millis() + 500; blocking_enc = millis() + 500;
lcd_implementation_quick_feedback();
#ifdef LCD_USE_I2C_BUZZER
#ifndef LCD_FEEDBACK_FREQUENCY_HZ
#define LCD_FEEDBACK_FREQUENCY_HZ 100
#endif
#ifndef LCD_FEEDBACK_FREQUENCY_DURATION_MS
#define LCD_FEEDBACK_FREQUENCY_DURATION_MS (1000/6)
#endif
lcd_buzz(LCD_FEEDBACK_FREQUENCY_DURATION_MS, LCD_FEEDBACK_FREQUENCY_HZ);
#elif defined(BEEPER) && BEEPER > -1
SET_OUTPUT(BEEPER);
#ifndef LCD_FEEDBACK_FREQUENCY_HZ
#define LCD_FEEDBACK_FREQUENCY_HZ 500
#endif
#ifndef LCD_FEEDBACK_FREQUENCY_DURATION_MS
#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 50
#endif
const unsigned int delay = 1000000 / LCD_FEEDBACK_FREQUENCY_HZ / 2;
int i = LCD_FEEDBACK_FREQUENCY_DURATION_MS * LCD_FEEDBACK_FREQUENCY_HZ / 1000;
while (i--) {
WRITE(BEEPER,HIGH);
delayMicroseconds(delay);
WRITE(BEEPER,LOW);
delayMicroseconds(delay);
}
#endif
} }
/** Menu action functions **/ /** Menu action functions **/
@ -1330,7 +1355,7 @@ void lcd_update() {
blink++; // Variable for fan animation and alive dot blink++; // Variable for fan animation and alive dot
u8g.firstPage(); u8g.firstPage();
do { do {
u8g.setFont(FONT_MENU); lcd_setFont(FONT_MENU);
u8g.setPrintPos(125, 0); u8g.setPrintPos(125, 0);
if (blink % 2) u8g.setColorIndex(1); else u8g.setColorIndex(0); // Set color for the alive dot if (blink % 2) u8g.setColorIndex(1); else u8g.setColorIndex(0); // Set color for the alive dot
u8g.drawPixel(127, 63); // draw alive dot u8g.drawPixel(127, 63); // draw alive dot

@ -179,25 +179,20 @@
// 2 wire Non-latching LCD SR from: // 2 wire Non-latching LCD SR from:
// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/schematics#!shiftregister-connection // https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/schematics#!shiftregister-connection
#elif defined(SR_LCD_2W_NL) #elif defined(SR_LCD_2W_NL)
extern "C" void __cxa_pure_virtual() { while (1); } extern "C" void __cxa_pure_virtual() { while (1); }
#include <LCD.h> #include <LCD.h>
#include <LiquidCrystal_SR.h> #include <LiquidCrystal_SR.h>
#define LCD_CLASS LiquidCrystal_SR #define LCD_CLASS LiquidCrystal_SR
LCD_CLASS lcd(SR_DATA_PIN, SR_CLK_PIN); LCD_CLASS lcd(SR_DATA_PIN, SR_CLK_PIN);
#else #else
// Standard directly connected LCD implementations // Standard directly connected LCD implementations
#ifdef LANGUAGE_RU
#include "LiquidCrystalRus.h"
#define LCD_CLASS LiquidCrystalRus
#else
#include <LiquidCrystal.h> #include <LiquidCrystal.h>
#define LCD_CLASS LiquidCrystal #define LCD_CLASS LiquidCrystal
#endif
LCD_CLASS lcd(LCD_PINS_RS, LCD_PINS_ENABLE, LCD_PINS_D4, LCD_PINS_D5,LCD_PINS_D6,LCD_PINS_D7); //RS,Enable,D4,D5,D6,D7 LCD_CLASS lcd(LCD_PINS_RS, LCD_PINS_ENABLE, LCD_PINS_D4, LCD_PINS_D5,LCD_PINS_D6,LCD_PINS_D7); //RS,Enable,D4,D5,D6,D7
#endif #endif
#include "utf_mapper.h"
#if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT) #if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT)
static uint16_t progressBarTick = 0; static uint16_t progressBarTick = 0;
#if PROGRESS_MSG_EXPIRE > 0 #if PROGRESS_MSG_EXPIRE > 0
@ -207,7 +202,7 @@
#endif #endif
/* Custom characters defined in the first 8 characters of the LCD */ /* Custom characters defined in the first 8 characters of the LCD */
#define LCD_STR_BEDTEMP "\x00" #define LCD_STR_BEDTEMP "\x00" // this will have 'unexpected' results when used in a string!
#define LCD_STR_DEGREE "\x01" #define LCD_STR_DEGREE "\x01"
#define LCD_STR_THERMOMETER "\x02" #define LCD_STR_THERMOMETER "\x02"
#define LCD_STR_UPLEVEL "\x03" #define LCD_STR_UPLEVEL "\x03"
@ -215,7 +210,8 @@
#define LCD_STR_FOLDER "\x05" #define LCD_STR_FOLDER "\x05"
#define LCD_STR_FEEDRATE "\x06" #define LCD_STR_FEEDRATE "\x06"
#define LCD_STR_CLOCK "\x07" #define LCD_STR_CLOCK "\x07"
#define LCD_STR_ARROW_RIGHT "\x7E" /* from the default character set */ //#define LCD_STR_ARROW_RIGHT "\x7E" /* from the default character set. Only available on DISPLAY_CHARSET_HD44780_JAPAN - at this place!*/
#define LCD_STR_ARROW_RIGHT ">" /* from the default character set */
static void lcd_set_custom_characters( static void lcd_set_custom_characters(
#if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT) #if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT)
@ -405,15 +401,30 @@ static void lcd_implementation_clear()
{ {
lcd.clear(); lcd.clear();
} }
/* Arduino < 1.0.0 is missing a function to print PROGMEM strings, so we need to implement our own */ /* Arduino < 1.0.0 is missing a function to print PROGMEM strings, so we need to implement our own */
static void lcd_printPGM(const char* str) char lcd_printPGM(const char* str) {
{
char c; char c;
while((c = pgm_read_byte(str++)) != '\0') char n = 0;
{ while((c = pgm_read_byte(str++))) {
lcd.write(c); n += charset_mapper(c);
} }
return n;
} }
char lcd_print(char* str) {
char c, n = 0;;
unsigned char i = 0;
while((c = str[i++])) {
n += charset_mapper(c);
}
return n;
}
unsigned lcd_print(char c) {
return charset_mapper(c);
}
/* /*
Possible status screens: Possible status screens:
16x2 |0123456789012345| 16x2 |0123456789012345|
@ -608,7 +619,7 @@ static void lcd_implementation_status_screen()
} }
#endif //FILAMENT_LCD_DISPLAY #endif //FILAMENT_LCD_DISPLAY
lcd.print(lcd_status_message); lcd_print(lcd_status_message);
} }
static void lcd_implementation_drawmenu_generic(bool sel, uint8_t row, const char* pstr, char pre_char, char post_char) { static void lcd_implementation_drawmenu_generic(bool sel, uint8_t row, const char* pstr, char pre_char, char post_char) {
@ -617,27 +628,26 @@ static void lcd_implementation_drawmenu_generic(bool sel, uint8_t row, const cha
lcd.setCursor(0, row); lcd.setCursor(0, row);
lcd.print(sel ? pre_char : ' '); lcd.print(sel ? pre_char : ' ');
while ((c = pgm_read_byte(pstr)) && n > 0) { while ((c = pgm_read_byte(pstr)) && n > 0) {
lcd.print(c); n -= lcd_print(c);
pstr++; pstr++;
if ((pgm_read_byte(pstr) & 0xc0) != 0x80) n--;
} }
while(n--) lcd.print(' '); while(n--) lcd.print(' ');
lcd.print(post_char); lcd.print(post_char);
lcd.print(' '); lcd.print(' ');
} }
static void lcd_implementation_drawmenu_setting_edit_generic(bool sel, uint8_t row, const char* pstr, char pre_char, char* data) { static void lcd_implementation_drawmenu_setting_edit_generic(bool sel, uint8_t row, const char* pstr, char pre_char, char* data) {
char c; char c;
uint8_t n = LCD_WIDTH - 1 - (LCD_WIDTH < 20 ? 1 : 2) - lcd_strlen(data); uint8_t n = LCD_WIDTH - 1 - (LCD_WIDTH < 20 ? 1 : 2) - lcd_strlen(data);
lcd.setCursor(0, row); lcd.setCursor(0, row);
lcd.print(sel ? pre_char : ' '); lcd.print(sel ? pre_char : ' ');
while ((c = pgm_read_byte(pstr)) && n > 0) { while ((c = pgm_read_byte(pstr)) && n > 0) {
lcd.print(c); n -= lcd_print(c);
pstr++; pstr++;
if ((pgm_read_byte(pstr) & 0xc0) != 0x80) n--;
} }
lcd.print(':'); lcd.print(':');
while (n--) lcd.print(' '); while (n--) lcd.print(' ');
lcd.print(data); lcd_print(data);
} }
static void lcd_implementation_drawmenu_setting_edit_generic_P(bool sel, uint8_t row, const char* pstr, char pre_char, const char* data) { static void lcd_implementation_drawmenu_setting_edit_generic_P(bool sel, uint8_t row, const char* pstr, char pre_char, const char* data) {
char c; char c;
@ -645,14 +655,14 @@ static void lcd_implementation_drawmenu_setting_edit_generic_P(bool sel, uint8_t
lcd.setCursor(0, row); lcd.setCursor(0, row);
lcd.print(sel ? pre_char : ' '); lcd.print(sel ? pre_char : ' ');
while ((c = pgm_read_byte(pstr)) && n > 0) { while ((c = pgm_read_byte(pstr)) && n > 0) {
lcd.print(c); n -= lcd_print(c);
pstr++; pstr++;
if ((pgm_read_byte(pstr) & 0xc0) != 0x80) n--;
} }
lcd.print(':'); lcd.print(':');
while (n--) lcd.print(' '); while (n--) lcd.print(' ');
lcd_printPGM(data); lcd_printPGM(data);
} }
#define lcd_implementation_drawmenu_setting_edit_int3(sel, row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(sel, row, pstr, '>', itostr3(*(data))) #define lcd_implementation_drawmenu_setting_edit_int3(sel, row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(sel, row, pstr, '>', itostr3(*(data)))
#define lcd_implementation_drawmenu_setting_edit_float3(sel, row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(sel, row, pstr, '>', ftostr3(*(data))) #define lcd_implementation_drawmenu_setting_edit_float3(sel, row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(sel, row, pstr, '>', ftostr3(*(data)))
#define lcd_implementation_drawmenu_setting_edit_float32(sel, row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(sel, row, pstr, '>', ftostr32(*(data))) #define lcd_implementation_drawmenu_setting_edit_float32(sel, row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(sel, row, pstr, '>', ftostr32(*(data)))
@ -679,8 +689,9 @@ void lcd_implementation_drawedit(const char* pstr, char* value) {
lcd_printPGM(pstr); lcd_printPGM(pstr);
lcd.print(':'); lcd.print(':');
lcd.setCursor(LCD_WIDTH - (LCD_WIDTH < 20 ? 0 : 1) - lcd_strlen(value), 1); lcd.setCursor(LCD_WIDTH - (LCD_WIDTH < 20 ? 0 : 1) - lcd_strlen(value), 1);
lcd.print(value); lcd_print(value);
} }
static void lcd_implementation_drawmenu_sd(bool sel, uint8_t row, const char* pstr, const char* filename, char* longFilename, uint8_t concat) { static void lcd_implementation_drawmenu_sd(bool sel, uint8_t row, const char* pstr, const char* filename, char* longFilename, uint8_t concat) {
char c; char c;
uint8_t n = LCD_WIDTH - concat; uint8_t n = LCD_WIDTH - concat;
@ -691,9 +702,8 @@ static void lcd_implementation_drawmenu_sd(bool sel, uint8_t row, const char* ps
longFilename[n] = '\0'; longFilename[n] = '\0';
} }
while ((c = *filename) && n > 0) { while ((c = *filename) && n > 0) {
lcd.print(c); n -= lcd_print(c);
filename++; filename++;
n--;
} }
while (n--) lcd.print(' '); while (n--) lcd.print(' ');
} }
@ -701,40 +711,16 @@ static void lcd_implementation_drawmenu_sd(bool sel, uint8_t row, const char* ps
static void lcd_implementation_drawmenu_sdfile(bool sel, uint8_t row, const char* pstr, const char* filename, char* longFilename) { static void lcd_implementation_drawmenu_sdfile(bool sel, uint8_t row, const char* pstr, const char* filename, char* longFilename) {
lcd_implementation_drawmenu_sd(sel, row, pstr, filename, longFilename, 1); lcd_implementation_drawmenu_sd(sel, row, pstr, filename, longFilename, 1);
} }
static void lcd_implementation_drawmenu_sddirectory(bool sel, uint8_t row, const char* pstr, const char* filename, char* longFilename) { static void lcd_implementation_drawmenu_sddirectory(bool sel, uint8_t row, const char* pstr, const char* filename, char* longFilename) {
lcd_implementation_drawmenu_sd(sel, row, pstr, filename, longFilename, 2); lcd_implementation_drawmenu_sd(sel, row, pstr, filename, longFilename, 2);
} }
#define lcd_implementation_drawmenu_back(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, LCD_STR_UPLEVEL[0], LCD_STR_UPLEVEL[0]) #define lcd_implementation_drawmenu_back(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, LCD_STR_UPLEVEL[0], LCD_STR_UPLEVEL[0])
#define lcd_implementation_drawmenu_submenu(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', LCD_STR_ARROW_RIGHT[0]) #define lcd_implementation_drawmenu_submenu(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', LCD_STR_ARROW_RIGHT[0])
#define lcd_implementation_drawmenu_gcode(sel, row, pstr, gcode) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', ' ') #define lcd_implementation_drawmenu_gcode(sel, row, pstr, gcode) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', ' ')
#define lcd_implementation_drawmenu_function(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', ' ') #define lcd_implementation_drawmenu_function(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', ' ')
static void lcd_implementation_quick_feedback()
{
#ifdef LCD_USE_I2C_BUZZER
#if defined(LCD_FEEDBACK_FREQUENCY_DURATION_MS) && defined(LCD_FEEDBACK_FREQUENCY_HZ)
lcd_buzz(LCD_FEEDBACK_FREQUENCY_DURATION_MS, LCD_FEEDBACK_FREQUENCY_HZ);
#else
lcd_buzz(1000/6, 100);
#endif
#elif defined(BEEPER) && BEEPER > -1
SET_OUTPUT(BEEPER);
#if !defined(LCD_FEEDBACK_FREQUENCY_HZ) || !defined(LCD_FEEDBACK_FREQUENCY_DURATION_MS)
const unsigned int delay = 100;
uint8_t i = 10;
#else
const unsigned int delay = 1000000 / LCD_FEEDBACK_FREQUENCY_HZ / 2;
int8_t i = LCD_FEEDBACK_FREQUENCY_DURATION_MS * LCD_FEEDBACK_FREQUENCY_HZ / 1000;
#endif
while (i--) {
WRITE(BEEPER,HIGH);
delayMicroseconds(delay);
WRITE(BEEPER,LOW);
delayMicroseconds(delay);
}
#endif
}
#ifdef LCD_HAS_STATUS_INDICATORS #ifdef LCD_HAS_STATUS_INDICATORS
static void lcd_implementation_update_indicators() static void lcd_implementation_update_indicators()
{ {

@ -0,0 +1,252 @@
#ifndef UTF_MAPPER_H
#define UTF_MAPPER_H
#include "language.h"
#ifdef DOGLCD
#define HARDWARE_CHAR_OUT u8g.print
#else
#define HARDWARE_CHAR_OUT lcd.write
#endif
#if !(defined( SIMULATE_ROMFONT )) && defined( DOGLCD )
#if defined( DISPLAY_CHARSET_ISO10646_1 )
#define MAPPER_ONE_TO_ONE
#elif defined( DISPLAY_CHARSET_ISO10646_5 )
#define MAPPER_ONE_TO_ONE
#elif defined( DISPLAY_CHARSET_ISO10646_KANA )
#define MAPPER_ONE_TO_ONE
#endif
#else // SIMULATE_ROMFONT
#if defined( DISPLAY_CHARSET_HD44780_JAPAN )
#if defined( MAPPER_C2C3 )
const PROGMEM uint8_t utf_recode[] =
{ // 0 1 2 3 4 5 6 7 8 9 a b c d e f This is fair for symbols
0x20,0x3f,0xec,0xed,0x3f,0x5c,0x7c,0x3f,0x22,0x63,0x61,0x7f,0x3f,0x3f,0x52,0xb0, // c2a
// ' ' ¢ £ ­ l " c a « R
0xdf,0x3f,0x32,0x33,0x27,0xe4,0xf1,0xa5,0x2c,0x31,0xdf,0x7e,0x3f,0x3f,0x3f,0x3f, // c2b but relatively bad for letters.
// ° 2 3 ` N p . , 1 ° »
0x3f,0x3f,0x3f,0x3f,0xe1,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f, // c38
// ä
0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0xef,0x78,0x3f,0x3f,0x3f,0x3f,0xf5,0x3f,0x3f,0xe2, // c39 missing characters display as '?'
// ö x ü ß
0x3f,0x3f,0x3f,0x3f,0xe1,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f, // c3a
// ä
0x3f,0xee,0x3f,0x3f,0x3f,0x3f,0xef,0xfd,0x3f,0x3f,0x3f,0x3f,0xf5,0x3f,0x3f,0x3f // c3b
// n ö ÷ ü
};
#elif defined( MAPPER_E382E383 )
const PROGMEM uint8_t utf_recode[] =
{ // 0 1 2 3 4 5 6 7 8 9 a b c d e f
0x3d,0xb1,0xb1,0xa8,0xb2,0xa9,0xb3,0xaa,0xb4,0xab,0xb5,0xb6,0xb6,0xb7,0xb7,0xb8, // e382a Please test and correct
// = ア ア ィ イ ゥ ウ ェ エ ォ オ ガ ガ キ キ ク
0xb8,0xb9,0xb9,0xba,0xba,0xbb,0xbb,0xbc,0xbc,0xbd,0xbd,0xbe,0xbe,0xbf,0xbf,0xc0, // e382b
// ク ケ ケ コ コ サ サ シ シ ス ス セ セ ソ ソ タ
0xc0,0xc1,0xc1,0xc2,0xc2,0xc2,0xc3,0xc3,0xc4,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca, // e3838
// タ チ チ ッ ッ ッ テ テ ト ト ナ ニ ヌ ネ
0xca,0xca,0xcb,0xcb,0xcb,0xcc,0xcc,0xcc,0xcd,0xcd,0xcd,0xce,0xce,0xce,0xcf,0xd0, // e3839
// ハ ハ ヒ ヒ ヒ フ フ フ ヘ ヘ ヘ ホ ホ ホ マ ミ
0xd1,0xd2,0xd3,0xd4,0xd4,0xd5,0xd5,0xae,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xdc, // e383a
// ム メ モ ャ ャ ユ ユ ョ ヨ ラ リ ル レ ロ ワ ワ
0xec,0xa7,0xa6,0xdd,0xcc,0x3f,0x3f,0x3f,0x3f,0x3f,0xa6,0xa5,0xb0,0xa4,0xa4,0x3f // e383b
// ヰ ヱ ヲ ン フ ? ? ? ? ? ヲ ・ ー ヽ ヽ ?
};
#elif defined( MAPPER_D0D1 )
#error( "Cyrillic on a japanese dsplay makes no sense. There are no matching symbols.");
#endif
#elif defined( DISPLAY_CHARSET_HD44780_WESTERN )
#if defined( MAPPER_C2C3 )
:
const PROGMEM uint8_t utf_recode[] =
{ // 0 1 2 3 4 5 6 7 8 9 a b c d e f This is relative complete.
0x20,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0x22,0xa9,0xaa,0xab,0x3f,0x3f,0xae,0x3f, // c2a ¡¢£¤¥¦§¨©ª«¬­®¯
// ' ' ¡ ¢ £ ¤ ¥ ¦ § " © ª « ? ? ® ?
0xb0,0xb1,0xb2,0xb3,0x27,0xb5,0xb6,0xb7,0x2c,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf, // c2b °±²³´µ¶·¸¹º»¼½¾¿
// ° ± ³ ² ? µ ¶ · , ¹ º » ¼ ½ ¾ ¿
0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf, // c38 ÀÁÃÄÅÆÇÈÉÊËÌÍÎÏ
// À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï
0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf, // c39 ÐÑÓÔÕÖ×ØÙÚÛÜÝÞß
// Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß
0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef, // c3a àáãäåæçèéêëìíîï
// à á â ã ä å æ ç è é ê ë ì í î ï
0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff // c3b ðñóôõö÷øùúûüýþÿ
// ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ
};
#elif defined( MAPPER_D0D1 )
#define MAPPER_D0D1_MOD
const PROGMEM uint8_t utf_recode[] =
{//0 1 2 3 4 5 6 7 8 9 a b c d e f
0x41,0x80,0x42,0x92,0x81,0x45,0x82,0x83,0x84,0x85,0x4b,0x86,0x4d,0x48,0x4f,0x87, // d0a
// A Б B Г Д E Ж З И Й K Л M H O П
0x50,0x43,0x54,0x88,0xd8,0x58,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x62,0x8f,0xac,0xad, // d0b
// P C T У Ф X Ч ч Ш Щ Ъ Ы b Э Ю Я
0x61,0x36,0x42,0x92,0x81,0x65,0x82,0xb3,0x84,0x85,0x6b,0x86,0x4d,0x48,0x6f,0x87, // d18
// a 6 B Г Д e Ж ³ И Й k Л M H o П
0x70,0x63,0x54,0x79,0xd8,0x78,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x62,0x8f,0xac,0xad // d19
// p c T y Ф x Ч ч Ш Щ Ъ Ы b Э Ю Я
};
#elif defined( MAPPER_E382E383 )
#error( "Katakana on a western display makes no sense. There are no matching symbols." );
#endif
#elif defined( DISPLAY_CHARSET_HD44780_CYRILLIC )
#if defined( MAPPER_D0D1 )
#define MAPPER_D0D1_MOD
// it is a Russian alphabet translation
// except 0401 --> 0xa2 = Ё, 0451 --> 0xb5 = ё
const PROGMEM uint8_t utf_recode[] =
{ 0x41,0xa0,0x42,0xa1,0xe0,0x45,0xa3,0xa4, // unicode U+0400 to U+047f
// A Б->Ё B Г Д E Ж З // 0 Ѐ Ё Ђ Ѓ Є Ѕ І Ї
0xa5,0xa6,0x4b,0xa7,0x4d,0x48,0x4f,0xa8, // Ј Љ Њ Ћ Ќ Ѝ Ў Џ
// И Й K Л M H O П // 1 А Б В Г Д Е Ж З
0x50,0x43,0x54,0xa9,0xaa,0x58,0xe1,0xab, // И Й К Л М Н О П
// P C T У Ф X Ч ч // 2 Р С Т У Ф Х Г Ч
0xac,0xe2,0xad,0xae,0x62,0xaf,0xb0,0xb1, // Ш Щ Ъ Ы Ь Э Ю Я
// Ш Щ Ъ Ы b Э Ю Я // 3 а б в г д е ж з
0x61,0xb2,0xb3,0xb4,0xe3,0x65,0xb6,0xb7, // и й к л м н о п
// a б->ё в г д e ж з // 4 р с т у ф х ц ч
0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0x6f,0xbe, // ш щ ъ ы ь э ю я
// и й к л м н o п // 5 ѐ ё ђ ѓ є ѕ і ї
0x70,0x63,0xbf,0x79,0xe4,0x78,0xe5,0xc0, // ј љ њ ћ ќ ѝ ў џ
// p c т y ф x ц ч // 6 Ѡ ѡ Ѣ ѣ Ѥ ѥ Ѧ ѧ
0xc1,0xe6,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7 // Ѫ ѩ Ѫ ѫ Ѭ ѭ Ѯ ѯ
// ш щ ъ ы ь э ю я // 7 Ѱ ѱ Ѳ ѳ Ѵ ѵ Ѷ ѷ
}; // ѻ ѹ Ѻ ѻ Ѽ ѽ Ѿ ѿ
#elif defined( MAPPER_C2C3 )
#error( "Western languages on a cyrillic display makes no sense. There are no matching symbols." );
#elif defined( MAPPER_E382E383 )
#error( "Katakana on a cyrillic display makes no sense. There are no matching symbols." );
#endif
#else
#error("Something went wrong in the selection of DISPLAY_CHARSET_HD44780's");
#endif // DISPLAY_CHARSET_HD44780_CYRILLIC
#endif // SIMULATE_ROMFONT
#if defined( MAPPER_NON )
char charset_mapper(char c){
HARDWARE_CHAR_OUT( c );
return 1;
}
#elif defined( MAPPER_C2C3 )
uint8_t utf_hi_char; // UTF-8 high part
bool seen_c2 = false;
char charset_mapper(char c){
uint8_t d = c;
if ( d >= 0x80 ) { // UTF-8 handling
if ( (d >= 0xc0) && (!seen_c2) ) {
utf_hi_char = d - 0xc2;
seen_c2 = true;
return 0;
}
else if (seen_c2){
d &= 0x3f;
#ifndef MAPPER_ONE_TO_ONE
HARDWARE_CHAR_OUT( (char) pgm_read_byte_near( utf_recode + d + ( utf_hi_char << 6 ) - 0x20 ) );
#else
HARDWARE_CHAR_OUT( (char) (0x80 + ( utf_hi_char << 6 ) + d) ) ;
#endif
}
else {
HARDWARE_CHAR_OUT('?');
}
}
else {
HARDWARE_CHAR_OUT((char) c );
}
seen_c2 = false;
return 1;
}
#elif defined( MAPPER_D0D1_MOD )
uint8_t utf_hi_char; // UTF-8 high part
bool seen_d5 = false;
char charset_mapper(char c){
// it is a Russian alphabet translation
// except 0401 --> 0xa2 = Ё, 0451 --> 0xb5 = ё
uint8_t d = c;
if ( d >= 0x80 ) { // UTF-8 handling
if ((d >= 0xd0) && (!seen_d5)) {
utf_hi_char = d - 0xd0;
seen_d5 = true;
return 0;
} else if (seen_d5) {
d &= 0x3f;
if ( !utf_hi_char && ( d == 1 )) {
HARDWARE_CHAR_OUT((char) 0xa2 ); // Ё
} else if ((utf_hi_char == 1) && (d == 0x11)) {
HARDWARE_CHAR_OUT((char) 0xb5 ); // ё
} else {
HARDWARE_CHAR_OUT((char) pgm_read_byte_near( utf_recode + d + ( utf_hi_char << 6 ) - 0x10 ) );
}
}
else {
HARDWARE_CHAR_OUT('?');
}
} else {
HARDWARE_CHAR_OUT((char) c );
}
seen_d5 = false;
return 1;
}
#elif defined( MAPPER_D0D1 )
uint8_t utf_hi_char; // UTF-8 high part
bool seen_d5 = false;
char charset_mapper(char c){
uint8_t d = c;
if ( d >= 0x80u ) { // UTF-8 handling
if ((d >= 0xd0u) && (!seen_d5)) {
utf_hi_char = d - 0xd0u;
seen_d5 = true;
return 0;
} else if (seen_d5) {
d &= 0x3fu;
#ifndef MAPPER_ONE_TO_ONE
HARDWARE_CHAR_OUT( (char) pgm_read_byte_near( utf_recode + d + ( utf_hi_char << 6 ) - 0x20 ) );
#else
HARDWARE_CHAR_OUT( (char) (0xa0u + ( utf_hi_char << 6 ) + d ) ) ;
#endif
} else {
HARDWARE_CHAR_OUT('?');
}
} else {
HARDWARE_CHAR_OUT((char) c );
}
seen_d5 = false;
return 1;
}
#elif defined( MAPPER_E382E383 )
uint8_t utf_hi_char; // UTF-8 high part
bool seen_e3 = false;
bool seen_82_83 = false;
char charset_mapper(char c){
uint8_t d = c;
if ( d >= 0x80 ) { // UTF-8 handling
if ( (d == 0xe3) && (seen_e3 == false)) {
seen_e3 = true;
return 0; // eat 0xe3
} else if ( (d >= 0x82) && (seen_e3 == true) && (seen_82_83 == false)) {
utf_hi_char = d - 0x82;
seen_82_83 = true;
return 0;
} else if ((seen_e3 == true) && (seen_82_83 == true)){
d &= 0x3f;
#ifndef MAPPER_ONE_TO_ONE
HARDWARE_CHAR_OUT( (char) pgm_read_byte_near( utf_recode + d + ( utf_hi_char << 6 ) - 0x20 ) );
#else
HARDWARE_CHAR_OUT( (char) (0x80 + ( utf_hi_char << 6 ) + d ) ) ;
#endif
} else {
HARDWARE_CHAR_OUT((char) '?' );
}
} else {
HARDWARE_CHAR_OUT((char) c );
}
seen_e3 = false;
seen_82_83 = false;
return 1;
}
#else
#error "You have to define one of the DISPLAY_INPUT_CODE_MAPPERs in your language_xx.h file" // should not occur because (en) will set.
#endif // code mappers
#endif // UTF_MAPPER_H

@ -26,57 +26,40 @@ vector_3::vector_3() : x(0), y(0), z(0) { }
vector_3::vector_3(float x_, float y_, float z_) : x(x_), y(y_), z(z_) { } vector_3::vector_3(float x_, float y_, float z_) : x(x_), y(y_), z(z_) { }
vector_3 vector_3::cross(vector_3 left, vector_3 right) vector_3 vector_3::cross(vector_3 left, vector_3 right) {
{
return vector_3(left.y * right.z - left.z * right.y, return vector_3(left.y * right.z - left.z * right.y,
left.z * right.x - left.x * right.z, left.z * right.x - left.x * right.z,
left.x * right.y - left.y * right.x); left.x * right.y - left.y * right.x);
} }
vector_3 vector_3::operator+(vector_3 v) vector_3 vector_3::operator+(vector_3 v) { return vector_3((x + v.x), (y + v.y), (z + v.z)); }
{ vector_3 vector_3::operator-(vector_3 v) { return vector_3((x - v.x), (y - v.y), (z - v.z)); }
return vector_3((x + v.x), (y + v.y), (z + v.z));
}
vector_3 vector_3::operator-(vector_3 v)
{
return vector_3((x - v.x), (y - v.y), (z - v.z));
}
vector_3 vector_3::get_normal() vector_3 vector_3::get_normal() {
{
vector_3 normalized = vector_3(x, y, z); vector_3 normalized = vector_3(x, y, z);
normalized.normalize(); normalized.normalize();
return normalized; return normalized;
} }
float vector_3::get_length() float vector_3::get_length() { return sqrt((x * x) + (y * y) + (z * z)); }
{
float length = sqrt((x * x) + (y * y) + (z * z));
return length;
}
void vector_3::normalize() void vector_3::normalize() {
{
float length = get_length(); float length = get_length();
x /= length; x /= length;
y /= length; y /= length;
z /= length; z /= length;
} }
void vector_3::apply_rotation(matrix_3x3 matrix) void vector_3::apply_rotation(matrix_3x3 matrix) {
{
float resultX = x * matrix.matrix[3*0+0] + y * matrix.matrix[3*1+0] + z * matrix.matrix[3*2+0]; float resultX = x * matrix.matrix[3*0+0] + y * matrix.matrix[3*1+0] + z * matrix.matrix[3*2+0];
float resultY = x * matrix.matrix[3*0+1] + y * matrix.matrix[3*1+1] + z * matrix.matrix[3*2+1]; float resultY = x * matrix.matrix[3*0+1] + y * matrix.matrix[3*1+1] + z * matrix.matrix[3*2+1];
float resultZ = x * matrix.matrix[3*0+2] + y * matrix.matrix[3*1+2] + z * matrix.matrix[3*2+2]; float resultZ = x * matrix.matrix[3*0+2] + y * matrix.matrix[3*1+2] + z * matrix.matrix[3*2+2];
x = resultX; x = resultX;
y = resultY; y = resultY;
z = resultZ; z = resultZ;
} }
void vector_3::debug(char* title) void vector_3::debug(const char title[]) {
{
SERIAL_PROTOCOL(title); SERIAL_PROTOCOL(title);
SERIAL_PROTOCOLPGM(" x: "); SERIAL_PROTOCOLPGM(" x: ");
SERIAL_PROTOCOL_F(x, 6); SERIAL_PROTOCOL_F(x, 6);
@ -87,8 +70,7 @@ void vector_3::debug(char* title)
SERIAL_EOL; SERIAL_EOL;
} }
void apply_rotation_xyz(matrix_3x3 matrix, float &x, float& y, float& z) void apply_rotation_xyz(matrix_3x3 matrix, float &x, float& y, float& z) {
{
vector_3 vector = vector_3(x, y, z); vector_3 vector = vector_3(x, y, z);
vector.apply_rotation(matrix); vector.apply_rotation(matrix);
x = vector.x; x = vector.x;
@ -96,8 +78,7 @@ void apply_rotation_xyz(matrix_3x3 matrix, float &x, float& y, float& z)
z = vector.z; z = vector.z;
} }
matrix_3x3 matrix_3x3::create_from_rows(vector_3 row_0, vector_3 row_1, vector_3 row_2) matrix_3x3 matrix_3x3::create_from_rows(vector_3 row_0, vector_3 row_1, vector_3 row_2) {
{
//row_0.debug("row_0"); //row_0.debug("row_0");
//row_1.debug("row_1"); //row_1.debug("row_1");
//row_2.debug("row_2"); //row_2.debug("row_2");
@ -106,19 +87,16 @@ matrix_3x3 matrix_3x3::create_from_rows(vector_3 row_0, vector_3 row_1, vector_3
new_matrix.matrix[3] = row_1.x; new_matrix.matrix[4] = row_1.y; new_matrix.matrix[5] = row_1.z; new_matrix.matrix[3] = row_1.x; new_matrix.matrix[4] = row_1.y; new_matrix.matrix[5] = row_1.z;
new_matrix.matrix[6] = row_2.x; new_matrix.matrix[7] = row_2.y; new_matrix.matrix[8] = row_2.z; new_matrix.matrix[6] = row_2.x; new_matrix.matrix[7] = row_2.y; new_matrix.matrix[8] = row_2.z;
//new_matrix.debug("new_matrix"); //new_matrix.debug("new_matrix");
return new_matrix; return new_matrix;
} }
void matrix_3x3::set_to_identity() void matrix_3x3::set_to_identity() {
{
matrix[0] = 1; matrix[1] = 0; matrix[2] = 0; matrix[0] = 1; matrix[1] = 0; matrix[2] = 0;
matrix[3] = 0; matrix[4] = 1; matrix[5] = 0; matrix[3] = 0; matrix[4] = 1; matrix[5] = 0;
matrix[6] = 0; matrix[7] = 0; matrix[8] = 1; matrix[6] = 0; matrix[7] = 0; matrix[8] = 1;
} }
matrix_3x3 matrix_3x3::create_look_at(vector_3 target) matrix_3x3 matrix_3x3::create_look_at(vector_3 target) {
{
vector_3 z_row = target.get_normal(); vector_3 z_row = target.get_normal();
vector_3 x_row = vector_3(1, 0, -target.x/target.z).get_normal(); vector_3 x_row = vector_3(1, 0, -target.x/target.z).get_normal();
vector_3 y_row = vector_3::cross(z_row, x_row).get_normal(); vector_3 y_row = vector_3::cross(z_row, x_row).get_normal();
@ -127,7 +105,6 @@ matrix_3x3 matrix_3x3::create_look_at(vector_3 target)
// y_row.debug("y_row"); // y_row.debug("y_row");
// z_row.debug("z_row"); // z_row.debug("z_row");
// create the matrix already correctly transposed // create the matrix already correctly transposed
matrix_3x3 rot = matrix_3x3::create_from_rows(x_row, y_row, z_row); matrix_3x3 rot = matrix_3x3::create_from_rows(x_row, y_row, z_row);
@ -135,9 +112,7 @@ matrix_3x3 matrix_3x3::create_look_at(vector_3 target)
return rot; return rot;
} }
matrix_3x3 matrix_3x3::transpose(matrix_3x3 original) {
matrix_3x3 matrix_3x3::transpose(matrix_3x3 original)
{
matrix_3x3 new_matrix; matrix_3x3 new_matrix;
new_matrix.matrix[0] = original.matrix[0]; new_matrix.matrix[1] = original.matrix[3]; new_matrix.matrix[2] = original.matrix[6]; new_matrix.matrix[0] = original.matrix[0]; new_matrix.matrix[1] = original.matrix[3]; new_matrix.matrix[2] = original.matrix[6];
new_matrix.matrix[3] = original.matrix[1]; new_matrix.matrix[4] = original.matrix[4]; new_matrix.matrix[5] = original.matrix[7]; new_matrix.matrix[3] = original.matrix[1]; new_matrix.matrix[4] = original.matrix[4]; new_matrix.matrix[5] = original.matrix[7];
@ -145,11 +120,12 @@ matrix_3x3 matrix_3x3::transpose(matrix_3x3 original)
return new_matrix; return new_matrix;
} }
void matrix_3x3::debug(char* title) { void matrix_3x3::debug(const char title[]) {
SERIAL_PROTOCOLLN(title); SERIAL_PROTOCOLLN(title);
int count = 0; int count = 0;
for(int i=0; i<3; i++) { for(int i=0; i<3; i++) {
for(int j=0; j<3; j++) { for(int j=0; j<3; j++) {
if (matrix[count] >= 0.0) SERIAL_PROTOCOLPGM("+");
SERIAL_PROTOCOL_F(matrix[count], 6); SERIAL_PROTOCOL_F(matrix[count], 6);
SERIAL_PROTOCOLPGM(" "); SERIAL_PROTOCOLPGM(" ");
count++; count++;
@ -158,5 +134,5 @@ void matrix_3x3::debug(char* title) {
} }
} }
#endif // #ifdef ENABLE_AUTO_BED_LEVELING #endif // ENABLE_AUTO_BED_LEVELING

@ -37,7 +37,7 @@ struct vector_3
float get_length(); float get_length();
vector_3 get_normal(); vector_3 get_normal();
void debug(char* title); void debug(const char title[]);
void apply_rotation(matrix_3x3 matrix); void apply_rotation(matrix_3x3 matrix);
}; };
@ -52,7 +52,7 @@ struct matrix_3x3
void set_to_identity(); void set_to_identity();
void debug(char* title); void debug(const char title[]);
}; };

@ -10,6 +10,7 @@
* [Auto Bed Leveling](/Documentation/BedLeveling.md) * [Auto Bed Leveling](/Documentation/BedLeveling.md)
* [Filament Sensor](/Documentation/FilamentSensor.md) * [Filament Sensor](/Documentation/FilamentSensor.md)
* [Ramps Servo Power](/Documentation/RampsServoPower.md) * [Ramps Servo Power](/Documentation/RampsServoPower.md)
* [LCD Language - Font - System](Documentation/LCDLanguageFont.md)
* [Mesh Bed Leveling](/Documentation/MeshBedLeveling.md) * [Mesh Bed Leveling](/Documentation/MeshBedLeveling.md)
##### [RepRap.org Wiki Page](http://reprap.org/wiki/Marlin) ##### [RepRap.org Wiki Page](http://reprap.org/wiki/Marlin)

Loading…
Cancel
Save