Take anycubic's approach to implement power outage support. SD card wearing can be prevented by disabling it via POWER_OUTAGE_TEST flag.

This commit is contained in:
Knutwurst
2020-06-11 15:36:23 +02:00
parent a52dc3c7e9
commit d090049594
7 changed files with 134 additions and 32 deletions

View File

@@ -40,6 +40,7 @@
#define KNUTWURST_MEGAS #define KNUTWURST_MEGAS
#define KNUTWURST_TMC #define KNUTWURST_TMC
//#define POWER_OUTAGE_TEST
//=========================================================================== //===========================================================================
//============================= Getting Started ============================= //============================= Getting Started =============================

View File

@@ -38,13 +38,34 @@
#include "../module/stepper.h" #include "../module/stepper.h"
#include "../module/temperature.h" #include "../module/temperature.h"
#include "../sd/cardreader.h" #include "../sd/cardreader.h"
#include "../module/configuration_store.h"
#ifdef ANYCUBIC_TOUCHSCREEN #ifdef ANYCUBIC_TOUCHSCREEN
#include "anycubic_touchscreen.h" #include "anycubic_touchscreen.h"
#include "HardwareSerial.h" #include "HardwareSerial.h"
int Temp_Buf_Extuder_Temperature = 0;
int Temp_Buf_Bed_Temperature = 0;
char _conv[8]; char _conv[8];
unsigned char ResumingFlag = 0;
#if defined(POWER_OUTAGE_TEST)
int PowerInt = 6;
unsigned char PowerTestFlag = false;
#endif
void setup_OutageTestPin()
{
#if defined(POWER_OUTAGE_TEST)
pinMode(OUTAGETEST_PIN, INPUT);
pinMode(OUTAGECON_PIN, OUTPUT);
WRITE(OUTAGECON_PIN, LOW);
#endif
}
char *itostr2(const uint8_t &x) char *itostr2(const uint8_t &x)
{ {
//sprintf(conv,"%5.1f",x); //sprintf(conv,"%5.1f",x);
@@ -128,6 +149,9 @@ void AnycubicTouchscreenClass::Setup()
buzzer.tone(250, 554); // C#5 buzzer.tone(250, 554); // C#5
buzzer.tone(500, 831); // G#5 buzzer.tone(500, 831); // G#5
#endif #endif
setup_OutageTestPin();
} }
void AnycubicTouchscreenClass::WriteOutageEEPromData() void AnycubicTouchscreenClass::WriteOutageEEPromData()
@@ -557,7 +581,6 @@ void AnycubicTouchscreenClass::Ls()
HARDWARE_SERIAL_PROTOCOLLNPGM("<Z Down 0.1>"); HARDWARE_SERIAL_PROTOCOLLNPGM("<Z Down 0.1>");
break; break;
case 8: // Page 3 case 8: // Page 3
HARDWARE_SERIAL_PROTOCOLLNPGM("<Z Up 0.02>"); HARDWARE_SERIAL_PROTOCOLLNPGM("<Z Up 0.02>");
HARDWARE_SERIAL_PROTOCOLLNPGM("<Z Up 0.02>"); HARDWARE_SERIAL_PROTOCOLLNPGM("<Z Up 0.02>");
@@ -569,7 +592,6 @@ void AnycubicTouchscreenClass::Ls()
HARDWARE_SERIAL_PROTOCOLLNPGM("<Z Down 0.01>"); HARDWARE_SERIAL_PROTOCOLLNPGM("<Z Down 0.01>");
break; break;
case 12: // Page 4 case 12: // Page 4
HARDWARE_SERIAL_PROTOCOLLNPGM("<PID Tune Hotend>"); HARDWARE_SERIAL_PROTOCOLLNPGM("<PID Tune Hotend>");
HARDWARE_SERIAL_PROTOCOLLNPGM("<PID Tune Hotend>"); HARDWARE_SERIAL_PROTOCOLLNPGM("<PID Tune Hotend>");
@@ -581,7 +603,6 @@ void AnycubicTouchscreenClass::Ls()
HARDWARE_SERIAL_PROTOCOLLNPGM("<Load FW Defaults>"); HARDWARE_SERIAL_PROTOCOLLNPGM("<Load FW Defaults>");
break; break;
case 16: // Page 5 case 16: // Page 5
HARDWARE_SERIAL_PROTOCOLLNPGM("<Disable Fil. Sensor>"); HARDWARE_SERIAL_PROTOCOLLNPGM("<Disable Fil. Sensor>");
HARDWARE_SERIAL_PROTOCOLLNPGM("<Disable Fil. Sensor>"); HARDWARE_SERIAL_PROTOCOLLNPGM("<Disable Fil. Sensor>");
@@ -591,8 +612,7 @@ void AnycubicTouchscreenClass::Ls()
HARDWARE_SERIAL_PROTOCOLLNPGM("<Exit>"); HARDWARE_SERIAL_PROTOCOLLNPGM("<Exit>");
break; break;
/*
/*
case 12: // Fourth Page case 12: // Fourth Page
HARDWARE_SERIAL_PROTOCOLLNPGM("<Z Up 0.1>"); HARDWARE_SERIAL_PROTOCOLLNPGM("<Z Up 0.1>");
HARDWARE_SERIAL_PROTOCOLLNPGM("<Z Up 0.1>"); HARDWARE_SERIAL_PROTOCOLLNPGM("<Z Up 0.1>");
@@ -651,21 +671,20 @@ void AnycubicTouchscreenClass::Ls()
{ {
card.selectFileByIndex(cnt - 1); card.selectFileByIndex(cnt - 1);
// Bugfix for non-printable special characters // Bugfix for non-printable special characters
// which are now replaced by underscores. // which are now replaced by underscores.
int fileNameLen = strlen(card.longFilename); int fileNameLen = strlen(card.longFilename);
char buffer[fileNameLen]; char buffer[fileNameLen];
for (unsigned char i = 0; i < fileNameLen; i++){ for (unsigned char i = 0; i < fileNameLen; i++)
{
buffer[i] = card.longFilename[i]; buffer[i] = card.longFilename[i];
if (!isPrintable(buffer[i])) if (!isPrintable(buffer[i]))
{ {
buffer[i] = '_'; buffer[i] = '_';
} }
} }
buffer[fileNameLen] = '\0'; buffer[fileNameLen] = '\0';
if (card.flag.filenameIsDir) if (card.flag.filenameIsDir)
{ {
@@ -874,9 +893,9 @@ void AnycubicTouchscreenClass::StateHandler()
void AnycubicTouchscreenClass::FilamentRunout() void AnycubicTouchscreenClass::FilamentRunout()
{ {
if(FilamentSensorEnabled == true) if (FilamentSensorEnabled == true)
{ {
#if ENABLED(ANYCUBIC_FILAMENT_RUNOUT_SENSOR) #if ENABLED(ANYCUBIC_FILAMENT_RUNOUT_SENSOR)
FilamentTestStatus = READ(19) & 0xff; FilamentTestStatus = READ(19) & 0xff;
if (FilamentTestStatus > FilamentTestLastStatus) if (FilamentTestStatus > FilamentTestLastStatus)
@@ -888,9 +907,9 @@ void AnycubicTouchscreenClass::FilamentRunout()
// since this is inside a loop, only set delay time once // since this is inside a loop, only set delay time once
if (FilamentSetMillis) if (FilamentSetMillis)
{ {
#ifdef ANYCUBIC_TFT_DEBUG #ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOLNPGM("DEBUG: Set filament trigger time"); SERIAL_ECHOLNPGM("DEBUG: Set filament trigger time");
#endif #endif
// set the delayed timestamp to 3000ms later // set the delayed timestamp to 3000ms later
fil_delay = fil_ms + 3000UL; fil_delay = fil_ms + 3000UL;
// this doesn't need to run until the filament is recovered again // this doesn't need to run until the filament is recovered again
@@ -903,26 +922,26 @@ void AnycubicTouchscreenClass::FilamentRunout()
{ {
if (!IsParked) if (!IsParked)
{ {
#ifdef ANYCUBIC_TFT_DEBUG #ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOLNPGM("DEBUG: 3000ms delay done"); SERIAL_ECHOLNPGM("DEBUG: 3000ms delay done");
#endif #endif
if (card.isPrinting()) if (card.isPrinting())
{ {
ai3m_pause_state = 3; ai3m_pause_state = 3;
; // set runout pause flag ; // set runout pause flag
#ifdef ANYCUBIC_TFT_DEBUG #ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOPAIR(" DEBUG: AI3M Pause State: ", ai3m_pause_state); SERIAL_ECHOPAIR(" DEBUG: AI3M Pause State: ", ai3m_pause_state);
SERIAL_EOL(); SERIAL_EOL();
#endif #endif
PausePrint(); PausePrint();
} }
else if (!card.isPrinting()) else if (!card.isPrinting())
{ {
HARDWARE_SERIAL_PROTOCOLPGM("J15"); //J15 FILAMENT LACK HARDWARE_SERIAL_PROTOCOLPGM("J15"); //J15 FILAMENT LACK
HARDWARE_SERIAL_ENTER(); HARDWARE_SERIAL_ENTER();
#ifdef ANYCUBIC_TFT_DEBUG #ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOLNPGM("TFT Serial Debug: Filament runout... J15"); SERIAL_ECHOLNPGM("TFT Serial Debug: Filament runout... J15");
#endif #endif
FilamentTestLastStatus = FilamentTestStatus; FilamentTestLastStatus = FilamentTestStatus;
} }
} }
@@ -933,11 +952,11 @@ void AnycubicTouchscreenClass::FilamentRunout()
{ {
FilamentSetMillis = true; // set the timestamps on the next loop again FilamentSetMillis = true; // set the timestamps on the next loop again
FilamentTestLastStatus = FilamentTestStatus; FilamentTestLastStatus = FilamentTestStatus;
#ifdef ANYCUBIC_TFT_DEBUG #ifdef ANYCUBIC_TFT_DEBUG
SERIAL_ECHOLNPGM("TFT Serial Debug: Filament runout recovered"); SERIAL_ECHOLNPGM("TFT Serial Debug: Filament runout recovered");
#endif #endif
} }
#endif #endif
} }
} }
@@ -1203,16 +1222,18 @@ void AnycubicTouchscreenClass::GetCommandFromTFT()
#endif #endif
break; break;
case 15: // A15 RESUMING FROM OUTAGE case 15: // A15 RESUMING FROM OUTAGE
//if((!planner.movesplanned())&&(!TFTresumingflag)) if ((!planner.movesplanned()) && (TFTstate != ANYCUBIC_TFT_STATE_SDPAUSE))
// { {
// if(card.isMounted()) if (card.isFileOpen())
// FlagResumFromOutage=true; FlagResumFromOutage = true;
// ResumingFlag=1;
// card.startFileprint(); ResumingFlag = 1;
// starttime=millis(); card.startFileprint();
// HARDWARE_SERIAL_SUCC_START; starttime = millis();
// } HARDWARE_SERIAL_SUCC_START;
//HARDWARE_SERIAL_ENTER(); }
HARDWARE_SERIAL_ENTER();
break; break;
case 16: // A16 set hotend temp case 16: // A16 set hotend temp
{ {
@@ -1547,5 +1568,21 @@ void AnycubicTouchscreenClass::BedHeatingDone()
#endif #endif
} }
void PowerKill()
{
#ifdef POWER_OUTAGE_TEST
Temp_Buf_Extuder_Temperature = thermalManager.degTargetHotend(0);
Temp_Buf_Bed_Temperature = thermalManager.degTargetBed();
if (PowerTestFlag == true)
{
thermalManager.disable_all_heaters();
OutageSave();
PowerTestFlag = false;
thermalManager.setTargetHotend(Temp_Buf_Extuder_Temperature, 0);
thermalManager.setTargetBed(Temp_Buf_Bed_Temperature);
}
#endif
}
AnycubicTouchscreenClass AnycubicTouchscreen; AnycubicTouchscreenClass AnycubicTouchscreen;
#endif #endif

View File

@@ -56,6 +56,8 @@
#include "../gcode/gcode.h" #include "../gcode/gcode.h"
#include "../MarlinCore.h" #include "../MarlinCore.h"
#include "../sd/cardreader.h"
#if EITHER(EEPROM_SETTINGS, SD_FIRMWARE_UPDATE) #if EITHER(EEPROM_SETTINGS, SD_FIRMWARE_UPDATE)
#include "../HAL/shared/eeprom_api.h" #include "../HAL/shared/eeprom_api.h"
#endif #endif
@@ -522,6 +524,9 @@ void MarlinSettings::postprocess() {
#define EEPROM_READ_ALWAYS(VAR) do{ persistentStore.read_data(eeprom_index, (uint8_t*)&VAR, sizeof(VAR), &working_crc); }while(0) #define EEPROM_READ_ALWAYS(VAR) do{ persistentStore.read_data(eeprom_index, (uint8_t*)&VAR, sizeof(VAR), &working_crc); }while(0)
#define EEPROM_ASSERT(TST,ERR) do{ if (!(TST)) { SERIAL_ERROR_MSG(ERR); eeprom_error = true; } }while(0) #define EEPROM_ASSERT(TST,ERR) do{ if (!(TST)) { SERIAL_ERROR_MSG(ERR); eeprom_error = true; } }while(0)
#define EEPROM_WRITE_VAR(pos, value) persistentStore.write_data(pos, (uint8_t*)&value, sizeof(value))
#define EEPROM_READ_VAR(pos, value) persistentStore.read_data(pos, (uint8_t*)&value, sizeof(value))
#if ENABLED(DEBUG_EEPROM_READWRITE) #if ENABLED(DEBUG_EEPROM_READWRITE)
#define _FIELD_TEST(FIELD) \ #define _FIELD_TEST(FIELD) \
EEPROM_ASSERT( \ EEPROM_ASSERT( \
@@ -3682,6 +3687,45 @@ void MarlinSettings::reset() {
#endif #endif
} }
#ifdef POWER_OUTAGE_TEST
float last_position[4] = { 0.0,0.0,0.0,0.0 };
long last_sd_position[1] = { 0 };
void OutageSave()
{
char ver[4] = "000";
int j = 20;
EEPROM_WRITE_VAR(j,ver);
last_sd_position[0] = card.GetLastSDpos();
last_position[0] = current_position[E_AXIS];
last_position[1] = current_position[Z_AXIS];
last_position[2] = current_position[Y_AXIS];
last_position[3] = current_position[X_AXIS];
EEPROM_WRITE_VAR(j,last_sd_position[0]);
EEPROM_WRITE_VAR(j,last_position[0]); //E
EEPROM_WRITE_VAR(j,last_position[1]); //Z
EEPROM_WRITE_VAR(j,last_position[2]); //Y
EEPROM_WRITE_VAR(j,last_position[3]); //X
}
void OutageRead()
{
int i = 20;
char stored_ver[4];
char ver[4] = EEPROM_VERSION;
EEPROM_READ_VAR(i,stored_ver);
EEPROM_READ_VAR(i,last_sd_position[0]);
EEPROM_READ_VAR(i,last_position[0]); //E
EEPROM_READ_VAR(i,last_position[1]); //Z
EEPROM_READ_VAR(i,last_position[2]); //Y
EEPROM_READ_VAR(i,last_position[3]); //X
}
#endif
#endif // !DISABLE_M503 #endif // !DISABLE_M503
#pragma pack(pop) #pragma pack(pop)

View File

@@ -27,6 +27,15 @@
#include "../HAL/shared/eeprom_api.h" #include "../HAL/shared/eeprom_api.h"
#endif #endif
#ifdef POWER_OUTAGE_TEST
static bool RestartFlag = false;
void OutageSave();
void OutageRead();
extern float last_position[4];
extern long last_sd_position[1];
#endif
class MarlinSettings { class MarlinSettings {
public: public:
static uint16_t datasize(); static uint16_t datasize();

View File

@@ -90,6 +90,11 @@
#define FAN2_PIN TG_FAN2_PIN #define FAN2_PIN TG_FAN2_PIN
#define ORIG_E0_AUTO_FAN_PIN TG_FAN2_PIN // Used in Anycubic Kossel example config #define ORIG_E0_AUTO_FAN_PIN TG_FAN2_PIN // Used in Anycubic Kossel example config
#ifdef POWER_OUTAGE_TEST
#define OUTAGETEST_PIN 79
#define OUTAGECON_PIN 58
#endif
#include "pins_RAMPS.h" #include "pins_RAMPS.h"
// //

View File

@@ -34,6 +34,11 @@
#include "../gcode/queue.h" #include "../gcode/queue.h"
#include "../module/configuration_store.h" #include "../module/configuration_store.h"
#if defined(POWER_OUTAGE_TEST)
extern unsigned char PowerTestFlag;
extern char seekdataflag;
#endif
#if ENABLED(EMERGENCY_PARSER) #if ENABLED(EMERGENCY_PARSER)
#include "../feature/e_parser.h" #include "../feature/e_parser.h"
#endif #endif

View File

@@ -153,6 +153,7 @@ public:
static inline int16_t get() { sdpos = file.curPosition(); return (int16_t)file.read(); } static inline int16_t get() { sdpos = file.curPosition(); return (int16_t)file.read(); }
static inline int16_t read(void* buf, uint16_t nbyte) { return file.isOpen() ? file.read(buf, nbyte) : -1; } static inline int16_t read(void* buf, uint16_t nbyte) { return file.isOpen() ? file.read(buf, nbyte) : -1; }
static inline int16_t write(void* buf, uint16_t nbyte) { return file.isOpen() ? file.write(buf, nbyte) : -1; } static inline int16_t write(void* buf, uint16_t nbyte) { return file.isOpen() ? file.write(buf, nbyte) : -1; }
static inline long GetLastSDpos() { return sdpos; };
static Sd2Card& getSd2Card() { return sd2card; } static Sd2Card& getSd2Card() { return sd2card; }