From 796079bb0879ffcb346e32c6803f32b6ec825898 Mon Sep 17 00:00:00 2001 From: Robert Pelnar Date: Thu, 9 Aug 2018 17:43:43 +0200 Subject: [PATCH] MMU2 communication - connection after reset, fw versions, state machine +removed debug log from tmc2130 --- Firmware/Marlin_main.cpp | 19 ++----- Firmware/menu.cpp | 5 +- Firmware/menu.h | 2 +- Firmware/mmu.cpp | 109 ++++++++++++++++++++++++--------------- Firmware/mmu.h | 10 ++-- Firmware/tmc2130.cpp | 30 +++++------ Firmware/ultralcd.cpp | 37 +++++++++---- 7 files changed, 124 insertions(+), 88 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index af2942d1..543d17b9 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -1157,7 +1157,9 @@ void list_sec_lang_from_external_flash() // are initialized by the main() routine provided by the Arduino framework. void setup() { - ultralcd_init(); + mmu_init(); + + ultralcd_init(); spi_init(); @@ -1777,11 +1779,6 @@ void setup() wdt_enable(WDTO_4S); #endif //WATCHDOG - puts_P(_N("Checking MMU unit...")); - if (mmu_init()) - printf_P(_N("MMU ENABLED, finda=%hhd, version=%d\n"), mmu_finda, mmu_version); - else - puts_P(_N("MMU DISABLED")); } @@ -2015,7 +2012,7 @@ void loop() } } #endif //TMC2130 - + mmu_loop(); } #define DEFINE_PGM_READ_ANY(type, reader) \ @@ -3478,14 +3475,6 @@ void process_commands() { mmu_reset(); } - else if (code_seen("MMUFIN")) - { - mmu_read_finda(); - } - else if (code_seen("MMUVER")) - { - mmu_read_version(); - } else if (code_seen("RESET")) { // careful! if (farm_mode) { diff --git a/Firmware/menu.cpp b/Firmware/menu.cpp index 33e6184c..20d92385 100644 --- a/Firmware/menu.cpp +++ b/Firmware/menu.cpp @@ -116,7 +116,7 @@ uint8_t menu_item_ret(void) } /* -int menu_item_printf_P(char type_char, const char* format, ...) +int menu_draw_item_printf_P(char type_char, const char* format, ...) { va_list args; va_start(args, format); @@ -134,12 +134,14 @@ int menu_item_printf_P(char type_char, const char* format, ...) return ret; } */ + int menu_draw_item_puts_P(char type_char, const char* str) { lcd_set_cursor(0, menu_row); int cnt = lcd_printf_P(PSTR("%c%-18S%c"), (lcd_encoder == menu_item)?'>':' ', str, type_char); return cnt; } + /* int menu_draw_item_puts_P_int16(char type_char, const char* str, int16_t val, ) { @@ -148,6 +150,7 @@ int menu_draw_item_puts_P_int16(char type_char, const char* str, int16_t val, ) return cnt; } */ + void menu_item_dummy(void) { menu_item++; diff --git a/Firmware/menu.h b/Firmware/menu.h index 27548657..c8237df2 100644 --- a/Firmware/menu.h +++ b/Firmware/menu.h @@ -63,7 +63,7 @@ extern void menu_submenu(menu_func_t submenu); extern uint8_t menu_item_ret(void); -//int menu_item_printf_P(char type_char, const char* format, ...); +//extern int menu_draw_item_printf_P(char type_char, const char* format, ...); extern int menu_draw_item_puts_P(char type_char, const char* str); diff --git a/Firmware/mmu.cpp b/Firmware/mmu.cpp index 9e250934..824a0648 100644 --- a/Firmware/mmu.cpp +++ b/Firmware/mmu.cpp @@ -26,6 +26,8 @@ extern char choose_extruder_menu(); bool mmu_enabled = false; +int8_t mmu_state = -1; + uint8_t mmu_extruder = 0; uint8_t tmp_extruder = 0; @@ -34,7 +36,7 @@ int8_t mmu_finda = -1; int16_t mmu_version = -1; -int16_t mmu_build = -1; +int16_t mmu_buildnr = -1; //clear rx buffer @@ -73,60 +75,81 @@ int8_t mmu_rx_start(void) return uart2_rx_str_P(PSTR("start\n")); } -//initialize mmu_unit -bool mmu_init(void) +//initialize mmu2 unit - first part - should be done at begining of startup process +void mmu_init(void) { digitalWrite(MMU_RST_PIN, HIGH); pinMode(MMU_RST_PIN, OUTPUT); //setup reset pin uart2_init(); //init uart2 _delay_ms(10); //wait 10ms for sure - if (mmu_reset()) //reset mmu - { - mmu_read_finda(); - mmu_read_version(); - return true; - } - return false; + mmu_reset(); //reset mmu (HW or SW), do not wait for response + mmu_state = -1; } -bool mmu_reset(void) +//mmu main loop - state machine processing +void mmu_loop(void) { -#ifdef MMU_HWRESET +// printf_P(PSTR("MMU loop, state=%d\n"), mmu_state); + switch (mmu_state) + { + case 0: + return; + case -1: + if (mmu_rx_start() > 0) + { + puts_P(PSTR("MMU => 'start'")); + puts_P(PSTR("MMU <= 'S1'")); + mmu_puts_P(PSTR("S1\n")); //send 'read version' request + mmu_state = -2; + } + else if (millis() > 30000) //30sec after reset disable mmu + { + puts_P(PSTR("MMU not responding - DISABLED")); + mmu_state = 0; + } + return; + case -2: + if (mmu_rx_ok() > 0) + { + fscanf_P(uart2io, PSTR("%u"), &mmu_version); //scan version from buffer + printf_P(PSTR("MMU => '%dok'\n"), mmu_version); + puts_P(PSTR("MMU <= 'S2'")); + mmu_puts_P(PSTR("S2\n")); //send 'read buildnr' request + mmu_state = -3; + } + return; + case -3: + if (mmu_rx_ok() > 0) + { + fscanf_P(uart2io, PSTR("%u"), &mmu_buildnr); //scan buildnr from buffer + printf_P(PSTR("MMU => '%dok'\n"), mmu_buildnr); + puts_P(PSTR("MMU <= 'P0'")); + mmu_puts_P(PSTR("P0\n")); //send 'read finda' request + mmu_state = -4; + } + return; + case -4: + if (mmu_rx_ok() > 0) + { + fscanf_P(uart2io, PSTR("%hhu"), &mmu_finda); //scan finda from buffer + printf_P(PSTR("MMU => '%dok'\n"), mmu_finda); + puts_P(PSTR("MMU - ENABLED")); + mmu_enabled = true; + mmu_state = 1; + } + return; + } +} + +void mmu_reset(void) +{ +#ifdef MMU_HWRESET //HW - pulse reset pin digitalWrite(MMU_RST_PIN, LOW); _delay_us(100); digitalWrite(MMU_RST_PIN, HIGH); -#else - mmu_puts_P(PSTR("X0\n")); //send command +#else //SW - send X0 command + mmu_puts_P(PSTR("X0\n")); #endif - unsigned char timeout = MMU_TIMEOUT; //timeout = 10x100ms - while ((mmu_rx_start() <= 0) && (--timeout)) - delay_keep_alive(MMU_TODELAY); - mmu_enabled = timeout?true:false; -// mmu_enabled = true; - return mmu_enabled; -} - -int8_t mmu_read_finda(void) -{ - mmu_puts_P(PSTR("P0\n")); - unsigned char timeout = MMU_TIMEOUT; //10x100ms - while ((mmu_rx_ok() <= 0) && (--timeout)) - delay_keep_alive(MMU_TODELAY); - mmu_finda = -1; - if (timeout) - fscanf_P(uart2io, PSTR("%hhu"), &mmu_finda); - return mmu_finda; -} - -int16_t mmu_read_version(void) -{ - mmu_puts_P(PSTR("S1\n")); - unsigned char timeout = MMU_TIMEOUT; //10x100ms - while ((mmu_rx_ok() <= 0) && (--timeout)) - delay_keep_alive(MMU_TODELAY); - if (timeout) - fscanf_P(uart2io, PSTR("%u"), &mmu_version); - return mmu_version; } int8_t mmu_set_filament_type(uint8_t extruder, uint8_t filament) diff --git a/Firmware/mmu.h b/Firmware/mmu.h index 65bce969..9411ec37 100644 --- a/Firmware/mmu.h +++ b/Firmware/mmu.h @@ -5,6 +5,8 @@ extern bool mmu_enabled; +extern int8_t mmu_state; + extern uint8_t mmu_extruder; extern uint8_t tmp_extruder; @@ -12,6 +14,7 @@ extern uint8_t tmp_extruder; extern int8_t mmu_finda; extern int16_t mmu_version; +extern int16_t mmu_buildnr; extern int mmu_puts_P(const char* str); @@ -21,13 +24,12 @@ extern int mmu_printf_P(const char* format, ...); extern int8_t mmu_rx_ok(void); -extern bool mmu_init(void); +extern void mmu_init(void); -extern bool mmu_reset(void); +extern void mmu_loop(void); -extern int8_t mmu_read_finda(void); -extern int16_t mmu_read_version(void); +extern void mmu_reset(void); extern int8_t mmu_set_filament_type(uint8_t extruder, uint8_t filament); diff --git a/Firmware/tmc2130.cpp b/Firmware/tmc2130.cpp index d4295701..35b61ecc 100644 --- a/Firmware/tmc2130.cpp +++ b/Firmware/tmc2130.cpp @@ -150,7 +150,7 @@ uint16_t __tcoolthrs(uint8_t axis) void tmc2130_init() { - DBG(_n("tmc2130_init(), mode=%S\n"), tmc2130_mode?_n("STEALTH"):_n("NORMAL")); +// DBG(_n("tmc2130_init(), mode=%S\n"), tmc2130_mode?_n("STEALTH"):_n("NORMAL")); WRITE(X_TMC2130_CS, HIGH); WRITE(Y_TMC2130_CS, HIGH); WRITE(Z_TMC2130_CS, HIGH); @@ -442,8 +442,8 @@ void tmc2130_setup_chopper(uint8_t axis, uint8_t mres, uint8_t current_h, uint8_ // toff = TMC2130_TOFF_E; // toff = 3-5 // rndtf = 1; } - DBG(_n("tmc2130_setup_chopper(axis=%hhd, mres=%hhd, curh=%hhd, curr=%hhd\n"), axis, mres, current_h, current_r); - DBG(_n(" toff=%hhd, hstr=%hhd, hend=%hhd, tbl=%hhd\n"), toff, hstrt, hend, tbl); +// DBG(_n("tmc2130_setup_chopper(axis=%hhd, mres=%hhd, curh=%hhd, curr=%hhd\n"), axis, mres, current_h, current_r); +// DBG(_n(" toff=%hhd, hstr=%hhd, hend=%hhd, tbl=%hhd\n"), toff, hstrt, hend, tbl); if (current_r <= 31) { tmc2130_wr_CHOPCONF(axis, toff, hstrt, hend, fd3, 0, rndtf, chm, tbl, 1, 0, 0, 0, mres, intpol, 0, 0); @@ -458,31 +458,31 @@ void tmc2130_setup_chopper(uint8_t axis, uint8_t mres, uint8_t current_h, uint8_ void tmc2130_set_current_h(uint8_t axis, uint8_t current) { - DBG(_n("tmc2130_set_current_h(axis=%d, current=%d\n"), axis, current); +// DBG(_n("tmc2130_set_current_h(axis=%d, current=%d\n"), axis, current); tmc2130_current_h[axis] = current; tmc2130_setup_chopper(axis, tmc2130_mres[axis], tmc2130_current_h[axis], tmc2130_current_r[axis]); } void tmc2130_set_current_r(uint8_t axis, uint8_t current) { - DBG(_n("tmc2130_set_current_r(axis=%d, current=%d\n"), axis, current); +// DBG(_n("tmc2130_set_current_r(axis=%d, current=%d\n"), axis, current); tmc2130_current_r[axis] = current; tmc2130_setup_chopper(axis, tmc2130_mres[axis], tmc2130_current_h[axis], tmc2130_current_r[axis]); } void tmc2130_print_currents() { - DBG(_n("tmc2130_print_currents()\n\tH\tR\nX\t%d\t%d\nY\t%d\t%d\nZ\t%d\t%d\nE\t%d\t%d\n"), - tmc2130_current_h[0], tmc2130_current_r[0], - tmc2130_current_h[1], tmc2130_current_r[1], - tmc2130_current_h[2], tmc2130_current_r[2], - tmc2130_current_h[3], tmc2130_current_r[3] - ); +// DBG(_n("tmc2130_print_currents()\n\tH\tR\nX\t%d\t%d\nY\t%d\t%d\nZ\t%d\t%d\nE\t%d\t%d\n"), +// tmc2130_current_h[0], tmc2130_current_r[0], +// tmc2130_current_h[1], tmc2130_current_r[1], +// tmc2130_current_h[2], tmc2130_current_r[2], +// tmc2130_current_h[3], tmc2130_current_r[3] +// ); } void tmc2130_set_pwm_ampl(uint8_t axis, uint8_t pwm_ampl) { - DBG(_n("tmc2130_set_pwm_ampl(axis=%hhd, pwm_ampl=%hhd\n"), axis, pwm_ampl); +// DBG(_n("tmc2130_set_pwm_ampl(axis=%hhd, pwm_ampl=%hhd\n"), axis, pwm_ampl); tmc2130_pwm_ampl[axis] = pwm_ampl; if (((axis == 0) || (axis == 1)) && (tmc2130_mode == TMC2130_MODE_SILENT)) tmc2130_wr_PWMCONF(axis, tmc2130_pwm_ampl[axis], tmc2130_pwm_grad[axis], tmc2130_pwm_freq[axis], tmc2130_pwm_auto[axis], 0, 0); @@ -490,7 +490,7 @@ void tmc2130_set_pwm_ampl(uint8_t axis, uint8_t pwm_ampl) void tmc2130_set_pwm_grad(uint8_t axis, uint8_t pwm_grad) { - DBG(_n("tmc2130_set_pwm_grad(axis=%hhd, pwm_grad=%hhd\n"), axis, pwm_grad); +// DBG(_n("tmc2130_set_pwm_grad(axis=%hhd, pwm_grad=%hhd\n"), axis, pwm_grad); tmc2130_pwm_grad[axis] = pwm_grad; if (((axis == 0) || (axis == 1)) && (tmc2130_mode == TMC2130_MODE_SILENT)) tmc2130_wr_PWMCONF(axis, tmc2130_pwm_ampl[axis], tmc2130_pwm_grad[axis], tmc2130_pwm_freq[axis], tmc2130_pwm_auto[axis], 0, 0); @@ -852,12 +852,12 @@ void tmc2130_set_wave(uint8_t axis, uint8_t amp, uint8_t fac1000) { // TMC2130 wave compression algorithm // optimized for minimal memory requirements - printf_P(PSTR("tmc2130_set_wave %hhd %hhd\n"), axis, fac1000); +// printf_P(PSTR("tmc2130_set_wave %hhd %hhd\n"), axis, fac1000); if (fac1000 < TMC2130_WAVE_FAC1000_MIN) fac1000 = 0; if (fac1000 > TMC2130_WAVE_FAC1000_MAX) fac1000 = TMC2130_WAVE_FAC1000_MAX; float fac = 0; if (fac1000) fac = ((float)((uint16_t)fac1000 + 1000) / 1000); //correction factor - printf_P(PSTR(" factor: %s\n"), ftostr43(fac)); +// printf_P(PSTR(" factor: %s\n"), ftostr43(fac)); uint8_t vA = 0; //value of currentA uint8_t va = 0; //previous vA int8_t d0 = 0; //delta0 diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 831a3a08..1908b7ce 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -225,9 +225,7 @@ bool wait_for_unclick; - - - +const char STR_SEPARATOR[] PROGMEM = "------------"; @@ -2177,7 +2175,8 @@ static void lcd_preheat_menu() static void lcd_support_menu() { - if (menuData.supportMenu.status == 0 || lcd_draw_update == 2) { + if (menuData.supportMenu.status == 0 || lcd_draw_update == 2) + { // Menu was entered or SD card status has changed (plugged in or removed). // Initialize its status. menuData.supportMenu.status = 1; @@ -2189,7 +2188,8 @@ static void lcd_support_menu() } else if (menuData.supportMenu.is_flash_air && menuData.supportMenu.ip[0] == 0 && menuData.supportMenu.ip[1] == 0 && menuData.supportMenu.ip[2] == 0 && menuData.supportMenu.ip[3] == 0 && - ++ menuData.supportMenu.status == 16) { + ++ menuData.supportMenu.status == 16) + { // Waiting for the FlashAir card to get an IP address from a router. Force an update. menuData.supportMenu.status = 0; } @@ -2214,22 +2214,41 @@ static void lcd_support_menu() MENU_ITEM_BACK_P(_i("prusa3d.com"));////MSG_PRUSA3D c=0 r=0 MENU_ITEM_BACK_P(_i("forum.prusa3d.com"));////MSG_PRUSA3D_FORUM c=0 r=0 MENU_ITEM_BACK_P(_i("howto.prusa3d.com"));////MSG_PRUSA3D_HOWTO c=0 r=0 - MENU_ITEM_BACK_P(PSTR("------------")); + MENU_ITEM_BACK_P(STR_SEPARATOR); MENU_ITEM_BACK_P(PSTR(FILAMENT_SIZE)); MENU_ITEM_BACK_P(PSTR(ELECTRONICS)); MENU_ITEM_BACK_P(PSTR(NOZZLE_TYPE)); - MENU_ITEM_BACK_P(PSTR("------------")); + MENU_ITEM_BACK_P(STR_SEPARATOR); MENU_ITEM_BACK_P(_i("Date:"));////MSG_DATE c=17 r=1 MENU_ITEM_BACK_P(PSTR(__DATE__)); + MENU_ITEM_BACK_P(STR_SEPARATOR); + if (mmu_enabled) + { + MENU_ITEM_BACK_P(PSTR("MMU2 connected")); + MENU_ITEM_BACK_P(PSTR(" FW:")); + if (((menu_item - 1) == menu_line) && lcd_draw_update) + { + lcd_set_cursor(6, menu_row); + if ((mmu_version > 0) && (mmu_buildnr > 0)) + lcd_printf_P(PSTR("%d.%d.%d-%d"), mmu_version/100, mmu_version%100/10, mmu_version%10, mmu_buildnr); + else + lcd_puts_P(PSTR("unknown")); + } + } + else + MENU_ITEM_BACK_P(PSTR("MMU2 N/A")); + + // Show the FlashAir IP address, if the card is available. if (menuData.supportMenu.is_flash_air) { - MENU_ITEM_BACK_P(PSTR("------------")); + MENU_ITEM_BACK_P(STR_SEPARATOR); MENU_ITEM_BACK_P(PSTR("FlashAir IP Addr:")); ///! MENU_ITEM(back_RAM, menuData.supportMenu.ip_str, 0); } + #ifndef MK1BP - MENU_ITEM_BACK_P(PSTR("------------")); + MENU_ITEM_BACK_P(STR_SEPARATOR); MENU_ITEM_SUBMENU_P(_i("XYZ cal. details"), lcd_menu_xyz_y_min);////MSG_XYZ_DETAILS c=19 r=1 MENU_ITEM_SUBMENU_P(_i("Extruder info"), lcd_menu_extruder_info);////MSG_INFO_EXTRUDER c=15 r=1