chiark / gitweb /
make tuneing sub-menu.
authorBernhard Kubicek <kubicek@gmx.at>
Sun, 20 Nov 2011 15:05:42 +0000 (16:05 +0100)
committerBernhard Kubicek <kubicek@gmx.at>
Sun, 20 Nov 2011 15:05:42 +0000 (16:05 +0100)
Marlin/cardreader.pde
Marlin/planner.cpp
Marlin/planner.h
Marlin/ultralcd.h
Marlin/ultralcd.pde

index c0dbc58e475eb5827f3f6c59afd9ceece415bfd1..eec10f199f02aee865fc273f78d3314a1e75a403 100644 (file)
@@ -252,10 +252,11 @@ void CardReader::openFile(char* name,bool read)
       sdpos = 0;
       
       SERIAL_PROTOCOLLNPGM("File selected");
+      LCD_MESSAGE(fname);
     }
     else
     {
-     SERIAL_PROTOCOLPGM("open failed, File: ");
+      SERIAL_PROTOCOLPGM("open failed, File: ");
       SERIAL_PROTOCOL(fname);
       SERIAL_PROTOCOLLNPGM(".");
     }
@@ -273,6 +274,7 @@ void CardReader::openFile(char* name,bool read)
       saving = true;
       SERIAL_PROTOCOLPGM("Writing to file: ");
       SERIAL_PROTOCOLLN(name);
+      LCD_MESSAGE(fname);
     }
   }
   
index a59945da8911f6f87f0aca6e9cd80aee92e00b22..214226e2c70008f824d085d8d4254b619312d3f6 100644 (file)
@@ -762,3 +762,7 @@ void plan_set_position(const float &x, const float &y, const float &z, const flo
   previous_speed[3] = 0.0;
 }
 
+uint8_t movesplanned()
+{
+ return (block_buffer_head-block_buffer_tail + BLOCK_BUFFER_SIZE) & (BLOCK_BUFFER_SIZE - 1);
+}
index 52a6fba81318d0da9f8f90b7d89e9b50916a5cba..511f532d7ed22baebc2772a28b8c48a091fce28c 100644 (file)
@@ -80,6 +80,7 @@ void plan_discard_current_block();
 block_t *plan_get_current_block();
 
 void check_axes_activity();
+uint8_t movesplanned();
 
 extern unsigned long minsegmenttime;
 extern float max_feedrate[4]; // set the max speeds
index 6222c70c2575c6b926c42eb3307d9da8caee69ab..8b7d3ce83a48e49a4e73441efaeac89f366f9bff 100644 (file)
@@ -64,6 +64,7 @@
     void showStatus();
     void showMainMenu();
     void showPrepare();
+    void showTune();
     void showControl();
     void showControlMotion();
     void showControlTemp();
@@ -75,6 +76,8 @@
     
     bool linechanging;
     
+    bool tune;
+    
   private:
     inline void updateActiveLines(const uint8_t &maxlines,volatile int &encoderpos)
     {
@@ -89,8 +92,7 @@
         {  
           lineoffset--; 
           if(lineoffset<0) lineoffset=0; 
-          curencoderpos=lcdslow-1; 
-          force_lcd_update=true; 
+          curencoderpos=lcdslow-1;
         } 
         if(curencoderpos>(LCD_HEIGHT-1+1)*lcdslow) 
         { 
             lineoffset=maxlines+1-LCD_HEIGHT; 
           if(curencoderpos>maxlines*lcdslow) 
             curencoderpos=maxlines*lcdslow; 
-          force_lcd_update=true; 
         } 
-        lastencoderpos=encoderpos=curencoderpos; 
+        lastencoderpos=encoderpos=curencoderpos;
+        int lastactiveline=activeline;
         activeline=curencoderpos/lcdslow;
         if(activeline<0) activeline=0;
         if(activeline>LCD_HEIGHT-1) activeline=LCD_HEIGHT-1;
           activeline=maxlines;
           curencoderpos=maxlines*lcdslow;
         }
