From f7650799393bf8e5612868d6bfe5964af8f77219 Mon Sep 17 00:00:00 2001 From: bdring Date: Tue, 15 Dec 2020 15:32:35 -0600 Subject: [PATCH 1/2] Devt (#708) * Fixed various small bugs (#605) * Fixed various small bugs * Fixed potential cast bug * Fixed double reporting of errors Co-authored-by: Stefan de Bruijn * Stallguard tuning (#607) * Devt (#571) * Handles Tranimic drivers errors better - If an unsupported driver is specified, it will give a message and not crash. * Cleaned up unused files Got rid of old unipolar files Got rid of servo axis feature - it is a motor class now Got rid of solenoid pen feature - never really used and it should be a motor class if it is. * Fix ENABLE_AUTHENTICATION (#569) * Fixed authentication code. * Removed another const cast Co-authored-by: Stefan de Bruijn * Fix step leakage with inverted steps (#570) * Fix step leakage with inverted steps * Update build date for merge Co-authored-by: Bart Dring Co-authored-by: Stefan de Bruijn Co-authored-by: Stefan de Bruijn Co-authored-by: Mitch Bradley Co-authored-by: Bart Dring * Update platformio.ini Per PR 583 * Created an enum for mode * Removing some unused machine defs * Added test machine definition * Clean up for PR * Remove test machine def. Co-authored-by: Stefan de Bruijn Co-authored-by: Stefan de Bruijn Co-authored-by: Mitch Bradley Co-authored-by: Bart Dring * Basic testing Complete * Made state variable volatile. * Homing cycle settings (#613) * Initial Tests Complete * Update Grbl.h * Update variables Co-authored-by: Mitch Bradley * fixed dual switches when inverted (#614) * fixed dual switches when inverted * Removed debug message * Cleaning up the machine defs Removed unused #defines. * Store coordinate offsets in NVS (#611) * Store coordinate offsets in NVS * Handle both old Eeprom formats * Implementing fixes (#616) - Stop creating additional tasks when limit_init() gets called again from homing and resets - Explicitly delete an object that was causing a memory loss. * Update Grbl.h * Tweak memory fix and add $H check for $Homing/Cycles * Fix G28.1 and G30.1 * Update Grbl.h * Homing cycle defaults (#624) * Changed to add homing cycle defaults There needs to be a way to set the homing cycle defaults in a machine definition. There will likely be a better way to do this in the future. * Update 10vSpindle.cpp Had wrong error message * Fixed typos and removed obsolete #defines * Probe cleanup (#625) * Cleanup probing code * Update Grbl.h * Update after review * Update error_codes_en_US.csv * More sd_close() to free memory (#622) * Changed buffer sizes to 256 throughout various parts of the program. (#626) This is a patch necessary for F360 personal users, because they decided to add a very lengthy comment... Co-authored-by: Stefan de Bruijn * $sd/show and handle settings in SD files (#629) * $sd/show and handle settings in SD files * Added $LocalFs/Show and fixed $LocalFs/Run output * Infer / at beginning of SD path name The LocalFS path processing code already inserts a / at the beginning of the path is one isn't present. This patch does the same for SD files. * Show $ command responses in WebUI console * Added $Settings/ListChanged AKA $SC This is useful for saving settings in a compact form that leaves defaults unchanged. * $sd/show works in idle or alarm state * Apply idle/alarm checks to SPIFFS files too * Changed sd_close to SD.end() sd_close was a temporary function to check for memory usage * Big BUILD_INFO fix (#632) -- Changes that affect behavior Fixed the bugs with report_build_info() Build info is no longer stored in the fixed "EEPROM" section; instead it is a proper Setting named $Firmware/Build . You can change it in the usual way with $Firmware/Build= $I without the = still works. -- Changes that affect configurability for developers Converted a couple more #defines into enums - SETTINGS_RESTORE_* and BITFLAG_RT_STATUS_* . A side effect of this is that it is no longer possible to configure the behavior of $RST=* by defining SETTINGS_RESTORE_ALL to include only a subset. I think it is a bad idea from a customer support perspective to have the meaning of this command be different for different builds. Changed some of the #define ENABLE_ names to eliminate "EEPROM" -- Changes that are purely cosmetic Clarified descriptions in Config.h, to eliminate spurious/incorrect mentions of "EEPROM" Eliminated all mentions of the name "EEPROM" except the ones that truly mean the EEPROM section, as opposed to generalized non-volatile storage. The contents of SettingsStorage.h and SettingsStorage.cpp, which were really related to coordinate storage in Eeprom, not proper settings, were moved to Eeprom.h and Eeprom.cpp. The SettingsStorage files are gone. Got rid of get_step_pin_mask() and get_direction_pin_mask() because they were just aliases for bit(). That eliminated some junk from the SettingsStorage/Eeprom files. Those files now tightly contain only the residual stuff related to the storage of coordinate data in EEPROM. * Most #defines are gone (#595) * Many more #defines bite the dust * Fixed botch in rt accessory logic * Update Probe.cpp * Update System.cpp * Typo * Fixed WebUI crash (#633) While eliminating a redundant definition of is_realtime_command(), I inadvertently introduced a recursion due to the similarity of the names "is_realtime_command()" and "is_realtime_cmd()". The solution is to eliminate the latter entirely. * Fix i2s probing hang (#608) * Fix I2S stepper hung just after the completion of motor moving * Fix recompile issue Fixed a problem with the recompile not being recompiled even if the files under the Custom folder are changed. * More comment for macOS in debug.ini * Fix the timing of calling I2S out's exclusion function and reset sequence The reset sequence did not seem to be correct, so I changed it. According to the ESP-IDF PR, the correct sequence is as follows: 1)TX module 2)DMA 3)FIFO https://github.com/espressif/esp-idf/commit/c7f33524b469e75937f003d4c06336bf4694a043#diff-27688c6b3c29373d2a2b142b8471981c * Changed the message level for I2S swtiching from warning to debug * Add some comments * Implement stepping through Motors class (#636) * Implement stepping through Motors class WIP for discussion and review - not ready to merge yet * Document Motor methods and variables .. and remove some unused ones and move some that are subclass-specific * Move position_min/max to Limits.cpp ... and coalesced other uses thereof into a unified scheme. * Call motor ->init() explicitly instead of implicitly This makes it possible to inherit constructors without spurious config messages. * Fixed problems with I2S * Changes in class method override syntax per atlaste * Fixed oops * More Motors simplification a) Eliminated can_home() in favor of a return value from set_homing_mode() b) Eliminated axis_name() in favor of reportAxisNameMsg() * Fixes to RcServo and Trinamic - RC Servo was not handling disable ... probably old issue - Display test after config * More tweaks * Define that variable! * Move functions from Motors.cpp to subclasses Created a Servo base class from which RcServo and Dynamixel2 are derived. This gets the servo update task out of Motors. It also eliminates the need for type_id. Now all of the functions that are specific to particular kinds of motors are within their subclasses * Adding Dynamixel to ABC axes. * Removed second #ifndef SPINDLE_TYPE * Fixed potential leak in Report.cpp as reported by @atlaste * Some servo cleanup. Has errors! * min should be max * Removed test rcservo machine definition. * Removed obsolete #defines in machine defs for RcServo cal Co-authored-by: bdring * Cleaned up AMASS code (#635) * Cleaned up AMASS code More #defines gone 74 lines shorter Tested by comparing the result of original AMASS computation code to the new code with values surrounding all of the cutoff frequencies. * I2SOut tick calculation * Sorted out units for stepper pulse periods I tried to make it clear what the units are at different places in the code, and to use argument datatypes that clearly show the value range at different points, instead of relying on implicit type promotion. Hopefully this will make it easier to understand when, where, and why unit conversions occur. * Update Stepper.h * Deleted AMASS Config.h option ... as it is no longer optional * Use less memory (#644) a) closeFile() now does SD.end() to release memory after running a file from SD. b) Several task stacks are smaller c) All tasks now check their free space if DEBUG_REPORT_STACK_FREE is defined. platformio.ini has a commented-out line that can be uncommented to turn that on. d) Similarly, platformio.ini can turn on DEBUG_REPORT_HEAP_SIZE e) Fixed a small leak that occurred when listing local files. With these changes, the heap size tends to hover around 53K, dropping to about 37K when running a file from SD. * Add coolant pin messages to startup (#647) * Add coolant pin messages to startup Help with user support. * Removing incorrect STEPPER_RESET definition * Fix laser mode startup message * cleanup - coolant_init() will behave as before - update build date - return default machine to test_drive * Move CoreXY out of main Grbl (#653) * Created branch * WIP * Update parallel_delta.cpp * Wip * WIP * Wip * Still working on kinematics - Added an interface into the jogging section * WIP * WIP * wip * WIP * WIP * Wip * WIP * WIP * Wip * Update machine defs * Created branch * WIP * Update parallel_delta.cpp * Wip * WIP * Wip * Still working on kinematics - Added an interface into the jogging section * WIP * WIP * wip * WIP * WIP * Wip * WIP * WIP * Wip * Update machine defs * Machine def change. Moved switches to module 1 * WIP * Cleanup before P.R. - Fixed ranges for delta geometry - Added post homing delay option for servos - renamed and removed old machine defs. * Fixing initialization problem when not in USE_KINEMATICS mode * Fixing Git Mess * Publishing Branch - Not ready yet. Issues with Z axis - Need to add midTbot option * WIP - Seems to be fully functional now. - Need to add midTbot option. * Update CoreXY.cpp * I think it is ready for PR - fixed $RST=# - added midTbot geometry factor * Fine tune midtbot definition * Removed more unneeded corexy code. * Fixed doubled #define in machine def file. * Update after review comments * Added $A AKA Alarms/List command (#654) * Added $A AKA Alarms/List command Similar to $E AKA Errors/List $E used to be AKA ErrorCodes/List Also added $Errors/Verbose setting to display full error text instead of the error number. It defaults to true because it works with every sender I have tried so far - cncjs, UGS, and Chrome GCode Sender. If you have problems with some sender you can set it to false. * Added static_assert per atlaste's comment * Added a default and fixed Authentication issue Co-authored-by: bdring * TMC2130 plotter machine servo config update (#657) * TMC2130 plotter machine servo config update based on Slack conversation https://buildlog.slack.com/archives/CBZKZ8LHL/p1604243530253000 * Update Grbl.h * Trinamic reporting (#656) * Enhanced reporting of errors * Change "motor" to "driver" for clarity. * Added better way to show changed Setting values from Mitch * Update build date * Machine Definition Cleanup (#658) - Removed machine definitions to speed up testing. - Moved 6 pack CS/MS3 pins with other axis pins to help them stay in sync with the aixs letters * Spindle delay and Telnet Fix (#676) * Removed early saving of old state Was causing later tests to be wrong * Update Grbl.h * Update TelnetServer.cpp Remove filtering of '\r' character. * ABC Bresenham counter init fix * Rst responses (#679) * Added verification of changes from $RST command When sending $RST=$ you only get these responses. [MSG:WiFi reset done] [MSG:BT reset done] Added the other things that change. [MSG:WiFi reset done] [MSG:BT reset done] [MSG:Settings reset done] [MSG:Postion offsets reset done] * Update ProcessSettings.cpp * Update Grbl.h * Update ProcessSettings.cpp * Fix Spindle State broken in earlier PR * Update Grbl.h * Spindle and laser (#683) * WIP * Updates * Updates - Added Laser/FullPower - Move some stuff from PWM to Laser * WIP * Used the stop function before resetiing pins. * Updates from discussion - Reset_pins is now deinit() - VFD task is now deleted when ... deinit() - Added a Motor/Disable command * Added Mitch's gambit * Cleanup - Finished VFD - Fixed Settings (Thanks Brian!) - changed task cores. * Update VFDSpindle.cpp * Update Laser.cpp * Fixing reset - gpio_reset_pin sets a pullup, which could turn on a device * Changed Spindle messages to CLIENT_ALL * Update Grbl.h * Updates after review * P.R. Cleanup * Most spindle settings cause a new init() * Laser mode (#692) * Update Machine.h * spindles now say if in laser mode * name fix * Updates * Getting rid of crosstalk * Update PWMSpindle.cpp * Reset some values at spindle init() * Update SettingsDefinitions.cpp * Update Grbl.h * Return to test_drive.h * User macro button (#685) * Test Macro Button Idea * Updates * Formating * Changed macro pin reporting to be a single character * Sd Web UI issues (#698) * Updates * returned reportTaskStackSize(uxHighWaterMark); In a #ifdef DEBUG_TASK_STACK guard * Disallow web commands unless idle or alarm state * merging stuff after review * Handle SD busy state in webserver handler (#697) * Handle SD busy state in webserver handler * Update index.html.gz * Fixed reporting * Add case for SD not enabled. * Prevent Web commands except in idle or alarm * Return authentication to the default Co-authored-by: Mitch Bradley Co-authored-by: Luc <8822552+luc-github@users.noreply.github.com> * Update axis squaring checking (#699) * Reverting some spindle changes... CLIENT_ALL caused queue issues * Rate Adjusting Fix * Fix SD card hanging on bad gcode * Fix hang on error 20 from SD/Run (#701) * Fixed strange WCO values on first load (#702) When loading Grbl_Esp32 into a fresh ESP32, the WCOs would often have strange, very large, values. The problem was the code that tries to propagate data from the old "Eeprom" storage format into the new NVS scheme. The old format had a broken checksum computation that made the checksum so weak that if succeeds about half the time on random data. The solution is to get rid of all that old code. The downside is that migration from a build that uses the old format will lose the WCO values. The user will have to reestablish them. Subsequent updates between different versions that both use the new NVS format will propagate WCO values correctly. * Fixes to homing (#706) * Fixes to homing * Update Grbl.h * Clean up after code review. * Trinamic uart (#700) * WIP * WIP * Updates * Update Grbl.h * Removing some test machine definitions * TMC5160 Drivers were not in tests * Fix a few issues with VFDSpindle critical error handling (#705) If a command is critical and fails to receive a response, it should trigger an Alarm. However, because the critical check was only evaluated if the spindle was not already unresponsive, it meant that a critical command failure would be silently ignored if a non-critical command failed before it (putting the VFDSpindle in unresponsive state). Therefore, I've moved the critical check to occur regardless of whether the spindle was already unresponsive. Second, I believe that setting `sys_rt_exec_alarm` is not sufficient to stop the machine and put it into alarm state. Other alarm conditions (such as hard limits) also run an `mc_reset()` to stop motion first. It appears that without this, motion will not be stopped, and in fact, the alarm appears to get cleared if it occurs during motion! * Update per P.R. #704 on main Co-authored-by: Stefan de Bruijn Co-authored-by: Stefan de Bruijn Co-authored-by: Mitch Bradley Co-authored-by: Bart Dring Co-authored-by: odaki Co-authored-by: Pete Wildsmith Co-authored-by: Luc <8822552+luc-github@users.noreply.github.com> Co-authored-by: Scott Bezek --- Grbl_Esp32/Custom/CoreXY.cpp | 32 +- Grbl_Esp32/Custom/atari_1020.cpp | 6 +- Grbl_Esp32/src/Config.h | 10 +- Grbl_Esp32/src/Defaults.h | 24 ++ Grbl_Esp32/src/Eeprom.cpp | 81 ---- Grbl_Esp32/src/Eeprom.h | 61 --- Grbl_Esp32/src/Error.cpp | 1 + Grbl_Esp32/src/Error.h | 1 + Grbl_Esp32/src/GCode.cpp | 11 +- Grbl_Esp32/src/GCode.h | 26 ++ Grbl_Esp32/src/Grbl.h | 3 +- Grbl_Esp32/src/I2SOut.cpp | 2 + Grbl_Esp32/src/Limits.cpp | 2 + .../src/Machines/6_pack_stepstick_XYZ_v1.h | 39 +- Grbl_Esp32/src/Machines/fystec_e4.h | 81 ++++ .../src/Machines/mpcnc_laser_module_v1p2.h | 4 +- Grbl_Esp32/src/MotionControl.cpp | 19 +- Grbl_Esp32/src/Motors/Motors.cpp | 204 ++++++++-- Grbl_Esp32/src/Motors/Motors.h | 2 +- Grbl_Esp32/src/Motors/Servo.cpp | 5 +- Grbl_Esp32/src/Motors/StandardStepper.cpp | 6 +- Grbl_Esp32/src/Motors/StandardStepper.h | 1 + Grbl_Esp32/src/Motors/TrinamicDriver.cpp | 14 +- Grbl_Esp32/src/Motors/TrinamicUartDriver.h | 131 +++++++ .../src/Motors/TrinamicUartDriverClass.cpp | 370 ++++++++++++++++++ Grbl_Esp32/src/ProcessSettings.cpp | 37 +- Grbl_Esp32/src/Protocol.cpp | 8 +- Grbl_Esp32/src/Report.cpp | 9 +- Grbl_Esp32/src/SDCard.cpp | 23 +- Grbl_Esp32/src/SDCard.h | 8 +- Grbl_Esp32/src/Serial.cpp | 22 +- Grbl_Esp32/src/Settings.cpp | 37 +- Grbl_Esp32/src/Settings.h | 35 +- Grbl_Esp32/src/SettingsDefinitions.cpp | 133 ++++--- Grbl_Esp32/src/SettingsDefinitions.h | 8 +- Grbl_Esp32/src/Spindles/10vSpindle.cpp | 31 +- Grbl_Esp32/src/Spindles/10vSpindle.h | 1 + Grbl_Esp32/src/Spindles/BESCSpindle.cpp | 4 +- Grbl_Esp32/src/Spindles/DacSpindle.cpp | 6 +- Grbl_Esp32/src/Spindles/Laser.cpp | 67 +++- Grbl_Esp32/src/Spindles/Laser.h | 4 +- Grbl_Esp32/src/Spindles/NullSpindle.cpp | 2 +- Grbl_Esp32/src/Spindles/PWMSpindle.cpp | 56 ++- Grbl_Esp32/src/Spindles/PWMSpindle.h | 5 +- Grbl_Esp32/src/Spindles/RelaySpindle.cpp | 2 +- Grbl_Esp32/src/Spindles/Spindle.cpp | 4 +- Grbl_Esp32/src/Spindles/Spindle.h | 3 +- Grbl_Esp32/src/Spindles/VFDSpindle.cpp | 13 +- Grbl_Esp32/src/Spindles/VFDSpindle.h | 4 +- Grbl_Esp32/src/Stepper.cpp | 4 +- Grbl_Esp32/src/System.cpp | 49 ++- Grbl_Esp32/src/WebUI/BTConfig.cpp | 3 + Grbl_Esp32/src/WebUI/Commands.cpp | 3 + Grbl_Esp32/src/WebUI/WebServer.cpp | 8 +- Grbl_Esp32/src/WebUI/WebSettings.cpp | 27 +- Grbl_Esp32/src/WebUI/WifiConfig.cpp | 9 + Grbl_Esp32/src/data/index.html.gz | Bin 128570 -> 116657 bytes embedded/package-lock.json | 2 +- 58 files changed, 1353 insertions(+), 410 deletions(-) delete mode 100644 Grbl_Esp32/src/Eeprom.cpp delete mode 100644 Grbl_Esp32/src/Eeprom.h create mode 100644 Grbl_Esp32/src/Machines/fystec_e4.h create mode 100644 Grbl_Esp32/src/Motors/TrinamicUartDriver.h create mode 100644 Grbl_Esp32/src/Motors/TrinamicUartDriverClass.cpp diff --git a/Grbl_Esp32/Custom/CoreXY.cpp b/Grbl_Esp32/Custom/CoreXY.cpp index cefab842..238a46df 100644 --- a/Grbl_Esp32/Custom/CoreXY.cpp +++ b/Grbl_Esp32/Custom/CoreXY.cpp @@ -51,9 +51,15 @@ float three_axis_dist(float* point1, float* point2); void machine_init() { // print a startup message to show the kinematics are enable + +#ifdef MIDTBOT + grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "CoreXY (midTbot) Kinematics Init"); +#else grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "CoreXY Kinematics Init"); +#endif } +// Cycle mask is 0 unless the user sends a single axis command like $HZ // This will always return true to prevent the normal Grbl homing cycle bool user_defined_homing(uint8_t cycle_mask) { uint8_t n_cycle; // each home is a multi cycle operation approach, pulloff, approach..... @@ -61,12 +67,6 @@ bool user_defined_homing(uint8_t cycle_mask) { float max_travel; uint8_t axis; - // check for single axis homing - if (cycle_mask != 0) { - grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "CoreXY Single axis homing not allowed. Use $H only"); - return true; - } - // check for multi axis homing per cycle ($Homing/Cycle0=XY type)...not allowed in CoreXY bool setting_error = false; for (int cycle = 0; cycle < 3; cycle++) { @@ -90,9 +90,21 @@ bool user_defined_homing(uint8_t cycle_mask) { pl_data->motion.systemMotion = 1; pl_data->motion.noFeedOverride = 1; - for (int cycle = 0; cycle < 3; cycle++) { - AxisMask mask = homing_cycle[cycle]->get(); + uint8_t cycle_count = (cycle_mask == 0) ? 3 : 1; // if we have a cycle_mask, we are only going to do one axis + + AxisMask mask = 0; + for (int cycle = 0; cycle < cycle_count; cycle++) { + // if we have a cycle_mask, do that. Otherwise get the cycle from the settings + mask = cycle_mask ? cycle_mask : homing_cycle[cycle]->get(); + + // If not X or Y do a normal home + if (!(bitnum_istrue(mask, X_AXIS) || bitnum_istrue(mask, Y_AXIS))) { + limits_go_home(mask); // Homing cycle 0 + continue; // continue to next item in for loop + } + mask = motors_set_homing_mode(mask, true); // non standard homing motors will do their own thing and get removed from the mask + for (uint8_t axis = X_AXIS; axis <= Z_AXIS; axis++) { if (bit(axis) == mask) { // setup for the homing of this axis @@ -190,7 +202,7 @@ bool user_defined_homing(uint8_t cycle_mask) { } while (n_cycle-- > 0); } } - } + } // for // after sussefully setting X & Y axes, we set the current positions @@ -231,7 +243,7 @@ void inverse_kinematics(float* position) { motors[X_AXIS] = geometry_factor * position[X_AXIS] + position[Y_AXIS]; motors[Y_AXIS] = geometry_factor * position[X_AXIS] - position[Y_AXIS]; - motors[Z_AXIS] = position[Z_AXIS]; + motors[Z_AXIS] = position[Z_AXIS]; position[0] = motors[0]; position[1] = motors[1]; diff --git a/Grbl_Esp32/Custom/atari_1020.cpp b/Grbl_Esp32/Custom/atari_1020.cpp index 5661ae6d..27a55021 100644 --- a/Grbl_Esp32/Custom/atari_1020.cpp +++ b/Grbl_Esp32/Custom/atari_1020.cpp @@ -57,7 +57,8 @@ void machine_init() { NULL, // parameters 1, // priority &solenoidSyncTaskHandle, - 0 // core + CONFIG_ARDUINO_RUNNING_CORE // must run the task on same core + // core ); // setup a task that will do the custom homing sequence xTaskCreatePinnedToCore(atari_home_task, // task @@ -66,7 +67,8 @@ void machine_init() { NULL, // parameters 1, // priority &atariHomingTaskHandle, - 0 // core + CONFIG_ARDUINO_RUNNING_CORE // must run the task on same core + // core ); } diff --git a/Grbl_Esp32/src/Config.h b/Grbl_Esp32/src/Config.h index 50b014f8..f22e88aa 100644 --- a/Grbl_Esp32/src/Config.h +++ b/Grbl_Esp32/src/Config.h @@ -47,14 +47,16 @@ Some features should not be changed. See notes below. // that the machine file might choose to undefine. // Note: HOMING_CYCLES are now settings +#define SUPPORT_TASK_CORE 1 // Reference: CONFIG_ARDUINO_RUNNING_CORE = 1 // Inverts pin logic of the control command pins based on a mask. This essentially means you can use // normally-closed switches on the specified pins, rather than the default normally-open switches. -// The mask order is Cycle Start | Feed Hold | Reset | Safety Door +// The mask order is ... +// Macro3 | Macro2 | Macro 1| Macr0 |Cycle Start | Feed Hold | Reset | Safety Door // For example B1101 will invert the function of the Reset pin. -#define INVERT_CONTROL_PIN_MASK B1111 +#define INVERT_CONTROL_PIN_MASK B00001111 -#define ENABLE_CONTROL_SW_DEBOUNCE // Default disabled. Uncomment to enable. +// #define ENABLE_CONTROL_SW_DEBOUNCE // Default disabled. Uncomment to enable. #define CONTROL_SW_DEBOUNCE_PERIOD 32 // in milliseconds default 32 microseconds #define USE_RMT_STEPS @@ -128,7 +130,7 @@ const int MAX_N_AXIS = 6; // "in the clear" over unsecured channels. It should be treated as a // "friendly suggestion" to prevent unwitting dangerous actions, rather than // as effective security against malice. -//#define ENABLE_AUTHENTICATION +// #define ENABLE_AUTHENTICATION //CONFIGURE_EYECATCH_END (DO NOT MODIFY THIS LINE) #ifdef ENABLE_AUTHENTICATION diff --git a/Grbl_Esp32/src/Defaults.h b/Grbl_Esp32/src/Defaults.h index 6ca3728c..41776f56 100644 --- a/Grbl_Esp32/src/Defaults.h +++ b/Grbl_Esp32/src/Defaults.h @@ -159,6 +159,10 @@ # define DEFAULT_LASER_MODE 0 // false #endif +#ifndef DEFAULT_LASER_FULL_POWER +# define DEFAULT_LASER_FULL_POWER 1000 +#endif + #ifndef DEFAULT_SPINDLE_RPM_MAX // $30 # define DEFAULT_SPINDLE_RPM_MAX 1000.0 // rpm #endif @@ -457,6 +461,10 @@ // This can eliminate checking to see if the pin is defined because // the overridden pinMode and digitalWrite functions will deal with it. +#ifndef SDCARD_DET_PIN +# define SDCARD_DET_PIN UNDEFINED_PIN +#endif + #ifndef STEPPERS_DISABLE_PIN # define STEPPERS_DISABLE_PIN UNDEFINED_PIN #endif @@ -643,3 +651,19 @@ #ifndef USER_ANALOG_PIN_3_FREQ # define USER_ANALOG_PIN_3_FREQ 5000 #endif + +#ifndef DEFAULT_USER_MACRO0 +# define DEFAULT_USER_MACRO0 "" +#endif + +#ifndef DEFAULT_USER_MACRO1 +# define DEFAULT_USER_MACRO1 "" +#endif + +#ifndef DEFAULT_USER_MACRO2 +# define DEFAULT_USER_MACRO2 "" +#endif + +#ifndef DEFAULT_USER_MACRO3 +# define DEFAULT_USER_MACRO3 "" +#endif \ No newline at end of file diff --git a/Grbl_Esp32/src/Eeprom.cpp b/Grbl_Esp32/src/Eeprom.cpp deleted file mode 100644 index 083570c1..00000000 --- a/Grbl_Esp32/src/Eeprom.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/* - Eeprom.cpp - Coordinate data stored in EEPROM - Part of Grbl - Copyright (c) 2014-2016 Sungeun K. Jeon for Gnea Research LLC - - 2018 - Bart Dring This file was modifed for use on the ESP32 - CPU. Do not use this with Grbl for atMega328P - - Grbl 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. - Grbl 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 Grbl. If not, see . -*/ - -#include "Grbl.h" - -void memcpy_to_eeprom_with_checksum(unsigned int destination, const char* source, unsigned int size) { - unsigned char checksum = 0; - for (; size > 0; size--) { - unsigned char data = static_cast(*source++); - // Note: This checksum calculation is broken as described below. - checksum = (checksum << 1) || (checksum >> 7); - checksum += data; - EEPROM.write(destination++, *(source++)); - } - EEPROM.write(destination, checksum); - EEPROM.commit(); -} - -int memcpy_from_eeprom_with_old_checksum(char* destination, unsigned int source, unsigned int size) { - unsigned char data, checksum = 0; - for (; size > 0; size--) { - data = EEPROM.read(source++); - // Note: This checksum calculation is broken - the || should be just | - - // thus making the checksum very weak. - // We leave it as-is so we can read old data after a firmware upgrade. - // The new storage format uses the tagged NVS mechanism, avoiding this bug. - checksum = (checksum << 1) || (checksum >> 7); - checksum += data; - *(destination++) = data; - } - return (checksum == EEPROM.read(source)); -} -int memcpy_from_eeprom_with_checksum(char* destination, unsigned int source, unsigned int size) { - unsigned char data, checksum = 0; - for (; size > 0; size--) { - data = EEPROM.read(source++); - checksum = (checksum << 1) | (checksum >> 7); - checksum += data; - *(destination++) = data; - } - return (checksum == EEPROM.read(source)); -} - -// Read selected coordinate data from EEPROM. Updates pointed coord_data value. -// This is now a compatibility routine that is used to propagate coordinate data -// in the old EEPROM format to the new tagged NVS format. -bool old_settings_read_coord_data(uint8_t coord_select, float* coord_data) { - uint32_t addr = coord_select * (sizeof(float) * N_AXIS + 1) + EEPROM_ADDR_PARAMETERS; - if (!(memcpy_from_eeprom_with_old_checksum((char*)coord_data, addr, sizeof(float) * N_AXIS)) && - !(memcpy_from_eeprom_with_checksum((char*)coord_data, addr, sizeof(float) * MAX_N_AXIS))) { - // Reset with default zero vector - clear_vector_float(coord_data); - // The old code used to rewrite the zeroed data but now that is done - // elsewhere, in a different format. - return false; - } - return true; -} - -// Allow iteration over CoordIndex values -CoordIndex& operator ++ (CoordIndex& i) { - i = static_cast(static_cast(i) + 1); - return i; -} diff --git a/Grbl_Esp32/src/Eeprom.h b/Grbl_Esp32/src/Eeprom.h deleted file mode 100644 index 32d66c65..00000000 --- a/Grbl_Esp32/src/Eeprom.h +++ /dev/null @@ -1,61 +0,0 @@ -#pragma once - -/* - Eeprom.h - Header for system level commands and real-time processes - Part of Grbl - Copyright (c) 2014-2016 Sungeun K. Jeon for Gnea Research LLC - - 2018 - Bart Dring This file was modifed for use on the ESP32 - CPU. Do not use this with Grbl for atMega328P - - Grbl 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. - Grbl 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 Grbl. If not, see . -*/ - -#include "Grbl.h" - -// Define EEPROM memory address location values for saved coordinate data. -const int EEPROM_SIZE = 1024U; -const int EEPROM_ADDR_PARAMETERS = 512U; - -//unsigned char eeprom_get_char(unsigned int addr); -//void eeprom_put_char(unsigned int addr, unsigned char new_value); -void memcpy_to_eeprom_with_checksum(unsigned int destination, const char* source, unsigned int size); -int memcpy_from_eeprom_with_checksum(char* destination, unsigned int source, unsigned int size); -int memcpy_from_eeprom_with_old_checksum(char* destination, unsigned int source, unsigned int size); - -// Reads selected coordinate data from EEPROM -bool old_settings_read_coord_data(uint8_t coord_select, float* coord_data); - -// Various places in the code access saved coordinate system data -// by a small integer index according to the values below. -enum CoordIndex : uint8_t{ - Begin = 0, - G54 = Begin, - G55, - G56, - G57, - G58, - G59, - // To support 9 work coordinate systems it would be necessary to define - // the following 3 and modify GCode.cpp to support G59.1, G59.2, G59.3 - // G59_1, - // G59_2, - // G59_3, - NWCSystems, - G28 = NWCSystems, - G30, - // G92_2, - // G92_3, - End, -}; -// Allow iteration over CoordIndex values -CoordIndex& operator ++ (CoordIndex& i); diff --git a/Grbl_Esp32/src/Error.cpp b/Grbl_Esp32/src/Error.cpp index 149b0665..34dd1cd4 100644 --- a/Grbl_Esp32/src/Error.cpp +++ b/Grbl_Esp32/src/Error.cpp @@ -79,4 +79,5 @@ std::map ErrorNames = { { Error::NvsSetFailed, "Failed to store setting" }, { Error::NvsGetStatsFailed, "Failed to get setting status" }, { Error::AuthenticationFailed, "Authentication failed!" }, + { Error::AnotherInterfaceBusy, "Another interface is busy"}, }; diff --git a/Grbl_Esp32/src/Error.h b/Grbl_Esp32/src/Error.h index 09a54030..80f40a39 100644 --- a/Grbl_Esp32/src/Error.h +++ b/Grbl_Esp32/src/Error.h @@ -83,6 +83,7 @@ enum class Error : uint8_t { NvsGetStatsFailed = 101, AuthenticationFailed = 110, Eol = 111, + AnotherInterfaceBusy = 120, }; extern std::map ErrorNames; diff --git a/Grbl_Esp32/src/GCode.cpp b/Grbl_Esp32/src/GCode.cpp index 5a24d342..b1a7a079 100644 --- a/Grbl_Esp32/src/GCode.cpp +++ b/Grbl_Esp32/src/GCode.cpp @@ -24,6 +24,12 @@ #include "Grbl.h" +// Allow iteration over CoordIndex values +CoordIndex& operator++(CoordIndex& i) { + i = static_cast(static_cast(i) + 1); + return i; +} + // NOTE: Max line number is defined by the g-code standard to be 99999. It seems to be an // arbitrary value, and some GUIs may require more. So we increased it based on a max safe // value when converting a float (7.2 digit precision)s to an integer. @@ -473,9 +479,10 @@ Error gc_execute_line(char* line, uint8_t client) { gc_block.modal.spindle = SpindleState::Cw; break; case 4: // Supported if SPINDLE_DIR_PIN is defined or laser mode is on. - if (spindle->is_reversable || laser_mode->get()) { + if (spindle->is_reversable || spindle->inLaserMode()) { gc_block.modal.spindle = SpindleState::Ccw; } else { + grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "M4 requires laser mode or a reversable spindle"); FAIL(Error::GcodeUnsupportedCommand); } break; @@ -1290,7 +1297,7 @@ Error gc_execute_line(char* line, uint8_t client) { return status; } // If in laser mode, setup laser power based on current and past parser conditions. - if (laser_mode->get()) { + if (spindle->inLaserMode()) { if (!((gc_block.modal.motion == Motion::Linear) || (gc_block.modal.motion == Motion::CwArc) || (gc_block.modal.motion == Motion::CcwArc))) { gc_parser_flags |= GCParserLaserDisable; diff --git a/Grbl_Esp32/src/GCode.h b/Grbl_Esp32/src/GCode.h index 4b070459..1ef3abf6 100644 --- a/Grbl_Esp32/src/GCode.h +++ b/Grbl_Esp32/src/GCode.h @@ -232,6 +232,32 @@ enum GCParserFlags { GCParserLaserIsMotion = bit(7), }; +// Various places in the code access saved coordinate system data +// by a small integer index according to the values below. +enum CoordIndex : uint8_t{ + Begin = 0, + G54 = Begin, + G55, + G56, + G57, + G58, + G59, + // To support 9 work coordinate systems it would be necessary to define + // the following 3 and modify GCode.cpp to support G59.1, G59.2, G59.3 + // G59_1, + // G59_2, + // G59_3, + NWCSystems, + G28 = NWCSystems, + G30, + // G92_2, + // G92_3, + End, +}; + +// Allow iteration over CoordIndex values +CoordIndex& operator ++ (CoordIndex& i); + // NOTE: When this struct is zeroed, the 0 values in the above types set the system defaults. typedef struct { Motion motion; // {G0,G1,G2,G3,G38.2,G80} diff --git a/Grbl_Esp32/src/Grbl.h b/Grbl_Esp32/src/Grbl.h index 647e0c06..93c3f1e6 100644 --- a/Grbl_Esp32/src/Grbl.h +++ b/Grbl_Esp32/src/Grbl.h @@ -23,7 +23,7 @@ // Grbl versioning system const char* const GRBL_VERSION = "1.3a"; -const char* const GRBL_VERSION_BUILD = "20201124"; +const char* const GRBL_VERSION_BUILD = "20201212"; //#include #include @@ -41,7 +41,6 @@ const char* const GRBL_VERSION_BUILD = "20201124"; #include "Defaults.h" #include "Error.h" -#include "Eeprom.h" #include "WebUI/Authentication.h" #include "WebUI/Commands.h" #include "Probe.h" diff --git a/Grbl_Esp32/src/I2SOut.cpp b/Grbl_Esp32/src/I2SOut.cpp index d41fed02..211cffaf 100644 --- a/Grbl_Esp32/src/I2SOut.cpp +++ b/Grbl_Esp32/src/I2SOut.cpp @@ -526,7 +526,9 @@ static void IRAM_ATTR i2sOutTask(void* parameter) { I2S_OUT_PULSER_EXIT_CRITICAL(); // Unlock pulser status static UBaseType_t uxHighWaterMark = 0; +# ifdef DEBUG_TASK_STACK reportTaskStackSize(uxHighWaterMark); +# endif } } #endif diff --git a/Grbl_Esp32/src/Limits.cpp b/Grbl_Esp32/src/Limits.cpp index 41198dcf..029e3477 100644 --- a/Grbl_Esp32/src/Limits.cpp +++ b/Grbl_Esp32/src/Limits.cpp @@ -372,7 +372,9 @@ void limitCheckTask(void* pvParameters) { sys_rt_exec_alarm = ExecAlarm::HardLimit; // Indicate hard limit critical event } static UBaseType_t uxHighWaterMark = 0; +#ifdef DEBUG_TASK_STACK reportTaskStackSize(uxHighWaterMark); +#endif } } diff --git a/Grbl_Esp32/src/Machines/6_pack_stepstick_XYZ_v1.h b/Grbl_Esp32/src/Machines/6_pack_stepstick_XYZ_v1.h index b86c0c26..5bc9da03 100644 --- a/Grbl_Esp32/src/Machines/6_pack_stepstick_XYZ_v1.h +++ b/Grbl_Esp32/src/Machines/6_pack_stepstick_XYZ_v1.h @@ -106,19 +106,38 @@ Socket #5 #define Z_LIMIT_PIN GPIO_NUM_35 + + // // 4x Input Module in Socket #2 // // https://github.com/bdring/6-Pack_CNC_Controller/wiki/4x-Switch-Input-module -// #define X_LIMIT_PIN GPIO_NUM_2 -// #define Y_LIMIT_PIN GPIO_NUM_25 -// #define Z_LIMIT_PIN GPIO_NUM_39 +#define MACRO_BUTTON_0_PIN GPIO_NUM_2 +#define MACRO_BUTTON_1_PIN GPIO_NUM_25 +#define MACRO_BUTTON_2_PIN GPIO_NUM_39 +#define MACRO_BUTTON_3_PIN GPIO_NUM_36 -// // 4x Input Module in Socket #3 -// // https://github.com/bdring/6-Pack_CNC_Controller/wiki/4x-Switch-Input-module -// #define CONTROL_CYCLE_START_PIN GPIO_NUM_26 -// #define CONTROL_FEED_HOLD_PIN GPIO_NUM_4 -// #define CONTROL_RESET_PIN GPIO_NUM_16 -// #define CONTROL_SAFETY_DOOR_PIN GPIO_NUM_27 -// //#define INVERT_CONTROL_PIN_MASK B0000 +// 5V output CNC module in socket #4 +// https://github.com/bdring/6-Pack_CNC_Controller/wiki/4x-5V-Buffered-Output-Module +#define SPINDLE_TYPE SpindleType::PWM +#define SPINDLE_OUTPUT_PIN GPIO_NUM_14 +#define SPINDLE_ENABLE_PIN GPIO_NUM_13 // optional +#define LASER_OUTPUT_PIN GPIO_NUM_15 // optional +#define LASER_ENABLE_PIN GPIO_NUM_12 + + + + +// // RS485 Modbus In socket #3 +// // https://github.com/bdring/6-Pack_CNC_Controller/wiki/RS485-Modbus-Module +// #define VFD_RS485_TXD_PIN GPIO_NUM_26 +// #define VFD_RS485_RTS_PIN GPIO_NUM_4 +// #define VFD_RS485_RXD_PIN GPIO_NUM_16 + +// Example (4x) 5V Buffer Output on socket #5 +// https://github.com/bdring/6-Pack_CNC_Controller/wiki/4x-5V-Buffered-Output-Module +#define USER_DIGITAL_PIN_0 I2SO(24) // No PWM +#define USER_DIGITAL_PIN_1 I2SO(25) +#define USER_DIGITAL_PIN_2 I2SO(26) // M7 on M9 Off +#define USER_DIGITAL_PIN_3 I2SO(27) // M8 on M9 Off // ================= Setting Defaults ========================== #define DEFAULT_X_STEPS_PER_MM 800 diff --git a/Grbl_Esp32/src/Machines/fystec_e4.h b/Grbl_Esp32/src/Machines/fystec_e4.h new file mode 100644 index 00000000..63b47bab --- /dev/null +++ b/Grbl_Esp32/src/Machines/fystec_e4.h @@ -0,0 +1,81 @@ +#pragma once +// clang-format off + +/* + fystec_e4.h + https://github.com/FYSETC/FYSETC-E4 + + 2020-12-03 B. Dring + + This is a machine definition file to use the FYSTEC E4 3D Printer controller + This is a 4 motor controller. This is setup for XYZA, but XYYZ, could also be used. + There are 5 inputs + The controller has outputs for a Fan, Hotbed and Extruder. There are mapped to + spindle, mist and flood coolant to drive an external relay. + + Grbl_ESP32 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. + + Grbl 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 Grbl_ESP32. If not, see . +*/ + +#define MACHINE_NAME "FYSTEC E4 3D Printer Controller" + +#define N_AXIS 4 + +#define TRINAMIC_RUN_MODE TrinamicMode :: StealthChop +#define TRINAMIC_HOMING_MODE TrinamicMode :: StealthChop + +#define TMC_UART UART_NUM_1 +#define TMC_UART_RX GPIO_NUM_21 +#define TMC_UART_TX GPIO_NUM_22 + +#define X_TRINAMIC_DRIVER 2209 +#define X_STEP_PIN GPIO_NUM_27 +#define X_DIRECTION_PIN GPIO_NUM_26 +#define X_RSENSE TMC2209_RSENSE_DEFAULT +#define X_DRIVER_ADDRESS 1 +#define DEFAULT_X_MICROSTEPS 16 + +#define Y_TRINAMIC_DRIVER 2209 +#define Y_STEP_PIN GPIO_NUM_33 +#define Y_DIRECTION_PIN GPIO_NUM_32 +#define Y_RSENSE TMC2209_RSENSE_DEFAULT +#define Y_DRIVER_ADDRESS 3 +#define DEFAULT_Y_MICROSTEPS 16 + +#define Z_TRINAMIC_DRIVER 2209 +#define Z_STEP_PIN GPIO_NUM_14 +#define Z_DIRECTION_PIN GPIO_NUM_12 +#define Z_RSENSE TMC2209_RSENSE_DEFAULT +#define Z_DRIVER_ADDRESS 0 +#define DEFAULT_Z_MICROSTEPS 16 + +#define A_TRINAMIC_DRIVER 2209 +#define A_STEP_PIN GPIO_NUM_16 +#define A_DIRECTION_PIN GPIO_NUM_17 +#define A_RSENSE TMC2209_RSENSE_DEFAULT +#define A_DRIVER_ADDRESS 2 +#define DEFAULT_A_MICROSTEPS 16 + +#define X_LIMIT_PIN GPIO_NUM_34 +#define Y_LIMIT_PIN GPIO_NUM_35 +#define Z_LIMIT_PIN GPIO_NUM_15 +#define A_LIMIT_PIN GPIO_NUM_36 // Labeled TB +#define PROBE_PIN GPIO_NUM_39 // Labeled TE + +// OK to comment out to use pin for other features +#define STEPPERS_DISABLE_PIN GPIO_NUM_25 + +#define SPINDLE_TYPE SpindleType::RELAY +#define SPINDLE_OUTPUT_PIN GPIO_NUM_13 // labeled Fan +#define COOLANT_MIST_PIN GPIO_NUM_2 // Labeled Hotbed +#define COOLANT_FLOOD_PIN GPIO_NUM_4 // Labeled Heater \ No newline at end of file diff --git a/Grbl_Esp32/src/Machines/mpcnc_laser_module_v1p2.h b/Grbl_Esp32/src/Machines/mpcnc_laser_module_v1p2.h index f7b02d29..43f2864c 100644 --- a/Grbl_Esp32/src/Machines/mpcnc_laser_module_v1p2.h +++ b/Grbl_Esp32/src/Machines/mpcnc_laser_module_v1p2.h @@ -53,8 +53,8 @@ // OK to comment out to use pin for other features #define STEPPERS_DISABLE_PIN GPIO_NUM_13 -#define SPINDLE_TYPE SpindleType::PWM -#define SPINDLE_OUTPUT_PIN GPIO_NUM_16 +#define SPINDLE_TYPE SpindleType::LASER +#define LASER_OUTPUT_PIN GPIO_NUM_16 #define COOLANT_MIST_PIN GPIO_NUM_2 diff --git a/Grbl_Esp32/src/MotionControl.cpp b/Grbl_Esp32/src/MotionControl.cpp index 5d725ac9..74b53d26 100644 --- a/Grbl_Esp32/src/MotionControl.cpp +++ b/Grbl_Esp32/src/MotionControl.cpp @@ -246,16 +246,17 @@ static bool mask_is_single_axis(uint8_t axis_mask) { return axis_mask && ((axis_mask & (axis_mask - 1)) == 0); } -// return true if the axis is defined as a squared axis -// Squaring: is used on gantry type axes that have two motors -// Each motor with touch off its own switch to square the axis -static bool mask_has_squared_axis(uint8_t axis_mask) { - return axis_mask & homing_squared_axes->get(); -} - -// return true if axis_mask refers to a single squared axis static bool axis_is_squared(uint8_t axis_mask) { - return mask_is_single_axis(axis_mask) && mask_has_squared_axis(axis_mask); + // Squaring can only be done if it is the only axis in the mask + if (axis_mask & homing_squared_axes->get()) { + if (mask_is_single_axis(axis_mask)) { + return true; + } + grbl_msg_sendf(CLIENT_ALL, MsgLevel::Info, "Cannot multi-axis home with squared axes. Homing normally"); + return false; + } + + return false; } #ifdef USE_I2S_STEPS diff --git a/Grbl_Esp32/src/Motors/Motors.cpp b/Grbl_Esp32/src/Motors/Motors.cpp index 8c7d550a..1c06a7d7 100644 --- a/Grbl_Esp32/src/Motors/Motors.cpp +++ b/Grbl_Esp32/src/Motors/Motors.cpp @@ -42,17 +42,29 @@ #include "RcServo.h" #include "Dynamixel2.h" #include "TrinamicDriver.h" +#include "TrinamicUartDriver.h" -Motors::Motor* myMotor[MAX_AXES][MAX_GANGED]; // number of axes (normal and ganged) -void init_motors() { +Motors::Motor* myMotor[MAX_AXES][MAX_GANGED]; // number of axes (normal and ganged) +void init_motors() { grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Init Motors"); auto n_axis = number_axis->get(); if (n_axis >= 1) { #ifdef X_TRINAMIC_DRIVER - myMotor[X_AXIS][0] = new Motors::TrinamicDriver( - X_AXIS, X_STEP_PIN, X_DIRECTION_PIN, X_DISABLE_PIN, X_CS_PIN, X_TRINAMIC_DRIVER, X_RSENSE); +# if (X_TRINAMIC_DRIVER == 2130 || X_TRINAMIC_DRIVER == 5160) + { + myMotor[X_AXIS][0] = + new Motors::TrinamicDriver(X_AXIS, X_STEP_PIN, X_DIRECTION_PIN, X_DISABLE_PIN, X_CS_PIN, X_TRINAMIC_DRIVER, X_RSENSE); + } +# elif (X_TRINAMIC_DRIVER == 2208 || X_TRINAMIC_DRIVER == 2209) + { + myMotor[X_AXIS][0] = new Motors::TrinamicUartDriver( + X_AXIS, X_STEP_PIN, X_DIRECTION_PIN, X_DISABLE_PIN, X_TRINAMIC_DRIVER, X_RSENSE, X_DRIVER_ADDRESS); + } +# else +# error X Axis undefined motor p/n +# endif #elif defined(X_SERVO_PIN) myMotor[X_AXIS][0] = new Motors::RcServo(X_AXIS, X_SERVO_PIN); #elif defined(X_UNIPOLAR) @@ -66,8 +78,19 @@ void init_motors() { #endif #ifdef X2_TRINAMIC_DRIVER - myMotor[X_AXIS][1] = new Motors::TrinamicDriver( - X2_AXIS, X2_STEP_PIN, X2_DIRECTION_PIN, X2_DISABLE_PIN, X2_CS_PIN, X2_TRINAMIC_DRIVER, X2_RSENSE); +# if (X_TRINAMIC_DRIVER == 2130 || X_TRINAMIC_DRIVER == 5160) + { + myMotor[X_AXIS][1] = + new Motors::TrinamicDriver(X2_AXIS, X2_STEP_PIN, X2_DIRECTION_PIN, X2_DISABLE_PIN, X2_CS_PIN, X2_TRINAMIC_DRIVER, X2_RSENSE); + } +# elif (X2_TRINAMIC_DRIVER == 2208 || X2_TRINAMIC_DRIVER == 2209) + { + myMotor[X_AXIS][1] = new Motors::TrinamicUartDriver( + X2_AXIS, X2_STEP_PIN, X2_DIRECTION_PIN, X2_DISABLE_PIN, X2_TRINAMIC_DRIVER, X2_RSENSE, X2_DRIVER_ADDRESS); + } +# else +# error X2 Axis undefined motor p/n +# endif #elif defined(X2_UNIPOLAR) myMotor[X_AXIS][1] = new Motors::UnipolarMotor(X2_AXIS, X2_PIN_PHASE_0, X2_PIN_PHASE_1, X2_PIN_PHASE_2, X2_PIN_PHASE_3); #elif defined(X2_STEP_PIN) @@ -83,8 +106,19 @@ void init_motors() { if (n_axis >= 2) { // this WILL be done better with settings #ifdef Y_TRINAMIC_DRIVER - myMotor[Y_AXIS][0] = new Motors::TrinamicDriver( - Y_AXIS, Y_STEP_PIN, Y_DIRECTION_PIN, Y_DISABLE_PIN, Y_CS_PIN, Y_TRINAMIC_DRIVER, Y_RSENSE); +# if (X_TRINAMIC_DRIVER == 2130 || X_TRINAMIC_DRIVER == 5160) + { + myMotor[Y_AXIS][0] = + new Motors::TrinamicDriver(Y_AXIS, Y_STEP_PIN, Y_DIRECTION_PIN, Y_DISABLE_PIN, Y_CS_PIN, Y_TRINAMIC_DRIVER, Y_RSENSE); + } +# elif (Y_TRINAMIC_DRIVER == 2208 || Y_TRINAMIC_DRIVER == 2209) + { + myMotor[Y_AXIS][0] = new Motors::TrinamicUartDriver( + Y_AXIS, Y_STEP_PIN, Y_DIRECTION_PIN, Y_DISABLE_PIN, Y_TRINAMIC_DRIVER, Y_RSENSE, Y_DRIVER_ADDRESS); + } +# else +# error Y Axis undefined motor p/n +# endif #elif defined(Y_SERVO_PIN) myMotor[Y_AXIS][0] = new Motors::RcServo(Y_AXIS, Y_SERVO_PIN); #elif defined(Y_UNIPOLAR) @@ -98,8 +132,19 @@ void init_motors() { #endif #ifdef Y2_TRINAMIC_DRIVER - myMotor[Y_AXIS][1] = new Motors::TrinamicDriver( - Y2_AXIS, Y2_STEP_PIN, Y2_DIRECTION_PIN, Y2_DISABLE_PIN, Y2_CS_PIN, Y2_TRINAMIC_DRIVER, Y2_RSENSE); +# if (X_TRINAMIC_DRIVER == 2130 || X_TRINAMIC_DRIVER == 5160) + { + myMotor[Y_AXIS][1] = + new Motors::TrinamicDriver(Y2_AXIS, Y2_STEP_PIN, Y2_DIRECTION_PIN, Y2_DISABLE_PIN, Y2_CS_PIN, Y2_TRINAMIC_DRIVER, Y2_RSENSE); + } +# elif (Y2_TRINAMIC_DRIVER == 2208 || Y2_TRINAMIC_DRIVER == 2209) + { + myMotor[Y_AXIS][1] = new Motors::TrinamicUartDriver( + Y2_AXIS, Y2_STEP_PIN, Y2_DIRECTION_PIN, Y2_DISABLE_PIN, Y2_TRINAMIC_DRIVER, Y2_RSENSE, Y2_DRIVER_ADDRESS); + } +# else +# error Y2 Axis undefined motor p/n +# endif #elif defined(Y2_UNIPOLAR) myMotor[Y_AXIS][1] = new Motors::UnipolarMotor(Y2_AXIS, Y2_PIN_PHASE_0, Y2_PIN_PHASE_1, Y2_PIN_PHASE_2, Y2_PIN_PHASE_3); #elif defined(Y2_STEP_PIN) @@ -115,8 +160,19 @@ void init_motors() { if (n_axis >= 3) { // this WILL be done better with settings #ifdef Z_TRINAMIC_DRIVER - myMotor[Z_AXIS][0] = new Motors::TrinamicDriver( - Z_AXIS, Z_STEP_PIN, Z_DIRECTION_PIN, Z_DISABLE_PIN, Z_CS_PIN, Z_TRINAMIC_DRIVER, Z_RSENSE); +# if (X_TRINAMIC_DRIVER == 2130 || X_TRINAMIC_DRIVER == 5160) + { + myMotor[Z_AXIS][0] = + new Motors::TrinamicDriver(Z_AXIS, Z_STEP_PIN, Z_DIRECTION_PIN, Z_DISABLE_PIN, Z_CS_PIN, Z_TRINAMIC_DRIVER, Z_RSENSE); + } +# elif (Z_TRINAMIC_DRIVER == 2208 || Z_TRINAMIC_DRIVER == 2209) + { + myMotor[Z_AXIS][0] = new Motors::TrinamicUartDriver( + Z_AXIS, Z_STEP_PIN, Z_DIRECTION_PIN, Z_DISABLE_PIN, Z_TRINAMIC_DRIVER, Z_RSENSE, Z_DRIVER_ADDRESS); + } +# else +# error Z Axis undefined motor p/n +# endif #elif defined(Z_SERVO_PIN) myMotor[Z_AXIS][0] = new Motors::RcServo(Z_AXIS, Z_SERVO_PIN); #elif defined(Z_UNIPOLAR) @@ -130,8 +186,19 @@ void init_motors() { #endif #ifdef Z2_TRINAMIC_DRIVER - myMotor[Z_AXIS][1] = new Motors::TrinamicDriver( - Z2_AXIS, Z2_STEP_PIN, Z2_DIRECTION_PIN, Z2_DISABLE_PIN, Z2_CS_PIN, Z2_TRINAMIC_DRIVER, Z2_RSENSE); +# if (X_TRINAMIC_DRIVER == 2130 || X_TRINAMIC_DRIVER == 5160) + { + myMotor[Z_AXIS][1] = + new Motors::TrinamicDriver(Z2_AXIS, Z2_STEP_PIN, Z2_DIRECTION_PIN, Z2_DISABLE_PIN, Z2_CS_PIN, Z2_TRINAMIC_DRIVER, Z2_RSENSE); + } +# elif (Z2_TRINAMIC_DRIVER == 2208 || Z2_TRINAMIC_DRIVER == 2209) + { + myMotor[Z_AXIS][1] = new Motors::TrinamicUartDriver( + Z2_AXIS, Z2_STEP_PIN, Z2_DIRECTION_PIN, Z2_DISABLE_PIN, Z2_TRINAMIC_DRIVER, Z2_RSENSE, Z2_DRIVER_ADDRESS); + } +# else +# error Z2 Axis undefined motor p/n +# endif #elif defined(Z2_UNIPOLAR) myMotor[Z_AXIS][1] = new Motors::UnipolarMotor(Z2_AXIS, Z2_PIN_PHASE_0, Z2_PIN_PHASE_1, Z2_PIN_PHASE_2, Z2_PIN_PHASE_3); #elif defined(Z2_STEP_PIN) @@ -147,8 +214,19 @@ void init_motors() { if (n_axis >= 4) { // this WILL be done better with settings #ifdef A_TRINAMIC_DRIVER - myMotor[A_AXIS][0] = new Motors::TrinamicDriver( - A_AXIS, A_STEP_PIN, A_DIRECTION_PIN, A_DISABLE_PIN, A_CS_PIN, A_TRINAMIC_DRIVER, A_RSENSE); +# if (X_TRINAMIC_DRIVER == 2130 || X_TRINAMIC_DRIVER == 5160) + { + myMotor[A_AXIS][1] = + new Motors::TrinamicDriver(A_AXIS, A_STEP_PIN, A_DIRECTION_PIN, A_DISABLE_PIN, A_CS_PIN, A_TRINAMIC_DRIVER, A_RSENSE); + } +# elif (A_TRINAMIC_DRIVER == 2208 || A_TRINAMIC_DRIVER == 2209) + { + myMotor[A_AXIS][0] = new Motors::TrinamicUartDriver( + A_AXIS, A_STEP_PIN, A_DIRECTION_PIN, A_DISABLE_PIN, A_TRINAMIC_DRIVER, A_RSENSE, A_DRIVER_ADDRESS); + } +# else +# error A Axis undefined motor p/n +# endif #elif defined(A_SERVO_PIN) myMotor[A_AXIS][0] = new Motors::RcServo(A_AXIS, A_SERVO_PIN); #elif defined(A_UNIPOLAR) @@ -162,8 +240,19 @@ void init_motors() { #endif #ifdef A2_TRINAMIC_DRIVER - myMotor[A_AXIS][1] = new Motors::TrinamicDriver( - A2_AXIS, A2_STEP_PIN, A2_DIRECTION_PIN, A2_DISABLE_PIN, A2_CS_PIN, A2_TRINAMIC_DRIVER, A2_RSENSE); +# if (X_TRINAMIC_DRIVER == 2130 || X_TRINAMIC_DRIVER == 5160) + { + myMotor[A_AXIS][1] = + new Motors::TrinamicDriver(A2_AXIS, A2_STEP_PIN, A2_DIRECTION_PIN, A2_DISABLE_PIN, A2_CS_PIN, A2_TRINAMIC_DRIVER, A2_RSENSE); + } +# elif (A2_TRINAMIC_DRIVER == 2208 || A2_TRINAMIC_DRIVER == 2209) + { + myMotor[A_AXIS][1] = new Motors::TrinamicUartDriver( + A2_AXIS, A2_STEP_PIN, A2_DIRECTION_PIN, A2_DISABLE_PIN, A2_TRINAMIC_DRIVER, A2_RSENSE, A2_DRIVER_ADDRESS); + } +# else +# error A2 Axis undefined motor p/n +# endif #elif defined(A2_UNIPOLAR) myMotor[A_AXIS][1] = new Motors::UnipolarMotor(A2_AXIS, A2_PIN_PHASE_0, A2_PIN_PHASE_1, A2_PIN_PHASE_2, A2_PIN_PHASE_3); #elif defined(A2_STEP_PIN) @@ -179,8 +268,19 @@ void init_motors() { if (n_axis >= 5) { // this WILL be done better with settings #ifdef B_TRINAMIC_DRIVER - myMotor[B_AXIS][0] = new Motors::TrinamicDriver( - B_AXIS, B_STEP_PIN, B_DIRECTION_PIN, B_DISABLE_PIN, B_CS_PIN, B_TRINAMIC_DRIVER, B_RSENSE); +# if (X_TRINAMIC_DRIVER == 2130 || X_TRINAMIC_DRIVER == 5160) + { + myMotor[B_AXIS][1] = + new Motors::TrinamicDriver(B_AXIS, B_STEP_PIN, B_DIRECTION_PIN, B_DISABLE_PIN, B_CS_PIN, B_TRINAMIC_DRIVER, B_RSENSE); + } +# elif (B_TRINAMIC_DRIVER == 2208 || B_TRINAMIC_DRIVER == 2209) + { + myMotor[B_AXIS][0] = new Motors::TrinamicUartDriver( + B_AXIS, B_STEP_PIN, B_DIRECTION_PIN, B_DISABLE_PIN, B_TRINAMIC_DRIVER, B_RSENSE, B_DRIVER_ADDRESS); + } +# else +# error B Axis undefined motor p/n +# endif #elif defined(B_SERVO_PIN) myMotor[B_AXIS][0] = new Motors::RcServo(B_AXIS, B_SERVO_PIN); #elif defined(B_UNIPOLAR) @@ -194,8 +294,19 @@ void init_motors() { #endif #ifdef B2_TRINAMIC_DRIVER - myMotor[B_AXIS][1] = new Motors::TrinamicDriver( - B2_AXIS, B2_STEP_PIN, B2_DIRECTION_PIN, B2_DISABLE_PIN, B2_CS_PIN, B2_TRINAMIC_DRIVER, B2_RSENSE); +# if (X_TRINAMIC_DRIVER == 2130 || X_TRINAMIC_DRIVER == 5160) + { + myMotor[B_AXIS][1] = + new Motors::TrinamicDriver(B2_AXIS, B2_STEP_PIN, B2_DIRECTION_PIN, B2_DISABLE_PIN, B2_CS_PIN, B2_TRINAMIC_DRIVER, B2_RSENSE); + } +# elif (B2_TRINAMIC_DRIVER == 2208 || B2_TRINAMIC_DRIVER == 2209) + { + myMotor[B_AXIS][1] = new Motors::TrinamicUartDriver( + B2_AXIS, B2_STEP_PIN, B2_DIRECTION_PIN, B2_DISABLE_PIN, B2_TRINAMIC_DRIVER, B2_RSENSE, B2_DRIVER_ADDRESS); + } +# else +# error B2 Axis undefined motor p/n +# endif #elif defined(B2_UNIPOLAR) myMotor[B_AXIS][1] = new Motors::UnipolarMotor(B2_AXIS, B2_PIN_PHASE_0, B2_PIN_PHASE_1, B2_PIN_PHASE_2, B2_PIN_PHASE_3); #elif defined(B2_STEP_PIN) @@ -211,8 +322,19 @@ void init_motors() { if (n_axis >= 6) { // this WILL be done better with settings #ifdef C_TRINAMIC_DRIVER - myMotor[C_AXIS][0] = new Motors::TrinamicDriver( - C_AXIS, C_STEP_PIN, C_DIRECTION_PIN, C_DISABLE_PIN, C_CS_PIN, C_TRINAMIC_DRIVER, C_RSENSE); +# if (X_TRINAMIC_DRIVER == 2130 || X_TRINAMIC_DRIVER == 5160) + { + myMotor[C_AXIS][1] = + new Motors::TrinamicDriver(C_AXIS, C_STEP_PIN, C_DIRECTION_PIN, C_DISABLE_PIN, C_CS_PIN, C_TRINAMIC_DRIVER, C_RSENSE); + } +# elif (C_TRINAMIC_DRIVER == 2208 || C_TRINAMIC_DRIVER == 2209) + { + myMotor[C_AXIS][0] = new Motors::TrinamicUartDriver( + C_AXIS, C_STEP_PIN, C_DIRECTION_PIN, C_DISABLE_PIN, C_TRINAMIC_DRIVER, C_RSENSE, C_DRIVER_ADDRESS); + } +# else +# error C Axis undefined motor p/n +# endif #elif defined(C_SERVO_PIN) myMotor[C_AXIS][0] = new Motors::RcServo(C_AXIS, C_SERVO_PIN); #elif defined(C_UNIPOLAR) @@ -226,8 +348,19 @@ void init_motors() { #endif #ifdef C2_TRINAMIC_DRIVER - myMotor[C_AXIS][1] = new Motors::TrinamicDriver( - C2_AXIS, C2_STEP_PIN, C2_DIRECTION_PIN, C2_DISABLE_PIN, C2_CS_PIN, C2_TRINAMIC_DRIVER, C2_RSENSE); +# if (X_TRINAMIC_DRIVER == 2130 || X_TRINAMIC_DRIVER == 5160) + { + myMotor[C_AXIS][1] = + new Motors::TrinamicDriver(C2_AXIS, C2_STEP_PIN, C2_DIRECTION_PIN, C2_DISABLE_PIN, C2_CS_PIN, C2_TRINAMIC_DRIVER, C2_RSENSE); + } +# elif (C2_TRINAMIC_DRIVER == 2208 || C2_TRINAMIC_DRIVER == 2209) + { + myMotor[C_AXIS][1] = new Motors::TrinamicUartDriver( + C2_AXIS, C2_STEP_PIN, C2_DIRECTION_PIN, C2_DISABLE_PIN, C2_TRINAMIC_DRIVER, C2_RSENSE, C2_DRIVER_ADDRESS); + } +# else +# error C2 Axis undefined motor p/n +# endif #elif defined(C2_UNIPOLAR) myMotor[C_AXIS][1] = new Motors::UnipolarMotor(C2_AXIS, C2_PIN_PHASE_0, C2_PIN_PHASE_1, C2_PIN_PHASE_2, C2_PIN_PHASE_3); #elif defined(C2_STEP_PIN) @@ -279,23 +412,16 @@ void init_motors() { } } -void motors_set_disable(bool disable) { +void motors_set_disable(bool disable, uint8_t mask) { static bool previous_state = true; - //grbl_msg_sendf(CLIENT_SERIAL, MSG_LEVEL_INFO, "Motors disable %d", disable); - - /* - if (previous_state == disable) { - return; - } - previous_state = disable; -*/ - // now loop through all the motors to see if they can individually disable auto n_axis = number_axis->get(); for (uint8_t gang_index = 0; gang_index < MAX_GANGED; gang_index++) { for (uint8_t axis = X_AXIS; axis < n_axis; axis++) { - myMotor[axis][gang_index]->set_disable(disable); + if (bitnum_istrue(mask, axis)) { + myMotor[axis][gang_index]->set_disable(disable); + } } } @@ -320,7 +446,7 @@ void motors_read_settings() { // They can use this to setup things like Stall uint8_t motors_set_homing_mode(uint8_t homing_mask, bool isHoming) { uint8_t can_home = 0; - auto n_axis = number_axis->get(); + auto n_axis = number_axis->get(); for (uint8_t axis = X_AXIS; axis < n_axis; axis++) { if (bitnum_istrue(homing_mask, axis)) { if (myMotor[axis][0]->set_homing_mode(isHoming)) { @@ -367,4 +493,4 @@ void motors_unstep() { myMotor[axis][0]->unstep(); myMotor[axis][1]->unstep(); } -} +} \ No newline at end of file diff --git a/Grbl_Esp32/src/Motors/Motors.h b/Grbl_Esp32/src/Motors/Motors.h index a6451eff..14550f68 100644 --- a/Grbl_Esp32/src/Motors/Motors.h +++ b/Grbl_Esp32/src/Motors/Motors.h @@ -39,7 +39,7 @@ void motors_read_settings(); // The return value is a bitmask of axes that can home uint8_t motors_set_homing_mode(uint8_t homing_mask, bool isHoming); -void motors_set_disable(bool disable); +void motors_set_disable(bool disable, uint8_t mask = B11111111); // default is all axes void motors_step(uint8_t step_mask, uint8_t dir_mask); void motors_unstep(); diff --git a/Grbl_Esp32/src/Motors/Servo.cpp b/Grbl_Esp32/src/Motors/Servo.cpp index 65e213a1..3702f06b 100644 --- a/Grbl_Esp32/src/Motors/Servo.cpp +++ b/Grbl_Esp32/src/Motors/Servo.cpp @@ -40,6 +40,7 @@ namespace Motors { } void Servo::startUpdateTask() { + grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Servo Update Task Started"); if (this == List) { xTaskCreatePinnedToCore(updateTask, // task "servoUpdateTask", // name for task @@ -47,7 +48,7 @@ namespace Motors { NULL, // parameters 1, // priority NULL, // handle - 0 // core + SUPPORT_TASK_CORE // core ); } } @@ -67,7 +68,9 @@ namespace Motors { vTaskDelayUntil(&xLastWakeTime, xUpdate); static UBaseType_t uxHighWaterMark = 0; +#ifdef DEBUG_TASK_STACK reportTaskStackSize(uxHighWaterMark); +#endif } } diff --git a/Grbl_Esp32/src/Motors/StandardStepper.cpp b/Grbl_Esp32/src/Motors/StandardStepper.cpp index d2a2e51a..8e782ba4 100644 --- a/Grbl_Esp32/src/Motors/StandardStepper.cpp +++ b/Grbl_Esp32/src/Motors/StandardStepper.cpp @@ -44,10 +44,14 @@ namespace Motors { } void StandardStepper::init() { - init_step_dir_pins(); + read_settings(); config_message(); } + void StandardStepper::read_settings() { + init_step_dir_pins(); + } + void StandardStepper::init_step_dir_pins() { _invert_step_pin = bitnum_istrue(step_invert_mask->get(), _axis_index); _invert_dir_pin = bitnum_istrue(dir_invert_mask->get(), _axis_index); diff --git a/Grbl_Esp32/src/Motors/StandardStepper.h b/Grbl_Esp32/src/Motors/StandardStepper.h index efc72f66..269e5b2f 100644 --- a/Grbl_Esp32/src/Motors/StandardStepper.h +++ b/Grbl_Esp32/src/Motors/StandardStepper.h @@ -15,6 +15,7 @@ namespace Motors { void set_direction(bool) override; void step() override; void unstep() override; + void read_settings() override; void init_step_dir_pins(); diff --git a/Grbl_Esp32/src/Motors/TrinamicDriver.cpp b/Grbl_Esp32/src/Motors/TrinamicDriver.cpp index af0f39e7..26229dd2 100644 --- a/Grbl_Esp32/src/Motors/TrinamicDriver.cpp +++ b/Grbl_Esp32/src/Motors/TrinamicDriver.cpp @@ -67,8 +67,7 @@ namespace Motors { return; } - _has_errors = false; - init_step_dir_pins(); // from StandardStepper + _has_errors = false; digitalWrite(_cs_pin, HIGH); pinMode(_cs_pin, OUTPUT); @@ -115,7 +114,8 @@ namespace Motors { NULL, // parameters 1, // priority NULL, - 0 // core + SUPPORT_TASK_CORE // must run the task on same core + // core ); } } @@ -210,6 +210,8 @@ namespace Motors { } tmcstepper->microsteps(axis_settings[_axis_index]->microsteps->get()); tmcstepper->rms_current(run_i_ma, hold_i_percent); + + init_step_dir_pins(); } bool TrinamicDriver::set_homing_mode(bool isHoming) { @@ -353,10 +355,6 @@ namespace Motors { xLastWakeTime = xTaskGetTickCount(); // Initialise the xLastWakeTime variable with the current time. while (true) { // don't ever return from this or the task dies - if (motorSettingChanged) { - motors_read_settings(); - motorSettingChanged = false; - } if (stallguard_debug_mask->get() != 0) { if (sys.state == State::Cycle || sys.state == State::Homing || sys.state == State::Jog) { for (TrinamicDriver* p = List; p; p = p->link) { @@ -371,7 +369,9 @@ namespace Motors { vTaskDelayUntil(&xLastWakeTime, xreadSg); static UBaseType_t uxHighWaterMark = 0; +#ifdef DEBUG_TASK_STACK reportTaskStackSize(uxHighWaterMark); +#endif } } diff --git a/Grbl_Esp32/src/Motors/TrinamicUartDriver.h b/Grbl_Esp32/src/Motors/TrinamicUartDriver.h new file mode 100644 index 00000000..3fb6e7cd --- /dev/null +++ b/Grbl_Esp32/src/Motors/TrinamicUartDriver.h @@ -0,0 +1,131 @@ +#pragma once + +/* + TrinamicUartDriver.h + + Part of Grbl_ESP32 + 2020 - The Ant Team + 2020 - Bart Dring + + Grbl 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. + Grbl 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 Grbl. If not, see . +*/ + +#include "Motor.h" +#include "StandardStepper.h" + +#include // https://github.com/teemuatlut/TMCStepper + +const float TMC2208_RSENSE_DEFAULT = 0.11f; +const float TMC2209_RSENSE_DEFAULT = 0.11f; + +const double TRINAMIC_UART_FCLK = 12700000.0; // Internal clock Approx (Hz) used to calculate TSTEP from homing rate + +// ==== defaults OK to define them in your machine definition ==== + +#ifndef TRINAMIC_UART_RUN_MODE +# define TRINAMIC_UART_RUN_MODE TrinamicUartMode ::StealthChop +#endif + +#ifndef TRINAMIC_UART_HOMING_MODE +# define TRINAMIC_UART_HOMING_MODE TRINAMIC_UART_RUN_MODE +#endif + +#ifndef TRINAMIC_UART_TOFF_DISABLE +# define TRINAMIC_UART_TOFF_DISABLE 0 +#endif + +#ifndef TRINAMIC_UART_TOFF_STEALTHCHOP +# define TRINAMIC_UART_TOFF_STEALTHCHOP 5 +#endif + +#ifndef TRINAMIC_UART_TOFF_COOLSTEP +# define TRINAMIC_UART_TOFF_COOLSTEP 3 +#endif + +#ifndef TMC_UART +# define TMC_UART UART_NUM_2 +#endif + +#ifndef TMC_UART_RX +# define TMC_UART_RX UNDEFINED_PIN +#endif + +#ifndef TMC_UART_TX +# define TMC_UART_TX UNDEFINED_PIN +#endif + +extern HardwareSerial tmc_serial; + +namespace Motors { + + enum class TrinamicUartMode : uint8_t { + None = 0, // not for machine defs! + StealthChop = 1, + CoolStep = 2, + StallGuard = 3, + }; + + class TrinamicUartDriver : public StandardStepper { + public: + TrinamicUartDriver(uint8_t axis_index, + uint8_t step_pin, + uint8_t dir_pin, + uint8_t disable_pin, + uint16_t driver_part_number, + float r_senseS, + uint8_t address); + + void config_message(); + void hw_serial_init(); + void init(); + void set_mode(); + void read_settings(); + void debug_message(); + bool set_homing_mode(bool is_homing) override; + void set_disable(bool disable) override; + + uint8_t addr; + + private: + uint32_t calc_tstep(float speed, float percent); //TODO: see if this is useful/used. + + TMC2208Stepper* tmcstepper; // all other driver types are subclasses of this one + TrinamicUartMode _homing_mode; + uint16_t _driver_part_number; // example: use 2209 for TMC2209 + float _r_sense; + bool _has_errors; + bool _disabled; + + TrinamicUartMode _mode = TrinamicUartMode::None; + bool test(); + void set_mode(bool isHoming); + void trinamic_test_response(); + void trinamic_stepper_enable(bool enable); + + bool report_open_load(TMC2208_n ::DRV_STATUS_t status); + bool report_short_to_ground(TMC2208_n ::DRV_STATUS_t status); + bool report_over_temp(TMC2208_n ::DRV_STATUS_t status); + bool report_short_to_ps(TMC2208_n ::DRV_STATUS_t status); + + uint8_t get_next_index(); + + // Linked list of Trinamic driver instances, used by the + // StallGuard reporting task. TODO: verify if this is really used/useful. + static TrinamicUartDriver* List; + TrinamicUartDriver* link; + static void readSgTask(void*); + + protected: + // void config_message() override; + }; + +} \ No newline at end of file diff --git a/Grbl_Esp32/src/Motors/TrinamicUartDriverClass.cpp b/Grbl_Esp32/src/Motors/TrinamicUartDriverClass.cpp new file mode 100644 index 00000000..e930a848 --- /dev/null +++ b/Grbl_Esp32/src/Motors/TrinamicUartDriverClass.cpp @@ -0,0 +1,370 @@ +/* + TrinamicUartDriverClass.cpp + + This is used for Trinamic UART controlled stepper motor drivers. + + Part of Grbl_ESP32 + 2020 - The Ant Team + 2020 - Bart Dring + + Grbl 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. + Grbl 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 Grbl. If not, see . + +*/ +#include "TrinamicUartDriver.h" + +#include + +HardwareSerial tmc_serial(TMC_UART); + +namespace Motors { + + /* HW Serial Constructor. */ + TrinamicUartDriver::TrinamicUartDriver( + uint8_t axis_index, uint8_t step_pin, uint8_t dir_pin, uint8_t disable_pin, uint16_t driver_part_number, float r_sense, uint8_t addr) : + StandardStepper(axis_index, step_pin, dir_pin, disable_pin) { + _driver_part_number = driver_part_number; + _has_errors = false; + _r_sense = r_sense; + this->addr = addr; + + uart_set_pin(TMC_UART, TMC_UART_TX, TMC_UART_RX, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); + tmc_serial.begin(115200, SERIAL_8N1, TMC_UART_RX, TMC_UART_TX); + tmc_serial.setRxBufferSize(128); + hw_serial_init(); + } + + void TrinamicUartDriver::hw_serial_init() { + if (_driver_part_number == 2208) + // TMC 2208 does not use address, this field is 0 + tmcstepper = new TMC2208Stepper(&tmc_serial, _r_sense); + else if (_driver_part_number == 2209) + tmcstepper = new TMC2209Stepper(&tmc_serial, _r_sense, addr); + else { + grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Unsupported Trinamic motor p/n:%d", _driver_part_number); + return; + } + } + + void TrinamicUartDriver ::init() { + if (_has_errors) { + return; + } + + init_step_dir_pins(); // from StandardStepper + config_message(); + + tmcstepper->begin(); + + _has_errors = !test(); // Try communicating with motor. Prints an error if there is a problem. + + /* If communication with the driver is working, read the + main settings, apply new driver settings and then read + them back. */ + if (!_has_errors) { //TODO: verify if this is the right way to set the Irun/IHold and microsteps. + read_settings(); + set_mode(false); + } + } + + /* + This is the startup message showing the basic definition. + */ + void TrinamicUartDriver::config_message() { //TODO: The RX/TX pin could be added to the msg. + grbl_msg_sendf(CLIENT_SERIAL, + MsgLevel::Info, + "%s motor Trinamic TMC%d Step:%s Dir:%s Disable:%s UART%d Rx:%s Tx:%s Addr:%d R:%0.3f %s", + reportAxisNameMsg(_axis_index, _dual_axis_index), + _driver_part_number, + pinName(_step_pin).c_str(), + pinName(_dir_pin).c_str(), + pinName(_disable_pin).c_str(), + TMC_UART, + pinName(TMC_UART_RX), + pinName(TMC_UART_TX), + this->addr, + _r_sense, + reportAxisLimitsMsg(_axis_index)); + } + + bool TrinamicUartDriver::test() { + if (_has_errors) { + return false; + } + switch (tmcstepper->test_connection()) { + case 1: + grbl_msg_sendf(CLIENT_SERIAL, + MsgLevel::Info, + "%s driver test failed. Check connection", + reportAxisNameMsg(_axis_index, _dual_axis_index)); + return false; + case 2: + grbl_msg_sendf(CLIENT_SERIAL, + MsgLevel::Info, + "%s driver test failed. Check motor power", + reportAxisNameMsg(_axis_index, _dual_axis_index)); + return false; + default: + // driver responded, so check for other errors from the DRV_STATUS register + + TMC2208_n ::DRV_STATUS_t status { 0 }; // a useful struct to access the bits. + status.sr = tmcstepper->DRV_STATUS(); + + bool err = false; + + // look for errors + if (report_short_to_ground(status)) { + err = true; + } + + if (report_over_temp(status)) { + err = true; + } + + if (report_short_to_ps(status)) { + err = true; + } + + if (err) { + return false; + } + + grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "%s driver test passed", reportAxisNameMsg(_axis_index, _dual_axis_index)); + return true; + } + } + + /* + Read setting and send them to the driver. Called at init() and whenever related settings change + both are stored as float Amps, but TMCStepper library expects... + uint16_t run (mA) + float hold (as a percentage of run) + */ + void TrinamicUartDriver::read_settings() { + if (_has_errors) { + return; + } + + uint16_t run_i_ma = (uint16_t)(axis_settings[_axis_index]->run_current->get() * 1000.0); + float hold_i_percent; + + if (axis_settings[_axis_index]->run_current->get() == 0) + hold_i_percent = 0; + else { + hold_i_percent = axis_settings[_axis_index]->hold_current->get() / axis_settings[_axis_index]->run_current->get(); + if (hold_i_percent > 1.0) + hold_i_percent = 1.0; + } + tmcstepper->microsteps(axis_settings[_axis_index]->microsteps->get()); + tmcstepper->rms_current(run_i_ma, hold_i_percent); + + // grbl_msg_sendf(CLIENT_SERIAL, + // MsgLevel::Info, + // "Setting current of driver %s, target: %u, read irun: %d, hold percent: %f, usteps: %d", + // reportAxisNameMsg(_axis_index, _dual_axis_index), run_i_ma, tmcstepper->rms_current(), hold_i_percent, axis_settings[_axis_index]->microsteps->get()); + } + + bool TrinamicUartDriver::set_homing_mode(bool isHoming) { + set_mode(isHoming); + return true; + } + + /* + There are ton of settings. I'll start by grouping then into modes for now. + Many people will want quiet and stallgaurd homing. Stallguard only run in + Coolstep mode, so it will need to switch to Coolstep when homing + */ + void TrinamicUartDriver::set_mode(bool isHoming) { + if (_has_errors) { + return; + } + + TrinamicUartMode newMode = isHoming ? TRINAMIC_UART_HOMING_MODE : TRINAMIC_UART_RUN_MODE; + + if (newMode == _mode) { + return; + } + _mode = newMode; + + switch (_mode) { + case TrinamicUartMode ::StealthChop: + //grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "StealthChop"); + // tmcstepper->en_pwm_mode(true); //TODO: check if this is present in TMC2208/09 + tmcstepper->en_spreadCycle(false); + tmcstepper->pwm_autoscale(true); + // if (_driver_part_number == 2209) { + // tmcstepper->diag1_stall(false); //TODO: check the equivalent in TMC2209 + // } + break; + case TrinamicUartMode ::CoolStep: + //grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Coolstep"); + // tmcstepper->en_pwm_mode(false); //TODO: check if this is present in TMC2208/09 + tmcstepper->en_spreadCycle(true); + tmcstepper->pwm_autoscale(false); + if (_driver_part_number == 2209) { + // tmcstepper->TCOOLTHRS(NORMAL_TCOOLTHRS); // when to turn on coolstep //TODO: add this solving compilation issue. + // tmcstepper->THIGH(NORMAL_THIGH); //TODO: this does not exist in TMC2208/09. verify and eventually remove. + } + break; + case TrinamicUartMode ::StallGuard: //TODO: check all configurations for stallguard + //grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Stallguard"); + // tmcstepper->en_pwm_mode(false); //TODO: check if this is present in TMC2208/09 + tmcstepper->en_spreadCycle(false); + tmcstepper->pwm_autoscale(false); + // tmcstepper->TCOOLTHRS(calc_tstep(homing_feed_rate->get(), 150.0)); + // tmcstepper->THIGH(calc_tstep(homing_feed_rate->get(), 60.0)); + // tmcstepper->sfilt(1); + // tmcstepper->diag1_stall(true); // stallguard i/o is on diag1 + // tmcstepper->sgt(axis_settings[_axis_index]->stallguard->get()); + break; + default: + grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Unknown Trinamic mode:d", _mode); + } + } + + /* + This is the stallguard tuning info. It is call debug, so it could be generic across all classes. + */ + void TrinamicUartDriver::debug_message() { + if (_has_errors) { + return; + } + uint32_t tstep = tmcstepper->TSTEP(); + + if (tstep == 0xFFFFF || tstep < 1) { // if axis is not moving return + return; + } + float feedrate = st_get_realtime_rate(); //* settings.microsteps[axis_index] / 60.0 ; // convert mm/min to Hz + + grbl_msg_sendf(CLIENT_SERIAL, + MsgLevel::Info, + "%s Stallguard %d SG_Val: %04d Rate: %05.0f mm/min SG_Setting:%d", + reportAxisNameMsg(_axis_index, _dual_axis_index), + 0, // tmcstepper->stallguard(), // TODO: add this again solving the compilation issues + 0, // tmcstepper->sg_result(), + feedrate, + axis_settings[_axis_index]->stallguard->get()); + + TMC2208_n ::DRV_STATUS_t status { 0 }; // a useful struct to access the bits. + status.sr = tmcstepper->DRV_STATUS(); + + // these only report if there is a fault condition + report_open_load(status); + report_short_to_ground(status); + report_over_temp(status); + report_short_to_ps(status); + + // grbl_msg_sendf(CLIENT_SERIAL, + // MsgLevel::Info, + // "%s Status Register %08x GSTAT %02x", + // reportAxisNameMsg(_axis_index, _dual_axis_index), + // status.sr, + // tmcstepper->GSTAT()); + } + + // calculate a tstep from a rate + // tstep = TRINAMIC_UART_FCLK / (time between 1/256 steps) + // This is used to set the stallguard window from the homing speed. + // The percent is the offset on the window + uint32_t TrinamicUartDriver::calc_tstep(float speed, float percent) { + float tstep = + speed / 60.0 * axis_settings[_axis_index]->steps_per_mm->get() * (float)(256 / axis_settings[_axis_index]->microsteps->get()); + tstep = TRINAMIC_UART_FCLK / tstep * percent / 100.0; + + return static_cast(tstep); + } + + // this can use the enable feature over SPI. The dedicated pin must be in the enable mode, + // but that can be hardwired that way. + void TrinamicUartDriver::set_disable(bool disable) { + if (_has_errors) { + return; + } + + if (_disabled == disable) { + return; + } + + _disabled = disable; + + digitalWrite(_disable_pin, _disabled); + +#ifdef USE_TRINAMIC_ENABLE + if (_disabled) { + tmcstepper->toff(TRINAMIC_UART_TOFF_DISABLE); + } else { + if (_mode == TrinamicUartMode::StealthChop) { + tmcstepper->toff(TRINAMIC_UART_TOFF_STEALTHCHOP); + } else { + tmcstepper->toff(TRINAMIC_UART_TOFF_COOLSTEP); + } + } +#endif + // the pin based enable could be added here. + // This would be for individual motors, not the single pin for all motors. + } + + // =========== Reporting functions ======================== + + bool TrinamicUartDriver::report_open_load(TMC2208_n ::DRV_STATUS_t status) { + if (status.ola || status.olb) { + grbl_msg_sendf(CLIENT_SERIAL, + MsgLevel::Info, + "%s Driver open load A:%s B:%s", + reportAxisNameMsg(_axis_index, _dual_axis_index), + status.ola ? "Y" : "N", + status.olb ? "Y" : "N"); + return true; + } + return false; // no error + } + + bool TrinamicUartDriver::report_short_to_ground(TMC2208_n ::DRV_STATUS_t status) { + if (status.s2ga || status.s2gb) { + grbl_msg_sendf(CLIENT_SERIAL, + MsgLevel::Info, + "%s Driver shorted coil A:%s B:%s", + reportAxisNameMsg(_axis_index, _dual_axis_index), + status.s2ga ? "Y" : "N", + status.s2gb ? "Y" : "N"); + return true; + } + return false; // no error + } + + bool TrinamicUartDriver::report_over_temp(TMC2208_n ::DRV_STATUS_t status) { + if (status.ot || status.otpw) { + grbl_msg_sendf(CLIENT_SERIAL, + MsgLevel::Info, + "%s Driver temp Warning:%s Fault:%s", + reportAxisNameMsg(_axis_index, _dual_axis_index), + status.otpw ? "Y" : "N", + status.ot ? "Y" : "N"); + return true; + } + return false; // no error + } + + bool TrinamicUartDriver::report_short_to_ps(TMC2208_n ::DRV_STATUS_t status) { + // check for short to power supply + if ((status.sr & bit(12)) || (status.sr & bit(13))) { + grbl_msg_sendf(CLIENT_SERIAL, + MsgLevel::Info, + "%s Driver short vsa:%s vsb:%s", + reportAxisNameMsg(_axis_index, _dual_axis_index), + (status.sr & bit(12)) ? "Y" : "N", + (status.sr & bit(13)) ? "Y" : "N"); + return true; + } + return false; // no error + } + +} \ No newline at end of file diff --git a/Grbl_Esp32/src/ProcessSettings.cpp b/Grbl_Esp32/src/ProcessSettings.cpp index f8539203..a6831713 100644 --- a/Grbl_Esp32/src/ProcessSettings.cpp +++ b/Grbl_Esp32/src/ProcessSettings.cpp @@ -79,7 +79,6 @@ namespace WebUI { } void settings_init() { - EEPROM.begin(EEPROM_SIZE); make_settings(); WebUI::make_web_settings(); make_grbl_commands(); @@ -389,13 +388,45 @@ Error listErrors(const char* value, WebUI::AuthenticationLevel auth_level, WebUI return Error::Ok; } +Error motor_disable(const char* value, WebUI::AuthenticationLevel auth_level, WebUI::ESPResponseStream* out) { + char* s; + if (value == NULL) { + value = "\0"; + } + + s = strdup(value); + s = trim(s); + + int32_t convertedValue; + char* endptr; + if (*s == '\0') { + convertedValue = 255; // all axes + } else { + convertedValue = strtol(s, &endptr, 10); + if (endptr == s || *endptr != '\0') { + // Try to convert as an axis list + convertedValue = 0; + auto axisNames = String("XYZABC"); + while (*s) { + int index = axisNames.indexOf(toupper(*s++)); + if (index < 0) { + return Error::BadNumberFormat; + } + convertedValue |= bit(index); + } + } + } + motors_set_disable(true, convertedValue); + return Error::Ok; +} + static bool anyState() { return false; } static bool idleOrJog() { return sys.state != State::Idle && sys.state != State::Jog; } -static bool idleOrAlarm() { +bool idleOrAlarm() { return sys.state != State::Idle && sys.state != State::Alarm; } static bool notCycleOrHold() { @@ -427,6 +458,8 @@ void make_grbl_commands() { new GrblCommand("V", "Settings/Stats", Setting::report_nvs_stats, idleOrAlarm); new GrblCommand("#", "GCode/Offsets", report_ngc, idleOrAlarm); new GrblCommand("H", "Home", home_all, idleOrAlarm); + new GrblCommand("MD", "Motor/Disable", motor_disable, idleOrAlarm); + #ifdef HOMING_SINGLE_AXIS_COMMANDS new GrblCommand("HX", "Home/X", home_x, idleOrAlarm); new GrblCommand("HY", "Home/Y", home_y, idleOrAlarm); diff --git a/Grbl_Esp32/src/Protocol.cpp b/Grbl_Esp32/src/Protocol.cpp index 982cecca..bfda25f5 100644 --- a/Grbl_Esp32/src/Protocol.cpp +++ b/Grbl_Esp32/src/Protocol.cpp @@ -96,7 +96,7 @@ bool can_park() { #ifdef ENABLE_PARKING_OVERRIDE_CONTROL sys.override_ctrl == Override::ParkingMotion && #endif - homing_enable->get() && !laser_mode->get(); + homing_enable->get() && !spindle->inLaserMode(); } /* @@ -558,7 +558,7 @@ static void protocol_exec_rt_suspend() { restore_spindle_speed = block->spindle_speed; } #ifdef DISABLE_LASER_DURING_HOLD - if (laser_mode->get()) { + if (spindle->inLaserMode()) { sys_rt_exec_accessory_override.bit.spindleOvrStop = true; } #endif @@ -661,7 +661,7 @@ static void protocol_exec_rt_suspend() { if (gc_state.modal.spindle != SpindleState::Disable) { // Block if safety door re-opened during prior restore actions. if (!sys.suspend.bit.restartRetract) { - if (laser_mode->get()) { + if (spindle->inLaserMode()) { // When in laser mode, ignore spindle spin-up delay. Set to turn on laser when cycle starts. sys.step_control.updateSpindleRpm = true; } else { @@ -717,7 +717,7 @@ static void protocol_exec_rt_suspend() { } else if (sys.spindle_stop_ovr.bit.restore || sys.spindle_stop_ovr.bit.restoreCycle) { if (gc_state.modal.spindle != SpindleState::Disable) { report_feedback_message(Message::SpindleRestore); - if (laser_mode->get()) { + if (spindle->inLaserMode()) { // When in laser mode, ignore spindle spin-up delay. Set to turn on laser when cycle starts. sys.step_control.updateSpindleRpm = true; } else { diff --git a/Grbl_Esp32/src/Report.cpp b/Grbl_Esp32/src/Report.cpp index 20cff520..33c53c11 100644 --- a/Grbl_Esp32/src/Report.cpp +++ b/Grbl_Esp32/src/Report.cpp @@ -239,6 +239,7 @@ void report_status_message(Error status_code, uint8_t client) { grbl_sendf(client, "error:%d\r\n", status_code); // most senders seem to tolerate this error and keep on going grbl_sendf(CLIENT_ALL, "error:%d in SD file at line %d\r\n", status_code, sd_get_current_line_number()); // don't close file + SD_ready_next = true; // flag so system_execute_line() will send the next line } else { grbl_notifyf("SD print error", "Error:%d during SD file at line: %d", status_code, sd_get_current_line_number()); grbl_sendf(CLIENT_ALL, "error:%d in SD file at line %d\r\n", status_code, sd_get_current_line_number()); @@ -753,16 +754,16 @@ void report_realtime_status(uint8_t client) { strcat(status, "S"); } if (ctrl_pin_state.bit.macro0) { - strcat(status, "M0"); + strcat(status, "0"); } if (ctrl_pin_state.bit.macro1) { - strcat(status, "M1"); + strcat(status, "1"); } if (ctrl_pin_state.bit.macro2) { - strcat(status, "M2"); + strcat(status, "2"); } if (ctrl_pin_state.bit.macro3) { - strcat(status, "M3"); + strcat(status, "3"); } } } diff --git a/Grbl_Esp32/src/SDCard.cpp b/Grbl_Esp32/src/SDCard.cpp index c2d8d3c1..2a6fab21 100644 --- a/Grbl_Esp32/src/SDCard.cpp +++ b/Grbl_Esp32/src/SDCard.cpp @@ -20,12 +20,12 @@ #include "SDCard.h" -File myFile; -bool SD_ready_next = false; // Grbl has processed a line and is waiting for another -uint8_t SD_client = CLIENT_SERIAL; +File myFile; +bool SD_ready_next = false; // Grbl has processed a line and is waiting for another +uint8_t SD_client = CLIENT_SERIAL; WebUI::AuthenticationLevel SD_auth_level = WebUI::AuthenticationLevel::LEVEL_GUEST; -uint32_t sd_current_line_number; // stores the most recent line number read from the SD -static char comment[LINE_BUFFER_SIZE]; // Line to be executed. Zero-terminated. +uint32_t sd_current_line_number; // stores the most recent line number read from the SD +static char comment[LINE_BUFFER_SIZE]; // Line to be executed. Zero-terminated. // attempt to mount the SD card /*bool sd_mount() @@ -128,13 +128,14 @@ uint32_t sd_get_current_line_number() { uint8_t sd_state = SDCARD_IDLE; uint8_t get_sd_state(bool refresh) { -#if defined(SDCARD_DET_PIN) && SDCARD_SD_PIN != -1 - //no need to go further if SD detect is not correct - if (!((digitalRead(SDCARD_DET_PIN) == SDCARD_DET_VAL) ? true : false)) { - sd_state = SDCARD_NOT_PRESENT; - return sd_state; + if (SDCARD_DET_PIN != UNDEFINED_PIN) { + if (digitalRead(SDCARD_DET_PIN) != SDCARD_DET_VAL) { + sd_state = SDCARD_NOT_PRESENT; + return sd_state; + //no need to go further if SD detect is not correct + } } -#endif + //if busy doing something return state if (!((sd_state == SDCARD_NOT_PRESENT) || (sd_state == SDCARD_IDLE))) { return sd_state; diff --git a/Grbl_Esp32/src/SDCard.h b/Grbl_Esp32/src/SDCard.h index a64a4e7d..298fbdec 100644 --- a/Grbl_Esp32/src/SDCard.h +++ b/Grbl_Esp32/src/SDCard.h @@ -20,8 +20,8 @@ #include #include -#define SDCARD_DET_PIN -1 -const int SDCARD_DET_VAL = 0; +//#define SDCARD_DET_PIN -1 +const int SDCARD_DET_VAL = 0; // for now, CD is close to ground const int SDCARD_IDLE = 0; const int SDCARD_NOT_PRESENT = 1; @@ -29,8 +29,8 @@ const int SDCARD_BUSY_PRINTING = 2; const int SDCARD_BUSY_UPLOADING = 4; const int SDCARD_BUSY_PARSING = 8; -extern bool SD_ready_next; // Grbl has processed a line and is waiting for another -extern uint8_t SD_client; +extern bool SD_ready_next; // Grbl has processed a line and is waiting for another +extern uint8_t SD_client; extern WebUI::AuthenticationLevel SD_auth_level; //bool sd_mount(); diff --git a/Grbl_Esp32/src/Serial.cpp b/Grbl_Esp32/src/Serial.cpp index caa78bb6..5e5e2549 100644 --- a/Grbl_Esp32/src/Serial.cpp +++ b/Grbl_Esp32/src/Serial.cpp @@ -79,7 +79,9 @@ void heapCheckTask(void* pvParameters) { vTaskDelay(3000 / portTICK_RATE_MS); // Yield to other tasks static UBaseType_t uxHighWaterMark = 0; +#ifdef DEBUG_TASK_STACK reportTaskStackSize(uxHighWaterMark); +#endif } } @@ -104,7 +106,8 @@ void serial_init() { NULL, // parameters 1, // priority &serialCheckTaskHandle, - 1 // core + SUPPORT_TASK_CORE // must run the task on same core + // core ); } @@ -156,9 +159,16 @@ void serialCheckTask(void* pvParameters) { if (is_realtime_command(data)) { execute_realtime_command(static_cast(data), client); } else { - vTaskEnterCritical(&myMutex); - client_buffer[client].write(data); - vTaskExitCritical(&myMutex); + if (get_sd_state(false) == SDCARD_IDLE) { + vTaskEnterCritical(&myMutex); + client_buffer[client].write(data); + vTaskExitCritical(&myMutex); + } else { + if (data == '\r' || data == '\n') { + grbl_sendf(client, "error %d\r\n", Error::AnotherInterfaceBusy); + grbl_msg_sendf(client, MsgLevel::Info, "SD card job running"); + } + } } } // if something available WebUI::COMMANDS::handle(); @@ -174,8 +184,10 @@ void serialCheckTask(void* pvParameters) { vTaskDelay(1 / portTICK_RATE_MS); // Yield to other tasks static UBaseType_t uxHighWaterMark = 0; +#ifdef DEBUG_TASK_STACK reportTaskStackSize(uxHighWaterMark); - } // while(true) +#endif + } } void serial_reset_read_buffer(uint8_t client) { diff --git a/Grbl_Esp32/src/Settings.cpp b/Grbl_Esp32/src/Settings.cpp index 5450b444..678a43c0 100644 --- a/Grbl_Esp32/src/Settings.cpp +++ b/Grbl_Esp32/src/Settings.cpp @@ -8,8 +8,10 @@ Word::Word(type_t type, permissions_t permissions, const char* description, cons Command* Command::List = NULL; -Command::Command(const char* description, type_t type, permissions_t permissions, const char* grblName, const char* fullName) : - Word(type, permissions, description, grblName, fullName) { +Command::Command( + const char* description, type_t type, permissions_t permissions, const char* grblName, const char* fullName, bool (*cmdChecker)()) : + Word(type, permissions, description, grblName, fullName), + _cmdChecker(cmdChecker) { link = List; List = this; } @@ -126,6 +128,7 @@ Error IntSetting::setStringValue(char* s) { _storedValue = convertedValue; } } + check(NULL); return Error::Ok; } @@ -223,6 +226,7 @@ Error AxisMaskSetting::setStringValue(char* s) { _storedValue = _currentValue; } } + check(NULL); return Error::Ok; } @@ -323,6 +327,7 @@ Error FloatSetting::setStringValue(char* s) { _storedValue = _currentValue; } } + check(NULL); return Error::Ok; } @@ -412,6 +417,7 @@ Error StringSetting::setStringValue(char* s) { _storedValue = _currentValue; } } + check(NULL); return Error::Ok; } @@ -442,11 +448,15 @@ void StringSetting::addWebui(WebUI::JSONencoder* j) { typedef std::map enum_opt_t; -EnumSetting::EnumSetting( - const char* description, type_t type, permissions_t permissions, const char* grblName, const char* name, int8_t defVal, enum_opt_t* opts) - // No checker function because enumerations have an exact set of value - : - Setting(description, type, permissions, grblName, name, NULL), +EnumSetting::EnumSetting(const char* description, + type_t type, + permissions_t permissions, + const char* grblName, + const char* name, + int8_t defVal, + enum_opt_t* opts, + bool (*checker)(char*) = NULL) : + Setting(description, type, permissions, grblName, name, checker), _defaultValue(defVal), _options(opts) {} void EnumSetting::load() { @@ -471,7 +481,11 @@ void EnumSetting::setDefault() { // This is necessary for WebUI, which uses the number // for setting. Error EnumSetting::setStringValue(char* s) { - s = trim(s); + s = trim(s); + Error err = check(s); + if (err != Error::Ok) { + return err; + } enum_opt_t::iterator it = _options->find(s); if (it == _options->end()) { // If we don't find the value in keys, look for it in the numeric values @@ -497,7 +511,7 @@ Error EnumSetting::setStringValue(char* s) { } _currentValue = it->second; if (_storedValue != _currentValue) { - if (_storedValue == _defaultValue) { + if (_currentValue == _defaultValue) { nvs_erase_key(_handle, _keyName); } else { if (nvs_set_i8(_handle, _keyName, _currentValue)) { @@ -506,6 +520,7 @@ Error EnumSetting::setStringValue(char* s) { _storedValue = _currentValue; } } + check(NULL); return Error::Ok; } @@ -585,6 +600,7 @@ Error FlagSetting::setStringValue(char* s) { _storedValue = _currentValue; } } + check(NULL); return Error::Ok; } const char* FlagSetting::getDefaultString() { @@ -665,6 +681,7 @@ Error IPaddrSetting::setStringValue(char* s) { _storedValue = _currentValue; } } + check(NULL); return Error::Ok; } @@ -689,7 +706,7 @@ void IPaddrSetting::addWebui(WebUI::JSONencoder* j) { AxisSettings::AxisSettings(const char* axisName) : name(axisName) {} Error GrblCommand::action(char* value, WebUI::AuthenticationLevel auth_level, WebUI::ESPResponseStream* out) { - if (_checker && _checker()) { + if (_cmdChecker && _cmdChecker()) { return Error::IdleError; } return _action((const char*)value, auth_level, out); diff --git a/Grbl_Esp32/src/Settings.h b/Grbl_Esp32/src/Settings.h index 63dce4f5..e206b307 100644 --- a/Grbl_Esp32/src/Settings.h +++ b/Grbl_Esp32/src/Settings.h @@ -75,12 +75,13 @@ public: class Command : public Word { protected: Command* link; // linked list of setting objects + bool (*_cmdChecker)(); public: static Command* List; Command* next() { return link; } ~Command() {} - Command(const char* description, type_t type, permissions_t permissions, const char* grblName, const char* fullName); + Command(const char* description, type_t type, permissions_t permissions, const char* grblName, const char* fullName, bool (*cmcChecker)()); // The default implementation of addWebui() does nothing. // Derived classes may override it to do something. @@ -343,10 +344,17 @@ public: const char* grblName, const char* name, int8_t defVal, - enum_opt_t* opts); + enum_opt_t* opts, + bool (*checker)(char*)); - EnumSetting(type_t type, permissions_t permissions, const char* grblName, const char* name, int8_t defVal, enum_opt_t* opts) : - EnumSetting(NULL, type, permissions, grblName, name, defVal, opts) {} + EnumSetting(type_t type, + permissions_t permissions, + const char* grblName, + const char* name, + int8_t defVal, + enum_opt_t* opts, + bool (*checker)(char*) = NULL) : + EnumSetting(NULL, type, permissions, grblName, name, defVal, opts, checker) {} void load(); void setDefault(); @@ -435,6 +443,9 @@ public: AxisSettings(const char* axisName); }; + +extern bool idleOrAlarm(); + class WebCommand : public Command { private: Error (*_action)(char*, WebUI::AuthenticationLevel); @@ -447,7 +458,10 @@ public: const char* grblName, const char* name, Error (*action)(char*, WebUI::AuthenticationLevel)) : - Command(description, type, permissions, grblName, name), + // At some point we might want to be more subtle, but for now we block + // all web commands in Cycle and Hold states, to avoid crashing a + // running job. + Command(description, type, permissions, grblName, name, idleOrAlarm), _action(action) {} Error action(char* value, WebUI::AuthenticationLevel auth_level, WebUI::ESPResponseStream* response); }; @@ -455,22 +469,21 @@ public: class GrblCommand : public Command { private: Error (*_action)(const char*, WebUI::AuthenticationLevel, WebUI::ESPResponseStream*); - bool (*_checker)(); public: GrblCommand(const char* grblName, const char* name, Error (*action)(const char*, WebUI::AuthenticationLevel, WebUI::ESPResponseStream*), - bool (*checker)(), + bool (*cmdChecker)(), permissions_t auth) : - Command(NULL, GRBLCMD, auth, grblName, name), - _action(action), _checker(checker) {} + Command(NULL, GRBLCMD, auth, grblName, name, cmdChecker), + _action(action) {} GrblCommand(const char* grblName, const char* name, Error (*action)(const char*, WebUI::AuthenticationLevel, WebUI::ESPResponseStream*), - bool (*checker)(void)) : - GrblCommand(grblName, name, action, checker, WG) {} + bool (*cmdChecker)()) : + GrblCommand(grblName, name, action, cmdChecker, WG) {} Error action(char* value, WebUI::AuthenticationLevel auth_level, WebUI::ESPResponseStream* response); }; diff --git a/Grbl_Esp32/src/SettingsDefinitions.cpp b/Grbl_Esp32/src/SettingsDefinitions.cpp index 5e2c2e2c..02115c00 100644 --- a/Grbl_Esp32/src/SettingsDefinitions.cpp +++ b/Grbl_Esp32/src/SettingsDefinitions.cpp @@ -1,7 +1,5 @@ #include "Grbl.h" -bool motorSettingChanged = false; - FlagSetting* verbose_errors; FakeSetting* number_axis; @@ -32,6 +30,7 @@ FlagSetting* homing_enable; // TODO Settings - also need to clear, but not set, soft_limits FlagSetting* laser_mode; // TODO Settings - also need to call my_spindle->init; +IntSetting* laser_full_power; IntSetting* status_mask; FloatSetting* junction_deviation; @@ -81,6 +80,11 @@ AxisSettings* c_axis_settings; AxisSettings* axis_settings[MAX_N_AXIS]; +StringSetting* user_macro0; +StringSetting* user_macro1; +StringSetting* user_macro2; +StringSetting* user_macro3; + typedef struct { const char* name; float steps_per_mm; @@ -166,34 +170,37 @@ static const char* makename(const char* axisName, const char* tail) { } static bool checkStartupLine(char* value) { + if (!value) { // No POST functionality + return true; + } if (sys.state != State::Idle) { return false; } return gc_execute_line(value, CLIENT_SERIAL) == Error::Ok; } -static bool checkStallguard(char* value) { - motorSettingChanged = true; +static bool postMotorSetting(char* value) { + if (!value) { + motors_read_settings(); + } return true; } -static bool checkMicrosteps(char* value) { - motorSettingChanged = true; - return true; -} - -static bool checkRunCurrent(char* value) { - motorSettingChanged = true; - return true; -} - -static bool checkHoldcurrent(char* value) { - motorSettingChanged = true; - return true; -} - -static bool checkStallguardDebugMask(char* val) { - motorSettingChanged = true; +static bool checkSpindleChange(char* val) { + if (!val) { + // if not in disable (M5) ... + if (gc_state.modal.spindle != SpindleState::Disable) { + gc_state.modal.spindle = SpindleState::Disable; + if (spindle->use_delays && spindle_delay_spindown->get() != 0) { // old spindle + vTaskDelay(spindle_delay_spindown->get() * 1000); + } + grbl_msg_sendf(CLIENT_ALL, MsgLevel::Info, "Spindle turned off with setting change"); + } + gc_state.spindle_speed = 0; // Set S value to 0 + spindle->deinit(); // old spindle + Spindles::Spindle::select(); // get new spindle + return true; + } return true; } @@ -209,20 +216,10 @@ static const char* makeGrblName(int axisNum, int base) { void make_coordinate(CoordIndex index, const char* name) { float coord_data[MAX_N_AXIS] = { 0.0 }; - auto coord = new Coordinates(name); - coords[index] = coord; + auto coord = new Coordinates(name); + coords[index] = coord; if (!coord->load()) { - grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Propagating %s data to NVS format", coord->getName()); - // If coord->load() returns false it means that no entry - // was present in non-volatile storage. In that case we - // first look for an old-format entry in the EEPROM section. - // If an entry is present some number of float values at - // the beginning of coord_data will be overwritten with - // the EEPROM data, and the rest will remain at 0.0. - // If no old-format entry is present, all will remain 0.0 - // Regardless, we create a new entry with that data. - (void)old_settings_read_coord_data(index, coord_data); - coords[index]->set(coord_data); + coords[index]->setDefault(); } } void make_settings() { @@ -259,30 +256,30 @@ void make_settings() { b_axis_settings = axis_settings[B_AXIS]; c_axis_settings = axis_settings[C_AXIS]; for (axis = MAX_N_AXIS - 1; axis >= 0; axis--) { - def = &axis_defaults[axis]; - auto setting = new IntSetting( - EXTENDED, WG, makeGrblName(axis, 170), makename(def->name, "StallGuard"), def->stallguard, -64, 63, checkStallguard); + def = &axis_defaults[axis]; + auto setting = + new IntSetting(EXTENDED, WG, makeGrblName(axis, 170), makename(def->name, "StallGuard"), def->stallguard, -64, 63, postMotorSetting); setting->setAxis(axis); axis_settings[axis]->stallguard = setting; } for (axis = MAX_N_AXIS - 1; axis >= 0; axis--) { - def = &axis_defaults[axis]; - auto setting = new IntSetting( - EXTENDED, WG, makeGrblName(axis, 160), makename(def->name, "Microsteps"), def->microsteps, 0, 256, checkMicrosteps); + def = &axis_defaults[axis]; + auto setting = + new IntSetting(EXTENDED, WG, makeGrblName(axis, 160), makename(def->name, "Microsteps"), def->microsteps, 0, 256, postMotorSetting); setting->setAxis(axis); axis_settings[axis]->microsteps = setting; } for (axis = MAX_N_AXIS - 1; axis >= 0; axis--) { def = &axis_defaults[axis]; auto setting = new FloatSetting( - EXTENDED, WG, makeGrblName(axis, 150), makename(def->name, "Current/Hold"), def->hold_current, 0.05, 20.0, checkHoldcurrent); // Amps + EXTENDED, WG, makeGrblName(axis, 150), makename(def->name, "Current/Hold"), def->hold_current, 0.05, 20.0, postMotorSetting); // Amps setting->setAxis(axis); axis_settings[axis]->hold_current = setting; } for (axis = MAX_N_AXIS - 1; axis >= 0; axis--) { def = &axis_defaults[axis]; auto setting = new FloatSetting( - EXTENDED, WG, makeGrblName(axis, 140), makename(def->name, "Current/Run"), def->run_current, 0.0, 20.0, checkRunCurrent); // Amps + EXTENDED, WG, makeGrblName(axis, 140), makename(def->name, "Current/Run"), def->run_current, 0.0, 20.0, postMotorSetting); // Amps setting->setAxis(axis); axis_settings[axis]->run_current = setting; } @@ -322,31 +319,38 @@ void make_settings() { } // Spindle Settings - spindle_pwm_max_value = new FloatSetting(EXTENDED, WG, "36", "Spindle/PWM/Max", DEFAULT_SPINDLE_MAX_VALUE, 0.0, 100.0); - spindle_pwm_min_value = new FloatSetting(EXTENDED, WG, "35", "Spindle/PWM/Min", DEFAULT_SPINDLE_MIN_VALUE, 0.0, 100.0); - spindle_pwm_off_value = - new FloatSetting(EXTENDED, WG, "34", "Spindle/PWM/Off", DEFAULT_SPINDLE_OFF_VALUE, 0.0, 100.0); // these are percentages + spindle_type = + new EnumSetting(NULL, EXTENDED, WG, NULL, "Spindle/Type", static_cast(SPINDLE_TYPE), &spindleTypes, checkSpindleChange); + + spindle_pwm_max_value = + new FloatSetting(EXTENDED, WG, "36", "Spindle/PWM/Max", DEFAULT_SPINDLE_MAX_VALUE, 0.0, 100.0, checkSpindleChange); + spindle_pwm_min_value = + new FloatSetting(EXTENDED, WG, "35", "Spindle/PWM/Min", DEFAULT_SPINDLE_MIN_VALUE, 0.0, 100.0, checkSpindleChange); + spindle_pwm_off_value = new FloatSetting( + EXTENDED, WG, "34", "Spindle/PWM/Off", DEFAULT_SPINDLE_OFF_VALUE, 0.0, 100.0, checkSpindleChange); // these are percentages // IntSetting spindle_pwm_bit_precision(EXTENDED, WG, "Spindle/PWM/Precision", DEFAULT_SPINDLE_BIT_PRECISION, 1, 16); - spindle_pwm_freq = new FloatSetting(EXTENDED, WG, "33", "Spindle/PWM/Frequency", DEFAULT_SPINDLE_FREQ, 0, 100000); - spindle_output_invert = new FlagSetting(GRBL, WG, NULL, "Spindle/PWM/Invert", DEFAULT_INVERT_SPINDLE_OUTPUT_PIN); + spindle_pwm_freq = new FloatSetting(EXTENDED, WG, "33", "Spindle/PWM/Frequency", DEFAULT_SPINDLE_FREQ, 0, 100000, checkSpindleChange); + spindle_output_invert = new FlagSetting(GRBL, WG, NULL, "Spindle/PWM/Invert", DEFAULT_INVERT_SPINDLE_OUTPUT_PIN, checkSpindleChange); spindle_delay_spinup = new FloatSetting(EXTENDED, WG, NULL, "Spindle/Delay/SpinUp", DEFAULT_SPINDLE_DELAY_SPINUP, 0, 30); spindle_delay_spindown = new FloatSetting(EXTENDED, WG, NULL, "Spindle/Delay/SpinDown", DEFAULT_SPINDLE_DELAY_SPINUP, 0, 30); spindle_enbl_off_with_zero_speed = - new FlagSetting(GRBL, WG, NULL, "Spindle/Enable/OffWithSpeed", DEFAULT_SPINDLE_ENABLE_OFF_WITH_ZERO_SPEED); + new FlagSetting(GRBL, WG, NULL, "Spindle/Enable/OffWithSpeed", DEFAULT_SPINDLE_ENABLE_OFF_WITH_ZERO_SPEED, checkSpindleChange); - spindle_enable_invert = new FlagSetting(GRBL, WG, NULL, "Spindle/Enable/Invert", DEFAULT_INVERT_SPINDLE_ENABLE_PIN); + spindle_enable_invert = new FlagSetting(GRBL, WG, NULL, "Spindle/Enable/Invert", DEFAULT_INVERT_SPINDLE_ENABLE_PIN, checkSpindleChange); // GRBL Non-numbered settings startup_line_0 = new StringSetting(GRBL, WG, "N0", "GCode/Line0", "", checkStartupLine); startup_line_1 = new StringSetting(GRBL, WG, "N1", "GCode/Line1", "", checkStartupLine); // GRBL Numbered Settings - laser_mode = new FlagSetting(GRBL, WG, "32", "GCode/LaserMode", DEFAULT_LASER_MODE); + laser_mode = new FlagSetting(GRBL, WG, "32", "GCode/LaserMode", DEFAULT_LASER_MODE); + laser_full_power = new IntSetting(EXTENDED, WG, NULL, "Laser/FullPower", DEFAULT_LASER_FULL_POWER, 0, 10000, checkSpindleChange); + // TODO Settings - also need to call my_spindle->init(); - rpm_min = new FloatSetting(GRBL, WG, "31", "GCode/MinS", DEFAULT_SPINDLE_RPM_MIN, 0, 100000); - rpm_max = new FloatSetting(GRBL, WG, "30", "GCode/MaxS", DEFAULT_SPINDLE_RPM_MAX, 0, 100000); + rpm_min = new FloatSetting(GRBL, WG, "31", "GCode/MinS", DEFAULT_SPINDLE_RPM_MIN, 0, 100000, checkSpindleChange); + rpm_max = new FloatSetting(GRBL, WG, "30", "GCode/MaxS", DEFAULT_SPINDLE_RPM_MAX, 0, 100000, checkSpindleChange); homing_pulloff = new FloatSetting(GRBL, WG, "27", "Homing/Pulloff", DEFAULT_HOMING_PULLOFF, 0, 1000); homing_debounce = new FloatSetting(GRBL, WG, "26", "Homing/Debounce", DEFAULT_HOMING_DEBOUNCE_DELAY, 0, 10000); @@ -373,17 +377,22 @@ void make_settings() { probe_invert = new FlagSetting(GRBL, WG, "6", "Probe/Invert", DEFAULT_INVERT_PROBE_PIN); limit_invert = new FlagSetting(GRBL, WG, "5", "Limits/Invert", DEFAULT_INVERT_LIMIT_PINS); step_enable_invert = new FlagSetting(GRBL, WG, "4", "Stepper/EnableInvert", DEFAULT_INVERT_ST_ENABLE); - dir_invert_mask = new AxisMaskSetting(GRBL, WG, "3", "Stepper/DirInvert", DEFAULT_DIRECTION_INVERT_MASK); - step_invert_mask = new AxisMaskSetting(GRBL, WG, "2", "Stepper/StepInvert", DEFAULT_STEPPING_INVERT_MASK); + dir_invert_mask = new AxisMaskSetting(GRBL, WG, "3", "Stepper/DirInvert", DEFAULT_DIRECTION_INVERT_MASK, postMotorSetting); + step_invert_mask = new AxisMaskSetting(GRBL, WG, "2", "Stepper/StepInvert", DEFAULT_STEPPING_INVERT_MASK, postMotorSetting); stepper_idle_lock_time = new IntSetting(GRBL, WG, "1", "Stepper/IdleTime", DEFAULT_STEPPER_IDLE_LOCK_TIME, 0, 255); pulse_microseconds = new IntSetting(GRBL, WG, "0", "Stepper/Pulse", DEFAULT_STEP_PULSE_MICROSECONDS, 3, 1000); - spindle_type = new EnumSetting(NULL, EXTENDED, WG, NULL, "Spindle/Type", static_cast(SPINDLE_TYPE), &spindleTypes); - stallguard_debug_mask = new AxisMaskSetting(EXTENDED, WG, NULL, "Report/StallGuard", 0, checkStallguardDebugMask); - homing_cycle[0] = new AxisMaskSetting(EXTENDED, WG, NULL, "Homing/Cycle0", DEFAULT_HOMING_CYCLE_0); - homing_cycle[1] = new AxisMaskSetting(EXTENDED, WG, NULL, "Homing/Cycle1", DEFAULT_HOMING_CYCLE_1); - homing_cycle[2] = new AxisMaskSetting(EXTENDED, WG, NULL, "Homing/Cycle2", DEFAULT_HOMING_CYCLE_2); - homing_cycle[3] = new AxisMaskSetting(EXTENDED, WG, NULL, "Homing/Cycle3", DEFAULT_HOMING_CYCLE_3); - homing_cycle[4] = new AxisMaskSetting(EXTENDED, WG, NULL, "Homing/Cycle4", DEFAULT_HOMING_CYCLE_4); + stallguard_debug_mask = new AxisMaskSetting(EXTENDED, WG, NULL, "Report/StallGuard", 0, postMotorSetting); + homing_cycle[5] = new AxisMaskSetting(EXTENDED, WG, NULL, "Homing/Cycle5", DEFAULT_HOMING_CYCLE_5); + homing_cycle[4] = new AxisMaskSetting(EXTENDED, WG, NULL, "Homing/Cycle4", DEFAULT_HOMING_CYCLE_4); + homing_cycle[3] = new AxisMaskSetting(EXTENDED, WG, NULL, "Homing/Cycle3", DEFAULT_HOMING_CYCLE_3); + homing_cycle[2] = new AxisMaskSetting(EXTENDED, WG, NULL, "Homing/Cycle2", DEFAULT_HOMING_CYCLE_2); + homing_cycle[1] = new AxisMaskSetting(EXTENDED, WG, NULL, "Homing/Cycle1", DEFAULT_HOMING_CYCLE_1); + homing_cycle[0] = new AxisMaskSetting(EXTENDED, WG, NULL, "Homing/Cycle0", DEFAULT_HOMING_CYCLE_0); + + user_macro3 = new StringSetting(EXTENDED, WG, NULL, "User/Macro3", DEFAULT_USER_MACRO3); + user_macro2 = new StringSetting(EXTENDED, WG, NULL, "User/Macro2", DEFAULT_USER_MACRO2); + user_macro1 = new StringSetting(EXTENDED, WG, NULL, "User/Macro1", DEFAULT_USER_MACRO1); + user_macro0 = new StringSetting(EXTENDED, WG, NULL, "User/Macro0", DEFAULT_USER_MACRO0); } diff --git a/Grbl_Esp32/src/SettingsDefinitions.h b/Grbl_Esp32/src/SettingsDefinitions.h index b01038bf..7315637a 100644 --- a/Grbl_Esp32/src/SettingsDefinitions.h +++ b/Grbl_Esp32/src/SettingsDefinitions.h @@ -1,7 +1,5 @@ #pragma once -extern bool motorSettingChanged; - extern FlagSetting* verbose_errors; extern FakeSetting* number_axis; @@ -35,6 +33,7 @@ extern FlagSetting* soft_limits; extern FlagSetting* hard_limits; extern FlagSetting* homing_enable; extern FlagSetting* laser_mode; +extern IntSetting* laser_full_power; extern IntSetting* status_mask; extern FloatSetting* junction_deviation; @@ -61,3 +60,8 @@ extern IntSetting* spindle_pwm_bit_precision; extern EnumSetting* spindle_type; extern AxisMaskSetting* stallguard_debug_mask; + +extern StringSetting* user_macro0; +extern StringSetting* user_macro1; +extern StringSetting* user_macro2; +extern StringSetting* user_macro3; diff --git a/Grbl_Esp32/src/Spindles/10vSpindle.cpp b/Grbl_Esp32/src/Spindles/10vSpindle.cpp index c2f050da..09162c0c 100644 --- a/Grbl_Esp32/src/Spindles/10vSpindle.cpp +++ b/Grbl_Esp32/src/Spindles/10vSpindle.cpp @@ -44,7 +44,7 @@ namespace Spindles { #endif if (_output_pin == UNDEFINED_PIN) { - grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Warning: Spindle output pin not defined"); + grbl_msg_sendf(CLIENT_ALL, MsgLevel::Info, "Warning: Spindle output pin not defined"); return; // We cannot continue without the output pin } @@ -66,7 +66,7 @@ namespace Spindles { // prints the startup message of the spindle config void _10v::config_message() { - grbl_msg_sendf(CLIENT_SERIAL, + grbl_msg_sendf(CLIENT_ALL, MsgLevel::Info, "0-10V spindle Out:%s Enbl:%s, Dir:%s, Fwd:%s, Rev:%s, Freq:%dHz Res:%dbits", pinName(_output_pin).c_str(), @@ -144,7 +144,6 @@ namespace Spindles { } void _10v::set_enable_pin(bool enable) { - //grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Spindle::_10v::set_enable_pin"); if (_off_with_zero_speed && sys.spindle_speed == 0) { enable = false; } @@ -164,9 +163,33 @@ namespace Spindles { } void _10v::set_dir_pin(bool Clockwise) { - //grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Spindle::_10v::set_dir_pin"); digitalWrite(_direction_pin, Clockwise); digitalWrite(_forward_pin, Clockwise); digitalWrite(_reverse_pin, !Clockwise); } + + void _10v::deinit() { +#ifdef SPINDLE_OUTPUT_PIN + gpio_reset_pin(SPINDLE_OUTPUT_PIN); + pinMode(SPINDLE_OUTPUT_PIN, INPUT); +#endif +#ifdef SPINDLE_ENABLE_PIN + gpio_reset_pin(SPINDLE_ENABLE_PIN); + pinMode(SPINDLE_ENABLE_PIN, INPUT); +#endif + +#ifdef SPINDLE_DIR_PIN + gpio_reset_pin(SPINDLE_DIR_PIN); + pinMode(SPINDLE_DIR_PIN, INPUT); +#endif +#ifdef SPINDLE_FORWARD_PIN + gpio_reset_pin(SPINDLE_FORWARD_PIN); + pinMode(SPINDLE_FORWARD_PIN, INPUT); +#endif + +#ifdef SPINDLE_REVERSE_PIN + gpio_reset_pin(SPINDLE_FORWARD_PIN); + pinMode(SPINDLE_FORWARD_PIN, INPUT); +#endif + } } diff --git a/Grbl_Esp32/src/Spindles/10vSpindle.h b/Grbl_Esp32/src/Spindles/10vSpindle.h index a0205320..d45a9cb5 100644 --- a/Grbl_Esp32/src/Spindles/10vSpindle.h +++ b/Grbl_Esp32/src/Spindles/10vSpindle.h @@ -45,6 +45,7 @@ namespace Spindles { SpindleState get_state() override; void stop() override; + void deinit() override; virtual ~_10v() {} diff --git a/Grbl_Esp32/src/Spindles/BESCSpindle.cpp b/Grbl_Esp32/src/Spindles/BESCSpindle.cpp index 55630bcb..fceb8bc5 100644 --- a/Grbl_Esp32/src/Spindles/BESCSpindle.cpp +++ b/Grbl_Esp32/src/Spindles/BESCSpindle.cpp @@ -55,7 +55,7 @@ namespace Spindles { get_pins_and_settings(); // these gets the standard PWM settings, but many need to be changed for BESC if (_output_pin == UNDEFINED_PIN) { - grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Warning: BESC output pin not defined"); + grbl_msg_sendf(CLIENT_ALL, MsgLevel::Info, "Warning: BESC output pin not defined"); return; // We cannot continue without the output pin } @@ -82,7 +82,7 @@ namespace Spindles { // prints the startup message of the spindle config void BESC::config_message() { - grbl_msg_sendf(CLIENT_SERIAL, + grbl_msg_sendf(CLIENT_ALL, MsgLevel::Info, "BESC spindle on Pin:%s Min:%0.2fms Max:%0.2fms Freq:%dHz Res:%dbits", pinName(_output_pin).c_str(), diff --git a/Grbl_Esp32/src/Spindles/DacSpindle.cpp b/Grbl_Esp32/src/Spindles/DacSpindle.cpp index b679c857..26910ced 100644 --- a/Grbl_Esp32/src/Spindles/DacSpindle.cpp +++ b/Grbl_Esp32/src/Spindles/DacSpindle.cpp @@ -40,7 +40,7 @@ namespace Spindles { if (_output_pin != GPIO_NUM_25 && _output_pin != GPIO_NUM_26) { // DAC can only be used on these pins _gpio_ok = false; - grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "DAC spindle pin invalid GPIO_NUM_%d (pin 25 or 26 only)", _output_pin); + grbl_msg_sendf(CLIENT_ALL, MsgLevel::Info, "DAC spindle pin invalid GPIO_NUM_%d (pin 25 or 26 only)", _output_pin); return; } @@ -54,7 +54,7 @@ namespace Spindles { } void Dac::config_message() { - grbl_msg_sendf(CLIENT_SERIAL, + grbl_msg_sendf(CLIENT_ALL, MsgLevel::Info, "DAC spindle Output:%s, Enbl:%s, Dir:%s, Res:8bits", pinName(_output_pin).c_str(), @@ -85,7 +85,7 @@ namespace Spindles { rpm = _min_rpm; sys.spindle_speed = rpm; pwm_value = 0; - grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Spindle RPM less than min RPM:%5.2f %d", rpm, pwm_value); + grbl_msg_sendf(CLIENT_ALL, MsgLevel::Info, "Spindle RPM less than min RPM:%5.2f %d", rpm, pwm_value); } } else { // Compute intermediate PWM value with linear spindle speed model. diff --git a/Grbl_Esp32/src/Spindles/Laser.cpp b/Grbl_Esp32/src/Spindles/Laser.cpp index b9fa0c72..6b7d9e6c 100644 --- a/Grbl_Esp32/src/Spindles/Laser.cpp +++ b/Grbl_Esp32/src/Spindles/Laser.cpp @@ -24,19 +24,78 @@ // ===================================== Laser ============================================== namespace Spindles { - bool Laser::isRateAdjusted() { - return true; // can use M4 (CCW) laser mode. + bool Laser::inLaserMode() { + return laser_mode->get(); // can use M4 (CCW) laser mode. } void Laser::config_message() { - grbl_msg_sendf(CLIENT_SERIAL, + grbl_msg_sendf(CLIENT_ALL, MsgLevel::Info, - "Laser spindle on Pin:%s, Freq:%dHz, Res:%dbits Laser mode:%s", + "Laser spindle on Pin:%s, Enbl:%s, Freq:%dHz, Res:%dbits Laser mode:%s", pinName(_output_pin).c_str(), + pinName(_enable_pin).c_str(), _pwm_freq, _pwm_precision, laser_mode->getStringValue()); // the current mode use_delays = false; // this will override the value set in Spindle::PWM::init() } + + // Get the GPIO from the machine definition + void Laser::get_pins_and_settings() { + // setup all the pins + +#ifdef LASER_OUTPUT_PIN + _output_pin = LASER_OUTPUT_PIN; +#else + _output_pin = UNDEFINED_PIN; +#endif + + _invert_pwm = spindle_output_invert->get(); + +#ifdef LASER_ENABLE_PIN + _enable_pin = LASER_ENABLE_PIN; +#else + _enable_pin = UNDEFINED_PIN; +#endif + + if (_output_pin == UNDEFINED_PIN) { + grbl_msg_sendf(CLIENT_ALL, MsgLevel::Info, "Warning: LASER_OUTPUT_PIN not defined"); + return; // We cannot continue without the output pin + } + + _off_with_zero_speed = spindle_enbl_off_with_zero_speed->get(); + + _direction_pin = UNDEFINED_PIN; + is_reversable = false; + + _pwm_freq = spindle_pwm_freq->get(); + _pwm_precision = calc_pwm_precision(_pwm_freq); // detewrmine the best precision + _pwm_period = (1 << _pwm_precision); + + // pre-caculate some PWM count values + _pwm_off_value = 0; + _pwm_min_value = 0; + _pwm_max_value = _pwm_period; + + _min_rpm = 0; + _max_rpm = laser_full_power->get(); + + _piecewide_linear = false; + + _pwm_chan_num = 0; // Channel 0 is reserved for spindle use + } + + void Laser::deinit() { + stop(); +#ifdef LASER_OUTPUT_PIN + gpio_reset_pin(LASER_OUTPUT_PIN); + pinMode(LASER_OUTPUT_PIN, INPUT); +#endif + +#ifdef LASER_ENABLE_PIN + gpio_reset_pin(LASER_ENABLE_PIN); + pinMode(LASER_ENABLE_PIN, INPUT); +#endif + } } diff --git a/Grbl_Esp32/src/Spindles/Laser.h b/Grbl_Esp32/src/Spindles/Laser.h index 220770b0..10120a31 100644 --- a/Grbl_Esp32/src/Spindles/Laser.h +++ b/Grbl_Esp32/src/Spindles/Laser.h @@ -34,8 +34,10 @@ namespace Spindles { Laser& operator=(const Laser&) = delete; Laser& operator=(Laser&&) = delete; - bool isRateAdjusted() override; + bool inLaserMode() override; void config_message() override; + void get_pins_and_settings() override; + void deinit() override; virtual ~Laser() {} }; diff --git a/Grbl_Esp32/src/Spindles/NullSpindle.cpp b/Grbl_Esp32/src/Spindles/NullSpindle.cpp index c1266019..ddcdb7a2 100644 --- a/Grbl_Esp32/src/Spindles/NullSpindle.cpp +++ b/Grbl_Esp32/src/Spindles/NullSpindle.cpp @@ -40,5 +40,5 @@ namespace Spindles { } SpindleState Null::get_state() { return _current_state; } void Null::stop() {} - void Null::config_message() { grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "No spindle"); } + void Null::config_message() { grbl_msg_sendf(CLIENT_ALL, MsgLevel::Info, "No spindle"); } } diff --git a/Grbl_Esp32/src/Spindles/PWMSpindle.cpp b/Grbl_Esp32/src/Spindles/PWMSpindle.cpp index 3e71ee7b..23477494 100644 --- a/Grbl_Esp32/src/Spindles/PWMSpindle.cpp +++ b/Grbl_Esp32/src/Spindles/PWMSpindle.cpp @@ -34,23 +34,23 @@ namespace Spindles { get_pins_and_settings(); if (_output_pin == UNDEFINED_PIN) { - grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Warning: Spindle output pin not defined"); return; // We cannot continue without the output pin } if (_output_pin >= I2S_OUT_PIN_BASE) { - grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Warning: Spindle output pin %s cannot do PWM", pinName(_output_pin).c_str()); + grbl_msg_sendf(CLIENT_ALL, MsgLevel::Info, "Warning: Spindle output pin %s cannot do PWM", pinName(_output_pin).c_str()); return; } + _current_state = SpindleState::Disable; + _current_pwm_duty = 0; + use_delays = true; + ledcSetup(_pwm_chan_num, (double)_pwm_freq, _pwm_precision); // setup the channel ledcAttachPin(_output_pin, _pwm_chan_num); // attach the PWM to the pin - pinMode(_enable_pin, OUTPUT); pinMode(_direction_pin, OUTPUT); - use_delays = true; - config_message(); } @@ -80,6 +80,11 @@ namespace Spindles { _direction_pin = UNDEFINED_PIN; #endif + if (_output_pin == UNDEFINED_PIN) { + grbl_msg_sendf(CLIENT_ALL, MsgLevel::Info, "Warning: SPINDLE_OUTPUT_PIN not defined"); + return; // We cannot continue without the output pin + } + is_reversable = (_direction_pin != UNDEFINED_PIN); _pwm_freq = spindle_pwm_freq->get(); @@ -87,7 +92,7 @@ namespace Spindles { _pwm_period = (1 << _pwm_precision); if (spindle_pwm_min_value->get() > spindle_pwm_min_value->get()) { - grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Warning: Spindle min pwm is greater than max. Check $35 and $36"); + grbl_msg_sendf(CLIENT_ALL, MsgLevel::Info, "Warning: Spindle min pwm is greater than max. Check $35 and $36"); } // pre-caculate some PWM count values @@ -117,8 +122,6 @@ namespace Spindles { return rpm; } - //grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "set_rpm(%d)", rpm); - // apply override rpm = rpm * sys.spindle_speed_ovr / 100; // Scale by spindle speed override value (uint8_t percent) @@ -134,7 +137,7 @@ namespace Spindles { if (_piecewide_linear) { //pwm_value = piecewise_linear_fit(rpm); TODO pwm_value = 0; - grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Warning: Linear fit not implemented yet."); + grbl_msg_sendf(CLIENT_ALL, MsgLevel::Info, "Warning: Linear fit not implemented yet."); } else { if (rpm == 0) { @@ -144,7 +147,7 @@ namespace Spindles { } } - set_enable_pin(_current_state != SpindleState::Disable); + set_enable_pin(gc_state.modal.spindle != SpindleState::Disable); set_output(pwm_value); return 0; @@ -159,18 +162,14 @@ namespace Spindles { sys.spindle_speed = 0; stop(); if (use_delays && (_current_state != state)) { - //grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "SpinDown Start "); mc_dwell(spindle_delay_spindown->get()); - //grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "SpinDown Done"); } } else { set_dir_pin(state == SpindleState::Cw); set_rpm(rpm); set_enable_pin(state != SpindleState::Disable); // must be done after setting rpm for enable features to work if (use_delays && (_current_state != state)) { - //grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "SpinUp Start %d", rpm); mc_dwell(spindle_delay_spinup->get()); - //grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "SpinUp Done"); } } @@ -197,7 +196,7 @@ namespace Spindles { // prints the startup message of the spindle config void PWM::config_message() { - grbl_msg_sendf(CLIENT_SERIAL, + grbl_msg_sendf(CLIENT_ALL, MsgLevel::Info, "PWM spindle Output:%s, Enbl:%s, Dir:%s, Freq:%dHz, Res:%dbits", pinName(_output_pin).c_str(), @@ -223,12 +222,18 @@ namespace Spindles { duty = (1 << _pwm_precision) - duty; } - //grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "set_output(%d)", duty); - ledcWrite(_pwm_chan_num, duty); } void PWM::set_enable_pin(bool enable) { + // static bool prev_enable = false; + + // if (prev_enable == enable) { + // return; + // } + + // prev_enable = enable; + if (_enable_pin == UNDEFINED_PIN) { return; } @@ -262,4 +267,21 @@ namespace Spindles { return precision - 1; } + + void PWM::deinit() { + stop(); +#ifdef SPINDLE_OUTPUT_PIN + gpio_reset_pin(SPINDLE_OUTPUT_PIN); + pinMode(SPINDLE_OUTPUT_PIN, INPUT); +#endif +#ifdef SPINDLE_ENABLE_PIN + gpio_reset_pin(SPINDLE_ENABLE_PIN); + pinMode(SPINDLE_ENABLE_PIN, INPUT); +#endif + +#ifdef SPINDLE_DIR_PIN + gpio_reset_pin(SPINDLE_DIR_PIN); + pinMode(SPINDLE_DIR_PIN, INPUT); +#endif + } } diff --git a/Grbl_Esp32/src/Spindles/PWMSpindle.h b/Grbl_Esp32/src/Spindles/PWMSpindle.h index cb306a1d..07ffdf25 100644 --- a/Grbl_Esp32/src/Spindles/PWMSpindle.h +++ b/Grbl_Esp32/src/Spindles/PWMSpindle.h @@ -65,8 +65,9 @@ namespace Spindles { virtual void set_dir_pin(bool Clockwise); virtual void set_output(uint32_t duty); virtual void set_enable_pin(bool enable_pin); + virtual void deinit(); - void get_pins_and_settings(); - uint8_t calc_pwm_precision(uint32_t freq); + virtual void get_pins_and_settings(); + uint8_t calc_pwm_precision(uint32_t freq); }; } diff --git a/Grbl_Esp32/src/Spindles/RelaySpindle.cpp b/Grbl_Esp32/src/Spindles/RelaySpindle.cpp index eadeb918..41762d4c 100644 --- a/Grbl_Esp32/src/Spindles/RelaySpindle.cpp +++ b/Grbl_Esp32/src/Spindles/RelaySpindle.cpp @@ -46,7 +46,7 @@ namespace Spindles { // prints the startup message of the spindle config void Relay ::config_message() { - grbl_msg_sendf(CLIENT_SERIAL, + grbl_msg_sendf(CLIENT_ALL, MsgLevel::Info, "Relay spindle Output:%s, Enbl:%s, Dir:%s", pinName(_output_pin).c_str(), diff --git a/Grbl_Esp32/src/Spindles/Spindle.cpp b/Grbl_Esp32/src/Spindles/Spindle.cpp index 7db5edf2..f705aea7 100644 --- a/Grbl_Esp32/src/Spindles/Spindle.cpp +++ b/Grbl_Esp32/src/Spindles/Spindle.cpp @@ -89,7 +89,7 @@ namespace Spindles { // ========================= Spindle ================================== - bool Spindle::isRateAdjusted() { + bool Spindle::inLaserMode() { return false; // default for basic spindle is false } @@ -100,6 +100,8 @@ namespace Spindles { protocol_buffer_synchronize(); // Empty planner buffer to ensure spindle is set when programmed. set_state(state, rpm); } + + void Spindle::deinit() { stop(); } } Spindles::Spindle* spindle; diff --git a/Grbl_Esp32/src/Spindles/Spindle.h b/Grbl_Esp32/src/Spindles/Spindle.h index d977fa86..6851544a 100644 --- a/Grbl_Esp32/src/Spindles/Spindle.h +++ b/Grbl_Esp32/src/Spindles/Spindle.h @@ -64,8 +64,9 @@ namespace Spindles { virtual SpindleState get_state() = 0; virtual void stop() = 0; virtual void config_message() = 0; - virtual bool isRateAdjusted(); + virtual bool inLaserMode(); virtual void sync(SpindleState state, uint32_t rpm); + virtual void deinit(); virtual ~Spindle() {} diff --git a/Grbl_Esp32/src/Spindles/VFDSpindle.cpp b/Grbl_Esp32/src/Spindles/VFDSpindle.cpp index 3a1305a6..512e243a 100644 --- a/Grbl_Esp32/src/Spindles/VFDSpindle.cpp +++ b/Grbl_Esp32/src/Spindles/VFDSpindle.cpp @@ -194,12 +194,13 @@ namespace Spindles { if (retry_count == MAX_RETRIES) { if (!unresponsive) { grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Spindle RS485 Unresponsive %d", next_cmd.rx_length); - if (next_cmd.critical) { - grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Critical Spindle RS485 Unresponsive"); - sys_rt_exec_alarm = ExecAlarm::SpindleControl; - } unresponsive = true; } + if (next_cmd.critical) { + grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Critical Spindle RS485 Unresponsive"); + mc_reset(); + sys_rt_exec_alarm = ExecAlarm::SpindleControl; + } } vTaskDelay(VFD_RS485_POLL_RATE); // TODO: What is the best value here? @@ -274,7 +275,7 @@ namespace Spindles { this, // parameters 1, // priority &vfd_cmdTaskHandle, - 0 // core + SUPPORT_TASK_CORE // core ); _task_running = true; } @@ -465,4 +466,4 @@ namespace Spindles { return crc; } -} +} \ No newline at end of file diff --git a/Grbl_Esp32/src/Spindles/VFDSpindle.h b/Grbl_Esp32/src/Spindles/VFDSpindle.h index 1c852292..7e81443d 100644 --- a/Grbl_Esp32/src/Spindles/VFDSpindle.h +++ b/Grbl_Esp32/src/Spindles/VFDSpindle.h @@ -22,6 +22,8 @@ #include +// #define VFD_DEBUG_MODE + namespace Spindles { class VFD : public Spindle { @@ -90,4 +92,4 @@ namespace Spindles { virtual ~VFD() {} }; -} +} \ No newline at end of file diff --git a/Grbl_Esp32/src/Stepper.cpp b/Grbl_Esp32/src/Stepper.cpp index ae4a56b2..d4919614 100644 --- a/Grbl_Esp32/src/Stepper.cpp +++ b/Grbl_Esp32/src/Stepper.cpp @@ -551,7 +551,9 @@ void st_prep_buffer() { prep.current_speed = sqrt(pl_block->entry_speed_sqr); } - if (spindle->isRateAdjusted()) { // laser_mode->get() { + st_prep_block->is_pwm_rate_adjusted = false; // set default value + // prep.inv_rate is only used if is_pwm_rate_adjusted is true + if (spindle->inLaserMode()) { // if (pl_block->spindle == SpindleState::Ccw) { // Pre-compute inverse programmed rate to speed up PWM updating per step segment. prep.inv_rate = 1.0 / pl_block->programmed_rate; diff --git a/Grbl_Esp32/src/System.cpp b/Grbl_Esp32/src/System.cpp index 498915f1..6b21702c 100644 --- a/Grbl_Esp32/src/System.cpp +++ b/Grbl_Esp32/src/System.cpp @@ -63,22 +63,22 @@ void system_ini() { // Renamed from system_init() due to conflict with esp32 fi attachInterrupt(digitalPinToInterrupt(CONTROL_CYCLE_START_PIN), isr_control_inputs, CHANGE); #endif #ifdef MACRO_BUTTON_0_PIN - grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Macro Pin 0"); + grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Macro Pin 0 %s", pinName(MACRO_BUTTON_0_PIN).c_str()); pinMode(MACRO_BUTTON_0_PIN, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(MACRO_BUTTON_0_PIN), isr_control_inputs, CHANGE); #endif #ifdef MACRO_BUTTON_1_PIN - grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Macro Pin 1"); + grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Macro Pin 1 %s", pinName(MACRO_BUTTON_1_PIN).c_str()); pinMode(MACRO_BUTTON_1_PIN, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(MACRO_BUTTON_1_PIN), isr_control_inputs, CHANGE); #endif #ifdef MACRO_BUTTON_2_PIN - grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Macro Pin 2"); + grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Macro Pin 2 %s", pinName(MACRO_BUTTON_2_PIN).c_str()); pinMode(MACRO_BUTTON_2_PIN, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(MACRO_BUTTON_2_PIN), isr_control_inputs, CHANGE); #endif #ifdef MACRO_BUTTON_3_PIN - grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Macro Pin 3"); + grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Macro Pin 3 %s", pinName(MACRO_BUTTON_3_PIN).c_str()); pinMode(MACRO_BUTTON_3_PIN, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(MACRO_BUTTON_3_PIN), isr_control_inputs, CHANGE); #endif @@ -87,7 +87,7 @@ void system_ini() { // Renamed from system_init() due to conflict with esp32 fi control_sw_queue = xQueueCreate(10, sizeof(int)); xTaskCreate(controlCheckTask, "controlCheckTask", - 2048, + 3096, NULL, 5, // priority NULL); @@ -125,7 +125,9 @@ void controlCheckTask(void* pvParameters) { debouncing = false; static UBaseType_t uxHighWaterMark = 0; +# ifdef DEBUG_TASK_STACK reportTaskStackSize(uxHighWaterMark); +# endif } } #endif @@ -332,4 +334,39 @@ uint8_t sys_calc_pwm_precision(uint32_t freq) { return precision - 1; } -void __attribute__((weak)) user_defined_macro(uint8_t index); +void __attribute__((weak)) user_defined_macro(uint8_t index) { + // must be in Idle + if (sys.state != State::Idle) { + grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Macro button only permitted in idle"); + return; + } + + String user_macro; + char line[255]; + switch (index) { + case 0: + user_macro = user_macro0->get(); + break; + case 1: + user_macro = user_macro1->get(); + break; + case 2: + user_macro = user_macro2->get(); + break; + case 3: + user_macro = user_macro3->get(); + break; + default: + return; + } + + if (user_macro == "") { + grbl_msg_sendf(CLIENT_SERIAL, MsgLevel::Info, "Macro User/Macro%d empty", index); + return; + } + + user_macro.replace('&', '\n'); + user_macro.toCharArray(line, 255, 0); + strcat(line, "\r"); + WebUI::inputBuffer.push(line); +} diff --git a/Grbl_Esp32/src/WebUI/BTConfig.cpp b/Grbl_Esp32/src/WebUI/BTConfig.cpp index 05a7816e..85a2a7e6 100644 --- a/Grbl_Esp32/src/WebUI/BTConfig.cpp +++ b/Grbl_Esp32/src/WebUI/BTConfig.cpp @@ -86,6 +86,9 @@ namespace WebUI { bool BTConfig::isBTnameValid(const char* hostname) { //limited size + if (!hostname) { + return true; + } char c; // length is checked automatically by string setting //only letter and digit diff --git a/Grbl_Esp32/src/WebUI/Commands.cpp b/Grbl_Esp32/src/WebUI/Commands.cpp index 7cfdf003..d59ee19c 100644 --- a/Grbl_Esp32/src/WebUI/Commands.cpp +++ b/Grbl_Esp32/src/WebUI/Commands.cpp @@ -43,6 +43,9 @@ namespace WebUI { } bool COMMANDS::isLocalPasswordValid(char* password) { + if (!password) { + return true; + } char c; //limited size if ((strlen(password) > MAX_LOCAL_PASSWORD_LENGTH) || (strlen(password) < MIN_LOCAL_PASSWORD_LENGTH)) { diff --git a/Grbl_Esp32/src/WebUI/WebServer.cpp b/Grbl_Esp32/src/WebUI/WebServer.cpp index f9ef698d..d58a8b7c 100644 --- a/Grbl_Esp32/src/WebUI/WebServer.cpp +++ b/Grbl_Esp32/src/WebUI/WebServer.cpp @@ -1221,9 +1221,13 @@ namespace WebUI { bool list_files = true; uint64_t totalspace = 0; uint64_t usedspace = 0; - if (get_sd_state(true) != SDCARD_IDLE) { + int8_t state = get_sd_state(true); + if (state != SDCARD_IDLE) { + String status = "{\"status\":\""; + if(state == SDCARD_NOT_PRESENT)status+="No SD Card\"}"; + else status+="Busy\"}"; _webserver->sendHeader("Cache-Control", "no-cache"); - _webserver->send(200, "application/json", "{\"status\":\"No SD Card\"}"); + _webserver->send(200, "application/json", status); return; } set_sd_state(SDCARD_BUSY_PARSING); diff --git a/Grbl_Esp32/src/WebUI/WebSettings.cpp b/Grbl_Esp32/src/WebUI/WebSettings.cpp index b9a34b8c..cec830b9 100644 --- a/Grbl_Esp32/src/WebUI/WebSettings.cpp +++ b/Grbl_Esp32/src/WebUI/WebSettings.cpp @@ -163,6 +163,9 @@ namespace WebUI { } Error WebCommand::action(char* value, WebUI::AuthenticationLevel auth_level, WebUI::ESPResponseStream* out) { + if (_cmdChecker && _cmdChecker()) { + return Error::AnotherInterfaceBusy; + } char empty = '\0'; if (!value) { value = ∅ @@ -716,6 +719,10 @@ namespace WebUI { static Error runSDFile(char* parameter, AuthenticationLevel auth_level) { // ESP220 Error err; + if (sys.state == State::Alarm) { + webPrintln("Alarm"); + return Error::IdleError; + } if (sys.state != State::Idle) { webPrintln("Busy"); return Error::IdleError; @@ -859,7 +866,9 @@ namespace WebUI { default: resp = "Busy"; } -#endif +#else + resp = "SD card not enabled"; +#endif webPrintln(resp); return Error::Ok; } @@ -1066,7 +1075,7 @@ namespace WebUI { #ifdef ENABLE_NOTIFICATIONS notification_ts = new StringSetting( "Notification Settings", WEBSET, WA, NULL, "Notification/TS", DEFAULT_TOKEN, 0, MAX_NOTIFICATION_SETTING_LENGTH, NULL); - notification_t2 = new StringSetting("Notification Token 2", + notification_t2 = new StringSetting("Notification Token 2", WEBSET, WA, NULL, @@ -1075,7 +1084,7 @@ namespace WebUI { MIN_NOTIFICATION_TOKEN_LENGTH, MAX_NOTIFICATION_TOKEN_LENGTH, NULL); - notification_t1 = new StringSetting("Notification Token 1", + notification_t1 = new StringSetting("Notification Token 1", WEBSET, WA, NULL, @@ -1084,8 +1093,8 @@ namespace WebUI { MIN_NOTIFICATION_TOKEN_LENGTH, MAX_NOTIFICATION_TOKEN_LENGTH, NULL); - notification_type = - new EnumSetting("Notification type", WEBSET, WA, NULL, "Notification/Type", DEFAULT_NOTIFICATION_TYPE, ¬ificationOptions); + notification_type = new EnumSetting( + "Notification type", WEBSET, WA, NULL, "Notification/Type", DEFAULT_NOTIFICATION_TYPE, ¬ificationOptions, NULL); #endif #ifdef ENABLE_AUTHENTICATION user_password = new StringSetting("User password", @@ -1121,16 +1130,16 @@ namespace WebUI { #ifdef WIFI_OR_BLUETOOTH // user+ to get, admin to set - wifi_radio_mode = new EnumSetting("Radio mode", WEBSET, WA, "ESP110", "Radio/Mode", DEFAULT_RADIO_MODE, &radioEnabledOptions); + wifi_radio_mode = new EnumSetting("Radio mode", WEBSET, WA, "ESP110", "Radio/Mode", DEFAULT_RADIO_MODE, &radioEnabledOptions, NULL); #endif #ifdef ENABLE_WIFI telnet_port = new IntSetting( "Telnet Port", WEBSET, WA, "ESP131", "Telnet/Port", DEFAULT_TELNETSERVER_PORT, MIN_TELNET_PORT, MAX_TELNET_PORT, NULL); - telnet_enable = new EnumSetting("Telnet Enable", WEBSET, WA, "ESP130", "Telnet/Enable", DEFAULT_TELNET_STATE, &onoffOptions); + telnet_enable = new EnumSetting("Telnet Enable", WEBSET, WA, "ESP130", "Telnet/Enable", DEFAULT_TELNET_STATE, &onoffOptions, NULL); http_port = new IntSetting("HTTP Port", WEBSET, WA, "ESP121", "Http/Port", DEFAULT_WEBSERVER_PORT, MIN_HTTP_PORT, MAX_HTTP_PORT, NULL); - http_enable = new EnumSetting("HTTP Enable", WEBSET, WA, "ESP120", "Http/Enable", DEFAULT_HTTP_STATE, &onoffOptions); + http_enable = new EnumSetting("HTTP Enable", WEBSET, WA, "ESP120", "Http/Enable", DEFAULT_HTTP_STATE, &onoffOptions, NULL); wifi_hostname = new StringSetting("Hostname", WEBSET, WA, @@ -1158,7 +1167,7 @@ namespace WebUI { wifi_sta_netmask = new IPaddrSetting("Station Static Mask", WEBSET, WA, NULL, "Sta/Netmask", DEFAULT_STA_MK, NULL); wifi_sta_gateway = new IPaddrSetting("Station Static Gateway", WEBSET, WA, NULL, "Sta/Gateway", DEFAULT_STA_GW, NULL); wifi_sta_ip = new IPaddrSetting("Station Static IP", WEBSET, WA, NULL, "Sta/IP", DEFAULT_STA_IP, NULL); - wifi_sta_mode = new EnumSetting("Station IP Mode", WEBSET, WA, "ESP102", "Sta/IPMode", DEFAULT_STA_IP_MODE, &staModeOptions); + wifi_sta_mode = new EnumSetting("Station IP Mode", WEBSET, WA, "ESP102", "Sta/IPMode", DEFAULT_STA_IP_MODE, &staModeOptions, NULL); // no get, admin to set wifi_sta_password = new StringSetting("Station Password", WEBSET, diff --git a/Grbl_Esp32/src/WebUI/WifiConfig.cpp b/Grbl_Esp32/src/WebUI/WifiConfig.cpp index d918e7c7..e42c0c05 100644 --- a/Grbl_Esp32/src/WebUI/WifiConfig.cpp +++ b/Grbl_Esp32/src/WebUI/WifiConfig.cpp @@ -115,6 +115,9 @@ namespace WebUI { bool WiFiConfig::isHostnameValid(const char* hostname) { //limited size + if (!hostname) { + return true; + } char c; // length is checked automatically by string setting //only letter and digit @@ -139,6 +142,9 @@ namespace WebUI { //char c; // length is checked automatically by string setting //only printable + if (!ssid) { + return true; + } for (int i = 0; i < strlen(ssid); i++) { if (!isPrintable(ssid[i])) { return false; @@ -152,6 +158,9 @@ namespace WebUI { */ bool WiFiConfig::isPasswordValid(const char* password) { + if (!password) { + return true; + } if (strlen(password) == 0) { return true; //open network } diff --git a/Grbl_Esp32/src/data/index.html.gz b/Grbl_Esp32/src/data/index.html.gz index 1cb7e416e14d6369c4cfdb21fcb067aebc0f41a5..05a4f23a132ac4058a0e7678ff6ac328cb5539be 100644 GIT binary patch literal 116657 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%0A=_4!vDt6J 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 literal 128570 zcmZ_VV{qnt*gyQ*?QZREZEbBEXN|MAZQHhO+ud?&+qR9Z|Gn;c?sxZ-H_0)XWWJvy zlT4D|@hcJr_ zJ8|1CZME~Nn{jv5gWM3m0u41$pO?eu?Ll3)ulVWDr$vfs^Eryc_qr{$)YjF$%7(wr zI@)y0p_Ahmah|yzn3(f&Im|HFcgB33Ts5^e_rmR4*2s)!p^YpKehf>YUOL*z@P1k* zqUq~>DGbI@NLp`yJrePCl#DQ^@6{F^p^ehPV=+*y+T{f+mwWw=eP926z5m+E{WI;_ zSy6?wy44x|X778#+h>!(F~8fk*CV*7Ch?YYGuPD5{rj`SDld9!cRm`I#^cN?2(9U! z&$Gc)-;Yme#ZyPXx$d2{&j|H^W=-p|PV*Sqt1jNSMJuq!A5PoajqjLo`fK}fZ~m4z zLj0a1XHXDL)E#A@QIAt5QGqenc$e}}c8h*_Stor{XmAmU?C0mzS7FfSSPOiujXLnL zc&S-mE#qm&2J26v%}q<^Uve5h{||Q{akU`-(`RCyNpqhr$`u`qVSMuRqJytT%-FsS ztl_GzNv89yhoZ^)9K-!z56(ySVqJf~H?rQh)xBRc=823jd>OBdAimmaPaAKmHn*=x zP@|6?+^|=T!p%9D?hG``k$+l2v>WKh2p%?g*3}r7ZtmSiJf+Pz>=2tVKRfs?V&1mM zHElgJy*w|h8`lY0BMZ0r!W=#~zS6*a;r*!HCVH8zh|F}=w6w0g5M0}UQ%PRB-(wAY4)0Sx8*(xD7&m%t_3nsDf}gD z)1_@?iKa{+?Fb;Bx>h5S4kE}Dc`+H|D(A;K!ewX+<@Zg7$$7VLM<_`;M93v~9p^u8@a!Ped5|-PjydpCBMstB?YZ(VKIZo76?y^!wN?KF zHo5=C^;X**-l!14lYAi|DYt6p+Y8db=kh9;2-9`)s!1(E>!eL5xOv(!?=5RJ5LRS+ zI;Pi;Ze`)4{_OGz9UrTg0Skc_&yP@Q75}pM(FKyEl^AQ_mjS7w46A$VIf^x3t$)EE z62lCbQxqpibVDdX9z>y$?aJl1ccqMXX*sEY->GU+a87$B+8@MeIhW7wP$$PPK`FUY zv7sno+t*9IGvJjM*Nibtc{aC^TGbMN41+OVn7A>}X;{+Zx;3wQyZ@cjsZ&XXr_&di zbxdQxUrg=f_-&0ANH-sLEo8h<=YGNQ*06Db2j51@Rt=1>7E6salv)JMR3TGlv=<2UQOLhmmkuu*>w@xT(FJ-ULK?MCMGij94#x)vWVmGPOvi`y z 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%0DdRl?ZA6;!JN)nka?IWYwM)67!iGXU5`5QC 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 z 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 diff --git a/embedded/package-lock.json b/embedded/package-lock.json index 2520c834..a2205bd0 100644 --- a/embedded/package-lock.json +++ b/embedded/package-lock.json @@ -6273,4 +6273,4 @@ } } } -} +} \ No newline at end of file From 6816925f94dae61f43b663b02f0c1cc1af21f957 Mon Sep 17 00:00:00 2001 From: bdring Date: Thu, 17 Dec 2020 19:32:46 -0600 Subject: [PATCH 2/2] Fix some cut and paste errors in Motors.cpp --- Grbl_Esp32/src/Motors/Motors.cpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/Grbl_Esp32/src/Motors/Motors.cpp b/Grbl_Esp32/src/Motors/Motors.cpp index 1c06a7d7..fe7a9584 100644 --- a/Grbl_Esp32/src/Motors/Motors.cpp +++ b/Grbl_Esp32/src/Motors/Motors.cpp @@ -106,7 +106,7 @@ void init_motors() { if (n_axis >= 2) { // this WILL be done better with settings #ifdef Y_TRINAMIC_DRIVER -# if (X_TRINAMIC_DRIVER == 2130 || X_TRINAMIC_DRIVER == 5160) +# if (Y_TRINAMIC_DRIVER == 2130 || Y_TRINAMIC_DRIVER == 5160) { myMotor[Y_AXIS][0] = new Motors::TrinamicDriver(Y_AXIS, Y_STEP_PIN, Y_DIRECTION_PIN, Y_DISABLE_PIN, Y_CS_PIN, Y_TRINAMIC_DRIVER, Y_RSENSE); @@ -132,7 +132,7 @@ void init_motors() { #endif #ifdef Y2_TRINAMIC_DRIVER -# if (X_TRINAMIC_DRIVER == 2130 || X_TRINAMIC_DRIVER == 5160) +# if (Y2_TRINAMIC_DRIVER == 2130 || Y2_TRINAMIC_DRIVER == 5160) { myMotor[Y_AXIS][1] = new Motors::TrinamicDriver(Y2_AXIS, Y2_STEP_PIN, Y2_DIRECTION_PIN, Y2_DISABLE_PIN, Y2_CS_PIN, Y2_TRINAMIC_DRIVER, Y2_RSENSE); @@ -160,7 +160,7 @@ void init_motors() { if (n_axis >= 3) { // this WILL be done better with settings #ifdef Z_TRINAMIC_DRIVER -# if (X_TRINAMIC_DRIVER == 2130 || X_TRINAMIC_DRIVER == 5160) +# if (Z_TRINAMIC_DRIVER == 2130 || Z_TRINAMIC_DRIVER == 5160) { myMotor[Z_AXIS][0] = new Motors::TrinamicDriver(Z_AXIS, Z_STEP_PIN, Z_DIRECTION_PIN, Z_DISABLE_PIN, Z_CS_PIN, Z_TRINAMIC_DRIVER, Z_RSENSE); @@ -186,7 +186,7 @@ void init_motors() { #endif #ifdef Z2_TRINAMIC_DRIVER -# if (X_TRINAMIC_DRIVER == 2130 || X_TRINAMIC_DRIVER == 5160) +# if (Z2_TRINAMIC_DRIVER == 2130 || Z2_TRINAMIC_DRIVER == 5160) { myMotor[Z_AXIS][1] = new Motors::TrinamicDriver(Z2_AXIS, Z2_STEP_PIN, Z2_DIRECTION_PIN, Z2_DISABLE_PIN, Z2_CS_PIN, Z2_TRINAMIC_DRIVER, Z2_RSENSE); @@ -214,9 +214,9 @@ void init_motors() { if (n_axis >= 4) { // this WILL be done better with settings #ifdef A_TRINAMIC_DRIVER -# if (X_TRINAMIC_DRIVER == 2130 || X_TRINAMIC_DRIVER == 5160) +# if (A_TRINAMIC_DRIVER == 2130 || A_TRINAMIC_DRIVER == 5160) { - myMotor[A_AXIS][1] = + myMotor[A_AXIS][0] = new Motors::TrinamicDriver(A_AXIS, A_STEP_PIN, A_DIRECTION_PIN, A_DISABLE_PIN, A_CS_PIN, A_TRINAMIC_DRIVER, A_RSENSE); } # elif (A_TRINAMIC_DRIVER == 2208 || A_TRINAMIC_DRIVER == 2209) @@ -240,7 +240,7 @@ void init_motors() { #endif #ifdef A2_TRINAMIC_DRIVER -# if (X_TRINAMIC_DRIVER == 2130 || X_TRINAMIC_DRIVER == 5160) +# if (A2_TRINAMIC_DRIVER == 2130 || A2_TRINAMIC_DRIVER == 5160) { myMotor[A_AXIS][1] = new Motors::TrinamicDriver(A2_AXIS, A2_STEP_PIN, A2_DIRECTION_PIN, A2_DISABLE_PIN, A2_CS_PIN, A2_TRINAMIC_DRIVER, A2_RSENSE); @@ -268,9 +268,9 @@ void init_motors() { if (n_axis >= 5) { // this WILL be done better with settings #ifdef B_TRINAMIC_DRIVER -# if (X_TRINAMIC_DRIVER == 2130 || X_TRINAMIC_DRIVER == 5160) +# if (B_TRINAMIC_DRIVER == 2130 || B_TRINAMIC_DRIVER == 5160) { - myMotor[B_AXIS][1] = + myMotor[B_AXIS][0] = new Motors::TrinamicDriver(B_AXIS, B_STEP_PIN, B_DIRECTION_PIN, B_DISABLE_PIN, B_CS_PIN, B_TRINAMIC_DRIVER, B_RSENSE); } # elif (B_TRINAMIC_DRIVER == 2208 || B_TRINAMIC_DRIVER == 2209) @@ -294,7 +294,7 @@ void init_motors() { #endif #ifdef B2_TRINAMIC_DRIVER -# if (X_TRINAMIC_DRIVER == 2130 || X_TRINAMIC_DRIVER == 5160) +# if (B2_TRINAMIC_DRIVER == 2130 || B2_TRINAMIC_DRIVER == 5160) { myMotor[B_AXIS][1] = new Motors::TrinamicDriver(B2_AXIS, B2_STEP_PIN, B2_DIRECTION_PIN, B2_DISABLE_PIN, B2_CS_PIN, B2_TRINAMIC_DRIVER, B2_RSENSE); @@ -322,9 +322,9 @@ void init_motors() { if (n_axis >= 6) { // this WILL be done better with settings #ifdef C_TRINAMIC_DRIVER -# if (X_TRINAMIC_DRIVER == 2130 || X_TRINAMIC_DRIVER == 5160) +# if (C_TRINAMIC_DRIVER == 2130 || C_TRINAMIC_DRIVER == 5160) { - myMotor[C_AXIS][1] = + myMotor[C_AXIS][0] = new Motors::TrinamicDriver(C_AXIS, C_STEP_PIN, C_DIRECTION_PIN, C_DISABLE_PIN, C_CS_PIN, C_TRINAMIC_DRIVER, C_RSENSE); } # elif (C_TRINAMIC_DRIVER == 2208 || C_TRINAMIC_DRIVER == 2209) @@ -348,7 +348,7 @@ void init_motors() { #endif #ifdef C2_TRINAMIC_DRIVER -# if (X_TRINAMIC_DRIVER == 2130 || X_TRINAMIC_DRIVER == 5160) +# if (C2_TRINAMIC_DRIVER == 2130 || C2_TRINAMIC_DRIVER == 5160) { myMotor[C_AXIS][1] = new Motors::TrinamicDriver(C2_AXIS, C2_STEP_PIN, C2_DIRECTION_PIN, C2_DISABLE_PIN, C2_CS_PIN, C2_TRINAMIC_DRIVER, C2_RSENSE);