case 601:
// Pause for filament change (New code by Inteloide)
// Syntaxe : X[pos] Y[pos] Z[relative lift] : Position parking (en relatif ! doit être positif !)
// E[initial retract] : longueur de filament retiré juste avant la pause (doit être négatif !)
// L[later retract distance for removal] : longueur de filament (doit être négatif !)
// T[time to wait] : Durée de l'attente (en secondes)
// P[pin input to change continue] : Entrée sur laquelle on attent le changement d'état (18=fin de course axe X)
// I[Interval between beep] : Intervale entre deux beeps (en secondes, défaut = 5)
// D[Beep duration] : Durée de chaque beep (en secondes, défaut = 0.5)
// B[pin of the beep] : Pin du beeper (défaut = 27)
//
// NB: Par défaut on attend un temps de 180 secondes
// Exemple de syntaxes :
// M601 X10 Y10 Z15 E-5 T300 : Remonte de 15mm, va dans un coin du plateau, attends 300 secondes
// M601 X10 Y10 Z15 E-5 P18 I2 D0.8 B27 : Remonte de 15mm, va dans un coin du plateau, attends appui sur capteur axe X
{
// Save positions
float target[4];
float lastpos[4];
target[X_AXIS]=current_position[X_AXIS];
target[Y_AXIS]=current_position[Y_AXIS];
target[Z_AXIS]=current_position[Z_AXIS];
target[E_AXIS]=current_position[E_AXIS];
lastpos[X_AXIS]=current_position[X_AXIS];
lastpos[Y_AXIS]=current_position[Y_AXIS];
lastpos[Z_AXIS]=current_position[Z_AXIS];
lastpos[E_AXIS]=current_position[E_AXIS];
//retract by E
if(code_seen('E')) {
target[E_AXIS]+= code_value() * global_unit_modifier;
} else {
#ifdef FILAMENTCHANGE_FIRSTRETRACT
target[E_AXIS]+= FILAMENTCHANGE_FIRSTRETRACT ;
#endif
}
plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder);
//lift Z
if(code_seen('Z')){
target[Z_AXIS]+= code_value() * global_unit_modifier;
} else {
#ifdef FILAMENTCHANGE_ZADD
target[Z_AXIS]+= FILAMENTCHANGE_ZADD ;
#endif
}
plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder);
//move xy
if(code_seen('X')) {
target[X_AXIS]+= code_value() * global_unit_modifier;
} else {
#ifdef FILAMENTCHANGE_XPOS
target[X_AXIS]= FILAMENTCHANGE_XPOS ;
#endif
}
if(code_seen('Y')) {
target[Y_AXIS]= code_value() * global_unit_modifier;
} else {
#ifdef FILAMENTCHANGE_YPOS
target[Y_AXIS]= FILAMENTCHANGE_YPOS ;
#endif
}
plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder);
// More retract ?
if(code_seen('L')) {
target[E_AXIS]+= code_value() * global_unit_modifier;
} else {
#ifdef FILAMENTCHANGE_FINALRETRACT
target[E_AXIS]+= FILAMENTCHANGE_FINALRETRACT ;
#endif
}
plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder);
//finish moves
st_synchronize();
//disable extruder steppers so filament can be removed
disable_e0();
disable_e1();
disable_e2();
delay(100);
// Variables générales
unsigned long currentMillisBeeper = 0; // Top de depart pour le chrono du beeper
unsigned long previousMiliBeeper = 0; // Précédent top
unsigned long startMiliBeeper = 0; // Top de départ pour l'attente
unsigned long temps=180000; // Durée d'attente
unsigned long intervalBeeper = 5000; // Intervale entre chaque beep (en ms)
unsigned long durationBeeper = 500; // Durée du beep (en ms)
int etatBeeper = LOW; // Etat du beeper
int pinBeeper = 27; // Pin pour le beeper
int pin_number = 18; // Pin pour fin attente
bool wait_for_time=true;
int pin_target;
// On récupère les paramètres
if(code_seen('I')) intervalBeeper = code_value()*1000; // Intervale entre chaque beep (en ms)
if(code_seen('D')) durationBeeper = code_value()*1000; // Durée du beep (en ms)
if(code_seen('B')) pinBeeper = code_value(); // Pin pour le beeper
if(code_seen('T')) temps = code_value()*1000; // Le temps à attendre en ms
if(code_seen('P')) {pin_number = code_value(); wait_for_time=false;}; // La pin à attendre
// On active les entrées/sorties
pinMode(pinBeeper, OUTPUT); // On active la sortie du beeper
if (!wait_for_time){ // On active l'entrée si on n'est pas en temps
pinMode(pin_number, INPUT);
pin_target = !digitalRead(pin_number);
}
// On démarre l'attente
startMiliBeeper = millis();
bool stop_la_boucle=false;
while(!stop_la_boucle){
manage_heater();
manage_inactivity();
// on fait aller le beeper
currentMillisBeeper = millis();
if ((etatBeeper == LOW) && (currentMillisBeeper - previousMiliBeeper >= intervalBeeper)) {
previousMiliBeeper = currentMillisBeeper; // On garde le moment où on a changé d'état
etatBeeper = HIGH; // On change l'état du beeper
digitalWrite(pinBeeper, etatBeeper); // On applique le nouvel état = on fait sonner
}
if ((etatBeeper == HIGH) && (currentMillisBeeper - previousMiliBeeper >= durationBeeper)) {
previousMiliBeeper = currentMillisBeeper; // On garde le moment où on a changé d'état
etatBeeper = LOW; // On change l'état du beeper
digitalWrite(pinBeeper, etatBeeper); // On applique le nouvel état
}
// On regarde si on doit stopper la boucle
if (!wait_for_time) {//On regarde un changement d'une entrée
if (digitalRead(pin_number) == pin_target) { stop_la_boucle=true; }
} else {// On regarde si la tempo est finie
if (currentMillisBeeper-startMiliBeeper>=temps) { stop_la_boucle=true; }
}
}
// Finalisation de la boucle d'attente
digitalWrite(pinBeeper, LOW); // pour remettre au niveau bas (0V) après la boucle d'attente
pinMode(pinBeeper, INPUT); // pour remettre en entrée qui est la valeur par défaut
//return to normal
if(code_seen('L')) {
target[E_AXIS]+= -code_value() * global_unit_modifier;
} else {
#ifdef FILAMENTCHANGE_FINALRETRACT
target[E_AXIS]+=(-1)*FILAMENTCHANGE_FINALRETRACT ;
#endif
}
current_position[E_AXIS]=target[E_AXIS]; //the long retract of L is compensated by manual filament feeding
plan_set_e_position(current_position[E_AXIS]);
plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder); //should do nothing
plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], target[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder); //move xy back
plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], lastpos[Z_AXIS], target[E_AXIS], feedrate/60, active_extruder); //move z back
plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], lastpos[Z_AXIS], lastpos[E_AXIS], feedrate/60, active_extruder); //final untretract
}
break;