+        if(lastactiveline!=activeline ||lastlineoffset!=lineoffset)
+          force_lcd_update=true;
         lcd.setCursor(0,activeline);lcd.print((activeline+lineoffset)?'>':'\003');    
       } 
     }
   };
 
   //conversion routines, could need some overworking
-  char *fillto(int8_t n,char *c);
   char *ftostr51(const float &x);
   char *ftostr31(const float &x);
   char *ftostr3(const float &x);
index 57f63c1061de041035fc67b25fe628d9e089c01d..e2a75df10af9bbe9b5307fa6f62867745ccf5d8d 100644 (file)
@@ -65,6 +65,7 @@ inline int intround(const float &x){return int(0.5+x);}
 void lcd_status(const char* message)\r
 {\r
   strncpy(messagetext,message,LCD_WIDTH);\r
+  messagetext[strlen(message)]=0;\r
 }\r
 \r
 void lcd_statuspgm(const char* message)\r
@@ -79,6 +80,7 @@ void lcd_statuspgm(const char* message)
     cnt++;\r
     ch=pgm_read_byte(++message);\r
   }\r
+  *target=0;\r
 }\r
 \r
 inline void clear()\r
@@ -280,6 +282,7 @@ MainMenu::MainMenu()
   #endif\r
   lcd_init();\r
   linechanging=false;\r
+  tune=false;\r
 }\r
 \r
 void MainMenu::showStatus()\r
@@ -373,7 +376,11 @@ void MainMenu::showStatus()
   if(messagetext[0]!='\0')\r
   {\r
     lcd.setCursor(0,LCD_HEIGHT-1);\r
-    lcd.print(fillto(LCD_WIDTH,messagetext));\r
+    lcd.print(messagetext);\r
+    uint8_t n=strlen(messagetext);\r
+    for(int8_t i=0;i<LCD_WIDTH-n;i++)\r
+      lcd.print(" ");\r
+    \r
     messagetext[0]='\0';\r
   }\r
   \r
@@ -419,7 +426,10 @@ void MainMenu::showStatus()
   if(messagetext[0]!='\0')\r
   {\r
     lcd.setCursor(0,LCD_HEIGHT-1);\r
-    lcd.print(fillto(LCD_WIDTH,messagetext));\r
+    lcd.print(messagetext);\r
+    uint8_t n=strlen(messagetext);\r
+    for(int8_t i=0;i<LCD_WIDTH-n;i++)\r
+      lcd.print(" ");\r
     messagetext[0]='\0';\r
   }\r
 \r
@@ -471,6 +481,166 @@ void MainMenu::showPrepare()
  updateActiveLines(ItemP_disstep,encoderpos);\r
 }\r
 \r
