ok abfrage im screen vom Code heraus
Ich baue einen Plotter, der mit Bleistiftminen plottet.
Dazu kontrolliere ich die Länge der Mine - wenn die Mine zu kurz wird, will ich stopppen und die Mine ersetzten und dann wieder weiterdrucken.
Dazu habe ich die Abfrage nach der Mine in command.cpp eingehängt. Funktioniert auch.
Allerdings will das Programm sofort weiterdrucken, wenn die Lichtschranke wieder freigibt.
Das pssiert aber beim Wechseln der Mine ...
Besser wäre es wenn das Programm auf ein OK vom Bildschirm warten würde.
Ich müsste so eine Abfrage einsetzen "Fertig mit Wechsel ?" - wenn dann der Drehknopf gedrückt wird geht es wieder weiter,
Wie aktiviere ich diese Abfrage?? (ewig rumprobiert und komme nicht weiter..)
(während der ganzen Funktion ändert sich das Menü vom SmartController nicht. eigentlich müsste ja sd.pauseprint ein menu aufmachen)
(ich habe ein plotter.cpp und plotter.h angelegt)
void Plotter::CheckForPause(){
//Z_MIN_PIN benutze ich als Eingang (Z-Achse gibt es keine) - zzl Stop von extern
//A3 ist Lichtschranke
//pausemodus wenn CheckMemory=1 auslösen bei steigender Flanke
if ( (READ(Z_MIN_PIN) == 1 || analogRead(A3) < 800) && Plotter::CheckMemory == 0) {
Plotter::CheckMemory=1;
Com::printFLN(PSTR("PausePrint gestartet"));
sd.pausePrint();
return;}
//wieder continue wenn beide LOW
if ( READ(Z_MIN_PIN) == 0 && analogRead(A3) > 800 && Plotter::CheckMemory == 1) {
Plotter::CheckMemory=0;
Com::printFLN(PSTR("ContinuePrint gestartet"));
sd.continuePrint();
return;}
}
Vielen Dank!
Dazu kontrolliere ich die Länge der Mine - wenn die Mine zu kurz wird, will ich stopppen und die Mine ersetzten und dann wieder weiterdrucken.
Dazu habe ich die Abfrage nach der Mine in command.cpp eingehängt. Funktioniert auch.
Allerdings will das Programm sofort weiterdrucken, wenn die Lichtschranke wieder freigibt.
Das pssiert aber beim Wechseln der Mine ...
Besser wäre es wenn das Programm auf ein OK vom Bildschirm warten würde.
Ich müsste so eine Abfrage einsetzen "Fertig mit Wechsel ?" - wenn dann der Drehknopf gedrückt wird geht es wieder weiter,
Wie aktiviere ich diese Abfrage?? (ewig rumprobiert und komme nicht weiter..)
(während der ganzen Funktion ändert sich das Menü vom SmartController nicht. eigentlich müsste ja sd.pauseprint ein menu aufmachen)
(ich habe ein plotter.cpp und plotter.h angelegt)
void Plotter::CheckForPause(){
//Z_MIN_PIN benutze ich als Eingang (Z-Achse gibt es keine) - zzl Stop von extern
//A3 ist Lichtschranke
//pausemodus wenn CheckMemory=1 auslösen bei steigender Flanke
if ( (READ(Z_MIN_PIN) == 1 || analogRead(A3) < 800) && Plotter::CheckMemory == 0) {
Plotter::CheckMemory=1;
Com::printFLN(PSTR("PausePrint gestartet"));
sd.pausePrint();
return;}
//wieder continue wenn beide LOW
if ( READ(Z_MIN_PIN) == 0 && analogRead(A3) > 800 && Plotter::CheckMemory == 1) {
Plotter::CheckMemory=0;
Com::printFLN(PSTR("ContinuePrint gestartet"));
sd.continuePrint();
return;}
}
Vielen Dank!
Comments
Printer::pausePrint()
und
Printer::continuePrint()
würde weitermachen. Wobei das nicht exact pausiert sondern keine befehle mehr nachfüllt und dann pausiert. Eine direkte Pause ist auch nicht vorgesehen, da dies zu zu Schrittverlusten führt.
Jetzt musst du nur noch das Menü um einen Wizard erweitern wie (in uimenu.h)
UI_WIZARD2_T(ui_msg_wait, UI_ACTION_CONTINUE, "Mine ersetzen und", "Ok drücken")
Zum pausen dann
Printer::pausePrint();
uid.pushMenu(&ui_msg_wait, true);
UI_ACTION_CONTINUE gibts schon und macht continue. Klappt dann auch mit senden vom host und sd karte.
#include "Plotter.h"
#include "Repetier.h"
#include "uimenu.h"
int Plotter::CheckMemory=0;
void Plotter::CheckForPause(){
//einbau pause mit externen signal oder minenende HIGH
//pausemodus wenn CheckMemory=1
if ( (READ(Z_MIN_PIN) == 1 || analogRead(A3) < 800) && Plotter::CheckMemory == 0) {
Plotter::CheckMemory=1;
Com::printFLN(PSTR("PausePrint gestartet"));
sd.pausePrint();
//Printer::pausePrint();
return;}
//wieder continue wenn beide LOW
if ( READ(Z_MIN_PIN) == 0 && analogRead(A3) > 800 && Plotter::CheckMemory == 1) {
Plotter::CheckMemory=0;
//Start beim Stift muss manuell freigegeben werden sonst kann man stift nicht tauschen
Com::printFLN(PSTR("ContinuePrint gestartet"));
uid.pushMenu(&ui_msg_wait, true);
sd.continuePrint();
//Printer::continuePrint();
return;}
}
irgendetwas mache ich noch falsch:
'printer::pausePrint' ist not a member of 'Printer' -> daher habe ich wieder die sd.. befehle eingesetzt. (SD ist für mich kein Thema, da ich das Plotfile sowieso auf SD lege)
beim wizard habe ich in Uilang.h zwei Zeilen umgedeutscht damit ich die ID werte und damit int bekommen
UI_WIZARD2_T(ui_msg_wait, UI_ACTION_CONTINUE, UI_TEXT_WIZ_REHEAT1_ID, UI_TEXT_WIZ_REHEAT2_ID)
dann habe ich nocht einen Fehler:
'UI_ACTION_CONTINUE' was not declared in this scope
ich finde action_continue nirgends im code... heisst das irgendwie anders??
es gibt aber UI_ACTION_SD_CONTINUE
also habe ich es geändert in:
UI_WIZARD2_T(ui_msg_wait, UI_ACTION_SD_CONTINUE, UI_TEXT_WIZ_REHEAT1_ID, UI_TEXT_WIZ_REHEAT2_ID)
also der Dialog erscheint.
aber die Funktion wartet nicht auf den Knopfdruck sondern macht sofort weiter:
außerdem kommt nicht wieder der alte, ursprüngliche Dialog hoch...
Action is so definiert:
case UI_ACTION_SD_CONTINUE:
if(!allowMoves) ret = UI_ACTION_SD_CONTINUE;
else sd.continuePrint(true);
break;
was ist allowMoves?
da kannst du alles was in deiner plotter.h und cpp ist reinpacken und hast keine probleme mit den #includes
beispiele findest du hier :
https://github.com/repetier/Repetier-Firmware/tree/master/src/SampleEventSystems
oder bei mir (ist aber noch keine finale version):
https://github.com/RAyWB/Additions-for-Repetier-Firmware/tree/master/CustomEventsFull
Das signal "Mine leer" ergibt das event.
Allerdings erscheint es mir etwas kompliziert ... mal sehen ob ich da klarkomme.
mir ist garnicht klar, wie ich den Ausgang A3 als event festlegen kann...
wo ist das analog in deinem Code?
Die custommessage ist sehr elegant gelöst (Das hat bei mir noch garnicht funktioniert ...)
Danke!
wenn du dir bei mir den timer anschaust :
void Custom_500MS()
{
loopcount++;
if(loopcount=3)
{
CustomMessage();
loopcount=0;
}
}
dann kannst du z.b.
void Custom_500MS()
{
checkforpause();
}
einbauen.
die defines in die customevents.h , die routine ind die customeventsimpl.h
schau dir einfach mal die beispielcodes in ruhe an, das ist gar nicht so kompliziert wie es aussieht
customevents.h und customeventsimpl.h: legst du die Dateien neu an, oder sind sie schon vorhanden? ich habe jetzt auf die dev-Version upgedatet (aber die Files sind nicht dabei es gibt nur eine events.h).
hat das teil einen transisto oder dioden ausgang?
das programm läuft nicht in die Custom_500MS funktion.
(das vermute ich zumindest da der Testasudruck "CheckForPause Mem.." nicht angezeigt wird)
Muss man das initialiseiren?
CustomEvent.h:
class Plotter
{
public:
static void CheckForPause();
static int CheckMemory;
};
CustomEventImpl.h
#include "uimenu.h"
int Plotter::CheckMemory=0;
int LichtVal=0;
void Plotter::CheckForPause(){
//Testausrcuk
Com::printF(PSTR("CheckForPause Mem:"),Plotter::CheckMemory);
Com::printF(PSTR(" pinnr:"),Z_MIN_PIN);
Com::printF(PSTR(" pin:"),READ(Z_MIN_PIN));
Com::printFLN(PSTR(" pinval:"),analogRead(A3));
//LichtVal = analogRead(A3);
LichtVal = 0;
if (LichtVal < 800) {LichtVal=0;}
else {LichtVal=1;}
//einbau pause mit externen signal oder minenende HIGH
//pausemodus wenn CheckMemory=1
if ( (READ(Z_MIN_PIN) == 1 || LichtVal == 1) && Plotter::CheckMemory == 0) {
Plotter::CheckMemory=1;
Com::printFLN(PSTR("PausePrint gestartet"));
Printer::pausePrint();
return;}
//wieder continue wenn beide LOW
if ( READ(Z_MIN_PIN) == 0 && LichtVal == 0 && Plotter::CheckMemory == 1) {
Plotter::CheckMemory=0;
//Start beim Stift muss manuell freigegeben werden sonst kann man stift nicht tauschen
Com::printFLN(PSTR("ContinuePrint gestartet"));
uid.pushMenu(&ui_msg_wait, true);
Printer::continuePrint();
return;}
}
void Custom_500MS()
{
Plotter::CheckForPause();
}
deckt deine bleistiftmine den lichtstrahl komplett ab?
widerstände : LED seitig lt. Datenblatt testschaltung 50 ohm , laut meiner Rechnung 62,5 minimum also bist Du mit 100 Ohm auf der sicheren Seite , dann fliessen etwa 37 mA( max erlaubt 60mA).
Stromtransfer lt. Datenblatt 2,5% , d.h auf der Empfängerseite dann 1 mA , also mit 4,7KOhm müsste alles im grünen sein.
https://www.digchip.com/datasheets/parts/datasheet/513/TCST-2000-pdf.php
nächstes Problem ist , dass du analogread verwendest. die Firmware macht das anders , drum kommt mit analogread eigentlich nichts reproduzierbares raus, ich bin da selber schon gegen die wand gelaufen.
(vergleich mal HAL::analogStart mit der arduino analog read)
beschalte die lichtschranke mal mit den werten die ich genannt habe dann müsstest du sauber schalten.
lies die lichtschranke dann über einen digitaleingang und dann sollte das auch klappen.
Das Programm läuft garnicht in die die Funktion hinein! Da muss noch ein anderer Fehler dabei sein..
hast du die customevents aktiviert?
(in der configuration.h letzte zeile)
extern void Custom_500MS();
jetzt habe ich noch ein anderes Thema:
wenn die Mine getauscht wird soll solange gewartet werden mit ContinuePrint bis am Graphic controller der Knopf gedrückt wird:
uid.pushMenu(&ui_msg_wait, true);
mit in uimenu.h (UI_TEXT_WIZ_WAITTEMP1_ID +..2..habe ich anderen text gegeben):
UI_WIZARD2_T(ui_msg_wait, UI_ACTION_CONTINUE, UI_TEXT_WIZ_WAITTEMP1_ID, UI_TEXT_WIZ_WAITTEMP2_ID)
generiert den Dialog am Display - aber ich kann den Drehknopf drücken und nichts passiert.
ich suche so was: if knopfgedrückt dann weiter und normalen Dialog anzeigen...
übrigens #include "uimenu.h" ist nicht notwendig in deinem code
wenn ich das richtig sehe ist der "M6_ACK_PIN" (= Pin 16) der Knopf vom Bildschirm!
Im prinzip ist dein M6 sehr ähnlich, da nach dem Wkzg-Wechsel auch gewartet werden muss...
Ich bein leider kein C++ Programmierer, daher dauert alles immer etwas länger mit Try and Error...
musst halt die abfrage anpassen.
Allerdings benutze ich den Encoder_click vom Reprap smart controller um das OK zum continue print zu geben. Irgendwie wird der Enoder_click aber gleichzeitig auch für die Menusteuerung interpretiert. Nach dem Click springt das Menü in ein Untermenu - es bleibt also nicht im Ausgangsmenu stehen.
Daher versuche nach dem Click das TopMenu explizit zu laden. Das funktioniert aber nur wenn der Buffer =0 leer gelaufen ist ....
wie kann ich den Buffer %oB abfragen? so was wie:
while (!CONTINUE || %oB > 0 ){Printer::defaultLoopActions();}
Ich habe wieder 0.91.9 geladen .. in 10.0Dev ist es mir nicht gelungen die Z-Achse zu deaktivieren. Die DEV hat eigentlich eine schöne Benutzoberfläche. Aber bei G28 wurde immer auch die Home Z abgefragt. Ursache ist vielleicht dass ich den Z-Endschalter als Eingang benutze....
int LichtVal=0;
int SwitchVal=0;
char UI_Message[20];
int Plotter::CheckMemory=0;
void Plotter::CheckForPause(){
//LichtVal = analogRead(A3);testweise deaktiviert
LichtVal = 0;
if (LichtVal < 800) {LichtVal=0;}
else {LichtVal=1;}
SwitchVal=READ(Z_MIN_PIN);
Com::printF(PSTR("CheckForPause Mem:"),Plotter::CheckMemory);
Com::printF(PSTR(" licht:"),LichtVal);
Com::printFLN(PSTR(" pin:"),SwitchVal);
//einbau pause mit externen signal oder minenende HIGH
//Hinweis das gestoppt wurde
if ( SwitchVal == 1 || LichtVal == 1) {
sprintf(UI_Message,"Plotter gestoppt");
UI_STATUS_UPD_RAM(UI_Message);
}
//pausemodus wenn CheckMemory=1
if (( SwitchVal == 1 || LichtVal == 1) && Plotter::CheckMemory == 0) {
Plotter::CheckMemory=1;
Com::printFLN(PSTR("PausePrint gestartet"));
sd.pausePrint();
return;}
//wieder continue wenn beide LOW
if ( SwitchVal == 0 && LichtVal == 0 && Plotter::CheckMemory == 1) {
Plotter::CheckMemory=0;
//Start beim Stift muss manuell freigegeben werden sonst kann man stift nicht tauschen
Com::printFLN(PSTR("ContinuePrint gestartet"));
sprintf(UI_Message,"Fertig?, OK weiter");
UI_STATUS_UPD_RAM(UI_Message);
// wait for acknowledge button pressed !! no release by uiaction , no possibility to release from host
while (!CONTINUE){Printer::defaultLoopActions();}
uid.executeAction(UI_ACTION_SD_PRINT + UI_ACTION_TOPMENU, true);
Com::printFLN(PSTR("start to continue"));
sd.continuePrint();
return;}
}
//#########################################################################################
//#### Timer 500ms
//#########################################################################################
void Custom_500MS()
{
Plotter::CheckForPause();
}
es erscheinen zwei Zeilen auf dem Display:
"Mine austauschen
OK: Knopf click"
(keine der Zeilen ist highlight, ich kann mit dem Knopf nicht zwischen den Zeilen wählen)
Wenn ich dann den Knopf drücke , passiert nichts?!
Wo ist da mein Fehler??
uimenu.h:
UI_WIZARD2_T(ui_msg_wait, UI_ACTION_SD_CONTINUE, UI_TEXT_WIZ_WAITTEMP1_ID, UI_TEXT_WIZ_WAITTEMP2_ID)
uilang.h:
#define UI_TEXT_WIZ_WAITTEMP1_DE "Mine austauschen"
#define UI_TEXT_WIZ_WAITTEMP2_DE "OK: Knopf click"
customeventsImp.h
int LichtVal=0;
int SwitchVal=0;
int Plotter::CheckMemory=0;
#include "uimenu.h";
void Plotter::CheckForPause(){
//LichtVal = analogRead(A3);testweise deaktiviert
LichtVal = 0;
if (LichtVal < 800) {LichtVal=0;}
else {LichtVal=1;}
SwitchVal=READ(Z_MIN_PIN);
Com::printF(PSTR("CheckForPause Mem:"),Plotter::CheckMemory);
Com::printF(PSTR(" licht:"),LichtVal);
Com::printFLN(PSTR(" pin:"),SwitchVal);
if (( SwitchVal == 1 || LichtVal == 1) && Plotter::CheckMemory == 0) {
Plotter::CheckMemory=1;
Com::printFLN(PSTR("PausePrint gestartet"));
sd.pausePrint();
uid.pushMenu(&ui_msg_wait, true);
return;}
//wieder continue wenn beide LOW
if ( SwitchVal == 0 && LichtVal == 0 && Plotter::CheckMemory == 1) {
Plotter::CheckMemory=0;
Com::printFLN(PSTR("ContinuePrint gestartet"));
sd.continuePrint();
return;}
}
//#########################################################################################
//#### Timer 500ms
//#########################################################################################
void Custom_500MS()
{
Plotter::CheckForPause();
}
PS: in der DEV version habe ich es nicht geschafft, die Z-Achse zu deaktivieren. In G28 wurde immer der Endschalter der Z-Achse verlangt.
Jede Hilfe ist willkommen! Danke
Aufruf wenn einer der beiden Eingänge auf HIGH geht, dann popmenu aufrufen.
Das Popup bleibt dann solange sichtbar bis dort geklickt wird.
Beim Klick springt dann UI_ACTION_SD_CONTINUE an.
if (( SwitchVal == 1 || LichtVal == 1) && Plotter::CheckMemory == 0) {
Plotter::CheckMemory=1;
Com::printFLN(PSTR("PausePrint gestartet"));
sd.pausePrint();
uid.pushMenu(&ui_msg_wait, true);
return;}
mit pushMenu bin ich nicht klar gekommen.
Gelöst haben es die Variablen:
uid.menuLevel=0;
uid.menuPos[0] = 1;
Dadurch wird das Menü wieder auf den zweiten Schirm voreingestellt.
Danke an Repetier und RayWB!
Ihr habt was gut bei mir!