Porting all files but ui.cpp

Porting all files but ui.cpp
Compilation is ok but no test done yet - need ui.cpp
pull/8/head
Luc 2014-11-25 20:14:19 +08:00
rodzic be7e334111
commit b0fc75d824
17 zmienionych plików z 1517 dodań i 614 usunięć

Wyświetl plik

@ -24,7 +24,9 @@
const int sensitive_pins[] PROGMEM = SENSITIVE_PINS; // Sensitive pin list for M42
int Commands::lowestRAMValue = MAX_RAM;
int Commands::lowestRAMValueSend = MAX_RAM;
uint8_t Commands::delay_flag_change=0;
uint8_t Commands::delay_flag_change2=0;
uint8_t Commands::countersensor=0;
void Commands::commandLoop()
{
while(true)
@ -74,11 +76,57 @@ void Commands::checkForPeriodicalActions(bool allowNewMoves)
writeMonitor();
counter250ms = 5;
}
#if defined(TOP_SENSOR_PIN)
if(EEPROM::btopsensor)
{
if(!READ(TOP_SENSOR_PIN))
{
countersensor++;
if (countersensor>25)
{
playsound(1000,140);
playsound(3000,240);
UI_STATUS_UPD(UI_TEXT_TOP_COVER_OPEN);
countersensor=0;
}
}
else countersensor=0;
}
#endif
if (Printer::isMenuMode(MENU_MODE_STOP_REQUESTED) && Printer::isMenuMode(MENU_MODE_STOP_DONE) )
{
if (delay_flag_change2>10)
{
Printer::setMenuMode(MENU_MODE_STOP_REQUESTED,false);
UI_STATUS_UPD(UI_TEXT_IDLE);
delay_flag_change2=0;
}
else delay_flag_change2++;
}
else delay_flag_change2=0;
if ( Printer::isMenuMode(MENU_MODE_GCODE_PROCESSING))
{
delay_flag_change=0;
Printer::setMenuMode(MENU_MODE_PRINTING,true);
}
if (!PrintLine::hasLines() && Printer::isMenuMode(MENU_MODE_PRINTING))
{
if (delay_flag_change>5)
{
Printer::setMenuMode(MENU_MODE_PRINTING,false);
UI_STATUS_UPD(UI_TEXT_IDLE);
delay_flag_change=0;
}
else delay_flag_change++;
}
else delay_flag_change=0;
// If called from queueDelta etc. it is an error to start a new move since it
// would invalidate old computation resulting in unpredicted behaviour.
// lcd controller can start new moves, so we disallow it if called from within
// a move command.
UI_SLOW(allowNewMoves);
//check if emergency stop button is pressed
if(uid.lastButtonAction==UI_ACTION_OK_NEXT_BACK)Commands::emergencyStop();
}
/** \brief Waits until movement cache is empty.
@ -596,6 +644,7 @@ void Commands::processGCode(GCode *com)
{
GCode::readFromSerial();
Commands::checkForPeriodicalActions(true);
if (Printer::isMenuMode(MENU_MODE_STOP_REQUESTED))break;
}
break;
case 20: // G20 Units to inches
@ -617,20 +666,48 @@ void Commands::processGCode(GCode *com)
#if FEATURE_Z_PROBE
case 29: // G29 3 points, build average
{
float zMin_save=Printer::zMin ;
if(!Printer::isHomed()) Printer::homeAxis(true,true,true);
//to avoid hit on plates low, down bed a little
if (Printer::currentPosition[Z_AXIS] < Printer::zMin+5) Printer::moveToReal(IGNORE_COORDINATE,IGNORE_COORDINATE,Printer::zMin+5,IGNORE_COORDINATE,Printer::homingFeedrate[Z_AXIS]);
GCode::executeFString(Com::tZProbeStartScript);
bool oldAutolevel = Printer::isAutolevelActive();
Printer::setAutolevelActive(false);
float sum = 0,last,oldFeedrate = Printer::feedrate;
Printer::moveTo(EEPROM::zProbeX1(),EEPROM::zProbeY1(),IGNORE_COORDINATE,IGNORE_COORDINATE,EEPROM::zProbeXYSpeed());
sum = Printer::runZProbe(true,false,Z_PROBE_REPETITIONS,false);
if(sum<0) break;
if(sum<0)
{
Printer::zMin = zMin_save;
Printer::setAutolevelActive(true);
if (Printer::realZPosition()<-200)Printer::homeAxis(false,false,true);
//to avoid hit on plates, low down bed a little
Printer::moveToReal(IGNORE_COORDINATE,IGNORE_COORDINATE,Printer::zMin+5,IGNORE_COORDINATE,Printer::homingFeedrate[Z_AXIS]);
break;
}
Printer::moveTo(EEPROM::zProbeX2(),EEPROM::zProbeY2(),IGNORE_COORDINATE,IGNORE_COORDINATE,EEPROM::zProbeXYSpeed());
last = Printer::runZProbe(false,false);
if(last<0) break;
if(last<0)
{
Printer::zMin = zMin_save;
Printer::setAutolevelActive(true);
if (Printer::realZPosition()<-200)Printer::homeAxis(false,false,true);
//to avoid hit on plates, low down bed a little
Printer::moveToReal(IGNORE_COORDINATE,IGNORE_COORDINATE,Printer::zMin+5,IGNORE_COORDINATE,Printer::homingFeedrate[Z_AXIS]);
break;
}
sum+= last;
Printer::moveTo(EEPROM::zProbeX3(),EEPROM::zProbeY3(),IGNORE_COORDINATE,IGNORE_COORDINATE,EEPROM::zProbeXYSpeed());
last = Printer::runZProbe(false,true);
if(last<0) break;
if(last<0)
{
Printer::zMin = zMin_save;
Printer::setAutolevelActive(true);
if (Printer::realZPosition()<-200)Printer::homeAxis(false,false,true);
//to avoid hit on plates, low down bed a little
Printer::moveToReal(IGNORE_COORDINATE,IGNORE_COORDINATE,Printer::zMin+5,IGNORE_COORDINATE,Printer::homingFeedrate[Z_AXIS]);
break;
}
sum+= last;
sum *= 0.33333333333333;
Com::printFLN(Com::tZProbeAverage,sum);
@ -665,11 +742,18 @@ void Commands::processGCode(GCode *com)
{
uint8_t p = (com->hasP() ? (uint8_t)com->P : 3);
bool oldAutolevel = Printer::isAutolevelActive();
if(!Printer::isHomed()) Printer::homeAxis(true,true,true);
//to avoid hit on plates, low down bed a little
if (Printer::currentPosition[Z_AXIS] < Printer::zMin+5) Printer::moveToReal(IGNORE_COORDINATE,IGNORE_COORDINATE,Printer::zMin+5,IGNORE_COORDINATE,Printer::homingFeedrate[Z_AXIS]);
Printer::setAutolevelActive(false);
Printer::runZProbe(p & 1,p & 2);
Printer::setAutolevelActive(oldAutolevel);
Printer::updateCurrentPosition(p & 1);
printCurrentPosition(PSTR("G30 "));
if (Printer::realZPosition()<-200)Printer::homeAxis(false,false,true);
//to avoid hit on plates
Printer::moveToReal(IGNORE_COORDINATE,IGNORE_COORDINATE,Printer::zMin+5,IGNORE_COORDINATE,Printer::homingFeedrate[Z_AXIS]);
}
break;
case 31: // G31 display hall sensor output
@ -680,6 +764,10 @@ void Commands::processGCode(GCode *com)
#if FEATURE_AUTOLEVEL
case 32: // G32 Auto-Bed leveling
{
float zMin_save=Printer::zMin;
if(!Printer::isHomed()) Printer::homeAxis(true,true,true);
//to avoid hit on plates, low down bed a little
if (Printer::currentPosition[Z_AXIS] < Printer::zMin+5) Printer::moveToReal(IGNORE_COORDINATE,IGNORE_COORDINATE,Printer::zMin+5,IGNORE_COORDINATE,Printer::homingFeedrate[Z_AXIS]);
GCode::executeFString(Com::tZProbeStartScript);
//bool iterate = com->hasP() && com->P>0;
Printer::coordinateOffset[X_AXIS] = Printer::coordinateOffset[Y_AXIS] = Printer::coordinateOffset[Z_AXIS] = 0;
@ -687,13 +775,37 @@ void Commands::processGCode(GCode *com)
float h1,h2,h3,hc,oldFeedrate = Printer::feedrate;
Printer::moveTo(EEPROM::zProbeX1(),EEPROM::zProbeY1(),IGNORE_COORDINATE,IGNORE_COORDINATE,EEPROM::zProbeXYSpeed());
h1 = Printer::runZProbe(true,false,Z_PROBE_REPETITIONS,false);
if(h1 < 0) break;
if(h1<0)
{
Printer::zMin = zMin_save;
Printer::setAutolevelActive(true);
if (Printer::realZPosition()<-200)Printer::homeAxis(false,false,true);
//to avoid hit on plates, low down bed a little
Printer::moveToReal(IGNORE_COORDINATE,IGNORE_COORDINATE,Printer::zMin+5,IGNORE_COORDINATE,Printer::homingFeedrate[Z_AXIS]);
break;
}
Printer::moveTo(EEPROM::zProbeX2(),EEPROM::zProbeY2(),IGNORE_COORDINATE,IGNORE_COORDINATE,EEPROM::zProbeXYSpeed());
h2 = Printer::runZProbe(false,false);
if(h2 < 0) break;
if(h2<0)
{
Printer::zMin = zMin_save;
Printer::setAutolevelActive(true);
if (Printer::realZPosition()<-200)Printer::homeAxis(false,false,true);
//to avoid hit on plates, low down bed a little
Printer::moveToReal(IGNORE_COORDINATE,IGNORE_COORDINATE,Printer::zMin+5,IGNORE_COORDINATE,Printer::homingFeedrate[Z_AXIS]);
break;
}
Printer::moveTo(EEPROM::zProbeX3(),EEPROM::zProbeY3(),IGNORE_COORDINATE,IGNORE_COORDINATE,EEPROM::zProbeXYSpeed());
h3 = Printer::runZProbe(false,true);
if(h3 < 0) break;
if(h3<0)
{
Printer::zMin = zMin_save;
Printer::setAutolevelActive(true);
if (Printer::realZPosition()<-200)Printer::homeAxis(false,false,true);
//to avoid hit on plates, low down bed a little
Printer::moveToReal(IGNORE_COORDINATE,IGNORE_COORDINATE,Printer::zMin+5,IGNORE_COORDINATE,Printer::homingFeedrate[Z_AXIS]);
break;
}
Printer::buildTransformationMatrix(h1,h2,h3);
//-(Rxx*Ryz*y-Rxz*Ryx*y+(Rxz*Ryy-Rxy*Ryz)*x)/(Rxy*Ryx-Rxx*Ryy)
// z = z-deviation from origin due to bed transformation
@ -1126,7 +1238,23 @@ void Commands::processMCode(GCode *com)
Printer::enableZStepper();
}
break;
#if ENABLE_CLEAN_NOZZLE
case 100:
Printer::cleanNozzle();
break;
#endif
#if CASE_LIGHTS_PIN>=0
case 101://light on
#if UI_AUTOLIGHTOFF_AFTER!=0
UIDisplay::ui_autolightoff_time=HAL::timeInMilliseconds()+EEPROM::timepowersaving;
#endif
WRITE(CASE_LIGHTS_PIN,1);
break;
case 102://light off
WRITE(CASE_LIGHTS_PIN,0);
break;
#endif // CASE_LIGHTS_PIN
case 104: // M104 temperature
#if NUM_EXTRUDER > 0
if(reportTempsensorError()) break;
@ -1186,6 +1314,7 @@ void Commands::processMCode(GCode *com)
printedTime = currentTime;
}
Commands::checkForPeriodicalActions(true);
if (Printer::isMenuMode(MENU_MODE_STOP_REQUESTED))break;
//gcode_read_serial();
#if RETRACT_DURING_HEATUP
if (actExtruder == Extruder::current && actExtruder->waitRetractUnits > 0 && !retracted && dirRising && actExtruder->tempControl.currentTemperatureC > actExtruder->waitRetractTemperature)
@ -1236,6 +1365,7 @@ void Commands::processMCode(GCode *com)
codenum = previousMillisCmd = HAL::timeInMilliseconds();
}
Commands::checkForPeriodicalActions(true);
if (Printer::isMenuMode(MENU_MODE_STOP_REQUESTED))break;
}
#endif
#endif
@ -1256,6 +1386,7 @@ void Commands::processMCode(GCode *com)
codenum = HAL::timeInMilliseconds();
}
Commands::checkForPeriodicalActions(true);
if (Printer::isMenuMode(MENU_MODE_STOP_REQUESTED))break;
for(uint8_t h = 0; h < NUM_TEMPERATURE_LOOPS; h++)
{
TemperatureController *act = tempController[h];
@ -1505,7 +1636,7 @@ void Commands::processMCode(GCode *com)
Com::printInfoFLN(PSTR("Watchdog feature was not compiled into this version!"));
#endif
break;
#if defined(BEEPER_PIN) && BEEPER_PIN>=0
#if defined(BEEPER_PIN) && BEEPER_PIN>=0 && FEATURE_BEEPER
case 300: // M300
{
int beepS = 1;
@ -1711,6 +1842,27 @@ void Commands::executeGCode(GCode *com)
}
}
}
//periodical command from repetier should not be taken in account for wake up
if(!((com->hasM() && com->M ==105) || Printer::isMenuMode(MENU_MODE_SD_PRINTING))) // Process M Code
{
Printer::setMenuMode(MENU_MODE_GCODE_PROCESSING,true);
Printer::setMenuMode(MENU_MODE_PRINTING,true);
#if UI_AUTOLIGHTOFF_AFTER!=0
if (EEPROM::timepowersaving>0 && EEPROM::bkeeplighton )
{
UIDisplay::ui_autolightoff_time=HAL::timeInMilliseconds()+EEPROM::timepowersaving;
#if CASE_LIGHTS_PIN > 0
if (!(READ(CASE_LIGHTS_PIN)) && EEPROM::buselight)
{
TOGGLE(CASE_LIGHTS_PIN);
}
#endif
#if defined(UI_BACKLIGHT_PIN)
if (!(READ(UI_BACKLIGHT_PIN))) WRITE(UI_BACKLIGHT_PIN, HIGH);
#endif
}
#endif
}
if(com->hasG()) processGCode(com);
else if(com->hasM()) processMCode(com);
else if(com->hasT()) // Process T code
@ -1726,6 +1878,33 @@ void Commands::executeGCode(GCode *com)
com->printCommand();
}
}
//if some extruder command and we are not in pause - check filament sensor
if (com->hasE() && !Printer:: isMenuMode(MENU_MODE_SD_PAUSED))
{
if ((Extruder::current->id)==0)//check correct extruder sensor
{
#if defined(FIL_SENSOR1_PIN)
if(EEPROM::busesensor && READ(FIL_SENSOR1_PIN))uid.executeAction(UI_ACTION_NO_FILAMENT,true);
#endif
}
else
{
#if defined(FIL_SENSOR2_PIN)
if(EEPROM::busesensor &&READ(FIL_SENSOR2_PIN))uid.executeAction(UI_ACTION_NO_FILAMENT,true);
#endif
}
}
//periodical command from repetier should not be taken in account for wake up
if(!((com->hasM() && com->M ==105) || Printer::isMenuMode(MENU_MODE_SD_PRINTING))) // Process M Code
{
#if UI_AUTOLIGHTOFF_AFTER!=0
if (EEPROM::timepowersaving>0 && EEPROM::bkeeplighton )
{//reset timer if any wait command was processing
UIDisplay::ui_autolightoff_time=HAL::timeInMilliseconds()+EEPROM::timepowersaving;
}
#endif
}
Printer::setMenuMode(MENU_MODE_GCODE_PROCESSING,false);
}
void Commands::emergencyStop()

Wyświetl plik

@ -27,6 +27,9 @@
class Commands
{
public:
static uint8_t delay_flag_change;
static uint8_t delay_flag_change2;
static uint8_t countersensor;
static void commandLoop();
static void checkForPeriodicalActions(bool allowNewMoves);
static void processArc(GCode *com);

Wyświetl plik

@ -126,7 +126,7 @@ is a full cartesian system where x, y and z moves are handled by separate motors
Cases 1, 2, 8 and 9 cover all needed xy and xz H gantry systems. If you get results mirrored etc. you can swap motor connections for x and y.
If a motor turns in the wrong direction change INVERT_X_DIR or INVERT_Y_DIR.
*/
#define DRIVE_SYSTEM 0
#define DRIVE_SYSTEM CARTESIAN
// ##########################################################################################
// ## Calibration ##

