Browse Source

Merge remote-tracking branch 'upstream/MK3' into PFW-1271_PF-buildv20

3d-gussner 3 years ago
parent
commit
3d871a3aa6
6 changed files with 38 additions and 37 deletions
  1. 13 1
      Firmware/Dcodes.cpp
  2. 2 1
      Firmware/Dcodes.h
  3. 4 2
      Firmware/Marlin_main.cpp
  4. 2 13
      Firmware/cardreader.cpp
  5. 4 2
      Firmware/temperature.cpp
  6. 13 18
      Firmware/util.cpp

+ 13 - 1
Firmware/Dcodes.cpp

@@ -1,5 +1,5 @@
-#include "Dcodes.h"
 #include "Marlin.h"
+#include "Dcodes.h"
 #include "Configuration.h"
 #include "language.h"
 #include "cmdqueue.h"
@@ -974,6 +974,18 @@ void dcode_22()
 
 bool emergency_serial_dump = false;
 
+void dcode_23()
+{
+    if(code_seen('E'))
+        serial_dump_and_reset(dump_crash_reason::manual);
+    else
+    {
+        emergency_serial_dump = !code_seen('R');
+        SERIAL_ECHOPGM("serial dump ");
+        SERIAL_ECHOLNRPGM(emergency_serial_dump? _N("enabled"): _N("disabled"));
+    }
+}
+
 void __attribute__((noinline)) serial_dump_and_reset(dump_crash_reason reason)
 {
     uint16_t sp;

+ 2 - 1
Firmware/Dcodes.h

@@ -37,7 +37,8 @@ extern void dcode_22(); //D22 - Clear crash dump state
 
 #ifdef EMERGENCY_SERIAL_DUMP
 #include "xflash_dump.h"
-extern bool emergency_serial_dump;
+extern void dcode_23(); //D23 - Request/generate an online serial crash dump
+extern bool emergency_serial_dump; //emergency dump enabled flag
 extern void serial_dump_and_reset(dump_crash_reason);
 #endif
 

+ 4 - 2
Firmware/Marlin_main.cpp

@@ -9382,12 +9382,14 @@ Sigma_Exit:
     When online dumps are enabled, the FW will dump memory on the serial before resetting.
     #### Usage
 
-     D23 [R]
+     D23 [E] [R]
     #### Parameters
+    - `E` - Perform an emergency crash dump (resets the printer).
     - `R` - Disable online dumps.
     */
     case 23: {
-        emergency_serial_dump = !code_seen('R');
+        dcode_23();
+        break;
     };
 #endif
 

+ 2 - 13
Firmware/cardreader.cpp

@@ -596,20 +596,9 @@ void CardReader::getStatus(bool arg_P)
 }
 void CardReader::write_command(char *buf)
 {
-  char* begin = buf;
-  char* npos = 0;
-  char* end = buf + strlen(buf) - 1;
-
   file.writeError = false;
-  if((npos = strchr(buf, 'N')) != NULL)
-  {
-    begin = strchr(npos, ' ') + 1;
-    end = strchr(npos, '*') - 1;
-  }
-  end[1] = '\r';
-  end[2] = '\n';
-  end[3] = '\0';
-  file.write(begin);
+  file.write(buf); //write command
+  file.write("\r\n"); //write line termination
   if (file.writeError)
   {
     SERIAL_ERROR_START;

+ 4 - 2
Firmware/temperature.cpp

@@ -287,8 +287,10 @@ bool checkAllHotends(void)
     return(result);
 }
 
-  void PID_autotune(float temp, int extruder, int ncycles)
-  {
+// WARNING: the following function has been marked noinline to avoid a GCC 4.9.2 LTO
+//          codegen bug causing a stack overwrite issue in process_commands()
+void __attribute__((noinline)) PID_autotune(float temp, int extruder, int ncycles)
+{
   pid_number_of_cycles = ncycles;
   pid_tuning_finished = false;
   float input = 0.0;

+ 13 - 18
Firmware/util.cpp

@@ -146,9 +146,14 @@ inline int8_t is_provided_version_newer(const char *version_string)
     uint16_t ver_gcode[4];
     if (! parse_version(version_string, ver_gcode))
         return -1;
-    for (uint8_t i = 0; i < 3; ++ i)
-        if (ver_gcode[i] > FW_VERSION_NR[i])
+    for (uint8_t i = 0; i < 4; ++ i)
+    {
+        uint16_t v = (uint16_t)pgm_read_word(&FW_VERSION_NR[i]);
+        if (ver_gcode[i] > v)
             return 1;
+        else if (ver_gcode[i] < v)
+            return 0;
+    }
     return 0;
 }
 
@@ -182,19 +187,9 @@ bool force_selftest_if_fw_version()
 
 bool show_upgrade_dialog_if_version_newer(const char *version_string)
 {
-    uint16_t ver_gcode[4];
-    if (! parse_version(version_string, ver_gcode)) {
-//        SERIAL_PROTOCOLLNPGM("parse_version failed");
+    int8_t upgrade = is_provided_version_newer(version_string);
+    if (upgrade < 0)
         return false;
-    }
-    bool upgrade = false;
-    for (uint8_t i = 0; i < 4; ++ i) {
-        if (ver_gcode[i] > FW_VERSION_NR[i]) {
-            upgrade = true;
-            break;
-        } else if (ver_gcode[i] < FW_VERSION_NR[i])
-            break;
-    }
 
     if (upgrade) {
         lcd_display_message_fullscreen_P(_i("New firmware version available:"));////MSG_NEW_FIRMWARE_AVAILABLE c=20 r=2
@@ -220,11 +215,11 @@ void update_current_firmware_version_to_eeprom()
     for (int8_t i = 0; i < FW_PRUSA3D_MAGIC_LEN; ++ i){
         eeprom_update_byte((uint8_t*)(EEPROM_FIRMWARE_PRUSA_MAGIC+i), pgm_read_byte(FW_PRUSA3D_MAGIC_STR+i));
     }
-    eeprom_update_word((uint16_t*)EEPROM_FIRMWARE_VERSION_MAJOR,    FW_VERSION_NR[0]);
-    eeprom_update_word((uint16_t*)EEPROM_FIRMWARE_VERSION_MINOR,    FW_VERSION_NR[1]);
-    eeprom_update_word((uint16_t*)EEPROM_FIRMWARE_VERSION_REVISION, FW_VERSION_NR[2]);
+    eeprom_update_word((uint16_t*)EEPROM_FIRMWARE_VERSION_MAJOR,    (uint16_t)pgm_read_word(&FW_VERSION_NR[0]));
+    eeprom_update_word((uint16_t*)EEPROM_FIRMWARE_VERSION_MINOR,    (uint16_t)pgm_read_word(&FW_VERSION_NR[1]));
+    eeprom_update_word((uint16_t*)EEPROM_FIRMWARE_VERSION_REVISION, (uint16_t)pgm_read_word(&FW_VERSION_NR[2]));
     // See FirmwareRevisionFlavorType for the definition of firmware flavors.
-    eeprom_update_word((uint16_t*)EEPROM_FIRMWARE_VERSION_FLAVOR,   FW_VERSION_NR[3]);
+    eeprom_update_word((uint16_t*)EEPROM_FIRMWARE_VERSION_FLAVOR,   (uint16_t)pgm_read_word(&FW_VERSION_NR[3]));
 }