From 12db840c9678601995df7016422c31ff86c6b9b7 Mon Sep 17 00:00:00 2001 From: jba Date: Sun, 28 Jun 2020 22:55:26 +1000 Subject: [PATCH 01/31] Initial commit for AI3M support (with bltouch). All functions believed working, except pause with heater timeout (not verified) --- Marlin/Configuration.h | 168 +-- Marlin/Configuration_adv.h | 42 +- .../lcd/extui/lib/anycubic/anycubic_TFT.cpp | 1026 +++++++++++++++++ .../src/lcd/extui/lib/anycubic/anycubic_TFT.h | 109 ++ .../extui/lib/anycubic/anycubic_serial.cpp | 309 +++++ .../lcd/extui/lib/anycubic/anycubic_serial.h | 149 +++ Marlin/src/lcd/extui_anycubic_tft.cpp | 140 +++ Marlin/src/pins/ramps/pins_TRIGORILLA_14.h | 22 + 8 files changed, 1871 insertions(+), 94 deletions(-) create mode 100644 Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp create mode 100644 Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h create mode 100644 Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.cpp create mode 100644 Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.h create mode 100644 Marlin/src/lcd/extui_anycubic_tft.cpp diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 6daedf815641..27c1e2fab3c0 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -128,7 +128,7 @@ // Choose the name from boards.h that matches your setup #ifndef MOTHERBOARD - #define MOTHERBOARD BOARD_RAMPS_14_EFB + #define MOTHERBOARD BOARD_TRIGORILLA_14 #endif // Name displayed in the LCD "Ready" message and Info menu @@ -416,7 +416,7 @@ * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. */ -#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_0 5 #define TEMP_SENSOR_1 0 #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 @@ -424,7 +424,7 @@ #define TEMP_SENSOR_5 0 #define TEMP_SENSOR_6 0 #define TEMP_SENSOR_7 0 -#define TEMP_SENSOR_BED 0 +#define TEMP_SENSOR_BED 1 #define TEMP_SENSOR_PROBE 0 #define TEMP_SENSOR_CHAMBER 0 @@ -489,10 +489,15 @@ // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it + // i3 Mega stock v5 hotend, 40W heater cartridge (3.6Ω @ 22°C) + #define DEFAULT_Kp 15.94 + #define DEFAULT_Ki 1.17 + #define DEFAULT_Kd 54.19 + // Ultimaker - #define DEFAULT_Kp 22.2 - #define DEFAULT_Ki 1.08 - #define DEFAULT_Kd 114 + // #define DEFAULT_Kp 22.2 + // #define DEFAULT_Ki 1.08 + // #define DEFAULT_Kd 114 // MakerGear //#define DEFAULT_Kp 7.0 @@ -523,7 +528,7 @@ * heater. If your configuration is significantly different than this and you don't understand * the issues involved, don't use bed PID until someone else verifies that your hardware works. */ -//#define PIDTEMPBED +#define PIDTEMPBED //#define BED_LIMIT_SWITCHING @@ -539,11 +544,10 @@ //#define MIN_BED_POWER 0 //#define PID_BED_DEBUG // Sends debug data to the serial port. - //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) - //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) - #define DEFAULT_bedKp 10.00 - #define DEFAULT_bedKi .023 - #define DEFAULT_bedKd 305.4 + //Anycubic i3 Mega Ultrabase (0.9Ω @ 22°C) + #define DEFAULT_bedKp 251.78 + #define DEFAULT_bedKi 49.57 + #define DEFAULT_bedKd 319.73 //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) //from pidautotune @@ -629,7 +633,7 @@ #define USE_XMIN_PLUG #define USE_YMIN_PLUG #define USE_ZMIN_PLUG -//#define USE_XMAX_PLUG +#define USE_XMAX_PLUG //#define USE_YMAX_PLUG //#define USE_ZMAX_PLUG @@ -660,13 +664,13 @@ #endif // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). -#define X_MIN_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. -#define Y_MIN_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. -#define Z_MIN_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. -#define X_MAX_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. -#define Y_MAX_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. -#define Z_MAX_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. -#define Z_MIN_PROBE_ENDSTOP_INVERTING false // Set to true to invert the logic of the probe. +#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the probe. /** * Stepper Drivers @@ -684,19 +688,20 @@ * TMC5130, TMC5130_STANDALONE, TMC5160, TMC5160_STANDALONE * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'L6474', 'POWERSTEP01', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2160', 'TMC2160_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC2209', 'TMC2209_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE', 'TMC5160', 'TMC5160_STANDALONE'] */ -//#define X_DRIVER_TYPE A4988 -//#define Y_DRIVER_TYPE A4988 -//#define Z_DRIVER_TYPE A4988 -//#define X2_DRIVER_TYPE A4988 -//#define Y2_DRIVER_TYPE A4988 -//#define Z2_DRIVER_TYPE A4988 -//#define Z3_DRIVER_TYPE A4988 -//#define Z4_DRIVER_TYPE A4988 -//#define E0_DRIVER_TYPE A4988 -//#define E1_DRIVER_TYPE A4988 -//#define E2_DRIVER_TYPE A4988 -//#define E3_DRIVER_TYPE A4988 -//#define E4_DRIVER_TYPE A4988 + +#define X_DRIVER_TYPE TMC2208_STANDALONE +#define Y_DRIVER_TYPE TMC2208_STANDALONE +#define Z_DRIVER_TYPE TMC2208_STANDALONE +#define X2_DRIVER_TYPE TMC2208_STANDALONE +#define Y2_DRIVER_TYPE TMC2208_STANDALONE +#define Z2_DRIVER_TYPE TMC2208_STANDALONE +#define Z3_DRIVER_TYPE TMC2208_STANDALONE +#define Z4_DRIVER_TYPE TMC2208_STANDALONE +#define E0_DRIVER_TYPE TMC2208_STANDALONE +#define E1_DRIVER_TYPE TMC2208_STANDALONE +#define E2_DRIVER_TYPE TMC2208_STANDALONE +#define E3_DRIVER_TYPE TMC2208_STANDALONE +#define E4_DRIVER_TYPE TMC2208_STANDALONE //#define E5_DRIVER_TYPE A4988 //#define E6_DRIVER_TYPE A4988 //#define E7_DRIVER_TYPE A4988 @@ -744,14 +749,13 @@ * Override with M92 * X, Y, Z, E0 [, E1[, E2...]] */ -#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 500 } - +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 400, 92.6 } /** * Default Max Feed Rate (mm/s) * Override with M203 * X, Y, Z, E0 [, E1[, E2...]] */ -#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } +#define DEFAULT_MAX_FEEDRATE { 500, 500, 6, 60 } //#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 #if ENABLED(LIMITED_MAX_FR_EDITING) @@ -764,7 +768,7 @@ * Override with M201 * X, Y, Z, E0 [, E1[, E2...]] */ -#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } +#define DEFAULT_MAX_ACCELERATION { 3000, 2000, 60, 10000 } //#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 #if ENABLED(LIMITED_MAX_ACCEL_EDITING) @@ -779,7 +783,7 @@ * M204 R Retract Acceleration * M204 T Travel Acceleration */ -#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_ACCELERATION 1500 // X, Y, Z and E acceleration for printing moves #define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves @@ -793,9 +797,9 @@ */ //#define CLASSIC_JERK #if ENABLED(CLASSIC_JERK) - #define DEFAULT_XJERK 10.0 - #define DEFAULT_YJERK 10.0 - #define DEFAULT_ZJERK 0.3 + #define DEFAULT_XJERK 10.0 + #define DEFAULT_YJERK 10.0 + #define DEFAULT_ZJERK 0.4 //#define TRAVEL_EXTRA_XYJERK 0.0 // Additional jerk allowance for all travel moves @@ -828,7 +832,7 @@ * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -//#define S_CURVE_ACCELERATION +#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= @@ -844,8 +848,7 @@ * The probe replaces the Z-MIN endstop and is used for Z homing. * (Automatically enables USE_PROBE_FOR_Z_HOMING.) */ -#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN - +//#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN // Force the use of the probe for Z-axis homing //#define USE_PROBE_FOR_Z_HOMING @@ -903,7 +906,7 @@ /** * The BLTouch probe uses a Hall effect sensor and emulates a servo. */ -//#define BLTOUCH +#define BLTOUCH /** * Pressure sensor with a BLTouch-like interface @@ -980,7 +983,7 @@ * * Specify a Probe position as { X, Y, Z } */ -#define NOZZLE_TO_PROBE_OFFSET { 10, 10, 0 } +#define NOZZLE_TO_PROBE_OFFSET { 0, -23, -1.54 } // Most probes should stay away from the edges of the bed, but // with NOZZLE_AS_PROBE this can be negative for a wider probing area. @@ -1004,8 +1007,8 @@ * A total of 2 does fast/slow probes with a weighted average. * A total of 3 or more adds more slow probes, taking the average. */ -//#define MULTIPLE_PROBING 2 -//#define EXTRA_PROBING 1 +#define MULTIPLE_PROBING 2 +#define EXTRA_PROBING 1 /** * Z probes require clearance when deploying, stowing, and moving between @@ -1033,7 +1036,7 @@ #define Z_PROBE_OFFSET_RANGE_MAX 20 // Enable the M48 repeatability test to test probe accuracy -//#define Z_MIN_PROBE_REPEATABILITY_TEST +#define Z_MIN_PROBE_REPEATABILITY_TEST // Before deploy/stow pause for user confirmation //#define PAUSE_BEFORE_DEPLOY_STOW @@ -1080,8 +1083,8 @@ // @section machine // Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. -#define INVERT_X_DIR false -#define INVERT_Y_DIR true +#define INVERT_X_DIR true +#define INVERT_Y_DIR false #define INVERT_Z_DIR false // @section extruder @@ -1116,16 +1119,16 @@ // @section machine // The size of the print bed -#define X_BED_SIZE 200 -#define Y_BED_SIZE 200 +#define X_BED_SIZE 215 +#define Y_BED_SIZE 215 // Travel limits (mm) after homing, corresponding to endstop positions. -#define X_MIN_POS 0 +#define X_MIN_POS -5 #define Y_MIN_POS 0 #define Z_MIN_POS 0 #define X_MAX_POS X_BED_SIZE #define Y_MAX_POS Y_BED_SIZE -#define Z_MAX_POS 200 +#define Z_MAX_POS 205 /** * Software Endstops @@ -1164,16 +1167,18 @@ * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. * By default the firmware assumes HIGH=FILAMENT PRESENT. */ -//#define FILAMENT_RUNOUT_SENSOR +#define FILAMENT_RUNOUT_SENSOR #if ENABLED(FILAMENT_RUNOUT_SENSOR) #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. - #define FIL_RUNOUT_INVERTING false // Set to true to invert the logic of the sensor. + #define FIL_RUNOUT_INVERTING true // Set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. // Set one or more commands to execute on filament runout. // (After 'M412 H' Marlin will ask the host to handle the process.) - #define FILAMENT_RUNOUT_SCRIPT "M600" + //#define FILAMENT_RUNOUT_SCRIPT "M600" + // just park, don't autoretract on runout + #define FILAMENT_RUNOUT_SCRIPT "M25" // After a runout is detected, continue printing this length of filament // before executing the runout script. Useful for a sensor at the end of @@ -1228,7 +1233,7 @@ */ //#define AUTO_BED_LEVELING_3POINT //#define AUTO_BED_LEVELING_LINEAR -//#define AUTO_BED_LEVELING_BILINEAR +#define AUTO_BED_LEVELING_BILINEAR //#define AUTO_BED_LEVELING_UBL //#define MESH_BED_LEVELING @@ -1260,7 +1265,7 @@ /** * Enable the G26 Mesh Validation Pattern tool. */ - //#define G26_MESH_VALIDATION + #define G26_MESH_VALIDATION #if ENABLED(G26_MESH_VALIDATION) #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. @@ -1275,7 +1280,7 @@ #if EITHER(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR) // Set the number of grid points per dimension. - #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_X 5 #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X // Probe along the Y axis, advancing X after each column @@ -1324,7 +1329,7 @@ //=========================================================================== #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed - #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_X 5 // Don't use more than 7 points per axis, implementation limited. #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS @@ -1465,7 +1470,7 @@ * M501 - Read settings from EEPROM. (i.e., Throw away unsaved changes) * M502 - Revert settings to "factory" defaults. (Follow with M500 to init the EEPROM.) */ -//#define EEPROM_SETTINGS // Persistent storage with M500 and M501 +#define EEPROM_SETTINGS // Persistent storage with M500 and M501 //#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! #define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. #define EEPROM_BOOT_SILENT // Keep M503 quiet and only give errors during first load @@ -1497,13 +1502,13 @@ // Preheat Constants #define PREHEAT_1_LABEL "PLA" -#define PREHEAT_1_TEMP_HOTEND 180 -#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_TEMP_HOTEND 215 +#define PREHEAT_1_TEMP_BED 65 #define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 #define PREHEAT_2_LABEL "ABS" -#define PREHEAT_2_TEMP_HOTEND 240 -#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_TEMP_HOTEND 235 +#define PREHEAT_2_TEMP_BED 85 #define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 /** @@ -1517,7 +1522,7 @@ * P1 Raise the nozzle always to Z-park height. * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. */ -//#define NOZZLE_PARK_FEATURE +#define NOZZLE_PARK_FEATURE #if ENABLED(NOZZLE_PARK_FEATURE) // Specify a park position as { X, Y, Z_raise } @@ -1682,7 +1687,7 @@ * you must uncomment the following option or it won't work. * */ -//#define SDSUPPORT +#define SDSUPPORT /** * SD CARD: SPI SPEED @@ -1770,7 +1775,7 @@ // If you have a speaker that can produce tones, enable it here. // By default Marlin assumes you have a buzzer with a fixed frequency. // -//#define SPEAKER +#define SPEAKER // // The duration and frequency for the UI feedback sound. @@ -2119,7 +2124,7 @@ // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extensible_ui'. // -//#define EXTENSIBLE_UI +#define EXTENSIBLE_UI #if ENABLED(EXTENSIBLE_UI) //#define EXTUI_LOCAL_BEEPER // Enables use of local Beeper pin with external display @@ -2139,6 +2144,27 @@ // //#define TFT_LITTLE_VGL_UI +// +// Anycubic Mega TFT (AI3M) +// +#define ANYCUBIC_TFT_MODEL +/** + * Select your version of the Trigorilla (RAMPS1.4) board here. + * + * 0 = Default Trigorilla + * 1 = Newer Trigorilla v1.1 (first seen late 2018) + * + * The only major difference is a slight change on the servo pin mapping. + * This setting only is relevant if you want to use BLtouch or similar + * mods to be used via servo pins. + * The new version is to be identified by a "TRIGORILLA1.1" lettering + * on the upper left of the PCB silkscreen. + */ +#define TRIGORILLA_VERSION 0 + +#define ANYCUBIC_TFT_DEBUG + + //============================================================================= //============================ Other Controllers ============================ //============================================================================= diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 8932c683a8cb..743b4839e2b9 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -371,7 +371,7 @@ * The fan turns on automatically whenever any driver is enabled and turns * off (or reduces to idle speed) shortly after drivers are turned off. */ -//#define USE_CONTROLLER_FAN +#define USE_CONTROLLER_FAN #if ENABLED(USE_CONTROLLER_FAN) //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan //#define CONTROLLER_FAN_USE_Z_ONLY // With this option only the Z axis is considered @@ -449,7 +449,7 @@ * Multiple extruders can be assigned to the same pin in which case * the fan will turn on when any selected extruder is above the threshold. */ -#define E0_AUTO_FAN_PIN -1 +#define E0_AUTO_FAN_PIN FAN2_PIN #define E1_AUTO_FAN_PIN -1 #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 @@ -548,10 +548,10 @@ // // For Z set the number of stepper drivers // -#define NUM_Z_STEPPER_DRIVERS 1 // (1-4) Z options change based on how many +#define NUM_Z_STEPPER_DRIVERS 2 // (1-4) Z options change based on how many #if NUM_Z_STEPPER_DRIVERS > 1 - //#define Z_MULTI_ENDSTOPS + #define Z_MULTI_ENDSTOPS #if ENABLED(Z_MULTI_ENDSTOPS) #define Z2_USE_ENDSTOP _XMAX_ #define Z2_ENDSTOP_ADJUSTMENT 0 @@ -1593,12 +1593,12 @@ * * See https://marlinfw.org/docs/features/lin_advance.html for full instructions. */ -//#define LIN_ADVANCE +#define LIN_ADVANCE #if ENABLED(LIN_ADVANCE) //#define EXTRA_LIN_ADVANCE_K // Enable for second linear advance constants #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed //#define LA_DEBUG // If enabled, this will generate debug information output over USB. - //#define EXPERIMENTAL_SCURVE // Enable this option to permit S-Curve Acceleration + #define EXPERIMENTAL_SCURVE // Enable this option to permit S-Curve Acceleration #endif // @section leveling @@ -1841,8 +1841,8 @@ // @section serial // The ASCII buffer for serial input -#define MAX_CMD_SIZE 96 -#define BUFSIZE 4 +#define MAX_CMD_SIZE 128 +#define BUFSIZE 8 // Transmission to Host Buffer Size // To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. @@ -1851,13 +1851,13 @@ // For debug-echo: 128 bytes for the optimal speed. // Other output doesn't need to be that speedy. // :[0, 2, 4, 8, 16, 32, 64, 128, 256] -#define TX_BUFFER_SIZE 0 +#define TX_BUFFER_SIZE 4 // Host Receive Buffer Size // Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. // To use flow control, set this buffer size to at least 1024 bytes. // :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] -//#define RX_BUFFER_SIZE 1024 +#define RX_BUFFER_SIZE 256 #if RX_BUFFER_SIZE >= 1024 // Enable to have the controller send XON/XOFF control characters to @@ -1878,15 +1878,11 @@ //#define SERIAL_STATS_DROPPED_RX #endif -/** - * Emergency Command Parser - * - * Add a low-level parser to intercept certain commands as they - * enter the serial receive buffer, so they cannot be blocked. - * Currently handles M108, M112, M410, M876 - * NOTE: Not yet implemented for all platforms. - */ -//#define EMERGENCY_PARSER +// Enable an emergency-command parser to intercept certain commands as they +// enter the serial receive buffer, so they cannot be blocked. +// Currently handles M108, M112, M410 +// Does not work on boards using AT90USB (USBCON) processors! +#define EMERGENCY_PARSER // Bad Serial-connections can miss a received command by sending an 'ok' // Therefore some clients abort after 30 seconds in a timeout. @@ -2030,7 +2026,7 @@ * Requires NOZZLE_PARK_FEATURE. * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. */ -//#define ADVANCED_PAUSE_FEATURE +#define ADVANCED_PAUSE_FEATURE #if ENABLED(ADVANCED_PAUSE_FEATURE) #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. @@ -2068,8 +2064,8 @@ #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. - //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. - //#define HOME_BEFORE_FILAMENT_CHANGE // If needed, home before parking for filament change + #define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) @@ -3198,7 +3194,7 @@ * Host Prompt Support enables Marlin to use the host for user prompts so * filament runout and other processes can be managed from the host side. */ -//#define HOST_ACTION_COMMANDS +#define HOST_ACTION_COMMANDS #if ENABLED(HOST_ACTION_COMMANDS) //#define HOST_PROMPT_SUPPORT #endif diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp new file mode 100644 index 000000000000..1151859531d0 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp @@ -0,0 +1,1026 @@ +/* + AnycubicTFT.cpp --- Support for Anycubic i3 Mega TFT + Created by Christian Hopp on 09.12.17. + Converted to ext_iu by John BouAntoun 21 June 2020 + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "../../../../inc/MarlinConfigPre.h" + +#ifdef ANYCUBIC_TFT_MODEL + +#include "../../../../inc/MarlinConfig.h" +#include "anycubic_TFT.h" +#include "anycubic_serial.h" +#include "../../ui_api.h" +#include "../../../../MarlinCore.h" // for quickstop_stepper and disable_steppers +#include "../../../../libs/buzzer.h"// for buzzer.tone + +/* not sure i need these */ +/* + +#include "../../../../sd/cardreader.h" +#include "../../../../core/language.h" +#include "../../../../core/macros.h" +#include "../../../../core/serial.h" +#include "../../../../feature/pause.h" + +#include "../../../../module/stepper.h" +*/ + +/* these are in ui_api */ +/* +#include "../../../../module/temperature.h" +#include "../../../../module/printcounter.h" +#include "../../../../feature/e_parser.h" +#include "../../../../gcode/queue.h" +#include "../../../../module/planner.h" +*/ +/* main includes, need to confirm which of these i actually need */ +// #include "Arduino.h" +// #include +// #include +// #include +// #include + +char _conv[8]; + +char *itostr2(const uint8_t &x) +{ + //sprintf(conv,"%5.1f",x); + int xx=x; + _conv[0]=(xx/10)%10+'0'; + _conv[1]=(xx)%10+'0'; + _conv[2]=0; + return _conv; +} + +#ifndef ULTRA_LCD + #define DIGIT(n) ('0' + (n)) + #define DIGIMOD(n, f) DIGIT((n)/(f) % 10) + #define RJDIGIT(n, f) ((n) >= (f) ? DIGIMOD(n, f) : ' ') + #define MINUSOR(n, alt) (n >= 0 ? (alt) : (n = -n, '-')) + + + char* itostr3(const int x) { + int xx = x; + _conv[4] = MINUSOR(xx, RJDIGIT(xx, 100)); + _conv[5] = RJDIGIT(xx, 10); + _conv[6] = DIGIMOD(xx, 1); + return &_conv[4]; + } + + // Convert signed float to fixed-length string with 023.45 / -23.45 format + char *ftostr32(const float &x) { + long xx = x * 100; + _conv[1] = MINUSOR(xx, DIGIMOD(xx, 10000)); + _conv[2] = DIGIMOD(xx, 1000); + _conv[3] = DIGIMOD(xx, 100); + _conv[4] = '.'; + _conv[5] = DIGIMOD(xx, 10); + _conv[6] = DIGIMOD(xx, 1); + return &_conv[1]; + } + +#endif + +AnycubicTFTClass::AnycubicTFTClass() { +} + +void AnycubicTFTClass::OnSetup() { + + AnycubicSerial.begin(115200); + ANYCUBIC_SENDCOMMAND_DBG_PGM("J17", "TFT Serial Debug: Main board reset... J17"); // J17 Main board reset + ExtUI::delay_ms(10); + ANYCUBIC_SENDCOMMAND_DBG_PGM("J12", "TFT Serial Debug: Ready... J12"); // J12 Ready + + DoSDCardStateCheck(); + DoFilamentRunoutCheck(); + + SelectedDirectory[0]=0; + SelectedFile[0]=0; + + #ifdef STARTUP_CHIME + buzzer.tone(250, 554); // C#5 + buzzer.tone(250, 554); // C#5 + buzzer.tone(250, 740); // F#5 + buzzer.tone(250, 554); // C#5 + buzzer.tone(250, 740); // F#5 + buzzer.tone(250, 554); // C#5 + buzzer.tone(500, 831); // G#5 + #endif + + #if ENABLED(ANYCUBIC_TFT_DEBUG) + SERIAL_ECHOLNPGM("TFT Serial Debug: Finished startup"); + #endif +} + +void AnycubicTFTClass::OnCommandScan() { + CheckHeaterError(); + + if(TFTbuflen<(TFTBUFSIZE-1)) { + GetCommandFromTFT(); + } + + if(TFTbuflen) { + TFTbuflen = (TFTbuflen-1); + TFTbufindr = (TFTbufindr + 1)%TFTBUFSIZE; + } +} + +void AnycubicTFTClass::OnKillTFT() +{ + ANYCUBIC_SENDCOMMAND_DBG_PGM("J11", "TFT Serial Debug: Kill command... J11"); +} + +void AnycubicTFTClass::OnSDCardStateChange(bool isInserted) { + #if ENABLED(ANYCUBIC_TFT_DEBUG) + SERIAL_ECHOPGM(" DEBUG: OnSDCardStateChange event triggered "); + SERIAL_ECHO(itostr2(isInserted)); + SERIAL_EOL(); + #endif + DoSDCardStateCheck(); +} + +void AnycubicTFTClass::OnFilamentRunout() { + #if ENABLED(ANYCUBIC_TFT_DEBUG) + SERIAL_ECHOLNPGM("TFT Serial Debug: FilamentRunout triggered..."); + #endif + + DoFilamentRunoutCheck(); +} + +void AnycubicTFTClass::OnUserConfirmRequired(const char * const msg) { + #if ENABLED(ANYCUBIC_TFT_DEBUG) + SERIAL_ECHOPGM("TFT Serial Debug: OnUserConfirmRequired triggered... "); + SERIAL_ECHOLN(msg); + #endif + + #if ENABLED(SDSUPPORT) + + // TODO: JBA Might have to handle states like heater time out and the like for interactive resume? + /** + * Need to handle the process of following states + * "Nozzle Parked" + * "Load Filament" + * "Filament Purging..." + * "HeaterTimeout" + * "Reheat finished." + */ + #endif + +} + +float AnycubicTFTClass::CodeValue() { + return (strtod(&TFTcmdbuffer[TFTbufindr][TFTstrchr_pointer - TFTcmdbuffer[TFTbufindr] + 1], NULL)); +} + +bool AnycubicTFTClass::CodeSeen(char code) { + TFTstrchr_pointer = strchr(TFTcmdbuffer[TFTbufindr], code); + return (TFTstrchr_pointer != NULL); //Return True if a character was found +} + +void AnycubicTFTClass::HandleSpecialMenu() { + if (SelectedDirectory[0] == '<' ) { + + switch (SelectedDirectory[1]) { + + case 'S': // "" + SpecialMenu = true; + return; + break; + + case 'E': // "" + SpecialMenu = false; + return; + break; + + #if ENABLED(PROBE_MANUALLY) + case '0': + switch (SelectedDirectory[2]) { + case '1': // "<01ZUp0.1>" + SERIAL_ECHOLNPGM("Special Menu: Z Up 0.1"); + ExtUI::injectCommands_P(PSTR("G91\nG1 Z+0.1\nG90")); + break; + + case '2': // "<02ZUp0.02>" + SERIAL_ECHOLNPGM("Special Menu: Z Up 0.02"); + ExtUI::injectCommands_P(PSTR("G91\nG1 Z+0.02\nG90")); + break; + + case '3': // "<03ZDn0.02>" + SERIAL_ECHOLNPGM("Special Menu: Z Down 0.02"); + ExtUI::injectCommands_P(PSTR("G91\nG1 Z-0.02\nG90")); + break; + + case '4': // "<04ZDn0.1>" + SERIAL_ECHOLNPGM("Special Menu: Z Down 0.1"); + ExtUI::injectCommands_P(PSTR("G91\nG1 Z-0.1\nG90")); + break; + + case '5': // "<05PrehtBed>" + SERIAL_ECHOLNPGM("Special Menu: Preheat Bed"); + ExtUI::injectCommands_P(PSTR("M140 S65")); + break; + + case '6': // "<06SMeshLvl>" + SERIAL_ECHOLNPGM("Special Menu: Start Mesh Leveling"); + ExtUI::injectCommands_P(PSTR("G29 S1")); + break; + + case '7': // "<07MeshNPnt>" + SERIAL_ECHOLNPGM("Special Menu: Next Mesh Point"); + ExtUI::injectCommands_P(PSTR("G29 S2")); + break; + + case '8': // "<08HtEndPID>" + SERIAL_ECHOLNPGM("Special Menu: Auto Tune Hotend PID"); + ExtUI::injectCommands_P(PSTR("M106 S204\nM303 E0 S215 C15 U1")); + break; + + case '9': // "<09HtBedPID>" + SERIAL_ECHOLNPGM("Special Menu: Auto Tune Hotbed Pid"); + ExtUI::injectCommands_P(PSTR("M303 E-1 S65 C6 U1")); + break; + + default: + break; + } + break; + + case '1': + switch (SelectedDirectory[2]) { + case '0': // "<10FWDeflts>" + SERIAL_ECHOLNPGM("Special Menu: Load FW Defaults"); + ExtUI::injectCommands_P(PSTR("M502")); + buzzer.tone(105, 1661); + buzzer.tone(210, 1108); + break; + + case '1': // "<11SvEEPROM>" + SERIAL_ECHOLNPGM("Special Menu: Save EEPROM"); + ExtUI::injectCommands_P(PSTR("M500")); + buzzer.tone(105, 1108); + buzzer.tone(210, 1661); + break; + + default: + break; + } + break; + #else + case '0': + switch (SelectedDirectory[2]) { + case '1': // "<01PrehtBed>" + SERIAL_ECHOLNPGM("Special Menu: Preheat Bed"); + ExtUI::injectCommands_P(PSTR("M140 S65")); + break; + + case '2': // "<02ABL>" + SERIAL_ECHOLNPGM("Special Menu: Auto Bed Leveling"); + ExtUI::injectCommands_P(PSTR("G28\nG29")); + break; + + case '3': // "<03HtendPID>" + SERIAL_ECHOLNPGM("Special Menu: Auto Tune Hotend PID"); + ExtUI::injectCommands_P(PSTR("M106 S204\nM303 E0 S215 C15 U1")); + break; + + case '4': // "<04HtbedPID>" + SERIAL_ECHOLNPGM("Special Menu: Auto Tune Hotbed Pid"); + ExtUI::injectCommands_P(PSTR("M303 E-1 S65 C6 U1")); + break; + + case '5': // "<05FWDeflts>" + SERIAL_ECHOLNPGM("Special Menu: Load FW Defaults"); + ExtUI::injectCommands_P(PSTR("M502")); + buzzer.tone(105, 1661); + buzzer.tone(210, 1108); + break; + + case '6': // "<06SvEEPROM>" + SERIAL_ECHOLNPGM("Special Menu: Save EEPROM"); + ExtUI::injectCommands_P(PSTR("M500")); + buzzer.tone(105, 1108); + buzzer.tone(210, 1661); + break; + + default: + break; + } + break; + #endif // PROBE_MANUALLY + + default: + break; + } + #if ENABLED(ANYCUBIC_TFT_DEBUG) + } else { + SERIAL_ECHOPGM ("TFT Serial Debug: Attempted to HandleSpecialMenu on non-special menu... "); + SERIAL_ECHOLN(SelectedDirectory); + #endif + } +} + +void AnycubicTFTClass::RenderCurrentFileList() { + #if ENABLED(SDSUPPORT) + uint16_t selectedNumber = 0; + SelectedDirectory[0]=0; + SelectedFile[0]=0; + + ANYCUBIC_SERIAL_PROTOCOLPGM("FN "); // Filelist start + ANYCUBIC_SERIAL_ENTER(); + + if(!ExtUI::isMediaInserted() && !SpecialMenu) { + ANYCUBIC_SENDCOMMAND_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to render Current File List... J02"); + + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + } + else { + if(CodeSeen('S')) { + selectedNumber = CodeValue(); + } + + if (SpecialMenu) { + RenderSpecialMenu(selectedNumber); + } + else { + RenderCurrentFolder(selectedNumber); + } + } + ANYCUBIC_SERIAL_PROTOCOLPGM("END"); // Filelist stop + ANYCUBIC_SERIAL_ENTER(); + #endif // SDSUPPORT +} + +void AnycubicTFTClass::RenderSpecialMenu(uint16_t selectedNumber) { + switch (selectedNumber) { + #if ENABLED(PROBE_MANUALLY) + case 0: // First Page + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<01ZUp0.1>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<02ZUp0.02>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<03ZDn0.02>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<04ZDn0.1>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + break; + + case 4: // Second Page + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<05PrehtBed>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<06SMeshLvl>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<07MeshNPnt>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<08HtEndPID>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + break; + + case 8: // Third Page + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<09HtBedPID>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<10FWDeflts>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<11SvEEPROM>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + break; + #else + case 0: // First Page + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<01PrehtBed>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<02ABL>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<03HtEndPID>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<04HtBedPID>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + break; + + case 4: // Second Page + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<05FWDeflts>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<06SvEEPROM>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + break; + + #endif // PROBE_MANUALLY + + default: + break; + } +} + +void AnycubicTFTClass::RenderCurrentFolder(uint16_t selectedNumber) { + ExtUI::FileList currentFileList; + uint16_t cnt = selectedNumber; + uint16_t max_files; + uint16_t dir_files = currentFileList.count(); + + if ((dir_files-selectedNumber) < 4) { + max_files = dir_files; + } else { + max_files = selectedNumber+3; + } + + for (cnt = selectedNumber; cnt <= max_files; cnt++) { + if (cnt == 0) { // Special Entry + if(currentFileList.isAtRootDir()) { + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + } else { + ANYCUBIC_SERIAL_PROTOCOLLNPGM("/.."); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("/.."); + } + } else { + currentFileList.seek(cnt-1, false); + + #if ENABLED(ANYCUBIC_TFT_DEBUG) + SERIAL_ECHOLN(currentFileList.filename()); + #endif + if (currentFileList.isDir()) { + ANYCUBIC_SERIAL_PROTOCOLPGM("/"); + ANYCUBIC_SERIAL_PROTOCOLLN(currentFileList.shortFilename()); + ANYCUBIC_SERIAL_PROTOCOLPGM("/"); + ANYCUBIC_SERIAL_PROTOCOLLN(currentFileList.longFilename()); + + } else { + ANYCUBIC_SERIAL_PROTOCOLLN(currentFileList.shortFilename()); + ANYCUBIC_SERIAL_PROTOCOLLN(currentFileList.longFilename()); + } + } + } +} + +void AnycubicTFTClass::CheckHeaterError() { + if ((ExtUI::getActualTemp_celsius((ExtUI::extruder_t) ExtUI::E0) < 5) || (ExtUI::getActualTemp_celsius((ExtUI::extruder_t) ExtUI::E0) > 290)) { + if (HeaterCheckCount > 60000) { + HeaterCheckCount = 0; + ANYCUBIC_SENDCOMMAND_DBG_PGM("J10", "TFT Serial Debug: Hotend temperature abnormal... J10"); // J10 Hotend temperature abnormal + } + else { + HeaterCheckCount++; + } + } else { + HeaterCheckCount = 0; + } +} + +void AnycubicTFTClass::OnPrintTimerStarted() { + #if ENABLED(SDSUPPORT) + if (IsPrintingFromMedia) { + ANYCUBIC_SENDCOMMAND_DBG_PGM("J04","TFT Serial Debug: Starting SD Print... J04"); // J04 Starting Print + } + #endif +} + +void AnycubicTFTClass::OnPrintTimerPaused() { + #if ENABLED(SDSUPPORT) + if (IsPrintingFromMedia) { + ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: SD print paused done... J18"); + } + #endif +} + +void AnycubicTFTClass::OnPrintTimerStopped() { + #if ENABLED(SDSUPPORT) + if (IsPrintingFromMedia) { + IsPrintingFromMedia = false; + ANYCUBIC_SENDCOMMAND_DBG_PGM("J14", "TFT Serial Debug: SD Print Completed... J14"); + } + #endif +} + +void AnycubicTFTClass::GetCommandFromTFT() { + char *starpos = NULL; + while( AnycubicSerial.available() > 0 && TFTbuflen < TFTBUFSIZE) { + serial3_char = AnycubicSerial.read(); + if (serial3_char == '\n' || + serial3_char == '\r' || + serial3_char == ':' || + serial3_count >= (TFT_MAX_CMD_SIZE - 1) ) { + + if(!serial3_count) { //if empty line + return; + } + + TFTcmdbuffer[TFTbufindw][serial3_count] = 0; //terminate string + + if((strchr(TFTcmdbuffer[TFTbufindw], 'A') != NULL)) { + int16_t a_command; + TFTstrchr_pointer = strchr(TFTcmdbuffer[TFTbufindw], 'A'); + a_command=((int)((strtod(&TFTcmdbuffer[TFTbufindw][TFTstrchr_pointer - TFTcmdbuffer[TFTbufindw] + 1], NULL)))); + + #if ENABLED(ANYCUBIC_TFT_DEBUG) + if ((a_command>7) && (a_command != 20)) { // No debugging of status polls, please! + SERIAL_ECHOPGM("TFT Serial Command: "); + SERIAL_ECHO(TFTcmdbuffer[TFTbufindw]); + } + #endif + + switch (a_command) { + case 0: //A0 GET HOTEND TEMP + { + float hotendActualTemp = ExtUI::getActualTemp_celsius((ExtUI::extruder_t) (ExtUI::extruder_t) ExtUI::E0); + ANYCUBIC_SENDCOMMANDPGM_VAL("A0V ", int(hotendActualTemp + 0.5)); + } + break; + + case 1: //A1 GET HOTEND TARGET TEMP + { + float hotendTargetTemp = ExtUI::getTargetTemp_celsius((ExtUI::extruder_t) (ExtUI::extruder_t) ExtUI::E0); + ANYCUBIC_SENDCOMMANDPGM_VAL("A1V ", int(hotendTargetTemp + 0.5)); + } + break; + + case 2: //A2 GET HOTBED TEMP + { + float heatedBedActualTemp = ExtUI::getActualTemp_celsius((ExtUI::heater_t) ExtUI::BED); + ANYCUBIC_SENDCOMMANDPGM_VAL("A2V ", int(heatedBedActualTemp + 0.5)); + } + break; + + case 3: //A3 GET HOTBED TARGET TEMP + { + float heatedBedTargetTemp = ExtUI::getTargetTemp_celsius((ExtUI::heater_t) ExtUI::BED); + ANYCUBIC_SENDCOMMANDPGM_VAL("A3V ", int(heatedBedTargetTemp + 0.5)); + } + break; + + case 4: //A4 GET FAN SPEED + { + float fanPercent = ExtUI::getActualFan_percent(ExtUI::FAN0); + fanPercent = constrain(fanPercent, 0, 100); + ANYCUBIC_SENDCOMMANDPGM_VAL("A4V ", int(fanPercent)); + } + break; + + case 5:// A5 GET CURRENT COORDINATE + { + float xPostition = ExtUI::getAxisPosition_mm(ExtUI::X); + float yPostition = ExtUI::getAxisPosition_mm(ExtUI::Y); + float zPostition = ExtUI::getAxisPosition_mm(ExtUI::Z); + ANYCUBIC_SERIAL_PROTOCOLPGM("A5V"); + ANYCUBIC_SERIAL_SPACE(); + ANYCUBIC_SERIAL_PROTOCOLPGM("X: "); + ANYCUBIC_SERIAL_PROTOCOL(xPostition); + ANYCUBIC_SERIAL_SPACE(); + ANYCUBIC_SERIAL_PROTOCOLPGM("Y: "); + ANYCUBIC_SERIAL_PROTOCOL(yPostition); + ANYCUBIC_SERIAL_SPACE(); + ANYCUBIC_SERIAL_PROTOCOLPGM("Z: "); + ANYCUBIC_SERIAL_PROTOCOL(zPostition); + ANYCUBIC_SERIAL_SPACE(); + ANYCUBIC_SERIAL_ENTER(); + } + break; + + case 6: //A6 GET SD CARD PRINTING STATUS + #if ENABLED(SDSUPPORT) + if (ExtUI::isPrintingFromMedia()) { + ANYCUBIC_SERIAL_PROTOCOLPGM("A6V "); + if (ExtUI::isMediaInserted()) { + ANYCUBIC_SERIAL_PROTOCOL(itostr3(int(ExtUI::getProgress_percent()))); + ANYCUBIC_SERIAL_ENTER(); + } else { + ANYCUBIC_SENDCOMMAND_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to return printing status... J02"); + } + } else { + ANYCUBIC_SERIAL_PROTOCOLPGM("A6V ---"); + ANYCUBIC_SERIAL_ENTER(); + } + #endif + break; + + case 7://A7 GET PRINTING TIME + { + uint32_t elapsedSeconds = ExtUI::getProgress_seconds_elapsed(); + ANYCUBIC_SERIAL_PROTOCOLPGM("A7V "); + if (elapsedSeconds != 0) { // print time + uint32_t elapsedMinutes = elapsedSeconds/60; + ANYCUBIC_SERIAL_PROTOCOL(itostr2(elapsedMinutes/60)); + ANYCUBIC_SERIAL_SPACE(); + ANYCUBIC_SERIAL_PROTOCOLPGM("H"); + ANYCUBIC_SERIAL_SPACE(); + ANYCUBIC_SERIAL_PROTOCOL(itostr2(elapsedMinutes%60)); + ANYCUBIC_SERIAL_SPACE(); + ANYCUBIC_SERIAL_PROTOCOLPGM("M"); + } else { + ANYCUBIC_SERIAL_SPACE(); + ANYCUBIC_SERIAL_PROTOCOLPGM("999:999"); + } + ANYCUBIC_SERIAL_ENTER(); + } + break; + + case 8: // A8 GET SD LIST + #if ENABLED(SDSUPPORT) + SelectedFile[0] = 0; + RenderCurrentFileList(); + #endif + break; + + case 9: // A9 pause sd print + #if ENABLED(SDSUPPORT) + if(ExtUI::isPrintingFromMedia()) { + PausePrint(); + } + #endif + break; + + case 10: // A10 resume sd print + #if ENABLED(SDSUPPORT) + if (ExtUI::isPrintingFromMediaPaused()) { + ResumePrint(); + } + #endif + break; + + case 11: // A11 STOP SD PRINT + #if ENABLED(SDSUPPORT) + StopPrint(); + #endif + break; + + case 12: // A12 kill + kill(PSTR(STR_ERR_KILLED)); + break; + + case 13: // A13 SELECTION FILE + #if ENABLED(SDSUPPORT) + if (ExtUI::isMediaInserted()) { + starpos = (strchr(TFTstrchr_pointer + 4,'*')); + if (TFTstrchr_pointer[4] == '/') { + strcpy(SelectedDirectory, TFTstrchr_pointer+5); + SelectedFile[0] = 0; + ANYCUBIC_SENDCOMMAND_DBG_PGM("J21", "TFT Serial Debug: Clear file selection... J21 "); // J21 Not File Selected + ANYCUBIC_SERIAL_ENTER(); + } else if (TFTstrchr_pointer[4] == '<') { + strcpy(SelectedDirectory, TFTstrchr_pointer+4); + SelectedFile[0] = 0; + ANYCUBIC_SENDCOMMAND_DBG_PGM("J21", "TFT Serial Debug: Clear file selection... J21 "); // J21 Not File Selected + ANYCUBIC_SERIAL_ENTER(); + } else { + SelectedDirectory[0]=0; + + if(starpos!=NULL) { + *(starpos-1)='\0'; + } + + strcpy(SelectedFile, TFTstrchr_pointer+4); + ANYCUBIC_SENDCOMMAND_DBG_PGM_VAL("J20", "TFT Serial Debug: File Selected... J20 ", SelectedFile); // J20 File Selected + } + } + #endif + break; + + case 14: // A14 START PRINTING + #if ENABLED(SDSUPPORT) + if(!ExtUI::isPrinting() && strlen(SelectedFile) > 0) { + StartPrint(); + } + #endif + break; + + case 15: // A15 RESUMING FROM OUTAGE + // TODO: JBA implement resume form outage + break; + + case 16: // A16 set hotend temp + { + unsigned int tempvalue; + if (CodeSeen('S')) { + tempvalue=constrain(CodeValue(), 0, 275); + ExtUI::setTargetTemp_celsius(tempvalue, (ExtUI::extruder_t) ExtUI::E0); + } + else if (CodeSeen('C') && !ExtUI::isPrinting()) { + if (ExtUI::getAxisPosition_mm(ExtUI::Z) < 10) { + ExtUI::injectCommands_P(PSTR("G1 Z10")); //RASE Z AXIS + } + tempvalue=constrain(CodeValue(), 0 ,275); + ExtUI::setTargetTemp_celsius(tempvalue, (ExtUI::extruder_t) ExtUI::E0); + } + } + break; + + case 17:// A17 set heated bed temp + { + unsigned int tempbed; + if(CodeSeen('S')) { + tempbed = constrain(CodeValue(), 0, 100); + ExtUI::setTargetTemp_celsius(tempbed, (ExtUI::heater_t)ExtUI::BED); + } + } + break; + + case 18:// A18 set fan speed + { + float fanPercent; + if (CodeSeen('S')) { + fanPercent = CodeValue(); + fanPercent = constrain(fanPercent, 0, 100); + ExtUI::setTargetFan_percent(fanPercent, ExtUI::FAN0); + } else { + fanPercent = 100; + } + ExtUI::setTargetFan_percent(fanPercent, ExtUI::FAN0); + + ANYCUBIC_SERIAL_ENTER(); + } + break; + + case 19: // A19 stop stepper drivers + if(!ExtUI::isPrinting()) { + quickstop_stepper(); + disable_all_steppers(); + } + + ANYCUBIC_SERIAL_ENTER(); + break; + + case 20:// A20 read printing speed + { + int16_t feedrate_percentage = 100; + + if(CodeSeen('S')) { + feedrate_percentage=constrain(CodeValue(),40,999); + } + else { + ANYCUBIC_SENDCOMMANDPGM_VAL("A20V ", feedrate_percentage); + } + } + break; + + case 21: // A21 all home + if (!ExtUI::isPrinting() && !ExtUI::isPrintingFromMediaPaused()) { + if (CodeSeen('X') || CodeSeen('Y') || CodeSeen('Z')) { + if(CodeSeen('X')) { + ExtUI::injectCommands_P(PSTR("G28 X")); + } + if(CodeSeen('Y')) { + ExtUI::injectCommands_P(PSTR("G28 Y")); + } + if(CodeSeen('Z')) { + ExtUI::injectCommands_P(PSTR("G28 Z")); + } + } + else if (CodeSeen('C')) { + ExtUI::injectCommands_P(PSTR("G28")); + } + } + break; + + case 22: // A22 move X/Y/Z or extrude + if (!ExtUI::isPrinting() && !ExtUI::isPrintingFromMediaPaused()) { + float coorvalue; + unsigned int movespeed = 0; + char commandStr[30]; + + commandStr[0] = 0; // empty string + if (CodeSeen('F')) { // Set feedrate + movespeed = CodeValue(); + } + + if (CodeSeen('X')) { // Move in X direction + coorvalue = CodeValue(); + if ((coorvalue <= 0.2) && coorvalue > 0) { + sprintf_P(commandStr, PSTR("G1 X0.1F%i"), movespeed); + } else if ((coorvalue <= -0.1) && coorvalue > -1) { + sprintf_P(commandStr, PSTR("G1 X-0.1F%i"), movespeed); + } else { + sprintf_P(commandStr, PSTR("G1 X%iF%i"), int(coorvalue), movespeed); + } + } else if (CodeSeen('Y')) { // Move in Y direction + coorvalue = CodeValue(); + if ((coorvalue <= 0.2) && coorvalue > 0) { + sprintf_P(commandStr, PSTR("G1 Y0.1F%i"), movespeed); + } else if ((coorvalue <= -0.1) && coorvalue > -1) { + sprintf_P(commandStr, PSTR("G1 Y-0.1F%i"), movespeed); + } else { + sprintf_P(commandStr, PSTR("G1 Y%iF%i"), int(coorvalue), movespeed); + } + } else if (CodeSeen('Z')) { // Move in Z direction + coorvalue = CodeValue(); + if ((coorvalue <= 0.2) && coorvalue > 0) { + sprintf_P(commandStr, PSTR("G1 Z0.1F%i"), movespeed); + } else if ((coorvalue <= -0.1) && coorvalue > -1) { + sprintf_P(commandStr, PSTR("G1 Z-0.1F%i"), movespeed); + } else { + sprintf_P(commandStr, PSTR("G1 Z%iF%i"), int(coorvalue), movespeed); + } + } + else if (CodeSeen('E')) // Extrude + { + coorvalue = CodeValue(); + if ((coorvalue <= 0.2) && coorvalue > 0) { + sprintf_P(commandStr, PSTR("G1 E0.1F%i"), movespeed); + } else if ((coorvalue <= -0.1) && coorvalue > -1) { + sprintf_P(commandStr, PSTR("G1 E-0.1F%i"), movespeed); + } else { + sprintf_P(commandStr, PSTR("G1 E%iF500"), int(coorvalue)); + } + } + + if(strlen_P(commandStr) > 0) { + sprintf_P(commandStr, PSTR("G91\n%s\nG90"), commandStr); + ExtUI::injectCommands(commandStr); + } + } + ANYCUBIC_SERIAL_ENTER(); + break; + + case 23: // A23 preheat pla + if (!ExtUI::isPrinting() && !ExtUI::isPrintingFromMediaPaused()) { + if (ExtUI::getAxisPosition_mm(ExtUI::Z) < 10) { + ExtUI::injectCommands_P(PSTR("G1 Z10")); //RASE Z AXIS + } + + ExtUI::setTargetTemp_celsius(PREHEAT_1_TEMP_BED, (ExtUI::heater_t) ExtUI::BED); + ExtUI::setTargetTemp_celsius(PREHEAT_1_TEMP_HOTEND, (ExtUI::extruder_t) ExtUI::E0); + ANYCUBIC_SERIAL_SUCC_START; + ANYCUBIC_SERIAL_ENTER(); + } + break; + + case 24:// A24 preheat abs + if (!ExtUI::isPrinting() && !ExtUI::isPrintingFromMediaPaused()) { + if (ExtUI::getAxisPosition_mm(ExtUI::Z) < 10) { + ExtUI::injectCommands_P(PSTR("G1 Z10")); //RASE Z AXIS + } + + ExtUI::setTargetTemp_celsius(PREHEAT_2_TEMP_BED, (ExtUI::heater_t) ExtUI::BED); + ExtUI::setTargetTemp_celsius(PREHEAT_2_TEMP_HOTEND, (ExtUI::extruder_t) ExtUI::E0); + + ANYCUBIC_SERIAL_SUCC_START; + ANYCUBIC_SERIAL_ENTER(); + } + break; + + case 25: // A25 cool down + if (!ExtUI::isPrinting() && !ExtUI::isPrintingFromMediaPaused()) { + ExtUI::setTargetTemp_celsius(0, (ExtUI::heater_t) ExtUI::BED); + ExtUI::setTargetTemp_celsius(0, (ExtUI::extruder_t) ExtUI::E0); + + ANYCUBIC_SENDCOMMAND_DBG_PGM("J12", "TFT Serial Debug: Cooling down... J12"); // J12 cool down + } + break; + + case 26: // A26 refresh SD + #if ENABLED(SDSUPPORT) + if(ExtUI::isMediaInserted()) { + if (strlen(SelectedDirectory) > 0) { + ExtUI::FileList currentFileList; + if ((SelectedDirectory[0] == '.') && (SelectedDirectory[1] == '.')) { + currentFileList.upDir(); + } else { + if (SelectedDirectory[0] == '<') { + HandleSpecialMenu(); + } else { + currentFileList.changeDir(SelectedDirectory); + } + } + } + } else { + ANYCUBIC_SENDCOMMAND_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to refresh SD A26... J02"); + } + + SelectedDirectory[0]=0; + #endif + break; + + #if ENABLED(SERVO_ENDSTOPS) + case 27: // A27 servos angles adjust + break; + #endif + + case 28: // A28 filament test + if(CodeSeen('O')) { + NOOP; + } else if(CodeSeen('C')) { + NOOP; + } + ANYCUBIC_SERIAL_ENTER(); + break; + + case 33: // A33 get version info + ANYCUBIC_SERIAL_PROTOCOLPGM("J33 "); + ANYCUBIC_SERIAL_PROTOCOLPGM(DETAILED_BUILD_VERSION); + ANYCUBIC_SERIAL_ENTER(); + break; + + default: + break; + } + } + + TFTbufindw = (TFTbufindw + 1)%TFTBUFSIZE; + TFTbuflen += 1; + serial3_count = 0; //clear buffer + } else { + TFTcmdbuffer[TFTbufindw][serial3_count++] = serial3_char; + } + } +} + +void AnycubicTFTClass::DoSDCardStateCheck() { + #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT) + bool isInserted = ExtUI::isMediaInserted(); + if (isInserted) { + ANYCUBIC_SENDCOMMAND_DBG_PGM("J00", "TFT Serial Debug: SD card state changed... isInserted"); + } else { + ANYCUBIC_SENDCOMMAND_DBG_PGM("J01", "TFT Serial Debug: SD card state changed... !isInserted"); + } + #endif +} + +void AnycubicTFTClass::DoFilamentRunoutCheck() { + #if ENABLED(FILAMENT_RUNOUT_SENSOR) + // TODO: JBA There is no EXtUI method to check the state of the filament runout sensor which is werid + if (ExtUI::getFilamentRunoutState()) { + ANYCUBIC_SENDCOMMAND_DBG_PGM("J15", "TFT Serial Debug: Filament runout... J15"); + } + #endif // FILAMENT_RUNOUT_SENSOR +} + +void AnycubicTFTClass::StartPrint() { + #if ENABLED(SDSUPPORT) + if(!ExtUI::isPrinting() && strlen(SelectedFile) > 0) { + #if ENABLED(ANYCUBIC_TFT_DEBUG) + SERIAL_ECHOPGM("TFT Serial Debug: About to print file ... "); + SERIAL_ECHO(ExtUI::isPrinting()); + SERIAL_ECHOPGM(" "); + SERIAL_ECHOLN(SelectedFile); + #endif + IsPrintingFromMedia = true; + ExtUI::printFile(SelectedFile); + } + #endif // SDUPPORT +} + +void AnycubicTFTClass::PausePrint() { + #if ENABLED(SDSUPPORT) + if(ExtUI::isPrintingFromMedia()) { + ANYCUBIC_SENDCOMMAND_DBG_PGM("J05", "TFT Serial Debug: SD print pause started... J05"); // J05 printing pause + + ExtUI::pausePrint(); + + if (ExtUI::getFilamentRunoutState()) { + // play tone to indicate filament is out + buzzer.tone(200, 1567); + buzzer.tone(200, 1174); + buzzer.tone(200, 1567); + buzzer.tone(200, 1174); + buzzer.tone(2000, 1567); + + // tell the user that the filament has run out and wait + ANYCUBIC_SENDCOMMAND_DBG_PGM("J23", "TFT Serial Debug: Show filament prompt... J23"); + } + } + #endif // SDSUPPORT +} + +void AnycubicTFTClass::ResumePrint() { + #if ENABLED(SDSUPPORT) + #if ENABLED(FILAMENT_RUNOUT_SENSOR) + // TODO: JBA There is no EXtUI method to check the state of the filament runout sensor which is werid + if (ExtUI::getFilamentRunoutState()) { + PausePrint(); + return; + } + #endif + + ExtUI::resumePrint(); + + ANYCUBIC_SENDCOMMAND_DBG_PGM("J04", "TFT Serial Debug: SD print resumed... J04"); // J04 printing form sd card now + #endif +} + +void AnycubicTFTClass::StopPrint() { + #if ENABLED(SDSUPPORT) + ExtUI::stopPrint(); + + ANYCUBIC_SENDCOMMAND_DBG_PGM("J16", "TFT Serial Debug: SD print stopped... J16"); + #endif // SDSUPPORT +} + +AnycubicTFTClass AnycubicTFT; +#endif // ANYCUBIC_TFT_MODEL diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h new file mode 100644 index 000000000000..a50265a0e2dd --- /dev/null +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h @@ -0,0 +1,109 @@ +/* + AnycubicTFT.h --- Support for Anycubic i3 Mega TFT + Created by Christian Hopp on 09.12.17. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "../../../../inc/MarlinConfigPre.h" +#include "../../../../sd/SdFatConfig.h" // for the FILENAME_LENGTH macro + +#ifndef AnycubicTFT_h +#define AnycubicTFT_h + +// command sending macro's with debugging capability +#define ANYCUBIC_SENDCOMMANDPGM(x) ANYCUBIC_SERIAL_PROTOCOLLNPGM(x) +#define ANYCUBIC_SENDCOMMANDPGM_VAL(x,y) (ANYCUBIC_SERIAL_PROTOCOLPGM(x), ANYCUBIC_SERIAL_PROTOCOLLN(itostr3(y))) +#define ANYCUBIC_SENDCOMMAND(x) ANYCUBIC_SERIAL_PROTOCOLLN(x) +#if ENABLED(ANYCUBIC_TFT_DEBUG) + #define ANYCUBIC_SENDCOMMAND_DBG_PGM(x,y) (ANYCUBIC_SERIAL_PROTOCOLLNPGM(x), SERIAL_ECHOLNPGM(y)) + #define ANYCUBIC_SENDCOMMAND_DBG_PGM_VAL(x,y,z) (ANYCUBIC_SERIAL_PROTOCOLLNPGM(x), SERIAL_ECHOPGM(y), SERIAL_ECHOLN(z)) +#elif + #define ANYCUBIC_SENDCOMMAND_DBG_PGM(x,y) (ANYCUBIC_SERIAL_PROTOCOLLNPGM(x)) + #define ANYCUBIC_SENDCOMMAND_DBG_PGM_VAL(x,y,z) (ANYCUBIC_SERIAL_PROTOCOLLNPGM(x)) +#endif + +char *itostr2(const uint8_t &x); +#ifndef ULTRA_LCD + char *itostr3(const int); + char *ftostr32(const float &); +#endif + +#define TFTBUFSIZE 4 +#define TFT_MAX_CMD_SIZE 96 + +// TODO: JBA don't think these are needed +/* +#define ANYCUBIC_TFT_STATE_IDLE 0 +#define ANYCUBIC_TFT_STATE_SDPRINT 1 +#define ANYCUBIC_TFT_STATE_SDPAUSE 2 +#define ANYCUBIC_TFT_STATE_SDPAUSE_REQ 3 +#define ANYCUBIC_TFT_STATE_SDPAUSE_OOF 4 +#define ANYCUBIC_TFT_STATE_SDSTOP_REQ 5 +#define ANYCUBIC_TFT_STATE_SDOUTAGE 99 +*/ + +class AnycubicTFTClass { +public: + AnycubicTFTClass(); + void OnSetup(); + void OnCommandScan(); + void OnKillTFT(); + void OnSDCardStateChange(bool); + void OnFilamentRunout(); + void OnUserConfirmRequired(const char *); + void OnPrintTimerStarted(); + void OnPrintTimerPaused(); + void OnPrintTimerStopped(); + + +private: + char TFTcmdbuffer[TFTBUFSIZE][TFT_MAX_CMD_SIZE]; + int TFTbuflen=0; + int TFTbufindr = 0; + int TFTbufindw = 0; + char serial3_char; + int serial3_count = 0; + char *TFTstrchr_pointer; + uint16_t HeaterCheckCount = 0; + uint8_t SpecialMenu = false; + uint8_t IsPrintingFromMedia = false; + + float CodeValue(); + bool CodeSeen(char); + void RenderCurrentFileList(); + void RenderSpecialMenu(uint16_t); + void RenderCurrentFolder(uint16_t); + void GetCommandFromTFT(); + void CheckSDCardChange(); + void CheckHeaterError(); + void CheckPauseState(); + void CheckPrintCompletion(); + void HandleSpecialMenu(); + void DoSDCardStateCheck(); + void DoFilamentRunoutCheck(); + void StartPrint(); + void PausePrint(); + void ResumePrint(); + void StopPrint(); + + char SelectedDirectory[30]; + char SelectedFile[FILENAME_LENGTH]; + +}; + +extern AnycubicTFTClass AnycubicTFT; + +#endif /* AnycubicTFT_h */ diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.cpp b/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.cpp new file mode 100644 index 000000000000..dd12147c307a --- /dev/null +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.cpp @@ -0,0 +1,309 @@ +/* + AnycubicSerial.cpp --- Support for Anycubic i3 Mega TFT serial connection + Created by Christian Hopp on 09.12.17. + + Original file: + HardwareSerial.cpp - Hardware serial library for Wiring + Copyright (c) 2006 Nicholas Zambetti. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Modified 23 November 2006 by David A. Mellis + Modified 28 September 2010 by Mark Sproul + Modified 14 August 2012 by Alarus +*/ + +#include +#include +#include +#include +#include "Arduino.h" +#include "wiring_private.h" +#include "../../../../MarlinCore.h" + + +#ifdef ANYCUBIC_TFT_MODEL + +// this next line disables the entire HardwareSerial.cpp, +// this is so I can support Attiny series and any other chip without a uart +#if defined(UBRR3H) + +#include "anycubic_serial.h" + +// Define constants and variables for buffering incoming serial data. We're +// using a ring buffer (I think), in which head is the index of the location +// to which to write the next incoming character and tail is the index of the +// location from which to read. +#if (RAMEND < 1000) + #define SERIAL_BUFFER_SIZE 64 +#else + #define SERIAL_BUFFER_SIZE 128 +#endif + +struct ring_buffer +{ + unsigned char buffer[SERIAL_BUFFER_SIZE]; + volatile unsigned int head; + volatile unsigned int tail; +}; + +#if defined(UBRR3H) + ring_buffer rx_buffer_ajg = { { 0 }, 0, 0 }; + ring_buffer tx_buffer_ajg = { { 0 }, 0, 0 }; +#endif + +inline void store_char(unsigned char c, ring_buffer *buffer) +{ + int i = (unsigned int)(buffer->head + 1) % SERIAL_BUFFER_SIZE; + + // if we should be storing the received character into the location + // just before the tail (meaning that the head would advance to the + // current location of the tail), we're about to overflow the buffer + // and so we don't write the character or advance the head. + if (i != buffer->tail) { + buffer->buffer[buffer->head] = c; + buffer->head = i; + } +} + +#if defined(USART3_RX_vect) && defined(UDR3) + void serialEvent3() __attribute__((weak)); + void serialEvent3() {} + #define serialEvent3_implemented + ISR(USART3_RX_vect) + { + if (bit_is_clear(UCSR3A, UPE3)) { + unsigned char c = UDR3; + store_char(c, &rx_buffer_ajg); + } else { + unsigned char c = UDR3; + }; + } +#endif + +#ifdef USART3_UDRE_vect +ISR(USART3_UDRE_vect) +{ + if (tx_buffer_ajg.head == tx_buffer_ajg.tail) { + // Buffer empty, so disable interrupts + cbi(UCSR3B, UDRIE3); + } + else { + // There is more data in the output buffer. Send the next byte + unsigned char c = tx_buffer_ajg.buffer[tx_buffer_ajg.tail]; + tx_buffer_ajg.tail = (tx_buffer_ajg.tail + 1) % SERIAL_BUFFER_SIZE; + + UDR3 = c; + } +} +#endif + + +// Constructors //////////////////////////////////////////////////////////////// + +AnycubicSerialClass::AnycubicSerialClass(ring_buffer *rx_buffer, ring_buffer *tx_buffer, + volatile uint8_t *ubrrh, volatile uint8_t *ubrrl, + volatile uint8_t *ucsra, volatile uint8_t *ucsrb, + volatile uint8_t *ucsrc, volatile uint8_t *udr, + uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udrie, uint8_t u2x) +{ + _rx_buffer = rx_buffer; + _tx_buffer = tx_buffer; + _ubrrh = ubrrh; + _ubrrl = ubrrl; + _ucsra = ucsra; + _ucsrb = ucsrb; + _ucsrc = ucsrc; + _udr = udr; + _rxen = rxen; + _txen = txen; + _rxcie = rxcie; + _udrie = udrie; + _u2x = u2x; +} + +// Public Methods ////////////////////////////////////////////////////////////// + +void AnycubicSerialClass::begin(unsigned long baud) +{ + uint16_t baud_setting; + bool use_u2x = true; + +#if F_CPU == 16000000UL + // hardcoded exception for compatibility with the bootloader shipped + // with the Duemilanove and previous boards and the firmware on the 8U2 + // on the Uno and Mega 2560. + if (baud == 57600) { + use_u2x = false; + } +#endif + +try_again: + + if (use_u2x) { + *_ucsra = 1 << _u2x; + baud_setting = (F_CPU / 4 / baud - 1) / 2; + } else { + *_ucsra = 0; + baud_setting = (F_CPU / 8 / baud - 1) / 2; + } + + if ((baud_setting > 4095) && use_u2x) + { + use_u2x = false; + goto try_again; + } + + // assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register) + *_ubrrh = baud_setting >> 8; + *_ubrrl = baud_setting; + + transmitting = false; + + sbi(*_ucsrb, _rxen); + sbi(*_ucsrb, _txen); + sbi(*_ucsrb, _rxcie); + cbi(*_ucsrb, _udrie); +} + +void AnycubicSerialClass::begin(unsigned long baud, byte config) +{ + uint16_t baud_setting; + uint8_t current_config; + bool use_u2x = true; + +#if F_CPU == 16000000UL + // hardcoded exception for compatibility with the bootloader shipped + // with the Duemilanove and previous boards and the firmware on the 8U2 + // on the Uno and Mega 2560. + if (baud == 57600) { + use_u2x = false; + } +#endif + +try_again: + + if (use_u2x) { + *_ucsra = 1 << _u2x; + baud_setting = (F_CPU / 4 / baud - 1) / 2; + } else { + *_ucsra = 0; + baud_setting = (F_CPU / 8 / baud - 1) / 2; + } + + if ((baud_setting > 4095) && use_u2x) + { + use_u2x = false; + goto try_again; + } + + // assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register) + *_ubrrh = baud_setting >> 8; + *_ubrrl = baud_setting; + + //set the data bits, parity, and stop bits +#if defined(__AVR_ATmega8__) + config |= 0x80; // select UCSRC register (shared with UBRRH) +#endif + *_ucsrc = config; + + sbi(*_ucsrb, _rxen); + sbi(*_ucsrb, _txen); + sbi(*_ucsrb, _rxcie); + cbi(*_ucsrb, _udrie); +} + +void AnycubicSerialClass::end() +{ + // wait for transmission of outgoing data + while (_tx_buffer->head != _tx_buffer->tail) + ; + + cbi(*_ucsrb, _rxen); + cbi(*_ucsrb, _txen); + cbi(*_ucsrb, _rxcie); + cbi(*_ucsrb, _udrie); + + // clear any received data + _rx_buffer->head = _rx_buffer->tail; +} + +int AnycubicSerialClass::available(void) +{ + return (int)(SERIAL_BUFFER_SIZE + _rx_buffer->head - _rx_buffer->tail) % SERIAL_BUFFER_SIZE; +} + +int AnycubicSerialClass::peek(void) +{ + if (_rx_buffer->head == _rx_buffer->tail) { + return -1; + } else { + return _rx_buffer->buffer[_rx_buffer->tail]; + } +} + +int AnycubicSerialClass::read(void) +{ + // if the head isn't ahead of the tail, we don't have any characters + if (_rx_buffer->head == _rx_buffer->tail) { + return -1; + } else { + unsigned char c = _rx_buffer->buffer[_rx_buffer->tail]; + _rx_buffer->tail = (unsigned int)(_rx_buffer->tail + 1) % SERIAL_BUFFER_SIZE; + return c; + } +} + +void AnycubicSerialClass::flush() +{ + // UDR is kept full while the buffer is not empty, so TXC triggers when EMPTY && SENT + while (transmitting && ! (*_ucsra & _BV(TXC0))); + transmitting = false; +} + +size_t AnycubicSerialClass::write(uint8_t c) +{ + int i = (_tx_buffer->head + 1) % SERIAL_BUFFER_SIZE; + + // If the output buffer is full, there's nothing for it other than to + // wait for the interrupt handler to empty it a bit + // ???: return 0 here instead? + while (i == _tx_buffer->tail) + ; + + _tx_buffer->buffer[_tx_buffer->head] = c; + _tx_buffer->head = i; + + sbi(*_ucsrb, _udrie); + // clear the TXC bit -- "can be cleared by writing a one to its bit location" + transmitting = true; + sbi(*_ucsra, TXC0); + + return 1; +} + +AnycubicSerialClass::operator bool() { + return true; +} + +// Preinstantiate Objects ////////////////////////////////////////////////////// + +#if defined(UBRR3H) + AnycubicSerialClass AnycubicSerial(&rx_buffer_ajg, &tx_buffer_ajg, &UBRR3H, &UBRR3L, &UCSR3A, &UCSR3B, &UCSR3C, &UDR3, RXEN3, TXEN3, RXCIE3, UDRIE3, U2X3); +#endif + +#endif + +#endif // whole file diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.h b/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.h new file mode 100644 index 000000000000..28cdbc6b52d6 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.h @@ -0,0 +1,149 @@ +/* + AnycubicSerial.h --- Support for Anycubic i3 Mega TFT serial connection + Created by Christian Hopp on 09.12.17. + + Original file: + + HardwareSerial.h - Hardware serial library for Wiring + Copyright (c) 2006 Nicholas Zambetti. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Modified 28 September 2010 by Mark Sproul + Modified 14 August 2012 by Alarus +*/ + +#ifndef AnycubicSerial_h +#define AnycubicSerial_h + +#include +#include + +#include "Stream.h" + +#define FORCE_INLINE __attribute__((always_inline)) inline + +struct ring_buffer; + +class AnycubicSerialClass : public Stream +{ + private: + ring_buffer *_rx_buffer; + ring_buffer *_tx_buffer; + volatile uint8_t *_ubrrh; + volatile uint8_t *_ubrrl; + volatile uint8_t *_ucsra; + volatile uint8_t *_ucsrb; + volatile uint8_t *_ucsrc; + volatile uint8_t *_udr; + uint8_t _rxen; + uint8_t _txen; + uint8_t _rxcie; + uint8_t _udrie; + uint8_t _u2x; + bool transmitting; + public: + AnycubicSerialClass(ring_buffer *rx_buffer, ring_buffer *tx_buffer, + volatile uint8_t *ubrrh, volatile uint8_t *ubrrl, + volatile uint8_t *ucsra, volatile uint8_t *ucsrb, + volatile uint8_t *ucsrc, volatile uint8_t *udr, + uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udrie, uint8_t u2x); + void begin(unsigned long); + void begin(unsigned long, uint8_t); + void end(); + virtual int available(void); + virtual int peek(void); + virtual int read(void); + virtual void flush(void); + virtual size_t write(uint8_t); + inline size_t write(unsigned long n) { return write((uint8_t)n); } + inline size_t write(long n) { return write((uint8_t)n); } + inline size_t write(unsigned int n) { return write((uint8_t)n); } + inline size_t write(int n) { return write((uint8_t)n); } + using Print::write; // pull in write(str) and write(buf, size) from Print + operator bool(); +}; + +// Define config for Serial.begin(baud, config); +#define SERIAL_5N1 0x00 +#define SERIAL_6N1 0x02 +#define SERIAL_7N1 0x04 +#define SERIAL_8N1 0x06 +#define SERIAL_5N2 0x08 +#define SERIAL_6N2 0x0A +#define SERIAL_7N2 0x0C +#define SERIAL_8N2 0x0E +#define SERIAL_5E1 0x20 +#define SERIAL_6E1 0x22 +#define SERIAL_7E1 0x24 +#define SERIAL_8E1 0x26 +#define SERIAL_5E2 0x28 +#define SERIAL_6E2 0x2A +#define SERIAL_7E2 0x2C +#define SERIAL_8E2 0x2E +#define SERIAL_5O1 0x30 +#define SERIAL_6O1 0x32 +#define SERIAL_7O1 0x34 +#define SERIAL_8O1 0x36 +#define SERIAL_5O2 0x38 +#define SERIAL_6O2 0x3A +#define SERIAL_7O2 0x3C +#define SERIAL_8O2 0x3E + +#if defined(UBRR3H) + extern AnycubicSerialClass AnycubicSerial; +#endif + +extern void serialEventRun(void) __attribute__((weak)); + +#define ANYCUBIC_SERIAL_PROTOCOL(x) (AnycubicSerial.print(x)) +#define ANYCUBIC_SERIAL_PROTOCOL_F(x,y) (AnycubicSerial.print(x,y)) +#define ANYCUBIC_SERIAL_PROTOCOLPGM(x) (AnycubicSerialprintPGM(PSTR(x))) +#define ANYCUBIC_SERIAL_(x) (AnycubicSerial.print(x),AnycubicSerial.write('\n')) +#define ANYCUBIC_SERIAL_PROTOCOLLN(x) (AnycubicSerial.print(x),AnycubicSerial.write('\r'),AnycubicSerial.write('\n')) +#define ANYCUBIC_SERIAL_PROTOCOLLNPGM(x) (AnycubicSerialprintPGM(PSTR(x)),AnycubicSerial.write('\r'),AnycubicSerial.write('\n')) + +#define ANYCUBIC_SERIAL_START() (AnycubicSerial.write('\r'),AnycubicSerial.write('\n')) +#define ANYCUBIC_SERIAL_CMD_SEND(x) (AnycubicSerialprintPGM(PSTR(x)),AnycubicSerial.write('\r'),AnycubicSerial.write('\n')) +#define ANYCUBIC_SERIAL_ENTER() (AnycubicSerial.write('\r'),AnycubicSerial.write('\n')) +#define ANYCUBIC_SERIAL_SPACE() (AnycubicSerial.write(' ')) + +const char newErr[] PROGMEM ="ERR "; +const char newSucc[] PROGMEM ="OK"; + +#define ANYCUBIC_SERIAL_ERROR_START (AnycubicSerialprintPGM(newErr)) +#define ANYCUBIC_SERIAL_ERROR(x) ANYCUBIC_SERIAL_PROTOCOL(x) +#define ANYCUBIC_SERIAL_ERRORPGM(x) ANYCUBIC_SERIAL_PROTOCOLPGM(x) +#define ANYCUBIC_SERIAL_ERRORLN(x) ANYCUBIC_SERIAL_PROTOCOLLN(x) +#define ANYCUBIC_SERIAL_ERRORLNPGM(x) ANYCUBIC_SERIAL_PROTOCOLLNPGM(x) + +//##define ANYCUBIC_SERIAL_ECHO_START (AnycubicSerialprintPGM(newSucc)) +#define ANYCUBIC_SERIAL_ECHOLN(x) ANYCUBIC_SERIAL_PROTOCOLLN(x) +#define ANYCUBIC_SERIAL_SUCC_START (AnycubicSerialprintPGM(newSucc)) +#define ANYCUBIC_SERIAL_ECHOPAIR(name,value) (serial_echopair_P(PSTR(name),(value))) +#define ANYCUBIC_SERIAL_ECHOPGM(x) ANYCUBIC_SERIAL_PROTOCOLPGM(x) +#define ANYCUBIC_SERIAL_ECHO(x) ANYCUBIC_SERIAL_PROTOCOL(x) + +FORCE_INLINE void AnycubicSerialprintPGM(const char *str) +{ + char ch=pgm_read_byte(str); + while(ch) + { + AnycubicSerial.write(ch); + ch=pgm_read_byte(++str); + } +} + +#endif diff --git a/Marlin/src/lcd/extui_anycubic_tft.cpp b/Marlin/src/lcd/extui_anycubic_tft.cpp new file mode 100644 index 000000000000..fd4cb4fef3bf --- /dev/null +++ b/Marlin/src/lcd/extui_anycubic_tft.cpp @@ -0,0 +1,140 @@ +/********************* + * extui_anycubic_tftexample.cpp * + *********************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * To view a copy of the GNU General Public License, go to the following * + * location: . * + ****************************************************************************/ + +#include "../inc/MarlinConfigPre.h" + +#if BOTH(ANYCUBIC_TFT_MODEL, EXTENSIBLE_UI) + +#include "extui/lib/anycubic/anycubic_TFT.h" +#include "extui/ui_api.h" + +#include + +namespace ExtUI { + void onStartup() { + /* Initialize the display module here. The following + * routines are available for access to the GPIO pins: + * + * SET_OUTPUT(pin) + * SET_INPUT_PULLUP(pin) + * SET_INPUT(pin) + * WRITE(pin,value) + * READ(pin) + */ + AnycubicTFT.OnSetup(); + } + + void onIdle() { + AnycubicTFT.OnCommandScan(); + } + + void onPrinterKilled(PGM_P const error, PGM_P const component) { + AnycubicTFT.OnKillTFT(); + } + + void onMediaInserted() { + AnycubicTFT.OnSDCardStateChange(true); + }; + + void onMediaError() {}; + + void onMediaRemoved() { + AnycubicTFT.OnSDCardStateChange(false); + }; + + void onPlayTone(const uint16_t frequency, const uint16_t duration) { + #if ENABLED(SPEAKER) + ::tone(BEEPER_PIN, frequency, duration); + #endif + } + void onPrintTimerStarted() { + AnycubicTFT.OnPrintTimerStarted(); + } + + void onPrintTimerPaused() { + AnycubicTFT.OnPrintTimerPaused(); + } + + void onPrintTimerStopped() { + AnycubicTFT.OnPrintTimerStopped(); + } + + void onFilamentRunout(const extruder_t extruder) { + AnycubicTFT.OnFilamentRunout(); + } + + void onUserConfirmRequired(const char * const msg) { + AnycubicTFT.OnUserConfirmRequired(msg); + } + + void onStatusChanged(const char * const msg) {} + void onFactoryReset() {} + + void onStoreSettings(char *buff) { + // Called when saving to EEPROM (i.e. M500). If the ExtUI needs + // permanent data to be stored, it can write up to eeprom_data_size bytes + // into buff. + + // Example: + // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); + // memcpy(buff, &myDataStruct, sizeof(myDataStruct)); + } + + void onLoadSettings(const char *buff) { + // Called while loading settings from EEPROM. If the ExtUI + // needs to retrieve data, it should copy up to eeprom_data_size bytes + // from buff + + // Example: + // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); + // memcpy(&myDataStruct, buff, sizeof(myDataStruct)); + } + + void onConfigurationStoreWritten(bool success) { + // Called after the entire EEPROM has been written, + // whether successful or not. + } + + void onConfigurationStoreRead(bool success) { + // Called after the entire EEPROM has been read, + // whether successful or not. + } + + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) { + // Called when any mesh points are updated + } + + #if ENABLED(POWER_LOSS_RECOVERY) + void onPowerLossResume() { + // Called on resume from power-loss + } + #endif + + #if HAS_PID_HEATING + void onPidTuning(const result_t rst) { + // Called for temperature PID tuning result + } + #endif +} + +#endif // EXTUI_EXAMPLE && EXTENSIBLE_UI + + diff --git a/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h b/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h index a512aa8353fe..41fd19baae53 100644 --- a/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h +++ b/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h @@ -54,6 +54,28 @@ #define TG_FAN0_PIN 9 // Anycubic Kossel: Usually the part cooling fan #define TG_FAN1_PIN 7 // Anycubic Kossel: Unused #define TG_FAN2_PIN 44 // Anycubic Kossel: Hotend fan +#define CONTROLLER_FAN_PIN TG_FAN1_PIN +//#define BUZZER 31 +#define BEEPER_PIN 31 +#define SDSS 53 +#define LED_PIN 13 +#define SD_DETECT_PIN 49 +#define FIL_RUNOUT_PIN 19 + +// fix the limit pins that are wrong in pins_Ramps.h +// +// Limit Switches +// +#define X_MIN_PIN 3 +#define X_MAX_PIN 43 +#define Y_MIN_PIN 42 +#define Y_MAX_PIN -1 +#define Z_MIN_PIN 18 +#define Z_MAX_PIN -1 +// +// Z Probe (when not Z_MIN_PIN) +// +#define Z_MIN_PROBE_PIN 2 // Remap MOSFET pins to common usages: From 3ff2983e0a5824873d76797a59592220796d41cc Mon Sep 17 00:00:00 2001 From: jba Date: Sun, 28 Jun 2020 23:06:06 +1000 Subject: [PATCH 02/31] Disabled s curve acceleration as linear advance doesn't play nice with it. --- Marlin/Configuration.h | 2 +- Marlin/Configuration_adv.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 27c1e2fab3c0..9aad0bcf55d0 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -832,7 +832,7 @@ * * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained */ -#define S_CURVE_ACCELERATION +//#define S_CURVE_ACCELERATION //=========================================================================== //============================= Z Probe Options ============================= diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 743b4839e2b9..524ec644f82d 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1598,7 +1598,7 @@ //#define EXTRA_LIN_ADVANCE_K // Enable for second linear advance constants #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed //#define LA_DEBUG // If enabled, this will generate debug information output over USB. - #define EXPERIMENTAL_SCURVE // Enable this option to permit S-Curve Acceleration + //#define EXPERIMENTAL_SCURVE // Enable this option to permit S-Curve Acceleration #endif // @section leveling From 42026338c1c59a73695cef760085e5a692da4c5a Mon Sep 17 00:00:00 2001 From: jba Date: Sun, 28 Jun 2020 23:08:54 +1000 Subject: [PATCH 03/31] Include reference to David Ramiro as it's missing --- Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp index 1151859531d0..1d0381998675 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp @@ -1,6 +1,7 @@ /* AnycubicTFT.cpp --- Support for Anycubic i3 Mega TFT Created by Christian Hopp on 09.12.17. + Improved by David Ramiro Converted to ext_iu by John BouAntoun 21 June 2020 This library is free software; you can redistribute it and/or From 1698ce92138b67dd9a912d364af1f62e26d7e6a0 Mon Sep 17 00:00:00 2001 From: jba Date: Sun, 28 Jun 2020 23:10:53 +1000 Subject: [PATCH 04/31] Include reference to David Ramiro as it's missing --- Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h index a50265a0e2dd..978bdb4fe58c 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h @@ -1,7 +1,9 @@ /* AnycubicTFT.h --- Support for Anycubic i3 Mega TFT Created by Christian Hopp on 09.12.17. - + Improved by David Ramiro + Converted to ext_iu by John BouAntoun 21 June 2020 + This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either From 1b9d99159b6248fb093a28b8712d43e83fc62d5b Mon Sep 17 00:00:00 2001 From: John BouAntoun Date: Mon, 29 Jun 2020 17:23:33 +1000 Subject: [PATCH 05/31] Removed dependancy on buzzer.h by using the m300 gcode for sending tones --- Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp index 1d0381998675..5d9bfab3feda 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp @@ -307,16 +307,12 @@ void AnycubicTFTClass::HandleSpecialMenu() { case '5': // "<05FWDeflts>" SERIAL_ECHOLNPGM("Special Menu: Load FW Defaults"); - ExtUI::injectCommands_P(PSTR("M502")); - buzzer.tone(105, 1661); - buzzer.tone(210, 1108); + ExtUI::injectCommands_P(PSTR("M502\nM300 P105 S1661\nM300 P210 S1108")); break; case '6': // "<06SvEEPROM>" SERIAL_ECHOLNPGM("Special Menu: Save EEPROM"); - ExtUI::injectCommands_P(PSTR("M500")); - buzzer.tone(105, 1108); - buzzer.tone(210, 1661); + ExtUI::injectCommands_P(PSTR("M500\nM300 P105 S1108\nM300 P210 S1661")); break; default: From a8740ce805f34ace1cae2c2acf6b681674e7bd57 Mon Sep 17 00:00:00 2001 From: John BouAntoun Date: Mon, 29 Jun 2020 17:25:14 +1000 Subject: [PATCH 06/31] Removed dependancy on buzzer.h by using the m300 gcode for sending tones --- .../lcd/extui/lib/anycubic/anycubic_TFT.cpp | 23 ++++--------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp index 5d9bfab3feda..b9b81bba5b5b 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp @@ -28,7 +28,6 @@ #include "anycubic_serial.h" #include "../../ui_api.h" #include "../../../../MarlinCore.h" // for quickstop_stepper and disable_steppers -#include "../../../../libs/buzzer.h"// for buzzer.tone /* not sure i need these */ /* @@ -115,13 +114,7 @@ void AnycubicTFTClass::OnSetup() { SelectedFile[0]=0; #ifdef STARTUP_CHIME - buzzer.tone(250, 554); // C#5 - buzzer.tone(250, 554); // C#5 - buzzer.tone(250, 740); // F#5 - buzzer.tone(250, 554); // C#5 - buzzer.tone(250, 740); // F#5 - buzzer.tone(250, 554); // C#5 - buzzer.tone(500, 831); // G#5 + ExtUI::injectCommands_P(PSTR("M300 P250 S554\nM300 P250 S554\nM300 P250 S740\nM300 P250 S554\nM300 P250 S740\nM300 P250 S554\nM300 P500 S831")); #endif #if ENABLED(ANYCUBIC_TFT_DEBUG) @@ -266,16 +259,12 @@ void AnycubicTFTClass::HandleSpecialMenu() { switch (SelectedDirectory[2]) { case '0': // "<10FWDeflts>" SERIAL_ECHOLNPGM("Special Menu: Load FW Defaults"); - ExtUI::injectCommands_P(PSTR("M502")); - buzzer.tone(105, 1661); - buzzer.tone(210, 1108); + ExtUI::injectCommands_P(PSTR("M502\nM300 P105 S1661\nM300 P210 S1108")); break; case '1': // "<11SvEEPROM>" SERIAL_ECHOLNPGM("Special Menu: Save EEPROM"); - ExtUI::injectCommands_P(PSTR("M500")); - buzzer.tone(105, 1108); - buzzer.tone(210, 1661); + ExtUI::injectCommands_P(PSTR("M500\nM300 P105 S1108\nM300 P210 S1661")); break; default: @@ -982,11 +971,7 @@ void AnycubicTFTClass::PausePrint() { if (ExtUI::getFilamentRunoutState()) { // play tone to indicate filament is out - buzzer.tone(200, 1567); - buzzer.tone(200, 1174); - buzzer.tone(200, 1567); - buzzer.tone(200, 1174); - buzzer.tone(2000, 1567); + ExtUI::injectCommands_P(PSTR("\nM300 P200 S1567\nM300 P200 S1174\nM300 P200 S1567\nM300 P200 S1174\nM300 P2000 S1567")); // tell the user that the filament has run out and wait ANYCUBIC_SENDCOMMAND_DBG_PGM("J23", "TFT Serial Debug: Show filament prompt... J23"); From 1d8f789b154b2ff4cc1ba926df7bc0158a26ba5c Mon Sep 17 00:00:00 2001 From: jba Date: Tue, 30 Jun 2020 20:51:11 +1000 Subject: [PATCH 07/31] Cleaned up configs to be closest to stock AI3M --- Marlin/Configuration.h | 61 ++++++++++++++++++++++---------------- Marlin/Configuration_adv.h | 1 - 2 files changed, 35 insertions(+), 27 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 9aad0bcf55d0..6f8ae5c9b2d4 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -21,6 +21,8 @@ */ #pragma once +#define CONFIG_EXAMPLES_DIR "AnyCubic/AI3M_BLTouch_reversed2208" + /** * Configuration.h * @@ -132,7 +134,7 @@ #endif // Name displayed in the LCD "Ready" message and Info menu -//#define CUSTOM_MACHINE_NAME "3D Printer" +#define CUSTOM_MACHINE_NAME "Anycubic i3" // Printer's unique ID, used by some programs to differentiate between machines. // Choose your own or use a service like http://www.uuidgenerator.net/version4 @@ -495,9 +497,9 @@ #define DEFAULT_Kd 54.19 // Ultimaker - // #define DEFAULT_Kp 22.2 - // #define DEFAULT_Ki 1.08 - // #define DEFAULT_Kd 114 + //#define DEFAULT_Kp 22.2 + //#define DEFAULT_Ki 1.08 + //#define DEFAULT_Kd 114 // MakerGear //#define DEFAULT_Kp 7.0 @@ -549,6 +551,12 @@ #define DEFAULT_bedKi 49.57 #define DEFAULT_bedKd 319.73 + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + //#define DEFAULT_bedKp 10.00 + //#define DEFAULT_bedKi .023 + //#define DEFAULT_bedKd 305.4 + //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) //from pidautotune //#define DEFAULT_bedKp 97.1 @@ -583,7 +591,7 @@ * Note: For Bowden Extruders make this large enough to allow load/unload. */ #define PREVENT_LENGTHY_EXTRUDE -#define EXTRUDE_MAXLENGTH 200 +#define EXTRUDE_MAXLENGTH 600 //=========================================================================== //======================== Thermal Runaway Protection ======================= @@ -633,7 +641,7 @@ #define USE_XMIN_PLUG #define USE_YMIN_PLUG #define USE_ZMIN_PLUG -#define USE_XMAX_PLUG +#define USE_XMAX_PLUG // used as the second z stepper end limit switch //#define USE_YMAX_PLUG //#define USE_ZMAX_PLUG @@ -664,13 +672,13 @@ #endif // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). -#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. -#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. -#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. -#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. -#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. -#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop. -#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the probe. +#define X_MIN_ENDSTOP_INVERTING true // Set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING true // Set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING true // Set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING true // Set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING true // Set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING true // Set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING true // Set to true to invert the logic of the probe. /** * Stepper Drivers @@ -702,9 +710,9 @@ #define E2_DRIVER_TYPE TMC2208_STANDALONE #define E3_DRIVER_TYPE TMC2208_STANDALONE #define E4_DRIVER_TYPE TMC2208_STANDALONE -//#define E5_DRIVER_TYPE A4988 -//#define E6_DRIVER_TYPE A4988 -//#define E7_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE TMC2208_STANDALONE +//#define E6_DRIVER_TYPE TMC2208_STANDALONE +//#define E7_DRIVER_TYPE TMC2208_STANDALONE // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -749,13 +757,14 @@ * Override with M92 * X, Y, Z, E0 [, E1[, E2...]] */ -#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 400, 92.6 } +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 400, 96.2 } + /** * Default Max Feed Rate (mm/s) * Override with M203 * X, Y, Z, E0 [, E1[, E2...]] */ -#define DEFAULT_MAX_FEEDRATE { 500, 500, 6, 60 } +#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } //#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 #if ENABLED(LIMITED_MAX_FR_EDITING) @@ -797,9 +806,9 @@ */ //#define CLASSIC_JERK #if ENABLED(CLASSIC_JERK) - #define DEFAULT_XJERK 10.0 - #define DEFAULT_YJERK 10.0 - #define DEFAULT_ZJERK 0.4 + #define DEFAULT_XJERK 10.0 + #define DEFAULT_YJERK 10.0 + #define DEFAULT_ZJERK 0.3 //#define TRAVEL_EXTRA_XYJERK 0.0 // Additional jerk allowance for all travel moves @@ -1083,9 +1092,9 @@ // @section machine // Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. -#define INVERT_X_DIR true -#define INVERT_Y_DIR false -#define INVERT_Z_DIR false +#define INVERT_X_DIR true // set to true for stock drivers or TMC2208 with reversed connectors +#define INVERT_Y_DIR false // set to false for stock drivers or TMC2208 with reversed connectors +#define INVERT_Z_DIR false // set to false for stock drivers or TMC2208 with reversed // @section extruder @@ -1119,8 +1128,8 @@ // @section machine // The size of the print bed -#define X_BED_SIZE 215 -#define Y_BED_SIZE 215 +#define X_BED_SIZE 210 +#define Y_BED_SIZE 210 // Travel limits (mm) after homing, corresponding to endstop positions. #define X_MIN_POS -5 diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 524ec644f82d..cf1b50fe062b 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -757,7 +757,6 @@ #define Z_STEPPER_ALIGN_AMP 1.0 // Use a value > 1.0 NOTE: This may cause instability! #endif - // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline that G34 will handle #define Z_STEPPER_ALIGN_ITERATIONS 5 // Number of iterations to apply during alignment #define Z_STEPPER_ALIGN_ACC 0.02 // Stop iterating early if the accuracy is better than this From 6773cf0bc34c522ef9c69e9b56cd6ed215214305 Mon Sep 17 00:00:00 2001 From: John BouAntoun Date: Wed, 1 Jul 2020 14:54:20 +1000 Subject: [PATCH 08/31] This is not the example, it's the actual config --- Marlin/Configuration.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 6f8ae5c9b2d4..24ec80afc68b 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -21,8 +21,6 @@ */ #pragma once -#define CONFIG_EXAMPLES_DIR "AnyCubic/AI3M_BLTouch_reversed2208" - /** * Configuration.h * From 3a046dc7a7ab2b1fa15b622ffda29f74072768f4 Mon Sep 17 00:00:00 2001 From: John BouAntoun Date: Wed, 1 Jul 2020 17:44:59 +1000 Subject: [PATCH 09/31] fixed the axis adjustment moves and the special menu initial processing --- .../lcd/extui/lib/anycubic/anycubic_TFT.cpp | 36 ++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp index b9b81bba5b5b..b483790b78f2 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp @@ -188,16 +188,20 @@ bool AnycubicTFTClass::CodeSeen(char code) { } void AnycubicTFTClass::HandleSpecialMenu() { + // + // NOTE: that the file selection command actual lowercases the entire selected file/foldername, so charracter comparisons need to be lowercase. + // if (SelectedDirectory[0] == '<' ) { switch (SelectedDirectory[1]) { - - case 'S': // "" - SpecialMenu = true; - return; - break; + + // this will not bein the special menu as it was in the root folder + // case 's': // "" + // SpecialMenu = true; + // return; + // break; - case 'E': // "" + case 'e': // "" SpecialMenu = false; return; break; @@ -431,7 +435,7 @@ void AnycubicTFTClass::RenderCurrentFolder(uint16_t selectedNumber) { for (cnt = selectedNumber; cnt <= max_files; cnt++) { if (cnt == 0) { // Special Entry if(currentFileList.isAtRootDir()) { - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); } else { ANYCUBIC_SERIAL_PROTOCOLLNPGM("/.."); @@ -519,7 +523,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { #if ENABLED(ANYCUBIC_TFT_DEBUG) if ((a_command>7) && (a_command != 20)) { // No debugging of status polls, please! SERIAL_ECHOPGM("TFT Serial Command: "); - SERIAL_ECHO(TFTcmdbuffer[TFTbufindw]); + SERIAL_ECHOLN(TFTcmdbuffer[TFTbufindw]); } #endif @@ -662,6 +666,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { ANYCUBIC_SERIAL_ENTER(); } else if (TFTstrchr_pointer[4] == '<') { strcpy(SelectedDirectory, TFTstrchr_pointer+4); + SpecialMenu = true; SelectedFile[0] = 0; ANYCUBIC_SENDCOMMAND_DBG_PGM("J21", "TFT Serial Debug: Clear file selection... J21 "); // J21 Not File Selected ANYCUBIC_SERIAL_ENTER(); @@ -734,7 +739,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { } break; - case 19: // A19 stop stepper drivers + case 19: // A19 stop stepper drivers - sent on stop extrude command and on turn motors off command if(!ExtUI::isPrinting()) { quickstop_stepper(); disable_all_steppers(); @@ -780,6 +785,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { float coorvalue; unsigned int movespeed = 0; char commandStr[30]; + char fullCommandStr[38]; commandStr[0] = 0; // empty string if (CodeSeen('F')) { // Set feedrate @@ -825,10 +831,14 @@ void AnycubicTFTClass::GetCommandFromTFT() { sprintf_P(commandStr, PSTR("G1 E%iF500"), int(coorvalue)); } } - - if(strlen_P(commandStr) > 0) { - sprintf_P(commandStr, PSTR("G91\n%s\nG90"), commandStr); - ExtUI::injectCommands(commandStr); + + if(strlen(commandStr) > 0) { + sprintf_P(fullCommandStr, PSTR("G91\n%s\nG90"), commandStr); + #if ENABLED(ANYCUBIC_TFT_DEBUG) + SERIAL_ECHOPGM("TFT Serial Debug: A22 Move final request with gcode... "); + SERIAL_ECHOLN(fullCommandStr); + #endif + ExtUI::injectCommands(fullCommandStr); } } ANYCUBIC_SERIAL_ENTER(); From d0c8af447aed4ff4e3031c121b1ef92c369028ca Mon Sep 17 00:00:00 2001 From: John BouAntoun Date: Wed, 1 Jul 2020 22:24:30 +1000 Subject: [PATCH 10/31] fix hotend pid tune to make sure fan has a chance to start before the PID tune starts --- Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp index b483790b78f2..b5a8c449e42b 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp @@ -246,7 +246,8 @@ void AnycubicTFTClass::HandleSpecialMenu() { case '8': // "<08HtEndPID>" SERIAL_ECHOLNPGM("Special Menu: Auto Tune Hotend PID"); - ExtUI::injectCommands_P(PSTR("M106 S204\nM303 E0 S215 C15 U1")); + // need to dwell for half a second to give the fan a chance to start before the pid tuning starts + ExtUI::injectCommands_P(PSTR("M106 S204\nG4 P500\nM303 E0 S215 C15 U1")); break; case '9': // "<09HtBedPID>" @@ -290,7 +291,8 @@ void AnycubicTFTClass::HandleSpecialMenu() { case '3': // "<03HtendPID>" SERIAL_ECHOLNPGM("Special Menu: Auto Tune Hotend PID"); - ExtUI::injectCommands_P(PSTR("M106 S204\nM303 E0 S215 C15 U1")); + // need to dwell for half a second to give the fan a chance to start before the pid tuning starts + ExtUI::injectCommands_P(PSTR("M106 S204\nG4 P500\nM303 E0 S215 C15 U1")); break; case '4': // "<04HtbedPID>" From 9f0bd62b547879db170fba1fd7f7a4b63e2d855b Mon Sep 17 00:00:00 2001 From: John BouAntoun Date: Sat, 4 Jul 2020 12:22:49 +1000 Subject: [PATCH 11/31] Clean up some pause states and disable auto purge on resume. --- Marlin/Configuration_adv.h | 6 +- .../lcd/extui/lib/anycubic/anycubic_TFT.cpp | 100 ++++++++---------- .../src/lcd/extui/lib/anycubic/anycubic_TFT.h | 2 +- 3 files changed, 48 insertions(+), 60 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index cf1b50fe062b..312e72573de0 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2046,10 +2046,12 @@ // For direct drive, the full length of the nozzle. //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. - #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + //#define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. // Set to 0 for manual extrusion. // Filament can be extruded repeatedly from the Filament Change menu // until extrusion is consistent, and to purge old filament. + #define ADVANCED_PAUSE_PURGE_LENGTH 0 // (mm) AI3M use manual exrusion + #define ADVANCED_PAUSE_RESUME_PRIME 0 // (mm) Extra distance to prime nozzle after returning from park. //#define ADVANCED_PAUSE_FANS_PAUSE // Turn off print-cooling fans while the machine is paused. @@ -3195,7 +3197,7 @@ */ #define HOST_ACTION_COMMANDS #if ENABLED(HOST_ACTION_COMMANDS) - //#define HOST_PROMPT_SUPPORT + #define HOST_PROMPT_SUPPORT #endif /** diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp index b5a8c449e42b..fb0a9263b752 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp @@ -29,33 +29,6 @@ #include "../../ui_api.h" #include "../../../../MarlinCore.h" // for quickstop_stepper and disable_steppers -/* not sure i need these */ -/* - -#include "../../../../sd/cardreader.h" -#include "../../../../core/language.h" -#include "../../../../core/macros.h" -#include "../../../../core/serial.h" -#include "../../../../feature/pause.h" - -#include "../../../../module/stepper.h" -*/ - -/* these are in ui_api */ -/* -#include "../../../../module/temperature.h" -#include "../../../../module/printcounter.h" -#include "../../../../feature/e_parser.h" -#include "../../../../gcode/queue.h" -#include "../../../../module/planner.h" -*/ -/* main includes, need to confirm which of these i actually need */ -// #include "Arduino.h" -// #include -// #include -// #include -// #include - char _conv[8]; char *itostr2(const uint8_t &x) @@ -105,25 +78,34 @@ void AnycubicTFTClass::OnSetup() { AnycubicSerial.begin(115200); ANYCUBIC_SENDCOMMAND_DBG_PGM("J17", "TFT Serial Debug: Main board reset... J17"); // J17 Main board reset ExtUI::delay_ms(10); + + // initialise the state of the key pins running on the tft + #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT) + pinMode(SD_DETECT_PIN, INPUT); + WRITE(SD_DETECT_PIN, HIGH); + #endif + #if ENABLED(FILAMENT_RUNOUT_SENSOR) + pinMode(FIL_RUNOUT_PIN,INPUT); + WRITE(FIL_RUNOUT_PIN,HIGH); + #endif + + // DoSDCardStateCheck(); ANYCUBIC_SENDCOMMAND_DBG_PGM("J12", "TFT Serial Debug: Ready... J12"); // J12 Ready + ExtUI::delay_ms(10); - DoSDCardStateCheck(); DoFilamentRunoutCheck(); - - SelectedDirectory[0]=0; SelectedFile[0]=0; #ifdef STARTUP_CHIME ExtUI::injectCommands_P(PSTR("M300 P250 S554\nM300 P250 S554\nM300 P250 S740\nM300 P250 S554\nM300 P250 S740\nM300 P250 S554\nM300 P500 S831")); #endif - #if ENABLED(ANYCUBIC_TFT_DEBUG) SERIAL_ECHOLNPGM("TFT Serial Debug: Finished startup"); #endif } void AnycubicTFTClass::OnCommandScan() { - CheckHeaterError(); + // CheckHeaterError(); if(TFTbuflen<(TFTBUFSIZE-1)) { GetCommandFromTFT(); @@ -463,19 +445,19 @@ void AnycubicTFTClass::RenderCurrentFolder(uint16_t selectedNumber) { } } -void AnycubicTFTClass::CheckHeaterError() { - if ((ExtUI::getActualTemp_celsius((ExtUI::extruder_t) ExtUI::E0) < 5) || (ExtUI::getActualTemp_celsius((ExtUI::extruder_t) ExtUI::E0) > 290)) { - if (HeaterCheckCount > 60000) { - HeaterCheckCount = 0; - ANYCUBIC_SENDCOMMAND_DBG_PGM("J10", "TFT Serial Debug: Hotend temperature abnormal... J10"); // J10 Hotend temperature abnormal - } - else { - HeaterCheckCount++; - } - } else { - HeaterCheckCount = 0; - } -} +// void AnycubicTFTClass::CheckHeaterError() { +// if ((ExtUI::getActualTemp_celsius((ExtUI::extruder_t) ExtUI::E0) < 5) || (ExtUI::getActualTemp_celsius((ExtUI::extruder_t) ExtUI::E0) > 290)) { +// if (HeaterCheckCount > 60000) { +// HeaterCheckCount = 0; +// ANYCUBIC_SENDCOMMAND_DBG_PGM("J10", "TFT Serial Debug: Hotend temperature abnormal... J10"); // J10 Hotend temperature abnormal +// } +// else { +// HeaterCheckCount++; +// } +// } else { +// HeaterCheckCount = 0; +// } +// } void AnycubicTFTClass::OnPrintTimerStarted() { #if ENABLED(SDSUPPORT) @@ -952,9 +934,16 @@ void AnycubicTFTClass::DoSDCardStateCheck() { void AnycubicTFTClass::DoFilamentRunoutCheck() { #if ENABLED(FILAMENT_RUNOUT_SENSOR) - // TODO: JBA There is no EXtUI method to check the state of the filament runout sensor which is werid if (ExtUI::getFilamentRunoutState()) { - ANYCUBIC_SENDCOMMAND_DBG_PGM("J15", "TFT Serial Debug: Filament runout... J15"); + if(IsPrintingFromMedia or ExtUI::isPrintingFromMedia()) { + // play tone to indicate filament is out + ExtUI::injectCommands_P(PSTR("\nM300 P200 S1567\nM300 P200 S1174\nM300 P200 S1567\nM300 P200 S1174\nM300 P2000 S1567")); + + // tell the user that the filament has run out and wait + ANYCUBIC_SENDCOMMAND_DBG_PGM("J23", "TFT Serial Debug: Blocking filament prompt... J23"); + } else { + ANYCUBIC_SENDCOMMAND_DBG_PGM("J15", "TFT Serial Debug: Non blocking filament runout... J15"); + } } #endif // FILAMENT_RUNOUT_SENSOR } @@ -979,15 +968,15 @@ void AnycubicTFTClass::PausePrint() { if(ExtUI::isPrintingFromMedia()) { ANYCUBIC_SENDCOMMAND_DBG_PGM("J05", "TFT Serial Debug: SD print pause started... J05"); // J05 printing pause - ExtUI::pausePrint(); - if (ExtUI::getFilamentRunoutState()) { - // play tone to indicate filament is out - ExtUI::injectCommands_P(PSTR("\nM300 P200 S1567\nM300 P200 S1174\nM300 P200 S1567\nM300 P200 S1174\nM300 P2000 S1567")); - // tell the user that the filament has run out and wait ANYCUBIC_SENDCOMMAND_DBG_PGM("J23", "TFT Serial Debug: Show filament prompt... J23"); + + // play tone to indicate filament is out + ExtUI::injectCommands_P(PSTR("\nM300 P200 S1567\nM300 P200 S1174\nM300 P200 S1567\nM300 P200 S1174\nM300 P2000 S1567")); } + + ExtUI::pausePrint(); } #endif // SDSUPPORT } @@ -995,24 +984,21 @@ void AnycubicTFTClass::PausePrint() { void AnycubicTFTClass::ResumePrint() { #if ENABLED(SDSUPPORT) #if ENABLED(FILAMENT_RUNOUT_SENSOR) - // TODO: JBA There is no EXtUI method to check the state of the filament runout sensor which is werid if (ExtUI::getFilamentRunoutState()) { PausePrint(); return; } #endif - ExtUI::resumePrint(); - ANYCUBIC_SENDCOMMAND_DBG_PGM("J04", "TFT Serial Debug: SD print resumed... J04"); // J04 printing form sd card now + ExtUI::resumePrint(); #endif } void AnycubicTFTClass::StopPrint() { #if ENABLED(SDSUPPORT) - ExtUI::stopPrint(); - ANYCUBIC_SENDCOMMAND_DBG_PGM("J16", "TFT Serial Debug: SD print stopped... J16"); + ExtUI::stopPrint(); #endif // SDSUPPORT } diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h index 978bdb4fe58c..d291937d37eb 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h @@ -90,7 +90,7 @@ class AnycubicTFTClass { void RenderCurrentFolder(uint16_t); void GetCommandFromTFT(); void CheckSDCardChange(); - void CheckHeaterError(); + // void CheckHeaterError(); void CheckPauseState(); void CheckPrintCompletion(); void HandleSpecialMenu(); From 732ee4fe1fd76ba9686c617d7979eb185f99da09 Mon Sep 17 00:00:00 2001 From: jba Date: Sat, 4 Jul 2020 17:53:19 +1000 Subject: [PATCH 12/31] First attempt at getting all the intra-pause states working, still can't test as m25 is auto resuming --- .../lcd/extui/lib/anycubic/anycubic_TFT.cpp | 108 +++++++++++++----- .../src/lcd/extui/lib/anycubic/anycubic_TFT.h | 22 +++- Marlin/src/lcd/extui_anycubic_tft.cpp | 4 +- 3 files changed, 102 insertions(+), 32 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp index fb0a9263b752..b29097d84a33 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp @@ -89,6 +89,9 @@ void AnycubicTFTClass::OnSetup() { WRITE(FIL_RUNOUT_PIN,HIGH); #endif + mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; + mediaPauseState = AMPAUSESTATE_NOT_PAUSED; + // DoSDCardStateCheck(); ANYCUBIC_SENDCOMMAND_DBG_PGM("J12", "TFT Serial Debug: Ready... J12"); // J12 Ready ExtUI::delay_ms(10); @@ -107,6 +110,17 @@ void AnycubicTFTClass::OnSetup() { void AnycubicTFTClass::OnCommandScan() { // CheckHeaterError(); + // if (mediaPrintingState == AMPRINTSTATE_PAUSED && !ExtUI::isMoving()) { + // mediaPrintingState = AMPRINTSTATE_PAUSED; + // ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: SD print paused done... J18"); + // } else + + if (mediaPrintingState == AMPRINTSTATE_STOP_REQUESTED && !ExtUI::isMoving()) { + mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; + mediaPauseState = AMPAUSESTATE_NOT_PAUSED; + ANYCUBIC_SENDCOMMAND_DBG_PGM("J16", "TFT Serial Debug: SD print stopped... J16"); + } + if(TFTbuflen<(TFTBUFSIZE-1)) { GetCommandFromTFT(); } @@ -131,6 +145,10 @@ void AnycubicTFTClass::OnSDCardStateChange(bool isInserted) { DoSDCardStateCheck(); } +void AnycubicTFTClass::OnSDCardError() { + ANYCUBIC_SENDCOMMAND_DBG_PGM("J21", "TFT Serial Debug: On SD Card Error ... J21"); +} + void AnycubicTFTClass::OnFilamentRunout() { #if ENABLED(ANYCUBIC_TFT_DEBUG) SERIAL_ECHOLNPGM("TFT Serial Debug: FilamentRunout triggered..."); @@ -146,8 +164,8 @@ void AnycubicTFTClass::OnUserConfirmRequired(const char * const msg) { #endif #if ENABLED(SDSUPPORT) - - // TODO: JBA Might have to handle states like heater time out and the like for interactive resume? + // + // The only way to handle these states is strcmp_P with the msg unfortunately /** * Need to handle the process of following states * "Nozzle Parked" @@ -156,8 +174,35 @@ void AnycubicTFTClass::OnUserConfirmRequired(const char * const msg) { * "HeaterTimeout" * "Reheat finished." */ + if (strcmp_P(msg, PSTR("Nozzle Parked")) == 0) { + mediaPrintingState = AMPRINTSTATE_PAUSED; + mediaPauseState = AMPAUSESTATE_PARKED; + // enable continue button + ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD print paused done... J18"); + } else if (strcmp_P(msg, PSTR("Load Filament")) == 0) { + mediaPrintingState = AMPRINTSTATE_PAUSED; + mediaPauseState = AMPAUSESTATE_FILAMENT_OUT; + // enable continue button + ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: UserConfirm Filament is out... J18"); + // tell the user that the filament has run out and wait + ANYCUBIC_SENDCOMMAND_DBG_PGM("J23", "TFT Serial Debug: UserConfirm Blocking filament prompt... J23"); + } else if (strcmp_P(msg, PSTR("Filament Purging...")) == 0) { + mediaPrintingState = AMPRINTSTATE_PAUSED; + mediaPauseState = AMPAUSESTATE_PARKING; + // disable all buttons + ANYCUBIC_SENDCOMMAND_DBG_PGM("J05", "TFT Serial Debug: UserConfirm SD Filament Purging... J05"); // J05 printing pause + } else if (strcmp_P(msg, PSTR("HeaterTimeout")) == 0) { + mediaPrintingState = AMPRINTSTATE_PAUSED; + mediaPauseState = AMPAUSESTATE_HEATER_TIMEOUT; + // enable continue button + ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD Heater timeout... J18"); + } else if (strcmp_P(msg, PSTR("Reheat finished.")) == 0) { + mediaPrintingState = AMPRINTSTATE_PAUSED; + mediaPauseState = AMPAUSESTATE_REHEAT_FINISHED; + // enable continue button + ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD Reheat done... J18"); + } #endif - } float AnycubicTFTClass::CodeValue() { @@ -174,15 +219,7 @@ void AnycubicTFTClass::HandleSpecialMenu() { // NOTE: that the file selection command actual lowercases the entire selected file/foldername, so charracter comparisons need to be lowercase. // if (SelectedDirectory[0] == '<' ) { - switch (SelectedDirectory[1]) { - - // this will not bein the special menu as it was in the root folder - // case 's': // "" - // SpecialMenu = true; - // return; - // break; - case 'e': // "" SpecialMenu = false; return; @@ -461,7 +498,7 @@ void AnycubicTFTClass::RenderCurrentFolder(uint16_t selectedNumber) { void AnycubicTFTClass::OnPrintTimerStarted() { #if ENABLED(SDSUPPORT) - if (IsPrintingFromMedia) { + if (mediaPrintingState == AMPRINTSTATE_PRINTING) { ANYCUBIC_SENDCOMMAND_DBG_PGM("J04","TFT Serial Debug: Starting SD Print... J04"); // J04 Starting Print } #endif @@ -469,18 +506,22 @@ void AnycubicTFTClass::OnPrintTimerStarted() { void AnycubicTFTClass::OnPrintTimerPaused() { #if ENABLED(SDSUPPORT) - if (IsPrintingFromMedia) { - ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: SD print paused done... J18"); + if (ExtUI::isPrintingFromMedia) { + mediaPrintingState = AMPRINTSTATE_PAUSED; + mediaPauseState = AMPAUSESTATE_PARKING; } #endif } void AnycubicTFTClass::OnPrintTimerStopped() { #if ENABLED(SDSUPPORT) - if (IsPrintingFromMedia) { - IsPrintingFromMedia = false; + if (mediaPrintingState == AMPRINTSTATE_PRINTING) { + mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; + mediaPauseState = AMPAUSESTATE_NOT_PAUSED; ANYCUBIC_SENDCOMMAND_DBG_PGM("J14", "TFT Serial Debug: SD Print Completed... J14"); } + + // otherwise it was stopped by the printer so don't send print completed signal to TFT #endif } @@ -935,7 +976,7 @@ void AnycubicTFTClass::DoSDCardStateCheck() { void AnycubicTFTClass::DoFilamentRunoutCheck() { #if ENABLED(FILAMENT_RUNOUT_SENSOR) if (ExtUI::getFilamentRunoutState()) { - if(IsPrintingFromMedia or ExtUI::isPrintingFromMedia()) { + if (mediaPrintingState == AMPRINTSTATE_PRINTING || mediaPrintingState == AMPRINTSTATE_PAUSED || mediaPrintingState == AMPRINTSTATE_PAUSE_REQUESTED) { // play tone to indicate filament is out ExtUI::injectCommands_P(PSTR("\nM300 P200 S1567\nM300 P200 S1174\nM300 P200 S1567\nM300 P200 S1174\nM300 P2000 S1567")); @@ -957,7 +998,8 @@ void AnycubicTFTClass::StartPrint() { SERIAL_ECHOPGM(" "); SERIAL_ECHOLN(SelectedFile); #endif - IsPrintingFromMedia = true; + mediaPrintingState = AMPRINTSTATE_PRINTING; + mediaPauseState = AMPAUSESTATE_NOT_PAUSED; ExtUI::printFile(SelectedFile); } #endif // SDUPPORT @@ -966,16 +1008,10 @@ void AnycubicTFTClass::StartPrint() { void AnycubicTFTClass::PausePrint() { #if ENABLED(SDSUPPORT) if(ExtUI::isPrintingFromMedia()) { + mediaPrintingState = AMPRINTSTATE_PAUSE_REQUESTED; + mediaPauseState = AMPAUSESTATE_NOT_PAUSED; // need the userconfirm method to update pause state ANYCUBIC_SENDCOMMAND_DBG_PGM("J05", "TFT Serial Debug: SD print pause started... J05"); // J05 printing pause - if (ExtUI::getFilamentRunoutState()) { - // tell the user that the filament has run out and wait - ANYCUBIC_SENDCOMMAND_DBG_PGM("J23", "TFT Serial Debug: Show filament prompt... J23"); - - // play tone to indicate filament is out - ExtUI::injectCommands_P(PSTR("\nM300 P200 S1567\nM300 P200 S1174\nM300 P200 S1567\nM300 P200 S1174\nM300 P2000 S1567")); - } - ExtUI::pausePrint(); } #endif // SDSUPPORT @@ -985,19 +1021,31 @@ void AnycubicTFTClass::ResumePrint() { #if ENABLED(SDSUPPORT) #if ENABLED(FILAMENT_RUNOUT_SENSOR) if (ExtUI::getFilamentRunoutState()) { - PausePrint(); + DoFilamentRunoutCheck(); return; } #endif + + if(mediaPauseState == AMPAUSESTATE_HEATER_TIMEOUT) { + mediaPauseState = AMPAUSESTATE_REHEATING; + // disable the continue button + ANYCUBIC_SENDCOMMAND_DBG_PGM("J05", "TFT Serial Debug: Resume called with heater timeout... J05"); // J05 printing pause + // reheat the nozzle + ExtUI::setUserConfirmed(); + } else { + mediaPrintingState = AMPRINTSTATE_PRINTING; + mediaPauseState = AMPAUSESTATE_NOT_PAUSED; - ANYCUBIC_SENDCOMMAND_DBG_PGM("J04", "TFT Serial Debug: SD print resumed... J04"); // J04 printing form sd card now - ExtUI::resumePrint(); + ANYCUBIC_SENDCOMMAND_DBG_PGM("J04", "TFT Serial Debug: SD print resumed... J04"); // J04 printing form sd card now + ExtUI::resumePrint(); + } #endif } void AnycubicTFTClass::StopPrint() { #if ENABLED(SDSUPPORT) - ANYCUBIC_SENDCOMMAND_DBG_PGM("J16", "TFT Serial Debug: SD print stopped... J16"); + mediaPrintingState = AMPRINTSTATE_STOP_REQUESTED; + mediaPauseState = AMPAUSESTATE_NOT_PAUSED; ExtUI::stopPrint(); #endif // SDSUPPORT } diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h index d291937d37eb..ffc581c5afe6 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h @@ -56,6 +56,24 @@ char *itostr2(const uint8_t &x); #define ANYCUBIC_TFT_STATE_SDSTOP_REQ 5 #define ANYCUBIC_TFT_STATE_SDOUTAGE 99 */ +enum AnycubicMediaPrintState { + AMPRINTSTATE_NOT_PRINTING, + AMPRINTSTATE_PRINTING, + AMPRINTSTATE_PAUSE_REQUESTED, + AMPRINTSTATE_PAUSED, + AMPRINTSTATE_STOP_REQUESTED +}; + +enum AnycubicMediaPauseState { + AMPAUSESTATE_NOT_PAUSED, + AMPAUSESTATE_PARKING, + AMPAUSESTATE_PARKED, + AMPAUSESTATE_FILAMENT_OUT, + AMPAUSESTATE_FIAMENT_PRUGING, + AMPAUSESTATE_HEATER_TIMEOUT, + AMPAUSESTATE_REHEATING, + AMPAUSESTATE_REHEAT_FINISHED +}; class AnycubicTFTClass { public: @@ -64,6 +82,7 @@ class AnycubicTFTClass { void OnCommandScan(); void OnKillTFT(); void OnSDCardStateChange(bool); + void OnSDCardError(); void OnFilamentRunout(); void OnUserConfirmRequired(const char *); void OnPrintTimerStarted(); @@ -81,7 +100,8 @@ class AnycubicTFTClass { char *TFTstrchr_pointer; uint16_t HeaterCheckCount = 0; uint8_t SpecialMenu = false; - uint8_t IsPrintingFromMedia = false; + AnycubicMediaPrintState mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; + AnycubicMediaPauseState mediaPauseState = AMPAUSESTATE_NOT_PAUSED; float CodeValue(); bool CodeSeen(char); diff --git a/Marlin/src/lcd/extui_anycubic_tft.cpp b/Marlin/src/lcd/extui_anycubic_tft.cpp index fd4cb4fef3bf..b5bccb8970de 100644 --- a/Marlin/src/lcd/extui_anycubic_tft.cpp +++ b/Marlin/src/lcd/extui_anycubic_tft.cpp @@ -54,7 +54,9 @@ namespace ExtUI { AnycubicTFT.OnSDCardStateChange(true); }; - void onMediaError() {}; + void onMediaError() { + AnycubicTFT.OnSDCardError(); + }; void onMediaRemoved() { AnycubicTFT.OnSDCardStateChange(false); From 7382a0162e3305a1aa197f56353d1bc811ae3628 Mon Sep 17 00:00:00 2001 From: jba Date: Sun, 5 Jul 2020 19:49:32 +1000 Subject: [PATCH 13/31] M125 needs to also wait_for_confirmation when using an extensible_ui --- Marlin/src/gcode/feature/pause/M125.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/gcode/feature/pause/M125.cpp b/Marlin/src/gcode/feature/pause/M125.cpp index 12b0892d5816..3b94cd36ad01 100644 --- a/Marlin/src/gcode/feature/pause/M125.cpp +++ b/Marlin/src/gcode/feature/pause/M125.cpp @@ -72,14 +72,14 @@ void GcodeSuite::M125() { #endif const bool sd_printing = TERN0(SDSUPPORT, IS_SD_PRINTING()); - TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_PARKING, PAUSE_MODE_PAUSE_PRINT)); const bool show_lcd = TERN0(HAS_LCD_MENU, parser.seenval('P')); + const bool exetnsible_ui_pause = TERN(EXTENSIBLE_UI, true, false); if (pause_print(retract, park_point, 0, show_lcd)) { TERN_(POWER_LOSS_RECOVERY, if (recovery.enabled) recovery.save(true)); - if (!sd_printing || show_lcd) { + if (!sd_printing || show_lcd || exetnsible_ui_pause) { wait_for_confirmation(false, 0); resume_print(0, 0, -retract, 0); } From 01ce53de52fe8fe405f19c770470bf8663207a6d Mon Sep 17 00:00:00 2001 From: jba Date: Sun, 5 Jul 2020 20:06:35 +1000 Subject: [PATCH 14/31] Fixed settings for m600 on filament outage --- Marlin/Configuration.h | 6 ++---- Marlin/Configuration_adv.h | 10 ++++------ 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 24ec80afc68b..4890c0be9075 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1183,10 +1183,8 @@ // Set one or more commands to execute on filament runout. // (After 'M412 H' Marlin will ask the host to handle the process.) - //#define FILAMENT_RUNOUT_SCRIPT "M600" - // just park, don't autoretract on runout - #define FILAMENT_RUNOUT_SCRIPT "M25" - + #define FILAMENT_RUNOUT_SCRIPT "M600" + // After a runout is detected, continue printing this length of filament // before executing the runout script. Useful for a sensor at the end of // a feed tube. Requires 4 bytes SRAM per sensor, plus 4 bytes overhead. diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 312e72573de0..032024efc836 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2028,11 +2028,11 @@ #define ADVANCED_PAUSE_FEATURE #if ENABLED(ADVANCED_PAUSE_FEATURE) #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. - #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + #define PAUSE_PARK_RETRACT_LENGTH 4 // (mm) Initial retract. // This short retract is done immediately, before parking the nozzle. #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. - #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 555 // (mm) The length of filament for a complete unload. // For Bowden, the full length of the tube and nozzle. // For direct drive, the full length of the nozzle. // Set to 0 for manual unloading. @@ -2041,17 +2041,15 @@ // 0 to disable start loading and skip to fast load only #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. - #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 538 // (mm) Load length of filament, from extruder gear to nozzle. // For Bowden, the full length of the tube and nozzle. // For direct drive, the full length of the nozzle. //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. - //#define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + #define ADVANCED_PAUSE_PURGE_LENGTH 2 // (mm) Length to extrude after loading. // Set to 0 for manual extrusion. // Filament can be extruded repeatedly from the Filament Change menu // until extrusion is consistent, and to purge old filament. - #define ADVANCED_PAUSE_PURGE_LENGTH 0 // (mm) AI3M use manual exrusion - #define ADVANCED_PAUSE_RESUME_PRIME 0 // (mm) Extra distance to prime nozzle after returning from park. //#define ADVANCED_PAUSE_FANS_PAUSE // Turn off print-cooling fans while the machine is paused. From fa8ce76d5792d92bab940ed41d82608749d62672 Mon Sep 17 00:00:00 2001 From: jba Date: Sun, 5 Jul 2020 20:42:18 +1000 Subject: [PATCH 15/31] finessing the pause routines. --- .../lcd/extui/lib/anycubic/anycubic_TFT.cpp | 42 +++++++++---------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp index b29097d84a33..b2304e8d908b 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp @@ -110,17 +110,6 @@ void AnycubicTFTClass::OnSetup() { void AnycubicTFTClass::OnCommandScan() { // CheckHeaterError(); - // if (mediaPrintingState == AMPRINTSTATE_PAUSED && !ExtUI::isMoving()) { - // mediaPrintingState = AMPRINTSTATE_PAUSED; - // ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: SD print paused done... J18"); - // } else - - if (mediaPrintingState == AMPRINTSTATE_STOP_REQUESTED && !ExtUI::isMoving()) { - mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; - mediaPauseState = AMPAUSESTATE_NOT_PAUSED; - ANYCUBIC_SENDCOMMAND_DBG_PGM("J16", "TFT Serial Debug: SD print stopped... J16"); - } - if(TFTbuflen<(TFTBUFSIZE-1)) { GetCommandFromTFT(); } @@ -175,21 +164,29 @@ void AnycubicTFTClass::OnUserConfirmRequired(const char * const msg) { * "Reheat finished." */ if (strcmp_P(msg, PSTR("Nozzle Parked")) == 0) { - mediaPrintingState = AMPRINTSTATE_PAUSED; - mediaPauseState = AMPAUSESTATE_PARKED; - // enable continue button - ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD print paused done... J18"); + if(mediaPrintingState == AMPRINTSTATE_STOP_REQUESTED) { + mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; + mediaPauseState = AMPAUSESTATE_NOT_PAUSED; + ExtUI::injectCommands_P(PSTR("M84\nM27")); // disable stepper motors and force report of SD status + // TODO: JBA I might need to send a J14 for printing done to make the printer leave the in printing state + } else { + mediaPrintingState = AMPRINTSTATE_PAUSED; + mediaPauseState = AMPAUSESTATE_PARKED; + // enable continue button + ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD print paused done... J18"); + } } else if (strcmp_P(msg, PSTR("Load Filament")) == 0) { mediaPrintingState = AMPRINTSTATE_PAUSED; mediaPauseState = AMPAUSESTATE_FILAMENT_OUT; // enable continue button ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: UserConfirm Filament is out... J18"); + // TODO: JBA this might not need to happen as it may have already been sent out // tell the user that the filament has run out and wait ANYCUBIC_SENDCOMMAND_DBG_PGM("J23", "TFT Serial Debug: UserConfirm Blocking filament prompt... J23"); } else if (strcmp_P(msg, PSTR("Filament Purging...")) == 0) { mediaPrintingState = AMPRINTSTATE_PAUSED; mediaPauseState = AMPAUSESTATE_PARKING; - // disable all buttons + // disable continue button ANYCUBIC_SENDCOMMAND_DBG_PGM("J05", "TFT Serial Debug: UserConfirm SD Filament Purging... J05"); // J05 printing pause } else if (strcmp_P(msg, PSTR("HeaterTimeout")) == 0) { mediaPrintingState = AMPRINTSTATE_PAUSED; @@ -506,7 +503,7 @@ void AnycubicTFTClass::OnPrintTimerStarted() { void AnycubicTFTClass::OnPrintTimerPaused() { #if ENABLED(SDSUPPORT) - if (ExtUI::isPrintingFromMedia) { + if (ExtUI::isPrintingFromMedia()) { mediaPrintingState = AMPRINTSTATE_PAUSED; mediaPauseState = AMPAUSESTATE_PARKING; } @@ -520,7 +517,6 @@ void AnycubicTFTClass::OnPrintTimerStopped() { mediaPauseState = AMPAUSESTATE_NOT_PAUSED; ANYCUBIC_SENDCOMMAND_DBG_PGM("J14", "TFT Serial Debug: SD Print Completed... J14"); } - // otherwise it was stopped by the printer so don't send print completed signal to TFT #endif } @@ -806,7 +802,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { break; case 22: // A22 move X/Y/Z or extrude - if (!ExtUI::isPrinting() && !ExtUI::isPrintingFromMediaPaused()) { + if (!ExtUI::isPrinting()) { float coorvalue; unsigned int movespeed = 0; char commandStr[30]; @@ -870,7 +866,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { break; case 23: // A23 preheat pla - if (!ExtUI::isPrinting() && !ExtUI::isPrintingFromMediaPaused()) { + if (!ExtUI::isPrinting()) { if (ExtUI::getAxisPosition_mm(ExtUI::Z) < 10) { ExtUI::injectCommands_P(PSTR("G1 Z10")); //RASE Z AXIS } @@ -883,7 +879,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { break; case 24:// A24 preheat abs - if (!ExtUI::isPrinting() && !ExtUI::isPrintingFromMediaPaused()) { + if (!ExtUI::isPrinting()) { if (ExtUI::getAxisPosition_mm(ExtUI::Z) < 10) { ExtUI::injectCommands_P(PSTR("G1 Z10")); //RASE Z AXIS } @@ -897,7 +893,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { break; case 25: // A25 cool down - if (!ExtUI::isPrinting() && !ExtUI::isPrintingFromMediaPaused()) { + if (!ExtUI::isPrinting()) { ExtUI::setTargetTemp_celsius(0, (ExtUI::heater_t) ExtUI::BED); ExtUI::setTargetTemp_celsius(0, (ExtUI::extruder_t) ExtUI::E0); @@ -1046,6 +1042,8 @@ void AnycubicTFTClass::StopPrint() { #if ENABLED(SDSUPPORT) mediaPrintingState = AMPRINTSTATE_STOP_REQUESTED; mediaPauseState = AMPAUSESTATE_NOT_PAUSED; + + ANYCUBIC_SENDCOMMAND_DBG_PGM("J16", "TFT Serial Debug: SD print stop called... J16"); ExtUI::stopPrint(); #endif // SDSUPPORT } From 2b8922330afaa69198f0f2e5d8b1b515125433b7 Mon Sep 17 00:00:00 2001 From: jba Date: Mon, 6 Jul 2020 11:39:06 +1000 Subject: [PATCH 16/31] reined the stop print process. works now --- Marlin/Configuration_adv.h | 4 +-- .../lcd/extui/lib/anycubic/anycubic_TFT.cpp | 29 ++++++++++++------- .../src/lcd/extui/lib/anycubic/anycubic_TFT.h | 1 + 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 032024efc836..f2868ba80ac0 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2028,7 +2028,7 @@ #define ADVANCED_PAUSE_FEATURE #if ENABLED(ADVANCED_PAUSE_FEATURE) #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. - #define PAUSE_PARK_RETRACT_LENGTH 4 // (mm) Initial retract. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. // This short retract is done immediately, before parking the nozzle. #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. @@ -2046,7 +2046,7 @@ // For direct drive, the full length of the nozzle. //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. - #define ADVANCED_PAUSE_PURGE_LENGTH 2 // (mm) Length to extrude after loading. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. // Set to 0 for manual extrusion. // Filament can be extruded repeatedly from the Filament Change menu // until extrusion is consistent, and to purge old filament. diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp index b2304e8d908b..004843d6fc8d 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp @@ -109,6 +109,20 @@ void AnycubicTFTClass::OnSetup() { void AnycubicTFTClass::OnCommandScan() { // CheckHeaterError(); + if(mediaPrintingState == AMPRINTSTATE_STOP_REQUESTED && !ExtUI::isMoving()) { + // give the head a chance to park before releasing the motors + if(StoppingCounter < 60000) { + StoppingCounter++; + } else { + StoppingCounter = 0; + #if ENABLED(ANYCUBIC_TFT_DEBUG) + SERIAL_ECHOLNPGM("TFT Serial Debug: Finished stopping print, releasing motors ..."); + #endif + mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; + mediaPauseState = AMPAUSESTATE_NOT_PAUSED; + ExtUI::injectCommands_P(PSTR("M84\nG4 P500\nM27")); // disable stepper motors and force report of SD status + } + } if(TFTbuflen<(TFTBUFSIZE-1)) { GetCommandFromTFT(); @@ -164,17 +178,10 @@ void AnycubicTFTClass::OnUserConfirmRequired(const char * const msg) { * "Reheat finished." */ if (strcmp_P(msg, PSTR("Nozzle Parked")) == 0) { - if(mediaPrintingState == AMPRINTSTATE_STOP_REQUESTED) { - mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; - mediaPauseState = AMPAUSESTATE_NOT_PAUSED; - ExtUI::injectCommands_P(PSTR("M84\nM27")); // disable stepper motors and force report of SD status - // TODO: JBA I might need to send a J14 for printing done to make the printer leave the in printing state - } else { - mediaPrintingState = AMPRINTSTATE_PAUSED; - mediaPauseState = AMPAUSESTATE_PARKED; - // enable continue button - ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD print paused done... J18"); - } + mediaPrintingState = AMPRINTSTATE_PAUSED; + mediaPauseState = AMPAUSESTATE_PARKED; + // enable continue button + ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD print paused done... J18"); } else if (strcmp_P(msg, PSTR("Load Filament")) == 0) { mediaPrintingState = AMPRINTSTATE_PAUSED; mediaPauseState = AMPAUSESTATE_FILAMENT_OUT; diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h index ffc581c5afe6..09b61c668ffe 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h @@ -99,6 +99,7 @@ class AnycubicTFTClass { int serial3_count = 0; char *TFTstrchr_pointer; uint16_t HeaterCheckCount = 0; + uint16_t StoppingCounter = 0; uint8_t SpecialMenu = false; AnycubicMediaPrintState mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; AnycubicMediaPauseState mediaPauseState = AMPAUSESTATE_NOT_PAUSED; From 32f62b4a21d8c9324cfbcf9819e50f8bac89d8e2 Mon Sep 17 00:00:00 2001 From: jba Date: Mon, 6 Jul 2020 21:41:26 +1000 Subject: [PATCH 17/31] Added ability to send M108 user confirmation to special menu --- Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp index 004843d6fc8d..744e22afafa7 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp @@ -333,6 +333,11 @@ void AnycubicTFTClass::HandleSpecialMenu() { ExtUI::injectCommands_P(PSTR("M500\nM300 P105 S1108\nM300 P210 S1661")); break; + case '7': // <07SendM108> + SERIAL_ECHOLNPGM("Special Menu: Send User Confirmation"); + ExtUI::injectCommands_P(PSTR("M108")); + break; + default: break; } @@ -434,6 +439,8 @@ void AnycubicTFTClass::RenderSpecialMenu(uint16_t selectedNumber) { ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); ANYCUBIC_SERIAL_PROTOCOLLNPGM("<06SvEEPROM>"); ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<07SendM108>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); break; From f2d4712217d68ebd62723d5bdba238d97089e099 Mon Sep 17 00:00:00 2001 From: jba Date: Mon, 6 Jul 2020 22:28:30 +1000 Subject: [PATCH 18/31] improve homed print head detection on stop print, and attempted to improve filament outage detection --- .../lcd/extui/lib/anycubic/anycubic_TFT.cpp | 37 ++++++++++++------- .../src/lcd/extui/lib/anycubic/anycubic_TFT.h | 2 +- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp index 744e22afafa7..f392173b9ca6 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp @@ -109,19 +109,13 @@ void AnycubicTFTClass::OnSetup() { void AnycubicTFTClass::OnCommandScan() { // CheckHeaterError(); - if(mediaPrintingState == AMPRINTSTATE_STOP_REQUESTED && !ExtUI::isMoving()) { - // give the head a chance to park before releasing the motors - if(StoppingCounter < 60000) { - StoppingCounter++; - } else { - StoppingCounter = 0; - #if ENABLED(ANYCUBIC_TFT_DEBUG) - SERIAL_ECHOLNPGM("TFT Serial Debug: Finished stopping print, releasing motors ..."); - #endif - mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; - mediaPauseState = AMPAUSESTATE_NOT_PAUSED; - ExtUI::injectCommands_P(PSTR("M84\nG4 P500\nM27")); // disable stepper motors and force report of SD status - } + if(mediaPrintingState == AMPRINTSTATE_STOP_REQUESTED && IsNozzleHomed()) { + #if ENABLED(ANYCUBIC_TFT_DEBUG) + SERIAL_ECHOLNPGM("TFT Serial Debug: Finished stopping print, releasing motors ..."); + #endif + mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; + mediaPauseState = AMPAUSESTATE_NOT_PAUSED; + ExtUI::injectCommands_P(PSTR("M84\nG4 P500\nM27")); // disable stepper motors and force report of SD status } if(TFTbuflen<(TFTBUFSIZE-1)) { @@ -218,6 +212,13 @@ bool AnycubicTFTClass::CodeSeen(char code) { return (TFTstrchr_pointer != NULL); //Return True if a character was found } +bool AnycubicTFTClass::IsNozzleHomed() { + const float xPosition = ExtUI::getAxisPosition_mm((ExtUI::axis_t) ExtUI::X); + const float yPosition = ExtUI::getAxisPosition_mm((ExtUI::axis_t) ExtUI::Y); + return WITHIN(xPosition, X_MIN_POS - 0.1, X_MIN_POS + 0.1) && + WITHIN(yPosition, Y_MIN_POS - 0.1, Y_MIN_POS + 0.1); +} + void AnycubicTFTClass::HandleSpecialMenu() { // // NOTE: that the file selection command actual lowercases the entire selected file/foldername, so charracter comparisons need to be lowercase. @@ -1017,7 +1018,7 @@ void AnycubicTFTClass::StartPrint() { void AnycubicTFTClass::PausePrint() { #if ENABLED(SDSUPPORT) - if(ExtUI::isPrintingFromMedia()) { + if(ExtUI::isPrintingFromMedia() && mediaPrintingState != AMPRINTSTATE_STOP_REQUESTED && mediaPauseState == AMPAUSESTATE_NOT_PAUSED) { mediaPrintingState = AMPRINTSTATE_PAUSE_REQUESTED; mediaPauseState = AMPAUSESTATE_NOT_PAUSED; // need the userconfirm method to update pause state ANYCUBIC_SENDCOMMAND_DBG_PGM("J05", "TFT Serial Debug: SD print pause started... J05"); // J05 printing pause @@ -1031,7 +1032,15 @@ void AnycubicTFTClass::ResumePrint() { #if ENABLED(SDSUPPORT) #if ENABLED(FILAMENT_RUNOUT_SENSOR) if (ExtUI::getFilamentRunoutState()) { + #if ENABLED(ANYCUBIC_TFT_DEBUG) + SERIAL_ECHOLNPGM("TFT Serial Debug: Resume Print with filament sensor still tripped... "); + #endif + + // trigger the user message box DoFilamentRunoutCheck(); + + // re-enable the continue button + ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: Resume Print with filament sensor still tripped... J18"); return; } #endif diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h index 09b61c668ffe..f4ee279eae0e 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h @@ -99,13 +99,13 @@ class AnycubicTFTClass { int serial3_count = 0; char *TFTstrchr_pointer; uint16_t HeaterCheckCount = 0; - uint16_t StoppingCounter = 0; uint8_t SpecialMenu = false; AnycubicMediaPrintState mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; AnycubicMediaPauseState mediaPauseState = AMPAUSESTATE_NOT_PAUSED; float CodeValue(); bool CodeSeen(char); + bool IsNozzleHomed(); void RenderCurrentFileList(); void RenderSpecialMenu(uint16_t); void RenderCurrentFolder(uint16_t); From db49c11dd2bfda39d8e78474e94141dece042d85 Mon Sep 17 00:00:00 2001 From: John BouAntoun Date: Fri, 10 Jul 2020 13:32:38 +1000 Subject: [PATCH 19/31] Max feedrate on extruder is way too low --- Marlin/Configuration.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 4890c0be9075..bf6fb03b3c47 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -762,7 +762,7 @@ * Override with M203 * X, Y, Z, E0 [, E1[, E2...]] */ -#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } +#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 60 } //#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 #if ENABLED(LIMITED_MAX_FR_EDITING) From c3797cbcb549e378b0cd262bdc61c33ff31db9a1 Mon Sep 17 00:00:00 2001 From: jba Date: Tue, 14 Jul 2020 22:27:24 +1000 Subject: [PATCH 20/31] Adjusted park feed settings. Fixed registering filament runout pin even when not printing --- Marlin/Configuration_adv.h | 4 +-- .../lcd/extui/lib/anycubic/anycubic_TFT.cpp | 31 +++++++------------ 2 files changed, 13 insertions(+), 22 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index f2868ba80ac0..eb4dc088066e 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2027,7 +2027,7 @@ */ #define ADVANCED_PAUSE_FEATURE #if ENABLED(ADVANCED_PAUSE_FEATURE) - #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_FEEDRATE 50 // (mm/s) Initial retract feedrate. #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. // This short retract is done immediately, before parking the nozzle. #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. @@ -2050,7 +2050,7 @@ // Set to 0 for manual extrusion. // Filament can be extruded repeatedly from the Filament Change menu // until extrusion is consistent, and to purge old filament. - #define ADVANCED_PAUSE_RESUME_PRIME 0 // (mm) Extra distance to prime nozzle after returning from park. + #define ADVANCED_PAUSE_RESUME_PRIME 5 // (mm) Extra distance to prime nozzle after returning from park. //#define ADVANCED_PAUSE_FANS_PAUSE // Turn off print-cooling fans while the machine is paused. // Filament Unload does a Retract, Delay, and Purge first: diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp index f392173b9ca6..c5430ad0a56e 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp @@ -85,8 +85,8 @@ void AnycubicTFTClass::OnSetup() { WRITE(SD_DETECT_PIN, HIGH); #endif #if ENABLED(FILAMENT_RUNOUT_SENSOR) - pinMode(FIL_RUNOUT_PIN,INPUT); - WRITE(FIL_RUNOUT_PIN,HIGH); + pinMode(FIL_RUNOUT_PIN, INPUT); + WRITE(FIL_RUNOUT_PIN, HIGH); #endif mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; @@ -108,7 +108,6 @@ void AnycubicTFTClass::OnSetup() { } void AnycubicTFTClass::OnCommandScan() { - // CheckHeaterError(); if(mediaPrintingState == AMPRINTSTATE_STOP_REQUESTED && IsNozzleHomed()) { #if ENABLED(ANYCUBIC_TFT_DEBUG) SERIAL_ECHOLNPGM("TFT Serial Debug: Finished stopping print, releasing motors ..."); @@ -117,7 +116,7 @@ void AnycubicTFTClass::OnCommandScan() { mediaPauseState = AMPAUSESTATE_NOT_PAUSED; ExtUI::injectCommands_P(PSTR("M84\nG4 P500\nM27")); // disable stepper motors and force report of SD status } - + if(TFTbuflen<(TFTBUFSIZE-1)) { GetCommandFromTFT(); } @@ -494,20 +493,6 @@ void AnycubicTFTClass::RenderCurrentFolder(uint16_t selectedNumber) { } } -// void AnycubicTFTClass::CheckHeaterError() { -// if ((ExtUI::getActualTemp_celsius((ExtUI::extruder_t) ExtUI::E0) < 5) || (ExtUI::getActualTemp_celsius((ExtUI::extruder_t) ExtUI::E0) > 290)) { -// if (HeaterCheckCount > 60000) { -// HeaterCheckCount = 0; -// ANYCUBIC_SENDCOMMAND_DBG_PGM("J10", "TFT Serial Debug: Hotend temperature abnormal... J10"); // J10 Hotend temperature abnormal -// } -// else { -// HeaterCheckCount++; -// } -// } else { -// HeaterCheckCount = 0; -// } -// } - void AnycubicTFTClass::OnPrintTimerStarted() { #if ENABLED(SDSUPPORT) if (mediaPrintingState == AMPRINTSTATE_PRINTING) { @@ -986,7 +971,10 @@ void AnycubicTFTClass::DoSDCardStateCheck() { void AnycubicTFTClass::DoFilamentRunoutCheck() { #if ENABLED(FILAMENT_RUNOUT_SENSOR) - if (ExtUI::getFilamentRunoutState()) { + + // NOTE: ExtUI::getFilamentRunoutState() only returns the runout state if the job is printing + // we want to actually check the status of the pin here, regardless of printstate + if (READ(FIL_RUNOUT_PIN)) { if (mediaPrintingState == AMPRINTSTATE_PRINTING || mediaPrintingState == AMPRINTSTATE_PAUSED || mediaPrintingState == AMPRINTSTATE_PAUSE_REQUESTED) { // play tone to indicate filament is out ExtUI::injectCommands_P(PSTR("\nM300 P200 S1567\nM300 P200 S1174\nM300 P200 S1567\nM300 P200 S1174\nM300 P2000 S1567")); @@ -1031,7 +1019,7 @@ void AnycubicTFTClass::PausePrint() { void AnycubicTFTClass::ResumePrint() { #if ENABLED(SDSUPPORT) #if ENABLED(FILAMENT_RUNOUT_SENSOR) - if (ExtUI::getFilamentRunoutState()) { + if (READ(FIL_RUNOUT_PIN)) { #if ENABLED(ANYCUBIC_TFT_DEBUG) SERIAL_ECHOLNPGM("TFT Serial Debug: Resume Print with filament sensor still tripped... "); #endif @@ -1066,6 +1054,9 @@ void AnycubicTFTClass::StopPrint() { mediaPrintingState = AMPRINTSTATE_STOP_REQUESTED; mediaPauseState = AMPAUSESTATE_NOT_PAUSED; + // retract the nozzle a little + ExtUI::injectCommands_P(PSTR("G91\nG1 E-1 F1800\nG90")); + ANYCUBIC_SENDCOMMAND_DBG_PGM("J16", "TFT Serial Debug: SD print stop called... J16"); ExtUI::stopPrint(); #endif // SDSUPPORT From 766d150d7ae9d9be0f60a514eafaffa58a6f2e87 Mon Sep 17 00:00:00 2001 From: jba Date: Tue, 14 Jul 2020 23:42:50 +1000 Subject: [PATCH 21/31] final tweaks to get pause and stop from sd printing resolved (as well as m600) --- Marlin/Configuration_adv.h | 2 +- .../lcd/extui/lib/anycubic/anycubic_TFT.cpp | 35 +++++++++++++------ .../src/lcd/extui/lib/anycubic/anycubic_TFT.h | 1 + 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index eb4dc088066e..536bb6794a65 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2046,7 +2046,7 @@ // For direct drive, the full length of the nozzle. //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. - #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + #define ADVANCED_PAUSE_PURGE_LENGTH 60 // (mm) Length to extrude after loading. // Set to 0 for manual extrusion. // Filament can be extruded repeatedly from the Filament Change menu // until extrusion is consistent, and to purge old filament. diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp index c5430ad0a56e..2d42630b9d34 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp @@ -108,13 +108,19 @@ void AnycubicTFTClass::OnSetup() { } void AnycubicTFTClass::OnCommandScan() { - if(mediaPrintingState == AMPRINTSTATE_STOP_REQUESTED && IsNozzleHomed()) { - #if ENABLED(ANYCUBIC_TFT_DEBUG) - SERIAL_ECHOLNPGM("TFT Serial Debug: Finished stopping print, releasing motors ..."); - #endif - mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; - mediaPauseState = AMPAUSESTATE_NOT_PAUSED; - ExtUI::injectCommands_P(PSTR("M84\nG4 P500\nM27")); // disable stepper motors and force report of SD status + millis_t currentTicks = millis (); + if(currentTicks - clockTicks > 1000) { + clockTicks = currentTicks; + if(mediaPrintingState == AMPRINTSTATE_STOP_REQUESTED && IsNozzleHomed()) { + #if ENABLED(ANYCUBIC_TFT_DEBUG) + SERIAL_ECHOLNPGM("TFT Serial Debug: Finished stopping print, releasing motors ..."); + #endif + mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; + mediaPauseState = AMPAUSESTATE_NOT_PAUSED; + ExtUI::injectCommands_P(PSTR("M84\nM27")); // disable stepper motors and force report of SD status + // tell printer to releas resources of print to indicate it is done + ANYCUBIC_SENDCOMMAND_DBG_PGM("J14", "TFT Serial Debug: SD Print Stopped... J14"); + } } if(TFTbuflen<(TFTBUFSIZE-1)) { @@ -187,7 +193,11 @@ void AnycubicTFTClass::OnUserConfirmRequired(const char * const msg) { mediaPrintingState = AMPRINTSTATE_PAUSED; mediaPauseState = AMPAUSESTATE_PARKING; // disable continue button - ANYCUBIC_SENDCOMMAND_DBG_PGM("J05", "TFT Serial Debug: UserConfirm SD Filament Purging... J05"); // J05 printing pause + // TODO: JBA i think this is throwing a rogue delayed pause into the mix so don't do this + //ANYCUBIC_SENDCOMMAND_DBG_PGM("J05", "TFT Serial Debug: UserConfirm SD Filament Purging... J05"); // J05 printing pause + + // enable continue button + ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: UserConfirm Filament is purging... J18"); } else if (strcmp_P(msg, PSTR("HeaterTimeout")) == 0) { mediaPrintingState = AMPRINTSTATE_PAUSED; mediaPauseState = AMPAUSESTATE_HEATER_TIMEOUT; @@ -1011,6 +1021,8 @@ void AnycubicTFTClass::PausePrint() { mediaPauseState = AMPAUSESTATE_NOT_PAUSED; // need the userconfirm method to update pause state ANYCUBIC_SENDCOMMAND_DBG_PGM("J05", "TFT Serial Debug: SD print pause started... J05"); // J05 printing pause + // for some reason pausing the print doesn't retract the extruder so force a manual one here + ExtUI::injectCommands_P(PSTR("G91\nG1 E-2 F1800\nG90")); ExtUI::pausePrint(); } #endif // SDSUPPORT @@ -1054,10 +1066,11 @@ void AnycubicTFTClass::StopPrint() { mediaPrintingState = AMPRINTSTATE_STOP_REQUESTED; mediaPauseState = AMPAUSESTATE_NOT_PAUSED; - // retract the nozzle a little - ExtUI::injectCommands_P(PSTR("G91\nG1 E-1 F1800\nG90")); - ANYCUBIC_SENDCOMMAND_DBG_PGM("J16", "TFT Serial Debug: SD print stop called... J16"); + + // for some reason pausing the print doesn't retract the extruder so force a manual one here + ExtUI::injectCommands_P(PSTR("G91\nG1 E-2 F1800\nG90")); + ExtUI::stopPrint(); #endif // SDSUPPORT } diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h index f4ee279eae0e..449f76d2275c 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h @@ -102,6 +102,7 @@ class AnycubicTFTClass { uint8_t SpecialMenu = false; AnycubicMediaPrintState mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; AnycubicMediaPauseState mediaPauseState = AMPAUSESTATE_NOT_PAUSED; + millis_t clockTicks = millis(); // used to slow the stopped print check down to reasonable times float CodeValue(); bool CodeSeen(char); From b069a22bcaff80fabe1796b99f99b066db30853a Mon Sep 17 00:00:00 2001 From: jba Date: Tue, 14 Jul 2020 23:53:50 +1000 Subject: [PATCH 22/31] slight delay before sending compete message --- Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp index 2d42630b9d34..8e236ec6c639 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp @@ -118,6 +118,7 @@ void AnycubicTFTClass::OnCommandScan() { mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; mediaPauseState = AMPAUSESTATE_NOT_PAUSED; ExtUI::injectCommands_P(PSTR("M84\nM27")); // disable stepper motors and force report of SD status + ExtUI::delay_ms(200); // tell printer to releas resources of print to indicate it is done ANYCUBIC_SENDCOMMAND_DBG_PGM("J14", "TFT Serial Debug: SD Print Stopped... J14"); } From 3d72959bd01f54d0f50c07ed0abbcb48254320b8 Mon Sep 17 00:00:00 2001 From: jba Date: Tue, 14 Jul 2020 23:57:46 +1000 Subject: [PATCH 23/31] reduce the prime amount --- Marlin/Configuration_adv.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 536bb6794a65..4035dc512d27 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2050,7 +2050,7 @@ // Set to 0 for manual extrusion. // Filament can be extruded repeatedly from the Filament Change menu // until extrusion is consistent, and to purge old filament. - #define ADVANCED_PAUSE_RESUME_PRIME 5 // (mm) Extra distance to prime nozzle after returning from park. + #define ADVANCED_PAUSE_RESUME_PRIME 2 // (mm) Extra distance to prime nozzle after returning from park. //#define ADVANCED_PAUSE_FANS_PAUSE // Turn off print-cooling fans while the machine is paused. // Filament Unload does a Retract, Delay, and Purge first: From 9423369ff954e6ee0aad84d8d6e2f5f529105226 Mon Sep 17 00:00:00 2001 From: John BouAntoun Date: Wed, 15 Jul 2020 09:03:57 +1000 Subject: [PATCH 24/31] remove rogue m25 and some vertical whitespace fixes --- .../lcd/extui/lib/anycubic/anycubic_TFT.cpp | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp index 8e236ec6c639..2339c22379b1 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp @@ -74,7 +74,6 @@ AnycubicTFTClass::AnycubicTFTClass() { } void AnycubicTFTClass::OnSetup() { - AnycubicSerial.begin(115200); ANYCUBIC_SENDCOMMAND_DBG_PGM("J17", "TFT Serial Debug: Main board reset... J17"); // J17 Main board reset ExtUI::delay_ms(10); @@ -141,7 +140,7 @@ void AnycubicTFTClass::OnKillTFT() void AnycubicTFTClass::OnSDCardStateChange(bool isInserted) { #if ENABLED(ANYCUBIC_TFT_DEBUG) - SERIAL_ECHOPGM(" DEBUG: OnSDCardStateChange event triggered "); + SERIAL_ECHOPGM("TFT Serial Debug: OnSDCardStateChange event triggered..."); SERIAL_ECHO(itostr2(isInserted)); SERIAL_EOL(); #endif @@ -149,6 +148,9 @@ void AnycubicTFTClass::OnSDCardStateChange(bool isInserted) { } void AnycubicTFTClass::OnSDCardError() { + #if ENABLED(ANYCUBIC_TFT_DEBUG) + SERIAL_ECHOLNPGM("TFT Serial Debug: OnSDCardError event triggered..."); + #endif ANYCUBIC_SENDCOMMAND_DBG_PGM("J21", "TFT Serial Debug: On SD Card Error ... J21"); } @@ -156,7 +158,6 @@ void AnycubicTFTClass::OnFilamentRunout() { #if ENABLED(ANYCUBIC_TFT_DEBUG) SERIAL_ECHOLNPGM("TFT Serial Debug: FilamentRunout triggered..."); #endif - DoFilamentRunoutCheck(); } @@ -193,8 +194,8 @@ void AnycubicTFTClass::OnUserConfirmRequired(const char * const msg) { } else if (strcmp_P(msg, PSTR("Filament Purging...")) == 0) { mediaPrintingState = AMPRINTSTATE_PAUSED; mediaPauseState = AMPAUSESTATE_PARKING; + // TODO: JBA I don't think J05 just disables the continue button, i think it injects a rogue M25. So taking this out // disable continue button - // TODO: JBA i think this is throwing a rogue delayed pause into the mix so don't do this //ANYCUBIC_SENDCOMMAND_DBG_PGM("J05", "TFT Serial Debug: UserConfirm SD Filament Purging... J05"); // J05 printing pause // enable continue button @@ -897,7 +898,6 @@ void AnycubicTFTClass::GetCommandFromTFT() { ExtUI::setTargetTemp_celsius(PREHEAT_2_TEMP_BED, (ExtUI::heater_t) ExtUI::BED); ExtUI::setTargetTemp_celsius(PREHEAT_2_TEMP_HOTEND, (ExtUI::extruder_t) ExtUI::E0); - ANYCUBIC_SERIAL_SUCC_START; ANYCUBIC_SERIAL_ENTER(); } @@ -982,7 +982,6 @@ void AnycubicTFTClass::DoSDCardStateCheck() { void AnycubicTFTClass::DoFilamentRunoutCheck() { #if ENABLED(FILAMENT_RUNOUT_SENSOR) - // NOTE: ExtUI::getFilamentRunoutState() only returns the runout state if the job is printing // we want to actually check the status of the pin here, regardless of printstate if (READ(FIL_RUNOUT_PIN)) { @@ -1048,8 +1047,10 @@ void AnycubicTFTClass::ResumePrint() { if(mediaPauseState == AMPAUSESTATE_HEATER_TIMEOUT) { mediaPauseState = AMPAUSESTATE_REHEATING; - // disable the continue button - ANYCUBIC_SENDCOMMAND_DBG_PGM("J05", "TFT Serial Debug: Resume called with heater timeout... J05"); // J05 printing pause + // TODO: JBA I don't think J05 just disables the continue button, i think it injects a rogue M25. So taking this out + // // disable the continue button + // ANYCUBIC_SENDCOMMAND_DBG_PGM("J05", "TFT Serial Debug: Resume called with heater timeout... J05"); // J05 printing pause + // reheat the nozzle ExtUI::setUserConfirmed(); } else { @@ -1066,12 +1067,10 @@ void AnycubicTFTClass::StopPrint() { #if ENABLED(SDSUPPORT) mediaPrintingState = AMPRINTSTATE_STOP_REQUESTED; mediaPauseState = AMPAUSESTATE_NOT_PAUSED; - ANYCUBIC_SENDCOMMAND_DBG_PGM("J16", "TFT Serial Debug: SD print stop called... J16"); - // for some reason pausing the print doesn't retract the extruder so force a manual one here - ExtUI::injectCommands_P(PSTR("G91\nG1 E-2 F1800\nG90")); - + // for some reason stopping the print doesn't retract the extruder so force a manual one here + ExtUI::injectCommands_P(PSTR("G91\nG1 E-2 F1800\nG90")); ExtUI::stopPrint(); #endif // SDSUPPORT } From 9058cc1b4759cd3704a7a6331353ab7cdb5939f6 Mon Sep 17 00:00:00 2001 From: John BouAntoun Date: Wed, 15 Jul 2020 10:31:21 +1000 Subject: [PATCH 25/31] coding standards clean up (mostly whitespace) --- .../lcd/extui/lib/anycubic/anycubic_TFT.cpp | 80 +++++++++---------- .../src/lcd/extui/lib/anycubic/anycubic_TFT.h | 19 +---- 2 files changed, 40 insertions(+), 59 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp index 2339c22379b1..b73b65ccf754 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp @@ -31,8 +31,7 @@ char _conv[8]; -char *itostr2(const uint8_t &x) -{ +char *itostr2(const uint8_t &x) { //sprintf(conv,"%5.1f",x); int xx=x; _conv[0]=(xx/10)%10+'0'; @@ -47,7 +46,6 @@ char *itostr2(const uint8_t &x) #define RJDIGIT(n, f) ((n) >= (f) ? DIGIMOD(n, f) : ' ') #define MINUSOR(n, alt) (n >= 0 ? (alt) : (n = -n, '-')) - char* itostr3(const int x) { int xx = x; _conv[4] = MINUSOR(xx, RJDIGIT(xx, 100)); @@ -70,8 +68,7 @@ char *itostr2(const uint8_t &x) #endif -AnycubicTFTClass::AnycubicTFTClass() { -} +AnycubicTFTClass::AnycubicTFTClass() {} void AnycubicTFTClass::OnSetup() { AnycubicSerial.begin(115200); @@ -107,10 +104,11 @@ void AnycubicTFTClass::OnSetup() { } void AnycubicTFTClass::OnCommandScan() { - millis_t currentTicks = millis (); - if(currentTicks - clockTicks > 1000) { - clockTicks = currentTicks; - if(mediaPrintingState == AMPRINTSTATE_STOP_REQUESTED && IsNozzleHomed()) { + static millis_t nextStopCheck = 0; // used to slow the stopped print check down to reasonable times + const millis_t ms = millis(); + if (ELAPSED(ms, nextStopCheck)) { + nextStopCheck = ms + 1000UL; + if (mediaPrintingState == AMPRINTSTATE_STOP_REQUESTED && IsNozzleHomed()) { #if ENABLED(ANYCUBIC_TFT_DEBUG) SERIAL_ECHOLNPGM("TFT Serial Debug: Finished stopping print, releasing motors ..."); #endif @@ -118,16 +116,16 @@ void AnycubicTFTClass::OnCommandScan() { mediaPauseState = AMPAUSESTATE_NOT_PAUSED; ExtUI::injectCommands_P(PSTR("M84\nM27")); // disable stepper motors and force report of SD status ExtUI::delay_ms(200); - // tell printer to releas resources of print to indicate it is done + // tell printer to release resources of print to indicate it is done ANYCUBIC_SENDCOMMAND_DBG_PGM("J14", "TFT Serial Debug: SD Print Stopped... J14"); } } - if(TFTbuflen<(TFTBUFSIZE-1)) { + if (TFTbuflen<(TFTBUFSIZE-1)) { GetCommandFromTFT(); } - if(TFTbuflen) { + if (TFTbuflen) { TFTbuflen = (TFTbuflen-1); TFTbufindr = (TFTbufindr + 1)%TFTBUFSIZE; } @@ -168,8 +166,6 @@ void AnycubicTFTClass::OnUserConfirmRequired(const char * const msg) { #endif #if ENABLED(SDSUPPORT) - // - // The only way to handle these states is strcmp_P with the msg unfortunately /** * Need to handle the process of following states * "Nozzle Parked" @@ -177,6 +173,8 @@ void AnycubicTFTClass::OnUserConfirmRequired(const char * const msg) { * "Filament Purging..." * "HeaterTimeout" * "Reheat finished." + * + * NOTE: The only way to handle these states is strcmp_P with the msg unfortunately (very expensive) */ if (strcmp_P(msg, PSTR("Nozzle Parked")) == 0) { mediaPrintingState = AMPRINTSTATE_PAUSED; @@ -188,8 +186,6 @@ void AnycubicTFTClass::OnUserConfirmRequired(const char * const msg) { mediaPauseState = AMPAUSESTATE_FILAMENT_OUT; // enable continue button ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: UserConfirm Filament is out... J18"); - // TODO: JBA this might not need to happen as it may have already been sent out - // tell the user that the filament has run out and wait ANYCUBIC_SENDCOMMAND_DBG_PGM("J23", "TFT Serial Debug: UserConfirm Blocking filament prompt... J23"); } else if (strcmp_P(msg, PSTR("Filament Purging...")) == 0) { mediaPrintingState = AMPRINTSTATE_PAUSED; @@ -231,9 +227,9 @@ bool AnycubicTFTClass::IsNozzleHomed() { } void AnycubicTFTClass::HandleSpecialMenu() { - // - // NOTE: that the file selection command actual lowercases the entire selected file/foldername, so charracter comparisons need to be lowercase. - // + /** + * NOTE: that the file selection command actual lowercases the entire selected file/foldername, so charracter comparisons need to be lowercase. + */ if (SelectedDirectory[0] == '<' ) { switch (SelectedDirectory[1]) { case 'e': // "" @@ -361,7 +357,7 @@ void AnycubicTFTClass::HandleSpecialMenu() { } #if ENABLED(ANYCUBIC_TFT_DEBUG) } else { - SERIAL_ECHOPGM ("TFT Serial Debug: Attempted to HandleSpecialMenu on non-special menu... "); + SERIAL_ECHOPGM("TFT Serial Debug: Attempted to HandleSpecialMenu on non-special menu... "); SERIAL_ECHOLN(SelectedDirectory); #endif } @@ -376,14 +372,14 @@ void AnycubicTFTClass::RenderCurrentFileList() { ANYCUBIC_SERIAL_PROTOCOLPGM("FN "); // Filelist start ANYCUBIC_SERIAL_ENTER(); - if(!ExtUI::isMediaInserted() && !SpecialMenu) { + if (!ExtUI::isMediaInserted() && !SpecialMenu) { ANYCUBIC_SENDCOMMAND_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to render Current File List... J02"); ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); } else { - if(CodeSeen('S')) { + if (CodeSeen('S')) { selectedNumber = CodeValue(); } @@ -478,7 +474,7 @@ void AnycubicTFTClass::RenderCurrentFolder(uint16_t selectedNumber) { for (cnt = selectedNumber; cnt <= max_files; cnt++) { if (cnt == 0) { // Special Entry - if(currentFileList.isAtRootDir()) { + if (currentFileList.isAtRootDir()) { ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); } else { @@ -535,20 +531,20 @@ void AnycubicTFTClass::OnPrintTimerStopped() { void AnycubicTFTClass::GetCommandFromTFT() { char *starpos = NULL; - while( AnycubicSerial.available() > 0 && TFTbuflen < TFTBUFSIZE) { + while (AnycubicSerial.available() > 0 && TFTbuflen < TFTBUFSIZE) { serial3_char = AnycubicSerial.read(); if (serial3_char == '\n' || serial3_char == '\r' || serial3_char == ':' || serial3_count >= (TFT_MAX_CMD_SIZE - 1) ) { - if(!serial3_count) { //if empty line + if (!serial3_count) { //if empty line return; } TFTcmdbuffer[TFTbufindw][serial3_count] = 0; //terminate string - if((strchr(TFTcmdbuffer[TFTbufindw], 'A') != NULL)) { + if ((strchr(TFTcmdbuffer[TFTbufindw], 'A') != NULL)) { int16_t a_command; TFTstrchr_pointer = strchr(TFTcmdbuffer[TFTbufindw], 'A'); a_command=((int)((strtod(&TFTcmdbuffer[TFTbufindw][TFTstrchr_pointer - TFTcmdbuffer[TFTbufindw] + 1], NULL)))); @@ -664,7 +660,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { case 9: // A9 pause sd print #if ENABLED(SDSUPPORT) - if(ExtUI::isPrintingFromMedia()) { + if (ExtUI::isPrintingFromMedia()) { PausePrint(); } #endif @@ -706,7 +702,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { } else { SelectedDirectory[0]=0; - if(starpos!=NULL) { + if (starpos!=NULL) { *(starpos-1)='\0'; } @@ -719,7 +715,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { case 14: // A14 START PRINTING #if ENABLED(SDSUPPORT) - if(!ExtUI::isPrinting() && strlen(SelectedFile) > 0) { + if (!ExtUI::isPrinting() && strlen(SelectedFile) > 0) { StartPrint(); } #endif @@ -749,7 +745,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { case 17:// A17 set heated bed temp { unsigned int tempbed; - if(CodeSeen('S')) { + if (CodeSeen('S')) { tempbed = constrain(CodeValue(), 0, 100); ExtUI::setTargetTemp_celsius(tempbed, (ExtUI::heater_t)ExtUI::BED); } @@ -773,7 +769,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { break; case 19: // A19 stop stepper drivers - sent on stop extrude command and on turn motors off command - if(!ExtUI::isPrinting()) { + if (!ExtUI::isPrinting()) { quickstop_stepper(); disable_all_steppers(); } @@ -785,7 +781,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { { int16_t feedrate_percentage = 100; - if(CodeSeen('S')) { + if (CodeSeen('S')) { feedrate_percentage=constrain(CodeValue(),40,999); } else { @@ -797,13 +793,13 @@ void AnycubicTFTClass::GetCommandFromTFT() { case 21: // A21 all home if (!ExtUI::isPrinting() && !ExtUI::isPrintingFromMediaPaused()) { if (CodeSeen('X') || CodeSeen('Y') || CodeSeen('Z')) { - if(CodeSeen('X')) { + if (CodeSeen('X')) { ExtUI::injectCommands_P(PSTR("G28 X")); } - if(CodeSeen('Y')) { + if (CodeSeen('Y')) { ExtUI::injectCommands_P(PSTR("G28 Y")); } - if(CodeSeen('Z')) { + if (CodeSeen('Z')) { ExtUI::injectCommands_P(PSTR("G28 Z")); } } @@ -865,7 +861,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { } } - if(strlen(commandStr) > 0) { + if (strlen(commandStr) > 0) { sprintf_P(fullCommandStr, PSTR("G91\n%s\nG90"), commandStr); #if ENABLED(ANYCUBIC_TFT_DEBUG) SERIAL_ECHOPGM("TFT Serial Debug: A22 Move final request with gcode... "); @@ -914,7 +910,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { case 26: // A26 refresh SD #if ENABLED(SDSUPPORT) - if(ExtUI::isMediaInserted()) { + if (ExtUI::isMediaInserted()) { if (strlen(SelectedDirectory) > 0) { ExtUI::FileList currentFileList; if ((SelectedDirectory[0] == '.') && (SelectedDirectory[1] == '.')) { @@ -941,9 +937,9 @@ void AnycubicTFTClass::GetCommandFromTFT() { #endif case 28: // A28 filament test - if(CodeSeen('O')) { + if (CodeSeen('O')) { NOOP; - } else if(CodeSeen('C')) { + } else if (CodeSeen('C')) { NOOP; } ANYCUBIC_SERIAL_ENTER(); @@ -1000,7 +996,7 @@ void AnycubicTFTClass::DoFilamentRunoutCheck() { void AnycubicTFTClass::StartPrint() { #if ENABLED(SDSUPPORT) - if(!ExtUI::isPrinting() && strlen(SelectedFile) > 0) { + if (!ExtUI::isPrinting() && strlen(SelectedFile) > 0) { #if ENABLED(ANYCUBIC_TFT_DEBUG) SERIAL_ECHOPGM("TFT Serial Debug: About to print file ... "); SERIAL_ECHO(ExtUI::isPrinting()); @@ -1016,7 +1012,7 @@ void AnycubicTFTClass::StartPrint() { void AnycubicTFTClass::PausePrint() { #if ENABLED(SDSUPPORT) - if(ExtUI::isPrintingFromMedia() && mediaPrintingState != AMPRINTSTATE_STOP_REQUESTED && mediaPauseState == AMPAUSESTATE_NOT_PAUSED) { + if (ExtUI::isPrintingFromMedia() && mediaPrintingState != AMPRINTSTATE_STOP_REQUESTED && mediaPauseState == AMPAUSESTATE_NOT_PAUSED) { mediaPrintingState = AMPRINTSTATE_PAUSE_REQUESTED; mediaPauseState = AMPAUSESTATE_NOT_PAUSED; // need the userconfirm method to update pause state ANYCUBIC_SENDCOMMAND_DBG_PGM("J05", "TFT Serial Debug: SD print pause started... J05"); // J05 printing pause @@ -1045,7 +1041,7 @@ void AnycubicTFTClass::ResumePrint() { } #endif - if(mediaPauseState == AMPAUSESTATE_HEATER_TIMEOUT) { + if (mediaPauseState == AMPAUSESTATE_HEATER_TIMEOUT) { mediaPauseState = AMPAUSESTATE_REHEATING; // TODO: JBA I don't think J05 just disables the continue button, i think it injects a rogue M25. So taking this out // // disable the continue button diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h index 449f76d2275c..4690d6f03266 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h @@ -46,16 +46,6 @@ char *itostr2(const uint8_t &x); #define TFTBUFSIZE 4 #define TFT_MAX_CMD_SIZE 96 -// TODO: JBA don't think these are needed -/* -#define ANYCUBIC_TFT_STATE_IDLE 0 -#define ANYCUBIC_TFT_STATE_SDPRINT 1 -#define ANYCUBIC_TFT_STATE_SDPAUSE 2 -#define ANYCUBIC_TFT_STATE_SDPAUSE_REQ 3 -#define ANYCUBIC_TFT_STATE_SDPAUSE_OOF 4 -#define ANYCUBIC_TFT_STATE_SDSTOP_REQ 5 -#define ANYCUBIC_TFT_STATE_SDOUTAGE 99 -*/ enum AnycubicMediaPrintState { AMPRINTSTATE_NOT_PRINTING, AMPRINTSTATE_PRINTING, @@ -88,7 +78,6 @@ class AnycubicTFTClass { void OnPrintTimerStarted(); void OnPrintTimerPaused(); void OnPrintTimerStopped(); - private: char TFTcmdbuffer[TFTBUFSIZE][TFT_MAX_CMD_SIZE]; @@ -98,11 +87,9 @@ class AnycubicTFTClass { char serial3_char; int serial3_count = 0; char *TFTstrchr_pointer; - uint16_t HeaterCheckCount = 0; uint8_t SpecialMenu = false; AnycubicMediaPrintState mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; AnycubicMediaPauseState mediaPauseState = AMPAUSESTATE_NOT_PAUSED; - millis_t clockTicks = millis(); // used to slow the stopped print check down to reasonable times float CodeValue(); bool CodeSeen(char); @@ -112,7 +99,6 @@ class AnycubicTFTClass { void RenderCurrentFolder(uint16_t); void GetCommandFromTFT(); void CheckSDCardChange(); - // void CheckHeaterError(); void CheckPauseState(); void CheckPrintCompletion(); void HandleSpecialMenu(); @@ -123,9 +109,8 @@ class AnycubicTFTClass { void ResumePrint(); void StopPrint(); - char SelectedDirectory[30]; - char SelectedFile[FILENAME_LENGTH]; - + char SelectedDirectory[30]; + char SelectedFile[FILENAME_LENGTH]; }; extern AnycubicTFTClass AnycubicTFT; From 220f50c3850d27ebd814e2c065d35e38e4795fef Mon Sep 17 00:00:00 2001 From: John BouAntoun Date: Wed, 15 Jul 2020 10:36:42 +1000 Subject: [PATCH 26/31] non functional code clean up --- Marlin/src/lcd/extui_anycubic_tft.cpp | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/Marlin/src/lcd/extui_anycubic_tft.cpp b/Marlin/src/lcd/extui_anycubic_tft.cpp index b5bccb8970de..470cd37f6368 100644 --- a/Marlin/src/lcd/extui_anycubic_tft.cpp +++ b/Marlin/src/lcd/extui_anycubic_tft.cpp @@ -26,19 +26,10 @@ #include "extui/lib/anycubic/anycubic_TFT.h" #include "extui/ui_api.h" -#include +#include // for the ::tone() call namespace ExtUI { void onStartup() { - /* Initialize the display module here. The following - * routines are available for access to the GPIO pins: - * - * SET_OUTPUT(pin) - * SET_INPUT_PULLUP(pin) - * SET_INPUT(pin) - * WRITE(pin,value) - * READ(pin) - */ AnycubicTFT.OnSetup(); } @@ -137,6 +128,6 @@ namespace ExtUI { #endif } -#endif // EXTUI_EXAMPLE && EXTENSIBLE_UI +#endif // EANYCUBIC_TFT_MODEL && EXTENSIBLE_UI From 5a4233cd4de8cbaec8be3697ab9fcc6fbe35119a Mon Sep 17 00:00:00 2001 From: John BouAntoun Date: Wed, 15 Jul 2020 10:50:15 +1000 Subject: [PATCH 27/31] correct a debug preprocessor --- Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h index 4690d6f03266..826db0528bd5 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h @@ -32,7 +32,7 @@ #if ENABLED(ANYCUBIC_TFT_DEBUG) #define ANYCUBIC_SENDCOMMAND_DBG_PGM(x,y) (ANYCUBIC_SERIAL_PROTOCOLLNPGM(x), SERIAL_ECHOLNPGM(y)) #define ANYCUBIC_SENDCOMMAND_DBG_PGM_VAL(x,y,z) (ANYCUBIC_SERIAL_PROTOCOLLNPGM(x), SERIAL_ECHOPGM(y), SERIAL_ECHOLN(z)) -#elif +#else #define ANYCUBIC_SENDCOMMAND_DBG_PGM(x,y) (ANYCUBIC_SERIAL_PROTOCOLLNPGM(x)) #define ANYCUBIC_SENDCOMMAND_DBG_PGM_VAL(x,y,z) (ANYCUBIC_SERIAL_PROTOCOLLNPGM(x)) #endif From a05be5d3952ce0e6fd5cb90e43a0960ecb9acd21 Mon Sep 17 00:00:00 2001 From: John BouAntoun Date: Wed, 15 Jul 2020 11:32:49 +1000 Subject: [PATCH 28/31] roll back config file changes to defaults --- Marlin/Configuration.h | 171 +++++++++++++++---------------------- Marlin/Configuration_adv.h | 53 ++++++------ 2 files changed, 99 insertions(+), 125 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index bf6fb03b3c47..6daedf815641 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -128,11 +128,11 @@ // Choose the name from boards.h that matches your setup #ifndef MOTHERBOARD - #define MOTHERBOARD BOARD_TRIGORILLA_14 + #define MOTHERBOARD BOARD_RAMPS_14_EFB #endif // Name displayed in the LCD "Ready" message and Info menu -#define CUSTOM_MACHINE_NAME "Anycubic i3" +//#define CUSTOM_MACHINE_NAME "3D Printer" // Printer's unique ID, used by some programs to differentiate between machines. // Choose your own or use a service like http://www.uuidgenerator.net/version4 @@ -416,7 +416,7 @@ * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. */ -#define TEMP_SENSOR_0 5 +#define TEMP_SENSOR_0 1 #define TEMP_SENSOR_1 0 #define TEMP_SENSOR_2 0 #define TEMP_SENSOR_3 0 @@ -424,7 +424,7 @@ #define TEMP_SENSOR_5 0 #define TEMP_SENSOR_6 0 #define TEMP_SENSOR_7 0 -#define TEMP_SENSOR_BED 1 +#define TEMP_SENSOR_BED 0 #define TEMP_SENSOR_PROBE 0 #define TEMP_SENSOR_CHAMBER 0 @@ -489,15 +489,10 @@ // If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it - // i3 Mega stock v5 hotend, 40W heater cartridge (3.6Ω @ 22°C) - #define DEFAULT_Kp 15.94 - #define DEFAULT_Ki 1.17 - #define DEFAULT_Kd 54.19 - // Ultimaker - //#define DEFAULT_Kp 22.2 - //#define DEFAULT_Ki 1.08 - //#define DEFAULT_Kd 114 + #define DEFAULT_Kp 22.2 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114 // MakerGear //#define DEFAULT_Kp 7.0 @@ -528,7 +523,7 @@ * heater. If your configuration is significantly different than this and you don't understand * the issues involved, don't use bed PID until someone else verifies that your hardware works. */ -#define PIDTEMPBED +//#define PIDTEMPBED //#define BED_LIMIT_SWITCHING @@ -544,16 +539,11 @@ //#define MIN_BED_POWER 0 //#define PID_BED_DEBUG // Sends debug data to the serial port. - //Anycubic i3 Mega Ultrabase (0.9Ω @ 22°C) - #define DEFAULT_bedKp 251.78 - #define DEFAULT_bedKi 49.57 - #define DEFAULT_bedKd 319.73 - //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) //from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) - //#define DEFAULT_bedKp 10.00 - //#define DEFAULT_bedKi .023 - //#define DEFAULT_bedKd 305.4 + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 //120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) //from pidautotune @@ -589,7 +579,7 @@ * Note: For Bowden Extruders make this large enough to allow load/unload. */ #define PREVENT_LENGTHY_EXTRUDE -#define EXTRUDE_MAXLENGTH 600 +#define EXTRUDE_MAXLENGTH 200 //=========================================================================== //======================== Thermal Runaway Protection ======================= @@ -639,7 +629,7 @@ #define USE_XMIN_PLUG #define USE_YMIN_PLUG #define USE_ZMIN_PLUG -#define USE_XMAX_PLUG // used as the second z stepper end limit switch +//#define USE_XMAX_PLUG //#define USE_YMAX_PLUG //#define USE_ZMAX_PLUG @@ -670,13 +660,13 @@ #endif // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). -#define X_MIN_ENDSTOP_INVERTING true // Set to true to invert the logic of the endstop. -#define Y_MIN_ENDSTOP_INVERTING true // Set to true to invert the logic of the endstop. -#define Z_MIN_ENDSTOP_INVERTING true // Set to true to invert the logic of the endstop. -#define X_MAX_ENDSTOP_INVERTING true // Set to true to invert the logic of the endstop. -#define Y_MAX_ENDSTOP_INVERTING true // Set to true to invert the logic of the endstop. -#define Z_MAX_ENDSTOP_INVERTING true // Set to true to invert the logic of the endstop. -#define Z_MIN_PROBE_ENDSTOP_INVERTING true // Set to true to invert the logic of the probe. +#define X_MIN_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // Set to true to invert the logic of the probe. /** * Stepper Drivers @@ -694,23 +684,22 @@ * TMC5130, TMC5130_STANDALONE, TMC5160, TMC5160_STANDALONE * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'L6474', 'POWERSTEP01', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2160', 'TMC2160_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC2209', 'TMC2209_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE', 'TMC5160', 'TMC5160_STANDALONE'] */ - -#define X_DRIVER_TYPE TMC2208_STANDALONE -#define Y_DRIVER_TYPE TMC2208_STANDALONE -#define Z_DRIVER_TYPE TMC2208_STANDALONE -#define X2_DRIVER_TYPE TMC2208_STANDALONE -#define Y2_DRIVER_TYPE TMC2208_STANDALONE -#define Z2_DRIVER_TYPE TMC2208_STANDALONE -#define Z3_DRIVER_TYPE TMC2208_STANDALONE -#define Z4_DRIVER_TYPE TMC2208_STANDALONE -#define E0_DRIVER_TYPE TMC2208_STANDALONE -#define E1_DRIVER_TYPE TMC2208_STANDALONE -#define E2_DRIVER_TYPE TMC2208_STANDALONE -#define E3_DRIVER_TYPE TMC2208_STANDALONE -#define E4_DRIVER_TYPE TMC2208_STANDALONE -//#define E5_DRIVER_TYPE TMC2208_STANDALONE -//#define E6_DRIVER_TYPE TMC2208_STANDALONE -//#define E7_DRIVER_TYPE TMC2208_STANDALONE +//#define X_DRIVER_TYPE A4988 +//#define Y_DRIVER_TYPE A4988 +//#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 +//#define Z4_DRIVER_TYPE A4988 +//#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 +//#define E6_DRIVER_TYPE A4988 +//#define E7_DRIVER_TYPE A4988 // Enable this feature if all enabled endstop pins are interrupt-capable. // This will remove the need to poll the interrupt pins, saving many CPU cycles. @@ -755,14 +744,14 @@ * Override with M92 * X, Y, Z, E0 [, E1[, E2...]] */ -#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 400, 96.2 } +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 500 } /** * Default Max Feed Rate (mm/s) * Override with M203 * X, Y, Z, E0 [, E1[, E2...]] */ -#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 60 } +#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } //#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 #if ENABLED(LIMITED_MAX_FR_EDITING) @@ -775,7 +764,7 @@ * Override with M201 * X, Y, Z, E0 [, E1[, E2...]] */ -#define DEFAULT_MAX_ACCELERATION { 3000, 2000, 60, 10000 } +#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } //#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 #if ENABLED(LIMITED_MAX_ACCEL_EDITING) @@ -790,7 +779,7 @@ * M204 R Retract Acceleration * M204 T Travel Acceleration */ -#define DEFAULT_ACCELERATION 1500 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves #define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves @@ -855,7 +844,8 @@ * The probe replaces the Z-MIN endstop and is used for Z homing. * (Automatically enables USE_PROBE_FOR_Z_HOMING.) */ -//#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + // Force the use of the probe for Z-axis homing //#define USE_PROBE_FOR_Z_HOMING @@ -913,7 +903,7 @@ /** * The BLTouch probe uses a Hall effect sensor and emulates a servo. */ -#define BLTOUCH +//#define BLTOUCH /** * Pressure sensor with a BLTouch-like interface @@ -990,7 +980,7 @@ * * Specify a Probe position as { X, Y, Z } */ -#define NOZZLE_TO_PROBE_OFFSET { 0, -23, -1.54 } +#define NOZZLE_TO_PROBE_OFFSET { 10, 10, 0 } // Most probes should stay away from the edges of the bed, but // with NOZZLE_AS_PROBE this can be negative for a wider probing area. @@ -1014,8 +1004,8 @@ * A total of 2 does fast/slow probes with a weighted average. * A total of 3 or more adds more slow probes, taking the average. */ -#define MULTIPLE_PROBING 2 -#define EXTRA_PROBING 1 +//#define MULTIPLE_PROBING 2 +//#define EXTRA_PROBING 1 /** * Z probes require clearance when deploying, stowing, and moving between @@ -1043,7 +1033,7 @@ #define Z_PROBE_OFFSET_RANGE_MAX 20 // Enable the M48 repeatability test to test probe accuracy -#define Z_MIN_PROBE_REPEATABILITY_TEST +//#define Z_MIN_PROBE_REPEATABILITY_TEST // Before deploy/stow pause for user confirmation //#define PAUSE_BEFORE_DEPLOY_STOW @@ -1090,9 +1080,9 @@ // @section machine // Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. -#define INVERT_X_DIR true // set to true for stock drivers or TMC2208 with reversed connectors -#define INVERT_Y_DIR false // set to false for stock drivers or TMC2208 with reversed connectors -#define INVERT_Z_DIR false // set to false for stock drivers or TMC2208 with reversed +#define INVERT_X_DIR false +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false // @section extruder @@ -1126,16 +1116,16 @@ // @section machine // The size of the print bed -#define X_BED_SIZE 210 -#define Y_BED_SIZE 210 +#define X_BED_SIZE 200 +#define Y_BED_SIZE 200 // Travel limits (mm) after homing, corresponding to endstop positions. -#define X_MIN_POS -5 +#define X_MIN_POS 0 #define Y_MIN_POS 0 #define Z_MIN_POS 0 #define X_MAX_POS X_BED_SIZE #define Y_MAX_POS Y_BED_SIZE -#define Z_MAX_POS 205 +#define Z_MAX_POS 200 /** * Software Endstops @@ -1174,17 +1164,17 @@ * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. * By default the firmware assumes HIGH=FILAMENT PRESENT. */ -#define FILAMENT_RUNOUT_SENSOR +//#define FILAMENT_RUNOUT_SENSOR #if ENABLED(FILAMENT_RUNOUT_SENSOR) #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. - #define FIL_RUNOUT_INVERTING true // Set to true to invert the logic of the sensor. + #define FIL_RUNOUT_INVERTING false // Set to true to invert the logic of the sensor. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. // Set one or more commands to execute on filament runout. // (After 'M412 H' Marlin will ask the host to handle the process.) #define FILAMENT_RUNOUT_SCRIPT "M600" - + // After a runout is detected, continue printing this length of filament // before executing the runout script. Useful for a sensor at the end of // a feed tube. Requires 4 bytes SRAM per sensor, plus 4 bytes overhead. @@ -1238,7 +1228,7 @@ */ //#define AUTO_BED_LEVELING_3POINT //#define AUTO_BED_LEVELING_LINEAR -#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_BILINEAR //#define AUTO_BED_LEVELING_UBL //#define MESH_BED_LEVELING @@ -1270,7 +1260,7 @@ /** * Enable the G26 Mesh Validation Pattern tool. */ - #define G26_MESH_VALIDATION + //#define G26_MESH_VALIDATION #if ENABLED(G26_MESH_VALIDATION) #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for the G26 Mesh Validation Tool. @@ -1285,7 +1275,7 @@ #if EITHER(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR) // Set the number of grid points per dimension. - #define GRID_MAX_POINTS_X 5 + #define GRID_MAX_POINTS_X 3 #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X // Probe along the Y axis, advancing X after each column @@ -1334,7 +1324,7 @@ //=========================================================================== #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed - #define GRID_MAX_POINTS_X 5 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS @@ -1475,7 +1465,7 @@ * M501 - Read settings from EEPROM. (i.e., Throw away unsaved changes) * M502 - Revert settings to "factory" defaults. (Follow with M500 to init the EEPROM.) */ -#define EEPROM_SETTINGS // Persistent storage with M500 and M501 +//#define EEPROM_SETTINGS // Persistent storage with M500 and M501 //#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! #define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. #define EEPROM_BOOT_SILENT // Keep M503 quiet and only give errors during first load @@ -1507,13 +1497,13 @@ // Preheat Constants #define PREHEAT_1_LABEL "PLA" -#define PREHEAT_1_TEMP_HOTEND 215 -#define PREHEAT_1_TEMP_BED 65 +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 #define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 #define PREHEAT_2_LABEL "ABS" -#define PREHEAT_2_TEMP_HOTEND 235 -#define PREHEAT_2_TEMP_BED 85 +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 #define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 /** @@ -1527,7 +1517,7 @@ * P1 Raise the nozzle always to Z-park height. * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. */ -#define NOZZLE_PARK_FEATURE +//#define NOZZLE_PARK_FEATURE #if ENABLED(NOZZLE_PARK_FEATURE) // Specify a park position as { X, Y, Z_raise } @@ -1692,7 +1682,7 @@ * you must uncomment the following option or it won't work. * */ -#define SDSUPPORT +//#define SDSUPPORT /** * SD CARD: SPI SPEED @@ -1780,7 +1770,7 @@ // If you have a speaker that can produce tones, enable it here. // By default Marlin assumes you have a buzzer with a fixed frequency. // -#define SPEAKER +//#define SPEAKER // // The duration and frequency for the UI feedback sound. @@ -2129,7 +2119,7 @@ // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extensible_ui'. // -#define EXTENSIBLE_UI +//#define EXTENSIBLE_UI #if ENABLED(EXTENSIBLE_UI) //#define EXTUI_LOCAL_BEEPER // Enables use of local Beeper pin with external display @@ -2149,27 +2139,6 @@ // //#define TFT_LITTLE_VGL_UI -// -// Anycubic Mega TFT (AI3M) -// -#define ANYCUBIC_TFT_MODEL -/** - * Select your version of the Trigorilla (RAMPS1.4) board here. - * - * 0 = Default Trigorilla - * 1 = Newer Trigorilla v1.1 (first seen late 2018) - * - * The only major difference is a slight change on the servo pin mapping. - * This setting only is relevant if you want to use BLtouch or similar - * mods to be used via servo pins. - * The new version is to be identified by a "TRIGORILLA1.1" lettering - * on the upper left of the PCB silkscreen. - */ -#define TRIGORILLA_VERSION 0 - -#define ANYCUBIC_TFT_DEBUG - - //============================================================================= //============================ Other Controllers ============================ //============================================================================= diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 4035dc512d27..8932c683a8cb 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -371,7 +371,7 @@ * The fan turns on automatically whenever any driver is enabled and turns * off (or reduces to idle speed) shortly after drivers are turned off. */ -#define USE_CONTROLLER_FAN +//#define USE_CONTROLLER_FAN #if ENABLED(USE_CONTROLLER_FAN) //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan //#define CONTROLLER_FAN_USE_Z_ONLY // With this option only the Z axis is considered @@ -449,7 +449,7 @@ * Multiple extruders can be assigned to the same pin in which case * the fan will turn on when any selected extruder is above the threshold. */ -#define E0_AUTO_FAN_PIN FAN2_PIN +#define E0_AUTO_FAN_PIN -1 #define E1_AUTO_FAN_PIN -1 #define E2_AUTO_FAN_PIN -1 #define E3_AUTO_FAN_PIN -1 @@ -548,10 +548,10 @@ // // For Z set the number of stepper drivers // -#define NUM_Z_STEPPER_DRIVERS 2 // (1-4) Z options change based on how many +#define NUM_Z_STEPPER_DRIVERS 1 // (1-4) Z options change based on how many #if NUM_Z_STEPPER_DRIVERS > 1 - #define Z_MULTI_ENDSTOPS + //#define Z_MULTI_ENDSTOPS #if ENABLED(Z_MULTI_ENDSTOPS) #define Z2_USE_ENDSTOP _XMAX_ #define Z2_ENDSTOP_ADJUSTMENT 0 @@ -757,6 +757,7 @@ #define Z_STEPPER_ALIGN_AMP 1.0 // Use a value > 1.0 NOTE: This may cause instability! #endif + // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm #define G34_MAX_GRADE 5 // (%) Maximum incline that G34 will handle #define Z_STEPPER_ALIGN_ITERATIONS 5 // Number of iterations to apply during alignment #define Z_STEPPER_ALIGN_ACC 0.02 // Stop iterating early if the accuracy is better than this @@ -1592,7 +1593,7 @@ * * See https://marlinfw.org/docs/features/lin_advance.html for full instructions. */ -#define LIN_ADVANCE +//#define LIN_ADVANCE #if ENABLED(LIN_ADVANCE) //#define EXTRA_LIN_ADVANCE_K // Enable for second linear advance constants #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed @@ -1840,8 +1841,8 @@ // @section serial // The ASCII buffer for serial input -#define MAX_CMD_SIZE 128 -#define BUFSIZE 8 +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 // Transmission to Host Buffer Size // To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. @@ -1850,13 +1851,13 @@ // For debug-echo: 128 bytes for the optimal speed. // Other output doesn't need to be that speedy. // :[0, 2, 4, 8, 16, 32, 64, 128, 256] -#define TX_BUFFER_SIZE 4 +#define TX_BUFFER_SIZE 0 // Host Receive Buffer Size // Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. // To use flow control, set this buffer size to at least 1024 bytes. // :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] -#define RX_BUFFER_SIZE 256 +//#define RX_BUFFER_SIZE 1024 #if RX_BUFFER_SIZE >= 1024 // Enable to have the controller send XON/XOFF control characters to @@ -1877,11 +1878,15 @@ //#define SERIAL_STATS_DROPPED_RX #endif -// Enable an emergency-command parser to intercept certain commands as they -// enter the serial receive buffer, so they cannot be blocked. -// Currently handles M108, M112, M410 -// Does not work on boards using AT90USB (USBCON) processors! -#define EMERGENCY_PARSER +/** + * Emergency Command Parser + * + * Add a low-level parser to intercept certain commands as they + * enter the serial receive buffer, so they cannot be blocked. + * Currently handles M108, M112, M410, M876 + * NOTE: Not yet implemented for all platforms. + */ +//#define EMERGENCY_PARSER // Bad Serial-connections can miss a received command by sending an 'ok' // Therefore some clients abort after 30 seconds in a timeout. @@ -2025,14 +2030,14 @@ * Requires NOZZLE_PARK_FEATURE. * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. */ -#define ADVANCED_PAUSE_FEATURE +//#define ADVANCED_PAUSE_FEATURE #if ENABLED(ADVANCED_PAUSE_FEATURE) - #define PAUSE_PARK_RETRACT_FEEDRATE 50 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. // This short retract is done immediately, before parking the nozzle. #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. - #define FILAMENT_CHANGE_UNLOAD_LENGTH 555 // (mm) The length of filament for a complete unload. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. // For Bowden, the full length of the tube and nozzle. // For direct drive, the full length of the nozzle. // Set to 0 for manual unloading. @@ -2041,16 +2046,16 @@ // 0 to disable start loading and skip to fast load only #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. - #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 538 // (mm) Load length of filament, from extruder gear to nozzle. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. // For Bowden, the full length of the tube and nozzle. // For direct drive, the full length of the nozzle. //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. - #define ADVANCED_PAUSE_PURGE_LENGTH 60 // (mm) Length to extrude after loading. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. // Set to 0 for manual extrusion. // Filament can be extruded repeatedly from the Filament Change menu // until extrusion is consistent, and to purge old filament. - #define ADVANCED_PAUSE_RESUME_PRIME 2 // (mm) Extra distance to prime nozzle after returning from park. + #define ADVANCED_PAUSE_RESUME_PRIME 0 // (mm) Extra distance to prime nozzle after returning from park. //#define ADVANCED_PAUSE_FANS_PAUSE // Turn off print-cooling fans while the machine is paused. // Filament Unload does a Retract, Delay, and Purge first: @@ -2063,8 +2068,8 @@ #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. - #define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. - //#define HOME_BEFORE_FILAMENT_CHANGE // Ensure homing has been completed prior to parking for filament change + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // If needed, home before parking for filament change //#define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) @@ -3193,9 +3198,9 @@ * Host Prompt Support enables Marlin to use the host for user prompts so * filament runout and other processes can be managed from the host side. */ -#define HOST_ACTION_COMMANDS +//#define HOST_ACTION_COMMANDS #if ENABLED(HOST_ACTION_COMMANDS) - #define HOST_PROMPT_SUPPORT + //#define HOST_PROMPT_SUPPORT #endif /** From c1a5ddc7b5dfdb439f9e60e94c4bcb555ec73873 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 14 Jul 2020 22:11:05 -0500 Subject: [PATCH 29/31] Clean up --- Marlin/src/gcode/feature/pause/M125.cpp | 4 +- .../lcd/extui/lib/anycubic/anycubic_TFT.cpp | 925 +++++++++--------- .../extui/lib/anycubic/anycubic_serial.cpp | 143 ++- .../lcd/extui/lib/anycubic/anycubic_serial.h | 32 +- Marlin/src/lcd/extui_anycubic_tft.cpp | 103 +- Marlin/src/pins/ramps/pins_TRIGORILLA_14.h | 52 +- 6 files changed, 603 insertions(+), 656 deletions(-) diff --git a/Marlin/src/gcode/feature/pause/M125.cpp b/Marlin/src/gcode/feature/pause/M125.cpp index 3b94cd36ad01..cb59985278fa 100644 --- a/Marlin/src/gcode/feature/pause/M125.cpp +++ b/Marlin/src/gcode/feature/pause/M125.cpp @@ -72,14 +72,14 @@ void GcodeSuite::M125() { #endif const bool sd_printing = TERN0(SDSUPPORT, IS_SD_PRINTING()); + TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_PARKING, PAUSE_MODE_PAUSE_PRINT)); const bool show_lcd = TERN0(HAS_LCD_MENU, parser.seenval('P')); - const bool exetnsible_ui_pause = TERN(EXTENSIBLE_UI, true, false); if (pause_print(retract, park_point, 0, show_lcd)) { TERN_(POWER_LOSS_RECOVERY, if (recovery.enabled) recovery.save(true)); - if (!sd_printing || show_lcd || exetnsible_ui_pause) { + if (ENABLED(EXTENSIBLE_UI) || !sd_printing || show_lcd) { wait_for_confirmation(false, 0); resume_print(0, 0, -retract, 0); } diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp index b73b65ccf754..fcc2a5f4aba8 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp @@ -21,28 +21,31 @@ #include "../../../../inc/MarlinConfigPre.h" -#ifdef ANYCUBIC_TFT_MODEL +#if ENABLED(ANYCUBIC_TFT_MODEL) -#include "../../../../inc/MarlinConfig.h" #include "anycubic_TFT.h" #include "anycubic_serial.h" + +#include "../../../../inc/MarlinConfig.h" #include "../../ui_api.h" #include "../../../../MarlinCore.h" // for quickstop_stepper and disable_steppers +AnycubicTFTClass AnycubicTFT; + char _conv[8]; char *itostr2(const uint8_t &x) { - //sprintf(conv,"%5.1f",x); - int xx=x; - _conv[0]=(xx/10)%10+'0'; - _conv[1]=(xx)%10+'0'; - _conv[2]=0; + // sprintf(conv,"%5.1f",x); + int xx = x; + _conv[0] = (xx / 10) % 10 + '0'; + _conv[1] = (xx) % 10 + '0'; + _conv[2] = 0; return _conv; } #ifndef ULTRA_LCD #define DIGIT(n) ('0' + (n)) - #define DIGIMOD(n, f) DIGIT((n)/(f) % 10) + #define DIGIMOD(n, f) DIGIT((n) / (f) % 10) #define RJDIGIT(n, f) ((n) >= (f) ? DIGIMOD(n, f) : ' ') #define MINUSOR(n, alt) (n >= 0 ? (alt) : (n = -n, '-')) @@ -54,7 +57,7 @@ char *itostr2(const uint8_t &x) { return &_conv[4]; } - // Convert signed float to fixed-length string with 023.45 / -23.45 format +// Convert signed float to fixed-length string with 023.45 / -23.45 format char *ftostr32(const float &x) { long xx = x * 100; _conv[1] = MINUSOR(xx, DIGIMOD(xx, 10000)); @@ -74,7 +77,7 @@ void AnycubicTFTClass::OnSetup() { AnycubicSerial.begin(115200); ANYCUBIC_SENDCOMMAND_DBG_PGM("J17", "TFT Serial Debug: Main board reset... J17"); // J17 Main board reset ExtUI::delay_ms(10); - + // initialise the state of the key pins running on the tft #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT) pinMode(SD_DETECT_PIN, INPUT); @@ -89,13 +92,13 @@ void AnycubicTFTClass::OnSetup() { mediaPauseState = AMPAUSESTATE_NOT_PAUSED; // DoSDCardStateCheck(); - ANYCUBIC_SENDCOMMAND_DBG_PGM("J12", "TFT Serial Debug: Ready... J12"); // J12 Ready + ANYCUBIC_SENDCOMMAND_DBG_PGM("J12", "TFT Serial Debug: Ready... J12"); // J12 Ready ExtUI::delay_ms(10); DoFilamentRunoutCheck(); - SelectedFile[0]=0; - - #ifdef STARTUP_CHIME + SelectedFile[0] = 0; + + #if ENABLED(STARTUP_CHIME) ExtUI::injectCommands_P(PSTR("M300 P250 S554\nM300 P250 S554\nM300 P250 S740\nM300 P250 S554\nM300 P250 S740\nM300 P250 S554\nM300 P500 S831")); #endif #if ENABLED(ANYCUBIC_TFT_DEBUG) @@ -104,7 +107,7 @@ void AnycubicTFTClass::OnSetup() { } void AnycubicTFTClass::OnCommandScan() { - static millis_t nextStopCheck = 0; // used to slow the stopped print check down to reasonable times + static millis_t nextStopCheck = 0; // used to slow the stopped print check down to reasonable times const millis_t ms = millis(); if (ELAPSED(ms, nextStopCheck)) { nextStopCheck = ms + 1000UL; @@ -121,19 +124,17 @@ void AnycubicTFTClass::OnCommandScan() { } } - if (TFTbuflen<(TFTBUFSIZE-1)) { + if (TFTbuflen < (TFTBUFSIZE - 1)) GetCommandFromTFT(); - } - + if (TFTbuflen) { - TFTbuflen = (TFTbuflen-1); - TFTbufindr = (TFTbufindr + 1)%TFTBUFSIZE; + TFTbuflen = (TFTbuflen - 1); + TFTbufindr = (TFTbufindr + 1) % TFTBUFSIZE; } } -void AnycubicTFTClass::OnKillTFT() -{ - ANYCUBIC_SENDCOMMAND_DBG_PGM("J11", "TFT Serial Debug: Kill command... J11"); +void AnycubicTFTClass::OnKillTFT() { + ANYCUBIC_SENDCOMMAND_DBG_PGM("J11", "TFT Serial Debug: Kill command... J11"); } void AnycubicTFTClass::OnSDCardStateChange(bool isInserted) { @@ -147,7 +148,7 @@ void AnycubicTFTClass::OnSDCardStateChange(bool isInserted) { void AnycubicTFTClass::OnSDCardError() { #if ENABLED(ANYCUBIC_TFT_DEBUG) - SERIAL_ECHOLNPGM("TFT Serial Debug: OnSDCardError event triggered..."); + SERIAL_ECHOLNPGM("TFT Serial Debug: OnSDCardError event triggered..."); #endif ANYCUBIC_SENDCOMMAND_DBG_PGM("J21", "TFT Serial Debug: On SD Card Error ... J21"); } @@ -173,37 +174,41 @@ void AnycubicTFTClass::OnUserConfirmRequired(const char * const msg) { * "Filament Purging..." * "HeaterTimeout" * "Reheat finished." - * + * * NOTE: The only way to handle these states is strcmp_P with the msg unfortunately (very expensive) */ if (strcmp_P(msg, PSTR("Nozzle Parked")) == 0) { mediaPrintingState = AMPRINTSTATE_PAUSED; - mediaPauseState = AMPAUSESTATE_PARKED; + mediaPauseState = AMPAUSESTATE_PARKED; // enable continue button ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD print paused done... J18"); - } else if (strcmp_P(msg, PSTR("Load Filament")) == 0) { + } + else if (strcmp_P(msg, PSTR("Load Filament")) == 0) { mediaPrintingState = AMPRINTSTATE_PAUSED; - mediaPauseState = AMPAUSESTATE_FILAMENT_OUT; + mediaPauseState = AMPAUSESTATE_FILAMENT_OUT; // enable continue button ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: UserConfirm Filament is out... J18"); ANYCUBIC_SENDCOMMAND_DBG_PGM("J23", "TFT Serial Debug: UserConfirm Blocking filament prompt... J23"); - } else if (strcmp_P(msg, PSTR("Filament Purging...")) == 0) { + } + else if (strcmp_P(msg, PSTR("Filament Purging...")) == 0) { mediaPrintingState = AMPRINTSTATE_PAUSED; - mediaPauseState = AMPAUSESTATE_PARKING; + mediaPauseState = AMPAUSESTATE_PARKING; // TODO: JBA I don't think J05 just disables the continue button, i think it injects a rogue M25. So taking this out // disable continue button - //ANYCUBIC_SENDCOMMAND_DBG_PGM("J05", "TFT Serial Debug: UserConfirm SD Filament Purging... J05"); // J05 printing pause - + // ANYCUBIC_SENDCOMMAND_DBG_PGM("J05", "TFT Serial Debug: UserConfirm SD Filament Purging... J05"); // J05 printing pause + // enable continue button - ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: UserConfirm Filament is purging... J18"); - } else if (strcmp_P(msg, PSTR("HeaterTimeout")) == 0) { + ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: UserConfirm Filament is purging... J18"); + } + else if (strcmp_P(msg, PSTR("HeaterTimeout")) == 0) { mediaPrintingState = AMPRINTSTATE_PAUSED; - mediaPauseState = AMPAUSESTATE_HEATER_TIMEOUT; + mediaPauseState = AMPAUSESTATE_HEATER_TIMEOUT; // enable continue button ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD Heater timeout... J18"); - } else if (strcmp_P(msg, PSTR("Reheat finished.")) == 0) { + } + else if (strcmp_P(msg, PSTR("Reheat finished.")) == 0) { mediaPrintingState = AMPRINTSTATE_PAUSED; - mediaPauseState = AMPAUSESTATE_REHEAT_FINISHED; + mediaPauseState = AMPAUSESTATE_REHEAT_FINISHED; // enable continue button ANYCUBIC_SENDCOMMAND_DBG_PGM("J18", "TFT Serial Debug: UserConfirm SD Reheat done... J18"); } @@ -216,149 +221,150 @@ float AnycubicTFTClass::CodeValue() { bool AnycubicTFTClass::CodeSeen(char code) { TFTstrchr_pointer = strchr(TFTcmdbuffer[TFTbufindr], code); - return (TFTstrchr_pointer != NULL); //Return True if a character was found + return (TFTstrchr_pointer != NULL); // Return True if a character was found } bool AnycubicTFTClass::IsNozzleHomed() { const float xPosition = ExtUI::getAxisPosition_mm((ExtUI::axis_t) ExtUI::X); const float yPosition = ExtUI::getAxisPosition_mm((ExtUI::axis_t) ExtUI::Y); return WITHIN(xPosition, X_MIN_POS - 0.1, X_MIN_POS + 0.1) && - WITHIN(yPosition, Y_MIN_POS - 0.1, Y_MIN_POS + 0.1); + WITHIN(yPosition, Y_MIN_POS - 0.1, Y_MIN_POS + 0.1); } void AnycubicTFTClass::HandleSpecialMenu() { /** * NOTE: that the file selection command actual lowercases the entire selected file/foldername, so charracter comparisons need to be lowercase. */ - if (SelectedDirectory[0] == '<' ) { + if (SelectedDirectory[0] == '<') { switch (SelectedDirectory[1]) { case 'e': // "" SpecialMenu = false; return; break; - #if ENABLED(PROBE_MANUALLY) - case '0': - switch (SelectedDirectory[2]) { - case '1': // "<01ZUp0.1>" - SERIAL_ECHOLNPGM("Special Menu: Z Up 0.1"); - ExtUI::injectCommands_P(PSTR("G91\nG1 Z+0.1\nG90")); - break; - - case '2': // "<02ZUp0.02>" - SERIAL_ECHOLNPGM("Special Menu: Z Up 0.02"); - ExtUI::injectCommands_P(PSTR("G91\nG1 Z+0.02\nG90")); - break; - - case '3': // "<03ZDn0.02>" - SERIAL_ECHOLNPGM("Special Menu: Z Down 0.02"); - ExtUI::injectCommands_P(PSTR("G91\nG1 Z-0.02\nG90")); - break; - - case '4': // "<04ZDn0.1>" - SERIAL_ECHOLNPGM("Special Menu: Z Down 0.1"); - ExtUI::injectCommands_P(PSTR("G91\nG1 Z-0.1\nG90")); - break; - - case '5': // "<05PrehtBed>" - SERIAL_ECHOLNPGM("Special Menu: Preheat Bed"); - ExtUI::injectCommands_P(PSTR("M140 S65")); - break; - - case '6': // "<06SMeshLvl>" - SERIAL_ECHOLNPGM("Special Menu: Start Mesh Leveling"); - ExtUI::injectCommands_P(PSTR("G29 S1")); - break; - - case '7': // "<07MeshNPnt>" - SERIAL_ECHOLNPGM("Special Menu: Next Mesh Point"); - ExtUI::injectCommands_P(PSTR("G29 S2")); - break; - - case '8': // "<08HtEndPID>" - SERIAL_ECHOLNPGM("Special Menu: Auto Tune Hotend PID"); - // need to dwell for half a second to give the fan a chance to start before the pid tuning starts - ExtUI::injectCommands_P(PSTR("M106 S204\nG4 P500\nM303 E0 S215 C15 U1")); - break; - - case '9': // "<09HtBedPID>" - SERIAL_ECHOLNPGM("Special Menu: Auto Tune Hotbed Pid"); - ExtUI::injectCommands_P(PSTR("M303 E-1 S65 C6 U1")); - break; - - default: - break; - } - break; - - case '1': - switch (SelectedDirectory[2]) { - case '0': // "<10FWDeflts>" - SERIAL_ECHOLNPGM("Special Menu: Load FW Defaults"); - ExtUI::injectCommands_P(PSTR("M502\nM300 P105 S1661\nM300 P210 S1108")); - break; - - case '1': // "<11SvEEPROM>" - SERIAL_ECHOLNPGM("Special Menu: Save EEPROM"); - ExtUI::injectCommands_P(PSTR("M500\nM300 P105 S1108\nM300 P210 S1661")); - break; - - default: - break; - } - break; - #else - case '0': - switch (SelectedDirectory[2]) { - case '1': // "<01PrehtBed>" - SERIAL_ECHOLNPGM("Special Menu: Preheat Bed"); - ExtUI::injectCommands_P(PSTR("M140 S65")); - break; - - case '2': // "<02ABL>" - SERIAL_ECHOLNPGM("Special Menu: Auto Bed Leveling"); - ExtUI::injectCommands_P(PSTR("G28\nG29")); - break; - - case '3': // "<03HtendPID>" - SERIAL_ECHOLNPGM("Special Menu: Auto Tune Hotend PID"); - // need to dwell for half a second to give the fan a chance to start before the pid tuning starts - ExtUI::injectCommands_P(PSTR("M106 S204\nG4 P500\nM303 E0 S215 C15 U1")); - break; - - case '4': // "<04HtbedPID>" - SERIAL_ECHOLNPGM("Special Menu: Auto Tune Hotbed Pid"); - ExtUI::injectCommands_P(PSTR("M303 E-1 S65 C6 U1")); - break; - - case '5': // "<05FWDeflts>" - SERIAL_ECHOLNPGM("Special Menu: Load FW Defaults"); - ExtUI::injectCommands_P(PSTR("M502\nM300 P105 S1661\nM300 P210 S1108")); - break; - - case '6': // "<06SvEEPROM>" - SERIAL_ECHOLNPGM("Special Menu: Save EEPROM"); - ExtUI::injectCommands_P(PSTR("M500\nM300 P105 S1108\nM300 P210 S1661")); - break; - - case '7': // <07SendM108> - SERIAL_ECHOLNPGM("Special Menu: Send User Confirmation"); - ExtUI::injectCommands_P(PSTR("M108")); - break; - - default: - break; - } - break; - #endif // PROBE_MANUALLY + #if ENABLED(PROBE_MANUALLY) + case '0': + switch (SelectedDirectory[2]) { + case '1': // "<01ZUp0.1>" + SERIAL_ECHOLNPGM("Special Menu: Z Up 0.1"); + ExtUI::injectCommands_P(PSTR("G91\nG1 Z+0.1\nG90")); + break; + + case '2': // "<02ZUp0.02>" + SERIAL_ECHOLNPGM("Special Menu: Z Up 0.02"); + ExtUI::injectCommands_P(PSTR("G91\nG1 Z+0.02\nG90")); + break; + + case '3': // "<03ZDn0.02>" + SERIAL_ECHOLNPGM("Special Menu: Z Down 0.02"); + ExtUI::injectCommands_P(PSTR("G91\nG1 Z-0.02\nG90")); + break; + + case '4': // "<04ZDn0.1>" + SERIAL_ECHOLNPGM("Special Menu: Z Down 0.1"); + ExtUI::injectCommands_P(PSTR("G91\nG1 Z-0.1\nG90")); + break; + + case '5': // "<05PrehtBed>" + SERIAL_ECHOLNPGM("Special Menu: Preheat Bed"); + ExtUI::injectCommands_P(PSTR("M140 S65")); + break; + + case '6': // "<06SMeshLvl>" + SERIAL_ECHOLNPGM("Special Menu: Start Mesh Leveling"); + ExtUI::injectCommands_P(PSTR("G29 S1")); + break; + + case '7': // "<07MeshNPnt>" + SERIAL_ECHOLNPGM("Special Menu: Next Mesh Point"); + ExtUI::injectCommands_P(PSTR("G29 S2")); + break; + + case '8': // "<08HtEndPID>" + SERIAL_ECHOLNPGM("Special Menu: Auto Tune Hotend PID"); + // need to dwell for half a second to give the fan a chance to start before the pid tuning starts + ExtUI::injectCommands_P(PSTR("M106 S204\nG4 P500\nM303 E0 S215 C15 U1")); + break; + + case '9': // "<09HtBedPID>" + SERIAL_ECHOLNPGM("Special Menu: Auto Tune Hotbed Pid"); + ExtUI::injectCommands_P(PSTR("M303 E-1 S65 C6 U1")); + break; + + default: + break; + } + break; - default: - break; + case '1': + switch (SelectedDirectory[2]) { + case '0': // "<10FWDeflts>" + SERIAL_ECHOLNPGM("Special Menu: Load FW Defaults"); + ExtUI::injectCommands_P(PSTR("M502\nM300 P105 S1661\nM300 P210 S1108")); + break; + + case '1': // "<11SvEEPROM>" + SERIAL_ECHOLNPGM("Special Menu: Save EEPROM"); + ExtUI::injectCommands_P(PSTR("M500\nM300 P105 S1108\nM300 P210 S1661")); + break; + + default: + break; + } + break; + #else // if ENABLED(PROBE_MANUALLY) + case '0': + switch (SelectedDirectory[2]) { + case '1': // "<01PrehtBed>" + SERIAL_ECHOLNPGM("Special Menu: Preheat Bed"); + ExtUI::injectCommands_P(PSTR("M140 S65")); + break; + + case '2': // "<02ABL>" + SERIAL_ECHOLNPGM("Special Menu: Auto Bed Leveling"); + ExtUI::injectCommands_P(PSTR("G28\nG29")); + break; + + case '3': // "<03HtendPID>" + SERIAL_ECHOLNPGM("Special Menu: Auto Tune Hotend PID"); + // need to dwell for half a second to give the fan a chance to start before the pid tuning starts + ExtUI::injectCommands_P(PSTR("M106 S204\nG4 P500\nM303 E0 S215 C15 U1")); + break; + + case '4': // "<04HtbedPID>" + SERIAL_ECHOLNPGM("Special Menu: Auto Tune Hotbed Pid"); + ExtUI::injectCommands_P(PSTR("M303 E-1 S65 C6 U1")); + break; + + case '5': // "<05FWDeflts>" + SERIAL_ECHOLNPGM("Special Menu: Load FW Defaults"); + ExtUI::injectCommands_P(PSTR("M502\nM300 P105 S1661\nM300 P210 S1108")); + break; + + case '6': // "<06SvEEPROM>" + SERIAL_ECHOLNPGM("Special Menu: Save EEPROM"); + ExtUI::injectCommands_P(PSTR("M500\nM300 P105 S1108\nM300 P210 S1661")); + break; + + case '7': // <07SendM108> + SERIAL_ECHOLNPGM("Special Menu: Send User Confirmation"); + ExtUI::injectCommands_P(PSTR("M108")); + break; + + default: + break; + } + break; + #endif // PROBE_MANUALLY + + default: + break; } #if ENABLED(ANYCUBIC_TFT_DEBUG) - } else { - SERIAL_ECHOPGM("TFT Serial Debug: Attempted to HandleSpecialMenu on non-special menu... "); - SERIAL_ECHOLN(SelectedDirectory); + } + else { + SERIAL_ECHOPGM("TFT Serial Debug: Attempted to HandleSpecialMenu on non-special menu... "); + SERIAL_ECHOLN(SelectedDirectory); #endif } } @@ -366,9 +372,9 @@ void AnycubicTFTClass::HandleSpecialMenu() { void AnycubicTFTClass::RenderCurrentFileList() { #if ENABLED(SDSUPPORT) uint16_t selectedNumber = 0; - SelectedDirectory[0]=0; - SelectedFile[0]=0; - + SelectedDirectory[0] = 0; + SelectedFile[0] = 0; + ANYCUBIC_SERIAL_PROTOCOLPGM("FN "); // Filelist start ANYCUBIC_SERIAL_ENTER(); @@ -379,19 +385,16 @@ void AnycubicTFTClass::RenderCurrentFileList() { ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); } else { - if (CodeSeen('S')) { + if (CodeSeen('S')) selectedNumber = CodeValue(); - } - if (SpecialMenu) { + if (SpecialMenu) RenderSpecialMenu(selectedNumber); - } - else { + else RenderCurrentFolder(selectedNumber); - } } ANYCUBIC_SERIAL_PROTOCOLPGM("END"); // Filelist stop - ANYCUBIC_SERIAL_ENTER(); + ANYCUBIC_SERIAL_ENTER(); #endif // SDSUPPORT } @@ -399,64 +402,64 @@ void AnycubicTFTClass::RenderSpecialMenu(uint16_t selectedNumber) { switch (selectedNumber) { #if ENABLED(PROBE_MANUALLY) case 0: // First Page - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<01ZUp0.1>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<02ZUp0.02>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<03ZDn0.02>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<04ZDn0.1>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - break; + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<01ZUp0.1>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<02ZUp0.02>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<03ZDn0.02>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<04ZDn0.1>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + break; case 4: // Second Page - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<05PrehtBed>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<06SMeshLvl>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<07MeshNPnt>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<08HtEndPID>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - break; + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<05PrehtBed>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<06SMeshLvl>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<07MeshNPnt>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<08HtEndPID>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + break; case 8: // Third Page - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<09HtBedPID>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<10FWDeflts>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<11SvEEPROM>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - break; + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<09HtBedPID>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<10FWDeflts>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<11SvEEPROM>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + break; #else case 0: // First Page - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<01PrehtBed>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<02ABL>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<03HtEndPID>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<04HtBedPID>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - break; + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<01PrehtBed>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<02ABL>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<03HtEndPID>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<04HtBedPID>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + break; case 4: // Second Page - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<05FWDeflts>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<06SvEEPROM>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM("<07SendM108>"); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - break; - - #endif // PROBE_MANUALLY - - default: - break; + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<05FWDeflts>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<06SvEEPROM>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM("<07SendM108>"); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); + break; + + #endif // PROBE_MANUALLY + + default: + break; } } @@ -466,24 +469,25 @@ void AnycubicTFTClass::RenderCurrentFolder(uint16_t selectedNumber) { uint16_t max_files; uint16_t dir_files = currentFileList.count(); - if ((dir_files-selectedNumber) < 4) { + if ((dir_files - selectedNumber) < 4) max_files = dir_files; - } else { - max_files = selectedNumber+3; - } + else + max_files = selectedNumber + 3; for (cnt = selectedNumber; cnt <= max_files; cnt++) { - if (cnt == 0) { // Special Entry + if (cnt == 0) { // Special Entry if (currentFileList.isAtRootDir()) { ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); ANYCUBIC_SERIAL_PROTOCOLLNPGM(""); - } else { + } + else { ANYCUBIC_SERIAL_PROTOCOLLNPGM("/.."); ANYCUBIC_SERIAL_PROTOCOLLNPGM("/.."); } - } else { - currentFileList.seek(cnt-1, false); - + } + else { + currentFileList.seek(cnt - 1, false); + #if ENABLED(ANYCUBIC_TFT_DEBUG) SERIAL_ECHOLN(currentFileList.filename()); #endif @@ -492,8 +496,9 @@ void AnycubicTFTClass::RenderCurrentFolder(uint16_t selectedNumber) { ANYCUBIC_SERIAL_PROTOCOLLN(currentFileList.shortFilename()); ANYCUBIC_SERIAL_PROTOCOLPGM("/"); ANYCUBIC_SERIAL_PROTOCOLLN(currentFileList.longFilename()); - - } else { + + } + else { ANYCUBIC_SERIAL_PROTOCOLLN(currentFileList.shortFilename()); ANYCUBIC_SERIAL_PROTOCOLLN(currentFileList.longFilename()); } @@ -503,17 +508,17 @@ void AnycubicTFTClass::RenderCurrentFolder(uint16_t selectedNumber) { void AnycubicTFTClass::OnPrintTimerStarted() { #if ENABLED(SDSUPPORT) - if (mediaPrintingState == AMPRINTSTATE_PRINTING) { - ANYCUBIC_SENDCOMMAND_DBG_PGM("J04","TFT Serial Debug: Starting SD Print... J04"); // J04 Starting Print - } + if (mediaPrintingState == AMPRINTSTATE_PRINTING) + ANYCUBIC_SENDCOMMAND_DBG_PGM("J04", "TFT Serial Debug: Starting SD Print... J04"); // J04 Starting Print + #endif -} +} void AnycubicTFTClass::OnPrintTimerPaused() { #if ENABLED(SDSUPPORT) if (ExtUI::isPrintingFromMedia()) { mediaPrintingState = AMPRINTSTATE_PAUSED; - mediaPauseState = AMPAUSESTATE_PARKING; + mediaPauseState = AMPAUSESTATE_PARKING; } #endif } @@ -522,7 +527,7 @@ void AnycubicTFTClass::OnPrintTimerStopped() { #if ENABLED(SDSUPPORT) if (mediaPrintingState == AMPRINTSTATE_PRINTING) { mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; - mediaPauseState = AMPAUSESTATE_NOT_PAUSED; + mediaPauseState = AMPAUSESTATE_NOT_PAUSED; ANYCUBIC_SENDCOMMAND_DBG_PGM("J14", "TFT Serial Debug: SD Print Completed... J14"); } // otherwise it was stopped by the printer so don't send print completed signal to TFT @@ -536,121 +541,118 @@ void AnycubicTFTClass::GetCommandFromTFT() { if (serial3_char == '\n' || serial3_char == '\r' || serial3_char == ':' || - serial3_count >= (TFT_MAX_CMD_SIZE - 1) ) { - - if (!serial3_count) { //if empty line - return; - } + serial3_count >= (TFT_MAX_CMD_SIZE - 1) + ) { + + if (!serial3_count) return; // if empty line - TFTcmdbuffer[TFTbufindw][serial3_count] = 0; //terminate string + TFTcmdbuffer[TFTbufindw][serial3_count] = 0; // terminate string if ((strchr(TFTcmdbuffer[TFTbufindw], 'A') != NULL)) { int16_t a_command; TFTstrchr_pointer = strchr(TFTcmdbuffer[TFTbufindw], 'A'); - a_command=((int)((strtod(&TFTcmdbuffer[TFTbufindw][TFTstrchr_pointer - TFTcmdbuffer[TFTbufindw] + 1], NULL)))); + a_command = ((int)((strtod(&TFTcmdbuffer[TFTbufindw][TFTstrchr_pointer - TFTcmdbuffer[TFTbufindw] + 1], NULL)))); #if ENABLED(ANYCUBIC_TFT_DEBUG) - if ((a_command>7) && (a_command != 20)) { // No debugging of status polls, please! + if ((a_command > 7) && (a_command != 20)) { // No debugging of status polls, please! SERIAL_ECHOPGM("TFT Serial Command: "); SERIAL_ECHOLN(TFTcmdbuffer[TFTbufindw]); } #endif switch (a_command) { - case 0: //A0 GET HOTEND TEMP - { - float hotendActualTemp = ExtUI::getActualTemp_celsius((ExtUI::extruder_t) (ExtUI::extruder_t) ExtUI::E0); - ANYCUBIC_SENDCOMMANDPGM_VAL("A0V ", int(hotendActualTemp + 0.5)); - } - break; + case 0: { // A0 GET HOTEND TEMP + float hotendActualTemp = ExtUI::getActualTemp_celsius((ExtUI::extruder_t) (ExtUI::extruder_t) ExtUI::E0); + ANYCUBIC_SENDCOMMANDPGM_VAL("A0V ", int(hotendActualTemp + 0.5)); + } + break; - case 1: //A1 GET HOTEND TARGET TEMP - { - float hotendTargetTemp = ExtUI::getTargetTemp_celsius((ExtUI::extruder_t) (ExtUI::extruder_t) ExtUI::E0); - ANYCUBIC_SENDCOMMANDPGM_VAL("A1V ", int(hotendTargetTemp + 0.5)); - } - break; - - case 2: //A2 GET HOTBED TEMP - { - float heatedBedActualTemp = ExtUI::getActualTemp_celsius((ExtUI::heater_t) ExtUI::BED); - ANYCUBIC_SENDCOMMANDPGM_VAL("A2V ", int(heatedBedActualTemp + 0.5)); - } - break; - - case 3: //A3 GET HOTBED TARGET TEMP - { - float heatedBedTargetTemp = ExtUI::getTargetTemp_celsius((ExtUI::heater_t) ExtUI::BED); - ANYCUBIC_SENDCOMMANDPGM_VAL("A3V ", int(heatedBedTargetTemp + 0.5)); - } - break; - - case 4: //A4 GET FAN SPEED - { - float fanPercent = ExtUI::getActualFan_percent(ExtUI::FAN0); - fanPercent = constrain(fanPercent, 0, 100); - ANYCUBIC_SENDCOMMANDPGM_VAL("A4V ", int(fanPercent)); - } - break; - - case 5:// A5 GET CURRENT COORDINATE - { - float xPostition = ExtUI::getAxisPosition_mm(ExtUI::X); - float yPostition = ExtUI::getAxisPosition_mm(ExtUI::Y); - float zPostition = ExtUI::getAxisPosition_mm(ExtUI::Z); - ANYCUBIC_SERIAL_PROTOCOLPGM("A5V"); - ANYCUBIC_SERIAL_SPACE(); - ANYCUBIC_SERIAL_PROTOCOLPGM("X: "); - ANYCUBIC_SERIAL_PROTOCOL(xPostition); - ANYCUBIC_SERIAL_SPACE(); - ANYCUBIC_SERIAL_PROTOCOLPGM("Y: "); - ANYCUBIC_SERIAL_PROTOCOL(yPostition); - ANYCUBIC_SERIAL_SPACE(); - ANYCUBIC_SERIAL_PROTOCOLPGM("Z: "); - ANYCUBIC_SERIAL_PROTOCOL(zPostition); - ANYCUBIC_SERIAL_SPACE(); - ANYCUBIC_SERIAL_ENTER(); - } - break; - - case 6: //A6 GET SD CARD PRINTING STATUS + case 1: { // A1 GET HOTEND TARGET TEMP + float hotendTargetTemp = ExtUI::getTargetTemp_celsius((ExtUI::extruder_t) (ExtUI::extruder_t) ExtUI::E0); + ANYCUBIC_SENDCOMMANDPGM_VAL("A1V ", int(hotendTargetTemp + 0.5)); + } + break; + + case 2: { // A2 GET HOTBED TEMP + float heatedBedActualTemp = ExtUI::getActualTemp_celsius((ExtUI::heater_t) ExtUI::BED); + ANYCUBIC_SENDCOMMANDPGM_VAL("A2V ", int(heatedBedActualTemp + 0.5)); + } + break; + + case 3: { // A3 GET HOTBED TARGET TEMP + float heatedBedTargetTemp = ExtUI::getTargetTemp_celsius((ExtUI::heater_t) ExtUI::BED); + ANYCUBIC_SENDCOMMANDPGM_VAL("A3V ", int(heatedBedTargetTemp + 0.5)); + } + break; + + case 4: // A4 GET FAN SPEED + { + float fanPercent = ExtUI::getActualFan_percent(ExtUI::FAN0); + fanPercent = constrain(fanPercent, 0, 100); + ANYCUBIC_SENDCOMMANDPGM_VAL("A4V ", int(fanPercent)); + } + break; + + case 5: // A5 GET CURRENT COORDINATE + { + float xPostition = ExtUI::getAxisPosition_mm(ExtUI::X); + float yPostition = ExtUI::getAxisPosition_mm(ExtUI::Y); + float zPostition = ExtUI::getAxisPosition_mm(ExtUI::Z); + ANYCUBIC_SERIAL_PROTOCOLPGM("A5V"); + ANYCUBIC_SERIAL_SPACE(); + ANYCUBIC_SERIAL_PROTOCOLPGM("X: "); + ANYCUBIC_SERIAL_PROTOCOL(xPostition); + ANYCUBIC_SERIAL_SPACE(); + ANYCUBIC_SERIAL_PROTOCOLPGM("Y: "); + ANYCUBIC_SERIAL_PROTOCOL(yPostition); + ANYCUBIC_SERIAL_SPACE(); + ANYCUBIC_SERIAL_PROTOCOLPGM("Z: "); + ANYCUBIC_SERIAL_PROTOCOL(zPostition); + ANYCUBIC_SERIAL_SPACE(); + ANYCUBIC_SERIAL_ENTER(); + } + break; + + case 6: // A6 GET SD CARD PRINTING STATUS #if ENABLED(SDSUPPORT) if (ExtUI::isPrintingFromMedia()) { ANYCUBIC_SERIAL_PROTOCOLPGM("A6V "); if (ExtUI::isMediaInserted()) { ANYCUBIC_SERIAL_PROTOCOL(itostr3(int(ExtUI::getProgress_percent()))); ANYCUBIC_SERIAL_ENTER(); - } else { + } + else { ANYCUBIC_SENDCOMMAND_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to return printing status... J02"); } - } else { + } + else { ANYCUBIC_SERIAL_PROTOCOLPGM("A6V ---"); ANYCUBIC_SERIAL_ENTER(); } #endif break; - case 7://A7 GET PRINTING TIME - { - uint32_t elapsedSeconds = ExtUI::getProgress_seconds_elapsed(); - ANYCUBIC_SERIAL_PROTOCOLPGM("A7V "); - if (elapsedSeconds != 0) { // print time - uint32_t elapsedMinutes = elapsedSeconds/60; - ANYCUBIC_SERIAL_PROTOCOL(itostr2(elapsedMinutes/60)); - ANYCUBIC_SERIAL_SPACE(); - ANYCUBIC_SERIAL_PROTOCOLPGM("H"); - ANYCUBIC_SERIAL_SPACE(); - ANYCUBIC_SERIAL_PROTOCOL(itostr2(elapsedMinutes%60)); - ANYCUBIC_SERIAL_SPACE(); - ANYCUBIC_SERIAL_PROTOCOLPGM("M"); - } else { - ANYCUBIC_SERIAL_SPACE(); - ANYCUBIC_SERIAL_PROTOCOLPGM("999:999"); - } - ANYCUBIC_SERIAL_ENTER(); + case 7: { // A7 GET PRINTING TIME + uint32_t elapsedSeconds = ExtUI::getProgress_seconds_elapsed(); + ANYCUBIC_SERIAL_PROTOCOLPGM("A7V "); + if (elapsedSeconds != 0) { // print time + uint32_t elapsedMinutes = elapsedSeconds / 60; + ANYCUBIC_SERIAL_PROTOCOL(itostr2(elapsedMinutes / 60)); + ANYCUBIC_SERIAL_SPACE(); + ANYCUBIC_SERIAL_PROTOCOLPGM("H"); + ANYCUBIC_SERIAL_SPACE(); + ANYCUBIC_SERIAL_PROTOCOL(itostr2(elapsedMinutes % 60)); + ANYCUBIC_SERIAL_SPACE(); + ANYCUBIC_SERIAL_PROTOCOLPGM("M"); } - break; - + else { + ANYCUBIC_SERIAL_SPACE(); + ANYCUBIC_SERIAL_PROTOCOLPGM("999:999"); + } + ANYCUBIC_SERIAL_ENTER(); + } + break; + case 8: // A8 GET SD LIST #if ENABLED(SDSUPPORT) SelectedFile[0] = 0; @@ -660,17 +662,17 @@ void AnycubicTFTClass::GetCommandFromTFT() { case 9: // A9 pause sd print #if ENABLED(SDSUPPORT) - if (ExtUI::isPrintingFromMedia()) { + if (ExtUI::isPrintingFromMedia()) PausePrint(); - } + #endif break; case 10: // A10 resume sd print #if ENABLED(SDSUPPORT) - if (ExtUI::isPrintingFromMediaPaused()) { + if (ExtUI::isPrintingFromMediaPaused()) ResumePrint(); - } + #endif break; @@ -685,39 +687,40 @@ void AnycubicTFTClass::GetCommandFromTFT() { break; case 13: // A13 SELECTION FILE - #if ENABLED(SDSUPPORT) + #if ENABLED(SDSUPPORT) if (ExtUI::isMediaInserted()) { - starpos = (strchr(TFTstrchr_pointer + 4,'*')); + starpos = (strchr(TFTstrchr_pointer + 4, '*')); if (TFTstrchr_pointer[4] == '/') { - strcpy(SelectedDirectory, TFTstrchr_pointer+5); + strcpy(SelectedDirectory, TFTstrchr_pointer + 5); SelectedFile[0] = 0; ANYCUBIC_SENDCOMMAND_DBG_PGM("J21", "TFT Serial Debug: Clear file selection... J21 "); // J21 Not File Selected ANYCUBIC_SERIAL_ENTER(); - } else if (TFTstrchr_pointer[4] == '<') { - strcpy(SelectedDirectory, TFTstrchr_pointer+4); + } + else if (TFTstrchr_pointer[4] == '<') { + strcpy(SelectedDirectory, TFTstrchr_pointer + 4); SpecialMenu = true; SelectedFile[0] = 0; ANYCUBIC_SENDCOMMAND_DBG_PGM("J21", "TFT Serial Debug: Clear file selection... J21 "); // J21 Not File Selected ANYCUBIC_SERIAL_ENTER(); - } else { - SelectedDirectory[0]=0; + } + else { + SelectedDirectory[0] = 0; - if (starpos!=NULL) { - *(starpos-1)='\0'; - } + if (starpos != NULL) + *(starpos - 1) = '\0'; - strcpy(SelectedFile, TFTstrchr_pointer+4); + strcpy(SelectedFile, TFTstrchr_pointer + 4); ANYCUBIC_SENDCOMMAND_DBG_PGM_VAL("J20", "TFT Serial Debug: File Selected... J20 ", SelectedFile); // J20 File Selected } } - #endif + #endif break; - + case 14: // A14 START PRINTING #if ENABLED(SDSUPPORT) - if (!ExtUI::isPrinting() && strlen(SelectedFile) > 0) { + if (!ExtUI::isPrinting() && strlen(SelectedFile) > 0) StartPrint(); - } + #endif break; @@ -725,48 +728,47 @@ void AnycubicTFTClass::GetCommandFromTFT() { // TODO: JBA implement resume form outage break; - case 16: // A16 set hotend temp - { - unsigned int tempvalue; - if (CodeSeen('S')) { - tempvalue=constrain(CodeValue(), 0, 275); - ExtUI::setTargetTemp_celsius(tempvalue, (ExtUI::extruder_t) ExtUI::E0); - } - else if (CodeSeen('C') && !ExtUI::isPrinting()) { - if (ExtUI::getAxisPosition_mm(ExtUI::Z) < 10) { - ExtUI::injectCommands_P(PSTR("G1 Z10")); //RASE Z AXIS - } - tempvalue=constrain(CodeValue(), 0 ,275); - ExtUI::setTargetTemp_celsius(tempvalue, (ExtUI::extruder_t) ExtUI::E0); - } + case 16: { // A16 set hotend temp + unsigned int tempvalue; + if (CodeSeen('S')) { + tempvalue = constrain(CodeValue(), 0, 275); + ExtUI::setTargetTemp_celsius(tempvalue, (ExtUI::extruder_t) ExtUI::E0); } - break; + else if (CodeSeen('C') && !ExtUI::isPrinting()) { + if (ExtUI::getAxisPosition_mm(ExtUI::Z) < 10) + ExtUI::injectCommands_P(PSTR("G1 Z10")); // RASE Z AXIS + tempvalue = constrain(CodeValue(), 0, 275); + ExtUI::setTargetTemp_celsius(tempvalue, (ExtUI::extruder_t) ExtUI::E0); + } + } + break; case 17:// A17 set heated bed temp - { - unsigned int tempbed; - if (CodeSeen('S')) { - tempbed = constrain(CodeValue(), 0, 100); - ExtUI::setTargetTemp_celsius(tempbed, (ExtUI::heater_t)ExtUI::BED); - } + { + unsigned int tempbed; + if (CodeSeen('S')) { + tempbed = constrain(CodeValue(), 0, 100); + ExtUI::setTargetTemp_celsius(tempbed, (ExtUI::heater_t)ExtUI::BED); } - break; - + } + break; + case 18:// A18 set fan speed - { - float fanPercent; - if (CodeSeen('S')) { - fanPercent = CodeValue(); - fanPercent = constrain(fanPercent, 0, 100); - ExtUI::setTargetFan_percent(fanPercent, ExtUI::FAN0); - } else { - fanPercent = 100; - } + { + float fanPercent; + if (CodeSeen('S')) { + fanPercent = CodeValue(); + fanPercent = constrain(fanPercent, 0, 100); ExtUI::setTargetFan_percent(fanPercent, ExtUI::FAN0); - - ANYCUBIC_SERIAL_ENTER(); } - break; + else { + fanPercent = 100; + } + ExtUI::setTargetFan_percent(fanPercent, ExtUI::FAN0); + + ANYCUBIC_SERIAL_ENTER(); + } + break; case 19: // A19 stop stepper drivers - sent on stop extrude command and on turn motors off command if (!ExtUI::isPrinting()) { @@ -776,32 +778,26 @@ void AnycubicTFTClass::GetCommandFromTFT() { ANYCUBIC_SERIAL_ENTER(); break; - - case 20:// A20 read printing speed - { - int16_t feedrate_percentage = 100; - if (CodeSeen('S')) { - feedrate_percentage=constrain(CodeValue(),40,999); - } - else { - ANYCUBIC_SENDCOMMANDPGM_VAL("A20V ", feedrate_percentage); - } - } + case 20: { // A20 read printing speed + int16_t feedrate_percentage = 100; + + if (CodeSeen('S')) + feedrate_percentage = constrain(CodeValue(), 40, 999); + else + ANYCUBIC_SENDCOMMANDPGM_VAL("A20V ", feedrate_percentage); + } break; - + case 21: // A21 all home if (!ExtUI::isPrinting() && !ExtUI::isPrintingFromMediaPaused()) { if (CodeSeen('X') || CodeSeen('Y') || CodeSeen('Z')) { - if (CodeSeen('X')) { + if (CodeSeen('X')) ExtUI::injectCommands_P(PSTR("G28 X")); - } - if (CodeSeen('Y')) { + if (CodeSeen('Y')) ExtUI::injectCommands_P(PSTR("G28 Y")); - } - if (CodeSeen('Z')) { + if (CodeSeen('Z')) ExtUI::injectCommands_P(PSTR("G28 Z")); - } } else if (CodeSeen('C')) { ExtUI::injectCommands_P(PSTR("G28")); @@ -815,50 +811,46 @@ void AnycubicTFTClass::GetCommandFromTFT() { unsigned int movespeed = 0; char commandStr[30]; char fullCommandStr[38]; - - commandStr[0] = 0; // empty string - if (CodeSeen('F')) { // Set feedrate + + commandStr[0] = 0; // empty string + if (CodeSeen('F')) // Set feedrate movespeed = CodeValue(); - } - - if (CodeSeen('X')) { // Move in X direction + + if (CodeSeen('X')) { // Move in X direction coorvalue = CodeValue(); - if ((coorvalue <= 0.2) && coorvalue > 0) { + if ((coorvalue <= 0.2) && coorvalue > 0) sprintf_P(commandStr, PSTR("G1 X0.1F%i"), movespeed); - } else if ((coorvalue <= -0.1) && coorvalue > -1) { + else if ((coorvalue <= -0.1) && coorvalue > -1) sprintf_P(commandStr, PSTR("G1 X-0.1F%i"), movespeed); - } else { + else sprintf_P(commandStr, PSTR("G1 X%iF%i"), int(coorvalue), movespeed); - } - } else if (CodeSeen('Y')) { // Move in Y direction + } + else if (CodeSeen('Y')) { // Move in Y direction coorvalue = CodeValue(); - if ((coorvalue <= 0.2) && coorvalue > 0) { + if ((coorvalue <= 0.2) && coorvalue > 0) sprintf_P(commandStr, PSTR("G1 Y0.1F%i"), movespeed); - } else if ((coorvalue <= -0.1) && coorvalue > -1) { + else if ((coorvalue <= -0.1) && coorvalue > -1) sprintf_P(commandStr, PSTR("G1 Y-0.1F%i"), movespeed); - } else { + else sprintf_P(commandStr, PSTR("G1 Y%iF%i"), int(coorvalue), movespeed); - } - } else if (CodeSeen('Z')) { // Move in Z direction + } + else if (CodeSeen('Z')) { // Move in Z direction coorvalue = CodeValue(); - if ((coorvalue <= 0.2) && coorvalue > 0) { + if ((coorvalue <= 0.2) && coorvalue > 0) sprintf_P(commandStr, PSTR("G1 Z0.1F%i"), movespeed); - } else if ((coorvalue <= -0.1) && coorvalue > -1) { + else if ((coorvalue <= -0.1) && coorvalue > -1) sprintf_P(commandStr, PSTR("G1 Z-0.1F%i"), movespeed); - } else { + else sprintf_P(commandStr, PSTR("G1 Z%iF%i"), int(coorvalue), movespeed); - } } - else if (CodeSeen('E')) // Extrude - { + else if (CodeSeen('E')) { // Extrude coorvalue = CodeValue(); - if ((coorvalue <= 0.2) && coorvalue > 0) { + if ((coorvalue <= 0.2) && coorvalue > 0) sprintf_P(commandStr, PSTR("G1 E0.1F%i"), movespeed); - } else if ((coorvalue <= -0.1) && coorvalue > -1) { + else if ((coorvalue <= -0.1) && coorvalue > -1) sprintf_P(commandStr, PSTR("G1 E-0.1F%i"), movespeed); - } else { - sprintf_P(commandStr, PSTR("G1 E%iF500"), int(coorvalue)); - } + else + sprintf_P(commandStr, PSTR("G1 E%iF500"), int(coorvalue)); } if (strlen(commandStr) > 0) { @@ -875,10 +867,9 @@ void AnycubicTFTClass::GetCommandFromTFT() { case 23: // A23 preheat pla if (!ExtUI::isPrinting()) { - if (ExtUI::getAxisPosition_mm(ExtUI::Z) < 10) { - ExtUI::injectCommands_P(PSTR("G1 Z10")); //RASE Z AXIS - } - + if (ExtUI::getAxisPosition_mm(ExtUI::Z) < 10) + ExtUI::injectCommands_P(PSTR("G1 Z10")); // RASE Z AXIS + ExtUI::setTargetTemp_celsius(PREHEAT_1_TEMP_BED, (ExtUI::heater_t) ExtUI::BED); ExtUI::setTargetTemp_celsius(PREHEAT_1_TEMP_HOTEND, (ExtUI::extruder_t) ExtUI::E0); ANYCUBIC_SERIAL_SUCC_START; @@ -888,10 +879,9 @@ void AnycubicTFTClass::GetCommandFromTFT() { case 24:// A24 preheat abs if (!ExtUI::isPrinting()) { - if (ExtUI::getAxisPosition_mm(ExtUI::Z) < 10) { - ExtUI::injectCommands_P(PSTR("G1 Z10")); //RASE Z AXIS - } - + if (ExtUI::getAxisPosition_mm(ExtUI::Z) < 10) + ExtUI::injectCommands_P(PSTR("G1 Z10")); // RASE Z AXIS + ExtUI::setTargetTemp_celsius(PREHEAT_2_TEMP_BED, (ExtUI::heater_t) ExtUI::BED); ExtUI::setTargetTemp_celsius(PREHEAT_2_TEMP_HOTEND, (ExtUI::extruder_t) ExtUI::E0); ANYCUBIC_SERIAL_SUCC_START; @@ -911,37 +901,36 @@ void AnycubicTFTClass::GetCommandFromTFT() { case 26: // A26 refresh SD #if ENABLED(SDSUPPORT) if (ExtUI::isMediaInserted()) { - if (strlen(SelectedDirectory) > 0) { + if (strlen(SelectedDirectory) > 0) { ExtUI::FileList currentFileList; if ((SelectedDirectory[0] == '.') && (SelectedDirectory[1] == '.')) { currentFileList.upDir(); - } else { - if (SelectedDirectory[0] == '<') { + } + else { + if (SelectedDirectory[0] == '<') HandleSpecialMenu(); - } else { + else currentFileList.changeDir(SelectedDirectory); - } } } - } else { + } + else { ANYCUBIC_SENDCOMMAND_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to refresh SD A26... J02"); } - SelectedDirectory[0]=0; + SelectedDirectory[0] = 0; #endif break; - #if ENABLED(SERVO_ENDSTOPS) - case 27: // A27 servos angles adjust - break; - #endif + #if ENABLED(SERVO_ENDSTOPS) + case 27: break; // A27 servos angles adjust + #endif case 28: // A28 filament test - if (CodeSeen('O')) { + if (CodeSeen('O')) NOOP; - } else if (CodeSeen('C')) { + else if (CodeSeen('C')) NOOP; - } ANYCUBIC_SERIAL_ENTER(); break; @@ -951,15 +940,16 @@ void AnycubicTFTClass::GetCommandFromTFT() { ANYCUBIC_SERIAL_ENTER(); break; - default: + default: break; } } - TFTbufindw = (TFTbufindw + 1)%TFTBUFSIZE; + TFTbufindw = (TFTbufindw + 1) % TFTBUFSIZE; TFTbuflen += 1; - serial3_count = 0; //clear buffer - } else { + serial3_count = 0; // clear buffer + } + else { TFTcmdbuffer[TFTbufindw][serial3_count++] = serial3_char; } } @@ -968,11 +958,11 @@ void AnycubicTFTClass::GetCommandFromTFT() { void AnycubicTFTClass::DoSDCardStateCheck() { #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT) bool isInserted = ExtUI::isMediaInserted(); - if (isInserted) { + if (isInserted) ANYCUBIC_SENDCOMMAND_DBG_PGM("J00", "TFT Serial Debug: SD card state changed... isInserted"); - } else { + else ANYCUBIC_SENDCOMMAND_DBG_PGM("J01", "TFT Serial Debug: SD card state changed... !isInserted"); - } + #endif } @@ -984,10 +974,11 @@ void AnycubicTFTClass::DoFilamentRunoutCheck() { if (mediaPrintingState == AMPRINTSTATE_PRINTING || mediaPrintingState == AMPRINTSTATE_PAUSED || mediaPrintingState == AMPRINTSTATE_PAUSE_REQUESTED) { // play tone to indicate filament is out ExtUI::injectCommands_P(PSTR("\nM300 P200 S1567\nM300 P200 S1174\nM300 P200 S1567\nM300 P200 S1174\nM300 P2000 S1567")); - - // tell the user that the filament has run out and wait + + // tell the user that the filament has run out and wait ANYCUBIC_SENDCOMMAND_DBG_PGM("J23", "TFT Serial Debug: Blocking filament prompt... J23"); - } else { + } + else { ANYCUBIC_SENDCOMMAND_DBG_PGM("J15", "TFT Serial Debug: Non blocking filament runout... J15"); } } @@ -1004,7 +995,7 @@ void AnycubicTFTClass::StartPrint() { SERIAL_ECHOLN(SelectedFile); #endif mediaPrintingState = AMPRINTSTATE_PRINTING; - mediaPauseState = AMPAUSESTATE_NOT_PAUSED; + mediaPauseState = AMPAUSESTATE_NOT_PAUSED; ExtUI::printFile(SelectedFile); } #endif // SDUPPORT @@ -1014,14 +1005,14 @@ void AnycubicTFTClass::PausePrint() { #if ENABLED(SDSUPPORT) if (ExtUI::isPrintingFromMedia() && mediaPrintingState != AMPRINTSTATE_STOP_REQUESTED && mediaPauseState == AMPAUSESTATE_NOT_PAUSED) { mediaPrintingState = AMPRINTSTATE_PAUSE_REQUESTED; - mediaPauseState = AMPAUSESTATE_NOT_PAUSED; // need the userconfirm method to update pause state + mediaPauseState = AMPAUSESTATE_NOT_PAUSED; // need the userconfirm method to update pause state ANYCUBIC_SENDCOMMAND_DBG_PGM("J05", "TFT Serial Debug: SD print pause started... J05"); // J05 printing pause // for some reason pausing the print doesn't retract the extruder so force a manual one here ExtUI::injectCommands_P(PSTR("G91\nG1 E-2 F1800\nG90")); ExtUI::pausePrint(); } - #endif // SDSUPPORT + #endif } void AnycubicTFTClass::ResumePrint() { @@ -1031,7 +1022,7 @@ void AnycubicTFTClass::ResumePrint() { #if ENABLED(ANYCUBIC_TFT_DEBUG) SERIAL_ECHOLNPGM("TFT Serial Debug: Resume Print with filament sensor still tripped... "); #endif - + // trigger the user message box DoFilamentRunoutCheck(); @@ -1040,18 +1031,19 @@ void AnycubicTFTClass::ResumePrint() { return; } #endif - + if (mediaPauseState == AMPAUSESTATE_HEATER_TIMEOUT) { mediaPauseState = AMPAUSESTATE_REHEATING; // TODO: JBA I don't think J05 just disables the continue button, i think it injects a rogue M25. So taking this out - // // disable the continue button + // // disable the continue button // ANYCUBIC_SENDCOMMAND_DBG_PGM("J05", "TFT Serial Debug: Resume called with heater timeout... J05"); // J05 printing pause - + // reheat the nozzle ExtUI::setUserConfirmed(); - } else { + } + else { mediaPrintingState = AMPRINTSTATE_PRINTING; - mediaPauseState = AMPAUSESTATE_NOT_PAUSED; + mediaPauseState = AMPAUSESTATE_NOT_PAUSED; ANYCUBIC_SENDCOMMAND_DBG_PGM("J04", "TFT Serial Debug: SD print resumed... J04"); // J04 printing form sd card now ExtUI::resumePrint(); @@ -1062,14 +1054,13 @@ void AnycubicTFTClass::ResumePrint() { void AnycubicTFTClass::StopPrint() { #if ENABLED(SDSUPPORT) mediaPrintingState = AMPRINTSTATE_STOP_REQUESTED; - mediaPauseState = AMPAUSESTATE_NOT_PAUSED; + mediaPauseState = AMPAUSESTATE_NOT_PAUSED; ANYCUBIC_SENDCOMMAND_DBG_PGM("J16", "TFT Serial Debug: SD print stop called... J16"); - + // for some reason stopping the print doesn't retract the extruder so force a manual one here - ExtUI::injectCommands_P(PSTR("G91\nG1 E-2 F1800\nG90")); + ExtUI::injectCommands_P(PSTR("G91\nG1 E-2 F1800\nG90")); ExtUI::stopPrint(); - #endif // SDSUPPORT + #endif } -AnycubicTFTClass AnycubicTFT; #endif // ANYCUBIC_TFT_MODEL diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.cpp b/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.cpp index dd12147c307a..3fad103bb415 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.cpp @@ -1,5 +1,5 @@ /* - AnycubicSerial.cpp --- Support for Anycubic i3 Mega TFT serial connection + anycubic_serial.cpp --- Support for Anycubic i3 Mega TFT serial connection Created by Christian Hopp on 09.12.17. Original file: @@ -25,23 +25,24 @@ Modified 14 August 2012 by Alarus */ -#include -#include -#include -#include -#include "Arduino.h" -#include "wiring_private.h" -#include "../../../../MarlinCore.h" +#include "../../../../inc/MarlinConfig.h" +#if ENABLED(ANYCUBIC_TFT_MODEL) -#ifdef ANYCUBIC_TFT_MODEL +#include "Arduino.h" // this next line disables the entire HardwareSerial.cpp, -// this is so I can support Attiny series and any other chip without a uart -#if defined(UBRR3H) +// so I can support AtTiny series and other chips without a UART +#ifdef UBRR3H #include "anycubic_serial.h" +#include +#include +#include +#include +#include "wiring_private.h" + // Define constants and variables for buffering incoming serial data. We're // using a ring buffer (I think), in which head is the index of the location // to which to write the next incoming character and tail is the index of the @@ -52,20 +53,18 @@ #define SERIAL_BUFFER_SIZE 128 #endif -struct ring_buffer -{ +struct ring_buffer { unsigned char buffer[SERIAL_BUFFER_SIZE]; volatile unsigned int head; volatile unsigned int tail; }; -#if defined(UBRR3H) +#ifdef UBRR3H ring_buffer rx_buffer_ajg = { { 0 }, 0, 0 }; ring_buffer tx_buffer_ajg = { { 0 }, 0, 0 }; #endif -inline void store_char(unsigned char c, ring_buffer *buffer) -{ +inline void store_char(unsigned char c, ring_buffer *buffer) { int i = (unsigned int)(buffer->head + 1) % SERIAL_BUFFER_SIZE; // if we should be storing the received character into the location @@ -82,34 +81,34 @@ inline void store_char(unsigned char c, ring_buffer *buffer) void serialEvent3() __attribute__((weak)); void serialEvent3() {} #define serialEvent3_implemented - ISR(USART3_RX_vect) - { + ISR(USART3_RX_vect) { if (bit_is_clear(UCSR3A, UPE3)) { unsigned char c = UDR3; store_char(c, &rx_buffer_ajg); - } else { + } + else { unsigned char c = UDR3; - }; + } } #endif #ifdef USART3_UDRE_vect -ISR(USART3_UDRE_vect) -{ - if (tx_buffer_ajg.head == tx_buffer_ajg.tail) { - // Buffer empty, so disable interrupts - cbi(UCSR3B, UDRIE3); - } - else { - // There is more data in the output buffer. Send the next byte - unsigned char c = tx_buffer_ajg.buffer[tx_buffer_ajg.tail]; - tx_buffer_ajg.tail = (tx_buffer_ajg.tail + 1) % SERIAL_BUFFER_SIZE; - UDR3 = c; + ISR(USART3_UDRE_vect) { + if (tx_buffer_ajg.head == tx_buffer_ajg.tail) { + // Buffer empty, so disable interrupts + cbi(UCSR3B, UDRIE3); + } + else { + // There is more data in the output buffer. Send the next byte + unsigned char c = tx_buffer_ajg.buffer[tx_buffer_ajg.tail]; + tx_buffer_ajg.tail = (tx_buffer_ajg.tail + 1) % SERIAL_BUFFER_SIZE; + + UDR3 = c; + } } -} -#endif +#endif // Constructors //////////////////////////////////////////////////////////////// @@ -117,8 +116,8 @@ AnycubicSerialClass::AnycubicSerialClass(ring_buffer *rx_buffer, ring_buffer *tx volatile uint8_t *ubrrh, volatile uint8_t *ubrrl, volatile uint8_t *ucsra, volatile uint8_t *ucsrb, volatile uint8_t *ucsrc, volatile uint8_t *udr, - uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udrie, uint8_t u2x) -{ + uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udrie, uint8_t u2x +) { _rx_buffer = rx_buffer; _tx_buffer = tx_buffer; _ubrrh = ubrrh; @@ -136,19 +135,16 @@ AnycubicSerialClass::AnycubicSerialClass(ring_buffer *rx_buffer, ring_buffer *tx // Public Methods ////////////////////////////////////////////////////////////// -void AnycubicSerialClass::begin(unsigned long baud) -{ +void AnycubicSerialClass::begin(unsigned long baud) { uint16_t baud_setting; bool use_u2x = true; -#if F_CPU == 16000000UL - // hardcoded exception for compatibility with the bootloader shipped - // with the Duemilanove and previous boards and the firmware on the 8U2 - // on the Uno and Mega 2560. - if (baud == 57600) { - use_u2x = false; - } -#endif + #if F_CPU == 16000000UL + // hardcoded exception for compatibility with the bootloader shipped + // with the Duemilanove and previous boards and the firmware on the 8U2 + // on the Uno and Mega 2560. + if (baud == 57600) use_u2x = false; + #endif try_again: @@ -160,8 +156,7 @@ void AnycubicSerialClass::begin(unsigned long baud) baud_setting = (F_CPU / 8 / baud - 1) / 2; } - if ((baud_setting > 4095) && use_u2x) - { + if ((baud_setting > 4095) && use_u2x) { use_u2x = false; goto try_again; } @@ -178,33 +173,30 @@ void AnycubicSerialClass::begin(unsigned long baud) cbi(*_ucsrb, _udrie); } -void AnycubicSerialClass::begin(unsigned long baud, byte config) -{ +void AnycubicSerialClass::begin(unsigned long baud, byte config) { uint16_t baud_setting; uint8_t current_config; bool use_u2x = true; -#if F_CPU == 16000000UL - // hardcoded exception for compatibility with the bootloader shipped - // with the Duemilanove and previous boards and the firmware on the 8U2 - // on the Uno and Mega 2560. - if (baud == 57600) { - use_u2x = false; - } -#endif + #if F_CPU == 16000000UL + // hardcoded exception for compatibility with the bootloader shipped + // with the Duemilanove and previous boards and the firmware on the 8U2 + // on the Uno and Mega 2560. + if (baud == 57600) use_u2x = false; + #endif try_again: if (use_u2x) { *_ucsra = 1 << _u2x; baud_setting = (F_CPU / 4 / baud - 1) / 2; - } else { + } + else { *_ucsra = 0; baud_setting = (F_CPU / 8 / baud - 1) / 2; } - if ((baud_setting > 4095) && use_u2x) - { + if ((baud_setting > 4095) && use_u2x) { use_u2x = false; goto try_again; } @@ -214,9 +206,9 @@ void AnycubicSerialClass::begin(unsigned long baud, byte config) *_ubrrl = baud_setting; //set the data bits, parity, and stop bits -#if defined(__AVR_ATmega8__) - config |= 0x80; // select UCSRC register (shared with UBRRH) -#endif + #ifdef __AVR_ATmega8__ + config |= 0x80; // select UCSRC register (shared with UBRRH) + #endif *_ucsrc = config; sbi(*_ucsrb, _rxen); @@ -225,8 +217,7 @@ void AnycubicSerialClass::begin(unsigned long baud, byte config) cbi(*_ucsrb, _udrie); } -void AnycubicSerialClass::end() -{ +void AnycubicSerialClass::end() { // wait for transmission of outgoing data while (_tx_buffer->head != _tx_buffer->tail) ; @@ -240,13 +231,11 @@ void AnycubicSerialClass::end() _rx_buffer->head = _rx_buffer->tail; } -int AnycubicSerialClass::available(void) -{ +int AnycubicSerialClass::available(void) { return (int)(SERIAL_BUFFER_SIZE + _rx_buffer->head - _rx_buffer->tail) % SERIAL_BUFFER_SIZE; } -int AnycubicSerialClass::peek(void) -{ +int AnycubicSerialClass::peek(void) { if (_rx_buffer->head == _rx_buffer->tail) { return -1; } else { @@ -254,8 +243,7 @@ int AnycubicSerialClass::peek(void) } } -int AnycubicSerialClass::read(void) -{ +int AnycubicSerialClass::read(void) { // if the head isn't ahead of the tail, we don't have any characters if (_rx_buffer->head == _rx_buffer->tail) { return -1; @@ -266,15 +254,13 @@ int AnycubicSerialClass::read(void) } } -void AnycubicSerialClass::flush() -{ +void AnycubicSerialClass::flush() { // UDR is kept full while the buffer is not empty, so TXC triggers when EMPTY && SENT while (transmitting && ! (*_ucsra & _BV(TXC0))); transmitting = false; } -size_t AnycubicSerialClass::write(uint8_t c) -{ +size_t AnycubicSerialClass::write(uint8_t c) { int i = (_tx_buffer->head + 1) % SERIAL_BUFFER_SIZE; // If the output buffer is full, there's nothing for it other than to @@ -300,10 +286,9 @@ AnycubicSerialClass::operator bool() { // Preinstantiate Objects ////////////////////////////////////////////////////// -#if defined(UBRR3H) +#ifdef UBRR3H AnycubicSerialClass AnycubicSerial(&rx_buffer_ajg, &tx_buffer_ajg, &UBRR3H, &UBRR3L, &UCSR3A, &UCSR3B, &UCSR3C, &UDR3, RXEN3, TXEN3, RXCIE3, UDRIE3, U2X3); #endif -#endif - -#endif // whole file +#endif // UBRR3H +#endif // ANYCUBIC_TFT_MODEL diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.h b/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.h index 28cdbc6b52d6..e7494d38adaf 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.h +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_serial.h @@ -1,7 +1,7 @@ /* - AnycubicSerial.h --- Support for Anycubic i3 Mega TFT serial connection + anycubic_serial.h --- Support for Anycubic i3 Mega TFT serial connection Created by Christian Hopp on 09.12.17. - + Original file: HardwareSerial.h - Hardware serial library for Wiring @@ -24,21 +24,18 @@ Modified 28 September 2010 by Mark Sproul Modified 14 August 2012 by Alarus */ - -#ifndef AnycubicSerial_h -#define AnycubicSerial_h +#pragma once #include #include #include "Stream.h" -#define FORCE_INLINE __attribute__((always_inline)) inline +#define FORCE_INLINE __attribute__((always_inline)) inline struct ring_buffer; -class AnycubicSerialClass : public Stream -{ +class AnycubicSerialClass : public Stream { private: ring_buffer *_rx_buffer; ring_buffer *_tx_buffer; @@ -59,7 +56,8 @@ class AnycubicSerialClass : public Stream volatile uint8_t *ubrrh, volatile uint8_t *ubrrl, volatile uint8_t *ucsra, volatile uint8_t *ucsrb, volatile uint8_t *ucsrc, volatile uint8_t *udr, - uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udrie, uint8_t u2x); + uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udrie, uint8_t u2x + ); void begin(unsigned long); void begin(unsigned long, uint8_t); void end(); @@ -102,10 +100,6 @@ class AnycubicSerialClass : public Stream #define SERIAL_7O2 0x3C #define SERIAL_8O2 0x3E -#if defined(UBRR3H) - extern AnycubicSerialClass AnycubicSerial; -#endif - extern void serialEventRun(void) __attribute__((weak)); #define ANYCUBIC_SERIAL_PROTOCOL(x) (AnycubicSerial.print(x)) @@ -120,8 +114,8 @@ extern void serialEventRun(void) __attribute__((weak)); #define ANYCUBIC_SERIAL_ENTER() (AnycubicSerial.write('\r'),AnycubicSerial.write('\n')) #define ANYCUBIC_SERIAL_SPACE() (AnycubicSerial.write(' ')) -const char newErr[] PROGMEM ="ERR "; -const char newSucc[] PROGMEM ="OK"; +const char newErr[] PROGMEM = "ERR "; +const char newSucc[] PROGMEM = "OK"; #define ANYCUBIC_SERIAL_ERROR_START (AnycubicSerialprintPGM(newErr)) #define ANYCUBIC_SERIAL_ERROR(x) ANYCUBIC_SERIAL_PROTOCOL(x) @@ -136,14 +130,14 @@ const char newSucc[] PROGMEM ="OK"; #define ANYCUBIC_SERIAL_ECHOPGM(x) ANYCUBIC_SERIAL_PROTOCOLPGM(x) #define ANYCUBIC_SERIAL_ECHO(x) ANYCUBIC_SERIAL_PROTOCOL(x) -FORCE_INLINE void AnycubicSerialprintPGM(const char *str) -{ +FORCE_INLINE void AnycubicSerialprintPGM(const char *str) { char ch=pgm_read_byte(str); - while(ch) - { + while (ch) { AnycubicSerial.write(ch); ch=pgm_read_byte(++str); } } +#ifdef UBRR3H + extern AnycubicSerialClass AnycubicSerial; #endif diff --git a/Marlin/src/lcd/extui_anycubic_tft.cpp b/Marlin/src/lcd/extui_anycubic_tft.cpp index 470cd37f6368..3fa609d54656 100644 --- a/Marlin/src/lcd/extui_anycubic_tft.cpp +++ b/Marlin/src/lcd/extui_anycubic_tft.cpp @@ -1,23 +1,28 @@ -/********************* - * extui_anycubic_tftexample.cpp * - *********************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * To view a copy of the GNU General Public License, go to the following * - * location: . * - ****************************************************************************/ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +/** + * extui_anycubic_tft.cpp + */ #include "../inc/MarlinConfigPre.h" @@ -29,55 +34,23 @@ #include // for the ::tone() call namespace ExtUI { - void onStartup() { - AnycubicTFT.OnSetup(); - } - - void onIdle() { - AnycubicTFT.OnCommandScan(); - } - - void onPrinterKilled(PGM_P const error, PGM_P const component) { - AnycubicTFT.OnKillTFT(); - } - - void onMediaInserted() { - AnycubicTFT.OnSDCardStateChange(true); - }; - - void onMediaError() { - AnycubicTFT.OnSDCardError(); - }; - - void onMediaRemoved() { - AnycubicTFT.OnSDCardStateChange(false); - }; + void onStartup() { AnycubicTFT.OnSetup(); } + void onIdle() { AnycubicTFT.OnCommandScan(); } + void onPrinterKilled(PGM_P const error, PGM_P const component) { AnycubicTFT.OnKillTFT(); } + void onMediaInserted() { AnycubicTFT.OnSDCardStateChange(true); } + void onMediaError() { AnycubicTFT.OnSDCardError(); } + void onMediaRemoved() { AnycubicTFT.OnSDCardStateChange(false); } void onPlayTone(const uint16_t frequency, const uint16_t duration) { #if ENABLED(SPEAKER) ::tone(BEEPER_PIN, frequency, duration); #endif } - void onPrintTimerStarted() { - AnycubicTFT.OnPrintTimerStarted(); - } - - void onPrintTimerPaused() { - AnycubicTFT.OnPrintTimerPaused(); - } - - void onPrintTimerStopped() { - AnycubicTFT.OnPrintTimerStopped(); - } - - void onFilamentRunout(const extruder_t extruder) { - AnycubicTFT.OnFilamentRunout(); - } - - void onUserConfirmRequired(const char * const msg) { - AnycubicTFT.OnUserConfirmRequired(msg); - } - + void onPrintTimerStarted() { AnycubicTFT.OnPrintTimerStarted(); } + void onPrintTimerPaused() { AnycubicTFT.OnPrintTimerPaused(); } + void onPrintTimerStopped() { AnycubicTFT.OnPrintTimerStopped(); } + void onFilamentRunout(const extruder_t extruder) { AnycubicTFT.OnFilamentRunout(); } + void onUserConfirmRequired(const char * const msg) { AnycubicTFT.OnUserConfirmRequired(msg); } void onStatusChanged(const char * const msg) {} void onFactoryReset() {} @@ -128,6 +101,4 @@ namespace ExtUI { #endif } -#endif // EANYCUBIC_TFT_MODEL && EXTENSIBLE_UI - - +#endif // ANYCUBIC_TFT_MODEL && EXTENSIBLE_UI diff --git a/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h b/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h index 41fd19baae53..ce3160ffe93e 100644 --- a/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h +++ b/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h @@ -38,15 +38,38 @@ #endif // -// Custom Limit Switches +// Limit Switches // //#define ANYCUBIC_4_MAX_PRO_ENDSTOPS + +#define X_MIN_PIN 3 + #if ENABLED(ANYCUBIC_4_MAX_PRO_ENDSTOPS) #define X_MAX_PIN 43 - #define Y_MIN_PIN 19 +#else + #define X_MAX_PIN 43 +#endif + +#if ENABLED(ANYCUBIC_4_MAX_PRO_ENDSTOPS) + #define Y_STOP_PIN 19 +#else + #define Y_STOP_PIN 42 #endif -// Labeled pins +#define Z_STOP_PIN 18 + +// +// Z Probe (when not Z_MIN_PIN) +// +#define Z_MIN_PROBE_PIN 2 + +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 19 +#endif + +// +// Heaters / Fans +// #define TG_HEATER_BED_PIN 8 #define TG_HEATER_0_PIN 10 #define TG_HEATER_1_PIN 45 // Anycubic Kossel: Unused @@ -54,28 +77,11 @@ #define TG_FAN0_PIN 9 // Anycubic Kossel: Usually the part cooling fan #define TG_FAN1_PIN 7 // Anycubic Kossel: Unused #define TG_FAN2_PIN 44 // Anycubic Kossel: Hotend fan -#define CONTROLLER_FAN_PIN TG_FAN1_PIN -//#define BUZZER 31 + +#define CONTROLLER_FAN_PIN TG_FAN1_PIN + #define BEEPER_PIN 31 -#define SDSS 53 -#define LED_PIN 13 #define SD_DETECT_PIN 49 -#define FIL_RUNOUT_PIN 19 - -// fix the limit pins that are wrong in pins_Ramps.h -// -// Limit Switches -// -#define X_MIN_PIN 3 -#define X_MAX_PIN 43 -#define Y_MIN_PIN 42 -#define Y_MAX_PIN -1 -#define Z_MIN_PIN 18 -#define Z_MAX_PIN -1 -// -// Z Probe (when not Z_MIN_PIN) -// -#define Z_MIN_PROBE_PIN 2 // Remap MOSFET pins to common usages: From b8570a9611c39a7bd433ce68323b5d64ecb66a54 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 14 Jul 2020 22:41:47 -0500 Subject: [PATCH 30/31] Rename (1) --- .../{anycubic_TFT.cpp => _anycubic_tft.cpp} | 38 ++++++------- .../{anycubic_TFT.h => _anycubic_tft.h} | 54 +++++++++---------- 2 files changed, 44 insertions(+), 48 deletions(-) rename Marlin/src/lcd/extui/lib/anycubic/{anycubic_TFT.cpp => _anycubic_tft.cpp} (97%) rename Marlin/src/lcd/extui/lib/anycubic/{anycubic_TFT.h => _anycubic_tft.h} (72%) diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp b/Marlin/src/lcd/extui/lib/anycubic/_anycubic_tft.cpp similarity index 97% rename from Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp rename to Marlin/src/lcd/extui/lib/anycubic/_anycubic_tft.cpp index fcc2a5f4aba8..a775ef6b67af 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic/_anycubic_tft.cpp @@ -1,22 +1,22 @@ -/* - AnycubicTFT.cpp --- Support for Anycubic i3 Mega TFT - Created by Christian Hopp on 09.12.17. - Improved by David Ramiro - Converted to ext_iu by John BouAntoun 21 June 2020 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +/** + * anycubic_tft.cpp --- Support for Anycubic i3 Mega TFT + * Created by Christian Hopp on 09.12.17. + * Improved by David Ramiro + * Converted to ext_iu by John BouAntoun 21 June 2020 + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "../../../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h b/Marlin/src/lcd/extui/lib/anycubic/_anycubic_tft.h similarity index 72% rename from Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h rename to Marlin/src/lcd/extui/lib/anycubic/_anycubic_tft.h index 826db0528bd5..324dfd213f47 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/anycubic_TFT.h +++ b/Marlin/src/lcd/extui/lib/anycubic/_anycubic_tft.h @@ -1,29 +1,27 @@ -/* - AnycubicTFT.h --- Support for Anycubic i3 Mega TFT - Created by Christian Hopp on 09.12.17. - Improved by David Ramiro - Converted to ext_iu by John BouAntoun 21 June 2020 - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ +/** + * anycubic_tft.h --- Support for Anycubic i3 Mega TFT + * Created by Christian Hopp on 09.12.17. + * Improved by David Ramiro + * Converted to ext_iu by John BouAntoun 21 June 2020 + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#pragma once #include "../../../../inc/MarlinConfigPre.h" #include "../../../../sd/SdFatConfig.h" // for the FILENAME_LENGTH macro - -#ifndef AnycubicTFT_h -#define AnycubicTFT_h // command sending macro's with debugging capability #define ANYCUBIC_SENDCOMMANDPGM(x) ANYCUBIC_SERIAL_PROTOCOLLNPGM(x) @@ -78,7 +76,7 @@ class AnycubicTFTClass { void OnPrintTimerStarted(); void OnPrintTimerPaused(); void OnPrintTimerStopped(); - + private: char TFTcmdbuffer[TFTBUFSIZE][TFT_MAX_CMD_SIZE]; int TFTbuflen=0; @@ -90,12 +88,12 @@ class AnycubicTFTClass { uint8_t SpecialMenu = false; AnycubicMediaPrintState mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; AnycubicMediaPauseState mediaPauseState = AMPAUSESTATE_NOT_PAUSED; - + float CodeValue(); bool CodeSeen(char); bool IsNozzleHomed(); void RenderCurrentFileList(); - void RenderSpecialMenu(uint16_t); + void RenderSpecialMenu(uint16_t); void RenderCurrentFolder(uint16_t); void GetCommandFromTFT(); void CheckSDCardChange(); @@ -110,9 +108,7 @@ class AnycubicTFTClass { void StopPrint(); char SelectedDirectory[30]; - char SelectedFile[FILENAME_LENGTH]; + char SelectedFile[FILENAME_LENGTH]; }; extern AnycubicTFTClass AnycubicTFT; - -#endif /* AnycubicTFT_h */ From 2952772c64c5f7f4029bccf6227a5283600744e9 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 14 Jul 2020 22:42:29 -0500 Subject: [PATCH 31/31] Rename (2) --- .../extui/lib/anycubic/{_anycubic_tft.cpp => anycubic_tft.cpp} | 2 +- .../lcd/extui/lib/anycubic/{_anycubic_tft.h => anycubic_tft.h} | 0 Marlin/src/lcd/extui_anycubic_tft.cpp | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename Marlin/src/lcd/extui/lib/anycubic/{_anycubic_tft.cpp => anycubic_tft.cpp} (99%) rename Marlin/src/lcd/extui/lib/anycubic/{_anycubic_tft.h => anycubic_tft.h} (100%) diff --git a/Marlin/src/lcd/extui/lib/anycubic/_anycubic_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic/anycubic_tft.cpp similarity index 99% rename from Marlin/src/lcd/extui/lib/anycubic/_anycubic_tft.cpp rename to Marlin/src/lcd/extui/lib/anycubic/anycubic_tft.cpp index a775ef6b67af..718b47fee9b4 100644 --- a/Marlin/src/lcd/extui/lib/anycubic/_anycubic_tft.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic/anycubic_tft.cpp @@ -23,7 +23,7 @@ #if ENABLED(ANYCUBIC_TFT_MODEL) -#include "anycubic_TFT.h" +#include "anycubic_tft.h" #include "anycubic_serial.h" #include "../../../../inc/MarlinConfig.h" diff --git a/Marlin/src/lcd/extui/lib/anycubic/_anycubic_tft.h b/Marlin/src/lcd/extui/lib/anycubic/anycubic_tft.h similarity index 100% rename from Marlin/src/lcd/extui/lib/anycubic/_anycubic_tft.h rename to Marlin/src/lcd/extui/lib/anycubic/anycubic_tft.h diff --git a/Marlin/src/lcd/extui_anycubic_tft.cpp b/Marlin/src/lcd/extui_anycubic_tft.cpp index 3fa609d54656..6782f8d9d6af 100644 --- a/Marlin/src/lcd/extui_anycubic_tft.cpp +++ b/Marlin/src/lcd/extui_anycubic_tft.cpp @@ -28,7 +28,7 @@ #if BOTH(ANYCUBIC_TFT_MODEL, EXTENSIBLE_UI) -#include "extui/lib/anycubic/anycubic_TFT.h" +#include "extui/lib/anycubic/anycubic_tft.h" #include "extui/ui_api.h" #include // for the ::tone() call