Wyświetl plik

@ -22,8 +22,35 @@
*/
#include "Repetier.h"
//internal usage of update value
void EEPROM:: update(long P,uint8_t T,long S,float X)
{
#if EEPROM_MODE!=0
if(T>=0 &&T<=3 && P>0 && P<=2048) //SDEEPROM_SIZE =2048 // Minimum size used by Eeprom.cpp
switch(T)
{
case EPR_TYPE_BYTE:
HAL::eprSetByte(P,(uint8_t)S);
break;
case EPR_TYPE_INT:
HAL::eprSetInt16(P,(int)S);
break;
case EPR_TYPE_LONG:
HAL::eprSetInt32(P,(int32_t)S);
break;
case EPR_TYPE_FLOAT:
HAL::eprSetFloat(P,X);
break;
}
uint8_t newcheck = computeChecksum();
if(newcheck != HAL::eprGetByte(EPR_INTEGRITY_BYTE))
HAL::eprSetByte(EPR_INTEGRITY_BYTE,newcheck);
readDataFromEEPROM();
Extruder::selectExtruderById(Extruder::current->id);
#else
Com::printErrorF(Com::tNoEEPROMSupport);
#endif
}
void EEPROM::update(GCode *com)
{
#if EEPROM_MODE != 0
@ -57,6 +84,19 @@ void EEPROM::restoreEEPROMSettingsFromConfiguration()
#if EEPROM_MODE != 0
baudrate = BAUDRATE;
maxInactiveTime = MAX_INACTIVE_TIME*1000L;
EEPROM::buselight = bool(CASE_LIGHT_DEFAULT_ON);
EEPROM::bkeeplighton = bool(CASE_KEEP_LIGHT_DEFAULT_ON);
UIDisplay::display_mode=CASE_DISPLAY_MODE_DEFAULT;
HAL::enablesound = bool(CASE_SOUND_DEFAULT_ON);
EEPROM::busesensor = bool(CASE_FILAMENT_SENSOR_DEFAULT_ON);
EEPROM::btopsensor = bool(CASE_TOP_SENSOR_DEFAULT_ON);
EEPROM::ftemp_ext_pla=UI_SET_PRESET_EXTRUDER_TEMP_PLA;
EEPROM::ftemp_ext_abs=UI_SET_PRESET_EXTRUDER_TEMP_ABS;
EEPROM::ftemp_bed_pla=UI_SET_PRESET_HEATED_BED_TEMP_PLA;
EEPROM::ftemp_bed_abs=UI_SET_PRESET_HEATED_BED_TEMP_ABS;
#if CASE_LIGHTS_PIN>=0
WRITE(CASE_LIGHTS_PIN, byte(EEPROM::buselight));
#endif // CASE_LIGHTS_PIN
stepperInactiveTime = STEPPER_INACTIVE_TIME*1000L;
Printer::axisStepsPerMM[X_AXIS] = XAXIS_STEPS_PER_MM;
Printer::axisStepsPerMM[Y_AXIS] = YAXIS_STEPS_PER_MM;
@ -301,6 +341,21 @@ void EEPROM::restoreEEPROMSettingsFromConfiguration()
}
bool EEPROM::buselight=false;
bool EEPROM::busesensor=false;
bool EEPROM::btopsensor=false;
bool EEPROM::bkeeplighton=true;
float EEPROM::ftemp_ext_pla=UI_SET_PRESET_EXTRUDER_TEMP_PLA;
float EEPROM::ftemp_ext_abs=UI_SET_PRESET_EXTRUDER_TEMP_ABS;
float EEPROM::ftemp_bed_pla=UI_SET_PRESET_HEATED_BED_TEMP_PLA;
float EEPROM::ftemp_bed_abs=UI_SET_PRESET_HEATED_BED_TEMP_ABS;
#if UI_AUTOLIGHTOFF_AFTER !=0
millis_t EEPROM::timepowersaving=1000 * 60 * 30; //30 min
#else
millis_t EEPROM::timepowersaving=0;
#endif
void EEPROM::storeDataIntoEEPROM(uint8_t corrupted)
{
#if EEPROM_MODE != 0
@ -356,9 +411,38 @@ void EEPROM::storeDataIntoEEPROM(uint8_t corrupted)
HAL::eprSetFloat(EPR_X_LENGTH,Printer::xLength);
HAL::eprSetFloat(EPR_Y_LENGTH,Printer::yLength);
HAL::eprSetFloat(EPR_Z_LENGTH,Printer::zLength);
#if NONLINEAR_SYSTEM
HAL::eprSetFloat(EPR_DELTA_HORIZONTAL_RADIUS, Printer::radius0);
#endif
HAL::eprSetByte(EPR_LIGHT_ON,EEPROM::buselight);
HAL::eprSetByte(EPR_KEEP_LIGHT_ON,EEPROM::bkeeplighton);
HAL::eprSetByte(EPR_DISPLAY_MODE,UIDisplay::display_mode);
#if defined(FIL_SENSOR1_PIN)
HAL::eprSetByte(EPR_FIL_SENSOR_ON,EEPROM::busesensor);
#endif
#if defined(TOP_SENSOR_PIN)
HAL::eprSetByte(EPR_TOP_SENSOR_ON,EEPROM::btopsensor);
#endif
#if FEATURE_BEEPER
HAL::eprSetByte(EPR_SOUND_ON,HAL::enablesound);
#endif
#if UI_AUTOLIGHTOFF_AFTER !=0
HAL::eprSetInt32(EPR_POWERSAVE_AFTER_TIME,EEPROM::timepowersaving);
#endif
HAL::eprSetFloat(EPR_MANUAL_LEVEL_X1, MANUAL_LEVEL_X1);
HAL::eprSetFloat(EPR_MANUAL_LEVEL_Y1, MANUAL_LEVEL_Y1);
HAL::eprSetFloat(EPR_MANUAL_LEVEL_X2, MANUAL_LEVEL_X2);
HAL::eprSetFloat(EPR_MANUAL_LEVEL_Y2, MANUAL_LEVEL_Y2);
HAL::eprSetFloat(EPR_MANUAL_LEVEL_X3, MANUAL_LEVEL_X3);
HAL::eprSetFloat(EPR_MANUAL_LEVEL_Y3, MANUAL_LEVEL_Y3);
HAL::eprSetFloat(EPR_MANUAL_LEVEL_X4, MANUAL_LEVEL_X4);
HAL::eprSetFloat(EPR_MANUAL_LEVEL_Y4, MANUAL_LEVEL_Y4);
HAL::eprSetFloat(EPR_TEMP_BED_PLA, EEPROM::ftemp_bed_pla);
HAL::eprSetFloat(EPR_TEMP_BED_ABS, EEPROM::ftemp_bed_abs);
HAL::eprSetFloat(EPR_TEMP_EXT_PLA, EEPROM::ftemp_ext_pla);
HAL::eprSetFloat(EPR_TEMP_EXT_ABS, EEPROM::ftemp_ext_abs);
#if ENABLE_BACKLASH_COMPENSATION
HAL::eprSetFloat(EPR_BACKLASH_X,Printer::backlashX);
HAL::eprSetFloat(EPR_BACKLASH_Y,Printer::backlashY);
@ -445,6 +529,18 @@ void EEPROM::initalizeUncached()
HAL::eprSetFloat(EPR_Z_PROBE_Y2,Z_PROBE_Y2);
HAL::eprSetFloat(EPR_Z_PROBE_X3,Z_PROBE_X3);
HAL::eprSetFloat(EPR_Z_PROBE_Y3,Z_PROBE_Y3);
HAL::eprSetFloat(EPR_MANUAL_LEVEL_X1, MANUAL_LEVEL_X1);
HAL::eprSetFloat(EPR_MANUAL_LEVEL_Y1, MANUAL_LEVEL_Y1);
HAL::eprSetFloat(EPR_MANUAL_LEVEL_X2, MANUAL_LEVEL_X2);
HAL::eprSetFloat(EPR_MANUAL_LEVEL_Y2, MANUAL_LEVEL_Y2);
HAL::eprSetFloat(EPR_MANUAL_LEVEL_X3, MANUAL_LEVEL_X3);
HAL::eprSetFloat(EPR_MANUAL_LEVEL_Y3, MANUAL_LEVEL_Y3);
HAL::eprSetFloat(EPR_MANUAL_LEVEL_X4, MANUAL_LEVEL_X4);
HAL::eprSetFloat(EPR_MANUAL_LEVEL_Y4, MANUAL_LEVEL_Y4);
HAL::eprSetFloat(EPR_TEMP_BED_PLA, EEPROM::ftemp_bed_pla);
HAL::eprSetFloat(EPR_TEMP_BED_ABS, EEPROM::ftemp_bed_abs);
HAL::eprSetFloat(EPR_TEMP_EXT_PLA, EEPROM::ftemp_ext_pla);
HAL::eprSetFloat(EPR_TEMP_EXT_ABS, EEPROM::ftemp_ext_abs);
HAL::eprSetFloat(EPR_AXISCOMP_TANXY,AXISCOMP_TANXY);
HAL::eprSetFloat(EPR_AXISCOMP_TANYZ,AXISCOMP_TANYZ);
HAL::eprSetFloat(EPR_AXISCOMP_TANXZ,AXISCOMP_TANXZ);
@ -522,6 +618,32 @@ void EEPROM::readDataFromEEPROM()
#if NONLINEAR_SYSTEM
Printer::radius0 = HAL::eprGetFloat(EPR_DELTA_HORIZONTAL_RADIUS);
#endif
EEPROM::buselight=HAL::eprGetByte(EPR_LIGHT_ON);
EEPROM::bkeeplighton=HAL::eprGetByte(EPR_KEEP_LIGHT_ON);
UIDisplay::display_mode=HAL::eprGetByte(EPR_DISPLAY_MODE);
//need to be sure a valid value is set
if(!((UIDisplay::display_mode==ADVANCED_MODE)||(UIDisplay::display_mode==EASY_MODE)))UIDisplay::display_mode=ADVANCED_MODE;
#if CASE_LIGHTS_PIN>=0
WRITE(CASE_LIGHTS_PIN, byte(EEPROM::buselight));
#endif // CASE_LIGHTS_PIN
#if defined(FIL_SENSOR1_PIN)
EEPROM::busesensor=HAL::eprGetByte(EPR_FIL_SENSOR_ON);
#endif
#if defined(TOP_SENSOR_PIN)
EEPROM::btopsensor=HAL::eprGetByte(EPR_TOP_SENSOR_ON);
#endif
#if FEATURE_BEEPER
HAL::enablesound=HAL::eprGetByte(EPR_SOUND_ON);
#endif
#if UI_AUTOLIGHTOFF_AFTER >0
EEPROM::timepowersaving = HAL::eprGetInt32(EPR_POWERSAVE_AFTER_TIME);
//new value do reset time
UIDisplay::ui_autolightoff_time=HAL::timeInMilliseconds()+EEPROM::timepowersaving;
#endif
EEPROM::ftemp_ext_pla= HAL::eprGetFloat(EPR_TEMP_EXT_PLA);
EEPROM::ftemp_ext_abs= HAL::eprGetFloat(EPR_TEMP_EXT_ABS);
EEPROM::ftemp_bed_pla= HAL::eprGetFloat(EPR_TEMP_BED_PLA);
EEPROM::ftemp_bed_abs= HAL::eprGetFloat(EPR_TEMP_BED_ABS);
#if ENABLE_BACKLASH_COMPENSATION
Printer::backlashX = HAL::eprGetFloat(EPR_BACKLASH_X);
Printer::backlashY = HAL::eprGetFloat(EPR_BACKLASH_Y);
@ -608,6 +730,14 @@ void EEPROM::readDataFromEEPROM()
HAL::eprSetFloat(EPR_Z_PROBE_Y2,Z_PROBE_Y2);
HAL::eprSetFloat(EPR_Z_PROBE_X3,Z_PROBE_X3);
HAL::eprSetFloat(EPR_Z_PROBE_Y3,Z_PROBE_Y3);
HAL::eprSetFloat(EPR_MANUAL_LEVEL_X1, MANUAL_LEVEL_X1);
HAL::eprSetFloat(EPR_MANUAL_LEVEL_Y1, MANUAL_LEVEL_Y1);
HAL::eprSetFloat(EPR_MANUAL_LEVEL_X2, MANUAL_LEVEL_X2);
HAL::eprSetFloat(EPR_MANUAL_LEVEL_Y2, MANUAL_LEVEL_Y2);
HAL::eprSetFloat(EPR_MANUAL_LEVEL_X3, MANUAL_LEVEL_X3);
HAL::eprSetFloat(EPR_MANUAL_LEVEL_Y3, MANUAL_LEVEL_Y3);
HAL::eprSetFloat(EPR_MANUAL_LEVEL_X4, MANUAL_LEVEL_X4);
HAL::eprSetFloat(EPR_MANUAL_LEVEL_Y4, MANUAL_LEVEL_Y4);
}
if(version<4)
{
@ -788,6 +918,25 @@ void EEPROM::writeSettings()
writeFloat(EPR_X_LENGTH,Com::tEPRXMaxLength);
writeFloat(EPR_Y_LENGTH,Com::tEPRYMaxLength);
writeFloat(EPR_Z_LENGTH,Com::tEPRZMaxLength);
writeByte(EPR_LIGHT_ON,Com::tLightOn);
writeByte(EPR_KEEP_LIGHT_ON,Com::tKeepLightOn);
#if defined(FIL_SENSOR1_PIN)
writeByte(EPR_FIL_SENSOR_ON,Com::tSensorOn);
#endif
#if defined(TOP_SENSOR_PIN)
writeByte(EPR_TOP_SENSOR_ON,Com::tTopsensorOn);
#endif
#if FEATURE_BEEPER
writeByte(EPR_SOUND_ON,Com::tSoundOn);
#endif
#if UI_AUTOLIGHTOFF_AFTER !=0
writeLong(EPR_POWERSAVE_AFTER_TIME,Com::tPowerSave);
#endif
writeFloat(EPR_TEMP_EXT_PLA,Com::tTempExtPLA);
writeFloat(EPR_TEMP_EXT_ABS,Com::tTempExtABS);
writeFloat(EPR_TEMP_BED_PLA,Com::tTempBedPLA);
writeFloat(EPR_TEMP_BED_ABS,Com::tTempBedABS);
writeByte(EPR_DISPLAY_MODE,Com::tDisplayMode);
#if ENABLE_BACKLASH_COMPENSATION
writeFloat(EPR_BACKLASH_X,Com::tEPRXBacklash);
writeFloat(EPR_BACKLASH_Y,Com::tEPRYBacklash);
@ -830,6 +979,14 @@ void EEPROM::writeSettings()
writeFloat(EPR_Z_MAX_TRAVEL_ACCEL,Com::tEPRZTravelAcceleration);
#endif
#endif
writeFloat(EPR_MANUAL_LEVEL_X1, Com::tManualProbeX1);
writeFloat(EPR_MANUAL_LEVEL_Y1, Com::tManualProbeY1);
writeFloat(EPR_MANUAL_LEVEL_X2, Com::tManualProbeX2);
writeFloat(EPR_MANUAL_LEVEL_Y2, Com::tManualProbeY2);
writeFloat(EPR_MANUAL_LEVEL_X3, Com::tManualProbeX3);
writeFloat(EPR_MANUAL_LEVEL_Y3, Com::tManualProbeY3);
writeFloat(EPR_MANUAL_LEVEL_X4, Com::tManualProbeX4);
writeFloat(EPR_MANUAL_LEVEL_Y4, Com::tManualProbeY4);
#if FEATURE_Z_PROBE
writeFloat(EPR_Z_PROBE_HEIGHT,Com::tZProbeHeight);
writeFloat(EPR_Z_PROBE_BED_DISTANCE,Com::tZProbeBedDitance);

Wyświetl plik

@ -105,12 +105,31 @@ have problems with other modules using the eeprom */
#define EPR_DELTA_DIAGONAL_CORRECTION_A 933
#define EPR_DELTA_DIAGONAL_CORRECTION_B 937
#define EPR_DELTA_DIAGONAL_CORRECTION_C 941
#define EPR_TOUCHSCREEN 946 // - 975 = 30 byte for touchscreen calibration data
#define EPR_LIGHT_ON 946
#define EPR_SOUND_ON 947
#define EPR_POWERSAVE_AFTER_TIME 948
#define EPR_DISPLAY_MODE 952
#define EPR_FIL_SENSOR_ON 953
#define EPR_KEEP_LIGHT_ON 954
#define EPR_MANUAL_LEVEL_X1 955
#define EPR_MANUAL_LEVEL_Y1 959
#define EPR_MANUAL_LEVEL_X2 963
#define EPR_MANUAL_LEVEL_Y2 971
#define EPR_MANUAL_LEVEL_X3 975
#define EPR_MANUAL_LEVEL_Y3 979
#define EPR_MANUAL_LEVEL_X4 983
#define EPR_MANUAL_LEVEL_Y4 987
#define EPR_TEMP_EXT_PLA 991
#define EPR_TEMP_EXT_ABS 995
#define EPR_TEMP_BED_PLA 999
#define EPR_TEMP_BED_ABS 1003
#define EPR_TOP_SENSOR_ON 1007
#define EPR_TOUCHSCREEN 1008 // - 1027 = 30 byte for touchscreen calibration data
// Axis compensation
#define EPR_AXISCOMP_TANXY 976
#define EPR_AXISCOMP_TANYZ 980
#define EPR_AXISCOMP_TANXZ 984
#define EPR_AXISCOMP_TANXY 1028
#define EPR_AXISCOMP_TANYZ 1032
#define EPR_AXISCOMP_TANXZ 1036
#if EEPROM_MODE != 0
#define EEPROM_FLOAT(x) HAL::eprGetFloat(EPR_##x)
@ -150,6 +169,12 @@ have problems with other modules using the eeprom */
#define Z_PROBE_BED_DISTANCE 10.0
#endif
#define EPR_TYPE_BYTE 0
#define EPR_TYPE_INT 1
#define EPR_TYPE_LONG 2
#define EPR_TYPE_FLOAT 3
class EEPROM
{
#if EEPROM_MODE != 0
@ -166,11 +191,21 @@ public:
static void init();
static void initBaudrate();
static bool buselight;
static bool busesensor;
static bool btopsensor;
static bool bkeeplighton;
static float ftemp_ext_pla;
static float ftemp_ext_abs;
static float ftemp_bed_pla;
static float ftemp_bed_abs;
static millis_t timepowersaving;
static void storeDataIntoEEPROM(uint8_t corrupted=0);
static void readDataFromEEPROM();
static void restoreEEPROMSettingsFromConfiguration();
static void writeSettings();
static void update(GCode *com);
static void update(long P,uint8_t T,long S,float X);
static void updatePrinterUsage();
static inline float zProbeSpeed() {
@ -257,6 +292,69 @@ public:
return Z_PROBE_BED_DISTANCE;
#endif
}
static inline float ManualProbeX1() {
#if EEPROM_MODE!=0
return HAL::eprGetFloat(EPR_MANUAL_LEVEL_X1);
#else
return MANUAL_LEVEL_X1;
#endif
}
static inline float ManualProbeY1() {
#if EEPROM_MODE!=0
return HAL::eprGetFloat(EPR_MANUAL_LEVEL_Y1);
#else
return MANUAL_LEVEL_Y1;
#endif
}
static inline float ManualProbeX2() {
#if EEPROM_MODE!=0
return HAL::eprGetFloat(EPR_MANUAL_LEVEL_X2);
#else
return MANUAL_LEVEL_X2;
#endif
}
static inline float ManualProbeY2() {
#if EEPROM_MODE!=0
return HAL::eprGetFloat(EPR_MANUAL_LEVEL_Y2);
#else
return MANUAL_LEVEL_Y2;
#endif
}
static inline float ManualProbeX3() {
#if EEPROM_MODE!=0
return HAL::eprGetFloat(EPR_MANUAL_LEVEL_X3);
#else
return MANUAL_LEVEL_X3;
#endif
}
static inline float ManualProbeY3() {
#if EEPROM_MODE!=0
return HAL::eprGetFloat(EPR_MANUAL_LEVEL_Y3);
#else
return MANUAL_LEVEL_Y3;
#endif
}
static inline float ManualProbeX4() {
#if EEPROM_MODE!=0
return HAL::eprGetFloat(EPR_MANUAL_LEVEL_X4);
#else
return MANUAL_LEVEL_X4;
#endif
}
static inline float ManualProbeY4() {
#if EEPROM_MODE!=0
return HAL::eprGetFloat(EPR_MANUAL_LEVEL_Y4);
#else
return MANUAL_LEVEL_Y4;
#endif
}
static inline float axisCompTanXY() {
#if EEPROM_MODE != 0

Wyświetl plik

@ -67,6 +67,10 @@ short temptable_generic3[GENERIC_THERM_NUM_ENTRIES][2];
Is called every 100ms.
*/
static uint8_t extruderTempErrors = 0;
#if WARMUP_BED_ON_INIT
static bool warmbed = false;
static int warmbed_try = 0;
#endif
void Extruder::manageTemperatures()
{
@ -103,7 +107,33 @@ void Extruder::manageTemperatures()
else
extruder[controller].coolerPWM = extruder[controller].coolerSpeed;
}
#if WARMUP_BED_ON_INIT
if ( controller==NUM_TEMPERATURE_LOOPS-1 && !warmbed) //this is bed and no warm up has been done
{
if (heatedBedController.currentTemperatureC < MIN_DEFECT_TEMPERATURE) //we are low
{
if (warmbed_try>100) //10x100ms
{
warmbed=true; //do not try anymore
Extruder::setHeatedBedTemperature(0);//cut heat
}
else
{
warmbed_try++; //new try
Extruder::setHeatedBedTemperature(40); //heat bed until 40 degres
//raise heating tick
playsound(100,10);
UI_STATUS_UPD("PreHeat Bed");
}
}
else
{ //no issue so stop / cancel preheat
warmbed=true; //do not try anymore
Extruder::setHeatedBedTemperature(0);//cut heat
}
}
else
#endif
// Check for obvious sensor errors
if(!Printer::isAnyTempsensorDefect() && (act->currentTemperatureC < MIN_DEFECT_TEMPERATURE || act->currentTemperatureC > MAX_DEFECT_TEMPERATURE)) // no temp sensor or short in sensor, disable heater
{
@ -401,7 +431,7 @@ void TemperatureController::updateTempControlVars()
This function changes and initalizes a new extruder. This is also called, after the eeprom values are changed.
*/
void Extruder::selectExtruderById(uint8_t extruderId)
void Extruder::selectExtruderById(uint8_t extruderId, bool changepos)
{
#if MIXING_EXTRUDER
if(extruderId >= VIRTUAL_EXTRUDER)
@ -458,7 +488,7 @@ void Extruder::selectExtruderById(uint8_t extruderId)
float oldfeedrate = Printer::feedrate;
Printer::offsetX = -Extruder::current->xOffset * Printer::invAxisStepsPerMM[X_AXIS];
Printer::offsetY = -Extruder::current->yOffset * Printer::invAxisStepsPerMM[Y_AXIS];
if(Printer::isHomed())
if(Printer::isHomed() && changepos)
Printer::moveToReal(cx, cy, cz, IGNORE_COORDINATE, Printer::homingFeedrate[X_AXIS]);
Printer::feedrate = oldfeedrate;
Printer::updateCurrentPosition();
@ -484,6 +514,8 @@ void Extruder::setTemperatureForExtruder(float temperatureInCelsius,uint8_t extr
if(temperatureInCelsius > MAXTEMP) temperatureInCelsius = MAXTEMP;
#endif
if(temperatureInCelsius < 0) temperatureInCelsius = 0;
//cannot heat during timer but can cooldown
if ((temperatureInCelsius > 0) && (Extruder::disableheat_time >HAL::timeInMilliseconds() )) return;
TemperatureController *tc = tempController[extr];
if(tc->sensorType == 0) temperatureInCelsius = 0;
//if(temperatureInCelsius==tc->targetTemperatureC) return;
@ -533,6 +565,8 @@ void Extruder::setHeatedBedTemperature(float temperatureInCelsius,bool beep)
#if HAVE_HEATED_BED
if(temperatureInCelsius>HEATED_BED_MAX_TEMP) temperatureInCelsius = HEATED_BED_MAX_TEMP;
if(temperatureInCelsius<0) temperatureInCelsius = 0;
//cannot heat during timer but can cooldown
if ((temperatureInCelsius > 0) && (Extruder::disableheat_time >HAL::timeInMilliseconds() )) return;
if(heatedBedController.targetTemperatureC==temperatureInCelsius) return; // don't flood log with messages if killed
heatedBedController.setTargetTemperature(temperatureInCelsius);
if(beep && temperatureInCelsius>30) heatedBedController.setAlarm(true);
@ -1435,7 +1469,7 @@ const char ext4_deselect_cmd[] PROGMEM = EXT4_DESELECT_COMMANDS;
const char ext5_select_cmd[] PROGMEM = EXT5_SELECT_COMMANDS;
const char ext5_deselect_cmd[] PROGMEM = EXT5_DESELECT_COMMANDS;
#endif
millis_t Extruder::disableheat_time =0;
Extruder extruder[NUM_EXTRUDER] =
{
#if NUM_EXTRUDER>0

Wyświetl plik

@ -365,11 +365,12 @@ class Extruder // Size: 12*1 Byte+12*4 Byte+4*2Byte = 68 Byte
static void manageTemperatures();
static void disableCurrentExtruderMotor();
static void disableAllExtruderMotors();
static void selectExtruderById(uint8_t extruderId);
static void selectExtruderById(uint8_t extruderId, bool changepos=true);
static void disableAllHeater();
static void initExtruder();
static void initHeatedBed();
static void setHeatedBedTemperature(float temp_celsius,bool beep = false);
static millis_t disableheat_time;
static float getHeatedBedTemperature();
static void setTemperatureForExtruder(float temp_celsius,uint8_t extr,bool beep = false);
};

Wyświetl plik

@ -55,6 +55,7 @@ long Printer::destinationSteps[E_AXIS_ARRAY];
float Printer::coordinateOffset[Z_AXIS_ARRAY] = {0,0,0};
uint8_t Printer::flag0 = 0;
uint8_t Printer::flag1 = 0;
uint8_t Printer::flaghome = 0;
uint8_t Printer::debugLevel = 6; ///< Bitfield defining debug output. 1 = echo, 2 = info, 4 = error, 8 = dry run., 16 = Only communication, 32 = No moves
uint8_t Printer::stepsPerTimerCall = 1;
uint8_t Printer::menuMode = 0;
@ -157,6 +158,86 @@ int8_t Printer::motorYorZ;
int debugWaitLoop = 0;
#endif
#if ENABLE_CLEAN_NOZZLE
void Printer::cleanNozzle(bool restoreposition)
{
//we save current configuration and position
uint8_t tmp_extruderid=Extruder::current->id;
float tmp_x = currentPosition[X_AXIS];
float tmp_y = currentPosition[Y_AXIS];
float tmp_z = currentPosition[Z_AXIS];
//ensure homing is done and select E0
if(!Printer::isHomed()) Printer::homeAxis(true,true,true);
else
{//put proper position in case position has been manualy changed no need to home Z as cannot be manualy changed and in case of something on plate it could be catastrophic
Printer::homeAxis(true,true,false);
}
UI_STATUS_UPD_RAM(UI_TEXT_CLEANING_NOZZLE);
#if DAVINCI ==1
//first step noze
moveToReal(xMin+CLEAN_X-ENDSTOP_X_BACK_ON_HOME,yMin,IGNORE_COORDINATE,IGNORE_COORDINATE,homingFeedrate[0]);
//second step noze
moveToReal(xMin-ENDSTOP_X_BACK_ON_HOME,yMin,IGNORE_COORDINATE,IGNORE_COORDINATE,homingFeedrate[0]);
//third step noze
moveToReal(xMin+CLEAN_X-ENDSTOP_X_BACK_ON_HOME,yMin,IGNORE_COORDINATE,IGNORE_COORDINATE,homingFeedrate[0]);
//fourth step noze
moveToReal(xMin-ENDSTOP_X_BACK_ON_HOME,yMin,IGNORE_COORDINATE,IGNORE_COORDINATE,homingFeedrate[0]);
//fifth step noze
moveToReal(xMin+CLEAN_X-ENDSTOP_X_BACK_ON_HOME,yMin,IGNORE_COORDINATE,IGNORE_COORDINATE,homingFeedrate[0]);
//sixth step noze
moveToReal(xMin-ENDSTOP_X_BACK_ON_HOME,yMin,IGNORE_COORDINATE,IGNORE_COORDINATE,homingFeedrate[0]);
//first step Z probe
moveToReal(xMin,yMin + CLEAN_Y-ENDSTOP_Y_BACK_ON_HOME,IGNORE_COORDINATE,IGNORE_COORDINATE,homingFeedrate[0]);
//second step Z probe
moveToReal(xMin,yMin-ENDSTOP_Y_BACK_ON_HOME,IGNORE_COORDINATE,IGNORE_COORDINATE,homingFeedrate[0]);
//third step Z probe
moveToReal(xMin,yMin+CLEAN_Y-ENDSTOP_Y_BACK_ON_HOME,IGNORE_COORDINATE,IGNORE_COORDINATE,homingFeedrate[0]);
//fourth step Z probe
moveToReal(xMin,yMin-ENDSTOP_Y_BACK_ON_HOME,IGNORE_COORDINATE,IGNORE_COORDINATE,homingFeedrate[0]);
//fifth step Z probe
moveToReal(xMin,yMin+CLEAN_Y-ENDSTOP_Y_BACK_ON_HOME,IGNORE_COORDINATE,IGNORE_COORDINATE,homingFeedrate[0]);
//sixth step Z probe
moveToReal(xMin,yMin-ENDSTOP_Y_BACK_ON_HOME,IGNORE_COORDINATE,IGNORE_COORDINATE,homingFeedrate[0]);
#else
// move Z to zMin + 15 if under this position to be sure nozzle do not touch metal holder
if (currentPosition[Z_AXIS] < zMin+15) moveToReal(IGNORE_COORDINATE,IGNORE_COORDINATE,zMin+15,IGNORE_COORDINATE,homingFeedrate[0]);
Commands::waitUntilEndOfAllMoves();
//first step
moveToReal(xMin + CLEAN_X-ENDSTOP_X_BACK_ON_HOME,yMin + CLEAN_Y-ENDSTOP_Y_BACK_ON_HOME,IGNORE_COORDINATE,IGNORE_COORDINATE,homingFeedrate[0]);
//second step
moveToReal(xMin-ENDSTOP_X_BACK_ON_HOME,yMin-ENDSTOP_Y_BACK_ON_HOME,IGNORE_COORDINATE,IGNORE_COORDINATE,homingFeedrate[0]);
//third step
moveToReal(xMin+CLEAN_X-ENDSTOP_X_BACK_ON_HOME,yMin+CLEAN_Y-ENDSTOP_Y_BACK_ON_HOME,IGNORE_COORDINATE,IGNORE_COORDINATE,homingFeedrate[0]);
//fourth step
moveToReal(xMin-ENDSTOP_X_BACK_ON_HOME,yMin-ENDSTOP_Y_BACK_ON_HOME,IGNORE_COORDINATE,IGNORE_COORDINATE,homingFeedrate[0]);
//move out to be sure first drop go to purge box
moveToReal(xLength-2,yMin+CLEAN_Y-ENDSTOP_Y_BACK_ON_HOME,IGNORE_COORDINATE,IGNORE_COORDINATE,homingFeedrate[0]);
moveToReal(xLength-2,yMin-ENDSTOP_Y_BACK_ON_HOME,IGNORE_COORDINATE,IGNORE_COORDINATE,homingFeedrate[0]);
Commands::waitUntilEndOfAllMoves();
//first step
moveToReal(xLength-20,IGNORE_COORDINATE,IGNORE_COORDINATE,IGNORE_COORDINATE,homingFeedrate[0]);
//second step
moveToReal(xLength,IGNORE_COORDINATE,IGNORE_COORDINATE,IGNORE_COORDINATE,homingFeedrate[0]);
//third step
moveToReal(xLength-20,IGNORE_COORDINATE,IGNORE_COORDINATE,IGNORE_COORDINATE,homingFeedrate[0]);
//fourth step
moveToReal(xLength,IGNORE_COORDINATE,IGNORE_COORDINATE,IGNORE_COORDINATE,homingFeedrate[0]);
Commands::waitUntilEndOfAllMoves();
//back to original position and original extruder
//X,Y first then Z
if (restoreposition)
{
moveToReal(tmp_x,tmp_y,IGNORE_COORDINATE,IGNORE_COORDINATE,homingFeedrate[0]);
moveToReal(IGNORE_COORDINATE,IGNORE_COORDINATE,tmp_z,IGNORE_COORDINATE,homingFeedrate[0]);
Commands::waitUntilEndOfAllMoves();
Extruder::selectExtruderById(tmp_extruderid);
}
#endif
}
#endif
#if !NONLINEAR_SYSTEM
@ -777,7 +858,7 @@ SET_INPUT(FIL_SENSOR2_PIN);
#endif
#if CASE_LIGHTS_PIN>=0
SET_OUTPUT(CASE_LIGHTS_PIN);
WRITE(CASE_LIGHTS_PIN, CASE_LIGHT_DEFAULT_ON);
WRITE(CASE_LIGHTS_PIN, EEPROM::buselight);
#endif // CASE_LIGHTS_PIN
#if GANTRY
Printer::motorX = 0;
@ -834,7 +915,7 @@ SET_INPUT(FIL_SENSOR2_PIN);
EEPROM::initBaudrate();
HAL::serialSetBaudrate(baudrate);
Com::printFLN(Com::tStart);
UI_INITIALIZE;
//UI_INITIALIZE;
HAL::showStartReason();
Extruder::initExtruder();
#if SDSUPPORT
@ -855,7 +936,7 @@ SET_INPUT(FIL_SENSOR2_PIN);
Commands::checkFreeMemory();
Commands::writeLowestFreeRAM();
HAL::setupTimer();
UI_INITIALIZE;
#if NONLINEAR_SYSTEM
transformCartesianStepsToDeltaSteps(Printer::currentPositionSteps, Printer::currentDeltaPositionSteps);
@ -942,6 +1023,7 @@ void Printer::deltaMoveToTopEndstops(float feedrate)
}
void Printer::homeXAxis()
{
setHomedX(true);
destinationSteps[X_AXIS] = 0;
if (!PrintLine::queueDeltaMove(true,false,false)) {
Com::printWarningFLN(PSTR("homeXAxis / queueDeltaMove returns error"));
@ -949,6 +1031,7 @@ void Printer::homeXAxis()
}
void Printer::homeYAxis()
{
setHomedY(true);
Printer::destinationSteps[Y_AXIS] = 0;
if (!PrintLine::queueDeltaMove(true,false,false)) {
Com::printWarningFLN(PSTR("homeYAxis / queueDeltaMove returns error"));
@ -956,6 +1039,7 @@ void Printer::homeYAxis()
}
void Printer::homeZAxis() // Delta z homing
{
setHomedZ(true);
SHOT("homeZAxis ");
deltaMoveToTopEndstops(Printer::homingFeedrate[Z_AXIS]);
PrintLine::moveRelativeDistanceInSteps(0,0,2*axisStepsPerMM[Z_AXIS]*-ENDSTOP_Z_BACK_MOVE,0,Printer::homingFeedrate[Z_AXIS]/ENDSTOP_X_RETEST_REDUCTION_FACTOR, true, false);
@ -1006,6 +1090,7 @@ void Printer::homeZAxis() // Delta z homing
// This home axis is for delta
void Printer::homeAxis(bool xaxis,bool yaxis,bool zaxis) // Delta homing code
{
setHomed(true)
SHOT("homeAxis ");
bool autoLevel = isAutolevelActive();
setAutolevelActive(false);
@ -1047,6 +1132,7 @@ void Printer::homeAxis(bool xaxis,bool yaxis,bool zaxis) // Delta homing code
void Printer::homeXAxis()
{
long steps;
setHomedX(true);
if ((MIN_HARDWARE_ENDSTOP_X && X_MIN_PIN > -1 && X_HOME_DIR==-1 && MIN_HARDWARE_ENDSTOP_Y && Y_MIN_PIN > -1 && Y_HOME_DIR==-1) ||
(MAX_HARDWARE_ENDSTOP_X && X_MAX_PIN > -1 && X_HOME_DIR==1 && MAX_HARDWARE_ENDSTOP_Y && Y_MAX_PIN > -1 && Y_HOME_DIR==1))
{
@ -1094,11 +1180,14 @@ void Printer::homeXAxis()
void Printer::homeYAxis()
{
// Dummy function x and y homing must occur together
setHomedY(true);
}
#else // cartesian printer
void Printer::homeXAxis()
{
long steps;
setHomedX(true);
Extruder::selectExtruderById(0,false);
if ((MIN_HARDWARE_ENDSTOP_X && X_MIN_PIN > -1 && X_HOME_DIR==-1) || (MAX_HARDWARE_ENDSTOP_X && X_MAX_PIN > -1 && X_HOME_DIR==1))
{
long offX = 0;
@ -1131,6 +1220,8 @@ void Printer::homeXAxis()
void Printer::homeYAxis()
{
long steps;
setHomedY(true);
Extruder::selectExtruderById(0,false);
if ((MIN_HARDWARE_ENDSTOP_Y && Y_MIN_PIN > -1 && Y_HOME_DIR==-1) || (MAX_HARDWARE_ENDSTOP_Y && Y_MAX_PIN > -1 && Y_HOME_DIR==1))
{
long offY = 0;
@ -1165,6 +1256,7 @@ void Printer::homeYAxis()
void Printer::homeZAxis() // cartesian homing
{
long steps;
setHomedZ(true);
if ((MIN_HARDWARE_ENDSTOP_Z && Z_MIN_PIN > -1 && Z_HOME_DIR==-1) || (MAX_HARDWARE_ENDSTOP_Z && Z_MAX_PIN > -1 && Z_HOME_DIR==1))
{
UI_STATUS_UPD(UI_TEXT_HOME_Z);

Wyświetl plik

@ -48,6 +48,10 @@ union floatLong
#define PRINTER_FLAG1_POWER_ON 64
#define PRINTER_FLAG1_ALLOW_COLD_EXTRUSION 128
#define PRINTER_FLAG_HOME_X 1
#define PRINTER_FLAG_HOME_Y 2
#define PRINTER_FLAG_HOME_Z 4
// define an integer number of steps more than large enough to get to endstop from anywhere
#define HOME_DISTANCE_STEPS (Printer::zMaxSteps-Printer::zMinSteps+1000)
#define HOME_DISTANCE_MM (HOME_DISTANCE_STEPS * invAxisStepsPerMM[Z_AXIS])
@ -87,7 +91,7 @@ public:
static uint8_t unitIsInches;
static uint8_t debugLevel;
static uint8_t flag0,flag1; // 1 = stepper disabled, 2 = use external extruder interrupt, 4 = temp Sensor defect, 8 = homed
static uint8_t flag0,flag1,flaghome; // 1 = stepper disabled, 2 = use external extruder interrupt, 4 = temp Sensor defect, 8 = homed
static uint8_t stepsPerTimerCall;
static uint32_t interval; ///< Last step duration in ticks.
static uint32_t timer; ///< used for acceleration/deceleration timing
@ -373,8 +377,38 @@ public:
}
static inline uint8_t isHomed()
{
return flag1 & PRINTER_FLAG1_HOMED;
return flaghome & (PRINTER_FLAG_HOME_X|PRINTER_FLAG_HOME_Y|PRINTER_FLAG_HOME_Z);
}
static inline uint8_t isXHomed()
{
return flaghome & PRINTER_FLAG_HOME_X;
}
static inline uint8_t isYHomed()
{
return flaghome & PRINTER_FLAG_HOME_Y;
}
static inline uint8_t isZHomed()
{
return flaghome & PRINTER_FLAG_HOME_Z;
}
static inline void setHomedX(uint8_t b)
{
flaghome = (b ? flaghome | PRINTER_FLAG_HOME_X : flag1 & ~PRINTER_FLAG_HOME_X);
}
static inline void setHomedY(uint8_t b)
{
flaghome = (b ? flaghome | PRINTER_FLAG_HOME_Y : flag1 & ~PRINTER_FLAG_HOME_Y);
}
static inline void setHomedZ(uint8_t b)
{
flaghome = (b ? flaghome | PRINTER_FLAG_HOME_Z : flag1 & ~PRINTER_FLAG_HOME_Z);
}
//this function just mention a home command has been sent not home is fully done, can be only X homed
static inline void setHomed(uint8_t b)
{
flag1 = (b ? flag1 | PRINTER_FLAG1_HOMED : flag1 & ~PRINTER_FLAG1_HOMED);
@ -722,6 +756,9 @@ public:
static uint8_t moveTo(float x,float y,float z,float e,float f);
static uint8_t moveToReal(float x,float y,float z,float e,float f);
static void homeAxis(bool xaxis,bool yaxis,bool zaxis); /// Home axis
#if ENABLE_CLEAN_NOZZLE
static void cleanNozzle(bool restoreposition=true);
#endif
static void setOrigin(float xOff,float yOff,float zOff);
static bool isPositionAllowed(float x,float y,float z);
static inline int getFanSpeed()

Wyświetl plik

@ -85,6 +85,9 @@ Custom M Codes
- M85 - Set inactivity shutdown timer with parameter S<seconds>. To disable set zero (default)
- M92 - Set axisStepsPerMM - same syntax as G92
- M99 S<delayInSec> X0 Y0 Z0 - Disable motors for S seconds (default 10) for given axis.
- M100 clean nozzle
- M101 turn light on (no eeprom saving) and reset autoturn off time if activated
- M102 turn light off (no eeprom saving)
- M104 S<temp> T<extruder> P1 F1 - Set temperature without wait. P1 = wait for moves to finish, F1 = beep when temp. reached first time
- M105 X0 - Get temperatures. If X0 is added, the raw analog values are also written.
- M112 - Emergency kill

Wyświetl plik

@ -174,7 +174,9 @@ void SDCard::pausePrint(bool intern)
#if DRIVE_SYSTEM == DELTA
Printer::moveToReal(0, 0.9 * EEPROM::deltaMaxRadius(), IGNORE_COORDINATE, IGNORE_COORDINATE, Printer::maxFeedrate[X_AXIS]);
#else
Printer::moveToReal(Printer::xMin, Printer::yMin + Printer::yLength, IGNORE_COORDINATE, IGNORE_COORDINATE, Printer::maxFeedrate[X_AXIS]);
if (Printer::lastCmdPos[Z_AXIS]+10<Printer::zMin+Printer::zLength)
Printer::moveToReal(IGNORE_COORDINATE,IGNORE_COORDINATE,Printer::lastCmdPos[Z_AXIS]+10,IGNORE_COORDINATE,Printer::homingFeedrate[Z_AXIS]);
Printer::moveToReal(Printer::xMin,Printer::yMin + Printer::yLength,IGNORE_COORDINATE,IGNORE_COORDINATE,Printer::homingFeedrate[X_AXIS]);
#endif
Printer::lastCmdPos[X_AXIS] = Printer::currentPosition[X_AXIS];
Printer::lastCmdPos[Y_AXIS] = Printer::currentPosition[Y_AXIS];

Wyświetl plik

@ -150,6 +150,8 @@ void PrintLine::moveRelativeDistanceInStepsReal(int32_t x,int32_t y,int32_t z,in
*/
void PrintLine::queueCartesianMove(uint8_t check_endstops,uint8_t pathOptimize)
{
Printer::setMenuMode(MENU_MODE_PRINTING,true);
if (Printer::isMenuMode(MENU_MODE_STOP_REQUESTED))return;
Printer::unsetAllSteppersDisabled();
waitForXFreeLines(1);
uint8_t newPath = insertWaitMovesIfNeeded(pathOptimize, 0);
@ -1881,7 +1883,7 @@ int32_t PrintLine::bresenhamStep() // Version for delta printer
if(Printer::isZProbingActive() && Printer::stepsRemainingAtZHit >= 0)
{
removeCurrentLineForbidInterrupt();
if(linesCount == 0) UI_STATUS(UI_TEXT_IDLE);
// if(linesCount == 0) UI_STATUS(UI_TEXT_IDLE);
return 1000;
}
#endif
@ -2218,7 +2220,7 @@ int32_t PrintLine::bresenhamStep() // Version for delta printer
//deltaSegmentCount -= cur->numDeltaSegments; // should always be zero
removeCurrentLineForbidInterrupt();
Printer::disableAllowedStepper();
if(linesCount == 0) UI_STATUS(UI_TEXT_IDLE);
//if(linesCount == 0) UI_STATUS(UI_TEXT_IDLE);
interval = Printer::interval = interval >> 1; // 50% of time to next call to do cur=0
DEBUG_MEMORY;
} // Do even
@ -2243,6 +2245,11 @@ int lastblk=-1;
int32_t cur_errupd;
int32_t PrintLine::bresenhamStep() // version for cartesian printer
{
if (Printer::isMenuMode(MENU_MODE_STOP_REQUESTED))
{
while(linesCount)removeCurrentLineForbidInterrupt();
return 100;
}
#if CPU_ARCH==ARCH_ARM
if(!PrintLine::nlFlag)
#else
@ -2534,7 +2541,7 @@ int32_t PrintLine::bresenhamStep() // version for cartesian printer
#endif
removeCurrentLineForbidInterrupt();
Printer::disableAllowedStepper();
if(linesCount == 0) UI_STATUS(UI_TEXT_IDLE);
// if(linesCount == 0) UI_STATUS(UI_TEXT_IDLE);
interval = Printer::interval = interval >> 1; // 50% of time to next call to do cur=0
DEBUG_MEMORY;
} // Do even

Wyświetl plik

@ -437,7 +437,7 @@ public:
{
linesCount = 0;
linesPos = linesWritePos;
Printer::setMenuMode(MENU_MODE_PRINTING,false);
//Printer::setMenuMode(MENU_MODE_PRINTING,false);
}
// Only called from bresenham -> inside interrupt handle
inline void updateAdvanceSteps(speed_t v,uint8_t max_loops,bool accelerate)
@ -646,9 +646,9 @@ public:
nlFlag = false;
#endif
HAL::forbidInterrupts();
--linesCount;
if(!linesCount)
Printer::setMenuMode(MENU_MODE_PRINTING,false);
if (linesCount>0) --linesCount;
// if(!linesCount)
// Printer::setMenuMode(MENU_MODE_PRINTING,false);
}
static inline void pushLine()
{

Wyświetl plik

@ -311,6 +311,8 @@ STEPPER_CURRENT_CONTROL
#if NUM_EXTRUDER==1
#define E1_PINS
#define HEATER_2_PIN -1
#define TEMP_2_PIN -1
#endif
#if NUM_EXTRUDER<3

Wyświetl plik

@ -28,8 +28,7 @@ extern const int8_t encoder_table[16] PROGMEM ;
#include <inttypes.h>
#include <ctype.h>
char uipagedialog[4][MAX_COLS+1];
#if BEEPER_TYPE==2 && defined(UI_HAS_I2C_KEYS) && UI_I2C_KEY_ADDRESS!=BEEPER_ADDRESS
#error Beeper address and i2c key address must be identical
@ -47,6 +46,11 @@ bool benable_autoreturn=true;
#if FEATURE_BEEPER
bool enablesound = true;
#endif
#if UI_AUTOLIGHTOFF_AFTER!=0
millis_t UIDisplay::ui_autolightoff_time=-1;
#endif
uint8_t UIDisplay::display_mode=ADVANCED_MODE;
void playsound(int tone,int duration)
@ -230,52 +234,52 @@ const long baudrates[] PROGMEM = {9600,14400,19200,28800,38400,56000,57600,76800
460800,500000,921600,1000000,1500000,0
};
#define LCD_ENTRYMODE 0x04 /**< Set entrymode */
#define LCD_ENTRYMODE 0x04 /**< Set entrymode */
/** @name GENERAL COMMANDS */
/*@{*/
#define LCD_CLEAR 0x01 /**< Clear screen */
#define LCD_HOME 0x02 /**< Cursor move to first digit */
#define LCD_CLEAR 0x01 /**< Clear screen */
#define LCD_HOME 0x02 /**< Cursor move to first digit */
/*@}*/
/** @name ENTRYMODES */
/*@{*/
#define LCD_ENTRYMODE 0x04 /**< Set entrymode */
#define LCD_INCREASE LCD_ENTRYMODE | 0x02 /**< Set cursor move direction -- Increase */
#define LCD_DECREASE LCD_ENTRYMODE | 0x00 /**< Set cursor move direction -- Decrease */
#define LCD_DISPLAYSHIFTON LCD_ENTRYMODE | 0x01 /**< Display is shifted */
#define LCD_DISPLAYSHIFTOFF LCD_ENTRYMODE | 0x00 /**< Display is not shifted */
#define LCD_ENTRYMODE 0x04 /**< Set entrymode */
#define LCD_INCREASE LCD_ENTRYMODE | 0x02 /**< Set cursor move direction -- Increase */
#define LCD_DECREASE LCD_ENTRYMODE | 0x00 /**< Set cursor move direction -- Decrease */
#define LCD_DISPLAYSHIFTON LCD_ENTRYMODE | 0x01 /**< Display is shifted */
#define LCD_DISPLAYSHIFTOFF LCD_ENTRYMODE | 0x00 /**< Display is not shifted */
/*@}*/
/** @name DISPLAYMODES */
/*@{*/
#define LCD_DISPLAYMODE 0x08 /**< Set displaymode */
#define LCD_DISPLAYON LCD_DISPLAYMODE | 0x04 /**< Display on */
#define LCD_DISPLAYOFF LCD_DISPLAYMODE | 0x00 /**< Display off */
#define LCD_CURSORON LCD_DISPLAYMODE | 0x02 /**< Cursor on */
#define LCD_CURSOROFF LCD_DISPLAYMODE | 0x00 /**< Cursor off */
#define LCD_BLINKINGON LCD_DISPLAYMODE | 0x01 /**< Blinking on */
#define LCD_BLINKINGOFF LCD_DISPLAYMODE | 0x00 /**< Blinking off */
#define LCD_DISPLAYMODE 0x08 /**< Set displaymode */
#define LCD_DISPLAYON LCD_DISPLAYMODE | 0x04 /**< Display on */
#define LCD_DISPLAYOFF LCD_DISPLAYMODE | 0x00 /**< Display off */
#define LCD_CURSORON LCD_DISPLAYMODE | 0x02 /**< Cursor on */
#define LCD_CURSOROFF LCD_DISPLAYMODE | 0x00 /**< Cursor off */
#define LCD_BLINKINGON LCD_DISPLAYMODE | 0x01 /**< Blinking on */
#define LCD_BLINKINGOFF LCD_DISPLAYMODE | 0x00 /**< Blinking off */
/*@}*/
/** @name SHIFTMODES */
/*@{*/
#define LCD_SHIFTMODE 0x10 /**< Set shiftmode */
#define LCD_DISPLAYSHIFT LCD_SHIFTMODE | 0x08 /**< Display shift */
#define LCD_CURSORMOVE LCD_SHIFTMODE | 0x00 /**< Cursor move */
#define LCD_RIGHT LCD_SHIFTMODE | 0x04 /**< Right shift */
#define LCD_LEFT LCD_SHIFTMODE | 0x00 /**< Left shift */
#define LCD_SHIFTMODE 0x10 /**< Set shiftmode */
#define LCD_DISPLAYSHIFT LCD_SHIFTMODE | 0x08 /**< Display shift */
#define LCD_CURSORMOVE LCD_SHIFTMODE | 0x00 /**< Cursor move */
#define LCD_RIGHT LCD_SHIFTMODE | 0x04 /**< Right shift */
#define LCD_LEFT LCD_SHIFTMODE | 0x00 /**< Left shift */
/*@}*/
/** @name DISPLAY_CONFIGURATION */
/*@{*/
#define LCD_CONFIGURATION 0x20 /**< Set function */
#define LCD_8BIT LCD_CONFIGURATION | 0x10 /**< 8 bits interface */
#define LCD_4BIT LCD_CONFIGURATION | 0x00 /**< 4 bits interface */
#define LCD_2LINE LCD_CONFIGURATION | 0x08 /**< 2 line display */
#define LCD_1LINE LCD_CONFIGURATION | 0x00 /**< 1 line display */
#define LCD_5X10 LCD_CONFIGURATION | 0x04 /**< 5 X 10 dots */
#define LCD_5X7 LCD_CONFIGURATION | 0x00 /**< 5 X 7 dots */
#define LCD_CONFIGURATION 0x20 /**< Set function */
#define LCD_8BIT LCD_CONFIGURATION | 0x10 /**< 8 bits interface */
#define LCD_4BIT LCD_CONFIGURATION | 0x00 /**< 4 bits interface */
#define LCD_2LINE LCD_CONFIGURATION | 0x08 /**< 2 line display */
#define LCD_1LINE LCD_CONFIGURATION | 0x00 /**< 1 line display */
#define LCD_5X10 LCD_CONFIGURATION | 0x04 /**< 5 X 10 dots */
#define LCD_5X7 LCD_CONFIGURATION | 0x00 /**< 5 X 7 dots */
#define LCD_SETCGRAMADDR 0x40
@ -381,10 +385,10 @@ void initializeLCD()
HAL::delayMicroseconds(180);
// finally, set # lines, font size, etc.
lcdCommand(LCD_4BIT | LCD_2LINE | LCD_5X7);
lcdCommand(LCD_CLEAR); //- Clear Screen
lcdCommand(LCD_CLEAR); //- Clear Screen
HAL::delayMilliseconds(2); // clear is slow operation
lcdCommand(LCD_INCREASE | LCD_DISPLAYSHIFTOFF); //- Entrymode (Display Shift: off, Increment Address Counter)
lcdCommand(LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKINGOFF); //- Display on
lcdCommand(LCD_INCREASE | LCD_DISPLAYSHIFTOFF); //- Entrymode (Display Shift: off, Increment Address Counter)
lcdCommand(LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKINGOFF); //- Display on
uid.lastSwitch = uid.lastRefresh = HAL::timeInMilliseconds();
uid.createChar(1,character_back);
uid.createChar(2,character_degree);
@ -405,10 +409,10 @@ void lcdWriteNibble(uint8_t value)
WRITE(UI_DISPLAY_D6_PIN,value & 4);
WRITE(UI_DISPLAY_D7_PIN,value & 8);
WRITE(UI_DISPLAY_ENABLE_PIN, HIGH);// enable pulse must be >450ns
DELAY1MICROSECOND;
DELAY1MICROSECOND;
WRITE(UI_DISPLAY_ENABLE_PIN, LOW);
DELAY1MICROSECOND;
DELAY1MICROSECOND;
}
void lcdWriteByte(uint8_t c,uint8_t rs)
@ -426,16 +430,16 @@ void lcdWriteByte(uint8_t c,uint8_t rs)
do
{
WRITE(UI_DISPLAY_ENABLE_PIN, HIGH);
DELAY1MICROSECOND;
DELAY1MICROSECOND;
busy = READ(UI_DISPLAY_D7_PIN);
WRITE(UI_DISPLAY_ENABLE_PIN, LOW);
DELAY1MICROSECOND;
DELAY1MICROSECOND;
WRITE(UI_DISPLAY_ENABLE_PIN, HIGH);
DELAY1MICROSECOND;
DELAY1MICROSECOND;
WRITE(UI_DISPLAY_ENABLE_PIN, LOW);
DELAY1MICROSECOND;
DELAY1MICROSECOND;
}
while (busy);
@ -452,20 +456,20 @@ void lcdWriteByte(uint8_t c,uint8_t rs)
WRITE(UI_DISPLAY_D6_PIN, c & 0x40);
WRITE(UI_DISPLAY_D7_PIN, c & 0x80);
WRITE(UI_DISPLAY_ENABLE_PIN, HIGH); // enable pulse must be >450ns
DELAY1MICROSECOND;
DELAY1MICROSECOND;
WRITE(UI_DISPLAY_ENABLE_PIN, LOW);
DELAY1MICROSECOND;
DELAY1MICROSECOND;
WRITE(UI_DISPLAY_D4_PIN, c & 0x01);
WRITE(UI_DISPLAY_D5_PIN, c & 0x02);
WRITE(UI_DISPLAY_D6_PIN, c & 0x04);
WRITE(UI_DISPLAY_D7_PIN, c & 0x08);
WRITE(UI_DISPLAY_ENABLE_PIN, HIGH); // enable pulse must be >450ns
DELAY1MICROSECOND;
DELAY1MICROSECOND;
WRITE(UI_DISPLAY_ENABLE_PIN, LOW);
DELAY1MICROSECOND;
DELAY1MICROSECOND;
}
void initializeLCD()
@ -514,10 +518,10 @@ void initializeLCD()
// finally, set # lines, font size, etc.
lcdCommand(LCD_4BIT | LCD_2LINE | LCD_5X7);
lcdCommand(LCD_CLEAR); //- Clear Screen
lcdCommand(LCD_CLEAR); //- Clear Screen
HAL::delayMilliseconds(2); // clear is slow operation
lcdCommand(LCD_INCREASE | LCD_DISPLAYSHIFTOFF); //- Entrymode (Display Shift: off, Increment Address Counter)
lcdCommand(LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKINGOFF); //- Display on
lcdCommand(LCD_INCREASE | LCD_DISPLAYSHIFTOFF); //- Entrymode (Display Shift: off, Increment Address Counter)
lcdCommand(LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKINGOFF); //- Display on
uid.lastSwitch = uid.lastRefresh = HAL::timeInMilliseconds();
uid.createChar(1,character_back);
uid.createChar(2,character_degree);
@ -527,7 +531,7 @@ void initializeLCD()
uid.createChar(6,character_folder);
//uid.createChar(7,character_ready);
uid.createChar(7,character_bed);
#if defined(UI_BACKLIGHT_PIN)
SET_OUTPUT(UI_BACKLIGHT_PIN);
WRITE(UI_BACKLIGHT_PIN, HIGH);
@ -1502,8 +1506,8 @@ void UIDisplay::updateSDFileCount()
if (folderLevel>=SD_MAX_FOLDER_DEPTH && DIR_IS_SUBDIR(p) && !(p->name[0]=='.' && p->name[1]=='.'))
continue;
#if HIDE_BINARY_ON_SD
//hide unwished files
if (!SDCard::showFilename(p,tempLongFilename))continue;
//hide unwished files
if (!SDCard::showFilename(p,tempLongFilename))continue;
#endif
nFilesOnCard++;
if (nFilesOnCard > 5000) // Arbitrary maximum, limited only by how long someone would scroll
@ -1526,7 +1530,7 @@ void getSDFilenameAt(uint16_t filePos,char *filename)
if(uid.folderLevel>=SD_MAX_FOLDER_DEPTH && DIR_IS_SUBDIR(p) && !(p->name[0]=='.' && p->name[1]=='.')) continue;
#if HIDE_BINARY_ON_SD
//hide unwished files
if (!SDCard::showFilename(p,tempLongFilename))continue;
if (!SDCard::showFilename(p,tempLongFilename))continue;
#endif
if (filePos--)
continue;
@ -1596,8 +1600,8 @@ void sdrefresh(uint16_t &r,char cache[UI_ROWS][MAX_COLS+1])
if(uid.folderLevel >= SD_MAX_FOLDER_DEPTH && DIR_IS_SUBDIR(p) && !(p->name[0]=='.' && p->name[1]=='.'))
continue;
#if HIDE_BINARY_ON_SD
//hide unwished files
if (!SDCard::showFilename(p,tempLongFilename))continue;
//hide unwished files
if (!SDCard::showFilename(p,tempLongFilename))continue;
#endif
if(skip>0)
{
@ -2923,9 +2927,9 @@ bool UIDisplay::executeAction(int action, bool allowMoves)
case UI_ACTION_MENU_ZPOSFAST:
pushMenu(&ui_menu_zpos_fast,false);
break;
case UI_ACTION_MENU_QUICKSETTINGS:
pushMenu(&ui_menu_quick,false);
break;
//case UI_ACTION_MENU_QUICKSETTINGS:
//pushMenu(&ui_menu_quick,false);
// break;
case UI_ACTION_MENU_EXTRUDER:
pushMenu(&ui_menu_extruder,false);
break;

Wyświetl plik

@ -294,6 +294,7 @@ typedef struct {
unsigned int action; // must be int so it gets 32 bit on arm!
uint8_t filter; // allows dynamic menu filtering based on Printer::menuMode bits set.
uint8_t nofilter; // Hide if one of these bits are set
uint8_t display_mode; // Easy or advanced or both or none
bool showEntry() const;
} const UIMenuEntry;
@ -301,7 +302,9 @@ typedef struct UIMenu_struct {
// 0 = info page
// 1 = file selector
// 2 = submenu
// 3 = modififaction menu
// 3 = action menu
// 4 = modification menu
// 5 =Special menu with status
uint8_t menuType;
int id; // Type of modification
int numEntries;
@ -381,52 +384,53 @@ extern const int8_t encoder_table[16] PROGMEM ;
#define UI_STRING(name,text) const char PROGMEM name[] = text
#define UI_PAGE6(name,row1,row2,row3,row4,row5,row6) UI_STRING(name ## _1txt,row1);UI_STRING(name ## _2txt,row2);UI_STRING(name ## _3txt,row3);UI_STRING(name ## _4txt,row4);UI_STRING(name ## _5txt,row5);UI_STRING(name ## _6txt,row6);\
UIMenuEntry name ## _1 PROGMEM ={name ## _1txt,0,0,0,0};\
UIMenuEntry name ## _2 PROGMEM ={name ## _2txt,0,0,0,0};\
UIMenuEntry name ## _3 PROGMEM ={name ## _3txt,0,0,0,0};\
UIMenuEntry name ## _4 PROGMEM ={name ## _4txt,0,0,0,0};\
UIMenuEntry name ## _5 PROGMEM ={name ## _5txt,0,0,0,0};\
UIMenuEntry name ## _6 PROGMEM ={name ## _6txt,0,0,0,0};\
#define UI_PAGE6(name,row1,row2,row3,row4,row5,row6,dmode) UI_STRING(name ## _1txt,row1);UI_STRING(name ## _2txt,row2);UI_STRING(name ## _3txt,row3);UI_STRING(name ## _4txt,row4);UI_STRING(name ## _5txt,row5);UI_STRING(name ## _6txt,row6);\
UIMenuEntry name ## _1 PROGMEM ={name ## _1txt,UI_MENU_TYPE_INFO,0,0,0,dmode};\
UIMenuEntry name ## _2 PROGMEM ={name ## _2txt,UI_MENU_TYPE_INFO,0,0,0,dmode};\
UIMenuEntry name ## _3 PROGMEM ={name ## _3txt,UI_MENU_TYPE_INFO,0,0,0,dmode};\
UIMenuEntry name ## _4 PROGMEM ={name ## _4txt,UI_MENU_TYPE_INFO,0,0,0,dmode};\
UIMenuEntry name ## _5 PROGMEM ={name ## _5txt,UI_MENU_TYPE_INFO,0,0,0,dmode};\
UIMenuEntry name ## _6 PROGMEM ={name ## _6txt,UI_MENU_TYPE_INFO,0,0,0,dmode};\
const UIMenuEntry * const name ## _entries [] PROGMEM = {&name ## _1,&name ## _2,&name ## _3,&name ## _4,&name ## _5,&name ## _6};\
const UIMenu name PROGMEM = {0,0,6,name ## _entries};
#define UI_PAGE4(name,row1,row2,row3,row4) UI_STRING(name ## _1txt,row1);UI_STRING(name ## _2txt,row2);UI_STRING(name ## _3txt,row3);UI_STRING(name ## _4txt,row4);\
UIMenuEntry name ## _1 PROGMEM ={name ## _1txt,0,0,0,0};\
UIMenuEntry name ## _2 PROGMEM ={name ## _2txt,0,0,0,0};\
UIMenuEntry name ## _3 PROGMEM ={name ## _3txt,0,0,0,0};\
UIMenuEntry name ## _4 PROGMEM ={name ## _4txt,0,0,0,0};\
#define UI_PAGE4(name,row1,row2,row3,row4,dmode) UI_STRING(name ## _1txt,row1);UI_STRING(name ## _2txt,row2);UI_STRING(name ## _3txt,row3);UI_STRING(name ## _4txt,row4);\
UIMenuEntry name ## _1 PROGMEM ={name ## _1txt,UI_MENU_TYPE_INFO,0,0,0,dmode};\
UIMenuEntry name ## _2 PROGMEM ={name ## _2txt,UI_MENU_TYPE_INFO,0,0,0,dmode};\
UIMenuEntry name ## _3 PROGMEM ={name ## _3txt,UI_MENU_TYPE_INFO,0,0,0,dmode};\
UIMenuEntry name ## _4 PROGMEM ={name ## _4txt,UI_MENU_TYPE_INFO,0,0,0,dmode};\
const UIMenuEntry * const name ## _entries [] PROGMEM = {&name ## _1,&name ## _2,&name ## _3,&name ## _4};\
const UIMenu name PROGMEM = {0,0,4,name ## _entries};
#define UI_PAGE2(name,row1,row2) UI_STRING(name ## _1txt,row1);UI_STRING(name ## _2txt,row2);\
UIMenuEntry name ## _1 PROGMEM ={name ## _1txt,0,0,0,0};\
UIMenuEntry name ## _2 PROGMEM ={name ## _2txt,0,0,0,0};\
#define UI_PAGE2(name,row1,row2,dmode) UI_STRING(name ## _1txt,row1);UI_STRING(name ## _2txt,row2);\
UIMenuEntry name ## _1 PROGMEM ={name ## _1txt,UI_MENU_TYPE_INFO,0,0,0,dmode};\
UIMenuEntry name ## _2 PROGMEM ={name ## _2txt,UI_MENU_TYPE_INFO,0,0,0,dmode};\
const UIMenuEntry * const name ## _entries[] PROGMEM = {&name ## _1,&name ## _2};\
const UIMenu name PROGMEM = {0,0,2,name ## _entries};
#define UI_MENU_ACTION4C(name,action,rows) UI_MENU_ACTION4(name,action,rows)
#define UI_MENU_ACTION2C(name,action,rows) UI_MENU_ACTION2(name,action,rows)
#define UI_MENU_ACTION4(name,action,row1,row2,row3,row4) UI_STRING(name ## _1txt,row1);UI_STRING(name ## _2txt,row2);UI_STRING(name ## _3txt,row3);UI_STRING(name ## _4txt,row4);\
UIMenuEntry name ## _1 PROGMEM ={name ## _1txt,0,0,0,0};\
UIMenuEntry name ## _2 PROGMEM ={name ## _2txt,0,0,0,0};\
UIMenuEntry name ## _3 PROGMEM ={name ## _3txt,0,0,0,0};\
UIMenuEntry name ## _4 PROGMEM ={name ## _4txt,0,0,0,0};\
#define UI_MENU_ACTION4C(name,action,rows,dmode) UI_MENU_ACTION4(name,action,rows,dmode)
#define UI_MENU_ACTION2C(name,action,rows,dmode) UI_MENU_ACTION2(name,action,rows,dmode)
#define UI_MENU_ACTION4(name,action,row1,row2,row3,row4,dmode) UI_STRING(name ## _1txt,row1);UI_STRING(name ## _2txt,row2);UI_STRING(name ## _3txt,row3);UI_STRING(name ## _4txt,row4);\
UIMenuEntry name ## _1 PROGMEM ={name ## _1txt,UI_MENU_TYPE_INFO,0,0,0,dmode};\
UIMenuEntry name ## _2 PROGMEM ={name ## _2txt,UI_MENU_TYPE_INFO,0,0,0,dmode};\
UIMenuEntry name ## _3 PROGMEM ={name ## _3txt,UI_MENU_TYPE_INFO,0,0,0,dmode};\
UIMenuEntry name ## _4 PROGMEM ={name ## _4txt,UI_MENU_TYPE_INFO,0,0,0,dmode};\
const UIMenuEntry * const name ## _entries[] PROGMEM = {&name ## _1,&name ## _2,&name ## _3,&name ## _4};\
const UIMenu name PROGMEM = {3,action,4,name ## _entries};
#define UI_MENU_ACTION2(name,action,row1,row2) UI_STRING(name ## _1txt,row1);UI_STRING(name ## _2txt,row2);\
UIMenuEntry name ## _1 PROGMEM ={name ## _1txt,0,0,0,0};\
UIMenuEntry name ## _2 PROGMEM ={name ## _2txt,0,0,0,0};\
#define UI_MENU_ACTION2(name,action,row1,row2,dmode) UI_STRING(name ## _1txt,row1);UI_STRING(name ## _2txt,row2);\
UIMenuEntry name ## _1 PROGMEM ={name ## _1txt,UI_MENU_TYPE_INFO,0,0,0,dmode};\
UIMenuEntry name ## _2 PROGMEM ={name ## _2txt,UI_MENU_TYPE_INFO,0,0,0,dmode};\
const UIMenuEntry * const name ## _entries[] PROGMEM = {&name ## _1,&name ## _2};\
const UIMenu name PROGMEM = {3,action,2,name ## _entries};
#define UI_MENU_HEADLINE(name,text) UI_STRING(name ## _txt,text);UIMenuEntry name PROGMEM = {name ## _txt,1,0,0,0};
#define UI_MENU_CHANGEACTION(name,row,action) UI_STRING(name ## _txt,row);UIMenuEntry name PROGMEM = {name ## _txt,4,action,0,0};
#define UI_MENU_ACTIONCOMMAND(name,row,action) UI_STRING(name ## _txt,row);UIMenuEntry name PROGMEM = {name ## _txt,3,action,0,0};
#define UI_MENU_ACTIONSELECTOR(name,row,entries) UI_STRING(name ## _txt,row);UIMenuEntry name PROGMEM = {name ## _txt,2,(unsigned int)&entries,0,0};
#define UI_MENU_SUBMENU(name,row,entries) UI_STRING(name ## _txt,row);UIMenuEntry name PROGMEM = {name ## _txt,2,(unsigned int)&entries,0,0};
#define UI_MENU_CHANGEACTION_FILTER(name,row,action,filter,nofilter) UI_STRING(name ## _txt,row);UIMenuEntry name PROGMEM = {name ## _txt,4,action,filter,nofilter};
#define UI_MENU_ACTIONCOMMAND_FILTER(name,row,action,filter,nofilter) UI_STRING(name ## _txt,row);UIMenuEntry name PROGMEM = {name ## _txt,3,action,filter,nofilter};
#define UI_MENU_ACTIONSELECTOR_FILTER(name,row,entries,filter,nofilter) UI_STRING(name ## _txt,row);UIMenuEntry name PROGMEM = {name ## _txt,2,(unsigned int)&entries,filter,nofilter};
#define UI_MENU_SUBMENU_FILTER(name,row,entries,filter,nofilter) UI_STRING(name ## _txt,row);UIMenuEntry name PROGMEM = {name ## _txt,2,(unsigned int)&entries,filter,nofilter};
#define UI_MENU(name,items,itemsCnt) const UIMenuEntry * const name ## _entries[] PROGMEM = items;const UIMenu name PROGMEM = {2,0,itemsCnt,name ## _entries};
#define UI_MENU_FILESELECT(name,items,itemsCnt) const UIMenuEntry * const name ## _entries[] PROGMEM = items;const UIMenu name PROGMEM = {1,0,itemsCnt,name ## _entries};
#define UI_MENU_HEADLINE(name,text,dmode) UI_STRING(name ## _txt,text);UIMenuEntry name PROGMEM = {name ## _txt,UI_MENU_TYPE_INFO,0,0,0,dmode};
#define UI_MENU_CHANGEACTION(name,row,action,dmode) UI_STRING(name ## _txt,row);UIMenuEntry name PROGMEM = {name ## _txt,UI_MENU_TYPE_MODIFICATION_MENU,action,0,0,dmode};
#define UI_MENU_ACTIONCOMMAND(name,row,action,dmode) UI_STRING(name ## _txt,row);UIMenuEntry name PROGMEM = {name ## _txt,UI_MENU_TYPE_ACTION_MENU,action,0,0,dmode};
#define UI_MENU_ACTIONSELECTOR(name,row,entries,dmode) UI_STRING(name ## _txt,row);UIMenuEntry name PROGMEM = {name ## _txt,UI_MENU_TYPE_SUBMENU,(unsigned int)&entries,0,0,dmode};
#define UI_MENU_SUBMENU(name,row,entries,dmode) UI_STRING(name ## _txt,row);UIMenuEntry name PROGMEM = {name ## _txt,UI_MENU_TYPE_SUBMENU,(unsigned int)&entries,0,0,dmode};
#define UI_MENU_CHANGEACTION_FILTER(name,row,action,filter,nofilter,dmode) UI_STRING(name ## _txt,row);UIMenuEntry name PROGMEM = {name ## _txt,UI_MENU_TYPE_MODIFICATION_MENU,action,filter,nofilter,dmode};
#define UI_MENU_ACTIONCOMMAND_FILTER(name,row,action,filter,nofilter,dmode) UI_STRING(name ## _txt,row);UIMenuEntry name PROGMEM = {name ## _txt,UI_MENU_TYPE_ACTION_MENU,action,filter,nofilter,dmode};
#define UI_MENU_ACTIONSELECTOR_FILTER(name,row,entries,filter,nofilter,dmode) UI_STRING(name ## _txt,row);UIMenuEntry name PROGMEM = {name ## _txt,UI_MENU_TYPE_SUBMENU,(unsigned int)&entries,filter,nofilter,dmode};
#define UI_MENU_SUBMENU_FILTER(name,row,entries,filter,nofilter,dmode) UI_STRING(name ## _txt,row);UIMenuEntry name PROGMEM = {name ## _txt,UI_MENU_TYPE_SUBMENU,(unsigned int)&entries,filter,nofilter,dmode};
#define UI_MENU(name,items,itemsCnt) const UIMenuEntry * const name ## _entries[] PROGMEM = items;const UIMenu name PROGMEM = {UI_MENU_TYPE_SUBMENU,0,itemsCnt,name ## _entries}
#define UI_MENU_WITH_STATUS(name,items,itemsCnt) const UIMenuEntry * const name ## _entries[] PROGMEM = items;const UIMenu name PROGMEM = {UI_MENU_TYPE_MENU_WITH_STATUS,0,itemsCnt,name ## _entries}
#define UI_MENU_FILESELECT(name,items,itemsCnt) const UIMenuEntry * const name ## _entries[] PROGMEM = items;const UIMenu name PROGMEM = {UI_MENU_TYPE_FILE_SELECTOR,0,itemsCnt,name ## _entries}
#if FEATURE_CONTROLLER == CONTROLLER_SMARTRAMPS || FEATURE_CONTROLLER == CONTROLLER_GADGETS3D_SHIELD || FEATURE_CONTROLLER == CONTROLLER_REPRAPDISCOUNT_GLCD
#undef SDCARDDETECT
@ -459,72 +463,7 @@ extern const int8_t encoder_table[16] PROGMEM ;
#define UI_FLAG_SLOW_ACTION_RUNNING 4
#define UI_FLAG_KEY_TEST_RUNNING 8
class UIDisplay {
public:
static uint8_t display_mode;
volatile uint8_t flags; // 1 = fast key action, 2 = slow key action, 4 = slow action running, 8 = key test running
uint8_t col; // current col for buffer prefill
uint8_t menuLevel; // current menu level, 0 = info, 1 = group, 2 = groupdata select, 3 = value change
uint16_t menuPos[UI_MENU_MAXLEVEL]; // Positions in menu
const UIMenu *menu[UI_MENU_MAXLEVEL]; // Menus active
uint16_t menuTop[UI_MENU_MAXLEVEL]; // Top row in menu
int8_t shift; // Display shift for scrolling text
int pageDelay; // Counter. If 0 page is refreshed if menuLevel is 0.
void *errorMsg;
uint16_t activeAction; // action for ok/next/previous
uint16_t lastAction;
uint16_t delayedAction;
millis_t lastSwitch; // Last time display switched pages
millis_t lastRefresh;
uint16_t lastButtonAction;
millis_t lastButtonStart;
millis_t nextRepeat; // Time of next autorepeat
millis_t lastNextPrev; // for increasing speed settings
float lastNextAccumul; // Accumulated value
unsigned int outputMask; // Output mask for backlight, leds etc.
int repeatDuration; // Time beween to actions if autorepeat is enabled
int8_t oldMenuLevel;
uint8_t encoderStartScreen;
char printCols[MAX_COLS+1];
void addInt(int value,uint8_t digits,char fillChar=' '); // Print int into printCols
void addLong(long value,char digits);
inline void addLong(long value) {addLong(value, -11);};
void addFloat(float number, char fixdigits,uint8_t digits);
inline void addFloat(float number) {addFloat(number, -9,2);};
void addStringP(PGM_P text);
void addChar(const char c);
void addGCode(GCode *code);
bool okAction(bool allowMoves);
bool nextPreviousAction(int8_t next, bool allowMoves);
char statusMsg[21];
int8_t encoderPos;
int8_t encoderLast;
UIDisplay();
void createChar(uint8_t location, const uint8_t charmap[]);
void initialize(); // Initialize display and keys
void waitForKey();
void printRow(uint8_t r, char *txt, char *txt2, uint8_t changeAtCol); // Print row on display
void printRowP(uint8_t r,PGM_P txt);
void parse(const char *txt,bool ram); /// Parse output and write to printCols;
void refreshPage();
bool executeAction(int action, bool allowMoves);
void finishAction(int action);
void slowAction(bool allowMoves);
void fastAction();
void mediumAction();
void pushMenu(const UIMenu *men, bool refresh);
void adjustMenuPos();
void setStatusP(PGM_P txt, bool error = false);
void setStatus(const char *txt, bool error = false);
inline void setOutputMaskBits(unsigned int bits) {outputMask |= bits;}
inline void unsetOutputMaskBits(unsigned int bits) {outputMask &= ~bits;}
void updateSDFileCount();
void goDir(char *name);
bool isDirname(char *name);
char cwd[SD_MAX_FOLDER_DEPTH*LONG_FILENAME_LENGTH+2];
uint8_t folderLevel;
};
extern UIDisplay uid;
#if FEATURE_CONTROLLER == UICONFIG_CONTROLLER
@ -1334,7 +1273,7 @@ void ui_check_slow_keys(int &action) {}
#include "uilang.h"
#endif
#define UI_VERSION_STRING "Repetier " REPETIER_VERSION
#define UI_VERSION_STRING "Repetier " REPETIER_VERSION "Mod"
#ifdef UI_HAS_I2C_KEYS
#define COMPILE_I2C_DRIVER
@ -1396,8 +1335,77 @@ void ui_check_slow_keys(int &action) {}
#define BEEP_LONG beep(BEEPER_LONG_SEQUENCE);
#endif
class UIDisplay {
public:
#if UI_AUTOLIGHTOFF_AFTER!=0
static millis_t ui_autolightoff_time;
#endif
static uint8_t display_mode;
volatile uint8_t flags; // 1 = fast key action, 2 = slow key action, 4 = slow action running, 8 = key test running
uint8_t col; // current col for buffer prefill
uint8_t menuLevel; // current menu level, 0 = info, 1 = group, 2 = groupdata select, 3 = value change
uint16_t menuPos[UI_MENU_MAXLEVEL]; // Positions in menu
const UIMenu *menu[UI_MENU_MAXLEVEL]; // Menus active
uint16_t menuTop[UI_MENU_MAXLEVEL]; // Top row in menu
int8_t shift; // Display shift for scrolling text
int pageDelay; // Counter. If 0 page is refreshed if menuLevel is 0.
void *errorMsg;
uint16_t activeAction; // action for ok/next/previous
uint16_t lastAction;
uint16_t delayedAction;
millis_t lastSwitch; // Last time display switched pages
millis_t lastRefresh;
uint16_t lastButtonAction;
millis_t lastButtonStart;
millis_t nextRepeat; // Time of next autorepeat
millis_t lastNextPrev; // for increasing speed settings
float lastNextAccumul; // Accumulated value
unsigned int outputMask; // Output mask for backlight, leds etc.
int repeatDuration; // Time beween to actions if autorepeat is enabled
int8_t oldMenuLevel;
uint8_t encoderStartScreen;
char printCols[MAX_COLS+1];
void addInt(int value,uint8_t digits,char fillChar=' '); // Print int into printCols
void addLong(long value,char digits);
inline void addLong(long value) {addLong(value, -11);};
void addFloat(float number, char fixdigits,uint8_t digits);
inline void addFloat(float number) {addFloat(number, -9,2);};
void addStringP(PGM_P text);
void addChar(const char c);
void addGCode(GCode *code);
bool okAction(bool allowMoves);
bool nextPreviousAction(int8_t next, bool allowMoves);
char statusMsg[21];
int8_t encoderPos;
int8_t encoderLast;
UIDisplay();
void createChar(uint8_t location, const uint8_t charmap[]);
void initialize(); // Initialize display and keys
void waitForKey();
void printRow(uint8_t r, char *txt, char *txt2, uint8_t changeAtCol); // Print row on display
void printRowP(uint8_t r,PGM_P txt);
void parse(const char *txt,bool ram); /// Parse output and write to printCols;
void refreshPage();
bool executeAction(int action, bool allowMoves);
void finishAction(int action);
void slowAction(bool allowMoves);
void fastAction();
void mediumAction();
bool confirmationDialog(char * title,char * line1,char * line2,int type=UI_CONFIRMATION_TYPE_YES_NO, bool defaultresponse=false);
void pushMenu(const UIMenu *men, bool refresh);
void adjustMenuPos();
void setStatusP(PGM_P txt, bool error = false);
void setStatus(const char *txt, bool error = false);
inline void setOutputMaskBits(unsigned int bits) {outputMask |= bits;}
inline void unsetOutputMaskBits(unsigned int bits) {outputMask &= ~bits;}
void updateSDFileCount();
void goDir(char *name);
bool isDirname(char *name);
char cwd[SD_MAX_FOLDER_DEPTH*LONG_FILENAME_LENGTH+2];
uint8_t folderLevel;
};
extern UIDisplay uid;
extern void beep(uint8_t duration,uint8_t count);
extern void playsound(int tone,int duration);
#endif