Vychozi kod - Marlin 2.0.5.3 nestandardni upravy OK2PPK v21 urceno pro prekopanou Anet A8 na ram AM8 (zmenene rozmery X, Y i Z proti puvodni Anet A8) s novou ridici deskou MKS GEN L V1.0, RepRapDiscount Full Graphic Smart Controller, extrenim MOSFETem pro BED, drivery A4988 na osach E a Z (motory Z spojeny na jeden driver), a LV8729 na osach X a Y, napajeni 12V, ponechan puvodni BED, hotned a extruder z Anety, vystup pro hotend 1 pouzit na automaticky spoustene rizeni ventilatoru chlazeni hotendu 0, urceno pro tisk z SD karty tyto upravy nemeni jen konfiguraci, ale samotny programovy kod Marlina, nelze je tedy aplikovat na jine verze nez 2.0.5.3 bez prozkoumani, zda se v kodu Marlina nezmenilo neco, co je s temito upravami v kolizi cisla radku jsou orientacni a pro puvodni neupraveny kod, pri zmenach na vice mistech ve stejnem souboru bude dotycna cast kodu jiz zacinat jinde ------------------------------------------------------------------------------- 1. Upravy na zmenu zobrazovanych informaci o tiskarne (nahrada url za nazev tiskarny a upresneni verze ridici desky) src\lcd\dogm\ultralcd_DOGM.cpp na 2 mistech byl puvodni retezec MARLIN_WEBSITE_URL nahrazen novym retezcem MACHINE_NAME ... puvodni kod na radku 171 text_width_2 = u8g_uint_t((sizeof(MARLIN_WEBSITE_URL) - 1) * (MENU_FONT_WIDTH)), nahrazen novym kodem #ifdef PPK_BOOTSCREEN_MACHINENAME text_width_2 = u8g_uint_t((sizeof(MACHINE_NAME) - 1) * (MENU_FONT_WIDTH)), #else text_width_2 = u8g_uint_t((sizeof(MARLIN_WEBSITE_URL) - 1) * (MENU_FONT_WIDTH)), #endif puvodni kod na radku 202 if (!two_part || line2) lcd_put_u8str_P(txt_offx_2, txt_base, PSTR(MARLIN_WEBSITE_URL)); nahrazen novym kodem #ifdef PPK_BOOTSCREEN_MACHINENAME if (!two_part || line2) lcd_put_u8str_P(txt_offx_2, txt_base, PSTR(MACHINE_NAME)); #else if (!two_part || line2) lcd_put_u8str_P(txt_offx_2, txt_base, PSTR(MARLIN_WEBSITE_URL)); #endif src\pins\ramps\pins_MKS_GEN_L.h radek #define BOARD_INFO_NAME "MKS GEN L" zmenen na #define BOARD_INFO_NAME "MKS GEN L V1.0" a za tento radek pridan novy radek #define BOARD_WEBSITE_URL "github.com/makerbase-mks/MKS-GEN_L" ------------------------------------------------------------------------------- 2. Upravy udaju odesilanych tiskarnou na seriovy port po restartu (zarovnani textu za echo:, doplneni textu pred verzi dat eeprom a doplneni o nazev tiskarny) src\MarlinCore.cpp kod od radku 923 serialprintPGM(GET_TEXT(MSG_MARLIN)); SERIAL_CHAR(' '); SERIAL_ECHOLNPGM(SHORT_BUILD_VERSION); SERIAL_EOL(); #if defined(STRING_DISTRIBUTION_DATE) && defined(STRING_CONFIG_H_AUTHOR) SERIAL_ECHO_MSG( STR_CONFIGURATION_VER STRING_DISTRIBUTION_DATE STR_AUTHOR STRING_CONFIG_H_AUTHOR ); SERIAL_ECHO_MSG("Compiled: " __DATE__); #endif SERIAL_ECHO_START(); SERIAL_ECHOLNPAIR(STR_FREE_MEMORY, freeMemory(), STR_PLANNER_BUFFER_BYTES, (int)sizeof(block_t) * (BLOCK_BUFFER_SIZE)); zmenen na SERIAL_ECHO_MSG( "3D Printer " MACHINE_NAME ); SERIAL_ECHO_START(); serialprintPGM(GET_TEXT(MSG_MARLIN)); SERIAL_CHAR(' '); SERIAL_ECHOLNPGM(SHORT_BUILD_VERSION); SERIAL_EOL(); #if defined(STRING_DISTRIBUTION_DATE) && defined(STRING_CONFIG_H_AUTHOR) SERIAL_ECHO_MSG( "Last Updated: " STRING_DISTRIBUTION_DATE STR_AUTHOR STRING_CONFIG_H_AUTHOR ); SERIAL_ECHO_MSG("Compiled: " __DATE__); #endif SERIAL_ECHO_START(); SERIAL_ECHOLNPAIR("Free Memory: ", freeMemory(), STR_PLANNER_BUFFER_BYTES, (int)sizeof(block_t) * (BLOCK_BUFFER_SIZE)); kod od radku 900 SERIAL_ECHOLNPGM("start"); SERIAL_ECHO_START(); zmenen na SERIAL_ECHOLNPGM("start"); //SERIAL_ECHO_START(); src\module\configuration_store.cpp kod od radku 2214 DEBUG_ECHO_START(); DEBUG_ECHO(version); DEBUG_ECHOLNPAIR(" stored settings retrieved (", eeprom_index - (EEPROM_OFFSET), " bytes; crc ", (uint32_t)working_crc, ")"); zmenen na DEBUG_ECHO_START(); DEBUG_ECHOPGM("EEPROM "); DEBUG_ECHO(version); DEBUG_ECHOLNPAIR(" stored settings retrieved (", eeprom_index - (EEPROM_OFFSET), " bytes; crc ", (uint32_t)working_crc, ")"); ------------------------------------------------------------------------------- 3. Uprava na doplneni udaju na stavove obrazovce - prida se animovana ikona a hlaseni ON - OFF pro ventilator chladici heatbreak, pro ventilator chlazeni vytisku se misto prazdneho radku pro stav 0% vypisuje OFF, do modulu temperature doplnena stavova promena zaznamenavajici stav automaticky spinaneho ventilatoru chlazeni heatbreaku, do Configuration_adv.h se prida flag zapinajici tyto upravy) src\lcd\dogm\status_screen_DOGM.cpp ve funkci MarlinUI::draw_status_screen() kod od radku 588 // Fan, if a bitmap was provided #if DO_DRAW_FAN if (PAGE_CONTAINS(STATUS_FAN_TEXT_Y - INFO_FONT_ASCENT, STATUS_FAN_TEXT_Y - 1)) { char c = '%'; uint16_t spd = thermalManager.fan_speed[0]; if (spd) { #if ENABLED(ADAPTIVE_FAN_SLOWING) if (!blink && thermalManager.fan_speed_scaler[0] < 128) { spd = thermalManager.scaledFanSpeed(0, spd); c = '*'; } #endif lcd_put_u8str(STATUS_FAN_TEXT_X, STATUS_FAN_TEXT_Y, i16tostr3rj(thermalManager.fanPercent(spd))); lcd_put_wchar(c); } } #endif zmenit na novy kod // Fan, if a bitmap was provided #if DO_DRAW_FAN if (PAGE_CONTAINS(STATUS_FAN_TEXT_Y - INFO_FONT_ASCENT, STATUS_FAN_TEXT_Y - 1)) { char c = '%'; uint16_t spd = thermalManager.fan_speed[0]; if (spd) { #if ENABLED(ADAPTIVE_FAN_SLOWING) if (!blink && thermalManager.fan_speed_scaler[0] < 128) { spd = thermalManager.scaledFanSpeed(0, spd); c = '*'; } #endif lcd_put_u8str(STATUS_FAN_TEXT_X, STATUS_FAN_TEXT_Y, i16tostr3rj(thermalManager.fanPercent(spd))); lcd_put_wchar(c); } #ifdef PPK_LCD_AUTOFAN else { lcd_put_u8str_P(STATUS_FAN_TEXT_X+4, STATUS_FAN_TEXT_Y, PSTR("OFF")); } #endif } #ifdef PPK_LCD_AUTOFAN if (thermalManager.state_autofan) lcd_put_u8str_P(PPK_LCD_AUTOFAN_X+5, STATUS_FAN_TEXT_Y, PSTR("ON")); else lcd_put_u8str_P(PPK_LCD_AUTOFAN_X+3, STATUS_FAN_TEXT_Y, PSTR("OFF")); #endif #endif kod od radku 536 #if DO_DRAW_FAN #if STATUS_FAN_FRAMES > 2 static bool old_blink; static uint8_t fan_frame; if (old_blink != blink) { old_blink = blink; if (!thermalManager.fan_speed[0] || ++fan_frame >= STATUS_FAN_FRAMES) fan_frame = 0; } #endif if (PAGE_CONTAINS(STATUS_FAN_Y, STATUS_FAN_Y + STATUS_FAN_HEIGHT - 1)) u8g.drawBitmapP(STATUS_FAN_X, STATUS_FAN_Y, STATUS_FAN_BYTEWIDTH, STATUS_FAN_HEIGHT, #if STATUS_FAN_FRAMES > 2 fan_frame == 1 ? status_fan1_bmp : fan_frame == 2 ? status_fan2_bmp : #if STATUS_FAN_FRAMES > 3 fan_frame == 3 ? status_fan3_bmp : #endif #elif STATUS_FAN_FRAMES > 1 blink && thermalManager.fan_speed[0] ? status_fan1_bmp : #endif status_fan0_bmp ); #endif zmenit na novy kod #if DO_DRAW_FAN #if STATUS_FAN_FRAMES > 2 static bool old_blink; static uint8_t fan_frame; #ifdef PPK_LCD_AUTOFAN static bool old_afanblink; static uint8_t fan_afanframe; #endif if (old_blink != blink) { old_blink = blink; if (!thermalManager.fan_speed[0] || ++fan_frame >= STATUS_FAN_FRAMES) fan_frame = 0; } #ifdef PPK_LCD_AUTOFAN if (old_afanblink != blink) { old_afanblink = blink; if (!thermalManager.state_autofan || ++fan_afanframe >= STATUS_FAN_FRAMES) fan_afanframe = 0; } #endif #endif if (PAGE_CONTAINS(STATUS_FAN_Y, STATUS_FAN_Y + STATUS_FAN_HEIGHT - 1)) u8g.drawBitmapP(STATUS_FAN_X, STATUS_FAN_Y, STATUS_FAN_BYTEWIDTH, STATUS_FAN_HEIGHT, #if STATUS_FAN_FRAMES > 2 fan_frame == 1 ? status_fan1_bmp : fan_frame == 2 ? status_fan2_bmp : #if STATUS_FAN_FRAMES > 3 fan_frame == 3 ? status_fan3_bmp : #endif #elif STATUS_FAN_FRAMES > 1 blink && thermalManager.fan_speed[0] ? status_fan1_bmp : #endif status_fan0_bmp ); #ifdef PPK_LCD_AUTOFAN u8g.drawBitmapP(PPK_LCD_AUTOFAN_X, STATUS_FAN_Y, STATUS_FAN_BYTEWIDTH, STATUS_FAN_HEIGHT, #if STATUS_FAN_FRAMES > 2 fan_afanframe == 1 ? status_fan1_bmp : fan_afanframe == 2 ? status_fan2_bmp : #if STATUS_FAN_FRAMES > 3 fan_afanframe == 3 ? status_fan3_bmp : #endif #elif STATUS_FAN_FRAMES > 1 blink && thermalManager.state_autofan ? status_fan1_bmp : #endif status_fan0_bmp ); #endif #endif src\module\temperature.h do definice class Temperature na konec casti public pred zacatek casti private (od radku 377) pridan kod #ifdef PPK_LCD_AUTOFAN static uint8_t state_autofan; #endif src\module\temperature.cpp na radek 155 pridan kod #ifdef PPK_LCD_AUTOFAN uint8_t Temperature::state_autofan; #endif upravit funkci Temperature::init(), za radek 1741 do ni pridat kod #ifdef PPK_LCD_AUTOFAN state_autofan = 0; #endif upravit funkci Temperature::checkExtruderAutoFans(), od radku 703 v ni puvodni kod #define _UPDATE_AUTO_FAN(P,D,A) do{ \ if (PWM_PIN(P##_AUTO_FAN_PIN) && A < 255) \ analogWrite(pin_t(P##_AUTO_FAN_PIN), D ? A : 0); \ else \ WRITE(P##_AUTO_FAN_PIN, D); \ }while(0) zmenit na novy kod #ifdef PPK_LCD_AUTOFAN #define _UPDATE_AUTO_FAN(P,D,A) do{ \ if (PWM_PIN(P##_AUTO_FAN_PIN) && A < 255) \ analogWrite(pin_t(P##_AUTO_FAN_PIN), D ? A : 0); \ else \ { \ WRITE(P##_AUTO_FAN_PIN, D); \ state_autofan = D; \ } \ }while(0) #else #define _UPDATE_AUTO_FAN(P,D,A) do{ \ if (PWM_PIN(P##_AUTO_FAN_PIN) && A < 255) \ analogWrite(pin_t(P##_AUTO_FAN_PIN), D ? A : 0); \ else \ WRITE(P##_AUTO_FAN_PIN, D); \ }while(0) #endif ------------------------------------------------------------------------------- 4. Uprava aby se na status screen udaje procenta tisku - ubehnuty cas - zbyvajici cas stridaly pomaleji (2x pomaleji) dale upraveno tak, ze text R: u zbyvajiciho casu se zobrazuje vzdy, ikdyz je retezec prazdny src\lcd\dogm\status_screen_DOGM.cpp puvodni kod od radku 678 if (prev_blink != blink) { prev_blink = blink; if (++progress_state >= 3) progress_state = 0; } if (progress_state == 0) { if (progress_string[0]) { lcd_put_u8str(progress_x_pos, EXTRAS_BASELINE, progress_string); lcd_put_wchar('%'); } } else if (progress_state == 2 && estimation_string[0]) { lcd_put_u8str_P(PROGRESS_BAR_X, EXTRAS_BASELINE, PSTR("R:")); lcd_put_u8str(estimation_x_pos, EXTRAS_BASELINE, estimation_string); } byl nahrazen novym kodem #ifdef PPK_SLOW_ROTATE_PROGRESS_DISPLAY if (prev_blink != blink) { prev_blink = blink; if (++progress_state >= 6) progress_state = 0; } if ((progress_state>>1) == 0) { if (progress_string[0]) { lcd_put_u8str(progress_x_pos, EXTRAS_BASELINE, progress_string); lcd_put_wchar('%'); } } else if ((progress_state>>1) == 2) { lcd_put_u8str_P(PROGRESS_BAR_X, EXTRAS_BASELINE, PSTR("R:")); lcd_put_u8str(estimation_x_pos, EXTRAS_BASELINE, estimation_string); } #else if (prev_blink != blink) { prev_blink = blink; if (++progress_state >= 3) progress_state = 0; } if (progress_state == 0) { if (progress_string[0]) { lcd_put_u8str(progress_x_pos, EXTRAS_BASELINE, progress_string); lcd_put_wchar('%'); } } else if (progress_state == 2 && estimation_string[0]) { lcd_put_u8str_P(PROGRESS_BAR_X, EXTRAS_BASELINE, PSTR("R:")); lcd_put_u8str(estimation_x_pos, EXTRAS_BASELINE, estimation_string); } #endif ------------------------------------------------------------------------------- 5. Uprava aby se menu ladeni zobrazovala i v klidu src\lcd\menu\menu_main.cpp ve funkci menu_main() v casti zpracovane jen kdyz je busy=true (radek 106) puvodni kod SUBMENU(MSG_TUNE, menu_tune); zmenit na novy kod #ifndef PPK_LCD_MENU_TUNE_ALLWAYS SUBMENU(MSG_TUNE, menu_tune); #endif a nasledne ve funkci menu_main() za toutu casti pro busy=true i busy=false na radek 151 (tj. az za uplny konec casti if (busy) { } else { } ) pridat novy kod #ifdef PPK_LCD_MENU_TUNE_ALLWAYS SUBMENU(MSG_TUNE, menu_tune); #endif ------------------------------------------------------------------------------- 6. Uprava pro nulovani udaje o zbyvajicim case tisku soucasne s resetovanim stavoveho radku - castecne je to nahradni reseni na stav, kdy po skonceni tisku je stale zobrazovan zbyvajici cas tisku (typicky 1 minuta), protoze jiz je zastaven casovac a neaktualizuje se tak promena ev, ktera ridi ve vypisu status screen vypis aktualniho stavu, tj. nikdy se to samo nezmeni na zbyvajici cas 0, ktery by byl ve vypisu nahrazen prazdnym retezcem src\gcode\lcd\M117.cpp puvodni kod na radku 34 ui.reset_status(); zmenen na novy kod #ifdef PPK_RESET_REMAINTIME_WITH_STATUS { ui.reset_remaining_time(); ui.reset_status(); } #else ui.reset_status(); #endif ------------------------------------------------------------------------------- 7. Uprava, ktera resi problem, kdy udaj o zbyvajicim case tisku, ktery je jiz nastaven prikazem M73, ktery slicer umisti na uplny pocatek gcode, tak je pri startu casovace volanem z rutiny, ktera zpracovava prikaz pro cekani na dosazeni teploty, udaj zapsany jiz prikazem M73 nulovan, tj. misto casu udaneho slicerem se vypisuje cas vypocteny z ubehnuteho casu tisku od nastartovani casovace a podilu jiz zpracovane delky gcodu vuci delce celeho souboru gcode na SD karte uprava dela dve veci - jednak ve startu casovace zrusi resetovani udaje o zbyvajicim case a jednak nulovani tohoto udaje prida do startu zpracovani gcode z SD karty src\MarlinCore.cpp puvodni funkce startOrResumeJob() od radku 399 void startOrResumeJob() { if (!printingIsPaused()) { #if ENABLED(CANCEL_OBJECTS) cancelable.reset(); #endif #if ENABLED(LCD_SHOW_E_TOTAL) e_move_accumulator = 0; #endif #if BOTH(LCD_SET_PROGRESS_MANUALLY, USE_M73_REMAINING_TIME) ui.reset_remaining_time(); #endif } print_job_timer.start(); } zmenena na novy kod void startOrResumeJob() { if (!printingIsPaused()) { #if ENABLED(CANCEL_OBJECTS) cancelable.reset(); #endif #if ENABLED(LCD_SHOW_E_TOTAL) e_move_accumulator = 0; #endif #if BOTH(LCD_SET_PROGRESS_MANUALLY, USE_M73_REMAINING_TIME) #ifndef PPK_NO_RESET_REMAINTIME_WHEN_WAIT_TO_TEMP ui.reset_remaining_time(); #endif #endif } print_job_timer.start(); } src\lcd\menu\menu_media.cpp puvodni funkce sdcard_start_selected_file() od radku 69 inline void sdcard_start_selected_file() { card.openAndPrintFile(card.filename); ui.return_to_status(); ui.reset_status(); } zmenena na novy kod inline void sdcard_start_selected_file() { #ifdef PPK_NO_RESET_REMAINTIME_WHEN_WAIT_TO_TEMP ui.reset_remaining_time(); #endif card.openAndPrintFile(card.filename); ui.return_to_status(); ui.reset_status(); } ------------------------------------------------------------------------------- pomocne definice v konfiguraci pro ovladani vyse uvedenych zmen Configuration_adv.h na konec pridan tento kod //////////////////// //sekce uprav OK2PPK //////////////////// //pokud je definovan PPK_BOOTSCREEN_MACHINENAME, tak se v BOOTSCREN misto //puvodniho retezce MARLIN_WEBSITE_URL zobrazi retezec MACHINE_NAME #define PPK_BOOTSCREEN_MACHINENAME //pokud je definovan PPK_LCD_AUTOFAN, tak se aktivuji upravy //pridavajici na stavovou obrazovku stav automaticky spousteneho ventilatoru //chlazeni hetabreaku a stav standarniho ventilatroru 0% se misto mezer //vypisuje jako OFF #define PPK_LCD_AUTOFAN #ifdef PPK_LCD_AUTOFAN //vzdalenost ikony ventilatoru od leveho okraje #define PPK_LCD_AUTOFAN_X 27 #endif //pokud je definovan PPK_LCD_MENU_TUNE_ALLWAYS, tak se menu Ladeni zobrazuje //nejen pri printu, ale i v klidovem stavu #define PPK_LCD_MENU_TUNE_ALLWAYS //pokud je definovan PPK_SLOW_ROTATE_PROGRESS_DISPLAY, tak se udaje //procenta, ubehnuty cas a zbyvajici cas na displeji stridaji 2x pomaleji //nez normalne #define PPK_SLOW_ROTATE_PROGRESS_DISPLAY //pokud je definovan PPK_RESET_REMAINTIME_WITH_STATUS, tak se spolu //se stavovym radkem resetuje i udaj o zbyvajicim case tisku #define PPK_RESET_REMAINTIME_WITH_STATUS //pokud je definovan PPK_NO_RESET_REMAINTIME_WHEN_WAIT_TO_TEMP, tak se behem //cekani na dosazeni teploty pri startu casovace nebude nulovat udaj o zbyvajicim //case, ktery byl jiz nastaven prvnim prikazem M73, udaj se preventivne misto //toho vynuluje pri startu tisku z SD karty #define PPK_NO_RESET_REMAINTIME_WHEN_WAIT_TO_TEMP //konec -------------------------------------------------------------------------------