Merge branch 'MK3' of https://github.com/prusa3d/Prusa-Firmware into 2091_2153_sheet_Mcode

This commit is contained in:
vintagepc 2020-01-19 08:58:56 -05:00
commit 8457edfc2b
86 changed files with 15516 additions and 17884 deletions

14
.editorconfig Normal file
View File

@ -0,0 +1,14 @@
#-*-mode:conf-*-
# editorconfig file (see EditorConfig.org)
root = true
[*]
end_of_line = lf
insert_final_newline = true
charset = utf-8
trim_trailing_whitespace = true
indent_style = space
indent_size = 4
tab_width = 4
max_line_length = 100

31
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@ -0,0 +1,31 @@
---
name: Bug report
about: Create a report to help us improve
title: "[BUG]<Enter comprehensive title>"
labels: bug
assignees: ''
---
Please, before you create a new bug report, please make sure you searched in open and closed issues and couldn't find anything that matches.
**Printer type** - [e.g. MK3S, MK3, MK2.5S, MK2.5, MK2S, MK2]
**Printer firmware version**- [e.g. 3.8.1, 3.8.1-RC1, ...]
**MMU Upgrade** - [e.g. MMU2S, MMU2, MMU1]
**MMU upgrade firmware version [e.g. 1.0.6, 1.0.6-RC2, ...]
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Please describe steps to reproduce the behavior.
**Expected behavior**
A clear and concise description of what you expected to happen.
**G-code**
Please attach a G-code. This will make it easier for us to replicate the error.
**Video**
Please attach a video. It usually helps to solve the problem.

20
.github/ISSUE_TEMPLATE/enhancement.md vendored Normal file
View File

@ -0,0 +1,20 @@
---
name: Enhancement
about: Suggest an idea for this project
title: " [ENHANCEMENT]<Enter comprehensive title>"
labels: enhancement
assignees: ''
---
Please, before you create a new feature request, please make sure you searched in open and closed issues and couldn't find anything that matches.
Enter what type of printer or upgrade the enhancement applies to.
**Printer type** - [e.g. MK3S, MK3, MK2.5S, MK2.5, MK2S, MK2]
**MMU Upgrade** - [e.g. MMU2S, MMU2, MMU1]
**Is your enhancement related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.

View File

@ -0,0 +1,20 @@
---
name: Feature request
about: Suggest an idea for this project
title: "[FEATURE REQUEST]<Enter comprehensive title>"
labels: feature request
assignees: ''
---
Please, before you create a new feature request, please make sure you searched in open and closed issues and couldn't find anything that matches.
If it makes sense, enter what type of printer or upgrade the feature request applies to.
**Printer type** - [e.g. MK3S, MK3, MK2.5S, MK2.5, MK2S, MK2]
**MMU Upgrade** - [e.g. MMU2S, MMU2, MMU1]
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.

12
.github/ISSUE_TEMPLATE/question.md vendored Normal file
View File

@ -0,0 +1,12 @@
---
name: Question
about: What do you want to know?
title: "[QUESTION]<Enter comprehensive title>"
labels: question
assignees: ''
---
Please, before you create a new question, please make sure you searched in open and closed issues and couldn't find anything that matches.
**What is your question?**

View File

@ -16,8 +16,8 @@ extern uint16_t nPrinterType;
extern PGM_P sPrinterName;
// Firmware version
#define FW_VERSION "3.8.0"
#define FW_COMMIT_NR 2684
#define FW_VERSION "3.9.0"
#define FW_COMMIT_NR 3175
// FW_VERSION_UNKNOWN means this is an unofficial build.
// The firmware should only be checked into github with this symbol.
#define FW_DEV_VERSION FW_VERSION_UNKNOWN
@ -113,11 +113,6 @@ extern PGM_P sPrinterName;
// #define PS_DEFAULT_OFF
// This makes temp sensor 1 a redundant sensor for sensor 0. If the temperatures difference between these sensors is to high the print will be aborted.
//#define TEMP_SENSOR_1_AS_REDUNDANT
#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10
// Actual temperature must be close to target for this long before M109 returns success
#define TEMP_RESIDENCY_TIME 3 // (seconds)
#define TEMP_HYSTERESIS 5 // (degC) range of +/- temperatures considered "close" to the target one
@ -350,7 +345,7 @@ your extruder heater takes 2 minutes to hit the target on heating.
#define Y_PROBE_OFFSET_FROM_EXTRUDER -29
#define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35
#define Z_RAISE_BEFORE_HOMING 4 // (in mm) Raise Z before homing (G28) for Probe Clearance.
#define Z_RAISE_BEFORE_HOMING 5 // (in mm) Raise Z before homing (G28) for Probe Clearance.
// Be sure you have this distance over your Z_MAX_POS in case
#define XY_TRAVEL_SPEED 8000 // X and Y axis travel speed between probes, in mm/min
@ -554,6 +549,12 @@ enum CalibrationStatus
CALIBRATION_STATUS_UNKNOWN = 0,
};
// Try to maintain a minimum distance from the bed even when Z is
// unknown when doing the following operations
#define MIN_Z_FOR_LOAD 50
#define MIN_Z_FOR_UNLOAD 20
#define MIN_Z_FOR_PREHEAT 10
#include "Configuration_adv.h"
#include "thermistortables.h"

View File

@ -165,8 +165,8 @@ void Config_PrintSettings(uint8_t level)
#endif
if (level >= 10) {
#ifdef LIN_ADVANCE
printf_P(PSTR("%SLinear advance settings:\n M900 K%.2f E/D = %.2f\n"),
echomagic, extruder_advance_k, advance_ed_ratio);
printf_P(PSTR("%SLinear advance settings:%S M900 K%.2f\n"),
echomagic, echomagic, extruder_advance_K);
#endif //LIN_ADVANCE
}
}

View File

@ -10,14 +10,6 @@
#endif
#define BED_CHECK_INTERVAL 5000 //ms between checks in bang-bang control
//// Heating sanity check:
// This waits for the watch period in milliseconds whenever an M104 or M109 increases the target temperatureLCD_PROGRESS_BAR
// If the temperature has not increased at the end of that period, the target temperature is set to zero.
// It can be reset with another M104/M109. This check is also only triggered if the target temperature and the current temperature
// differ by at least 2x WATCH_TEMP_INCREASE
//#define WATCH_TEMP_PERIOD 40000 //40 seconds
//#define WATCH_TEMP_INCREASE 10 //Heat up at least 10 degree in 20 seconds
#ifdef PIDTEMP
// this adds an experimental additional term to the heating power, proportional to the extrusion speed.
// if Kc is chosen well, the additional required power due to increased melting should be compensated.
@ -276,43 +268,29 @@
#endif
/**
* Implementation of linear pressure control
*
* Assumption: advance = k * (delta velocity)
* K=0 means advance disabled.
* See Marlin documentation for calibration instructions.
*/
* Linear Pressure Control v1.5
*
* Assumption: advance [steps] = k * (delta velocity [steps/s])
* K=0 means advance disabled.
*
* NOTE: K values for LIN_ADVANCE 1.5 differs from earlier versions!
*
* Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak.
* Larger K values will be needed for flexible filament and greater distances.
* If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk)
* print acceleration will be reduced during the affected moves to keep within the limit.
*
* See http://marlinfw.org/docs/features/lin_advance.html for full instructions.
* Mention @Sebastianv650 on GitHub to alert the author of any issues.
*/
#define LIN_ADVANCE
#ifdef LIN_ADVANCE
#define LIN_ADVANCE_K 0 //Try around 45 for PLA, around 25 for ABS.
/**
* Some Slicers produce Gcode with randomly jumping extrusion widths occasionally.
* For example within a 0.4mm perimeter it may produce a single segment of 0.05mm width.
* While this is harmless for normal printing (the fluid nature of the filament will
* close this very, very tiny gap), it throws off the LIN_ADVANCE pressure adaption.
*
* For this case LIN_ADVANCE_E_D_RATIO can be used to set the extrusion:distance ratio
* to a fixed value. Note that using a fixed ratio will lead to wrong nozzle pressures
* if the slicer is using variable widths or layer heights within one print!
*
* This option sets the default E:D ratio at startup. Use `M900` to override this value.
*
* Example: `M900 W0.4 H0.2 D1.75`, where:
* - W is the extrusion width in mm
* - H is the layer height in mm
* - D is the filament diameter in mm
*
* Example: `M900 R0.0458` to set the ratio directly.
*
* Set to 0 to auto-detect the ratio based on given Gcode G1 print moves.
*
* Slic3r (including Prusa Slic3r) produces Gcode compatible with the automatic mode.
* Cura (as of this writing) may produce Gcode incompatible with the automatic mode.
*/
#define LIN_ADVANCE_E_D_RATIO 0 // The calculated ratio (or 0) according to the formula W * H / ((D / 2) ^ 2 * PI)
// Example: 0.4 * 0.2 / ((1.75 / 2) ^ 2 * PI) = 0.033260135
#define LIN_ADVANCE_K 0 // Unit: mm compression per 1mm/s extruder speed
//#define LA_NOCOMPAT // Disable Linear Advance 1.0 compatibility
//#define LA_LIVE_K // Allow adjusting K in the Tune menu
//#define LA_DEBUG // If enabled, this will generate debug information output over USB.
//#define LA_DEBUG_LOGIC // @wavexx: setup logic channels for isr debugging
#endif
// Arc interpretation settings:
@ -400,10 +378,6 @@ const unsigned int dropsegments=5; //everything with less than this number of st
//============================= Define Defines ============================
//===========================================================================
#if EXTRUDERS > 1 && defined TEMP_SENSOR_1_AS_REDUNDANT
#error "You cannot use TEMP_SENSOR_1_AS_REDUNDANT if EXTRUDERS > 1"
#endif
#if EXTRUDERS > 1 && defined HEATERS_PARALLEL
#error "You cannot use HEATERS_PARALLEL if EXTRUDERS > 1"
#endif

View File

@ -99,6 +99,18 @@ void print_mem(uint32_t address, uint16_t count, uint8_t type, uint8_t countperl
#ifdef DEBUG_DCODE3
#define EEPROM_SIZE 0x1000
/*!
*
### D3 - Read/Write EEPROM <a href="https://reprap.org/wiki/G-code#D3:_Read.2FWrite_EEPROM">D3: Read/Write EEPROM</a>
This command can be used without any additional parameters. It will read the entire eeprom.
D3 [ A | C | X ]
- `A` - Address (0x0000-0x0fff)
- `C` - Count (0x0001-0x1000)
- `X` - Data
*
*/
void dcode_3()
{
DBG(_N("D3 - Read/Write EEPROM\n"));
@ -176,6 +188,14 @@ extern float axis_steps_per_unit[NUM_AXIS];
#endif //0
#define LOG(args...)
/*!
*
### D-1 - Endless Loop <a href="https://reprap.org/wiki/G-code#G28:_Move_to_Origin_.28Home.29">D-1: Endless Loop</a>
D-1
*
*/
void dcode__1()
{
printf_P(PSTR("D-1 - Endless loop\n"));
@ -185,6 +205,15 @@ void dcode__1()
#ifdef DEBUG_DCODES
/*!
*
### D0 - Reset <a href="https://reprap.org/wiki/G-code#D0:_Reset">D0: Reset</a>
D0 [ B ]
- `B` - Bootloader
*
*/
void dcode_0()
{
if (*(strchr_pointer + 1) == 0) return;
@ -203,6 +232,14 @@ void dcode_0()
}
}
/*!
*
### D1 - Clear EEPROM and RESET <a href="https://reprap.org/wiki/G-code#D1:_Clear_EEPROM_and_RESET">D1: Clear EEPROM and RESET</a>
D1
*
*/
void dcode_1()
{
LOG("D1 - Clear EEPROM and RESET\n");
@ -213,6 +250,18 @@ void dcode_1()
while(1);
}
/*!
*
### D2 - Read/Write RAM <a href="https://reprap.org/wiki/G-code#D2:_Read.2FWrite_RAM">D3: Read/Write RAM</a>
This command can be used without any additional parameters. It will read the entire RAM.
D3 [ A | C | X ]
- `A` - Address (0x0000-0x1fff)
- `C` - Count (0x0001-0x2000)
- `X` - Data
*
*/
void dcode_2()
{
LOG("D2 - Read/Write RAM\n");
@ -256,6 +305,19 @@ void dcode_2()
}*/
}
/*!
*
### D4 - Read/Write PIN <a href="https://reprap.org/wiki/G-code#D4:_Read.2FWrite_PIN">D4: Read/Write PIN</a>
To read the digital value of a pin you need only to define the pin number.
D4 [ P | F | V ]
- `P` - Pin (0-255)
- `F` - Function in/out (0/1)
- `V` - Value (0/1)
*
*/
void dcode_4()
{
LOG("D4 - Read/Write PIN\n");
@ -288,6 +350,19 @@ void dcode_4()
#ifdef DEBUG_DCODE5
/*!
*
### D5 - Read/Write FLASH <a href="https://reprap.org/wiki/G-code#D5:_Read.2FWrite_FLASH">D5: Read/Write Flash</a>
This command can be used without any additional parameters. It will read the 1kb FLASH.
D3 [ A | C | X | E ]
- `A` - Address (0x00000-0x3ffff)
- `C` - Count (0x0001-0x2000)
- `X` - Data
- `E` - Erase
*
*/
void dcode_5()
{
printf_P(PSTR("D5 - Read/Write FLASH\n"));
@ -351,11 +426,25 @@ void dcode_5()
#ifdef DEBUG_DCODES
/*!
*
### D6 - Read/Write external FLASH <a href="https://reprap.org/wiki/G-code#D6:_Read.2FWrite_external_FLASH">D6: Read/Write external Flash</a>
Reserved
*
*/
void dcode_6()
{
LOG("D6 - Read/Write external FLASH\n");
}
/*!
*
### D7 - Read/Write Bootloader <a href="https://reprap.org/wiki/G-code#D7:_Read.2FWrite_Bootloader">D7: Read/Write Bootloader</a>
Reserved
*
*/
void dcode_7()
{
LOG("D7 - Read/Write Bootloader\n");
@ -371,6 +460,18 @@ void dcode_7()
*/
}
/*!
*
### D8 - Read/Write PINDA <a href="https://reprap.org/wiki/G-code#D8:_Read.2FWrite_PINDA">D8: Read/Write PINDA</a>
D8 [ ? | ! | P | Z ]
- `?` - Read PINDA temperature shift values
- `!` - Reset PINDA temperature shift values to default
- `P` - Pinda temperature [C]
- `Z` - Z Offset [mm]
*
*/
void dcode_8()
{
printf_P(PSTR("D8 - Read/Write PINDA\n"));
@ -412,6 +513,23 @@ void dcode_8()
printf_P(PSTR("temp_pinda=%d offset_z=%d.%03d\n"), (int)temp_pinda, (int)offset_z, ((int)(1000 * offset_z) % 1000));
}
/*!
*
### D9 - Read ADC <a href="https://reprap.org/wiki/G-code#D9:_Read.2FWrite_ADC">D9: Read ADC</a>
D9 [ I | V ]
- `I` - ADC channel index
- `0` - Heater 0 temperature
- `1` - Heater 1 temperature
- `2` - Bed temperature
- `3` - PINDA temperature
- `4` - PWR voltage
- `5` - Ambient temperature
- `6` - BED voltage
- `V` Value to be written as simulated
*
*/
const char* dcode_9_ADC_name(uint8_t i)
{
switch (i)
@ -485,12 +603,24 @@ void dcode_9()
}
}
/*!
*
### D10 - Set XYZ calibration = OK <a href="https://reprap.org/wiki/G-code#D10:_Set_XYZ_calibration_.3D_OK">D10: Set XYZ calibration = OK</a>
*
*/
void dcode_10()
{//Tell the printer that XYZ calibration went OK
LOG("D10 - XYZ calibration = OK\n");
calibration_status_store(CALIBRATION_STATUS_LIVE_ADJUST);
}
/*!
*
### D12 - Time <a href="https://reprap.org/wiki/G-code#D12:_Time">D12: Time</a>
*
*/
void dcode_12()
{//Time
LOG("D12 - Time\n");
@ -636,6 +766,20 @@ void dcode_2130()
#endif //TMC2130
#ifdef PAT9125
/*!
*
### D9125 - PAT9125 filament sensor <a href="https://reprap.org/wiki/G-code#D9:_Read.2FWrite_ADC">D9125: PAT9125 filament sensor</a>
D9125 [ ? | ! | R | X | Y | L ]
- `?` - Print values
- `!` - Print values
- `R` - Resolution. Not active in code
- `X` - X values
- `Y` - Y values
- `L` - Activate filament sensor log
*
*/
void dcode_9125()
{
LOG("D9125 - PAT9125\n");

View File

@ -296,6 +296,7 @@ void setPwmFrequency(uint8_t pin, int val);
extern bool fans_check_enabled;
extern float homing_feedrate[];
extern bool axis_relative_modes[];
extern float feedrate;
extern int feedmultiply;
extern int extrudemultiply; // Sets extrude multiply factor (in percent) for all extruders
extern int extruder_multiply[EXTRUDERS]; // sets extrude multiply factor (in percent) for each extruder individually
@ -307,6 +308,7 @@ extern float max_pos[3];
extern bool axis_known_position[3];
extern int fanSpeed;
extern int8_t lcd_change_fil_state;
extern float default_retraction;
#ifdef TMC2130
void homeaxis(int axis, uint8_t cnt = 1, uint8_t* pstep = 0);
@ -358,9 +360,6 @@ extern int fan_speed[2];
// Handling multiple extruders pins
extern uint8_t active_extruder;
#endif
//Long pause
extern unsigned long pause_time;
extern unsigned long start_pause_print;
@ -376,6 +375,10 @@ extern char dir_names[3][9];
extern int8_t lcd_change_fil_state;
// save/restore printing
extern bool saved_printing;
extern uint8_t saved_printing_type;
#define PRINTING_TYPE_SD 0
#define PRINTING_TYPE_USB 1
#define PRINTING_TYPE_NONE 2
//save/restore printing in case that mmu is not responding
extern bool mmu_print_saved;
@ -391,12 +394,10 @@ extern uint16_t print_time_remaining_silent;
extern uint16_t mcode_in_progress;
extern uint16_t gcode_in_progress;
extern bool wizard_active; //autoload temporarily disabled during wizard
extern LongTimer safetyTimer;
#define PRINT_PERCENT_DONE_INIT 0xff
#define PRINTER_ACTIVE (IS_SD_PRINTING || is_usb_printing || isPrintPaused || (custom_message_type == CustomMsg::TempCal) || saved_printing || (lcd_commands_type == LcdCommands::Layer1Cal) || card.paused || mmu_print_saved)
#define PRINTER_ACTIVE (IS_SD_PRINTING || is_usb_printing || isPrintPaused || (custom_message_type == CustomMsg::TempCal) || saved_printing || (lcd_commands_type == LcdCommands::Layer1Cal) || mmu_print_saved)
//! Beware - mcode_in_progress is set as soon as the command gets really processed,
//! which is not the same as posting the M600 command into the command queue
@ -425,8 +426,6 @@ void bed_analysis(float x_dimension, float y_dimension, int x_points_num, int y_
void bed_check(float x_dimension, float y_dimension, int x_points_num, int y_points_num, float shift_x, float shift_y);
#endif //HEATBED_ANALYSIS
float temp_comp_interpolation(float temperature);
void temp_compensation_apply();
void temp_compensation_start();
void show_fw_version_warnings();
uint8_t check_printer_version();
@ -457,6 +456,7 @@ extern void print_mesh_bed_leveling_table();
extern void stop_and_save_print_to_ram(float z_move, float e_move);
extern void restore_print_from_ram_and_continue(float e_move);
extern void cancel_saved_printing();
//estimated time to end of the print
@ -513,4 +513,6 @@ void M600_wait_for_user(float HotendTempBckp);
void M600_check_state(float nozzle_temp);
void load_filament_final_feed();
void marlin_wait_for_click();
void marlin_rise_z(void);
void raise_z_above(float target, bool plan=true);
#endif

File diff suppressed because it is too large Load Diff

View File

@ -319,6 +319,22 @@ bool Sd2Card::init(uint8_t sckRateID, uint8_t chipSelectPin) {
goto fail;
}
}
// send 0xFF until 0xFF received to give card some clock cycles
t0 = (uint16_t)_millis();
SERIAL_ECHOLNRPGM(PSTR("Sending 0xFF"));
spiSend(0XFF);
while ((status_ = spiRec()) != 0xFF)
{
spiSend(0XFF);
if (((uint16_t)_millis() - t0) > SD_CARD_ERROR_FF_TIMEOUT)
{
error(SD_CARD_ERROR_CMD8);
SERIAL_ECHOLNRPGM(PSTR("No 0xFF received"));
goto fail;
}
}
// check SD version
if ((cardCommand(CMD8, 0x1AA) & R1_ILLEGAL_COMMAND)) {
type(SD_CARD_TYPE_SD1);

View File

@ -105,6 +105,8 @@ uint8_t const SD_CARD_ERROR_SCK_RATE = 0X18;
uint8_t const SD_CARD_ERROR_INIT_NOT_CALLED = 0X19;
/** crc check error */
uint8_t const SD_CARD_ERROR_CRC = 0X20;
/** no response to sent 0xFF */
uint8_t const SD_CARD_ERROR_FF_TIMEOUT = 0X21;
/** Toshiba FlashAir: iSDIO */
uint8_t const SD_CARD_ERROR_CMD48 = 0x80;

View File

@ -4,6 +4,7 @@
#include <stdio.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include "pins.h"
uint8_t adc_state;
uint8_t adc_count;
@ -24,8 +25,8 @@ void adc_init(void)
ADMUX |= (1 << REFS0);
ADCSRA |= (1 << ADEN);
// ADCSRA |= (1 << ADIF) | (1 << ADSC);
DIDR0 = (ADC_CHAN_MSK & 0xff);
DIDR2 = (ADC_CHAN_MSK >> 8);
DIDR0 = ((ADC_CHAN_MSK & ADC_DIDR_MSK) & 0xff);
DIDR2 = ((ADC_CHAN_MSK & ADC_DIDR_MSK) >> 8);
adc_reset();
// adc_sim_mask = 0b0101;
// adc_sim_mask = 0b100101;

120
Firmware/backlight.cpp Normal file
View File

@ -0,0 +1,120 @@
//backlight.cpp
#include "backlight.h"
#include <avr/eeprom.h>
#include <Arduino.h>
#include "eeprom.h"
#include "Marlin.h"
#include "pins.h"
#include "fastio.h"
#include "Timer.h"
#ifdef LCD_BL_PIN
#define BL_FLASH_DELAY_MS 25
bool backlightSupport = 0; //only if it's true will any of the settings be visible to the user
int16_t backlightLevel_HIGH = 0;
int16_t backlightLevel_LOW = 0;
uint8_t backlightMode = BACKLIGHT_MODE_BRIGHT;
int16_t backlightTimer_period = 10;
LongTimer backlightTimer;
static void backlightTimer_reset() //used for resetting the timer and waking the display. Triggered on user interactions.
{
if (!backlightSupport) return;
backlightTimer.start();
backlight_update();
}
void force_bl_on(bool section_start)
{
if (section_start)
{
backlightMode = BACKLIGHT_MODE_BRIGHT;
if (backlightLevel_HIGH < 30) backlightLevel_HIGH = 30;
}
else
{
backlightMode = eeprom_read_byte((uint8_t *)EEPROM_BACKLIGHT_MODE);
backlightLevel_HIGH = eeprom_read_byte((uint8_t *)EEPROM_BACKLIGHT_LEVEL_HIGH);
}
backlight_update();
}
void backlight_wake(const uint8_t flashNo)
{
if (!backlightSupport) return;
if (flashNo)
{
uint8_t backlightMode_bck = backlightMode;
for (uint8_t i = 0; i < (((backlightMode_bck == BACKLIGHT_MODE_AUTO) && !backlightTimer.running()) + (flashNo * 2)); i++)
{
backlightMode = !backlightMode; //toggles between BACKLIGHT_MODE_BRIGHT and BACKLIGHT_MODE_DIM
backlight_update();
_delay(BL_FLASH_DELAY_MS);
}
backlightMode = backlightMode_bck;
}
backlightTimer_reset();
}
void backlight_save() //saves all backlight data to eeprom.
{
eeprom_update_byte((uint8_t *)EEPROM_BACKLIGHT_LEVEL_HIGH, (uint8_t)backlightLevel_HIGH);
eeprom_update_byte((uint8_t *)EEPROM_BACKLIGHT_LEVEL_LOW, (uint8_t)backlightLevel_LOW);
eeprom_update_byte((uint8_t *)EEPROM_BACKLIGHT_MODE, backlightMode);
eeprom_update_word((uint16_t *)EEPROM_BACKLIGHT_TIMEOUT, backlightTimer_period);
}
void backlight_update()
{
if (!backlightSupport) return;
if (backlightMode == BACKLIGHT_MODE_AUTO)
{
if (backlightTimer.expired((uint32_t)backlightTimer_period * 1000ul)) analogWrite(LCD_BL_PIN, backlightLevel_LOW);
else if (backlightTimer.running()) analogWrite(LCD_BL_PIN, backlightLevel_HIGH);
else {/*do nothing*/;} //display is dimmed.
}
else if (backlightMode == BACKLIGHT_MODE_DIM) analogWrite(LCD_BL_PIN, backlightLevel_LOW);
else analogWrite(LCD_BL_PIN, backlightLevel_HIGH);
}
void backlight_init()
{
//check for backlight support on lcd
SET_INPUT(LCD_BL_PIN);
WRITE(LCD_BL_PIN,HIGH);
_delay(10);
backlightSupport = !READ(LCD_BL_PIN);
if (!backlightSupport) return;
//initialize backlight
backlightMode = eeprom_read_byte((uint8_t *)EEPROM_BACKLIGHT_MODE);
if (backlightMode == 0xFF) //set default values
{
backlightMode = BACKLIGHT_MODE_AUTO;
backlightLevel_HIGH = 130;
backlightLevel_LOW = 50;
backlightTimer_period = 10; //in seconds
backlight_save();
}
backlightLevel_HIGH = eeprom_read_byte((uint8_t *)EEPROM_BACKLIGHT_LEVEL_HIGH);
backlightLevel_LOW = eeprom_read_byte((uint8_t *)EEPROM_BACKLIGHT_LEVEL_LOW);
backlightTimer_period = eeprom_read_word((uint16_t *)EEPROM_BACKLIGHT_TIMEOUT);
SET_OUTPUT(LCD_BL_PIN);
backlightTimer_reset();
}
#else //LCD_BL_PIN
void force_bl_on(__attribute__((unused)) bool section_start) {}
void backlight_update() {}
void backlight_init() {}
void backlight_save() {}
void backlight_wake(__attribute__((unused)) const uint8_t flashNo) {}
#endif //LCD_BL_PIN

32
Firmware/backlight.h Normal file
View File

@ -0,0 +1,32 @@
//backlight.h
#ifndef _BACKLIGHT_H
#define _BACKLIGHT_H
#include <inttypes.h>
#include "Marlin.h"
#include "pins.h"
enum Backlight_Mode
{
BACKLIGHT_MODE_DIM = 0,
BACKLIGHT_MODE_BRIGHT = 1,
BACKLIGHT_MODE_AUTO = 2,
};
extern int16_t backlightLevel_HIGH;
extern int16_t backlightLevel_LOW;
extern uint8_t backlightMode;
extern bool backlightSupport;
extern int16_t backlightTimer_period;
#define FORCE_BL_ON_START force_bl_on(true)
#define FORCE_BL_ON_END force_bl_on(false)
extern void force_bl_on(bool section_start);
extern void backlight_update();
extern void backlight_init();
extern void backlight_save();
extern void backlight_wake(const uint8_t flashNo = 0);
#endif //_BACKLIGHT_H

View File

@ -25,7 +25,6 @@ CardReader::CardReader()
sdpos = 0;
sdprinting = false;
cardOK = false;
paused = false;
saving = false;
logging = false;
autostart_atmillis=0;
@ -137,8 +136,8 @@ void CardReader::lsDive(const char *prepend, SdFile parent, const char * const m
SERIAL_ECHOPGM("Access date: ");
MYSERIAL.println(p.lastAccessDate);
SERIAL_ECHOLNPGM("");*/
creationDate = p.creationDate;
creationTime = p.creationTime;
modificationDate = p.lastWriteDate;
modificationTime = p.lastWriteTime;
//writeDate = p.lastAccessDate;
if (match != NULL) {
if (strcasecmp(match, filename) == 0) return;
@ -203,6 +202,7 @@ void CardReader::initsd()
}
workDir=root;
curDir=&root;
workDirDepth = 0;
#ifdef SDCARD_SORT_ALPHA
presort();
@ -241,24 +241,13 @@ void CardReader::startFileprint()
if(cardOK)
{
sdprinting = true;
paused = false;
Stopped = false;
Stopped = false;
#ifdef SDCARD_SORT_ALPHA
//flush_presort();
#endif
}
}
void CardReader::pauseSDPrint()
{
if(sdprinting)
{
sdprinting = false;
paused = true;
}
}
void CardReader::openLogFile(const char* name)
{
logging = true;
@ -370,10 +359,10 @@ void CardReader::openFile(const char* name,bool read, bool replace_current/*=tru
{
if((int)file_subcall_ctr>(int)SD_PROCEDURE_DEPTH-1)
{
SERIAL_ERROR_START;
SERIAL_ERRORPGM("trying to call sub-gcode files with too many levels. MAX level is:");
SERIAL_ERRORLN(SD_PROCEDURE_DEPTH);
kill("", 1);
// SERIAL_ERROR_START;
// SERIAL_ERRORPGM("trying to call sub-gcode files with too many levels. MAX level is:");
// SERIAL_ERRORLN(SD_PROCEDURE_DEPTH);
kill(_n("trying to call sub-gcode files with too many levels."), 1);
return;
}
@ -407,9 +396,7 @@ void CardReader::openFile(const char* name,bool read, bool replace_current/*=tru
SERIAL_ECHOLN(name);
}
sdprinting = false;
paused = false;
SdFile myDir;
const char *fname=name;
diveSubfolder(fname,myDir);
@ -491,24 +478,27 @@ uint32_t CardReader::getFileSize()
void CardReader::getStatus()
{
if(sdprinting){
SERIAL_PROTOCOL(longFilename);
SERIAL_PROTOCOLPGM("\n");
SERIAL_PROTOCOLRPGM(_N("SD printing byte "));////MSG_SD_PRINTING_BYTE
SERIAL_PROTOCOL(sdpos);
SERIAL_PROTOCOLPGM("/");
SERIAL_PROTOCOLLN(filesize);
uint16_t time = _millis()/60000 - starttime/60000;
SERIAL_PROTOCOL(itostr2(time/60));
SERIAL_PROTOCOL(':');
SERIAL_PROTOCOL(itostr2(time%60));
SERIAL_PROTOCOLPGM("\n");
}
else if (paused) {
SERIAL_PROTOCOLLNPGM("SD print paused");
}
else if (saved_printing) {
SERIAL_PROTOCOLLNPGM("Print saved");
if(sdprinting)
{
if (isPrintPaused) {
SERIAL_PROTOCOLLNPGM("SD print paused");
}
else if (saved_printing) {
SERIAL_PROTOCOLLNPGM("Print saved");
}
else {
SERIAL_PROTOCOL(longFilename);
SERIAL_PROTOCOLPGM("\n");
SERIAL_PROTOCOLRPGM(_N("SD printing byte "));////MSG_SD_PRINTING_BYTE
SERIAL_PROTOCOL(sdpos);
SERIAL_PROTOCOLPGM("/");
SERIAL_PROTOCOLLN(filesize);
uint16_t time = _millis()/60000 - starttime/60000;
SERIAL_PROTOCOL(itostr2(time/60));
SERIAL_PROTOCOL(':');
SERIAL_PROTOCOL(itostr2(time%60));
SERIAL_PROTOCOLPGM("\n");
}
}
else {
SERIAL_PROTOCOLLNPGM("Not SD printing");
@ -762,8 +752,8 @@ void CardReader::presort() {
#endif
#elif SDSORT_USES_STACK
char sortnames[fileCnt][LONG_FILENAME_LENGTH];
uint16_t creation_time[fileCnt];
uint16_t creation_date[fileCnt];
uint16_t modification_time[fileCnt];
uint16_t modification_date[fileCnt];
#endif
// Folder sorting needs 1 bit per entry for flags.
@ -783,8 +773,8 @@ void CardReader::presort() {
// retaining only two filenames at a time. This is very
// slow but is safest and uses minimal RAM.
char name1[LONG_FILENAME_LENGTH + 1];
uint16_t creation_time_bckp;
uint16_t creation_date_bckp;
uint16_t modification_time_bckp;
uint16_t modification_date_bckp;
#endif
position = 0;
@ -810,8 +800,8 @@ void CardReader::presort() {
#else
// Copy filenames into the static array
strcpy(sortnames[i], LONGEST_FILENAME);
creation_time[i] = creationTime;
creation_date[i] = creationDate;
modification_time[i] = modificationTime;
modification_date[i] = modificationDate;
#if SDSORT_CACHE_NAMES
strcpy(sortshort[i], filename);
#endif
@ -836,12 +826,12 @@ void CardReader::presort() {
// Compare names from the array or just the two buffered names
#if SDSORT_USES_RAM
#define _SORT_CMP_NODIR() (strcasecmp(sortnames[o1], sortnames[o2]) > 0)
#define _SORT_CMP_TIME_NODIR() (((creation_date[o1] == creation_date[o2]) && (creation_time[o1] < creation_time[o2])) || \
(creation_date[o1] < creation_date [o2]))
#define _SORT_CMP_TIME_NODIR() (((modification_date[o1] == modification_date[o2]) && (modification_time[o1] < modification_time[o2])) || \
(modification_date[o1] < modification_date [o2]))
#else
#define _SORT_CMP_NODIR() (strcasecmp(name1, name2) > 0) //true if lowercase(name1) > lowercase(name2)
#define _SORT_CMP_TIME_NODIR() (((creation_date_bckp == creationDate) && (creation_time_bckp > creationTime)) || \
(creation_date_bckp > creationDate))
#define _SORT_CMP_TIME_NODIR() (((modification_date_bckp == modificationDate) && (modification_time_bckp > modificationTime)) || \
(modification_date_bckp > modificationDate))
#endif
@ -892,8 +882,8 @@ void CardReader::presort() {
counter++;
getfilename_simple(positions[o1]);
strcpy(name1, LONGEST_FILENAME); // save (or getfilename below will trounce it)
creation_date_bckp = creationDate;
creation_time_bckp = creationTime;
modification_date_bckp = modificationDate;
modification_time_bckp = modificationTime;
#if HAS_FOLDER_SORTING
bool dir1 = filenameIsDir;
#endif

View File

@ -25,7 +25,6 @@ public:
void closefile(bool store_location=false);
void release();
void startFileprint();
void pauseSDPrint();
uint32_t getFileSize();
void getStatus();
void printingHasFinished();
@ -75,9 +74,8 @@ public:
bool logging;
bool sdprinting ;
bool cardOK ;
bool paused ;
char filename[13];
uint16_t creationTime, creationDate;
uint16_t modificationTime, modificationDate;
uint32_t cluster, position;
char longFilename[LONG_FILENAME_LENGTH];
bool filenameIsDir;
@ -114,8 +112,8 @@ private:
#endif
#elif !SDSORT_USES_STACK
char sortnames[SDSORT_LIMIT][FILENAME_LENGTH];
uint16_t creation_time[SDSORT_LIMIT];
uint16_t creation_date[SDSORT_LIMIT];
uint16_t modification_time[SDSORT_LIMIT];
uint16_t modification_date[SDSORT_LIMIT];
#endif
// Folder sorting uses an isDir array when caching items.

View File

@ -500,7 +500,7 @@ void get_command()
//If command was e-stop process now
if(strcmp(cmdbuffer+bufindw+CMDHDRSIZE, "M112") == 0)
kill("", 2);
kill(MSG_M112_KILL, 2);
// Store the current line into buffer, move to the next line.
// Store type of entry
@ -582,30 +582,8 @@ void get_command()
((serial_char == '#' || serial_char == ':') && comment_mode == false) ||
serial_count >= (MAX_CMD_SIZE - 1) || n==-1)
{
if(card.eof()){
SERIAL_PROTOCOLLNRPGM(_n("Done printing file"));////MSG_FILE_PRINTED
stoptime=_millis();
char time[30];
unsigned long t=(stoptime-starttime-pause_time)/1000;
pause_time = 0;
int hours, minutes;
minutes=(t/60)%60;
hours=t/60/60;
save_statistics(total_filament_used, t);
sprintf_P(time, PSTR("%i hours %i minutes"),hours, minutes);
SERIAL_ECHO_START;
SERIAL_ECHOLN(time);
lcd_setstatus(time);
card.printingHasFinished();
card.checkautostart(true);
if(card.eof()) break;
if (farm_mode)
{
prusa_statistics(6);
lcd_commands_type = LcdCommands::FarmModeConfirm;
}
}
if(serial_char=='#')
stop_buffering=true;
@ -663,6 +641,37 @@ void get_command()
else if(!comment_mode) cmdbuffer[bufindw+CMDHDRSIZE+serial_count++] = serial_char;
}
}
if(card.eof())
{
// file was fully buffered, but commands might still need to be planned!
// do *not* clear sdprinting until all SD commands are consumed to ensure
// SD state can be resumed from a saved printing state. sdprinting is only
// cleared by printingHasFinished after peforming all remaining moves.
if(!cmdqueue_calc_sd_length())
{
SERIAL_PROTOCOLLNRPGM(_n("Done printing file"));////MSG_FILE_PRINTED
stoptime=_millis();
char time[30];
unsigned long t=(stoptime-starttime-pause_time)/1000;
pause_time = 0;
int hours, minutes;
minutes=(t/60)%60;
hours=t/60/60;
save_statistics(total_filament_used, t);
sprintf_P(time, PSTR("%i hours %i minutes"),hours, minutes);
SERIAL_ECHO_START;
SERIAL_ECHOLN(time);
lcd_setstatus(time);
card.printingHasFinished();
card.checkautostart(true);
if (farm_mode)
{
prusa_statistics(6);
lcd_commands_type = LcdCommands::FarmModeConfirm;
}
}
}
#endif //SDSUPPORT
}

View File

@ -2,9 +2,21 @@
#define _CONFIG_H
#include "Configuration_prusa.h"
#include "pins.h"
#define IR_SENSOR_ANALOG (defined(VOLT_IR_PIN) && defined(IR_SENSOR))
//ADC configuration
#if !IR_SENSOR_ANALOG
#define ADC_CHAN_MSK 0b0000001001011111 //used AD channels bit mask (0,1,2,3,4,6,9)
#define ADC_DIDR_MSK 0b0000001001011111 //AD channels DIDR mask (1 ~ disabled digital input)
#define ADC_CHAN_CNT 7 //number of used channels)
#else //!IR_SENSOR_ANALOG
#define ADC_CHAN_MSK 0b0000001101011111 //used AD channels bit mask (0,1,2,3,4,6,8,9)
#define ADC_DIDR_MSK 0b0000001001011111 //AD channels DIDR mask (1 ~ disabled digital input)
#define ADC_CHAN_CNT 8 //number of used channels)
#endif //!IR_SENSOR_ANALOG
#define ADC_OVRSAMPL 16 //oversampling multiplier
#define ADC_CALLBACK adc_ready //callback function ()
@ -42,11 +54,8 @@
#define W25X20CL_SPCR SPI_SPCR(W25X20CL_SPI_RATE, 1, 1, 1, 0)
#define W25X20CL_SPSR SPI_SPSR(W25X20CL_SPI_RATE)
#include "boards.h"
#include "Configuration_prusa.h"
//LANG - Multi-language support
//#define LANG_MODE 0 // primary language only
//define LANG_MODE 0 // primary language only
#define LANG_MODE 1 // sec. language support
#define LANG_SIZE_RESERVED 0x3000 // reserved space for secondary language (12288 bytes)

View File

@ -62,7 +62,7 @@ void eeprom_init()
if (eeprom_read_word((uint16_t*)EEPROM_MMU_LOAD_FAIL_TOT) == 0xffff) eeprom_update_word((uint16_t *)EEPROM_MMU_LOAD_FAIL_TOT, 0);
if (eeprom_read_byte((uint8_t*)EEPROM_MMU_FAIL) == 0xff) eeprom_update_byte((uint8_t *)EEPROM_MMU_FAIL, 0);
if (eeprom_read_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL) == 0xff) eeprom_update_byte((uint8_t *)EEPROM_MMU_LOAD_FAIL, 0);
if (eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)) == 0xff)
if (eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)) == EEPROM_EMPTY_VALUE)
{
eeprom_update_byte(&(EEPROM_Sheets_base->active_sheet), 0);
// When upgrading from version older version (before multiple sheets were implemented in v3.8.0)

View File

@ -3,9 +3,12 @@
#include <stdint.h>
#define MAX_SHEETS 8
#define MAX_SHEET_NAME_LENGTH 7
typedef struct
{
char name[7]; //!< Can be null terminated, doesn't need to be null terminated
char name[MAX_SHEET_NAME_LENGTH]; //!< Can be null terminated, doesn't need to be null terminated
int16_t z_offset; //!< Z_BABYSTEP_MIN .. Z_BABYSTEP_MAX = Z_BABYSTEP_MIN*2/1000 [mm] .. Z_BABYSTEP_MAX*2/1000 [mm]
uint8_t bed_temp; //!< 0 .. 254 [°C]
uint8_t pinda_temp; //!< 0 .. 254 [°C]
@ -13,7 +16,7 @@ typedef struct
typedef struct
{
Sheet s[8];
Sheet s[MAX_SHEETS];
uint8_t active_sheet;
} Sheets;
// sizeof(Sheets). Do not change it unless EEPROM_Sheets_base is last item in EEPROM.
@ -25,6 +28,7 @@ static_assert(sizeof(Sheets) == EEPROM_SHEETS_SIZEOF, "Sizeof(Sheets) is not EEP
#endif
#define EEPROM_EMPTY_VALUE 0xFF
#define EEPROM_EMPTY_VALUE16 0xFFFF
// The total size of the EEPROM is
// 4096 for the Atmega2560
#define EEPROM_TOP 4096
@ -70,7 +74,7 @@ static_assert(sizeof(Sheets) == EEPROM_SHEETS_SIZEOF, "Sizeof(Sheets) is not EEP
#define EEPROM_UVLO_CURRENT_POSITION_Z (EEPROM_FILE_POSITION - 4) //float for current position in Z
#define EEPROM_UVLO_TARGET_HOTEND (EEPROM_UVLO_CURRENT_POSITION_Z - 1)
#define EEPROM_UVLO_TARGET_BED (EEPROM_UVLO_TARGET_HOTEND - 1)
#define EEPROM_UVLO_FEEDRATE (EEPROM_UVLO_TARGET_BED - 2)
#define EEPROM_UVLO_FEEDRATE (EEPROM_UVLO_TARGET_BED - 2) //uint16_t
#define EEPROM_UVLO_FAN_SPEED (EEPROM_UVLO_FEEDRATE - 1)
#define EEPROM_FAN_CHECK_ENABLED (EEPROM_UVLO_FAN_SPEED - 1)
#define EEPROM_UVLO_MESH_BED_LEVELING (EEPROM_FAN_CHECK_ENABLED - 9*2)
@ -197,9 +201,21 @@ static_assert(sizeof(Sheets) == EEPROM_SHEETS_SIZEOF, "Sizeof(Sheets) is not EEP
#define EEPROM_SHEETS_BASE (EEPROM_CHECK_GCODE - EEPROM_SHEETS_SIZEOF) // Sheets
static Sheets * const EEPROM_Sheets_base = (Sheets*)(EEPROM_SHEETS_BASE);
#define EEPROM_FSENSOR_PCB (EEPROM_SHEETS_BASE-1) // uint8
#define EEPROM_FSENSOR_ACTION_NA (EEPROM_FSENSOR_PCB-1) // uint8
#define EEPROM_UVLO_SAVED_TARGET (EEPROM_FSENSOR_ACTION_NA - 4*4) // 4 x float for saved target for all axes
#define EEPROM_UVLO_FEEDMULTIPLY (EEPROM_UVLO_SAVED_TARGET - 2) // uint16_t for feedmultiply
#define EEPROM_BACKLIGHT_LEVEL_HIGH (EEPROM_UVLO_FEEDMULTIPLY-1) // uint8
#define EEPROM_BACKLIGHT_LEVEL_LOW (EEPROM_BACKLIGHT_LEVEL_HIGH-1) // uint8
#define EEPROM_BACKLIGHT_MODE (EEPROM_BACKLIGHT_LEVEL_LOW-1) // uint8
#define EEPROM_BACKLIGHT_TIMEOUT (EEPROM_BACKLIGHT_MODE-2) // uint16
#define EEPROM_UVLO_LA_K (EEPROM_BACKLIGHT_TIMEOUT-4) // float
//This is supposed to point to last item to allow EEPROM overrun check. Please update when adding new items.
#define EEPROM_LAST_ITEM EEPROM_SHEETS_BASE
#define EEPROM_LAST_ITEM EEPROM_UVLO_LA_K
// !!!!!
// !!!!! this is end of EEPROM section ... all updates MUST BE inserted before this mark !!!!!
// !!!!!

View File

@ -10,32 +10,28 @@
#include "mmu.h"
#include <avr/pgmspace.h>
//! @brief Preheat
void lay1cal_preheat()
//! @brief Wait for preheat
void lay1cal_wait_preheat()
{
static const char cmd_preheat_0[] PROGMEM = "M107";
static const char cmd_preheat_1[] PROGMEM = "M104 S" STRINGIFY(PLA_PREHEAT_HOTEND_TEMP);
static const char cmd_preheat_2[] PROGMEM = "M140 S" STRINGIFY(PLA_PREHEAT_HPB_TEMP);
static const char cmd_preheat_3[] PROGMEM = "M190 S" STRINGIFY(PLA_PREHEAT_HPB_TEMP);
static const char cmd_preheat_4[] PROGMEM = "M109 S" STRINGIFY(PLA_PREHEAT_HOTEND_TEMP);
static const char cmd_preheat_5[] PROGMEM = "G28";
static const char cmd_preheat_6[] PROGMEM = "G92 E0.0";
static const char cmd_preheat_1[] PROGMEM = "M190";
static const char cmd_preheat_2[] PROGMEM = "M109";
static const char cmd_preheat_4[] PROGMEM = "G28";
static const char cmd_preheat_5[] PROGMEM = "G92 E0.0";
static const char * const preheat_cmd[] PROGMEM =
const char * const preheat_cmd[] =
{
cmd_preheat_0,
cmd_preheat_1,
cmd_preheat_2,
cmd_preheat_3,
_T(MSG_M117_V2_CALIBRATION),
cmd_preheat_4,
cmd_preheat_5, //call MSG_M117_V2_CALIBRATION before
cmd_preheat_6,
cmd_preheat_5,
};
for (uint8_t i = 0; i < (sizeof(preheat_cmd)/sizeof(preheat_cmd[0])); ++i)
{
if (5 == i) enquecommand_P(_T(MSG_M117_V2_CALIBRATION));
enquecommand_P(static_cast<char*>(pgm_read_ptr(&preheat_cmd[i])));
enquecommand_P(preheat_cmd[i]);
}
}

View File

@ -6,7 +6,7 @@
#define FIRMWARE_FIRST_LAY_CAL_H_
#include <stdint.h>
void lay1cal_preheat();
void lay1cal_wait_preheat();
void lay1cal_load_filament(char *cmd_buffer, uint8_t filament);
void lay1cal_intro_line();
void lay1cal_before_meander();

View File

@ -6,15 +6,16 @@
#include <avr/pgmspace.h>
#include "pat9125.h"
#include "stepper.h"
#include "planner.h"
#include "fastio.h"
#include "io_atmega2560.h"
#include "cmdqueue.h"
#include "ultralcd.h"
#include "ConfigurationStore.h"
#include "mmu.h"
#include "cardreader.h"
#include "adc.h"
#include "temperature.h"
#include "config.h"
//! @name Basic parameters
//! @{
#define FSENSOR_CHUNK_LEN 0.64F //!< filament sensor chunk length 0.64mm
@ -53,15 +54,8 @@ bool fsensor_enabled = true;
bool fsensor_watch_runout = true;
//! not responding - is set if any communication error occurred during initialization or readout
bool fsensor_not_responding = false;
//! printing saved
bool fsensor_printing_saved = false;
//! enable/disable quality meassurement
bool fsensor_oq_meassure_enabled = false;
//! as explained in the CHECK_FSENSOR macro: this flag is set to true when fsensor posts
//! the M600 into the command queue, which elliminates the hazard of having posted multiple M600's
//! before the first one gets read and started processing.
//! Btw., the IR fsensor could do up to 6 posts before the command queue managed to start processing the first M600 ;)
static bool fsensor_m600_enqueued = false;
//! number of errors, updated in ISR
uint8_t fsensor_err_cnt = 0;
@ -117,6 +111,13 @@ int16_t fsensor_oq_yd_max;
uint16_t fsensor_oq_sh_sum;
//! @}
#if IR_SENSOR_ANALOG
ClFsensorPCB oFsensorPCB;
ClFsensorActionNA oFsensorActionNA;
bool bIRsensorStateFlag=false;
unsigned long nIRsensorLastTime;
#endif //IR_SENSOR_ANALOG
void fsensor_stop_and_save_print(void)
{
printf_P(PSTR("fsensor_stop_and_save_print\n"));
@ -126,20 +127,28 @@ void fsensor_stop_and_save_print(void)
void fsensor_restore_print_and_continue(void)
{
printf_P(PSTR("fsensor_restore_print_and_continue\n"));
fsensor_watch_runout = true;
fsensor_err_cnt = 0;
fsensor_m600_enqueued = false;
restore_print_from_ram_and_continue(0); //XYZ = orig, E - no change
}
// fsensor_checkpoint_print cuts the current print job at the current position,
// allowing new instructions to be inserted in the middle
void fsensor_checkpoint_print(void)
{
printf_P(PSTR("fsensor_checkpoint_print\n"));
stop_and_save_print_to_ram(0, 0);
restore_print_from_ram_and_continue(0);
}
void fsensor_init(void)
{
#ifdef PAT9125
uint8_t pat9125 = pat9125_init();
printf_P(PSTR("PAT9125_init:%hhu\n"), pat9125);
printf_P(PSTR("PAT9125_init:%hhu\n"), pat9125);
#endif //PAT9125
uint8_t fsensor = eeprom_read_byte((uint8_t*)EEPROM_FSENSOR);
fsensor_autoload_enabled=eeprom_read_byte((uint8_t*)EEPROM_FSENS_AUTOLOAD_ENABLED);
fsensor_not_responding = false;
#ifdef PAT9125
uint8_t oq_meassure_enabled = eeprom_read_byte((uint8_t*)EEPROM_FSENS_OQ_MEASS_ENABLED);
fsensor_oq_meassure_enabled = (oq_meassure_enabled == 1)?true:false;
@ -150,19 +159,27 @@ void fsensor_init(void)
fsensor = 0; //disable sensor
fsensor_not_responding = true;
}
else
fsensor_not_responding = false;
#endif //PAT9125
#if IR_SENSOR_ANALOG
bIRsensorStateFlag=false;
oFsensorPCB=(ClFsensorPCB)eeprom_read_byte((uint8_t*)EEPROM_FSENSOR_PCB);
oFsensorActionNA=(ClFsensorActionNA)eeprom_read_byte((uint8_t*)EEPROM_FSENSOR_ACTION_NA);
#endif //IR_SENSOR_ANALOG
if (fsensor)
fsensor_enable();
fsensor_enable(false); // (in this case) EEPROM update is not necessary
else
fsensor_disable();
printf_P(PSTR("FSensor %S\n"), (fsensor_enabled?PSTR("ENABLED"):PSTR("DISABLED\n")));
fsensor_disable(false); // (in this case) EEPROM update is not necessary
printf_P(PSTR("FSensor %S"), (fsensor_enabled?PSTR("ENABLED"):PSTR("DISABLED")));
#if IR_SENSOR_ANALOG
printf_P(PSTR(" (sensor board revision: %S)\n"),(oFsensorPCB==ClFsensorPCB::_Rev03b)?PSTR("03b or newer"):PSTR("03 or older"));
#else //IR_SENSOR_ANALOG
printf_P(PSTR("\n"));
#endif //IR_SENSOR_ANALOG
if (check_for_ir_sensor()) ir_sensor_detected = true;
}
bool fsensor_enable(void)
bool fsensor_enable(bool bUpdateEEPROM)
{
#ifdef PAT9125
if (mmu_enabled == false) { //filament sensor is pat9125, enable only if it is working
@ -187,18 +204,34 @@ bool fsensor_enable(void)
FSensorStateMenu = 1;
}
#else // PAT9125
fsensor_enabled = true;
eeprom_update_byte((uint8_t*)EEPROM_FSENSOR, 0x01);
FSensorStateMenu = 1;
#endif // PAT9125
#if IR_SENSOR_ANALOG
if(!fsensor_IR_check())
{
bUpdateEEPROM=true;
fsensor_enabled=false;
fsensor_not_responding=true;
FSensorStateMenu=0;
}
else {
#endif //IR_SENSOR_ANALOG
fsensor_enabled=true;
fsensor_not_responding=false;
FSensorStateMenu=1;
#if IR_SENSOR_ANALOG
}
#endif //IR_SENSOR_ANALOG
if(bUpdateEEPROM)
eeprom_update_byte((uint8_t*)EEPROM_FSENSOR, FSensorStateMenu);
#endif //PAT9125
return fsensor_enabled;
}
void fsensor_disable(void)
{
void fsensor_disable(bool bUpdateEEPROM)
{
fsensor_enabled = false;
eeprom_update_byte((uint8_t*)EEPROM_FSENSOR, 0x00);
FSensorStateMenu = 0;
if(bUpdateEEPROM)
eeprom_update_byte((uint8_t*)EEPROM_FSENSOR, 0x00);
}
void fsensor_autoload_set(bool State)
@ -225,7 +258,7 @@ void fsensor_autoload_check_start(void)
if (!fsensor_enabled) return;
if (!fsensor_autoload_enabled) return;
if (fsensor_watch_autoload) return;
if (!pat9125_update_y()) //update sensor
if (!pat9125_update()) //update sensor
{
fsensor_disable();
fsensor_not_responding = true;
@ -498,23 +531,11 @@ void fsensor_setup_interrupt(void)
#endif //PAT9125
void fsensor_st_block_begin(block_t* bl)
void fsensor_st_block_chunk(int cnt)
{
if (!fsensor_enabled) return;
if (((fsensor_st_cnt > 0) && (bl->direction_bits & 0x8)) ||
((fsensor_st_cnt < 0) && !(bl->direction_bits & 0x8)))
{
// !!! bit toggling (PINxn <- 1) (for PinChangeInterrupt) does not work for some MCU pins
if (PIN_GET(FSENSOR_INT_PIN)) {PIN_VAL(FSENSOR_INT_PIN, LOW);}
else {PIN_VAL(FSENSOR_INT_PIN, HIGH);}
}
}
void fsensor_st_block_chunk(block_t* bl, int cnt)
{
if (!fsensor_enabled) return;
fsensor_st_cnt += (bl->direction_bits & 0x8)?-cnt:cnt;
if ((fsensor_st_cnt >= fsensor_chunk_len) || (fsensor_st_cnt <= -fsensor_chunk_len))
fsensor_st_cnt += cnt;
if (abs(fsensor_st_cnt) >= fsensor_chunk_len)
{
// !!! bit toggling (PINxn <- 1) (for PinChangeInterrupt) does not work for some MCU pins
if (PIN_GET(FSENSOR_INT_PIN)) {PIN_VAL(FSENSOR_INT_PIN, LOW);}
@ -529,8 +550,6 @@ void fsensor_enque_M600(){
printf_P(PSTR("fsensor_update - M600\n"));
eeprom_update_byte((uint8_t*)EEPROM_FERROR_COUNT, eeprom_read_byte((uint8_t*)EEPROM_FERROR_COUNT) + 1);
eeprom_update_word((uint16_t*)EEPROM_FERROR_COUNT_TOT, eeprom_read_word((uint16_t*)EEPROM_FERROR_COUNT_TOT) + 1);
enquecommand_front_P(PSTR("PRUSA fsensor_recover"));
fsensor_m600_enqueued = true;
enquecommand_front_P((PSTR("M600")));
}
@ -542,7 +561,7 @@ void fsensor_enque_M600(){
void fsensor_update(void)
{
#ifdef PAT9125
if (fsensor_enabled && fsensor_watch_runout && (fsensor_err_cnt > FSENSOR_ERR_MAX) && ( ! fsensor_m600_enqueued) )
if (fsensor_enabled && fsensor_watch_runout && (fsensor_err_cnt > FSENSOR_ERR_MAX))
{
bool autoload_enabled_tmp = fsensor_autoload_enabled;
fsensor_autoload_enabled = false;
@ -575,24 +594,86 @@ void fsensor_update(void)
err |= (fsensor_oq_er_sum > 2);
err |= (fsensor_oq_yd_sum < (4 * FSENSOR_OQ_MIN_YD));
if (!err)
{
printf_P(PSTR("fsensor_err_cnt = 0\n"));
fsensor_restore_print_and_continue();
}
else
{
fsensor_enque_M600();
fsensor_watch_runout = false;
}
fsensor_restore_print_and_continue();
fsensor_autoload_enabled = autoload_enabled_tmp;
fsensor_oq_meassure_enabled = oq_meassure_enabled_tmp;
if (!err)
printf_P(PSTR("fsensor_err_cnt = 0\n"));
else
fsensor_enque_M600();
}
#else //PAT9125
if ((digitalRead(IR_SENSOR_PIN) == 1) && CHECK_FSENSOR && fsensor_enabled && ir_sensor_detected && ( ! fsensor_m600_enqueued) )
{
fsensor_stop_and_save_print();
fsensor_enque_M600();
if (CHECK_FSENSOR && fsensor_enabled && ir_sensor_detected)
{
if(digitalRead(IR_SENSOR_PIN))
{ // IR_SENSOR_PIN ~ H
#if IR_SENSOR_ANALOG
if(!bIRsensorStateFlag)
{
bIRsensorStateFlag=true;
nIRsensorLastTime=_millis();
}
else
{
if((_millis()-nIRsensorLastTime)>IR_SENSOR_STEADY)
{
uint8_t nMUX1,nMUX2;
uint16_t nADC;
bIRsensorStateFlag=false;
// sequence for direct data reading from AD converter
DISABLE_TEMPERATURE_INTERRUPT();
nMUX1=ADMUX; // ADMUX saving
nMUX2=ADCSRB;
adc_setmux(VOLT_IR_PIN);
ADCSRA|=(1<<ADSC); // first conversion after ADMUX change discarded (preventively)
while(ADCSRA&(1<<ADSC))
;
ADCSRA|=(1<<ADSC); // second conversion used
while(ADCSRA&(1<<ADSC))
;
nADC=ADC;
ADMUX=nMUX1; // ADMUX restoring
ADCSRB=nMUX2;
ENABLE_TEMPERATURE_INTERRUPT();
// end of sequence for ...
if((oFsensorPCB==ClFsensorPCB::_Rev03b)&&((nADC*OVERSAMPLENR)>((int)IRsensor_Hopen_TRESHOLD)))
{
fsensor_disable();
fsensor_not_responding = true;
printf_P(PSTR("IR sensor not responding (%d)!\n"),1);
if((ClFsensorActionNA)eeprom_read_byte((uint8_t*)EEPROM_FSENSOR_ACTION_NA)==ClFsensorActionNA::_Pause)
if(oFsensorActionNA==ClFsensorActionNA::_Pause)
lcd_pause_print();
}
else
{
#endif //IR_SENSOR_ANALOG
fsensor_checkpoint_print();
fsensor_enque_M600();
#if IR_SENSOR_ANALOG
}
}
}
}
else
{ // IR_SENSOR_PIN ~ L
bIRsensorStateFlag=false;
#endif //IR_SENSOR_ANALOG
}
}
#endif //PAT9125
}
#if IR_SENSOR_ANALOG
bool fsensor_IR_check()
{
uint16_t volt_IR_int;
bool bCheckResult;
volt_IR_int=current_voltage_raw_IR;
bCheckResult=(volt_IR_int<((int)IRsensor_Lmax_TRESHOLD))||(volt_IR_int>((int)IRsensor_Hmin_TRESHOLD));
bCheckResult=bCheckResult&&(!((oFsensorPCB==ClFsensorPCB::_Rev03b)&&(volt_IR_int>((int)IRsensor_Hopen_TRESHOLD))));
return(bCheckResult);
}
#endif //IR_SENSOR_ANALOG

View File

@ -3,6 +3,7 @@
#define FSENSOR_H
#include <inttypes.h>
#include "config.h"
//! minimum meassured chunk length in steps
@ -20,6 +21,8 @@ extern bool fsensor_oq_meassure_enabled;
extern void fsensor_stop_and_save_print(void);
//! restore print - restore position and heatup to original temperature
extern void fsensor_restore_print_and_continue(void);
//! split the current gcode stream to insert new instructions
extern void fsensor_checkpoint_print(void);
//! @}
//! initialize
@ -27,8 +30,8 @@ extern void fsensor_init(void);
//! @name enable/disable
//! @{
extern bool fsensor_enable(void);
extern void fsensor_disable(void);
extern bool fsensor_enable(bool bUpdateEEPROM=true);
extern void fsensor_disable(bool bUpdateEEPROM=true);
//! @}
//autoload feature enabled
@ -57,12 +60,39 @@ extern void fsensor_oq_meassure_stop(void);
extern bool fsensor_oq_result(void);
//! @}
#include "planner.h"
//! @name callbacks from stepper
//! @{
extern void fsensor_st_block_begin(block_t* bl);
extern void fsensor_st_block_chunk(block_t* bl, int cnt);
extern void fsensor_st_block_chunk(int cnt);
// There's really nothing to do in block_begin: the stepper ISR likely has
// called us already at the end of the last block, making this integration
// redundant. LA1.5 might not always do that during a coasting move, so attempt
// to drain fsensor_st_cnt anyway at the beginning of the new block.
#define fsensor_st_block_begin(rev) fsensor_st_block_chunk(0)
//! @}
#if IR_SENSOR_ANALOG
#define IR_SENSOR_STEADY 10 // [ms]
enum class ClFsensorPCB:uint_least8_t
{
_Old=0,
_Rev03b=1,
_Undef=EEPROM_EMPTY_VALUE
};
enum class ClFsensorActionNA:uint_least8_t
{
_Continue=0,
_Pause=1,
_Undef=EEPROM_EMPTY_VALUE
};
extern ClFsensorPCB oFsensorPCB;
extern ClFsensorActionNA oFsensorActionNA;
extern bool fsensor_IR_check();
#endif //IR_SENSOR_ANALOG
#endif //FSENSOR_H

48
Firmware/la10compat.cpp Normal file
View File

@ -0,0 +1,48 @@
#include "la10compat.h"
#include "Marlin.h"
static LA10C_MODE la10c_mode = LA10C_UNKNOWN;
void la10c_mode_change(LA10C_MODE mode)
{
if(mode == la10c_mode) return;
SERIAL_ECHOPGM("LA10C: Linear Advance mode: ");
switch(mode)
{
case LA10C_UNKNOWN: SERIAL_ECHOLNPGM("UNKNOWN"); break;
case LA10C_LA15: SERIAL_ECHOLNPGM("1.5"); break;
case LA10C_LA10: SERIAL_ECHOLNPGM("1.0"); break;
}
la10c_mode = mode;
}
// Approximate a LA10 value to a LA15 equivalent.
static float la10c_convert(float k)
{
float new_K = k * 0.004 - 0.06;
return (new_K < 0? 0: new_K);
}
float la10c_value(float k)
{
if(la10c_mode == LA10C_UNKNOWN)
{
// do not autodetect until a valid value is seen
if(k == 0)
return 0;
else if(k < 0)
return -1;
la10c_mode_change(k < 10? LA10C_LA15: LA10C_LA10);
}
if(la10c_mode == LA10C_LA15)
return (k >= 0 && k < 10? k: -1);
else
return (k >= 0? la10c_convert(k): -1);
}

39
Firmware/la10compat.h Normal file
View File

@ -0,0 +1,39 @@
// la10compat: LA10->LA15 conversion
//
// When the current mode is UNKNOWN autodetection is active and any K<10
// will set the mode to LA15, LA10 is set otherwise. When LA10
// compatbility mode is active the K factor is converted to a LA15
// equivalent (that is, the return value is always a LA15 value).
//
// Once the interpretation mode has been set it is kept until the mode
// is explicitly reset. This is done to handle transparent fallback for
// old firmware revisions in combination with the following gcode
// sequence:
//
// M900 K0.01 ; set LA15 value (interpreted by any firmware)
// M900 K10 ; set LA10 value (ignored by LA15 firmware)
//
// A LA15 firmware without this module will only parse the first
// correctly, rejecting the second. A LA10 FW will parse both, but keep
// the last value. Since the LA15 value, if present, corresponds to the
// truth value, the compatibility stub needs to "lock" onto the first
// seen value for the current print.
//
// The mode needs to be carefully reset for each print in order for
// diffent versions of M900 to be interpreted independently.
#pragma once
enum __attribute__((packed)) LA10C_MODE
{
LA10C_UNKNOWN = 0,
LA10C_LA15 = 1,
LA10C_LA10 = 2
};
// Explicitly set/reset the interpretation mode for la10c_value()
void la10c_mode_change(LA10C_MODE mode);
static inline void la10c_reset() { la10c_mode_change(LA10C_UNKNOWN); }
// Return a LA15 K value according to the supplied value and mode
float la10c_value(float k);

View File

@ -17,10 +17,10 @@ uint8_t lang_selected = 0;
#if (LANG_MODE == 0) //primary language only
uint8_t lang_select(uint8_t lang) { return 0; }
uint8_t lang_select(__attribute__((unused)) uint8_t lang) { return 0; }
uint8_t lang_get_count() { return 1; }
uint16_t lang_get_code(uint8_t lang) { return LANG_CODE_EN; }
const char* lang_get_name_by_code(uint16_t code) { return _n("English"); }
uint16_t lang_get_code(__attribute__((unused)) uint8_t lang) { return LANG_CODE_EN; }
const char* lang_get_name_by_code(__attribute__((unused)) uint16_t code) { return _n("English"); }
void lang_reset(void) { }
uint8_t lang_is_selected(void) { return 1; }

View File

@ -761,8 +761,7 @@ void lcd_buttons_update(void)
//else if (menu_menu == lcd_move_z) lcd_quick_feedback();
//lcd_button_pressed is set back to false via lcd_quick_feedback function
}
else
lcd_long_press_active = 0;
lcd_long_press_active = 0;
}
lcd_buttons = newbutton;

View File

@ -15,7 +15,7 @@
extern int32_t lcd_encoder;
#define MENU_DEPTH_MAX 6
#define MENU_DEPTH_MAX 7
static menu_record_t menu_stack[MENU_DEPTH_MAX];
@ -102,7 +102,7 @@ void menu_back(void)
menu_back(1);
}
static void menu_back_no_reset(void)
void menu_back_no_reset(void)
{
if (menu_depth > 0)
{
@ -136,7 +136,7 @@ void menu_submenu(menu_func_t submenu)
}
}
static void menu_submenu_no_reset(menu_func_t submenu)
void menu_submenu_no_reset(menu_func_t submenu)
{
if (menu_depth < MENU_DEPTH_MAX)
{
@ -184,6 +184,22 @@ static void menu_draw_item_puts_P(char type_char, const char* str)
lcd_printf_P(PSTR("%c%-18.18S%c"), menu_selection_mark(), str, type_char);
}
static void menu_draw_toggle_puts_P(const char* str, const char* toggle, const uint8_t settings)
{
//settings:
//xxxxxcba
//a = selection mark. If it's set(1), then '>' will be used as the first character on the line. Else leave blank
//b = toggle string is from progmem
//c = do not set cursor at all. Must be handled externally.
char lineStr[LCD_WIDTH + 1];
const char eol = (toggle == NULL)?LCD_STR_ARROW_RIGHT[0]:' ';
if (toggle == NULL) toggle = _T(MSG_NA);
sprintf_P(lineStr, PSTR("%c%-18.18S"), (settings & 0x01)?'>':' ', str);
sprintf_P(lineStr + LCD_WIDTH - ((settings & 0x02)?strlen_P(toggle):strlen(toggle)) - 3, (settings & 0x02)?PSTR("[%S]%c"):PSTR("[%s]%c"), toggle, eol);
if (!(settings & 0x04)) lcd_set_cursor(0, menu_row);
fputs(lineStr, lcdout);
}
//! @brief Format sheet name
//!
//! @param[in] sheet_E Sheet in EEPROM
@ -375,6 +391,33 @@ uint8_t menu_item_function_P(const char* str, char number, void (*func)(uint8_t)
return 0;
}
uint8_t menu_item_toggle_P(const char* str, const char* toggle, menu_func_t func, const uint8_t settings)
{
if (menu_item == menu_line)
{
if (lcd_draw_update) menu_draw_toggle_puts_P(str, toggle, settings | (menu_selection_mark()=='>'));
if (menu_clicked && (lcd_encoder == menu_item))
{
if (toggle == NULL) // print N/A warning message
{
menu_submenu(func);
return menu_item_ret();
}
else // do the actual toggling
{
menu_clicked = false;
lcd_consume_click();
lcd_update_enabled = 0;
if (func) func();
lcd_update_enabled = 1;
return menu_item_ret();
}
}
}
menu_item++;
return 0;
}
uint8_t menu_item_gcode_P(const char* str, const char* str_gcode)
{
if (menu_item == menu_line)
@ -390,17 +433,12 @@ uint8_t menu_item_gcode_P(const char* str, const char* str_gcode)
return 0;
}
const char menu_20x_space[] PROGMEM = " ";
const char menu_fmt_int3[] PROGMEM = "%c%.15S:%s%3d";
const char menu_fmt_float31[] PROGMEM = "%-12.12S%+8.1f";
const char menu_fmt_float13[] PROGMEM = "%c%-13.13S%+5.3f";
const char menu_fmt_float13off[] PROGMEM = "%c%-13.13S%6.6s";
template<typename T>
static void menu_draw_P(char chr, const char* str, int16_t val);
@ -409,8 +447,8 @@ void menu_draw_P<int16_t*>(char chr, const char* str, int16_t val)
{
int text_len = strlen_P(str);
if (text_len > 15) text_len = 15;
char spaces[21];
strcpy_P(spaces, menu_20x_space);
char spaces[LCD_WIDTH + 1] = {0};
memset(spaces,' ', LCD_WIDTH);
if (val <= -100) spaces[15 - text_len - 1] = 0;
else spaces[15 - text_len] = 0;
lcd_printf_P(menu_fmt_int3, chr, str, spaces, val);
@ -423,7 +461,7 @@ void menu_draw_P<uint8_t*>(char chr, const char* str, int16_t val)
float factor = 1.0f + static_cast<float>(val) / 1000.0f;
if (val <= _md->minEditValue)
{
lcd_printf_P(menu_fmt_float13off, chr, str, " [off]");
menu_draw_toggle_puts_P(str, _T(MSG_OFF), 0x04 | 0x02 | (chr=='>'));
}
else
{

View File

@ -76,6 +76,7 @@ void menu_start(void);
extern void menu_end(void);
extern void menu_back(void);
extern void menu_back_no_reset(void);
extern void menu_back(uint8_t nLevel);
extern void menu_back_if_clicked(void);
@ -83,6 +84,7 @@ extern void menu_back_if_clicked(void);
extern void menu_back_if_clicked_fb(void);
extern void menu_submenu(menu_func_t submenu);
extern void menu_submenu_no_reset(menu_func_t submenu);
extern uint8_t menu_item_ret(void);
@ -118,6 +120,10 @@ extern uint8_t menu_item_function_P(const char* str, menu_func_t func);
#define MENU_ITEM_FUNCTION_NR_P(str, number, func, fn_par) do { if (menu_item_function_P(str, number, func, fn_par)) return; } while (0)
extern uint8_t menu_item_function_P(const char* str, char number, void (*func)(uint8_t), uint8_t fn_par);
#define MENU_ITEM_TOGGLE_P(str, toggle, func) do { if (menu_item_toggle_P(str, toggle, func, 0x02)) return; } while (0)
#define MENU_ITEM_TOGGLE(str, toggle, func) do { if (menu_item_toggle_P(str, toggle, func, 0x00)) return; } while (0)
extern uint8_t menu_item_toggle_P(const char* str, const char* toggle, menu_func_t func, const uint8_t settings);
#define MENU_ITEM_GCODE_P(str, str_gcode) do { if (menu_item_gcode_P(str, str_gcode)) return; } while (0)
extern uint8_t menu_item_gcode_P(const char* str, const char* str_gcode);
@ -127,7 +133,6 @@ extern const char menu_fmt_int3[];
extern const char menu_fmt_float31[];
extern const char menu_fmt_float13[];
extern void menu_draw_float31(const char* str, float val);
extern void menu_draw_float13(const char* str, float val);

View File

@ -9,7 +9,6 @@
//internationalized messages
const char MSG_AUTO_HOME[] PROGMEM_I1 = ISTR("Auto home"); ////
const char MSG_AUTO_MODE_ON[] PROGMEM_I1 = ISTR("Mode [auto power]"); ////
const char MSG_BABYSTEP_Z[] PROGMEM_I1 = ISTR("Live adjust Z"); //// c=18
const char MSG_BABYSTEP_Z_NOT_SET[] PROGMEM_I1 = ISTR("Distance between tip of the nozzle and the bed surface has not been set yet. Please follow the manual, chapter First steps, section First layer calibration."); ////c=20 r=12
const char MSG_BED[] PROGMEM_I1 = ISTR("Bed"); ////
@ -22,9 +21,7 @@ const char MSG_CARD_MENU[] PROGMEM_I1 = ISTR("Print from SD"); ////
const char MSG_CONFIRM_NOZZLE_CLEAN[] PROGMEM_I1 = ISTR("Please clean the nozzle for calibration. Click when done."); ////c=20 r=8
const char MSG_COOLDOWN[] PROGMEM_I1 = ISTR("Cooldown"); ////
const char MSG_CRASH_DETECTED[] PROGMEM_I1 = ISTR("Crash detected."); ////c=20 r=1
const char MSG_CRASHDETECT_NA[] PROGMEM_I1 = ISTR("Crash det. [N/A]"); ////
const char MSG_CRASHDETECT_OFF[] PROGMEM_I1 = ISTR("Crash det. [off]"); ////
const char MSG_CRASHDETECT_ON[] PROGMEM_I1 = ISTR("Crash det. [on]"); ////
const char MSG_CRASHDETECT[] PROGMEM_I1 = ISTR("Crash det."); ////
const char MSG_ERROR[] PROGMEM_I1 = ISTR("ERROR:"); ////
const char MSG_EXTRUDER[] PROGMEM_I1 = ISTR("Extruder"); ////c=17 r=1
const char MSG_FILAMENT[] PROGMEM_I1 = ISTR("Filament"); ////c=17 r=1
@ -40,9 +37,8 @@ const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE2[] PROGMEM_I1 = ISTR(" of 4"); ////
const char MSG_FINISHING_MOVEMENTS[] PROGMEM_I1 = ISTR("Finishing movements"); ////c=20 r=1
const char MSG_FOLLOW_CALIBRATION_FLOW[] PROGMEM_I1 = ISTR("Printer has not been calibrated yet. Please follow the manual, chapter First steps, section Calibration flow."); ////c=20 r=8
const char MSG_FOLLOW_Z_CALIBRATION_FLOW[] PROGMEM_I1 = ISTR("There is still a need to make Z calibration. Please follow the manual, chapter First steps, section Calibration flow."); ////c=20 r=8
const char MSG_FSENS_AUTOLOAD_NA[] PROGMEM_I1 = ISTR("F. autoload [N/A]"); ////c=17 r=1
const char MSG_FSENSOR_OFF[] PROGMEM_I1 = ISTR("Fil. sensor [off]"); ////
const char MSG_FSENSOR_ON[] PROGMEM_I1 = ISTR("Fil. sensor [on]"); ////
const char MSG_FSENSOR_AUTOLOAD[] PROGMEM_I1 = ISTR("F. autoload"); ////c=17 r=1
const char MSG_FSENSOR[] PROGMEM_I1 = ISTR("Fil. sensor"); ////
const char MSG_HEATING[] PROGMEM_I1 = ISTR("Heating"); ////
const char MSG_HEATING_COMPLETE[] PROGMEM_I1 = ISTR("Heating done."); ////c=20
const char MSG_HOMEYZ[] PROGMEM_I1 = ISTR("Calibrate Z"); ////
@ -85,14 +81,16 @@ const char MSG_SELFTEST_FILAMENT_SENSOR[] PROGMEM_I1 = ISTR("Filament sensor");
const char MSG_SELFTEST_WIRINGERROR[] PROGMEM_I1 = ISTR("Wiring error"); ////
const char MSG_SETTINGS[] PROGMEM_I1 = ISTR("Settings"); ////
const char MSG_HW_SETUP[] PROGMEM_I1 = ISTR("HW Setup"); ////
const char MSG_SILENT_MODE_OFF[] PROGMEM_I1 = ISTR("Mode [high power]"); ////
const char MSG_SILENT_MODE_ON[] PROGMEM_I1 = ISTR("Mode [silent]"); ////
const char MSG_STEALTH_MODE_OFF[] PROGMEM_I1 = ISTR("Mode [Normal]"); ////
const char MSG_STEALTH_MODE_ON[] PROGMEM_I1 = ISTR("Mode [Stealth]"); ////
const char MSG_MODE[] PROGMEM_I1 = ISTR("Mode"); ////
const char MSG_HIGH_POWER[] PROGMEM_I1 = ISTR("High power"); ////
const char MSG_AUTO_POWER[] PROGMEM_I1 = ISTR("Auto power"); ////
const char MSG_SILENT[] PROGMEM_I1 = ISTR("Silent"); ////
const char MSG_NORMAL[] PROGMEM_I1 = ISTR("Normal"); ////
const char MSG_STEALTH[] PROGMEM_I1 = ISTR("Stealth"); ////
const char MSG_STEEL_SHEET_CHECK[] PROGMEM_I1 = ISTR("Is steel sheet on heatbed?"); ////c=20 r=2
const char MSG_STOP_PRINT[] PROGMEM_I1 = ISTR("Stop print"); ////
const char MSG_STOPPED[] PROGMEM_I1 = ISTR("STOPPED. "); ////
const char MSG_TEMP_CALIBRATION[] PROGMEM_I1 = ISTR("Temp. cal. "); ////c=20 r=1
const char MSG_TEMP_CALIBRATION[] PROGMEM_I1 = ISTR("Temp. cal."); ////c=12 r=1
const char MSG_TEMP_CALIBRATION_DONE[] PROGMEM_I1 = ISTR("Temperature calibration is finished and active. Temp. calibration can be disabled in menu Settings->Temp. cal."); ////c=20 r=12
const char MSG_UNLOAD_FILAMENT[] PROGMEM_I1 = ISTR("Unload filament"); ////c=17
const char MSG_UNLOADING_FILAMENT[] PROGMEM_I1 = ISTR("Unloading filament"); ////c=20 r=1
@ -104,13 +102,48 @@ const char MSG_WIZARD_QUIT[] PROGMEM_I1 = ISTR("You can always resume the Wizard
const char MSG_YES[] PROGMEM_I1 = ISTR("Yes"); ////
const char MSG_V2_CALIBRATION[] PROGMEM_I1 = ISTR("First layer cal."); ////c=17 r=1
const char WELCOME_MSG[] PROGMEM_I1 = ISTR(CUSTOM_MENDEL_NAME " OK."); ////c=20
const char MSG_OFF[] PROGMEM_I1 = ISTR("Off"); ////
const char MSG_ON[] PROGMEM_I1 = ISTR("On"); ////
const char MSG_NA[] PROGMEM_I1 = ISTR("N/A"); ////
const char MSG_AUTO_DEPLETE[] PROGMEM_I1 = ISTR("SpoolJoin"); ////
const char MSG_CUTTER[] PROGMEM_I1 = ISTR("Cutter"); ////
const char MSG_NONE[] PROGMEM_I1 = ISTR("None"); ////
const char MSG_WARN[] PROGMEM_I1 = ISTR("Warn"); ////
const char MSG_STRICT[] PROGMEM_I1 = ISTR("Strict"); ////
const char MSG_MODEL[] PROGMEM_I1 = ISTR("Model"); ////
const char MSG_FIRMWARE[] PROGMEM_I1 = ISTR("Firmware"); ////
const char MSG_GCODE[] PROGMEM_I1 = ISTR("Gcode"); ////
const char MSG_NOZZLE_DIAMETER[] PROGMEM_I1 = ISTR("Nozzle d."); ////
const char MSG_MMU_MODE[] PROGMEM_I1 = ISTR("MMU Mode"); ////
const char MSG_SD_CARD[] PROGMEM_I1 = ISTR("SD card"); ////
const char MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY[] PROGMEM_I1 = ISTR("FlashAir"); ////
const char MSG_SORT[] PROGMEM_I1 = ISTR("Sort"); ////
const char MSG_SORT_TIME[] PROGMEM_I1 = ISTR("Time"); ////
const char MSG_SORT_ALPHA[] PROGMEM_I1 = ISTR("Alphabet"); ////
const char MSG_RPI_PORT[] PROGMEM_I1 = ISTR("RPi port"); ////
const char MSG_SOUND[] PROGMEM_I1 = ISTR("Sound"); ////
const char MSG_SOUND_LOUD[] PROGMEM_I1 = ISTR("Loud"); ////
const char MSG_SOUND_ONCE[] PROGMEM_I1 = ISTR("Once"); ////
const char MSG_SOUND_BLIND[] PROGMEM_I1 = ISTR("Assist"); ////
const char MSG_MESH[] PROGMEM_I1 = ISTR("Mesh"); ////
const char MSG_Z_PROBE_NR[] PROGMEM_I1 = ISTR("Z-probe nr."); ////
const char MSG_MAGNETS_COMP[] PROGMEM_I1 = ISTR("Magnets comp."); ////
const char MSG_FS_ACTION[] PROGMEM_I1 = ISTR("FS Action"); ////
const char MSG_FS_CONTINUE[] PROGMEM_I1 = ISTR("Cont."); ////
const char MSG_FS_PAUSE[] PROGMEM_I1 = ISTR("Pause"); ////
const char MSG_BRIGHTNESS[] PROGMEM_I1 = ISTR("Brightness"); ////
const char MSG_BL_HIGH[] PROGMEM_I1 = ISTR("Level Bright"); ////
const char MSG_BL_LOW[] PROGMEM_I1 = ISTR("Level Dimmed"); ////
const char MSG_TIMEOUT[] PROGMEM_I1 = ISTR("Timeout"); ////
const char MSG_BRIGHT[] PROGMEM_I1 = ISTR("Bright"); ////
const char MSG_DIM[] PROGMEM_I1 = ISTR("Dim"); ////
const char MSG_AUTO[] PROGMEM_I1 = ISTR("Auto"); ////
//not internationalized messages
const char MSG_SD_WORKDIR_FAIL[] PROGMEM_N1 = "workDir open failed"; ////
const char MSG_BROWNOUT_RESET[] PROGMEM_N1 = " Brown out Reset"; ////
const char MSG_EXTERNAL_RESET[] PROGMEM_N1 = " External Reset"; ////
const char MSG_FILE_SAVED[] PROGMEM_N1 = "Done saving file."; ////
const char MSG_OFF[] PROGMEM_N1 = "Off"; ////
const char MSG_ON[] PROGMEM_N1 = "On "; ////
const char MSG_POSITION_UNKNOWN[] PROGMEM_N1 = "Home X/Y before Z"; ////
const char MSG_SOFTWARE_RESET[] PROGMEM_N1 = " Software Reset"; ////
const char MSG_UNKNOWN_COMMAND[] PROGMEM_N1 = "Unknown command: \""; ////
@ -129,4 +162,12 @@ const char MSG_ENDSTOP_OPEN[] PROGMEM_N1 = "open"; ////
const char MSG_POWERUP[] PROGMEM_N1 = "PowerUp"; ////
const char MSG_ERR_STOPPED[] PROGMEM_N1 = "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)"; ////
const char MSG_ENDSTOP_HIT[] PROGMEM_N1 = "TRIGGERED"; ////
const char MSG_OCTOPRINT_PAUSE[] PROGMEM_N1 = "// action:pause"; ////
const char MSG_OCTOPRINT_PAUSED[] PROGMEM_N1 = "// action:paused"; ////
const char MSG_OCTOPRINT_RESUMED[] PROGMEM_N1 = "// action:resumed"; ////
const char MSG_OCTOPRINT_CANCEL[] PROGMEM_N1 = "// action:cancel"; ////
const char MSG_FANCHECK_EXTRUDER[] PROGMEM_N1 = "Err: EXTR. FAN ERROR"; ////c=20
const char MSG_FANCHECK_PRINT[] PROGMEM_N1 = "Err: PRINT FAN ERROR"; ////c=20
const char MSG_M112_KILL[] PROGMEM_N1 = "M112 called. Emergency Stop."; ////c=20
#ifdef LA_LIVE_K
const char MSG_ADVANCE_K[] PROGMEM_N1 = "Advance K:"; ////c=13
#endif

View File

@ -10,7 +10,6 @@ extern "C" {
// LCD Menu Messages
//internationalized messages
extern const char MSG_AUTO_HOME[];
extern const char MSG_AUTO_MODE_ON[];
extern const char MSG_BABYSTEP_Z[];
extern const char MSG_BABYSTEP_Z_NOT_SET[];
extern const char MSG_BED[];
@ -23,9 +22,7 @@ extern const char MSG_CARD_MENU[];
extern const char MSG_CONFIRM_NOZZLE_CLEAN[];
extern const char MSG_COOLDOWN[];
extern const char MSG_CRASH_DETECTED[];
extern const char MSG_CRASHDETECT_NA[];
extern const char MSG_CRASHDETECT_OFF[];
extern const char MSG_CRASHDETECT_ON[];
extern const char MSG_CRASHDETECT[];
extern const char MSG_ERROR[];
extern const char MSG_EXTRUDER[];
extern const char MSG_FILAMENT[];
@ -41,9 +38,8 @@ extern const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE2[];
extern const char MSG_FINISHING_MOVEMENTS[];
extern const char MSG_FOLLOW_CALIBRATION_FLOW[];
extern const char MSG_FOLLOW_Z_CALIBRATION_FLOW[];
extern const char MSG_FSENS_AUTOLOAD_NA[];
extern const char MSG_FSENSOR_OFF[];
extern const char MSG_FSENSOR_ON[];
extern const char MSG_FSENSOR_AUTOLOAD[];
extern const char MSG_FSENSOR[];
extern const char MSG_HEATING[];
extern const char MSG_HEATING_COMPLETE[];
extern const char MSG_HOMEYZ[];
@ -85,10 +81,12 @@ extern const char MSG_SELFTEST_FILAMENT_SENSOR[];
extern const char MSG_SELFTEST_WIRINGERROR[];
extern const char MSG_SETTINGS[];
extern const char MSG_HW_SETUP[];
extern const char MSG_SILENT_MODE_OFF[];
extern const char MSG_SILENT_MODE_ON[];
extern const char MSG_STEALTH_MODE_OFF[];
extern const char MSG_STEALTH_MODE_ON[];
extern const char MSG_MODE[];
extern const char MSG_HIGH_POWER[];
extern const char MSG_AUTO_POWER[];
extern const char MSG_SILENT[];
extern const char MSG_NORMAL[];
extern const char MSG_STEALTH[];
extern const char MSG_STEEL_SHEET_CHECK[];
extern const char MSG_STOP_PRINT[];
extern const char MSG_STOPPED[];
@ -104,12 +102,47 @@ extern const char MSG_WIZARD_QUIT[];
extern const char MSG_YES[];
extern const char MSG_V2_CALIBRATION[];
extern const char WELCOME_MSG[];
extern const char MSG_OFF[];
extern const char MSG_ON[];
extern const char MSG_NA[];
extern const char MSG_AUTO_DEPLETE[];
extern const char MSG_CUTTER[];
extern const char MSG_NONE[];
extern const char MSG_WARN[];
extern const char MSG_STRICT[];
extern const char MSG_MODEL[];
extern const char MSG_FIRMWARE[];
extern const char MSG_GCODE[];
extern const char MSG_NOZZLE_DIAMETER[];
extern const char MSG_MMU_MODE[];
extern const char MSG_SD_CARD[];
extern const char MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY[];
extern const char MSG_SORT[];
extern const char MSG_SORT_TIME[];
extern const char MSG_SORT_ALPHA[];
extern const char MSG_RPI_PORT[];
extern const char MSG_SOUND[];
extern const char MSG_SOUND_LOUD[];
extern const char MSG_SOUND_ONCE[];
extern const char MSG_SOUND_BLIND[];
extern const char MSG_MESH[];
extern const char MSG_Z_PROBE_NR[];
extern const char MSG_MAGNETS_COMP[];
extern const char MSG_FS_ACTION[];
extern const char MSG_FS_CONTINUE[];
extern const char MSG_FS_PAUSE[];
extern const char MSG_BRIGHTNESS[];
extern const char MSG_BL_HIGH[];
extern const char MSG_BL_LOW[];
extern const char MSG_TIMEOUT[];
extern const char MSG_BRIGHT[];
extern const char MSG_DIM[];
extern const char MSG_AUTO[];
//not internationalized messages
extern const char MSG_BROWNOUT_RESET[];
extern const char MSG_EXTERNAL_RESET[];
extern const char MSG_FILE_SAVED[];
extern const char MSG_OFF[];
extern const char MSG_ON[];
extern const char MSG_POSITION_UNKNOWN[];
extern const char MSG_SOFTWARE_RESET[];
extern const char MSG_UNKNOWN_COMMAND[];
@ -130,7 +163,13 @@ extern const char MSG_ERR_STOPPED[];
extern const char MSG_ENDSTOP_HIT[];
extern const char MSG_EJECT_FILAMENT[];
extern const char MSG_CUT_FILAMENT[];
extern const char MSG_OCTOPRINT_PAUSE[];
extern const char MSG_OCTOPRINT_PAUSED[];
extern const char MSG_OCTOPRINT_RESUMED[];
extern const char MSG_OCTOPRINT_CANCEL[];
extern const char MSG_FANCHECK_EXTRUDER[];
extern const char MSG_FANCHECK_PRINT[];
extern const char MSG_M112_KILL[];
extern const char MSG_ADVANCE_K[];
#if defined(__cplusplus)
}

View File

@ -70,6 +70,7 @@ uint8_t mmu_extruder = MMU_FILAMENT_UNKNOWN;
uint8_t tmp_extruder = MMU_FILAMENT_UNKNOWN;
int8_t mmu_finda = -1;
uint32_t mmu_last_finda_response = 0;
int16_t mmu_version = -1;
@ -264,6 +265,7 @@ void mmu_loop(void)
if (mmu_rx_ok() > 0)
{
fscanf_P(uart2io, PSTR("%hhu"), &mmu_finda); //scan finda from buffer
mmu_last_finda_response = _millis();
FDEBUG_PRINTF_P(PSTR("MMU => '%dok'\n"), mmu_finda);
puts_P(PSTR("MMU - ENABLED"));
mmu_enabled = true;
@ -376,11 +378,11 @@ void mmu_loop(void)
if (mmu_rx_ok() > 0)
{
fscanf_P(uart2io, PSTR("%hhu"), &mmu_finda); //scan finda from buffer
mmu_last_finda_response = _millis();
FDEBUG_PRINTF_P(PSTR("MMU => '%dok'\n"), mmu_finda);
//printf_P(PSTR("Eact: %d\n"), int(e_active()));
if (!mmu_finda && CHECK_FSENSOR && fsensor_enabled) {
fsensor_stop_and_save_print();
enquecommand_front_P(PSTR("PRUSA fsensor_recover")); //then recover
fsensor_checkpoint_print();
ad_markDepleted(mmu_extruder);
if (lcd_autoDepleteEnabled() && !ad_allDepleted())
{
@ -1074,27 +1076,6 @@ void mmu_filament_ramming()
}
}
//-//
void extr_unload_()
{
//if(bFilamentAction)
if(0)
{
bFilamentAction=false;
extr_unload();
}
else {
eFilamentAction=FilamentAction::MmuUnLoad;
bFilamentFirstRun=false;
if(target_temperature[0]>=EXTRUDE_MINTEMP)
{
bFilamentPreheatState=true;
mFilamentItem(target_temperature[0],target_temperature_bed);
}
// else menu_submenu(mFilamentMenu);
else mFilamentMenu();
}
}
//! @brief show which filament is currently unloaded
void extr_unload_view()
@ -1376,7 +1357,7 @@ void lcd_mmu_load_to_nozzle(uint8_t filament_nr)
manage_response(true, true, MMU_TCODE_MOVE);
mmu_continue_loading(false);
mmu_extruder = tmp_extruder; //filament change is finished
marlin_rise_z();
raise_z_above(MIN_Z_FOR_LOAD, false);
mmu_load_to_nozzle();
load_filament_final_feed();
st_synchronize();
@ -1566,7 +1547,7 @@ void mmu_continue_loading(bool blocking)
};
Ls state = Ls::Enter;
const uint_least8_t max_retry = 2;
const uint_least8_t max_retry = 3;
uint_least8_t retry = 0;
while (!success)
@ -1577,34 +1558,27 @@ void mmu_continue_loading(bool blocking)
increment_load_fail();
// no break
case Ls::Retry:
#ifdef MMU_HAS_CUTTER
if (1 == eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED))
++retry; // overflow not handled, as it is not dangerous.
if (retry >= max_retry)
{
mmu_command(MmuCmd::K0 + tmp_extruder);
manage_response(true, true, MMU_UNLOAD_MOVE);
}
state = Ls::Unload;
#ifdef MMU_HAS_CUTTER
if (1 == eeprom_read_byte((uint8_t*)EEPROM_MMU_CUTTER_ENABLED))
{
mmu_command(MmuCmd::K0 + tmp_extruder);
manage_response(true, true, MMU_UNLOAD_MOVE);
}
#endif //MMU_HAS_CUTTER
}
mmu_command(MmuCmd::T0 + tmp_extruder);
manage_response(true, true, MMU_TCODE_MOVE);
success = load_more();
if (success) success = can_load();
++retry; // overflow not handled, as it is not dangerous.
if (retry >= max_retry) state = Ls::Unload;
break;
case Ls::Unload:
stop_and_save_print_to_ram(0, 0);
//lift z
current_position[Z_AXIS] += Z_PAUSE_LIFT;
if (current_position[Z_AXIS] > Z_MAX_POS) current_position[Z_AXIS] = Z_MAX_POS;
plan_buffer_line_curposXYZE(15, active_extruder);
st_synchronize();
//Move XY to side
current_position[X_AXIS] = X_PAUSE_POS;
current_position[Y_AXIS] = Y_PAUSE_POS;
plan_buffer_line_curposXYZE(50, active_extruder);
st_synchronize();
long_pause();
mmu_command(MmuCmd::U0);
manage_response(false, true, MMU_UNLOAD_MOVE);
@ -1615,6 +1589,7 @@ void mmu_continue_loading(bool blocking)
if (blocking)
{
marlin_wait_for_click();
st_synchronize();
restore_print_from_ram_and_continue(0);
state = Ls::Retry;
}

View File

@ -14,6 +14,7 @@ extern uint8_t mmu_extruder;
extern uint8_t tmp_extruder;
extern int8_t mmu_finda;
extern uint32_t mmu_last_finda_response;
extern bool ir_sensor_detected;
extern int16_t mmu_version;
@ -105,8 +106,7 @@ extern int get_ext_nr();
extern void display_loading();
extern void extr_adj(uint8_t extruder);
extern void extr_unload();
//-//
extern void extr_unload_();
extern void extr_adj_0();
extern void extr_adj_1();
extern void extr_adj_2();

View File

@ -258,11 +258,11 @@ void optiboot_w25x20cl_enter()
uint32_t addr = (((uint32_t)rampz) << 16) | address;
// During a single bootloader run, only erase a 64kB block once.
// An 8bit bitmask 'pages_erased' covers 512kB of FLASH memory.
if (address == 0 && (pages_erased & (1 << addr)) == 0) {
if ((address == 0) && (pages_erased & (1 << (addr >> 16))) == 0) {
w25x20cl_wait_busy();
w25x20cl_enable_wr();
w25x20cl_block64_erase(addr);
pages_erased |= (1 << addr);
pages_erased |= (1 << (addr >> 16));
}
w25x20cl_wait_busy();
w25x20cl_enable_wr();

View File

@ -71,12 +71,13 @@
#define HEATER_2_PIN -1
#define TEMP_2_PIN -1
#define TEMP_AMBIENT_PIN 5 //A5
#define TEMP_AMBIENT_PIN 6 //A6
#define TEMP_PINDA_PIN 3 //A3
#define VOLT_PWR_PIN 4 //A4
#define VOLT_BED_PIN 9 //A9
#define VOLT_IR_PIN 8 //A8
#define E0_TMC2130_CS 66
@ -99,7 +100,7 @@
//#define KILL_PIN 32
//#define LCD_BL_PIN 5 //backlight control pin
#define LCD_BL_PIN 5 //backlight control pin
#define BEEPER 84 // Beeper on AUX-4
#define LCD_PINS_RS 82
#define LCD_PINS_ENABLE 61 // !!! changed from 18 (EINY03)

View File

@ -126,11 +126,14 @@ float extrude_min_temp=EXTRUDE_MINTEMP;
#endif
#ifdef LIN_ADVANCE
float extruder_advance_k = LIN_ADVANCE_K,
advance_ed_ratio = LIN_ADVANCE_E_D_RATIO,
position_float[NUM_AXIS] = { 0 };
float extruder_advance_K = LIN_ADVANCE_K;
float position_float[NUM_AXIS];
#endif
// Request the next block to start at zero E count
static bool plan_reset_next_e_queue;
static bool plan_reset_next_e_sched;
// Returns the index of the next block in the ring buffer
// NOTE: Removed modulo (%) operator, which uses an expensive divide and multiplication.
static inline int8_t next_block_index(int8_t block_index) {
@ -262,6 +265,13 @@ void calculate_trapezoid_for_block(block_t *block, float entry_speed, float exit
}
}
#ifdef LIN_ADVANCE
uint16_t final_adv_steps = 0;
if (block->use_advance_lead) {
final_adv_steps = exit_speed * block->adv_comp;
}
#endif
CRITICAL_SECTION_START; // Fill variables used by the stepper in a critical section
// This block locks the interrupts globally for 4.38 us,
// which corresponds to a maximum repeat frequency of 228.57 kHz.
@ -272,6 +282,9 @@ void calculate_trapezoid_for_block(block_t *block, float entry_speed, float exit
block->decelerate_after = accelerate_steps+plateau_steps;
block->initial_rate = initial_rate;
block->final_rate = final_rate;
#ifdef LIN_ADVANCE
block->final_adv_steps = final_adv_steps;
#endif
}
CRITICAL_SECTION_END;
}
@ -424,14 +437,16 @@ void plan_init() {
block_buffer_head = 0;
block_buffer_tail = 0;
memset(position, 0, sizeof(position)); // clear position
#ifdef LIN_ADVANCE
memset(position_float, 0, sizeof(position)); // clear position
#endif
#ifdef LIN_ADVANCE
memset(position_float, 0, sizeof(position_float)); // clear position
#endif
previous_speed[0] = 0.0;
previous_speed[1] = 0.0;
previous_speed[2] = 0.0;
previous_speed[3] = 0.0;
previous_nominal_speed = 0.0;
plan_reset_next_e_queue = false;
plan_reset_next_e_sched = false;
}
@ -639,7 +654,9 @@ void planner_abort_hard()
// Apply inverse world correction matrix.
machine2world(current_position[X_AXIS], current_position[Y_AXIS]);
memcpy(destination, current_position, sizeof(destination));
#ifdef LIN_ADVANCE
memcpy(position_float, current_position, sizeof(position_float));
#endif
// Resets planner junction speeds. Assumes start from rest.
previous_nominal_speed = 0.0;
previous_speed[0] = 0.0;
@ -647,6 +664,9 @@ void planner_abort_hard()
previous_speed[2] = 0.0;
previous_speed[3] = 0.0;
plan_reset_next_e_queue = false;
plan_reset_next_e_sched = false;
// Relay to planner wait routine, that the current line shall be canceled.
waiting_inside_plan_buffer_line_print_aborted = true;
}
@ -659,15 +679,15 @@ float junction_deviation = 0.1;
// Add a new linear movement to the buffer. steps_x, _y and _z is the absolute position in
// mm. Microseconds specify how many microseconds the move should take to perform. To aid acceleration
// calculation the caller must also provide the physical length of the line in millimeters.
void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate, uint8_t extruder)
void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate, uint8_t extruder, const float* gcode_target)
{
// Calculate the buffer head after we push this byte
int next_buffer_head = next_block_index(block_buffer_head);
// If the buffer is full: good! That means we are well ahead of the robot.
// Rest here until there is room in the buffer.
waiting_inside_plan_buffer_line_print_aborted = false;
if (block_buffer_tail == next_buffer_head) {
waiting_inside_plan_buffer_line_print_aborted = false;
do {
manage_heater();
// Vojtech: Don't disable motors inside the planner!
@ -687,6 +707,43 @@ void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate
planner_update_queue_min_counter();
#endif /* PLANNER_DIAGNOSTICS */
// Prepare to set up new block
block_t *block = &block_buffer[block_buffer_head];
// Mark block as not busy (Not executed by the stepper interrupt, could be still tinkered with.)
block->busy = false;
// Set sdlen for calculating sd position
block->sdlen = 0;
// Save original destination of the move
if (gcode_target)
memcpy(block->gcode_target, gcode_target, sizeof(block_t::gcode_target));
else
{
block->gcode_target[X_AXIS] = x;
block->gcode_target[Y_AXIS] = y;
block->gcode_target[Z_AXIS] = z;
block->gcode_target[E_AXIS] = e;
}
// Save the global feedrate at scheduling time
block->gcode_feedrate = feedrate;
// Reset the starting E position when requested
if (plan_reset_next_e_queue)
{
position[E_AXIS] = 0;
#ifdef LIN_ADVANCE
position_float[E_AXIS] = 0;
#endif
// the block might still be discarded later, but we need to ensure the lower-level
// count_position is also reset correctly for consistent results!
plan_reset_next_e_queue = false;
plan_reset_next_e_sched = true;
}
#ifdef ENABLE_AUTO_BED_LEVELING
apply_rotation_xyz(plan_bed_level_matrix, x, y, z);
#endif // ENABLE_AUTO_BED_LEVELING
@ -752,21 +809,15 @@ void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate
#endif // ENABLE_MESH_BED_LEVELING
target[E_AXIS] = lround(e*cs.axis_steps_per_unit[E_AXIS]);
#ifdef LIN_ADVANCE
const float mm_D_float = sqrt(sq(x - position_float[X_AXIS]) + sq(y - position_float[Y_AXIS]));
float de_float = e - position_float[E_AXIS];
#endif
#ifdef PREVENT_DANGEROUS_EXTRUDE
if(target[E_AXIS]!=position[E_AXIS])
{
if(degHotend(active_extruder)<extrude_min_temp)
{
position[E_AXIS]=target[E_AXIS]; //behave as if the move really took place, but ignore E part
#ifdef LIN_ADVANCE
#ifdef LIN_ADVANCE
position_float[E_AXIS] = e;
de_float = 0;
#endif
#endif
SERIAL_ECHO_START;
SERIAL_ECHOLNRPGM(_n(" cold extrusion prevented"));////MSG_ERR_COLD_EXTRUDE_STOP
}
@ -775,10 +826,9 @@ void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate
if(labs(target[E_AXIS]-position[E_AXIS])>cs.axis_steps_per_unit[E_AXIS]*EXTRUDE_MAXLENGTH)
{
position[E_AXIS]=target[E_AXIS]; //behave as if the move really took place, but ignore E part
#ifdef LIN_ADVANCE
position_float[E_AXIS] = e;
de_float = 0;
#endif
#ifdef LIN_ADVANCE
position_float[E_AXIS] = e;
#endif
SERIAL_ECHO_START;
SERIAL_ECHOLNRPGM(_n(" too long extrusion prevented"));////MSG_ERR_LONG_EXTRUDE_STOP
}
@ -786,15 +836,6 @@ void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate
}
#endif
// Prepare to set up new block
block_t *block = &block_buffer[block_buffer_head];
// Set sdlen for calculating sd position
block->sdlen = 0;
// Mark block as not busy (Not executed by the stepper interrupt, could be still tinkered with.)
block->busy = false;
// Number of steps for each axis
#ifndef COREXY
// default non-h-bot planning
@ -998,6 +1039,9 @@ Having the real displacement of the head, we can calculate the total movement le
block->nominal_rate *= speed_factor;
}
#ifdef LIN_ADVANCE
float e_D_ratio = 0;
#endif
// Compute and limit the acceleration rate for the trapezoid generator.
// block->step_event_count ... event count of the fastest axis
// block->millimeters ... Euclidian length of the XYZ movement or the E length, if no XYZ movement.
@ -1005,10 +1049,51 @@ Having the real displacement of the head, we can calculate the total movement le
if(block->steps_x.wide == 0 && block->steps_y.wide == 0 && block->steps_z.wide == 0)
{
block->acceleration_st = ceil(cs.retract_acceleration * steps_per_mm); // convert to: acceleration steps/sec^2
#ifdef LIN_ADVANCE
block->use_advance_lead = false;
#endif
}
else
{
block->acceleration_st = ceil(cs.acceleration * steps_per_mm); // convert to: acceleration steps/sec^2
#ifdef LIN_ADVANCE
/**
* Use LIN_ADVANCE within this block if all these are true:
*
* block->steps_e : This is a print move, because we checked for X, Y, Z steps before.
* extruder_advance_K : There is an advance factor set.
* delta_mm[E_AXIS] > 0 : Extruder is running forward (e.g., for "Wipe while retracting" (Slic3r) or "Combing" (Cura) moves)
* |delta_mm[Z_AXIS]| < 0.5 : Z is only moved for leveling (_not_ for priming)
*/
block->use_advance_lead = block->steps_e.wide
&& extruder_advance_K
&& delta_mm[E_AXIS] > 0
&& abs(delta_mm[Z_AXIS]) < 0.5;
if (block->use_advance_lead) {
e_D_ratio = (e - position_float[E_AXIS]) /
sqrt(sq(x - position_float[X_AXIS])
+ sq(y - position_float[Y_AXIS])
+ sq(z - position_float[Z_AXIS]));
// Check for unusual high e_D ratio to detect if a retract move was combined with the last
// print move due to min. steps per segment. Never execute this with advance! This assumes
// no one will use a retract length of 0mm < retr_length < ~0.2mm and no one will print
// 100mm wide lines using 3mm filament or 35mm wide lines using 1.75mm filament.
if (e_D_ratio > 3.0)
block->use_advance_lead = false;
else {
const uint32_t max_accel_steps_per_s2 = cs.max_jerk[E_AXIS] / (extruder_advance_K * e_D_ratio) * steps_per_mm;
if (block->acceleration_st > max_accel_steps_per_s2) {
block->acceleration_st = max_accel_steps_per_s2;
#ifdef LA_DEBUG
SERIAL_ECHOLNPGM("LA: Block acceleration limited due to max E-jerk");
#endif
}
}
}
#endif
// Limit acceleration per axis
//FIXME Vojtech: One shall rather limit a projection of the acceleration vector instead of using the limit.
if(((float)block->acceleration_st * (float)block->steps_x.wide / (float)block->step_event_count.wide) > axis_steps_per_sqr_second[X_AXIS])
@ -1041,6 +1126,40 @@ Having the real displacement of the head, we can calculate the total movement le
block->acceleration_rate = (long)((float)block->acceleration_st * (16777216.0 / (F_CPU / 8.0)));
#ifdef LIN_ADVANCE
if (block->use_advance_lead) {
// the nominal speed doesn't change past this point: calculate the compression ratio for the
// segment and the required advance steps
block->adv_comp = extruder_advance_K * e_D_ratio * cs.axis_steps_per_unit[E_AXIS];
block->max_adv_steps = block->nominal_speed * block->adv_comp;
// to save more space we avoid another copy of calc_timer and go through slow division, but we
// still need to replicate the *exact* same step grouping policy (see below)
float advance_speed = (extruder_advance_K * e_D_ratio * block->acceleration * cs.axis_steps_per_unit[E_AXIS]);
if (advance_speed > MAX_STEP_FREQUENCY) advance_speed = MAX_STEP_FREQUENCY;
block->advance_rate = (F_CPU / 8.0) / advance_speed;
if (block->advance_rate > 20000) {
block->advance_rate = (block->advance_rate >> 2)&0x3fff;
block->advance_step_loops = 4;
}
else if (block->advance_rate > 10000) {
block->advance_rate = (block->advance_rate >> 1)&0x7fff;
block->advance_step_loops = 2;
}
else
block->advance_step_loops = 1;
#ifdef LA_DEBUG
if (block->advance_step_loops > 2)
// @wavexx: we should really check for the difference between step_loops and
// advance_step_loops instead. A difference of more than 1 will lead
// to uneven speed and *should* be adjusted here by furthermore
// reducing the speed.
SERIAL_ECHOLNPGM("LA: More than 2 steps per eISR loop executed.");
#endif
}
#endif
// Start with a safe speed.
// Safe speed is the speed, from which the machine may halt to stop immediately.
float safe_speed = block->nominal_speed;
@ -1069,6 +1188,13 @@ Having the real displacement of the head, we can calculate the total movement le
// Reset the block flag.
block->flag = 0;
if (plan_reset_next_e_sched)
{
// finally propagate a pending reset
block->flag |= BLOCK_FLAG_E_RESET;
plan_reset_next_e_sched = false;
}
// Initial limit on the segment entry velocity.
float vmax_junction;
@ -1157,37 +1283,6 @@ Having the real displacement of the head, we can calculate the total movement le
previous_nominal_speed = block->nominal_speed;
previous_safe_speed = safe_speed;
#ifdef LIN_ADVANCE
//
// Use LIN_ADVANCE for blocks if all these are true:
//
// esteps : We have E steps todo (a printing move)
//
// block->steps[X_AXIS] || block->steps[Y_AXIS] : We have a movement in XY direction (i.e., not retract / prime).
//
// extruder_advance_k : There is an advance factor set.
//
// block->steps[E_AXIS] != block->step_event_count : A problem occurs if the move before a retract is too small.
// In that case, the retract and move will be executed together.
// This leads to too many advance steps due to a huge e_acceleration.
// The math is good, but we must avoid retract moves with advance!
// de_float > 0.0 : Extruder is running forward (e.g., for "Wipe while retracting" (Slic3r) or "Combing" (Cura) moves)
//
block->use_advance_lead = block->steps_e.wide
&& (block->steps_x.wide || block->steps_y.wide)
&& extruder_advance_k
&& (uint32_t)block->steps_e.wide != block->step_event_count.wide
&& de_float > 0.0;
if (block->use_advance_lead)
block->abs_adv_steps_multiplier8 = lround(
extruder_advance_k
* ((advance_ed_ratio < 0.000001) ? de_float / mm_D_float : advance_ed_ratio) // Use the fixed ratio, if set
* (block->nominal_speed / (float)block->nominal_rate)
* cs.axis_steps_per_unit[E_AXIS] * 256.0
);
#endif
// Precalculate the division, so when all the trapezoids in the planner queue get recalculated, the division is not repeated.
block->speed_factor = block->nominal_rate / block->nominal_speed;
calculate_trapezoid_for_block(block, block->entry_speed, safe_speed);
@ -1201,12 +1296,12 @@ Having the real displacement of the head, we can calculate the total movement le
// Update position
memcpy(position, target, sizeof(target)); // position[] = target[]
#ifdef LIN_ADVANCE
#ifdef LIN_ADVANCE
position_float[X_AXIS] = x;
position_float[Y_AXIS] = y;
position_float[Z_AXIS] = z;
position_float[E_AXIS] = e;
#endif
#endif
// Recalculate the trapezoids to maximize speed at the segment transitions while respecting
// the machine limits (maximum acceleration and maximum jerk).
@ -1269,12 +1364,12 @@ void plan_set_position(float x, float y, float z, const float &e)
position[Z_AXIS] = lround(z*cs.axis_steps_per_unit[Z_AXIS]);
#endif // ENABLE_MESH_BED_LEVELING
position[E_AXIS] = lround(e*cs.axis_steps_per_unit[E_AXIS]);
#ifdef LIN_ADVANCE
#ifdef LIN_ADVANCE
position_float[X_AXIS] = x;
position_float[Y_AXIS] = y;
position_float[Z_AXIS] = z;
position_float[E_AXIS] = e;
#endif
#endif
st_set_position(position[X_AXIS], position[Y_AXIS], position[Z_AXIS], position[E_AXIS]);
previous_nominal_speed = 0.0; // Resets planner junction speeds. Assumes start from rest.
previous_speed[0] = 0.0;
@ -1286,11 +1381,11 @@ void plan_set_position(float x, float y, float z, const float &e)
// Only useful in the bed leveling routine, when the mesh bed leveling is off.
void plan_set_z_position(const float &z)
{
#ifdef LIN_ADVANCE
position_float[Z_AXIS] = z;
#endif
position[Z_AXIS] = lround(z*cs.axis_steps_per_unit[Z_AXIS]);
st_set_position(position[X_AXIS], position[Y_AXIS], position[Z_AXIS], position[E_AXIS]);
#ifdef LIN_ADVANCE
position_float[Z_AXIS] = z;
#endif
position[Z_AXIS] = lround(z*cs.axis_steps_per_unit[Z_AXIS]);
st_set_position(position[X_AXIS], position[Y_AXIS], position[Z_AXIS], position[E_AXIS]);
}
void plan_set_e_position(const float &e)
@ -1302,6 +1397,11 @@ void plan_set_e_position(const float &e)
st_set_e_position(position[E_AXIS]);
}
void plan_reset_next_e()
{
plan_reset_next_e_queue = true;
}
#ifdef PREVENT_DANGEROUS_EXTRUDE
void set_extrude_min_temp(float temp)
{

View File

@ -44,6 +44,8 @@ enum BlockFlag {
// than 32767, therefore the DDA algorithm may run with 16bit resolution only.
// In addition, the stepper routine will not do any end stop checking for higher performance.
BLOCK_FLAG_DDA_LOWRES = 8,
// Block starts with Zeroed E counter
BLOCK_FLAG_E_RESET = 16,
};
union dda_isteps_t
@ -110,17 +112,24 @@ typedef struct {
// Pre-calculated division for the calculate_trapezoid_for_block() routine to run faster.
float speed_factor;
#ifdef LIN_ADVANCE
bool use_advance_lead;
unsigned long abs_adv_steps_multiplier8; // Factorised by 2^8 to avoid float
bool use_advance_lead; // Whether the current block uses LA
uint16_t advance_rate, // Step-rate for extruder speed
max_adv_steps, // max. advance steps to get cruising speed pressure (not always nominal_speed!)
final_adv_steps; // advance steps due to exit speed
uint8_t advance_step_loops; // Number of stepper ticks for each advance isr
float adv_comp; // Precomputed E compression factor
#endif
uint16_t sdlen;
// Save/recovery state data
float gcode_target[NUM_AXIS]; // Target (abs mm) of the original Gcode instruction
uint16_t gcode_feedrate; // Default and/or move feedrate
uint16_t sdlen; // Length of the Gcode instruction
} block_t;
#ifdef LIN_ADVANCE
extern float extruder_advance_k, advance_ed_ratio;
extern float extruder_advance_K; // Linear-advance K factor
#endif
#ifdef ENABLE_AUTO_BED_LEVELING
@ -147,7 +156,7 @@ vector_3 plan_get_position();
/// The performance penalty is negligible, since these planned lines are usually maintenance moves with the extruder.
void plan_buffer_line_curposXYZE(float feed_rate, uint8_t extruder);
void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate, uint8_t extruder);
void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate, uint8_t extruder, const float* gcode_target = NULL);
//void plan_buffer_line(const float &x, const float &y, const float &z, const float &e, float feed_rate, const uint8_t &extruder);
#endif // ENABLE_AUTO_BED_LEVELING
@ -161,6 +170,9 @@ void plan_set_position(float x, float y, float z, const float &e);
void plan_set_z_position(const float &z);
void plan_set_e_position(const float &e);
// Reset the E position to zero at the start of the next segment
void plan_reset_next_e();
extern bool e_active();
void check_axes_activity();
@ -238,6 +250,7 @@ FORCE_INLINE bool planner_queue_full() {
// wait for the steppers to stop,
// update planner's current position and the current_position of the front end.
extern void planner_abort_hard();
extern bool waiting_inside_plan_buffer_line_print_aborted;
#ifdef PREVENT_DANGEROUS_EXTRUDE
void set_extrude_min_temp(float temp);

View File

@ -5,6 +5,7 @@
//#include <inttypes.h>
//#include <avr/eeprom.h>
//#include "eeprom.h"
#include "backlight.h"
//eSOUND_MODE eSoundMode=e_SOUND_MODE_LOUD;
@ -63,6 +64,7 @@ Sound_SaveMode();
//if critical is true then silend and once mode is ignored
void Sound_MakeCustom(uint16_t ms,uint16_t tone_,bool critical){
backlight_wake();
if (!critical){
if (eSoundMode != e_SOUND_MODE_SILENT){
if(!tone_){
@ -135,6 +137,7 @@ switch(eSoundMode)
static void Sound_DoSound_Blind_Alert(void)
{
backlight_wake(1);
uint8_t nI;
for(nI=0; nI<20; nI++)
@ -148,6 +151,7 @@ static void Sound_DoSound_Blind_Alert(void)
static void Sound_DoSound_Encoder_Move(void)
{
backlight_wake();
uint8_t nI;
for(nI=0;nI<5;nI++)
@ -161,6 +165,7 @@ uint8_t nI;
static void Sound_DoSound_Echo(void)
{
backlight_wake();
uint8_t nI;
for(nI=0;nI<10;nI++)
@ -174,6 +179,7 @@ for(nI=0;nI<10;nI++)
static void Sound_DoSound_Prompt(void)
{
backlight_wake(2);
WRITE(BEEPER,HIGH);
_delay_ms(500);
WRITE(BEEPER,LOW);
@ -181,6 +187,7 @@ WRITE(BEEPER,LOW);
static void Sound_DoSound_Alert(bool bOnce)
{
backlight_wake();
uint8_t nI,nMax;
nMax=bOnce?1:3;

View File

@ -3,12 +3,6 @@
#define SOUND_H
#define MSG_SOUND_MODE_LOUD "Sound [loud]"
#define MSG_SOUND_MODE_ONCE "Sound [once]"
#define MSG_SOUND_MODE_SILENT "Sound [silent]"
#define MSG_SOUND_MODE_BLIND "Sound [assist]"
#define e_SOUND_MODE_NULL 0xFF
typedef enum
{e_SOUND_MODE_LOUD,e_SOUND_MODE_ONCE,e_SOUND_MODE_SILENT,e_SOUND_MODE_BLIND} eSOUND_MODE;

View File

@ -0,0 +1,147 @@
#include "speed_lookuptable.h"
#if F_CPU == 16000000
const uint16_t speed_lookuptable_fast[256][2] PROGMEM = {\
{ 62500, 55556}, { 6944, 3268}, { 3676, 1176}, { 2500, 607}, { 1893, 369}, { 1524, 249}, { 1275, 179}, { 1096, 135},
{ 961, 105}, { 856, 85}, { 771, 69}, { 702, 58}, { 644, 49}, { 595, 42}, { 553, 37}, { 516, 32},
{ 484, 28}, { 456, 25}, { 431, 23}, { 408, 20}, { 388, 19}, { 369, 16}, { 353, 16}, { 337, 14},
{ 323, 13}, { 310, 11}, { 299, 11}, { 288, 11}, { 277, 9}, { 268, 9}, { 259, 8}, { 251, 8},
{ 243, 8}, { 235, 7}, { 228, 6}, { 222, 6}, { 216, 6}, { 210, 6}, { 204, 5}, { 199, 5},
{ 194, 5}, { 189, 4}, { 185, 4}, { 181, 4}, { 177, 4}, { 173, 4}, { 169, 4}, { 165, 3},
{ 162, 3}, { 159, 4}, { 155, 3}, { 152, 3}, { 149, 2}, { 147, 3}, { 144, 3}, { 141, 2},
{ 139, 3}, { 136, 2}, { 134, 2}, { 132, 3}, { 129, 2}, { 127, 2}, { 125, 2}, { 123, 2},
{ 121, 2}, { 119, 1}, { 118, 2}, { 116, 2}, { 114, 1}, { 113, 2}, { 111, 2}, { 109, 1},
{ 108, 2}, { 106, 1}, { 105, 2}, { 103, 1}, { 102, 1}, { 101, 1}, { 100, 2}, { 98, 1},
{ 97, 1}, { 96, 1}, { 95, 2}, { 93, 1}, { 92, 1}, { 91, 1}, { 90, 1}, { 89, 1},
{ 88, 1}, { 87, 1}, { 86, 1}, { 85, 1}, { 84, 1}, { 83, 0}, { 83, 1}, { 82, 1},
{ 81, 1}, { 80, 1}, { 79, 1}, { 78, 0}, { 78, 1}, { 77, 1}, { 76, 1}, { 75, 0},
{ 75, 1}, { 74, 1}, { 73, 1}, { 72, 0}, { 72, 1}, { 71, 1}, { 70, 0}, { 70, 1},
{ 69, 0}, { 69, 1}, { 68, 1}, { 67, 0}, { 67, 1}, { 66, 0}, { 66, 1}, { 65, 0},
{ 65, 1}, { 64, 1}, { 63, 0}, { 63, 1}, { 62, 0}, { 62, 1}, { 61, 0}, { 61, 1},
{ 60, 0}, { 60, 0}, { 60, 1}, { 59, 0}, { 59, 1}, { 58, 0}, { 58, 1}, { 57, 0},
{ 57, 1}, { 56, 0}, { 56, 0}, { 56, 1}, { 55, 0}, { 55, 1}, { 54, 0}, { 54, 0},
{ 54, 1}, { 53, 0}, { 53, 0}, { 53, 1}, { 52, 0}, { 52, 0}, { 52, 1}, { 51, 0},
{ 51, 0}, { 51, 1}, { 50, 0}, { 50, 0}, { 50, 1}, { 49, 0}, { 49, 0}, { 49, 1},
{ 48, 0}, { 48, 0}, { 48, 1}, { 47, 0}, { 47, 0}, { 47, 0}, { 47, 1}, { 46, 0},
{ 46, 0}, { 46, 1}, { 45, 0}, { 45, 0}, { 45, 0}, { 45, 1}, { 44, 0}, { 44, 0},
{ 44, 0}, { 44, 1}, { 43, 0}, { 43, 0}, { 43, 0}, { 43, 1}, { 42, 0}, { 42, 0},
{ 42, 0}, { 42, 1}, { 41, 0}, { 41, 0}, { 41, 0}, { 41, 0}, { 41, 1}, { 40, 0},
{ 40, 0}, { 40, 0}, { 40, 0}, { 40, 1}, { 39, 0}, { 39, 0}, { 39, 0}, { 39, 0},
{ 39, 1}, { 38, 0}, { 38, 0}, { 38, 0}, { 38, 0}, { 38, 1}, { 37, 0}, { 37, 0},
{ 37, 0}, { 37, 0}, { 37, 0}, { 37, 1}, { 36, 0}, { 36, 0}, { 36, 0}, { 36, 0},
{ 36, 1}, { 35, 0}, { 35, 0}, { 35, 0}, { 35, 0}, { 35, 0}, { 35, 0}, { 35, 1},
{ 34, 0}, { 34, 0}, { 34, 0}, { 34, 0}, { 34, 0}, { 34, 1}, { 33, 0}, { 33, 0},
{ 33, 0}, { 33, 0}, { 33, 0}, { 33, 0}, { 33, 1}, { 32, 0}, { 32, 0}, { 32, 0},
{ 32, 0}, { 32, 0}, { 32, 0}, { 32, 0}, { 32, 1}, { 31, 0}, { 31, 0}, { 31, 0},
{ 31, 0}, { 31, 0}, { 31, 0}, { 31, 1}, { 30, 0}, { 30, 0}, { 30, 0}, { 30, 0}
};
const uint16_t speed_lookuptable_slow[256][2] PROGMEM = {\
{ 62500, 12500}, { 50000, 8334}, { 41666, 5952}, { 35714, 4464}, { 31250, 3473}, { 27777, 2777}, { 25000, 2273}, { 22727, 1894},
{ 20833, 1603}, { 19230, 1373}, { 17857, 1191}, { 16666, 1041}, { 15625, 920}, { 14705, 817}, { 13888, 731}, { 13157, 657},
{ 12500, 596}, { 11904, 541}, { 11363, 494}, { 10869, 453}, { 10416, 416}, { 10000, 385}, { 9615, 356}, { 9259, 331},
{ 8928, 308}, { 8620, 287}, { 8333, 269}, { 8064, 252}, { 7812, 237}, { 7575, 223}, { 7352, 210}, { 7142, 198},
{ 6944, 188}, { 6756, 178}, { 6578, 168}, { 6410, 160}, { 6250, 153}, { 6097, 145}, { 5952, 139}, { 5813, 132},
{ 5681, 126}, { 5555, 121}, { 5434, 115}, { 5319, 111}, { 5208, 106}, { 5102, 102}, { 5000, 99}, { 4901, 94},
{ 4807, 91}, { 4716, 87}, { 4629, 84}, { 4545, 81}, { 4464, 79}, { 4385, 75}, { 4310, 73}, { 4237, 71},
{ 4166, 68}, { 4098, 66}, { 4032, 64}, { 3968, 62}, { 3906, 60}, { 3846, 59}, { 3787, 56}, { 3731, 55},
{ 3676, 53}, { 3623, 52}, { 3571, 50}, { 3521, 49}, { 3472, 48}, { 3424, 46}, { 3378, 45}, { 3333, 44},
{ 3289, 43}, { 3246, 41}, { 3205, 41}, { 3164, 39}, { 3125, 39}, { 3086, 38}, { 3048, 36}, { 3012, 36},
{ 2976, 35}, { 2941, 35}, { 2906, 33}, { 2873, 33}, { 2840, 32}, { 2808, 31}, { 2777, 30}, { 2747, 30},
{ 2717, 29}, { 2688, 29}, { 2659, 28}, { 2631, 27}, { 2604, 27}, { 2577, 26}, { 2551, 26}, { 2525, 25},
{ 2500, 25}, { 2475, 25}, { 2450, 23}, { 2427, 24}, { 2403, 23}, { 2380, 22}, { 2358, 22}, { 2336, 22},
{ 2314, 21}, { 2293, 21}, { 2272, 20}, { 2252, 20}, { 2232, 20}, { 2212, 20}, { 2192, 19}, { 2173, 18},
{ 2155, 19}, { 2136, 18}, { 2118, 18}, { 2100, 17}, { 2083, 17}, { 2066, 17}, { 2049, 17}, { 2032, 16},
{ 2016, 16}, { 2000, 16}, { 1984, 16}, { 1968, 15}, { 1953, 16}, { 1937, 14}, { 1923, 15}, { 1908, 15},
{ 1893, 14}, { 1879, 14}, { 1865, 14}, { 1851, 13}, { 1838, 14}, { 1824, 13}, { 1811, 13}, { 1798, 13},
{ 1785, 12}, { 1773, 13}, { 1760, 12}, { 1748, 12}, { 1736, 12}, { 1724, 12}, { 1712, 12}, { 1700, 11},
{ 1689, 12}, { 1677, 11}, { 1666, 11}, { 1655, 11}, { 1644, 11}, { 1633, 10}, { 1623, 11}, { 1612, 10},
{ 1602, 10}, { 1592, 10}, { 1582, 10}, { 1572, 10}, { 1562, 10}, { 1552, 9}, { 1543, 10}, { 1533, 9},
{ 1524, 9}, { 1515, 9}, { 1506, 9}, { 1497, 9}, { 1488, 9}, { 1479, 9}, { 1470, 9}, { 1461, 8},
{ 1453, 8}, { 1445, 9}, { 1436, 8}, { 1428, 8}, { 1420, 8}, { 1412, 8}, { 1404, 8}, { 1396, 8},
{ 1388, 7}, { 1381, 8}, { 1373, 7}, { 1366, 8}, { 1358, 7}, { 1351, 7}, { 1344, 8}, { 1336, 7},
{ 1329, 7}, { 1322, 7}, { 1315, 7}, { 1308, 6}, { 1302, 7}, { 1295, 7}, { 1288, 6}, { 1282, 7},
{ 1275, 6}, { 1269, 7}, { 1262, 6}, { 1256, 6}, { 1250, 7}, { 1243, 6}, { 1237, 6}, { 1231, 6},
{ 1225, 6}, { 1219, 6}, { 1213, 6}, { 1207, 6}, { 1201, 5}, { 1196, 6}, { 1190, 6}, { 1184, 5},
{ 1179, 6}, { 1173, 5}, { 1168, 6}, { 1162, 5}, { 1157, 5}, { 1152, 6}, { 1146, 5}, { 1141, 5},
{ 1136, 5}, { 1131, 5}, { 1126, 5}, { 1121, 5}, { 1116, 5}, { 1111, 5}, { 1106, 5}, { 1101, 5},
{ 1096, 5}, { 1091, 5}, { 1086, 4}, { 1082, 5}, { 1077, 5}, { 1072, 4}, { 1068, 5}, { 1063, 4},
{ 1059, 5}, { 1054, 4}, { 1050, 4}, { 1046, 5}, { 1041, 4}, { 1037, 4}, { 1033, 5}, { 1028, 4},
{ 1024, 4}, { 1020, 4}, { 1016, 4}, { 1012, 4}, { 1008, 4}, { 1004, 4}, { 1000, 4}, { 996, 4},
{ 992, 4}, { 988, 4}, { 984, 4}, { 980, 4}, { 976, 4}, { 972, 4}, { 968, 3}, { 965, 3}
};
#elif F_CPU == 20000000
const uint16_t speed_lookuptable_fast[256][2] PROGMEM = {
{62500, 54055}, {8445, 3917}, {4528, 1434}, {3094, 745}, {2349, 456}, {1893, 307}, {1586, 222}, {1364, 167},
{1197, 131}, {1066, 105}, {961, 86}, {875, 72}, {803, 61}, {742, 53}, {689, 45}, {644, 40},
{604, 35}, {569, 32}, {537, 28}, {509, 25}, {484, 23}, {461, 21}, {440, 19}, {421, 17},
{404, 16}, {388, 15}, {373, 14}, {359, 13}, {346, 12}, {334, 11}, {323, 10}, {313, 10},
{303, 9}, {294, 9}, {285, 8}, {277, 7}, {270, 8}, {262, 7}, {255, 6}, {249, 6},
{243, 6}, {237, 6}, {231, 5}, {226, 5}, {221, 5}, {216, 5}, {211, 4}, {207, 5},
{202, 4}, {198, 4}, {194, 4}, {190, 3}, {187, 4}, {183, 3}, {180, 3}, {177, 4},
{173, 3}, {170, 3}, {167, 2}, {165, 3}, {162, 3}, {159, 2}, {157, 3}, {154, 2},
{152, 3}, {149, 2}, {147, 2}, {145, 2}, {143, 2}, {141, 2}, {139, 2}, {137, 2},
{135, 2}, {133, 2}, {131, 2}, {129, 1}, {128, 2}, {126, 2}, {124, 1}, {123, 2},
{121, 1}, {120, 2}, {118, 1}, {117, 1}, {116, 2}, {114, 1}, {113, 1}, {112, 2},
{110, 1}, {109, 1}, {108, 1}, {107, 2}, {105, 1}, {104, 1}, {103, 1}, {102, 1},
{101, 1}, {100, 1}, {99, 1}, {98, 1}, {97, 1}, {96, 1}, {95, 1}, {94, 1},
{93, 1}, {92, 1}, {91, 0}, {91, 1}, {90, 1}, {89, 1}, {88, 1}, {87, 0},
{87, 1}, {86, 1}, {85, 1}, {84, 0}, {84, 1}, {83, 1}, {82, 1}, {81, 0},
{81, 1}, {80, 1}, {79, 0}, {79, 1}, {78, 0}, {78, 1}, {77, 1}, {76, 0},
{76, 1}, {75, 0}, {75, 1}, {74, 1}, {73, 0}, {73, 1}, {72, 0}, {72, 1},
{71, 0}, {71, 1}, {70, 0}, {70, 1}, {69, 0}, {69, 1}, {68, 0}, {68, 1},
{67, 0}, {67, 1}, {66, 0}, {66, 1}, {65, 0}, {65, 0}, {65, 1}, {64, 0},
{64, 1}, {63, 0}, {63, 1}, {62, 0}, {62, 0}, {62, 1}, {61, 0}, {61, 1},
{60, 0}, {60, 0}, {60, 1}, {59, 0}, {59, 0}, {59, 1}, {58, 0}, {58, 0},
{58, 1}, {57, 0}, {57, 0}, {57, 1}, {56, 0}, {56, 0}, {56, 1}, {55, 0},
{55, 0}, {55, 1}, {54, 0}, {54, 0}, {54, 1}, {53, 0}, {53, 0}, {53, 0},
{53, 1}, {52, 0}, {52, 0}, {52, 1}, {51, 0}, {51, 0}, {51, 0}, {51, 1},
{50, 0}, {50, 0}, {50, 0}, {50, 1}, {49, 0}, {49, 0}, {49, 0}, {49, 1},
{48, 0}, {48, 0}, {48, 0}, {48, 1}, {47, 0}, {47, 0}, {47, 0}, {47, 1},
{46, 0}, {46, 0}, {46, 0}, {46, 0}, {46, 1}, {45, 0}, {45, 0}, {45, 0},
{45, 1}, {44, 0}, {44, 0}, {44, 0}, {44, 0}, {44, 1}, {43, 0}, {43, 0},
{43, 0}, {43, 0}, {43, 1}, {42, 0}, {42, 0}, {42, 0}, {42, 0}, {42, 0},
{42, 1}, {41, 0}, {41, 0}, {41, 0}, {41, 0}, {41, 0}, {41, 1}, {40, 0},
{40, 0}, {40, 0}, {40, 0}, {40, 1}, {39, 0}, {39, 0}, {39, 0}, {39, 0},
{39, 0}, {39, 0}, {39, 1}, {38, 0}, {38, 0}, {38, 0}, {38, 0}, {38, 0},
};
const uint16_t speed_lookuptable_slow[256][2] PROGMEM = {
{62500, 10417}, {52083, 7441}, {44642, 5580}, {39062, 4340}, {34722, 3472}, {31250, 2841}, {28409, 2368}, {26041, 2003},
{24038, 1717}, {22321, 1488}, {20833, 1302}, {19531, 1149}, {18382, 1021}, {17361, 914}, {16447, 822}, {15625, 745},
{14880, 676}, {14204, 618}, {13586, 566}, {13020, 520}, {12500, 481}, {12019, 445}, {11574, 414}, {11160, 385},
{10775, 359}, {10416, 336}, {10080, 315}, {9765, 296}, {9469, 278}, {9191, 263}, {8928, 248}, {8680, 235},
{8445, 222}, {8223, 211}, {8012, 200}, {7812, 191}, {7621, 181}, {7440, 173}, {7267, 165}, {7102, 158},
{6944, 151}, {6793, 145}, {6648, 138}, {6510, 133}, {6377, 127}, {6250, 123}, {6127, 118}, {6009, 113},
{5896, 109}, {5787, 106}, {5681, 101}, {5580, 98}, {5482, 95}, {5387, 91}, {5296, 88}, {5208, 86},
{5122, 82}, {5040, 80}, {4960, 78}, {4882, 75}, {4807, 73}, {4734, 70}, {4664, 69}, {4595, 67},
{4528, 64}, {4464, 63}, {4401, 61}, {4340, 60}, {4280, 58}, {4222, 56}, {4166, 55}, {4111, 53},
{4058, 52}, {4006, 51}, {3955, 49}, {3906, 48}, {3858, 48}, {3810, 45}, {3765, 45}, {3720, 44},
{3676, 43}, {3633, 42}, {3591, 40}, {3551, 40}, {3511, 39}, {3472, 38}, {3434, 38}, {3396, 36},
{3360, 36}, {3324, 35}, {3289, 34}, {3255, 34}, {3221, 33}, {3188, 32}, {3156, 31}, {3125, 31},
{3094, 31}, {3063, 30}, {3033, 29}, {3004, 28}, {2976, 28}, {2948, 28}, {2920, 27}, {2893, 27},
{2866, 26}, {2840, 25}, {2815, 25}, {2790, 25}, {2765, 24}, {2741, 24}, {2717, 24}, {2693, 23},
{2670, 22}, {2648, 22}, {2626, 22}, {2604, 22}, {2582, 21}, {2561, 21}, {2540, 20}, {2520, 20},
{2500, 20}, {2480, 20}, {2460, 19}, {2441, 19}, {2422, 19}, {2403, 18}, {2385, 18}, {2367, 18},
{2349, 17}, {2332, 18}, {2314, 17}, {2297, 16}, {2281, 17}, {2264, 16}, {2248, 16}, {2232, 16},
{2216, 16}, {2200, 15}, {2185, 15}, {2170, 15}, {2155, 15}, {2140, 15}, {2125, 14}, {2111, 14},
{2097, 14}, {2083, 14}, {2069, 14}, {2055, 13}, {2042, 13}, {2029, 13}, {2016, 13}, {2003, 13},
{1990, 13}, {1977, 12}, {1965, 12}, {1953, 13}, {1940, 11}, {1929, 12}, {1917, 12}, {1905, 12},
{1893, 11}, {1882, 11}, {1871, 11}, {1860, 11}, {1849, 11}, {1838, 11}, {1827, 11}, {1816, 10},
{1806, 11}, {1795, 10}, {1785, 10}, {1775, 10}, {1765, 10}, {1755, 10}, {1745, 9}, {1736, 10},
{1726, 9}, {1717, 10}, {1707, 9}, {1698, 9}, {1689, 9}, {1680, 9}, {1671, 9}, {1662, 9},
{1653, 9}, {1644, 8}, {1636, 9}, {1627, 8}, {1619, 9}, {1610, 8}, {1602, 8}, {1594, 8},
{1586, 8}, {1578, 8}, {1570, 8}, {1562, 8}, {1554, 7}, {1547, 8}, {1539, 8}, {1531, 7},
{1524, 8}, {1516, 7}, {1509, 7}, {1502, 7}, {1495, 7}, {1488, 7}, {1481, 7}, {1474, 7},
{1467, 7}, {1460, 7}, {1453, 7}, {1446, 6}, {1440, 7}, {1433, 7}, {1426, 6}, {1420, 6},
{1414, 7}, {1407, 6}, {1401, 6}, {1395, 7}, {1388, 6}, {1382, 6}, {1376, 6}, {1370, 6},
{1364, 6}, {1358, 6}, {1352, 6}, {1346, 5}, {1341, 6}, {1335, 6}, {1329, 5}, {1324, 6},
{1318, 5}, {1313, 6}, {1307, 5}, {1302, 6}, {1296, 5}, {1291, 5}, {1286, 6}, {1280, 5},
{1275, 5}, {1270, 5}, {1265, 5}, {1260, 5}, {1255, 5}, {1250, 5}, {1245, 5}, {1240, 5},
{1235, 5}, {1230, 5}, {1225, 5}, {1220, 5}, {1215, 4}, {1211, 5}, {1206, 5}, {1201, 5},
};
#endif

View File

@ -3,150 +3,123 @@
#include "Marlin.h"
#if F_CPU == 16000000
extern const uint16_t speed_lookuptable_fast[256][2] PROGMEM;
extern const uint16_t speed_lookuptable_slow[256][2] PROGMEM;
const uint16_t speed_lookuptable_fast[256][2] PROGMEM = {\
{ 62500, 55556}, { 6944, 3268}, { 3676, 1176}, { 2500, 607}, { 1893, 369}, { 1524, 249}, { 1275, 179}, { 1096, 135},
{ 961, 105}, { 856, 85}, { 771, 69}, { 702, 58}, { 644, 49}, { 595, 42}, { 553, 37}, { 516, 32},
{ 484, 28}, { 456, 25}, { 431, 23}, { 408, 20}, { 388, 19}, { 369, 16}, { 353, 16}, { 337, 14},
{ 323, 13}, { 310, 11}, { 299, 11}, { 288, 11}, { 277, 9}, { 268, 9}, { 259, 8}, { 251, 8},
{ 243, 8}, { 235, 7}, { 228, 6}, { 222, 6}, { 216, 6}, { 210, 6}, { 204, 5}, { 199, 5},
{ 194, 5}, { 189, 4}, { 185, 4}, { 181, 4}, { 177, 4}, { 173, 4}, { 169, 4}, { 165, 3},
{ 162, 3}, { 159, 4}, { 155, 3}, { 152, 3}, { 149, 2}, { 147, 3}, { 144, 3}, { 141, 2},
{ 139, 3}, { 136, 2}, { 134, 2}, { 132, 3}, { 129, 2}, { 127, 2}, { 125, 2}, { 123, 2},
{ 121, 2}, { 119, 1}, { 118, 2}, { 116, 2}, { 114, 1}, { 113, 2}, { 111, 2}, { 109, 1},
{ 108, 2}, { 106, 1}, { 105, 2}, { 103, 1}, { 102, 1}, { 101, 1}, { 100, 2}, { 98, 1},
{ 97, 1}, { 96, 1}, { 95, 2}, { 93, 1}, { 92, 1}, { 91, 1}, { 90, 1}, { 89, 1},
{ 88, 1}, { 87, 1}, { 86, 1}, { 85, 1}, { 84, 1}, { 83, 0}, { 83, 1}, { 82, 1},
{ 81, 1}, { 80, 1}, { 79, 1}, { 78, 0}, { 78, 1}, { 77, 1}, { 76, 1}, { 75, 0},
{ 75, 1}, { 74, 1}, { 73, 1}, { 72, 0}, { 72, 1}, { 71, 1}, { 70, 0}, { 70, 1},
{ 69, 0}, { 69, 1}, { 68, 1}, { 67, 0}, { 67, 1}, { 66, 0}, { 66, 1}, { 65, 0},
{ 65, 1}, { 64, 1}, { 63, 0}, { 63, 1}, { 62, 0}, { 62, 1}, { 61, 0}, { 61, 1},
{ 60, 0}, { 60, 0}, { 60, 1}, { 59, 0}, { 59, 1}, { 58, 0}, { 58, 1}, { 57, 0},
{ 57, 1}, { 56, 0}, { 56, 0}, { 56, 1}, { 55, 0}, { 55, 1}, { 54, 0}, { 54, 0},
{ 54, 1}, { 53, 0}, { 53, 0}, { 53, 1}, { 52, 0}, { 52, 0}, { 52, 1}, { 51, 0},
{ 51, 0}, { 51, 1}, { 50, 0}, { 50, 0}, { 50, 1}, { 49, 0}, { 49, 0}, { 49, 1},
{ 48, 0}, { 48, 0}, { 48, 1}, { 47, 0}, { 47, 0}, { 47, 0}, { 47, 1}, { 46, 0},
{ 46, 0}, { 46, 1}, { 45, 0}, { 45, 0}, { 45, 0}, { 45, 1}, { 44, 0}, { 44, 0},
{ 44, 0}, { 44, 1}, { 43, 0}, { 43, 0}, { 43, 0}, { 43, 1}, { 42, 0}, { 42, 0},
{ 42, 0}, { 42, 1}, { 41, 0}, { 41, 0}, { 41, 0}, { 41, 0}, { 41, 1}, { 40, 0},
{ 40, 0}, { 40, 0}, { 40, 0}, { 40, 1}, { 39, 0}, { 39, 0}, { 39, 0}, { 39, 0},
{ 39, 1}, { 38, 0}, { 38, 0}, { 38, 0}, { 38, 0}, { 38, 1}, { 37, 0}, { 37, 0},
{ 37, 0}, { 37, 0}, { 37, 0}, { 37, 1}, { 36, 0}, { 36, 0}, { 36, 0}, { 36, 0},
{ 36, 1}, { 35, 0}, { 35, 0}, { 35, 0}, { 35, 0}, { 35, 0}, { 35, 0}, { 35, 1},
{ 34, 0}, { 34, 0}, { 34, 0}, { 34, 0}, { 34, 0}, { 34, 1}, { 33, 0}, { 33, 0},
{ 33, 0}, { 33, 0}, { 33, 0}, { 33, 0}, { 33, 1}, { 32, 0}, { 32, 0}, { 32, 0},
{ 32, 0}, { 32, 0}, { 32, 0}, { 32, 0}, { 32, 1}, { 31, 0}, { 31, 0}, { 31, 0},
{ 31, 0}, { 31, 0}, { 31, 0}, { 31, 1}, { 30, 0}, { 30, 0}, { 30, 0}, { 30, 0}
};
#ifndef _NO_ASM
const uint16_t speed_lookuptable_slow[256][2] PROGMEM = {\
{ 62500, 12500}, { 50000, 8334}, { 41666, 5952}, { 35714, 4464}, { 31250, 3473}, { 27777, 2777}, { 25000, 2273}, { 22727, 1894},
{ 20833, 1603}, { 19230, 1373}, { 17857, 1191}, { 16666, 1041}, { 15625, 920}, { 14705, 817}, { 13888, 731}, { 13157, 657},
{ 12500, 596}, { 11904, 541}, { 11363, 494}, { 10869, 453}, { 10416, 416}, { 10000, 385}, { 9615, 356}, { 9259, 331},
{ 8928, 308}, { 8620, 287}, { 8333, 269}, { 8064, 252}, { 7812, 237}, { 7575, 223}, { 7352, 210}, { 7142, 198},
{ 6944, 188}, { 6756, 178}, { 6578, 168}, { 6410, 160}, { 6250, 153}, { 6097, 145}, { 5952, 139}, { 5813, 132},
{ 5681, 126}, { 5555, 121}, { 5434, 115}, { 5319, 111}, { 5208, 106}, { 5102, 102}, { 5000, 99}, { 4901, 94},
{ 4807, 91}, { 4716, 87}, { 4629, 84}, { 4545, 81}, { 4464, 79}, { 4385, 75}, { 4310, 73}, { 4237, 71},
{ 4166, 68}, { 4098, 66}, { 4032, 64}, { 3968, 62}, { 3906, 60}, { 3846, 59}, { 3787, 56}, { 3731, 55},
{ 3676, 53}, { 3623, 52}, { 3571, 50}, { 3521, 49}, { 3472, 48}, { 3424, 46}, { 3378, 45}, { 3333, 44},
{ 3289, 43}, { 3246, 41}, { 3205, 41}, { 3164, 39}, { 3125, 39}, { 3086, 38}, { 3048, 36}, { 3012, 36},
{ 2976, 35}, { 2941, 35}, { 2906, 33}, { 2873, 33}, { 2840, 32}, { 2808, 31}, { 2777, 30}, { 2747, 30},
{ 2717, 29}, { 2688, 29}, { 2659, 28}, { 2631, 27}, { 2604, 27}, { 2577, 26}, { 2551, 26}, { 2525, 25},
{ 2500, 25}, { 2475, 25}, { 2450, 23}, { 2427, 24}, { 2403, 23}, { 2380, 22}, { 2358, 22}, { 2336, 22},
{ 2314, 21}, { 2293, 21}, { 2272, 20}, { 2252, 20}, { 2232, 20}, { 2212, 20}, { 2192, 19}, { 2173, 18},
{ 2155, 19}, { 2136, 18}, { 2118, 18}, { 2100, 17}, { 2083, 17}, { 2066, 17}, { 2049, 17}, { 2032, 16},
{ 2016, 16}, { 2000, 16}, { 1984, 16}, { 1968, 15}, { 1953, 16}, { 1937, 14}, { 1923, 15}, { 1908, 15},
{ 1893, 14}, { 1879, 14}, { 1865, 14}, { 1851, 13}, { 1838, 14}, { 1824, 13}, { 1811, 13}, { 1798, 13},
{ 1785, 12}, { 1773, 13}, { 1760, 12}, { 1748, 12}, { 1736, 12}, { 1724, 12}, { 1712, 12}, { 1700, 11},
{ 1689, 12}, { 1677, 11}, { 1666, 11}, { 1655, 11}, { 1644, 11}, { 1633, 10}, { 1623, 11}, { 1612, 10},
{ 1602, 10}, { 1592, 10}, { 1582, 10}, { 1572, 10}, { 1562, 10}, { 1552, 9}, { 1543, 10}, { 1533, 9},
{ 1524, 9}, { 1515, 9}, { 1506, 9}, { 1497, 9}, { 1488, 9}, { 1479, 9}, { 1470, 9}, { 1461, 8},
{ 1453, 8}, { 1445, 9}, { 1436, 8}, { 1428, 8}, { 1420, 8}, { 1412, 8}, { 1404, 8}, { 1396, 8},
{ 1388, 7}, { 1381, 8}, { 1373, 7}, { 1366, 8}, { 1358, 7}, { 1351, 7}, { 1344, 8}, { 1336, 7},
{ 1329, 7}, { 1322, 7}, { 1315, 7}, { 1308, 6}, { 1302, 7}, { 1295, 7}, { 1288, 6}, { 1282, 7},
{ 1275, 6}, { 1269, 7}, { 1262, 6}, { 1256, 6}, { 1250, 7}, { 1243, 6}, { 1237, 6}, { 1231, 6},
{ 1225, 6}, { 1219, 6}, { 1213, 6}, { 1207, 6}, { 1201, 5}, { 1196, 6}, { 1190, 6}, { 1184, 5},
{ 1179, 6}, { 1173, 5}, { 1168, 6}, { 1162, 5}, { 1157, 5}, { 1152, 6}, { 1146, 5}, { 1141, 5},
{ 1136, 5}, { 1131, 5}, { 1126, 5}, { 1121, 5}, { 1116, 5}, { 1111, 5}, { 1106, 5}, { 1101, 5},
{ 1096, 5}, { 1091, 5}, { 1086, 4}, { 1082, 5}, { 1077, 5}, { 1072, 4}, { 1068, 5}, { 1063, 4},
{ 1059, 5}, { 1054, 4}, { 1050, 4}, { 1046, 5}, { 1041, 4}, { 1037, 4}, { 1033, 5}, { 1028, 4},
{ 1024, 4}, { 1020, 4}, { 1016, 4}, { 1012, 4}, { 1008, 4}, { 1004, 4}, { 1000, 4}, { 996, 4},
{ 992, 4}, { 988, 4}, { 984, 4}, { 980, 4}, { 976, 4}, { 972, 4}, { 968, 3}, { 965, 3}
};
// intRes = intIn1 * intIn2 >> 16
// uses:
// r26 to store 0
// r27 to store the byte 1 of the 24 bit result
#define MultiU16X8toH16(intRes, charIn1, intIn2) \
asm volatile ( \
"clr r26 \n\t" \
"mul %A1, %B2 \n\t" \
"movw %A0, r0 \n\t" \
"mul %A1, %A2 \n\t" \
"add %A0, r1 \n\t" \
"adc %B0, r26 \n\t" \
"lsr r0 \n\t" \
"adc %A0, r26 \n\t" \
"adc %B0, r26 \n\t" \
"clr r1 \n\t" \
: \
"=&r" (intRes) \
: \
"d" (charIn1), \
"d" (intIn2) \
: \
"r26" \
)
#elif F_CPU == 20000000
// intRes = longIn1 * longIn2 >> 24
// uses:
// r26 to store 0
// r27 to store the byte 1 of the 48bit result
#define MultiU24X24toH16(intRes, longIn1, longIn2) \
asm volatile ( \
"clr r26 \n\t" \
"mul %A1, %B2 \n\t" \
"mov r27, r1 \n\t" \
"mul %B1, %C2 \n\t" \
"movw %A0, r0 \n\t" \
"mul %C1, %C2 \n\t" \
"add %B0, r0 \n\t" \
"mul %C1, %B2 \n\t" \
"add %A0, r0 \n\t" \
"adc %B0, r1 \n\t" \
"mul %A1, %C2 \n\t" \
"add r27, r0 \n\t" \
"adc %A0, r1 \n\t" \
"adc %B0, r26 \n\t" \
"mul %B1, %B2 \n\t" \
"add r27, r0 \n\t" \
"adc %A0, r1 \n\t" \
"adc %B0, r26 \n\t" \
"mul %C1, %A2 \n\t" \
"add r27, r0 \n\t" \
"adc %A0, r1 \n\t" \
"adc %B0, r26 \n\t" \
"mul %B1, %A2 \n\t" \
"add r27, r1 \n\t" \
"adc %A0, r26 \n\t" \
"adc %B0, r26 \n\t" \
"lsr r27 \n\t" \
"adc %A0, r26 \n\t" \
"adc %B0, r26 \n\t" \
"clr r1 \n\t" \
: \
"=&r" (intRes) \
: \
"d" (longIn1), \
"d" (longIn2) \
: \
"r26" , "r27" \
)
const uint16_t speed_lookuptable_fast[256][2] PROGMEM = {
{62500, 54055}, {8445, 3917}, {4528, 1434}, {3094, 745}, {2349, 456}, {1893, 307}, {1586, 222}, {1364, 167},
{1197, 131}, {1066, 105}, {961, 86}, {875, 72}, {803, 61}, {742, 53}, {689, 45}, {644, 40},
{604, 35}, {569, 32}, {537, 28}, {509, 25}, {484, 23}, {461, 21}, {440, 19}, {421, 17},
{404, 16}, {388, 15}, {373, 14}, {359, 13}, {346, 12}, {334, 11}, {323, 10}, {313, 10},
{303, 9}, {294, 9}, {285, 8}, {277, 7}, {270, 8}, {262, 7}, {255, 6}, {249, 6},
{243, 6}, {237, 6}, {231, 5}, {226, 5}, {221, 5}, {216, 5}, {211, 4}, {207, 5},
{202, 4}, {198, 4}, {194, 4}, {190, 3}, {187, 4}, {183, 3}, {180, 3}, {177, 4},
{173, 3}, {170, 3}, {167, 2}, {165, 3}, {162, 3}, {159, 2}, {157, 3}, {154, 2},
{152, 3}, {149, 2}, {147, 2}, {145, 2}, {143, 2}, {141, 2}, {139, 2}, {137, 2},
{135, 2}, {133, 2}, {131, 2}, {129, 1}, {128, 2}, {126, 2}, {124, 1}, {123, 2},
{121, 1}, {120, 2}, {118, 1}, {117, 1}, {116, 2}, {114, 1}, {113, 1}, {112, 2},
{110, 1}, {109, 1}, {108, 1}, {107, 2}, {105, 1}, {104, 1}, {103, 1}, {102, 1},
{101, 1}, {100, 1}, {99, 1}, {98, 1}, {97, 1}, {96, 1}, {95, 1}, {94, 1},
{93, 1}, {92, 1}, {91, 0}, {91, 1}, {90, 1}, {89, 1}, {88, 1}, {87, 0},
{87, 1}, {86, 1}, {85, 1}, {84, 0}, {84, 1}, {83, 1}, {82, 1}, {81, 0},
{81, 1}, {80, 1}, {79, 0}, {79, 1}, {78, 0}, {78, 1}, {77, 1}, {76, 0},
{76, 1}, {75, 0}, {75, 1}, {74, 1}, {73, 0}, {73, 1}, {72, 0}, {72, 1},
{71, 0}, {71, 1}, {70, 0}, {70, 1}, {69, 0}, {69, 1}, {68, 0}, {68, 1},
{67, 0}, {67, 1}, {66, 0}, {66, 1}, {65, 0}, {65, 0}, {65, 1}, {64, 0},
{64, 1}, {63, 0}, {63, 1}, {62, 0}, {62, 0}, {62, 1}, {61, 0}, {61, 1},
{60, 0}, {60, 0}, {60, 1}, {59, 0}, {59, 0}, {59, 1}, {58, 0}, {58, 0},
{58, 1}, {57, 0}, {57, 0}, {57, 1}, {56, 0}, {56, 0}, {56, 1}, {55, 0},
{55, 0}, {55, 1}, {54, 0}, {54, 0}, {54, 1}, {53, 0}, {53, 0}, {53, 0},
{53, 1}, {52, 0}, {52, 0}, {52, 1}, {51, 0}, {51, 0}, {51, 0}, {51, 1},
{50, 0}, {50, 0}, {50, 0}, {50, 1}, {49, 0}, {49, 0}, {49, 0}, {49, 1},
{48, 0}, {48, 0}, {48, 0}, {48, 1}, {47, 0}, {47, 0}, {47, 0}, {47, 1},
{46, 0}, {46, 0}, {46, 0}, {46, 0}, {46, 1}, {45, 0}, {45, 0}, {45, 0},
{45, 1}, {44, 0}, {44, 0}, {44, 0}, {44, 0}, {44, 1}, {43, 0}, {43, 0},
{43, 0}, {43, 0}, {43, 1}, {42, 0}, {42, 0}, {42, 0}, {42, 0}, {42, 0},
{42, 1}, {41, 0}, {41, 0}, {41, 0}, {41, 0}, {41, 0}, {41, 1}, {40, 0},
{40, 0}, {40, 0}, {40, 0}, {40, 1}, {39, 0}, {39, 0}, {39, 0}, {39, 0},
{39, 0}, {39, 0}, {39, 1}, {38, 0}, {38, 0}, {38, 0}, {38, 0}, {38, 0},
};
#else //_NO_ASM
const uint16_t speed_lookuptable_slow[256][2] PROGMEM = {
{62500, 10417}, {52083, 7441}, {44642, 5580}, {39062, 4340}, {34722, 3472}, {31250, 2841}, {28409, 2368}, {26041, 2003},
{24038, 1717}, {22321, 1488}, {20833, 1302}, {19531, 1149}, {18382, 1021}, {17361, 914}, {16447, 822}, {15625, 745},
{14880, 676}, {14204, 618}, {13586, 566}, {13020, 520}, {12500, 481}, {12019, 445}, {11574, 414}, {11160, 385},
{10775, 359}, {10416, 336}, {10080, 315}, {9765, 296}, {9469, 278}, {9191, 263}, {8928, 248}, {8680, 235},
{8445, 222}, {8223, 211}, {8012, 200}, {7812, 191}, {7621, 181}, {7440, 173}, {7267, 165}, {7102, 158},
{6944, 151}, {6793, 145}, {6648, 138}, {6510, 133}, {6377, 127}, {6250, 123}, {6127, 118}, {6009, 113},
{5896, 109}, {5787, 106}, {5681, 101}, {5580, 98}, {5482, 95}, {5387, 91}, {5296, 88}, {5208, 86},
{5122, 82}, {5040, 80}, {4960, 78}, {4882, 75}, {4807, 73}, {4734, 70}, {4664, 69}, {4595, 67},
{4528, 64}, {4464, 63}, {4401, 61}, {4340, 60}, {4280, 58}, {4222, 56}, {4166, 55}, {4111, 53},
{4058, 52}, {4006, 51}, {3955, 49}, {3906, 48}, {3858, 48}, {3810, 45}, {3765, 45}, {3720, 44},
{3676, 43}, {3633, 42}, {3591, 40}, {3551, 40}, {3511, 39}, {3472, 38}, {3434, 38}, {3396, 36},
{3360, 36}, {3324, 35}, {3289, 34}, {3255, 34}, {3221, 33}, {3188, 32}, {3156, 31}, {3125, 31},
{3094, 31}, {3063, 30}, {3033, 29}, {3004, 28}, {2976, 28}, {2948, 28}, {2920, 27}, {2893, 27},
{2866, 26}, {2840, 25}, {2815, 25}, {2790, 25}, {2765, 24}, {2741, 24}, {2717, 24}, {2693, 23},
{2670, 22}, {2648, 22}, {2626, 22}, {2604, 22}, {2582, 21}, {2561, 21}, {2540, 20}, {2520, 20},
{2500, 20}, {2480, 20}, {2460, 19}, {2441, 19}, {2422, 19}, {2403, 18}, {2385, 18}, {2367, 18},
{2349, 17}, {2332, 18}, {2314, 17}, {2297, 16}, {2281, 17}, {2264, 16}, {2248, 16}, {2232, 16},
{2216, 16}, {2200, 15}, {2185, 15}, {2170, 15}, {2155, 15}, {2140, 15}, {2125, 14}, {2111, 14},
{2097, 14}, {2083, 14}, {2069, 14}, {2055, 13}, {2042, 13}, {2029, 13}, {2016, 13}, {2003, 13},
{1990, 13}, {1977, 12}, {1965, 12}, {1953, 13}, {1940, 11}, {1929, 12}, {1917, 12}, {1905, 12},
{1893, 11}, {1882, 11}, {1871, 11}, {1860, 11}, {1849, 11}, {1838, 11}, {1827, 11}, {1816, 10},
{1806, 11}, {1795, 10}, {1785, 10}, {1775, 10}, {1765, 10}, {1755, 10}, {1745, 9}, {1736, 10},
{1726, 9}, {1717, 10}, {1707, 9}, {1698, 9}, {1689, 9}, {1680, 9}, {1671, 9}, {1662, 9},
{1653, 9}, {1644, 8}, {1636, 9}, {1627, 8}, {1619, 9}, {1610, 8}, {1602, 8}, {1594, 8},
{1586, 8}, {1578, 8}, {1570, 8}, {1562, 8}, {1554, 7}, {1547, 8}, {1539, 8}, {1531, 7},
{1524, 8}, {1516, 7}, {1509, 7}, {1502, 7}, {1495, 7}, {1488, 7}, {1481, 7}, {1474, 7},
{1467, 7}, {1460, 7}, {1453, 7}, {1446, 6}, {1440, 7}, {1433, 7}, {1426, 6}, {1420, 6},
{1414, 7}, {1407, 6}, {1401, 6}, {1395, 7}, {1388, 6}, {1382, 6}, {1376, 6}, {1370, 6},
{1364, 6}, {1358, 6}, {1352, 6}, {1346, 5}, {1341, 6}, {1335, 6}, {1329, 5}, {1324, 6},
{1318, 5}, {1313, 6}, {1307, 5}, {1302, 6}, {1296, 5}, {1291, 5}, {1286, 6}, {1280, 5},
{1275, 5}, {1270, 5}, {1265, 5}, {1260, 5}, {1255, 5}, {1250, 5}, {1245, 5}, {1240, 5},
{1235, 5}, {1230, 5}, {1225, 5}, {1220, 5}, {1215, 4}, {1211, 5}, {1206, 5}, {1201, 5},
};
#endif
// NOTE: currently not implemented
void MultiU16X8toH16(unsigned short& intRes, unsigned char& charIn1, unsigned short& intIn2);
void MultiU24X24toH16(uint16_t& intRes, int32_t& longIn1, long& longIn2);
#endif //_NO_ASM
FORCE_INLINE unsigned short calc_timer(uint16_t step_rate, uint8_t& step_loops) {
unsigned short timer;
if(step_rate > MAX_STEP_FREQUENCY) step_rate = MAX_STEP_FREQUENCY;
if(step_rate > 20000) { // If steprate > 20kHz >> step 4 times
step_rate = (step_rate >> 2)&0x3fff;
step_loops = 4;
}
else if(step_rate > 10000) { // If steprate > 10kHz >> step 2 times
step_rate = (step_rate >> 1)&0x7fff;
step_loops = 2;
}
else {
step_loops = 1;
}
if(step_rate < (F_CPU/500000)) step_rate = (F_CPU/500000);
step_rate -= (F_CPU/500000); // Correct for minimal speed
if(step_rate >= (8*256)){ // higher step rate
unsigned short table_address = (unsigned short)&speed_lookuptable_fast[(unsigned char)(step_rate>>8)][0];
unsigned char tmp_step_rate = (step_rate & 0x00ff);
unsigned short gain = (unsigned short)pgm_read_word_near(table_address+2);
MultiU16X8toH16(timer, tmp_step_rate, gain);
timer = (unsigned short)pgm_read_word_near(table_address) - timer;
}
else { // lower step rates
unsigned short table_address = (unsigned short)&speed_lookuptable_slow[0][0];
table_address += ((step_rate)>>1) & 0xfffc;
timer = (unsigned short)pgm_read_word_near(table_address);
timer -= (((unsigned short)pgm_read_word_near(table_address+2) * (unsigned char)(step_rate & 0x0007))>>3);
}
if(timer < 100) { timer = 100; }//(20kHz this should never happen)////MSG_STEPPER_TOO_HIGH c=0 r=0
return timer;
}
#endif

View File

@ -113,23 +113,30 @@ volatile long count_position[NUM_AXIS] = { 0, 0, 0, 0};
volatile signed char count_direction[NUM_AXIS] = { 1, 1, 1, 1};
#ifdef LIN_ADVANCE
void advance_isr_scheduler();
void advance_isr();
static uint16_t nextMainISR = 0;
static const uint16_t ADV_NEVER = 0xFFFF;
static const uint8_t ADV_INIT = 0b01;
static const uint8_t ADV_DECELERATE = 0b10;
static uint16_t nextMainISR;
static uint16_t nextAdvanceISR;
static uint16_t main_Rate;
static uint16_t eISR_Rate;
static uint16_t eISR_Err;
// Extrusion steps to be executed by the stepper.
// If set to non zero, the timer ISR routine will tick the Linear Advance extruder ticks first.
// If e_steps is zero, then the timer ISR routine will perform the usual DDA step.
static volatile int16_t e_steps = 0;
// How many extruder steps shall be ticked at a single ISR invocation?
static uint8_t estep_loops;
// The current speed of the extruder, scaled by the linear advance constant, so it has the same measure
// as current_adv_steps.
static int current_estep_rate;
// The current pretension of filament expressed in extruder micro steps.
static int current_adv_steps;
static uint16_t current_adv_steps;
static uint16_t final_adv_steps;
static uint16_t max_adv_steps;
static uint32_t LA_decelerate_after;
#define _NEXT_ISR(T) nextMainISR = T
static int8_t e_steps;
static uint8_t e_step_loops;
static int8_t LA_phase;
#define _NEXT_ISR(T) main_Rate = nextMainISR = T
#else
#define _NEXT_ISR(T) OCR1A = T
#endif
@ -143,92 +150,6 @@ extern uint16_t stepper_timer_overflow_last;
//=============================functions ============================
//===========================================================================
#ifndef _NO_ASM
// intRes = intIn1 * intIn2 >> 16
// uses:
// r26 to store 0
// r27 to store the byte 1 of the 24 bit result
#define MultiU16X8toH16(intRes, charIn1, intIn2) \
asm volatile ( \
"clr r26 \n\t" \
"mul %A1, %B2 \n\t" \
"movw %A0, r0 \n\t" \
"mul %A1, %A2 \n\t" \
"add %A0, r1 \n\t" \
"adc %B0, r26 \n\t" \
"lsr r0 \n\t" \
"adc %A0, r26 \n\t" \
"adc %B0, r26 \n\t" \
"clr r1 \n\t" \
: \
"=&r" (intRes) \
: \
"d" (charIn1), \
"d" (intIn2) \
: \
"r26" \
)
// intRes = longIn1 * longIn2 >> 24
// uses:
// r26 to store 0
// r27 to store the byte 1 of the 48bit result
#define MultiU24X24toH16(intRes, longIn1, longIn2) \
asm volatile ( \
"clr r26 \n\t" \
"mul %A1, %B2 \n\t" \
"mov r27, r1 \n\t" \
"mul %B1, %C2 \n\t" \
"movw %A0, r0 \n\t" \
"mul %C1, %C2 \n\t" \
"add %B0, r0 \n\t" \
"mul %C1, %B2 \n\t" \
"add %A0, r0 \n\t" \
"adc %B0, r1 \n\t" \
"mul %A1, %C2 \n\t" \
"add r27, r0 \n\t" \
"adc %A0, r1 \n\t" \
"adc %B0, r26 \n\t" \
"mul %B1, %B2 \n\t" \
"add r27, r0 \n\t" \
"adc %A0, r1 \n\t" \
"adc %B0, r26 \n\t" \
"mul %C1, %A2 \n\t" \
"add r27, r0 \n\t" \
"adc %A0, r1 \n\t" \
"adc %B0, r26 \n\t" \
"mul %B1, %A2 \n\t" \
"add r27, r1 \n\t" \
"adc %A0, r26 \n\t" \
"adc %B0, r26 \n\t" \
"lsr r27 \n\t" \
"adc %A0, r26 \n\t" \
"adc %B0, r26 \n\t" \
"clr r1 \n\t" \
: \
"=&r" (intRes) \
: \
"d" (longIn1), \
"d" (longIn2) \
: \
"r26" , "r27" \
)
#else //_NO_ASM
void MultiU16X8toH16(unsigned short& intRes, unsigned char& charIn1, unsigned short& intIn2)
{
}
void MultiU24X24toH16(uint16_t& intRes, int32_t& longIn1, long& longIn2)
{
}
#endif //_NO_ASM
// Some useful constants
void checkHitEndstops()
{
if( endstop_x_hit || endstop_y_hit || endstop_z_hit) {
@ -316,42 +237,6 @@ void invert_z_endstop(bool endstop_invert)
// step_events_completed reaches block->decelerate_after after which it decelerates until the trapezoid generator is reset.
// The slope of acceleration is calculated with the leib ramp alghorithm.
FORCE_INLINE unsigned short calc_timer(uint16_t step_rate) {
unsigned short timer;
if(step_rate > MAX_STEP_FREQUENCY) step_rate = MAX_STEP_FREQUENCY;
if(step_rate > 20000) { // If steprate > 20kHz >> step 4 times
step_rate = (step_rate >> 2)&0x3fff;
step_loops = 4;
}
else if(step_rate > 10000) { // If steprate > 10kHz >> step 2 times
step_rate = (step_rate >> 1)&0x7fff;
step_loops = 2;
}
else {
step_loops = 1;
}
// step_loops = 1;
if(step_rate < (F_CPU/500000)) step_rate = (F_CPU/500000);
step_rate -= (F_CPU/500000); // Correct for minimal speed
if(step_rate >= (8*256)){ // higher step rate
unsigned short table_address = (unsigned short)&speed_lookuptable_fast[(unsigned char)(step_rate>>8)][0];
unsigned char tmp_step_rate = (step_rate & 0x00ff);
unsigned short gain = (unsigned short)pgm_read_word_near(table_address+2);
MultiU16X8toH16(timer, tmp_step_rate, gain);
timer = (unsigned short)pgm_read_word_near(table_address) - timer;
}
else { // lower step rates
unsigned short table_address = (unsigned short)&speed_lookuptable_slow[0][0];
table_address += ((step_rate)>>1) & 0xfffc;
timer = (unsigned short)pgm_read_word_near(table_address);
timer -= (((unsigned short)pgm_read_word_near(table_address+2) * (unsigned char)(step_rate & 0x0007))>>3);
}
if(timer < 100) { timer = 100; MYSERIAL.print(_N("Steprate too high: ")); MYSERIAL.println(step_rate); }//(20kHz this should never happen)////MSG_STEPPER_TOO_HIGH
return timer;
}
// "The Stepper Driver Interrupt" - This timer interrupt is the workhorse.
// It pops blocks from the block_buffer and executes them by pulsing the stepper pins appropriately.
ISR(TIMER1_COMPA_vect) {
@ -361,53 +246,10 @@ ISR(TIMER1_COMPA_vect) {
#endif //DEBUG_STACK_MONITOR
#ifdef LIN_ADVANCE
// If there are any e_steps planned, tick them.
bool run_main_isr = false;
if (e_steps) {
//WRITE_NC(LOGIC_ANALYZER_CH7, true);
uint8_t cnt = 0;
for (uint8_t i = estep_loops; e_steps && i --;) {
WRITE_NC(E0_STEP_PIN, !INVERT_E_STEP_PIN);
-- e_steps;
cnt++;
WRITE_NC(E0_STEP_PIN, INVERT_E_STEP_PIN);
}
#ifdef FILAMENT_SENSOR
if (READ(E0_DIR_PIN) == INVERT_E0_DIR)
{
if (count_direction[E_AXIS] == 1)
fsensor_counter -= cnt;
else
fsensor_counter += cnt;
}
else
{
if (count_direction[E_AXIS] == 1)
fsensor_counter += cnt;
else
fsensor_counter -= cnt;
}
#endif //FILAMENT_SENSOR
if (e_steps) {
// Plan another Linear Advance tick.
OCR1A = eISR_Rate;
nextMainISR -= eISR_Rate;
} else if (! (nextMainISR & 0x8000) || nextMainISR < 16) {
// The timer did not overflow and it is big enough, so it makes sense to plan it.
OCR1A = nextMainISR;
} else {
// The timer has overflown, or it is too small. Run the main ISR just after the Linear Advance routine
// in the current interrupt tick.
run_main_isr = true;
//FIXME pick the serial line.
}
//WRITE_NC(LOGIC_ANALYZER_CH7, false);
} else
run_main_isr = true;
if (run_main_isr)
#endif
advance_isr_scheduler();
#else
isr();
#endif
// Don't run the ISR faster than possible
// Is there a 8us time left before the next interrupt triggers?
@ -493,10 +335,6 @@ FORCE_INLINE void stepper_next_block()
}
#endif
#ifdef FILAMENT_SENSOR
fsensor_counter = 0;
fsensor_st_block_begin(current_block);
#endif //FILAMENT_SENSOR
// The busy flag is set by the plan_get_current_block() call.
// current_block->busy = true;
// Initializes the trapezoid generator from the current block. Called whenever a new
@ -507,10 +345,26 @@ FORCE_INLINE void stepper_next_block()
// state is reached.
step_loops_nominal = 0;
acc_step_rate = uint16_t(current_block->initial_rate);
acceleration_time = calc_timer(acc_step_rate);
acceleration_time = calc_timer(acc_step_rate, step_loops);
#ifdef LIN_ADVANCE
current_estep_rate = ((unsigned long)acc_step_rate * current_block->abs_adv_steps_multiplier8) >> 17;
#endif /* LIN_ADVANCE */
if (current_block->use_advance_lead) {
LA_decelerate_after = current_block->decelerate_after;
final_adv_steps = current_block->final_adv_steps;
max_adv_steps = current_block->max_adv_steps;
e_step_loops = current_block->advance_step_loops;
} else {
e_steps = 0;
e_step_loops = 1;
current_adv_steps = 0;
}
nextAdvanceISR = ADV_NEVER;
LA_phase = -1;
#endif
if (current_block->flag & BLOCK_FLAG_E_RESET) {
count_position[E_AXIS] = 0;
}
if (current_block->flag & BLOCK_FLAG_DDA_LOWRES) {
counter_x.lo = -(current_block->step_event_count.lo >> 1);
@ -567,9 +421,24 @@ FORCE_INLINE void stepper_next_block()
#endif /* LIN_ADVANCE */
count_direction[E_AXIS] = 1;
}
#ifdef FILAMENT_SENSOR
fsensor_counter = 0;
fsensor_st_block_begin(count_direction[E_AXIS] < 0);
#endif //FILAMENT_SENSOR
}
else {
OCR1A = 2000; // 1kHz.
_NEXT_ISR(2000); // 1kHz.
#ifdef LIN_ADVANCE
// reset LA state when there's no block
nextAdvanceISR = ADV_NEVER;
e_steps = 0;
// incrementally lose pressure to give a chance for
// a new LA block to be scheduled and recover
if(current_adv_steps)
--current_adv_steps;
#endif
}
//WRITE_NC(LOGIC_ANALYZER_CH2, false);
}
@ -779,10 +648,10 @@ FORCE_INLINE void stepper_tick_lowres()
counter_e.lo -= current_block->step_event_count.lo;
count_position[E_AXIS] += count_direction[E_AXIS];
#ifdef LIN_ADVANCE
++ e_steps;
e_steps += count_direction[E_AXIS];
#else
#ifdef FILAMENT_SENSOR
++ fsensor_counter;
fsensor_counter += count_direction[E_AXIS];
#endif //FILAMENT_SENSOR
WRITE(E0_STEP_PIN, INVERT_E_STEP_PIN);
#endif
@ -841,11 +710,11 @@ FORCE_INLINE void stepper_tick_highres()
counter_e.wide -= current_block->step_event_count.wide;
count_position[E_AXIS]+=count_direction[E_AXIS];
#ifdef LIN_ADVANCE
++ e_steps;
e_steps += count_direction[E_AXIS];
#else
#ifdef FILAMENT_SENSOR
++ fsensor_counter;
#endif //FILAMENT_SENSOR
#ifdef FILAMENT_SENSOR
fsensor_counter += count_direction[E_AXIS];
#endif //FILAMENT_SENSOR
WRITE(E0_STEP_PIN, INVERT_E_STEP_PIN);
#endif
}
@ -854,8 +723,53 @@ FORCE_INLINE void stepper_tick_highres()
}
}
// 50us delay
#define LIN_ADV_FIRST_TICK_DELAY 100
#ifdef LIN_ADVANCE
// @wavexx: fast uint16_t division for small dividends<5
// q/3 based on "Hacker's delight" formula
FORCE_INLINE uint16_t fastdiv(uint16_t q, uint8_t d)
{
if(d != 3) return q >> (d / 2);
else return ((uint32_t)0xAAAB * q) >> 17;
}
FORCE_INLINE void advance_spread(uint16_t timer)
{
if(eISR_Err > timer)
{
// advance-step skipped
eISR_Err -= timer;
eISR_Rate = timer;
nextAdvanceISR = timer;
return;
}
// at least one step
uint8_t ticks = 1;
uint32_t block = current_block->advance_rate;
uint16_t max_t = timer - eISR_Err;
while (block < max_t)
{
++ticks;
block += current_block->advance_rate;
}
if (block > timer)
eISR_Err += block - timer;
else
eISR_Err -= timer - block;
if (ticks <= 4)
eISR_Rate = fastdiv(timer, ticks);
else
{
// >4 ticks are still possible on slow moves
eISR_Rate = timer / ticks;
}
nextAdvanceISR = eISR_Rate / 2;
}
#endif
FORCE_INLINE void isr() {
//WRITE_NC(LOGIC_ANALYZER_CH0, true);
@ -868,81 +782,18 @@ FORCE_INLINE void isr() {
if (current_block != NULL)
{
stepper_check_endstops();
#ifdef LIN_ADVANCE
e_steps = 0;
#endif /* LIN_ADVANCE */
if (current_block->flag & BLOCK_FLAG_DDA_LOWRES)
stepper_tick_lowres();
else
stepper_tick_highres();
#ifdef LIN_ADVANCE
if (out_bits&(1<<E_AXIS))
// Move in negative direction.
e_steps = - e_steps;
if (current_block->use_advance_lead) {
//int esteps_inc = 0;
//esteps_inc = current_estep_rate - current_adv_steps;
//e_steps += esteps_inc;
e_steps += current_estep_rate - current_adv_steps;
#if 0
if (abs(esteps_inc) > 4) {
LOGIC_ANALYZER_SERIAL_TX_WRITE(esteps_inc);
if (esteps_inc < -511 || esteps_inc > 511)
LOGIC_ANALYZER_SERIAL_TX_WRITE(esteps_inc >> 9);
}
#endif
current_adv_steps = current_estep_rate;
}
// If we have esteps to execute, step some of them now.
if (e_steps) {
//WRITE_NC(LOGIC_ANALYZER_CH7, true);
// Set the step direction.
bool neg = e_steps < 0;
{
bool dir =
#ifdef SNMM
(neg == (mmu_extruder & 1))
#else
neg
#endif
? INVERT_E0_DIR : !INVERT_E0_DIR; //If we have SNMM, reverse every second extruder.
WRITE_NC(E0_DIR_PIN, dir);
if (neg)
// Flip the e_steps counter to be always positive.
e_steps = - e_steps;
}
// Tick min(step_loops, abs(e_steps)).
estep_loops = (e_steps & 0x0ff00) ? 4 : e_steps;
if (step_loops < estep_loops)
estep_loops = step_loops;
#ifdef FILAMENT_SENSOR
if (READ(E0_DIR_PIN) == INVERT_E0_DIR)
{
if (count_direction[E_AXIS] == 1)
fsensor_counter -= estep_loops;
else
fsensor_counter += estep_loops;
}
else
{
if (count_direction[E_AXIS] == 1)
fsensor_counter += estep_loops;
else
fsensor_counter -= estep_loops;
}
#endif //FILAMENT_SENSOR
do {
WRITE_NC(E0_STEP_PIN, !INVERT_E_STEP_PIN);
-- e_steps;
WRITE_NC(E0_STEP_PIN, INVERT_E_STEP_PIN);
} while (-- estep_loops != 0);
//WRITE_NC(LOGIC_ANALYZER_CH7, false);
MSerial.checkRx(); // Check for serial chars.
}
if (e_steps) WRITE_NC(E0_DIR_PIN, e_steps < 0? INVERT_E0_DIR: !INVERT_E0_DIR);
uint8_t la_state = 0;
#endif
// Calculare new timer value
// Calculate new timer value
// 13.38-14.63us for steady state,
// 25.12us for acceleration / deceleration.
{
@ -955,14 +806,15 @@ FORCE_INLINE void isr() {
if(acc_step_rate > uint16_t(current_block->nominal_rate))
acc_step_rate = current_block->nominal_rate;
// step_rate to timer interval
uint16_t timer = calc_timer(acc_step_rate);
uint16_t timer = calc_timer(acc_step_rate, step_loops);
_NEXT_ISR(timer);
acceleration_time += timer;
#ifdef LIN_ADVANCE
if (current_block->use_advance_lead)
// int32_t = (uint16_t * uint32_t) >> 17
current_estep_rate = ((uint32_t)acc_step_rate * current_block->abs_adv_steps_multiplier8) >> 17;
#endif
#ifdef LIN_ADVANCE
if (current_block->use_advance_lead) {
if (step_events_completed.wide <= (unsigned long int)step_loops)
la_state = ADV_INIT;
}
#endif
}
else if (step_events_completed.wide > (unsigned long int)current_block->decelerate_after) {
uint16_t step_rate;
@ -973,24 +825,23 @@ FORCE_INLINE void isr() {
step_rate = uint16_t(current_block->final_rate);
}
// Step_rate to timer interval.
uint16_t timer = calc_timer(step_rate);
uint16_t timer = calc_timer(step_rate, step_loops);
_NEXT_ISR(timer);
deceleration_time += timer;
#ifdef LIN_ADVANCE
if (current_block->use_advance_lead)
current_estep_rate = ((uint32_t)step_rate * current_block->abs_adv_steps_multiplier8) >> 17;
#endif
#ifdef LIN_ADVANCE
if (current_block->use_advance_lead) {
la_state = ADV_DECELERATE;
if (step_events_completed.wide <= (unsigned long int)current_block->decelerate_after + step_loops)
la_state |= ADV_INIT;
}
#endif
}
else {
if (! step_loops_nominal) {
// Calculation of the steady state timer rate has been delayed to the 1st tick of the steady state to lower
// the initial interrupt blocking.
OCR1A_nominal = calc_timer(uint16_t(current_block->nominal_rate));
OCR1A_nominal = calc_timer(uint16_t(current_block->nominal_rate), step_loops);
step_loops_nominal = step_loops;
#ifdef LIN_ADVANCE
if (current_block->use_advance_lead)
current_estep_rate = (current_block->nominal_rate * current_block->abs_adv_steps_multiplier8) >> 17;
#endif
}
_NEXT_ISR(OCR1A_nominal);
}
@ -998,110 +849,40 @@ FORCE_INLINE void isr() {
}
#ifdef LIN_ADVANCE
if (e_steps && current_block->use_advance_lead) {
//WRITE_NC(LOGIC_ANALYZER_CH7, true);
MSerial.checkRx(); // Check for serial chars.
// Some of the E steps were not ticked yet. Plan additional interrupts.
uint16_t now = TCNT1;
// Plan the first linear advance interrupt after 50us from now.
uint16_t to_go = nextMainISR - now - LIN_ADV_FIRST_TICK_DELAY;
eISR_Rate = 0;
if ((to_go & 0x8000) == 0) {
// The to_go number is not negative.
// Count the number of 7812,5 ticks, that fit into to_go 2MHz ticks.
uint8_t ticks = to_go >> 8;
if (ticks == 1) {
// Avoid running the following loop for a very short interval.
estep_loops = 255;
eISR_Rate = 1;
} else if ((e_steps & 0x0ff00) == 0) {
// e_steps <= 0x0ff
if (uint8_t(e_steps) <= ticks) {
// Spread the e_steps along the whole go_to interval.
eISR_Rate = to_go / uint8_t(e_steps);
estep_loops = 1;
} else if (ticks != 0) {
// At least one tick fits into the to_go interval. Calculate the e-step grouping.
uint8_t e = uint8_t(e_steps) >> 1;
estep_loops = 2;
while (e > ticks) {
e >>= 1;
estep_loops <<= 1;
// avoid multiple instances or function calls to advance_spread
if (la_state & ADV_INIT) eISR_Err = current_block->advance_rate / 4;
if (la_state & ADV_INIT || nextAdvanceISR != ADV_NEVER) {
advance_spread(main_Rate);
if (la_state & ADV_DECELERATE) {
if (step_loops == e_step_loops)
LA_phase = (eISR_Rate > main_Rate);
else {
// avoid overflow through division. warning: we need to _guarantee_ step_loops
// and e_step_loops are <= 4 due to fastdiv's limit
LA_phase = (fastdiv(eISR_Rate, step_loops) > fastdiv(main_Rate, e_step_loops));
}
// Now the estep_loops contains the number of loops of power of 2, that will be sufficient
// to squeeze enough of Linear Advance ticks until nextMainISR.
// Calculate the tick rate.
eISR_Rate = to_go / ticks;
}
} else {
// This is an exterme case with too many e_steps inserted by the linear advance.
// At least one tick fits into the to_go interval. Calculate the e-step grouping.
estep_loops = 2;
uint16_t e = e_steps >> 1;
while (e & 0x0ff00) {
e >>= 1;
estep_loops <<= 1;
}
while (uint8_t(e) > ticks) {
e >>= 1;
estep_loops <<= 1;
}
// Now the estep_loops contains the number of loops of power of 2, that will be sufficient
// to squeeze enough of Linear Advance ticks until nextMainISR.
// Calculate the tick rate.
eISR_Rate = to_go / ticks;
}
}
if (eISR_Rate == 0) {
// There is not enough time to fit even a single additional tick.
// Tick all the extruder ticks now.
MSerial.checkRx(); // Check for serial chars.
#ifdef FILAMENT_SENSOR
if (READ(E0_DIR_PIN) == INVERT_E0_DIR)
{
if (count_direction[E_AXIS] == 1)
fsensor_counter -= e_steps;
else
fsensor_counter += e_steps;
}
else
{
if (count_direction[E_AXIS] == 1)
fsensor_counter += e_steps;
else
fsensor_counter -= e_steps;
}
#endif //FILAMENT_SENSOR
do {
WRITE_NC(E0_STEP_PIN, !INVERT_E_STEP_PIN);
-- e_steps;
WRITE_NC(E0_STEP_PIN, INVERT_E_STEP_PIN);
} while (e_steps);
OCR1A = nextMainISR;
} else {
// Tick the 1st Linear Advance interrupt after 50us from now.
nextMainISR -= LIN_ADV_FIRST_TICK_DELAY;
OCR1A = now + LIN_ADV_FIRST_TICK_DELAY;
}
//WRITE_NC(LOGIC_ANALYZER_CH7, false);
} else
OCR1A = nextMainISR;
}
// Check for serial chars. This executes roughtly inbetween 50-60% of the total runtime of the
// entire isr, making this spot a much better choice than checking during esteps
MSerial.checkRx();
#endif
// If current block is finished, reset pointer
if (step_events_completed.wide >= current_block->step_event_count.wide) {
#ifdef FILAMENT_SENSOR
fsensor_st_block_chunk(current_block, fsensor_counter);
#if !defined(LIN_ADVANCE) && defined(FILAMENT_SENSOR)
fsensor_st_block_chunk(fsensor_counter);
fsensor_counter = 0;
#endif //FILAMENT_SENSOR
current_block = NULL;
plan_discard_current_block();
}
#ifdef FILAMENT_SENSOR
else if ((fsensor_counter >= fsensor_chunk_len))
#if !defined(LIN_ADVANCE) && defined(FILAMENT_SENSOR)
else if ((abs(fsensor_counter) >= fsensor_chunk_len))
{
fsensor_st_block_chunk(current_block, fsensor_counter);
fsensor_st_block_chunk(fsensor_counter);
fsensor_counter = 0;
}
#endif //FILAMENT_SENSOR
@ -1115,12 +896,105 @@ FORCE_INLINE void isr() {
}
#ifdef LIN_ADVANCE
// Timer interrupt for E. e_steps is set in the main routine.
void clear_current_adv_vars() {
e_steps = 0; //Should be already 0 at an filament change event, but just to be sure..
current_adv_steps = 0;
FORCE_INLINE void advance_isr() {
if (step_events_completed.wide > LA_decelerate_after && current_adv_steps > final_adv_steps) {
// decompression
e_steps -= e_step_loops;
if (e_steps) WRITE_NC(E0_DIR_PIN, e_steps < 0? INVERT_E0_DIR: !INVERT_E0_DIR);
if(current_adv_steps > e_step_loops)
current_adv_steps -= e_step_loops;
else
current_adv_steps = 0;
nextAdvanceISR = eISR_Rate;
}
else if (step_events_completed.wide < LA_decelerate_after && current_adv_steps < max_adv_steps) {
// compression
e_steps += e_step_loops;
if (e_steps) WRITE_NC(E0_DIR_PIN, e_steps < 0? INVERT_E0_DIR: !INVERT_E0_DIR);
current_adv_steps += e_step_loops;
nextAdvanceISR = eISR_Rate;
}
else {
// advance steps completed
nextAdvanceISR = ADV_NEVER;
LA_phase = -1;
e_step_loops = 1;
}
}
FORCE_INLINE void advance_isr_scheduler() {
// Integrate the final timer value, accounting for scheduling adjustments
if(nextAdvanceISR && nextAdvanceISR != ADV_NEVER)
{
if(nextAdvanceISR > OCR1A)
nextAdvanceISR -= OCR1A;
else
nextAdvanceISR = 0;
}
if(nextMainISR > OCR1A)
nextMainISR -= OCR1A;
else
nextMainISR = 0;
// Run main stepping ISR if flagged
if (!nextMainISR)
{
#ifdef LA_DEBUG_LOGIC
WRITE_NC(LOGIC_ANALYZER_CH0, true);
#endif
isr();
#ifdef LA_DEBUG_LOGIC
WRITE_NC(LOGIC_ANALYZER_CH0, false);
#endif
}
// Run the next advance isr if triggered
bool eisr = !nextAdvanceISR;
if (eisr)
{
#ifdef LA_DEBUG_LOGIC
WRITE_NC(LOGIC_ANALYZER_CH1, true);
#endif
advance_isr();
#ifdef LA_DEBUG_LOGIC
WRITE_NC(LOGIC_ANALYZER_CH1, false);
#endif
}
// Tick E steps if any
if (e_steps && (LA_phase < 0 || LA_phase == eisr)) {
uint8_t max_ticks = (eisr? e_step_loops: step_loops);
max_ticks = min(abs(e_steps), max_ticks);
bool rev = (e_steps < 0);
do
{
WRITE_NC(E0_STEP_PIN, !INVERT_E_STEP_PIN);
e_steps += (rev? 1: -1);
WRITE_NC(E0_STEP_PIN, INVERT_E_STEP_PIN);
#ifdef FILAMENT_SENSOR
fsensor_counter += (rev? -1: 1);
#endif
}
while(--max_ticks);
#ifdef FILAMENT_SENSOR
if (abs(fsensor_counter) >= fsensor_chunk_len)
{
fsensor_st_block_chunk(fsensor_counter);
fsensor_counter = 0;
}
#endif
}
// Schedule the next closest tick, ignoring advance if scheduled too
// soon in order to avoid skewing the regular stepper acceleration
if (nextAdvanceISR != ADV_NEVER && (nextAdvanceISR + TCNT1 + 40) < nextMainISR)
OCR1A = nextAdvanceISR;
else
OCR1A = nextMainISR;
}
#endif // LIN_ADVANCE
void st_init()
@ -1347,18 +1221,49 @@ void st_init()
// Plan the first interrupt after 8ms from now.
OCR1A = 0x4000;
TCNT1 = 0;
ENABLE_STEPPER_DRIVER_INTERRUPT();
#ifdef LIN_ADVANCE
e_steps = 0;
current_adv_steps = 0;
#ifdef LA_DEBUG_LOGIC
LOGIC_ANALYZER_CH0_ENABLE;
LOGIC_ANALYZER_CH1_ENABLE;
WRITE_NC(LOGIC_ANALYZER_CH0, false);
WRITE_NC(LOGIC_ANALYZER_CH1, false);
#endif
// Initialize state for the linear advance scheduler
nextMainISR = 0;
nextAdvanceISR = ADV_NEVER;
main_Rate = ADV_NEVER;
e_steps = 0;
e_step_loops = 1;
LA_phase = -1;
current_adv_steps = 0;
#endif
enable_endstops(true); // Start with endstops active. After homing they can be disabled
ENABLE_STEPPER_DRIVER_INTERRUPT();
sei();
}
void st_reset_timer()
{
// Clear a possible pending interrupt on OCR1A overflow.
TIFR1 |= 1 << OCF1A;
// Reset the counter.
TCNT1 = 0;
// Wake up after 1ms from now.
OCR1A = 2000;
#ifdef LIN_ADVANCE
nextMainISR = 0;
if(nextAdvanceISR && nextAdvanceISR != ADV_NEVER)
nextAdvanceISR = 0;
#endif
}
// Block until all buffered steps are executed
void st_synchronize()
{
@ -1443,6 +1348,10 @@ void quickStop()
DISABLE_STEPPER_DRIVER_INTERRUPT();
while (blocks_queued()) plan_discard_current_block();
current_block = NULL;
#ifdef LIN_ADVANCE
nextAdvanceISR = ADV_NEVER;
current_adv_steps = 0;
#endif
st_reset_timer();
ENABLE_STEPPER_DRIVER_INTERRUPT();
}
@ -1561,11 +1470,10 @@ void EEPROM_read_st(int pos, uint8_t* value, uint8_t size)
void st_current_init() //Initialize Digipot Motor Current
{
{
#ifdef MOTOR_CURRENT_PWM_XY_PIN
uint8_t SilentMode = eeprom_read_byte((uint8_t*)EEPROM_SILENT);
if (SilentMode == 0xff) SilentMode = 0; //set power to High Power (MK2.5) or Normal Power (MK3, unused)
SilentModeMenu = SilentMode;
#ifdef MOTOR_CURRENT_PWM_XY_PIN
pinMode(MOTOR_CURRENT_PWM_XY_PIN, OUTPUT);
pinMode(MOTOR_CURRENT_PWM_Z_PIN, OUTPUT);
pinMode(MOTOR_CURRENT_PWM_E_PIN, OUTPUT);
@ -1587,7 +1495,7 @@ void st_current_init() //Initialize Digipot Motor Current
st_current_set(2, motor_current_setting[2]);
//Set timer5 to 31khz so the PWM of the motor power is as constant as possible. (removes a buzzing noise)
TCCR5B = (TCCR5B & ~(_BV(CS50) | _BV(CS51) | _BV(CS52))) | _BV(CS50);
#endif
#endif
}

View File

@ -37,12 +37,6 @@ void st_init();
void isr();
#ifdef LIN_ADVANCE
void advance_isr();
void advance_isr_scheduler();
void clear_current_adv_vars(); //Used to reset the built up pretension and remaining esteps on filament change.
#endif
// Block until all buffered steps are executed
void st_synchronize();
@ -62,15 +56,7 @@ float st_get_position_mm(uint8_t axis);
// Call this function just before re-enabling the stepper driver interrupt and the global interrupts
// to avoid a stepper timer overflow.
FORCE_INLINE void st_reset_timer()
{
// Clear a possible pending interrupt on OCR1A overflow.
TIFR1 |= 1 << OCF1A;
// Reset the counter.
TCNT1 = 0;
// Wake up after 1ms from now.
OCR1A = 2000;
}
void st_reset_timer();
void checkHitEndstops(); //call from somewhere to create an serial error message with the locations the endstops where hit, in case they were triggered
bool endstops_hit_on_purpose(); //avoid creation of the message, i.e. after homing and before a routine call of checkHitEndstops();

View File

@ -44,6 +44,8 @@
#include "Timer.h"
#include "Configuration_prusa.h"
#include "config.h"
//===========================================================================
//=============================public variables============================
//===========================================================================
@ -71,12 +73,12 @@ int current_voltage_raw_pwr = 0;
int current_voltage_raw_bed = 0;
#endif
#if IR_SENSOR_ANALOG
int current_voltage_raw_IR = 0;
#endif //IR_SENSOR_ANALOG
int current_temperature_bed_raw = 0;
float current_temperature_bed = 0.0;
#ifdef TEMP_SENSOR_1_AS_REDUNDANT
int redundant_temperature_raw = 0;
float redundant_temperature = 0.0;
#endif
#ifdef PIDTEMP
@ -175,13 +177,8 @@ static int bed_minttemp_raw = HEATER_BED_RAW_LO_TEMP;
static int bed_maxttemp_raw = HEATER_BED_RAW_HI_TEMP;
#endif
#ifdef TEMP_SENSOR_1_AS_REDUNDANT
static void *heater_ttbl_map[2] = {(void *)HEATER_0_TEMPTABLE, (void *)HEATER_1_TEMPTABLE };
static uint8_t heater_ttbllen_map[2] = { HEATER_0_TEMPTABLE_LEN, HEATER_1_TEMPTABLE_LEN };
#else
static void *heater_ttbl_map[EXTRUDERS] = ARRAY_BY_EXTRUDERS( (void *)HEATER_0_TEMPTABLE, (void *)HEATER_1_TEMPTABLE, (void *)HEATER_2_TEMPTABLE );
static uint8_t heater_ttbllen_map[EXTRUDERS] = ARRAY_BY_EXTRUDERS( HEATER_0_TEMPTABLE_LEN, HEATER_1_TEMPTABLE_LEN, HEATER_2_TEMPTABLE_LEN );
#endif
static void *heater_ttbl_map[EXTRUDERS] = ARRAY_BY_EXTRUDERS( (void *)HEATER_0_TEMPTABLE, (void *)HEATER_1_TEMPTABLE, (void *)HEATER_2_TEMPTABLE );
static uint8_t heater_ttbllen_map[EXTRUDERS] = ARRAY_BY_EXTRUDERS( HEATER_0_TEMPTABLE_LEN, HEATER_1_TEMPTABLE_LEN, HEATER_2_TEMPTABLE_LEN );
static float analog2temp(int raw, uint8_t e);
static float analog2tempBed(int raw);
@ -195,11 +192,6 @@ enum TempRunawayStates
TempRunaway_ACTIVE = 2,
};
#ifdef WATCH_TEMP_PERIOD
int watch_start_temp[EXTRUDERS] = ARRAY_BY_EXTRUDERS(0,0,0);
unsigned long watchmillis[EXTRUDERS] = ARRAY_BY_EXTRUDERS(0,0,0);
#endif //WATCH_TEMP_PERIOD
#ifndef SOFT_PWM_SCALE
#define SOFT_PWM_SCALE 0
#endif
@ -517,14 +509,17 @@ void checkFanSpeed()
// drop the fan_check_error flag when both fans are ok
if( fan_speed_errors[0] == 0 && fan_speed_errors[1] == 0 && fan_check_error == EFCE_REPORTED){
// we may even send some info to the LCD from here
fan_check_error = EFCE_OK;
fan_check_error = EFCE_FIXED;
}
if ((fan_speed_errors[0] > max_extruder_fan_errors) && fans_check_enabled) {
if ((fan_check_error == EFCE_FIXED) && !PRINTER_ACTIVE){
fan_check_error = EFCE_OK; //if the issue is fixed while the printer is doing nothing, reenable processing immediately.
lcd_reset_alert_level(); //for another fan speed error
}
if ((fan_speed_errors[0] > max_extruder_fan_errors) && fans_check_enabled && (fan_check_error == EFCE_OK)) {
fan_speed_errors[0] = 0;
fanSpeedError(0); //extruder fan
}
if ((fan_speed_errors[1] > max_print_fan_errors) && fans_check_enabled) {
if ((fan_speed_errors[1] > max_print_fan_errors) && fans_check_enabled && (fan_check_error == EFCE_OK)) {
fan_speed_errors[1] = 0;
fanSpeedError(1); //print fan
}
@ -543,31 +538,31 @@ static void fanSpeedErrorBeep(const char *serialMsg, const char *lcdMsg){
}
void fanSpeedError(unsigned char _fan) {
if (get_message_level() != 0 && isPrintPaused) return;
//to ensure that target temp. is not set to zero in case taht we are resuming print
if (get_message_level() != 0 && isPrintPaused) return;
//to ensure that target temp. is not set to zero in case that we are resuming print
if (card.sdprinting || is_usb_printing) {
if (heating_status != 0) {
lcd_print_stop();
}
else {
fan_check_error = EFCE_DETECTED;
fan_check_error = EFCE_DETECTED; //plans error for next processed command
}
}
else {
SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSE); //for octoprint
setTargetHotend0(0);
heating_status = 0;
fan_check_error = EFCE_REPORTED;
// SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSED); //Why pause octoprint? is_usb_printing would be true in that case, so there is no need for this.
setTargetHotend0(0);
heating_status = 0;
fan_check_error = EFCE_REPORTED;
}
switch (_fan) {
case 0: // extracting the same code from case 0 and case 1 into a function saves 72B
fanSpeedErrorBeep(PSTR("Extruder fan speed is lower than expected"), PSTR("Err: EXTR. FAN ERROR") );
fanSpeedErrorBeep(PSTR("Extruder fan speed is lower than expected"), MSG_FANCHECK_EXTRUDER);
break;
case 1:
fanSpeedErrorBeep(PSTR("Print fan speed is lower than expected"), PSTR("Err: PRINT FAN ERROR") );
fanSpeedErrorBeep(PSTR("Print fan speed is lower than expected"), MSG_FANCHECK_PRINT);
break;
}
SERIAL_PROTOCOLLNRPGM(MSG_OK);
// SERIAL_PROTOCOLLNRPGM(MSG_OK); //This ok messes things up with octoprint.
}
#endif //(defined(TACH_0) && TACH_0 >-1) || (defined(TACH_1) && TACH_1 > -1)
@ -728,34 +723,6 @@ void manage_heater()
{
soft_pwm[e] = 0;
}
#ifdef WATCH_TEMP_PERIOD
if(watchmillis[e] && _millis() - watchmillis[e] > WATCH_TEMP_PERIOD)
{
if(degHotend(e) < watch_start_temp[e] + WATCH_TEMP_INCREASE)
{
setTargetHotend(0, e);
LCD_MESSAGEPGM("Heating failed");
SERIAL_ECHO_START;
SERIAL_ECHOLN("Heating failed");
}else{
watchmillis[e] = 0;
}
}
#endif
#ifdef TEMP_SENSOR_1_AS_REDUNDANT
if(fabs(current_temperature[0] - redundant_temperature) > MAX_REDUNDANT_TEMP_SENSOR_DIFF) {
disable_heater();
if(IsStopped() == false) {
SERIAL_ERROR_START;
SERIAL_ERRORLNPGM("Extruder switched off. Temperature difference between temp sensors is too high !");
LCD_ALERTMESSAGEPGM("Err: REDUNDANT TEMP ERROR");
}
#ifndef BOGUS_TEMPERATURE_FAILSAFE_OVERRIDE
Stop();
#endif
}
#endif
} // End extruder for loop
#define FAN_CHECK_PERIOD 5000 //5s
@ -907,16 +874,12 @@ void manage_heater()
// Derived from RepRap FiveD extruder::getTemperature()
// For hot end temperature measurement.
static float analog2temp(int raw, uint8_t e) {
#ifdef TEMP_SENSOR_1_AS_REDUNDANT
if(e > EXTRUDERS)
#else
if(e >= EXTRUDERS)
#endif
{
SERIAL_ERROR_START;
SERIAL_ERROR((int)e);
SERIAL_ERRORLNPGM(" - Invalid extruder number !");
kill(PSTR(""), 6);
kill(NULL, 6);
return 0.0;
}
#ifdef HEATER_0_USES_MAX6675
@ -1054,10 +1017,6 @@ static void updateTemperaturesFromRawValues()
current_temperature_bed = analog2tempBed(current_temperature_bed_raw);
#endif //DEBUG_HEATER_BED_SIM
#ifdef TEMP_SENSOR_1_AS_REDUNDANT
redundant_temperature = analog2temp(redundant_temperature_raw, 1);
#endif
CRITICAL_SECTION_START;
temp_meas_ready = false;
CRITICAL_SECTION_END;
@ -1221,20 +1180,6 @@ void tp_init()
#endif //BED_MAXTEMP
}
void setWatch()
{
#ifdef WATCH_TEMP_PERIOD
for (int e = 0; e < EXTRUDERS; e++)
{
if(degHotend(e) < degTargetHotend(e) - (WATCH_TEMP_INCREASE * 2))
{
watch_start_temp[e] = degHotend(e);
watchmillis[e] = _millis();
}
}
#endif
}
#if (defined (TEMP_RUNAWAY_BED_HYSTERESIS) && TEMP_RUNAWAY_BED_TIMEOUT > 0) || (defined (TEMP_RUNAWAY_EXTRUDER_HYSTERESIS) && TEMP_RUNAWAY_EXTRUDER_TIMEOUT > 0)
void temp_runaway_check(int _heater_id, float _target_temperature, float _current_temperature, float _output, bool _isbed)
{
@ -1629,17 +1574,22 @@ extern "C" {
void adc_ready(void) //callback from adc when sampling finished
{
current_temperature_raw[0] = adc_values[ADC_PIN_IDX(TEMP_0_PIN)]; //heater
#ifdef PINDA_THERMISTOR
current_temperature_raw_pinda_fast = adc_values[ADC_PIN_IDX(TEMP_PINDA_PIN)];
#endif //PINDA_THERMISTOR
current_temperature_bed_raw = adc_values[ADC_PIN_IDX(TEMP_BED_PIN)];
#ifdef VOLT_PWR_PIN
current_voltage_raw_pwr = adc_values[ADC_PIN_IDX(VOLT_PWR_PIN)];
#endif
#ifdef AMBIENT_THERMISTOR
current_temperature_raw_ambient = adc_values[ADC_PIN_IDX(TEMP_AMBIENT_PIN)];
current_temperature_raw_ambient = adc_values[ADC_PIN_IDX(TEMP_AMBIENT_PIN)]; // 5->6
#endif //AMBIENT_THERMISTOR
#ifdef VOLT_BED_PIN
current_voltage_raw_bed = adc_values[ADC_PIN_IDX(VOLT_BED_PIN)]; // 6->9
#endif
#if IR_SENSOR_ANALOG
current_voltage_raw_IR = adc_values[ADC_PIN_IDX(VOLT_IR_PIN)];
#endif //IR_SENSOR_ANALOG
temp_meas_ready = true;
}

View File

@ -27,6 +27,8 @@
#include "stepper.h"
#endif
#include "config.h"
#ifdef SYSTEM_TIMER_2
@ -74,9 +76,9 @@ extern int current_voltage_raw_pwr;
extern int current_voltage_raw_bed;
#endif
#ifdef TEMP_SENSOR_1_AS_REDUNDANT
extern float redundant_temperature;
#endif
#if IR_SENSOR_ANALOG
extern int current_voltage_raw_IR;
#endif //IR_SENSOR_ANALOG
#if defined(CONTROLLERFAN_PIN) && CONTROLLERFAN_PIN > -1
extern unsigned char soft_pwm_bed;
@ -220,7 +222,6 @@ FORCE_INLINE bool isCoolingBed() {
int getHeaterPower(int heater);
void disable_heater();
void setWatch();
void updatePID();
@ -245,6 +246,7 @@ void checkExtruderAutoFans();
enum {
EFCE_OK = 0, //!< normal operation, both fans are ok
EFCE_FIXED, //!< previous fan error was fixed
EFCE_DETECTED, //!< fan error detected, but not reported yet
EFCE_REPORTED //!< fan error detected and reported to LCD and serial
};

View File

@ -1,3 +1,5 @@
//! @file
#include "Marlin.h"
#ifdef TMC2130
@ -22,7 +24,7 @@ uint8_t tmc2130_current_h[4] = TMC2130_CURRENTS_H;
uint8_t tmc2130_current_r[4] = TMC2130_CURRENTS_R;
//running currents for homing
uint8_t tmc2130_current_r_home[4] = {8, 10, 20, 18};
uint8_t tmc2130_current_r_home[4] = TMC2130_CURRENTS_R_HOME;
//pwm_ampl
@ -38,7 +40,7 @@ uint8_t tmc2130_mres[4] = {0, 0, 0, 0}; //will be filed at begin of init
uint8_t tmc2130_sg_thr[4] = {TMC2130_SG_THRS_X, TMC2130_SG_THRS_Y, TMC2130_SG_THRS_Z, TMC2130_SG_THRS_E};
uint8_t tmc2130_sg_thr_home[4] = {3, 3, TMC2130_SG_THRS_Z, TMC2130_SG_THRS_E};
uint8_t tmc2130_sg_thr_home[4] = TMC2130_SG_THRS_HOME;
uint8_t tmc2130_sg_homing_axes_mask = 0x00;
@ -425,7 +427,7 @@ void tmc2130_check_overtemp()
void tmc2130_setup_chopper(uint8_t axis, uint8_t mres, uint8_t current_h, uint8_t current_r)
{
uint8_t intpol = 1;
uint8_t intpol = (mres != 0); // intpol to 256 only if microsteps aren't 256
uint8_t toff = tmc2130_chopper_config[axis].toff; // toff = 3 (fchop = 27.778kHz)
uint8_t hstrt = tmc2130_chopper_config[axis].hstr; //initial 4, modified to 5
uint8_t hend = tmc2130_chopper_config[axis].hend; //original value = 1
@ -598,7 +600,7 @@ void tmc2130_wr_THIGH(uint8_t axis, uint32_t val32)
uint8_t tmc2130_usteps2mres(uint16_t usteps)
{
uint8_t mres = 8; while (mres && (usteps >>= 1)) mres--;
uint8_t mres = 8; while (usteps >>= 1) mres--;
return mres;
}
@ -805,15 +807,15 @@ void tmc2130_goto_step(uint8_t axis, uint8_t step, uint8_t dir, uint16_t delay_u
{
dir = tmc2130_get_inv(axis)?0:1;
int steps = (int)step - (int)(mscnt >> shift);
if (steps < 0)
{
dir ^= 1;
steps = -steps;
}
if (steps > static_cast<int>(cnt / 2))
{
dir ^= 1;
steps = cnt - steps;
steps = cnt - steps; // This can create a negative step value
}
if (steps < 0)
{
dir ^= 1;
steps = -steps;
}
cnt = steps;
}
@ -1009,6 +1011,79 @@ bool tmc2130_home_calibrate(uint8_t axis)
return true;
}
//! @brief Translate current to tmc2130 vsense and IHOLD or IRUN
//! @param cur current in mA
//! @return 0 .. 63
//! @n most significant bit is CHOPCONF vsense bit (sense resistor voltage based current scaling)
//! @n rest is to be used in IRUN or IHOLD register
//!
//! | mA | trinamic register | note |
//! | --- | --- | --- |
//! | 0 | 0 | doesn't mean current off, lowest current is 1/32 current with vsense low range |
//! | 30 | 1 | |
//! | 40 | 2 | |
//! | 60 | 3 | |
//! | 90 | 4 | |
//! | 100 | 5 | |
//! | 120 | 6 | |
//! | 130 | 7 | |
//! | 150 | 8 | |
//! | 180 | 9 | |
//! | 190 | 10 | |
//! | 210 | 11 | |
//! | 230 | 12 | |
//! | 240 | 13 | |
//! | 250 | 13 | |
//! | 260 | 14 | |
//! | 280 | 15 | |
//! | 300 | 16 | |
//! | 320 | 17 | |
//! | 340 | 18 | |
//! | 350 | 19 | |
//! | 370 | 20 | |
//! | 390 | 21 | |
//! | 410 | 22 | |
//! | 430 | 23 | |
//! | 450 | 24 | |
//! | 460 | 25 | |
//! | 480 | 26 | |
//! | 500 | 27 | |
//! | 520 | 28 | |
//! | 535 | 29 | |
//! | N/D | 30 | extruder default |
//! | 540 | 33 | |
//! | 560 | 34 | |
//! | 580 | 35 | |
//! | 590 | 36 | farm mode extruder default |
//! | 610 | 37 | |
//! | 630 | 38 | |
//! | 640 | 39 | |
//! | 660 | 40 | |
//! | 670 | 41 | |
//! | 690 | 42 | |
//! | 710 | 43 | |
//! | 720 | 44 | |
//! | 730 | 45 | |
//! | 760 | 46 | |
//! | 770 | 47 | |
//! | 790 | 48 | |
//! | 810 | 49 | |
//! | 820 | 50 | |
//! | 840 | 51 | |
//! | 850 | 52 | |
//! | 870 | 53 | |
//! | 890 | 54 | |
//! | 900 | 55 | |
//! | 920 | 56 | |
//! | 940 | 57 | |
//! | 950 | 58 | |
//! | 970 | 59 | |
//! | 980 | 60 | |
//! | 1000 | 61 | |
//! | 1020 | 62 | |
//! | 1029 | 63 | |
uint8_t tmc2130_cur2val(float cur)
{
if (cur < 0) cur = 0; //limit min

File diff suppressed because it is too large Load Diff

View File

@ -6,6 +6,9 @@
#include "conv2str.h"
#include "menu.h"
#include "mesh_bed_calibration.h"
#include "config.h"
#include "config.h"
extern void menu_lcd_longpress_func(void);
extern void menu_lcd_charsetup_func(void);
@ -47,6 +50,7 @@ unsigned char lcd_choose_color();
void lcd_load_filament_color_check();
//void lcd_mylang();
extern void lcd_belttest();
extern bool lcd_selftest();
void lcd_menu_statistics();
@ -167,6 +171,8 @@ enum class FilamentAction : uint_least8_t
MmuUnLoad,
MmuEject,
MmuCut,
Preheat,
Lay1Cal,
};
extern FilamentAction eFilamentAction;
@ -175,7 +181,7 @@ extern bool bFilamentPreheatState;
extern bool bFilamentAction;
void mFilamentItem(uint16_t nTemp,uint16_t nTempBed);
void mFilamentItemForce();
void mFilamentMenu();
void lcd_generic_preheat_menu();
void unload_filament();
void stack_error();
@ -195,7 +201,9 @@ void lcd_wait_for_cool_down();
void lcd_extr_cal_reset();
void lcd_temp_cal_show_result(bool result);
#ifdef PINDA_THERMISTOR
bool lcd_wait_for_pinda(float temp);
#endif //PINDA_THERMISTOR
void bowden_menu();
@ -213,7 +221,9 @@ void lcd_set_degree();
void lcd_set_progress();
#endif
#if (LANG_MODE != 0)
void lcd_language();
#endif
void lcd_wizard();
bool lcd_autoDepleteEnabled();
@ -221,22 +231,31 @@ bool lcd_autoDepleteEnabled();
//! @brief Wizard state
enum class WizState : uint8_t
{
Run, //!< run wizard? Entry point.
Run, //!< run wizard? Main entry point.
Restore, //!< restore calibration status
Selftest,
Selftest, //!< self test
Xyz, //!< xyz calibration
Z, //!< z calibration
IsFil, //!< Is filament loaded? Entry point for 1st layer calibration
IsFil, //!< Is filament loaded? First step of 1st layer calibration
PreheatPla, //!< waiting for preheat nozzle for PLA
Preheat, //!< Preheat for any material
Unload, //!< Unload filament
LoadFil, //!< Load filament
LoadFilCold, //!< Load filament for MMU
LoadFilHot, //!< Load filament without MMU
IsPla, //!< Is PLA filament?
Lay1Cal, //!< First layer calibration
Lay1CalCold, //!< First layer calibration, temperature not selected yet
Lay1CalHot, //!< First layer calibration, temperature already selected
RepeatLay1Cal, //!< Repeat first layer calibration?
Finish, //!< Deactivate wizard
};
void lcd_wizard(WizState state);
#define VOLT_DIV_REF 5
#if IR_SENSOR_ANALOG
#define IRsensor_Hmin_TRESHOLD (3.0*1023*OVERSAMPLENR/VOLT_DIV_REF) // ~3.0V (0.6*Vcc)
#define IRsensor_Lmax_TRESHOLD (1.5*1023*OVERSAMPLENR/VOLT_DIV_REF) // ~1.5V (0.3*Vcc)
#define IRsensor_Hopen_TRESHOLD (4.6*1023*OVERSAMPLENR/VOLT_DIV_REF) // ~4.6V (N.C. @ Ru~20-50k, Rd'=56k, Ru'=10k)
#define IRsensor_Ldiode_TRESHOLD (0.3*1023*OVERSAMPLENR/VOLT_DIV_REF) // ~0.3V
#endif //IR_SENSOR_ANALOG
#endif //ULTRALCD_H

View File

@ -341,13 +341,17 @@ if(oCheckMode==ClCheckMode::_Undef)
eeprom_update_byte((uint8_t*)EEPROM_CHECK_MODE,(uint8_t)oCheckMode);
}
if(farm_mode)
{
oCheckMode=ClCheckMode::_Strict;
if(eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM)==EEPROM_EMPTY_VALUE16)
eeprom_update_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM,EEPROM_NOZZLE_DIAMETER_uM_DEFAULT);
}
oNozzleDiameter=(ClNozzleDiameter)eeprom_read_byte((uint8_t*)EEPROM_NOZZLE_DIAMETER);
if((oNozzleDiameter==ClNozzleDiameter::_Diameter_Undef)&& !farm_mode)
{
oNozzleDiameter=ClNozzleDiameter::_Diameter_400;
eeprom_update_byte((uint8_t*)EEPROM_NOZZLE_DIAMETER,(uint8_t)oNozzleDiameter);
eeprom_update_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM,400);
eeprom_update_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM,EEPROM_NOZZLE_DIAMETER_uM_DEFAULT);
}
oCheckModel=(ClCheckModel)eeprom_read_byte((uint8_t*)EEPROM_CHECK_MODEL);
if(oCheckModel==ClCheckModel::_Undef)

View File

@ -35,6 +35,8 @@ inline void eeprom_update_int8(unsigned char* addr, int8_t v) {
//-//
#define EEPROM_NOZZLE_DIAMETER_uM_DEFAULT 400
enum class ClPrintChecking:uint_least8_t
{
_Nozzle=1,

View File

@ -319,35 +319,27 @@ PREHEAT SETTINGS
#define FARM_PREHEAT_HOTEND_TEMP 250
#define FARM_PREHEAT_HPB_TEMP 80
#define FARM_PREHEAT_FAN_SPEED 0
#define PLA_PREHEAT_HOTEND_TEMP 215
#define PLA_PREHEAT_HPB_TEMP 55
#define PLA_PREHEAT_FAN_SPEED 0
#define ASA_PREHEAT_HOTEND_TEMP 260
#define ASA_PREHEAT_HPB_TEMP 105
#define ASA_PREHEAT_FAN_SPEED 0
#define ABS_PREHEAT_HOTEND_TEMP 255
#define ABS_PREHEAT_HPB_TEMP 100
#define ABS_PREHEAT_FAN_SPEED 0
#define HIPS_PREHEAT_HOTEND_TEMP 220
#define HIPS_PREHEAT_HPB_TEMP 100
#define HIPS_PREHEAT_FAN_SPEED 0
#define PP_PREHEAT_HOTEND_TEMP 254
#define PP_PREHEAT_HPB_TEMP 100
#define PP_PREHEAT_FAN_SPEED 0
#define PET_PREHEAT_HOTEND_TEMP 240
#define PET_PREHEAT_HPB_TEMP 90
#define PET_PREHEAT_FAN_SPEED 0
#define FLEX_PREHEAT_HOTEND_TEMP 230
#define FLEX_PREHEAT_HPB_TEMP 50
#define FLEX_PREHEAT_FAN_SPEED 0
/*------------------------------------
THERMISTORS SETTINGS

View File

@ -377,35 +377,27 @@
#define FARM_PREHEAT_HOTEND_TEMP 250
#define FARM_PREHEAT_HPB_TEMP 80
#define FARM_PREHEAT_FAN_SPEED 0
#define PLA_PREHEAT_HOTEND_TEMP 215
#define PLA_PREHEAT_HPB_TEMP 60
#define PLA_PREHEAT_FAN_SPEED 0
#define ASA_PREHEAT_HOTEND_TEMP 260
#define ASA_PREHEAT_HPB_TEMP 105
#define ASA_PREHEAT_FAN_SPEED 0
#define ABS_PREHEAT_HOTEND_TEMP 255
#define ABS_PREHEAT_HPB_TEMP 100
#define ABS_PREHEAT_FAN_SPEED 0
#define HIPS_PREHEAT_HOTEND_TEMP 220
#define HIPS_PREHEAT_HPB_TEMP 100
#define HIPS_PREHEAT_FAN_SPEED 0
#define PP_PREHEAT_HOTEND_TEMP 254
#define PP_PREHEAT_HPB_TEMP 100
#define PP_PREHEAT_FAN_SPEED 0
#define PET_PREHEAT_HOTEND_TEMP 230
#define PET_PREHEAT_HPB_TEMP 85
#define PET_PREHEAT_FAN_SPEED 0
#define FLEX_PREHEAT_HOTEND_TEMP 240
#define FLEX_PREHEAT_HPB_TEMP 50
#define FLEX_PREHEAT_FAN_SPEED 0
/*------------------------------------
THERMISTORS SETTINGS
@ -512,7 +504,7 @@
#define MMU_REQUIRED_FW_BUILDNR 132
#define MMU_FORCE_STEALTH_MODE
#define MMU_DEBUG //print communication between MMU2 and printer on serial
//#define MMU_HAS_CUTTER
#define MMU_HAS_CUTTER
#define MMU_IDLER_SENSOR_ATTEMPTS_NR 21 //max. number of attempts to load filament if first load failed; value for max bowden length and case when loading fails right at the beginning

View File

@ -378,35 +378,27 @@
#define FARM_PREHEAT_HOTEND_TEMP 250
#define FARM_PREHEAT_HPB_TEMP 80
#define FARM_PREHEAT_FAN_SPEED 0
#define PLA_PREHEAT_HOTEND_TEMP 215
#define PLA_PREHEAT_HPB_TEMP 60
#define PLA_PREHEAT_FAN_SPEED 0
#define ASA_PREHEAT_HOTEND_TEMP 260
#define ASA_PREHEAT_HPB_TEMP 105
#define ASA_PREHEAT_FAN_SPEED 0
#define ABS_PREHEAT_HOTEND_TEMP 255
#define ABS_PREHEAT_HPB_TEMP 100
#define ABS_PREHEAT_FAN_SPEED 0
#define HIPS_PREHEAT_HOTEND_TEMP 220
#define HIPS_PREHEAT_HPB_TEMP 100
#define HIPS_PREHEAT_FAN_SPEED 0
#define PP_PREHEAT_HOTEND_TEMP 254
#define PP_PREHEAT_HPB_TEMP 100
#define PP_PREHEAT_FAN_SPEED 0
#define PET_PREHEAT_HOTEND_TEMP 230
#define PET_PREHEAT_HPB_TEMP 85
#define PET_PREHEAT_FAN_SPEED 0
#define FLEX_PREHEAT_HOTEND_TEMP 240
#define FLEX_PREHEAT_HPB_TEMP 50
#define FLEX_PREHEAT_FAN_SPEED 0
/*------------------------------------
THERMISTORS SETTINGS
@ -513,7 +505,7 @@
#define MMU_REQUIRED_FW_BUILDNR 132
#define MMU_FORCE_STEALTH_MODE
#define MMU_DEBUG //print communication between MMU2 and printer on serial
//#define MMU_HAS_CUTTER
#define MMU_HAS_CUTTER
#define MMU_IDLER_SENSOR_ATTEMPTS_NR 21 //max. number of attempts to load filament if first load failed; value for max bowden length and case when loading fails right at the beginning

View File

@ -377,35 +377,27 @@
#define FARM_PREHEAT_HOTEND_TEMP 250
#define FARM_PREHEAT_HPB_TEMP 80
#define FARM_PREHEAT_FAN_SPEED 0
#define PLA_PREHEAT_HOTEND_TEMP 215
#define PLA_PREHEAT_HPB_TEMP 60
#define PLA_PREHEAT_FAN_SPEED 0
#define ASA_PREHEAT_HOTEND_TEMP 260
#define ASA_PREHEAT_HPB_TEMP 105
#define ASA_PREHEAT_FAN_SPEED 0
#define ABS_PREHEAT_HOTEND_TEMP 255
#define ABS_PREHEAT_HPB_TEMP 100
#define ABS_PREHEAT_FAN_SPEED 0
#define HIPS_PREHEAT_HOTEND_TEMP 220
#define HIPS_PREHEAT_HPB_TEMP 100
#define HIPS_PREHEAT_FAN_SPEED 0
#define PP_PREHEAT_HOTEND_TEMP 254
#define PP_PREHEAT_HPB_TEMP 100
#define PP_PREHEAT_FAN_SPEED 0
#define PET_PREHEAT_HOTEND_TEMP 230
#define PET_PREHEAT_HPB_TEMP 85
#define PET_PREHEAT_FAN_SPEED 0
#define FLEX_PREHEAT_HOTEND_TEMP 240
#define FLEX_PREHEAT_HPB_TEMP 50
#define FLEX_PREHEAT_FAN_SPEED 0
/*------------------------------------
THERMISTORS SETTINGS
@ -512,7 +504,7 @@
#define MMU_REQUIRED_FW_BUILDNR 132
#define MMU_FORCE_STEALTH_MODE
#define MMU_DEBUG //print communication between MMU2 and printer on serial
//#define MMU_HAS_CUTTER
#define MMU_HAS_CUTTER
// This is experimental feature requested by our test department.
// There is no known use for ordinary user. If enabled by this macro

View File

@ -378,35 +378,27 @@
#define FARM_PREHEAT_HOTEND_TEMP 250
#define FARM_PREHEAT_HPB_TEMP 80
#define FARM_PREHEAT_FAN_SPEED 0
#define PLA_PREHEAT_HOTEND_TEMP 215
#define PLA_PREHEAT_HPB_TEMP 60
#define PLA_PREHEAT_FAN_SPEED 0
#define ASA_PREHEAT_HOTEND_TEMP 260
#define ASA_PREHEAT_HPB_TEMP 105
#define ASA_PREHEAT_FAN_SPEED 0
#define ABS_PREHEAT_HOTEND_TEMP 255
#define ABS_PREHEAT_HPB_TEMP 100
#define ABS_PREHEAT_FAN_SPEED 0
#define HIPS_PREHEAT_HOTEND_TEMP 220
#define HIPS_PREHEAT_HPB_TEMP 100
#define HIPS_PREHEAT_FAN_SPEED 0
#define PP_PREHEAT_HOTEND_TEMP 254
#define PP_PREHEAT_HPB_TEMP 100
#define PP_PREHEAT_FAN_SPEED 0
#define PET_PREHEAT_HOTEND_TEMP 230
#define PET_PREHEAT_HPB_TEMP 85
#define PET_PREHEAT_FAN_SPEED 0
#define FLEX_PREHEAT_HOTEND_TEMP 240
#define FLEX_PREHEAT_HPB_TEMP 50
#define FLEX_PREHEAT_FAN_SPEED 0
/*------------------------------------
THERMISTORS SETTINGS
@ -513,7 +505,7 @@
#define MMU_REQUIRED_FW_BUILDNR 132
#define MMU_FORCE_STEALTH_MODE
#define MMU_DEBUG //print communication between MMU2 and printer on serial
//#define MMU_HAS_CUTTER
#define MMU_HAS_CUTTER
// This is experimental feature requested by our test department.
// There is no known use for ordinary user. If enabled by this macro

View File

@ -260,11 +260,13 @@
#define TMC2130_SG_THRS_Y 3 // stallguard sensitivity for Y axis
#define TMC2130_SG_THRS_Z 4 // stallguard sensitivity for Z axis
#define TMC2130_SG_THRS_E 3 // stallguard sensitivity for E axis
#define TMC2130_SG_THRS_HOME {3, 3, TMC2130_SG_THRS_Z, TMC2130_SG_THRS_E}
//new settings is possible for vsense = 1, running current value > 31 set vsense to zero and shift both currents by 1 bit right (Z axis only)
#define TMC2130_CURRENTS_H {16, 20, 35, 30} // default holding currents for all axes
#define TMC2130_CURRENTS_R {16, 20, 35, 30} // default running currents for all axes
#define TMC2130_UNLOAD_CURRENT_R 12 // lowe current for M600 to protect filament sensor
#define TMC2130_CURRENTS_R_HOME {8, 10, 20, 18} // homing running currents for all axes
// #define TMC2130_UNLOAD_CURRENT_R 12 // lower current for M600 to protect filament sensor - Unused
#define TMC2130_STEALTH_Z
@ -487,35 +489,27 @@
#define FARM_PREHEAT_HOTEND_TEMP 250
#define FARM_PREHEAT_HPB_TEMP 80
#define FARM_PREHEAT_FAN_SPEED 0
#define PLA_PREHEAT_HOTEND_TEMP 215
#define PLA_PREHEAT_HPB_TEMP 60
#define PLA_PREHEAT_FAN_SPEED 0
#define ASA_PREHEAT_HOTEND_TEMP 260
#define ASA_PREHEAT_HPB_TEMP 105
#define ASA_PREHEAT_FAN_SPEED 0
#define ABS_PREHEAT_HOTEND_TEMP 255
#define ABS_PREHEAT_HPB_TEMP 100
#define ABS_PREHEAT_FAN_SPEED 0
#define HIPS_PREHEAT_HOTEND_TEMP 220
#define HIPS_PREHEAT_HPB_TEMP 100
#define HIPS_PREHEAT_FAN_SPEED 0
#define PP_PREHEAT_HOTEND_TEMP 254
#define PP_PREHEAT_HPB_TEMP 100
#define PP_PREHEAT_FAN_SPEED 0
#define PET_PREHEAT_HOTEND_TEMP 230
#define PET_PREHEAT_HPB_TEMP 85
#define PET_PREHEAT_FAN_SPEED 0
#define FLEX_PREHEAT_HOTEND_TEMP 240
#define FLEX_PREHEAT_HPB_TEMP 50
#define FLEX_PREHEAT_FAN_SPEED 0
/*------------------------------------
THERMISTORS SETTINGS
@ -636,7 +630,7 @@
#define MMU_REQUIRED_FW_BUILDNR 83
#define MMU_HWRESET
#define MMU_DEBUG //print communication between MMU2 and printer on serial
//#define MMU_HAS_CUTTER
#define MMU_HAS_CUTTER
#define MMU_IDLER_SENSOR_ATTEMPTS_NR 21 //max. number of attempts to load filament if first load failed; value for max bowden length and case when loading fails right at the beginning
#endif //__CONFIGURATION_PRUSA_H

View File

@ -262,11 +262,13 @@
#define TMC2130_SG_THRS_Y 3 // stallguard sensitivity for Y axis
#define TMC2130_SG_THRS_Z 4 // stallguard sensitivity for Z axis
#define TMC2130_SG_THRS_E 3 // stallguard sensitivity for E axis
#define TMC2130_SG_THRS_HOME {3, 3, TMC2130_SG_THRS_Z, TMC2130_SG_THRS_E}
//new settings is possible for vsense = 1, running current value > 31 set vsense to zero and shift both currents by 1 bit right (Z axis only)
#define TMC2130_CURRENTS_H {16, 20, 35, 30} // default holding currents for all axes
#define TMC2130_CURRENTS_R {16, 20, 35, 30} // default running currents for all axes
#define TMC2130_UNLOAD_CURRENT_R 12 // lowe current for M600 to protect filament sensor
#define TMC2130_CURRENTS_R_HOME {8, 10, 20, 18} // homing running currents for all axes
// #define TMC2130_UNLOAD_CURRENT_R 12 // lower current for M600 to protect filament sensor - Unused
#define TMC2130_STEALTH_Z
@ -489,35 +491,27 @@
#define FARM_PREHEAT_HOTEND_TEMP 250
#define FARM_PREHEAT_HPB_TEMP 80
#define FARM_PREHEAT_FAN_SPEED 0
#define PLA_PREHEAT_HOTEND_TEMP 215
#define PLA_PREHEAT_HPB_TEMP 60
#define PLA_PREHEAT_FAN_SPEED 0
#define ASA_PREHEAT_HOTEND_TEMP 260
#define ASA_PREHEAT_HPB_TEMP 105
#define ASA_PREHEAT_FAN_SPEED 0
#define ABS_PREHEAT_HOTEND_TEMP 255
#define ABS_PREHEAT_HPB_TEMP 100
#define ABS_PREHEAT_FAN_SPEED 0
#define HIPS_PREHEAT_HOTEND_TEMP 220
#define HIPS_PREHEAT_HPB_TEMP 100
#define HIPS_PREHEAT_FAN_SPEED 0
#define PP_PREHEAT_HOTEND_TEMP 254
#define PP_PREHEAT_HPB_TEMP 100
#define PP_PREHEAT_FAN_SPEED 0
#define PET_PREHEAT_HOTEND_TEMP 230
#define PET_PREHEAT_HPB_TEMP 85
#define PET_PREHEAT_FAN_SPEED 0
#define FLEX_PREHEAT_HOTEND_TEMP 240
#define FLEX_PREHEAT_HPB_TEMP 50
#define FLEX_PREHEAT_FAN_SPEED 0
/*------------------------------------
THERMISTORS SETTINGS
@ -638,7 +632,7 @@
#define MMU_REQUIRED_FW_BUILDNR 83
#define MMU_HWRESET
#define MMU_DEBUG //print communication between MMU2 and printer on serial
//#define MMU_HAS_CUTTER
#define MMU_HAS_CUTTER
// This is experimental feature requested by our test department.
// There is no known use for ordinary user. If enabled by this macro

View File

@ -56,7 +56,7 @@
# Some may argue that this is only used by a script, BUT as soon someone accidentally or on purpose starts Arduino IDE
# it will use the default Arduino IDE folders and so can corrupt the build environment.
#
# Version: 1.0.6-Build_9
# Version: 1.0.6-Build_10
# Change log:
# 12 Jan 2019, 3d-gussner, Fixed "compiler.c.elf.flags=-w -Os -Wl,-u,vfprintf -lprintf_flt -lm -Wl,--gc-sections" in 'platform.txt'
# 16 Jan 2019, 3d-gussner, Build_2, Added development check to modify 'Configuration.h' to prevent unwanted LCD messages that Firmware is unknown
@ -112,7 +112,9 @@
# Changed Hex-files folder to PF-build-hex as requested in PR
# 23 Jul 2019, 3d-gussner, Added Finding OS version routine so supporting new OS should get easier
# 26 Jul 2019, 3d-gussner, Change JSON repository to prusa3d after PR https://github.com/prusa3d/Arduino_Boards/pull/1 was merged
# 23 Sep 2019, 3d-gussner, Prepare PF-build.sh for comming Prusa3d/Arduino_Boards version 1.0.2 Pull Request
# 17 Oct 2019, 3d-gussner, Changed folder and check file names to have seperated build enviroments depening on Arduino IDE version and
# board-versions.
#### Start check if OSTYPE is supported
OS_FOUND=$( command -v uname)
@ -211,7 +213,8 @@ fi
#### Set build environment
ARDUINO_ENV="1.8.5"
BUILD_ENV="1.0.6"
BOARD="PrusaResearchRambo"
BOARD="rambo"
BOARD_PACKAGE_NAME="PrusaResearchRambo"
BOARD_VERSION="1.0.1"
BOARD_URL="https://raw.githubusercontent.com/prusa3d/Arduino_Boards/master/IDE_Board_Manager/package_prusa3d_index.json"
BOARD_FILENAME="prusa3drambo"
@ -229,6 +232,7 @@ echo ""
echo "Ardunio IDE :" $ARDUINO_ENV
echo "Build env :" $BUILD_ENV
echo "Board :" $BOARD
echo "Package name:" $BOARD_PACKAGE_NAME
echo "Specific Lib:" $LIB
echo ""
@ -259,12 +263,12 @@ if [ $TARGET_OS == "windows" ]; then
wget https://downloads.arduino.cc/arduino-$ARDUINO_ENV-windows.zip || exit 7
echo "$(tput sgr 0)"
fi
if [ ! -d "../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor" ]; then
if [[ ! -d "../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor" && ! -e "../PF-build-env-$BUILD_ENV/arduino-$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor.txt" ]]; then
echo "$(tput setaf 6)Unzipping Windows 32/64-bit Arduino IDE portable...$(tput setaf 2)"
sleep 2
unzip arduino-$ARDUINO_ENV-windows.zip -d ../PF-build-env-$BUILD_ENV || exit 7
mv ../PF-build-env-$BUILD_ENV/arduino-$ARDUINO_ENV ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor
echo "# arduino-$ARDUINO_ENV-$TARGET_OS-$Processor" >> ../PF-build-env-$BUILD_ENV/arduino-$ARDUINO_ENV-$TARGET_OS-$Processor
mv ../PF-build-env-$BUILD_ENV/arduino-$ARDUINO_ENV ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor
echo "# arduino-$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor" >> ../PF-build-env-$BUILD_ENV/arduino-$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor.txt
echo "$(tput sgr0)"
fi
fi
@ -277,55 +281,55 @@ if [ $TARGET_OS == "linux" ]; then
wget --no-check-certificate https://downloads.arduino.cc/arduino-$ARDUINO_ENV-linux$Processor.tar.xz || exit 8
echo "$(tput sgr 0)"
fi
if [[ ! -d "../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor" && ! -e "../PF-build-env-$BUILD_ENV/arduino-$ARDUINO_ENV-$TARGET_OS-$Processor.txt" ]]; then
if [[ ! -d "../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor" && ! -e "../PF-build-env-$BUILD_ENV/arduino-$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor.txt" ]]; then
echo "$(tput setaf 6)Unzipping Linux $Processor Arduino IDE portable...$(tput setaf 2)"
sleep 2
tar -xvf arduino-$ARDUINO_ENV-linux$Processor.tar.xz -C ../PF-build-env-$BUILD_ENV/ || exit 8
mv ../PF-build-env-$BUILD_ENV/arduino-$ARDUINO_ENV ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor
echo "# arduino-$ARDUINO_ENV-$TARGET_OS-$Processor" >> ../PF-build-env-$BUILD_ENV/arduino-$ARDUINO_ENV-$TARGET_OS-$Processor.txt
mv ../PF-build-env-$BUILD_ENV/arduino-$ARDUINO_ENV ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor
echo "# arduino-$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor" >> ../PF-build-env-$BUILD_ENV/arduino-$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor.txt
echo "$(tput sgr0)"
fi
fi
# Make Arduino IDE portable
if [ ! -d ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/ ]; then
mkdir ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/
if [ ! -d ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/ ]; then
mkdir ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/
fi
if [ ! -d ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/ ]; then
mkdir ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable
if [ ! -d ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/ ]; then
mkdir ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable
fi
if [ ! -d ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/output/ ]; then
mkdir ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/output
if [ ! -d ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/output/ ]; then
mkdir ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/output
fi
if [ ! -d ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/ ]; then
mkdir ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages
if [ ! -d ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/packages/ ]; then
mkdir ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/packages
fi
if [ ! -d ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/sketchbook/ ]; then
mkdir ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/sketchbook
if [ ! -d ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/sketchbook/ ]; then
mkdir ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/sketchbook
fi
if [ ! -d ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/sketchbook/libraries/ ]; then
mkdir ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/sketchbook/libraries
if [ ! -d ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/sketchbook/libraries/ ]; then
mkdir ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/sketchbook/libraries
fi
if [ ! -d ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/staging/ ]; then
mkdir ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/staging
if [ ! -d ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/staging/ ]; then
mkdir ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/staging
fi
# Change Arduino IDE preferences
if [ ! -e ../PF-build-env-$BUILD_ENV/Preferences-$TARGET_OS-$Processor.txt ]; then
echo "$(tput setaf 6)Setting $TARGET_OS-$Processor Arduino IDE preferences for portable GUI usage...$(tput setaf 2)"
if [ ! -e ../PF-build-env-$BUILD_ENV/Preferences-$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor.txt ]; then
echo "$(tput setaf 6)Setting $ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor Arduino IDE preferences for portable GUI usage...$(tput setaf 2)"
sleep 2
echo "update.check"
sed -i 's/update.check = true/update.check = false/g' ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/lib/preferences.txt
sed -i 's/update.check = true/update.check = false/g' ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/lib/preferences.txt
echo "board"
sed -i 's/board = uno/board = rambo/g' ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/lib/preferences.txt
sed -i 's/board = uno/board = $BOARD/g' ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/lib/preferences.txt
echo "editor.linenumbers"
sed -i 's/editor.linenumbers = false/editor.linenumbers = true/g' ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/lib/preferences.txt
sed -i 's/editor.linenumbers = false/editor.linenumbers = true/g' ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/lib/preferences.txt
echo "boardsmanager.additional.urls"
echo "boardsmanager.additional.urls=$BOARD_URL" >>../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/lib/preferences.txt
echo "build.verbose=true" >>../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/lib/preferences.txt
echo "compiler.cache_core=false" >>../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/lib/preferences.txt
echo "compiler.warning_level=all" >>../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/lib/preferences.txt
echo "# Preferences-$TARGET_OS-$Processor" >> ../PF-build-env-$BUILD_ENV/Preferences-$TARGET_OS-$Processor.txt
echo "boardsmanager.additional.urls=$BOARD_URL" >>../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/lib/preferences.txt
echo "build.verbose=true" >>../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/lib/preferences.txt
echo "compiler.cache_core=false" >>../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/lib/preferences.txt
echo "compiler.warning_level=all" >>../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/lib/preferences.txt
echo "# Preferences-$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor" >> ../PF-build-env-$BUILD_ENV/Preferences-$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor.txt
echo "$(tput sgr0)"
fi
@ -336,25 +340,26 @@ if [ ! -f "$BOARD_FILENAME-$BOARD_VERSION.tar.bz2" ]; then
sleep 2
wget $BOARD_FILE_URL || exit 9
fi
if [[ ! -d "../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD/hardware/avr/$BOARD_VERSION" || ! -e "../PF-build-env-$BUILD_ENV/$BOARD_FILENAME-$BOARD_VERSION-$TARGET_OS-$Processor.txt" ]]; then
echo "$(tput setaf 6)Unzipping $BOARD Arduino IDE portable...$(tput setaf 2)"
if [[ ! -d "../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME/hardware/avr/$BOARD_VERSION" || ! -e "../PF-build-env-$BUILD_ENV/$BOARD_FILENAME-$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor.txt" ]]; then
echo "$(tput setaf 6)Unzipping $BOARD_PACKAGE_NAME Arduino IDE portable...$(tput setaf 2)"
sleep 2
tar -xvf $BOARD_FILENAME-$BOARD_VERSION.tar.bz2 -C ../PF-build-env-$BUILD_ENV/ || exit 10
if [ ! -d ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD ]; then
mkdir ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD
if [ ! -d ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME ]; then
mkdir ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME
fi
if [ ! -d ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD ]; then
mkdir ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD
if [ ! -d ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME ]; then
mkdir ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME
fi
if [ ! -d ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD/hardware ]; then
mkdir ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD/hardware
if [ ! -d ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME/hardware ]; then
mkdir ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME/hardware
fi
if [ ! -d ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD/hardware/avr ]; then
mkdir ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD/hardware/avr
if [ ! -d ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME/hardware/avr ]; then
mkdir ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME/hardware/avr
fi
mv ../PF-build-env-$BUILD_ENV/$BOARD_FILENAME-$BOARD_VERSION ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/$BOARD/hardware/avr/$BOARD_VERSION
echo "# $BOARD_FILENAME-$BOARD_VERSION" >> ../PF-build-env-$BUILD_ENV/$BOARD_FILENAME-$BOARD_VERSION-$TARGET_OS-$Processor.txt
mv ../PF-build-env-$BUILD_ENV/$BOARD_FILENAME-$BOARD_VERSION ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/packages/$BOARD_PACKAGE_NAME/hardware/avr/$BOARD_VERSION
echo "# $BOARD_FILENAME-$BOARD_VERSION" >> ../PF-build-env-$BUILD_ENV/$BOARD_FILENAME-$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor.txt
echo "$(tput sgr 0)"
fi
@ -365,30 +370,30 @@ if [ ! -f "PF-build-env-$BUILD_ENV.zip" ]; then
wget $PF_BUILD_FILE_URL || exit 11
echo "$(tput sgr 0)"
fi
if [ ! -e "../PF-build-env-$BUILD_ENV/PF-build-env-$BUILD_ENV-$TARGET_OS-$Processor.txt" ]; then
if [ ! -e "../PF-build-env-$BUILD_ENV/PF-build-env-$BUILD_ENV-$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor.txt" ]; then
echo "$(tput setaf 6)Unzipping Prusa Firmware build environment...$(tput setaf 2)"
sleep 2
unzip -o PF-build-env-$BUILD_ENV.zip -d ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor || exit 12
echo "# PF-build-env-$TARGET_OS-$Processor-$BUILD_ENV" >> ../PF-build-env-$BUILD_ENV/PF-build-env-$BUILD_ENV-$TARGET_OS-$Processor.txt
unzip -o PF-build-env-$BUILD_ENV.zip -d ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor || exit 12
echo "# PF-build-env-$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor-$BUILD_ENV" >> ../PF-build-env-$BUILD_ENV/PF-build-env-$BUILD_ENV-$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor.txt
echo "$(tput sgr0)"
fi
# Check if User updated Arduino IDE 1.8.5 boardsmanager and tools
if [ -d "../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/arduino/tools" ]; then
if [ -d "../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/packages/arduino/tools" ]; then
echo "$(tput setaf 6)Arduino IDE boards / tools have been manually updated...$"
echo "Please don't update the 'Arduino AVR boards' as this will prevent running this script (tput setaf 2)"
sleep 2
fi
if [ -d "../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/arduino/tools/avr-gcc/4.9.2-atmel3.5.4-arduino2" ]; then
if [ -d "../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/packages/arduino/tools/avr-gcc/4.9.2-atmel3.5.4-arduino2" ]; then
echo "$(tput setaf 6)PrusaReasearch compatible tools have been manually updated...$(tput setaf 2)"
sleep 2
echo "$(tput setaf 6)Copying Prusa Firmware build environment to manually updated boards / tools...$(tput setaf 2)"
sleep 2
cp -f ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/hardware/tools/avr/avr/lib/ldscripts/avr6.xn ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/arduino/tools/avr-gcc/4.9.2-atmel3.5.4-arduino2/avr/lib/ldscripts/avr6.xn
echo "# PF-build-env-portable-$TARGET_OS-$Processor-$BUILD_ENV" >> ../PF-build-env-$BUILD_ENV/PF-build-env-portable-$BUILD_ENV-$TARGET_OS-$Processor.txt
cp -f ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/hardware/tools/avr/avr/lib/ldscripts/avr6.xn ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/packages/arduino/tools/avr-gcc/4.9.2-atmel3.5.4-arduino2/avr/lib/ldscripts/avr6.xn
echo "# PF-build-env-portable-$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor-$BUILD_ENV" >> ../PF-build-env-$BUILD_ENV/PF-build-env-portable-$BUILD_ENV-$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor.txt
echo "$(tput sgr0)"
fi
if [ -d "../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor/portable/packages/arduino/tools/avr-gcc/5.4.0-atmel3.6.1-arduino2" ]; then
if [ -d "../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor/portable/packages/arduino/tools/avr-gcc/5.4.0-atmel3.6.1-arduino2" ]; then
echo "$(tput setaf 1)Arduino IDE tools have been updated manually to a non supported version!!!"
echo "Delete ../PF-build-env-$BUILD_ENV and start the script again"
echo "Script will not continue until this have been fixed $(tput setaf 2)"
@ -489,7 +494,7 @@ if [ ! -z "$3" ] ; then
fi
#Set BUILD_ENV_PATH
cd ../PF-build-env-$BUILD_ENV/$TARGET_OS-$Processor || exit 24
cd ../PF-build-env-$BUILD_ENV/$ARDUINO_ENV-$BOARD_VERSION-$TARGET_OS-$Processor || exit 24
BUILD_ENV_PATH="$( pwd -P )"
cd ../..
@ -634,8 +639,8 @@ do
echo "Start to build Prusa Firmware ..."
echo "Using variant $VARIANT$(tput setaf 3)"
sleep 2
#$BUILD_ENV_PATH/arduino-builder -dump-prefs -debug-level 10 -compile -hardware $ARDUINO/hardware -hardware $ARDUINO/portable/packages -tools $ARDUINO/tools-builder -tools $ARDUINO/hardware/tools/avr -tools $ARDUINO/portable/packages -built-in-libraries $ARDUINO/libraries -libraries $ARDUINO/portable/sketchbook/libraries -fqbn=$BOARD:avr:rambo -ide-version=10805 -build-path=$BUILD_PATH -warnings=all $SCRIPT_PATH/Firmware/Firmware.ino || exit 14
$BUILD_ENV_PATH/arduino-builder -compile -hardware $ARDUINO/hardware -hardware $ARDUINO/portable/packages -tools $ARDUINO/tools-builder -tools $ARDUINO/hardware/tools/avr -tools $ARDUINO/portable/packages -built-in-libraries $ARDUINO/libraries -libraries $ARDUINO/portable/sketchbook/libraries -fqbn=$BOARD:avr:rambo -ide-version=10805 -build-path=$BUILD_PATH -warnings=all $SCRIPT_PATH/Firmware/Firmware.ino || exit 14
#$BUILD_ENV_PATH/arduino-builder -dump-prefs -debug-level 10 -compile -hardware $ARDUINO/hardware -hardware $ARDUINO/portable/packages -tools $ARDUINO/tools-builder -tools $ARDUINO/hardware/tools/avr -tools $ARDUINO/portable/packages -built-in-libraries $ARDUINO/libraries -libraries $ARDUINO/portable/sketchbook/libraries -fqbn=$BOARD_PACKAGE_NAME:avr:$BOARD -build-path=$BUILD_PATH -warnings=all $SCRIPT_PATH/Firmware/Firmware.ino || exit 14
$BUILD_ENV_PATH/arduino-builder -compile -hardware $ARDUINO/hardware -hardware $ARDUINO/portable/packages -tools $ARDUINO/tools-builder -tools $ARDUINO/hardware/tools/avr -tools $ARDUINO/portable/packages -built-in-libraries $ARDUINO/libraries -libraries $ARDUINO/portable/sketchbook/libraries -fqbn=$BOARD_PACKAGE_NAME:avr:$BOARD -build-path=$BUILD_PATH -warnings=all $SCRIPT_PATH/Firmware/Firmware.ino || exit 14
echo "$(tput sgr 0)"
if [ $LANGUAGES == "ALL" ]; then

View File

@ -111,7 +111,9 @@ Now your Ubuntu subsystem is ready to use the automatic `PF-build.sh` script and
- Unix and windows have different line endings (LF vs CRLF), try dos2unix to convert
- This should fix the `"$'\r': command not found"` error
- to install run `apt-get install dos2unix`
- If your Windows isn't in English the Paths may look different
Example in other languages
- English `/mnt/c/Users/<your-username>/Downloads/Prusa-Firmware-MK3` will be on a German Windows`/mnt/c/Anwender/<your-username>/Downloads/Prusa-Firmware-MK3`
#### Compile Prusa-firmware with Ubuntu Linux subsystem installed
- open Ubuntu bash
- change to your source code folder (case sensitive)
@ -123,11 +125,14 @@ _notes: Script and instructions contributed by 3d-gussner. Use at your own risk.
- Download and install the 64bit Git version https://git-scm.com/download/win
- Also follow these instructions https://gist.github.com/evanwill/0207876c3243bbb6863e65ec5dc3f058
- Download and install 7z-zip from its official website https://www.7-zip.org/
By default, it is installed under the directory /c/Program Files/7-Zip in Windows 10
By default, it is installed under the directory /c/Program\ Files/7-Zip in Windows 10
- Run `Git-Bash` under Administrator privilege
- navigate to the directory /c/Program Files/Git/mingw64/bin
- run `ln -s /c/Program Files/7-Zip/7z.exe zip.exe`
- navigate to the directory /c/Program\ Files/Git/mingw64/bin
- run `ln -s /c/Program\ Files/7-Zip/7z.exe zip.exe`
- If your Windows isn't in English the Paths may look different
Example in other languages
- English `/mnt/c/Users/<your-username>/Downloads/Prusa-Firmware-MK3` will be on a German Windows`/mnt/c/Anwender/<your-username>/Downloads/Prusa-Firmware-MK3`
- English `ln -s /c/Program\ Files/7-Zip/7z.exe zip.exe` will be on a Spanish Windows `ln -s /c/Archivos\ de\ programa/7-Zip/7z.exe zip.exe`
#### Compile Prusa-firmware with Git-bash installed
- open Git-bash
- change to your source code folder
@ -173,6 +178,7 @@ Example:
# 4. Documentation
run [doxygen](http://www.doxygen.nl/) in Firmware folder
or visit https://prusa3d.github.io/Prusa-Firmware-Doc for doxygen generated output
# 5. FAQ
Q:I built firmware using Arduino and I see "?" instead of numbers in printer user interface.

View File

@ -198,7 +198,7 @@ void prusa_statistics(int _message, uint8_t _fil_nr) {
SERIAL_ECHOLN("}");
status_number = 15;
}
else if (isPrintPaused || card.paused)
else if (isPrintPaused)
{
SERIAL_ECHO("{");
prusa_stat_printerstatus(14);
@ -490,7 +490,7 @@ void prusa_statistics(int _message, uint8_t _fil_nr) {
{
prusa_statistics_case0(15);
}
else if (isPrintPaused || card.paused)
else if (isPrintPaused)
{
prusa_statistics_case0(14);
}
@ -753,7 +753,6 @@ TEST_CASE("Prusa_statistics test", "[prusa_stats]")
SERIALS_RESET();
isPrintPaused = 0;
card.paused = 0;
IS_SD_PRINTING = 1;
old_code::prusa_statistics(test_codes[i],0);
new_code::prusa_statistics(test_codes[i],0);

View File

@ -51,7 +51,7 @@ if ! [ -e lang_add.txt ]; then
fi
cat lang_add.txt | sed 's/^/"/;s/$/"/' | while read new_s; do
if grep "$new_s" lang_en.txt >/dev/nul; then
if grep "$new_s" lang_en.txt >/dev/null; then
echo "text already exist:"
echo "$new_s"
echo

View File

@ -4,7 +4,19 @@
# for importing translated xx.po
LNG=$1
if [ -z "$LNG" ]; then exit -1; fi
# if no arguments, 'all' is selected (all po and also pot will be generated)
if [ -z "$LNG" ]; then LNG=all; fi
# if 'all' is selected, script will generate all po files and also pot file
if [ "$LNG" = "all" ]; then
./lang-import.sh cz
./lang-import.sh de
./lang-import.sh es
./lang-import.sh fr
./lang-import.sh it
./lang-import.sh pl
exit 0
fi
# language code (iso639-1) is equal to LNG
LNGISO=$LNG
@ -28,43 +40,51 @@ sed -i 's/ \\n/ /g;s/\\n/ /g' $LNG'_filtered.po'
#replace in czech translation
if [ "$LNG" = "cz" ]; then
#replace 'ž' with 'z'
#replace 'ž' with 'z'
sed -i 's/\xc5\xbe/z/g' $LNG'_filtered.po'
#replace 'ì' with 'e'
#replace 'ì' with 'e'
sed -i 's/\xc4\x9b/e/g' $LNG'_filtered.po'
#replace 'í' with 'i'
#replace 'í' with 'i'
sed -i 's/\xc3\xad/i/g' $LNG'_filtered.po'
#replace 'ø' with 'r'
#replace 'ø' with 'r'
sed -i 's/\xc5\x99/r/g' $LNG'_filtered.po'
#replace 'è' with 'c'
#replace 'è' with 'c'
sed -i 's/\xc4\x8d/c/g' $LNG'_filtered.po'
#replace 'á' with 'a'
#replace 'á' with 'a'
sed -i 's/\xc3\xa1/a/g' $LNG'_filtered.po'
#replace 'é' with 'e'
#replace 'é' with 'e'
sed -i 's/\xc3\xa9/e/g' $LNG'_filtered.po'
fi
#replace in german translation
#replace in german translation https://en.wikipedia.org/wiki/German_orthography
if [ "$LNG" = "de" ]; then
#replace 'ä' with 'ae'
#replace 'ä' with 'ae'
sed -i 's/\xc3\xa4/ae/g' $LNG'_filtered.po'
#replace 'ü' with 'ue'
#replace 'Ä' with 'Ae'
sed -i 's/\xc3\x84/Ae/g' $LNG'_filtered.po'
#replace 'ü' with 'ue'
sed -i 's/\xc3\xbc/ue/g' $LNG'_filtered.po'
#replace 'ö' with 'oe'
#replace 'Ü' with 'Ue'
sed -i 's/\xc3\x9c/Ue/g' $LNG'_filtered.po'
#replace 'ö' with 'oe'
sed -i 's/\xc3\xb6/oe/g' $LNG'_filtered.po'
#replace 'Ö' with 'Oe'
sed -i 's/\xc3\x96/Oe/g' $LNG'_filtered.po'
#replace 'ß' with 'ss'
sed -i 's/\xc3\x9f/ss/g' $LNG'_filtered.po'
fi
#replace in spain translation
if [ "$LNG" = "es" ]; then
#replace 'á' with 'a'
#replace 'á' with 'a'
sed -i 's/\xc3\xa1/a/g' $LNG'_filtered.po'
#replace '?' with '?'
#replace '¿' with '?'
sed -i 's/\xc2\xbf/?/g' $LNG'_filtered.po'
#replace 'ó' with 'o'
#replace 'ó' with 'o'
sed -i 's/\xc3\xb3/o/g' $LNG'_filtered.po'
#replace 'é' with 'e'
#replace 'é' with 'e'
sed -i 's/\xc3\xa9/e/g' $LNG'_filtered.po'
#replace 'í' with 'i'
#replace 'í' with 'i'
sed -i 's/\xc3\xad/i/g' $LNG'_filtered.po'
#replace '!' with '!'
sed -i 's/\xc2\xa1/!/g' $LNG'_filtered.po'
@ -72,31 +92,39 @@ if [ "$LNG" = "es" ]; then
sed -i 's/\xc3\xb1/n/g' $LNG'_filtered.po'
fi
#replace in french translation
#replace in french translation https://en.wikipedia.org/wiki/French_orthography
if [ "$LNG" = "fr" ]; then
#replace 'é' with 'e'
sed -i 's/\xc3\xa9/e/g' $LNG'_filtered.po'
#replace 'É' with 'E'
sed -i 's/\xc3\x89/E/g' $LNG'_filtered.po'
#replace 'é' with 'e' (left)
sed -i 's/\xc3\xa8/e/g' $LNG'_filtered.po'
#replace 'á' with 'a' (left)
#replace 'á' with 'a' (right)
sed -i 's/\xc3\xa1/a/g' $LNG'_filtered.po'
#replace 'Á' with 'A' (right)
sed -i 's/\xc3\x81/A/g' $LNG'_filtered.po'
#replace 'à' with 'a' (left)
sed -i 's/\xc3\xa0/a/g' $LNG'_filtered.po'
#replace 'À' with 'A' (left)
sed -i 's/\xc3\x80/A/g' $LNG'_filtered.po'
#replace 'é' with 'e' (right)
sed -i 's/\xc3\xa9/e/g' $LNG'_filtered.po'
#replace 'É' with 'E' (right)
sed -i 's/\xc3\x89/E/g' $LNG'_filtered.po'
#replace 'è' with 'e' (left)
sed -i 's/\xc3\xa8/e/g' $LNG'_filtered.po'
#replace 'È' with 'E' (left)
sed -i 's/\xc3\x88/E/g' $LNG'_filtered.po'
fi
#replace in italian translation
if [ "$LNG" = "it" ]; then
#replace 'é' with 'e' (left)
#replace 'é' with 'e' (left)
sed -i 's/\xc3\xa8/e/g' $LNG'_filtered.po'
#replace 'á' with 'a' (left)
#replace 'á' with 'a' (left)
sed -i 's/\xc3\xa0/a/g' $LNG'_filtered.po'
#replace 'ó' with 'o' (left)
#replace 'ó' with 'o' (left)
sed -i 's/\xc3\xb2/o/g' $LNG'_filtered.po'
#replace 'ú' with 'u' (left)
#replace 'ú' with 'u' (left)
sed -i 's/\xc3\xb9/u/g' $LNG'_filtered.po'
#replace 'é' with 'e'
#replace 'é' with 'e'
sed -i 's/\xc3\xa9/e/g' $LNG'_filtered.po'
#replace 'É' with 'E' (left)
#replace 'É' with 'E' (left)
sed -i 's/\xc3\x88/E/g' $LNG'_filtered.po'
fi

View File

@ -1,3 +1,6 @@
#
"[%.7s]Live adj. Z\x0avalue set, continue\x0aor start from zero?\x0a%cContinue%cReset"
#MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 c=14
" of 4"
@ -34,14 +37,8 @@
#MSG_CONFIRM_CARRIAGE_AT_THE_TOP c=20 r=2
"Are left and right Z~carriages all up?"
#MSG_AUTO_DEPLETE_ON c=17 r=1
"SpoolJoin [on]"
#
"SpoolJoin [N/A]"
#MSG_AUTO_DEPLETE_OFF c=17 r=1
"SpoolJoin [off]"
#MSG_AUTO_DEPLETE c=17 r=1
"SpoolJoin"
#MSG_AUTO_HOME
"Auto home"
@ -127,14 +124,10 @@
#
"Copy selected language?"
#MSG_CRASHDETECT_ON
"Crash det. [on]"
#MSG_CRASHDETECT_NA
"Crash det. [N/A]"
#MSG_CRASHDETECT_OFF
"Crash det. [off]"
#MSG_CRASHDETECT
"Crash det."
#
"Choose a filament for the First Layer Calibration and select it in the on-screen menu."
#MSG_CRASH_DETECTED c=20 r=1
"Crash detected."
@ -166,9 +159,6 @@
#MSG_EJECT_FILAMENT c=17 r=1
"Eject filament"
#
"Eject"
#MSG_EJECTING_FILAMENT c=20 r=1
"Ejecting filament"
@ -202,14 +192,8 @@
#
"Fail stats MMU"
#MSG_FSENS_AUTOLOAD_ON c=17 r=1
"F. autoload [on]"
#MSG_FSENS_AUTOLOAD_NA c=17 r=1
"F. autoload [N/A]"
#MSG_FSENS_AUTOLOAD_OFF c=17 r=1
"F. autoload [off]"
#MSG_FSENSOR_AUTOLOAD
"F. autoload"
#
"Fail stats"
@ -220,20 +204,11 @@
#MSG_SELFTEST_FAN c=20
"Fan test"
#MSG_FANS_CHECK_ON c=17 r=1
"Fans check [on]"
#MSG_FANS_CHECK
"Fans check"
#MSG_FANS_CHECK_OFF c=17 r=1
"Fans check [off]"
#MSG_FSENSOR_ON
"Fil. sensor [on]"
#MSG_FSENSOR_NA
"Fil. sensor [N/A]"
#MSG_FSENSOR_OFF
"Fil. sensor [off]"
#MSG_FSENSOR
"Fil. sensor"
#
"Filam. runouts"
@ -346,33 +321,24 @@
#MSG_WIZARD_Z_CAL c=20 r=8
"I will run z calibration now."
#MSG_WIZARD_V2_CAL_2 c=20 r=12
"I will start to print line and you will gradually lower the nozzle by rotating the knob, until you reach optimal height. Check the pictures in our handbook in chapter Calibration."
#MSG_WATCH
"Info screen"
#
"Is filament 1 loaded?"
#MSG_INSERT_FILAMENT c=20
"Insert filament"
#MSG_WIZARD_FILAMENT_LOADED c=20 r=2
"Is filament loaded?"
#MSG_WIZARD_PLA_FILAMENT c=20 r=2
"Is it PLA filament?"
#MSG_PLA_FILAMENT_LOADED c=20 r=2
"Is PLA filament loaded?"
#MSG_STEEL_SHEET_CHECK c=20 r=2
"Is steel sheet on heatbed?"
#
"Last print failures"
#
"If you have additional steel sheets, calibrate their presets in Settings - HW Setup - Steel sheets."
#
"Last print"
@ -439,11 +405,14 @@
#MSG_MMU_OK_RESUMING c=20 r=4
"MMU OK. Resuming..."
#MSG_STEALTH_MODE_OFF
"Mode [Normal]"
#MSG_MODE
"Mode"
#MSG_SILENT_MODE_ON
"Mode [silent]"
#MSG_NORMAL
"Normal"
#MSG_SILENT
"Silent"
#
"MMU needs user attention."
@ -451,14 +420,14 @@
#
"MMU power fails"
#MSG_STEALTH_MODE_ON
"Mode [Stealth]"
#MSG_STEALTH
"Stealth"
#MSG_AUTO_MODE_ON
"Mode [auto power]"
#MSG_AUTO_POWER
"Auto power"
#MSG_SILENT_MODE_OFF
"Mode [high power]"
#MSG_HIGH_POWER
"High power"
#
"MMU2 connected"
@ -484,7 +453,7 @@
#MSG_NO_CARD
"No SD card"
#
#MSG_NA
"N/A"
#MSG_NO
@ -547,12 +516,6 @@
#MSG_WIZARD_CALIBRATION_FAILED c=20 r=8
"Please check our handbook and fix the problem. Then resume the Wizard by rebooting the printer."
#MSG_WIZARD_LOAD_FILAMENT c=20 r=8
"Please insert PLA filament to the extruder, then press knob to load it."
#MSG_PLEASE_LOAD_PLA c=20 r=4
"Please load PLA filament first."
#MSG_CHECK_IDLER c=20 r=4
"Please open idler and remove filament manually."
@ -562,9 +525,6 @@
#MSG_PRESS_TO_UNLOAD c=20 r=4
"Please press the knob to unload filament"
#
"Please insert PLA filament to the first tube of MMU, then press the knob to load it."
#MSG_PULL_OUT_FILAMENT c=20 r=4
"Please pull out filament immediately"
@ -634,6 +594,15 @@
#
"Print FAN"
#
"Please insert filament into the extruder, then press the knob to load it."
#
"Please insert filament into the first tube of the MMU, then press the knob to load it."
#
"Please load filament first."
#MSG_PRUSA3D
"prusa3d.com"
@ -664,20 +633,17 @@
#MSG_BED_CORRECTION_RIGHT c=14 r=1
"Right side[um]"
#MSG_SECOND_SERIAL_ON c=17 r=1
"RPi port [on]"
#MSG_SECOND_SERIAL_OFF c=17 r=1
"RPi port [off]"
#MSG_RPI_PORT
"RPi port"
#MSG_WIZARD_RERUN c=20 r=7
"Running Wizard will delete current calibration results and start from the beginning. Continue?"
#MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF c=19 r=1
"SD card [normal]"
#MSG_SD_CARD
"SD card"
#MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON c=19 r=1
"SD card [flshAir]"
#MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY
"FlashAir"
#
"Right"
@ -709,9 +675,6 @@
#
"Select nozzle preheat temperature which matches your material."
#
"Select PLA filament:"
#MSG_SET_TEMPERATURE c=19 r=1
"Set temperature:"
@ -727,38 +690,38 @@
#MSG_FILE_CNT c=20 r=4
"Some files will not be sorted. Max. No. of files in 1 folder for sorting is 100."
#MSG_SORT_NONE c=17 r=1
"Sort [none]"
#MSG_SORT
"Sort"
#MSG_SORT_TIME c=17 r=1
"Sort [time]"
#MSG_NONE
"None"
#MSG_SORT_TIME
"Time"
#
"Severe skew"
"Severe skew:"
#MSG_SORT_ALPHA c=17 r=1
"Sort [alphabet]"
#MSG_SORT_ALPHA
"Alphabet"
#MSG_SORTING c=20 r=1
"Sorting files"
#MSG_SOUND_LOUD c=17 r=1
"Sound [loud]"
#MSG_SOUND_LOUD
"Loud"
#
"Slight skew"
"Slight skew:"
#MSG_SOUND_MUTE c=17 r=1
"Sound [mute]"
#MSG_SOUND
"Sound"
#
"Some problem encountered, Z-leveling enforced ..."
#MSG_SOUND_ONCE c=17 r=1
"Sound [once]"
#MSG_SOUND_SILENT c=17 r=1
"Sound [silent]"
#MSG_SOUND_ONCE
"Once"
#MSG_SPEED
"Speed"
@ -784,14 +747,14 @@
#MSG_SELFTEST_SWAPPED
"Swapped"
#MSG_TEMP_CALIBRATION c=20 r=1
"Temp. cal. "
#
"Select filament:"
#MSG_TEMP_CALIBRATION_ON c=20 r=1
"Temp. cal. [on]"
#MSG_TEMP_CALIBRATION c=12 r=1
"Temp. cal."
#MSG_TEMP_CALIBRATION_OFF c=20 r=1
"Temp. cal. [off]"
#
"Select temperature which matches your material."
#MSG_CALIBRATION_PINDA_MENU c=17 r=1
"Temp. calibration"
@ -925,11 +888,17 @@
#
"Y distance from min"
#
"The printer will start printing a zig-zag line. Rotate the knob until you reach the optimal height. Check the pictures in the handbook (Calibration chapter)."
#
"Y-correct:"
#MSG_OFF
" [off]"
"Off"
#MSG_ON
"On"
#
"Back"
@ -943,14 +912,14 @@
#
"FINDA:"
#
"Firmware [none]"
#MSG_FIRMWARE
"Firmware"
#
"Firmware [strict]"
#MSG_STRICT
"Strict"
#
"Firmware [warn]"
#MSG_WARN
"Warn"
#
"HW Setup"
@ -958,20 +927,11 @@
#
"IR:"
#
"Magnets comp.[N/A]"
#MSG_MAGNETS_COMP
"Magnets comp."
#
"Magnets comp.[Off]"
#
"Magnets comp. [On]"
#
"Mesh [3x3]"
#
"Mesh [7x7]"
#MSG_MESH
"Mesh"
#
"Mesh bed leveling"
@ -979,41 +939,17 @@
#
"MK3S firmware detected on MK3 printer"
#
"MMU Mode [Normal]"
#
"MMU Mode[Stealth]"
#MSG_MMU_MODE
"MMU Mode"
#
"Mode change in progress ..."
#
"Model [none]"
#MSG_MODEL
"Model"
#
"Model [strict]"
#
"Model [warn]"
#
"Nozzle d. [0.25]"
#
"Nozzle d. [0.40]"
#
"Nozzle d. [0.60]"
#
"Nozzle [none]"
#
"Nozzle [strict]"
#
"Nozzle [warn]"
#MSG_NOZZLE_DIAMETER
"Nozzle d."
#
"G-code sliced for a different level. Continue?"
@ -1060,8 +996,8 @@
#
"Sheet"
#
"Sound [assist]"
#MSG_SOUND_BLIND
"Assist"
#
"Steel sheets"
@ -1069,8 +1005,5 @@
#
"Z-correct:"
#
"Z-probe nr. [1]"
#
"Z-probe nr. [3]"
#MSG_Z_PROBE_NR
"Z-probe nr."

View File

@ -1,3 +1,7 @@
#
"[%.7s]Live adj. Z\x0avalue set, continue\x0aor start from zero?\x0a%cContinue%cReset"
"[%.7s]Doladeni Z\x0auz nastaveno, pouzit\x0anebo reset od nuly?\x0a%cPokracovat%cReset"
#MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 c=14
" of 4"
" z 4"
@ -46,18 +50,10 @@
"Are left and right Z~carriages all up?"
"Dojely oba Z voziky k~hornimu dorazu?"
#MSG_AUTO_DEPLETE_ON c=17 r=1
"SpoolJoin [on]"
"SpoolJoin [zap]"
#
"SpoolJoin [N/A]"
#MSG_AUTO_DEPLETE c=17 r=1
"SpoolJoin"
"\x00"
#MSG_AUTO_DEPLETE_OFF c=17 r=1
"SpoolJoin [off]"
"SpoolJoin [vyp]"
#MSG_AUTO_HOME
"Auto home"
"\x00"
@ -68,7 +64,7 @@
#MSG_AUTOLOADING_ONLY_IF_FSENS_ON c=20 r=4
"Autoloading filament available only when filament sensor is turned on..."
"Automaticke zavadeni filamentu je dostupne pouze pri zapnutem filament senzoru..."
"Automaticke zavadeni filamentu je mozne pouze pri zapnutem filament senzoru..."
#MSG_AUTOLOADING_ENABLED c=20 r=4
"Autoloading filament is active, just press the knob and insert filament..."
@ -92,7 +88,7 @@
#MSG_BED_HEATING
"Bed Heating"
"Zahrivani bed"
"Zahrivani bedu"
#MSG_BED_CORRECTION_MENU
"Bed level correct"
@ -170,17 +166,13 @@
"Copy selected language?"
"Kopirovat vybrany jazyk?"
#MSG_CRASHDETECT_ON
"Crash det. [on]"
"Crash det. [zap]"
#MSG_CRASHDETECT_NA
"Crash det. [N/A]"
#MSG_CRASHDETECT
"Crash det."
"\x00"
#MSG_CRASHDETECT_OFF
"Crash det. [off]"
"Crash det. [vyp]"
#
"Zvolte filament pro kalibraci prvni vrstvy z nasledujiciho menu"
"Choose a filament for the First Layer Calibration and select it in the on-screen menu."
#MSG_CRASH_DETECTED c=20 r=1
"Crash detected."
@ -222,10 +214,6 @@
"Eject filament"
"Vysunout filament"
#
"Eject"
"Vysunout"
#MSG_EJECTING_FILAMENT c=20 r=1
"Ejecting filament"
"Vysouvam filament"
@ -270,17 +258,9 @@
"Fail stats MMU"
"Selhani MMU"
#MSG_FSENS_AUTOLOAD_ON c=17 r=1
"F. autoload [on]"
"F. autozav. [zap]"
#MSG_FSENS_AUTOLOAD_NA c=17 r=1
"F. autoload [N/A]"
"F. autozav. [N/A]"
#MSG_FSENS_AUTOLOAD_OFF c=17 r=1
"F. autoload [off]"
"F. autozav. [vyp]"
#MSG_FSENSOR_AUTOLOAD
"F. autoload"
"F. autozav."
#
"Fail stats"
@ -294,25 +274,13 @@
"Fan test"
"Test ventilatoru"
#MSG_FANS_CHECK_ON c=17 r=1
"Fans check [on]"
"Kontr. vent.[zap]"
#MSG_FANS_CHECK
"Fans check"
"Kontr. vent."
#MSG_FANS_CHECK_OFF c=17 r=1
"Fans check [off]"
"Kontr. vent.[vyp]"
#MSG_FSENSOR_ON
"Fil. sensor [on]"
"Fil. senzor [zap]"
#MSG_FSENSOR_NA
"Fil. sensor [N/A]"
"Fil. senzor [N/A]"
#MSG_FSENSOR_OFF
"Fil. sensor [off]"
"Fil. senzor [vyp]"
#MSG_FSENSOR
"Fil. sensor"
"Fil. senzor"
#
"Filam. runouts"
@ -462,18 +430,10 @@
"I will run z calibration now."
"Nyni provedu z kalibraci."
#MSG_WIZARD_V2_CAL_2 c=20 r=12
"I will start to print line and you will gradually lower the nozzle by rotating the knob, until you reach optimal height. Check the pictures in our handbook in chapter Calibration."
"Zacnu tisknout linku a Vy budete postupne snizovat trysku otacenim tlacitka dokud nedosahnete optimalni vysky. Prohlednete si obrazky v nasi prirucce v kapitole Kalibrace."
#MSG_WATCH
"Info screen"
"Informace"
#
"Is filament 1 loaded?"
"Je filament 1 zaveden?"
#MSG_INSERT_FILAMENT c=20
"Insert filament"
"Vlozte filament"
@ -482,14 +442,6 @@
"Is filament loaded?"
"Je filament zaveden?"
#MSG_WIZARD_PLA_FILAMENT c=20 r=2
"Is it PLA filament?"
"Je to PLA filament?"
#MSG_PLA_FILAMENT_LOADED c=20 r=2
"Is PLA filament loaded?"
"Je PLA filament zaveden?"
#MSG_STEEL_SHEET_CHECK c=20 r=2
"Is steel sheet on heatbed?"
"Je tiskovy plat na podlozce?"
@ -498,6 +450,10 @@
"Last print failures"
"Selhani posl. tisku"
#
"If you have additional steel sheets, calibrate their presets in Settings - HW Setup - Steel sheets."
"Mate-li vice tiskovych platu, kalibrujte je v menu Nastaveni - HW nastaveni - Tiskove platy"
#
"Last print"
"Posledni tisk"
@ -508,7 +464,7 @@
#
"Left"
"Vlevo:"
"Vlevo"
#MSG_BED_CORRECTION_LEFT c=14 r=1
"Left side [um]"
@ -586,13 +542,17 @@
"MMU OK. Resuming..."
"MMU OK. Pokracuji..."
#MSG_STEALTH_MODE_OFF
"Mode [Normal]"
"Mod [Normal]"
#MSG_MODE
"Mode"
"Mod"
#MSG_SILENT_MODE_ON
"Mode [silent]"
"Mod [tichy]"
#MSG_NORMAL
"Normal"
"\x00"
#MSG_SILENT
"Silent"
"Tichy"
#
"MMU needs user attention."
@ -602,17 +562,17 @@
"MMU power fails"
"MMU vypadky proudu"
#MSG_STEALTH_MODE_ON
"Mode [Stealth]"
"Mod [tichy]"
#MSG_STEALTH
"Stealth"
"Tichy"
#MSG_AUTO_MODE_ON
"Mode [auto power]"
"Mod [automaticky]"
#MSG_AUTO_POWER
"Auto power"
"Automaticky"
#MSG_SILENT_MODE_OFF
"Mode [high power]"
"Mod [vys. vykon]"
#MSG_HIGH_POWER
"High power"
"Vys. vykon"
#
"MMU2 connected"
@ -646,7 +606,7 @@
"No SD card"
"Zadna SD karta"
#
#MSG_NA
"N/A"
"\x00"
@ -688,7 +648,7 @@
#
"Nozzle FAN"
"Tryska V."
"Vent. trysky"
#MSG_PAUSE_PRINT
"Pause print"
@ -730,14 +690,6 @@
"Please check our handbook and fix the problem. Then resume the Wizard by rebooting the printer."
"Prosim nahlednete do prirucky 3D tiskare a opravte problem. Pote obnovte Pruvodce restartovanim tiskarny."
#MSG_WIZARD_LOAD_FILAMENT c=20 r=8
"Please insert PLA filament to the extruder, then press knob to load it."
"Prosim vlozte PLA filament do extruderu, pote stisknete tlacitko pro zavedeni filamentu."
#MSG_PLEASE_LOAD_PLA c=20 r=4
"Please load PLA filament first."
"Nejdrive prosim zavedte PLA filament."
#MSG_CHECK_IDLER c=20 r=4
"Please open idler and remove filament manually."
"Prosim otevrete idler a manualne odstrante filament."
@ -750,10 +702,6 @@
"Please press the knob to unload filament"
"Pro vysunuti filamentu stisknete prosim tlacitko"
#
"Please insert PLA filament to the first tube of MMU, then press the knob to load it."
"Prosim vlozte PLA filament do trubicky MMU, pote stisknete tlacitko pro zavedeni filamentu."
#MSG_PULL_OUT_FILAMENT c=20 r=4
"Please pull out filament immediately"
"Prosim vyjmete urychlene filament"
@ -820,7 +768,7 @@
#MSG_SELFTEST_PRINT_FAN_SPEED c=18
"Print fan:"
"Tiskovy v:"
"Tiskovy vent.:"
#MSG_CARD_MENU
"Print from SD"
@ -844,7 +792,19 @@
#
"Print FAN"
"Tiskovy v"
"Tiskovy vent."
#
"Please insert filament into the extruder, then press the knob to load it."
"Prosim vlozte filament do extruderu a stisknete tlacitko k jeho zavedeni"
#
"Please insert filament into the first tube of the MMU, then press the knob to load it."
"Prosim vlozte filament do prvni trubicky MMU a stisknete tlacitko k jeho zavedeni"
#
"Please load filament first."
"Prosim nejdriv zavedte filament"
#MSG_PRUSA3D
"prusa3d.com"
@ -886,25 +846,21 @@
"Right side[um]"
"Vpravo [um]"
#MSG_SECOND_SERIAL_ON c=17 r=1
"RPi port [on]"
"RPi port [zap]"
#MSG_SECOND_SERIAL_OFF c=17 r=1
"RPi port [off]"
"RPi port [vyp]"
#MSG_RPI_PORT
"RPi port"
"\x00"
#MSG_WIZARD_RERUN c=20 r=7
"Running Wizard will delete current calibration results and start from the beginning. Continue?"
"Spusteni Pruvodce vymaze ulozene vysledky vsech kalibraci a spusti kalibracni proces od zacatku. Pokracovat?"
#MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF c=19 r=1
"SD card [normal]"
#MSG_SD_CARD
"SD card"
"\x00"
#MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON c=19 r=1
"SD card [flshAir]"
"SD card [FlshAir]"
#MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY
"FlashAir"
"\x00"
#
"Right"
@ -946,10 +902,6 @@
"Select nozzle preheat temperature which matches your material."
"Vyberte teplotu predehrati trysky ktera odpovida vasemu materialu."
#
"Select PLA filament:"
"Vyberte PLA filament:"
#MSG_SET_TEMPERATURE c=19 r=1
"Set temperature:"
"Nastavte teplotu:"
@ -970,49 +922,49 @@
"Some files will not be sorted. Max. No. of files in 1 folder for sorting is 100."
"Nektere soubory nebudou setrideny. Maximalni pocet souboru ve slozce pro setrideni je 100."
#MSG_SORT_NONE c=17 r=1
"Sort [none]"
"Trideni [Zadne]"
#MSG_SORT
"Sort"
"Trideni"
#MSG_SORT_TIME c=17 r=1
"Sort [time]"
"Trideni [cas]"
#MSG_NONE
"None"
"Zadne"
#MSG_SORT_TIME
"Time"
"Cas"
#
"Severe skew"
"Tezke zkoseni"
"Severe skew:"
"Tezke zkoseni:"
#MSG_SORT_ALPHA c=17 r=1
"Sort [alphabet]"
"Trideni [Abeceda]"
#MSG_SORT_ALPHA
"Alphabet"
"Abeceda"
#MSG_SORTING c=20 r=1
"Sorting files"
"Trideni souboru"
#MSG_SOUND_LOUD c=17 r=1
"Sound [loud]"
"Zvuk [hlasity]"
#MSG_SOUND_LOUD
"Loud"
"Hlasity"
#
"Slight skew"
"Lehke zkoseni"
"Slight skew:"
"Lehke zkoseni:"
#MSG_SOUND_MUTE c=17 r=1
"Sound [mute]"
"Zvuk [vypnuto]"
#MSG_SOUND
"Sound"
"Zvuk"
#
"Some problem encountered, Z-leveling enforced ..."
"Vyskytl se problem, srovnavam osu Z ..."
#MSG_SOUND_ONCE c=17 r=1
"Sound [once]"
"Zvuk [jednou]"
#MSG_SOUND_SILENT c=17 r=1
"Sound [silent]"
"Zvuk [tichy]"
#MSG_SOUND_ONCE
"Once"
"Jednou"
#MSG_SPEED
"Speed"
@ -1046,17 +998,17 @@
"Swapped"
"Prohozene"
#MSG_TEMP_CALIBRATION c=20 r=1
"Temp. cal. "
"Tepl. kal. "
#
"Select filament:"
"Zvolte filament:"
#MSG_TEMP_CALIBRATION_ON c=20 r=1
"Temp. cal. [on]"
"Tepl. kal. [zap]"
#MSG_TEMP_CALIBRATION c=12 r=1
"Temp. cal."
"Tepl. kal."
#MSG_TEMP_CALIBRATION_OFF c=20 r=1
"Temp. cal. [off]"
"Tepl. kal. [vyp]"
#
"Select temperature which matches your material."
"Zvolte teplotu, ktera odpovida vasemu materialu."
#MSG_CALIBRATION_PINDA_MENU c=17 r=1
"Temp. calibration"
@ -1234,13 +1186,21 @@
"Y distance from min"
"Y vzdalenost od min"
#
"The printer will start printing a zig-zag line. Rotate the knob until you reach the optimal height. Check the pictures in the handbook (Calibration chapter)."
"Tiskarna zacne tisknout lomenou caru. Otacenim tlacitka nastavte optimalni vysku. Postupujte podle obrazku v handbooku (kapitola Kalibrace)."
#
"Y-correct:"
"Korekce Y:"
#MSG_OFF
" [off]"
" [vyp]"
"Off"
"Vyp"
#MSG_ON
"On"
"Zap"
#
"Back"
@ -1258,17 +1218,17 @@
"FINDA:"
"\x00"
#
"Firmware [none]"
"Firmware [Zadne]"
#MSG_FIRMWARE
"Firmware"
"\x00"
#
"Firmware [strict]"
"Firmware [Prisne]"
#MSG_STRICT
"Strict"
"Prisne"
#
"Firmware [warn]"
"Firmware[Varovat]"
#MSG_WARN
"Warn"
"Varovat"
#
"HW Setup"
@ -1278,25 +1238,13 @@
"IR:"
"\x00"
#
"Magnets comp.[N/A]"
"Komp. magnetu[N/A]"
#MSG_MAGNETS_COMP
"Magnets comp."
"Komp. magnetu"
#
"Magnets comp.[Off]"
"Komp. magnetu[Vyp]"
#
"Magnets comp. [On]"
"Komp. magnetu[Zap]"
#
"Mesh [3x3]"
"Mesh [3x3]"
#
"Mesh [7x7]"
"Mesh [7x7]"
#MSG_MESH
"Mesh"
"\x00"
#
"Mesh bed leveling"
@ -1306,53 +1254,21 @@
"MK3S firmware detected on MK3 printer"
"MK3S firmware detekovan na tiskarne MK3"
#
"MMU Mode [Normal]"
"MMU mod [Normal]"
#
"MMU Mode[Stealth]"
"MMU Mod [Tichy]"
#MSG_MMU_MODE
"MMU Mode"
"MMU mod"
#
"Mode change in progress ..."
"Probiha zmena modu..."
#
"Model [none]"
"Model [Zadne]"
#MSG_MODEL
"Model"
"\x00"
#
"Model [strict]"
"Model [Prisne]"
#
"Model [warn]"
"Model [Varovat]"
#
"Nozzle d. [0.25]"
"Tryska [0.25]"
#
"Nozzle d. [0.40]"
"Tryska [0.40]"
#
"Nozzle d. [0.60]"
"Tryska [0.60]"
#
"Nozzle [none]"
"Tryska [Zadne]"
#
"Nozzle [strict]"
"Tryska [Prisne]"
#
"Nozzle [warn]"
"Tryska [Varovat]"
#MSG_NOZZLE_DIAMETER
"Nozzle d."
"Tryska"
#
"G-code sliced for a different level. Continue?"
@ -1414,9 +1330,9 @@
"Sheet"
"Plat"
#
"Sound [assist]"
"Zvuk [Asist.]"
#MSG_SOUND_BLIND
"Assist"
"Asist."
#
"Steel sheets"
@ -1426,10 +1342,6 @@
"Z-correct:"
"Korekce Z:"
#
"Z-probe nr. [1]"
"Pocet mereni Z [1]"
#
"Z-probe nr. [3]"
"Pocet mereni Z [3]"
#MSG_Z_PROBE_NR
"Z-probe nr."
"Pocet mereni Z"

View File

@ -1,3 +1,7 @@
#
"[%.7s]Live adj. Z\x0avalue set, continue\x0aor start from zero?\x0a%cContinue%cReset"
"[%.7s]Z Einstell.\x0aWert gesetzt,weiter\x0aoder mit 0 beginnen?\x0a%cWeiter%cNeu beginnen"
#MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 c=14
" of 4"
" von 4"
@ -46,17 +50,9 @@
"Are left and right Z~carriages all up?"
"Sind linke+rechte Z- Schlitten ganz oben?"
#MSG_AUTO_DEPLETE_ON c=17 r=1
"SpoolJoin [on]"
"SpoolJoin [an]"
#
"SpoolJoin [N/A]"
"SpoolJoin [N/V]"
#MSG_AUTO_DEPLETE_OFF c=17 r=1
"SpoolJoin [off]"
"SpoolJoin [aus]"
#MSG_AUTO_DEPLETE c=17 r=1
"SpoolJoin"
"\x00"
#MSG_AUTO_HOME
"Auto home"
@ -64,11 +60,11 @@
#MSG_AUTOLOAD_FILAMENT c=17
"AutoLoad filament"
"Auto-Laden Filament"
"AutoLaden Filament"
#MSG_AUTOLOADING_ONLY_IF_FSENS_ON c=20 r=4
"Autoloading filament available only when filament sensor is turned on..."
"Automatisches Laden Filament nur bei einge schaltetem Filament- sensor verfuegbar..."
"Automatisches Laden Filament nur bei eingeschaltetem Fil. sensor verfuegbar..."
#MSG_AUTOLOADING_ENABLED c=20 r=4
"Autoloading filament is active, just press the knob and insert filament..."
@ -170,17 +166,13 @@
"Copy selected language?"
"Gewaehlte Sprache kopieren?"
#MSG_CRASHDETECT_ON
"Crash det. [on]"
"Crash Erk. [an]"
#MSG_CRASHDETECT
"Crash det."
"Crash Erk."
#MSG_CRASHDETECT_NA
"Crash det. [N/A]"
"Crash Erk. [nv]"
#MSG_CRASHDETECT_OFF
"Crash det. [off]"
"Crash Erk. [aus]"
#
"Choose a filament for the First Layer Calibration and select it in the on-screen menu."
"Waehlen Sie ein Filament fuer Erste Schichtkalibrierung aus und waehlen Sie es im On-Screen-Menu aus."
#MSG_CRASH_DETECTED c=20 r=1
"Crash detected."
@ -222,10 +214,6 @@
"Eject filament"
"Filamentauswurf"
#
"Eject"
"Auswurf"
#MSG_EJECTING_FILAMENT c=20 r=1
"Ejecting filament"
"werfe Filament aus"
@ -270,17 +258,9 @@
"Fail stats MMU"
"MMU-Fehler"
#MSG_FSENS_AUTOLOAD_ON c=17 r=1
"F. autoload [on]"
"F.Autoladen [an]"
#MSG_FSENS_AUTOLOAD_NA c=17 r=1
"F. autoload [N/A]"
"F. Autoload [nv]"
#MSG_FSENS_AUTOLOAD_OFF c=17 r=1
"F. autoload [off]"
"F. Autoload [aus]"
#MSG_FSENSOR_AUTOLOAD
"F. autoload"
"F. autoladen"
#
"Fail stats"
@ -294,25 +274,13 @@
"Fan test"
"Lueftertest"
#MSG_FANS_CHECK_ON c=17 r=1
"Fans check [on]"
"Luefter Chk. [an]"
#MSG_FANS_CHECK
"Fans check"
"Luefter Chk."
#MSG_FANS_CHECK_OFF c=17 r=1
"Fans check [off]"
"Luefter Chk.[aus]"
#MSG_FSENSOR_ON
"Fil. sensor [on]"
"Fil. Sensor [an]"
#MSG_FSENSOR_NA
"Fil. sensor [N/A]"
"Fil. Sensor [nv]"
#MSG_FSENSOR_OFF
"Fil. sensor [off]"
"Fil. Sensor [aus]"
#MSG_FSENSOR
"Fil. sensor"
"\x00"
#
"Filam. runouts"
@ -320,7 +288,7 @@
#MSG_FILAMENT_CLEAN c=20 r=2
"Filament extruding & with correct color?"
"Filament extrudiert + richtige Farbe?"
"Filament extrudiert mit richtiger Farbe?"
#MSG_NOT_LOADED c=19
"Filament not loaded"
@ -462,18 +430,10 @@
"I will run z calibration now."
"Ich werde jetzt die Z Kalibrierung durchfuehren."
#MSG_WIZARD_V2_CAL_2 c=20 r=12
"I will start to print line and you will gradually lower the nozzle by rotating the knob, until you reach optimal height. Check the pictures in our handbook in chapter Calibration."
"Ich werde jetzt eine Linie drucken. Waehrend des Druckes koennen Sie die Duese allmaehlich senken, indem Sie den Knopf drehen, bis Sie die optimale Hoehe erreichen. Sehen Sie sich die Bilder in unserem Handbuch im Kapitel Kalibrierung an."
#MSG_WATCH
"Info screen"
"Infoanzeige"
#
"Is filament 1 loaded?"
"Wurde Filament 1 geladen?"
#MSG_INSERT_FILAMENT c=20
"Insert filament"
"Filament einlegen"
@ -482,14 +442,6 @@
"Is filament loaded?"
"Ist das Filament geladen?"
#MSG_WIZARD_PLA_FILAMENT c=20 r=2
"Is it PLA filament?"
"Ist es wirklich PLA Filament?"
#MSG_PLA_FILAMENT_LOADED c=20 r=2
"Is PLA filament loaded?"
"Ist PLA Filament geladen?"
#MSG_STEEL_SHEET_CHECK c=20 r=2
"Is steel sheet on heatbed?"
"Liegt das Stahlblech auf dem Heizbett?"
@ -498,6 +450,10 @@
"Last print failures"
"Letzte Druckfehler"
#
"If you have additional steel sheets, calibrate their presets in Settings - HW Setup - Steel sheets."
"Wenn Sie zusaetzliche Stahlbleche haben, kalibrieren Sie deren Voreinstellungen unter Einstellungen - HW Setup - Stahlbleche."
#
"Last print"
"Letzter Druck"
@ -556,11 +512,11 @@
#MSG_MESH_BED_LEVELING
"Mesh Bed Leveling"
"Mesh Bett Ausgleich"
"MeshBett Ausgleich"
#MSG_MMU_OK_RESUMING_POSITION c=20 r=4
"MMU OK. Resuming position..."
"MMU OK. Position wiederherstellen... "
"MMU OK. Position wiederherstellen..."
#MSG_MMU_OK_RESUMING_TEMPERATURE c=20 r=4
"MMU OK. Resuming temperature..."
@ -586,13 +542,17 @@
"MMU OK. Resuming..."
"MMU OK. Weiterdrucken..."
#MSG_STEALTH_MODE_OFF
"Mode [Normal]"
"Modus [Normal]"
#MSG_MODE
"Mode"
"Modus"
#MSG_SILENT_MODE_ON
"Mode [silent]"
"Modus [leise]"
#MSG_NORMAL
"Normal"
"\x00"
#MSG_SILENT
"Silent"
"Leise"
#
"MMU needs user attention."
@ -602,17 +562,17 @@
"MMU power fails"
"MMU Netzfehler"
#MSG_STEALTH_MODE_ON
"Mode [Stealth]"
"Modus [Stealth]"
#MSG_STEALTH
"Stealth"
"\x00"
#MSG_AUTO_MODE_ON
"Mode [auto power]"
"Modus[Auto Power]"
#MSG_AUTO_POWER
"Auto power"
"\x00"
#MSG_SILENT_MODE_OFF
"Mode [high power]"
"Modus[Hohe Leist]"
#MSG_HIGH_POWER
"High power"
"Hohe leist"
#
"MMU2 connected"
@ -646,9 +606,9 @@
"No SD card"
"Keine SD Karte"
#
#MSG_NA
"N/A"
"N.V."
"N/V"
#MSG_NO
"No"
@ -730,14 +690,6 @@
"Please check our handbook and fix the problem. Then resume the Wizard by rebooting the printer."
"Bitte lesen Sie unser Handbuch und beheben Sie das Problem. Fahren Sie dann mit dem Assistenten fort, indem Sie den Drucker neu starten."
#MSG_WIZARD_LOAD_FILAMENT c=20 r=8
"Please insert PLA filament to the extruder, then press knob to load it."
"Legen Sie bitte PLA Filament in den Extruder und druecken Sie den Knopf, um es zu laden."
#MSG_PLEASE_LOAD_PLA c=20 r=4
"Please load PLA filament first."
"Bitte laden Sie zuerst PLA Filament."
#MSG_CHECK_IDLER c=20 r=4
"Please open idler and remove filament manually."
"Bitte Spannrolle oeffnen und Fila- ment von Hand entfernen"
@ -750,10 +702,6 @@
"Please press the knob to unload filament"
"Bitte druecken Sie den Knopf um das Filament zu entladen."
#
"Please insert PLA filament to the first tube of MMU, then press the knob to load it."
"Legen Sie bitte PLA Filament in den ersten Schlauch der MMU und druecken Sie den Knopf, um es zu laden."
#MSG_PULL_OUT_FILAMENT c=20 r=4
"Please pull out filament immediately"
"Bitte ziehen Sie das Filament sofort heraus"
@ -828,7 +776,7 @@
#
"Press the knob"
"Knopf druecken"
"Knopf druecken zum"
#MSG_PRINT_PAUSED c=20 r=1
"Print paused"
@ -844,7 +792,19 @@
#
"Print FAN"
"Druckvent"
"Druckvent."
#
"Please insert filament into the extruder, then press the knob to load it."
"Bitte legen Sie das Filament in den Extruder ein und druecken Sie dann den Knopf, um es zu laden."
#
"Please insert filament into the first tube of the MMU, then press the knob to load it."
"Bitte stecken Sie das Filament in den ersten Schlauch der MMU und druecken Sie dann den Knopf, um es zu laden."
#
"Please load filament first."
"Bitte laden Sie zuerst das Filament."
#MSG_PRUSA3D
"prusa3d.com"
@ -868,7 +828,7 @@
#MSG_CALIBRATE_BED_RESET
"Reset XYZ calibr."
"XYZ Kalibr. zuruecksetzen."
"Reset XYZ Kalibr."
#MSG_BED_CORRECTION_RESET
"Reset"
@ -884,27 +844,23 @@
#MSG_BED_CORRECTION_RIGHT c=14 r=1
"Right side[um]"
"Rechts [um]"
"Rechts [um]"
#MSG_SECOND_SERIAL_ON c=17 r=1
"RPi port [on]"
"RPi Port [an]"
#MSG_SECOND_SERIAL_OFF c=17 r=1
"RPi port [off]"
"RPi Port [aus]"
#MSG_RPI_PORT
"RPi port"
"\x00"
#MSG_WIZARD_RERUN c=20 r=7
"Running Wizard will delete current calibration results and start from the beginning. Continue?"
"Der Assistent wird die aktuellen Kalibrierungsdaten loeschen und von vorne beginnen. Weiterfahren?"
#MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF c=19 r=1
"SD card [normal]"
"SD Karte [normal]"
#MSG_SD_CARD
"SD card"
"SD Karte"
#MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON c=19 r=1
"SD card [flshAir]"
"SD Karte[flshAir]"
#MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY
"FlashAir"
"\x00"
#
"Right"
@ -936,7 +892,7 @@
#MSG_SELFTEST_FAILED c=20
"Selftest failed "
"Selbsttest misslang "
"Selbsttest Error "
#MSG_FORCE_SELFTEST c=20 r=8
"Selftest will be run to calibrate accurate sensorless rehoming."
@ -946,10 +902,6 @@
"Select nozzle preheat temperature which matches your material."
"Bitte Vorheiztemperatur auswaehlen, die Ihrem Material entspricht."
#
"Select PLA filament:"
"PLA Filament auswaehlen:"
#MSG_SET_TEMPERATURE c=19 r=1
"Set temperature:"
"Temp. einstellen:"
@ -970,49 +922,49 @@
"Some files will not be sorted. Max. No. of files in 1 folder for sorting is 100."
"Einige Dateien wur- den nicht sortiert. Max. Dateien pro Verzeichnis = 100."
#MSG_SORT_NONE c=17 r=1
"Sort [none]"
"Sort. [ohne]"
#MSG_SORT
"Sort"
"Sort."
#MSG_SORT_TIME c=17 r=1
"Sort [time]"
"Sort. [Zeit]"
#MSG_NONE
"None"
"Ohne"
#MSG_SORT_TIME
"Time"
"Zeit"
#
"Severe skew"
"Schwer.Schr"
"Severe skew:"
"Schwer.Schr:"
#MSG_SORT_ALPHA c=17 r=1
"Sort [alphabet]"
"Sort. [Alphabet]"
#MSG_SORT_ALPHA
"Alphabet"
"\x00"
#MSG_SORTING c=20 r=1
"Sorting files"
"Sortiere Dateien"
#MSG_SOUND_LOUD c=17 r=1
"Sound [loud]"
"Sound [laut]"
#MSG_SOUND_LOUD
"Loud"
"Laut"
#
"Slight skew"
"Leicht.Schr"
"Slight skew:"
"Leicht.Schr:"
#MSG_SOUND_MUTE c=17 r=1
"Sound [mute]"
"Sound [stumm]"
#MSG_SOUND
"Sound"
"\x00"
#
"Some problem encountered, Z-leveling enforced ..."
"Fehler aufgetreten, Z-Kalibrierung erforderlich..."
#MSG_SOUND_ONCE c=17 r=1
"Sound [once]"
"Sound [einmal]"
#MSG_SOUND_SILENT c=17 r=1
"Sound [silent]"
"Sound [leise]"
#MSG_SOUND_ONCE
"Once"
"Einmal"
#MSG_SPEED
"Speed"
@ -1046,17 +998,17 @@
"Swapped"
"Ausgetauscht"
#MSG_TEMP_CALIBRATION c=20 r=1
"Temp. cal. "
"Temp Kalib. "
#
"Select filament:"
"Filament auswaehlen:"
#MSG_TEMP_CALIBRATION_ON c=20 r=1
"Temp. cal. [on]"
"Temp. Kal. [an]"
#MSG_TEMP_CALIBRATION c=12 r=1
"Temp. cal."
"Temp Kalib."
#MSG_TEMP_CALIBRATION_OFF c=20 r=1
"Temp. cal. [off]"
"Temp. Kal. [aus]"
#
"Select temperature which matches your material."
"Waehlen Sie die Temperatur, die zu Ihrem Material passt."
#MSG_CALIBRATION_PINDA_MENU c=17 r=1
"Temp. calibration"
@ -1104,11 +1056,11 @@
#
"to load filament"
"zum Filament laden"
"Filament laden"
#
"to unload filament"
"zum Filament entladen"
"Filament entladen"
#MSG_UNLOAD_FILAMENT c=17
"Unload filament"
@ -1230,18 +1182,25 @@
"XYZ calibration failed. Right front calibration point not reachable."
"XYZ-Kalibrierung fehlgeschlagen. Rechter vorderer Kalibrierpunkt ist nicht erreichbar."
#
"Y distance from min"
"Y Entfernung vom Min"
#
"The printer will start printing a zig-zag line. Rotate the knob until you reach the optimal height. Check the pictures in the handbook (Calibration chapter)."
"Der Drucker beginnt mit dem Drucken einer Zickzacklinie. Drehen Sie den Knopf, bis Sie die optimale Hoehe erreicht haben. Ueberpruefen Sie die Bilder im Handbuch (Kapitel Kalibrierung)."
#
"Y-correct:"
"Y-Korrektur:"
#MSG_OFF
" [off]"
" [aus]"
"Off"
"Aus"
#MSG_ON
"On"
"An"
#
"Back"
@ -1249,7 +1208,7 @@
#
"Checks"
"\x00"
"Kontrolle"
#
"False triggering"
@ -1259,18 +1218,18 @@
"FINDA:"
"\x00"
#
"Firmware [none]"
"Firmware [ohne]"
#
"Firmware [strict]"
"Firmware [streng]"
#
"Firmware [warn]"
#MSG_FIRMWARE
"Firmware"
"\x00"
#MSG_STRICT
"Strict"
"Strikt"
#MSG_WARN
"Warn"
"Warnen"
#
"HW Setup"
"HW Einstellungen"
@ -1279,81 +1238,37 @@
"IR:"
"\x00"
#
"Magnets comp.[N/A]"
"Magnet Komp. [nv]"
#MSG_MAGNETS_COMP
"Magnets comp."
"Magnet Komp."
#
"Magnets comp.[Off]"
"Magnet Komp. [Aus]"
#
"Magnets comp. [On]"
"Magnet Komp. [An]"
#
"Mesh [3x3]"
"\x00"
#
"Mesh [7x7]"
"\x00"
#MSG_MESH
"Mesh"
"Gitter"
#
"Mesh bed leveling"
"Mesh Bett Ausgleich"
"MeshBett Ausgleich"
#
"MK3S firmware detected on MK3 printer"
"MK3S-Firmware auf MK3-Drucker erkannt"
#
"MMU Mode [Normal]"
"MMU Modus[Normal]"
#
"MMU Mode[Stealth]"
"MMU Mod.[Stealth]"
#MSG_MMU_MODE
"MMU Mode"
"MMU Modus"
#
"Mode change in progress ..."
"Moduswechsel erfolgt..."
#
"Model [none]"
"Modell [ohne]"
#MSG_MODEL
"Model"
"Modell"
#
"Model [strict]"
"Modell [streng]"
#
"Model [warn]"
"Modell [warn]"
#
"Nozzle d. [0.25]"
"Duese D. [0.25]"
#
"Nozzle d. [0.40]"
"Duese D. [0.40]"
#
"Nozzle d. [0.60]"
"Duese D. [0.60]"
#
"Nozzle [none]"
"Duese [ohne]"
#
"Nozzle [strict]"
"Duese [streng]"
#
"Nozzle [warn]"
"Duese [warn]"
#MSG_NOZZLE_DIAMETER
"Nozzle d."
"Duese D."
#
"G-code sliced for a different level. Continue?"
@ -1415,9 +1330,9 @@
"Sheet"
"Blech"
#
"Sound [assist]"
"Sound [Assist]"
#MSG_SOUND_BLIND
"Assist"
"\x00"
#
"Steel sheets"
@ -1427,10 +1342,6 @@
"Z-correct:"
"Z-Korrektur:"
#
"Z-probe nr. [1]"
"Z-Probe Nr. [1]"
#
"Z-probe nr. [3]"
"Z-Probe Nr. [3]"
#MSG_Z_PROBE_NR
"Z-probe nr."
"\x00"

View File

@ -1,3 +1,7 @@
#
"[%.7s]Live adj. Z\x0avalue set, continue\x0aor start from zero?\x0a%cContinue%cReset"
"[%.7s]Ajuste Z\x0aAjustado, continuar\x0ao empezar de nuevo?\x0a%cContinuar%cRepetir"
#MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 c=14
" of 4"
" de 4"
@ -24,7 +28,7 @@
#MSG_BABYSTEPPING_Z c=15
"Adjusting Z:"
"Ajustando Z:"
"Ajustar-Z:"
#MSG_SELFTEST_CHECK_ALLCORRECT c=20
"All correct "
@ -46,16 +50,8 @@
"Are left and right Z~carriages all up?"
"Carros Z izq./der. estan arriba maximo?"
#MSG_AUTO_DEPLETE_ON c=17 r=1
"SpoolJoin [on]"
"\x00"
#
"SpoolJoin [N/A]"
"\x00"
#MSG_AUTO_DEPLETE_OFF c=17 r=1
"SpoolJoin [off]"
#MSG_AUTO_DEPLETE c=17 r=1
"SpoolJoin"
"\x00"
#MSG_AUTO_HOME
@ -68,11 +64,11 @@
#MSG_AUTOLOADING_ONLY_IF_FSENS_ON c=20 r=4
"Autoloading filament available only when filament sensor is turned on..."
"La carga automatica de filamento solo funciona si el sensor de filamento esta activado..."
"La carga automatica solo funciona si el sensor de filamento esta activado..."
#MSG_AUTOLOADING_ENABLED c=20 r=4
"Autoloading filament is active, just press the knob and insert filament..."
"La carga automatica de filamento esta activada, pulse el dial e inserte el filamento..."
"La carga automatica esta activada, pulse el dial e inserte el filamento..."
#MSG_SELFTEST_AXIS_LENGTH
"Axis length"
@ -170,17 +166,13 @@
"Copy selected language?"
"Copiar idioma seleccionado?"
#MSG_CRASHDETECT_ON
"Crash det. [on]"
"Det. choque [act]"
#MSG_CRASHDETECT
"Crash det."
"Det. choque"
#MSG_CRASHDETECT_NA
"Crash det. [N/A]"
"Dec. choque [N/D]"
#MSG_CRASHDETECT_OFF
"Crash det. [off]"
"Det. choque [ina]"
#
"Choose a filament for the First Layer Calibration and select it in the on-screen menu."
"Escoge un filamento para la Calibracion de la Primera Capa y seleccionalo en el menu en pantalla."
#MSG_CRASH_DETECTED c=20 r=1
"Crash detected."
@ -216,16 +208,12 @@
#MSG_EXTRUDER_CORRECTION c=10
"E-correct:"
"Correccion-E:"
"Corregir-E:"
#MSG_EJECT_FILAMENT c=17 r=1
"Eject filament"
"Expulsar filamento"
#
"Eject"
"Expulsar"
#MSG_EJECTING_FILAMENT c=20 r=1
"Ejecting filament"
"Expulsando filamento"
@ -270,17 +258,9 @@
"Fail stats MMU"
"Estadistica de fallos MMU"
#MSG_FSENS_AUTOLOAD_ON c=17 r=1
"F. autoload [on]"
"Autocarg.Fil[act]"
#MSG_FSENS_AUTOLOAD_NA c=17 r=1
"F. autoload [N/A]"
"Autocarg.Fil[N/D]"
#MSG_FSENS_AUTOLOAD_OFF c=17 r=1
"F. autoload [off]"
"Autocarg.Fil[ina]"
#MSG_FSENSOR_AUTOLOAD
"F. autoload"
"Autocarg.fil."
#
"Fail stats"
@ -294,25 +274,13 @@
"Fan test"
"Test ventiladores"
#MSG_FANS_CHECK_ON c=17 r=1
"Fans check [on]"
"Comprob.vent[act]"
#MSG_FANS_CHECK
"Fans check"
"Comprob.vent"
#MSG_FANS_CHECK_OFF c=17 r=1
"Fans check [off]"
"Comprob.vent[ina]"
#MSG_FSENSOR_ON
"Fil. sensor [on]"
"Sensor Fil. [act]"
#MSG_FSENSOR_NA
"Fil. sensor [N/A]"
"Sensor Fil. [N/D]"
#MSG_FSENSOR_OFF
"Fil. sensor [off]"
"Sensor Fil. [ina]"
#MSG_FSENSOR
"Fil. sensor"
"Sensor Fil."
#
"Filam. runouts"
@ -462,18 +430,10 @@
"I will run z calibration now."
"Voy a hacer Calibracion Z ahora."
#MSG_WIZARD_V2_CAL_2 c=20 r=12
"I will start to print line and you will gradually lower the nozzle by rotating the knob, until you reach optimal height. Check the pictures in our handbook in chapter Calibration."
"Voy a comenzar a imprimir la linea y tu bajaras el nozzle gradualmente al rotar el dial, hasta que llegues a la altura optima. Mira las imagenes del capitulo Calibracion en el manual."
#MSG_WATCH
"Info screen"
"Monitorizar"
#
"Is filament 1 loaded?"
"?Esta cargado el filamento 1?"
#MSG_INSERT_FILAMENT c=20
"Insert filament"
"Introducir filamento"
@ -482,14 +442,6 @@
"Is filament loaded?"
"Esta el filamento cargado?"
#MSG_WIZARD_PLA_FILAMENT c=20 r=2
"Is it PLA filament?"
"Es el filamento PLA?"
#MSG_PLA_FILAMENT_LOADED c=20 r=2
"Is PLA filament loaded?"
"Esta el filamento PLA cargado?"
#MSG_STEEL_SHEET_CHECK c=20 r=2
"Is steel sheet on heatbed?"
"?Esta colocada la lamina de acero sobre la base?"
@ -498,6 +450,10 @@
"Last print failures"
"Ultimas impresiones fallidas"
#
"If you have additional steel sheets, calibrate their presets in Settings - HW Setup - Steel sheets."
"Si tienes planchas de acero adicionales, calibra sus ajustes en Ajustes - Ajustes HW - Planchas acero."
#
"Last print"
"Ultima impresion"
@ -586,13 +542,17 @@
"MMU OK. Resuming..."
"MMU OK. Resumiendo..."
#MSG_STEALTH_MODE_OFF
"Mode [Normal]"
"Modo [Normal]"
#MSG_MODE
"Mode"
"Modo"
#MSG_SILENT_MODE_ON
"Mode [silent]"
"Modo [silencio]"
#MSG_NORMAL
"Normal"
"\x00"
#MSG_SILENT
"Silent"
"Silencio"
#
"MMU needs user attention."
@ -602,17 +562,17 @@
"MMU power fails"
"Fallo de energia en MMU"
#MSG_STEALTH_MODE_ON
"Mode [Stealth]"
"Modo [Silencio]"
#MSG_STEALTH
"Stealth"
"Silencio"
#MSG_AUTO_MODE_ON
"Mode [auto power]"
"Modo[fuerza auto]"
#MSG_AUTO_POWER
"Auto power"
"Fuerza auto"
#MSG_SILENT_MODE_OFF
"Mode [high power]"
"Modo [rend.pleno]"
#MSG_HIGH_POWER
"High power"
"Rend.pleno"
#
"MMU2 connected"
@ -646,7 +606,7 @@
"No SD card"
"No hay tarjeta SD"
#
#MSG_NA
"N/A"
"N/A"
@ -730,14 +690,6 @@
"Please check our handbook and fix the problem. Then resume the Wizard by rebooting the printer."
"Lee el manual y resuelve el problema. Despues, reinicia la impresora y continua con el Wizard"
#MSG_WIZARD_LOAD_FILAMENT c=20 r=8
"Please insert PLA filament to the extruder, then press knob to load it."
"Inserta, por favor, filamento PLA en el extrusor. Despues haz clic para cargarlo."
#MSG_PLEASE_LOAD_PLA c=20 r=4
"Please load PLA filament first."
"Carga el filamento PLA primero por favor."
#MSG_CHECK_IDLER c=20 r=4
"Please open idler and remove filament manually."
"Por favor abate el rodillo de empuje (idler) y retira el filamento manualmente."
@ -750,10 +702,6 @@
"Please press the knob to unload filament"
"Por favor, pulsa el dial para descargar el filamento"
#
"Please insert PLA filament to the first tube of MMU, then press the knob to load it."
"Por favor introduce el filamento al primer tubo MMU, despues presiona el dial para imprimirlo."
#MSG_PULL_OUT_FILAMENT c=20 r=4
"Please pull out filament immediately"
"Por favor retire el filamento de inmediato"
@ -844,7 +792,19 @@
#
"Print FAN"
"Vent.extr"
"Vent. extr"
#
"Please insert filament into the extruder, then press the knob to load it."
"Por favor, coloca el filamento en el extrusor, luego presiona el dial para cargarlo."
#
"Please insert filament into the first tube of the MMU, then press the knob to load it."
"Por favor, coloca el filamento en el primer tubo de la MMU, luego pulsa el dial para cargarlo."
#
"Please load filament first."
"Por favor, cargar primero el filamento. "
#MSG_PRUSA3D
"prusa3d.com"
@ -886,25 +846,21 @@
"Right side[um]"
"Derecha [um]"
#MSG_SECOND_SERIAL_ON c=17 r=1
"RPi port [on]"
"Puerto RPi [act]"
#MSG_SECOND_SERIAL_OFF c=17 r=1
"RPi port [off]"
"Puerto RPi [ina]"
#MSG_RPI_PORT
"RPi port"
"Puerto RPi"
#MSG_WIZARD_RERUN c=20 r=7
"Running Wizard will delete current calibration results and start from the beginning. Continue?"
"Ejecutar el Wizard borrara los valores de calibracion actuales y comenzara de nuevo. Continuar?"
#MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF c=19 r=1
"SD card [normal]"
"Tarj. SD [normal]"
#MSG_SD_CARD
"SD card"
"Tarj. SD"
#MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON c=19 r=1
"SD card [flshAir]"
"Tarj. SD[FlshAir]"
#MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY
"FlashAir"
"\x00"
#
"Right"
@ -946,10 +902,6 @@
"Select nozzle preheat temperature which matches your material."
"Selecciona la temperatura para precalentar la boquilla que se ajuste a tu material. "
#
"Select PLA filament:"
"Seleccionar filamento PLA:"
#MSG_SET_TEMPERATURE c=19 r=1
"Set temperature:"
"Establecer temp.:"
@ -970,49 +922,49 @@
"Some files will not be sorted. Max. No. of files in 1 folder for sorting is 100."
"Algunos archivos no se ordenaran. Maximo 100 archivos por carpeta para ordenar. "
#MSG_SORT_NONE c=17 r=1
"Sort [none]"
"Ordenar [ninguno]"
#MSG_SORT
"Sort"
"Ordenar"
#MSG_SORT_TIME c=17 r=1
"Sort [time]"
"Ordenar [tiempo]"
#MSG_NONE
"None"
"Ninguno"
#MSG_SORT_TIME
"Time"
"Fecha"
#
"Severe skew"
"Incl.severa"
"Severe skew:"
"Incl.severa:"
#MSG_SORT_ALPHA c=17 r=1
"Sort [alphabet]"
"Ordenar [alfabet]"
#MSG_SORT_ALPHA
"Alphabet"
"Alfabet"
#MSG_SORTING c=20 r=1
"Sorting files"
"Ordenando archivos"
#MSG_SOUND_LOUD c=17 r=1
"Sound [loud]"
"Sonido [alto]"
#MSG_SOUND_LOUD
"Loud"
"Alto"
#
"Slight skew"
"Liger.incl."
"Slight skew:"
"Liger.incl.:"
#MSG_SOUND_MUTE c=17 r=1
"Sound [mute]"
"Sonido[silenciad]"
#MSG_SOUND
"Sound"
"Sonido"
#
"Some problem encountered, Z-leveling enforced ..."
"Problema encontrado, nivelacion Z forzosa ..."
#MSG_SOUND_ONCE c=17 r=1
"Sound [once]"
"Sonido [una vez]"
#MSG_SOUND_SILENT c=17 r=1
"Sound [silent]"
"Sonido[silencios]"
#MSG_SOUND_ONCE
"Once"
"Una vez"
#MSG_SPEED
"Speed"
@ -1046,17 +998,17 @@
"Swapped"
"Intercambiado"
#MSG_TEMP_CALIBRATION c=20 r=1
"Temp. cal. "
"Cal. temp. "
#
"Select filament:"
"Selecciona filamento:"
#MSG_TEMP_CALIBRATION_ON c=20 r=1
"Temp. cal. [on]"
"Cal. temp. [on]"
#MSG_TEMP_CALIBRATION c=12 r=1
"Temp. cal."
"Cal. temp."
#MSG_TEMP_CALIBRATION_OFF c=20 r=1
"Temp. cal. [off]"
"Cal. temp. [off]"
#
"Select temperature which matches your material."
"Selecciona la temperatura adecuada a tu material."
#MSG_CALIBRATION_PINDA_MENU c=17 r=1
"Temp. calibration"
@ -1084,11 +1036,11 @@
#
"Total filament"
"Filamento total:"
"Filamento total"
#
"Total print time"
"Tiempo total :"
"Tiempo total"
#MSG_TUNE
"Tune"
@ -1200,7 +1152,7 @@
#
"X-correct:"
"Correccion-X:"
"Corregir-X:"
#MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
"XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"
@ -1234,13 +1186,21 @@
"Y distance from min"
"Distancia en Y desde el min"
#
"The printer will start printing a zig-zag line. Rotate the knob until you reach the optimal height. Check the pictures in the handbook (Calibration chapter)."
"La impresora comenzara a imprimir una linea en zig-zag. Gira el dial hasta que la linea alcance la altura optima. Mira las fotos del manual (Capitulo de calibracion)."
#
"Y-correct:"
"Correccion-Y:"
"Corregir-Y:"
#MSG_OFF
" [off]"
" [apagado]"
"Off"
"Ina"
#MSG_ON
"On"
"Act"
#
"Back"
@ -1258,17 +1218,17 @@
"FINDA:"
"FINDA:"
#
"Firmware [none]"
"Firmware[ninguno]"
#MSG_FIRMWARE
"Firmware"
"\x00"
#
"Firmware [strict]"
"Firmware[estrict]"
#MSG_STRICT
"Strict"
"Estrict"
#
"Firmware [warn]"
"Firmware [aviso]"
#MSG_WARN
"Warn"
"Aviso"
#
"HW Setup"
@ -1278,25 +1238,13 @@
"IR:"
"\x00"
#
"Magnets comp.[N/A]"
"Comp. imanes [N/A]"
#MSG_MAGNETS_COMP
"Magnets comp."
"Comp. imanes"
#
"Magnets comp.[Off]"
"Comp. imanes [Off]"
#
"Magnets comp. [On]"
"Comp. imanes [On]"
#
"Mesh [3x3]"
"Malla [3x3]"
#
"Mesh [7x7]"
"Malla [7x7]"
#MSG_MESH
"Mesh"
"Malla"
#
"Mesh bed leveling"
@ -1306,53 +1254,21 @@
"MK3S firmware detected on MK3 printer"
"Firmware MK3S detectado en impresora MK3"
#
"MMU Mode [Normal]"
"Modo MMU [Normal]"
#
"MMU Mode[Stealth]"
"Modo MMU[Silenci]"
#MSG_MMU_MODE
"MMU Mode"
"Modo MMU"
#
"Mode change in progress ..."
"Cambio de modo progresando ..."
#
"Model [none]"
"Modelo [ninguno]"
#MSG_MODEL
"Model"
"Modelo"
#
"Model [strict]"
"Modelo [estricto]"
#
"Model [warn]"
"Modelo [aviso]"
#
"Nozzle d. [0.25]"
"Diam. nozzl[0.25]"
#
"Nozzle d. [0.40]"
"Diam. nozzl[0.40]"
#
"Nozzle d. [0.60]"
"Diam. nozzl[0.60]"
#
"Nozzle [none]"
"Nozzle [ninguno]"
#
"Nozzle [strict]"
"Nozzle [estricto]"
#
"Nozzle [warn]"
"Nozzle [aviso]"
#MSG_NOZZLE_DIAMETER
"Nozzle d."
"Diam. nozzl"
#
"G-code sliced for a different level. Continue?"
@ -1414,9 +1330,9 @@
"Sheet"
"Lamina"
#
"Sound [assist]"
"Sonido [asistido]"
#MSG_SOUND_BLIND
"Assist"
"Asistido"
#
"Steel sheets"
@ -1424,12 +1340,8 @@
#
"Z-correct:"
"Correccion-Z:"
"Corregir-Z:"
#
"Z-probe nr. [1]"
"Z-sensor nr. [1]"
#
"Z-probe nr. [3]"
"Z-sensor nr. [3]"
#MSG_Z_PROBE_NR
"Z-probe nr."
"Z-sensor nr."

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,14 @@
#
"[%.7s]Live adj. Z\x0avalue set, continue\x0aor start from zero?\x0a%cContinue%cReset"
"[%.7s]Set valori\x0aComp. Z, continuare\x0ao iniziare da zero?\x0a%cContinua%cReset"
#MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 c=14
" of 4"
" su 4"
#MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2 c=14
" of 9"
"su 9"
" su 9"
#MSG_MEASURED_OFFSET
"[0;0] point offset"
@ -46,16 +50,8 @@
"Are left and right Z~carriages all up?"
"I carrelli Z sin/des sono altezza max?"
#MSG_AUTO_DEPLETE_ON c=17 r=1
"SpoolJoin [on]"
"\x00"
#
"SpoolJoin [N/A]"
"\x00"
#MSG_AUTO_DEPLETE_OFF c=17 r=1
"SpoolJoin [off]"
#MSG_AUTO_DEPLETE c=17 r=1
"SpoolJoin"
"\x00"
#MSG_AUTO_HOME
@ -72,7 +68,7 @@
#MSG_AUTOLOADING_ENABLED c=20 r=4
"Autoloading filament is active, just press the knob and insert filament..."
"Il caricamento automatico e attivo, premete la manopola e inserite il filamento..."
"Caricamento automatico attivo, premi la manopola e inserisci il filamento."
#MSG_SELFTEST_AXIS_LENGTH
"Axis length"
@ -108,7 +104,7 @@
#MSG_MENU_BELT_STATUS c=15 r=1
"Belt status"
"Stato delle cinghie"
"Stato cinghie"
#MSG_RECOVER_PRINT c=20 r=2
"Blackout occurred. Recover print?"
@ -170,17 +166,13 @@
"Copy selected language?"
"Copiare la lingua selezionata?"
#MSG_CRASHDETECT_ON
"Crash det. [on]"
"Rilevam.imp. [on]"
#MSG_CRASHDETECT
"Crash det."
"Rileva.crash"
#MSG_CRASHDETECT_NA
"Crash det. [N/A]"
"Rilevam.imp.[N/A]"
#MSG_CRASHDETECT_OFF
"Crash det. [off]"
"Rilevam.imp.[off]"
#
"Choose a filament for the First Layer Calibration and select it in the on-screen menu."
"Scegli un filamento per la calibrazione del primo strato e selezionalo nel menu sullo schermo."
#MSG_CRASH_DETECTED c=20 r=1
"Crash detected."
@ -222,10 +214,6 @@
"Eject filament"
"Espelli filamento "
#
"Eject"
"Espellere"
#MSG_EJECTING_FILAMENT c=20 r=1
"Ejecting filament"
"Espellendo filamento "
@ -270,17 +258,9 @@
"Fail stats MMU"
"Stat.fall. MMU"
#MSG_FSENS_AUTOLOAD_ON c=17 r=1
"F. autoload [on]"
"Autocar.filam[on]"
#MSG_FSENS_AUTOLOAD_NA c=17 r=1
"F. autoload [N/A]"
"Autocar.fil.[N/A]"
#MSG_FSENS_AUTOLOAD_OFF c=17 r=1
"F. autoload [off]"
"Autocar.fil.[off]"
#MSG_FSENSOR_AUTOLOAD
"F. autoload"
"Autocar.fil."
#
"Fail stats"
@ -294,26 +274,13 @@
"Fan test"
"Test ventola"
#MSG_FANS_CHECK_ON c=17 r=1
"Fans check [on]"
"Control.vent [on]"
#MSG_FANS_CHECK_OFF c=17 r=1
"Fans check [off]"
"Control.vent[off]"
#MSG_FSENSOR_ON
"Fil. sensor [on]"
"Sensor filam.[on]"
#MSG_FSENSOR_NA
"Fil. sensor [N/A]"
"Sensor filam[N/A]"
#MSG_FSENSOR_OFF
"Fil. sensor [off]"
"Sensor filam[off]"
#MSG_FANS_CHECK
"Fans check"
"Control.vent"
#MSG_FSENSOR
"Fil. sensor"
"Sensore fil."
#
"Filam. runouts"
"Filam. esauriti"
@ -348,7 +315,7 @@
#MSG_V2_CALIBRATION c=17 r=1
"First layer cal."
"Calibrazione primo layer."
"Cal. primo strato"
#MSG_WIZARD_SELFTEST c=20 r=8
"First, I will run the selftest to check most common assembly problems."
@ -462,18 +429,10 @@
"I will run z calibration now."
"Adesso avviero la Calibrazione Z."
#MSG_WIZARD_V2_CAL_2 c=20 r=12
"I will start to print line and you will gradually lower the nozzle by rotating the knob, until you reach optimal height. Check the pictures in our handbook in chapter Calibration."
"Adesso iniziero a stampare una linea e tu dovrai abbassare l'ugello poco per volta ruotando la manopola sino a raggiungere una altezza ottimale. Per favore dai uno sguardo all'immagine del nostro manuale, cap.Calibrazione."
#MSG_WATCH
"Info screen"
"Schermata info"
#
"Is filament 1 loaded?"
"Il filamento 1 e caricato?"
#MSG_INSERT_FILAMENT c=20
"Insert filament"
"Inserire filamento"
@ -482,14 +441,6 @@
"Is filament loaded?"
"Il filamento e stato caricato?"
#MSG_WIZARD_PLA_FILAMENT c=20 r=2
"Is it PLA filament?"
"E' un filamento di PLA?"
#MSG_PLA_FILAMENT_LOADED c=20 r=2
"Is PLA filament loaded?"
"E' stato caricato il filamento di PLA?"
#MSG_STEEL_SHEET_CHECK c=20 r=2
"Is steel sheet on heatbed?"
"La piastra d'acciaio e sul piano riscaldato?"
@ -498,6 +449,10 @@
"Last print failures"
"Fallimenti ultima stampa"
#
"If you have additional steel sheets, calibrate their presets in Settings - HW Setup - Steel sheets."
"Se hai piastre d'acciaio aggiuntive, calibra i preset in Impostazioni - Setup HW - Piastre in Acciaio."
#
"Last print"
"Ultima stampa"
@ -512,11 +467,11 @@
#MSG_BED_CORRECTION_LEFT c=14 r=1
"Left side [um]"
"Sinistra [um]"
"Sinistra [um]"
#
"Lin. correction"
"Correzione lin."
"Correzione lineare"
#MSG_BABYSTEP_Z
"Live adjust Z"
@ -556,7 +511,7 @@
#MSG_MESH_BED_LEVELING
"Mesh Bed Leveling"
"Mesh livel. letto"
"Livel. piatto"
#MSG_MMU_OK_RESUMING_POSITION c=20 r=4
"MMU OK. Resuming position..."
@ -586,13 +541,17 @@
"MMU OK. Resuming..."
"MMU OK. Riprendendo... "
#MSG_STEALTH_MODE_OFF
"Mode [Normal]"
"Modo [normale]"
#MSG_MODE
"Mode"
"Mod."
#MSG_SILENT_MODE_ON
"Mode [silent]"
"Modo [silenzioso]"
#MSG_NORMAL
"Normal"
"Normale"
#MSG_SILENT
"Silent"
"Silenzioso"
#
"MMU needs user attention."
@ -602,17 +561,17 @@
"MMU power fails"
"Manc. corr. MMU"
#MSG_STEALTH_MODE_ON
"Mode [Stealth]"
"Modo [Silenziosa]"
#MSG_STEALTH
"Stealth"
"Silenziosa"
#MSG_AUTO_MODE_ON
"Mode [auto power]"
"Modo [auto]"
#MSG_AUTO_POWER
"Auto power"
"Auto"
#MSG_SILENT_MODE_OFF
"Mode [high power]"
"Mode [forte]"
#MSG_HIGH_POWER
"High power"
"Forte"
#
"MMU2 connected"
@ -646,7 +605,7 @@
"No SD card"
"Nessuna SD"
#
#MSG_NA
"N/A"
"\x00"
@ -730,14 +689,6 @@
"Please check our handbook and fix the problem. Then resume the Wizard by rebooting the printer."
"Per favore consulta il nostro manuale per risolvere il problema. Poi riprendi il Wizard dopo aver riavviato la stampante."
#MSG_WIZARD_LOAD_FILAMENT c=20 r=8
"Please insert PLA filament to the extruder, then press knob to load it."
"Per favore inserisci il filamento di PLA nell'estrusore, poi premi la manopola per caricare."
#MSG_PLEASE_LOAD_PLA c=20 r=4
"Please load PLA filament first."
"Per favore prima carica il filamento di PLA."
#MSG_CHECK_IDLER c=20 r=4
"Please open idler and remove filament manually."
"Aprire la guida filam. e rimuovere il filam. a mano"
@ -750,10 +701,6 @@
"Please press the knob to unload filament"
"Premete la manopola per scaricare il filamento "
#
"Please insert PLA filament to the first tube of MMU, then press the knob to load it."
"Per favore inserite del filamento PLA nel primo tubo del MMU, poi premete la manopola per caricarlo."
#MSG_PULL_OUT_FILAMENT c=20 r=4
"Please pull out filament immediately"
"Estrarre il filamento immediatamente"
@ -846,6 +793,18 @@
"Print FAN"
"Ventola di stampa"
#
"Please insert filament into the extruder, then press the knob to load it."
"Inserisci il filamento nell'estrusore, poi premi la manopola per caricarlo."
#
"Please insert filament into the first tube of the MMU, then press the knob to load it."
"Per favore inserisci il filamento nel primo tubo del MMU, poi premi la manopola per caricarlo."
#
"Please load filament first."
"Per favore prima carica il filamento."
#MSG_PRUSA3D
"prusa3d.com"
"\x00"
@ -886,25 +845,21 @@
"Right side[um]"
"Destra [um]"
#MSG_SECOND_SERIAL_ON c=17 r=1
"RPi port [on]"
"Porta RPi [on]"
#MSG_SECOND_SERIAL_OFF c=17 r=1
"RPi port [off]"
"Porta RPi [off]"
#MSG_RPI_PORT
"RPi port"
"Porta RPi"
#MSG_WIZARD_RERUN c=20 r=7
"Running Wizard will delete current calibration results and start from the beginning. Continue?"
"Se avvi il Wizard perderai la calibrazione preesistente e dovrai ricominciare dall'inizio. Continuare?"
#MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF c=19 r=1
"SD card [normal]"
"Mem. SD [normale]"
#MSG_SD_CARD
"SD card"
"Mem. SD"
#MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON c=19 r=1
"SD card [flshAir]"
"Mem. SD [flshAir]"
#MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY
"FlashAir"
"\x00"
#
"Right"
@ -946,10 +901,6 @@
"Select nozzle preheat temperature which matches your material."
"Selezionate la temperatura per il preriscaldamento dell'ugello adatta al vostro materiale."
#
"Select PLA filament:"
"Selezionate filamento PLA:"
#MSG_SET_TEMPERATURE c=19 r=1
"Set temperature:"
"Imposta temperatura:"
@ -970,49 +921,49 @@
"Some files will not be sorted. Max. No. of files in 1 folder for sorting is 100."
"Alcuni file non saranno ordinati. Il numero massimo di file in una cartella e 100 perche siano ordinati."
#MSG_SORT_NONE c=17 r=1
"Sort [none]"
"Ordina [nessuno]"
#MSG_SORT
"Sort"
"Ordina"
#MSG_SORT_TIME c=17 r=1
"Sort [time]"
"Ordina [tempo]"
#MSG_NONE
"None"
"Nessuno"
#MSG_SORT_TIME
"Time"
"Cron."
#
"Severe skew"
"Devia.grave"
"Severe skew:"
"Devia.grave:"
#MSG_SORT_ALPHA c=17 r=1
"Sort [alphabet]"
"Ordine [alfabeti]"
#MSG_SORT_ALPHA
"Alphabet"
"Alfabeti"
#MSG_SORTING c=20 r=1
"Sorting files"
"Ordinando i file"
#MSG_SOUND_LOUD c=17 r=1
"Sound [loud]"
"Suono [forte]"
#MSG_SOUND_LOUD
"Loud"
"Forte"
#
"Slight skew"
"Devia.lieve"
"Slight skew:"
"Devia.lieve:"
#MSG_SOUND_MUTE c=17 r=1
"Sound [mute]"
"Suono [mute]"
#MSG_SOUND
"Sound"
"Suono"
#
"Some problem encountered, Z-leveling enforced ..."
"Sono stati rilevati problemi, avviato livellamento Z ..."
#MSG_SOUND_ONCE c=17 r=1
"Sound [once]"
"Suono [singolo]"
#MSG_SOUND_SILENT c=17 r=1
"Sound [silent]"
"Suono[silenzioso]"
#MSG_SOUND_ONCE
"Once"
"Singolo"
#MSG_SPEED
"Speed"
@ -1046,17 +997,17 @@
"Swapped"
"Scambiato"
#MSG_TEMP_CALIBRATION c=20 r=1
"Temp. cal. "
"Calib. temp. "
#
"Select filament:"
"Seleziona il filamento:"
#MSG_TEMP_CALIBRATION_ON c=20 r=1
"Temp. cal. [on]"
"Calib. temp. [on]"
#MSG_TEMP_CALIBRATION c=12 r=1
"Temp. cal."
"Calib. temp."
#MSG_TEMP_CALIBRATION_OFF c=20 r=1
"Temp. cal. [off]"
"Calib. temp.[off]"
#
"Select temperature which matches your material."
"Seleziona la temperatura appropriata per il tuo materiale."
#MSG_CALIBRATION_PINDA_MENU c=17 r=1
"Temp. calibration"
@ -1234,12 +1185,20 @@
"Y distance from min"
"Distanza Y dal min"
#
"The printer will start printing a zig-zag line. Rotate the knob until you reach the optimal height. Check the pictures in the handbook (Calibration chapter)."
"La stampante iniziera a stampare una linea a zig-zag. Gira la manopola fino a che non hai raggiungo l'altezza ottimale. Verifica con le immagini nel manuale (capitolo sulla calibrazione):"
#
"Y-correct:"
"Correzione-Y:"
#MSG_OFF
" [off]"
"Off"
"\x00"
#MSG_ON
"On"
"\x00"
#
@ -1258,17 +1217,17 @@
"FINDA:"
"\x00"
#
"Firmware [none]"
"Firmware[nessuno]"
#MSG_FIRMWARE
"Firmware"
"\x00"
#
"Firmware [strict]"
"Firmware [esatto]"
#MSG_STRICT
"Strict"
"Esatto"
#
"Firmware [warn]"
"Firmware [avviso]"
#MSG_WARN
"Warn"
"Avviso"
#
"HW Setup"
@ -1278,25 +1237,13 @@
"IR:"
"\x00"
#
"Magnets comp.[N/A]"
"Comp. Magneti[N/A]"
#MSG_MAGNETS_COMP
"Magnets comp."
"Comp. Magneti"
#
"Magnets comp.[Off]"
"Comp. Magneti[off]"
#
"Magnets comp. [On]"
"Comp. Magneti [on]"
#
"Mesh [3x3]"
"Griglia [3x3]"
#
"Mesh [7x7]"
"Griglia [7x7]"
#MSG_MESH
"Mesh"
"Griglia"
#
"Mesh bed leveling"
@ -1306,53 +1253,21 @@
"MK3S firmware detected on MK3 printer"
"Firmware MK3S rilevato su stampante MK3"
#
"MMU Mode [Normal]"
"Modalita MMU [Normale]"
#
"MMU Mode[Stealth]"
"Modalita MMU [Silenziosa]"
#MSG_MMU_MODE
"MMU Mode"
"Mod. MMU"
#
"Mode change in progress ..."
"Cambio modalita in corso ..."
#
"Model [none]"
"Modello [nessuno]"
#MSG_MODEL
"Model"
"Modello"
#
"Model [strict]"
"Modello [esatto]"
#
"Model [warn]"
"Modello [avviso]"
#
"Nozzle d. [0.25]"
"Diam.Ugello[0.25]"
#
"Nozzle d. [0.40]"
"Diam.Ugello[0.40]"
#
"Nozzle d. [0.60]"
"Diam.Ugello[0.60]"
#
"Nozzle [none]"
"Ugello [nessuno]"
#
"Nozzle [strict]"
"Ugello [esatto]"
#
"Nozzle [warn]"
"Ugello [avviso]"
#MSG_NOZZLE_DIAMETER
"Nozzle d."
"Diam.Ugello"
#
"G-code sliced for a different level. Continue?"
@ -1414,9 +1329,9 @@
"Sheet"
"Piano"
#
"Sound [assist]"
"Suono [assistito]"
#MSG_SOUND_BLIND
"Assist"
"Assist."
#
"Steel sheets"
@ -1426,10 +1341,6 @@
"Z-correct:"
"Correzione-Z:"
#
"Z-probe nr. [1]"
"Z-probe nr. [1]"
#
"Z-probe nr. [3]"
"Z-probe nr. [3]"
#MSG_Z_PROBE_NR
"Z-probe nr."
"\x00"

View File

@ -1,3 +1,7 @@
#
"[%.7s]Live adj. Z\x0avalue set, continue\x0aor start from zero?\x0a%cContinue%cReset"
"[%.7s]Live Adj. Z\x0austaw., kontynuowac\x0aczy zaczac od 0?\x0a%cKontynuuj%cReset"
#MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 c=14
" of 4"
" z 4"
@ -46,17 +50,9 @@
"Are left and right Z~carriages all up?"
"Obydwa konce osi sa na szczycie?"
#MSG_AUTO_DEPLETE_ON c=17 r=1
"SpoolJoin [on]"
"SpoolJoin [wl]"
#
"SpoolJoin [N/A]"
"SpoolJoin [nd]"
#MSG_AUTO_DEPLETE_OFF c=17 r=1
"SpoolJoin [off]"
"SpoolJoin [wyl]"
#MSG_AUTO_DEPLETE c=17 r=1
"SpoolJoin"
"\x00"
#MSG_AUTO_HOME
"Auto home"
@ -64,11 +60,11 @@
#MSG_AUTOLOAD_FILAMENT c=17
"AutoLoad filament"
"AutoLadowanie fil."
"Autoladowanie fil."
#MSG_AUTOLOADING_ONLY_IF_FSENS_ON c=20 r=4
"Autoloading filament available only when filament sensor is turned on..."
"Autoladowanie filamentu dostepne tylko gdy czujnik filamentu jest wlaczony..."
"Autoladowanie fil. dostepne tylko gdy czujnik filamentu jest wlaczony..."
#MSG_AUTOLOADING_ENABLED c=20 r=4
"Autoloading filament is active, just press the knob and insert filament..."
@ -96,7 +92,7 @@
#MSG_BED_CORRECTION_MENU
"Bed level correct"
"Korekta poziomowania stolu"
"Korekta stolu"
#MSG_BED_LEVELING_FAILED_POINT_LOW c=20 r=4
"Bed leveling failed. Sensor didnt trigger. Debris on nozzle? Waiting for reset."
@ -171,16 +167,12 @@
"Skopiowac wybrany jezyk?"
#MSG_CRASHDETECT_ON
"Crash det. [on]"
"Wykr.zderzen [wl]"
"Crash det."
"Wykr.zderzen"
#MSG_CRASHDETECT_NA
"Crash det. [N/A]"
"Wykr.zderzen[n/d]"
#MSG_CRASHDETECT_OFF
"Crash det. [off]"
"Wykr.zderzen[wyl]"
#
"Choose a filament for the First Layer Calibration and select it in the on-screen menu."
"Wybierz filament do Kalibracji Pierwszej Warstwy i potwierdz w menu ekranowym."
#MSG_CRASH_DETECTED c=20 r=1
"Crash detected."
@ -204,7 +196,7 @@
#MSG_DISABLE_STEPPERS
"Disable steppers"
"Wylaczenie silnikow"
"Wylacz silniki"
#MSG_BABYSTEP_Z_NOT_SET c=20 r=12
"Distance between tip of the nozzle and the bed surface has not been set yet. Please follow the manual, chapter First steps, section First layer calibration."
@ -222,10 +214,6 @@
"Eject filament"
"Wysun filament"
#
"Eject"
"Wysun"
#MSG_EJECTING_FILAMENT c=20 r=1
"Ejecting filament"
"Wysuwanie filamentu"
@ -256,11 +244,11 @@
#MSG_SELFTEST_EXTRUDER_FAN_SPEED c=18
"Extruder fan:"
"Went. ekstr:"
"WentHotend:"
#MSG_INFO_EXTRUDER c=15 r=1
"Extruder info"
"Informacje o ekstruderze"
"Ekstruder - info"
#MSG_MOVE_E
"Extruder"
@ -270,17 +258,9 @@
"Fail stats MMU"
"Bledy MMU"
#MSG_FSENS_AUTOLOAD_ON c=17 r=1
"F. autoload [on]"
"Autolad. fil [wl]"
#MSG_FSENS_AUTOLOAD_NA c=17 r=1
"F. autoload [N/A]"
"Autolad.fil.[N/D]"
#MSG_FSENS_AUTOLOAD_OFF c=17 r=1
"F. autoload [off]"
"Autolad.fil.[wyl]"
#MSG_FSENSOR_AUTOLOAD
"F. autoload"
"Autolad. fil."
#
"Fail stats"
@ -294,25 +274,13 @@
"Fan test"
"Test wentylatora"
#MSG_FANS_CHECK_ON c=17 r=1
"Fans check [on]"
"Sprawd.went. [wl]"
#MSG_FANS_CHECK
"Fans check"
"Sprawd.went."
#MSG_FANS_CHECK_OFF c=17 r=1
"Fans check [off]"
"Sprawd.went.[wyl]"
#MSG_FSENSOR_ON
"Fil. sensor [on]"
"Czuj. filam. [wl]"
#MSG_FSENSOR_NA
"Fil. sensor [N/A]"
"Czuj. filam.[N/D]"
#MSG_FSENSOR_OFF
"Fil. sensor [off]"
"Czuj. filam.[wyl]"
#MSG_FSENSOR
"Fil. sensor"
"Czuj. filam."
#
"Filam. runouts"
@ -320,7 +288,7 @@
#MSG_FILAMENT_CLEAN c=20 r=2
"Filament extruding & with correct color?"
"Filament wychodzi z dyszy a kolor jest czysty?"
"Filament wychodzi z dyszy, kolor jest ok?"
#MSG_NOT_LOADED c=19
"Filament not loaded"
@ -462,18 +430,10 @@
"I will run z calibration now."
"Przeprowadze kalibracje Z."
#MSG_WIZARD_V2_CAL_2 c=20 r=12
"I will start to print line and you will gradually lower the nozzle by rotating the knob, until you reach optimal height. Check the pictures in our handbook in chapter Calibration."
"Zaczne drukowac linie. Stopniowo opuszczaj dysze przekrecajac pokretlo, poki nie uzyskasz optymalnej wysokosci. Sprawdz obrazki w naszym Podreczniku w rozdz. Kalibracja"
#MSG_WATCH
"Info screen"
"Ekran informacyjny"
#
"Is filament 1 loaded?"
"Filament 1 zaladowany?"
#MSG_INSERT_FILAMENT c=20
"Insert filament"
"Wprowadz filament"
@ -482,14 +442,6 @@
"Is filament loaded?"
"Filament jest zaladowany?"
#MSG_WIZARD_PLA_FILAMENT c=20 r=2
"Is it PLA filament?"
"Czy to filament PLA?"
#MSG_PLA_FILAMENT_LOADED c=20 r=2
"Is PLA filament loaded?"
"Fialment PLA jest zaladowany?"
#MSG_STEEL_SHEET_CHECK c=20 r=2
"Is steel sheet on heatbed?"
"Czy plyta stal. jest na podgrzew. stole?"
@ -498,6 +450,10 @@
"Last print failures"
"Ostatnie bledy druku"
#
"If you have additional steel sheets, calibrate their presets in Settings - HW Setup - Steel sheets."
"Jesli masz dodatkowe plyty stalowe, to skalibruj ich ustawienia w menu Ustawienia - Ustawienia HW - Plyty stalowe."
#
"Last print"
"Ost. wydruk"
@ -516,7 +472,7 @@
#
"Lin. correction"
"Korekcja lin."
"Korekcja liniowa"
#MSG_BABYSTEP_Z
"Live adjust Z"
@ -586,13 +542,17 @@
"MMU OK. Resuming..."
"MMU OK. Wznawianie..."
#MSG_STEALTH_MODE_OFF
"Mode [Normal]"
"Tryb [normalny]"
#MSG_MODE
"Mode"
"Tryb"
#MSG_SILENT_MODE_ON
"Mode [silent]"
"Tryb [cichy]"
#MSG_NORMAL
"Normal"
"Normalny"
#MSG_SILENT
"Silent"
"Cichy"
#
"MMU needs user attention."
@ -602,17 +562,17 @@
"MMU power fails"
"Zaniki zasil. MMU"
#MSG_STEALTH_MODE_ON
"Mode [Stealth]"
"Tryb [Stealth]"
#MSG_STEALTH
"Stealth"
"Cichy"
#MSG_AUTO_MODE_ON
"Mode [auto power]"
"Tryb [automatycz]"
#MSG_AUTO_POWER
"Auto power"
"Automatycz"
#MSG_SILENT_MODE_OFF
"Mode [high power]"
"Tryb[wysoka wyd.]"
#MSG_HIGH_POWER
"High power"
"Wysoka wyd."
#
"MMU2 connected"
@ -646,7 +606,7 @@
"No SD card"
"Brak karty SD"
#
#MSG_NA
"N/A"
"N/D"
@ -688,7 +648,7 @@
#
"Nozzle FAN"
"Went. Hotend"
"WentHotend"
#MSG_PAUSE_PRINT
"Pause print"
@ -720,7 +680,7 @@
#MSG_CONFIRM_NOZZLE_CLEAN c=20 r=8
"Please clean the nozzle for calibration. Click when done."
"Dla prawidl. kalibracji nalezy oczyscic dysze. Potw. guzikiem."
"Dla prawidlowej kalibracji nalezy oczyscic dysze. Potwierdz guzikiem."
#MSG_SELFTEST_PLEASECHECK
"Please check :"
@ -730,14 +690,6 @@
"Please check our handbook and fix the problem. Then resume the Wizard by rebooting the printer."
"Przeczytaj nasz Podrecznik druku 3D aby naprawic problem. Potem wznow Asystenta przez restart drukarki."
#MSG_WIZARD_LOAD_FILAMENT c=20 r=8
"Please insert PLA filament to the extruder, then press knob to load it."
"Umiesc filament PLA w ekstruderze i nacisnij pokretlo, aby zaladowac."
#MSG_PLEASE_LOAD_PLA c=20 r=4
"Please load PLA filament first."
"Najpierw zaladuj filament PLA."
#MSG_CHECK_IDLER c=20 r=4
"Please open idler and remove filament manually."
"Prosze odciagnac dzwignie dociskowa ekstrudera i recznie usunac filament."
@ -750,10 +702,6 @@
"Please press the knob to unload filament"
"Nacisnij pokretlo aby rozladowac filament"
#
"Please insert PLA filament to the first tube of MMU, then press the knob to load it."
"Wsun filament PLA do pierwszej rurki MMU i nacisnij pokretlo aby go zaladowac."
#MSG_PULL_OUT_FILAMENT c=20 r=4
"Please pull out filament immediately"
"Wyciagnij filament teraz"
@ -820,7 +768,7 @@
#MSG_SELFTEST_PRINT_FAN_SPEED c=18
"Print fan:"
"Went.wydr:"
"WentWydruk:"
#MSG_CARD_MENU
"Print from SD"
@ -840,11 +788,23 @@
#MSG_FOLLOW_CALIBRATION_FLOW c=20 r=8
"Printer has not been calibrated yet. Please follow the manual, chapter First steps, section Calibration flow."
"Drukarka nie zostala jeszcze skalibrowana. Kieruj sie Samouczkiem: rozdzial Pierwsze Kroki, sekcja Konfiguracja przed drukowaniem."
"Drukarka nie byla jeszcze kalibrowana. Kieruj sie Samouczkiem: rozdzial Pierwsze Kroki, sekcja Konfiguracja przed drukowaniem."
#
"Print FAN"
"Went.wydr"
"WentWydruk"
#
"Please insert filament into the extruder, then press the knob to load it."
"Wsun filament do ekstrudera i nacisnij pokretlo, aby go zaladowac."
#
"Please insert filament into the first tube of the MMU, then press the knob to load it."
"Wsun filament do pierwszego kanalu w MMU2 i nacisnij pokretlo, aby go zaladowac."
#
"Please load filament first."
"Najpierw zaladuj filament."
#MSG_PRUSA3D
"prusa3d.com"
@ -886,25 +846,21 @@
"Right side[um]"
"Prawo [um]"
#MSG_SECOND_SERIAL_ON c=17 r=1
"RPi port [on]"
"Port RPi [wl]"
#MSG_SECOND_SERIAL_OFF c=17 r=1
"RPi port [off]"
"Port RPi [wyl]"
#MSG_RPI_PORT
"RPi port"
"Port RPi"
#MSG_WIZARD_RERUN c=20 r=7
"Running Wizard will delete current calibration results and start from the beginning. Continue?"
"Wlaczenie Asystenta usunie obecne dane kalibracyjne i zacznie od poczatku. Kontynuowac?"
#MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF c=19 r=1
"SD card [normal]"
"Karta SD [normal]"
#MSG_SD_CARD
"SD card"
"Karta SD"
#MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON c=19 r=1
"SD card [flshAir]"
"Karta SD[FlshAir]"
#MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY
"FlashAir"
"\x00"
#
"Right"
@ -924,7 +880,7 @@
#MSG_SELFTEST_START c=20
"Self test start "
"Rozpoczynanie Selftestu"
"Selftest startuje"
#MSG_SELFTEST
"Selftest "
@ -932,7 +888,7 @@
#MSG_SELFTEST_ERROR
"Selftest error !"
"Blad selftest !"
"Blad selftest!"
#MSG_SELFTEST_FAILED c=20
"Selftest failed "
@ -946,13 +902,9 @@
"Select nozzle preheat temperature which matches your material."
"Wybierz temperature grzania dyszy odpowiednia dla materialu."
#
"Select PLA filament:"
"Wybierz filament PLA:"
#MSG_SET_TEMPERATURE c=19 r=1
"Set temperature:"
"Ustaw. temperatury:"
"Ustaw temperature:"
#MSG_SETTINGS
"Settings"
@ -970,50 +922,49 @@
"Some files will not be sorted. Max. No. of files in 1 folder for sorting is 100."
"Niektore pliki nie zostana posortowane. Max. liczba plikow w 1 folderze = 100."
#MSG_SORT_NONE c=17 r=1
"Sort [none]"
"Sortowanie [brak]"
#MSG_SORT
"Sort"
"Sortowanie"
#MSG_SORT_TIME c=17 r=1
"Sort [time]"
"Sortowanie [czas]"
#MSG_NONE
"None"
"Brak"
#MSG_SORT_TIME
"Time"
"Czas"
#
"Severe skew"
"ZnacznySkos"
"Severe skew:"
"Znaczny skos:"
#MSG_SORT_ALPHA c=17 r=1
"Sort [alphabet]"
"Sortowan[alfabet]"
#MSG_SORT_ALPHA
"Alphabet"
"Alfab"
#MSG_SORTING c=20 r=1
"Sorting files"
"Sortowanie plikow"
#MSG_SOUND_LOUD c=17 r=1
"Sound [loud]"
"Dzwiek [Glosny]"
#MSG_SOUND_LOUD
"Loud"
"Glosny"
#
"Slight skew"
"Lekki skos"
"Slight skew:"
"Lekki skos:"
#MSG_SOUND_MUTE c=17 r=1
"Sound [mute]"
"Dzwiek[Wylaczony]"
#MSG_SOUND
"Sound"
"Dzwiek"
#
"Some problem encountered, Z-leveling enforced ..."
"Wykryto problem, wymuszono poziomowanie osi Z ..."
#MSG_SOUND_ONCE c=17 r=1
"Sound [once]"
"Dzwiek [1-raz]"
#MSG_SOUND_SILENT c=17 r=1
"Sound [silent]"
"Dzwiek [Cichy]"
"Wykryto problem, wymuszono poziomowanie osi Z."
#MSG_SOUND_ONCE
"Once"
"1-raz"
#MSG_SPEED
"Speed"
"Predkosc"
@ -1046,17 +997,17 @@
"Swapped"
"Zamieniono"
#MSG_TEMP_CALIBRATION c=20 r=1
"Temp. cal. "
#
"Select filament:"
"Wybierz filament:"
#MSG_TEMP_CALIBRATION c=12 r=1
"Temp. cal."
"Kalibracja temp."
#MSG_TEMP_CALIBRATION_ON c=20 r=1
"Temp. cal. [on]"
"Kalibr.temp. [wl]"
#MSG_TEMP_CALIBRATION_OFF c=20 r=1
"Temp. cal. [off]"
"Kalibr.temp.[wyl]"
#
"Select temperature which matches your material."
"Wybierz temperature, ktora odpowiada Twojemu filamentowi."
#MSG_CALIBRATION_PINDA_MENU c=17 r=1
"Temp. calibration"
@ -1084,11 +1035,11 @@
#
"Total filament"
"Calkowita dlugosc filamentu"
"Zuzycie filamentu"
#
"Total print time"
"Calkowity czas druku"
"Laczny czas druku"
#MSG_TUNE
"Tune"
@ -1234,13 +1185,21 @@
"Y distance from min"
"Dystans od 0 w osi Y"
#
"The printer will start printing a zig-zag line. Rotate the knob until you reach the optimal height. Check the pictures in the handbook (Calibration chapter)."
"Drukarka zacznie drukowanie linii w ksztalcie zygzaka. Ustaw optymalna wysokosc obracajac pokretlo. Porownaj z ilustracjami w Podreczniku (rozdzial Kalibracja)."
#
"Y-correct:"
"Korekcja-Y:"
#MSG_OFF
" [off]"
" [wyl]"
"Off"
"Wyl"
#MSG_ON
"On"
"Wl"
#
"Back"
@ -1258,17 +1217,17 @@
"FINDA:"
"\x00"
#
"Firmware [none]"
"Firmware [brak]"
#MSG_FIRMWARE
"Firmware"
"\x00"
#
"Firmware [strict]"
"Firmware [restr.]"
#MSG_STRICT
"Strict"
"Restr."
#
"Firmware [warn]"
"Firmware[ostrzez]"
#MSG_WARN
"Warn"
"Ostrzez"
#
"HW Setup"
@ -1278,81 +1237,37 @@
"IR:"
"\x00"
#
"Magnets comp.[N/A]"
"Kor. magnesow [nd]"
#MSG_MAGNETS_COMP
"Magnets comp."
"Kor. magnesow"
#
"Magnets comp.[Off]"
"Kor. magnesow[wyl]"
#
"Magnets comp. [On]"
"Kor. magnesow [wl]"
#
"Mesh [3x3]"
"Siatka [3x3]"
#
"Mesh [7x7]"
"Siatka [7x7]"
#MSG_MESH
"Mesh"
"Siatka"
#
"Mesh bed leveling"
"Poziomowanie wg siatki"
"Poziomowanie stolu"
#
"MK3S firmware detected on MK3 printer"
"Wykryto firmware MK3S w drukarce MK3"
#
"MMU Mode [Normal]"
"Tryb MMU[Normaln]"
#
"MMU Mode[Stealth]"
"Tryb MMU[Stealth]"
#MSG_MMU_MODE
"MMU Mode"
"Tryb MMU"
#
"Mode change in progress ..."
"Trwa zmiana trybu..."
#
"Model [none]"
"Model [brak]"
#MSG_MODEL
"Model"
"\x00"
#
"Model [strict]"
"Model [restrykc.]"
#
"Model [warn]"
"Model [ostrzez.]"
#
"Nozzle d. [0.25]"
"Sr. dyszy [0,25]"
#
"Nozzle d. [0.40]"
"Sr. dyszy [0,40]"
#
"Nozzle d. [0.60]"
"Sr. dyszy [0,60]"
#
"Nozzle [none]"
"Dysza [brak]"
#
"Nozzle [strict]"
"Dysza [restrykc.]"
#
"Nozzle [warn]"
"Dysza [ostrzez.]"
#MSG_NOZZLE_DIAMETER
"Nozzle d."
"Sr. dyszy"
#
"G-code sliced for a different level. Continue?"
@ -1414,9 +1329,9 @@
"Sheet"
"Plyta"
#
"Sound [assist]"
"Dzwiek [asyst.]"
#MSG_SOUND_BLIND
"Assist"
"Asyst."
#
"Steel sheets"
@ -1426,10 +1341,6 @@
"Z-correct:"
"Korekcja-Z:"
#
"Z-probe nr. [1]"
"Pomiar-Z [1]"
#
"Z-probe nr. [3]"
"Pomiar-Z [3]"
#MSG_Z_PROBE_NR
"Z-probe nr."
"Ilosc Pomiarow"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

252
lang/translations.md Normal file
View File

@ -0,0 +1,252 @@
# Translations
## Workflow
- Build firmware
- using `build.sh`
- using `PF-build.sh` with a `break` before `# build languages`
- change to `lang` folder
- check if lang scripts being able to run with `config.sh`
- if you get `Arduino main folder: NG` message change in `config.sh` `export ARDUINO=C:/arduino-1.8.5` to `export ARDUINO=<Path to your Arduino IDE folder>`
-example: `export ARDUINO=D:/Github/Prusa-Firmware/PF-build-env-1.0.6/windows-64`
- run `lang-build.sh en` to create english `lang_en.tmp`, `lang_en.dat` and `lang_en.bin` files
- change in `fw-build.sh` `IGNORE_MISSING_TEXT=1` to `IGNORE_MISSING_TEXT=0` so it stops with error and generates `not_used.txt` and `not_tran.txt`
- run modified `fw-build.sh`
- `not_tran.txt` should be reviewed and added as these are potential missing translations
- copy `not_tran.txt` as `lang_add.txt`
- check if there are things you don't want to translate or must be modifed
- als check that the strings do not start with `spaces` as the scripts doesn't handle these well at this moment.
- run `lang-add.sh lang_add.txt` to add the missing translations to `lang_en.txt` and `lang_en_??.txt`
- `not_used.txt` should only contain mesages that aren't used in this variant like MK2.5 vs MK3
- run `fw-clean.sh` to cleanup firmware related files
- delete `not_used.txt` and `not_tran.txt`
- run `lang-clean.sh` to cleanup language related files
- run `lang-export.sh all` to create PO files for translation these are stored in `/lang/po` folder
- Send them to translators and reviewers or
- copy these to `/lang/po/new` and
- translate these with POEdit the newly added messages
- easiest way is to choose `Validate`in POEdit as it shows you `errors` and the `missing transalations` / most likely the newly added at the top.
- The new translated files are expected in `/lang/po/new` folder so store the received files these
- run `lang-import.sh <language code (iso639-1)>` for each newly translated language
- script improvement to import "all" and other things would be great.
- Double check if something is missing or faulty
- run `lang-build.sh` to to create `lang_en.tmp/.dat/.bin` and `lang_en_??.tmp/.dat/.bin` files
- run `fw-build.sh` and check if there are still some messages in `not_tran.txt` that need attention
- After approval
- run `fw-clean.sh` to cleanup firmware related files
- run `lang-clean.sh` to cleanup language related files
- change in `fw-build.sh` back to `IGNORE_MISSING_TEXT=1`
- remove `break` from `PF-build.sh` script if that has been modified
- build your firmware with `build.sh`, `PF-build.sh` or how you normally do it.
- Check/Test firmware on printer
## Code / usage
There are 2 modes of operation. If `LANG_MODE==0`, only one language is being used (the default compilation approach from plain Arduino IDE).
The reset of this explanation is devoted to `LANG_MODE==1`:
`language.h`:
```C++
// section .loc_sec (originaly .progmem0) will be used for localized translated strings
#define PROGMEM_I2 __attribute__((section(".loc_sec")))
// section .loc_pri (originaly .progmem1) will be used for localized strings in english
#define PROGMEM_I1 __attribute__((section(".loc_pri")))
// section .noloc (originaly progmem2) will be used for not localized strings in english
#define PROGMEM_N1 __attribute__((section(".noloc")))
#define _I(s) (__extension__({static const char __c[] PROGMEM_I1 = "\xff\xff" s; &__c[0];}))
#define ISTR(s) "\xff\xff" s
#define _i(s) lang_get_translation(_I(s))
#define _T(s) lang_get_translation(s)
```
That explains the macros:
- `_i` expands into `lang_get_translation((__extension__({static const char __c[] PROGMEM_I1 = "\xff\xff" s; &__c[0];})))` . Note the two 0xff's in the beginning of the string. `_i` allows for declaring a string directly inplace of C++ code, no string table is used. The downside of this approach is obvious - the compiler is not able/willing to merge duplicit strings into one.
- `_T` expands into `lang_get_translation(s)` without the two 0xff's at the beginning. Must be used in conjunction with MSG tables in `messages.h`. Allows to declare a string only once and use many times.
- `_N` means not-translated. These strings reside in a different segment of memory.
The two 0xff's are somehow magically replaced by real string ID's where the translations are available (still don't know where).
```C++
const char* lang_get_translation(const char* s){
if (lang_selected == 0) return s + 2; //primary language selected, return orig. str.
if (lang_table == 0) return s + 2; //sec. lang table not found, return orig. str.
uint16_t ui = pgm_read_word(((uint16_t*)s)); //read string id
if (ui == 0xffff) return s + 2; //translation not found, return orig. str.
ui = pgm_read_word(((uint16_t*)(((char*)lang_table + 16 + ui*2)))); //read relative offset
if (pgm_read_byte(((uint8_t*)((char*)lang_table + ui))) == 0) //read first character
return s + 2;//zero length string == not translated, return orig. str.
return (const char*)((char*)lang_table + ui); //return calculated pointer
}
```
## Files
### `lang_en.txt`
```
#MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
"Crash detection can\x0abe turned on only in\x0aNormal mode"
```
### `lang_en_*.txt`
```
#MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
"Crash detection can\x0abe turned on only in\x0aNormal mode"
"Crash detekce muze\x0abyt zapnuta pouze v\x0aNormal modu"
```
1. a comment - usually a MSG define with number of characters (c) and rows (r)
2. English text
3. translated text
### `not_tran.txt`
A simple list of strings that are not translated yet.
### `not_used.txt`
A list os strings not currently used in this variant of the firmware or are obsolete.
Example: There are MK2.5 specific messages that aren't used when you compile a MK3 variant and vice versa. So be carefull and double check the code if this message is obsolete or just not used due to the chosen variant.
## Scripts
### `config.sh`
- Checks setup and sets auxiliary env vars used in many other scripts.
- Looks for env var `ARDUINO`. If not found/empty, a default `C:/arduino-1.8.5` is used.
- Sets env var `CONFIG_OK=1` when all good, otherwise sets `CONFIG_OK=0`
### `fw-build.sh`
Joins firmware HEX and language binaries into one file.
### `fw-clean.sh`
### `lang-add.sh`
Adds new messages into the dictionary regardless of whether there have been any older versions.
### `lang-build.sh`
Generates lang_xx.bin (language binary files) for the whole firmware build.
Arguments:
- `$1` : language code (`en`, `cz`, `de`, `es`, `fr`, `it`, `pl`) or `all`
- empty/no arguments defaults to `all`
Input: `lang_en.txt` or `lang_en_xx.txt`
Output: `lang_xx.bin`
Temporary files: `lang_xx.tmp` and `lang_xx.dat`
Description of the process:
The script first runs `lang-check.py $1` and removes empty lines and comments (and non-translated texts) into `lang_$1.tmp`.
The tmp file now contains all translated texts (some of them empty, i.e. "").
The tmp file is then transformed into `lang_$1.dat`, which is a simple dump of all texts together, each terminated with a `\x00`.
Format of the `bin` file:
- 00-01: `A5 5A`
- 02-03: `B4 4B`
- 04-05: 2B size
- 06-07: 2B number of strings
- 08-09: 2B checksum
- 0A-0B: 2B lang code hex data: basically `en` converted into `ne`, i.e. characters swapped. Only `cz` is changed into `sc` (old `cs` ISO code).
- 0C-0D: 2B signature low
- 0E-0F: 2B signature high
- 10-(10 + 2*number of strings): table of string offsets from the beginning of this file
- after the table there are the strings themselves, each terminated with `\x00`
The signature is composed of 2B number of strings and 2B checksum in lang_en.bin. Signature in lang_en.bin is zero.
### `lang-check.sh` and `lang-check.py`
Both do the same, only lang-check.py is newer, i.e. lang-check.sh is not used anymore.
lang-check.py makes a binary comparison between what's in the dictionary and what's in the binary.
### `lang-clean.sh`
Removes all language output files from lang folder. That means deleting:
- if [ "$1" = "en" ]; then
rm_if_exists lang_$1.tmp
else
rm_if_exists lang_$1.tmp
rm_if_exists lang_en_$1.tmp
rm_if_exists lang_en_$1.dif
rm_if_exists lang_$1.ofs
rm_if_exists lang_$1.txt
fi
rm_if_exists lang_$1_check.dif
rm_if_exists lang_$1.bin
rm_if_exists lang_$1.dat
rm_if_exists lang_$1_1.tmp
rm_if_exists lang_$1_2.tmp
### `lang-export.sh`
Exports PO (gettext) for external translators.
### `lang-import.sh`
Import from PO.
Arguments:
- `$1` : language code (`en`, `cz`, `de`, `es`, `fr`, `it`, `pl`)
- empty/no arguments quits the script
Input files: `<language code>.po` files like `de.po`, `es.po`, etc.
Input folder: ´/lang/po/new´
Output files:
Output foler: ´/lang/po/new´
Needed improments to scrpit:
- add `all` argument
- update `replace in <language> translations` to all known special characters the LCD display with Japanese ROM cannot display
- move `lang_en_<language code>.txt` to folder `/lang`
- cleanup `<language code>_filtered.po`, `<language code>_new.po` and `nonasci.txt`
### `progmem.sh`
Examine content of progmem sections (default is progmem1).
Input:
- $OUTDIR/Firmware.ino.elf
- $OUTDIR/sketch/*.o (all object files)
Outputs:
- text.sym - formated symbol listing of section '.text'
- $PROGMEM.sym - formated symbol listing of section '.progmemX'
- $PROGMEM.lss - disassembly listing file
- $PROGMEM.hex - variables - hex
- $PROGMEM.chr - variables - char escape
- $PROGMEM.var - variables - strings
- $PROGMEM.txt - text data only (not used)
Description of process:
- check input files
- remove output files
- list symbol table of section '.text' from output elf file to text.sym (sorted by address)
- calculate start and stop address of section '.$PROGMEM'
- dump $PROGMEM data in hex format, cut disassembly (keep hex data only) into $PROGMEM.lss
- convert $PROGMEM.lss to $PROGMEM.hex:
- replace empty lines with '|' (variables separated by empty lines)
- remove address from multiline variables (keep address at first variable line only)
- remove '<' and '>:', remove whitespace at end of lines
- remove line-endings, replace separator with '\n' (join hex data lines - each line will contain single variable)
- convert $PROGMEM.hex to $PROGMEM.chr (prepare string data for character check and conversion)
- replace first space with tab
- replace second and third space with tab and space
- replace all remaining spaces with '\x'
- replace all tabs with spaces
- convert $PROGMEM.chr to $PROGMEM.var (convert data to text) - a set of special characters is escaped here including `\x0a`
### `textaddr.sh`
Compiles `progmem1.var` and `lang_en.txt` files to `textaddr.txt` file (mapping of progmem addreses to text idenifiers).
Description of process:
- check if input files exists
- create sorted list of strings from progmem1.var and lang_en.txt
- lines from progmem1.var will contain addres (8 chars) and english text
- lines from lang_en.txt will contain linenumber and english text
- after sort this will generate pairs of lines (line from progmem1 first)
- result of sort is compiled with simple script and stored into file textaddr.txt
Input:
- progmem1.var
- lang_en.txt
Output:
- textaddr.txt
update_lang.sh