|
@@ -270,6 +270,7 @@ float extruder_offset[NUM_EXTRUDER_OFFSETS][EXTRUDERS] = {
|
|
|
|
|
|
uint8_t active_extruder = 0;
|
|
|
int fanSpeed=0;
|
|
|
+uint8_t newFanSpeed = 0;
|
|
|
|
|
|
#ifdef FWRETRACT
|
|
|
bool retracted[EXTRUDERS]={false
|
|
@@ -389,10 +390,58 @@ static int saved_fanSpeed = 0; //!< Print fan speed
|
|
|
|
|
|
static int saved_feedmultiply_mm = 100;
|
|
|
|
|
|
-#ifdef AUTO_REPORT_TEMPERATURES
|
|
|
-static LongTimer auto_report_temp_timer;
|
|
|
-static uint8_t auto_report_temp_period = 0;
|
|
|
-#endif //AUTO_REPORT_TEMPERATURES
|
|
|
+class AutoReportFeatures {
|
|
|
+ union {
|
|
|
+ struct {
|
|
|
+ uint8_t temp : 1; //Temperature flag
|
|
|
+ uint8_t fans : 1; //Fans flag
|
|
|
+ uint8_t pos: 1; //Position flag
|
|
|
+ uint8_t ar4 : 1; //Unused
|
|
|
+ uint8_t ar5 : 1; //Unused
|
|
|
+ uint8_t ar6 : 1; //Unused
|
|
|
+ uint8_t ar7 : 1; //Unused
|
|
|
+ } __attribute__((packed)) bits;
|
|
|
+ uint8_t byte;
|
|
|
+ } arFunctionsActive;
|
|
|
+ uint8_t auto_report_period;
|
|
|
+public:
|
|
|
+ LongTimer auto_report_timer;
|
|
|
+ AutoReportFeatures():auto_report_period(0){
|
|
|
+#if defined(AUTO_REPORT)
|
|
|
+ arFunctionsActive.byte = 0xff;
|
|
|
+#else
|
|
|
+ arFunctionsActive.byte = 0;
|
|
|
+#endif //AUTO_REPORT
|
|
|
+ }
|
|
|
+
|
|
|
+ inline bool Temp()const { return arFunctionsActive.bits.temp != 0; }
|
|
|
+ inline void SetTemp(uint8_t v){ arFunctionsActive.bits.temp = v; }
|
|
|
+
|
|
|
+ inline bool Fans()const { return arFunctionsActive.bits.fans != 0; }
|
|
|
+ inline void SetFans(uint8_t v){ arFunctionsActive.bits.fans = v; }
|
|
|
+
|
|
|
+ inline bool Pos()const { return arFunctionsActive.bits.pos != 0; }
|
|
|
+ inline void SetPos(uint8_t v){ arFunctionsActive.bits.pos = v; }
|
|
|
+
|
|
|
+ inline void SetMask(uint8_t mask){ arFunctionsActive.byte = mask; }
|
|
|
+
|
|
|
+ /// sets the autoreporting timer's period
|
|
|
+ /// setting it to zero stops the timer
|
|
|
+ void SetPeriod(uint8_t p){
|
|
|
+ auto_report_period = p;
|
|
|
+ if (auto_report_period != 0){
|
|
|
+ auto_report_timer.start();
|
|
|
+ } else{
|
|
|
+ auto_report_timer.stop();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ inline void TimerStart() { auto_report_timer.start(); }
|
|
|
+ inline bool TimerRunning()const { return auto_report_timer.running(); }
|
|
|
+ inline bool TimerExpired() { return auto_report_timer.expired(auto_report_period * 1000ul); }
|
|
|
+};
|
|
|
+
|
|
|
+AutoReportFeatures autoReportFeatures;
|
|
|
|
|
|
//===========================================================================
|
|
|
//=============================Routines======================================
|
|
@@ -1730,16 +1779,26 @@ void host_keepalive() {
|
|
|
if (farm_mode) return;
|
|
|
long ms = _millis();
|
|
|
|
|
|
-#ifdef AUTO_REPORT_TEMPERATURES
|
|
|
- if (auto_report_temp_timer.running())
|
|
|
+#if defined(AUTO_REPORT)
|
|
|
{
|
|
|
- if (auto_report_temp_timer.expired(auto_report_temp_period * 1000ul))
|
|
|
+ if (autoReportFeatures.TimerExpired())
|
|
|
{
|
|
|
- gcode_M105(active_extruder);
|
|
|
- auto_report_temp_timer.start();
|
|
|
+ if(autoReportFeatures.Temp()){
|
|
|
+ gcode_M105(active_extruder);
|
|
|
+ }
|
|
|
+ if(autoReportFeatures.Pos()){
|
|
|
+ gcode_M114();
|
|
|
+ }
|
|
|
+ #if defined(AUTO_REPORT) && (defined(FANCHECK) && (((defined(TACH_0) && (TACH_0 >-1)) || (defined(TACH_1) && (TACH_1 > -1)))))
|
|
|
+ if(autoReportFeatures.Fans()){
|
|
|
+ gcode_M123();
|
|
|
+ }
|
|
|
+#endif //AUTO_REPORT and (FANCHECK and TACH_0 or TACH_1)
|
|
|
+ autoReportFeatures.TimerStart();
|
|
|
}
|
|
|
}
|
|
|
-#endif //AUTO_REPORT_TEMPERATURES
|
|
|
+#endif //AUTO_REPORT
|
|
|
+
|
|
|
|
|
|
if (host_keepalive_interval && busy_state != NOT_BUSY) {
|
|
|
if ((ms - prev_busy_signal_ms) < (long)(1000L * host_keepalive_interval)) return;
|
|
@@ -3166,6 +3225,13 @@ void gcode_M114()
|
|
|
SERIAL_PROTOCOLLN("");
|
|
|
}
|
|
|
|
|
|
+#if (defined(FANCHECK) && (((defined(TACH_0) && (TACH_0 >-1)) || (defined(TACH_1) && (TACH_1 > -1)))))
|
|
|
+void gcode_M123()
|
|
|
+{
|
|
|
+ printf_P(_N("E0:%d RPM PRN1:%d RPM E0@:%u PRN1@:%d\n"), 60*fan_speed[active_extruder], 60*fan_speed[1], newFanSpeed, fanSpeed);
|
|
|
+}
|
|
|
+#endif //FANCHECK and TACH_0 or TACH_1
|
|
|
+
|
|
|
//! extracted code to compute z_shift for M600 in case of filament change operation
|
|
|
//! requested from fsensors.
|
|
|
//! The function ensures, that the printhead lifts to at least 25mm above the heat bed
|
|
@@ -3515,8 +3581,15 @@ static void cap_line(const char* name, bool ena = false) {
|
|
|
|
|
|
static void extended_capabilities_report()
|
|
|
{
|
|
|
- cap_line(PSTR("AUTOREPORT_TEMP"), ENABLED(AUTO_REPORT_TEMPERATURES));
|
|
|
- //@todo
|
|
|
+ // AUTOREPORT_TEMP (M155)
|
|
|
+ cap_line(PSTR("AUTOREPORT_TEMP"), ENABLED(AUTO_REPORT));
|
|
|
+#if (defined(FANCHECK) && (((defined(TACH_0) && (TACH_0 >-1)) || (defined(TACH_1) && (TACH_1 > -1)))))
|
|
|
+ // AUTOREPORT_FANS (M123)
|
|
|
+ cap_line(PSTR("AUTOREPORT_FANS"), ENABLED(AUTO_REPORT));
|
|
|
+#endif //FANCHECK and TACH_0 or TACH_1
|
|
|
+ // AUTOREPORT_POSITION (M114)
|
|
|
+ cap_line(PSTR("AUTOREPORT_POSITION"), ENABLED(AUTO_REPORT));
|
|
|
+ //@todo Update RepRap cap
|
|
|
}
|
|
|
#endif //EXTENDED_CAPABILITIES_REPORT
|
|
|
|
|
@@ -3606,13 +3679,14 @@ extern uint8_t st_backlash_y;
|
|
|
//!@n M115 - Capabilities string
|
|
|
//!@n M117 - display message
|
|
|
//!@n M119 - Output Endstop status to serial port
|
|
|
+//!@n M123 - Tachometer value
|
|
|
//!@n M126 - Solenoid Air Valve Open (BariCUDA support by jmil)
|
|
|
//!@n M127 - Solenoid Air Valve Closed (BariCUDA vent to atmospheric pressure by jmil)
|
|
|
//!@n M128 - EtoP Open (BariCUDA EtoP = electricity to air pressure transducer by jmil)
|
|
|
//!@n M129 - EtoP Closed (BariCUDA EtoP = electricity to air pressure transducer by jmil)
|
|
|
//!@n M140 - Set bed target temp
|
|
|
//!@n M150 - Set BlinkM Color Output R: Red<0-255> U(!): Green<0-255> B: Blue<0-255> over i2c, G for green does not work.
|
|
|
-//!@n M155 - Automatically send temperatures
|
|
|
+//!@n M155 - Automatically send temperatures, fan speeds, position
|
|
|
//!@n M190 - Sxxx Wait for bed current temp to reach target temp. Waits only when heating
|
|
|
//! Rxxx Wait for bed current temp to reach target temp. Waits when heating and cooling
|
|
|
//!@n M200 D<millimeters>- set filament diameter and set E axis units to cubic millimeters (use S0 to set back to millimeters).
|
|
@@ -6406,31 +6480,42 @@ Sigma_Exit:
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
-#ifdef AUTO_REPORT_TEMPERATURES
|
|
|
+#if defined(AUTO_REPORT)
|
|
|
/*!
|
|
|
- ### M155 - Automatically send temperatures <a href="https://reprap.org/wiki/G-code#M155:_Automatically_send_temperatures">M155: Automatically send temperatures</a>
|
|
|
+ ### M155 - Automatically send status <a href="https://reprap.org/wiki/G-code#M155:_Automatically_send_temperatures">M155: Automatically send temperatures</a>
|
|
|
#### Usage
|
|
|
|
|
|
- M155 [ S ]
|
|
|
+ M155 [ S ] [ C ]
|
|
|
|
|
|
#### Parameters
|
|
|
|
|
|
- - `S` - Set temperature autoreporting interval in seconds. 0 to disable. Maximum: 255
|
|
|
-
|
|
|
- */
|
|
|
+ - `S` - Set autoreporting interval in seconds. 0 to disable. Maximum: 255
|
|
|
+ - `C` - Activate auto-report function (bit mask). Default is temperature.
|
|
|
+
|
|
|
+ bit 0 = Auto-report temperatures
|
|
|
+ bit 1 = Auto-report fans
|
|
|
+ bit 2 = Auto-report position
|
|
|
+ bit 3 = free
|
|
|
+ bit 4 = free
|
|
|
+ bit 5 = free
|
|
|
+ bit 6 = free
|
|
|
+ bit 7 = free
|
|
|
+ */
|
|
|
+ //!@todo update RepRap Gcode wiki
|
|
|
+ //!@todo Should be temperature always? Octoprint doesn't switch to M105 if M155 timer is set
|
|
|
case 155:
|
|
|
{
|
|
|
- if (code_seen('S'))
|
|
|
- {
|
|
|
- auto_report_temp_period = code_value_uint8();
|
|
|
- if (auto_report_temp_period != 0)
|
|
|
- auto_report_temp_timer.start();
|
|
|
- else
|
|
|
- auto_report_temp_timer.stop();
|
|
|
+ if (code_seen('S')){
|
|
|
+ autoReportFeatures.SetPeriod( code_value_uint8() );
|
|
|
}
|
|
|
- }
|
|
|
+ if (code_seen('C')){
|
|
|
+ autoReportFeatures.SetMask(code_value());
|
|
|
+ } else{
|
|
|
+ autoReportFeatures.SetMask(1); //Backwards compability to host systems like Octoprint to send only temp if paramerter `C`isn't used.
|
|
|
+ }
|
|
|
+ }
|
|
|
break;
|
|
|
-#endif //AUTO_REPORT_TEMPERATURES
|
|
|
+#endif //AUTO_REPORT
|
|
|
|
|
|
/*!
|
|
|
### M109 - Wait for extruder temperature <a href="https://reprap.org/wiki/G-code#M109:_Set_Extruder_Temperature_and_Wait">M109: Set Extruder Temperature and Wait</a>
|
|
@@ -6965,7 +7050,30 @@ Sigma_Exit:
|
|
|
#endif
|
|
|
break;
|
|
|
//!@todo update for all axes, use for loop
|
|
|
+
|
|
|
+#if (defined(FANCHECK) && (((defined(TACH_0) && (TACH_0 >-1)) || (defined(TACH_1) && (TACH_1 > -1)))))
|
|
|
+ /*!
|
|
|
+ ### M123 - Tachometer value <a href="https://www.reprap.org/wiki/G-code#M123:_Tachometer_value_.28RepRap.29">M123: Tachometer value</a>
|
|
|
+ This command is used to report fan speeds and fan pwm values.
|
|
|
+ #### Usage
|
|
|
|
|
|
+ M123
|
|
|
+
|
|
|
+ - E0: - Hotend fan speed in RPM
|
|
|
+ - PRN1: - Part cooling fans speed in RPM
|
|
|
+ - E0@: - Hotend fan PWM value
|
|
|
+ - PRN1@: -Part cooling fan PWM value
|
|
|
+
|
|
|
+ _Example:_
|
|
|
+
|
|
|
+ E0:3240 RPM PRN1:4560 RPM E0@:255 PRN1@:255
|
|
|
+
|
|
|
+ */
|
|
|
+ //!@todo Update RepRap Gcode wiki
|
|
|
+ case 123:
|
|
|
+ gcode_M123();
|
|
|
+ break;
|
|
|
+#endif //FANCHECK and TACH_0 and TACH_1
|
|
|
|
|
|
#ifdef BLINKM
|
|
|
/*!
|