diff --git a/.gitignore b/.gitignore index bbd9b9ac2..dec628d07 100644 --- a/.gitignore +++ b/.gitignore @@ -51,3 +51,4 @@ Firmware/Doc /build-env/ /Firmware/Firmware.vcxproj /Firmware/Configuration_prusa_bckp.h +/Firmware/variants/printers.h diff --git a/Firmware/Configuration.cpp b/Firmware/Configuration.cpp new file mode 100644 index 000000000..f87849285 --- /dev/null +++ b/Firmware/Configuration.cpp @@ -0,0 +1,10 @@ +#include "Configuration.h" +#include "Configuration_prusa.h" + +const uint16_t _nPrinterType PROGMEM=PRINTER_TYPE; +const char _sPrinterName[] PROGMEM=PRINTER_NAME; +const uint16_t _nPrinterMmuType PROGMEM=PRINTER_MMU_TYPE; +const char _sPrinterMmuName[] PROGMEM=PRINTER_MMU_NAME; + +uint16_t nPrinterType; +PGM_P sPrinterName; \ No newline at end of file diff --git a/Firmware/Configuration.h b/Firmware/Configuration.h index eee1b1672..af89dea9c 100644 --- a/Firmware/Configuration.h +++ b/Firmware/Configuration.h @@ -6,6 +6,15 @@ #define STR_HELPER(x) #x #define STR(x) STR_HELPER(x) +//-// +#include +extern const uint16_t _nPrinterType; +extern const char _sPrinterName[] PROGMEM; +extern const uint16_t _nPrinterMmuType; +extern const char _sPrinterMmuName[] PROGMEM; +extern uint16_t nPrinterType; +extern PGM_P sPrinterName; + // Firmware version #define FW_VERSION "3.7.2-RC1" #define FW_COMMIT_NR 2359 @@ -15,6 +24,9 @@ #define FW_REPOSITORY "Unknown" #define FW_VERSION_FULL FW_VERSION "-" STR(FW_COMMIT_NR) +// G-code language level +#define GCODE_LEVEL 1 + // Debug version has debugging enabled (the symbol DEBUG_BUILD is set). // The debug build may be a bit slower than the non-debug build, therefore the debug build should // not be shipped to a customer. diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index ef082b139..4992f183f 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -43,8 +43,10 @@ * */ +//-// +#include "Configuration.h" #include "Marlin.h" - + #ifdef ENABLE_AUTO_BED_LEVELING #include "vector_3.h" #ifdef AUTO_BED_LEVELING_GRID @@ -1632,6 +1634,7 @@ void setup() } #endif //UVLO_SUPPORT fCheckModeInit(); + fSetMmuMode(mmu_enabled); KEEPALIVE_STATE(NOT_BUSY); #ifdef WATCHDOG wdt_enable(WDTO_4S); @@ -3644,7 +3647,7 @@ void process_commands() //-// /* - } else if(code_seen("qqq")) { + } else if(code_seen("rrr")) { MYSERIAL.println("=== checking ==="); MYSERIAL.println(eeprom_read_byte((uint8_t*)EEPROM_CHECK_MODE),DEC); MYSERIAL.println(eeprom_read_byte((uint8_t*)EEPROM_NOZZLE_DIAMETER),DEC); @@ -3666,13 +3669,47 @@ eeprom_update_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM,0xFFFF); } else if(code_seen("set") && farm_mode) { + strchr_pointer++; // skip 1st char (~ 's') strchr_pointer++; // skip 2nd char (~ 'e') - strchr_pointer++; // skip 3rd char (~ 't') nDiameter=(uint16_t)(code_value()*1000.0+0.5); // [,um] - eeprom_update_byte((uint8_t*)EEPROM_NOZZLE_DIAMETER,(uint8_t)e_NOZZLE_DIAMETER_NULL); // for correct synchronization after farm-mode exiting + eeprom_update_byte((uint8_t*)EEPROM_NOZZLE_DIAMETER,(uint8_t)ClNozzleDiameter::_Diameter_Undef); // for correct synchronization after farm-mode exiting eeprom_update_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM,nDiameter); } else SERIAL_PROTOCOLLN((float)eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM)/1000.0); + +//-// !!! SupportMenu +/* +// musi byt PRED "PRUSA model" + } else if (code_seen("smodel")) { //! PRUSA smodel + size_t nOffset; +// ! -> "l" + strchr_pointer+=5*sizeof(*strchr_pointer); // skip 1st - 5th char (~ 'smode') + nOffset=strspn(strchr_pointer+1," \t\n\r\v\f"); + if(*(strchr_pointer+1+nOffset)) + printer_smodel_check(strchr_pointer); + else SERIAL_PROTOCOLLN(PRINTER_NAME); + } else if (code_seen("model")) { //! PRUSA model + uint16_t nPrinterModel; + strchr_pointer+=4*sizeof(*strchr_pointer); // skip 1st - 4th char (~ 'mode') + nPrinterModel=(uint16_t)code_value_long(); + if(nPrinterModel!=0) + printer_model_check(nPrinterModel); + else SERIAL_PROTOCOLLN(PRINTER_TYPE); + } else if (code_seen("version")) { //! PRUSA version + strchr_pointer+=7*sizeof(*strchr_pointer); // skip 1st - 7th char (~ 'version') + while(*strchr_pointer==' ') // skip leading spaces + strchr_pointer++; + if(*strchr_pointer!=0) + fw_version_check(strchr_pointer); + else SERIAL_PROTOCOLLN(FW_VERSION); + } else if (code_seen("gcode")) { //! PRUSA gcode + uint16_t nGcodeLevel; + strchr_pointer+=4*sizeof(*strchr_pointer); // skip 1st - 4th char (~ 'gcod') + nGcodeLevel=(uint16_t)code_value_long(); + if(nGcodeLevel!=0) + gcode_level_check(nGcodeLevel); + else SERIAL_PROTOCOLLN(GCODE_LEVEL); +*/ } //else if (code_seen('Cal')) { // lcd_calibration(); @@ -6837,6 +6874,65 @@ if((eSoundMode==e_SOUND_MODE_LOUD)||(eSoundMode==e_SOUND_MODE_ONCE)) #endif //PINDA_THERMISTOR + case 862: // M862: print checking + float nDummy; + uint8_t nCommand; + nCommand=(uint8_t)(modff(code_value_float(),&nDummy)*10.0+0.5); + switch((ClPrintChecking)nCommand) + { + case ClPrintChecking::_Nozzle: // ~ .1 + uint16_t nDiameter; + if(code_seen('P')) + { + nDiameter=(uint16_t)(code_value()*1000.0+0.5); // [,um] + nozzle_diameter_check(nDiameter); + } +/* + else if(code_seen('S')&&farm_mode) + { + nDiameter=(uint16_t)(code_value()*1000.0+0.5); // [,um] + eeprom_update_byte((uint8_t*)EEPROM_NOZZLE_DIAMETER,(uint8_t)ClNozzleDiameter::_Diameter_Undef); // for correct synchronization after farm-mode exiting + eeprom_update_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM,nDiameter); + } +*/ + else if(code_seen('Q')) + SERIAL_PROTOCOLLN((float)eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM)/1000.0); + break; + case ClPrintChecking::_Model: // ~ .2 + if(code_seen('P')) + { + uint16_t nPrinterModel; + nPrinterModel=(uint16_t)code_value_long(); + printer_model_check(nPrinterModel); + } + else if(code_seen('Q')) + SERIAL_PROTOCOLLN(nPrinterType); + break; + case ClPrintChecking::_Smodel: // ~ .3 + if(code_seen('P')) + printer_smodel_check(strchr_pointer); + else if(code_seen('Q')) + SERIAL_PROTOCOLLNRPGM(sPrinterName); + break; + case ClPrintChecking::_Version: // ~ .4 + if(code_seen('P')) + fw_version_check(++strchr_pointer); + else if(code_seen('Q')) + SERIAL_PROTOCOLLN(FW_VERSION); + break; + case ClPrintChecking::_Gcode: // ~ .5 + if(code_seen('P')) + { + uint16_t nGcodeLevel; + nGcodeLevel=(uint16_t)code_value_long(); + gcode_level_check(nGcodeLevel); + } + else if(code_seen('Q')) + SERIAL_PROTOCOLLN(GCODE_LEVEL); + break; + } + break; + #ifdef LIN_ADVANCE case 900: // M900: Set LIN_ADVANCE options. gcode_M900(); diff --git a/Firmware/eeprom.h b/Firmware/eeprom.h index 9451ca65d..258c16684 100644 --- a/Firmware/eeprom.h +++ b/Firmware/eeprom.h @@ -30,6 +30,7 @@ typedef struct static_assert(sizeof(Sheets) == EEPROM_SHEETS_SIZEOF, "Sizeof(Sheets) is not EEPROM_SHEETS_SIZEOF."); #endif +#define EEPROM_EMPTY_VALUE 0xFF // The total size of the EEPROM is // 4096 for the Atmega2560 #define EEPROM_TOP 4096 @@ -195,6 +196,9 @@ static_assert(sizeof(Sheets) == EEPROM_SHEETS_SIZEOF, "Sizeof(Sheets) is not EEP #define EEPROM_CHECK_MODE (EEPROM_MMU_STEALTH-1) // uint8 #define EEPROM_NOZZLE_DIAMETER (EEPROM_CHECK_MODE-1) // uint8 #define EEPROM_NOZZLE_DIAMETER_uM (EEPROM_NOZZLE_DIAMETER-2) // uint16 +#define EEPROM_CHECK_MODEL (EEPROM_NOZZLE_DIAMETER_uM-1) // uint8 +#define EEPROM_CHECK_VERSION (EEPROM_CHECK_MODEL-1) // uint8 +#define EEPROM_CHECK_GCODE (EEPROM_CHECK_VERSION-1) // uint8 #define EEPROM_SHEETS_BASE (EEPROM_NOZZLE_DIAMETER_uM - EEPROM_SHEETS_SIZEOF) // Sheets static Sheets * const EEPROM_Sheets_base = (Sheets*)(EEPROM_SHEETS_BASE); diff --git a/Firmware/mmu.cpp b/Firmware/mmu.cpp index c207a74d9..48baeb314 100755 --- a/Firmware/mmu.cpp +++ b/Firmware/mmu.cpp @@ -15,6 +15,8 @@ #include #include "io_atmega2560.h" #include "AutoDeplete.h" +//-// +#include "util.h" #ifdef TMC2130 #include "tmc2130.h" @@ -265,6 +267,9 @@ void mmu_loop(void) FDEBUG_PRINTF_P(PSTR("MMU => '%dok'\n"), mmu_finda); puts_P(PSTR("MMU - ENABLED")); mmu_enabled = true; + //-// + // ... PrinterType/Name + fSetMmuMode(true); mmu_state = S::Idle; } return; diff --git a/Firmware/printers.h b/Firmware/printers.h index 8111beb05..e26431302 100644 --- a/Firmware/printers.h +++ b/Firmware/printers.h @@ -3,14 +3,38 @@ #define PRINTER_UNKNOWN 0 -#define PRINTER_MK1 100 -#define PRINTER_MK2 200 -#define PRINTER_MK2_SNMM 201 -#define PRINTER_MK25 250 -#define PRINTER_MK25_SNMM 251 -#define PRINTER_MK25S 252 -#define PRINTER_MK3 300 -#define PRINTER_MK3_SNMM 301 -#define PRINTER_MK3S 302 +// *** MK1 +#define PRINTER_MK1 100 +#define PRINTER_MK1_NAME "MK1" +// *** MK2 +#define PRINTER_MK2 200 +#define PRINTER_MK2_NAME "MK2" +#define PRINTER_MK2_SNMM 201 // better is "10200" +#define PRINTER_MK2_SNMM_NAME "MK2MM" // better is "MK2MMU1" +// *** MK2S ??? is same as "MK2" ??? +#define PRINTER_MK2S 202 +#define PRINTER_MK2S_NAME "MK2S" +#define PRINTER_MK2S_SNMM 203 // better is "10202" +#define PRINTER_MK2S_SNMM_NAME "MK2SMM" // better is "MK2SMMU1" +// *** MK2.5 +#define PRINTER_MK25 250 +#define PRINTER_MK25_NAME "MK2.5" +#define PRINTER_MK25_MMU2 20250 +#define PRINTER_MK25_MMU2_NAME "MK2.5MMU2" +// *** MK2.5S +#define PRINTER_MK25S 252 +#define PRINTER_MK25S_NAME "MK2.5S" +#define PRINTER_MK25S_MMU2 20252 +#define PRINTER_MK25S_MMU2_NAME "MK2.5SMMU2S" +// *** MK3 +#define PRINTER_MK3 300 +#define PRINTER_MK3_NAME "MK3" +#define PRINTER_MK3_MMU2 20300 +#define PRINTER_MK3_MMU2_NAME "MK3MMU2" +// *** MK3S +#define PRINTER_MK3S 302 +#define PRINTER_MK3S_NAME "MK3S" +#define PRINTER_MK3S_MMU2 20302 +#define PRINTER_MK3S_MMU2_NAME "MK3SMMU2S" #endif //PRINTERS_H diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 815731a1c..fa2f9b550 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -307,6 +307,7 @@ bool wait_for_unclick; #endif bool bMain; // flag (i.e. 'fake parameter') for 'lcd_sdcard_menu()' function +bool bSettings; // flag (i.e. 'fake parameter') for 'lcd_checkink_menu()' function @@ -5290,95 +5291,218 @@ while (0) //-// static void lcd_check_mode_set(void) { -switch(eCheckMode) +switch(oCheckMode) { - case e_CHECK_MODE_none: - eCheckMode=e_CHECK_MODE_warn; + case ClCheckMode::_None: + oCheckMode=ClCheckMode::_Warn; break; - case e_CHECK_MODE_warn: - eCheckMode=e_CHECK_MODE_strict; + case ClCheckMode::_Warn: + oCheckMode=ClCheckMode::_Strict; break; - case e_CHECK_MODE_strict: - eCheckMode=e_CHECK_MODE_none; + case ClCheckMode::_Strict: + oCheckMode=ClCheckMode::_None; break; default: - eCheckMode=e_CHECK_MODE_none; + oCheckMode=ClCheckMode::_None; } -eeprom_update_byte((uint8_t*)EEPROM_CHECK_MODE,(uint8_t)eCheckMode); -} - -static void lcd_nozzle_diameter_set(void) -{ -uint16_t nDiameter; - -switch(eNozzleDiameter) - { - case e_NOZZLE_DIAMETER_250: - eNozzleDiameter=e_NOZZLE_DIAMETER_400; - nDiameter=400; - break; - case e_NOZZLE_DIAMETER_400: - eNozzleDiameter=e_NOZZLE_DIAMETER_600; - nDiameter=600; - break; - case e_NOZZLE_DIAMETER_600: - eNozzleDiameter=e_NOZZLE_DIAMETER_250; - nDiameter=250; - break; - default: - eNozzleDiameter=e_NOZZLE_DIAMETER_400; - nDiameter=400; - } -eeprom_update_byte((uint8_t*)EEPROM_NOZZLE_DIAMETER,(uint8_t)eNozzleDiameter); -eeprom_update_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM,nDiameter); +eeprom_update_byte((uint8_t*)EEPROM_CHECK_MODE,(uint8_t)oCheckMode); } #define SETTINGS_MODE \ do\ {\ - switch(eCheckMode)\ + switch(oCheckMode)\ {\ - case e_CHECK_MODE_none:\ - MENU_ITEM_FUNCTION_P(_i("Action [none]"),lcd_check_mode_set);\ + case ClCheckMode::_None:\ + MENU_ITEM_FUNCTION_P(_i("Nozzle [none]"),lcd_check_mode_set);\ break;\ - case e_CHECK_MODE_warn:\ - MENU_ITEM_FUNCTION_P(_i("Action [warn]"),lcd_check_mode_set);\ + case ClCheckMode::_Warn:\ + MENU_ITEM_FUNCTION_P(_i("Nozzle [warn]"),lcd_check_mode_set);\ break;\ - case e_CHECK_MODE_strict:\ - MENU_ITEM_FUNCTION_P(_i("Action [strict]"),lcd_check_mode_set);\ + case ClCheckMode::_Strict:\ + MENU_ITEM_FUNCTION_P(_i("Nozzle [strict]"),lcd_check_mode_set);\ break;\ default:\ - MENU_ITEM_FUNCTION_P(_i("Action [none]"),lcd_check_mode_set);\ + MENU_ITEM_FUNCTION_P(_i("Nozzle [none]"),lcd_check_mode_set);\ }\ }\ while (0) +static void lcd_nozzle_diameter_set(void) +{ +uint16_t nDiameter; + +switch(oNozzleDiameter) + { + case ClNozzleDiameter::_Diameter_250: + oNozzleDiameter=ClNozzleDiameter::_Diameter_400; + nDiameter=400; + break; + case ClNozzleDiameter::_Diameter_400: + oNozzleDiameter=ClNozzleDiameter::_Diameter_600; + nDiameter=600; + break; + case ClNozzleDiameter::_Diameter_600: + oNozzleDiameter=ClNozzleDiameter::_Diameter_250; + nDiameter=250; + break; + default: + oNozzleDiameter=ClNozzleDiameter::_Diameter_400; + nDiameter=400; + } +eeprom_update_byte((uint8_t*)EEPROM_NOZZLE_DIAMETER,(uint8_t)oNozzleDiameter); +eeprom_update_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM,nDiameter); +} + #define SETTINGS_NOZZLE \ do\ {\ - switch(eNozzleDiameter)\ + switch(oNozzleDiameter)\ {\ - case e_NOZZLE_DIAMETER_250:\ - MENU_ITEM_FUNCTION_P(_i("Nozzle [0.25]"),lcd_nozzle_diameter_set);\ + case ClNozzleDiameter::_Diameter_250:\ + MENU_ITEM_FUNCTION_P(_i("Nozzle d. [0.25]"),lcd_nozzle_diameter_set);\ break;\ - case e_NOZZLE_DIAMETER_400:\ - MENU_ITEM_FUNCTION_P(_i("Nozzle [0.40]"),lcd_nozzle_diameter_set);\ + case ClNozzleDiameter::_Diameter_400:\ + MENU_ITEM_FUNCTION_P(_i("Nozzle d. [0.40]"),lcd_nozzle_diameter_set);\ break;\ - case e_NOZZLE_DIAMETER_600:\ - MENU_ITEM_FUNCTION_P(_i("Nozzle [0.60]"),lcd_nozzle_diameter_set);\ + case ClNozzleDiameter::_Diameter_600:\ + MENU_ITEM_FUNCTION_P(_i("Nozzle d. [0.60]"),lcd_nozzle_diameter_set);\ break;\ default:\ - MENU_ITEM_FUNCTION_P(_i("Nozzle [0.40]"),lcd_nozzle_diameter_set);\ + MENU_ITEM_FUNCTION_P(_i("Nozzle d. [0.40]"),lcd_nozzle_diameter_set);\ }\ }\ while (0) -static void lcd_checking_menu() +static void lcd_check_model_set(void) +{ +switch(oCheckModel) + { + case ClCheckModel::_None: + oCheckModel=ClCheckModel::_Warn; + break; + case ClCheckModel::_Warn: + oCheckModel=ClCheckModel::_Strict; + break; + case ClCheckModel::_Strict: + oCheckModel=ClCheckModel::_None; + break; + default: + oCheckModel=ClCheckModel::_None; + } +eeprom_update_byte((uint8_t*)EEPROM_CHECK_MODEL,(uint8_t)oCheckModel); +} + +#define SETTINGS_MODEL \ +do\ +{\ + switch(oCheckModel)\ + {\ + case ClCheckModel::_None:\ + MENU_ITEM_FUNCTION_P(_i("Model [none]"),lcd_check_model_set);\ + break;\ + case ClCheckModel::_Warn:\ + MENU_ITEM_FUNCTION_P(_i("Model [warn]"),lcd_check_model_set);\ + break;\ + case ClCheckModel::_Strict:\ + MENU_ITEM_FUNCTION_P(_i("Model [strict]"),lcd_check_model_set);\ + break;\ + default:\ + MENU_ITEM_FUNCTION_P(_i("Model [none]"),lcd_check_model_set);\ + }\ +}\ +while (0) + +static void lcd_check_version_set(void) +{ +switch(oCheckVersion) + { + case ClCheckVersion::_None: + oCheckVersion=ClCheckVersion::_Warn; + break; + case ClCheckVersion::_Warn: + oCheckVersion=ClCheckVersion::_Strict; + break; + case ClCheckVersion::_Strict: + oCheckVersion=ClCheckVersion::_None; + break; + default: + oCheckVersion=ClCheckVersion::_None; + } +eeprom_update_byte((uint8_t*)EEPROM_CHECK_VERSION,(uint8_t)oCheckVersion); +} + +#define SETTINGS_VERSION \ +do\ +{\ + switch(oCheckVersion)\ + {\ + case ClCheckVersion::_None:\ + MENU_ITEM_FUNCTION_P(_i("Firmware [none]"),lcd_check_version_set);\ + break;\ + case ClCheckVersion::_Warn:\ + MENU_ITEM_FUNCTION_P(_i("Firmware [warn]"),lcd_check_version_set);\ + break;\ + case ClCheckVersion::_Strict:\ + MENU_ITEM_FUNCTION_P(_i("Firmware [strict]"),lcd_check_version_set);\ + break;\ + default:\ + MENU_ITEM_FUNCTION_P(_i("Firmware [none]"),lcd_check_version_set);\ + }\ +}\ +while (0) + +static void lcd_check_gcode_set(void) +{ +switch(oCheckGcode) + { + case ClCheckGcode::_None: + oCheckGcode=ClCheckGcode::_Warn; + break; + case ClCheckGcode::_Warn: + oCheckGcode=ClCheckGcode::_Strict; + break; + case ClCheckGcode::_Strict: + oCheckGcode=ClCheckGcode::_None; + break; + default: + oCheckGcode=ClCheckGcode::_None; + } +eeprom_update_byte((uint8_t*)EEPROM_CHECK_GCODE,(uint8_t)oCheckGcode); +} + +#define SETTINGS_GCODE \ +do\ +{\ + switch(oCheckGcode)\ + {\ + case ClCheckGcode::_None:\ + MENU_ITEM_FUNCTION_P(_i("Gcode [none]"),lcd_check_gcode_set);\ + break;\ + case ClCheckGcode::_Warn:\ + MENU_ITEM_FUNCTION_P(_i("Gcode [warn]"),lcd_check_gcode_set);\ + break;\ + case ClCheckGcode::_Strict:\ + MENU_ITEM_FUNCTION_P(_i("Gcode [strict]"),lcd_check_gcode_set);\ + break;\ + default:\ + MENU_ITEM_FUNCTION_P(_i("Gcode [none]"),lcd_check_gcode_set);\ + }\ +}\ +while (0) + +//-//static void lcd_checking_menu() +void lcd_checking_menu() { MENU_BEGIN(); -MENU_ITEM_BACK_P(_T(MSG_SETTINGS)); -SETTINGS_MODE; +MENU_ITEM_BACK_P(_T(bSettings?MSG_SETTINGS:MSG_BACK)); // i.e. default menu-item / menu-item after checking mismatch SETTINGS_NOZZLE; +MENU_ITEM_TEXT_P(STR_SEPARATOR); +MENU_ITEM_TEXT_P(_i("Checks:")); +SETTINGS_MODE; +SETTINGS_MODEL; +SETTINGS_VERSION; +SETTINGS_GCODE; MENU_END(); } @@ -5434,7 +5558,10 @@ static void lcd_settings_menu() #endif //(LANG_MODE != 0) if (!farm_mode) + { + bSettings=true; // flag ('fake parameter') for 'lcd_checking_menu()' function MENU_ITEM_SUBMENU_P(_i("Print checking"), lcd_checking_menu); + } SETTINGS_SD; SETTINGS_SOUND; diff --git a/Firmware/ultralcd.h b/Firmware/ultralcd.h index 99c4c0cfe..cb2aad106 100755 --- a/Firmware/ultralcd.h +++ b/Firmware/ultralcd.h @@ -143,6 +143,9 @@ void lcd_ignore_click(bool b=true); void lcd_commands(); +extern bool bSettings; // flag (i.e. 'fake parameter') for 'lcd_checkink_menu()' function + + void change_extr(int extr); #ifdef SNMM diff --git a/Firmware/util.cpp b/Firmware/util.cpp index ec01107e0..fbaee66a4 100644 --- a/Firmware/util.cpp +++ b/Firmware/util.cpp @@ -330,43 +330,241 @@ void update_current_firmware_version_to_eeprom() //-// -eNOZZLE_DIAMETER eNozzleDiameter=e_NOZZLE_DIAMETER_400; -eCHECK_MODE eCheckMode=e_CHECK_MODE_none; +void lcd_checking_menu(void); + +ClNozzleDiameter oNozzleDiameter=ClNozzleDiameter::_Diameter_400; +ClCheckMode oCheckMode=ClCheckMode::_None; +ClCheckModel oCheckModel=ClCheckModel::_None; +ClCheckVersion oCheckVersion=ClCheckVersion::_None; +ClCheckGcode oCheckGcode=ClCheckGcode::_None; void fCheckModeInit() { -eCheckMode=(eCHECK_MODE)eeprom_read_byte((uint8_t*)EEPROM_CHECK_MODE); -if(eCheckMode==e_CHECK_MODE_NULL) +oCheckMode=(ClCheckMode)eeprom_read_byte((uint8_t*)EEPROM_CHECK_MODE); +if(oCheckMode==ClCheckMode::_Undef) { - eCheckMode=e_CHECK_MODE_warn; - eeprom_update_byte((uint8_t*)EEPROM_CHECK_MODE,(uint8_t)eCheckMode); + oCheckMode=ClCheckMode::_Warn; + eeprom_update_byte((uint8_t*)EEPROM_CHECK_MODE,(uint8_t)oCheckMode); } if(farm_mode) - eCheckMode=e_CHECK_MODE_strict; -eNozzleDiameter=(eNOZZLE_DIAMETER)eeprom_read_byte((uint8_t*)EEPROM_NOZZLE_DIAMETER); -if((eNozzleDiameter==e_NOZZLE_DIAMETER_NULL)&& !farm_mode) + oCheckMode=ClCheckMode::_Strict; +oNozzleDiameter=(ClNozzleDiameter)eeprom_read_byte((uint8_t*)EEPROM_NOZZLE_DIAMETER); +if((oNozzleDiameter==ClNozzleDiameter::_Diameter_Undef)&& !farm_mode) { - eNozzleDiameter=e_NOZZLE_DIAMETER_400; - eeprom_update_byte((uint8_t*)EEPROM_NOZZLE_DIAMETER,(uint8_t)eNozzleDiameter); + 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); } +oCheckModel=(ClCheckModel)eeprom_read_byte((uint8_t*)EEPROM_CHECK_MODEL); +if(oCheckModel==ClCheckModel::_Undef) + { + oCheckModel=ClCheckModel::_Warn; + eeprom_update_byte((uint8_t*)EEPROM_CHECK_MODEL,(uint8_t)oCheckModel); + } +oCheckVersion=(ClCheckVersion)eeprom_read_byte((uint8_t*)EEPROM_CHECK_VERSION); +if(oCheckVersion==ClCheckVersion::_Undef) + { + oCheckVersion=ClCheckVersion::_Warn; + eeprom_update_byte((uint8_t*)EEPROM_CHECK_VERSION,(uint8_t)oCheckVersion); + } +oCheckGcode=(ClCheckGcode)eeprom_read_byte((uint8_t*)EEPROM_CHECK_GCODE); +if(oCheckGcode==ClCheckGcode::_Undef) + { + oCheckGcode=ClCheckGcode::_Warn; + eeprom_update_byte((uint8_t*)EEPROM_CHECK_GCODE,(uint8_t)oCheckGcode); + } } void nozzle_diameter_check(uint16_t nDiameter) { uint16_t nDiameter_um; +if(oCheckMode==ClCheckMode::_None) + return; nDiameter_um=eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM); if(nDiameter==nDiameter_um) return; -switch(eCheckMode) +//SERIAL_ECHO_START; +//SERIAL_ECHOLNPGM("Nozzle diameter doesn't match ..."); +//SERIAL_ECHOPGM("actual : "); +//SERIAL_ECHOLN((float)(nDiameter_um/1000.0)); +//SERIAL_ECHOPGM("expected: "); +//SERIAL_ECHOLN((float)(nDiameter/1000.0)); +switch(oCheckMode) { - case e_CHECK_MODE_warn: + case ClCheckMode::_Warn: lcd_show_fullscreen_message_and_wait_P(_i("Nozzle diameter doesn't match! Press the knob to continue.")); break; - case e_CHECK_MODE_strict: + case ClCheckMode::_Strict: lcd_show_fullscreen_message_and_wait_P(_i("Nozzle diameter doesn't match! Print is aborted, press the knob.")); lcd_print_stop(); break; } +bSettings=false; // flag ('fake parameter') for 'lcd_checking_menu()' function +menu_submenu(lcd_checking_menu); +} + +void printer_model_check(uint16_t nPrinterModel) +{ +if(oCheckModel==ClCheckModel::_None) + return; +if(nPrinterModel==nPrinterType) + return; +//SERIAL_ECHO_START; +//SERIAL_ECHOLNPGM("Printer model doesn't match ..."); +//SERIAL_ECHOPGM("actual : "); +//SERIAL_ECHOLN(nPrinterType); +//SERIAL_ECHOPGM("expected: "); +//SERIAL_ECHOLN(nPrinterModel); +switch(oCheckModel) + { + case ClCheckModel::_Warn: + lcd_show_fullscreen_message_and_wait_P(_i("Printer model doesn't match! Press the knob to continue.")); + break; + case ClCheckModel::_Strict: + lcd_show_fullscreen_message_and_wait_P(_i("Printer model doesn't match! Print is aborted, press the knob.")); + lcd_print_stop(); + break; + } +} + +uint8_t mCompareValue(uint16_t nX,uint16_t nY) +{ +if(nX>nY) + return((uint8_t)ClCompareValue::_Greater); +if(nX cmdqueue ??? +#define PRINTER_NAME_LENGTH ((sizeof(PRINTER_MMU_NAME)>sizeof(PRINTER_NAME))?(sizeof(PRINTER_MMU_NAME)-1):(sizeof(PRINTER_NAME)-1)) +#define GCODE_DELIMITER '"' +#define ELLIPSIS "..." + +char* code_string(char* pStr,size_t* nLength) +{ +char* pStrBegin; +char* pStrEnd; + +pStrBegin=strchr(pStr,GCODE_DELIMITER); +if(!pStrBegin) + return(NULL); +pStrBegin++; +pStrEnd=strchr(pStrBegin,GCODE_DELIMITER); +if(!pStrEnd) + return(NULL); +*nLength=pStrEnd-pStrBegin; +return(pStrBegin); +} + +void printer_smodel_check(char* pStrPos) +{ +char* pResult; +size_t nLength,nPrinterNameLength; +bool bCheckOK; +char sPrinterName[PRINTER_NAME_LENGTH+sizeof(ELLIPSIS)-1+1]=""; + +nPrinterNameLength=strlen_P(::sPrinterName); +pResult=code_string(pStrPos,&nLength); +if(pResult!=NULL) + { + strlcpy(sPrinterName,pResult,min(nPrinterNameLength,nLength)+1); + if(nLength>nPrinterNameLength) + strcat(sPrinterName,ELLIPSIS); + bCheckOK=(nLength==nPrinterNameLength); + if(bCheckOK&&(!strncasecmp_P(pResult,::sPrinterName,nLength))) // i.e. string compare execute only if lengths are same + return; + } +//SERIAL_ECHO_START; +//SERIAL_ECHOLNPGM("Printer model doesn't match ..."); +//SERIAL_ECHOPGM("actual : \""); +//serialprintPGM(::sPrinterName); +//SERIAL_ECHOLNPGM("\""); +//SERIAL_ECHOPGM("expected: \""); +////SERIAL_ECHO(sPrinterName); +//SERIAL_ECHOLNPGM("\""); +switch(oCheckModel) + { + case ClCheckModel::_Warn: + lcd_show_fullscreen_message_and_wait_P(_i("Printer model doesn't match! Press the knob to continue.")); + break; + case ClCheckModel::_Strict: + lcd_show_fullscreen_message_and_wait_P(_i("Printer model doesn't match! Print is aborted, press the knob.")); + lcd_print_stop(); + break; + } +} + +void fSetMmuMode(bool bMMu) +{ +if(bMMu) + { + nPrinterType=pgm_read_word(&_nPrinterMmuType); + sPrinterName=_sPrinterMmuName; + } +else { + nPrinterType=pgm_read_word(&_nPrinterType); + sPrinterName=_sPrinterName; + } } diff --git a/Firmware/util.h b/Firmware/util.h index d3b7e7d16..a9bbcb1d6 100644 --- a/Firmware/util.h +++ b/Firmware/util.h @@ -35,27 +35,76 @@ inline void eeprom_update_int8(unsigned char* addr, int8_t v) { //-// -#define e_CHECK_MODE_NULL 0xFF -#define e_NOZZLE_DIAMETER_NULL 0xFF - -typedef enum +enum class ClPrintChecking:uint_least8_t { - e_NOZZLE_DIAMETER_250, - e_NOZZLE_DIAMETER_400, - e_NOZZLE_DIAMETER_600 -} eNOZZLE_DIAMETER; + _Nozzle=1, + _Model=2, + _Smodel=3, + _Version=4, + _Gcode=5 +}; -typedef enum +enum class ClNozzleDiameter:uint_least8_t { - e_CHECK_MODE_none, - e_CHECK_MODE_warn, - e_CHECK_MODE_strict -} eCHECK_MODE; + _Diameter_250=25, + _Diameter_400=40, + _Diameter_600=60, + _Diameter_Undef=EEPROM_EMPTY_VALUE +}; -extern eNOZZLE_DIAMETER eNozzleDiameter; -extern eCHECK_MODE eCheckMode; +enum class ClCheckMode:uint_least8_t +{ + _None, + _Warn, + _Strict, + _Undef=EEPROM_EMPTY_VALUE +}; + +enum class ClCheckModel:uint_least8_t +{ + _None, + _Warn, + _Strict, + _Undef=EEPROM_EMPTY_VALUE +}; + +enum class ClCheckVersion:uint_least8_t +{ + _None, + _Warn, + _Strict, + _Undef=EEPROM_EMPTY_VALUE +}; + +enum class ClCheckGcode:uint_least8_t +{ + _None, + _Warn, + _Strict, + _Undef=EEPROM_EMPTY_VALUE +}; + +#define COMPARE_VALUE_EQUAL (((uint8_t)ClCompareValue::_Equal<<6)+((uint8_t)ClCompareValue::_Equal<<4)+((uint8_t)ClCompareValue::_Equal<<2)+((uint8_t)ClCompareValue::_Equal)) +enum class ClCompareValue:uint_least8_t +{ + _Less=0, + _Equal=1, + _Greater=2 +}; + +extern ClNozzleDiameter oNozzleDiameter; +extern ClCheckMode oCheckMode; +extern ClCheckModel oCheckModel; +extern ClCheckVersion oCheckVersion; +extern ClCheckGcode oCheckGcode; void fCheckModeInit(); void nozzle_diameter_check(uint16_t nDiameter); +void printer_model_check(uint16_t nPrinterModel); +void printer_smodel_check(char* pStrPos); +void fw_version_check(const char *pVersion); +void gcode_level_check(uint16_t nGcodeLevel); + +void fSetMmuMode(bool bMMu); #endif /* UTIL_H */ diff --git a/Firmware/variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h index 1ed888edb..442e8b944 100644 --- a/Firmware/variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h @@ -2,12 +2,16 @@ #define CONFIGURATION_PRUSA_H #include +#include "printers.h" /*------------------------------------ GENERAL SETTINGS *------------------------------------*/ // Printer revision #define PRINTER_TYPE PRINTER_MK2 +#define PRINTER_NAME PRINTER_MK2_NAME +#define PRINTER_MMU_TYPE PRINTER_MK2 // dummy item (due to successfully compilation / building only) +#define PRINTER_MMU_NAME PRINTER_MK2_NAME // dummy item (due to successfully compilation / building only) #define FILAMENT_SIZE "1_75mm_MK2" #define NOZZLE_TYPE "E3Dv6full" diff --git a/Firmware/variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h b/Firmware/variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h index 26ca70be2..44fee01ec 100644 --- a/Firmware/variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h @@ -2,12 +2,16 @@ #define CONFIGURATION_PRUSA_H #include +#include "printers.h" /*------------------------------------ GENERAL SETTINGS *------------------------------------*/ // Printer revision #define PRINTER_TYPE PRINTER_MK2 +#define PRINTER_NAME PRINTER_MK2_NAME +#define PRINTER_MMU_TYPE PRINTER_MK2 // dummy item (due to successfully compilation / building only) +#define PRINTER_MMU_NAME PRINTER_MK2_NAME // dummy item (due to successfully compilation / building only) #define FILAMENT_SIZE "1_75mm_MK2" #define NOZZLE_TYPE "E3Dv6full" diff --git a/Firmware/variants/1_75mm_MK25-RAMBo10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK25-RAMBo10a-E3Dv6full.h index 752a61317..a979503ae 100644 --- a/Firmware/variants/1_75mm_MK25-RAMBo10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK25-RAMBo10a-E3Dv6full.h @@ -2,12 +2,16 @@ #define CONFIGURATION_PRUSA_H #include +#include "printers.h" /*------------------------------------ GENERAL SETTINGS *------------------------------------*/ // Printer revision #define PRINTER_TYPE PRINTER_MK25 +#define PRINTER_NAME PRINTER_MK25_NAME +#define PRINTER_MMU_TYPE PRINTER_MK25_MMU2 +#define PRINTER_MMU_NAME PRINTER_MK25_MMU2_NAME #define FILAMENT_SIZE "1_75mm_MK25" #define NOZZLE_TYPE "E3Dv6full" diff --git a/Firmware/variants/1_75mm_MK25-RAMBo13a-E3Dv6full.h b/Firmware/variants/1_75mm_MK25-RAMBo13a-E3Dv6full.h index 525590bd4..bb897fd74 100644 --- a/Firmware/variants/1_75mm_MK25-RAMBo13a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK25-RAMBo13a-E3Dv6full.h @@ -2,12 +2,16 @@ #define CONFIGURATION_PRUSA_H #include +#include "printers.h" /*------------------------------------ GENERAL SETTINGS *------------------------------------*/ // Printer revision #define PRINTER_TYPE PRINTER_MK25 +#define PRINTER_NAME PRINTER_MK25_NAME +#define PRINTER_MMU_TYPE PRINTER_MK25_MMU2 +#define PRINTER_MMU_NAME PRINTER_MK25_MMU2_NAME #define FILAMENT_SIZE "1_75mm_MK25" #define NOZZLE_TYPE "E3Dv6full" diff --git a/Firmware/variants/1_75mm_MK25S-RAMBo10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK25S-RAMBo10a-E3Dv6full.h index b47991590..8425dfd72 100644 --- a/Firmware/variants/1_75mm_MK25S-RAMBo10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK25S-RAMBo10a-E3Dv6full.h @@ -2,12 +2,16 @@ #define CONFIGURATION_PRUSA_H #include +#include "printers.h" /*------------------------------------ GENERAL SETTINGS *------------------------------------*/ // Printer revision #define PRINTER_TYPE PRINTER_MK25S +#define PRINTER_NAME PRINTER_MK25S_NAME +#define PRINTER_MMU_TYPE PRINTER_MK25S_MMU2 +#define PRINTER_MMU_NAME PRINTER_MK25S_MMU2_NAME #define FILAMENT_SIZE "1_75mm_MK25S" #define NOZZLE_TYPE "E3Dv6full" diff --git a/Firmware/variants/1_75mm_MK25S-RAMBo13a-E3Dv6full.h b/Firmware/variants/1_75mm_MK25S-RAMBo13a-E3Dv6full.h index 927fc9a18..525c2206f 100644 --- a/Firmware/variants/1_75mm_MK25S-RAMBo13a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK25S-RAMBo13a-E3Dv6full.h @@ -2,12 +2,16 @@ #define CONFIGURATION_PRUSA_H #include +#include "printers.h" /*------------------------------------ GENERAL SETTINGS *------------------------------------*/ // Printer revision #define PRINTER_TYPE PRINTER_MK25S +#define PRINTER_NAME PRINTER_MK25S_NAME +#define PRINTER_MMU_TYPE PRINTER_MK25S_MMU2 +#define PRINTER_MMU_NAME PRINTER_MK25S_MMU2_NAME #define FILAMENT_SIZE "1_75mm_MK25" #define NOZZLE_TYPE "E3Dv6full" diff --git a/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h index 1e1fcfe13..8b843095f 100644 --- a/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h @@ -2,12 +2,17 @@ #define CONFIGURATION_PRUSA_H #include +//-// +#include "printers.h" /*------------------------------------ GENERAL SETTINGS *------------------------------------*/ // Printer revision #define PRINTER_TYPE PRINTER_MK3 +#define PRINTER_NAME PRINTER_MK3_NAME +#define PRINTER_MMU_TYPE PRINTER_MK3_MMU2 +#define PRINTER_MMU_NAME PRINTER_MK3_MMU2_NAME #define FILAMENT_SIZE "1_75mm_MK3" #define NOZZLE_TYPE "E3Dv6full" @@ -188,9 +193,9 @@ //#define FSENSOR_QUALITY -#define LINEARITY_CORRECTION -#define TMC2130_LINEARITY_CORRECTION -#define TMC2130_LINEARITY_CORRECTION_XYZ +//#define LINEARITY_CORRECTION +//#define TMC2130_LINEARITY_CORRECTION +//#define TMC2130_LINEARITY_CORRECTION_XYZ #define TMC2130_VARIABLE_RESOLUTION diff --git a/Firmware/variants/1_75mm_MK3S-EINSy10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK3S-EINSy10a-E3Dv6full.h index 9bb423675..d331171f5 100644 --- a/Firmware/variants/1_75mm_MK3S-EINSy10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK3S-EINSy10a-E3Dv6full.h @@ -2,12 +2,16 @@ #define CONFIGURATION_PRUSA_H #include +#include "printers.h" /*------------------------------------ GENERAL SETTINGS *------------------------------------*/ // Printer revision #define PRINTER_TYPE PRINTER_MK3S +#define PRINTER_NAME PRINTER_MK3S_NAME +#define PRINTER_MMU_TYPE PRINTER_MK3S_MMU2 +#define PRINTER_MMU_NAME PRINTER_MK3S_MMU2_NAME #define FILAMENT_SIZE "1_75mm_MK3" #define NOZZLE_TYPE "E3Dv6full"