+enum {ItemT_exit,ItemT_speed,ItemT_flow,ItemT_nozzle,ItemT_fan};\r
+\r
+void MainMenu::showTune()\r
+{ \r
+  uint8_t line=0;\r
+  clearIfNecessary();\r
+ for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)\r
+ {\r
+   //Serial.println((int)(line-lineoffset));\r
+  switch(i)\r
+  {\r
+  case ItemT_exit:\r
+      MENUITEM(  lcdprintPGM(" Tune")  ,  BLOCK;status=Main_Menu;beepshort(); ) ;\r
+      break;\r
+  case ItemT_speed:\r
+    {\r
+      if(force_lcd_update)\r
+      {\r
+        lcd.setCursor(0,line);lcdprintPGM(" Speed:");\r
+        lcd.setCursor(13,line);lcd.print(ftostr3(feedmultiply));\r
+      }\r
+      \r
+      if((activeline==line) )\r
+      {\r
+        if(CLICKED) //nalogWrite(FAN_PIN,  fanpwm);\r
+        {\r
+          linechanging=!linechanging;\r
+          if(linechanging)\r
+          {\r
+              encoderpos=feedmultiply;\r
+          }\r
+          else\r
+          {\r
+            encoderpos=activeline*lcdslow;\r
+            beepshort();\r
+          }\r
+          BLOCK;\r
+        }\r
+        if(linechanging)\r
+        {\r
+          if(encoderpos<1) encoderpos=1;\r
+          if(encoderpos>400) encoderpos=400;\r
+          feedmultiply = encoderpos;\r
+          feedmultiplychanged=true;\r
+          lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));\r
+        }\r
+      }\r
+    }break;\r
+    case ItemT_nozzle:\r
+      {\r
+        if(force_lcd_update)\r
+        {\r
+          lcd.setCursor(0,line);lcdprintPGM(" \002Nozzle:");\r
+          lcd.setCursor(13,line);lcd.print(ftostr3(intround(degTargetHotend0())));\r
+        }\r
+        \r
+        if((activeline==line) )\r
+        {\r
+          if(CLICKED)\r
+          {\r
+            linechanging=!linechanging;\r
+            if(linechanging)\r
+            {\r
+               encoderpos=intround(degTargetHotend0());\r
+            }\r
+            else\r
+            {\r
+              setTargetHotend0(encoderpos);\r
+              encoderpos=activeline*lcdslow;\r
+              beepshort();\r
+            }\r
+            BLOCK;\r
+          }\r
+          if(linechanging)\r
+          {\r
+            if(encoderpos<0) encoderpos=0;\r
+            if(encoderpos>260) encoderpos=260;\r
+            lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));\r
+          }\r
+        }\r
+      }break;\r
+      \r
+      case ItemT_fan:\r
+      {\r
+        if(force_lcd_update)\r
+        {\r
+          lcd.setCursor(0,line);lcdprintPGM(" Fan speed:");\r
+          lcd.setCursor(13,line);lcd.print(ftostr3(fanpwm));\r
+        }\r
+        \r
+        if((activeline==line) )\r
+        {\r
+          if(CLICKED) //nalogWrite(FAN_PIN,  fanpwm);\r
+          {\r
+            linechanging=!linechanging;\r
+            if(linechanging)\r
+            {\r
+               encoderpos=fanpwm;\r
+            }\r
+            else\r
+            {\r
+              encoderpos=activeline*lcdslow;\r
+              beepshort();\r
+            }\r
+            BLOCK;\r
+          }\r
+          if(linechanging)\r
+          {\r
+            if(encoderpos<0) encoderpos=0;\r
+            if(encoderpos>255) encoderpos=255;\r
+            fanpwm=encoderpos;\r
+              analogWrite(FAN_PIN,  fanpwm);\r
+            lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));\r
+          }\r
+        }\r
+      }break;\r
+      case ItemT_flow://axis_steps_per_unit[i] = code_value();\r
+         {\r
+      if(force_lcd_update)\r
+        {\r
+          lcd.setCursor(0,line);lcdprintPGM(" Flow:");\r
+          lcd.setCursor(13,line);lcd.print(itostr4(axis_steps_per_unit[3]));\r
+        }\r
+        \r
+        if((activeline==line) )\r
+        {\r
+          if(CLICKED)\r
+          {\r
+            linechanging=!linechanging;\r
+            if(linechanging)\r
+            {\r
+               encoderpos=(int)axis_steps_per_unit[3];\r
+            }\r
+            else\r
+            {\r
+              float factor=float(encoderpos)/float(axis_steps_per_unit[3]);\r
+              position[E_AXIS]=lround(position[E_AXIS]*factor);\r
+              //current_position[3]*=factor;\r
+              axis_steps_per_unit[E_AXIS]= encoderpos;\r
+              encoderpos=activeline*lcdslow;\r
+                \r
+            }\r
+            BLOCK;\r
+            beepshort();\r
+          }\r
+          if(linechanging)\r
+          {\r
+            if(encoderpos<5) encoderpos=5;\r
+            if(encoderpos>9999) encoderpos=9999;\r
+            lcd.setCursor(13,line);lcd.print(itostr4(encoderpos));\r
+          }\r
+        }\r
+      }break; \r
+    default:   \r
+      break;\r
+  }\r
+  line++;\r
+ }\r
+ updateActiveLines(ItemT_fan,encoderpos);\r
+}\r
 \r
 //does not work\r
 // #define MENUCHANGEITEM(repaint_action,  enter_action, accept_action,  change_action) \\r
