Files
Ultimaker2Clone/CAD/Ultimaker 2 DIY/Firmware/20160823_UM2.1-Firmware-UM2.1/Marlin/UltiLCD2_menu_material.cpp
2022-11-13 22:53:56 +01:00

1444 lines
63 KiB
C++
Executable File

#include <avr/pgmspace.h>
#include "Configuration.h"
#ifdef ENABLE_ULTILCD2
#include "Marlin.h"
#include "cardreader.h"//This code uses the card.longFilename as buffer to store data, to save memory.
#include "temperature.h"
#include "UltiLCD2.h"
#include "UltiLCD2_hi_lib.h"
#include "UltiLCD2_menu_material.h"
#ifndef eeprom_read_float
//Arduino IDE compatibility, lacks the eeprom_read_float function
float inline eeprom_read_float(float* addr)
{
union { uint32_t i; float f; } n;
n.i = eeprom_read_dword((uint32_t*)addr);
return n.f;
}
void inline eeprom_write_float(float* addr, float f)
{
union { uint32_t i; float f; } n;
n.f = f;
eeprom_write_dword((uint32_t*)addr, n.i);
}
#endif
struct materialSettings material[EXTRUDERS];
static menuFunc_t post_change_material_menu;
static unsigned long preheat_end_time;
static uint8_t nozzle_select_index;
void doCooldown();//TODO
static void lcd_menu_material_main();
static void lcd_menu_change_material_preheat();
static void lcd_menu_change_material_remove();
static void lcd_menu_change_material_remove_wait_user();
static void lcd_menu_change_material_remove_wait_user_ready();
static void lcd_menu_change_material_select_material();
static void lcd_menu_insert_material_preheat();
static void lcd_menu_change_material_insert_wait_user();
static void lcd_menu_change_material_insert_wait_user_ready();
static void lcd_menu_change_material_insert_forward();
static void lcd_menu_change_material_insert();
static void lcd_menu_material_select();
static void lcd_menu_material_selected();
static void lcd_menu_material_settings();
static void lcd_menu_material_temperature_settings();
static void lcd_menu_material_retraction_settings();
static void lcd_menu_material_retraction_settings_per_nozzle();
static void lcd_menu_material_settings_store();
static void cancelMaterialInsert()
{
set_extrude_min_temp(EXTRUDE_MINTEMP);
digipot_current(2, motor_current_setting[2]);//Set E motor power to default.
}
void lcd_menu_material()
{
#if EXTRUDERS > 1
lcd_tripple_menu(PSTR("PRIMARY|NOZZLE"), PSTR("SECONDARY|NOZZLE"), PSTR("RETURN"));
if (lcd_lib_button_pressed)
{
if (IS_SELECTED_MAIN(0))
{
active_extruder = 0;
lcd_change_to_menu(lcd_menu_material_main);
}
else if (IS_SELECTED_MAIN(1))
{
active_extruder = 1;
lcd_change_to_menu(lcd_menu_material_main);
}
else if (IS_SELECTED_MAIN(2))
lcd_change_to_menu(lcd_menu_main);
}
lcd_lib_update_screen();
#else
currentMenu = lcd_menu_material_main;
#endif
}
static void lcd_menu_material_main_return()
{
doCooldown();
enquecommand_P(PSTR("G28 X0 Y0"));
currentMenu = lcd_menu_material_main;
}
static void lcd_menu_material_main()
{
lcd_tripple_menu(PSTR("CHANGE"), PSTR("SETTINGS"), PSTR("RETURN"));
if (lcd_lib_button_pressed)
{
if (IS_SELECTED_MAIN(0) && !is_command_queued())
{
minProgress = 0;
char buffer[32];
enquecommand_P(PSTR("G28 X0 Y0"));
sprintf_P(buffer, PSTR("G1 F%i X%i Y%i"), int(homing_feedrate[0]), X_MAX_LENGTH/2, 10);
enquecommand(buffer);
lcd_change_to_menu_change_material(lcd_menu_material_main_return);
}
else if (IS_SELECTED_MAIN(1))
lcd_change_to_menu(lcd_menu_material_select, SCROLL_MENU_ITEM_POS(0));
else if (IS_SELECTED_MAIN(2))
lcd_change_to_menu(lcd_menu_main);
}
lcd_lib_update_screen();
}
void lcd_change_to_menu_change_material(menuFunc_t return_menu)
{
post_change_material_menu = return_menu;
preheat_end_time = millis() + (unsigned long)material[active_extruder].change_preheat_wait_time * 1000L;
lcd_change_to_menu(lcd_menu_change_material_preheat);
}
static void lcd_menu_change_material_preheat()
{
#ifdef USE_CHANGE_TEMPERATURE
setTargetHotend(material[active_extruder].change_temperature, active_extruder);
#else
setTargetHotend(material[active_extruder].temperature[0], active_extruder);
#endif
int16_t temp = degHotend(active_extruder) - 20;
int16_t target = degTargetHotend(active_extruder) - 20;
if (temp < 0) temp = 0;
if (temp > target - 5 && temp < target + 5)
{
if ((signed long)(millis() - preheat_end_time) > 0)
{
set_extrude_min_temp(0);
plan_set_e_position(0);
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], 20.0 / volume_to_filament_length[active_extruder], retract_feedrate/60.0, active_extruder);
float old_max_feedrate_e = max_feedrate[E_AXIS];
float old_retract_acceleration = retract_acceleration;
float old_max_e_jerk = max_e_jerk;
max_feedrate[E_AXIS] = FILAMENT_REVERSAL_SPEED;
retract_acceleration = FILAMENT_LONG_MOVE_ACCELERATION;
max_e_jerk = FILAMENT_LONG_MOVE_JERK;
plan_set_e_position(0);
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], -1.0 / volume_to_filament_length[active_extruder], FILAMENT_REVERSAL_SPEED, active_extruder);
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], -FILAMENT_REVERSAL_LENGTH / volume_to_filament_length[active_extruder], FILAMENT_REVERSAL_SPEED, active_extruder);
max_feedrate[E_AXIS] = old_max_feedrate_e;
retract_acceleration = old_retract_acceleration;
max_e_jerk = old_max_e_jerk;
currentMenu = lcd_menu_change_material_remove;
temp = target;
}
}
else
{
#ifdef USE_CHANGE_TEMPERATURE
preheat_end_time = millis() + (unsigned long)material[active_extruder].change_preheat_wait_time * 1000L;
#else
preheat_end_time = millis();
#endif
}
uint8_t progress = uint8_t(temp * 125 / target);
if (progress < minProgress)
progress = minProgress;
else
minProgress = progress;
lcd_info_screen(post_change_material_menu, cancelMaterialInsert);
lcd_lib_draw_stringP(3, 10, PSTR("Heating printhead"));
lcd_lib_draw_stringP(3, 20, PSTR("for material removal"));
lcd_progressbar(progress);
lcd_lib_update_screen();
}
static void lcd_menu_change_material_remove()
{
lcd_info_screen(post_change_material_menu, cancelMaterialInsert);
lcd_lib_draw_stringP(3, 20, PSTR("Reversing material"));
if (!blocks_queued())
{
lcd_lib_beep();
led_glow_dir = led_glow = 0;
currentMenu = lcd_menu_change_material_remove_wait_user;
SELECT_MAIN_MENU_ITEM(0);
//Disable the extruder motor so you can pull out the remaining filament.
disable_e0();
disable_e1();
disable_e2();
}
long pos = -st_get_position(E_AXIS);
long targetPos = lround(FILAMENT_REVERSAL_LENGTH * axis_steps_per_unit[E_AXIS]);
uint8_t progress = (pos * 125 / targetPos);
lcd_progressbar(progress);
lcd_lib_update_screen();
}
static void lcd_menu_change_material_remove_wait_user_ready()
{
plan_set_e_position(0);
lcd_change_to_menu(lcd_menu_change_material_select_material);
}
static void lcd_menu_change_material_remove_wait_user()
{
LED_GLOW();
setTargetHotend(material[active_extruder].temperature[0], active_extruder);
lcd_question_screen(NULL, lcd_menu_change_material_remove_wait_user_ready, PSTR("READY"), post_change_material_menu, cancelMaterialInsert, PSTR("CANCEL"));
lcd_lib_draw_string_centerP(20, PSTR("Remove material"));
lcd_lib_update_screen();
}
static char* lcd_menu_change_material_select_material_callback(uint8_t nr)
{
eeprom_read_block(card.longFilename, EEPROM_MATERIAL_NAME_OFFSET(nr), 8);
card.longFilename[8] = '\0';
return card.longFilename;
}
static void lcd_menu_change_material_select_material_details_callback(uint8_t nr)
{
char buffer[32];
char* c = buffer;
if (led_glow_dir)
{
c = float_to_string(eeprom_read_float(EEPROM_MATERIAL_DIAMETER_OFFSET(nr)), c, PSTR("mm"));
while(c < buffer + 10) *c++ = ' ';
strcpy_P(c, PSTR("Flow:"));
c += 5;
c = int_to_string(eeprom_read_word(EEPROM_MATERIAL_FLOW_OFFSET(nr)), c, PSTR("%"));
}else{
c = int_to_string(eeprom_read_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(nr, 0)), c, PSTR("C"));
#if TEMP_SENSOR_BED != 0
*c++ = ' ';
c = int_to_string(eeprom_read_word(EEPROM_MATERIAL_BED_TEMPERATURE_OFFSET(nr)), c, PSTR("C"));
#endif
while(c < buffer + 10) *c++ = ' ';
strcpy_P(c, PSTR("Fan: "));
c += 5;
c = int_to_string(eeprom_read_byte(EEPROM_MATERIAL_FAN_SPEED_OFFSET(nr)), c, PSTR("%"));
}
lcd_lib_draw_string(5, 53, buffer);
}
static void lcd_menu_change_material_select_material()
{
uint8_t count = eeprom_read_byte(EEPROM_MATERIAL_COUNT_OFFSET());
lcd_scroll_menu(PSTR("MATERIAL"), count, lcd_menu_change_material_select_material_callback, lcd_menu_change_material_select_material_details_callback);
if (lcd_lib_button_pressed)
{
lcd_material_set_material(SELECTED_SCROLL_MENU_ITEM(), active_extruder);
lcd_change_to_menu(lcd_menu_insert_material_preheat, MAIN_MENU_ITEM_POS(0));
}
}
void lcd_change_to_menu_insert_material(menuFunc_t return_menu)
{
post_change_material_menu = return_menu;
currentMenu = lcd_menu_insert_material_preheat;
}
static void lcd_menu_insert_material_preheat()
{
setTargetHotend(material[active_extruder].temperature[0], active_extruder);
int16_t temp = degHotend(active_extruder) - 20;
int16_t target = degTargetHotend(active_extruder) - 20 - 10;
if (temp < 0) temp = 0;
if (temp > target && temp < target + 20 && !is_command_queued())
{
set_extrude_min_temp(0);
for(uint8_t e=0; e<EXTRUDERS; e++)
volume_to_filament_length[e] = 1.0;//Set the extrusion to 1mm per given value, so we can move the filament a set distance.
currentMenu = lcd_menu_change_material_insert_wait_user;
temp = target;
}
uint8_t progress = uint8_t(temp * 125 / target);
if (progress < minProgress)
progress = minProgress;
else
minProgress = progress;
lcd_info_screen(post_change_material_menu, cancelMaterialInsert);
if (temp < target + 10)
lcd_lib_draw_stringP(3, 10, PSTR("Heating printhead for"));
else
lcd_lib_draw_stringP(3, 10, PSTR("Cooling printhead for"));
lcd_lib_draw_stringP(3, 20, PSTR("material insertion"));
lcd_progressbar(progress);
lcd_lib_update_screen();
}
static void lcd_menu_change_material_insert_wait_user()
{
LED_GLOW();
if (printing_state == PRINT_STATE_NORMAL && movesplanned() < 2)
{
plan_set_e_position(0);
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], 0.5 / volume_to_filament_length[active_extruder], FILAMENT_INSERT_SPEED, active_extruder);
}
lcd_question_screen(NULL, lcd_menu_change_material_insert_wait_user_ready, PSTR("READY"), post_change_material_menu, cancelMaterialInsert, PSTR("CANCEL"));
lcd_lib_draw_string_centerP(10, PSTR("Insert new material"));
lcd_lib_draw_string_centerP(20, PSTR("from the backside of"));
lcd_lib_draw_string_centerP(30, PSTR("your machine,"));
lcd_lib_draw_string_centerP(40, PSTR("above the arrow."));
lcd_lib_update_screen();
}
static void lcd_menu_change_material_insert_wait_user_ready()
{
//Override the max feedrate and acceleration values to get a better insert speed and speedup/slowdown
float old_max_feedrate_e = max_feedrate[E_AXIS];
float old_retract_acceleration = retract_acceleration;
float old_max_e_jerk = max_e_jerk;
max_feedrate[E_AXIS] = FILAMENT_INSERT_FAST_SPEED;
retract_acceleration = FILAMENT_LONG_MOVE_ACCELERATION;
max_e_jerk = FILAMENT_LONG_MOVE_JERK;
plan_set_e_position(0);
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], FILAMENT_FORWARD_LENGTH / volume_to_filament_length[active_extruder], FILAMENT_INSERT_FAST_SPEED, active_extruder);
//Put back origonal values.
max_feedrate[E_AXIS] = old_max_feedrate_e;
retract_acceleration = old_retract_acceleration;
max_e_jerk = old_max_e_jerk;
lcd_change_to_menu(lcd_menu_change_material_insert_forward);
}
static void lcd_menu_change_material_insert_forward()
{
lcd_info_screen(post_change_material_menu, cancelMaterialInsert);
lcd_lib_draw_stringP(3, 20, PSTR("Forwarding material"));
if (!blocks_queued())
{
lcd_lib_beep();
led_glow_dir = led_glow = 0;
digipot_current(2, motor_current_setting[2]*2/3);//Set the E motor power lower to we skip instead of grind.
currentMenu = lcd_menu_change_material_insert;
SELECT_MAIN_MENU_ITEM(0);
}
long pos = st_get_position(E_AXIS);
long targetPos = lround(FILAMENT_FORWARD_LENGTH*axis_steps_per_unit[E_AXIS]);
uint8_t progress = (pos * 125 / targetPos);
lcd_progressbar(progress);
lcd_lib_update_screen();
}
static void materialInsertReady()
{
plan_set_e_position(0);
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], -END_OF_PRINT_RETRACTION / volume_to_filament_length[active_extruder], 25*60, active_extruder);
cancelMaterialInsert();
}
static void lcd_menu_change_material_insert()
{
LED_GLOW();
lcd_question_screen(post_change_material_menu, materialInsertReady, PSTR("READY"), post_change_material_menu, cancelMaterialInsert, PSTR("CANCEL"));
lcd_lib_draw_string_centerP(20, PSTR("Wait till material"));
lcd_lib_draw_string_centerP(30, PSTR("comes out the nozzle"));
if (movesplanned() < 2)
{
plan_set_e_position(0);
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], 0.5 / volume_to_filament_length[active_extruder], FILAMENT_INSERT_EXTRUDE_SPEED, active_extruder);
}
lcd_lib_update_screen();
}
static void lcd_menu_material_export_done()
{
lcd_lib_encoder_pos = MAIN_MENU_ITEM_POS(0);
lcd_info_screen(lcd_menu_material_select, NULL, PSTR("Ok"));
lcd_lib_draw_string_centerP(20, PSTR("Saved materials"));
lcd_lib_draw_string_centerP(30, PSTR("to the SD card"));
lcd_lib_draw_string_centerP(40, PSTR("in MATERIAL.TXT"));
lcd_lib_update_screen();
}
static void lcd_menu_material_export()
{
if (!card.sdInserted)
{
LED_GLOW();
lcd_lib_encoder_pos = MAIN_MENU_ITEM_POS(0);
lcd_info_screen(lcd_menu_material_select);
lcd_lib_draw_string_centerP(15, PSTR("No SD-CARD!"));
lcd_lib_draw_string_centerP(25, PSTR("Please insert card"));
lcd_lib_update_screen();
card.release();
return;
}
if (!card.isOk())
{
lcd_info_screen(lcd_menu_material_select);
lcd_lib_draw_string_centerP(16, PSTR("Reading card..."));
lcd_lib_update_screen();
card.initsd();
return;
}
card.setroot();
card.openFile("MATERIAL.TXT", false);
uint8_t count = eeprom_read_byte(EEPROM_MATERIAL_COUNT_OFFSET());
for(uint8_t n=0; n<count; n++)
{
char buffer[32];
strcpy_P(buffer, PSTR("[material]\n"));
card.write_string(buffer);
strcpy_P(buffer, PSTR("name="));
char* ptr = buffer + strlen(buffer);
eeprom_read_block(ptr, EEPROM_MATERIAL_NAME_OFFSET(n), 8);
ptr[8] = '\0';
strcat_P(buffer, PSTR("\n"));
card.write_string(buffer);
strcpy_P(buffer, PSTR("temperature="));
ptr = buffer + strlen(buffer);
int_to_string(eeprom_read_word(EEPROM_MATERIAL_TEMPERATURE_OFFSET(n)), ptr, PSTR("\n"));
card.write_string(buffer);
for(uint8_t nozzle=0; nozzle<MATERIAL_NOZZLE_COUNT; nozzle++)
{
strcpy_P(buffer, PSTR("temperature_"));
ptr = buffer + strlen(buffer);
ptr = float_to_string(nozzleIndexToNozzleSize(nozzle), ptr, PSTR("="));
int_to_string(eeprom_read_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(n, nozzle)), ptr, PSTR("\n"));
card.write_string(buffer);
strcpy_P(buffer, PSTR("retraction_length_"));
ptr = buffer + strlen(buffer);
ptr = float_to_string(nozzleIndexToNozzleSize(nozzle), ptr, PSTR("="));
float_to_string(float(eeprom_read_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(n, nozzle))) / EEPROM_RETRACTION_LENGTH_SCALE, ptr, PSTR("\n"));
card.write_string(buffer);
strcpy_P(buffer, PSTR("retraction_speed_"));
ptr = buffer + strlen(buffer);
ptr = float_to_string(nozzleIndexToNozzleSize(nozzle), ptr, PSTR("="));
float_to_string(float(eeprom_read_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(n, nozzle))) / EEPROM_RETRACTION_SPEED_SCALE, ptr, PSTR("\n"));
card.write_string(buffer);
}
#if TEMP_SENSOR_BED != 0
strcpy_P(buffer, PSTR("bed_temperature="));
ptr = buffer + strlen(buffer);
int_to_string(eeprom_read_word(EEPROM_MATERIAL_BED_TEMPERATURE_OFFSET(n)), ptr, PSTR("\n"));
card.write_string(buffer);
#endif
strcpy_P(buffer, PSTR("fan_speed="));
ptr = buffer + strlen(buffer);
int_to_string(eeprom_read_byte(EEPROM_MATERIAL_FAN_SPEED_OFFSET(n)), ptr, PSTR("\n"));
card.write_string(buffer);
strcpy_P(buffer, PSTR("flow="));
ptr = buffer + strlen(buffer);
int_to_string(eeprom_read_word(EEPROM_MATERIAL_FLOW_OFFSET(n)), ptr, PSTR("\n"));
card.write_string(buffer);
strcpy_P(buffer, PSTR("diameter="));
ptr = buffer + strlen(buffer);
float_to_string(eeprom_read_float(EEPROM_MATERIAL_DIAMETER_OFFSET(n)), ptr, PSTR("\n"));
card.write_string(buffer);
#ifdef USE_CHANGE_TEMPERATURE
strcpy_P(buffer, PSTR("change_temp="));
ptr = buffer + strlen(buffer);
float_to_string(eeprom_read_word(EEPROM_MATERIAL_CHANGE_TEMPERATURE(n)), ptr, PSTR("\n"));
card.write_string(buffer);
strcpy_P(buffer, PSTR("change_wait="));
ptr = buffer + strlen(buffer);
float_to_string(eeprom_read_byte(EEPROM_MATERIAL_CHANGE_WAIT_TIME(n)), ptr, PSTR("\n\n"));
card.write_string(buffer);
#endif
}
card.closefile();
currentMenu = lcd_menu_material_export_done;
}
static void lcd_menu_material_import_done()
{
lcd_lib_encoder_pos = MAIN_MENU_ITEM_POS(0);
lcd_info_screen(lcd_menu_material_select, NULL, PSTR("Ok"));
lcd_lib_draw_string_centerP(20, PSTR("Loaded materials"));
lcd_lib_draw_string_centerP(30, PSTR("from the SD card"));
lcd_lib_update_screen();
}
static void lcd_menu_material_import()
{
if (!card.sdInserted)
{
LED_GLOW();
lcd_lib_encoder_pos = MAIN_MENU_ITEM_POS(0);
lcd_info_screen(lcd_menu_material_select);
lcd_lib_draw_string_centerP(15, PSTR("No SD-CARD!"));
lcd_lib_draw_string_centerP(25, PSTR("Please insert card"));
lcd_lib_update_screen();
card.release();
return;
}
if (!card.isOk())
{
lcd_info_screen(lcd_menu_material_select);
lcd_lib_draw_string_centerP(16, PSTR("Reading card..."));
lcd_lib_update_screen();
card.initsd();
return;
}
card.setroot();
card.openFile("MATERIAL.TXT", true);
if (!card.isFileOpen())
{
lcd_info_screen(lcd_menu_material_select);
lcd_lib_draw_string_centerP(15, PSTR("No export file"));
lcd_lib_draw_string_centerP(25, PSTR("Found on card."));
lcd_lib_update_screen();
return;
}
char buffer[32];
uint8_t count = 0xFF;
while(card.fgets(buffer, sizeof(buffer)) > 0)
{
buffer[sizeof(buffer)-1] = '\0';
char* c = strchr(buffer, '\n');
if (c) *c = '\0';
if(strcmp_P(buffer, PSTR("[material]")) == 0)
{
count++;
}else if (count < EEPROM_MATERIAL_SETTINGS_MAX_COUNT)
{
c = strchr(buffer, '=');
if (c)
{
*c++ = '\0';
if (strcmp_P(buffer, PSTR("name")) == 0)
{
eeprom_write_block(c, EEPROM_MATERIAL_NAME_OFFSET(count), 8);
}else if (strcmp_P(buffer, PSTR("temperature")) == 0)
{
eeprom_write_word(EEPROM_MATERIAL_TEMPERATURE_OFFSET(count), strtol(c, NULL, 10));
}else if (strcmp_P(buffer, PSTR("bed_temperature")) == 0)
{
eeprom_write_word(EEPROM_MATERIAL_BED_TEMPERATURE_OFFSET(count), strtol(c, NULL, 10));
}else if (strcmp_P(buffer, PSTR("fan_speed")) == 0)
{
eeprom_write_byte(EEPROM_MATERIAL_FAN_SPEED_OFFSET(count), strtol(c, NULL, 10));
}else if (strcmp_P(buffer, PSTR("flow")) == 0)
{
eeprom_write_word(EEPROM_MATERIAL_FLOW_OFFSET(count), strtol(c, NULL, 10));
}else if (strcmp_P(buffer, PSTR("diameter")) == 0)
{
eeprom_write_float(EEPROM_MATERIAL_DIAMETER_OFFSET(count), strtod(c, NULL));
#ifdef USE_CHANGE_TEMPERATURE
}else if (strcmp_P(buffer, PSTR("change_temp")) == 0)
{
eeprom_write_word(EEPROM_MATERIAL_CHANGE_TEMPERATURE(count), strtol(c, NULL, 10));
}else if (strcmp_P(buffer, PSTR("change_wait")) == 0)
{
eeprom_write_byte(EEPROM_MATERIAL_CHANGE_WAIT_TIME(count), strtol(c, NULL, 10));
#endif
}
for(uint8_t nozzle=0; nozzle<MATERIAL_NOZZLE_COUNT; nozzle++)
{
char buffer2[32];
strcpy_P(buffer2, PSTR("temperature_"));
char* ptr = buffer2 + strlen(buffer2);
float_to_string(nozzleIndexToNozzleSize(nozzle), ptr);
if (strcmp(buffer, buffer2) == 0)
{
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(count, nozzle), strtol(c, NULL, 10));
}
strcpy_P(buffer2, PSTR("retraction_length_"));
ptr = buffer2 + strlen(buffer2);
ptr = float_to_string(nozzleIndexToNozzleSize(nozzle), ptr, PSTR("="));
if (strcmp(buffer, buffer2) == 0)
{
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(count, nozzle), atof(c) * EEPROM_RETRACTION_LENGTH_SCALE);
}
strcpy_P(buffer2, PSTR("retraction_speed_"));
ptr = buffer2 + strlen(buffer2);
ptr = float_to_string(nozzleIndexToNozzleSize(nozzle), ptr, PSTR("="));
if (strcmp(buffer, buffer2) == 0)
{
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(count, nozzle), atof(c) * EEPROM_RETRACTION_SPEED_SCALE);
}
}
}
}
}
count++;
if (count > 0)
{
eeprom_write_byte(EEPROM_MATERIAL_COUNT_OFFSET(), count);
}
card.closefile();
currentMenu = lcd_menu_material_import_done;
}
static char* lcd_material_select_callback(uint8_t nr)
{
uint8_t count = eeprom_read_byte(EEPROM_MATERIAL_COUNT_OFFSET());
if (nr == 0)
strcpy_P(card.longFilename, PSTR("< RETURN"));
else if (nr == count + 1)
strcpy_P(card.longFilename, PSTR("Customize"));
else if (nr == count + 2)
strcpy_P(card.longFilename, PSTR("Export to SD"));
else if (nr == count + 3)
strcpy_P(card.longFilename, PSTR("Import from SD"));
else{
eeprom_read_block(card.longFilename, EEPROM_MATERIAL_NAME_OFFSET(nr - 1), 8);
card.longFilename[8] = '\0';
}
return card.longFilename;
}
static void lcd_material_select_details_callback(uint8_t nr)
{
uint8_t count = eeprom_read_byte(EEPROM_MATERIAL_COUNT_OFFSET());
if (nr == 0)
{
}
else if (nr <= count)
{
char buffer[32];
char* c = buffer;
nr -= 1;
if (led_glow_dir)
{
c = float_to_string(eeprom_read_float(EEPROM_MATERIAL_DIAMETER_OFFSET(nr)), c, PSTR("mm"));
while(c < buffer + 10) *c++ = ' ';
strcpy_P(c, PSTR("Flow:"));
c += 5;
c = int_to_string(eeprom_read_word(EEPROM_MATERIAL_FLOW_OFFSET(nr)), c, PSTR("%"));
}else{
c = int_to_string(eeprom_read_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(nr, 0)), c, PSTR("C"));
#if TEMP_SENSOR_BED != 0
*c++ = ' ';
c = int_to_string(eeprom_read_word(EEPROM_MATERIAL_BED_TEMPERATURE_OFFSET(nr)), c, PSTR("C"));
#endif
while(c < buffer + 10) *c++ = ' ';
strcpy_P(c, PSTR("Fan: "));
c += 5;
c = int_to_string(eeprom_read_byte(EEPROM_MATERIAL_FAN_SPEED_OFFSET(nr)), c, PSTR("%"));
}
lcd_lib_draw_string(5, 53, buffer);
}else if (nr == count + 1)
{
lcd_lib_draw_string_centerP(53, PSTR("Modify the settings"));
}else if (nr == count + 2)
{
lcd_lib_draw_string_centerP(53, PSTR("Saves all materials"));
}else if (nr == count + 3)
{
lcd_lib_draw_string_centerP(53, PSTR("Loads all materials"));
}
}
static void lcd_menu_material_select()
{
uint8_t count = eeprom_read_byte(EEPROM_MATERIAL_COUNT_OFFSET());
lcd_scroll_menu(PSTR("MATERIAL"), count + 4, lcd_material_select_callback, lcd_material_select_details_callback);
if (lcd_lib_button_pressed)
{
if (IS_SELECTED_SCROLL(0))
lcd_change_to_menu(lcd_menu_material_main);
else if (IS_SELECTED_SCROLL(count + 1))
lcd_change_to_menu(lcd_menu_material_settings);
else if (IS_SELECTED_SCROLL(count + 2))
lcd_change_to_menu(lcd_menu_material_export);
else if (IS_SELECTED_SCROLL(count + 3))
lcd_change_to_menu(lcd_menu_material_import);
else{
lcd_material_set_material(SELECTED_SCROLL_MENU_ITEM() - 1, active_extruder);
post_change_material_menu = lcd_menu_material_main;
lcd_change_to_menu(lcd_menu_material_selected, MAIN_MENU_ITEM_POS(0));
}
}
}
static void lcd_menu_material_selected()
{
lcd_info_screen(post_change_material_menu, NULL, PSTR("OK"));
lcd_lib_draw_string_centerP(20, PSTR("Selected material:"));
lcd_lib_draw_string_center(30, card.longFilename);
#if EXTRUDERS > 1
if (active_extruder == 0)
lcd_lib_draw_string_centerP(40, PSTR("for primary nozzle"));
else if (active_extruder == 1)
lcd_lib_draw_string_centerP(40, PSTR("for secondary nozzle"));
#endif
lcd_lib_update_screen();
}
static char* lcd_material_settings_callback(uint8_t nr)
{
if (nr == 0)
strcpy_P(card.longFilename, PSTR("< RETURN"));
else if (nr == 1)
strcpy_P(card.longFilename, PSTR("Temperature"));
#if TEMP_SENSOR_BED != 0
else if (nr == 2)
strcpy_P(card.longFilename, PSTR("Heated buildplate"));
#endif
else if (nr == 2 + BED_MENU_OFFSET)
strcpy_P(card.longFilename, PSTR("Diameter"));
else if (nr == 3 + BED_MENU_OFFSET)
strcpy_P(card.longFilename, PSTR("Fan"));
else if (nr == 4 + BED_MENU_OFFSET)
strcpy_P(card.longFilename, PSTR("Flow %"));
#ifdef USE_CHANGE_TEMPERATURE
else if (nr == 5 + BED_MENU_OFFSET)
strcpy_P(card.longFilename, PSTR("Change temperature"));
else if (nr == 6 + BED_MENU_OFFSET)
strcpy_P(card.longFilename, PSTR("Change wait time"));
#endif
else if (nr == 5 + USE_CHANGE_TEMPERATURE_MENU_OFFSET + BED_MENU_OFFSET)
strcpy_P(card.longFilename, PSTR("Retraction"));
else if (nr == 6 + USE_CHANGE_TEMPERATURE_MENU_OFFSET + BED_MENU_OFFSET)
strcpy_P(card.longFilename, PSTR("Store as preset"));
else
strcpy_P(card.longFilename, PSTR("???"));
return card.longFilename;
}
static void lcd_material_settings_details_callback(uint8_t nr)
{
char buffer[20];
buffer[0] = '\0';
if (nr == 0)
{
return;
}else if (nr == 1)
{
if (led_glow_dir)
{
char* c = buffer;
for(uint8_t n=0; n<3; n++)
c = int_to_string(material[active_extruder].temperature[n], c, PSTR("C "));
}else{
char* c = buffer;
for(uint8_t n=3; n<MATERIAL_NOZZLE_COUNT; n++)
c = int_to_string(material[active_extruder].temperature[n], c, PSTR("C "));
}
#if TEMP_SENSOR_BED != 0
}else if (nr == 2)
{
int_to_string(material[active_extruder].bed_temperature, buffer, PSTR("C"));
#endif
}else if (nr == 2 + BED_MENU_OFFSET)
{
float_to_string(material[active_extruder].diameter, buffer, PSTR("mm"));
}else if (nr == 3 + BED_MENU_OFFSET)
{
int_to_string(material[active_extruder].fan_speed, buffer, PSTR("%"));
}else if (nr == 4 + BED_MENU_OFFSET)
{
int_to_string(material[active_extruder].flow, buffer, PSTR("%"));
#ifdef USE_CHANGE_TEMPERATURE
}else if (nr == 5 + BED_MENU_OFFSET)
{
int_to_string(material[active_extruder].change_temperature, buffer, PSTR("C"));
}else if (nr == 6 + BED_MENU_OFFSET)
{
int_to_string(material[active_extruder].change_preheat_wait_time, buffer, PSTR("Sec"));
#endif
}
lcd_lib_draw_string(5, 53, buffer);
}
static void lcd_menu_material_settings()
{
lcd_scroll_menu(PSTR("MATERIAL"), 7 + USE_CHANGE_TEMPERATURE_MENU_OFFSET + BED_MENU_OFFSET, lcd_material_settings_callback, lcd_material_settings_details_callback);
if (lcd_lib_button_pressed)
{
if (IS_SELECTED_SCROLL(0))
{
lcd_change_to_menu(lcd_menu_material_main);
lcd_material_store_current_material();
}else if (IS_SELECTED_SCROLL(1))
{
//LCD_EDIT_SETTING(material[active_extruder].temperature[0], "Temperature", "C", 0, HEATER_0_MAXTEMP - 15);
lcd_change_to_menu(lcd_menu_material_temperature_settings);
}
#if TEMP_SENSOR_BED != 0
else if (IS_SELECTED_SCROLL(2))
LCD_EDIT_SETTING(material[active_extruder].bed_temperature, "Buildplate Temp.", "C", 0, BED_MAXTEMP - 15);
#endif
else if (IS_SELECTED_SCROLL(2 + BED_MENU_OFFSET))
LCD_EDIT_SETTING_FLOAT001(material[active_extruder].diameter, "Material Diameter", "mm", 0, 100);
else if (IS_SELECTED_SCROLL(3 + BED_MENU_OFFSET))
LCD_EDIT_SETTING(material[active_extruder].fan_speed, "Fan speed", "%", 0, 100);
else if (IS_SELECTED_SCROLL(4 + BED_MENU_OFFSET))
LCD_EDIT_SETTING(material[active_extruder].flow, "Material flow", "%", 1, 1000);
#ifdef USE_CHANGE_TEMPERATURE
else if (IS_SELECTED_SCROLL(5 + BED_MENU_OFFSET))
LCD_EDIT_SETTING(material[active_extruder].change_temperature, "Change temperature", "C", 0, HEATER_0_MAXTEMP - 15);
else if (IS_SELECTED_SCROLL(6 + BED_MENU_OFFSET))
LCD_EDIT_SETTING(material[active_extruder].change_preheat_wait_time, "Change wait time", "sec", 0, 180);
#endif
else if (IS_SELECTED_SCROLL(5 + USE_CHANGE_TEMPERATURE_MENU_OFFSET + BED_MENU_OFFSET))
lcd_change_to_menu(lcd_menu_material_retraction_settings);
else if (IS_SELECTED_SCROLL(6 + USE_CHANGE_TEMPERATURE_MENU_OFFSET + BED_MENU_OFFSET))
lcd_change_to_menu(lcd_menu_material_settings_store);
}
}
static char* lcd_material_temperature_settings_callback(uint8_t nr)
{
if (nr == 0)
{
strcpy_P(card.longFilename, PSTR("< RETURN"));
}
else
{
strcpy_P(card.longFilename, PSTR("Temperature: "));
float_to_string(nozzleIndexToNozzleSize(nr - 1), card.longFilename + strlen(card.longFilename));
}
return card.longFilename;
}
static void lcd_material_settings_temperature_details_callback(uint8_t nr)
{
char buffer[10];
buffer[0] = '\0';
if (nr == 0)
return;
int_to_string(material[active_extruder].temperature[nr - 1], buffer, PSTR("C"));
lcd_lib_draw_string(5, 53, buffer);
}
static void lcd_menu_material_temperature_settings()
{
lcd_scroll_menu(PSTR("MATERIAL"), 1 + MATERIAL_NOZZLE_COUNT, lcd_material_temperature_settings_callback, lcd_material_settings_temperature_details_callback);
if (lcd_lib_button_pressed)
{
if (IS_SELECTED_SCROLL(0))
{
lcd_change_to_menu(lcd_menu_material_settings);
}else{
uint8_t index = SELECTED_SCROLL_MENU_ITEM() - 1;
LCD_EDIT_SETTING(material[active_extruder].temperature[index], "Temperature", "C", 0, HEATER_0_MAXTEMP - 15);
previousMenu = lcd_menu_material_settings;
previousEncoderPos = SCROLL_MENU_ITEM_POS(1);
}
}
}
static char* lcd_material_retraction_settings_callback(uint8_t nr)
{
if (nr == 0)
{
strcpy_P(card.longFilename, PSTR("< RETURN"));
}
else
{
strcpy_P(card.longFilename, PSTR("Retraction: "));
float_to_string(nozzleIndexToNozzleSize(nr - 1), card.longFilename + strlen(card.longFilename));
}
return card.longFilename;
}
static void lcd_material_settings_retraction_details_callback(uint8_t nr)
{
char buffer[20];
buffer[0] = '\0';
if (nr == 0)
return;
char* c = float_to_string(material[active_extruder].retraction_length[nr - 1], buffer, PSTR("mm "));
int_to_string(material[active_extruder].retraction_speed[nr - 1] / 60.0 + 0.5, c, PSTR("mm/s"));
lcd_lib_draw_string(5, 53, buffer);
}
static void lcd_menu_material_retraction_settings()
{
lcd_scroll_menu(PSTR("MATERIAL"), 1 + MATERIAL_NOZZLE_COUNT, lcd_material_retraction_settings_callback, lcd_material_settings_retraction_details_callback);
if (lcd_lib_button_pressed)
{
if (IS_SELECTED_SCROLL(0))
{
lcd_change_to_menu(lcd_menu_material_settings);
}else{
nozzle_select_index = SELECTED_SCROLL_MENU_ITEM() - 1;
lcd_change_to_menu(lcd_menu_material_retraction_settings_per_nozzle);
}
}
}
static char* lcd_retraction_item_per_nozzle(uint8_t nr)
{
if (nr == 0)
strcpy_P(card.longFilename, PSTR("< RETURN"));
else if (nr == 1)
strcpy_P(card.longFilename, PSTR("Retract length"));
else if (nr == 2)
strcpy_P(card.longFilename, PSTR("Retract speed"));
else
strcpy_P(card.longFilename, PSTR("???"));
return card.longFilename;
}
static void lcd_retraction_details_per_nozzle(uint8_t nr)
{
char buffer[16];
if (nr == 0)
return;
else if(nr == 1)
float_to_string(material[active_extruder].retraction_length[nozzle_select_index], buffer, PSTR("mm"));
else if(nr == 2)
int_to_string(material[active_extruder].retraction_speed[nozzle_select_index] / 60 + 0.5, buffer, PSTR("mm/sec"));
lcd_lib_draw_string(5, 53, buffer);
}
static void lcd_menu_material_retraction_settings_per_nozzle()
{
lcd_scroll_menu(PSTR("RETRACTION"), 3, lcd_retraction_item_per_nozzle, lcd_retraction_details_per_nozzle);
if (lcd_lib_button_pressed)
{
if (IS_SELECTED_SCROLL(0))
lcd_change_to_menu(lcd_menu_material_retraction_settings);
else if (IS_SELECTED_SCROLL(1))
LCD_EDIT_SETTING_FLOAT001(material[active_extruder].retraction_length[nozzle_select_index], "Retract length", "mm", 0, 50);
else if (IS_SELECTED_SCROLL(2))
LCD_EDIT_SETTING_SPEED(material[active_extruder].retraction_speed[nozzle_select_index], "Retract speed", "mm/sec", 0, max_feedrate[E_AXIS] * 60);
}
}
static char* lcd_menu_material_settings_store_callback(uint8_t nr)
{
uint8_t count = eeprom_read_byte(EEPROM_MATERIAL_COUNT_OFFSET());
if (nr == 0)
strcpy_P(card.longFilename, PSTR("< RETURN"));
else if (nr > count)
strcpy_P(card.longFilename, PSTR("New preset"));
else{
eeprom_read_block(card.longFilename, EEPROM_MATERIAL_NAME_OFFSET(nr - 1), 8);
card.longFilename[8] = '\0';
}
return card.longFilename;
}
static void lcd_menu_material_settings_store_details_callback(uint8_t nr)
{
}
static void lcd_menu_material_settings_store()
{
uint8_t count = eeprom_read_byte(EEPROM_MATERIAL_COUNT_OFFSET());
if (count == EEPROM_MATERIAL_SETTINGS_MAX_COUNT)
count--;
lcd_scroll_menu(PSTR("PRESETS"), 2 + count, lcd_menu_material_settings_store_callback, lcd_menu_material_settings_store_details_callback);
if (lcd_lib_button_pressed)
{
if (!IS_SELECTED_SCROLL(0))
{
uint8_t idx = SELECTED_SCROLL_MENU_ITEM() - 1;
if (idx == count)
{
char buffer[9] = "CUSTOM";
int_to_string(idx - 1, buffer + 6);
eeprom_write_block(buffer, EEPROM_MATERIAL_NAME_OFFSET(idx), 8);
eeprom_write_byte(EEPROM_MATERIAL_COUNT_OFFSET(), idx + 1);
}
lcd_material_store_material(idx);
}
lcd_change_to_menu(lcd_menu_material_settings, SCROLL_MENU_ITEM_POS(6));
}
}
void lcd_material_reset_defaults()
{
//Fill in the defaults
char buffer[8];
strcpy_P(buffer, PSTR("PLA"));
eeprom_write_block(buffer, EEPROM_MATERIAL_NAME_OFFSET(0), 4);
eeprom_write_word(EEPROM_MATERIAL_TEMPERATURE_OFFSET(0), 210);
eeprom_write_word(EEPROM_MATERIAL_BED_TEMPERATURE_OFFSET(0), 60);
eeprom_write_byte(EEPROM_MATERIAL_FAN_SPEED_OFFSET(0), 100);
eeprom_write_word(EEPROM_MATERIAL_FLOW_OFFSET(0), 100);
eeprom_write_float(EEPROM_MATERIAL_DIAMETER_OFFSET(0), 2.85);
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(0, 0), 210);//0.4
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(0, 1), 195);//0.25
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(0, 2), 230);//0.6
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(0, 3), 240);//0.8
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(0, 4), 240);//1.0
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(0, 0), (6.5 * EEPROM_RETRACTION_LENGTH_SCALE));//0.4
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(0, 1), (6.5 * EEPROM_RETRACTION_LENGTH_SCALE));//0.25
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(0, 2), (6.5 * EEPROM_RETRACTION_LENGTH_SCALE));//0.6
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(0, 3), (6.5 * EEPROM_RETRACTION_LENGTH_SCALE));//0.8
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(0, 4), (6.5 * EEPROM_RETRACTION_LENGTH_SCALE));//1.0
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(0, 0), (25 * EEPROM_RETRACTION_SPEED_SCALE));//0.4
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(0, 1), (25 * EEPROM_RETRACTION_SPEED_SCALE));//0.25
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(0, 2), (25 * EEPROM_RETRACTION_SPEED_SCALE));//0.6
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(0, 3), (25 * EEPROM_RETRACTION_SPEED_SCALE));//0.8
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(0, 4), (25 * EEPROM_RETRACTION_SPEED_SCALE));//1.0
eeprom_write_word(EEPROM_MATERIAL_CHANGE_TEMPERATURE(0), 70);
eeprom_write_byte(EEPROM_MATERIAL_CHANGE_WAIT_TIME(0), 30);
strcpy_P(buffer, PSTR("ABS"));
eeprom_write_block(buffer, EEPROM_MATERIAL_NAME_OFFSET(1), 4);
eeprom_write_word(EEPROM_MATERIAL_TEMPERATURE_OFFSET(1), 260);
eeprom_write_word(EEPROM_MATERIAL_BED_TEMPERATURE_OFFSET(1), 80);
eeprom_write_byte(EEPROM_MATERIAL_FAN_SPEED_OFFSET(1), 100);
eeprom_write_word(EEPROM_MATERIAL_FLOW_OFFSET(1), 107);
eeprom_write_float(EEPROM_MATERIAL_DIAMETER_OFFSET(1), 2.85);
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(1, 0), 250);//0.4
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(1, 1), 245);//0.25
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(1, 2), 260);//0.6
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(1, 3), 260);//0.8
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(1, 4), 260);//1.0
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(1, 0), (6.5 * EEPROM_RETRACTION_LENGTH_SCALE));//0.4
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(1, 1), (6.5 * EEPROM_RETRACTION_LENGTH_SCALE));//0.25
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(1, 2), (6.5 * EEPROM_RETRACTION_LENGTH_SCALE));//0.6
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(1, 3), (6.5 * EEPROM_RETRACTION_LENGTH_SCALE));//0.8
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(1, 4), (6.5 * EEPROM_RETRACTION_LENGTH_SCALE));//1.0
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(1, 0), (25 * EEPROM_RETRACTION_SPEED_SCALE));//0.4
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(1, 1), (25 * EEPROM_RETRACTION_SPEED_SCALE));//0.25
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(1, 2), (25 * EEPROM_RETRACTION_SPEED_SCALE));//0.6
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(1, 3), (25 * EEPROM_RETRACTION_SPEED_SCALE));//0.8
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(1, 4), (25 * EEPROM_RETRACTION_SPEED_SCALE));//1.0
eeprom_write_word(EEPROM_MATERIAL_CHANGE_TEMPERATURE(1), 90);
eeprom_write_byte(EEPROM_MATERIAL_CHANGE_WAIT_TIME(1), 30);
strcpy_P(buffer, PSTR("CPE"));
eeprom_write_block(buffer, EEPROM_MATERIAL_NAME_OFFSET(2), 4);
eeprom_write_word(EEPROM_MATERIAL_TEMPERATURE_OFFSET(2), 250);
eeprom_write_word(EEPROM_MATERIAL_BED_TEMPERATURE_OFFSET(2), 70);
eeprom_write_byte(EEPROM_MATERIAL_FAN_SPEED_OFFSET(2), 100);
eeprom_write_word(EEPROM_MATERIAL_FLOW_OFFSET(2), 100);
eeprom_write_float(EEPROM_MATERIAL_DIAMETER_OFFSET(2), 2.85);
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(2, 0), 250);//0.4
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(2, 1), 245);//0.25
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(2, 2), 260);//0.6
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(2, 3), 260);//0.8
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(2, 4), 260);//1.0
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(2, 0), (6.5 * EEPROM_RETRACTION_LENGTH_SCALE));//0.4
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(2, 1), (6.5 * EEPROM_RETRACTION_LENGTH_SCALE));//0.25
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(2, 2), (6.5 * EEPROM_RETRACTION_LENGTH_SCALE));//0.6
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(2, 3), (6.5 * EEPROM_RETRACTION_LENGTH_SCALE));//0.8
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(2, 4), (6.5 * EEPROM_RETRACTION_LENGTH_SCALE));//1.0
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(2, 0), (25 * EEPROM_RETRACTION_SPEED_SCALE));//0.4
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(2, 1), (25 * EEPROM_RETRACTION_SPEED_SCALE));//0.25
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(2, 2), (25 * EEPROM_RETRACTION_SPEED_SCALE));//0.6
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(2, 3), (25 * EEPROM_RETRACTION_SPEED_SCALE));//0.8
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(2, 4), (25 * EEPROM_RETRACTION_SPEED_SCALE));//1.0
eeprom_write_word(EEPROM_MATERIAL_CHANGE_TEMPERATURE(2), 85);
eeprom_write_byte(EEPROM_MATERIAL_CHANGE_WAIT_TIME(2), 15);
strcpy_P(buffer, PSTR("PC"));
eeprom_write_block(buffer, EEPROM_MATERIAL_NAME_OFFSET(3), 3);
eeprom_write_word(EEPROM_MATERIAL_TEMPERATURE_OFFSET(3), 260);
eeprom_write_word(EEPROM_MATERIAL_BED_TEMPERATURE_OFFSET(3), 110);
eeprom_write_byte(EEPROM_MATERIAL_FAN_SPEED_OFFSET(3), 100);
eeprom_write_word(EEPROM_MATERIAL_FLOW_OFFSET(3), 100);
eeprom_write_float(EEPROM_MATERIAL_DIAMETER_OFFSET(3), 2.85);
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(3, 0), 260);//0.4
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(3, 1), 260);//0.25
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(3, 2), 260);//0.6
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(3, 3), 260);//0.8
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(3, 4), 260);//1.0
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(3, 0), (6.5 * EEPROM_RETRACTION_LENGTH_SCALE));//0.4
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(3, 1), (6.5 * EEPROM_RETRACTION_LENGTH_SCALE));//0.25
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(3, 2), (6.5 * EEPROM_RETRACTION_LENGTH_SCALE));//0.6
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(3, 3), (6.5 * EEPROM_RETRACTION_LENGTH_SCALE));//0.8
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(3, 4), (6.5 * EEPROM_RETRACTION_LENGTH_SCALE));//1.0
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(3, 0), (25 * EEPROM_RETRACTION_SPEED_SCALE));//0.4
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(3, 1), (25 * EEPROM_RETRACTION_SPEED_SCALE));//0.25
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(3, 2), (25 * EEPROM_RETRACTION_SPEED_SCALE));//0.6
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(3, 3), (25 * EEPROM_RETRACTION_SPEED_SCALE));//0.8
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(3, 4), (25 * EEPROM_RETRACTION_SPEED_SCALE));//1.0
eeprom_write_word(EEPROM_MATERIAL_CHANGE_TEMPERATURE(3), 85);
eeprom_write_byte(EEPROM_MATERIAL_CHANGE_WAIT_TIME(3), 15);
strcpy_P(buffer, PSTR("Nylon"));
eeprom_write_block(buffer, EEPROM_MATERIAL_NAME_OFFSET(4), 6);
eeprom_write_word(EEPROM_MATERIAL_TEMPERATURE_OFFSET(4), 250);
eeprom_write_word(EEPROM_MATERIAL_BED_TEMPERATURE_OFFSET(4), 60);
eeprom_write_byte(EEPROM_MATERIAL_FAN_SPEED_OFFSET(4), 100);
eeprom_write_word(EEPROM_MATERIAL_FLOW_OFFSET(4), 100);
eeprom_write_float(EEPROM_MATERIAL_DIAMETER_OFFSET(4), 2.85);
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(4, 0), 250);//0.4
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(4, 1), 240);//0.25
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(4, 2), 255);//0.6
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(4, 3), 260);//0.8
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(4, 4), 260);//1.0
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(4, 0), (6.5 * EEPROM_RETRACTION_LENGTH_SCALE));//0.4
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(4, 1), (6.5 * EEPROM_RETRACTION_LENGTH_SCALE));//0.25
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(4, 2), (6.5 * EEPROM_RETRACTION_LENGTH_SCALE));//0.6
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(4, 3), (6.5 * EEPROM_RETRACTION_LENGTH_SCALE));//0.8
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(4, 4), (6.5 * EEPROM_RETRACTION_LENGTH_SCALE));//1.0
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(4, 0), (25 * EEPROM_RETRACTION_SPEED_SCALE));//0.4
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(4, 1), (25 * EEPROM_RETRACTION_SPEED_SCALE));//0.25
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(4, 2), (25 * EEPROM_RETRACTION_SPEED_SCALE));//0.6
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(4, 3), (25 * EEPROM_RETRACTION_SPEED_SCALE));//0.8
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(4, 4), (25 * EEPROM_RETRACTION_SPEED_SCALE));//1.0
eeprom_write_word(EEPROM_MATERIAL_CHANGE_TEMPERATURE(4), 85);
eeprom_write_byte(EEPROM_MATERIAL_CHANGE_WAIT_TIME(4), 15);
strcpy_P(buffer, PSTR("CPE+"));
eeprom_write_block(buffer, EEPROM_MATERIAL_NAME_OFFSET(5), 5);
eeprom_write_word(EEPROM_MATERIAL_TEMPERATURE_OFFSET(5), 260);
eeprom_write_word(EEPROM_MATERIAL_BED_TEMPERATURE_OFFSET(5), 110);
eeprom_write_byte(EEPROM_MATERIAL_FAN_SPEED_OFFSET(5), 100);
eeprom_write_word(EEPROM_MATERIAL_FLOW_OFFSET(5), 100);
eeprom_write_float(EEPROM_MATERIAL_DIAMETER_OFFSET(5), 2.85);
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(5, 0), 260);//0.4
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(5, 1), 260);//0.25
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(5, 2), 260);//0.6
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(5, 3), 260);//0.8
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(5, 4), 260);//1.0
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(5, 0), (6.5 * EEPROM_RETRACTION_LENGTH_SCALE));//0.4
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(5, 1), (6.5 * EEPROM_RETRACTION_LENGTH_SCALE));//0.25
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(5, 2), (6.5 * EEPROM_RETRACTION_LENGTH_SCALE));//0.6
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(5, 3), (6.5 * EEPROM_RETRACTION_LENGTH_SCALE));//0.8
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(5, 4), (6.5 * EEPROM_RETRACTION_LENGTH_SCALE));//1.0
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(5, 0), (25 * EEPROM_RETRACTION_SPEED_SCALE));//0.4
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(5, 1), (25 * EEPROM_RETRACTION_SPEED_SCALE));//0.25
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(5, 2), (25 * EEPROM_RETRACTION_SPEED_SCALE));//0.6
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(5, 3), (25 * EEPROM_RETRACTION_SPEED_SCALE));//0.8
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(5, 4), (25 * EEPROM_RETRACTION_SPEED_SCALE));//1.0
eeprom_write_word(EEPROM_MATERIAL_CHANGE_TEMPERATURE(5), 85);
eeprom_write_byte(EEPROM_MATERIAL_CHANGE_WAIT_TIME(5), 15);
strcpy_P(buffer, PSTR("TPU 95A"));
eeprom_write_block(buffer, EEPROM_MATERIAL_NAME_OFFSET(6), 8);
eeprom_write_word(EEPROM_MATERIAL_TEMPERATURE_OFFSET(6), 235);
eeprom_write_word(EEPROM_MATERIAL_BED_TEMPERATURE_OFFSET(6), 70);
eeprom_write_byte(EEPROM_MATERIAL_FAN_SPEED_OFFSET(6), 100);
eeprom_write_word(EEPROM_MATERIAL_FLOW_OFFSET(6), 100);
eeprom_write_float(EEPROM_MATERIAL_DIAMETER_OFFSET(6), 2.85);
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(6, 0), 235);//0.4
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(6, 1), 235);//0.25
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(6, 2), 235);//0.6
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(6, 3), 235);//0.8
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(6, 4), 235);//1.0
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(6, 0), (10.0 * EEPROM_RETRACTION_LENGTH_SCALE));//0.4
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(6, 1), (10.0 * EEPROM_RETRACTION_LENGTH_SCALE));//0.25
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(6, 2), (10.0 * EEPROM_RETRACTION_LENGTH_SCALE));//0.6
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(6, 3), (10.0 * EEPROM_RETRACTION_LENGTH_SCALE));//0.8
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(6, 4), (10.0 * EEPROM_RETRACTION_LENGTH_SCALE));//1.0
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(6, 0), (25 * EEPROM_RETRACTION_SPEED_SCALE));//0.4
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(6, 1), (25 * EEPROM_RETRACTION_SPEED_SCALE));//0.25
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(6, 2), (25 * EEPROM_RETRACTION_SPEED_SCALE));//0.6
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(6, 3), (25 * EEPROM_RETRACTION_SPEED_SCALE));//0.8
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(6, 4), (25 * EEPROM_RETRACTION_SPEED_SCALE));//1.0
eeprom_write_word(EEPROM_MATERIAL_CHANGE_TEMPERATURE(6), 85);
eeprom_write_byte(EEPROM_MATERIAL_CHANGE_WAIT_TIME(6), 15);
eeprom_write_byte(EEPROM_MATERIAL_COUNT_OFFSET(), 7);
for(uint8_t m=0; m<5; m++)
{
for(uint8_t n=MATERIAL_NOZZLE_COUNT; n<MAX_MATERIAL_NOZZLE_CONFIGURATIONS; n++)
{
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(m, n), 0);
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(m, n), (0.0 * EEPROM_RETRACTION_LENGTH_SCALE));
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(m, n), (0 * EEPROM_RETRACTION_SPEED_SCALE));
}
}
}
void lcd_material_set_material(uint8_t nr, uint8_t e)
{
material[e].temperature[0] = eeprom_read_word(EEPROM_MATERIAL_TEMPERATURE_OFFSET(nr));
#if TEMP_SENSOR_BED != 0
material[e].bed_temperature = eeprom_read_word(EEPROM_MATERIAL_BED_TEMPERATURE_OFFSET(nr));
#endif
material[e].flow = eeprom_read_word(EEPROM_MATERIAL_FLOW_OFFSET(nr));
material[e].fan_speed = eeprom_read_byte(EEPROM_MATERIAL_FAN_SPEED_OFFSET(nr));
material[e].diameter = eeprom_read_float(EEPROM_MATERIAL_DIAMETER_OFFSET(nr));
eeprom_read_block(material[e].name, EEPROM_MATERIAL_NAME_OFFSET(nr), MATERIAL_NAME_SIZE);
material[e].name[MATERIAL_NAME_SIZE - 1] = '\0';
strcpy(card.longFilename, material[e].name);
for(uint8_t n=0; n<MAX_MATERIAL_NOZZLE_CONFIGURATIONS; n++)
{
material[e].temperature[n] = eeprom_read_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(nr, n));
if (material[e].temperature[n] > HEATER_0_MAXTEMP - 15)
material[e].temperature[n] = HEATER_0_MAXTEMP - 15;
material[e].retraction_length[n] = float(eeprom_read_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(nr, n))) / EEPROM_RETRACTION_LENGTH_SCALE;
material[e].retraction_speed[n] = float(eeprom_read_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(nr, n))) / EEPROM_RETRACTION_SPEED_SCALE * 60;
}
#if TEMP_SENSOR_BED != 0
if (material[e].bed_temperature > BED_MAXTEMP - 15)
material[e].bed_temperature = BED_MAXTEMP - 15;
#endif
material[e].change_temperature = eeprom_read_word(EEPROM_MATERIAL_CHANGE_TEMPERATURE(nr));
material[e].change_preheat_wait_time = eeprom_read_byte(EEPROM_MATERIAL_CHANGE_WAIT_TIME(nr));
if (material[e].change_temperature < 10)
material[e].change_temperature = material[e].temperature[0];
lcd_material_store_current_material();
}
void lcd_material_store_material(uint8_t nr)
{
eeprom_write_word(EEPROM_MATERIAL_TEMPERATURE_OFFSET(nr), material[active_extruder].temperature[0]);
#if TEMP_SENSOR_BED != 0
eeprom_write_word(EEPROM_MATERIAL_BED_TEMPERATURE_OFFSET(nr), material[active_extruder].bed_temperature);
#endif
eeprom_write_word(EEPROM_MATERIAL_FLOW_OFFSET(nr), material[active_extruder].flow);
eeprom_write_byte(EEPROM_MATERIAL_FAN_SPEED_OFFSET(nr), material[active_extruder].fan_speed);
eeprom_write_float(EEPROM_MATERIAL_DIAMETER_OFFSET(nr), material[active_extruder].diameter);
//eeprom_write_block(card.longFilename, EEPROM_MATERIAL_NAME_OFFSET(nr), 8);
for(uint8_t n=0; n<MAX_MATERIAL_NOZZLE_CONFIGURATIONS; n++)
{
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(nr, n), material[active_extruder].temperature[n]);
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(nr, n), material[active_extruder].retraction_length[n] * EEPROM_RETRACTION_LENGTH_SCALE);
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(nr, n), material[active_extruder].retraction_speed[n] / 60.0 * EEPROM_RETRACTION_SPEED_SCALE);
}
eeprom_write_word(EEPROM_MATERIAL_CHANGE_TEMPERATURE(nr), material[active_extruder].change_temperature);
eeprom_write_byte(EEPROM_MATERIAL_CHANGE_WAIT_TIME(nr), material[active_extruder].change_preheat_wait_time);
}
void lcd_material_read_current_material()
{
for(uint8_t e=0; e<EXTRUDERS; e++)
{
//material[e].temperature[0] = eeprom_read_word(EEPROM_MATERIAL_TEMPERATURE_OFFSET(EEPROM_MATERIAL_SETTINGS_MAX_COUNT+e));
#if TEMP_SENSOR_BED != 0
material[e].bed_temperature = eeprom_read_word(EEPROM_MATERIAL_BED_TEMPERATURE_OFFSET(EEPROM_MATERIAL_SETTINGS_MAX_COUNT+e));
#endif
material[e].flow = eeprom_read_word(EEPROM_MATERIAL_FLOW_OFFSET(EEPROM_MATERIAL_SETTINGS_MAX_COUNT+e));
material[e].fan_speed = eeprom_read_byte(EEPROM_MATERIAL_FAN_SPEED_OFFSET(EEPROM_MATERIAL_SETTINGS_MAX_COUNT+e));
material[e].diameter = eeprom_read_float(EEPROM_MATERIAL_DIAMETER_OFFSET(EEPROM_MATERIAL_SETTINGS_MAX_COUNT+e));
for(uint8_t n=0; n<MAX_MATERIAL_NOZZLE_CONFIGURATIONS; n++)
{
material[e].temperature[n] = eeprom_read_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(EEPROM_MATERIAL_SETTINGS_MAX_COUNT+e, n));
material[e].retraction_length[n] = float(eeprom_read_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(EEPROM_MATERIAL_SETTINGS_MAX_COUNT+e, n))) / EEPROM_RETRACTION_LENGTH_SCALE;
material[e].retraction_speed[n] = float(eeprom_read_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(EEPROM_MATERIAL_SETTINGS_MAX_COUNT+e, n))) / EEPROM_RETRACTION_SPEED_SCALE * 60;
}
eeprom_read_block(material[e].name, EEPROM_MATERIAL_NAME_OFFSET(EEPROM_MATERIAL_SETTINGS_MAX_COUNT+e), MATERIAL_NAME_SIZE);
material[e].name[MATERIAL_NAME_SIZE - 1] = '\0';
material[e].change_temperature = eeprom_read_word(EEPROM_MATERIAL_CHANGE_TEMPERATURE(EEPROM_MATERIAL_SETTINGS_MAX_COUNT+e));
material[e].change_preheat_wait_time = eeprom_read_byte(EEPROM_MATERIAL_CHANGE_WAIT_TIME(EEPROM_MATERIAL_SETTINGS_MAX_COUNT+e));
if (material[e].change_temperature < 10)
material[e].change_temperature = material[e].temperature[0];
}
}
void lcd_material_store_current_material()
{
for(uint8_t e=0; e<EXTRUDERS; e++)
{
eeprom_write_word(EEPROM_MATERIAL_TEMPERATURE_OFFSET(EEPROM_MATERIAL_SETTINGS_MAX_COUNT+e), material[e].temperature[0]);
#if TEMP_SENSOR_BED != 0
eeprom_write_word(EEPROM_MATERIAL_BED_TEMPERATURE_OFFSET(EEPROM_MATERIAL_SETTINGS_MAX_COUNT+e), material[e].bed_temperature);
#endif
eeprom_write_byte(EEPROM_MATERIAL_FAN_SPEED_OFFSET(EEPROM_MATERIAL_SETTINGS_MAX_COUNT+e), material[e].fan_speed);
eeprom_write_word(EEPROM_MATERIAL_FLOW_OFFSET(EEPROM_MATERIAL_SETTINGS_MAX_COUNT+e), material[e].flow);
eeprom_write_float(EEPROM_MATERIAL_DIAMETER_OFFSET(EEPROM_MATERIAL_SETTINGS_MAX_COUNT+e), material[e].diameter);
for(uint8_t n=0; n<MAX_MATERIAL_NOZZLE_CONFIGURATIONS; n++)
{
eeprom_write_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(EEPROM_MATERIAL_SETTINGS_MAX_COUNT+e, n), material[active_extruder].temperature[n]);
eeprom_write_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(EEPROM_MATERIAL_SETTINGS_MAX_COUNT+e, n), material[active_extruder].retraction_length[n] * EEPROM_RETRACTION_LENGTH_SCALE);
eeprom_write_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(EEPROM_MATERIAL_SETTINGS_MAX_COUNT+e, n), material[active_extruder].retraction_speed[n] / 60.0 * EEPROM_RETRACTION_SPEED_SCALE);
}
eeprom_write_block(material[e].name, EEPROM_MATERIAL_NAME_OFFSET(EEPROM_MATERIAL_SETTINGS_MAX_COUNT+e), MATERIAL_NAME_SIZE);
eeprom_write_word(EEPROM_MATERIAL_CHANGE_TEMPERATURE(EEPROM_MATERIAL_SETTINGS_MAX_COUNT+e), material[e].change_temperature);
eeprom_write_byte(EEPROM_MATERIAL_CHANGE_WAIT_TIME(EEPROM_MATERIAL_SETTINGS_MAX_COUNT+e), material[e].change_preheat_wait_time);
}
}
bool lcd_material_verify_material_settings()
{
uint8_t cnt = eeprom_read_byte(EEPROM_MATERIAL_COUNT_OFFSET());
if (cnt < 2 || cnt > EEPROM_MATERIAL_SETTINGS_MAX_COUNT)
return false;
while(cnt > 0)
{
cnt --;
if (eeprom_read_word(EEPROM_MATERIAL_TEMPERATURE_OFFSET(cnt)) > HEATER_0_MAXTEMP)
return false;
#if TEMP_SENSOR_BED != 0
if (eeprom_read_word(EEPROM_MATERIAL_BED_TEMPERATURE_OFFSET(cnt)) > BED_MAXTEMP)
return false;
#endif
if (eeprom_read_byte(EEPROM_MATERIAL_FAN_SPEED_OFFSET(cnt)) > 100)
return false;
if (eeprom_read_word(EEPROM_MATERIAL_FLOW_OFFSET(cnt)) > 1000)
return false;
if (eeprom_read_float(EEPROM_MATERIAL_DIAMETER_OFFSET(cnt)) > 10.0)
return false;
if (eeprom_read_float(EEPROM_MATERIAL_DIAMETER_OFFSET(cnt)) < 0.1)
return false;
for(uint8_t n=0; n<MATERIAL_NOZZLE_COUNT; n++)
{
if (eeprom_read_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(cnt, n)) > HEATER_0_MAXTEMP)
return false;
if (eeprom_read_word(EEPROM_MATERIAL_EXTRA_TEMPERATURE_OFFSET(cnt, n)) == 0)
return false;
//More then 20mm retraction is not a valid value
if (eeprom_read_word(EEPROM_MATERIAL_EXTRA_RETRACTION_LENGTH_OFFSET(cnt, n)) > (20 * EEPROM_RETRACTION_LENGTH_SCALE))
return false;
//More then 45mm/s is not a valid value
if (eeprom_read_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(cnt, n)) > (45 * EEPROM_RETRACTION_SPEED_SCALE))
return false;
if (eeprom_read_byte(EEPROM_MATERIAL_EXTRA_RETRACTION_SPEED_OFFSET(cnt, n)) == 0)
return false;
}
if (eeprom_read_word(EEPROM_MATERIAL_CHANGE_TEMPERATURE(cnt)) > HEATER_0_MAXTEMP || eeprom_read_word(EEPROM_MATERIAL_CHANGE_TEMPERATURE(cnt)) < 10)
{
//Invalid temperature for change temperature.
if (strcmp_P(card.longFilename, PSTR("PLA")) == 0)
{
eeprom_write_word(EEPROM_MATERIAL_CHANGE_TEMPERATURE(cnt), 70);
eeprom_write_byte(EEPROM_MATERIAL_CHANGE_WAIT_TIME(cnt), 30);
}else if (strcmp_P(card.longFilename, PSTR("ABS")) == 0)
{
eeprom_write_word(EEPROM_MATERIAL_CHANGE_TEMPERATURE(cnt), 90);
eeprom_write_byte(EEPROM_MATERIAL_CHANGE_WAIT_TIME(cnt), 30);
}else if (strcmp_P(card.longFilename, PSTR("CPE")) == 0)
{
eeprom_write_word(EEPROM_MATERIAL_CHANGE_TEMPERATURE(cnt), 85);
eeprom_write_byte(EEPROM_MATERIAL_CHANGE_WAIT_TIME(cnt), 15);
}else{
eeprom_write_word(EEPROM_MATERIAL_CHANGE_TEMPERATURE(cnt), eeprom_read_word(EEPROM_MATERIAL_TEMPERATURE_OFFSET(cnt)));
eeprom_write_byte(EEPROM_MATERIAL_CHANGE_WAIT_TIME(cnt), 5);
}
}
}
return true;
}
uint8_t nozzleSizeToTemperatureIndex(float nozzle_size)
{
if (fabs(nozzle_size - 0.25) < 0.05)
return 1;
if (fabs(nozzle_size - 0.60) < 0.1)
return 2;
if (fabs(nozzle_size - 0.80) < 0.1)
return 3;
if (fabs(nozzle_size - 1.00) < 0.1)
return 4;
//Default to index 0
return 0;
}
float nozzleIndexToNozzleSize(uint8_t nozzle_index)
{
switch(nozzle_index)
{
case 0:
return 0.4;
case 1:
return 0.25;
case 2:
return 0.6;
case 3:
return 0.8;
case 4:
return 1.0;
}
return 0.0;
}
#endif//ENABLE_ULTILCD2