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!

Comments

  • sd pause geht ja auch nur wenn du von sd karte druckst. Ansonsten ist pause noch schwieriger, da der host aufhören must zu senden. Das macht

    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.

  • Danke super ... so sieht es jetzt aus:

    #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?









  • edited June 22
    nutze doch die custom events , dann klappt es auch mit Printer::continuePrint();  etc.
    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


  • hmm das ist auch zu überlegen!
    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!
  • du kannst deine signale z.b. im timer 500ms abfragen und dann deine routinen aufrufen.

    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
  • Die genannten Funktionen sind nur in der dev version enthalten. Vielleicht bist du auf 0.92.9?
  • ja ich nutze die 0.92.9 ... am WE installiere ich die dev Version!
  • edited June 23
    rein interessehalber, wieso brauchst du den analogeingang ? ich rate mal dass du damit eine Gabellichtschranke auswertest..
  • RAyWB: du hast mich erkannt! Gabellichtschranke ...
    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).
  • Sorry steht im header! also neu anlegen...
  • sorry , aber gabellichtschranken wertet man normal als digitalwert aus , da gibts nur an/aus.
    hat das teil einen transisto oder dioden ausgang?
  • Das musste ich mir selber basteln... TCST2000.. aktuell kommt entweder 980 oder 620 heraus - wahrschenilich habe die Widerstände nicht optimal gewählt ..
  • Irgendetwas mache ich noch falsch:
    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();
    }


  • da gibt es mehrere probleme.
    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.


  • Ok die Lichtschranke ist ein Thema, aber analogread habe ich ja auskommentiert - also der Wert LichtVal=0 und spielt daher keine Rolle...
    Das Programm läuft garnicht in die die Funktion hinein! Da muss noch ein anderer Fehler dabei sein..
  • und wie sieht die customevents.h aus ?

    hast du die customevents aktiviert?
    (in der configuration.h letzte zeile)
  • in der customevents.h fehlt :

    extern void Custom_500MS();

    #undef EVENT_TIMER_500MS
    #define EVENT_TIMER_500MS {Custom_500MS();}

  • große Hilfe! das wars ...
    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...


  • schau dir mal den M6 in meinen events an.das geht auch ohne menue und ui.

    übrigens #include "uimenu.h" ist nicht notwendig in deinem code
  • merci für den Hinweis..
    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...
  • der M6_ACK_PIN ist ein separater taster, du kannst aber genausogut den vom bildschirm nehmen.
    musst halt die abfrage anpassen.
  • eigentlich funktioniert jetzt alles richtig - ausser die Menüanzeige,
    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();
    }



  • Natürlich, du machst es ja auch nicht wie vorgesehen. Wie ich sagte du must einen Wizard pushen damit der sichtbar wird und ihm die Aktion continue geben die dann ausgeführt wird. So trickst du etwas herum und bekommst iweder die nebeneffekte.
  • Lieber Repetier: irgendwie bin zu dämlich um es zum Laufen zu bringen...
    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


  • Eigentlich muesste dass doch genügen:
    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;}

  • zum Abschluß:
    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!
Sign In or Register to comment.