@@ -510,7 +680,7 @@ void MainMenu::showControlTemp()
         if(force_lcd_update)\r
         {\r
           lcd.setCursor(0,line);lcdprintPGM(" \002Nozzle:");\r
-          lcd.setCursor(13,line);lcd.print(ftostr3(intround(degHotend0())));\r
+          lcd.setCursor(13,line);lcd.print(ftostr3(intround(degTargetHotend0())));\r
         }\r
         \r
         if((activeline==line) )\r
@@ -520,7 +690,7 @@ void MainMenu::showControlTemp()
             linechanging=!linechanging;\r
             if(linechanging)\r
             {\r
-               encoderpos=intround(degHotend0());\r
+               encoderpos=intround(degTargetHotend0());\r
             }\r
             else\r
             {\r
@@ -558,10 +728,7 @@ void MainMenu::showControlTemp()
             }\r
             else\r
             {\r
-              fanpwm = constrain(encoderpos,0,255);\r
-              encoderpos=fanpwm;\r
-              analogWrite(FAN_PIN,  fanpwm);\r
-\r
+              encoderpos=activeline*lcdslow;\r
               beepshort();\r
             }\r
             BLOCK;\r
@@ -1246,7 +1413,22 @@ void MainMenu::showMainMenu()
   #ifndef ULTIPANEL\r
     force_lcd_update=false;\r
   #endif\r
-   \r
+  if(tune)\r
+  {\r
+    if(!(movesplanned() ||card.sdprinting))\r
+    {\r
+      force_lcd_update=true;\r
+      tune=false;\r
+    }\r
+  }\r
+  else \r
+  {\r
+    if(movesplanned() ||card.sdprinting)\r
+    {\r
+      force_lcd_update=true;\r
+      tune=true;\r
+    }\r
+  } \r
   clearIfNecessary();\r
   for(int8_t line=0;line<LCD_HEIGHT;line++)\r
   {\r
@@ -1256,7 +1438,7 @@ void MainMenu::showMainMenu()
         MENUITEM(  lcdprintPGM(" Watch")  ,  BLOCK;status=Main_Status;beepshort(); ) ;\r
        break;\r
       case ItemM_prepare:\r
-        MENUITEM(  lcdprintPGM(" Prepare \x7E")  ,  BLOCK;status=Main_Prepare;beepshort(); ) ;\r
+        MENUITEM(  if(!tune) lcdprintPGM(" Prepare \x7E");else  lcdprintPGM(" Tune \x7E"); ,  BLOCK;status=Main_Prepare;beepshort(); ) ;\r
       break;\r
        \r
       case ItemM_control:\r
@@ -1363,7 +1545,14 @@ void MainMenu::update()
       }break;\r
       case Main_Prepare: \r
       {\r
-        showPrepare(); \r
+        if(tune)\r
+        {\r
+          showTune();\r
+        }\r
+        else\r
+        {\r
+          showPrepare(); \r
+        }\r
       }break;\r
       case Main_Control:\r
       {\r
@@ -1478,26 +1667,6 @@ char *ftostr51(const float &x)
   return conv;\r
 }\r
 \r
-char *fillto(int8_t n,char *c)\r
-{\r
-  static char ret[25];\r
-  bool endfound=false;\r
-  for(int8_t i=0;i<n;i++)\r
-  {\r
-    ret[i]=c[i];\r
-    if(c[i]==0)\r
-    {\r
-      endfound=true;\r
-    }\r
-    if(endfound)\r
-    {\r
-      ret[i]=' ';\r
-    }\r
-  }\r
-  ret[n]=0;\r
-  return ret;\r
-}\r
-\r
 \r
 #endif //ULTRA_LCD\r
 \r